diff --git a/.github/workflows/dependency-review.yaml b/.github/workflows/dependency-review.yaml index 8042dba782511..b266c34d2e960 100644 --- a/.github/workflows/dependency-review.yaml +++ b/.github/workflows/dependency-review.yaml @@ -16,13 +16,40 @@ jobs: # but because of the replace, the dependency cannot find the correct # Teleport version. allow-ghsas: 'GHSA-6xf3-5hp7-xqqg' + # IronRDP uses MIT/Apache-2.0 but slashes are not recognized by dependency review action allow-dependencies-licenses: >- + pkg:cargo/ironrdp-core, + pkg:cargo/ironrdp-async, + pkg:cargo/ironrdp-connector, + pkg:cargo/ironrdp-pdu, + pkg:cargo/ironrdp-session, + pkg:cargo/ironrdp-svc, + pkg:cargo/ironrdp-tokio, + pkg:cargo/asn1-rs, + pkg:cargo/asn1-rs-derive, + pkg:cargo/asn1-rs-impl, pkg:cargo/curve25519-dalek-derive, + pkg:cargo/der-parser, + pkg:cargo/icu_collections, + pkg:cargo/icu_locid, + pkg:cargo/icu_locid_transform, + pkg:cargo/icu_locid_transform_data, + pkg:cargo/icu_normalizer, + pkg:cargo/icu_normalizer_data, + pkg:cargo/icu_properties, + pkg:cargo/icu_properties_data, + pkg:cargo/icu_provider, + pkg:cargo/icu_provider_macros, + pkg:cargo/litemap, pkg:cargo/ring, pkg:cargo/sspi, pkg:cargo/tokio-boring, pkg:cargo/tokio-rustls, - pkg:cargo/asn1-rs, - pkg:cargo/asn1-rs-derive, - pkg:cargo/asn1-rs-impl, - pkg:cargo/der-parser + pkg:cargo/writeable, + pkg:cargo/yoke, + pkg:cargo/yoke-derive, + pkg:cargo/zerofrom, + pkg:cargo/zerofrom-derive, + pkg:cargo/zerovec, + pkg:cargo/zerovec-derive, + pkg:npm/prettier diff --git a/.golangci.yml b/.golangci.yml index 30bbb975728ff..2300891f36ec0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -113,6 +113,8 @@ linters-settings: desc: 'use "golang.org/x/mod/semver" or "coreos/go-semver/semver" instead' - pkg: github.com/microsoftgraph/msgraph-sdk-go desc: 'use "github.com/gravitational/teleport/lib/msgraph" instead' + - pkg: github.com/cloudflare/cfssl + desc: 'use "crypto" or "x/crypto" instead' # Prevent logrus from being imported by api and e. Once everything in teleport has been converted # to use log/slog this should be moved into the main block above. logrus: diff --git a/CHANGELOG.md b/CHANGELOG.md index 879bcb05bf4c3..9d11f0ce94b4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 17.0.6 (12/12/24) + +* Fixed bug causing users to see notifications for their own access requests in some cases. [#50076](https://github.com/gravitational/teleport/pull/50076) +* Improved the cluster initialization process's ability to recovery from errors. [#49966](https://github.com/gravitational/teleport/pull/49966) + +## 17.0.5 (12/11/24) + +* Updated golang.org/x/crypto to v0.31.0 (CVE-2024-45337). [#50078](https://github.com/gravitational/teleport/pull/50078) +* Fixed `tsh ssh -Y` when jumping between multiple servers. [#50031](https://github.com/gravitational/teleport/pull/50031) +* Reduced Auth memory consumption when agents join using the azure join method. [#49998](https://github.com/gravitational/teleport/pull/49998) +* Our OSS OS packages (rpm, deb, etc) now have up-to-date metadata. [#49962](https://github.com/gravitational/teleport/pull/49962) +* `tsh` correctly respects the --no-allow-passwordless flag. [#49933](https://github.com/gravitational/teleport/pull/49933) +* The web session authorization dialog in Teleport Connect is now a dedicated tab, which properly shows a re-login dialog when the local session is expired. [#49931](https://github.com/gravitational/teleport/pull/49931) +* Added an interactive mode for `tctl auth rotate`. [#49896](https://github.com/gravitational/teleport/pull/49896) +* Fixed a panic when the auth server does not provide a license expiry. [#49876](https://github.com/gravitational/teleport/pull/49876) + +Enterprise: +* Fixed a panic occurring during SCIM push operations when resource.metadata is empty. [#5654](https://github.com/gravitational/teleport.e/pull/5654) +* Improved "IP mismatch" audit entries for device trust web. [#5642](https://github.com/gravitational/teleport.e/pull/5642) +* Fixed assigning suggested reviewers in the edge case when the user already has access to the requested resources. [#5629](https://github.com/gravitational/teleport.e/pull/5629) + ## 17.0.4 (12/5/2024) * Fixed a bug introduced in 17.0.3 breaking in-cluster joining on some Kubernetes clusters. [#49841](https://github.com/gravitational/teleport/pull/49841) @@ -27,6 +48,7 @@ Enterprise: * Jamf Service sync audit events are attributed to "Jamf Service". * Users can now see a list of their enrolled devices on their Account page. * Add support for Entra ID groups being members of other groups using Nested Access Lists. +* Added support for requiring reason for Access Requests (with a new role.spec.allow.request.reason.mode setting). ## 17.0.2 (11/25/2024) diff --git a/Cargo.lock b/Cargo.lock index e62135285d28c..d9fa0c291965b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -390,9 +390,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cbc" @@ -826,12 +826,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1247,14 +1247,143 @@ dependencies = [ "tracing", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1289,6 +1418,7 @@ version = "0.1.0" dependencies = [ "console_error_panic_hook", "getrandom", + "ironrdp-core", "ironrdp-graphics", "ironrdp-pdu", "ironrdp-session", @@ -1304,11 +1434,12 @@ dependencies = [ [[package]] name = "ironrdp-async" -version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +version = "0.2.0" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bytes", "ironrdp-connector", + "ironrdp-core", "ironrdp-pdu", "tracing", ] @@ -1316,9 +1447,10 @@ dependencies = [ [[package]] name = "ironrdp-cliprdr" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bitflags 2.6.0", + "ironrdp-core", "ironrdp-pdu", "ironrdp-svc", "thiserror", @@ -1327,9 +1459,10 @@ dependencies = [ [[package]] name = "ironrdp-connector" -version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +version = "0.2.1" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ + "ironrdp-core", "ironrdp-error", "ironrdp-pdu", "ironrdp-svc", @@ -1340,14 +1473,22 @@ dependencies = [ "sspi", "tracing", "url", - "winapi", +] + +[[package]] +name = "ironrdp-core" +version = "0.1.1" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" +dependencies = [ + "ironrdp-error", ] [[package]] name = "ironrdp-displaycontrol" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ + "ironrdp-core", "ironrdp-dvc", "ironrdp-pdu", "ironrdp-svc", @@ -1357,8 +1498,9 @@ dependencies = [ [[package]] name = "ironrdp-dvc" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ + "ironrdp-core", "ironrdp-pdu", "ironrdp-svc", "slab", @@ -1368,18 +1510,18 @@ dependencies = [ [[package]] name = "ironrdp-error" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" [[package]] name = "ironrdp-graphics" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bit_field", "bitflags 2.6.0", "bitvec", "byteorder", - "ironrdp-error", + "ironrdp-core", "ironrdp-pdu", "lazy_static", "num-derive", @@ -1389,13 +1531,14 @@ dependencies = [ [[package]] name = "ironrdp-pdu" -version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +version = "0.1.1" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bit_field", "bitflags 2.6.0", "byteorder", "der-parser", + "ironrdp-core", "ironrdp-error", "md-5", "num-bigint", @@ -1412,9 +1555,10 @@ dependencies = [ [[package]] name = "ironrdp-rdpdr" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bitflags 2.6.0", + "ironrdp-core", "ironrdp-error", "ironrdp-pdu", "ironrdp-svc", @@ -1424,9 +1568,10 @@ dependencies = [ [[package]] name = "ironrdp-rdpsnd" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bitflags 2.6.0", + "ironrdp-core", "ironrdp-pdu", "ironrdp-svc", "tracing", @@ -1434,10 +1579,11 @@ dependencies = [ [[package]] name = "ironrdp-session" -version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +version = "0.2.0" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "ironrdp-connector", + "ironrdp-core", "ironrdp-displaycontrol", "ironrdp-dvc", "ironrdp-error", @@ -1449,17 +1595,18 @@ dependencies = [ [[package]] name = "ironrdp-svc" -version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +version = "0.1.1" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bitflags 2.6.0", + "ironrdp-core", "ironrdp-pdu", ] [[package]] name = "ironrdp-tls" version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "tokio", "tokio-rustls", @@ -1468,8 +1615,8 @@ dependencies = [ [[package]] name = "ironrdp-tokio" -version = "0.1.0" -source = "git+https://github.com/Devolutions/IronRDP?rev=92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3#92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" +version = "0.2.0" +source = "git+https://github.com/Devolutions/IronRDP?rev=2f57fd2de320f58fe240d88a83519255ba94cb73#2f57fd2de320f58fe240d88a83519255ba94cb73" dependencies = [ "bytes", "ironrdp-async", @@ -1484,9 +1631,9 @@ checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" [[package]] name = "iso7816" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3af73ac9c821e7aea3280532118e15cdf9e7bb45c923cbf0e319ae25b27d20c" +checksum = "c75f5d3f2d959c5d37b382ed9b5a32d0a0e6112ab6ac9eb8fce82359db6f2367" dependencies = [ "delog", "heapless", @@ -1527,9 +1674,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1560,9 +1707,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "libloading" @@ -1586,6 +1733,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -1904,9 +2057,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "picky" -version = "7.0.0-rc.9" +version = "7.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9b488630f493840c2e6ef270c3619a3dc2ad0953eb978d6e4273a8337fee5e" +checksum = "f62f11977ee3ab76e48f7465f035a607e61b7421b154384b71607cb85a26d5dd" dependencies = [ "aes", "aes-gcm", @@ -1944,9 +2097,9 @@ dependencies = [ [[package]] name = "picky-asn1" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360019b238b11b8c0e88cd9db3a6677f1af122e3422d0a26a2b576f084d9be36" +checksum = "d061c9f67e256511d8d69b86730a506bed100db520c8812e789cf91d9c6a16cc" dependencies = [ "oid", "serde", @@ -1957,9 +2110,9 @@ dependencies = [ [[package]] name = "picky-asn1-der" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04784987e157b5a8f832ce68b3364915dc6ef4bed94a6e10e241fa1bae3db2e3" +checksum = "e15b90fb132c46ded79c39277afa93151691d9df6e7ff369c071890b36478392" dependencies = [ "picky-asn1", "serde", @@ -1968,9 +2121,9 @@ dependencies = [ [[package]] name = "picky-asn1-x509" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3384ff768b1c4a04532916be77935f634a4738d3b2138da98798e90352fadf4" +checksum = "f702973074c654cef724d7430e2852acdb8b0e897ed9c4120727446a1bda1464" dependencies = [ "base64", "num-bigint-dig", @@ -1984,9 +2137,9 @@ dependencies = [ [[package]] name = "picky-krb" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2213fd3942a9d3366b3e108b6d02db2227c80937a55f79a71e1719ab075bb77" +checksum = "f5f3c62393fbe5538020af4f8b07d1647f99748becd207476417f8d2aa8900cd" dependencies = [ "aes", "byteorder", @@ -2193,6 +2346,7 @@ dependencies = [ "env_logger", "ironrdp-cliprdr", "ironrdp-connector", + "ironrdp-core", "ironrdp-displaycontrol", "ironrdp-dvc", "ironrdp-pdu", @@ -2209,6 +2363,7 @@ dependencies = [ "picky", "picky-asn1-der", "picky-asn1-x509", + "picky-krb", "rand", "rand_chacha", "reqwest", @@ -2263,9 +2418,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64", "bytes", @@ -2329,9 +2484,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -2380,22 +2535,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.18" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "aws-lc-rs", "log", @@ -2408,9 +2563,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", "rustls-pemfile", @@ -2684,9 +2839,9 @@ dependencies = [ [[package]] name = "sspi" -version = "0.13.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1734839082c6d33f8368b40a40d0d5cc1ed10fbde00dc8a404f64e70272ed3f6" +checksum = "b94e3c7aa94f5b440eedeab677686629bddcb43edf52ef3703038cce98e2bf70" dependencies = [ "async-dnssd", "async-recursion", @@ -2724,7 +2879,7 @@ dependencies = [ "url", "uuid", "windows", - "windows-sys 0.52.0", + "windows-sys 0.59.0", "winreg", "zeroize", ] @@ -2786,9 +2941,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -2860,20 +3015,15 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.6.1" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tls_codec" version = "0.4.1" @@ -2897,9 +3047,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -3091,27 +3241,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - [[package]] name = "universal-hash" version = "0.5.1" @@ -3130,15 +3265,21 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf16string" version = "0.2.0" @@ -3148,6 +3289,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3156,9 +3303,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "serde", @@ -3193,9 +3340,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -3204,9 +3351,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -3231,9 +3378,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3241,9 +3388,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -3254,15 +3401,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -3550,6 +3697,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -3583,6 +3742,51 @@ dependencies = [ "tls_codec", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -3602,3 +3806,25 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index c4746e8084638..cf40926486bbf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,15 +21,18 @@ lto = "thin" [workspace.dependencies] # Note: To use a local IronRDP repository as a crate (for example, ironrdp-cliprdr), define the dependency as follows: # ironrdp-cliprdr = { path = "/path/to/local/IronRDP/crates/ironrdp-cliprdr" } -ironrdp-cliprdr = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-connector = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-displaycontrol = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-dvc = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-graphics = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-pdu = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-rdpdr = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-rdpsnd = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-session = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-svc = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } -ironrdp-tls = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3", features = ["rustls"] } -ironrdp-tokio = { git = "https://github.com/Devolutions/IronRDP", rev = "92efe2adf7402c15fe6cf2da0d3f8ff8ebd767c3" } +ironrdp-cliprdr = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-connector = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-core = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-displaycontrol = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-dvc = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-graphics = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-pdu = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-rdpdr = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-rdpsnd = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-session = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-svc = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } +ironrdp-tls = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73", features = [ + "rustls", +] } +ironrdp-tokio = { git = "https://github.com/Devolutions/IronRDP", rev = "2f57fd2de320f58fe240d88a83519255ba94cb73" } diff --git a/Makefile b/Makefile index ba8d83de4a6db..4a9dc16765df0 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=17.0.4 +VERSION=17.0.6 DOCKER_IMAGE ?= teleport @@ -590,6 +590,7 @@ build-archive: | $(RELEASE_DIR) "$(INSTALL_SCRIPT)" \ README.md \ CHANGELOG.md \ + build.assets/LICENSE-community \ teleport/ echo $(GITTAG) > teleport/VERSION tar $(TAR_FLAGS) -c teleport | gzip -n > $(RELEASE).tar.gz diff --git a/api/accessrequest/access_request.go b/api/accessrequest/access_request.go index 1af10ac4400d3..7b82cfc8f25a6 100644 --- a/api/accessrequest/access_request.go +++ b/api/accessrequest/access_request.go @@ -58,7 +58,7 @@ func GetResourceDetails(ctx context.Context, clusterName string, lister client.L var resourceIDs []types.ResourceID for _, resourceID := range ids { // We're interested in hostname or friendly name details. These apply to - // nodes, app servers, and user groups. + // nodes, app servers, user groups and Identity Center resources. switch resourceID.Kind { case types.KindNode, types.KindApp, types.KindUserGroup, types.KindIdentityCenterAccount: resourceIDs = append(resourceIDs, resourceID) diff --git a/api/client/client.go b/api/client/client.go index eb405a343f567..10aa123b166a2 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -97,6 +97,7 @@ import ( userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" usertaskv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" userpreferencespb "github.com/gravitational/teleport/api/gen/proto/go/userpreferences/v1" "github.com/gravitational/teleport/api/internalutils/stream" "github.com/gravitational/teleport/api/metadata" @@ -879,6 +880,12 @@ func (c *Client) SPIFFEFederationServiceClient() machineidv1pb.SPIFFEFederationS return machineidv1pb.NewSPIFFEFederationServiceClient(c.conn) } +// WorkloadIdentityResourceServiceClient returns an unadorned client for the +// workload identity resource service. +func (c *Client) WorkloadIdentityResourceServiceClient() workloadidentityv1pb.WorkloadIdentityResourceServiceClient { + return workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient(c.conn) +} + // PresenceServiceClient returns an unadorned client for the presence service. func (c *Client) PresenceServiceClient() presencepb.PresenceServiceClient { return presencepb.NewPresenceServiceClient(c.conn) diff --git a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go index e7ef95b4352e2..e518d20def0d5 100644 --- a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go @@ -2161,6 +2161,16 @@ type EnrollEKSClusterResult struct { ResourceId string `protobuf:"bytes,2,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` // Error show what error happened during enrollment. Empty if no error happened. Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + // IssueType contains the UserTask's issue type for well-known errors. + // Example of allowed values: + // - eks-status-not-active + // - eks-missing-endpoint-public-access + // - eks-authentication-mode-unsupported + // - eks-cluster-unreachable + // - eks-agent-not-connecting + // See usertasks.DiscoverEKSIssueTypes for a complete list of allowed values. + // Empty if no error happened, or the error is not yet handled. + IssueType string `protobuf:"bytes,4,opt,name=issue_type,json=issueType,proto3" json:"issue_type,omitempty"` } func (x *EnrollEKSClusterResult) Reset() { @@ -2214,6 +2224,13 @@ func (x *EnrollEKSClusterResult) GetError() string { return "" } +func (x *EnrollEKSClusterResult) GetIssueType() string { + if x != nil { + return x.IssueType + } + return "" +} + // EnrollEKSClustersResponse is a response to enrolling EKS clusters. type EnrollEKSClustersResponse struct { state protoimpl.MessageState @@ -3053,14 +3070,16 @@ var file_teleport_integration_v1_awsoidc_service_proto_rawDesc = []byte{ 0x65, 0x41, 0x70, 0x70, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x16, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x10, - 0x65, 0x6b, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6b, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x66, 0x0a, + 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, 0x16, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x10, 0x65, 0x6b, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6b, 0x73, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1d, + 0x0a, 0x0a, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x66, 0x0a, 0x19, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, diff --git a/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go b/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go index fdcb4e14831d7..11708071a6b01 100644 --- a/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go +++ b/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go @@ -342,6 +342,9 @@ type GlobalNotificationSpec struct { MatchAllConditions bool `protobuf:"varint,4,opt,name=match_all_conditions,json=matchAllConditions,proto3" json:"match_all_conditions,omitempty"` // notification is the notification itself. Notification *Notification `protobuf:"bytes,5,opt,name=notification,proto3" json:"notification,omitempty"` + // exclude_users is a list of usernames of users who should never match this notification + // under any circumstances. + ExcludeUsers []string `protobuf:"bytes,6,rep,name=exclude_users,json=excludeUsers,proto3" json:"exclude_users,omitempty"` } func (x *GlobalNotificationSpec) Reset() { @@ -416,6 +419,13 @@ func (x *GlobalNotificationSpec) GetNotification() *Notification { return nil } +func (x *GlobalNotificationSpec) GetExcludeUsers() []string { + if x != nil { + return x.ExcludeUsers + } + return nil +} + type isGlobalNotificationSpec_Matcher interface { isGlobalNotificationSpec_Matcher() } @@ -959,7 +969,7 @@ var file_teleport_notifications_v1_notifications_proto_rawDesc = []byte{ 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x22, 0xca, 0x02, 0x0a, 0x16, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, + 0x73, 0x70, 0x65, 0x63, 0x22, 0xef, 0x02, 0x0a, 0x16, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x0e, 0x62, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, @@ -979,91 +989,93 @@ var file_teleport_notifications_v1_notifications_proto_rawDesc = []byte{ 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x22, 0x4f, 0x0a, 0x0d, 0x42, 0x79, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x1f, 0x0a, 0x07, 0x42, 0x79, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x22, 0xb4, 0x02, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x48, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x60, 0x0a, 0x19, 0x55, 0x73, - 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7a, 0x0a, 0x1b, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x22, 0x4f, 0x0a, 0x0d, 0x42, 0x79, 0x50, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1f, 0x0a, 0x07, 0x42, 0x79, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xb4, 0x02, 0x0a, 0x15, 0x55, 0x73, 0x65, + 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5b, 0x0a, 0x12, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x11, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc9, 0x02, 0x0a, 0x18, 0x55, 0x73, 0x65, - 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, - 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, - 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x52, 0x04, - 0x74, 0x69, 0x6d, 0x65, 0x22, 0x1e, 0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, - 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x70, 0x65, 0x63, 0x22, 0x62, 0x0a, 0x1e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, + 0x4e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x60, 0x0a, 0x19, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x7a, 0x0a, 0x1b, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x5b, 0x0a, 0x12, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x11, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc9, 0x02, + 0x0a, 0x18, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, + 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, - 0x65, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, - 0x53, 0x65, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0x79, 0x0a, 0x11, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, - 0x1e, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x49, 0x43, 0x4b, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x4d, 0x49, 0x53, 0x53, 0x45, - 0x44, 0x10, 0x02, 0x42, 0x5e, 0x5a, 0x5c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x04, 0x08, + 0x06, 0x10, 0x07, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x1e, 0x0a, 0x1c, 0x55, 0x73, 0x65, + 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x22, 0x62, 0x0a, 0x1e, 0x55, 0x73, 0x65, + 0x72, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x40, 0x0a, 0x0e, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0x79, 0x0a, + 0x11, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x49, + 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x49, 0x53, + 0x4d, 0x49, 0x53, 0x53, 0x45, 0x44, 0x10, 0x02, 0x42, 0x5e, 0x5a, 0x5c, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go b/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go index d24dcbae031c6..d0a6ec5e77fae 100644 --- a/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go +++ b/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go @@ -56,6 +56,8 @@ type UserTask struct { Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` // The configured properties of UserTask. Spec *UserTaskSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + // The current status for this UserTask. + Status *UserTaskStatus `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` } func (x *UserTask) Reset() { @@ -123,6 +125,13 @@ func (x *UserTask) GetSpec() *UserTaskSpec { return nil } +func (x *UserTask) GetStatus() *UserTaskStatus { + if x != nil { + return x.Status + } + return nil +} + // UserTaskSpec contains the properties of the UserTask. type UserTaskSpec struct { state protoimpl.MessageState @@ -145,6 +154,9 @@ type UserTaskSpec struct { // DiscoverEC2 contains the AWS EC2 instances that failed to auto enroll into the cluster. // Present when TaskType is discover-ec2. DiscoverEc2 *DiscoverEC2 `protobuf:"bytes,5,opt,name=discover_ec2,json=discoverEc2,proto3" json:"discover_ec2,omitempty"` + // DiscoverEKS contains the AWS EKS clusters that failed to auto enroll into the cluster. + // Present when TaskType is discover-eks. + DiscoverEks *DiscoverEKS `protobuf:"bytes,6,opt,name=discover_eks,json=discoverEks,proto3" json:"discover_eks,omitempty"` } func (x *UserTaskSpec) Reset() { @@ -212,6 +224,60 @@ func (x *UserTaskSpec) GetDiscoverEc2() *DiscoverEC2 { return nil } +func (x *UserTaskSpec) GetDiscoverEks() *DiscoverEKS { + if x != nil { + return x.DiscoverEks + } + return nil +} + +// UserTaskStatus contains the current status for the UserTask. +type UserTaskStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // LastStateChange is the timestamp when the UserTask state was last modified. + LastStateChange *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=last_state_change,json=lastStateChange,proto3" json:"last_state_change,omitempty"` +} + +func (x *UserTaskStatus) Reset() { + *x = UserTaskStatus{} + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UserTaskStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserTaskStatus) ProtoMessage() {} + +func (x *UserTaskStatus) ProtoReflect() protoreflect.Message { + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserTaskStatus.ProtoReflect.Descriptor instead. +func (*UserTaskStatus) Descriptor() ([]byte, []int) { + return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{2} +} + +func (x *UserTaskStatus) GetLastStateChange() *timestamppb.Timestamp { + if x != nil { + return x.LastStateChange + } + return nil +} + // DiscoverEC2 contains the instances that failed to auto-enroll into the cluster. type DiscoverEC2 struct { state protoimpl.MessageState @@ -234,7 +300,7 @@ type DiscoverEC2 struct { func (x *DiscoverEC2) Reset() { *x = DiscoverEC2{} - mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[2] + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -246,7 +312,7 @@ func (x *DiscoverEC2) String() string { func (*DiscoverEC2) ProtoMessage() {} func (x *DiscoverEC2) ProtoReflect() protoreflect.Message { - mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[2] + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -259,7 +325,7 @@ func (x *DiscoverEC2) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoverEC2.ProtoReflect.Descriptor instead. func (*DiscoverEC2) Descriptor() ([]byte, []int) { - return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{2} + return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{3} } func (x *DiscoverEC2) GetInstances() map[string]*DiscoverEC2Instance { @@ -321,7 +387,7 @@ type DiscoverEC2Instance struct { func (x *DiscoverEC2Instance) Reset() { *x = DiscoverEC2Instance{} - mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[3] + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -333,7 +399,7 @@ func (x *DiscoverEC2Instance) String() string { func (*DiscoverEC2Instance) ProtoMessage() {} func (x *DiscoverEC2Instance) ProtoReflect() protoreflect.Message { - mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[3] + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -346,7 +412,7 @@ func (x *DiscoverEC2Instance) ProtoReflect() protoreflect.Message { // Deprecated: Use DiscoverEC2Instance.ProtoReflect.Descriptor instead. func (*DiscoverEC2Instance) Descriptor() ([]byte, []int) { - return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{3} + return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{4} } func (x *DiscoverEC2Instance) GetInstanceId() string { @@ -391,6 +457,154 @@ func (x *DiscoverEC2Instance) GetSyncTime() *timestamppb.Timestamp { return nil } +// DiscoverEKS contains the clusters that failed to auto-enroll into the cluster. +type DiscoverEKS struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Clusters maps a cluster name to the result of enrolling that cluster into teleport. + Clusters map[string]*DiscoverEKSCluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // AccountID is the AWS Account ID for the cluster. + AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + // Region is the AWS Region where Teleport failed to enroll EKS Clusters. + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + // AppAutoDiscover indicates whether the Kubernetes agent should auto enroll HTTP services as Teleport Apps. + AppAutoDiscover bool `protobuf:"varint,4,opt,name=app_auto_discover,json=appAutoDiscover,proto3" json:"app_auto_discover,omitempty"` +} + +func (x *DiscoverEKS) Reset() { + *x = DiscoverEKS{} + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DiscoverEKS) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiscoverEKS) ProtoMessage() {} + +func (x *DiscoverEKS) ProtoReflect() protoreflect.Message { + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DiscoverEKS.ProtoReflect.Descriptor instead. +func (*DiscoverEKS) Descriptor() ([]byte, []int) { + return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{5} +} + +func (x *DiscoverEKS) GetClusters() map[string]*DiscoverEKSCluster { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *DiscoverEKS) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *DiscoverEKS) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *DiscoverEKS) GetAppAutoDiscover() bool { + if x != nil { + return x.AppAutoDiscover + } + return false +} + +// DiscoverEKSCluster contains the result of enrolling an AWS EKS Cluster. +type DiscoverEKSCluster struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name is the cluster Name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // DiscoveryConfig is the discovery config name that originated this cluster enrollment. + DiscoveryConfig string `protobuf:"bytes,2,opt,name=discovery_config,json=discoveryConfig,proto3" json:"discovery_config,omitempty"` + // DiscoveryGroup is the DiscoveryGroup name that originated this task. + DiscoveryGroup string `protobuf:"bytes,3,opt,name=discovery_group,json=discoveryGroup,proto3" json:"discovery_group,omitempty"` + // SyncTime is the timestamp when the error was produced. + SyncTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=sync_time,json=syncTime,proto3" json:"sync_time,omitempty"` +} + +func (x *DiscoverEKSCluster) Reset() { + *x = DiscoverEKSCluster{} + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DiscoverEKSCluster) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiscoverEKSCluster) ProtoMessage() {} + +func (x *DiscoverEKSCluster) ProtoReflect() protoreflect.Message { + mi := &file_teleport_usertasks_v1_user_tasks_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DiscoverEKSCluster.ProtoReflect.Descriptor instead. +func (*DiscoverEKSCluster) Descriptor() ([]byte, []int) { + return file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP(), []int{6} +} + +func (x *DiscoverEKSCluster) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DiscoverEKSCluster) GetDiscoveryConfig() string { + if x != nil { + return x.DiscoveryConfig + } + return "" +} + +func (x *DiscoverEKSCluster) GetDiscoveryGroup() string { + if x != nil { + return x.DiscoveryGroup + } + return "" +} + +func (x *DiscoverEKSCluster) GetSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.SyncTime + } + return nil +} + var File_teleport_usertasks_v1_user_tasks_proto protoreflect.FileDescriptor var file_teleport_usertasks_v1_user_tasks_proto_rawDesc = []byte{ @@ -402,7 +616,7 @@ var file_teleport_usertasks_v1_user_tasks_proto_rawDesc = []byte{ 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xc6, 0x01, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, + 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x02, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, @@ -414,20 +628,34 @@ var file_teleport_usertasks_v1_user_tasks_proto_rawDesc = []byte{ 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, - 0x73, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xc9, 0x01, 0x0a, - 0x0c, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, - 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x45, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x63, - 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x43, 0x32, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x63, 0x32, 0x22, 0xcd, 0x02, 0x0a, 0x0b, 0x44, 0x69, 0x73, + 0x73, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x0c, + 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x0b, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x45, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x63, 0x32, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x43, 0x32, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x45, 0x63, 0x32, 0x12, 0x45, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x5f, 0x65, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x4b, + 0x53, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6b, 0x73, 0x22, 0x58, + 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x46, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x43, 0x32, 0x12, 0x4f, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, @@ -466,13 +694,43 @@ var file_teleport_usertasks_v1_user_tasks_proto_rawDesc = []byte{ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa6, 0x02, 0x0a, 0x0b, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x4b, 0x53, 0x12, 0x4c, 0x0a, 0x08, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x4b, 0x53, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x0a, 0x11, 0x61, 0x70, 0x70, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x41, 0x75, + 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x1a, 0x66, 0x0a, 0x0d, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x4b, 0x53, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xb5, 0x01, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, + 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, + 0x10, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x37, 0x0a, 0x09, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -487,28 +745,38 @@ func file_teleport_usertasks_v1_user_tasks_proto_rawDescGZIP() []byte { return file_teleport_usertasks_v1_user_tasks_proto_rawDescData } -var file_teleport_usertasks_v1_user_tasks_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_teleport_usertasks_v1_user_tasks_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_teleport_usertasks_v1_user_tasks_proto_goTypes = []any{ (*UserTask)(nil), // 0: teleport.usertasks.v1.UserTask (*UserTaskSpec)(nil), // 1: teleport.usertasks.v1.UserTaskSpec - (*DiscoverEC2)(nil), // 2: teleport.usertasks.v1.DiscoverEC2 - (*DiscoverEC2Instance)(nil), // 3: teleport.usertasks.v1.DiscoverEC2Instance - nil, // 4: teleport.usertasks.v1.DiscoverEC2.InstancesEntry - (*v1.Metadata)(nil), // 5: teleport.header.v1.Metadata - (*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp + (*UserTaskStatus)(nil), // 2: teleport.usertasks.v1.UserTaskStatus + (*DiscoverEC2)(nil), // 3: teleport.usertasks.v1.DiscoverEC2 + (*DiscoverEC2Instance)(nil), // 4: teleport.usertasks.v1.DiscoverEC2Instance + (*DiscoverEKS)(nil), // 5: teleport.usertasks.v1.DiscoverEKS + (*DiscoverEKSCluster)(nil), // 6: teleport.usertasks.v1.DiscoverEKSCluster + nil, // 7: teleport.usertasks.v1.DiscoverEC2.InstancesEntry + nil, // 8: teleport.usertasks.v1.DiscoverEKS.ClustersEntry + (*v1.Metadata)(nil), // 9: teleport.header.v1.Metadata + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp } var file_teleport_usertasks_v1_user_tasks_proto_depIdxs = []int32{ - 5, // 0: teleport.usertasks.v1.UserTask.metadata:type_name -> teleport.header.v1.Metadata - 1, // 1: teleport.usertasks.v1.UserTask.spec:type_name -> teleport.usertasks.v1.UserTaskSpec - 2, // 2: teleport.usertasks.v1.UserTaskSpec.discover_ec2:type_name -> teleport.usertasks.v1.DiscoverEC2 - 4, // 3: teleport.usertasks.v1.DiscoverEC2.instances:type_name -> teleport.usertasks.v1.DiscoverEC2.InstancesEntry - 6, // 4: teleport.usertasks.v1.DiscoverEC2Instance.sync_time:type_name -> google.protobuf.Timestamp - 3, // 5: teleport.usertasks.v1.DiscoverEC2.InstancesEntry.value:type_name -> teleport.usertasks.v1.DiscoverEC2Instance - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 9, // 0: teleport.usertasks.v1.UserTask.metadata:type_name -> teleport.header.v1.Metadata + 1, // 1: teleport.usertasks.v1.UserTask.spec:type_name -> teleport.usertasks.v1.UserTaskSpec + 2, // 2: teleport.usertasks.v1.UserTask.status:type_name -> teleport.usertasks.v1.UserTaskStatus + 3, // 3: teleport.usertasks.v1.UserTaskSpec.discover_ec2:type_name -> teleport.usertasks.v1.DiscoverEC2 + 5, // 4: teleport.usertasks.v1.UserTaskSpec.discover_eks:type_name -> teleport.usertasks.v1.DiscoverEKS + 10, // 5: teleport.usertasks.v1.UserTaskStatus.last_state_change:type_name -> google.protobuf.Timestamp + 7, // 6: teleport.usertasks.v1.DiscoverEC2.instances:type_name -> teleport.usertasks.v1.DiscoverEC2.InstancesEntry + 10, // 7: teleport.usertasks.v1.DiscoverEC2Instance.sync_time:type_name -> google.protobuf.Timestamp + 8, // 8: teleport.usertasks.v1.DiscoverEKS.clusters:type_name -> teleport.usertasks.v1.DiscoverEKS.ClustersEntry + 10, // 9: teleport.usertasks.v1.DiscoverEKSCluster.sync_time:type_name -> google.protobuf.Timestamp + 4, // 10: teleport.usertasks.v1.DiscoverEC2.InstancesEntry.value:type_name -> teleport.usertasks.v1.DiscoverEC2Instance + 6, // 11: teleport.usertasks.v1.DiscoverEKS.ClustersEntry.value:type_name -> teleport.usertasks.v1.DiscoverEKSCluster + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_teleport_usertasks_v1_user_tasks_proto_init() } @@ -522,7 +790,7 @@ func file_teleport_usertasks_v1_user_tasks_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_usertasks_v1_user_tasks_proto_rawDesc, NumEnums: 0, - NumMessages: 5, + NumMessages: 9, NumExtensions: 0, NumServices: 0, }, diff --git a/api/go.mod b/api/go.mod index ed6214a246a6d..85073141b97e2 100644 --- a/api/go.mod +++ b/api/go.mod @@ -22,10 +22,10 @@ require ( go.opentelemetry.io/otel/sdk v1.30.0 go.opentelemetry.io/otel/trace v1.30.0 go.opentelemetry.io/proto/otlp v1.3.1 - golang.org/x/crypto v0.27.0 + golang.org/x/crypto v0.31.0 golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 golang.org/x/net v0.29.0 - golang.org/x/term v0.24.0 + golang.org/x/term v0.27.0 google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 google.golang.org/grpc v1.66.3 google.golang.org/protobuf v1.35.1 @@ -45,8 +45,8 @@ require ( github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/api/go.sum b/api/go.sum index c8ac5007a8540..eb48b1c466b0f 100644 --- a/api/go.sum +++ b/api/go.sum @@ -936,8 +936,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1183,8 +1183,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1195,8 +1195,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1215,8 +1215,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/api/proto/teleport/integration/v1/awsoidc_service.proto b/api/proto/teleport/integration/v1/awsoidc_service.proto index eccc118a8646e..be1bfea00247d 100644 --- a/api/proto/teleport/integration/v1/awsoidc_service.proto +++ b/api/proto/teleport/integration/v1/awsoidc_service.proto @@ -492,6 +492,16 @@ message EnrollEKSClusterResult { string resource_id = 2; // Error show what error happened during enrollment. Empty if no error happened. string error = 3; + // IssueType contains the UserTask's issue type for well-known errors. + // Example of allowed values: + // - eks-status-not-active + // - eks-missing-endpoint-public-access + // - eks-authentication-mode-unsupported + // - eks-cluster-unreachable + // - eks-agent-not-connecting + // See usertasks.DiscoverEKSIssueTypes for a complete list of allowed values. + // Empty if no error happened, or the error is not yet handled. + string issue_type = 4; } // EnrollEKSClustersResponse is a response to enrolling EKS clusters. diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 48c2dae302b1d..bcb4a53d9683b 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -2945,6 +2945,38 @@ enum CreateDatabaseUserMode { DB_USER_MODE_BEST_EFFORT_DROP = 3; } +// SSHLocalPortForwarding configures access controls for local SSH port forwarding. +message SSHLocalPortForwarding { + BoolValue Enabled = 1 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "enabled,omitempty", + (gogoproto.customtype) = "BoolOption" + ]; +} + +// SSHRemotePortForwarding configures access controls for remote SSH port forwarding. +message SSHRemotePortForwarding { + BoolValue Enabled = 1 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "enabled,omitempty", + (gogoproto.customtype) = "BoolOption" + ]; +} + +// SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. +message SSHPortForwarding { + // Allow local port forwarding. + SSHLocalPortForwarding Local = 1 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "local,omitempty" + ]; + // Allow remote port forwarding. + SSHRemotePortForwarding Remote = 2 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "remote,omitempty" + ]; +} + // RoleOptions is a set of role options message RoleOptions { // ForwardAgent is SSH agent forwarding. @@ -2959,11 +2991,9 @@ message RoleOptions { (gogoproto.casttype) = "Duration" ]; - // PortForwarding defines if the certificate will have - // "permit-port-forwarding" - // in the certificate. PortForwarding is "yes" if not set, - // that's why this is a pointer + // Deprecated: Use SSHPortForwarding instead BoolValue PortForwarding = 3 [ + deprecated = true, (gogoproto.nullable) = true, (gogoproto.jsontag) = "port_forwarding,omitempty", (gogoproto.customtype) = "BoolOption" @@ -3130,6 +3160,12 @@ message RoleOptions { // CreateHostUserDefaultShell is used to configure the default shell for newly provisioned host users. string CreateHostUserDefaultShell = 31 [(gogoproto.jsontag) = "create_host_user_default_shell,omitempty"]; + + // SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. + SSHPortForwarding SSHPortForwarding = 32 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "ssh_port_forwarding,omitempty" + ]; } message RecordSession { @@ -3358,6 +3394,18 @@ message RoleConditions { (gogoproto.nullable) = false, (gogoproto.jsontag) = "account_assignments,omitempty" ]; + + // WorkloadIdentityLabels controls whether or not specific WorkloadIdentity + // resources can be invoked. Further authorization controls exist on the + // WorkloadIdentity resource itself. + wrappers.LabelValues WorkloadIdentityLabels = 44 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "workload_identity_labels,omitempty", + (gogoproto.customtype) = "Labels" + ]; + // WorkloadIdentityLabelsExpression is a predicate expression used to + // allow/deny access to issuing a WorkloadIdentity. + string WorkloadIdentityLabelsExpression = 45 [(gogoproto.jsontag) = "workload_identity_labels_expression,omitempty"]; } // IdentityCenterAccountAssignment captures an AWS Identity Center account diff --git a/api/proto/teleport/notifications/v1/notifications.proto b/api/proto/teleport/notifications/v1/notifications.proto index 8a4ef50302620..4181964c2c854 100644 --- a/api/proto/teleport/notifications/v1/notifications.proto +++ b/api/proto/teleport/notifications/v1/notifications.proto @@ -86,6 +86,9 @@ message GlobalNotificationSpec { bool match_all_conditions = 4; // notification is the notification itself. Notification notification = 5; + // exclude_users is a list of usernames of users who should never match this notification + // under any circumstances. + repeated string exclude_users = 6; } // ByPermissions represents the RoleConditions needed for a user to receive this notification. diff --git a/api/proto/teleport/usertasks/v1/user_tasks.proto b/api/proto/teleport/usertasks/v1/user_tasks.proto index d4a7a75e714fa..84f3673c7ba1c 100644 --- a/api/proto/teleport/usertasks/v1/user_tasks.proto +++ b/api/proto/teleport/usertasks/v1/user_tasks.proto @@ -37,6 +37,8 @@ message UserTask { teleport.header.v1.Metadata metadata = 4; // The configured properties of UserTask. UserTaskSpec spec = 5; + // The current status for this UserTask. + UserTaskStatus status = 6; } // UserTaskSpec contains the properties of the UserTask. @@ -57,6 +59,15 @@ message UserTaskSpec { // DiscoverEC2 contains the AWS EC2 instances that failed to auto enroll into the cluster. // Present when TaskType is discover-ec2. DiscoverEC2 discover_ec2 = 5; + // DiscoverEKS contains the AWS EKS clusters that failed to auto enroll into the cluster. + // Present when TaskType is discover-eks. + DiscoverEKS discover_eks = 6; +} + +// UserTaskStatus contains the current status for the UserTask. +message UserTaskStatus { + // LastStateChange is the timestamp when the UserTask state was last modified. + google.protobuf.Timestamp last_state_change = 1; } // DiscoverEC2 contains the instances that failed to auto-enroll into the cluster. @@ -96,3 +107,27 @@ message DiscoverEC2Instance { // SyncTime is the timestamp when the error was produced. google.protobuf.Timestamp sync_time = 8; } + +// DiscoverEKS contains the clusters that failed to auto-enroll into the cluster. +message DiscoverEKS { + // Clusters maps a cluster name to the result of enrolling that cluster into teleport. + map clusters = 1; + // AccountID is the AWS Account ID for the cluster. + string account_id = 2; + // Region is the AWS Region where Teleport failed to enroll EKS Clusters. + string region = 3; + // AppAutoDiscover indicates whether the Kubernetes agent should auto enroll HTTP services as Teleport Apps. + bool app_auto_discover = 4; +} + +// DiscoverEKSCluster contains the result of enrolling an AWS EKS Cluster. +message DiscoverEKSCluster { + // Name is the cluster Name. + string name = 1; + // DiscoveryConfig is the discovery config name that originated this cluster enrollment. + string discovery_config = 2; + // DiscoveryGroup is the DiscoveryGroup name that originated this task. + string discovery_group = 3; + // SyncTime is the timestamp when the error was produced. + google.protobuf.Timestamp sync_time = 4; +} diff --git a/api/types/app.go b/api/types/app.go index 75b6283d2e514..978342957939c 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -472,7 +472,7 @@ func (a *AppV3) GetDisplayName() string { if a.Spec.IdentityCenter == nil { return "" } - return a.GetName() + return a.Metadata.Description } // IsEqual determines if two application resources are equivalent to one another. diff --git a/api/types/constants.go b/api/types/constants.go index 369cc46730bf0..61d830633e80c 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -1296,6 +1296,8 @@ var RequestableResourceKinds = []string{ KindKubeCertificateSigningRequest, KindKubeIngress, KindSAMLIdPServiceProvider, + KindIdentityCenterAccount, + KindIdentityCenterAccountAssignment, } // The list below needs to be kept in sync with `kubernetesResourceKindOptions` diff --git a/api/types/role.go b/api/types/role.go index 3e1034ef1b8d9..4b3e41baf6baa 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -107,6 +107,13 @@ type Role interface { // SetNodeLabels sets the map of node labels this role is allowed or denied access to. SetNodeLabels(RoleConditionType, Labels) + // GetWorkloadIdentityLabels gets the map of node labels this role is + // allowed or denied access to. + GetWorkloadIdentityLabels(RoleConditionType) Labels + // SetWorkloadIdentityLabels sets the map of WorkloadIdentity labels this + // role is allowed or denied access to. + SetWorkloadIdentityLabels(RoleConditionType, Labels) + // GetAppLabels gets the map of app labels this role is allowed or denied access to. GetAppLabels(RoleConditionType) Labels // SetAppLabels sets the map of app labels this role is allowed or denied access to. @@ -611,6 +618,25 @@ func (r *RoleV6) SetNodeLabels(rct RoleConditionType, labels Labels) { } } +// GetWorkloadIdentityLabels gets the map of WorkloadIdentity labels for +// allow or deny. +func (r *RoleV6) GetWorkloadIdentityLabels(rct RoleConditionType) Labels { + if rct == Allow { + return r.Spec.Allow.WorkloadIdentityLabels + } + return r.Spec.Deny.WorkloadIdentityLabels +} + +// SetWorkloadIdentityLabels sets the map of WorkloadIdentity labels this role +// is allowed or denied access to. +func (r *RoleV6) SetWorkloadIdentityLabels(rct RoleConditionType, labels Labels) { + if rct == Allow { + r.Spec.Allow.WorkloadIdentityLabels = labels.Clone() + } else { + r.Spec.Deny.WorkloadIdentityLabels = labels.Clone() + } +} + // GetAppLabels gets the map of app labels this role is allowed or denied access to. func (r *RoleV6) GetAppLabels(rct RoleConditionType) Labels { if rct == Allow { @@ -1043,9 +1069,6 @@ func (r *RoleV6) CheckAndSetDefaults() error { if r.Spec.Options.MaxSessionTTL.Value() == 0 { r.Spec.Options.MaxSessionTTL = NewDuration(defaults.MaxCertDuration) } - if r.Spec.Options.PortForwarding == nil { - r.Spec.Options.PortForwarding = NewBoolOption(true) - } if len(r.Spec.Options.BPF) == 0 { r.Spec.Options.BPF = defaults.EnhancedEvents() } @@ -1234,6 +1257,7 @@ func (r *RoleV6) CheckAndSetDefaults() error { r.Spec.Allow.DatabaseLabels, r.Spec.Allow.WindowsDesktopLabels, r.Spec.Allow.GroupLabels, + r.Spec.Allow.WorkloadIdentityLabels, } { if err := checkWildcardSelector(labels); err != nil { return trace.Wrap(err) @@ -1926,6 +1950,8 @@ func (r *RoleV6) GetLabelMatchers(rct RoleConditionType, kind string) (LabelMatc return LabelMatchers{cond.WindowsDesktopLabels, cond.WindowsDesktopLabelsExpression}, nil case KindUserGroup: return LabelMatchers{cond.GroupLabels, cond.GroupLabelsExpression}, nil + case KindWorkloadIdentity: + return LabelMatchers{cond.WorkloadIdentityLabels, cond.WorkloadIdentityLabelsExpression}, nil } return LabelMatchers{}, trace.BadParameter("can't get label matchers for resource kind %q", kind) } @@ -1979,6 +2005,10 @@ func (r *RoleV6) SetLabelMatchers(rct RoleConditionType, kind string, labelMatch cond.GroupLabels = labelMatchers.Labels cond.GroupLabelsExpression = labelMatchers.Expression return nil + case KindWorkloadIdentity: + cond.WorkloadIdentityLabels = labelMatchers.Labels + cond.WorkloadIdentityLabelsExpression = labelMatchers.Expression + return nil } return trace.BadParameter("can't set label matchers for resource kind %q", kind) } @@ -2194,8 +2224,23 @@ func (h CreateDatabaseUserMode) encode() (string, error) { func (h *CreateDatabaseUserMode) decode(val any) error { var str string switch val := val.(type) { + case int32: + return trace.Wrap(h.setFromEnum(val)) + case int64: + return trace.Wrap(h.setFromEnum(int32(val))) + case int: + return trace.Wrap(h.setFromEnum(int32(val))) + case float64: + return trace.Wrap(h.setFromEnum(int32(val))) + case float32: + return trace.Wrap(h.setFromEnum(int32(val))) case string: str = val + case bool: + if val { + return trace.BadParameter("create_database_user_mode cannot be true, got %v", val) + } + str = createHostUserModeOffString default: return trace.BadParameter("bad value type %T, expected string", val) } @@ -2216,6 +2261,15 @@ func (h *CreateDatabaseUserMode) decode(val any) error { return nil } +// setFromEnum sets the value from enum value as int32. +func (h *CreateDatabaseUserMode) setFromEnum(val int32) error { + if _, ok := CreateDatabaseUserMode_name[val]; !ok { + return trace.BadParameter("invalid database user creation mode %v", val) + } + *h = CreateDatabaseUserMode(val) + return nil +} + // UnmarshalYAML supports parsing CreateDatabaseUserMode from string. func (h *CreateDatabaseUserMode) UnmarshalYAML(unmarshal func(interface{}) error) error { var val interface{} diff --git a/api/types/role_test.go b/api/types/role_test.go index 09ac7c2072951..ed2857a36fd16 100644 --- a/api/types/role_test.go +++ b/api/types/role_test.go @@ -593,8 +593,8 @@ func TestMarshallCreateHostUserModeYAML(t *testing.T) { input CreateHostUserMode expected string }{ - {input: CreateHostUserMode_HOST_USER_MODE_OFF, expected: "\"off\""}, - {input: CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED, expected: "\"\""}, + {input: CreateHostUserMode_HOST_USER_MODE_OFF, expected: `"off"`}, + {input: CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED, expected: `""`}, {input: CreateHostUserMode_HOST_USER_MODE_KEEP, expected: "keep"}, {input: CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, expected: "insecure-drop"}, } { @@ -606,15 +606,15 @@ func TestMarshallCreateHostUserModeYAML(t *testing.T) { func TestUnmarshallCreateHostUserModeJSON(t *testing.T) { for _, tc := range []struct { - expected CreateHostUserMode input any + expected CreateHostUserMode }{ - {expected: CreateHostUserMode_HOST_USER_MODE_OFF, input: "\"off\""}, - {expected: CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED, input: "\"\""}, - {expected: CreateHostUserMode_HOST_USER_MODE_KEEP, input: "\"keep\""}, - {expected: CreateHostUserMode_HOST_USER_MODE_KEEP, input: 3}, - {expected: CreateHostUserMode_HOST_USER_MODE_OFF, input: 1}, - {expected: CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, input: 4}, + {input: `"off"`, expected: CreateHostUserMode_HOST_USER_MODE_OFF}, + {input: `""`, expected: CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED}, + {input: `"keep"`, expected: CreateHostUserMode_HOST_USER_MODE_KEEP}, + {input: 3, expected: CreateHostUserMode_HOST_USER_MODE_KEEP}, + {input: 1, expected: CreateHostUserMode_HOST_USER_MODE_OFF}, + {input: 4, expected: CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP}, } { var got CreateHostUserMode err := json.Unmarshal([]byte(fmt.Sprintf("%v", tc.input)), &got) @@ -625,14 +625,14 @@ func TestUnmarshallCreateHostUserModeJSON(t *testing.T) { func TestUnmarshallCreateHostUserModeYAML(t *testing.T) { for _, tc := range []struct { - expected CreateHostUserMode input string + expected CreateHostUserMode }{ - {expected: CreateHostUserMode_HOST_USER_MODE_OFF, input: "\"off\""}, - {expected: CreateHostUserMode_HOST_USER_MODE_OFF, input: "off"}, - {expected: CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED, input: "\"\""}, - {expected: CreateHostUserMode_HOST_USER_MODE_KEEP, input: "keep"}, - {expected: CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP, input: "insecure-drop"}, + {input: `"off"`, expected: CreateHostUserMode_HOST_USER_MODE_OFF}, + {input: "off", expected: CreateHostUserMode_HOST_USER_MODE_OFF}, + {input: `""`, expected: CreateHostUserMode_HOST_USER_MODE_UNSPECIFIED}, + {input: "keep", expected: CreateHostUserMode_HOST_USER_MODE_KEEP}, + {input: "insecure-drop", expected: CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP}, } { var got CreateHostUserMode err := yaml.Unmarshal([]byte(tc.input), &got) @@ -641,6 +641,49 @@ func TestUnmarshallCreateHostUserModeYAML(t *testing.T) { } } +func TestUnmarshallCreateDatabaseUserModeJSON(t *testing.T) { + for _, tc := range []struct { + input any + expected CreateDatabaseUserMode + }{ + {input: `""`, expected: CreateDatabaseUserMode_DB_USER_MODE_UNSPECIFIED}, + {input: `"off"`, expected: CreateDatabaseUserMode_DB_USER_MODE_OFF}, + {input: `"keep"`, expected: CreateDatabaseUserMode_DB_USER_MODE_KEEP}, + {input: `"best_effort_drop"`, expected: CreateDatabaseUserMode_DB_USER_MODE_BEST_EFFORT_DROP}, + {input: 0, expected: CreateDatabaseUserMode_DB_USER_MODE_UNSPECIFIED}, + {input: 1, expected: CreateDatabaseUserMode_DB_USER_MODE_OFF}, + {input: 2, expected: CreateDatabaseUserMode_DB_USER_MODE_KEEP}, + {input: 3, expected: CreateDatabaseUserMode_DB_USER_MODE_BEST_EFFORT_DROP}, + } { + var got CreateDatabaseUserMode + err := json.Unmarshal([]byte(fmt.Sprintf("%v", tc.input)), &got) + require.NoError(t, err) + require.Equalf(t, tc.expected, got, "for input: %v", tc.input) + } +} + +func TestUnmarshallCreateDatabaseUserModeYAML(t *testing.T) { + for _, tc := range []struct { + input any + expected CreateDatabaseUserMode + }{ + {input: `""`, expected: CreateDatabaseUserMode_DB_USER_MODE_UNSPECIFIED}, + {input: `"off"`, expected: CreateDatabaseUserMode_DB_USER_MODE_OFF}, + {input: "off", expected: CreateDatabaseUserMode_DB_USER_MODE_OFF}, + {input: `"keep"`, expected: CreateDatabaseUserMode_DB_USER_MODE_KEEP}, + {input: `"best_effort_drop"`, expected: CreateDatabaseUserMode_DB_USER_MODE_BEST_EFFORT_DROP}, + {input: 0, expected: CreateDatabaseUserMode_DB_USER_MODE_UNSPECIFIED}, + {input: 1, expected: CreateDatabaseUserMode_DB_USER_MODE_OFF}, + {input: 2, expected: CreateDatabaseUserMode_DB_USER_MODE_KEEP}, + {input: 3, expected: CreateDatabaseUserMode_DB_USER_MODE_BEST_EFFORT_DROP}, + } { + var got CreateDatabaseUserMode + err := yaml.Unmarshal([]byte(fmt.Sprintf("%v", tc.input)), &got) + require.NoError(t, err) + require.Equalf(t, tc.expected, got, "for input: %v", tc.input) + } +} + func TestRoleV6_CheckAndSetDefaults(t *testing.T) { t.Parallel() requireBadParameterContains := func(contains string) require.ErrorAssertionFunc { diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 6a6d20a0beab2..0138f00d8f3f3 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1157,7 +1157,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257, 0} + return fileDescriptor_9198ee693835762e, []int{260, 0} } // StatusType describes whether this was a success or a failure. @@ -1186,7 +1186,7 @@ func (x ConnectionDiagnosticTrace_StatusType) String() string { } func (ConnectionDiagnosticTrace_StatusType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257, 1} + return fileDescriptor_9198ee693835762e, []int{260, 1} } // OktaAssignmentStatus represents the status of an Okta assignment. @@ -1226,7 +1226,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338, 0} + return fileDescriptor_9198ee693835762e, []int{341, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1258,7 +1258,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339, 0} + return fileDescriptor_9198ee693835762e, []int{342, 0} } type KeepAlive struct { @@ -8160,17 +8160,140 @@ func (m *RoleSpecV6) XXX_DiscardUnknown() { var xxx_messageInfo_RoleSpecV6 proto.InternalMessageInfo +// SSHLocalPortForwarding configures access controls for local SSH port forwarding. +type SSHLocalPortForwarding struct { + Enabled *BoolOption `protobuf:"bytes,1,opt,name=Enabled,proto3,customtype=BoolOption" json:"enabled,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSHLocalPortForwarding) Reset() { *m = SSHLocalPortForwarding{} } +func (m *SSHLocalPortForwarding) String() string { return proto.CompactTextString(m) } +func (*SSHLocalPortForwarding) ProtoMessage() {} +func (*SSHLocalPortForwarding) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{121} +} +func (m *SSHLocalPortForwarding) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSHLocalPortForwarding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSHLocalPortForwarding.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 *SSHLocalPortForwarding) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSHLocalPortForwarding.Merge(m, src) +} +func (m *SSHLocalPortForwarding) XXX_Size() int { + return m.Size() +} +func (m *SSHLocalPortForwarding) XXX_DiscardUnknown() { + xxx_messageInfo_SSHLocalPortForwarding.DiscardUnknown(m) +} + +var xxx_messageInfo_SSHLocalPortForwarding proto.InternalMessageInfo + +// SSHRemotePortForwarding configures access controls for remote SSH port forwarding. +type SSHRemotePortForwarding struct { + Enabled *BoolOption `protobuf:"bytes,1,opt,name=Enabled,proto3,customtype=BoolOption" json:"enabled,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSHRemotePortForwarding) Reset() { *m = SSHRemotePortForwarding{} } +func (m *SSHRemotePortForwarding) String() string { return proto.CompactTextString(m) } +func (*SSHRemotePortForwarding) ProtoMessage() {} +func (*SSHRemotePortForwarding) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{122} +} +func (m *SSHRemotePortForwarding) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSHRemotePortForwarding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSHRemotePortForwarding.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 *SSHRemotePortForwarding) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSHRemotePortForwarding.Merge(m, src) +} +func (m *SSHRemotePortForwarding) XXX_Size() int { + return m.Size() +} +func (m *SSHRemotePortForwarding) XXX_DiscardUnknown() { + xxx_messageInfo_SSHRemotePortForwarding.DiscardUnknown(m) +} + +var xxx_messageInfo_SSHRemotePortForwarding proto.InternalMessageInfo + +// SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. +type SSHPortForwarding struct { + // Allow local port forwarding. + Local *SSHLocalPortForwarding `protobuf:"bytes,1,opt,name=Local,proto3" json:"local,omitempty"` + // Allow remote port forwarding. + Remote *SSHRemotePortForwarding `protobuf:"bytes,2,opt,name=Remote,proto3" json:"remote,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSHPortForwarding) Reset() { *m = SSHPortForwarding{} } +func (m *SSHPortForwarding) String() string { return proto.CompactTextString(m) } +func (*SSHPortForwarding) ProtoMessage() {} +func (*SSHPortForwarding) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{123} +} +func (m *SSHPortForwarding) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSHPortForwarding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSHPortForwarding.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 *SSHPortForwarding) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSHPortForwarding.Merge(m, src) +} +func (m *SSHPortForwarding) XXX_Size() int { + return m.Size() +} +func (m *SSHPortForwarding) XXX_DiscardUnknown() { + xxx_messageInfo_SSHPortForwarding.DiscardUnknown(m) +} + +var xxx_messageInfo_SSHPortForwarding proto.InternalMessageInfo + // RoleOptions is a set of role options type RoleOptions struct { // ForwardAgent is SSH agent forwarding. ForwardAgent Bool `protobuf:"varint,1,opt,name=ForwardAgent,proto3,casttype=Bool" json:"forward_agent"` // MaxSessionTTL defines how long a SSH session can last for. MaxSessionTTL Duration `protobuf:"varint,2,opt,name=MaxSessionTTL,proto3,casttype=Duration" json:"max_session_ttl,omitempty"` - // PortForwarding defines if the certificate will have - // "permit-port-forwarding" - // in the certificate. PortForwarding is "yes" if not set, - // that's why this is a pointer - PortForwarding *BoolOption `protobuf:"bytes,3,opt,name=PortForwarding,proto3,customtype=BoolOption" json:"port_forwarding,omitempty"` + // Deprecated: Use SSHPortForwarding instead + PortForwarding *BoolOption `protobuf:"bytes,3,opt,name=PortForwarding,proto3,customtype=BoolOption" json:"port_forwarding,omitempty"` // Deprecated: Do not use. // CertificateFormat defines the format of the user certificate to allow // compatibility with older versions of OpenSSH. CertificateFormat string `protobuf:"bytes,4,opt,name=CertificateFormat,proto3" json:"cert_format"` @@ -8254,17 +8377,19 @@ type RoleOptions struct { // If not set, defaults to `max_session_ttl`. MFAVerificationInterval time.Duration `protobuf:"bytes,30,opt,name=MFAVerificationInterval,proto3,stdduration" json:"mfa_verification_interval,omitempty"` // CreateHostUserDefaultShell is used to configure the default shell for newly provisioned host users. - CreateHostUserDefaultShell string `protobuf:"bytes,31,opt,name=CreateHostUserDefaultShell,proto3" json:"create_host_user_default_shell,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + CreateHostUserDefaultShell string `protobuf:"bytes,31,opt,name=CreateHostUserDefaultShell,proto3" json:"create_host_user_default_shell,omitempty"` + // SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. + SSHPortForwarding *SSHPortForwarding `protobuf:"bytes,32,opt,name=SSHPortForwarding,proto3" json:"ssh_port_forwarding,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{121} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8310,7 +8435,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{122} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8362,7 +8487,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{123} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8488,17 +8613,24 @@ type RoleConditions struct { SPIFFE []*SPIFFERoleCondition `protobuf:"bytes,39,rep,name=SPIFFE,proto3" json:"spiffe,omitempty"` // AccountAssignments holds the list of account assignments affected by this // condition. - AccountAssignments []IdentityCenterAccountAssignment `protobuf:"bytes,42,rep,name=AccountAssignments,proto3" json:"account_assignments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AccountAssignments []IdentityCenterAccountAssignment `protobuf:"bytes,42,rep,name=AccountAssignments,proto3" json:"account_assignments,omitempty"` + // WorkloadIdentityLabels controls whether or not specific WorkloadIdentity + // resources can be invoked. Further authorization controls exist on the + // WorkloadIdentity resource itself. + WorkloadIdentityLabels Labels `protobuf:"bytes,44,opt,name=WorkloadIdentityLabels,proto3,customtype=Labels" json:"workload_identity_labels,omitempty"` + // WorkloadIdentityLabelsExpression is a predicate expression used to + // allow/deny access to issuing a WorkloadIdentity. + WorkloadIdentityLabelsExpression string `protobuf:"bytes,45,opt,name=WorkloadIdentityLabelsExpression,proto3" json:"workload_identity_labels_expression,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{124} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8541,7 +8673,7 @@ func (m *IdentityCenterAccountAssignment) Reset() { *m = IdentityCenterA func (m *IdentityCenterAccountAssignment) String() string { return proto.CompactTextString(m) } func (*IdentityCenterAccountAssignment) ProtoMessage() {} func (*IdentityCenterAccountAssignment) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{125} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8617,7 +8749,7 @@ func (m *SPIFFERoleCondition) Reset() { *m = SPIFFERoleCondition{} } func (m *SPIFFERoleCondition) String() string { return proto.CompactTextString(m) } func (*SPIFFERoleCondition) ProtoMessage() {} func (*SPIFFERoleCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{126} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8661,7 +8793,7 @@ func (m *DatabasePermission) Reset() { *m = DatabasePermission{} } func (m *DatabasePermission) String() string { return proto.CompactTextString(m) } func (*DatabasePermission) ProtoMessage() {} func (*DatabasePermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{127} + return fileDescriptor_9198ee693835762e, []int{130} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8711,7 +8843,7 @@ func (m *KubernetesResource) Reset() { *m = KubernetesResource{} } func (m *KubernetesResource) String() string { return proto.CompactTextString(m) } func (*KubernetesResource) ProtoMessage() {} func (*KubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{128} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8764,7 +8896,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{129} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8812,7 +8944,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{130} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8888,7 +9020,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{131} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8934,7 +9066,7 @@ func (m *AccessRequestConditionsReason) Reset() { *m = AccessRequestCond func (m *AccessRequestConditionsReason) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditionsReason) ProtoMessage() {} func (*AccessRequestConditionsReason) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{132} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8987,7 +9119,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{133} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9029,7 +9161,7 @@ func (m *AccessRequestAllowedPromotion) Reset() { *m = AccessRequestAllo func (m *AccessRequestAllowedPromotion) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotion) ProtoMessage() {} func (*AccessRequestAllowedPromotion) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{134} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9072,7 +9204,7 @@ func (m *AccessRequestAllowedPromotions) Reset() { *m = AccessRequestAll func (m *AccessRequestAllowedPromotions) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotions) ProtoMessage() {} func (*AccessRequestAllowedPromotions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{135} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9118,7 +9250,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{136} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9164,7 +9296,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{137} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9213,7 +9345,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9261,7 +9393,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{139} + return fileDescriptor_9198ee693835762e, []int{142} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9303,7 +9435,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9345,7 +9477,7 @@ func (m *UserFilter) Reset() { *m = UserFilter{} } func (m *UserFilter) String() string { return proto.CompactTextString(m) } func (*UserFilter) ProtoMessage() {} func (*UserFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{141} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9396,7 +9528,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{142} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9445,7 +9577,7 @@ func (m *UserStatusV2) Reset() { *m = UserStatusV2{} } func (m *UserStatusV2) String() string { return proto.CompactTextString(m) } func (*UserStatusV2) ProtoMessage() {} func (*UserStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9519,7 +9651,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{144} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9566,7 +9698,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9614,7 +9746,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{146} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9659,7 +9791,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{147} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9708,7 +9840,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{148} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9765,7 +9897,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{149} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9875,7 +10007,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{150} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9921,7 +10053,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{151} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10003,7 +10135,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{152} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10049,7 +10181,7 @@ func (m *SSOMFADevice) Reset() { *m = SSOMFADevice{} } func (m *SSOMFADevice) String() string { return proto.CompactTextString(m) } func (*SSOMFADevice) ProtoMessage() {} func (*SSOMFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{153} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10092,7 +10224,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{154} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10138,7 +10270,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{155} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10180,7 +10312,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{156} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10230,7 +10362,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10277,7 +10409,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10326,7 +10458,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{159} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10374,7 +10506,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{160} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10422,7 +10554,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10473,7 +10605,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{162} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10521,7 +10653,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10567,7 +10699,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{164} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10616,7 +10748,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10658,7 +10790,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{166} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10707,7 +10839,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{167} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10792,7 +10924,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{168} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10837,7 +10969,7 @@ func (m *DeviceWebToken) Reset() { *m = DeviceWebToken{} } func (m *DeviceWebToken) String() string { return proto.CompactTextString(m) } func (*DeviceWebToken) ProtoMessage() {} func (*DeviceWebToken) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{169} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10879,7 +11011,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{170} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10950,7 +11082,7 @@ func (m *SAMLSessionData) Reset() { *m = SAMLSessionData{} } func (m *SAMLSessionData) String() string { return proto.CompactTextString(m) } func (*SAMLSessionData) ProtoMessage() {} func (*SAMLSessionData) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{171} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10999,7 +11131,7 @@ func (m *SAMLAttribute) Reset() { *m = SAMLAttribute{} } func (m *SAMLAttribute) String() string { return proto.CompactTextString(m) } func (*SAMLAttribute) ProtoMessage() {} func (*SAMLAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{172} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11046,7 +11178,7 @@ func (m *SAMLAttributeValue) Reset() { *m = SAMLAttributeValue{} } func (m *SAMLAttributeValue) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeValue) ProtoMessage() {} func (*SAMLAttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11097,7 +11229,7 @@ func (m *SAMLNameID) Reset() { *m = SAMLNameID{} } func (m *SAMLNameID) String() string { return proto.CompactTextString(m) } func (*SAMLNameID) ProtoMessage() {} func (*SAMLNameID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{174} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11146,7 +11278,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11190,7 +11322,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11240,7 +11372,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{177} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11289,7 +11421,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{178} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11340,7 +11472,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{179} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11388,7 +11520,7 @@ func (m *KubeAzure) Reset() { *m = KubeAzure{} } func (m *KubeAzure) String() string { return proto.CompactTextString(m) } func (*KubeAzure) ProtoMessage() {} func (*KubeAzure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{180} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11434,7 +11566,7 @@ func (m *KubeAWS) Reset() { *m = KubeAWS{} } func (m *KubeAWS) String() string { return proto.CompactTextString(m) } func (*KubeAWS) ProtoMessage() {} func (*KubeAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11480,7 +11612,7 @@ func (m *KubeGCP) Reset() { *m = KubeGCP{} } func (m *KubeGCP) String() string { return proto.CompactTextString(m) } func (*KubeGCP) ProtoMessage() {} func (*KubeGCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11522,7 +11654,7 @@ func (m *KubernetesClusterV3List) Reset() { *m = KubernetesClusterV3List func (m *KubernetesClusterV3List) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterV3List) ProtoMessage() {} func (*KubernetesClusterV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11571,7 +11703,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11623,7 +11755,7 @@ func (m *KubernetesServerSpecV3) Reset() { *m = KubernetesServerSpecV3{} func (m *KubernetesServerSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesServerSpecV3) ProtoMessage() {} func (*KubernetesServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{185} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11675,7 +11807,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{186} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11719,7 +11851,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{187} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11763,7 +11895,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{188} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11807,7 +11939,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{189} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11851,7 +11983,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{190} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11895,7 +12027,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11937,7 +12069,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{192} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11981,7 +12113,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{193} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12023,7 +12155,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12067,7 +12199,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{195} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12109,7 +12241,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{196} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12160,7 +12292,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{197} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12202,7 +12334,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{198} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12290,7 +12422,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{199} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12332,7 +12464,7 @@ func (m *MaxAge) Reset() { *m = MaxAge{} } func (m *MaxAge) String() string { return proto.CompactTextString(m) } func (*MaxAge) ProtoMessage() {} func (*MaxAge) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12377,7 +12509,7 @@ func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSett func (m *SSOClientRedirectSettings) String() string { return proto.CompactTextString(m) } func (*SSOClientRedirectSettings) ProtoMessage() {} func (*SSOClientRedirectSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{201} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12434,7 +12566,7 @@ func (m *OIDCConnectorMFASettings) Reset() { *m = OIDCConnectorMFASettin func (m *OIDCConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorMFASettings) ProtoMessage() {} func (*OIDCConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12536,7 +12668,7 @@ func (m *OIDCAuthRequest) Reset() { *m = OIDCAuthRequest{} } func (m *OIDCAuthRequest) String() string { return proto.CompactTextString(m) } func (*OIDCAuthRequest) ProtoMessage() {} func (*OIDCAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{203} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12587,7 +12719,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{204} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12629,7 +12761,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{205} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12711,7 +12843,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{206} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12770,7 +12902,7 @@ func (m *SAMLConnectorMFASettings) Reset() { *m = SAMLConnectorMFASettin func (m *SAMLConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorMFASettings) ProtoMessage() {} func (*SAMLConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{207} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12866,7 +12998,7 @@ func (m *SAMLAuthRequest) Reset() { *m = SAMLAuthRequest{} } func (m *SAMLAuthRequest) String() string { return proto.CompactTextString(m) } func (*SAMLAuthRequest) ProtoMessage() {} func (*SAMLAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{208} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12912,7 +13044,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{209} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12957,7 +13089,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{210} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13008,7 +13140,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{211} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13050,7 +13182,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{212} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13113,7 +13245,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{213} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13206,7 +13338,7 @@ func (m *GithubAuthRequest) Reset() { *m = GithubAuthRequest{} } func (m *GithubAuthRequest) String() string { return proto.CompactTextString(m) } func (*GithubAuthRequest) ProtoMessage() {} func (*GithubAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{214} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13250,7 +13382,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{215} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13306,7 +13438,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{216} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13391,7 +13523,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{217} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13435,7 +13567,7 @@ func (m *GithubTokenInfo) Reset() { *m = GithubTokenInfo{} } func (m *GithubTokenInfo) String() string { return proto.CompactTextString(m) } func (*GithubTokenInfo) ProtoMessage() {} func (*GithubTokenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{218} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13481,7 +13613,7 @@ func (m *GithubClaims) Reset() { *m = GithubClaims{} } func (m *GithubClaims) String() string { return proto.CompactTextString(m) } func (*GithubClaims) ProtoMessage() {} func (*GithubClaims) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{219} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13533,7 +13665,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13579,7 +13711,7 @@ func (m *TeamRolesMapping) Reset() { *m = TeamRolesMapping{} } func (m *TeamRolesMapping) String() string { return proto.CompactTextString(m) } func (*TeamRolesMapping) ProtoMessage() {} func (*TeamRolesMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{221} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13629,7 +13761,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{222} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13671,7 +13803,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{223} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13727,7 +13859,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{224} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13781,7 +13913,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13831,7 +13963,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{226} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13892,7 +14024,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{227} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13936,7 +14068,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{228} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13979,7 +14111,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{229} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14032,7 +14164,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{230} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14076,7 +14208,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{231} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14124,7 +14256,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{232} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14168,7 +14300,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{233} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14212,7 +14344,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{234} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14265,7 +14397,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{235} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14309,7 +14441,7 @@ func (m *DynamicWindowsDesktopV1) Reset() { *m = DynamicWindowsDesktopV1 func (m *DynamicWindowsDesktopV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopV1) ProtoMessage() {} func (*DynamicWindowsDesktopV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{236} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14360,7 +14492,7 @@ func (m *DynamicWindowsDesktopSpecV1) Reset() { *m = DynamicWindowsDeskt func (m *DynamicWindowsDesktopSpecV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopSpecV1) ProtoMessage() {} func (*DynamicWindowsDesktopSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{237} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14401,7 +14533,7 @@ func (m *Resolution) Reset() { *m = Resolution{} } func (m *Resolution) String() string { return proto.CompactTextString(m) } func (*Resolution) ProtoMessage() {} func (*Resolution) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14484,7 +14616,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{239} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14538,7 +14670,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{240} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14583,7 +14715,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{241} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14627,7 +14759,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{242} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14667,7 +14799,7 @@ func (m *NullableSessionState) Reset() { *m = NullableSessionState{} } func (m *NullableSessionState) String() string { return proto.CompactTextString(m) } func (*NullableSessionState) ProtoMessage() {} func (*NullableSessionState) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14713,7 +14845,7 @@ func (m *SessionTrackerFilter) Reset() { *m = SessionTrackerFilter{} } func (m *SessionTrackerFilter) String() string { return proto.CompactTextString(m) } func (*SessionTrackerFilter) ProtoMessage() {} func (*SessionTrackerFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{244} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14757,7 +14889,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14855,7 +14987,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{246} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14902,7 +15034,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{247} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14950,7 +15082,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{248} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14994,7 +15126,7 @@ func (m *UIConfigV1) Reset() { *m = UIConfigV1{} } func (m *UIConfigV1) String() string { return proto.CompactTextString(m) } func (*UIConfigV1) ProtoMessage() {} func (*UIConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{249} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15040,7 +15172,7 @@ func (m *UIConfigSpecV1) Reset() { *m = UIConfigSpecV1{} } func (m *UIConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*UIConfigSpecV1) ProtoMessage() {} func (*UIConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15091,7 +15223,7 @@ func (m *InstallerV1) Reset() { *m = InstallerV1{} } func (m *InstallerV1) String() string { return proto.CompactTextString(m) } func (*InstallerV1) ProtoMessage() {} func (*InstallerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{251} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15133,7 +15265,7 @@ func (m *InstallerSpecV1) Reset() { *m = InstallerSpecV1{} } func (m *InstallerSpecV1) String() string { return proto.CompactTextString(m) } func (*InstallerSpecV1) ProtoMessage() {} func (*InstallerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{252} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15175,7 +15307,7 @@ func (m *InstallerV1List) Reset() { *m = InstallerV1List{} } func (m *InstallerV1List) String() string { return proto.CompactTextString(m) } func (*InstallerV1List) ProtoMessage() {} func (*InstallerV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{253} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15219,7 +15351,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{254} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15265,7 +15397,7 @@ func (m *ConnectionDiagnosticV1) Reset() { *m = ConnectionDiagnosticV1{} func (m *ConnectionDiagnosticV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticV1) ProtoMessage() {} func (*ConnectionDiagnosticV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{255} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15315,7 +15447,7 @@ func (m *ConnectionDiagnosticSpecV1) Reset() { *m = ConnectionDiagnostic func (m *ConnectionDiagnosticSpecV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticSpecV1) ProtoMessage() {} func (*ConnectionDiagnosticSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{256} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15361,7 +15493,7 @@ func (m *ConnectionDiagnosticTrace) Reset() { *m = ConnectionDiagnosticT func (m *ConnectionDiagnosticTrace) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticTrace) ProtoMessage() {} func (*ConnectionDiagnosticTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15404,7 +15536,7 @@ func (m *DatabaseServiceV1) Reset() { *m = DatabaseServiceV1{} } func (m *DatabaseServiceV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1) ProtoMessage() {} func (*DatabaseServiceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{258} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15448,7 +15580,7 @@ func (m *DatabaseServiceSpecV1) Reset() { *m = DatabaseServiceSpecV1{} } func (m *DatabaseServiceSpecV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceSpecV1) ProtoMessage() {} func (*DatabaseServiceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{259} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15490,7 +15622,7 @@ func (m *DatabaseResourceMatcher) Reset() { *m = DatabaseResourceMatcher func (m *DatabaseResourceMatcher) String() string { return proto.CompactTextString(m) } func (*DatabaseResourceMatcher) ProtoMessage() {} func (*DatabaseResourceMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15534,7 +15666,7 @@ func (m *ResourceMatcherAWS) Reset() { *m = ResourceMatcherAWS{} } func (m *ResourceMatcherAWS) String() string { return proto.CompactTextString(m) } func (*ResourceMatcherAWS) ProtoMessage() {} func (*ResourceMatcherAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{261} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15576,7 +15708,7 @@ func (m *ClusterAlert) Reset() { *m = ClusterAlert{} } func (m *ClusterAlert) String() string { return proto.CompactTextString(m) } func (*ClusterAlert) ProtoMessage() {} func (*ClusterAlert) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15622,7 +15754,7 @@ func (m *ClusterAlertSpec) Reset() { *m = ClusterAlertSpec{} } func (m *ClusterAlertSpec) String() string { return proto.CompactTextString(m) } func (*ClusterAlertSpec) ProtoMessage() {} func (*ClusterAlertSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{263} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15675,7 +15807,7 @@ func (m *GetClusterAlertsRequest) Reset() { *m = GetClusterAlertsRequest func (m *GetClusterAlertsRequest) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsRequest) ProtoMessage() {} func (*GetClusterAlertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{264} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15725,7 +15857,7 @@ func (m *AlertAcknowledgement) Reset() { *m = AlertAcknowledgement{} } func (m *AlertAcknowledgement) String() string { return proto.CompactTextString(m) } func (*AlertAcknowledgement) ProtoMessage() {} func (*AlertAcknowledgement) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{265} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15777,7 +15909,7 @@ func (m *Release) Reset() { *m = Release{} } func (m *Release) String() string { return proto.CompactTextString(m) } func (*Release) ProtoMessage() {} func (*Release) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{266} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15835,7 +15967,7 @@ func (m *Asset) Reset() { *m = Asset{} } func (m *Asset) String() string { return proto.CompactTextString(m) } func (*Asset) ProtoMessage() {} func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{267} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15888,7 +16020,7 @@ func (m *PluginV1) Reset() { *m = PluginV1{} } func (m *PluginV1) String() string { return proto.CompactTextString(m) } func (*PluginV1) ProtoMessage() {} func (*PluginV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{268} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15955,7 +16087,7 @@ func (m *PluginSpecV1) Reset() { *m = PluginSpecV1{} } func (m *PluginSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginSpecV1) ProtoMessage() {} func (*PluginSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{269} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16221,7 +16353,7 @@ func (m *PluginSlackAccessSettings) Reset() { *m = PluginSlackAccessSett func (m *PluginSlackAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginSlackAccessSettings) ProtoMessage() {} func (*PluginSlackAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{270} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16262,7 +16394,7 @@ func (m *PluginGitlabSettings) Reset() { *m = PluginGitlabSettings{} } func (m *PluginGitlabSettings) String() string { return proto.CompactTextString(m) } func (*PluginGitlabSettings) ProtoMessage() {} func (*PluginGitlabSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{271} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16309,7 +16441,7 @@ func (m *PluginOpsgenieAccessSettings) Reset() { *m = PluginOpsgenieAcce func (m *PluginOpsgenieAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginOpsgenieAccessSettings) ProtoMessage() {} func (*PluginOpsgenieAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16357,7 +16489,7 @@ func (m *PluginServiceNowSettings) Reset() { *m = PluginServiceNowSettin func (m *PluginServiceNowSettings) String() string { return proto.CompactTextString(m) } func (*PluginServiceNowSettings) ProtoMessage() {} func (*PluginServiceNowSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16403,7 +16535,7 @@ func (m *PluginPagerDutySettings) Reset() { *m = PluginPagerDutySettings func (m *PluginPagerDutySettings) String() string { return proto.CompactTextString(m) } func (*PluginPagerDutySettings) ProtoMessage() {} func (*PluginPagerDutySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{274} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16449,7 +16581,7 @@ func (m *PluginJiraSettings) Reset() { *m = PluginJiraSettings{} } func (m *PluginJiraSettings) String() string { return proto.CompactTextString(m) } func (*PluginJiraSettings) ProtoMessage() {} func (*PluginJiraSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{275} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16489,7 +16621,7 @@ func (m *PluginOpenAISettings) Reset() { *m = PluginOpenAISettings{} } func (m *PluginOpenAISettings) String() string { return proto.CompactTextString(m) } func (*PluginOpenAISettings) ProtoMessage() {} func (*PluginOpenAISettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{276} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16540,7 +16672,7 @@ func (m *PluginMattermostSettings) Reset() { *m = PluginMattermostSettin func (m *PluginMattermostSettings) String() string { return proto.CompactTextString(m) } func (*PluginMattermostSettings) ProtoMessage() {} func (*PluginMattermostSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{277} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16582,7 +16714,7 @@ func (m *PluginJamfSettings) Reset() { *m = PluginJamfSettings{} } func (m *PluginJamfSettings) String() string { return proto.CompactTextString(m) } func (*PluginJamfSettings) ProtoMessage() {} func (*PluginJamfSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{278} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16634,7 +16766,7 @@ func (m *PluginOktaSettings) Reset() { *m = PluginOktaSettings{} } func (m *PluginOktaSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSettings) ProtoMessage() {} func (*PluginOktaSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{279} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16681,7 +16813,7 @@ func (m *PluginOktaCredentialsInfo) Reset() { *m = PluginOktaCredentials func (m *PluginOktaCredentialsInfo) String() string { return proto.CompactTextString(m) } func (*PluginOktaCredentialsInfo) ProtoMessage() {} func (*PluginOktaCredentialsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{280} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16765,7 +16897,7 @@ func (m *PluginOktaSyncSettings) Reset() { *m = PluginOktaSyncSettings{} func (m *PluginOktaSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSyncSettings) ProtoMessage() {} func (*PluginOktaSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{281} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16806,7 +16938,7 @@ func (m *DiscordChannels) Reset() { *m = DiscordChannels{} } func (m *DiscordChannels) String() string { return proto.CompactTextString(m) } func (*DiscordChannels) ProtoMessage() {} func (*DiscordChannels) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{282} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16850,7 +16982,7 @@ func (m *PluginDiscordSettings) Reset() { *m = PluginDiscordSettings{} } func (m *PluginDiscordSettings) String() string { return proto.CompactTextString(m) } func (*PluginDiscordSettings) ProtoMessage() {} func (*PluginDiscordSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{283} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16895,7 +17027,7 @@ func (m *PluginEntraIDSettings) Reset() { *m = PluginEntraIDSettings{} } func (m *PluginEntraIDSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSettings) ProtoMessage() {} func (*PluginEntraIDSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{284} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16949,7 +17081,7 @@ func (m *PluginEntraIDSyncSettings) Reset() { *m = PluginEntraIDSyncSett func (m *PluginEntraIDSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSyncSettings) ProtoMessage() {} func (*PluginEntraIDSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{285} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16994,7 +17126,7 @@ func (m *PluginEntraIDAccessGraphSettings) Reset() { *m = PluginEntraIDA func (m *PluginEntraIDAccessGraphSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAccessGraphSettings) ProtoMessage() {} func (*PluginEntraIDAccessGraphSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{286} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17040,7 +17172,7 @@ func (m *PluginEntraIDAppSSOSettings) Reset() { *m = PluginEntraIDAppSSO func (m *PluginEntraIDAppSSOSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAppSSOSettings) ProtoMessage() {} func (*PluginEntraIDAppSSOSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{287} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17086,7 +17218,7 @@ func (m *PluginSCIMSettings) Reset() { *m = PluginSCIMSettings{} } func (m *PluginSCIMSettings) String() string { return proto.CompactTextString(m) } func (*PluginSCIMSettings) ProtoMessage() {} func (*PluginSCIMSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{288} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17130,7 +17262,7 @@ func (m *PluginDatadogAccessSettings) Reset() { *m = PluginDatadogAccess func (m *PluginDatadogAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginDatadogAccessSettings) ProtoMessage() {} func (*PluginDatadogAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{289} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17185,7 +17317,7 @@ func (m *PluginAWSICSettings) Reset() { *m = PluginAWSICSettings{} } func (m *PluginAWSICSettings) String() string { return proto.CompactTextString(m) } func (*PluginAWSICSettings) ProtoMessage() {} func (*PluginAWSICSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{290} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17232,7 +17364,7 @@ func (m *AWSICProvisioningSpec) Reset() { *m = AWSICProvisioningSpec{} } func (m *AWSICProvisioningSpec) String() string { return proto.CompactTextString(m) } func (*AWSICProvisioningSpec) ProtoMessage() {} func (*AWSICProvisioningSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{291} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17274,7 +17406,7 @@ func (m *PluginAWSICStatusV1) Reset() { *m = PluginAWSICStatusV1{} } func (m *PluginAWSICStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginAWSICStatusV1) ProtoMessage() {} func (*PluginAWSICStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{292} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17319,7 +17451,7 @@ func (m *AWSICGroupImportStatus) Reset() { *m = AWSICGroupImportStatus{} func (m *AWSICGroupImportStatus) String() string { return proto.CompactTextString(m) } func (*AWSICGroupImportStatus) ProtoMessage() {} func (*AWSICGroupImportStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{293} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17370,7 +17502,7 @@ func (m *PluginEmailSettings) Reset() { *m = PluginEmailSettings{} } func (m *PluginEmailSettings) String() string { return proto.CompactTextString(m) } func (*PluginEmailSettings) ProtoMessage() {} func (*PluginEmailSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{294} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17458,7 +17590,7 @@ func (m *MailgunSpec) Reset() { *m = MailgunSpec{} } func (m *MailgunSpec) String() string { return proto.CompactTextString(m) } func (*MailgunSpec) ProtoMessage() {} func (*MailgunSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{295} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17505,7 +17637,7 @@ func (m *SMTPSpec) Reset() { *m = SMTPSpec{} } func (m *SMTPSpec) String() string { return proto.CompactTextString(m) } func (*SMTPSpec) ProtoMessage() {} func (*SMTPSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{296} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17555,7 +17687,7 @@ func (m *PluginMSTeamsSettings) Reset() { *m = PluginMSTeamsSettings{} } func (m *PluginMSTeamsSettings) String() string { return proto.CompactTextString(m) } func (*PluginMSTeamsSettings) ProtoMessage() {} func (*PluginMSTeamsSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{297} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17600,7 +17732,7 @@ func (m *PluginBootstrapCredentialsV1) Reset() { *m = PluginBootstrapCre func (m *PluginBootstrapCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginBootstrapCredentialsV1) ProtoMessage() {} func (*PluginBootstrapCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{298} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17700,7 +17832,7 @@ func (m *PluginIdSecretCredential) Reset() { *m = PluginIdSecretCredenti func (m *PluginIdSecretCredential) String() string { return proto.CompactTextString(m) } func (*PluginIdSecretCredential) ProtoMessage() {} func (*PluginIdSecretCredential) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{299} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17743,7 +17875,7 @@ func (m *PluginOAuth2AuthorizationCodeCredentials) Reset() { func (m *PluginOAuth2AuthorizationCodeCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AuthorizationCodeCredentials) ProtoMessage() {} func (*PluginOAuth2AuthorizationCodeCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{300} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17802,7 +17934,7 @@ func (m *PluginStatusV1) Reset() { *m = PluginStatusV1{} } func (m *PluginStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginStatusV1) ProtoMessage() {} func (*PluginStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{301} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17917,7 +18049,7 @@ func (m *PluginGitlabStatusV1) Reset() { *m = PluginGitlabStatusV1{} } func (m *PluginGitlabStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginGitlabStatusV1) ProtoMessage() {} func (*PluginGitlabStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{302} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17961,7 +18093,7 @@ func (m *PluginEntraIDStatusV1) Reset() { *m = PluginEntraIDStatusV1{} } func (m *PluginEntraIDStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDStatusV1) ProtoMessage() {} func (*PluginEntraIDStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{303} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18015,7 +18147,7 @@ func (m *PluginOktaStatusV1) Reset() { *m = PluginOktaStatusV1{} } func (m *PluginOktaStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusV1) ProtoMessage() {} func (*PluginOktaStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{304} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18063,7 +18195,7 @@ func (m *PluginOktaStatusDetailsSSO) Reset() { *m = PluginOktaStatusDeta func (m *PluginOktaStatusDetailsSSO) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSSO) ProtoMessage() {} func (*PluginOktaStatusDetailsSSO) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18120,7 +18252,7 @@ func (m *PluginOktaStatusDetailsAppGroupSync) Reset() { *m = PluginOktaS func (m *PluginOktaStatusDetailsAppGroupSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAppGroupSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAppGroupSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18174,7 +18306,7 @@ func (m *PluginOktaStatusDetailsUsersSync) Reset() { *m = PluginOktaStat func (m *PluginOktaStatusDetailsUsersSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsUsersSync) ProtoMessage() {} func (*PluginOktaStatusDetailsUsersSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18217,7 +18349,7 @@ func (m *PluginOktaStatusDetailsSCIM) Reset() { *m = PluginOktaStatusDet func (m *PluginOktaStatusDetailsSCIM) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSCIM) ProtoMessage() {} func (*PluginOktaStatusDetailsSCIM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18279,7 +18411,7 @@ func (m *PluginOktaStatusDetailsAccessListsSync) Reset() { func (m *PluginOktaStatusDetailsAccessListsSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAccessListsSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAccessListsSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{309} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18327,7 +18459,7 @@ func (m *PluginCredentialsV1) Reset() { *m = PluginCredentialsV1{} } func (m *PluginCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginCredentialsV1) ProtoMessage() {} func (*PluginCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{310} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18438,7 +18570,7 @@ func (m *PluginOAuth2AccessTokenCredentials) Reset() { *m = PluginOAuth2 func (m *PluginOAuth2AccessTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AccessTokenCredentials) ProtoMessage() {} func (*PluginOAuth2AccessTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18479,7 +18611,7 @@ func (m *PluginBearerTokenCredentials) Reset() { *m = PluginBearerTokenC func (m *PluginBearerTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginBearerTokenCredentials) ProtoMessage() {} func (*PluginBearerTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{312} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18521,7 +18653,7 @@ func (m *PluginStaticCredentialsRef) Reset() { *m = PluginStaticCredenti func (m *PluginStaticCredentialsRef) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsRef) ProtoMessage() {} func (*PluginStaticCredentialsRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18563,7 +18695,7 @@ func (m *PluginListV1) Reset() { *m = PluginListV1{} } func (m *PluginListV1) String() string { return proto.CompactTextString(m) } func (*PluginListV1) ProtoMessage() {} func (*PluginListV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18606,7 +18738,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18652,7 +18784,7 @@ func (m *PluginStaticCredentialsSpecV1) Reset() { *m = PluginStaticCrede func (m *PluginStaticCredentialsSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsSpecV1) ProtoMessage() {} func (*PluginStaticCredentialsSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18754,7 +18886,7 @@ func (m *PluginStaticCredentialsBasicAuth) Reset() { *m = PluginStaticCr func (m *PluginStaticCredentialsBasicAuth) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsBasicAuth) ProtoMessage() {} func (*PluginStaticCredentialsBasicAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18800,7 +18932,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Reset() { func (m *PluginStaticCredentialsOAuthClientSecret) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsOAuthClientSecret) ProtoMessage() {} func (*PluginStaticCredentialsOAuthClientSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18843,7 +18975,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18914,7 +19046,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderSpecV1) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderSpecV1) ProtoMessage() {} func (*SAMLIdPServiceProviderSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18961,7 +19093,7 @@ func (m *SAMLAttributeMapping) Reset() { *m = SAMLAttributeMapping{} } func (m *SAMLAttributeMapping) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeMapping) ProtoMessage() {} func (*SAMLAttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{321} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19003,7 +19135,7 @@ func (m *IdPOptions) Reset() { *m = IdPOptions{} } func (m *IdPOptions) String() string { return proto.CompactTextString(m) } func (*IdPOptions) ProtoMessage() {} func (*IdPOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{322} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19045,7 +19177,7 @@ func (m *IdPSAMLOptions) Reset() { *m = IdPSAMLOptions{} } func (m *IdPSAMLOptions) String() string { return proto.CompactTextString(m) } func (*IdPSAMLOptions) ProtoMessage() {} func (*IdPSAMLOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{323} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19095,7 +19227,7 @@ func (m *KubernetesResourceV1) Reset() { *m = KubernetesResourceV1{} } func (m *KubernetesResourceV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceV1) ProtoMessage() {} func (*KubernetesResourceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{324} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19137,7 +19269,7 @@ func (m *KubernetesResourceSpecV1) Reset() { *m = KubernetesResourceSpec func (m *KubernetesResourceSpecV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceSpecV1) ProtoMessage() {} func (*KubernetesResourceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19183,7 +19315,7 @@ func (m *ClusterMaintenanceConfigV1) Reset() { *m = ClusterMaintenanceCo func (m *ClusterMaintenanceConfigV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigV1) ProtoMessage() {} func (*ClusterMaintenanceConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19225,7 +19357,7 @@ func (m *ClusterMaintenanceConfigSpecV1) Reset() { *m = ClusterMaintenan func (m *ClusterMaintenanceConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigSpecV1) ProtoMessage() {} func (*ClusterMaintenanceConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{327} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19271,7 +19403,7 @@ func (m *AgentUpgradeWindow) Reset() { *m = AgentUpgradeWindow{} } func (m *AgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeWindow) ProtoMessage() {} func (*AgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{328} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19318,7 +19450,7 @@ func (m *ScheduledAgentUpgradeWindow) Reset() { *m = ScheduledAgentUpgra func (m *ScheduledAgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*ScheduledAgentUpgradeWindow) ProtoMessage() {} func (*ScheduledAgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{329} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19361,7 +19493,7 @@ func (m *AgentUpgradeSchedule) Reset() { *m = AgentUpgradeSchedule{} } func (m *AgentUpgradeSchedule) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeSchedule) ProtoMessage() {} func (*AgentUpgradeSchedule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{330} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19404,7 +19536,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{331} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19446,7 +19578,7 @@ func (m *UserGroupSpecV1) Reset() { *m = UserGroupSpecV1{} } func (m *UserGroupSpecV1) String() string { return proto.CompactTextString(m) } func (*UserGroupSpecV1) ProtoMessage() {} func (*UserGroupSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19490,7 +19622,7 @@ func (m *OktaImportRuleSpecV1) Reset() { *m = OktaImportRuleSpecV1{} } func (m *OktaImportRuleSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleSpecV1) ProtoMessage() {} func (*OktaImportRuleSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19534,7 +19666,7 @@ func (m *OktaImportRuleMappingV1) Reset() { *m = OktaImportRuleMappingV1 func (m *OktaImportRuleMappingV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMappingV1) ProtoMessage() {} func (*OktaImportRuleMappingV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{334} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19577,7 +19709,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19625,7 +19757,7 @@ func (m *OktaImportRuleMatchV1) Reset() { *m = OktaImportRuleMatchV1{} } func (m *OktaImportRuleMatchV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMatchV1) ProtoMessage() {} func (*OktaImportRuleMatchV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{336} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19668,7 +19800,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{337} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19722,7 +19854,7 @@ func (m *OktaAssignmentSpecV1) Reset() { *m = OktaAssignmentSpecV1{} } func (m *OktaAssignmentSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentSpecV1) ProtoMessage() {} func (*OktaAssignmentSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19766,7 +19898,7 @@ func (m *OktaAssignmentTargetV1) Reset() { *m = OktaAssignmentTargetV1{} func (m *OktaAssignmentTargetV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentTargetV1) ProtoMessage() {} func (*OktaAssignmentTargetV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19811,7 +19943,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{340} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19856,7 +19988,7 @@ func (m *IntegrationSpecV1) Reset() { *m = IntegrationSpecV1{} } func (m *IntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*IntegrationSpecV1) ProtoMessage() {} func (*IntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{341} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19963,7 +20095,7 @@ func (m *AWSOIDCIntegrationSpecV1) Reset() { *m = AWSOIDCIntegrationSpec func (m *AWSOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AWSOIDCIntegrationSpecV1) ProtoMessage() {} func (*AWSOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20009,7 +20141,7 @@ func (m *AzureOIDCIntegrationSpecV1) Reset() { *m = AzureOIDCIntegration func (m *AzureOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AzureOIDCIntegrationSpecV1) ProtoMessage() {} func (*AzureOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{343} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20070,7 +20202,7 @@ func (m *HeadlessAuthentication) Reset() { *m = HeadlessAuthentication{} func (m *HeadlessAuthentication) String() string { return proto.CompactTextString(m) } func (*HeadlessAuthentication) ProtoMessage() {} func (*HeadlessAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{344} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20127,7 +20259,7 @@ func (m *WatchKind) Reset() { *m = WatchKind{} } func (m *WatchKind) String() string { return proto.CompactTextString(m) } func (*WatchKind) ProtoMessage() {} func (*WatchKind) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{345} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20177,7 +20309,7 @@ func (m *WatchStatusV1) Reset() { *m = WatchStatusV1{} } func (m *WatchStatusV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusV1) ProtoMessage() {} func (*WatchStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{346} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20218,7 +20350,7 @@ func (m *WatchStatusSpecV1) Reset() { *m = WatchStatusSpecV1{} } func (m *WatchStatusSpecV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusSpecV1) ProtoMessage() {} func (*WatchStatusSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{347} + return fileDescriptor_9198ee693835762e, []int{350} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20268,7 +20400,7 @@ func (m *ServerInfoV1) Reset() { *m = ServerInfoV1{} } func (m *ServerInfoV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoV1) ProtoMessage() {} func (*ServerInfoV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{348} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20310,7 +20442,7 @@ func (m *ServerInfoSpecV1) Reset() { *m = ServerInfoSpecV1{} } func (m *ServerInfoSpecV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoSpecV1) ProtoMessage() {} func (*ServerInfoSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{349} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20367,7 +20499,7 @@ func (m *JamfSpecV1) Reset() { *m = JamfSpecV1{} } func (m *JamfSpecV1) String() string { return proto.CompactTextString(m) } func (*JamfSpecV1) ProtoMessage() {} func (*JamfSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{350} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20432,7 +20564,7 @@ func (m *JamfInventoryEntry) Reset() { *m = JamfInventoryEntry{} } func (m *JamfInventoryEntry) String() string { return proto.CompactTextString(m) } func (*JamfInventoryEntry) ProtoMessage() {} func (*JamfInventoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{351} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20489,7 +20621,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{352} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20553,7 +20685,7 @@ func (m *AWSMatcher) Reset() { *m = AWSMatcher{} } func (m *AWSMatcher) String() string { return proto.CompactTextString(m) } func (*AWSMatcher) ProtoMessage() {} func (*AWSMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{353} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20598,7 +20730,7 @@ func (m *AssumeRole) Reset() { *m = AssumeRole{} } func (m *AssumeRole) String() string { return proto.CompactTextString(m) } func (*AssumeRole) ProtoMessage() {} func (*AssumeRole) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{354} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20660,7 +20792,7 @@ func (m *InstallerParams) Reset() { *m = InstallerParams{} } func (m *InstallerParams) String() string { return proto.CompactTextString(m) } func (*InstallerParams) ProtoMessage() {} func (*InstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{355} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20703,7 +20835,7 @@ func (m *AWSSSM) Reset() { *m = AWSSSM{} } func (m *AWSSSM) String() string { return proto.CompactTextString(m) } func (*AWSSSM) ProtoMessage() {} func (*AWSSSM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{356} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20746,7 +20878,7 @@ func (m *AzureInstallerParams) Reset() { *m = AzureInstallerParams{} } func (m *AzureInstallerParams) String() string { return proto.CompactTextString(m) } func (*AzureInstallerParams) ProtoMessage() {} func (*AzureInstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{357} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20800,7 +20932,7 @@ func (m *AzureMatcher) Reset() { *m = AzureMatcher{} } func (m *AzureMatcher) String() string { return proto.CompactTextString(m) } func (*AzureMatcher) ProtoMessage() {} func (*AzureMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{358} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20855,7 +20987,7 @@ func (m *GCPMatcher) Reset() { *m = GCPMatcher{} } func (m *GCPMatcher) String() string { return proto.CompactTextString(m) } func (*GCPMatcher) ProtoMessage() {} func (*GCPMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{359} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20901,7 +21033,7 @@ func (m *KubernetesMatcher) Reset() { *m = KubernetesMatcher{} } func (m *KubernetesMatcher) String() string { return proto.CompactTextString(m) } func (*KubernetesMatcher) ProtoMessage() {} func (*KubernetesMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{360} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20943,7 +21075,7 @@ func (m *OktaOptions) Reset() { *m = OktaOptions{} } func (m *OktaOptions) String() string { return proto.CompactTextString(m) } func (*OktaOptions) ProtoMessage() {} func (*OktaOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{361} + return fileDescriptor_9198ee693835762e, []int{364} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20987,7 +21119,7 @@ func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} } func (m *AccessGraphSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphSync) ProtoMessage() {} func (*AccessGraphSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{362} + return fileDescriptor_9198ee693835762e, []int{365} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21033,7 +21165,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{363} + return fileDescriptor_9198ee693835762e, []int{366} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21239,6 +21371,9 @@ func init() { proto.RegisterType((*RoleFilter)(nil), "types.RoleFilter") proto.RegisterType((*RoleV6)(nil), "types.RoleV6") proto.RegisterType((*RoleSpecV6)(nil), "types.RoleSpecV6") + proto.RegisterType((*SSHLocalPortForwarding)(nil), "types.SSHLocalPortForwarding") + proto.RegisterType((*SSHRemotePortForwarding)(nil), "types.SSHRemotePortForwarding") + proto.RegisterType((*SSHPortForwarding)(nil), "types.SSHPortForwarding") proto.RegisterType((*RoleOptions)(nil), "types.RoleOptions") proto.RegisterType((*RecordSession)(nil), "types.RecordSession") proto.RegisterType((*CertExtension)(nil), "types.CertExtension") @@ -21496,314 +21631,314 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 29833 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x49, - 0x7a, 0x20, 0x36, 0xdd, 0x8d, 0x47, 0xe3, 0xc3, 0xab, 0x91, 0x00, 0x49, 0x10, 0x33, 0xc3, 0xe6, - 0xd4, 0xcc, 0x70, 0xc8, 0xd9, 0x19, 0x72, 0x09, 0xee, 0x70, 0x77, 0x76, 0x5e, 0xdb, 0xe8, 0x06, - 0x89, 0x26, 0x01, 0x10, 0x5b, 0x0d, 0x10, 0x3b, 0xda, 0x47, 0x6d, 0xa1, 0x3b, 0x01, 0xd4, 0xa0, - 0xbb, 0xab, 0xb7, 0xaa, 0x9a, 0x20, 0x76, 0x4f, 0x3e, 0x3d, 0x4f, 0x56, 0xc8, 0x7a, 0x9d, 0xa5, - 0xd3, 0x9e, 0x43, 0x27, 0x2b, 0x64, 0x9f, 0xad, 0x38, 0x87, 0x14, 0xb6, 0x64, 0xd9, 0x67, 0x2b, - 0x2c, 0x4b, 0x17, 0x0a, 0x59, 0x56, 0x38, 0x4e, 0x0a, 0x5b, 0x7e, 0xad, 0x2f, 0x20, 0xcb, 0xf2, - 0x0f, 0x07, 0x22, 0x1c, 0x21, 0xf9, 0x22, 0x1c, 0xe1, 0xbd, 0xd0, 0x9d, 0x23, 0xbf, 0xcc, 0xac, - 0xca, 0xac, 0xaa, 0x6e, 0x34, 0x66, 0x38, 0x3a, 0x71, 0x42, 0x7f, 0x48, 0xf4, 0x97, 0xdf, 0xf7, - 0x65, 0x56, 0x3e, 0xbf, 0xfc, 0xf2, 0x7b, 0xc0, 0x0b, 0x01, 0x6d, 0xd2, 0x8e, 0xeb, 0x05, 0x37, - 0x9a, 0x74, 0xcf, 0xae, 0x1f, 0xdd, 0x08, 0x8e, 0x3a, 0xd4, 0xe7, 0xff, 0x5e, 0xef, 0x78, 0x6e, - 0xe0, 0x92, 0x61, 0xfc, 0xb1, 0x30, 0xb7, 0xe7, 0xee, 0xb9, 0x08, 0xb9, 0xc1, 0xfe, 0xe2, 0x85, - 0x0b, 0x97, 0xf6, 0x5c, 0x77, 0xaf, 0x49, 0x6f, 0xe0, 0xaf, 0x9d, 0xee, 0xee, 0x8d, 0x46, 0xd7, - 0xb3, 0x03, 0xc7, 0x6d, 0x8b, 0xf2, 0x62, 0xbc, 0x3c, 0x70, 0x5a, 0xd4, 0x0f, 0xec, 0x56, 0xa7, - 0x17, 0x83, 0x43, 0xcf, 0xee, 0x74, 0xa8, 0x27, 0x6a, 0x5f, 0xb8, 0x16, 0x36, 0xd0, 0x0e, 0x02, - 0x46, 0xc9, 0x98, 0xdf, 0x78, 0x74, 0x53, 0xfd, 0x29, 0x50, 0x6f, 0xf7, 0xf8, 0x16, 0xaf, 0xeb, - 0x07, 0xb4, 0x61, 0x35, 0xe8, 0x23, 0xa7, 0x4e, 0x2d, 0x8f, 0x7e, 0xa3, 0xeb, 0x78, 0xb4, 0x45, - 0xdb, 0x81, 0xa0, 0x7b, 0x3d, 0x9d, 0x4e, 0x36, 0x24, 0xd6, 0x22, 0xe3, 0x17, 0x72, 0x30, 0x76, - 0x9f, 0xd2, 0x4e, 0xa9, 0xe9, 0x3c, 0xa2, 0xe4, 0x45, 0x18, 0x5a, 0xb7, 0x5b, 0x74, 0x3e, 0x73, - 0x39, 0x73, 0x75, 0x6c, 0x69, 0xfa, 0xe4, 0xb8, 0x38, 0xee, 0x53, 0xef, 0x11, 0xf5, 0xac, 0xb6, - 0xdd, 0xa2, 0x26, 0x16, 0x92, 0x4f, 0xc1, 0x18, 0xfb, 0xdf, 0xef, 0xd8, 0x75, 0x3a, 0x9f, 0x45, - 0xcc, 0xc9, 0x93, 0xe3, 0xe2, 0x58, 0x5b, 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x74, 0xf9, 0x71, - 0xc7, 0xf1, 0xa8, 0x3f, 0x3f, 0x74, 0x39, 0x73, 0x75, 0x7c, 0x71, 0xe1, 0x3a, 0xef, 0xa3, 0xeb, - 0xb2, 0x8f, 0xae, 0x6f, 0xca, 0x4e, 0x5c, 0x9a, 0xfd, 0xfd, 0xe3, 0xe2, 0x33, 0x27, 0xc7, 0xc5, - 0x51, 0xca, 0x49, 0x7e, 0xea, 0x4f, 0x8a, 0x19, 0x53, 0xd2, 0x93, 0xb7, 0x61, 0x68, 0xf3, 0xa8, - 0x43, 0xe7, 0xc7, 0x2e, 0x67, 0xae, 0x4e, 0x2d, 0x5e, 0xba, 0xce, 0x87, 0x35, 0x6c, 0x7c, 0xf4, - 0x17, 0xc3, 0x5a, 0xca, 0x9f, 0x1c, 0x17, 0x87, 0x18, 0x8a, 0x89, 0x54, 0xe4, 0x75, 0x18, 0x59, - 0x71, 0xfd, 0xa0, 0x5a, 0x99, 0x07, 0x6c, 0xf2, 0xb9, 0x93, 0xe3, 0xe2, 0xcc, 0xbe, 0xeb, 0x07, - 0x96, 0xd3, 0x78, 0xcd, 0x6d, 0x39, 0x01, 0x6d, 0x75, 0x82, 0x23, 0x53, 0x20, 0x19, 0x8f, 0x61, - 0x52, 0xe3, 0x47, 0xc6, 0x61, 0x74, 0x6b, 0xfd, 0xfe, 0xfa, 0x83, 0xed, 0xf5, 0xc2, 0x33, 0x24, - 0x0f, 0x43, 0xeb, 0x0f, 0x2a, 0xcb, 0x85, 0x0c, 0x19, 0x85, 0x5c, 0x69, 0x63, 0xa3, 0x90, 0x25, - 0x13, 0x90, 0xaf, 0x94, 0x36, 0x4b, 0x4b, 0xa5, 0xda, 0x72, 0x21, 0x47, 0x66, 0x61, 0x7a, 0xbb, - 0xba, 0x5e, 0x79, 0xb0, 0x5d, 0xb3, 0x2a, 0xcb, 0xb5, 0xfb, 0x9b, 0x0f, 0x36, 0x0a, 0x43, 0x64, - 0x0a, 0xe0, 0xfe, 0xd6, 0xd2, 0xb2, 0xb9, 0xbe, 0xbc, 0xb9, 0x5c, 0x2b, 0x0c, 0x93, 0x39, 0x28, - 0x48, 0x12, 0xab, 0xb6, 0x6c, 0x3e, 0xac, 0x96, 0x97, 0x0b, 0x23, 0xf7, 0x86, 0xf2, 0xb9, 0xc2, - 0x90, 0x39, 0xba, 0x4a, 0x6d, 0x9f, 0x56, 0x2b, 0xc6, 0xbf, 0x97, 0x83, 0xfc, 0x1a, 0x0d, 0xec, - 0x86, 0x1d, 0xd8, 0xe4, 0x39, 0x6d, 0x7c, 0xf0, 0x13, 0x95, 0x81, 0x79, 0x31, 0x39, 0x30, 0xc3, - 0x27, 0xc7, 0xc5, 0xcc, 0xeb, 0xea, 0x80, 0xbc, 0x05, 0xe3, 0x15, 0xea, 0xd7, 0x3d, 0xa7, 0xc3, - 0x26, 0xdb, 0x7c, 0x0e, 0xd1, 0x2e, 0x9e, 0x1c, 0x17, 0xcf, 0x35, 0x22, 0xb0, 0xd2, 0x21, 0x2a, - 0x36, 0xa9, 0xc2, 0xc8, 0xaa, 0xbd, 0x43, 0x9b, 0xfe, 0xfc, 0xf0, 0xe5, 0xdc, 0xd5, 0xf1, 0xc5, - 0x67, 0xc5, 0x20, 0xc8, 0x06, 0x5e, 0xe7, 0xa5, 0xcb, 0xed, 0xc0, 0x3b, 0x5a, 0x9a, 0x3b, 0x39, - 0x2e, 0x16, 0x9a, 0x08, 0x50, 0x3b, 0x98, 0xa3, 0x90, 0x5a, 0x34, 0x31, 0x46, 0x4e, 0x9d, 0x18, - 0xcf, 0xff, 0xfe, 0x71, 0x31, 0xc3, 0x06, 0x4c, 0x4c, 0x8c, 0x88, 0x9f, 0x3e, 0x45, 0x16, 0x21, - 0x6f, 0xd2, 0x47, 0x8e, 0xcf, 0xbe, 0x2c, 0x8f, 0x5f, 0x76, 0xfe, 0xe4, 0xb8, 0x48, 0x3c, 0x01, - 0x53, 0x9a, 0x11, 0xe2, 0x2d, 0xbc, 0x09, 0xe3, 0x4a, 0xab, 0x49, 0x01, 0x72, 0x07, 0xf4, 0x88, - 0xf7, 0xb0, 0xc9, 0xfe, 0x24, 0x73, 0x30, 0xfc, 0xc8, 0x6e, 0x76, 0x45, 0x97, 0x9a, 0xfc, 0xc7, - 0xe7, 0xb3, 0x9f, 0xcb, 0xdc, 0x1b, 0xca, 0x8f, 0x16, 0xf2, 0x66, 0xb6, 0x5a, 0x31, 0xfe, 0xee, - 0x10, 0xe4, 0x4d, 0x97, 0x2f, 0x60, 0x72, 0x0d, 0x86, 0x6b, 0x81, 0x1d, 0xc8, 0x61, 0x9a, 0x3d, - 0x39, 0x2e, 0x4e, 0xb3, 0xc5, 0x4d, 0x95, 0xfa, 0x39, 0x06, 0x43, 0xdd, 0xd8, 0xb7, 0x7d, 0x39, - 0x5c, 0x88, 0xda, 0x61, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x15, 0x18, 0x5a, 0x73, 0x1b, 0x54, 0x8c, - 0x18, 0x39, 0x39, 0x2e, 0x4e, 0xb5, 0xdc, 0x86, 0x8a, 0x88, 0xe5, 0xe4, 0x35, 0x18, 0x2b, 0x77, - 0x3d, 0x8f, 0xb6, 0xd9, 0x5c, 0x1f, 0x42, 0xe4, 0xa9, 0x93, 0xe3, 0x22, 0xd4, 0x39, 0xd0, 0x72, - 0x1a, 0x66, 0x84, 0xc0, 0x86, 0xa1, 0x16, 0xd8, 0x5e, 0x40, 0x1b, 0xf3, 0xc3, 0x03, 0x0d, 0x03, - 0x5b, 0x9f, 0x33, 0x3e, 0x27, 0x89, 0x0f, 0x83, 0xe0, 0x44, 0x56, 0x60, 0xfc, 0xae, 0x67, 0xd7, - 0xe9, 0x06, 0xf5, 0x1c, 0xb7, 0x81, 0xe3, 0x9b, 0x5b, 0xba, 0x72, 0x72, 0x5c, 0x3c, 0xbf, 0xc7, - 0xc0, 0x56, 0x07, 0xe1, 0x11, 0xf5, 0x77, 0x8f, 0x8b, 0xf9, 0x8a, 0xd8, 0x6a, 0x4d, 0x95, 0x94, - 0x7c, 0x9d, 0x0d, 0x8e, 0x1f, 0x60, 0xd7, 0xd2, 0xc6, 0xfc, 0xe8, 0xa9, 0x4d, 0x34, 0x44, 0x13, - 0xcf, 0x37, 0x6d, 0x3f, 0xb0, 0x3c, 0x4e, 0x17, 0x6b, 0xa7, 0xca, 0x92, 0x3c, 0x80, 0x7c, 0xad, - 0xbe, 0x4f, 0x1b, 0xdd, 0x26, 0xc5, 0x29, 0x33, 0xbe, 0x78, 0x41, 0x4c, 0x6a, 0x39, 0x9e, 0xb2, - 0x78, 0x69, 0x41, 0xf0, 0x26, 0xbe, 0x80, 0xa8, 0xf3, 0x49, 0x62, 0x7d, 0x3e, 0xff, 0xed, 0x5f, - 0x2c, 0x3e, 0xf3, 0x7d, 0xff, 0xec, 0xf2, 0x33, 0xc6, 0x7f, 0x9e, 0x85, 0x42, 0x9c, 0x09, 0xd9, - 0x85, 0xc9, 0xad, 0x4e, 0xc3, 0x0e, 0x68, 0xb9, 0xe9, 0xd0, 0x76, 0xe0, 0xe3, 0x24, 0xe9, 0xff, - 0x4d, 0x2f, 0x89, 0x7a, 0xe7, 0xbb, 0x48, 0x68, 0xd5, 0x39, 0x65, 0xec, 0xab, 0x74, 0xb6, 0x51, - 0x3d, 0x35, 0xdc, 0xc0, 0x7d, 0x9c, 0x61, 0x67, 0xab, 0x87, 0x6f, 0xfd, 0x3d, 0xea, 0x11, 0x6c, - 0xc5, 0x04, 0x6a, 0x37, 0x76, 0x8e, 0x70, 0x66, 0x0e, 0x3e, 0x81, 0x18, 0x49, 0xca, 0x04, 0x62, - 0x60, 0xe3, 0xff, 0xcc, 0xc0, 0x94, 0x49, 0x7d, 0xb7, 0xeb, 0xd5, 0xe9, 0x0a, 0xb5, 0x1b, 0xd4, - 0x63, 0xd3, 0xff, 0xbe, 0xd3, 0x6e, 0x88, 0x35, 0x85, 0xd3, 0xff, 0xc0, 0x69, 0xab, 0x5b, 0x37, - 0x96, 0x93, 0x4f, 0xc3, 0x68, 0xad, 0xbb, 0x83, 0xa8, 0xd9, 0x68, 0x07, 0xf0, 0xbb, 0x3b, 0x56, - 0x0c, 0x5d, 0xa2, 0x91, 0x1b, 0x30, 0xfa, 0x90, 0x7a, 0x7e, 0xb4, 0x1b, 0xe2, 0xd1, 0xf0, 0x88, - 0x83, 0x54, 0x02, 0x81, 0x45, 0xee, 0x46, 0x3b, 0xb2, 0x38, 0xd4, 0xa6, 0x63, 0xfb, 0x60, 0x34, - 0x55, 0x5a, 0x02, 0xa2, 0x4e, 0x15, 0x89, 0x65, 0xfc, 0x74, 0x16, 0x0a, 0x15, 0x3b, 0xb0, 0x77, - 0x6c, 0x5f, 0xf4, 0xe7, 0xc3, 0x5b, 0x6c, 0x8f, 0x57, 0x3e, 0x14, 0xf7, 0x78, 0xd6, 0xf2, 0x0f, - 0xfd, 0x79, 0x2f, 0xc7, 0x3f, 0x6f, 0x9c, 0x9d, 0xb0, 0xe2, 0xf3, 0xa2, 0x8f, 0x7a, 0xe7, 0xf4, - 0x8f, 0x2a, 0x88, 0x8f, 0xca, 0xcb, 0x8f, 0x8a, 0x3e, 0x85, 0xbc, 0x03, 0x43, 0xb5, 0x0e, 0xad, - 0x8b, 0x4d, 0x44, 0x9e, 0x0b, 0xfa, 0xc7, 0x31, 0x84, 0x87, 0xb7, 0x96, 0x26, 0x04, 0x9b, 0x21, - 0xbf, 0x43, 0xeb, 0x26, 0x92, 0x29, 0x8b, 0xe6, 0x1f, 0xe7, 0x60, 0x2e, 0x8d, 0x4c, 0xfd, 0x8e, - 0x91, 0x3e, 0xdf, 0x71, 0x15, 0xf2, 0xec, 0x08, 0x67, 0xc7, 0x22, 0x6e, 0x17, 0x63, 0x4b, 0x13, - 0xac, 0xc9, 0xfb, 0x02, 0x66, 0x86, 0xa5, 0xe4, 0xc5, 0x50, 0x22, 0xc8, 0x47, 0xfc, 0x84, 0x44, - 0x20, 0xe5, 0x00, 0x36, 0xd6, 0x72, 0x09, 0xa3, 0xe0, 0x10, 0x75, 0x8b, 0x04, 0x47, 0x63, 0xed, - 0x09, 0x88, 0x76, 0xcc, 0xc8, 0x43, 0x61, 0x19, 0xf2, 0xf2, 0xb3, 0xe6, 0x27, 0x90, 0xd1, 0x4c, - 0xac, 0x93, 0x1e, 0xde, 0xe2, 0x83, 0xd9, 0x10, 0xbf, 0x55, 0x36, 0x12, 0x87, 0xdc, 0x82, 0xfc, - 0x86, 0xe7, 0x3e, 0x3e, 0xaa, 0x56, 0xfc, 0xf9, 0xc9, 0xcb, 0xb9, 0xab, 0x63, 0x4b, 0x17, 0x4e, - 0x8e, 0x8b, 0xb3, 0x1d, 0x06, 0xb3, 0x9c, 0x86, 0x7a, 0xd2, 0x86, 0x88, 0xf7, 0x86, 0xf2, 0x99, - 0x42, 0xf6, 0xde, 0x50, 0x3e, 0x5b, 0xc8, 0x71, 0xf1, 0xe2, 0xde, 0x50, 0x7e, 0xa8, 0x30, 0x7c, - 0x6f, 0x28, 0x3f, 0x8c, 0x02, 0xc7, 0x58, 0x01, 0xee, 0x0d, 0xe5, 0xc7, 0x0b, 0x13, 0xda, 0x69, - 0x8f, 0x0c, 0x02, 0xb7, 0xee, 0x36, 0xcd, 0xdc, 0x96, 0x59, 0x35, 0x47, 0xca, 0xa5, 0x32, 0xf5, - 0x02, 0x33, 0x57, 0xda, 0xae, 0x99, 0x93, 0x95, 0xa3, 0xb6, 0xdd, 0x72, 0xea, 0xfc, 0xe8, 0x34, - 0x73, 0x77, 0xcb, 0x1b, 0x46, 0x09, 0xa6, 0xa2, 0x6f, 0x59, 0x75, 0xfc, 0x80, 0xdc, 0x80, 0x31, - 0x09, 0x61, 0x1b, 0x5d, 0x2e, 0xf5, 0xab, 0xcd, 0x08, 0xc7, 0xf8, 0xbd, 0x2c, 0x40, 0x54, 0xf2, - 0x94, 0xae, 0x85, 0xcf, 0x6a, 0x6b, 0xe1, 0x5c, 0x7c, 0x2d, 0xf4, 0x5c, 0x05, 0xe4, 0x3d, 0x18, - 0x61, 0x62, 0x41, 0x57, 0x8a, 0x44, 0x17, 0xe2, 0xa4, 0x58, 0xf8, 0xf0, 0xd6, 0xd2, 0x94, 0x20, - 0x1e, 0xf1, 0x11, 0x62, 0x0a, 0x32, 0x65, 0x19, 0xfd, 0xc2, 0x68, 0x34, 0x18, 0x62, 0x01, 0x5d, - 0x85, 0x70, 0x40, 0x45, 0x87, 0xe2, 0xca, 0xe8, 0xc8, 0x41, 0x0e, 0x4b, 0xc9, 0x45, 0x60, 0x03, - 0x2e, 0x3a, 0x75, 0xf4, 0xe4, 0xb8, 0x98, 0xeb, 0x7a, 0x0e, 0x4e, 0x02, 0x72, 0x03, 0xc4, 0x34, - 0x10, 0x1d, 0xc8, 0x66, 0xdf, 0x4c, 0xdd, 0xb6, 0xea, 0xd4, 0x0b, 0xa2, 0x1e, 0x9f, 0xcf, 0xc8, - 0xd9, 0x42, 0x3a, 0xa0, 0x4f, 0x95, 0xf9, 0x21, 0x9c, 0x06, 0x57, 0x53, 0x7b, 0xe5, 0xba, 0x86, - 0xca, 0xc5, 0xc8, 0xcb, 0xf2, 0x54, 0x6a, 0xf0, 0x32, 0x2b, 0x21, 0x52, 0xea, 0x15, 0x90, 0x5b, - 0xc0, 0x66, 0xa8, 0xe8, 0x7d, 0x10, 0xf5, 0x94, 0xb6, 0x6b, 0x4b, 0xe7, 0x04, 0xa7, 0x49, 0xfb, - 0x50, 0x25, 0x67, 0xd8, 0xe4, 0x2d, 0x60, 0x53, 0x58, 0xf4, 0x3b, 0x11, 0x44, 0x77, 0xcb, 0x1b, - 0xe5, 0xa6, 0xdb, 0x6d, 0xd4, 0xbe, 0xb8, 0x1a, 0x11, 0xef, 0xd5, 0x3b, 0x2a, 0xf1, 0xdd, 0xf2, - 0x06, 0x79, 0x0b, 0x86, 0x4b, 0xdf, 0xec, 0x7a, 0x54, 0xc8, 0x27, 0x13, 0xb2, 0x4e, 0x06, 0x5b, - 0xba, 0x20, 0x08, 0xa7, 0x6d, 0xf6, 0x53, 0x95, 0xeb, 0xb0, 0x9c, 0xd5, 0xbc, 0xb9, 0x5a, 0x13, - 0xb2, 0x07, 0x89, 0x75, 0xcb, 0xe6, 0xaa, 0xd2, 0xec, 0x40, 0xfb, 0x6a, 0x46, 0x45, 0x6e, 0x40, - 0xb6, 0x54, 0xc1, 0x1b, 0xd1, 0xf8, 0xe2, 0x98, 0xac, 0xb6, 0xb2, 0x34, 0x27, 0x48, 0x26, 0x6c, - 0x75, 0x19, 0x64, 0x4b, 0x15, 0xb2, 0x04, 0xc3, 0x6b, 0x47, 0xb5, 0x2f, 0xae, 0x8a, 0xcd, 0x6c, - 0x56, 0xce, 0x6b, 0x06, 0x7b, 0x80, 0xcb, 0xde, 0x8f, 0x5a, 0xdc, 0x3a, 0xf2, 0xbf, 0xd1, 0x54, - 0x5b, 0x8c, 0x68, 0x64, 0x03, 0xc6, 0x4a, 0x8d, 0x96, 0xd3, 0xde, 0xf2, 0xa9, 0x37, 0x3f, 0x8e, - 0x7c, 0xe6, 0x63, 0xed, 0x0e, 0xcb, 0x97, 0xe6, 0x4f, 0x8e, 0x8b, 0x73, 0x36, 0xfb, 0x69, 0x75, - 0x7d, 0xea, 0x29, 0xdc, 0x22, 0x26, 0x64, 0x03, 0x60, 0xcd, 0x6d, 0xef, 0xb9, 0xa5, 0xa0, 0x69, - 0xfb, 0xb1, 0xed, 0x31, 0x2a, 0x08, 0xc5, 0x87, 0x73, 0x2d, 0x06, 0xb3, 0x6c, 0x06, 0x54, 0x18, - 0x2a, 0x3c, 0xc8, 0x1d, 0x18, 0x79, 0xe0, 0xd9, 0xf5, 0x26, 0x9d, 0x9f, 0x44, 0x6e, 0x73, 0x82, - 0x1b, 0x07, 0xca, 0x2f, 0x9d, 0x17, 0x0c, 0x0b, 0x2e, 0x82, 0xd5, 0x6b, 0x0a, 0x47, 0x5c, 0xd8, - 0x06, 0x92, 0x9c, 0x93, 0x29, 0x97, 0x84, 0x4f, 0xa9, 0x97, 0x84, 0x68, 0xd1, 0x97, 0xdd, 0x56, - 0xcb, 0x6e, 0x37, 0x90, 0xf6, 0xe1, 0xa2, 0x72, 0x77, 0x30, 0xbe, 0x01, 0x33, 0x89, 0xce, 0x3a, - 0xe5, 0x7e, 0xf7, 0x2e, 0x4c, 0x57, 0xe8, 0xae, 0xdd, 0x6d, 0x06, 0xe1, 0x49, 0xc2, 0x97, 0x28, - 0xde, 0xb4, 0x1a, 0xbc, 0xc8, 0x92, 0xc7, 0x87, 0x19, 0x47, 0x36, 0xde, 0x81, 0x49, 0xed, 0xf3, - 0xd9, 0x55, 0xa1, 0xd4, 0x6d, 0x38, 0x01, 0x0e, 0x64, 0x26, 0xba, 0x2a, 0xd8, 0x0c, 0x88, 0xc3, - 0x65, 0x46, 0x08, 0xc6, 0xbf, 0xaf, 0x4a, 0x2b, 0x62, 0x27, 0x62, 0xd7, 0x6a, 0xb1, 0x1f, 0x64, - 0x22, 0xd9, 0x29, 0xb1, 0x1f, 0x84, 0xbb, 0xc1, 0x35, 0xbe, 0x36, 0xb3, 0x89, 0xb5, 0x39, 0x2e, - 0x46, 0x22, 0x67, 0x1f, 0xfa, 0x7c, 0x45, 0x86, 0x33, 0x35, 0xf7, 0xe1, 0x67, 0xea, 0x7b, 0x30, - 0xb1, 0x66, 0xb7, 0xed, 0x3d, 0xda, 0x60, 0x5f, 0xc0, 0xf7, 0x9e, 0xb1, 0xa5, 0x67, 0x4f, 0x8e, - 0x8b, 0x17, 0x5a, 0x1c, 0x8e, 0x5f, 0xa9, 0x4e, 0x22, 0x8d, 0x80, 0xdc, 0x94, 0x2b, 0x7b, 0x38, - 0x65, 0x65, 0x4f, 0x8a, 0xda, 0x87, 0x71, 0x65, 0x8b, 0xf5, 0x6c, 0xfc, 0xf6, 0x18, 0x7e, 0x23, - 0x79, 0x0d, 0x46, 0x4c, 0xba, 0xc7, 0x8e, 0x9a, 0x4c, 0x34, 0x48, 0x1e, 0x42, 0xd4, 0x8e, 0xe1, - 0x38, 0x28, 0x67, 0xd0, 0x86, 0xbf, 0xef, 0xec, 0x06, 0xa2, 0x77, 0x42, 0x39, 0x43, 0x80, 0x15, - 0x39, 0x43, 0x40, 0xf4, 0xeb, 0x2c, 0x87, 0xb1, 0xdd, 0xcf, 0xac, 0xd4, 0x44, 0xa7, 0xc9, 0x1e, - 0x36, 0x2b, 0xca, 0x36, 0xe2, 0x69, 0x52, 0x02, 0xc3, 0x26, 0xb7, 0x61, 0xac, 0x54, 0xaf, 0xbb, - 0x5d, 0xe5, 0xce, 0xc8, 0xd7, 0x2d, 0x07, 0xea, 0x2a, 0x92, 0x08, 0x95, 0xd4, 0x60, 0x7c, 0x99, - 0x5d, 0xb4, 0x9c, 0xb2, 0x5d, 0xdf, 0x97, 0x9d, 0x24, 0xf7, 0x30, 0xa5, 0x24, 0x5a, 0xb9, 0x14, - 0x81, 0x75, 0x06, 0x54, 0x95, 0x0c, 0x0a, 0x2e, 0xd9, 0x84, 0xf1, 0x1a, 0xad, 0x7b, 0x34, 0xa8, - 0x05, 0xae, 0x47, 0x63, 0x5b, 0xb2, 0x52, 0xb2, 0x74, 0x49, 0xde, 0xf5, 0x7c, 0x04, 0x5a, 0x3e, - 0x83, 0xaa, 0x5c, 0x15, 0x64, 0x2e, 0xb4, 0xb7, 0x5c, 0xef, 0xa8, 0xb2, 0x24, 0xb6, 0xe9, 0xe8, - 0x4c, 0xe7, 0x60, 0x55, 0x68, 0x67, 0x90, 0xc6, 0x8e, 0x2e, 0xb4, 0x73, 0x2c, 0x1c, 0xa9, 0x4a, - 0x0d, 0x65, 0x2b, 0xb1, 0x69, 0x4f, 0x47, 0xbd, 0x8c, 0x60, 0x65, 0xa4, 0x1a, 0x3e, 0x4a, 0x66, - 0xda, 0x48, 0x09, 0x2c, 0xd2, 0x01, 0x22, 0x47, 0x8d, 0x0b, 0xba, 0x4d, 0xea, 0xfb, 0x62, 0x2f, - 0xbf, 0x18, 0x1b, 0xfc, 0x08, 0x61, 0xe9, 0x65, 0xc1, 0xfc, 0x79, 0x39, 0x0d, 0xc4, 0x3d, 0x8d, - 0x15, 0x2a, 0xf5, 0xa4, 0xf0, 0x26, 0x6f, 0x02, 0x2c, 0x3f, 0x0e, 0xa8, 0xd7, 0xb6, 0x9b, 0xa1, - 0x1e, 0x0c, 0x55, 0x3f, 0x54, 0x40, 0xf5, 0x81, 0x56, 0x90, 0x49, 0x19, 0x26, 0x4b, 0xbe, 0xdf, - 0x6d, 0x51, 0xd3, 0x6d, 0xd2, 0x92, 0xb9, 0x8e, 0xfb, 0xfe, 0xd8, 0xd2, 0xf3, 0x27, 0xc7, 0xc5, - 0x8b, 0x36, 0x16, 0x58, 0x9e, 0xdb, 0xa4, 0x96, 0xed, 0xa9, 0xb3, 0x5b, 0xa7, 0x21, 0x0f, 0x00, - 0x1e, 0x74, 0x68, 0xbb, 0x46, 0x6d, 0xaf, 0xbe, 0x1f, 0xdb, 0xe6, 0xa3, 0x82, 0xa5, 0xe7, 0xc4, - 0x17, 0xce, 0xb9, 0x1d, 0xda, 0xf6, 0x11, 0xa6, 0xb6, 0x2a, 0xc2, 0x24, 0xdb, 0x30, 0x5d, 0x2d, - 0xad, 0x6d, 0xb8, 0x4d, 0xa7, 0x7e, 0x24, 0x24, 0xa7, 0x29, 0xd4, 0x0e, 0x9e, 0x17, 0x5c, 0x63, - 0xa5, 0x7c, 0x7b, 0x72, 0xec, 0x96, 0xd5, 0x41, 0xa8, 0x25, 0xe4, 0xa7, 0x38, 0x17, 0xf2, 0x3e, - 0x9b, 0x83, 0x3e, 0x13, 0x06, 0x37, 0xed, 0x3d, 0x7f, 0x7e, 0x5a, 0xd3, 0x76, 0x95, 0xb6, 0x6b, - 0xd7, 0x95, 0x52, 0x2e, 0xa6, 0x2c, 0xf0, 0x89, 0x88, 0x50, 0x2b, 0xb0, 0xf7, 0x7c, 0x7d, 0x22, - 0x86, 0xd8, 0xe4, 0x1e, 0x40, 0xc5, 0xad, 0x77, 0x5b, 0xb4, 0x1d, 0x54, 0x96, 0xe6, 0x0b, 0xfa, - 0x55, 0x20, 0x2c, 0x88, 0xb6, 0xb6, 0x86, 0x5b, 0xd7, 0x66, 0xa2, 0x42, 0xbd, 0xf0, 0x2e, 0x14, - 0xe2, 0x0d, 0x39, 0xa3, 0x02, 0x6b, 0xb2, 0x30, 0xa5, 0x7c, 0xfd, 0xf2, 0x63, 0xc7, 0x0f, 0x7c, - 0xe3, 0x5b, 0xda, 0x0a, 0x64, 0xbb, 0xc3, 0x7d, 0x7a, 0xb4, 0xe1, 0xd1, 0x5d, 0xe7, 0xb1, 0xd8, - 0xcc, 0x70, 0x77, 0x38, 0xa0, 0x47, 0x56, 0x07, 0xa1, 0xea, 0xee, 0x10, 0xa2, 0x92, 0xcf, 0x40, - 0xfe, 0xfe, 0x5a, 0xed, 0x3e, 0x3d, 0xaa, 0x56, 0xc4, 0x41, 0xc5, 0xc9, 0x5a, 0xbe, 0xc5, 0x48, - 0xb5, 0xb9, 0x16, 0x62, 0x1a, 0x4b, 0xd1, 0x4e, 0xc8, 0x6a, 0x2e, 0x37, 0xbb, 0x7e, 0x40, 0xbd, - 0x6a, 0x45, 0xad, 0xb9, 0xce, 0x81, 0xb1, 0x7d, 0x29, 0x44, 0x35, 0xfe, 0x55, 0x16, 0x77, 0x41, - 0x36, 0xe1, 0xab, 0x6d, 0x3f, 0xb0, 0xdb, 0x75, 0x1a, 0x32, 0xc0, 0x09, 0xef, 0x08, 0x68, 0x6c, - 0xc2, 0x47, 0xc8, 0x7a, 0xd5, 0xd9, 0x81, 0xab, 0x66, 0x55, 0x4a, 0xcd, 0x45, 0xb5, 0xa2, 0xaa, - 0x57, 0x3d, 0x01, 0x8d, 0x55, 0x19, 0x21, 0x93, 0x2b, 0x30, 0x5a, 0x2d, 0xad, 0x95, 0xba, 0xc1, - 0x3e, 0xee, 0xc1, 0x79, 0x2e, 0x9f, 0xb3, 0xd9, 0x6a, 0x77, 0x83, 0x7d, 0x53, 0x16, 0x92, 0x1b, - 0x78, 0xef, 0x69, 0xd3, 0x80, 0xab, 0x61, 0xc5, 0xa1, 0xeb, 0x73, 0x50, 0xec, 0xda, 0xc3, 0x40, - 0xe4, 0x55, 0x18, 0x7e, 0xb8, 0x51, 0xae, 0x56, 0xc4, 0xc5, 0x19, 0x4f, 0xa2, 0x47, 0x9d, 0xba, - 0xde, 0x12, 0x8e, 0x42, 0x96, 0x61, 0xaa, 0x46, 0xeb, 0x5d, 0xcf, 0x09, 0x8e, 0xee, 0x7a, 0x6e, - 0xb7, 0xe3, 0xcf, 0x8f, 0x62, 0x1d, 0xb8, 0xd2, 0x7d, 0x51, 0x62, 0xed, 0x61, 0x91, 0x42, 0x1d, - 0x23, 0x32, 0x7e, 0x27, 0x13, 0x6d, 0x93, 0xe4, 0x8a, 0x26, 0xd6, 0xa0, 0xee, 0x86, 0x89, 0x35, - 0xaa, 0xee, 0x06, 0x05, 0x1c, 0x13, 0x48, 0xb9, 0xeb, 0x07, 0x6e, 0x6b, 0xb9, 0xdd, 0xe8, 0xb8, - 0x4e, 0x3b, 0x40, 0x2a, 0xde, 0xf9, 0xc6, 0xc9, 0x71, 0xf1, 0x52, 0x1d, 0x4b, 0x2d, 0x2a, 0x8a, - 0xad, 0x18, 0x97, 0x14, 0xea, 0x8f, 0x30, 0x1e, 0xc6, 0x1f, 0x64, 0xb5, 0xe3, 0x8d, 0x35, 0xcf, - 0xa4, 0x9d, 0xa6, 0x53, 0xc7, 0x1b, 0x3d, 0x7e, 0x68, 0x38, 0xab, 0xb0, 0x79, 0x5e, 0x54, 0xca, - 0x7b, 0x48, 0xe7, 0x9d, 0x42, 0x4d, 0xbe, 0x00, 0x13, 0x4c, 0xd2, 0x10, 0x3f, 0xfd, 0xf9, 0x2c, - 0x76, 0xf6, 0x73, 0xa8, 0x85, 0xf3, 0xa9, 0x17, 0xb2, 0xd1, 0x44, 0x14, 0x95, 0x82, 0x34, 0x60, - 0x7e, 0xd3, 0xb3, 0xdb, 0xbe, 0x13, 0x2c, 0xb7, 0xeb, 0xde, 0x11, 0x4a, 0x46, 0xcb, 0x6d, 0x7b, - 0xa7, 0x49, 0x1b, 0xf8, 0xb9, 0xf9, 0xa5, 0xab, 0x27, 0xc7, 0xc5, 0x97, 0x02, 0x8e, 0x63, 0xd1, - 0x10, 0xc9, 0xa2, 0x1c, 0x4b, 0xe1, 0xdc, 0x93, 0x13, 0x93, 0xa4, 0x64, 0xb7, 0xe2, 0x23, 0x0c, - 0x17, 0x12, 0x50, 0x92, 0x0a, 0x47, 0x83, 0xed, 0x61, 0x6a, 0x33, 0x55, 0x02, 0xe3, 0xff, 0xcd, - 0x44, 0x07, 0x30, 0x79, 0x1b, 0xc6, 0xc5, 0x8a, 0x51, 0xe6, 0x05, 0xee, 0xa0, 0x72, 0x79, 0xc5, - 0x46, 0x56, 0x45, 0x67, 0xf7, 0xfe, 0x52, 0x79, 0x55, 0x99, 0x1b, 0x78, 0xef, 0xb7, 0xeb, 0xcd, - 0x38, 0x95, 0x44, 0x63, 0x93, 0x60, 0x73, 0xb5, 0xa6, 0xf7, 0x0a, 0x4e, 0x82, 0xa0, 0xe9, 0xa7, - 0x74, 0x83, 0x82, 0xfc, 0xd1, 0x3f, 0xfc, 0x7f, 0xce, 0xa4, 0x9d, 0xf3, 0x64, 0x09, 0x26, 0xb7, - 0x5d, 0xef, 0x00, 0xc7, 0x57, 0xe9, 0x04, 0x1c, 0xf9, 0x43, 0x59, 0x10, 0xff, 0x20, 0x9d, 0x44, - 0x6d, 0x9b, 0xd2, 0x1b, 0x7a, 0xdb, 0x62, 0x1c, 0x34, 0x02, 0x36, 0x0e, 0x21, 0xc7, 0x70, 0x75, - 0xe0, 0x38, 0x44, 0x4d, 0xd0, 0xa6, 0xb0, 0x8a, 0x6e, 0xfc, 0x57, 0x19, 0xf5, 0x3c, 0x67, 0x9d, - 0x5c, 0x71, 0x5b, 0xb6, 0xd3, 0x56, 0x3e, 0x87, 0x3f, 0x2c, 0x21, 0x34, 0xde, 0x12, 0x05, 0x99, - 0xdc, 0x82, 0x3c, 0xff, 0x15, 0xee, 0xb5, 0xa8, 0xd5, 0x12, 0x84, 0xfa, 0x41, 0x21, 0x11, 0x13, - 0x23, 0x93, 0x3b, 0xeb, 0xc8, 0xfc, 0x76, 0x46, 0x3d, 0x8a, 0x3f, 0xec, 0x61, 0x13, 0x3b, 0x64, - 0xb2, 0x67, 0x39, 0x64, 0x3e, 0xf2, 0x27, 0x7c, 0x5f, 0x06, 0xc6, 0x15, 0x2d, 0x05, 0xfb, 0x86, - 0x0d, 0xcf, 0xfd, 0x80, 0xd6, 0x03, 0xfd, 0x1b, 0x3a, 0x1c, 0x18, 0xfb, 0x86, 0x10, 0xf5, 0x23, - 0x7c, 0x83, 0xf1, 0x17, 0x19, 0x71, 0x47, 0x1a, 0x78, 0x9b, 0xd7, 0xb7, 0xe4, 0xec, 0x59, 0x8e, - 0xc8, 0x2f, 0xc0, 0xb0, 0x49, 0x1b, 0x8e, 0x2f, 0xee, 0x37, 0x33, 0xea, 0x7d, 0x0c, 0x0b, 0x22, - 0xb9, 0xc9, 0x63, 0x3f, 0xd5, 0xf3, 0x0d, 0xcb, 0x99, 0x20, 0x5b, 0xf5, 0xef, 0x34, 0xe9, 0x63, - 0x87, 0x2f, 0x46, 0x71, 0xd4, 0xe2, 0xf1, 0xe6, 0xf8, 0xd6, 0x2e, 0x2b, 0x11, 0x12, 0xb5, 0xba, - 0xf0, 0x34, 0x1a, 0xe3, 0x7d, 0x80, 0xa8, 0x4a, 0x72, 0x1f, 0x0a, 0x62, 0x36, 0x38, 0xed, 0x3d, - 0x2e, 0x48, 0x89, 0x3e, 0x28, 0x9e, 0x1c, 0x17, 0x9f, 0xad, 0x87, 0x65, 0x42, 0xea, 0x54, 0xf8, - 0x26, 0x08, 0x8d, 0xff, 0x30, 0x0b, 0xd9, 0x12, 0x0e, 0xc8, 0x7d, 0x7a, 0x14, 0xd8, 0x3b, 0x77, - 0x9c, 0xa6, 0xb6, 0x98, 0x0e, 0x10, 0x6a, 0xed, 0x3a, 0x9a, 0xba, 0x42, 0x41, 0x66, 0x8b, 0xe9, - 0xbe, 0xb7, 0xf3, 0x06, 0x12, 0x2a, 0x8b, 0xe9, 0xc0, 0xdb, 0x79, 0x23, 0x4e, 0x16, 0x22, 0x12, - 0x03, 0x46, 0xf8, 0xc2, 0x12, 0x73, 0x10, 0x4e, 0x8e, 0x8b, 0x23, 0x7c, 0xfd, 0x99, 0xa2, 0x84, - 0x5c, 0x84, 0x5c, 0x6d, 0x63, 0x5d, 0xec, 0x80, 0xa8, 0x16, 0xf4, 0x3b, 0x6d, 0x93, 0xc1, 0x58, - 0x9d, 0xab, 0x95, 0xd2, 0x06, 0x2a, 0x02, 0x86, 0xa3, 0x3a, 0x9b, 0x0d, 0xbb, 0x13, 0x57, 0x05, - 0x84, 0x88, 0xe4, 0x1d, 0x18, 0xbf, 0x5f, 0x29, 0xaf, 0xb8, 0x3e, 0xdf, 0xbd, 0x46, 0xa2, 0xc9, - 0x7f, 0xd0, 0xa8, 0x5b, 0xa8, 0x89, 0x8f, 0x1f, 0x03, 0x0a, 0xbe, 0xf1, 0xc3, 0x59, 0x18, 0x57, - 0xf4, 0x64, 0xe4, 0x33, 0xe2, 0x81, 0x34, 0xa3, 0xdd, 0x00, 0x14, 0x0c, 0x56, 0xca, 0x95, 0x2a, - 0x2d, 0xb7, 0x41, 0xc5, 0x73, 0x69, 0xa4, 0xc0, 0xc8, 0x0e, 0xa2, 0xc0, 0x78, 0x13, 0x80, 0xcf, - 0x01, 0x6c, 0xb2, 0x22, 0x4e, 0x28, 0x76, 0x12, 0xea, 0xb8, 0x44, 0xc8, 0xe4, 0x21, 0xcc, 0x6e, - 0x7a, 0x5d, 0x3f, 0xa8, 0x1d, 0xf9, 0x01, 0x6d, 0x31, 0x6e, 0x1b, 0xae, 0xdb, 0x14, 0xf3, 0xef, - 0xa5, 0x93, 0xe3, 0xe2, 0x65, 0x34, 0xee, 0xb0, 0x7c, 0x2c, 0xc7, 0x06, 0x58, 0x1d, 0xd7, 0x55, - 0xd5, 0x1a, 0x69, 0x0c, 0x0c, 0x13, 0x26, 0x54, 0xa5, 0x08, 0x3b, 0x59, 0xc4, 0x63, 0x92, 0x50, - 0x75, 0x2b, 0x27, 0x8b, 0x68, 0x65, 0xf2, 0x71, 0x4b, 0x27, 0x31, 0x3e, 0xa3, 0x2a, 0xe4, 0x06, - 0x5d, 0xd8, 0xc6, 0x0f, 0x64, 0xa2, 0x6d, 0xe4, 0xe1, 0x4d, 0xf2, 0x16, 0x8c, 0xf0, 0xc7, 0x3b, - 0xf1, 0xc6, 0x79, 0x2e, 0xbc, 0xd4, 0xaa, 0x2f, 0x7b, 0x5c, 0x13, 0xfe, 0x47, 0xfc, 0x81, 0xff, - 0x19, 0x53, 0x90, 0x84, 0x4a, 0x74, 0x5d, 0x9f, 0x26, 0xb9, 0xa3, 0xba, 0xf8, 0x66, 0x9a, 0x12, - 0xdd, 0xf8, 0xdd, 0x21, 0x98, 0xd2, 0xd1, 0xd4, 0x17, 0xbe, 0xcc, 0x40, 0x2f, 0x7c, 0x5f, 0x80, - 0x3c, 0xeb, 0x0f, 0xa7, 0x4e, 0xa5, 0x44, 0xf6, 0x12, 0x3e, 0x2d, 0x08, 0x98, 0xf6, 0x72, 0x0d, - 0x7c, 0x38, 0xd8, 0x1d, 0xd7, 0x0c, 0xa9, 0xc8, 0xa2, 0xf2, 0x0c, 0x95, 0x8b, 0x84, 0x14, 0xf9, - 0x0c, 0xa5, 0xae, 0x87, 0xf0, 0x41, 0xea, 0x75, 0x18, 0x61, 0xf2, 0x7d, 0xa8, 0x82, 0xc1, 0x56, - 0x32, 0xd1, 0x3f, 0x66, 0xa2, 0xc2, 0x91, 0xc8, 0x36, 0xe4, 0x57, 0x6d, 0x3f, 0xa8, 0x51, 0xda, - 0x1e, 0xe0, 0xed, 0xbe, 0x28, 0xba, 0x6a, 0x16, 0x1f, 0xc6, 0x7d, 0x4a, 0xdb, 0xb1, 0xc7, 0xd7, - 0x90, 0x19, 0xf9, 0x2a, 0x40, 0xd9, 0x6d, 0x07, 0x9e, 0xdb, 0x5c, 0x75, 0xf7, 0xe6, 0x47, 0xf0, - 0xee, 0x7b, 0x29, 0x36, 0x00, 0x11, 0x02, 0xbf, 0xfe, 0x86, 0x0a, 0x9e, 0x3a, 0x2f, 0xb0, 0x9a, - 0xee, 0x9e, 0xba, 0x0e, 0x22, 0x7c, 0x72, 0x07, 0x0a, 0x52, 0xb1, 0xb0, 0xd5, 0xd9, 0xf3, 0x70, - 0x82, 0x8c, 0x46, 0x92, 0x07, 0x7d, 0x1c, 0x58, 0x5d, 0x01, 0x57, 0x77, 0xca, 0x38, 0x0d, 0xf9, - 0x0a, 0x5c, 0x88, 0xc3, 0xe4, 0x28, 0xe7, 0x23, 0x99, 0x5c, 0x65, 0x97, 0x32, 0xef, 0x7b, 0xb1, - 0x30, 0xbe, 0x9b, 0x85, 0x0b, 0x3d, 0x3e, 0x96, 0xad, 0x07, 0x3c, 0xae, 0x95, 0xf5, 0x10, 0x3b, - 0xa5, 0xb9, 0xcd, 0xd1, 0x65, 0xc8, 0x8a, 0x03, 0x6e, 0x68, 0xa9, 0x70, 0x72, 0x5c, 0x9c, 0xd0, - 0xc6, 0x31, 0x5b, 0xad, 0x90, 0x7b, 0x30, 0xc4, 0x86, 0x68, 0x80, 0xa7, 0x73, 0xa9, 0x53, 0x9a, - 0x0a, 0x1c, 0x75, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf2, 0x19, 0xc8, 0x6d, 0x6e, 0xae, 0xe2, 0xdc, - 0xc9, 0xe1, 0xb7, 0x4f, 0x06, 0x41, 0x53, 0x9b, 0xaa, 0x93, 0x8c, 0xf6, 0x7a, 0x68, 0x69, 0xc1, - 0xd0, 0xc9, 0x97, 0x62, 0x26, 0x3d, 0xaf, 0xf6, 0x1f, 0xe8, 0xc1, 0x2d, 0x7c, 0x3e, 0x82, 0x61, - 0x8d, 0xf1, 0xf3, 0xd9, 0x68, 0x0d, 0xdf, 0x71, 0x9a, 0x01, 0xf5, 0xc8, 0x02, 0x5f, 0x92, 0x91, - 0x70, 0x66, 0x86, 0xbf, 0xc9, 0x7c, 0xb4, 0xbe, 0x39, 0xab, 0x70, 0x21, 0xbf, 0xaa, 0x2c, 0xe4, - 0x1c, 0x2e, 0xe4, 0xa9, 0x9e, 0x4b, 0xf6, 0xd5, 0x94, 0x79, 0x89, 0x0b, 0x31, 0x65, 0xee, 0xbd, - 0x04, 0x93, 0xeb, 0xee, 0xf2, 0xe3, 0x20, 0x44, 0x64, 0x0b, 0x30, 0x6f, 0xea, 0x40, 0xc6, 0xf1, - 0x41, 0xb3, 0x41, 0xbd, 0xcd, 0x7d, 0xbb, 0xad, 0xbd, 0x5d, 0x9b, 0x09, 0x38, 0xc3, 0x5d, 0xa7, - 0x87, 0x3a, 0xee, 0x28, 0xc7, 0x8d, 0xc3, 0x8d, 0xef, 0xcf, 0xca, 0xce, 0x78, 0xb8, 0xf8, 0x94, - 0xbe, 0x91, 0xbe, 0xa1, 0xbd, 0x91, 0xce, 0x86, 0xda, 0xdd, 0xf0, 0xc1, 0x7f, 0xf1, 0x14, 0x3b, - 0x81, 0xff, 0x65, 0x18, 0x26, 0x54, 0x74, 0xd6, 0x0f, 0xa5, 0x46, 0xc3, 0x53, 0xfb, 0xc1, 0x6e, - 0x34, 0x3c, 0x13, 0xa1, 0x9a, 0x59, 0x40, 0xae, 0xaf, 0x59, 0xc0, 0xd7, 0x60, 0xac, 0xdc, 0x6a, - 0x68, 0x8f, 0x95, 0x46, 0x4a, 0xf3, 0xae, 0x87, 0x48, 0x7c, 0x2d, 0x84, 0x4a, 0xcb, 0x7a, 0xab, - 0x91, 0x7c, 0xa2, 0x8c, 0x58, 0x6a, 0x16, 0x05, 0xc3, 0x1f, 0xc5, 0xa2, 0xe0, 0x36, 0x8c, 0x6d, - 0xf9, 0x74, 0xb3, 0xdb, 0x6e, 0xd3, 0x26, 0x4e, 0xab, 0x3c, 0x97, 0xf5, 0xbb, 0x3e, 0xb5, 0x02, - 0x84, 0xaa, 0x0d, 0x08, 0x51, 0xd5, 0x01, 0x1e, 0xed, 0x33, 0xc0, 0xb7, 0x20, 0xbf, 0x41, 0xa9, - 0x87, 0x7d, 0x3a, 0x1e, 0x89, 0x74, 0x1d, 0x4a, 0x3d, 0x8b, 0x75, 0xac, 0x66, 0x69, 0x20, 0x10, - 0x35, 0xf3, 0x84, 0x89, 0x01, 0xcd, 0x13, 0xc8, 0x0b, 0x30, 0xd1, 0xe9, 0xee, 0x34, 0x9d, 0x3a, - 0xf2, 0x15, 0x76, 0x0d, 0xe6, 0x38, 0x87, 0x31, 0xb6, 0x3e, 0xf9, 0x12, 0x4c, 0xe2, 0x1d, 0x27, - 0x9c, 0x72, 0x53, 0xda, 0xab, 0x9e, 0x56, 0xc6, 0x25, 0x9d, 0x3a, 0x03, 0x59, 0x29, 0xe6, 0x37, - 0x3a, 0xa3, 0x85, 0x1a, 0x4c, 0xe9, 0x23, 0xf9, 0x04, 0x1e, 0xf7, 0x42, 0x53, 0x8b, 0x7c, 0x61, - 0xec, 0xde, 0x50, 0x1e, 0x0a, 0xe3, 0xdc, 0xc8, 0xc2, 0x84, 0x8d, 0xf0, 0x9b, 0x4c, 0x72, 0xbf, - 0xbb, 0x43, 0xbd, 0x36, 0x0d, 0xa8, 0x2f, 0x2e, 0x01, 0xbe, 0x39, 0x54, 0xea, 0x74, 0x7c, 0xe3, - 0x3f, 0xcd, 0xc2, 0x68, 0x69, 0xbb, 0x56, 0x6d, 0xef, 0xba, 0xf8, 0x44, 0x17, 0xbe, 0xcc, 0xa8, - 0x4f, 0x74, 0xe1, 0xcb, 0x8c, 0xfa, 0x1e, 0x73, 0x23, 0xe5, 0x1a, 0x87, 0x56, 0xbc, 0xca, 0x35, - 0x4e, 0xbb, 0x80, 0x46, 0x8f, 0x54, 0xb9, 0x01, 0x1e, 0xa9, 0x42, 0x3d, 0xe2, 0xd0, 0xe9, 0x7a, - 0xc4, 0xb7, 0x60, 0xbc, 0xda, 0x0e, 0xe8, 0x9e, 0x17, 0xcd, 0xf4, 0xf0, 0x4a, 0x19, 0x82, 0x55, - 0xd1, 0x5e, 0xc1, 0x66, 0xd3, 0x88, 0xeb, 0x2e, 0x43, 0x9d, 0x25, 0x4e, 0x23, 0xae, 0xe2, 0x8c, - 0xe9, 0x03, 0x24, 0xa2, 0x51, 0x89, 0xcd, 0x11, 0x69, 0x08, 0xc0, 0x85, 0xcf, 0xa9, 0x48, 0x79, - 0xcf, 0x3a, 0x76, 0x69, 0x26, 0xdd, 0x10, 0xc0, 0xf8, 0x91, 0x2c, 0x8c, 0x97, 0x3a, 0x9d, 0xa7, - 0xdc, 0x1c, 0xeb, 0x73, 0xda, 0xf6, 0x2a, 0xef, 0x42, 0xe1, 0x77, 0x0d, 0x64, 0x89, 0xf5, 0xab, - 0x59, 0x98, 0x8e, 0x51, 0xa8, 0xad, 0xcf, 0x0c, 0x68, 0x84, 0x95, 0x1d, 0xd0, 0x08, 0x2b, 0x37, - 0x98, 0x11, 0xd6, 0xd0, 0x47, 0xd9, 0x32, 0x5f, 0x81, 0x5c, 0xa9, 0xd3, 0x89, 0x3f, 0xe6, 0x76, - 0x3a, 0x0f, 0x6f, 0xf1, 0xfb, 0xac, 0xdd, 0xe9, 0x98, 0x0c, 0x43, 0xdb, 0xc7, 0x46, 0x06, 0xdc, - 0xc7, 0x8c, 0xd7, 0x61, 0x0c, 0x79, 0xa1, 0xe9, 0xd3, 0x65, 0xc0, 0xc5, 0x2c, 0xac, 0x9e, 0xb4, - 0xba, 0xc4, 0x32, 0xff, 0x17, 0x19, 0x18, 0xc6, 0xdf, 0x4f, 0xe9, 0x1c, 0x5b, 0xd4, 0xe6, 0x58, - 0x41, 0x99, 0x63, 0x83, 0xcc, 0xae, 0x7f, 0x94, 0x03, 0x28, 0x3f, 0x30, 0x6b, 0x5c, 0xed, 0x41, - 0xee, 0xc0, 0xb4, 0xdd, 0x6c, 0xba, 0x87, 0xb4, 0x61, 0xb9, 0x9e, 0xb3, 0xe7, 0xb4, 0x79, 0xcf, - 0xc9, 0x17, 0x46, 0xbd, 0x48, 0x7d, 0x77, 0x10, 0x45, 0x0f, 0x78, 0x89, 0xca, 0xa7, 0x45, 0x83, - 0x7d, 0xb7, 0x21, 0x2f, 0x70, 0x1a, 0x1f, 0x51, 0x94, 0xc2, 0x67, 0x8d, 0x97, 0xa8, 0x7c, 0xf6, - 0xf1, 0x42, 0x2a, 0xe5, 0x47, 0x8d, 0x8f, 0x28, 0x4a, 0xe1, 0xc3, 0x6f, 0xb1, 0x3e, 0x59, 0x85, - 0x19, 0x84, 0x58, 0x75, 0x8f, 0x36, 0x68, 0x3b, 0x70, 0xec, 0xa6, 0x2f, 0xae, 0xfc, 0xa8, 0x1c, - 0x4a, 0x14, 0xaa, 0x57, 0x1e, 0x2c, 0x2c, 0x47, 0x65, 0xe4, 0x3a, 0x8c, 0xb6, 0xec, 0xc7, 0x96, - 0xbd, 0xc7, 0xdf, 0xda, 0x27, 0xf9, 0x15, 0x51, 0x80, 0xd4, 0x0d, 0xbb, 0x65, 0x3f, 0x2e, 0xed, - 0x51, 0xf6, 0x15, 0xf4, 0x71, 0xc7, 0xf5, 0x95, 0xaf, 0x18, 0x89, 0xbe, 0x22, 0x56, 0xa4, 0x7e, - 0x85, 0x28, 0x12, 0x5f, 0x61, 0xfc, 0x4a, 0x06, 0x9e, 0xad, 0x62, 0x2b, 0x82, 0xa3, 0x32, 0x6d, - 0x07, 0xd4, 0xdb, 0xa0, 0x5e, 0xcb, 0xc1, 0x97, 0xc7, 0x1a, 0x0d, 0xc8, 0x8b, 0x90, 0x2b, 0x99, - 0xeb, 0x62, 0xfe, 0xf2, 0x9d, 0x55, 0x7b, 0x07, 0x66, 0xa5, 0xa1, 0x16, 0x21, 0x7b, 0x8a, 0x7a, - 0xb0, 0x04, 0x13, 0x25, 0xdf, 0x77, 0xf6, 0xda, 0x2d, 0x6e, 0xc3, 0x9e, 0xd3, 0x5e, 0x9a, 0x05, - 0x3c, 0xa1, 0xd7, 0x56, 0x49, 0x8c, 0xff, 0x2c, 0x03, 0x33, 0xa5, 0x4e, 0x47, 0x6f, 0xb2, 0x6e, - 0xe5, 0x90, 0x19, 0xdc, 0xca, 0xc1, 0x81, 0x29, 0xed, 0x73, 0xf9, 0x94, 0x8a, 0xc4, 0xc2, 0x3e, - 0x3d, 0xc3, 0x9b, 0xdd, 0x09, 0x41, 0x96, 0xaf, 0x3f, 0xd1, 0xc5, 0x18, 0x1b, 0xff, 0xee, 0x28, - 0xee, 0x21, 0x62, 0xb7, 0x15, 0x76, 0x78, 0x99, 0x14, 0x3b, 0xbc, 0x37, 0x41, 0x91, 0x25, 0x54, - 0x1d, 0xaa, 0x22, 0x49, 0xa9, 0xf7, 0xef, 0x08, 0x99, 0x1c, 0xc4, 0x2d, 0xf2, 0x72, 0xf8, 0x35, - 0x2f, 0xc6, 0x17, 0xf0, 0x13, 0x31, 0xc6, 0x5b, 0x01, 0x52, 0x6d, 0xe3, 0xb3, 0x21, 0xad, 0x1d, - 0x38, 0x9d, 0x87, 0xd4, 0x73, 0x76, 0x8f, 0xc4, 0x02, 0xc0, 0xce, 0x77, 0x44, 0xa9, 0xe5, 0x1f, - 0x38, 0x1d, 0x76, 0x41, 0x77, 0x76, 0x8f, 0xcc, 0x14, 0x1a, 0xf2, 0x1e, 0x8c, 0x9a, 0xf4, 0xd0, - 0x73, 0x02, 0x69, 0x67, 0x32, 0x15, 0xaa, 0x93, 0x10, 0xca, 0xd7, 0x82, 0xc7, 0x7f, 0xa8, 0xbb, - 0xa2, 0x28, 0x27, 0x8b, 0x5c, 0x1c, 0xe0, 0xf6, 0x24, 0x93, 0xd1, 0xd7, 0x96, 0xb6, 0x6b, 0xbd, - 0xa4, 0x01, 0x72, 0x0d, 0x86, 0x51, 0xa6, 0x10, 0x92, 0x32, 0xfa, 0x67, 0xa0, 0x64, 0xa9, 0x0a, - 0x3c, 0x88, 0x41, 0x2e, 0x01, 0x84, 0xef, 0x72, 0xfe, 0x7c, 0x1e, 0x65, 0x58, 0x05, 0x12, 0x17, - 0x88, 0xc6, 0xce, 0x24, 0x10, 0xad, 0x42, 0xc1, 0xe4, 0xae, 0x5e, 0x8d, 0x52, 0x07, 0x1f, 0x7f, - 0xfc, 0x79, 0xc0, 0x95, 0x7c, 0xf9, 0xe4, 0xb8, 0xf8, 0x9c, 0x70, 0x03, 0x6b, 0x58, 0x76, 0x87, - 0xbf, 0x19, 0x69, 0xdb, 0x48, 0x9c, 0x92, 0xbc, 0x09, 0x43, 0x6c, 0xeb, 0x15, 0xb6, 0x7b, 0x52, - 0x89, 0x1e, 0xed, 0xc6, 0x7c, 0x71, 0xd6, 0x5d, 0x6d, 0x4f, 0x40, 0x12, 0x62, 0xc1, 0x94, 0x3e, - 0xdd, 0x85, 0x19, 0xc7, 0x7c, 0xd4, 0x9f, 0x7a, 0xb9, 0xd0, 0xac, 0x0b, 0x98, 0x55, 0x47, 0xa0, - 0xba, 0x02, 0x62, 0x8b, 0x74, 0x19, 0xf2, 0x9b, 0xe5, 0x8d, 0x0d, 0xd7, 0x0b, 0xf8, 0x45, 0x20, - 0x3a, 0x59, 0x18, 0xcc, 0xb4, 0xdb, 0x7b, 0x94, 0x9f, 0xc5, 0x41, 0xbd, 0x63, 0x75, 0x18, 0x9a, - 0x7a, 0x16, 0x4b, 0xd2, 0x8f, 0xcf, 0x6e, 0xef, 0x57, 0xb3, 0xf0, 0x62, 0x28, 0x15, 0x3d, 0xf0, - 0x6a, 0xa5, 0xb5, 0xd5, 0x6a, 0x63, 0x43, 0x28, 0x11, 0x36, 0x3c, 0xf7, 0x91, 0xd3, 0xa0, 0xde, - 0xc3, 0x9b, 0xa7, 0x9c, 0xe9, 0xab, 0x7c, 0x99, 0xf3, 0x17, 0x88, 0xac, 0x66, 0xe1, 0xa4, 0x08, - 0x9f, 0x62, 0x7b, 0xea, 0x74, 0x12, 0x0f, 0x12, 0x2b, 0xcf, 0x98, 0x11, 0x03, 0xf2, 0x03, 0x19, - 0x38, 0x9f, 0xde, 0x10, 0xa1, 0x58, 0x2a, 0xca, 0x0b, 0x6c, 0x8f, 0xd6, 0x2e, 0xbd, 0x72, 0x72, - 0x5c, 0x7c, 0xd1, 0xb7, 0x5b, 0x4d, 0xcb, 0x69, 0xf0, 0xda, 0x9c, 0x3a, 0xb5, 0x3a, 0x02, 0x41, - 0xab, 0xb7, 0x47, 0x4d, 0x9f, 0x07, 0x79, 0xb4, 0xcf, 0x67, 0x96, 0x00, 0xf2, 0x52, 0xc9, 0x6b, - 0xfc, 0x46, 0x06, 0x94, 0x25, 0x98, 0x37, 0x69, 0xc3, 0xf1, 0x68, 0x3d, 0x10, 0xc7, 0xbb, 0xf0, - 0xcf, 0xe2, 0xb0, 0x98, 0x41, 0x1b, 0xc2, 0xc8, 0xbb, 0x30, 0x2a, 0x8e, 0x21, 0xb1, 0xed, 0xca, - 0xa5, 0x2b, 0xd4, 0xc7, 0xdc, 0x91, 0x2f, 0x71, 0x84, 0x49, 0x22, 0xb6, 0xeb, 0xdf, 0xdb, 0xde, - 0x2c, 0x37, 0x6d, 0xa7, 0xe5, 0x8b, 0xb3, 0x04, 0xbb, 0xf5, 0x83, 0xc3, 0xc0, 0xaa, 0x23, 0x54, - 0xdd, 0xf5, 0x43, 0x54, 0xe3, 0xae, 0xd4, 0x5e, 0x9f, 0x62, 0x95, 0x59, 0x84, 0xe1, 0x87, 0x91, - 0x16, 0x6b, 0x69, 0xec, 0xe4, 0xb8, 0xc8, 0xa7, 0x8b, 0xc9, 0xe1, 0xc6, 0x97, 0x61, 0x2c, 0x9c, - 0xba, 0x8c, 0x17, 0xfb, 0x81, 0xbc, 0x26, 0x39, 0x2f, 0x36, 0x89, 0x4d, 0x84, 0x32, 0x51, 0x6f, - 0xb9, 0xdd, 0x40, 0x84, 0x2c, 0x22, 0x60, 0xf7, 0xd0, 0x76, 0x03, 0x67, 0xba, 0xfa, 0x75, 0x02, - 0xcd, 0xf8, 0xb1, 0x0c, 0x4c, 0xe9, 0x93, 0x95, 0x5c, 0x87, 0x11, 0xe1, 0x78, 0x95, 0x41, 0x55, + // 30001 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x70, 0x1c, 0x49, + 0x76, 0x20, 0x86, 0x4f, 0x77, 0xe3, 0xa3, 0xf1, 0xf0, 0xd5, 0x48, 0x80, 0x24, 0x88, 0x99, 0x61, + 0x73, 0x6a, 0x66, 0x38, 0xe4, 0xec, 0x0c, 0xb9, 0x04, 0x77, 0xb8, 0x3b, 0x3b, 0x5f, 0xdb, 0xe8, + 0x06, 0x89, 0x26, 0x01, 0x10, 0x5b, 0x0d, 0x10, 0x3b, 0xda, 0x8f, 0xda, 0x42, 0x77, 0x02, 0xa8, + 0x41, 0x77, 0x57, 0x6f, 0x55, 0x35, 0x41, 0xec, 0x9e, 0x7e, 0x27, 0x9d, 0x4e, 0xa7, 0x9f, 0x42, + 0xd6, 0xd7, 0x59, 0x3a, 0xe9, 0x1c, 0x3a, 0x59, 0x21, 0xfb, 0x6c, 0xc5, 0x39, 0xa4, 0xb0, 0x25, + 0xcb, 0x96, 0xad, 0xb0, 0x2c, 0x5d, 0xc8, 0xb2, 0xac, 0x70, 0x9c, 0x14, 0xf6, 0xf9, 0x6b, 0x7d, + 0x01, 0x59, 0x96, 0xff, 0x70, 0x20, 0xc2, 0x11, 0x92, 0x2f, 0xc2, 0x11, 0xde, 0x0b, 0xdd, 0x39, + 0xf2, 0x65, 0x66, 0x55, 0x66, 0x55, 0x75, 0xa3, 0x31, 0xe4, 0xe8, 0xc4, 0x0d, 0xfd, 0x43, 0xa2, + 0x5f, 0xbe, 0xf7, 0xb2, 0xf2, 0xfb, 0xe5, 0xcb, 0xf7, 0x01, 0x2f, 0x05, 0xb4, 0x49, 0x3b, 0xae, + 0x17, 0xdc, 0x68, 0xd2, 0x3d, 0xbb, 0x7e, 0x74, 0x23, 0x38, 0xea, 0x50, 0x9f, 0xff, 0x7b, 0xbd, + 0xe3, 0xb9, 0x81, 0x4b, 0x86, 0xf1, 0xc7, 0xc2, 0xdc, 0x9e, 0xbb, 0xe7, 0x22, 0xe4, 0x06, 0xfb, + 0x8b, 0x17, 0x2e, 0x5c, 0xda, 0x73, 0xdd, 0xbd, 0x26, 0xbd, 0x81, 0xbf, 0x76, 0xba, 0xbb, 0x37, + 0x1a, 0x5d, 0xcf, 0x0e, 0x1c, 0xb7, 0x2d, 0xca, 0x8b, 0xf1, 0xf2, 0xc0, 0x69, 0x51, 0x3f, 0xb0, + 0x5b, 0x9d, 0x5e, 0x0c, 0x0e, 0x3d, 0xbb, 0xd3, 0xa1, 0x9e, 0xa8, 0x7d, 0xe1, 0x5a, 0xf8, 0x81, + 0x76, 0x10, 0x30, 0x4a, 0xc6, 0xfc, 0xc6, 0xa3, 0x9b, 0xea, 0x4f, 0x81, 0x7a, 0xbb, 0x47, 0x5b, + 0xbc, 0xae, 0x1f, 0xd0, 0x86, 0xd5, 0xa0, 0x8f, 0x9c, 0x3a, 0xb5, 0x3c, 0xfa, 0x8d, 0xae, 0xe3, + 0xd1, 0x16, 0x6d, 0x07, 0x82, 0xee, 0xcd, 0x74, 0x3a, 0xf9, 0x21, 0xb1, 0x2f, 0x32, 0x7e, 0x3e, + 0x07, 0x63, 0xf7, 0x29, 0xed, 0x94, 0x9a, 0xce, 0x23, 0x4a, 0x5e, 0x86, 0xa1, 0x75, 0xbb, 0x45, + 0xe7, 0x33, 0x97, 0x33, 0x57, 0xc7, 0x96, 0xa6, 0x4f, 0x8e, 0x8b, 0xe3, 0x3e, 0xf5, 0x1e, 0x51, + 0xcf, 0x6a, 0xdb, 0x2d, 0x6a, 0x62, 0x21, 0xf9, 0x14, 0x8c, 0xb1, 0xff, 0xfd, 0x8e, 0x5d, 0xa7, + 0xf3, 0x59, 0xc4, 0x9c, 0x3c, 0x39, 0x2e, 0x8e, 0xb5, 0x25, 0xd0, 0x8c, 0xca, 0x49, 0x15, 0x46, + 0x97, 0x1f, 0x77, 0x1c, 0x8f, 0xfa, 0xf3, 0x43, 0x97, 0x33, 0x57, 0xc7, 0x17, 0x17, 0xae, 0xf3, + 0x3e, 0xba, 0x2e, 0xfb, 0xe8, 0xfa, 0xa6, 0xec, 0xc4, 0xa5, 0xd9, 0xdf, 0x3f, 0x2e, 0x3e, 0x77, + 0x72, 0x5c, 0x1c, 0xa5, 0x9c, 0xe4, 0x27, 0xfe, 0xb8, 0x98, 0x31, 0x25, 0x3d, 0x79, 0x17, 0x86, + 0x36, 0x8f, 0x3a, 0x74, 0x7e, 0xec, 0x72, 0xe6, 0xea, 0xd4, 0xe2, 0xa5, 0xeb, 0x7c, 0x58, 0xc3, + 0x8f, 0x8f, 0xfe, 0x62, 0x58, 0x4b, 0xf9, 0x93, 0xe3, 0xe2, 0x10, 0x43, 0x31, 0x91, 0x8a, 0xbc, + 0x09, 0x23, 0x2b, 0xae, 0x1f, 0x54, 0x2b, 0xf3, 0x80, 0x9f, 0x7c, 0xee, 0xe4, 0xb8, 0x38, 0xb3, + 0xef, 0xfa, 0x81, 0xe5, 0x34, 0xde, 0x70, 0x5b, 0x4e, 0x40, 0x5b, 0x9d, 0xe0, 0xc8, 0x14, 0x48, + 0xc6, 0x63, 0x98, 0xd4, 0xf8, 0x91, 0x71, 0x18, 0xdd, 0x5a, 0xbf, 0xbf, 0xfe, 0x60, 0x7b, 0xbd, + 0xf0, 0x1c, 0xc9, 0xc3, 0xd0, 0xfa, 0x83, 0xca, 0x72, 0x21, 0x43, 0x46, 0x21, 0x57, 0xda, 0xd8, + 0x28, 0x64, 0xc9, 0x04, 0xe4, 0x2b, 0xa5, 0xcd, 0xd2, 0x52, 0xa9, 0xb6, 0x5c, 0xc8, 0x91, 0x59, + 0x98, 0xde, 0xae, 0xae, 0x57, 0x1e, 0x6c, 0xd7, 0xac, 0xca, 0x72, 0xed, 0xfe, 0xe6, 0x83, 0x8d, + 0xc2, 0x10, 0x99, 0x02, 0xb8, 0xbf, 0xb5, 0xb4, 0x6c, 0xae, 0x2f, 0x6f, 0x2e, 0xd7, 0x0a, 0xc3, + 0x64, 0x0e, 0x0a, 0x92, 0xc4, 0xaa, 0x2d, 0x9b, 0x0f, 0xab, 0xe5, 0xe5, 0xc2, 0xc8, 0xbd, 0xa1, + 0x7c, 0xae, 0x30, 0x64, 0x8e, 0xae, 0x52, 0xdb, 0xa7, 0xd5, 0x8a, 0xf1, 0xef, 0xe4, 0x20, 0xbf, + 0x46, 0x03, 0xbb, 0x61, 0x07, 0x36, 0x79, 0x41, 0x1b, 0x1f, 0x6c, 0xa2, 0x32, 0x30, 0x2f, 0x27, + 0x07, 0x66, 0xf8, 0xe4, 0xb8, 0x98, 0x79, 0x53, 0x1d, 0x90, 0x77, 0x60, 0xbc, 0x42, 0xfd, 0xba, + 0xe7, 0x74, 0xd8, 0x64, 0x9b, 0xcf, 0x21, 0xda, 0xc5, 0x93, 0xe3, 0xe2, 0xb9, 0x46, 0x04, 0x56, + 0x3a, 0x44, 0xc5, 0x26, 0x55, 0x18, 0x59, 0xb5, 0x77, 0x68, 0xd3, 0x9f, 0x1f, 0xbe, 0x9c, 0xbb, + 0x3a, 0xbe, 0xf8, 0xbc, 0x18, 0x04, 0xf9, 0x81, 0xd7, 0x79, 0xe9, 0x72, 0x3b, 0xf0, 0x8e, 0x96, + 0xe6, 0x4e, 0x8e, 0x8b, 0x85, 0x26, 0x02, 0xd4, 0x0e, 0xe6, 0x28, 0xa4, 0x16, 0x4d, 0x8c, 0x91, + 0x53, 0x27, 0xc6, 0x8b, 0xbf, 0x7f, 0x5c, 0xcc, 0xb0, 0x01, 0x13, 0x13, 0x23, 0xe2, 0xa7, 0x4f, + 0x91, 0x45, 0xc8, 0x9b, 0xf4, 0x91, 0xe3, 0xb3, 0x96, 0xe5, 0xb1, 0x65, 0xe7, 0x4f, 0x8e, 0x8b, + 0xc4, 0x13, 0x30, 0xe5, 0x33, 0x42, 0xbc, 0x85, 0xb7, 0x61, 0x5c, 0xf9, 0x6a, 0x52, 0x80, 0xdc, + 0x01, 0x3d, 0xe2, 0x3d, 0x6c, 0xb2, 0x3f, 0xc9, 0x1c, 0x0c, 0x3f, 0xb2, 0x9b, 0x5d, 0xd1, 0xa5, + 0x26, 0xff, 0xf1, 0xf9, 0xec, 0xe7, 0x32, 0xf7, 0x86, 0xf2, 0xa3, 0x85, 0xbc, 0x99, 0xad, 0x56, + 0x8c, 0xbf, 0x3b, 0x04, 0x79, 0xd3, 0xe5, 0x0b, 0x98, 0x5c, 0x83, 0xe1, 0x5a, 0x60, 0x07, 0x72, + 0x98, 0x66, 0x4f, 0x8e, 0x8b, 0xd3, 0x6c, 0x71, 0x53, 0xa5, 0x7e, 0x8e, 0xc1, 0x50, 0x37, 0xf6, + 0x6d, 0x5f, 0x0e, 0x17, 0xa2, 0x76, 0x18, 0x40, 0x45, 0x45, 0x0c, 0x72, 0x05, 0x86, 0xd6, 0xdc, + 0x06, 0x15, 0x23, 0x46, 0x4e, 0x8e, 0x8b, 0x53, 0x2d, 0xb7, 0xa1, 0x22, 0x62, 0x39, 0x79, 0x03, + 0xc6, 0xca, 0x5d, 0xcf, 0xa3, 0x6d, 0x36, 0xd7, 0x87, 0x10, 0x79, 0xea, 0xe4, 0xb8, 0x08, 0x75, + 0x0e, 0xb4, 0x9c, 0x86, 0x19, 0x21, 0xb0, 0x61, 0xa8, 0x05, 0xb6, 0x17, 0xd0, 0xc6, 0xfc, 0xf0, + 0x40, 0xc3, 0xc0, 0xd6, 0xe7, 0x8c, 0xcf, 0x49, 0xe2, 0xc3, 0x20, 0x38, 0x91, 0x15, 0x18, 0xbf, + 0xeb, 0xd9, 0x75, 0xba, 0x41, 0x3d, 0xc7, 0x6d, 0xe0, 0xf8, 0xe6, 0x96, 0xae, 0x9c, 0x1c, 0x17, + 0xcf, 0xef, 0x31, 0xb0, 0xd5, 0x41, 0x78, 0x44, 0xfd, 0x9d, 0xe3, 0x62, 0xbe, 0x22, 0xb6, 0x5a, + 0x53, 0x25, 0x25, 0x5f, 0x67, 0x83, 0xe3, 0x07, 0xd8, 0xb5, 0xb4, 0x31, 0x3f, 0x7a, 0xea, 0x27, + 0x1a, 0xe2, 0x13, 0xcf, 0x37, 0x6d, 0x3f, 0xb0, 0x3c, 0x4e, 0x17, 0xfb, 0x4e, 0x95, 0x25, 0x79, + 0x00, 0xf9, 0x5a, 0x7d, 0x9f, 0x36, 0xba, 0x4d, 0x8a, 0x53, 0x66, 0x7c, 0xf1, 0x82, 0x98, 0xd4, + 0x72, 0x3c, 0x65, 0xf1, 0xd2, 0x82, 0xe0, 0x4d, 0x7c, 0x01, 0x51, 0xe7, 0x93, 0xc4, 0xfa, 0x7c, + 0xfe, 0x67, 0x7f, 0xa1, 0xf8, 0xdc, 0xf7, 0xfd, 0xb3, 0xcb, 0xcf, 0x19, 0xff, 0x69, 0x16, 0x0a, + 0x71, 0x26, 0x64, 0x17, 0x26, 0xb7, 0x3a, 0x0d, 0x3b, 0xa0, 0xe5, 0xa6, 0x43, 0xdb, 0x81, 0x8f, + 0x93, 0xa4, 0x7f, 0x9b, 0x5e, 0x11, 0xf5, 0xce, 0x77, 0x91, 0xd0, 0xaa, 0x73, 0xca, 0x58, 0xab, + 0x74, 0xb6, 0x51, 0x3d, 0x35, 0xdc, 0xc0, 0x7d, 0x9c, 0x61, 0x67, 0xab, 0x87, 0x6f, 0xfd, 0x3d, + 0xea, 0x11, 0x6c, 0xc5, 0x04, 0x6a, 0x37, 0x76, 0x8e, 0x70, 0x66, 0x0e, 0x3e, 0x81, 0x18, 0x49, + 0xca, 0x04, 0x62, 0x60, 0xe3, 0xff, 0xc8, 0xc0, 0x94, 0x49, 0x7d, 0xb7, 0xeb, 0xd5, 0xe9, 0x0a, + 0xb5, 0x1b, 0xd4, 0x63, 0xd3, 0xff, 0xbe, 0xd3, 0x6e, 0x88, 0x35, 0x85, 0xd3, 0xff, 0xc0, 0x69, + 0xab, 0x5b, 0x37, 0x96, 0x93, 0x4f, 0xc3, 0x68, 0xad, 0xbb, 0x83, 0xa8, 0xd9, 0x68, 0x07, 0xf0, + 0xbb, 0x3b, 0x56, 0x0c, 0x5d, 0xa2, 0x91, 0x1b, 0x30, 0xfa, 0x90, 0x7a, 0x7e, 0xb4, 0x1b, 0xe2, + 0xd1, 0xf0, 0x88, 0x83, 0x54, 0x02, 0x81, 0x45, 0xee, 0x46, 0x3b, 0xb2, 0x38, 0xd4, 0xa6, 0x63, + 0xfb, 0x60, 0x34, 0x55, 0x5a, 0x02, 0xa2, 0x4e, 0x15, 0x89, 0x65, 0xfc, 0x64, 0x16, 0x0a, 0x15, + 0x3b, 0xb0, 0x77, 0x6c, 0x5f, 0xf4, 0xe7, 0xc3, 0x5b, 0x6c, 0x8f, 0x57, 0x1a, 0x8a, 0x7b, 0x3c, + 0xfb, 0xf2, 0x8f, 0xdd, 0xbc, 0x57, 0xe3, 0xcd, 0x1b, 0x67, 0x27, 0xac, 0x68, 0x5e, 0xd4, 0xa8, + 0xf7, 0x4e, 0x6f, 0x54, 0x41, 0x34, 0x2a, 0x2f, 0x1b, 0x15, 0x35, 0x85, 0xbc, 0x07, 0x43, 0xb5, + 0x0e, 0xad, 0x8b, 0x4d, 0x44, 0x9e, 0x0b, 0x7a, 0xe3, 0x18, 0xc2, 0xc3, 0x5b, 0x4b, 0x13, 0x82, + 0xcd, 0x90, 0xdf, 0xa1, 0x75, 0x13, 0xc9, 0x94, 0x45, 0xf3, 0x1b, 0x39, 0x98, 0x4b, 0x23, 0x53, + 0xdb, 0x31, 0xd2, 0xa7, 0x1d, 0x57, 0x21, 0xcf, 0x8e, 0x70, 0x76, 0x2c, 0xe2, 0x76, 0x31, 0xb6, + 0x34, 0xc1, 0x3e, 0x79, 0x5f, 0xc0, 0xcc, 0xb0, 0x94, 0xbc, 0x1c, 0x4a, 0x04, 0xf9, 0x88, 0x9f, + 0x90, 0x08, 0xa4, 0x1c, 0xc0, 0xc6, 0x5a, 0x2e, 0x61, 0x14, 0x1c, 0xa2, 0x6e, 0x91, 0xe0, 0x68, + 0xac, 0x3d, 0x01, 0xd1, 0x8e, 0x19, 0x79, 0x28, 0x2c, 0x43, 0x5e, 0x36, 0x6b, 0x7e, 0x02, 0x19, + 0xcd, 0xc4, 0x3a, 0xe9, 0xe1, 0x2d, 0x3e, 0x98, 0x0d, 0xf1, 0x5b, 0x65, 0x23, 0x71, 0xc8, 0x2d, + 0xc8, 0x6f, 0x78, 0xee, 0xe3, 0xa3, 0x6a, 0xc5, 0x9f, 0x9f, 0xbc, 0x9c, 0xbb, 0x3a, 0xb6, 0x74, + 0xe1, 0xe4, 0xb8, 0x38, 0xdb, 0x61, 0x30, 0xcb, 0x69, 0xa8, 0x27, 0x6d, 0x88, 0x78, 0x6f, 0x28, + 0x9f, 0x29, 0x64, 0xef, 0x0d, 0xe5, 0xb3, 0x85, 0x1c, 0x17, 0x2f, 0xee, 0x0d, 0xe5, 0x87, 0x0a, + 0xc3, 0xf7, 0x86, 0xf2, 0xc3, 0x28, 0x70, 0x8c, 0x15, 0xe0, 0xde, 0x50, 0x7e, 0xbc, 0x30, 0xa1, + 0x9d, 0xf6, 0xc8, 0x20, 0x70, 0xeb, 0x6e, 0xd3, 0xcc, 0x6d, 0x99, 0x55, 0x73, 0xa4, 0x5c, 0x2a, + 0x53, 0x2f, 0x30, 0x73, 0xa5, 0xed, 0x9a, 0x39, 0x59, 0x39, 0x6a, 0xdb, 0x2d, 0xa7, 0xce, 0x8f, + 0x4e, 0x33, 0x77, 0xb7, 0xbc, 0x61, 0x94, 0x60, 0x2a, 0x6a, 0xcb, 0xaa, 0xe3, 0x07, 0xe4, 0x06, + 0x8c, 0x49, 0x08, 0xdb, 0xe8, 0x72, 0xa9, 0xad, 0x36, 0x23, 0x1c, 0xe3, 0xf7, 0xb2, 0x00, 0x51, + 0xc9, 0x33, 0xba, 0x16, 0x3e, 0xab, 0xad, 0x85, 0x73, 0xf1, 0xb5, 0xd0, 0x73, 0x15, 0x90, 0x0f, + 0x60, 0x84, 0x89, 0x05, 0x5d, 0x29, 0x12, 0x5d, 0x88, 0x93, 0x62, 0xe1, 0xc3, 0x5b, 0x4b, 0x53, + 0x82, 0x78, 0xc4, 0x47, 0x88, 0x29, 0xc8, 0x94, 0x65, 0xf4, 0xf3, 0xa3, 0xd1, 0x60, 0x88, 0x05, + 0x74, 0x15, 0xc2, 0x01, 0x15, 0x1d, 0x8a, 0x2b, 0xa3, 0x23, 0x07, 0x39, 0x2c, 0x25, 0x17, 0x81, + 0x0d, 0xb8, 0xe8, 0xd4, 0xd1, 0x93, 0xe3, 0x62, 0xae, 0xeb, 0x39, 0x38, 0x09, 0xc8, 0x0d, 0x10, + 0xd3, 0x40, 0x74, 0x20, 0x9b, 0x7d, 0x33, 0x75, 0xdb, 0xaa, 0x53, 0x2f, 0x88, 0x7a, 0x7c, 0x3e, + 0x23, 0x67, 0x0b, 0xe9, 0x80, 0x3e, 0x55, 0xe6, 0x87, 0x70, 0x1a, 0x5c, 0x4d, 0xed, 0x95, 0xeb, + 0x1a, 0x2a, 0x17, 0x23, 0x2f, 0xcb, 0x53, 0xa9, 0xc1, 0xcb, 0xac, 0x84, 0x48, 0xa9, 0x57, 0x40, + 0x6e, 0x01, 0x9b, 0xa1, 0xa2, 0xf7, 0x41, 0xd4, 0x53, 0xda, 0xae, 0x2d, 0x9d, 0x13, 0x9c, 0x26, + 0xed, 0x43, 0x95, 0x9c, 0x61, 0x93, 0x77, 0x80, 0x4d, 0x61, 0xd1, 0xef, 0x44, 0x10, 0xdd, 0x2d, + 0x6f, 0x94, 0x9b, 0x6e, 0xb7, 0x51, 0xfb, 0xe2, 0x6a, 0x44, 0xbc, 0x57, 0xef, 0xa8, 0xc4, 0x77, + 0xcb, 0x1b, 0xe4, 0x1d, 0x18, 0x2e, 0x7d, 0xb3, 0xeb, 0x51, 0x21, 0x9f, 0x4c, 0xc8, 0x3a, 0x19, + 0x6c, 0xe9, 0x82, 0x20, 0x9c, 0xb6, 0xd9, 0x4f, 0x55, 0xae, 0xc3, 0x72, 0x56, 0xf3, 0xe6, 0x6a, + 0x4d, 0xc8, 0x1e, 0x24, 0xd6, 0x2d, 0x9b, 0xab, 0xca, 0x67, 0x07, 0x5a, 0xab, 0x19, 0x15, 0xb9, + 0x01, 0xd9, 0x52, 0x05, 0x6f, 0x44, 0xe3, 0x8b, 0x63, 0xb2, 0xda, 0xca, 0xd2, 0x9c, 0x20, 0x99, + 0xb0, 0xd5, 0x65, 0x90, 0x2d, 0x55, 0xc8, 0x12, 0x0c, 0xaf, 0x1d, 0xd5, 0xbe, 0xb8, 0x2a, 0x36, + 0xb3, 0x59, 0x39, 0xaf, 0x19, 0xec, 0x01, 0x2e, 0x7b, 0x3f, 0xfa, 0xe2, 0xd6, 0x91, 0xff, 0x8d, + 0xa6, 0xfa, 0xc5, 0x88, 0x46, 0x36, 0x60, 0xac, 0xd4, 0x68, 0x39, 0xed, 0x2d, 0x9f, 0x7a, 0xf3, + 0xe3, 0xc8, 0x67, 0x3e, 0xf6, 0xdd, 0x61, 0xf9, 0xd2, 0xfc, 0xc9, 0x71, 0x71, 0xce, 0x66, 0x3f, + 0xad, 0xae, 0x4f, 0x3d, 0x85, 0x5b, 0xc4, 0x84, 0x6c, 0x00, 0xac, 0xb9, 0xed, 0x3d, 0xb7, 0x14, + 0x34, 0x6d, 0x3f, 0xb6, 0x3d, 0x46, 0x05, 0xa1, 0xf8, 0x70, 0xae, 0xc5, 0x60, 0x96, 0xcd, 0x80, + 0x0a, 0x43, 0x85, 0x07, 0xb9, 0x03, 0x23, 0x0f, 0x3c, 0xbb, 0xde, 0xa4, 0xf3, 0x93, 0xc8, 0x6d, + 0x4e, 0x70, 0xe3, 0x40, 0xd9, 0xd2, 0x79, 0xc1, 0xb0, 0xe0, 0x22, 0x58, 0xbd, 0xa6, 0x70, 0xc4, + 0x85, 0x6d, 0x20, 0xc9, 0x39, 0x99, 0x72, 0x49, 0xf8, 0x94, 0x7a, 0x49, 0x88, 0x16, 0x7d, 0xd9, + 0x6d, 0xb5, 0xec, 0x76, 0x03, 0x69, 0x1f, 0x2e, 0x2a, 0x77, 0x07, 0xe3, 0x1b, 0x30, 0x93, 0xe8, + 0xac, 0x53, 0xee, 0x77, 0xef, 0xc3, 0x74, 0x85, 0xee, 0xda, 0xdd, 0x66, 0x10, 0x9e, 0x24, 0x7c, + 0x89, 0xe2, 0x4d, 0xab, 0xc1, 0x8b, 0x2c, 0x79, 0x7c, 0x98, 0x71, 0x64, 0xe3, 0x3d, 0x98, 0xd4, + 0x9a, 0xcf, 0xae, 0x0a, 0xa5, 0x6e, 0xc3, 0x09, 0x70, 0x20, 0x33, 0xd1, 0x55, 0xc1, 0x66, 0x40, + 0x1c, 0x2e, 0x33, 0x42, 0x30, 0xfe, 0x5d, 0x55, 0x5a, 0x11, 0x3b, 0x11, 0xbb, 0x56, 0x8b, 0xfd, + 0x20, 0x13, 0xc9, 0x4e, 0x89, 0xfd, 0x20, 0xdc, 0x0d, 0xae, 0xf1, 0xb5, 0x99, 0x4d, 0xac, 0xcd, + 0x71, 0x31, 0x12, 0x39, 0xfb, 0xd0, 0xe7, 0x2b, 0x32, 0x9c, 0xa9, 0xb9, 0x8f, 0x3f, 0x53, 0x3f, + 0x80, 0x89, 0x35, 0xbb, 0x6d, 0xef, 0xd1, 0x06, 0x6b, 0x01, 0xdf, 0x7b, 0xc6, 0x96, 0x9e, 0x3f, + 0x39, 0x2e, 0x5e, 0x68, 0x71, 0x38, 0xb6, 0x52, 0x9d, 0x44, 0x1a, 0x01, 0xb9, 0x29, 0x57, 0xf6, + 0x70, 0xca, 0xca, 0x9e, 0x14, 0xb5, 0x0f, 0xe3, 0xca, 0x16, 0xeb, 0xd9, 0xf8, 0xed, 0x31, 0x6c, + 0x23, 0x79, 0x03, 0x46, 0x4c, 0xba, 0xc7, 0x8e, 0x9a, 0x4c, 0x34, 0x48, 0x1e, 0x42, 0xd4, 0x8e, + 0xe1, 0x38, 0x28, 0x67, 0xd0, 0x86, 0xbf, 0xef, 0xec, 0x06, 0xa2, 0x77, 0x42, 0x39, 0x43, 0x80, + 0x15, 0x39, 0x43, 0x40, 0xf4, 0xeb, 0x2c, 0x87, 0xb1, 0xdd, 0xcf, 0xac, 0xd4, 0x44, 0xa7, 0xc9, + 0x1e, 0x36, 0x2b, 0xca, 0x36, 0xe2, 0x69, 0x52, 0x02, 0xc3, 0x26, 0xb7, 0x61, 0xac, 0x54, 0xaf, + 0xbb, 0x5d, 0xe5, 0xce, 0xc8, 0xd7, 0x2d, 0x07, 0xea, 0x2a, 0x92, 0x08, 0x95, 0xd4, 0x60, 0x7c, + 0x99, 0x5d, 0xb4, 0x9c, 0xb2, 0x5d, 0xdf, 0x97, 0x9d, 0x24, 0xf7, 0x30, 0xa5, 0x24, 0x5a, 0xb9, + 0x14, 0x81, 0x75, 0x06, 0x54, 0x95, 0x0c, 0x0a, 0x2e, 0xd9, 0x84, 0xf1, 0x1a, 0xad, 0x7b, 0x34, + 0xa8, 0x05, 0xae, 0x47, 0x63, 0x5b, 0xb2, 0x52, 0xb2, 0x74, 0x49, 0xde, 0xf5, 0x7c, 0x04, 0x5a, + 0x3e, 0x83, 0xaa, 0x5c, 0x15, 0x64, 0x2e, 0xb4, 0xb7, 0x5c, 0xef, 0xa8, 0xb2, 0x24, 0xb6, 0xe9, + 0xe8, 0x4c, 0xe7, 0x60, 0x55, 0x68, 0x67, 0x90, 0xc6, 0x8e, 0x2e, 0xb4, 0x73, 0x2c, 0x1c, 0xa9, + 0x4a, 0x0d, 0x65, 0x2b, 0xb1, 0x69, 0x4f, 0x47, 0xbd, 0x8c, 0x60, 0x65, 0xa4, 0x1a, 0x3e, 0x4a, + 0x66, 0xda, 0x48, 0x09, 0x2c, 0xd2, 0x01, 0x22, 0x47, 0x8d, 0x0b, 0xba, 0x4d, 0xea, 0xfb, 0x62, + 0x2f, 0xbf, 0x18, 0x1b, 0xfc, 0x08, 0x61, 0xe9, 0x55, 0xc1, 0xfc, 0x45, 0x39, 0x0d, 0xc4, 0x3d, + 0x8d, 0x15, 0x2a, 0xf5, 0xa4, 0xf0, 0x26, 0x6f, 0x03, 0x2c, 0x3f, 0x0e, 0xa8, 0xd7, 0xb6, 0x9b, + 0xa1, 0x1e, 0x0c, 0x55, 0x3f, 0x54, 0x40, 0xf5, 0x81, 0x56, 0x90, 0x49, 0x19, 0x26, 0x4b, 0xbe, + 0xdf, 0x6d, 0x51, 0xd3, 0x6d, 0xd2, 0x92, 0xb9, 0x8e, 0xfb, 0xfe, 0xd8, 0xd2, 0x8b, 0x27, 0xc7, + 0xc5, 0x8b, 0x36, 0x16, 0x58, 0x9e, 0xdb, 0xa4, 0x96, 0xed, 0xa9, 0xb3, 0x5b, 0xa7, 0x21, 0x0f, + 0x00, 0x1e, 0x74, 0x68, 0xbb, 0x46, 0x6d, 0xaf, 0xbe, 0x1f, 0xdb, 0xe6, 0xa3, 0x82, 0xa5, 0x17, + 0x44, 0x0b, 0xe7, 0xdc, 0x0e, 0x6d, 0xfb, 0x08, 0x53, 0xbf, 0x2a, 0xc2, 0x24, 0xdb, 0x30, 0x5d, + 0x2d, 0xad, 0x6d, 0xb8, 0x4d, 0xa7, 0x7e, 0x24, 0x24, 0xa7, 0x29, 0xd4, 0x0e, 0x9e, 0x17, 0x5c, + 0x63, 0xa5, 0x7c, 0x7b, 0x72, 0xec, 0x96, 0xd5, 0x41, 0xa8, 0x25, 0xe4, 0xa7, 0x38, 0x17, 0xf2, + 0x21, 0x9b, 0x83, 0x3e, 0x13, 0x06, 0x37, 0xed, 0x3d, 0x7f, 0x7e, 0x5a, 0xd3, 0x76, 0x95, 0xb6, + 0x6b, 0xd7, 0x95, 0x52, 0x2e, 0xa6, 0x2c, 0xf0, 0x89, 0x88, 0x50, 0x2b, 0xb0, 0xf7, 0x7c, 0x7d, + 0x22, 0x86, 0xd8, 0xe4, 0x1e, 0x40, 0xc5, 0xad, 0x77, 0x5b, 0xb4, 0x1d, 0x54, 0x96, 0xe6, 0x0b, + 0xfa, 0x55, 0x20, 0x2c, 0x88, 0xb6, 0xb6, 0x86, 0x5b, 0xd7, 0x66, 0xa2, 0x42, 0xbd, 0xf0, 0x3e, + 0x14, 0xe2, 0x1f, 0x72, 0x46, 0x05, 0xd6, 0x64, 0x61, 0x4a, 0x69, 0xfd, 0xf2, 0x63, 0xc7, 0x0f, + 0x7c, 0xe3, 0x5b, 0xda, 0x0a, 0x64, 0xbb, 0xc3, 0x7d, 0x7a, 0xb4, 0xe1, 0xd1, 0x5d, 0xe7, 0xb1, + 0xd8, 0xcc, 0x70, 0x77, 0x38, 0xa0, 0x47, 0x56, 0x07, 0xa1, 0xea, 0xee, 0x10, 0xa2, 0x92, 0xcf, + 0x40, 0xfe, 0xfe, 0x5a, 0xed, 0x3e, 0x3d, 0xaa, 0x56, 0xc4, 0x41, 0xc5, 0xc9, 0x5a, 0xbe, 0xc5, + 0x48, 0xb5, 0xb9, 0x16, 0x62, 0x1a, 0x4b, 0xd1, 0x4e, 0xc8, 0x6a, 0x2e, 0x37, 0xbb, 0x7e, 0x40, + 0xbd, 0x6a, 0x45, 0xad, 0xb9, 0xce, 0x81, 0xb1, 0x7d, 0x29, 0x44, 0x35, 0xfe, 0x55, 0x16, 0x77, + 0x41, 0x36, 0xe1, 0xab, 0x6d, 0x3f, 0xb0, 0xdb, 0x75, 0x1a, 0x32, 0xc0, 0x09, 0xef, 0x08, 0x68, + 0x6c, 0xc2, 0x47, 0xc8, 0x7a, 0xd5, 0xd9, 0x81, 0xab, 0x66, 0x55, 0x4a, 0xcd, 0x45, 0xb5, 0xa2, + 0xaa, 0x57, 0x3d, 0x01, 0x8d, 0x55, 0x19, 0x21, 0x93, 0x2b, 0x30, 0x5a, 0x2d, 0xad, 0x95, 0xba, + 0xc1, 0x3e, 0xee, 0xc1, 0x79, 0x2e, 0x9f, 0xb3, 0xd9, 0x6a, 0x77, 0x83, 0x7d, 0x53, 0x16, 0x92, + 0x1b, 0x78, 0xef, 0x69, 0xd3, 0x80, 0xab, 0x61, 0xc5, 0xa1, 0xeb, 0x73, 0x50, 0xec, 0xda, 0xc3, + 0x40, 0xe4, 0x75, 0x18, 0x7e, 0xb8, 0x51, 0xae, 0x56, 0xc4, 0xc5, 0x19, 0x4f, 0xa2, 0x47, 0x9d, + 0xba, 0xfe, 0x25, 0x1c, 0x85, 0x2c, 0xc3, 0x54, 0x8d, 0xd6, 0xbb, 0x9e, 0x13, 0x1c, 0xdd, 0xf5, + 0xdc, 0x6e, 0xc7, 0x9f, 0x1f, 0xc5, 0x3a, 0x70, 0xa5, 0xfb, 0xa2, 0xc4, 0xda, 0xc3, 0x22, 0x85, + 0x3a, 0x46, 0x64, 0xfc, 0x4e, 0x26, 0xda, 0x26, 0xc9, 0x15, 0x4d, 0xac, 0x41, 0xdd, 0x0d, 0x13, + 0x6b, 0x54, 0xdd, 0x0d, 0x0a, 0x38, 0x26, 0x90, 0x72, 0xd7, 0x0f, 0xdc, 0xd6, 0x72, 0xbb, 0xd1, + 0x71, 0x9d, 0x76, 0x80, 0x54, 0xbc, 0xf3, 0x8d, 0x93, 0xe3, 0xe2, 0xa5, 0x3a, 0x96, 0x5a, 0x54, + 0x14, 0x5b, 0x31, 0x2e, 0x29, 0xd4, 0x4f, 0x30, 0x1e, 0xc6, 0x1f, 0x64, 0xb5, 0xe3, 0x8d, 0x7d, + 0x9e, 0x49, 0x3b, 0x4d, 0xa7, 0x8e, 0x37, 0x7a, 0x6c, 0x68, 0x38, 0xab, 0xf0, 0xf3, 0xbc, 0xa8, + 0x94, 0xf7, 0x90, 0xce, 0x3b, 0x85, 0x9a, 0x7c, 0x01, 0x26, 0x98, 0xa4, 0x21, 0x7e, 0xfa, 0xf3, + 0x59, 0xec, 0xec, 0x17, 0x50, 0x0b, 0xe7, 0x53, 0x2f, 0x64, 0xa3, 0x89, 0x28, 0x2a, 0x05, 0x69, + 0xc0, 0xfc, 0xa6, 0x67, 0xb7, 0x7d, 0x27, 0x58, 0x6e, 0xd7, 0xbd, 0x23, 0x94, 0x8c, 0x96, 0xdb, + 0xf6, 0x4e, 0x93, 0x36, 0xb0, 0xb9, 0xf9, 0xa5, 0xab, 0x27, 0xc7, 0xc5, 0x57, 0x02, 0x8e, 0x63, + 0xd1, 0x10, 0xc9, 0xa2, 0x1c, 0x4b, 0xe1, 0xdc, 0x93, 0x13, 0x93, 0xa4, 0x64, 0xb7, 0xe2, 0x23, + 0x0c, 0x17, 0x12, 0x50, 0x92, 0x0a, 0x47, 0x83, 0xed, 0x61, 0xea, 0x67, 0xaa, 0x04, 0xc6, 0xff, + 0x93, 0x89, 0x0e, 0x60, 0xf2, 0x2e, 0x8c, 0x8b, 0x15, 0xa3, 0xcc, 0x0b, 0xdc, 0x41, 0xe5, 0xf2, + 0x8a, 0x8d, 0xac, 0x8a, 0xce, 0xee, 0xfd, 0xa5, 0xf2, 0xaa, 0x32, 0x37, 0xf0, 0xde, 0x6f, 0xd7, + 0x9b, 0x71, 0x2a, 0x89, 0xc6, 0x26, 0xc1, 0xe6, 0x6a, 0x4d, 0xef, 0x15, 0x9c, 0x04, 0x41, 0xd3, + 0x4f, 0xe9, 0x06, 0x05, 0xf9, 0xc9, 0x1b, 0xfe, 0x3f, 0x65, 0xd2, 0xce, 0x79, 0xb2, 0x04, 0x93, + 0xdb, 0xae, 0x77, 0x80, 0xe3, 0xab, 0x74, 0x02, 0x8e, 0xfc, 0xa1, 0x2c, 0x88, 0x37, 0x48, 0x27, + 0x51, 0xbf, 0x4d, 0xe9, 0x0d, 0xfd, 0xdb, 0x62, 0x1c, 0x34, 0x02, 0x36, 0x0e, 0x21, 0xc7, 0x70, + 0x75, 0xe0, 0x38, 0x44, 0x9f, 0xa0, 0x4d, 0x61, 0x15, 0xdd, 0xf8, 0x2f, 0x32, 0xea, 0x79, 0xce, + 0x3a, 0xb9, 0xe2, 0xb6, 0x6c, 0xa7, 0xad, 0x34, 0x87, 0x3f, 0x2c, 0x21, 0x34, 0xfe, 0x25, 0x0a, + 0x32, 0xb9, 0x05, 0x79, 0xfe, 0x2b, 0xdc, 0x6b, 0x51, 0xab, 0x25, 0x08, 0xf5, 0x83, 0x42, 0x22, + 0x26, 0x46, 0x26, 0x77, 0xd6, 0x91, 0xf9, 0xed, 0x8c, 0x7a, 0x14, 0x7f, 0xdc, 0xc3, 0x26, 0x76, + 0xc8, 0x64, 0xcf, 0x72, 0xc8, 0x3c, 0x71, 0x13, 0xbe, 0x2f, 0x03, 0xe3, 0x8a, 0x96, 0x82, 0xb5, + 0x61, 0xc3, 0x73, 0x3f, 0xa2, 0xf5, 0x40, 0x6f, 0x43, 0x87, 0x03, 0x63, 0x6d, 0x08, 0x51, 0x9f, + 0xa0, 0x0d, 0xc6, 0x9f, 0x67, 0xc4, 0x1d, 0x69, 0xe0, 0x6d, 0x5e, 0xdf, 0x92, 0xb3, 0x67, 0x39, + 0x22, 0xbf, 0x00, 0xc3, 0x26, 0x6d, 0x38, 0xbe, 0xb8, 0xdf, 0xcc, 0xa8, 0xf7, 0x31, 0x2c, 0x88, + 0xe4, 0x26, 0x8f, 0xfd, 0x54, 0xcf, 0x37, 0x2c, 0x67, 0x82, 0x6c, 0xd5, 0xbf, 0xd3, 0xa4, 0x8f, + 0x1d, 0xbe, 0x18, 0xc5, 0x51, 0x8b, 0xc7, 0x9b, 0xe3, 0x5b, 0xbb, 0xac, 0x44, 0x48, 0xd4, 0xea, + 0xc2, 0xd3, 0x68, 0x8c, 0x0f, 0x01, 0xa2, 0x2a, 0xc9, 0x7d, 0x28, 0x88, 0xd9, 0xe0, 0xb4, 0xf7, + 0xb8, 0x20, 0x25, 0xfa, 0xa0, 0x78, 0x72, 0x5c, 0x7c, 0xbe, 0x1e, 0x96, 0x09, 0xa9, 0x53, 0xe1, + 0x9b, 0x20, 0x34, 0xfe, 0xfd, 0x2c, 0x64, 0x4b, 0x38, 0x20, 0xf7, 0xe9, 0x51, 0x60, 0xef, 0xdc, + 0x71, 0x9a, 0xda, 0x62, 0x3a, 0x40, 0xa8, 0xb5, 0xeb, 0x68, 0xea, 0x0a, 0x05, 0x99, 0x2d, 0xa6, + 0xfb, 0xde, 0xce, 0x5b, 0x48, 0xa8, 0x2c, 0xa6, 0x03, 0x6f, 0xe7, 0xad, 0x38, 0x59, 0x88, 0x48, + 0x0c, 0x18, 0xe1, 0x0b, 0x4b, 0xcc, 0x41, 0x38, 0x39, 0x2e, 0x8e, 0xf0, 0xf5, 0x67, 0x8a, 0x12, + 0x72, 0x11, 0x72, 0xb5, 0x8d, 0x75, 0xb1, 0x03, 0xa2, 0x5a, 0xd0, 0xef, 0xb4, 0x4d, 0x06, 0x63, + 0x75, 0xae, 0x56, 0x4a, 0x1b, 0xa8, 0x08, 0x18, 0x8e, 0xea, 0x6c, 0x36, 0xec, 0x4e, 0x5c, 0x15, + 0x10, 0x22, 0x92, 0xf7, 0x60, 0xfc, 0x7e, 0xa5, 0xbc, 0xe2, 0xfa, 0x7c, 0xf7, 0x1a, 0x89, 0x26, + 0xff, 0x41, 0xa3, 0x6e, 0xa1, 0x26, 0x3e, 0x7e, 0x0c, 0x28, 0xf8, 0xc6, 0x0f, 0x66, 0x61, 0x5c, + 0xd1, 0x93, 0x91, 0xcf, 0x88, 0x07, 0xd2, 0x8c, 0x76, 0x03, 0x50, 0x30, 0x58, 0x29, 0x57, 0xaa, + 0xb4, 0xdc, 0x06, 0x15, 0xcf, 0xa5, 0x91, 0x02, 0x23, 0x3b, 0x88, 0x02, 0xe3, 0x6d, 0x00, 0x3e, + 0x07, 0xf0, 0x93, 0x15, 0x71, 0x42, 0xb1, 0x93, 0x50, 0xc7, 0x25, 0x42, 0x26, 0x0f, 0x61, 0x76, + 0xd3, 0xeb, 0xfa, 0x41, 0xed, 0xc8, 0x0f, 0x68, 0x8b, 0x71, 0xdb, 0x70, 0xdd, 0xa6, 0x98, 0x7f, + 0xaf, 0x9c, 0x1c, 0x17, 0x2f, 0xa3, 0x71, 0x87, 0xe5, 0x63, 0x39, 0x7e, 0x80, 0xd5, 0x71, 0x5d, + 0x55, 0xad, 0x91, 0xc6, 0xc0, 0x30, 0x61, 0x42, 0x55, 0x8a, 0xb0, 0x93, 0x45, 0x3c, 0x26, 0x09, + 0x55, 0xb7, 0x72, 0xb2, 0x88, 0xaf, 0x4c, 0x3e, 0x6e, 0xe9, 0x24, 0xc6, 0x67, 0x54, 0x85, 0xdc, + 0xa0, 0x0b, 0xdb, 0xf8, 0x5b, 0x99, 0x68, 0x1b, 0x79, 0x78, 0x93, 0xbc, 0x03, 0x23, 0xfc, 0xf1, + 0x4e, 0xbc, 0x71, 0x9e, 0x0b, 0x2f, 0xb5, 0xea, 0xcb, 0x1e, 0xd7, 0x84, 0xff, 0x11, 0x7f, 0xe0, + 0x7f, 0xce, 0x14, 0x24, 0xa1, 0x12, 0x5d, 0xd7, 0xa7, 0x49, 0xee, 0xa8, 0x2e, 0xbe, 0x99, 0xa6, + 0x44, 0x37, 0x7e, 0x77, 0x08, 0xa6, 0x74, 0x34, 0xf5, 0x85, 0x2f, 0x33, 0xd0, 0x0b, 0xdf, 0x17, + 0x20, 0xcf, 0xfa, 0xc3, 0xa9, 0x53, 0x29, 0x91, 0xbd, 0x82, 0x4f, 0x0b, 0x02, 0xa6, 0xbd, 0x5c, + 0x03, 0x1f, 0x0e, 0x76, 0xc7, 0x35, 0x43, 0x2a, 0xb2, 0xa8, 0x3c, 0x43, 0xe5, 0x22, 0x21, 0x45, + 0x3e, 0x43, 0xa9, 0xeb, 0x21, 0x7c, 0x90, 0x7a, 0x13, 0x46, 0x98, 0x7c, 0x1f, 0xaa, 0x60, 0xf0, + 0x2b, 0x99, 0xe8, 0x1f, 0x33, 0x51, 0xe1, 0x48, 0x64, 0x1b, 0xf2, 0xab, 0xb6, 0x1f, 0xd4, 0x28, + 0x6d, 0x0f, 0xf0, 0x76, 0x5f, 0x14, 0x5d, 0x35, 0x8b, 0x0f, 0xe3, 0x3e, 0xa5, 0xed, 0xd8, 0xe3, + 0x6b, 0xc8, 0x8c, 0x7c, 0x15, 0xa0, 0xec, 0xb6, 0x03, 0xcf, 0x6d, 0xae, 0xba, 0x7b, 0xf3, 0x23, + 0x78, 0xf7, 0xbd, 0x14, 0x1b, 0x80, 0x08, 0x81, 0x5f, 0x7f, 0x43, 0x05, 0x4f, 0x9d, 0x17, 0x58, + 0x4d, 0x77, 0x4f, 0x5d, 0x07, 0x11, 0x3e, 0xb9, 0x03, 0x05, 0xa9, 0x58, 0xd8, 0xea, 0xec, 0x79, + 0x38, 0x41, 0x46, 0x23, 0xc9, 0x83, 0x3e, 0x0e, 0xac, 0xae, 0x80, 0xab, 0x3b, 0x65, 0x9c, 0x86, + 0x7c, 0x05, 0x2e, 0xc4, 0x61, 0x72, 0x94, 0xf3, 0x91, 0x4c, 0xae, 0xb2, 0x4b, 0x99, 0xf7, 0xbd, + 0x58, 0x18, 0xdf, 0xc9, 0xc2, 0x85, 0x1e, 0x8d, 0x65, 0xeb, 0x01, 0x8f, 0x6b, 0x65, 0x3d, 0xc4, + 0x4e, 0x69, 0x6e, 0x73, 0x74, 0x19, 0xb2, 0xe2, 0x80, 0x1b, 0x5a, 0x2a, 0x9c, 0x1c, 0x17, 0x27, + 0xb4, 0x71, 0xcc, 0x56, 0x2b, 0xe4, 0x1e, 0x0c, 0xb1, 0x21, 0x1a, 0xe0, 0xe9, 0x5c, 0xea, 0x94, + 0xa6, 0x02, 0x47, 0x9d, 0x3e, 0x38, 0x74, 0xc8, 0x83, 0x7c, 0x06, 0x72, 0x9b, 0x9b, 0xab, 0x38, + 0x77, 0x72, 0xd8, 0xf6, 0xc9, 0x20, 0x68, 0x6a, 0x53, 0x75, 0x92, 0xd1, 0x5e, 0x0f, 0x2d, 0x2d, + 0x18, 0x3a, 0xf9, 0x52, 0xcc, 0xa4, 0xe7, 0xf5, 0xfe, 0x03, 0x3d, 0xb8, 0x85, 0xcf, 0x13, 0x18, + 0xd6, 0x18, 0x3f, 0x97, 0x8d, 0xd6, 0xf0, 0x1d, 0xa7, 0x19, 0x50, 0x8f, 0x2c, 0xf0, 0x25, 0x19, + 0x09, 0x67, 0x66, 0xf8, 0x9b, 0xcc, 0x47, 0xeb, 0x9b, 0xb3, 0x0a, 0x17, 0xf2, 0xeb, 0xca, 0x42, + 0xce, 0xe1, 0x42, 0x9e, 0xea, 0xb9, 0x64, 0x5f, 0x4f, 0x99, 0x97, 0xb8, 0x10, 0x53, 0xe6, 0xde, + 0x2b, 0x30, 0xb9, 0xee, 0x2e, 0x3f, 0x0e, 0x42, 0x44, 0xb6, 0x00, 0xf3, 0xa6, 0x0e, 0x64, 0x1c, + 0x1f, 0x34, 0x1b, 0xd4, 0xdb, 0xdc, 0xb7, 0xdb, 0xda, 0xdb, 0xb5, 0x99, 0x80, 0x33, 0xdc, 0x75, + 0x7a, 0xa8, 0xe3, 0x8e, 0x72, 0xdc, 0x38, 0xdc, 0xf8, 0xfe, 0xac, 0xec, 0x8c, 0x87, 0x8b, 0xcf, + 0xe8, 0x1b, 0xe9, 0x5b, 0xda, 0x1b, 0xe9, 0x6c, 0xa8, 0xdd, 0x0d, 0x1f, 0xfc, 0x17, 0x4f, 0xb1, + 0x13, 0xf8, 0x9f, 0x87, 0x61, 0x42, 0x45, 0x67, 0xfd, 0x50, 0x6a, 0x34, 0x3c, 0xb5, 0x1f, 0xec, + 0x46, 0xc3, 0x33, 0x11, 0xaa, 0x99, 0x05, 0xe4, 0xfa, 0x9a, 0x05, 0x7c, 0x0d, 0xc6, 0xca, 0xad, + 0x86, 0xf6, 0x58, 0x69, 0xa4, 0x7c, 0xde, 0xf5, 0x10, 0x89, 0xaf, 0x85, 0x50, 0x69, 0x59, 0x6f, + 0x35, 0x92, 0x4f, 0x94, 0x11, 0x4b, 0xcd, 0xa2, 0x60, 0xf8, 0x49, 0x2c, 0x0a, 0x6e, 0xc3, 0xd8, + 0x96, 0x4f, 0x37, 0xbb, 0xed, 0x36, 0x6d, 0xe2, 0xb4, 0xca, 0x73, 0x59, 0xbf, 0xeb, 0x53, 0x2b, + 0x40, 0xa8, 0xfa, 0x01, 0x21, 0xaa, 0x3a, 0xc0, 0xa3, 0x7d, 0x06, 0xf8, 0x16, 0xe4, 0x37, 0x28, + 0xf5, 0xb0, 0x4f, 0xc7, 0x23, 0x91, 0xae, 0x43, 0xa9, 0x67, 0xb1, 0x8e, 0xd5, 0x2c, 0x0d, 0x04, + 0xa2, 0x66, 0x9e, 0x30, 0x31, 0xa0, 0x79, 0x02, 0x79, 0x09, 0x26, 0x3a, 0xdd, 0x9d, 0xa6, 0x53, + 0x47, 0xbe, 0xc2, 0xae, 0xc1, 0x1c, 0xe7, 0x30, 0xc6, 0xd6, 0x27, 0x5f, 0x82, 0x49, 0xbc, 0xe3, + 0x84, 0x53, 0x6e, 0x4a, 0x7b, 0xd5, 0xd3, 0xca, 0xb8, 0xa4, 0x53, 0x67, 0x20, 0x2b, 0xc5, 0xfc, + 0x46, 0x67, 0xb4, 0x50, 0x83, 0x29, 0x7d, 0x24, 0x9f, 0xc2, 0xe3, 0x5e, 0x68, 0x6a, 0x91, 0x2f, + 0x8c, 0xdd, 0x1b, 0xca, 0x43, 0x61, 0x9c, 0x1b, 0x59, 0x98, 0xb0, 0x11, 0xb6, 0xc9, 0x24, 0xf7, + 0xbb, 0x3b, 0xd4, 0x6b, 0xd3, 0x80, 0xfa, 0xe2, 0x12, 0xe0, 0x9b, 0x43, 0xa5, 0x4e, 0xc7, 0x37, + 0xfe, 0xe3, 0x2c, 0x8c, 0x96, 0xb6, 0x6b, 0xd5, 0xf6, 0xae, 0x8b, 0x4f, 0x74, 0xe1, 0xcb, 0x8c, + 0xfa, 0x44, 0x17, 0xbe, 0xcc, 0xa8, 0xef, 0x31, 0x37, 0x52, 0xae, 0x71, 0x68, 0xc5, 0xab, 0x5c, + 0xe3, 0xb4, 0x0b, 0x68, 0xf4, 0x48, 0x95, 0x1b, 0xe0, 0x91, 0x2a, 0xd4, 0x23, 0x0e, 0x9d, 0xae, + 0x47, 0x7c, 0x07, 0xc6, 0xab, 0xed, 0x80, 0xee, 0x79, 0xd1, 0x4c, 0x0f, 0xaf, 0x94, 0x21, 0x58, + 0x15, 0xed, 0x15, 0x6c, 0x36, 0x8d, 0xb8, 0xee, 0x32, 0xd4, 0x59, 0xe2, 0x34, 0xe2, 0x2a, 0xce, + 0x98, 0x3e, 0x40, 0x22, 0x1a, 0x95, 0xd8, 0x1c, 0x91, 0x86, 0x00, 0x5c, 0xf8, 0x9c, 0x8a, 0x94, + 0xf7, 0xac, 0x63, 0x97, 0x66, 0xd2, 0x0d, 0x01, 0x8c, 0x1f, 0xca, 0xc2, 0x78, 0xa9, 0xd3, 0x79, + 0xc6, 0xcd, 0xb1, 0x3e, 0xa7, 0x6d, 0xaf, 0xf2, 0x2e, 0x14, 0xb6, 0x6b, 0x20, 0x4b, 0xac, 0x5f, + 0xc9, 0xc2, 0x74, 0x8c, 0x42, 0xfd, 0xfa, 0xcc, 0x80, 0x46, 0x58, 0xd9, 0x01, 0x8d, 0xb0, 0x72, + 0x83, 0x19, 0x61, 0x0d, 0x3d, 0xc9, 0x96, 0xf9, 0x1a, 0xe4, 0x4a, 0x9d, 0x4e, 0xfc, 0x31, 0xb7, + 0xd3, 0x79, 0x78, 0x8b, 0xdf, 0x67, 0xed, 0x4e, 0xc7, 0x64, 0x18, 0xda, 0x3e, 0x36, 0x32, 0xe0, + 0x3e, 0x66, 0xbc, 0x09, 0x63, 0xc8, 0x0b, 0x4d, 0x9f, 0x2e, 0x03, 0x2e, 0x66, 0x61, 0xf5, 0xa4, + 0xd5, 0x25, 0x96, 0xf9, 0xbf, 0xc8, 0xc0, 0x30, 0xfe, 0x7e, 0x46, 0xe7, 0xd8, 0xa2, 0x36, 0xc7, + 0x0a, 0xca, 0x1c, 0x1b, 0x64, 0x76, 0xfd, 0xa3, 0x1c, 0x40, 0xf9, 0x81, 0x59, 0xe3, 0x6a, 0x0f, + 0x72, 0x07, 0xa6, 0xed, 0x66, 0xd3, 0x3d, 0xa4, 0x0d, 0xcb, 0xf5, 0x9c, 0x3d, 0xa7, 0xcd, 0x7b, + 0x4e, 0xbe, 0x30, 0xea, 0x45, 0xea, 0xbb, 0x83, 0x28, 0x7a, 0xc0, 0x4b, 0x54, 0x3e, 0x2d, 0x1a, + 0xec, 0xbb, 0x0d, 0x79, 0x81, 0xd3, 0xf8, 0x88, 0xa2, 0x14, 0x3e, 0x6b, 0xbc, 0x44, 0xe5, 0xb3, + 0x8f, 0x17, 0x52, 0x29, 0x3f, 0x6a, 0x7c, 0x44, 0x51, 0x0a, 0x1f, 0x7e, 0x8b, 0xf5, 0xc9, 0x2a, + 0xcc, 0x20, 0xc4, 0xaa, 0x7b, 0xb4, 0x41, 0xdb, 0x81, 0x63, 0x37, 0x7d, 0x71, 0xe5, 0x47, 0xe5, + 0x50, 0xa2, 0x50, 0xbd, 0xf2, 0x60, 0x61, 0x39, 0x2a, 0x23, 0xd7, 0x61, 0xb4, 0x65, 0x3f, 0xb6, + 0xec, 0x3d, 0xfe, 0xd6, 0x3e, 0xc9, 0xaf, 0x88, 0x02, 0xa4, 0x6e, 0xd8, 0x2d, 0xfb, 0x71, 0x69, + 0x8f, 0xb2, 0x56, 0xd0, 0xc7, 0x1d, 0xd7, 0x57, 0x5a, 0x31, 0x12, 0xb5, 0x22, 0x56, 0xa4, 0xb6, + 0x42, 0x14, 0x89, 0x56, 0x18, 0xbf, 0x9c, 0x81, 0xe7, 0xab, 0xf8, 0x15, 0xc1, 0x51, 0x99, 0xb6, + 0x03, 0xea, 0x6d, 0x50, 0xaf, 0xe5, 0xe0, 0xcb, 0x63, 0x8d, 0x06, 0xe4, 0x65, 0xc8, 0x95, 0xcc, + 0x75, 0x31, 0x7f, 0xf9, 0xce, 0xaa, 0xbd, 0x03, 0xb3, 0xd2, 0x50, 0x8b, 0x90, 0x3d, 0x45, 0x3d, + 0x58, 0x82, 0x89, 0x92, 0xef, 0x3b, 0x7b, 0xed, 0x16, 0xb7, 0x61, 0xcf, 0x69, 0x2f, 0xcd, 0x02, + 0x9e, 0xd0, 0x6b, 0xab, 0x24, 0xc6, 0x7f, 0x92, 0x81, 0x99, 0x52, 0xa7, 0xa3, 0x7f, 0xb2, 0x6e, + 0xe5, 0x90, 0x19, 0xdc, 0xca, 0xc1, 0x81, 0x29, 0xad, 0xb9, 0x7c, 0x4a, 0x45, 0x62, 0x61, 0x9f, + 0x9e, 0xe1, 0x9f, 0xdd, 0x09, 0x41, 0x96, 0xaf, 0x3f, 0xd1, 0xc5, 0x18, 0x1b, 0xff, 0xf6, 0x28, + 0xee, 0x21, 0x62, 0xb7, 0x15, 0x76, 0x78, 0x99, 0x14, 0x3b, 0xbc, 0xb7, 0x41, 0x91, 0x25, 0x54, + 0x1d, 0xaa, 0x22, 0x49, 0xa9, 0xf7, 0xef, 0x08, 0x99, 0x1c, 0xc4, 0x2d, 0xf2, 0x72, 0xd8, 0x9a, + 0x97, 0xe3, 0x0b, 0xf8, 0xa9, 0x18, 0xe3, 0xad, 0x00, 0xa9, 0xb6, 0xf1, 0xd9, 0x90, 0xd6, 0x0e, + 0x9c, 0xce, 0x43, 0xea, 0x39, 0xbb, 0x47, 0x62, 0x01, 0x60, 0xe7, 0x3b, 0xa2, 0xd4, 0xf2, 0x0f, + 0x9c, 0x0e, 0xbb, 0xa0, 0x3b, 0xbb, 0x47, 0x66, 0x0a, 0x0d, 0xf9, 0x00, 0x46, 0x4d, 0x7a, 0xe8, + 0x39, 0x81, 0xb4, 0x33, 0x99, 0x0a, 0xd5, 0x49, 0x08, 0xe5, 0x6b, 0xc1, 0xe3, 0x3f, 0xd4, 0x5d, + 0x51, 0x94, 0x93, 0x45, 0x2e, 0x0e, 0x70, 0x7b, 0x92, 0xc9, 0xa8, 0xb5, 0xa5, 0xed, 0x5a, 0x2f, + 0x69, 0x80, 0x5c, 0x83, 0x61, 0x94, 0x29, 0x84, 0xa4, 0x8c, 0xfe, 0x19, 0x28, 0x59, 0xaa, 0x02, + 0x0f, 0x62, 0x90, 0x4b, 0x00, 0xe1, 0xbb, 0x9c, 0x3f, 0x9f, 0x47, 0x19, 0x56, 0x81, 0xc4, 0x05, + 0xa2, 0xb1, 0x33, 0x09, 0x44, 0xab, 0x50, 0x30, 0xb9, 0xab, 0x57, 0xa3, 0xd4, 0xc1, 0xc7, 0x1f, + 0x7f, 0x1e, 0x70, 0x25, 0x5f, 0x3e, 0x39, 0x2e, 0xbe, 0x20, 0xdc, 0xc0, 0x1a, 0x96, 0xdd, 0xe1, + 0x6f, 0x46, 0xda, 0x36, 0x12, 0xa7, 0x24, 0x6f, 0xc3, 0x10, 0xdb, 0x7a, 0x85, 0xed, 0x9e, 0x54, + 0xa2, 0x47, 0xbb, 0x31, 0x5f, 0x9c, 0x75, 0x57, 0xdb, 0x13, 0x90, 0x84, 0x58, 0x30, 0xa5, 0x4f, + 0x77, 0x61, 0xc6, 0x31, 0x1f, 0xf5, 0xa7, 0x5e, 0x2e, 0x34, 0xeb, 0x02, 0x66, 0xd5, 0x11, 0xa8, + 0xae, 0x80, 0xd8, 0x22, 0x5d, 0x86, 0xfc, 0x66, 0x79, 0x63, 0xc3, 0xf5, 0x02, 0x7e, 0x11, 0x88, + 0x4e, 0x16, 0x06, 0x33, 0xed, 0xf6, 0x1e, 0xe5, 0x67, 0x71, 0x50, 0xef, 0x58, 0x1d, 0x86, 0xa6, + 0x9e, 0xc5, 0x92, 0xf4, 0x93, 0xb3, 0xdb, 0xfb, 0x95, 0x2c, 0xbc, 0x1c, 0x4a, 0x45, 0x0f, 0xbc, + 0x5a, 0x69, 0x6d, 0xb5, 0xda, 0xd8, 0x10, 0x4a, 0x84, 0x0d, 0xcf, 0x7d, 0xe4, 0x34, 0xa8, 0xf7, + 0xf0, 0xe6, 0x29, 0x67, 0xfa, 0x2a, 0x5f, 0xe6, 0xfc, 0x05, 0x22, 0xab, 0x59, 0x38, 0x29, 0xc2, + 0xa7, 0xd8, 0x9e, 0x3a, 0x9d, 0xc4, 0x83, 0xc4, 0xca, 0x73, 0x66, 0xc4, 0x80, 0xfc, 0xad, 0x0c, + 0x9c, 0x4f, 0xff, 0x10, 0xa1, 0x58, 0x2a, 0xca, 0x0b, 0x6c, 0x8f, 0xaf, 0x5d, 0x7a, 0xed, 0xe4, + 0xb8, 0xf8, 0xb2, 0x6f, 0xb7, 0x9a, 0x96, 0xd3, 0xe0, 0xb5, 0x39, 0x75, 0x6a, 0x75, 0x04, 0x82, + 0x56, 0x6f, 0x8f, 0x9a, 0x3e, 0x0f, 0xf2, 0x68, 0x9f, 0xcf, 0x2c, 0x01, 0xe4, 0xa5, 0x92, 0xd7, + 0xf8, 0xf5, 0x0c, 0x28, 0x4b, 0x30, 0x6f, 0xd2, 0x86, 0xe3, 0xd1, 0x7a, 0x20, 0x8e, 0x77, 0xe1, + 0x9f, 0xc5, 0x61, 0x31, 0x83, 0x36, 0x84, 0x91, 0xf7, 0x61, 0x54, 0x1c, 0x43, 0x62, 0xdb, 0x95, + 0x4b, 0x57, 0xa8, 0x8f, 0xb9, 0x23, 0x5f, 0xe2, 0x08, 0x93, 0x44, 0x6c, 0xd7, 0xbf, 0xb7, 0xbd, + 0x59, 0x6e, 0xda, 0x4e, 0xcb, 0x17, 0x67, 0x09, 0x76, 0xeb, 0x47, 0x87, 0x81, 0x55, 0x47, 0xa8, + 0xba, 0xeb, 0x87, 0xa8, 0xc6, 0x5d, 0xa9, 0xbd, 0x3e, 0xc5, 0x2a, 0xb3, 0x08, 0xc3, 0x0f, 0x23, + 0x2d, 0xd6, 0xd2, 0xd8, 0xc9, 0x71, 0x91, 0x4f, 0x17, 0x93, 0xc3, 0x8d, 0x2f, 0xc3, 0x58, 0x38, + 0x75, 0x19, 0x2f, 0xf6, 0x03, 0x79, 0x4d, 0x72, 0x5e, 0x6c, 0x12, 0x9b, 0x08, 0x65, 0xa2, 0xde, + 0x72, 0xbb, 0x81, 0x08, 0x59, 0x44, 0xc0, 0xee, 0xa1, 0xed, 0x06, 0xce, 0x74, 0xb5, 0x75, 0x02, + 0xcd, 0xf8, 0x91, 0x0c, 0x4c, 0xe9, 0x93, 0x95, 0x5c, 0x87, 0x11, 0xe1, 0x78, 0x95, 0x41, 0x55, 0x20, 0xe3, 0x31, 0xc2, 0x5d, 0xae, 0x34, 0x47, 0x2b, 0x81, 0xc5, 0xa4, 0x45, 0xc1, 0x41, 0x88, 0x4a, 0x28, 0x2d, 0xd6, 0x39, 0xc8, 0x94, 0x65, 0xc4, 0x60, 0x57, 0x45, 0xbf, 0xdb, 0x0c, 0xd4, 0x17, 0x22, 0x0f, 0x21, 0xa6, 0x28, 0x31, 0xca, 0x30, 0xc2, 0x37, 0xd4, 0x98, 0xa9, 0x59, 0xe6, @@ -21812,1556 +21947,1567 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x4f, 0x9a, 0x12, 0x15, 0x4f, 0x48, 0xcf, 0x79, 0x64, 0x07, 0x94, 0x11, 0x66, 0x91, 0x90, 0x9f, 0x90, 0x1c, 0x1a, 0xa3, 0x54, 0x90, 0xc9, 0x57, 0x61, 0x2a, 0xfa, 0x15, 0x3e, 0xcc, 0x4e, 0x85, 0xbb, 0x83, 0x5e, 0xb8, 0x74, 0xe9, 0xe4, 0xb8, 0xb8, 0xa0, 0x70, 0x8d, 0x3f, 0xd9, 0xc6, 0x98, - 0x19, 0xbf, 0x94, 0x41, 0x73, 0x04, 0xf9, 0x81, 0x57, 0x60, 0x28, 0x34, 0xa0, 0x9d, 0x10, 0x5b, - 0xaf, 0xfe, 0xf8, 0x84, 0xe5, 0x4c, 0xc8, 0x8a, 0xbe, 0x04, 0x0f, 0x2c, 0xfd, 0x0b, 0x58, 0x29, - 0xb9, 0x0b, 0xa3, 0x03, 0xb5, 0x19, 0x27, 0x56, 0x4a, 0x5b, 0x25, 0x35, 0x8e, 0xc2, 0xbd, 0xed, - 0xcd, 0x4f, 0xee, 0x28, 0xfc, 0x64, 0x16, 0xa6, 0x59, 0xbf, 0x96, 0xba, 0xc1, 0xbe, 0xeb, 0x39, - 0xc1, 0xd1, 0x53, 0xab, 0x4b, 0x7d, 0x5b, 0xbb, 0x88, 0x2d, 0xc8, 0x23, 0x4c, 0xfd, 0xb6, 0x81, - 0x54, 0xaa, 0xff, 0xdd, 0x30, 0xcc, 0xa6, 0x50, 0x91, 0xd7, 0xb4, 0xe7, 0x8e, 0x79, 0xe9, 0x58, - 0xfd, 0xdd, 0xe3, 0xe2, 0x84, 0x44, 0xdf, 0x8c, 0x1c, 0xad, 0x17, 0x75, 0xdb, 0x1e, 0xde, 0x53, - 0xf8, 0xfa, 0xa1, 0xda, 0xf6, 0xe8, 0x16, 0x3d, 0xd7, 0x60, 0xd8, 0x74, 0x9b, 0x54, 0xda, 0xb3, - 0xa1, 0x98, 0xe5, 0x31, 0x80, 0xf6, 0x7e, 0xcf, 0x00, 0x64, 0x05, 0x46, 0xd9, 0x1f, 0x6b, 0x76, - 0x47, 0xbc, 0x4c, 0x91, 0x50, 0x15, 0x80, 0xd0, 0x8e, 0xd3, 0xde, 0x53, 0xb5, 0x01, 0x4d, 0x6a, - 0xb5, 0xec, 0x8e, 0x26, 0x0f, 0x72, 0x44, 0x4d, 0xab, 0x90, 0xef, 0xad, 0x55, 0xc8, 0x9c, 0xaa, - 0x55, 0xd8, 0x05, 0xa8, 0x39, 0x7b, 0x6d, 0xa7, 0xbd, 0x57, 0x6a, 0xee, 0x09, 0xf7, 0xf4, 0x6b, - 0xbd, 0x47, 0xe1, 0x7a, 0x84, 0x8c, 0x13, 0xf7, 0x59, 0x7c, 0x3e, 0xe6, 0x30, 0xcb, 0x6e, 0xee, - 0x69, 0x6e, 0x34, 0x0a, 0x67, 0xb2, 0x0e, 0x50, 0xaa, 0x07, 0xce, 0x23, 0x36, 0x85, 0x7d, 0x21, - 0xbc, 0xc9, 0x26, 0x97, 0x4b, 0xf7, 0xe9, 0x11, 0x5e, 0x38, 0xe4, 0x43, 0x9c, 0x8d, 0xa8, 0x6c, - 0x25, 0x68, 0x3e, 0x12, 0x11, 0x07, 0xd2, 0x81, 0x73, 0xa5, 0x46, 0xc3, 0x61, 0xdf, 0x60, 0x37, - 0x37, 0x79, 0x60, 0x01, 0x64, 0x3d, 0x91, 0xce, 0xfa, 0x9a, 0x60, 0xfd, 0x82, 0x1d, 0x52, 0x59, - 0x32, 0x1e, 0x41, 0xac, 0x9a, 0x74, 0xc6, 0x46, 0x0d, 0xa6, 0xf4, 0x8f, 0xd7, 0xdd, 0xea, 0x27, - 0x20, 0x6f, 0xd6, 0x4a, 0x56, 0x6d, 0xa5, 0x74, 0xb3, 0x90, 0x21, 0x05, 0x98, 0x10, 0xbf, 0x16, - 0xad, 0xc5, 0x37, 0x6e, 0x17, 0xb2, 0x1a, 0xe4, 0x8d, 0x9b, 0x8b, 0x85, 0xdc, 0x42, 0x76, 0x3e, - 0x13, 0xf3, 0x68, 0x1b, 0x2d, 0xe4, 0xb9, 0xca, 0xd5, 0xf8, 0xb5, 0x0c, 0xe4, 0x65, 0xdb, 0xc9, - 0x6d, 0xc8, 0xd5, 0x6a, 0x2b, 0x31, 0x1f, 0xb4, 0xe8, 0x94, 0xe1, 0xfb, 0xa9, 0xef, 0xab, 0x86, - 0xc6, 0x8c, 0x80, 0xd1, 0x6d, 0xae, 0xd6, 0x84, 0xe4, 0x21, 0xe9, 0xa2, 0xcd, 0x9b, 0xd3, 0xa5, - 0x38, 0xe6, 0xdc, 0x86, 0xdc, 0xbd, 0xed, 0x4d, 0x71, 0xb5, 0x92, 0x74, 0xd1, 0x7e, 0xca, 0xe9, - 0x3e, 0x38, 0x54, 0x77, 0x79, 0x46, 0x60, 0x98, 0x30, 0xae, 0x4c, 0x64, 0x7e, 0xe8, 0xb6, 0xdc, - 0xd0, 0x97, 0x5c, 0x1c, 0xba, 0x0c, 0x62, 0x8a, 0x12, 0x26, 0x80, 0xac, 0xba, 0x75, 0xbb, 0x29, - 0x4e, 0x6f, 0x14, 0x40, 0x9a, 0x0c, 0x60, 0x72, 0xb8, 0xf1, 0x3b, 0x19, 0x28, 0xa0, 0x98, 0x86, - 0x86, 0xc2, 0xee, 0x01, 0x6d, 0x3f, 0xbc, 0x49, 0x5e, 0x97, 0x4b, 0x2e, 0x13, 0xaa, 0xb7, 0x86, - 0x71, 0xc9, 0xc5, 0xde, 0xc7, 0xc4, 0xb2, 0x53, 0xdc, 0xf5, 0xb3, 0x83, 0xbb, 0xf9, 0x9e, 0xe2, - 0xae, 0x5f, 0x84, 0x61, 0x6c, 0x8e, 0xd8, 0x1c, 0xb1, 0xe5, 0x01, 0x03, 0x98, 0x1c, 0xae, 0xec, - 0x4d, 0x3f, 0x9d, 0x4d, 0x7c, 0xc3, 0xe2, 0x27, 0xca, 0x55, 0x56, 0xff, 0xb8, 0x81, 0xf6, 0xeb, - 0xf7, 0x61, 0x2e, 0xde, 0x25, 0xa8, 0x7a, 0x2c, 0xc1, 0xb4, 0x0e, 0x97, 0x5a, 0xc8, 0x0b, 0xa9, - 0x75, 0x3d, 0x5c, 0x34, 0xe3, 0xf8, 0xc6, 0xff, 0x91, 0x81, 0x31, 0xfc, 0xd3, 0xec, 0x36, 0xd1, + 0x19, 0xbf, 0x98, 0x41, 0x73, 0x04, 0xd9, 0xc0, 0x2b, 0x30, 0x14, 0x1a, 0xd0, 0x4e, 0x88, 0xad, + 0x57, 0x7f, 0x7c, 0xc2, 0x72, 0x26, 0x64, 0x45, 0x2d, 0xc1, 0x03, 0x4b, 0x6f, 0x01, 0x2b, 0x25, + 0x77, 0x61, 0x74, 0xa0, 0x6f, 0xc6, 0x89, 0x95, 0xf2, 0xad, 0x92, 0x1a, 0x47, 0xe1, 0xde, 0xf6, + 0xe6, 0x77, 0xef, 0x28, 0xfc, 0x78, 0x16, 0xa6, 0x59, 0xbf, 0x96, 0xba, 0xc1, 0xbe, 0xeb, 0x39, + 0xc1, 0xd1, 0x33, 0xab, 0x4b, 0x7d, 0x57, 0xbb, 0x88, 0x2d, 0xc8, 0x23, 0x4c, 0x6d, 0xdb, 0x40, + 0x2a, 0xd5, 0xff, 0x76, 0x18, 0x66, 0x53, 0xa8, 0xc8, 0x1b, 0xda, 0x73, 0xc7, 0xbc, 0x74, 0xac, + 0xfe, 0xce, 0x71, 0x71, 0x42, 0xa2, 0x6f, 0x46, 0x8e, 0xd6, 0x8b, 0xba, 0x6d, 0x0f, 0xef, 0x29, + 0x7c, 0xfd, 0x50, 0x6d, 0x7b, 0x74, 0x8b, 0x9e, 0x6b, 0x30, 0x6c, 0xba, 0x4d, 0x2a, 0xed, 0xd9, + 0x50, 0xcc, 0xf2, 0x18, 0x40, 0x7b, 0xbf, 0x67, 0x00, 0xb2, 0x02, 0xa3, 0xec, 0x8f, 0x35, 0xbb, + 0x23, 0x5e, 0xa6, 0x48, 0xa8, 0x0a, 0x40, 0x68, 0xc7, 0x69, 0xef, 0xa9, 0xda, 0x80, 0x26, 0xb5, + 0x5a, 0x76, 0x47, 0x93, 0x07, 0x39, 0xa2, 0xa6, 0x55, 0xc8, 0xf7, 0xd6, 0x2a, 0x64, 0x4e, 0xd5, + 0x2a, 0xec, 0x02, 0xd4, 0x9c, 0xbd, 0xb6, 0xd3, 0xde, 0x2b, 0x35, 0xf7, 0x84, 0x7b, 0xfa, 0xb5, + 0xde, 0xa3, 0x70, 0x3d, 0x42, 0xc6, 0x89, 0xfb, 0x3c, 0x3e, 0x1f, 0x73, 0x98, 0x65, 0x37, 0xf7, + 0x34, 0x37, 0x1a, 0x85, 0x33, 0x59, 0x07, 0x28, 0xd5, 0x03, 0xe7, 0x11, 0x9b, 0xc2, 0xbe, 0x10, + 0xde, 0xe4, 0x27, 0x97, 0x4b, 0xf7, 0xe9, 0x11, 0x5e, 0x38, 0xe4, 0x43, 0x9c, 0x8d, 0xa8, 0x6c, + 0x25, 0x68, 0x3e, 0x12, 0x11, 0x07, 0xd2, 0x81, 0x73, 0xa5, 0x46, 0xc3, 0x61, 0x6d, 0xb0, 0x9b, + 0x9b, 0x3c, 0xb0, 0x00, 0xb2, 0x9e, 0x48, 0x67, 0x7d, 0x4d, 0xb0, 0x7e, 0xc9, 0x0e, 0xa9, 0x2c, + 0x19, 0x8f, 0x20, 0x56, 0x4d, 0x3a, 0x63, 0xa3, 0x06, 0x53, 0x7a, 0xe3, 0x75, 0xb7, 0xfa, 0x09, + 0xc8, 0x9b, 0xb5, 0x92, 0x55, 0x5b, 0x29, 0xdd, 0x2c, 0x64, 0x48, 0x01, 0x26, 0xc4, 0xaf, 0x45, + 0x6b, 0xf1, 0xad, 0xdb, 0x85, 0xac, 0x06, 0x79, 0xeb, 0xe6, 0x62, 0x21, 0xb7, 0x90, 0x9d, 0xcf, + 0xc4, 0x3c, 0xda, 0x46, 0x0b, 0x79, 0xae, 0x72, 0x35, 0x7e, 0x35, 0x03, 0x79, 0xf9, 0xed, 0xe4, + 0x36, 0xe4, 0x6a, 0xb5, 0x95, 0x98, 0x0f, 0x5a, 0x74, 0xca, 0xf0, 0xfd, 0xd4, 0xf7, 0x55, 0x43, + 0x63, 0x46, 0xc0, 0xe8, 0x36, 0x57, 0x6b, 0x42, 0xf2, 0x90, 0x74, 0xd1, 0xe6, 0xcd, 0xe9, 0x52, + 0x1c, 0x73, 0x6e, 0x43, 0xee, 0xde, 0xf6, 0xa6, 0xb8, 0x5a, 0x49, 0xba, 0x68, 0x3f, 0xe5, 0x74, + 0x1f, 0x1d, 0xaa, 0xbb, 0x3c, 0x23, 0x30, 0x4c, 0x18, 0x57, 0x26, 0x32, 0x3f, 0x74, 0x5b, 0x6e, + 0xe8, 0x4b, 0x2e, 0x0e, 0x5d, 0x06, 0x31, 0x45, 0x09, 0x13, 0x40, 0x56, 0xdd, 0xba, 0xdd, 0x14, + 0xa7, 0x37, 0x0a, 0x20, 0x4d, 0x06, 0x30, 0x39, 0xdc, 0xf8, 0x9d, 0x0c, 0x14, 0x50, 0x4c, 0x43, + 0x43, 0x61, 0xf7, 0x80, 0xb6, 0x1f, 0xde, 0x24, 0x6f, 0xca, 0x25, 0x97, 0x09, 0xd5, 0x5b, 0xc3, + 0xb8, 0xe4, 0x62, 0xef, 0x63, 0x62, 0xd9, 0x29, 0xee, 0xfa, 0xd9, 0xc1, 0xdd, 0x7c, 0x4f, 0x71, + 0xd7, 0x2f, 0xc2, 0x30, 0x7e, 0x8e, 0xd8, 0x1c, 0xf1, 0xcb, 0x03, 0x06, 0x30, 0x39, 0x5c, 0xd9, + 0x9b, 0x7e, 0x32, 0x9b, 0x68, 0xc3, 0xe2, 0x77, 0x95, 0xab, 0xac, 0xde, 0xb8, 0x81, 0xf6, 0xeb, + 0x0f, 0x61, 0x2e, 0xde, 0x25, 0xa8, 0x7a, 0x2c, 0xc1, 0xb4, 0x0e, 0x97, 0x5a, 0xc8, 0x0b, 0xa9, + 0x75, 0x3d, 0x5c, 0x34, 0xe3, 0xf8, 0xc6, 0xff, 0x9e, 0x81, 0x31, 0xfc, 0xd3, 0xec, 0x36, 0xd1, 0x60, 0xab, 0xb4, 0x5d, 0x13, 0x0a, 0x11, 0x55, 0x98, 0xb3, 0x0f, 0x7d, 0x4b, 0x68, 0x4f, 0xb4, 0x3d, 0x26, 0x44, 0x16, 0xa4, 0xfc, 0xfd, 0x40, 0xaa, 0xe2, 0x42, 0x52, 0xfe, 0xd0, 0xe0, 0xc7, 0x48, 0x05, 0x32, 0x9a, 0x79, 0x6e, 0xd7, 0xd8, 0xf4, 0x53, 0x2d, 0x28, 0x90, 0xce, 0x6d, 0xea, - 0x66, 0x9e, 0x1c, 0x0d, 0x0d, 0x28, 0xb6, 0x6b, 0x25, 0x73, 0x5d, 0x33, 0xa0, 0x60, 0x6d, 0xd4, - 0xb4, 0x51, 0x02, 0xc9, 0xf8, 0xf9, 0xf1, 0x78, 0x07, 0x8a, 0x03, 0xef, 0x8c, 0x6b, 0xe3, 0x2d, - 0x18, 0x2e, 0x35, 0x9b, 0xee, 0xa1, 0xd8, 0x25, 0xe4, 0x7d, 0x35, 0xec, 0x3f, 0x7e, 0x9e, 0xa1, - 0x32, 0x4f, 0x73, 0xff, 0x63, 0x00, 0x52, 0x86, 0xb1, 0xd2, 0x76, 0xad, 0x5a, 0xad, 0x6c, 0x6e, - 0x72, 0x57, 0xa7, 0xdc, 0xd2, 0xcb, 0xb2, 0x7f, 0x1c, 0xa7, 0x61, 0xc5, 0xdf, 0xf0, 0x23, 0xf9, - 0x3d, 0xa2, 0x23, 0xef, 0x00, 0xdc, 0x73, 0x9d, 0x36, 0x57, 0x5e, 0x8a, 0x8f, 0x67, 0xf7, 0xee, - 0xf1, 0x0f, 0x5c, 0xa7, 0x2d, 0xb4, 0x9d, 0xac, 0xed, 0x11, 0x92, 0xa9, 0xfc, 0xcd, 0x7a, 0x7a, - 0xc9, 0xe5, 0x46, 0x58, 0xc3, 0x51, 0x4f, 0xef, 0xb8, 0x09, 0x2d, 0x9b, 0x44, 0x23, 0x2d, 0x98, - 0xae, 0x75, 0xf7, 0xf6, 0x28, 0xdb, 0xd9, 0x85, 0x16, 0x69, 0x44, 0x5c, 0xa0, 0xc3, 0x00, 0x33, - 0xfc, 0x3e, 0xc2, 0xae, 0x40, 0xfe, 0xd2, 0x6b, 0x6c, 0x22, 0x7f, 0xe7, 0xb8, 0x28, 0x6c, 0x03, - 0x98, 0xa8, 0xe6, 0x4b, 0xfa, 0xa4, 0x0e, 0x29, 0xce, 0x9b, 0x3c, 0x80, 0x91, 0xbb, 0x4e, 0xb0, - 0xd2, 0xdd, 0x11, 0xae, 0x3b, 0x2f, 0xf4, 0x59, 0x34, 0x1c, 0x91, 0x3f, 0x4e, 0xed, 0x39, 0xc1, - 0x7e, 0x57, 0x75, 0x9e, 0x10, 0x6c, 0xc8, 0x36, 0xe4, 0xcb, 0x8e, 0x57, 0x6f, 0xd2, 0x72, 0x55, - 0x9c, 0xfd, 0x2f, 0xf6, 0x61, 0x29, 0x51, 0x79, 0xbf, 0xd4, 0xf1, 0x57, 0xdd, 0x51, 0x65, 0x01, - 0x89, 0x41, 0xfe, 0xed, 0x0c, 0x3c, 0x1b, 0xb6, 0xbe, 0xb4, 0x47, 0xdb, 0xc1, 0x9a, 0x1d, 0xd4, - 0xf7, 0xa9, 0x27, 0x7a, 0x69, 0xac, 0x5f, 0x2f, 0x7d, 0x3e, 0xd1, 0x4b, 0x57, 0xa3, 0x5e, 0xb2, - 0x19, 0x33, 0xab, 0xc5, 0xb9, 0x25, 0xfb, 0xac, 0x5f, 0xad, 0xc4, 0x02, 0x88, 0x5e, 0x1b, 0x85, - 0xeb, 0xe7, 0xcb, 0x7d, 0x3e, 0x38, 0x42, 0x16, 0x2e, 0x1b, 0xe1, 0x6f, 0xcd, 0xe6, 0x30, 0x84, - 0x92, 0xfb, 0xd2, 0x4f, 0x8e, 0x4b, 0x25, 0x97, 0xfb, 0xf0, 0xe6, 0xbe, 0x73, 0xb3, 0x7d, 0x3c, - 0x62, 0xf9, 0x68, 0xaf, 0xda, 0x3b, 0x42, 0x10, 0x39, 0x65, 0xb4, 0x57, 0xed, 0x68, 0xb4, 0x9b, - 0x76, 0x7c, 0xb4, 0x57, 0xed, 0x1d, 0x52, 0xe6, 0xce, 0xbd, 0xdc, 0x13, 0xf4, 0x52, 0x3f, 0x6e, - 0xe5, 0x0d, 0x7e, 0x32, 0xa7, 0x38, 0xf9, 0x7e, 0x19, 0xc6, 0x6a, 0x1d, 0xbb, 0x4e, 0x9b, 0xce, - 0x6e, 0x20, 0x9e, 0x9f, 0x5f, 0xea, 0xc3, 0x2a, 0xc4, 0x15, 0x4f, 0x97, 0xf2, 0xa7, 0x7a, 0x4d, - 0x0a, 0x71, 0x58, 0x0b, 0x37, 0x37, 0xd6, 0xe6, 0xa7, 0x4f, 0x6d, 0xe1, 0xe6, 0xc6, 0x9a, 0x90, - 0x39, 0x3a, 0x2d, 0x4d, 0xe6, 0xd8, 0x58, 0x23, 0x1d, 0x98, 0xda, 0xa4, 0x9e, 0x67, 0xef, 0xba, - 0x5e, 0x8b, 0x6b, 0x2d, 0xb9, 0x77, 0xd1, 0xb5, 0x7e, 0xfc, 0x34, 0x02, 0xae, 0xac, 0x0b, 0x24, - 0xcc, 0x8a, 0xab, 0x3a, 0x63, 0xfc, 0x59, 0x9f, 0x2c, 0x39, 0xc1, 0x4e, 0xb7, 0x7e, 0x40, 0x83, - 0xf9, 0x99, 0x53, 0xfb, 0x24, 0xc4, 0xe5, 0x7d, 0xb2, 0x23, 0x7f, 0xaa, 0x7d, 0x12, 0xe2, 0x18, - 0xbf, 0x99, 0x83, 0x0b, 0x3d, 0xba, 0x80, 0xac, 0xcb, 0x2d, 0x37, 0xa3, 0xe9, 0xae, 0x7b, 0xa0, - 0x5f, 0x3f, 0x75, 0x17, 0x5e, 0x85, 0xc2, 0xf2, 0x7d, 0x94, 0xd5, 0xf9, 0xf3, 0x4d, 0xb9, 0x24, - 0x0f, 0x2b, 0xd4, 0xaf, 0xd2, 0x03, 0xb4, 0xc6, 0x94, 0xcf, 0x3e, 0x75, 0xcd, 0xed, 0x38, 0x41, - 0xb9, 0xf0, 0xfd, 0x59, 0x18, 0xc2, 0x83, 0x33, 0x16, 0x6c, 0x29, 0x73, 0xa6, 0x60, 0x4b, 0x5f, - 0x80, 0x89, 0xe5, 0xfb, 0xfc, 0x26, 0xbd, 0x62, 0xfb, 0xfb, 0x62, 0x5b, 0x47, 0xe3, 0x06, 0x7a, - 0x60, 0x89, 0x8b, 0xf7, 0xbe, 0xad, 0xc9, 0xac, 0x1a, 0x05, 0xd9, 0x82, 0x59, 0xde, 0x36, 0x67, - 0xd7, 0xa9, 0xf3, 0x98, 0x2d, 0x8e, 0xdd, 0x14, 0x7b, 0xfc, 0x8b, 0x27, 0xc7, 0xc5, 0x22, 0x3d, - 0x40, 0x3b, 0x53, 0x51, 0x6e, 0xf9, 0x88, 0xa0, 0x1a, 0x9c, 0xa6, 0xd0, 0xab, 0x81, 0x24, 0xcc, - 0x31, 0xac, 0x90, 0xd5, 0xc6, 0xea, 0x66, 0xb8, 0x1c, 0xc9, 0xf8, 0xf3, 0x61, 0x58, 0xe8, 0xbd, - 0x3d, 0x93, 0x2f, 0xea, 0x03, 0x78, 0xe5, 0xd4, 0x0d, 0xfd, 0xf4, 0x31, 0xfc, 0x12, 0xcc, 0x2d, - 0xb7, 0x03, 0xea, 0x75, 0x3c, 0x47, 0x86, 0x0e, 0x59, 0x71, 0x7d, 0x69, 0xd7, 0x8b, 0x06, 0xb6, - 0x34, 0x2c, 0x17, 0x1a, 0x55, 0xb4, 0x32, 0x56, 0x58, 0xa5, 0x72, 0x20, 0xcb, 0x30, 0xa5, 0xc0, - 0x9b, 0xdd, 0x3d, 0xf5, 0x4d, 0x4a, 0xe5, 0xd9, 0xec, 0xaa, 0x46, 0x8f, 0x31, 0x22, 0xb4, 0x1d, - 0x66, 0x57, 0xc6, 0xfa, 0xbd, 0xed, 0xfb, 0x35, 0x31, 0x9c, 0xdc, 0x76, 0x18, 0xa1, 0xd6, 0x07, - 0x87, 0x07, 0xda, 0xfe, 0x1a, 0x21, 0x2f, 0xfc, 0x52, 0x4e, 0xcc, 0xa8, 0x17, 0x21, 0x57, 0xeb, - 0xee, 0xa8, 0x2f, 0x6d, 0xbe, 0x76, 0xc0, 0xb1, 0x52, 0xf2, 0x39, 0x00, 0x93, 0x76, 0x5c, 0xdf, - 0x09, 0x5c, 0xef, 0x48, 0x75, 0x5e, 0xf3, 0x42, 0xa8, 0x6e, 0x5f, 0x2f, 0xa1, 0x64, 0x05, 0xa6, - 0xa3, 0x5f, 0x0f, 0x0e, 0xdb, 0x42, 0x83, 0x3c, 0xc6, 0xb5, 0x2b, 0x11, 0xb9, 0xe5, 0xb2, 0x32, - 0xf5, 0xc8, 0x8e, 0x91, 0x91, 0x45, 0xc8, 0x6f, 0xbb, 0xde, 0xc1, 0x2e, 0x1b, 0xe3, 0xa1, 0x48, - 0xa8, 0x38, 0x14, 0x30, 0xf5, 0xf0, 0x94, 0x78, 0x6c, 0xb9, 0x2c, 0xb7, 0x1f, 0x39, 0x9e, 0x8b, - 0xef, 0x78, 0xaa, 0xcd, 0x08, 0x8d, 0xc0, 0x9a, 0xdb, 0x70, 0x04, 0x26, 0xd7, 0x60, 0xb8, 0x54, - 0x0f, 0x5c, 0x4f, 0x18, 0x8c, 0xf0, 0x99, 0xc2, 0x00, 0xda, 0x4c, 0x61, 0x00, 0xd6, 0x89, 0x26, - 0xdd, 0x15, 0x6f, 0x3a, 0xd8, 0x89, 0x1e, 0xdd, 0xd5, 0x7c, 0xa2, 0xe9, 0x2e, 0x13, 0x8a, 0x4c, - 0xba, 0x8b, 0x8a, 0x0f, 0x2d, 0x94, 0xd8, 0x6e, 0x42, 0x65, 0x26, 0xd0, 0x8c, 0xdf, 0x1f, 0xeb, - 0x39, 0xe5, 0xd9, 0x29, 0x74, 0xb6, 0x29, 0xbf, 0x6a, 0x0f, 0x30, 0xe5, 0x5f, 0x0b, 0xad, 0xf6, - 0xd5, 0x40, 0x00, 0x08, 0x51, 0x8f, 0x41, 0x8e, 0xb3, 0xf0, 0xcb, 0xf9, 0xb3, 0x4c, 0x22, 0xd1, - 0x49, 0xd9, 0x41, 0x3b, 0x29, 0x37, 0x50, 0x27, 0x91, 0x25, 0x98, 0x0c, 0x83, 0xd1, 0x6d, 0xd8, - 0x81, 0xb6, 0xad, 0x85, 0x11, 0x04, 0xad, 0x8e, 0x1d, 0xa8, 0xdb, 0x9a, 0x4e, 0x42, 0xde, 0x86, - 0x71, 0xe1, 0xba, 0x82, 0x1c, 0x86, 0x23, 0xe3, 0x61, 0xe9, 0xe7, 0x12, 0xa3, 0x57, 0xd1, 0xd9, - 0x6a, 0xde, 0x70, 0x3a, 0xb4, 0xe9, 0xb4, 0x69, 0x0d, 0x9f, 0x28, 0xc4, 0x8c, 0xe1, 0x4f, 0xb5, - 0xa2, 0xc4, 0xe2, 0xaf, 0x17, 0x9a, 0xfe, 0x50, 0x23, 0x8a, 0x4f, 0xd6, 0xd1, 0x33, 0x4d, 0x56, - 0x6e, 0xbb, 0xe7, 0xad, 0xba, 0x7b, 0x8e, 0xb4, 0x56, 0x96, 0xb6, 0x7b, 0x9e, 0xd5, 0x64, 0xd0, - 0x98, 0xed, 0x1e, 0x47, 0x65, 0x37, 0x1c, 0xf6, 0xa3, 0x5a, 0x11, 0xef, 0x87, 0x78, 0xc3, 0x41, - 0x22, 0xdd, 0x44, 0x9c, 0x23, 0xc9, 0x6a, 0x96, 0x5b, 0xb6, 0xd3, 0x14, 0xfe, 0xde, 0x51, 0x35, - 0x94, 0x41, 0xe3, 0xd5, 0x20, 0x2a, 0xa9, 0xc3, 0x84, 0x49, 0x77, 0x37, 0x3c, 0x37, 0xa0, 0xf5, - 0x80, 0x36, 0x84, 0x54, 0x27, 0x2f, 0x36, 0x4b, 0xae, 0xcb, 0x25, 0xd6, 0xa5, 0xd7, 0x7f, 0xff, - 0xb8, 0x98, 0xf9, 0xce, 0x71, 0x11, 0x18, 0x88, 0xfb, 0x1f, 0x9c, 0x1c, 0x17, 0x2f, 0xb0, 0xf1, - 0xef, 0x48, 0x62, 0xf5, 0x74, 0x52, 0x99, 0x92, 0x6f, 0xb1, 0xfd, 0x3a, 0xec, 0x92, 0xa8, 0xb2, - 0x89, 0x1e, 0x95, 0xbd, 0x91, 0x5a, 0x59, 0x51, 0xe9, 0xed, 0xd4, 0x4a, 0x53, 0x2b, 0x21, 0xef, - 0xc0, 0x78, 0xb9, 0x5a, 0x76, 0xdb, 0xbb, 0xce, 0x5e, 0x6d, 0xa5, 0x84, 0xa2, 0xa1, 0xf0, 0x3d, - 0xa9, 0x3b, 0x56, 0x1d, 0xe1, 0x96, 0xbf, 0x6f, 0x6b, 0x2e, 0x88, 0x11, 0x3e, 0xb9, 0x0b, 0x53, - 0xf2, 0xa7, 0x49, 0x77, 0xb7, 0xcc, 0x2a, 0x4a, 0x84, 0xd2, 0xe1, 0x27, 0xe4, 0xc0, 0x3a, 0xa2, - 0xeb, 0xa9, 0x37, 0x85, 0x18, 0x19, 0x9b, 0x8c, 0x15, 0xda, 0x69, 0xba, 0x47, 0xac, 0x79, 0x9b, - 0x0e, 0xf5, 0x50, 0x06, 0x14, 0x93, 0xb1, 0x11, 0x96, 0x58, 0x81, 0xa3, 0xbf, 0x9a, 0xea, 0x44, - 0x64, 0x1d, 0x66, 0xc4, 0x14, 0x7f, 0xe8, 0xf8, 0xce, 0x8e, 0xd3, 0x74, 0x82, 0x23, 0x94, 0xfe, - 0x84, 0x00, 0x23, 0xd7, 0xc5, 0xa3, 0xb0, 0x54, 0x61, 0x96, 0x24, 0x35, 0x7e, 0x2d, 0x0b, 0xcf, - 0xf5, 0xbb, 0x09, 0x91, 0x9a, 0xbe, 0x99, 0x5d, 0x1d, 0xe0, 0xf6, 0x74, 0xfa, 0x76, 0xb6, 0x0c, - 0x53, 0x0f, 0xbc, 0x3d, 0xbb, 0xed, 0x7c, 0x13, 0x6f, 0xb8, 0xa1, 0x09, 0x23, 0x76, 0x86, 0xab, - 0x94, 0xe8, 0xb3, 0x3d, 0x46, 0xb4, 0xf0, 0x48, 0x6c, 0x73, 0x1f, 0xd6, 0x19, 0xee, 0x36, 0x8c, - 0x95, 0xdd, 0x76, 0x40, 0x1f, 0x07, 0x31, 0xd7, 0x6f, 0x0e, 0x8c, 0x3b, 0x02, 0x4a, 0x54, 0xe3, - 0x5f, 0x65, 0xe1, 0xf9, 0xbe, 0x57, 0x01, 0xb2, 0xa9, 0xf7, 0xda, 0xb5, 0x41, 0xee, 0x0f, 0xa7, - 0x77, 0xdb, 0x62, 0xc2, 0xda, 0xee, 0x54, 0x5f, 0x93, 0x85, 0xff, 0x21, 0x23, 0x3a, 0xe9, 0xd3, - 0x30, 0x8a, 0x55, 0x85, 0x5d, 0xc4, 0xb5, 0x64, 0xb8, 0x0b, 0x3b, 0xba, 0x96, 0x8c, 0xa3, 0x91, - 0x5b, 0x90, 0x2f, 0xdb, 0xcd, 0xa6, 0xe2, 0x18, 0x8f, 0xd2, 0x7c, 0x1d, 0x61, 0x31, 0xe3, 0x4c, - 0x89, 0xc8, 0x64, 0x1f, 0xfe, 0xb7, 0x72, 0x56, 0xe0, 0x66, 0x29, 0xc8, 0x62, 0xc7, 0x85, 0x82, - 0x8c, 0xe1, 0x34, 0xeb, 0x6e, 0xe8, 0x7a, 0xcb, 0xc3, 0x69, 0x32, 0x80, 0x16, 0x4e, 0x93, 0x01, - 0x8c, 0x5f, 0xcf, 0xc1, 0xa5, 0xfe, 0xf7, 0x59, 0xb2, 0xa5, 0x0f, 0xc1, 0xab, 0x03, 0xdd, 0x82, - 0x4f, 0x1f, 0x03, 0x19, 0x9c, 0x96, 0x77, 0xc8, 0xd5, 0xa4, 0x4b, 0xc8, 0x77, 0x8f, 0x8b, 0x8a, - 0xc5, 0xef, 0x3d, 0xd7, 0x69, 0x2b, 0x6f, 0x26, 0xdf, 0xd0, 0x24, 0x43, 0xfe, 0x66, 0x7f, 0x7b, - 0xb0, 0x96, 0x45, 0x74, 0x7c, 0x5f, 0x19, 0x54, 0xa2, 0xfc, 0x3c, 0x14, 0xe2, 0xa4, 0xe4, 0x0a, - 0x0c, 0x61, 0x03, 0x14, 0xbf, 0x96, 0x18, 0x07, 0x2c, 0x5f, 0x58, 0x13, 0x73, 0x07, 0x63, 0x05, - 0xa0, 0x15, 0x80, 0xae, 0x1b, 0x14, 0xb1, 0x02, 0xb8, 0x11, 0x41, 0x52, 0x3f, 0x18, 0x23, 0x32, - 0xfe, 0x32, 0x03, 0x17, 0x7b, 0x6a, 0x0a, 0xc8, 0x86, 0x3e, 0x60, 0x2f, 0x9f, 0xa6, 0x5a, 0x38, - 0x75, 0xac, 0x16, 0x7e, 0x5c, 0xce, 0xfd, 0x77, 0x61, 0xa2, 0xd6, 0xdd, 0x89, 0xdf, 0xcf, 0x78, - 0x24, 0x0f, 0x05, 0xae, 0x9e, 0x60, 0x2a, 0x3e, 0xfb, 0x7e, 0x69, 0xe6, 0x20, 0xcc, 0x7e, 0x14, - 0x5b, 0xc3, 0xd0, 0x99, 0x35, 0x19, 0x2b, 0x41, 0x27, 0x32, 0x7e, 0x35, 0x9b, 0x7e, 0xd1, 0xbd, - 0x5b, 0xde, 0x38, 0xcb, 0x45, 0xf7, 0x6e, 0x79, 0xe3, 0xf4, 0x6f, 0xff, 0x27, 0xf2, 0xdb, 0xf1, - 0x61, 0x56, 0xec, 0x78, 0x52, 0xd1, 0x29, 0x1e, 0x66, 0xe5, 0xee, 0xe8, 0xeb, 0x0f, 0xb3, 0x12, - 0x99, 0xbc, 0x01, 0x63, 0xab, 0x2e, 0x0f, 0x63, 0x20, 0xbf, 0x98, 0x7b, 0x7b, 0x4a, 0xa0, 0xba, - 0x3d, 0x86, 0x98, 0xec, 0x6e, 0xa1, 0x0f, 0xbc, 0x34, 0xa9, 0xc4, 0xbb, 0x45, 0x6c, 0xba, 0xe8, - 0xea, 0x40, 0x9d, 0xcc, 0xf8, 0x4f, 0x86, 0xc1, 0x38, 0x5d, 0x99, 0x41, 0xde, 0xd7, 0xfb, 0xee, - 0xfa, 0xc0, 0x6a, 0x90, 0x81, 0xb6, 0xdc, 0x52, 0xb7, 0xe1, 0xd0, 0x76, 0x5d, 0x8f, 0x41, 0x20, - 0x60, 0xea, 0x16, 0x28, 0xf1, 0x3e, 0x8c, 0x4b, 0xe0, 0xc2, 0x7f, 0x93, 0x8b, 0x96, 0x5a, 0xec, - 0x68, 0xcc, 0x7c, 0x88, 0xa3, 0x91, 0xdc, 0x87, 0x82, 0x0a, 0x51, 0x5e, 0x68, 0x51, 0x72, 0xd1, - 0x18, 0xc5, 0x1a, 0x95, 0x20, 0xd4, 0xcf, 0xd7, 0xdc, 0xe0, 0xe7, 0x6b, 0x24, 0xbe, 0x63, 0xfd, - 0x43, 0x49, 0xf1, 0x3d, 0xee, 0xf6, 0xab, 0xa0, 0xcb, 0x98, 0x05, 0xbe, 0x38, 0xb4, 0x86, 0xf5, - 0x98, 0x05, 0x29, 0x07, 0x97, 0x8a, 0x2e, 0xc3, 0x2e, 0xe0, 0x4f, 0xc5, 0xeb, 0x38, 0x0c, 0xbb, - 0xc0, 0xe9, 0xd3, 0xc2, 0x2e, 0x84, 0x24, 0xec, 0x00, 0x34, 0xbb, 0x6d, 0x1e, 0xb7, 0x79, 0x34, - 0x3a, 0x00, 0xbd, 0x6e, 0xdb, 0x8a, 0xc7, 0x6e, 0x0e, 0x11, 0x8d, 0x7f, 0x3c, 0x94, 0x2e, 0x1c, - 0x84, 0xfa, 0xae, 0xb3, 0x08, 0x07, 0x21, 0xd1, 0xc7, 0x33, 0x53, 0xb7, 0x60, 0x56, 0x5a, 0xe5, - 0x49, 0xf3, 0xae, 0x2d, 0x73, 0x55, 0x0c, 0x31, 0xea, 0x8d, 0x42, 0x7b, 0x3e, 0x69, 0x22, 0x66, - 0x75, 0x3d, 0x4d, 0x6f, 0x94, 0x42, 0xbf, 0xf0, 0x1b, 0x52, 0x2d, 0xa6, 0x0e, 0xc2, 0xd6, 0x56, - 0x38, 0x97, 0x63, 0x83, 0xd0, 0xed, 0x6a, 0xc3, 0xa8, 0x93, 0xf0, 0xbd, 0x57, 0xaa, 0x1c, 0x90, - 0x89, 0x22, 0x2b, 0x2a, 0x8a, 0x8a, 0x18, 0x97, 0x18, 0x11, 0xd9, 0x83, 0x8b, 0x91, 0x28, 0xad, - 0xdc, 0x14, 0x90, 0x23, 0xff, 0xe0, 0x6b, 0x27, 0xc7, 0xc5, 0x97, 0x15, 0x51, 0x5c, 0xbd, 0x70, - 0xc4, 0xb8, 0xf7, 0xe6, 0xc5, 0xf6, 0xdb, 0x25, 0xcf, 0x6e, 0xd7, 0xf7, 0x95, 0x39, 0x8f, 0xfb, - 0xed, 0x0e, 0x42, 0x13, 0x8e, 0xe3, 0x11, 0xb2, 0xf1, 0xe3, 0x59, 0x98, 0xe2, 0x67, 0x35, 0x7f, - 0x9d, 0x7b, 0x6a, 0x5f, 0x3e, 0xdf, 0xd2, 0x5e, 0x3e, 0x65, 0x8c, 0x33, 0xf5, 0xd3, 0x06, 0x7a, - 0xf7, 0xdc, 0x07, 0x92, 0xa4, 0x21, 0x26, 0x4c, 0xa8, 0xd0, 0xfe, 0x4f, 0x9e, 0x37, 0xa3, 0x70, - 0x78, 0x42, 0x54, 0xc2, 0x77, 0x67, 0xdf, 0xd4, 0x78, 0x18, 0x3f, 0x96, 0x85, 0x49, 0xc5, 0x4e, - 0xe5, 0xa9, 0xed, 0xf8, 0xcf, 0x6b, 0x1d, 0x3f, 0x1f, 0x7a, 0xcd, 0x85, 0x5f, 0x36, 0x50, 0xbf, - 0x77, 0x61, 0x26, 0x41, 0x12, 0x37, 0xf7, 0xc9, 0x0c, 0x62, 0xee, 0xf3, 0x5a, 0x32, 0xb6, 0x16, - 0x0f, 0x51, 0x1f, 0x46, 0x5a, 0x51, 0x83, 0x79, 0xfd, 0x64, 0x16, 0xe6, 0xc4, 0x2f, 0x0c, 0x46, - 0xc9, 0x85, 0xd5, 0xa7, 0x76, 0x2c, 0x4a, 0xda, 0x58, 0x14, 0xf5, 0xb1, 0x50, 0x3e, 0xb0, 0xf7, - 0x90, 0x18, 0x3f, 0x04, 0x30, 0xdf, 0x8b, 0x60, 0x60, 0xe7, 0xf4, 0xc8, 0xf5, 0x2f, 0x3b, 0x80, + 0x66, 0x9e, 0x1c, 0x0d, 0x0d, 0x28, 0xb6, 0x6b, 0x25, 0x73, 0x5d, 0x33, 0xa0, 0x60, 0xdf, 0xa8, + 0x69, 0xa3, 0x04, 0x92, 0xf1, 0x73, 0xe3, 0xf1, 0x0e, 0x14, 0x07, 0xde, 0x19, 0xd7, 0xc6, 0x3b, + 0x30, 0x5c, 0x6a, 0x36, 0xdd, 0x43, 0xb1, 0x4b, 0xc8, 0xfb, 0x6a, 0xd8, 0x7f, 0xfc, 0x3c, 0x43, + 0x65, 0x9e, 0xe6, 0xfe, 0xc7, 0x00, 0xa4, 0x0c, 0x63, 0xa5, 0xed, 0x5a, 0xb5, 0x5a, 0xd9, 0xdc, + 0xe4, 0xae, 0x4e, 0xb9, 0xa5, 0x57, 0x65, 0xff, 0x38, 0x4e, 0xc3, 0x8a, 0xbf, 0xe1, 0x47, 0xf2, + 0x7b, 0x44, 0x47, 0xde, 0x03, 0xb8, 0xe7, 0x3a, 0x6d, 0xae, 0xbc, 0x14, 0x8d, 0x67, 0xf7, 0xee, + 0xf1, 0x8f, 0x5c, 0xa7, 0x2d, 0xb4, 0x9d, 0xec, 0xdb, 0x23, 0x24, 0x53, 0xf9, 0x9b, 0xf5, 0xf4, + 0x92, 0xcb, 0x8d, 0xb0, 0x86, 0xa3, 0x9e, 0xde, 0x71, 0x13, 0x5a, 0x36, 0x89, 0x46, 0x5a, 0x30, + 0x5d, 0xeb, 0xee, 0xed, 0x51, 0xb6, 0xb3, 0x0b, 0x2d, 0xd2, 0x88, 0xb8, 0x40, 0x87, 0x01, 0x66, + 0xf8, 0x7d, 0x84, 0x5d, 0x81, 0xfc, 0xa5, 0x37, 0xd8, 0x44, 0xfe, 0xf6, 0x71, 0x51, 0xd8, 0x06, + 0x30, 0x51, 0xcd, 0x97, 0xf4, 0x49, 0x1d, 0x52, 0x9c, 0x37, 0x79, 0x00, 0x23, 0x77, 0x9d, 0x60, + 0xa5, 0xbb, 0x23, 0x5c, 0x77, 0x5e, 0xea, 0xb3, 0x68, 0x38, 0x22, 0x7f, 0x9c, 0xda, 0x73, 0x82, + 0xfd, 0xae, 0xea, 0x3c, 0x21, 0xd8, 0x90, 0x6d, 0xc8, 0x97, 0x1d, 0xaf, 0xde, 0xa4, 0xe5, 0xaa, + 0x38, 0xfb, 0x5f, 0xee, 0xc3, 0x52, 0xa2, 0xf2, 0x7e, 0xa9, 0xe3, 0xaf, 0xba, 0xa3, 0xca, 0x02, + 0x12, 0x83, 0xfc, 0x9b, 0x19, 0x78, 0x3e, 0xfc, 0xfa, 0xd2, 0x1e, 0x6d, 0x07, 0x6b, 0x76, 0x50, + 0xdf, 0xa7, 0x9e, 0xe8, 0xa5, 0xb1, 0x7e, 0xbd, 0xf4, 0xf9, 0x44, 0x2f, 0x5d, 0x8d, 0x7a, 0xc9, + 0x66, 0xcc, 0xac, 0x16, 0xe7, 0x96, 0xec, 0xb3, 0x7e, 0xb5, 0x12, 0x0b, 0x20, 0x7a, 0x6d, 0x14, + 0xae, 0x9f, 0xaf, 0xf6, 0x69, 0x70, 0x84, 0x2c, 0x5c, 0x36, 0xc2, 0xdf, 0x9a, 0xcd, 0x61, 0x08, + 0x25, 0xf7, 0xa5, 0x9f, 0x1c, 0x97, 0x4a, 0x2e, 0xf7, 0xe1, 0xcd, 0x7d, 0xe7, 0x66, 0xfb, 0x78, + 0xc4, 0xf2, 0xd1, 0x5e, 0xb5, 0x77, 0x84, 0x20, 0x72, 0xca, 0x68, 0xaf, 0xda, 0xd1, 0x68, 0x37, + 0xed, 0xf8, 0x68, 0xaf, 0xda, 0x3b, 0xa4, 0xcc, 0x9d, 0x7b, 0xb9, 0x27, 0xe8, 0xa5, 0x7e, 0xdc, + 0xca, 0x1b, 0xfc, 0x64, 0x4e, 0x71, 0xf2, 0xfd, 0x32, 0x8c, 0xd5, 0x3a, 0x76, 0x9d, 0x36, 0x9d, + 0xdd, 0x40, 0x3c, 0x3f, 0xbf, 0xd2, 0x87, 0x55, 0x88, 0x2b, 0x9e, 0x2e, 0xe5, 0x4f, 0xf5, 0x9a, + 0x14, 0xe2, 0xb0, 0x2f, 0xdc, 0xdc, 0x58, 0x9b, 0x9f, 0x3e, 0xf5, 0x0b, 0x37, 0x37, 0xd6, 0x84, + 0xcc, 0xd1, 0x69, 0x69, 0x32, 0xc7, 0xc6, 0x1a, 0xe9, 0xc0, 0xd4, 0x26, 0xf5, 0x3c, 0x7b, 0xd7, + 0xf5, 0x5a, 0x5c, 0x6b, 0xc9, 0xbd, 0x8b, 0xae, 0xf5, 0xe3, 0xa7, 0x11, 0x70, 0x65, 0x5d, 0x20, + 0x61, 0x56, 0x5c, 0xd5, 0x19, 0xe3, 0xcf, 0xfa, 0x64, 0xc9, 0x09, 0x76, 0xba, 0xf5, 0x03, 0x1a, + 0xcc, 0xcf, 0x9c, 0xda, 0x27, 0x21, 0x2e, 0xef, 0x93, 0x1d, 0xf9, 0x53, 0xed, 0x93, 0x10, 0xc7, + 0xf8, 0xcd, 0x1c, 0x5c, 0xe8, 0xd1, 0x05, 0x64, 0x5d, 0x6e, 0xb9, 0x19, 0x4d, 0x77, 0xdd, 0x03, + 0xfd, 0xfa, 0xa9, 0xbb, 0xf0, 0x2a, 0x14, 0x96, 0xef, 0xa3, 0xac, 0xce, 0x9f, 0x6f, 0xca, 0x25, + 0x79, 0x58, 0xa1, 0x7e, 0x95, 0x1e, 0xa0, 0x35, 0xa6, 0x7c, 0xf6, 0xa9, 0x6b, 0x6e, 0xc7, 0x09, + 0xca, 0x85, 0xef, 0xcf, 0xc2, 0x10, 0x1e, 0x9c, 0xb1, 0x60, 0x4b, 0x99, 0x33, 0x05, 0x5b, 0xfa, + 0x02, 0x4c, 0x2c, 0xdf, 0xe7, 0x37, 0xe9, 0x15, 0xdb, 0xdf, 0x17, 0xdb, 0x3a, 0x1a, 0x37, 0xd0, + 0x03, 0x4b, 0x5c, 0xbc, 0xf7, 0x6d, 0x4d, 0x66, 0xd5, 0x28, 0xc8, 0x16, 0xcc, 0xf2, 0x6f, 0x73, + 0x76, 0x9d, 0x3a, 0x8f, 0xd9, 0xe2, 0xd8, 0x4d, 0xb1, 0xc7, 0xbf, 0x7c, 0x72, 0x5c, 0x2c, 0xd2, + 0x03, 0xb4, 0x33, 0x15, 0xe5, 0x96, 0x8f, 0x08, 0xaa, 0xc1, 0x69, 0x0a, 0xbd, 0x1a, 0x48, 0xc2, + 0x1c, 0xc3, 0x0a, 0x59, 0x6d, 0xac, 0x6e, 0x86, 0xcb, 0x91, 0x8c, 0x3f, 0x1b, 0x86, 0x85, 0xde, + 0xdb, 0x33, 0xf9, 0xa2, 0x3e, 0x80, 0x57, 0x4e, 0xdd, 0xd0, 0x4f, 0x1f, 0xc3, 0x2f, 0xc1, 0xdc, + 0x72, 0x3b, 0xa0, 0x5e, 0xc7, 0x73, 0x64, 0xe8, 0x90, 0x15, 0xd7, 0x97, 0x76, 0xbd, 0x68, 0x60, + 0x4b, 0xc3, 0x72, 0xa1, 0x51, 0x45, 0x2b, 0x63, 0x85, 0x55, 0x2a, 0x07, 0xb2, 0x0c, 0x53, 0x0a, + 0xbc, 0xd9, 0xdd, 0x53, 0xdf, 0xa4, 0x54, 0x9e, 0xcd, 0xae, 0x6a, 0xf4, 0x18, 0x23, 0x42, 0xdb, + 0x61, 0x76, 0x65, 0xac, 0xdf, 0xdb, 0xbe, 0x5f, 0x13, 0xc3, 0xc9, 0x6d, 0x87, 0x11, 0x6a, 0x7d, + 0x74, 0x78, 0xa0, 0xed, 0xaf, 0x11, 0xf2, 0xc2, 0x2f, 0xe6, 0xc4, 0x8c, 0x7a, 0x19, 0x72, 0xb5, + 0xee, 0x8e, 0xfa, 0xd2, 0xe6, 0x6b, 0x07, 0x1c, 0x2b, 0x25, 0x9f, 0x03, 0x30, 0x69, 0xc7, 0xf5, + 0x9d, 0xc0, 0xf5, 0x8e, 0x54, 0xe7, 0x35, 0x2f, 0x84, 0xea, 0xf6, 0xf5, 0x12, 0x4a, 0x56, 0x60, + 0x3a, 0xfa, 0xf5, 0xe0, 0xb0, 0x2d, 0x34, 0xc8, 0x63, 0x5c, 0xbb, 0x12, 0x91, 0x5b, 0x2e, 0x2b, + 0x53, 0x8f, 0xec, 0x18, 0x19, 0x59, 0x84, 0xfc, 0xb6, 0xeb, 0x1d, 0xec, 0xb2, 0x31, 0x1e, 0x8a, + 0x84, 0x8a, 0x43, 0x01, 0x53, 0x0f, 0x4f, 0x89, 0xc7, 0x96, 0xcb, 0x72, 0xfb, 0x91, 0xe3, 0xb9, + 0xf8, 0x8e, 0xa7, 0xda, 0x8c, 0xd0, 0x08, 0xac, 0xb9, 0x0d, 0x47, 0x60, 0x72, 0x0d, 0x86, 0x4b, + 0xf5, 0xc0, 0xf5, 0x84, 0xc1, 0x08, 0x9f, 0x29, 0x0c, 0xa0, 0xcd, 0x14, 0x06, 0x60, 0x9d, 0x68, + 0xd2, 0x5d, 0xf1, 0xa6, 0x83, 0x9d, 0xe8, 0xd1, 0x5d, 0xcd, 0x27, 0x9a, 0xee, 0x32, 0xa1, 0xc8, + 0xa4, 0xbb, 0xa8, 0xf8, 0xd0, 0x42, 0x89, 0xed, 0x26, 0x54, 0x66, 0x02, 0xcd, 0xf8, 0xfd, 0xb1, + 0x9e, 0x53, 0x9e, 0x9d, 0x42, 0x67, 0x9b, 0xf2, 0xab, 0xf6, 0x00, 0x53, 0xfe, 0x8d, 0xd0, 0x6a, + 0x5f, 0x0d, 0x04, 0x80, 0x10, 0xf5, 0x18, 0xe4, 0x38, 0x0b, 0xbf, 0x94, 0x3f, 0xcb, 0x24, 0x12, + 0x9d, 0x94, 0x1d, 0xb4, 0x93, 0x72, 0x03, 0x75, 0x12, 0x59, 0x82, 0xc9, 0x30, 0x18, 0xdd, 0x86, + 0x1d, 0x68, 0xdb, 0x5a, 0x18, 0x41, 0xd0, 0xea, 0xd8, 0x81, 0xba, 0xad, 0xe9, 0x24, 0xe4, 0x5d, + 0x18, 0x17, 0xae, 0x2b, 0xc8, 0x61, 0x38, 0x32, 0x1e, 0x96, 0x7e, 0x2e, 0x31, 0x7a, 0x15, 0x9d, + 0xad, 0xe6, 0x0d, 0xa7, 0x43, 0x9b, 0x4e, 0x9b, 0xd6, 0xf0, 0x89, 0x42, 0xcc, 0x18, 0xfe, 0x54, + 0x2b, 0x4a, 0x2c, 0xfe, 0x7a, 0xa1, 0xe9, 0x0f, 0x35, 0xa2, 0xf8, 0x64, 0x1d, 0x3d, 0xd3, 0x64, + 0xe5, 0xb6, 0x7b, 0xde, 0xaa, 0xbb, 0xe7, 0x48, 0x6b, 0x65, 0x69, 0xbb, 0xe7, 0x59, 0x4d, 0x06, + 0x8d, 0xd9, 0xee, 0x71, 0x54, 0x76, 0xc3, 0x61, 0x3f, 0xaa, 0x15, 0xf1, 0x7e, 0x88, 0x37, 0x1c, + 0x24, 0xd2, 0x4d, 0xc4, 0x39, 0x92, 0xac, 0x66, 0xb9, 0x65, 0x3b, 0x4d, 0xe1, 0xef, 0x1d, 0x55, + 0x43, 0x19, 0x34, 0x5e, 0x0d, 0xa2, 0x92, 0x3a, 0x4c, 0x98, 0x74, 0x77, 0xc3, 0x73, 0x03, 0x5a, + 0x0f, 0x68, 0x43, 0x48, 0x75, 0xf2, 0x62, 0xb3, 0xe4, 0xba, 0x5c, 0x62, 0x5d, 0x7a, 0xf3, 0xf7, + 0x8f, 0x8b, 0x99, 0x6f, 0x1f, 0x17, 0x81, 0x81, 0xb8, 0xff, 0xc1, 0xc9, 0x71, 0xf1, 0x02, 0x1b, + 0xff, 0x8e, 0x24, 0x56, 0x4f, 0x27, 0x95, 0x29, 0xf9, 0x16, 0xdb, 0xaf, 0xc3, 0x2e, 0x89, 0x2a, + 0x9b, 0xe8, 0x51, 0xd9, 0x5b, 0xa9, 0x95, 0x15, 0x95, 0xde, 0x4e, 0xad, 0x34, 0xb5, 0x12, 0xf2, + 0x1e, 0x8c, 0x97, 0xab, 0x65, 0xb7, 0xbd, 0xeb, 0xec, 0xd5, 0x56, 0x4a, 0x28, 0x1a, 0x0a, 0xdf, + 0x93, 0xba, 0x63, 0xd5, 0x11, 0x6e, 0xf9, 0xfb, 0xb6, 0xe6, 0x82, 0x18, 0xe1, 0x93, 0xbb, 0x30, + 0x25, 0x7f, 0x9a, 0x74, 0x77, 0xcb, 0xac, 0xa2, 0x44, 0x28, 0x1d, 0x7e, 0x42, 0x0e, 0xac, 0x23, + 0xba, 0x9e, 0x7a, 0x53, 0x88, 0x91, 0xb1, 0xc9, 0x58, 0xa1, 0x9d, 0xa6, 0x7b, 0xc4, 0x3e, 0x6f, + 0xd3, 0xa1, 0x1e, 0xca, 0x80, 0x62, 0x32, 0x36, 0xc2, 0x12, 0x2b, 0x70, 0xf4, 0x57, 0x53, 0x9d, + 0x88, 0xac, 0xc3, 0x8c, 0x98, 0xe2, 0x0f, 0x1d, 0xdf, 0xd9, 0x71, 0x9a, 0x4e, 0x70, 0x84, 0xd2, + 0x9f, 0x10, 0x60, 0xe4, 0xba, 0x78, 0x14, 0x96, 0x2a, 0xcc, 0x92, 0xa4, 0xc6, 0xaf, 0x66, 0xe1, + 0x85, 0x7e, 0x37, 0x21, 0x52, 0xd3, 0x37, 0xb3, 0xab, 0x03, 0xdc, 0x9e, 0x4e, 0xdf, 0xce, 0x96, + 0x61, 0xea, 0x81, 0xb7, 0x67, 0xb7, 0x9d, 0x6f, 0xe2, 0x0d, 0x37, 0x34, 0x61, 0xc4, 0xce, 0x70, + 0x95, 0x12, 0x7d, 0xb6, 0xc7, 0x88, 0x16, 0x1e, 0x89, 0x6d, 0xee, 0xe3, 0x3a, 0xc3, 0xdd, 0x86, + 0xb1, 0xb2, 0xdb, 0x0e, 0xe8, 0xe3, 0x20, 0xe6, 0xfa, 0xcd, 0x81, 0x71, 0x47, 0x40, 0x89, 0x6a, + 0xfc, 0xab, 0x2c, 0xbc, 0xd8, 0xf7, 0x2a, 0x40, 0x36, 0xf5, 0x5e, 0xbb, 0x36, 0xc8, 0xfd, 0xe1, + 0xf4, 0x6e, 0x5b, 0x4c, 0x58, 0xdb, 0x9d, 0xea, 0x6b, 0xb2, 0xf0, 0xdf, 0x67, 0x44, 0x27, 0x7d, + 0x1a, 0x46, 0xb1, 0xaa, 0xb0, 0x8b, 0xb8, 0x96, 0x0c, 0x77, 0x61, 0x47, 0xd7, 0x92, 0x71, 0x34, + 0x72, 0x0b, 0xf2, 0x65, 0xbb, 0xd9, 0x54, 0x1c, 0xe3, 0x51, 0x9a, 0xaf, 0x23, 0x2c, 0x66, 0x9c, + 0x29, 0x11, 0x99, 0xec, 0xc3, 0xff, 0x56, 0xce, 0x0a, 0xdc, 0x2c, 0x05, 0x59, 0xec, 0xb8, 0x50, + 0x90, 0x31, 0x9c, 0x66, 0xdd, 0x0d, 0x5d, 0x6f, 0x79, 0x38, 0x4d, 0x06, 0xd0, 0xc2, 0x69, 0x32, + 0x80, 0xf1, 0x6b, 0x39, 0xb8, 0xd4, 0xff, 0x3e, 0x4b, 0xb6, 0xf4, 0x21, 0x78, 0x7d, 0xa0, 0x5b, + 0xf0, 0xe9, 0x63, 0x20, 0x83, 0xd3, 0xf2, 0x0e, 0xb9, 0x9a, 0x74, 0x09, 0xf9, 0xce, 0x71, 0x51, + 0xb1, 0xf8, 0xbd, 0xe7, 0x3a, 0x6d, 0xe5, 0xcd, 0xe4, 0x1b, 0x9a, 0x64, 0xc8, 0xdf, 0xec, 0x6f, + 0x0f, 0xf6, 0x65, 0x11, 0x1d, 0xdf, 0x57, 0x06, 0x95, 0x28, 0x3f, 0x0f, 0x85, 0x38, 0x29, 0xb9, + 0x02, 0x43, 0xf8, 0x01, 0x8a, 0x5f, 0x4b, 0x8c, 0x03, 0x96, 0x2f, 0xac, 0x89, 0xb9, 0x83, 0xb1, + 0x02, 0xd0, 0x0a, 0x40, 0xd7, 0x0d, 0x8a, 0x58, 0x01, 0xdc, 0x88, 0x20, 0xa9, 0x1f, 0x8c, 0x11, + 0x19, 0x7f, 0x91, 0x81, 0x8b, 0x3d, 0x35, 0x05, 0x64, 0x43, 0x1f, 0xb0, 0x57, 0x4f, 0x53, 0x2d, + 0x9c, 0x3a, 0x56, 0x0b, 0x3f, 0x2a, 0xe7, 0xfe, 0xfb, 0x30, 0x51, 0xeb, 0xee, 0xc4, 0xef, 0x67, + 0x3c, 0x92, 0x87, 0x02, 0x57, 0x4f, 0x30, 0x15, 0x9f, 0xb5, 0x5f, 0x9a, 0x39, 0x08, 0xb3, 0x1f, + 0xc5, 0xd6, 0x30, 0x74, 0x66, 0x4d, 0xc6, 0x4a, 0xd0, 0x89, 0x8c, 0x5f, 0xc9, 0xa6, 0x5f, 0x74, + 0xef, 0x96, 0x37, 0xce, 0x72, 0xd1, 0xbd, 0x5b, 0xde, 0x38, 0xbd, 0xed, 0xff, 0x58, 0xb6, 0x1d, + 0x1f, 0x66, 0xc5, 0x8e, 0x27, 0x15, 0x9d, 0xe2, 0x61, 0x56, 0xee, 0x8e, 0xbe, 0xfe, 0x30, 0x2b, + 0x91, 0xc9, 0x5b, 0x30, 0xb6, 0xea, 0xf2, 0x30, 0x06, 0xb2, 0xc5, 0xdc, 0xdb, 0x53, 0x02, 0xd5, + 0xed, 0x31, 0xc4, 0x64, 0x77, 0x0b, 0x7d, 0xe0, 0xa5, 0x49, 0x25, 0xde, 0x2d, 0x62, 0xd3, 0x45, + 0x57, 0x07, 0xea, 0x64, 0xc6, 0x7f, 0x34, 0x0c, 0xc6, 0xe9, 0xca, 0x0c, 0xf2, 0xa1, 0xde, 0x77, + 0xd7, 0x07, 0x56, 0x83, 0x0c, 0xb4, 0xe5, 0x96, 0xba, 0x0d, 0x87, 0xb6, 0xeb, 0x7a, 0x0c, 0x02, + 0x01, 0x53, 0xb7, 0x40, 0x89, 0xf7, 0x71, 0x5c, 0x02, 0x17, 0xfe, 0xeb, 0x5c, 0xb4, 0xd4, 0x62, + 0x47, 0x63, 0xe6, 0x63, 0x1c, 0x8d, 0xe4, 0x3e, 0x14, 0x54, 0x88, 0xf2, 0x42, 0x8b, 0x92, 0x8b, + 0xc6, 0x28, 0xf6, 0x51, 0x09, 0x42, 0xfd, 0x7c, 0xcd, 0x0d, 0x7e, 0xbe, 0x46, 0xe2, 0x3b, 0xd6, + 0x3f, 0x94, 0x14, 0xdf, 0xe3, 0x6e, 0xbf, 0x0a, 0xba, 0x8c, 0x59, 0xe0, 0x8b, 0x43, 0x6b, 0x58, + 0x8f, 0x59, 0x90, 0x72, 0x70, 0xa9, 0xe8, 0x32, 0xec, 0x02, 0xfe, 0x54, 0xbc, 0x8e, 0xc3, 0xb0, + 0x0b, 0x9c, 0x3e, 0x2d, 0xec, 0x42, 0x48, 0xc2, 0x0e, 0x40, 0xb3, 0xdb, 0xe6, 0x71, 0x9b, 0x47, + 0xa3, 0x03, 0xd0, 0xeb, 0xb6, 0xad, 0x78, 0xec, 0xe6, 0x10, 0xd1, 0xf8, 0x8d, 0xa1, 0x74, 0xe1, + 0x20, 0xd4, 0x77, 0x9d, 0x45, 0x38, 0x08, 0x89, 0x3e, 0x99, 0x99, 0xba, 0x05, 0xb3, 0xd2, 0x2a, + 0x4f, 0x9a, 0x77, 0x6d, 0x99, 0xab, 0x62, 0x88, 0x51, 0x6f, 0x14, 0xda, 0xf3, 0x49, 0x13, 0x31, + 0xab, 0xeb, 0x69, 0x7a, 0xa3, 0x14, 0xfa, 0x85, 0x5f, 0x97, 0x6a, 0x31, 0x75, 0x10, 0xb6, 0xb6, + 0xc2, 0xb9, 0x1c, 0x1b, 0x84, 0x6e, 0x57, 0x1b, 0x46, 0x9d, 0x84, 0xef, 0xbd, 0x52, 0xe5, 0x80, + 0x4c, 0x14, 0x59, 0x51, 0x51, 0x54, 0xc4, 0xb8, 0xc4, 0x88, 0xc8, 0x1e, 0x5c, 0x8c, 0x44, 0x69, + 0xe5, 0xa6, 0x80, 0x1c, 0x79, 0x83, 0xaf, 0x9d, 0x1c, 0x17, 0x5f, 0x55, 0x44, 0x71, 0xf5, 0xc2, + 0x11, 0xe3, 0xde, 0x9b, 0x17, 0xdb, 0x6f, 0x97, 0x3c, 0xbb, 0x5d, 0xdf, 0x57, 0xe6, 0x3c, 0xee, + 0xb7, 0x3b, 0x08, 0x4d, 0x38, 0x8e, 0x47, 0xc8, 0xc6, 0x8f, 0x66, 0x61, 0x8a, 0x9f, 0xd5, 0xfc, + 0x75, 0xee, 0x99, 0x7d, 0xf9, 0x7c, 0x47, 0x7b, 0xf9, 0x94, 0x31, 0xce, 0xd4, 0xa6, 0x0d, 0xf4, + 0xee, 0xb9, 0x0f, 0x24, 0x49, 0x43, 0x4c, 0x98, 0x50, 0xa1, 0xfd, 0x9f, 0x3c, 0x6f, 0x46, 0xe1, + 0xf0, 0x84, 0xa8, 0x84, 0xef, 0xce, 0xbe, 0xa9, 0xf1, 0x30, 0x7e, 0x24, 0x0b, 0x93, 0x8a, 0x9d, + 0xca, 0x33, 0xdb, 0xf1, 0x9f, 0xd7, 0x3a, 0x7e, 0x3e, 0xf4, 0x9a, 0x0b, 0x5b, 0x36, 0x50, 0xbf, + 0x77, 0x61, 0x26, 0x41, 0x12, 0x37, 0xf7, 0xc9, 0x0c, 0x62, 0xee, 0xf3, 0x46, 0x32, 0xb6, 0x16, + 0x0f, 0x51, 0x1f, 0x46, 0x5a, 0x51, 0x83, 0x79, 0xfd, 0x78, 0x16, 0xe6, 0xc4, 0x2f, 0x0c, 0x46, + 0xc9, 0x85, 0xd5, 0x67, 0x76, 0x2c, 0x4a, 0xda, 0x58, 0x14, 0xf5, 0xb1, 0x50, 0x1a, 0xd8, 0x7b, + 0x48, 0x8c, 0xbf, 0x0d, 0x30, 0xdf, 0x8b, 0x60, 0x60, 0xe7, 0xf4, 0xc8, 0xf5, 0x2f, 0x3b, 0x80, 0xeb, 0xdf, 0x2a, 0x14, 0xb0, 0x2a, 0x11, 0x6e, 0xce, 0xdf, 0x32, 0xab, 0xa2, 0x93, 0x50, 0xbf, - 0xc0, 0x23, 0x86, 0x8a, 0xf0, 0x77, 0x7e, 0x4c, 0xe7, 0x91, 0xa0, 0x24, 0xbf, 0x94, 0x81, 0x29, + 0xc0, 0x23, 0x86, 0x8a, 0xf0, 0x77, 0x7e, 0x4c, 0xe7, 0x91, 0xa0, 0x24, 0xbf, 0x98, 0x81, 0x29, 0x04, 0x2e, 0x3f, 0xa2, 0xed, 0x00, 0x99, 0x0d, 0x09, 0x4f, 0xb5, 0xf0, 0x61, 0xb4, 0x16, 0x78, - 0x4e, 0x7b, 0x4f, 0xbc, 0x8c, 0xee, 0x88, 0x97, 0xd1, 0xb7, 0xf9, 0x8b, 0xee, 0xf5, 0xba, 0xdb, + 0x4e, 0x7b, 0x4f, 0xbc, 0x8c, 0xee, 0x88, 0x97, 0xd1, 0x77, 0xf9, 0x8b, 0xee, 0xf5, 0xba, 0xdb, 0xba, 0xb1, 0xe7, 0xd9, 0x8f, 0x1c, 0x6e, 0x82, 0x65, 0x37, 0x6f, 0x44, 0x99, 0x55, 0x3a, 0x4e, - 0x2c, 0xe7, 0x89, 0x60, 0x85, 0xaf, 0xce, 0xbc, 0xa1, 0x14, 0xab, 0x8d, 0xab, 0x66, 0xf4, 0x16, - 0x91, 0xef, 0x81, 0x0b, 0x3c, 0x08, 0x14, 0xbb, 0xe1, 0x3b, 0xed, 0xae, 0xdb, 0xf5, 0x97, 0xec, - 0xfa, 0x01, 0x13, 0xf3, 0xb9, 0xb7, 0x2d, 0x7e, 0x79, 0x3d, 0x2c, 0xb4, 0x76, 0x78, 0xa9, 0x16, - 0x5d, 0x20, 0x9d, 0x01, 0x59, 0x81, 0x19, 0x5e, 0x54, 0xea, 0x06, 0x6e, 0xad, 0x6e, 0x37, 0x9d, - 0xf6, 0x1e, 0xca, 0x12, 0x79, 0x2e, 0xca, 0xd8, 0xdd, 0xc0, 0xb5, 0x7c, 0x0e, 0x57, 0x35, 0x35, - 0x09, 0x22, 0x52, 0x85, 0x69, 0x93, 0xda, 0x8d, 0x35, 0xfb, 0x71, 0xd9, 0xee, 0xd8, 0x75, 0x27, - 0xe0, 0x51, 0x29, 0x73, 0x5c, 0xa0, 0xf3, 0xa8, 0xdd, 0xb0, 0x5a, 0xf6, 0x63, 0xab, 0x2e, 0x0a, - 0x75, 0x95, 0xbd, 0x46, 0x17, 0xb2, 0x72, 0xda, 0x21, 0xab, 0xb1, 0x38, 0x2b, 0xa7, 0xdd, 0x9b, - 0x55, 0x44, 0x27, 0x59, 0x6d, 0xda, 0xde, 0x1e, 0x0d, 0xb8, 0x79, 0x34, 0x5c, 0xce, 0x5c, 0xcd, - 0x28, 0xac, 0x02, 0x2c, 0xb3, 0xd0, 0x54, 0x3a, 0xce, 0x4a, 0xa1, 0x63, 0x33, 0x6f, 0xdb, 0x73, - 0x02, 0xaa, 0x7e, 0xe1, 0x38, 0x36, 0x0b, 0xfb, 0x1f, 0x0d, 0xcb, 0x7b, 0x7d, 0x62, 0x82, 0x32, - 0xe2, 0xa6, 0x7c, 0xe4, 0x44, 0x82, 0x5b, 0xfa, 0x57, 0x26, 0x28, 0x43, 0x6e, 0xea, 0x77, 0x4e, - 0xe2, 0x77, 0x2a, 0xdc, 0x7a, 0x7c, 0x68, 0x82, 0x92, 0xac, 0xb3, 0x4e, 0x0b, 0x98, 0xdc, 0xe4, - 0xb6, 0x85, 0x05, 0xf7, 0x14, 0x36, 0xed, 0x25, 0x61, 0x86, 0x58, 0xf0, 0x64, 0xb1, 0x95, 0x62, - 0xcf, 0x1d, 0x27, 0x26, 0x7f, 0x0b, 0xa6, 0xb7, 0x7c, 0x7a, 0xa7, 0xba, 0x51, 0x93, 0x31, 0xa3, - 0x50, 0xb9, 0x38, 0xb5, 0x78, 0xf3, 0x94, 0x4d, 0xe7, 0xba, 0x4a, 0x83, 0x89, 0x4a, 0xf8, 0xb8, - 0x75, 0x7d, 0x6a, 0xed, 0x3a, 0x1d, 0x3f, 0x0c, 0xc0, 0xa7, 0x8e, 0x5b, 0xac, 0x2a, 0x63, 0x05, - 0x66, 0x12, 0x6c, 0xc8, 0x14, 0x00, 0x03, 0x5a, 0x5b, 0xeb, 0xb5, 0xe5, 0xcd, 0xc2, 0x33, 0xa4, - 0x00, 0x13, 0xf8, 0x7b, 0x79, 0xbd, 0xb4, 0xb4, 0xba, 0x5c, 0x29, 0x64, 0xc8, 0x0c, 0x4c, 0x22, - 0xa4, 0x52, 0xad, 0x71, 0x50, 0x96, 0x87, 0xa9, 0x37, 0x0b, 0x7c, 0xe9, 0x06, 0x6c, 0x01, 0xe0, - 0x99, 0x62, 0xfc, 0xfd, 0x2c, 0x5c, 0x94, 0xc7, 0x0a, 0x0d, 0x98, 0xe0, 0xe8, 0xb4, 0xf7, 0x9e, - 0xf2, 0xd3, 0xe1, 0x8e, 0x76, 0x3a, 0xbc, 0x14, 0x3b, 0xa9, 0x63, 0x5f, 0xd9, 0xe7, 0x88, 0xf8, - 0xed, 0x31, 0x78, 0xbe, 0x2f, 0x15, 0xf9, 0x22, 0x3b, 0xcd, 0x1d, 0xda, 0x0e, 0xaa, 0x8d, 0x26, - 0xdd, 0x74, 0x5a, 0xd4, 0xed, 0x06, 0xc2, 0x63, 0xe0, 0x45, 0xd4, 0xe7, 0x61, 0xa1, 0xe5, 0x34, - 0x9a, 0xd4, 0x0a, 0x78, 0xb1, 0x36, 0xdd, 0x92, 0xd4, 0x8c, 0x65, 0x98, 0x34, 0xa9, 0xda, 0x0e, - 0xa8, 0xf7, 0x08, 0xad, 0x12, 0x43, 0x96, 0x07, 0x94, 0x76, 0x2c, 0x9b, 0x95, 0x5a, 0x8e, 0x28, - 0xd6, 0x59, 0x26, 0xa8, 0xc9, 0x1d, 0x85, 0x65, 0x99, 0xdd, 0xfe, 0xd7, 0xec, 0xc7, 0xc2, 0x4c, - 0x4a, 0xc4, 0x20, 0x0d, 0x59, 0x72, 0x27, 0xbe, 0x96, 0xfd, 0xd8, 0x4c, 0x92, 0x90, 0xaf, 0xc2, - 0x39, 0x71, 0x00, 0x89, 0x80, 0x26, 0xf2, 0x8b, 0x79, 0xb8, 0x94, 0x57, 0x4e, 0x8e, 0x8b, 0x17, - 0x64, 0xf4, 0x56, 0x19, 0xc2, 0x26, 0xed, 0xab, 0xd3, 0xb9, 0x90, 0x4d, 0x76, 0x20, 0xc7, 0xba, - 0x63, 0x8d, 0xfa, 0xbe, 0xf4, 0xd4, 0x14, 0x37, 0x63, 0xb5, 0x33, 0xad, 0x16, 0x2f, 0x37, 0x7b, - 0x52, 0x92, 0x15, 0x98, 0xda, 0xa6, 0x3b, 0xea, 0xf8, 0x8c, 0x84, 0x5b, 0x55, 0xe1, 0x90, 0xee, - 0xf4, 0x1e, 0x9c, 0x18, 0x1d, 0x71, 0xf0, 0x7d, 0xe0, 0xf1, 0xd1, 0xaa, 0xe3, 0x07, 0xb4, 0x4d, - 0x3d, 0x0c, 0x94, 0x35, 0x8a, 0x9b, 0xc1, 0x7c, 0x24, 0x21, 0xeb, 0xe5, 0x4b, 0x2f, 0x9c, 0x1c, - 0x17, 0x9f, 0xe7, 0x2e, 0xcf, 0x4d, 0x01, 0xb7, 0x62, 0x29, 0x87, 0x92, 0x5c, 0xc9, 0xd7, 0x61, - 0xda, 0x74, 0xbb, 0x81, 0xd3, 0xde, 0xab, 0x05, 0x9e, 0x1d, 0xd0, 0x3d, 0x7e, 0x20, 0x45, 0x11, - 0xb9, 0x62, 0xa5, 0xe2, 0x69, 0x99, 0x03, 0x2d, 0x5f, 0x40, 0xb5, 0x13, 0x41, 0x27, 0x20, 0x5f, - 0x83, 0x29, 0x1e, 0xca, 0x22, 0xac, 0x60, 0x4c, 0x4b, 0x97, 0xa0, 0x17, 0x3e, 0xbc, 0x29, 0xac, - 0x5a, 0x10, 0x9a, 0x56, 0x41, 0x8c, 0x1b, 0xf9, 0xb2, 0xe8, 0xac, 0x0d, 0xa7, 0xbd, 0x17, 0x4e, - 0x63, 0xc0, 0x9e, 0x7f, 0x3d, 0xea, 0x92, 0x0e, 0x6b, 0xae, 0x9c, 0xc6, 0x3d, 0x4c, 0xf4, 0x92, - 0x7c, 0x48, 0x00, 0xcf, 0x97, 0x7c, 0xdf, 0xf1, 0x03, 0xe1, 0x57, 0xb3, 0xfc, 0x98, 0xd6, 0xbb, - 0x0c, 0x99, 0x5d, 0x6f, 0xa9, 0xc7, 0xed, 0xba, 0x87, 0x97, 0xae, 0x9f, 0x1c, 0x17, 0x5f, 0xb5, - 0x11, 0xd1, 0x12, 0xae, 0x38, 0x16, 0x95, 0xa8, 0xd6, 0x21, 0xc7, 0x55, 0xbe, 0xa1, 0x3f, 0x53, - 0xf2, 0x35, 0x38, 0x5f, 0xb6, 0x7d, 0x5a, 0x6d, 0xfb, 0xb4, 0xed, 0x3b, 0x81, 0xf3, 0x88, 0x8a, - 0x4e, 0xc5, 0xc3, 0x2f, 0x8f, 0xc9, 0x99, 0x8c, 0xba, 0xed, 0xb3, 0x85, 0x19, 0xa2, 0x58, 0x62, - 0x50, 0x94, 0x6a, 0x7a, 0x70, 0x21, 0x26, 0x4c, 0xd5, 0x6a, 0x2b, 0x15, 0xc7, 0x0e, 0xd7, 0xd5, - 0x24, 0xf6, 0xd7, 0xab, 0xa8, 0xda, 0xf3, 0xf7, 0xad, 0x86, 0x63, 0x87, 0x0b, 0xaa, 0x47, 0x67, - 0xc5, 0x38, 0x18, 0xc7, 0x19, 0x28, 0xc4, 0x87, 0x92, 0x7c, 0x09, 0xc6, 0xb8, 0x7d, 0x1b, 0xf5, - 0xf7, 0x45, 0x64, 0x07, 0x69, 0x2e, 0x15, 0xc2, 0x75, 0x22, 0xe1, 0x44, 0xc7, 0xad, 0xe7, 0xa8, - 0x6a, 0x2d, 0x83, 0x4e, 0x74, 0x92, 0x88, 0x34, 0x60, 0x82, 0x8f, 0x16, 0xc5, 0x70, 0x7c, 0xc2, - 0xcc, 0xf9, 0x05, 0x75, 0x75, 0x88, 0xa2, 0x18, 0x7f, 0x7c, 0x35, 0x14, 0x73, 0x82, 0x23, 0x68, - 0x55, 0x68, 0x5c, 0x97, 0x00, 0xf2, 0x92, 0xd0, 0xb8, 0x08, 0x17, 0x7a, 0xb4, 0xd9, 0x78, 0x84, - 0x96, 0x04, 0x3d, 0x6a, 0x24, 0x5f, 0x82, 0x39, 0x24, 0x2c, 0xbb, 0xed, 0x36, 0xad, 0x07, 0xb8, - 0x1d, 0x49, 0xed, 0x7b, 0x8e, 0x5b, 0xba, 0xf0, 0xef, 0xad, 0x87, 0x08, 0x56, 0x5c, 0x09, 0x9f, - 0xca, 0xc1, 0xf8, 0xb9, 0x2c, 0xcc, 0x8b, 0x1d, 0xce, 0xa4, 0x75, 0xd7, 0x6b, 0x3c, 0xfd, 0x27, - 0xea, 0xb2, 0x76, 0xa2, 0xbe, 0x18, 0x86, 0xf2, 0x49, 0xfb, 0xc8, 0x3e, 0x07, 0xea, 0xaf, 0x66, - 0xe0, 0xb9, 0x7e, 0x44, 0xac, 0x77, 0xc2, 0xf0, 0x83, 0x63, 0x89, 0x30, 0x83, 0x1d, 0x98, 0xc5, - 0x01, 0x2d, 0xef, 0xd3, 0xfa, 0x81, 0xbf, 0xe2, 0xfa, 0x01, 0x7a, 0x5a, 0x64, 0x7b, 0xbc, 0x75, - 0xbf, 0x96, 0xfa, 0xd6, 0x7d, 0x9e, 0xcf, 0xb2, 0x3a, 0xf2, 0xe0, 0x01, 0x12, 0x0f, 0xe8, 0x91, - 0x6f, 0xa6, 0xb1, 0x46, 0x8b, 0xf9, 0x52, 0x37, 0xd8, 0xdf, 0xf0, 0xe8, 0x2e, 0xf5, 0x68, 0xbb, - 0x4e, 0x3f, 0x61, 0x16, 0xf3, 0xfa, 0xc7, 0x0d, 0xa4, 0xc1, 0xf8, 0x27, 0x93, 0x30, 0x97, 0x46, - 0xc6, 0xfa, 0x45, 0xb9, 0x34, 0xc7, 0x73, 0x47, 0xfe, 0x60, 0x06, 0x26, 0x6a, 0xb4, 0xee, 0xb6, - 0x1b, 0x77, 0xd0, 0xa2, 0x48, 0xf4, 0x8e, 0xc5, 0x85, 0x06, 0x06, 0xb7, 0x76, 0x63, 0xa6, 0x46, - 0xdf, 0x3d, 0x2e, 0x7e, 0x61, 0xb0, 0xbb, 0x6a, 0xdd, 0xc5, 0x70, 0x3c, 0x01, 0xe6, 0x36, 0x08, - 0xab, 0xc0, 0xc7, 0x41, 0xad, 0x52, 0xb2, 0x04, 0x93, 0x62, 0xb9, 0xba, 0x6a, 0xf4, 0x49, 0x1e, - 0xed, 0x48, 0x16, 0x24, 0x54, 0xd7, 0x1a, 0x09, 0xb9, 0x05, 0xb9, 0xad, 0xc5, 0x3b, 0x62, 0x0c, - 0x64, 0x76, 0x88, 0xad, 0xc5, 0x3b, 0xa8, 0x0e, 0x63, 0x57, 0x8c, 0xc9, 0xee, 0xa2, 0x66, 0xe4, - 0xb3, 0xb5, 0x78, 0x87, 0xfc, 0x6d, 0x38, 0x57, 0x71, 0x7c, 0x51, 0x05, 0xf7, 0xdd, 0x68, 0xa0, - 0xc7, 0xe2, 0x48, 0x8f, 0xd9, 0xfb, 0xd9, 0xd4, 0xd9, 0xfb, 0x42, 0x23, 0x64, 0x62, 0x71, 0xc7, - 0x90, 0x46, 0x3c, 0xca, 0x66, 0x7a, 0x3d, 0xe4, 0x03, 0x98, 0x42, 0x65, 0x36, 0xba, 0xb3, 0x60, - 0x7c, 0xf4, 0xd1, 0x1e, 0x35, 0x7f, 0x3a, 0xb5, 0xe6, 0x05, 0x1e, 0x65, 0x03, 0x9d, 0x62, 0x30, - 0x96, 0xba, 0x76, 0xeb, 0xd7, 0x38, 0x93, 0x7b, 0x30, 0x2d, 0xc4, 0xaf, 0x07, 0xbb, 0x9b, 0xfb, - 0xb4, 0x62, 0x1f, 0x09, 0xfb, 0x1c, 0xbc, 0xd1, 0x09, 0x99, 0xcd, 0x72, 0x77, 0xad, 0x60, 0x9f, - 0x5a, 0x0d, 0x5b, 0x13, 0x54, 0x62, 0x84, 0xe4, 0x5b, 0x30, 0xbe, 0xea, 0xd6, 0x99, 0xe4, 0x8d, - 0x3b, 0x03, 0x37, 0xd9, 0x79, 0x1f, 0xb3, 0x13, 0x72, 0x70, 0x4c, 0x9c, 0xfa, 0xee, 0x71, 0xf1, - 0xad, 0xb3, 0x4e, 0x1a, 0xa5, 0x02, 0x53, 0xad, 0x8d, 0x94, 0x21, 0xbf, 0x4d, 0x77, 0xd8, 0xd7, - 0xc6, 0x33, 0x97, 0x49, 0xb0, 0xb0, 0xc8, 0x13, 0xbf, 0x34, 0x8b, 0x3c, 0x01, 0x23, 0x1e, 0xcc, - 0x60, 0xff, 0x6c, 0xd8, 0xbe, 0x7f, 0xe8, 0x7a, 0x0d, 0x4c, 0x51, 0xd1, 0xcb, 0x1a, 0x68, 0x31, - 0xb5, 0xf3, 0x9f, 0xe3, 0x9d, 0xdf, 0x51, 0x38, 0xa8, 0x02, 0x64, 0x82, 0x3d, 0xf9, 0x3a, 0x4c, - 0x89, 0x88, 0x05, 0x6b, 0x77, 0x4a, 0xb8, 0x2a, 0x27, 0x34, 0xbf, 0x4f, 0xbd, 0x90, 0x4b, 0xa9, - 0x22, 0x00, 0x82, 0xd4, 0x40, 0x59, 0xad, 0x5d, 0x5b, 0x57, 0xfa, 0xab, 0x24, 0x64, 0x03, 0xc6, - 0x2b, 0x98, 0x3f, 0x17, 0x7d, 0xd3, 0x84, 0x5d, 0x78, 0x98, 0x7a, 0x29, 0x2a, 0xe1, 0xba, 0x18, - 0x91, 0x6a, 0x17, 0x3d, 0xdd, 0x74, 0x5b, 0xdd, 0x10, 0x91, 0xdc, 0x86, 0x5c, 0xb5, 0xb2, 0x21, - 0xcc, 0xc2, 0x67, 0xc2, 0xb8, 0x20, 0x1b, 0x32, 0x51, 0x0d, 0xda, 0xcf, 0x39, 0x0d, 0xcd, 0xa8, - 0xbc, 0x5a, 0xd9, 0x20, 0xbb, 0x30, 0x89, 0x1d, 0xb0, 0x42, 0x6d, 0xde, 0xb7, 0xd3, 0x3d, 0xfa, - 0xf6, 0x7a, 0x6a, 0xdf, 0xce, 0xf3, 0xbe, 0xdd, 0x17, 0xd4, 0x5a, 0xe6, 0x0d, 0x95, 0x2d, 0x13, - 0x69, 0x45, 0x36, 0x20, 0x99, 0x2f, 0x62, 0x73, 0x15, 0xed, 0x83, 0x84, 0x48, 0x2b, 0x93, 0x07, - 0x85, 0x09, 0x2c, 0x7a, 0x7a, 0x9d, 0x24, 0xf9, 0x90, 0xcf, 0xc3, 0xd0, 0x83, 0x83, 0xc0, 0x16, - 0x06, 0xe0, 0xb2, 0x1f, 0x19, 0x48, 0x7e, 0x3e, 0x6a, 0x21, 0xdd, 0x03, 0x2d, 0x0e, 0x1b, 0xd2, - 0xb0, 0xa1, 0x58, 0xb1, 0xbd, 0xc6, 0xa1, 0xed, 0xa1, 0x83, 0xf0, 0xac, 0xc6, 0x42, 0x29, 0xe1, - 0x43, 0xb1, 0x2f, 0x00, 0x31, 0xaf, 0x61, 0x95, 0x05, 0xf9, 0x1e, 0xb8, 0xe8, 0x3b, 0x7b, 0x6d, - 0x3b, 0xe8, 0x7a, 0xd4, 0xb2, 0x9b, 0x7b, 0xae, 0xe7, 0x04, 0xfb, 0x2d, 0xcb, 0xef, 0x3a, 0x01, - 0x9d, 0x9f, 0xd3, 0x72, 0x07, 0xd7, 0x24, 0x5e, 0x49, 0xa2, 0xd5, 0x18, 0x96, 0x79, 0xc1, 0x4f, - 0x2f, 0x20, 0x5f, 0x86, 0x49, 0x75, 0x4b, 0xf6, 0xe7, 0xcf, 0x5d, 0xce, 0x5d, 0x9d, 0x0a, 0x2f, - 0x1e, 0xf1, 0x0d, 0x5c, 0xc6, 0xdc, 0x55, 0x4e, 0x08, 0x5f, 0x8f, 0xb9, 0xab, 0xf0, 0x0a, 0xb3, - 0xf1, 0x91, 0xc2, 0xac, 0x39, 0x23, 0x66, 0xac, 0xe8, 0xe5, 0xb5, 0x3b, 0x25, 0x73, 0x74, 0xa3, - 0xfa, 0xb0, 0xd6, 0x74, 0x03, 0xe3, 0xbf, 0xc8, 0xe0, 0x26, 0x4e, 0x5e, 0xc5, 0xf0, 0x51, 0xe1, - 0xeb, 0x19, 0xea, 0x6f, 0xed, 0x4e, 0x2c, 0x60, 0x3b, 0x47, 0x21, 0xaf, 0xc1, 0xc8, 0x1d, 0xbb, - 0x2e, 0x43, 0xd7, 0x08, 0xe4, 0x5d, 0x84, 0xa8, 0xca, 0x5e, 0x8e, 0xc3, 0xe4, 0x4b, 0x3e, 0xb9, - 0x4b, 0x51, 0x5a, 0xea, 0x72, 0x49, 0x3e, 0xd7, 0xa3, 0x7c, 0x29, 0x16, 0x85, 0x92, 0xb7, 0x3a, - 0x66, 0x15, 0x9f, 0xca, 0xc1, 0xf8, 0xf3, 0x4c, 0xb4, 0x2b, 0x91, 0x57, 0x60, 0xc8, 0xdc, 0x08, - 0xdb, 0xcf, 0x9d, 0x7e, 0x63, 0xcd, 0x47, 0x04, 0xf2, 0x65, 0x38, 0xa7, 0xf0, 0x49, 0x98, 0xe8, - 0xbf, 0x8c, 0x3e, 0xa9, 0x4a, 0x4b, 0xd2, 0xed, 0xf4, 0xd3, 0x79, 0xa0, 0x30, 0x1d, 0x15, 0x54, - 0x68, 0xdb, 0xe1, 0xbc, 0x95, 0x8f, 0x55, 0x79, 0x37, 0x10, 0x21, 0xfe, 0xb1, 0x69, 0x1c, 0xb8, - 0x4b, 0xaa, 0xf1, 0x5b, 0x19, 0x6d, 0xb7, 0x09, 0xf3, 0xf8, 0x66, 0x4e, 0xc9, 0xe3, 0xfb, 0x26, - 0x40, 0xa9, 0x1b, 0xb8, 0xcb, 0x6d, 0xcf, 0x6d, 0x72, 0x2d, 0x8a, 0xc8, 0x59, 0x80, 0xba, 0x61, - 0x8a, 0x60, 0xcd, 0x73, 0x2e, 0x44, 0x4e, 0xf5, 0x66, 0xc8, 0x7d, 0x58, 0x6f, 0x06, 0xe3, 0x0f, - 0x32, 0xda, 0x1a, 0x65, 0x52, 0xa2, 0x98, 0x8a, 0xaa, 0xc5, 0x58, 0xc7, 0x79, 0x64, 0xf9, 0x4d, - 0x57, 0x0b, 0x52, 0x21, 0xd0, 0xc8, 0xbf, 0x99, 0x81, 0xf3, 0xdc, 0x2d, 0x60, 0xbd, 0xdb, 0xda, - 0xa1, 0xde, 0x43, 0xbb, 0xe9, 0x34, 0xb8, 0xe3, 0x35, 0x17, 0x80, 0xaf, 0x26, 0x17, 0x7c, 0x3a, - 0x3e, 0xbf, 0xa8, 0x72, 0x37, 0x05, 0xab, 0x8d, 0x85, 0xd6, 0xa3, 0xb0, 0x54, 0xbd, 0xa8, 0xa6, - 0xd3, 0x1b, 0xbf, 0x96, 0x81, 0x17, 0x4e, 0xad, 0x85, 0xdc, 0x80, 0x51, 0x99, 0x2c, 0x22, 0x83, - 0x1d, 0x8f, 0x76, 0xb6, 0xc9, 0x44, 0x11, 0x12, 0x8b, 0x7c, 0x05, 0xce, 0xa9, 0xac, 0x36, 0x3d, - 0xdb, 0x51, 0x53, 0x32, 0xa4, 0xb4, 0x3a, 0x60, 0x28, 0x71, 0x69, 0x2d, 0x9d, 0x89, 0xf1, 0xff, - 0x65, 0x94, 0xcc, 0xde, 0x4f, 0xa9, 0x0c, 0x7f, 0x5b, 0x93, 0xe1, 0x65, 0xe0, 0xce, 0xf0, 0xab, - 0x58, 0x59, 0xea, 0xbd, 0x6b, 0x5a, 0xb1, 0x17, 0x47, 0xc0, 0x8f, 0x64, 0x61, 0x7c, 0xcb, 0xa7, - 0x1e, 0x7f, 0xc8, 0xfd, 0x64, 0x05, 0x68, 0x0c, 0xbf, 0x6b, 0xa0, 0x10, 0x7a, 0x7f, 0x9a, 0x41, - 0x05, 0xbf, 0x4a, 0xc1, 0x7a, 0x43, 0xc9, 0xe6, 0x87, 0xbd, 0x81, 0x79, 0xfc, 0x10, 0xca, 0x03, - 0x8a, 0xad, 0xea, 0x89, 0x3d, 0x31, 0xbb, 0xeb, 0x2a, 0xf9, 0x02, 0x0c, 0x6f, 0xa1, 0xba, 0x52, - 0x0f, 0xb2, 0x11, 0xf2, 0xc7, 0x42, 0xbe, 0x49, 0x77, 0x7d, 0x3d, 0xda, 0x1c, 0x27, 0x24, 0x35, - 0x18, 0x2d, 0x7b, 0x14, 0xf3, 0x74, 0x0f, 0x0d, 0xee, 0x22, 0x5e, 0xe7, 0x24, 0x71, 0x17, 0x71, - 0xc1, 0xc9, 0xf8, 0xd9, 0x2c, 0x90, 0xe8, 0x1b, 0x31, 0x29, 0x95, 0xff, 0xd4, 0x0e, 0xfa, 0x7b, - 0xda, 0xa0, 0x3f, 0x9f, 0x18, 0x74, 0xfe, 0x79, 0x03, 0x8d, 0xfd, 0xef, 0x64, 0xe0, 0x7c, 0x3a, - 0x21, 0x79, 0x11, 0x46, 0x1e, 0x6c, 0x6e, 0xc8, 0x38, 0x2d, 0xe2, 0x53, 0xdc, 0x0e, 0xea, 0x0a, - 0x4c, 0x51, 0x44, 0x5e, 0x87, 0x91, 0x2f, 0x9a, 0x65, 0x76, 0x0e, 0x29, 0x69, 0x0f, 0xbe, 0xe1, - 0x59, 0x75, 0xfd, 0x28, 0x12, 0x48, 0xea, 0xd8, 0xe6, 0x9e, 0xd8, 0xd8, 0xfe, 0x64, 0x16, 0xa6, - 0x4b, 0xf5, 0x3a, 0xf5, 0x7d, 0x26, 0xed, 0x50, 0x3f, 0x78, 0x6a, 0x07, 0x36, 0x3d, 0x02, 0x8b, - 0xf6, 0x6d, 0x03, 0x8d, 0xea, 0xef, 0x65, 0xe0, 0x9c, 0xa4, 0x7a, 0xe4, 0xd0, 0xc3, 0xcd, 0x7d, - 0x8f, 0xfa, 0xfb, 0x6e, 0xb3, 0x31, 0x70, 0x6e, 0x15, 0x26, 0xe8, 0x61, 0xc0, 0x74, 0xf5, 0x55, - 0x7f, 0x17, 0x21, 0x9a, 0xa0, 0xc7, 0x83, 0xaa, 0xdf, 0x80, 0xd1, 0x52, 0xa7, 0xe3, 0xb9, 0x8f, - 0xf8, 0xb2, 0x17, 0xf1, 0x24, 0x6d, 0x0e, 0xd2, 0x3c, 0xec, 0x39, 0x88, 0x35, 0xa3, 0x42, 0xdb, - 0x3c, 0x80, 0xdf, 0x24, 0x6f, 0x46, 0x83, 0xb6, 0x55, 0x59, 0x1c, 0xcb, 0x8d, 0x1a, 0x90, 0x0d, - 0xcf, 0x6d, 0xb9, 0x01, 0x6d, 0xf0, 0xef, 0xc1, 0xc0, 0x04, 0xa7, 0x06, 0xd2, 0xda, 0x74, 0x82, - 0xa6, 0x16, 0x48, 0x2b, 0x60, 0x00, 0x93, 0xc3, 0x8d, 0xff, 0x67, 0x18, 0x26, 0xd4, 0xde, 0x21, - 0x06, 0x4f, 0x98, 0xe0, 0x7a, 0x6a, 0x74, 0x0c, 0x1b, 0x21, 0xa6, 0x28, 0x89, 0x42, 0xcb, 0x64, - 0x4f, 0x0d, 0x2d, 0xb3, 0x0d, 0x93, 0x1b, 0x9e, 0x8b, 0x81, 0x2f, 0xf1, 0xb5, 0x52, 0x6c, 0x85, - 0xb3, 0xca, 0xbd, 0x93, 0x0d, 0x24, 0xbe, 0x87, 0xa2, 0x64, 0xdf, 0x11, 0xd8, 0x98, 0x46, 0x50, - 0xd3, 0xba, 0x68, 0x7c, 0xb8, 0xa9, 0x85, 0xed, 0x8b, 0xe8, 0xb5, 0xa1, 0xa9, 0x05, 0x83, 0xe8, - 0xa6, 0x16, 0x0c, 0xa2, 0xae, 0xb5, 0xe1, 0x27, 0xb5, 0xd6, 0xc8, 0xcf, 0x66, 0x60, 0xbc, 0xd4, - 0x6e, 0x8b, 0x90, 0x35, 0xa7, 0x78, 0xeb, 0x7f, 0x45, 0x58, 0x5b, 0xbc, 0xf5, 0xa1, 0xac, 0x2d, - 0x50, 0x6e, 0xf1, 0x51, 0x52, 0x8d, 0x2a, 0x54, 0x6f, 0x6b, 0x4a, 0x3b, 0xc8, 0x5b, 0x50, 0x08, - 0x27, 0x79, 0xb5, 0xdd, 0xa0, 0x8f, 0x29, 0x4f, 0x38, 0x37, 0x29, 0xe2, 0x56, 0xab, 0x92, 0x69, - 0x1c, 0x91, 0x6c, 0x02, 0xd8, 0xe1, 0xec, 0x8a, 0x65, 0xce, 0x4c, 0x4e, 0x3f, 0x21, 0x3d, 0xe3, - 0x6f, 0x7c, 0xd0, 0x52, 0xa5, 0xe7, 0x88, 0x0f, 0x69, 0xc1, 0x34, 0x4f, 0x5b, 0x59, 0x0b, 0x6c, - 0x2f, 0xc0, 0xf4, 0x0c, 0x70, 0xea, 0x38, 0xbc, 0x22, 0xf4, 0x67, 0xcf, 0x8a, 0x64, 0x98, 0x3e, - 0xa3, 0xb5, 0x52, 0x72, 0x35, 0xc4, 0x79, 0xf3, 0x28, 0xe1, 0xe6, 0x85, 0x64, 0x7b, 0xf9, 0xa4, - 0xff, 0xc9, 0x0c, 0x9c, 0x57, 0x27, 0x7d, 0xad, 0xbb, 0x23, 0x02, 0x86, 0x92, 0xeb, 0x30, 0x26, - 0xe6, 0x64, 0x78, 0x89, 0x4a, 0x66, 0x99, 0x88, 0x50, 0xc8, 0x32, 0x9b, 0x86, 0x8c, 0x87, 0x90, - 0xba, 0x67, 0x63, 0xfb, 0x14, 0x2b, 0x8a, 0x52, 0x22, 0x7b, 0xf8, 0x5b, 0x9f, 0x9f, 0x0c, 0x62, - 0xbc, 0x0b, 0x33, 0xfa, 0x48, 0xd4, 0x68, 0x40, 0xae, 0xc1, 0xa8, 0x1c, 0xbe, 0x4c, 0xfa, 0xf0, - 0xc9, 0x72, 0x63, 0x1b, 0x48, 0x82, 0xde, 0x47, 0xb3, 0x28, 0x76, 0x3f, 0xe5, 0x66, 0x7b, 0xf2, - 0x51, 0x32, 0x81, 0xb8, 0x34, 0x2b, 0xda, 0x37, 0xae, 0xb9, 0x25, 0x60, 0xf0, 0xd4, 0x3f, 0x9f, - 0x82, 0xd9, 0x94, 0x3d, 0xf7, 0x14, 0x99, 0xa8, 0xa8, 0x6f, 0x10, 0x63, 0x61, 0xb0, 0x0f, 0xb9, - 0x2d, 0xbc, 0x0b, 0xc3, 0xa7, 0x6e, 0x07, 0xdc, 0x29, 0x25, 0xb6, 0x0b, 0x70, 0xb2, 0x8f, 0x45, - 0x2e, 0x52, 0xe3, 0xf1, 0x0c, 0x3f, 0xb1, 0x78, 0x3c, 0x4b, 0x30, 0x29, 0xbe, 0x4a, 0x6c, 0x57, - 0x8a, 0x71, 0xb4, 0xc7, 0x0b, 0xac, 0xc4, 0xb6, 0xa5, 0x93, 0x70, 0x1e, 0xbe, 0xdb, 0x7c, 0x44, - 0x05, 0x8f, 0x51, 0x95, 0x07, 0x16, 0xa4, 0xf2, 0x50, 0x48, 0xc8, 0x7f, 0x84, 0x29, 0xf3, 0x10, - 0xa2, 0xee, 0x59, 0xf9, 0x7e, 0x7b, 0x56, 0xe3, 0xc9, 0xec, 0x59, 0xcf, 0xcb, 0x36, 0xa6, 0xef, - 0x5d, 0x29, 0xcd, 0x22, 0xbf, 0x9c, 0x81, 0x19, 0x1e, 0x14, 0x46, 0x6d, 0x6c, 0xdf, 0x40, 0x1f, - 0xf5, 0x27, 0xd3, 0xd8, 0xe7, 0x44, 0xaa, 0xa8, 0xf4, 0xb6, 0x26, 0x1b, 0x45, 0xbe, 0x07, 0x20, - 0x5c, 0x51, 0x3c, 0x80, 0xec, 0xf8, 0xe2, 0x73, 0x29, 0xbb, 0x40, 0x88, 0x14, 0xa5, 0xb5, 0x08, - 0x42, 0x3a, 0x2d, 0x51, 0x62, 0x08, 0x25, 0x7f, 0x1b, 0xe6, 0xd8, 0x7a, 0x09, 0x21, 0x22, 0x84, - 0xd5, 0xfc, 0x38, 0xd6, 0xf2, 0x99, 0xde, 0x32, 0xd1, 0xf5, 0x34, 0x32, 0x1e, 0x6e, 0x38, 0xca, - 0x59, 0x1d, 0xa8, 0xd1, 0x2e, 0x52, 0x2b, 0xc2, 0xc8, 0x70, 0xd8, 0x7a, 0x9e, 0x7a, 0xa2, 0xc7, - 0xfe, 0x76, 0x51, 0xae, 0x05, 0xbe, 0xbf, 0xf9, 0xba, 0x8f, 0x32, 0x82, 0xc8, 0x17, 0x81, 0x84, - 0xd1, 0x54, 0x38, 0x8c, 0xca, 0xb4, 0x14, 0x5c, 0xdd, 0x1c, 0x45, 0x65, 0xf1, 0x64, 0xb1, 0x3a, - 0x49, 0x92, 0xc4, 0x84, 0xc2, 0x9c, 0xf8, 0x68, 0x06, 0x95, 0xf9, 0xec, 0xfc, 0xf9, 0x29, 0x2d, - 0x40, 0x58, 0x54, 0x12, 0x25, 0xb7, 0x56, 0x92, 0xe2, 0x69, 0x2a, 0xa7, 0x34, 0x76, 0xe4, 0x36, - 0x8c, 0xa1, 0xa3, 0xf0, 0x8a, 0x34, 0xf6, 0x12, 0x86, 0x27, 0xe8, 0x52, 0x6c, 0xed, 0xeb, 0x26, - 0x5b, 0x11, 0x2a, 0xbb, 0x0e, 0x54, 0xbc, 0x23, 0xb3, 0xdb, 0x46, 0xa5, 0xb0, 0xd0, 0x77, 0x34, - 0xbc, 0x23, 0xcb, 0xeb, 0xea, 0x9e, 0xe4, 0x88, 0x44, 0xbe, 0x0e, 0xe3, 0x6b, 0xf6, 0x63, 0xa9, - 0x13, 0x16, 0x8a, 0xdf, 0x7e, 0x3b, 0x90, 0x21, 0xbf, 0xa6, 0x65, 0x3f, 0xb6, 0x1a, 0xdd, 0x78, - 0xb0, 0x63, 0xdc, 0x86, 0x54, 0x96, 0xe4, 0xab, 0x00, 0x8a, 0xa6, 0x9a, 0x9c, 0x5a, 0xc1, 0x0b, - 0x32, 0xec, 0x5d, 0xaa, 0x06, 0x1b, 0xf9, 0x2b, 0x0c, 0x63, 0x92, 0xc3, 0xdc, 0xc7, 0x27, 0x39, - 0x9c, 0xfb, 0xf8, 0x24, 0x87, 0x85, 0x1d, 0xb8, 0xd8, 0x73, 0xe9, 0xa4, 0x84, 0x3a, 0xbe, 0xa1, - 0x87, 0x3a, 0xbe, 0xd8, 0xeb, 0x88, 0xf5, 0xf5, 0x4c, 0x26, 0xb3, 0x85, 0xb9, 0xde, 0xd2, 0xc9, - 0x77, 0xb2, 0xb1, 0x23, 0x57, 0x5c, 0x2c, 0x78, 0xe6, 0xab, 0x5e, 0x32, 0x49, 0x16, 0x93, 0x1d, - 0xf3, 0x43, 0x59, 0x89, 0x06, 0xcf, 0x0e, 0x65, 0xf5, 0x50, 0xc7, 0xe3, 0xf9, 0xa3, 0x9e, 0xbe, - 0x6f, 0xc3, 0x14, 0xcf, 0x4f, 0x7a, 0x9f, 0x1e, 0x1d, 0xba, 0x5e, 0x83, 0xe7, 0xf4, 0x11, 0x32, - 0x78, 0x22, 0xb9, 0x78, 0x0c, 0x97, 0x54, 0xa4, 0xef, 0xe9, 0x30, 0xd6, 0x7e, 0x31, 0x75, 0x17, - 0x63, 0x08, 0xfd, 0xdc, 0x52, 0xc9, 0x1b, 0xa1, 0xa0, 0x46, 0x3d, 0x35, 0x9f, 0x89, 0x27, 0x81, - 0x29, 0xf2, 0x1a, 0xf5, 0x8c, 0x7f, 0x96, 0x03, 0xc2, 0x6b, 0x2a, 0xdb, 0x1d, 0x1b, 0x3d, 0xb3, - 0x1d, 0x8c, 0xb5, 0x54, 0x10, 0x38, 0xf6, 0x4e, 0x93, 0xaa, 0x81, 0xca, 0x84, 0x71, 0x6d, 0x58, - 0x66, 0xc5, 0x2f, 0x3a, 0x09, 0xc2, 0x1e, 0x5b, 0x5d, 0xf6, 0xa3, 0x6c, 0x75, 0x5f, 0x87, 0x67, - 0x4b, 0x1d, 0x4c, 0x74, 0x2c, 0x6b, 0xb9, 0xe3, 0x7a, 0x72, 0x93, 0xd2, 0x7c, 0xfe, 0xec, 0x10, - 0x2d, 0xd1, 0xd2, 0x7e, 0x2c, 0x14, 0x39, 0x85, 0xcd, 0xcb, 0x4e, 0xa0, 0xc6, 0x90, 0x90, 0x72, - 0x4a, 0x07, 0x4b, 0x52, 0xe4, 0x14, 0x4e, 0x22, 0x79, 0x38, 0x9e, 0x94, 0x53, 0x30, 0x83, 0x57, - 0xc4, 0xc3, 0xf1, 0x68, 0x0f, 0x59, 0x27, 0x24, 0x21, 0x6f, 0xc3, 0x78, 0xa9, 0x1b, 0xb8, 0x82, - 0xb1, 0xb0, 0x0a, 0x8f, 0xec, 0xb7, 0x45, 0x53, 0xb4, 0xab, 0x4f, 0x84, 0x6e, 0xfc, 0x59, 0x0e, - 0x2e, 0x26, 0x87, 0x57, 0x94, 0x86, 0xeb, 0x23, 0x73, 0xca, 0xfa, 0x48, 0x9b, 0x0d, 0xd9, 0x28, - 0xbf, 0xc4, 0x93, 0x98, 0x0d, 0x3c, 0x5f, 0xf2, 0x87, 0x9c, 0x0d, 0x35, 0x18, 0x57, 0xcf, 0xbb, - 0xa1, 0x0f, 0x7b, 0xde, 0xa9, 0x5c, 0xd8, 0xa5, 0x9e, 0x87, 0xce, 0x18, 0x8e, 0x9e, 0x8e, 0xe2, - 0x51, 0x33, 0x38, 0x06, 0xf9, 0x37, 0xe0, 0x32, 0xdf, 0x93, 0xe2, 0x1f, 0xbb, 0x74, 0x24, 0x39, - 0x8a, 0x81, 0x5b, 0x3c, 0x39, 0x2e, 0x5e, 0xe7, 0xaa, 0x12, 0x2b, 0xd1, 0x6d, 0xd6, 0xce, 0x91, - 0x25, 0x5b, 0xa6, 0x54, 0x72, 0x2a, 0x6f, 0xa3, 0x0c, 0x17, 0x45, 0x69, 0xe4, 0xb4, 0x2d, 0x0b, - 0xd9, 0x20, 0x1f, 0x44, 0xda, 0x2e, 0x1c, 0xe4, 0x98, 0x22, 0x0b, 0xcb, 0x31, 0xd3, 0xb2, 0x92, - 0x05, 0xf7, 0xf5, 0x34, 0x9f, 0x1b, 0x1e, 0xb5, 0x9b, 0x83, 0x75, 0x77, 0x1b, 0xa9, 0x53, 0xcb, - 0xa6, 0xea, 0xd4, 0xa4, 0x52, 0x26, 0x97, 0xaa, 0x94, 0xa9, 0xc0, 0x74, 0xad, 0xbb, 0x23, 0xeb, - 0x8e, 0xfb, 0x6b, 0xfa, 0xdd, 0x9d, 0xb4, 0x5e, 0x89, 0x93, 0x18, 0x3f, 0x9a, 0x85, 0x89, 0x8d, - 0x66, 0x77, 0xcf, 0x69, 0x57, 0xec, 0xc0, 0x7e, 0x6a, 0xd5, 0x7c, 0x6f, 0x6a, 0x6a, 0xbe, 0xd0, - 0xb5, 0x2c, 0xfc, 0xb0, 0x81, 0x74, 0x7c, 0x3f, 0x93, 0x81, 0xe9, 0x88, 0x84, 0x1f, 0xd6, 0x2b, - 0x30, 0xc4, 0x7e, 0x88, 0xcb, 0xef, 0xe5, 0x04, 0x63, 0x9e, 0x7a, 0x31, 0xfc, 0x4b, 0x28, 0xde, - 0xf4, 0xbc, 0x66, 0xc8, 0x61, 0xe1, 0xb3, 0x30, 0x16, 0xb1, 0x3d, 0x4b, 0xca, 0xc5, 0x5f, 0xcf, - 0x40, 0x21, 0xfe, 0x25, 0xe4, 0x3e, 0x8c, 0x32, 0x4e, 0x0e, 0x95, 0xf7, 0xf2, 0x97, 0x7a, 0x7c, - 0xf3, 0x75, 0x81, 0xc6, 0x9b, 0x87, 0x9d, 0x4f, 0x39, 0xc4, 0x94, 0x1c, 0x16, 0x4c, 0x98, 0x50, - 0xb1, 0x52, 0x5a, 0xf7, 0x9a, 0x2e, 0xa1, 0x9c, 0x4f, 0xef, 0x07, 0x2d, 0x51, 0xa4, 0xd6, 0x6a, - 0x21, 0x7c, 0x5c, 0xd1, 0x26, 0x57, 0xea, 0xaa, 0xc2, 0x49, 0xb3, 0x18, 0x65, 0x29, 0x50, 0xe7, - 0x59, 0xca, 0x84, 0x0e, 0xf1, 0xc8, 0x6b, 0x30, 0xc2, 0xeb, 0x53, 0x13, 0xa6, 0x75, 0x10, 0xa2, - 0xca, 0xc9, 0x1c, 0xc7, 0xf8, 0x07, 0x39, 0x38, 0x1f, 0x35, 0x6f, 0xab, 0xd3, 0xb0, 0x03, 0xba, - 0x61, 0x7b, 0x76, 0xcb, 0x3f, 0x65, 0x05, 0x5c, 0x4d, 0x34, 0x0d, 0x13, 0x68, 0xc9, 0xa6, 0x29, - 0x0d, 0x32, 0x62, 0x0d, 0x42, 0x1d, 0x28, 0x6f, 0x90, 0x6c, 0x06, 0xb9, 0x0f, 0xb9, 0x1a, 0x0d, - 0xc4, 0xde, 0x7b, 0x25, 0xd1, 0xab, 0x6a, 0xbb, 0xae, 0xd7, 0x68, 0xc0, 0x07, 0x91, 0xc7, 0x85, - 0xd2, 0x82, 0xf3, 0x31, 0x2e, 0x64, 0x1b, 0x46, 0x96, 0x1f, 0x77, 0x68, 0x3d, 0x10, 0x09, 0x43, - 0xaf, 0xf5, 0xe7, 0xc7, 0x71, 0x95, 0x7c, 0xa1, 0x14, 0x01, 0x6a, 0x67, 0x71, 0x94, 0x85, 0xdb, - 0x90, 0x97, 0x95, 0x9f, 0x65, 0xe6, 0x2e, 0xbc, 0x09, 0xe3, 0x4a, 0x25, 0x67, 0x9a, 0xf4, 0xbf, - 0xc0, 0xf6, 0x55, 0xb7, 0x29, 0x73, 0x8c, 0x2e, 0x27, 0x64, 0x45, 0x25, 0x07, 0x15, 0x97, 0x15, - 0xad, 0x03, 0x51, 0xd4, 0x47, 0x68, 0xac, 0xc2, 0x74, 0xed, 0xc0, 0xe9, 0x44, 0x81, 0x62, 0xb5, - 0x13, 0x19, 0xf3, 0xdc, 0x88, 0x8b, 0x7b, 0xfc, 0x44, 0x8e, 0xd3, 0x19, 0x7f, 0x99, 0x81, 0x11, - 0xf6, 0xd7, 0xc3, 0xdb, 0x4f, 0xe9, 0x96, 0x79, 0x4b, 0xdb, 0x32, 0x67, 0x94, 0x58, 0xed, 0xb8, - 0x71, 0xdc, 0x3e, 0x65, 0xb3, 0x3c, 0x16, 0x03, 0xc4, 0x91, 0xc9, 0x5d, 0x18, 0x15, 0x26, 0x45, - 0xc2, 0xf6, 0x5b, 0x0d, 0xfe, 0x2e, 0x8d, 0x8d, 0xc2, 0x1b, 0xbe, 0xdb, 0x89, 0xab, 0x44, 0x24, - 0x35, 0x93, 0xeb, 0x65, 0xc8, 0x5e, 0x2d, 0x33, 0xb5, 0x8b, 0xce, 0x7a, 0x3c, 0x74, 0xb9, 0x92, - 0x4b, 0xbe, 0x87, 0x6f, 0x7d, 0x49, 0xbc, 0x86, 0xe4, 0xfa, 0x31, 0x39, 0x2f, 0x13, 0xf7, 0xa6, - 0x3e, 0x94, 0xfc, 0xf1, 0x39, 0x1e, 0xf0, 0x5b, 0x36, 0xec, 0x1d, 0x98, 0xb8, 0xe3, 0x7a, 0x87, - 0xb6, 0xc7, 0xc3, 0xb8, 0x0a, 0xf3, 0x03, 0x76, 0xff, 0x9c, 0xdc, 0xe5, 0x70, 0x1e, 0x08, 0xf6, - 0xbb, 0xc7, 0xc5, 0xa1, 0x25, 0xd7, 0x6d, 0x9a, 0x1a, 0x3a, 0x79, 0x00, 0x93, 0x6b, 0xf6, 0x63, - 0xe5, 0xe6, 0xcc, 0xbd, 0x6f, 0xae, 0xb1, 0x09, 0xcc, 0xae, 0xde, 0xa7, 0xdb, 0x77, 0xe9, 0xf4, - 0x98, 0xfb, 0xca, 0xf5, 0x02, 0x51, 0x89, 0xd3, 0xde, 0x13, 0x1f, 0x9b, 0xb4, 0x50, 0xbb, 0x91, - 0x6a, 0xa1, 0x76, 0xb1, 0xe3, 0x7a, 0x81, 0xb5, 0x1b, 0x92, 0x6b, 0x01, 0xd5, 0x34, 0xc6, 0xe4, - 0x1d, 0x98, 0x51, 0x62, 0x4d, 0xde, 0x71, 0xbd, 0x96, 0x2d, 0x25, 0x7b, 0x54, 0x26, 0xa3, 0xd1, - 0xca, 0x2e, 0x82, 0xcd, 0x24, 0x26, 0xf9, 0x72, 0x9a, 0x3f, 0xd3, 0x70, 0x64, 0xe2, 0x96, 0xe2, - 0xcf, 0xd4, 0xcb, 0xc4, 0x2d, 0xe9, 0xd9, 0xb4, 0xd7, 0xcf, 0x04, 0x36, 0xbf, 0x74, 0x53, 0xdc, - 0xe1, 0x4f, 0x37, 0x71, 0x0d, 0xc7, 0xad, 0x87, 0xa9, 0xeb, 0x22, 0xe4, 0x96, 0x36, 0xee, 0xe0, - 0x13, 0x88, 0xb4, 0xd6, 0x69, 0xef, 0xdb, 0xed, 0x3a, 0x4a, 0xdc, 0xc2, 0xec, 0x5c, 0xdd, 0x91, - 0x97, 0x36, 0xee, 0x10, 0x1b, 0x66, 0x31, 0x8d, 0x58, 0xf0, 0xa5, 0x9b, 0x37, 0x95, 0x81, 0xca, - 0x63, 0xd3, 0x6e, 0x88, 0xa6, 0x15, 0x31, 0x09, 0x59, 0x60, 0x3d, 0xbe, 0x79, 0x33, 0x75, 0x38, - 0xc2, 0x86, 0xa5, 0xf1, 0x62, 0x3b, 0xe3, 0x9a, 0xfd, 0x38, 0xf2, 0x16, 0xf0, 0x85, 0x67, 0xe8, - 0xf3, 0x72, 0x62, 0x45, 0x9e, 0x06, 0xda, 0xce, 0xa8, 0x13, 0xb1, 0x0b, 0x53, 0x34, 0xbd, 0x7c, - 0xe1, 0x53, 0xb3, 0x20, 0xf5, 0x42, 0xd2, 0x7d, 0x58, 0x95, 0xfa, 0x15, 0x74, 0xb2, 0x15, 0x5e, - 0xfb, 0xf8, 0xb5, 0x49, 0xa4, 0xa5, 0xbd, 0xa1, 0x5e, 0xfb, 0xb8, 0x36, 0x46, 0xfb, 0xac, 0xe9, - 0x50, 0x57, 0xc0, 0xdd, 0x27, 0x4c, 0x9d, 0x4b, 0xf2, 0x36, 0x39, 0x71, 0xf6, 0xdb, 0x24, 0x85, - 0xa1, 0x55, 0xb7, 0x7e, 0x20, 0xa2, 0xc0, 0x7d, 0x91, 0x2d, 0xf7, 0xa6, 0x5b, 0x3f, 0x78, 0x72, - 0xa6, 0xbd, 0xc8, 0x9e, 0xac, 0xb3, 0xa6, 0xb2, 0x59, 0x20, 0xfa, 0x44, 0x98, 0x8b, 0xce, 0x85, - 0xd7, 0x29, 0xa5, 0x8c, 0x0b, 0x3e, 0x7c, 0xd2, 0xc8, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0x50, - 0xa1, 0xfe, 0x41, 0xe0, 0x76, 0xca, 0x4d, 0xa7, 0xb3, 0xe3, 0xda, 0x9e, 0x8c, 0x19, 0x9c, 0x5c, - 0xdf, 0xaf, 0xa4, 0xae, 0xef, 0x99, 0x06, 0xa7, 0xb7, 0xea, 0x92, 0x81, 0x99, 0x60, 0x49, 0xbe, - 0x0c, 0x53, 0x6c, 0x72, 0x2f, 0x3f, 0x0e, 0x68, 0x9b, 0x8f, 0xfc, 0x0c, 0x8a, 0x0e, 0x73, 0x4a, - 0x92, 0x8c, 0xb0, 0x90, 0xcf, 0x29, 0x5c, 0xec, 0x34, 0x24, 0xd0, 0x22, 0xe8, 0x69, 0xac, 0x48, - 0x03, 0xe6, 0xd7, 0xec, 0xc7, 0x4a, 0x32, 0x5d, 0x65, 0x92, 0x12, 0x9c, 0x60, 0x57, 0x4f, 0x8e, - 0x8b, 0x2f, 0xb1, 0x09, 0x16, 0x85, 0xb1, 0xee, 0x31, 0x5f, 0x7b, 0x72, 0x22, 0xdf, 0x82, 0x0b, - 0xe2, 0xb3, 0x2a, 0x98, 0x96, 0xca, 0xf5, 0x8e, 0x6a, 0xfb, 0x36, 0x3a, 0x0a, 0xcd, 0x9e, 0x6d, - 0x43, 0x94, 0x1d, 0xd6, 0x90, 0x7c, 0x2c, 0x9f, 0x33, 0x32, 0x7b, 0xd5, 0x40, 0x3e, 0x80, 0x29, - 0xfe, 0xee, 0xb3, 0xe2, 0xfa, 0x01, 0x6a, 0x05, 0xe6, 0xce, 0x66, 0xff, 0xce, 0x1f, 0x93, 0xb8, - 0xc7, 0x48, 0x4c, 0x8b, 0x10, 0xe3, 0x4c, 0xde, 0x82, 0xf1, 0x0d, 0xa7, 0xcd, 0x63, 0x5c, 0x56, - 0x37, 0x50, 0x7f, 0x29, 0xce, 0x9f, 0x8e, 0xd3, 0xb6, 0xe4, 0xd5, 0xbc, 0x13, 0x6e, 0x17, 0x2a, - 0x36, 0xd9, 0x86, 0xf1, 0x5a, 0x6d, 0xe5, 0x8e, 0xc3, 0x0e, 0xc0, 0xce, 0xd1, 0xfc, 0xf9, 0x1e, - 0xad, 0x7c, 0x31, 0xb5, 0x95, 0x93, 0xbe, 0xbf, 0x6f, 0xed, 0x3a, 0x4d, 0x6a, 0xd5, 0xdd, 0xce, - 0x91, 0xa9, 0x72, 0x4a, 0xb1, 0x09, 0xbf, 0xf0, 0x84, 0x6d, 0xc2, 0xab, 0x30, 0xad, 0x58, 0x69, - 0xa2, 0x85, 0xe6, 0x7c, 0x14, 0x18, 0x49, 0xb5, 0x01, 0x8f, 0xfb, 0x40, 0xc6, 0xe9, 0xa4, 0x31, - 0xf8, 0xc5, 0xb3, 0x1a, 0x83, 0x3b, 0x30, 0xc3, 0x07, 0x43, 0xcc, 0x03, 0x1c, 0xe9, 0x85, 0x1e, - 0x7d, 0x78, 0x2d, 0xb5, 0x0f, 0x67, 0xc5, 0x48, 0xcb, 0x49, 0x86, 0xef, 0x9c, 0x49, 0xae, 0x64, - 0x17, 0x88, 0x00, 0xda, 0x81, 0xbd, 0x63, 0xfb, 0x14, 0xeb, 0x7a, 0xb6, 0x47, 0x5d, 0x2f, 0xa5, - 0xd6, 0x35, 0x25, 0xeb, 0xda, 0xe1, 0xd5, 0xa4, 0x70, 0x24, 0x6d, 0x59, 0x8f, 0x9c, 0x5f, 0xd8, - 0xb1, 0xcf, 0x69, 0xca, 0xd4, 0x24, 0x02, 0x8f, 0x31, 0x14, 0x9f, 0xb4, 0xf1, 0x7e, 0x4f, 0xe1, - 0x4c, 0x1e, 0xc3, 0xf9, 0x64, 0x2b, 0xb0, 0xce, 0xe7, 0xb1, 0xce, 0xe7, 0xb5, 0x3a, 0xe3, 0x48, - 0x7c, 0xde, 0xe8, 0x9f, 0x15, 0xaf, 0xb5, 0x07, 0x7f, 0xf2, 0x43, 0x19, 0xb8, 0xb0, 0x76, 0xa7, - 0x84, 0xc9, 0x2a, 0x1d, 0x1e, 0xf2, 0x2c, 0xf4, 0x1d, 0xbd, 0x24, 0x14, 0xee, 0xf1, 0x47, 0x00, - 0x29, 0x71, 0xe0, 0x56, 0xc1, 0x64, 0xc4, 0x17, 0x5b, 0xbb, 0x36, 0xcf, 0x81, 0x29, 0x58, 0xa4, - 0x38, 0x98, 0x7e, 0xfb, 0x4f, 0x8a, 0x19, 0xb3, 0x57, 0x55, 0xa4, 0x09, 0x0b, 0x7a, 0xb7, 0x48, - 0x73, 0xfd, 0x7d, 0xda, 0x6c, 0xce, 0x17, 0x71, 0x46, 0xbf, 0x76, 0x72, 0x5c, 0xbc, 0x9a, 0xe8, - 0xdd, 0xd0, 0x05, 0x80, 0x61, 0x2a, 0x1f, 0xdc, 0x87, 0xdf, 0xbd, 0xa1, 0xfc, 0x64, 0x61, 0x2a, - 0xc5, 0x58, 0xdd, 0xf8, 0xed, 0x6c, 0xec, 0xa4, 0x22, 0x55, 0x18, 0x15, 0x13, 0x50, 0x88, 0xee, - 0xc9, 0x69, 0xf6, 0x7c, 0xea, 0x34, 0x1b, 0x15, 0x73, 0xd9, 0x94, 0xf4, 0xe4, 0x90, 0xb1, 0xc2, - 0x56, 0x88, 0xbb, 0xce, 0x57, 0xf9, 0x41, 0x84, 0x20, 0xed, 0xc8, 0xad, 0x9c, 0xdd, 0x05, 0x4b, - 0xf7, 0xf0, 0xc3, 0xb3, 0x57, 0xd6, 0x46, 0x0e, 0x78, 0x12, 0xa1, 0x5c, 0xe8, 0xc7, 0xa3, 0x67, - 0x0c, 0x7a, 0x62, 0x15, 0xb2, 0x5a, 0x8c, 0xdf, 0xca, 0xc0, 0xa4, 0x76, 0xd4, 0x91, 0xdb, 0x8a, - 0x93, 0x5a, 0xe4, 0xb7, 0xad, 0xe1, 0xe0, 0xee, 0x17, 0x77, 0x5f, 0xbb, 0x2d, 0x2c, 0xce, 0xb3, - 0xbd, 0xe9, 0x70, 0xf6, 0xc7, 0x7d, 0x16, 0xfb, 0x6b, 0x06, 0xc3, 0xbc, 0x87, 0x43, 0x3d, 0xf2, - 0x1e, 0xfe, 0xfa, 0x73, 0x30, 0xa5, 0xdf, 0x85, 0xc8, 0x6b, 0x30, 0x82, 0x5a, 0x59, 0x79, 0xb1, - 0x46, 0x85, 0x00, 0x2a, 0x6e, 0x35, 0x37, 0x04, 0x8e, 0x43, 0x5e, 0x06, 0x08, 0x4d, 0x7f, 0xe5, - 0x9b, 0xc4, 0xf0, 0xc9, 0x71, 0x31, 0xf3, 0xba, 0xa9, 0x14, 0x90, 0xaf, 0x01, 0xac, 0xbb, 0x0d, - 0x1a, 0x26, 0xb3, 0xed, 0xf3, 0xee, 0xfe, 0x4a, 0x22, 0xc1, 0xc6, 0xb9, 0xb6, 0xdb, 0xa0, 0xc9, - 0x6c, 0x1a, 0x0a, 0x47, 0xf2, 0x79, 0x18, 0x36, 0xbb, 0xec, 0x12, 0xcf, 0xf5, 0x27, 0xe3, 0xf2, - 0xc8, 0xe9, 0x36, 0x69, 0x74, 0x43, 0xf4, 0xba, 0x71, 0x93, 0x32, 0x06, 0x20, 0xef, 0xf1, 0xc4, - 0x1b, 0x22, 0x3a, 0xe4, 0x70, 0xf4, 0x4a, 0xa3, 0x88, 0x22, 0x89, 0xf8, 0x90, 0x0a, 0x09, 0x79, - 0x00, 0xa3, 0xea, 0xf3, 0x82, 0xe2, 0xed, 0xac, 0x3e, 0x41, 0x29, 0xd7, 0x4d, 0x91, 0x05, 0x37, - 0xfe, 0xf2, 0x20, 0xb9, 0x90, 0xb7, 0x61, 0x8c, 0xb1, 0x67, 0x4b, 0xd9, 0x17, 0xd7, 0x0c, 0x7c, - 0x8b, 0x51, 0x1a, 0xc4, 0xb6, 0x03, 0x2d, 0x86, 0x63, 0x48, 0x40, 0xbe, 0x8c, 0x79, 0x4b, 0x45, - 0x57, 0xf7, 0xb5, 0xc7, 0xb8, 0x92, 0xe8, 0x6a, 0x4c, 0x64, 0x9a, 0xe8, 0xe9, 0x88, 0x1f, 0xd9, - 0x0b, 0x83, 0x6d, 0x0d, 0x92, 0x2c, 0xe5, 0xd5, 0x44, 0x05, 0xf3, 0x32, 0x7e, 0x54, 0x32, 0x29, - 0xb1, 0xc6, 0x97, 0x74, 0xa0, 0x10, 0x49, 0x79, 0xa2, 0x2e, 0xe8, 0x57, 0xd7, 0xeb, 0x89, 0xba, - 0xd4, 0x01, 0x4c, 0x54, 0x97, 0xe0, 0x4e, 0x1a, 0x30, 0x25, 0x4f, 0x0c, 0x51, 0xdf, 0x78, 0xbf, - 0xfa, 0x5e, 0x4e, 0xd4, 0x37, 0xdb, 0xd8, 0x49, 0xd6, 0x13, 0xe3, 0x49, 0xde, 0x86, 0x49, 0x09, - 0xe1, 0x29, 0x82, 0x27, 0xa2, 0x1c, 0xab, 0x8d, 0x9d, 0x44, 0x62, 0x60, 0x1d, 0x59, 0xa5, 0xe6, - 0xb3, 0x63, 0x52, 0xa3, 0x8e, 0xcf, 0x0a, 0x1d, 0x99, 0xbc, 0x0f, 0xe3, 0xd5, 0x16, 0xfb, 0x10, - 0xb7, 0x6d, 0x07, 0x54, 0x78, 0xc2, 0x49, 0xdb, 0x12, 0xa5, 0x44, 0x99, 0xaa, 0x3c, 0xf9, 0x71, - 0x54, 0xa4, 0x25, 0x3f, 0x8e, 0xc0, 0xac, 0xf3, 0xf8, 0x7b, 0x92, 0x98, 0xc3, 0xd2, 0x4b, 0xee, - 0xf9, 0x14, 0xfb, 0x0e, 0x85, 0xbd, 0x88, 0x04, 0xc8, 0xa0, 0xf2, 0x3d, 0x27, 0x16, 0x85, 0x55, - 0xe5, 0x49, 0xde, 0x81, 0x71, 0x91, 0x47, 0xaa, 0x64, 0xae, 0xfb, 0xf3, 0x05, 0xfc, 0x78, 0xf4, - 0xed, 0x97, 0x29, 0xa7, 0x2c, 0xdb, 0x8b, 0x19, 0x32, 0x46, 0xf8, 0xe4, 0x4b, 0x30, 0xb7, 0xed, - 0xb4, 0x1b, 0xee, 0xa1, 0x2f, 0x8e, 0x29, 0xb1, 0xd1, 0xcd, 0x44, 0x6e, 0x44, 0x87, 0xbc, 0x3c, - 0x14, 0xce, 0x12, 0x1b, 0x5f, 0x2a, 0x07, 0xf2, 0xbd, 0x09, 0xce, 0x7c, 0x06, 0x91, 0x7e, 0x33, - 0x68, 0x31, 0x31, 0x83, 0x92, 0xd5, 0xc7, 0xa7, 0x53, 0x6a, 0x35, 0xc4, 0x05, 0xa2, 0x9f, 0xef, - 0xf7, 0x5c, 0xa7, 0x3d, 0x3f, 0x8b, 0x7b, 0xe1, 0xb3, 0x71, 0x6f, 0x7a, 0xc4, 0x13, 0x49, 0xa4, - 0x8d, 0x93, 0xe3, 0xe2, 0xa5, 0xb8, 0x10, 0xfe, 0x81, 0xab, 0x29, 0xca, 0x53, 0x58, 0x93, 0xf7, - 0x61, 0x82, 0xfd, 0x1f, 0x6a, 0x09, 0xe6, 0x34, 0x8b, 0x40, 0x05, 0x53, 0xd4, 0x83, 0x63, 0x84, - 0x89, 0xae, 0x52, 0x14, 0x08, 0x1a, 0x2b, 0xf2, 0x26, 0x00, 0x93, 0x63, 0xc4, 0x76, 0x7c, 0x2e, - 0x0a, 0x7a, 0x8b, 0x62, 0x50, 0x72, 0x23, 0x8e, 0x90, 0xc9, 0xdb, 0x30, 0xce, 0x7e, 0xd5, 0xba, - 0x0d, 0x97, 0xad, 0x8d, 0xf3, 0x48, 0xcb, 0x9d, 0x12, 0x19, 0xad, 0xcf, 0xe1, 0x9a, 0x53, 0x62, - 0x84, 0x4e, 0x56, 0x60, 0x1a, 0x83, 0x13, 0x8b, 0xb0, 0x98, 0x0e, 0xf5, 0xe7, 0x2f, 0x28, 0xef, - 0xe0, 0xac, 0xc8, 0x72, 0xc2, 0x32, 0xf5, 0x72, 0x11, 0x23, 0x23, 0x3e, 0xcc, 0x26, 0x1f, 0x12, - 0xfd, 0xf9, 0x79, 0xec, 0x24, 0x29, 0x52, 0x27, 0x31, 0xf8, 0x7e, 0xcc, 0x46, 0x44, 0xd9, 0xb8, - 0xe4, 0x73, 0x82, 0x5a, 0x61, 0x1a, 0x77, 0x62, 0x02, 0xb9, 0x5b, 0xde, 0x88, 0x47, 0xef, 0xbd, - 0x88, 0x5f, 0x80, 0xc3, 0xbc, 0x57, 0x8f, 0xb2, 0x46, 0xa7, 0x44, 0xf0, 0x4d, 0xa1, 0x26, 0xdf, - 0x84, 0x73, 0x72, 0x07, 0x11, 0x45, 0x62, 0x5e, 0x2f, 0x9c, 0x71, 0x27, 0x6e, 0xec, 0x84, 0x55, - 0x27, 0xa6, 0x74, 0x7a, 0x15, 0xc4, 0x86, 0x71, 0x1c, 0x56, 0x51, 0xe3, 0xb3, 0xfd, 0x6a, 0xbc, - 0x9a, 0xa8, 0xf1, 0x3c, 0x4e, 0x94, 0x64, 0x65, 0x2a, 0x4f, 0xb2, 0x04, 0x93, 0x62, 0x1d, 0x89, - 0xd9, 0xf6, 0x1c, 0xf6, 0x16, 0x6a, 0x95, 0xe4, 0x0a, 0x4c, 0x4c, 0x38, 0x9d, 0x44, 0xdd, 0x91, - 0xf9, 0x33, 0xc2, 0xf3, 0xda, 0x8e, 0x1c, 0x7f, 0x3d, 0xd0, 0x91, 0xd9, 0x8e, 0x14, 0x49, 0x31, - 0xcb, 0x8f, 0x3b, 0x9e, 0xd0, 0x19, 0x5d, 0x8a, 0xf2, 0xe1, 0x28, 0xc2, 0x8f, 0x45, 0x43, 0x0c, - 0x75, 0x4b, 0x48, 0xe3, 0x40, 0xb6, 0x60, 0x36, 0x3c, 0xb5, 0x15, 0xc6, 0xc5, 0x28, 0x3e, 0x6c, - 0x74, 0xd4, 0xa7, 0xf3, 0x4d, 0xa3, 0x27, 0x36, 0x5c, 0xd0, 0xce, 0x69, 0x85, 0xf5, 0x65, 0x64, - 0x8d, 0x59, 0xca, 0xf5, 0x43, 0x3e, 0x9d, 0x7d, 0x2f, 0x3e, 0xe4, 0x03, 0x58, 0x88, 0x9f, 0xcd, - 0x4a, 0x2d, 0x2f, 0x60, 0x2d, 0xaf, 0x9e, 0x1c, 0x17, 0xaf, 0x24, 0x8e, 0xf7, 0xf4, 0x8a, 0xfa, - 0x70, 0x23, 0x5f, 0x83, 0x79, 0xfd, 0x7c, 0x56, 0x6a, 0x32, 0xb0, 0x26, 0x5c, 0x3a, 0xe1, 0xc1, - 0x9e, 0x5e, 0x43, 0x4f, 0x1e, 0x24, 0x80, 0x62, 0xea, 0xec, 0x56, 0xaa, 0x79, 0x31, 0xfa, 0xa0, - 0xc4, 0x2a, 0x49, 0xaf, 0xee, 0x34, 0x96, 0xe4, 0x10, 0x2e, 0xa5, 0x1d, 0x13, 0x4a, 0xa5, 0x2f, - 0x85, 0x5a, 0xd9, 0x4f, 0xa5, 0x1f, 0x39, 0xe9, 0x35, 0x9f, 0xc2, 0x96, 0x7c, 0x19, 0xce, 0x29, - 0xeb, 0x4b, 0xa9, 0xef, 0x65, 0xac, 0x0f, 0x9d, 0x80, 0xd5, 0x85, 0x99, 0x5e, 0x4b, 0x3a, 0x0f, - 0xd2, 0x82, 0x59, 0xf9, 0xe1, 0xa8, 0xfe, 0x16, 0x47, 0xcf, 0x15, 0x6d, 0x57, 0x4d, 0x62, 0x2c, - 0x5d, 0x16, 0xbb, 0xea, 0x7c, 0x63, 0xc7, 0xea, 0x44, 0x84, 0xea, 0x4c, 0x4f, 0xe1, 0x4b, 0x56, - 0x60, 0xa4, 0xb6, 0x51, 0xbd, 0x73, 0x67, 0x79, 0xfe, 0x15, 0xac, 0x41, 0x7a, 0x0c, 0x71, 0xa0, - 0x76, 0x69, 0x12, 0x86, 0x6a, 0x1d, 0x67, 0x77, 0x57, 0x73, 0xcc, 0xe2, 0xa8, 0xe4, 0x7b, 0xd1, - 0x44, 0x8c, 0xed, 0xa8, 0x25, 0xdf, 0x77, 0xf6, 0x30, 0xde, 0xb0, 0x3f, 0xff, 0xaa, 0xf6, 0xd2, - 0x2b, 0x63, 0x31, 0x97, 0x31, 0x55, 0x55, 0x02, 0x9d, 0x4b, 0x9b, 0x27, 0xc7, 0xc5, 0xe7, 0xc5, - 0xce, 0x6d, 0xd9, 0x11, 0x2b, 0x75, 0x13, 0x4f, 0x56, 0x74, 0x6f, 0x28, 0x7f, 0xb5, 0x70, 0xed, - 0xde, 0x50, 0xfe, 0x5a, 0xe1, 0x55, 0xf3, 0xb9, 0x5a, 0x69, 0x6d, 0xb5, 0xda, 0x90, 0x1b, 0xbd, - 0x8c, 0xfc, 0xcc, 0xfb, 0xda, 0xbc, 0xd2, 0xaf, 0x34, 0x1a, 0x09, 0xe3, 0xef, 0x65, 0xa0, 0x78, - 0x4a, 0x83, 0xd9, 0xde, 0x1a, 0xf5, 0x66, 0x8d, 0x06, 0x6a, 0xfc, 0xe8, 0x68, 0x14, 0x2c, 0xfd, - 0xf1, 0x5a, 0x27, 0x41, 0xd7, 0x27, 0x91, 0xb4, 0x40, 0xf1, 0x80, 0x4b, 0x26, 0x2b, 0x90, 0x58, - 0xc6, 0x2f, 0x64, 0x60, 0x36, 0x65, 0x7c, 0xc8, 0x15, 0x18, 0xc2, 0x2c, 0x44, 0x8a, 0xb5, 0x41, - 0x2c, 0xfb, 0x10, 0x96, 0x93, 0x4f, 0xc3, 0x68, 0x65, 0xbd, 0x56, 0x2b, 0xad, 0xcb, 0xab, 0x2c, - 0xdf, 0xc6, 0xdb, 0xbe, 0xe5, 0xdb, 0xfa, 0x23, 0xa5, 0x40, 0x23, 0xaf, 0xc3, 0x48, 0x75, 0x03, - 0x09, 0xb8, 0xcd, 0x1c, 0xb6, 0xd0, 0xe9, 0xc4, 0xf1, 0x05, 0x92, 0xf1, 0xe3, 0x19, 0x20, 0xc9, - 0xc9, 0x46, 0x6e, 0xc2, 0xb8, 0x3a, 0xa5, 0xf9, 0xc5, 0x1b, 0x1f, 0xd4, 0x94, 0x09, 0x6b, 0xaa, - 0x38, 0xa4, 0x02, 0xc3, 0x98, 0x3f, 0x32, 0x7c, 0x1d, 0x4d, 0x3d, 0x18, 0x2f, 0x24, 0x0e, 0xc6, - 0x61, 0xcc, 0x4e, 0x69, 0x72, 0x62, 0xe3, 0xf7, 0x32, 0x40, 0xd2, 0x6d, 0x9e, 0x06, 0xb2, 0xce, - 0x78, 0x43, 0xf1, 0x79, 0x56, 0xf3, 0x8c, 0x84, 0x49, 0xa2, 0xd4, 0x4b, 0x64, 0xe4, 0x1d, 0x7d, - 0x45, 0x53, 0x5a, 0xf4, 0x76, 0x94, 0xbb, 0x06, 0xc3, 0x0f, 0xa9, 0xb7, 0x23, 0xcd, 0x41, 0xd1, - 0x84, 0xec, 0x11, 0x03, 0xa8, 0x97, 0x78, 0xc4, 0x30, 0xfe, 0x2c, 0x03, 0x73, 0x69, 0x12, 0xee, - 0x29, 0xfe, 0x6c, 0x46, 0xcc, 0x15, 0x0f, 0x2d, 0x33, 0xb8, 0x7d, 0x59, 0xe8, 0x80, 0x57, 0x84, - 0x61, 0xf6, 0xb1, 0x72, 0x84, 0x51, 0x89, 0xc2, 0x7a, 0xc3, 0x37, 0x39, 0x9c, 0x21, 0xf0, 0xd8, - 0x5e, 0x43, 0x18, 0x16, 0x0e, 0x11, 0x70, 0x3e, 0x9a, 0x1c, 0xce, 0x10, 0xd6, 0xdc, 0x46, 0x98, - 0x3a, 0x1d, 0x11, 0x5a, 0x0c, 0x60, 0x72, 0x38, 0xb9, 0x02, 0xa3, 0x0f, 0xda, 0xab, 0xd4, 0x7e, - 0x24, 0x63, 0xdd, 0xa3, 0x25, 0x89, 0xdb, 0xb6, 0x9a, 0x0c, 0x66, 0xca, 0x42, 0xe3, 0x67, 0x32, - 0x30, 0x93, 0x10, 0xae, 0x4f, 0x77, 0xd9, 0xeb, 0xef, 0x3b, 0x33, 0xc8, 0xf7, 0xf1, 0xe6, 0x0f, - 0xa5, 0x37, 0xdf, 0xf8, 0x6f, 0x47, 0xe0, 0x42, 0x0f, 0x5d, 0x47, 0xe4, 0xdb, 0x97, 0x39, 0xd5, - 0xb7, 0xef, 0x2b, 0x30, 0x59, 0x6e, 0xda, 0x4e, 0xcb, 0xdf, 0x74, 0xa3, 0x16, 0x47, 0x2e, 0x02, - 0x58, 0x26, 0xb3, 0xc7, 0x4b, 0x5b, 0xf2, 0x8b, 0x75, 0xa4, 0xb0, 0x02, 0x37, 0x29, 0x6a, 0x69, - 0xcc, 0x12, 0xde, 0x75, 0xb9, 0xbf, 0x26, 0xde, 0x75, 0xba, 0xbf, 0xc7, 0xd0, 0x13, 0xf5, 0xf7, - 0x48, 0xb7, 0x15, 0x1d, 0xfe, 0x28, 0x96, 0xc3, 0x65, 0x98, 0xe4, 0xa6, 0x34, 0x25, 0x9f, 0x0f, - 0xd2, 0x48, 0xc2, 0xfc, 0xc6, 0xf6, 0x93, 0x63, 0xa1, 0xd1, 0x90, 0x15, 0xdd, 0x37, 0x61, 0x14, - 0x9f, 0x00, 0xaf, 0xf4, 0xf6, 0x3d, 0xd0, 0x9e, 0xfe, 0x35, 0x1f, 0x84, 0x6f, 0xc1, 0x5c, 0xda, - 0x65, 0x69, 0x3e, 0xaf, 0x59, 0xe9, 0xf5, 0xb4, 0xee, 0x1c, 0xfc, 0xca, 0x75, 0x90, 0x7a, 0xe5, - 0x92, 0x3e, 0xa3, 0x63, 0x5a, 0x28, 0xd8, 0x1e, 0x6b, 0x81, 0xe3, 0xf6, 0xf7, 0x2c, 0x35, 0xbe, - 0x02, 0xcf, 0xf7, 0x25, 0x27, 0x6f, 0x69, 0xb1, 0x49, 0x5e, 0x49, 0xc6, 0x26, 0xf9, 0xee, 0x71, - 0x71, 0x46, 0xf3, 0xf7, 0x5a, 0x0b, 0xd5, 0xc5, 0xc6, 0xcf, 0x64, 0x75, 0x4f, 0xc5, 0xbf, 0x8e, - 0x0b, 0xf5, 0x1a, 0x0c, 0x6f, 0xef, 0x53, 0x4f, 0x1e, 0x0f, 0xd8, 0x90, 0x43, 0x06, 0x50, 0x1b, - 0x82, 0x18, 0xe4, 0x0e, 0x4c, 0x6d, 0xf0, 0x89, 0x2b, 0x67, 0xe3, 0x50, 0x74, 0x63, 0xef, 0x08, - 0xbd, 0x52, 0xca, 0x74, 0x8c, 0x51, 0x19, 0x77, 0x63, 0x9d, 0x2e, 0x22, 0xab, 0x70, 0x8f, 0x0a, - 0x2e, 0x40, 0x4c, 0x45, 0x3e, 0x24, 0xd1, 0x66, 0x6b, 0xc6, 0xa0, 0xc6, 0x2e, 0x5c, 0xea, 0xcb, - 0x88, 0x9d, 0xdb, 0xd0, 0x09, 0x7f, 0xc5, 0x2c, 0x36, 0xfb, 0x92, 0x9a, 0x0a, 0x9d, 0xf1, 0x2d, - 0x98, 0x50, 0x7b, 0x19, 0x8f, 0x20, 0xf6, 0x5b, 0xcc, 0x0a, 0x7e, 0x04, 0x31, 0x80, 0xc9, 0xe1, - 0xd1, 0x4b, 0x40, 0x36, 0xfd, 0x25, 0x20, 0x1a, 0xfe, 0xdc, 0x69, 0xc3, 0xcf, 0x2a, 0xc7, 0x1d, - 0x4e, 0xa9, 0x1c, 0x7f, 0xab, 0x95, 0x63, 0xe8, 0x14, 0x93, 0xc3, 0x9f, 0x68, 0xe5, 0xbf, 0x2b, - 0x93, 0x23, 0xa1, 0xc3, 0x86, 0x5c, 0xee, 0x51, 0x12, 0xf8, 0xd9, 0xb4, 0xd5, 0x1b, 0x61, 0x46, - 0x32, 0x45, 0xf6, 0x34, 0x99, 0xe2, 0x2c, 0x13, 0x11, 0x25, 0x55, 0x3e, 0xa4, 0x43, 0x91, 0x1c, - 0x68, 0x27, 0x8c, 0x17, 0x24, 0x96, 0xf1, 0xed, 0x0c, 0x9c, 0x4b, 0xd5, 0xb8, 0xb2, 0x5a, 0xb9, - 0x6a, 0x57, 0x59, 0x87, 0x71, 0xbd, 0x2e, 0xc7, 0x38, 0x8b, 0xdf, 0xfc, 0xe0, 0xdf, 0x62, 0xbc, - 0x00, 0x63, 0xe1, 0x7b, 0x1f, 0x99, 0x93, 0x43, 0x87, 0x46, 0x6e, 0xf2, 0xd9, 0xa8, 0x06, 0xc0, - 0x5a, 0xf0, 0x44, 0x4d, 0x32, 0x8d, 0xdf, 0xcd, 0xf2, 0xc4, 0x99, 0x4f, 0x6d, 0x08, 0xcc, 0x74, - 0x3b, 0x4a, 0xf6, 0x49, 0xbd, 0x03, 0x5f, 0x92, 0x65, 0x18, 0xa9, 0x05, 0x76, 0xd0, 0x95, 0xee, - 0xfe, 0xb3, 0x2a, 0x19, 0x16, 0x3c, 0x5c, 0x8c, 0x1c, 0xbe, 0x7d, 0x84, 0x68, 0x77, 0x4c, 0x84, - 0x28, 0xe6, 0x98, 0x7f, 0x98, 0x81, 0x09, 0x95, 0x98, 0xbc, 0x0f, 0x53, 0x32, 0xb0, 0x1f, 0x0f, - 0x82, 0x20, 0x1e, 0x27, 0xa5, 0x65, 0x8f, 0x0c, 0xec, 0xa7, 0x06, 0x4d, 0xd0, 0xf0, 0xd5, 0xad, - 0xba, 0xa3, 0x22, 0x93, 0x06, 0x90, 0xd6, 0xae, 0x6d, 0x1d, 0x52, 0xfb, 0x80, 0xfa, 0x81, 0xc5, - 0x2d, 0x30, 0xc4, 0x1b, 0xa6, 0x64, 0xbf, 0x76, 0xa7, 0xc4, 0x8d, 0x2f, 0xd8, 0x48, 0x88, 0x08, - 0x8d, 0x09, 0x1a, 0xf5, 0x61, 0xa6, 0xb5, 0x6b, 0x6f, 0xf3, 0x42, 0x4e, 0x67, 0xfc, 0xf9, 0x08, - 0x9f, 0x6e, 0x22, 0x0e, 0xe8, 0x0e, 0x4c, 0x3d, 0xa8, 0x56, 0xca, 0x8a, 0x9a, 0x56, 0x4f, 0x23, - 0xb3, 0xfc, 0x38, 0xa0, 0x5e, 0xdb, 0x6e, 0xca, 0x1b, 0x6a, 0x74, 0x04, 0xb9, 0x4e, 0xa3, 0x9e, - 0xae, 0xc2, 0x8d, 0x71, 0x64, 0x75, 0xf0, 0xbb, 0x70, 0x58, 0x47, 0x76, 0xc0, 0x3a, 0x7c, 0xbb, - 0xd5, 0xec, 0x51, 0x87, 0xce, 0x91, 0xec, 0x43, 0xe1, 0x2e, 0x4a, 0x97, 0x4a, 0x2d, 0xb9, 0xfe, - 0xb5, 0xbc, 0x28, 0x6a, 0x79, 0x96, 0x8b, 0xa5, 0xe9, 0xf5, 0x24, 0xb8, 0x46, 0xfb, 0xc4, 0xd0, - 0xa9, 0xfb, 0xc4, 0xdf, 0xc9, 0xc0, 0x08, 0x17, 0x5f, 0xc5, 0x34, 0xee, 0x21, 0x20, 0x6f, 0x3f, - 0x19, 0x01, 0xb9, 0x80, 0xe7, 0x84, 0x36, 0xa1, 0x79, 0x19, 0xa9, 0xc4, 0xd6, 0x85, 0xb4, 0x22, - 0xc6, 0x07, 0x17, 0x5e, 0x72, 0xfa, 0xb2, 0x20, 0xd5, 0xc8, 0x05, 0x7f, 0xf4, 0x54, 0x2f, 0x4f, - 0x19, 0xb6, 0x60, 0x54, 0xb8, 0xe0, 0xeb, 0x8e, 0xf7, 0xab, 0x30, 0x26, 0x1c, 0xfb, 0x97, 0x8e, - 0xc4, 0xb3, 0x6a, 0x41, 0xb3, 0x54, 0x69, 0x2c, 0x1d, 0x45, 0xa2, 0xb9, 0x08, 0x0d, 0x60, 0xed, - 0x1c, 0x69, 0x79, 0x48, 0x25, 0x22, 0x79, 0xc0, 0xf3, 0xf3, 0xf1, 0x48, 0xa9, 0x7a, 0x68, 0xf4, - 0x10, 0x2e, 0x42, 0x06, 0x49, 0xef, 0xe0, 0x94, 0xc0, 0xa8, 0x11, 0x0f, 0xb2, 0x0a, 0x05, 0xb4, - 0x6e, 0xa2, 0x0d, 0xbe, 0x6a, 0xaa, 0x15, 0xee, 0x3c, 0x2e, 0x2c, 0x54, 0x03, 0x5e, 0x26, 0x96, - 0x5b, 0xcc, 0x6f, 0x2b, 0x41, 0xc9, 0xae, 0xd3, 0x85, 0xf8, 0xec, 0x23, 0x6f, 0xc3, 0x78, 0x18, - 0xa9, 0x36, 0xf4, 0x1c, 0xc5, 0xe7, 0x95, 0x28, 0xb4, 0xad, 0x9e, 0xd5, 0x4d, 0x41, 0x27, 0x8b, - 0x90, 0x67, 0x8b, 0x38, 0x9e, 0x01, 0xb5, 0x2b, 0x60, 0xaa, 0x27, 0x87, 0xc4, 0x23, 0x35, 0x98, - 0x65, 0x8b, 0xa6, 0xe6, 0xb4, 0xf7, 0x9a, 0x74, 0xd5, 0xdd, 0x73, 0xbb, 0x41, 0x94, 0xe4, 0x8c, - 0x5f, 0x60, 0xec, 0x56, 0x53, 0x2b, 0xd6, 0x53, 0x9c, 0xa5, 0x50, 0x2b, 0x5b, 0xe5, 0x9f, 0x64, - 0x61, 0x5c, 0x99, 0x4f, 0xe4, 0x1a, 0xe4, 0xab, 0xfe, 0xaa, 0x5b, 0x3f, 0x08, 0x63, 0xca, 0x4d, - 0x9e, 0x1c, 0x17, 0xc7, 0x1c, 0xdf, 0x6a, 0x22, 0xd0, 0x0c, 0x8b, 0xc9, 0x12, 0x4c, 0xf2, 0xbf, - 0x64, 0x06, 0x81, 0x6c, 0xa4, 0xde, 0xe2, 0xc8, 0x32, 0x77, 0x80, 0xba, 0x7b, 0x6a, 0x24, 0xe4, - 0xab, 0x00, 0x1c, 0x80, 0x5e, 0xc8, 0xb9, 0xc1, 0xfd, 0xa7, 0x45, 0x05, 0x29, 0xfe, 0xc7, 0x0a, - 0x43, 0xf2, 0x75, 0x1e, 0xd9, 0x56, 0xce, 0xff, 0xa1, 0xc1, 0x1d, 0xc0, 0x19, 0x7f, 0x2b, 0x3d, - 0x0e, 0x85, 0xca, 0x52, 0x24, 0xfd, 0x58, 0x30, 0x69, 0xdd, 0x7d, 0x44, 0xbd, 0xa3, 0x52, 0x80, - 0x88, 0x0a, 0x86, 0xf1, 0xbf, 0x66, 0x94, 0x55, 0x43, 0xd6, 0x31, 0x69, 0x2f, 0x9f, 0x11, 0xc2, - 0xc2, 0x28, 0xbc, 0x33, 0x48, 0xb8, 0x49, 0x77, 0x97, 0x9e, 0x15, 0xf6, 0xd0, 0xb3, 0xe1, 0xbc, - 0x8a, 0x25, 0xf3, 0xe5, 0x40, 0xf2, 0x05, 0x18, 0xc2, 0xae, 0xcb, 0x9e, 0xfa, 0x69, 0xf2, 0xd8, - 0x1e, 0x62, 0x7d, 0x86, 0x1f, 0x82, 0x94, 0xe4, 0xd3, 0xc2, 0x83, 0x93, 0x77, 0xfe, 0x94, 0x72, - 0xf6, 0xb2, 0x76, 0x84, 0xe7, 0x75, 0x14, 0x8a, 0x44, 0x99, 0x3d, 0x7f, 0x2f, 0x0b, 0x85, 0xf8, - 0x5a, 0x25, 0xef, 0xc1, 0x84, 0x3c, 0x4f, 0x57, 0x6c, 0x11, 0xfe, 0x7e, 0x42, 0x84, 0x9f, 0x97, - 0x87, 0xea, 0xbe, 0xad, 0x5a, 0x24, 0x99, 0x1a, 0x01, 0x13, 0x6e, 0x36, 0x45, 0x68, 0x30, 0x65, - 0x95, 0x04, 0x6e, 0xd0, 0x89, 0x05, 0x54, 0x95, 0x68, 0xe4, 0x0d, 0xc8, 0xad, 0xdd, 0x29, 0x09, - 0x4f, 0x9f, 0x42, 0xfc, 0xd4, 0xe5, 0x96, 0x8c, 0xba, 0x5d, 0x25, 0xc3, 0x27, 0xab, 0x4a, 0xec, - 0xe1, 0x11, 0x2d, 0xe7, 0x98, 0x04, 0x87, 0x1f, 0x77, 0x7a, 0x10, 0xe2, 0x7b, 0x43, 0xf9, 0x5c, - 0x61, 0x48, 0x44, 0xd3, 0xfc, 0xef, 0x73, 0x30, 0x16, 0xd6, 0x4f, 0x88, 0xea, 0x3f, 0xc9, 0x7d, - 0x25, 0xc9, 0x45, 0xc8, 0x4b, 0x71, 0x4d, 0x38, 0xfc, 0x8c, 0xfa, 0x42, 0x54, 0x9b, 0x07, 0x29, - 0x97, 0xf1, 0x65, 0x6e, 0xca, 0x9f, 0xe4, 0x26, 0x84, 0x42, 0x57, 0x2f, 0xe9, 0x6c, 0x88, 0x0d, - 0x98, 0x19, 0xa2, 0x91, 0x29, 0xc8, 0x3a, 0x3c, 0x42, 0xd3, 0x98, 0x99, 0x75, 0x1a, 0xe4, 0x3d, - 0xc8, 0xdb, 0x8d, 0x06, 0x6d, 0x58, 0xb6, 0x34, 0xd5, 0xe9, 0x37, 0x69, 0xf2, 0x8c, 0x1b, 0x3f, - 0x04, 0x90, 0xaa, 0x14, 0x90, 0x12, 0x8c, 0x35, 0x6d, 0x6e, 0x8d, 0xd7, 0x18, 0xe0, 0x44, 0x89, - 0x38, 0xe4, 0x19, 0xd9, 0x96, 0x4f, 0x1b, 0xe4, 0x15, 0x18, 0x62, 0xa3, 0x29, 0x8e, 0x10, 0x29, - 0x25, 0xb2, 0xc1, 0xe4, 0x1d, 0xb6, 0xf2, 0x8c, 0x89, 0x08, 0xe4, 0x25, 0xc8, 0x75, 0x17, 0x77, - 0xc5, 0xe1, 0x50, 0x88, 0xe2, 0x80, 0x87, 0x68, 0xac, 0x98, 0xdc, 0x82, 0xfc, 0xa1, 0x1e, 0x42, - 0xfa, 0x5c, 0x6c, 0x18, 0x43, 0xfc, 0x10, 0x91, 0xbc, 0x02, 0x39, 0xdf, 0x77, 0x85, 0x7d, 0x8b, - 0x5c, 0x82, 0xb5, 0xda, 0x83, 0x70, 0xd4, 0x18, 0x77, 0xdf, 0x77, 0x97, 0xf2, 0x30, 0xc2, 0x4f, - 0x0c, 0xe3, 0x12, 0x40, 0xd4, 0xc6, 0xa4, 0x03, 0x97, 0xf1, 0x55, 0x18, 0x0b, 0xdb, 0x46, 0x9e, - 0x07, 0x38, 0xa0, 0x47, 0xd6, 0xbe, 0xdd, 0x6e, 0x34, 0xb9, 0xb8, 0x39, 0x61, 0x8e, 0x1d, 0xd0, - 0xa3, 0x15, 0x04, 0x90, 0x0b, 0x30, 0xda, 0x61, 0xc3, 0x2f, 0xe6, 0xf8, 0x84, 0x39, 0xd2, 0xe9, - 0xee, 0xb0, 0xa9, 0x3c, 0x0f, 0xa3, 0xa8, 0x38, 0x15, 0x2b, 0x72, 0xd2, 0x94, 0x3f, 0x8d, 0xbf, - 0xc8, 0x61, 0x9e, 0x15, 0xe5, 0x83, 0xc8, 0x8b, 0x30, 0x59, 0xf7, 0x28, 0x1e, 0x4e, 0x36, 0x13, - 0xb9, 0x44, 0x3d, 0x13, 0x11, 0xb0, 0xda, 0x20, 0x57, 0x60, 0xba, 0xd3, 0xdd, 0x69, 0x3a, 0x75, - 0x56, 0x9b, 0x55, 0xdf, 0x11, 0x81, 0xe1, 0x27, 0xcc, 0x49, 0x0e, 0xbe, 0x4f, 0x8f, 0xca, 0x3b, - 0x18, 0x82, 0xac, 0xa0, 0x46, 0x90, 0x0d, 0xc2, 0x0c, 0xd8, 0xe6, 0xb4, 0x02, 0x47, 0x53, 0xbd, - 0xf3, 0x30, 0x62, 0xdb, 0x7b, 0x5d, 0x87, 0x87, 0x0a, 0x9a, 0x30, 0xc5, 0x2f, 0xf2, 0x29, 0x98, - 0x89, 0x82, 0x1a, 0xcb, 0xcf, 0x18, 0xc6, 0xcf, 0x28, 0x84, 0x05, 0x65, 0x0e, 0x27, 0xaf, 0x03, - 0x51, 0xeb, 0x73, 0x77, 0x3e, 0xa0, 0x75, 0x3e, 0x27, 0x27, 0xcc, 0x19, 0xa5, 0xe4, 0x01, 0x16, - 0x90, 0x17, 0x60, 0xc2, 0xa3, 0x3e, 0x8a, 0x7b, 0xd8, 0x6d, 0x98, 0x86, 0xcc, 0x1c, 0x97, 0x30, - 0xd6, 0x77, 0x57, 0xa1, 0xa0, 0x74, 0x07, 0x06, 0xe9, 0xe5, 0x51, 0xd1, 0xcd, 0xa9, 0x08, 0x6e, - 0x76, 0xaa, 0x0d, 0xf2, 0x25, 0x58, 0x50, 0x30, 0x79, 0x46, 0x34, 0x8b, 0x36, 0x9d, 0x3d, 0x67, - 0xa7, 0x49, 0xc5, 0x7c, 0x4b, 0xce, 0xea, 0xf0, 0x4e, 0x68, 0xce, 0x47, 0xd4, 0x3c, 0x57, 0xda, - 0xb2, 0xa0, 0x25, 0xab, 0x30, 0x17, 0xe3, 0x4c, 0x1b, 0x56, 0xb7, 0xd3, 0x33, 0x36, 0x57, 0xc4, - 0x93, 0xe8, 0x3c, 0x69, 0x63, 0xab, 0x63, 0x7c, 0x0b, 0x26, 0xd4, 0x39, 0xc9, 0x3a, 0x41, 0x15, - 0x34, 0xc4, 0xec, 0x1b, 0x0f, 0x61, 0x55, 0x76, 0xd1, 0x9b, 0x8a, 0x50, 0x82, 0x30, 0xd9, 0xb7, - 0x39, 0x19, 0x42, 0x71, 0x08, 0x5f, 0x80, 0x89, 0x86, 0xe3, 0x77, 0x9a, 0xf6, 0x91, 0x15, 0xa5, - 0xfa, 0x35, 0xc7, 0x05, 0x0c, 0x35, 0x39, 0x4b, 0x30, 0x93, 0xd8, 0x07, 0xc9, 0xeb, 0xfc, 0x86, - 0x2a, 0x84, 0x9f, 0x09, 0x7e, 0xcb, 0x47, 0xcb, 0x5c, 0x4d, 0xee, 0x11, 0x48, 0x46, 0x1b, 0x26, - 0xd4, 0x73, 0xed, 0x94, 0x0c, 0x06, 0xe7, 0x31, 0x1e, 0x07, 0xdf, 0xf4, 0x47, 0x4e, 0x8e, 0x8b, - 0x59, 0xa7, 0x81, 0x51, 0x38, 0xae, 0x42, 0x5e, 0x8a, 0x60, 0x42, 0xf2, 0xc1, 0xd7, 0x01, 0x99, - 0xde, 0xd5, 0x0c, 0x4b, 0x8d, 0x57, 0x60, 0x54, 0x1c, 0x5d, 0xfd, 0xdf, 0x04, 0x8c, 0x1f, 0xce, - 0xc2, 0xb4, 0x49, 0xd9, 0xc6, 0x4a, 0x79, 0xda, 0x92, 0xa7, 0xf6, 0xce, 0x9d, 0x1e, 0xd5, 0x51, - 0xfb, 0xb6, 0x3e, 0x09, 0x43, 0x7e, 0x25, 0x03, 0xb3, 0x29, 0xb8, 0x1f, 0x2a, 0x61, 0xe6, 0x6d, - 0x18, 0xab, 0x38, 0x76, 0xb3, 0xd4, 0x68, 0x84, 0xc1, 0x39, 0x50, 0x70, 0xc7, 0xac, 0x3a, 0x36, - 0x83, 0xaa, 0x42, 0x4c, 0x88, 0x4a, 0x5e, 0x15, 0x93, 0x22, 0x4a, 0x37, 0x8d, 0x93, 0xe2, 0xbb, - 0xc7, 0x45, 0xe0, 0x6d, 0x8a, 0x72, 0xd0, 0x63, 0xa4, 0x55, 0x0e, 0x8c, 0xfc, 0x5e, 0x9e, 0xda, - 0xa1, 0x4b, 0x8f, 0xb4, 0x1a, 0xff, 0xbc, 0x81, 0x72, 0x86, 0xfc, 0x44, 0x16, 0xce, 0xa7, 0x13, - 0x7e, 0xd8, 0xdc, 0xa7, 0x98, 0xad, 0x45, 0x89, 0x0e, 0x8d, 0xb9, 0x4f, 0x79, 0x6a, 0x17, 0xc4, - 0x8f, 0x10, 0xc8, 0x2e, 0x4c, 0xae, 0xda, 0x7e, 0xb0, 0x42, 0x6d, 0x2f, 0xd8, 0xa1, 0x76, 0x30, - 0x80, 0x24, 0xff, 0x92, 0x34, 0x49, 0x40, 0x61, 0x62, 0x5f, 0x52, 0xc6, 0x64, 0x6d, 0x9d, 0x6d, - 0x38, 0x51, 0x86, 0x06, 0x98, 0x28, 0xdf, 0x80, 0xe9, 0x1a, 0x6d, 0xd9, 0x9d, 0x7d, 0xd7, 0x93, - 0x8e, 0xd3, 0xd7, 0x61, 0x32, 0x04, 0xa5, 0xce, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x3a, 0x22, 0xda, - 0x4a, 0xf4, 0x62, 0xe3, 0xef, 0x67, 0xe1, 0x42, 0xa9, 0x2e, 0x2c, 0x05, 0x45, 0x81, 0x34, 0x68, - 0xfe, 0x98, 0xeb, 0x26, 0x37, 0x60, 0x6c, 0xcd, 0x7e, 0xbc, 0x4a, 0x6d, 0x9f, 0xfa, 0x22, 0xf3, - 0x1c, 0x17, 0x7b, 0xed, 0xc7, 0xd1, 0x6b, 0x8e, 0x19, 0xe1, 0xa8, 0x7a, 0x81, 0xa1, 0x8f, 0xa8, - 0x17, 0x30, 0x60, 0x64, 0xc5, 0x6d, 0x36, 0xc4, 0x59, 0x2f, 0x9e, 0x90, 0xf7, 0x11, 0x62, 0x8a, - 0x12, 0x76, 0x9d, 0x9e, 0x0a, 0x5b, 0x8c, 0x4d, 0xf8, 0xd8, 0xbb, 0xe4, 0x0a, 0x8c, 0x62, 0x45, - 0x61, 0x8a, 0x6c, 0x3c, 0x34, 0x9a, 0x14, 0xf3, 0x87, 0x35, 0x4c, 0x59, 0xa8, 0xf6, 0xc4, 0xf0, - 0x47, 0xeb, 0x09, 0xe3, 0x1f, 0xe1, 0xeb, 0xb4, 0xfa, 0x95, 0xec, 0x24, 0x52, 0x1a, 0x92, 0x19, - 0xb0, 0x21, 0xd9, 0x27, 0x36, 0x24, 0xb9, 0x9e, 0x43, 0xf2, 0x23, 0x59, 0x18, 0x0f, 0x1b, 0xfb, - 0x09, 0x0b, 0x51, 0x1e, 0x7e, 0xd7, 0x40, 0xc1, 0x4e, 0x6a, 0xca, 0x5e, 0x21, 0x62, 0x8a, 0x7c, - 0x01, 0x46, 0xc4, 0x62, 0xca, 0xc4, 0x0c, 0x7b, 0x63, 0xa3, 0xbb, 0x34, 0x25, 0x58, 0x8f, 0xe0, - 0x80, 0xfa, 0xa6, 0xa0, 0xc3, 0x68, 0x32, 0xdb, 0x74, 0x47, 0x18, 0x2b, 0x3c, 0xb5, 0x67, 0x54, - 0x7a, 0x34, 0x99, 0xe8, 0xc3, 0x06, 0x3a, 0x9d, 0xfe, 0x69, 0x1e, 0x0a, 0x71, 0x92, 0xd3, 0x83, - 0xc0, 0x6f, 0x74, 0x77, 0xf8, 0x55, 0x85, 0x07, 0x81, 0xef, 0x74, 0x77, 0x4c, 0x06, 0x43, 0x5b, - 0x26, 0xcf, 0x79, 0x84, 0x5f, 0x3d, 0x21, 0x6c, 0x99, 0x3c, 0xe7, 0x91, 0x66, 0xcb, 0xe4, 0x39, - 0x8f, 0x50, 0x91, 0xb0, 0x5a, 0x43, 0x07, 0x78, 0xbc, 0xa7, 0x08, 0x45, 0x42, 0xd3, 0x8f, 0x27, - 0x74, 0x92, 0x68, 0xec, 0xa8, 0x5c, 0xa2, 0xb6, 0x27, 0x02, 0x96, 0x8b, 0xed, 0x0c, 0x8f, 0xca, - 0x1d, 0x04, 0xf3, 0xfc, 0xeb, 0xa6, 0x8a, 0x44, 0x9a, 0x40, 0x94, 0x9f, 0x72, 0x01, 0x9f, 0x7e, - 0xb7, 0x96, 0x46, 0x79, 0x73, 0x2a, 0x6b, 0x4b, 0x5d, 0xcd, 0x29, 0x7c, 0x9f, 0xa4, 0x3a, 0x77, - 0x43, 0x44, 0x61, 0x44, 0x05, 0x52, 0xfe, 0x54, 0x66, 0x32, 0x42, 0x04, 0xf0, 0x28, 0x8d, 0xa1, - 0x1a, 0x29, 0x62, 0x42, 0xde, 0x85, 0x71, 0x35, 0xac, 0x01, 0x77, 0xbe, 0x7f, 0x8e, 0x07, 0xd6, - 0xeb, 0x91, 0x02, 0x54, 0x25, 0x20, 0x3b, 0x70, 0xa1, 0xec, 0xb6, 0xfd, 0x6e, 0x4b, 0x86, 0xf0, - 0x8b, 0x02, 0x07, 0x03, 0x0e, 0x05, 0xfa, 0x48, 0xd7, 0x05, 0x8a, 0xf0, 0xa2, 0x97, 0x5e, 0x13, - 0xfa, 0x05, 0xa4, 0x17, 0x23, 0xb2, 0x09, 0xe3, 0xa8, 0x12, 0x15, 0x66, 0x99, 0xe3, 0xfa, 0xb6, - 0x11, 0x95, 0x54, 0xd8, 0xc2, 0xe0, 0xe1, 0xa3, 0xec, 0x56, 0x53, 0x1a, 0xed, 0xab, 0xaa, 0x5d, - 0x05, 0x99, 0x7c, 0x15, 0xa6, 0xf8, 0x15, 0x6d, 0x9b, 0xee, 0xf0, 0xb9, 0x33, 0xa1, 0x69, 0x22, - 0xf4, 0x42, 0xfe, 0x3a, 0x2f, 0x14, 0xd1, 0x87, 0x74, 0x87, 0x8f, 0xbd, 0xe6, 0x32, 0xa3, 0xe1, - 0x93, 0x2d, 0x98, 0x5d, 0xb1, 0x7d, 0x0e, 0x54, 0xfc, 0xd3, 0x27, 0x51, 0x43, 0x8b, 0xa6, 0xcc, - 0xfb, 0xb6, 0x2f, 0x35, 0xdb, 0xa9, 0xfe, 0xe8, 0x69, 0xf4, 0xe4, 0x87, 0x33, 0x30, 0xaf, 0x29, - 0xbe, 0x85, 0xe1, 0x58, 0x8b, 0xb6, 0x03, 0xf4, 0x8d, 0x99, 0x0a, 0x33, 0xbf, 0xf7, 0x42, 0xe3, - 0x43, 0x12, 0xd3, 0xad, 0x7b, 0x51, 0xb9, 0x6a, 0x23, 0xdc, 0x8b, 0x87, 0x58, 0xa8, 0xb8, 0xa6, - 0xa7, 0xf5, 0x85, 0x1a, 0x5b, 0xd7, 0x12, 0xcd, 0xb8, 0x1d, 0xef, 0x6f, 0xa1, 0xe8, 0xca, 0x84, - 0x8a, 0xae, 0x39, 0x18, 0xc6, 0x5e, 0x95, 0xe1, 0x74, 0xf0, 0x87, 0xf1, 0x69, 0x75, 0x1f, 0x12, - 0x62, 0x61, 0xdf, 0x7d, 0xc8, 0xf8, 0x1f, 0x47, 0x60, 0x3a, 0x36, 0x2d, 0xc4, 0x3d, 0x35, 0x93, - 0xb8, 0xa7, 0xd6, 0x00, 0xb8, 0xaa, 0x77, 0x40, 0x9d, 0xac, 0xf4, 0xcb, 0x1b, 0x17, 0x6e, 0xae, - 0xe1, 0x9a, 0x52, 0xd8, 0x30, 0xa6, 0x7c, 0xc5, 0x0e, 0xa8, 0x23, 0x0f, 0x99, 0xf2, 0x45, 0xaf, - 0x30, 0x8d, 0xd8, 0x90, 0x22, 0x0c, 0x63, 0x20, 0x4d, 0xd5, 0x2d, 0xd2, 0x61, 0x00, 0x93, 0xc3, - 0xc9, 0x8b, 0x30, 0xc2, 0x84, 0xa8, 0x6a, 0x45, 0x6c, 0x82, 0x78, 0xb6, 0x30, 0x29, 0x8b, 0x49, - 0x2c, 0xa2, 0x88, 0xdc, 0x86, 0x09, 0xfe, 0x97, 0x08, 0x83, 0x32, 0xa2, 0x5b, 0x33, 0x5a, 0x4e, - 0x43, 0x46, 0x42, 0xd1, 0xf0, 0xd8, 0xed, 0xa2, 0xd6, 0x45, 0xb5, 0x4e, 0xb5, 0x22, 0x22, 0x2f, - 0xe3, 0xed, 0xc2, 0xe7, 0x40, 0x56, 0x45, 0x84, 0xc0, 0x64, 0x19, 0xe1, 0x9c, 0x90, 0xc7, 0x3b, - 0x25, 0xca, 0x32, 0xdc, 0x29, 0xc1, 0x14, 0x25, 0xe4, 0x1a, 0x7f, 0x5a, 0x41, 0xb1, 0x90, 0x27, - 0xb0, 0xc3, 0x77, 0x0b, 0x54, 0x4c, 0xa0, 0x6c, 0x18, 0x16, 0xb3, 0xca, 0xd9, 0xdf, 0xcb, 0x2d, - 0xdb, 0x69, 0x8a, 0x6d, 0x05, 0x2b, 0x47, 0x5c, 0xca, 0xa0, 0x66, 0x84, 0x40, 0xde, 0x86, 0x29, - 0xf6, 0xa3, 0xec, 0xb6, 0x5a, 0x6e, 0x1b, 0xd9, 0x8f, 0x47, 0x11, 0xb5, 0x90, 0xa4, 0x8e, 0x45, - 0xbc, 0x96, 0x18, 0x2e, 0x3b, 0x4f, 0xf0, 0xd9, 0xb6, 0xcb, 0x1f, 0x7d, 0x26, 0xa2, 0xf3, 0x04, - 0x49, 0x7d, 0x0e, 0x37, 0x55, 0x24, 0xf2, 0x26, 0x4c, 0xb2, 0x9f, 0x77, 0x9d, 0x47, 0x94, 0x57, - 0x38, 0x19, 0xd9, 0x2b, 0x20, 0xd5, 0x1e, 0x2b, 0xe1, 0xf5, 0xe9, 0x98, 0xe4, 0x8b, 0x70, 0x0e, - 0x39, 0xd5, 0xdd, 0x0e, 0x6d, 0x94, 0x76, 0x77, 0x9d, 0xa6, 0xc3, 0xcd, 0xcb, 0x78, 0xc0, 0x0f, - 0xd4, 0xc1, 0xf3, 0x8a, 0x11, 0xc3, 0xb2, 0x23, 0x14, 0x33, 0x9d, 0x92, 0x6c, 0x43, 0xa1, 0xdc, - 0xf5, 0x03, 0xb7, 0x55, 0x0a, 0x02, 0xcf, 0xd9, 0xe9, 0x06, 0xd4, 0x9f, 0x9f, 0xd6, 0xc2, 0x62, - 0xb0, 0xc5, 0x11, 0x16, 0x72, 0x7d, 0x50, 0x1d, 0x29, 0x2c, 0x3b, 0x24, 0x31, 0x13, 0x4c, 0x8c, - 0x3f, 0xce, 0xc0, 0xa4, 0x46, 0x4a, 0xde, 0x80, 0x89, 0x3b, 0x9e, 0x43, 0xdb, 0x8d, 0xe6, 0x91, - 0x72, 0x51, 0xc5, 0x5b, 0xcc, 0xae, 0x80, 0xf3, 0xaf, 0xd6, 0xd0, 0x42, 0x3d, 0x4f, 0x36, 0xd5, - 0xf6, 0xf3, 0x06, 0xf7, 0xce, 0x15, 0x13, 0x34, 0x17, 0xc5, 0xe9, 0xc1, 0x09, 0x2a, 0x66, 0xa7, - 0x82, 0x42, 0xde, 0x81, 0x11, 0xfe, 0xc0, 0x2b, 0x0c, 0x11, 0x2f, 0xa6, 0x7d, 0x26, 0xf7, 0x04, - 0xc7, 0x89, 0x88, 0x56, 0x3c, 0xbe, 0x29, 0x88, 0x8c, 0x9f, 0xcd, 0x00, 0x49, 0xa2, 0x9e, 0xa2, - 0xf7, 0x3a, 0xd5, 0x3a, 0xe8, 0x0b, 0xe1, 0x6a, 0xcc, 0x69, 0x3a, 0x73, 0x56, 0x13, 0x2f, 0xe0, - 0x1d, 0x2f, 0x56, 0x9d, 0xaa, 0x88, 0xe3, 0xc5, 0xc6, 0x0f, 0x65, 0x01, 0x22, 0x6c, 0xf2, 0x39, - 0x9e, 0xaf, 0xe8, 0x8b, 0x5d, 0xbb, 0xe9, 0xec, 0x3a, 0x7a, 0x00, 0x4f, 0x64, 0xf2, 0x0d, 0x59, - 0x62, 0xea, 0x88, 0xe4, 0x3d, 0x98, 0xae, 0x6d, 0xe8, 0xb4, 0x8a, 0x65, 0xba, 0xdf, 0xb1, 0x62, - 0xe4, 0x71, 0x6c, 0x34, 0x38, 0x56, 0x47, 0x83, 0x1b, 0x1c, 0xf3, 0x81, 0x10, 0x25, 0x6c, 0x63, - 0xa9, 0x6d, 0x08, 0xe3, 0xfb, 0x46, 0xb5, 0x22, 0x76, 0x29, 0x6c, 0x9d, 0xdf, 0xb1, 0x3a, 0xc2, - 0x2a, 0x9f, 0xed, 0x13, 0x1a, 0x5e, 0xd4, 0x91, 0xc3, 0x3d, 0xbc, 0xbd, 0x7f, 0x0e, 0xd5, 0x7e, - 0x2d, 0x37, 0xa0, 0x42, 0xdb, 0xf1, 0xd4, 0xde, 0x7b, 0x22, 0xeb, 0x80, 0x61, 0xcd, 0x89, 0x55, - 0xfb, 0x3a, 0x61, 0x01, 0x73, 0x2b, 0xba, 0xa4, 0x70, 0x3b, 0x81, 0x14, 0xa3, 0x99, 0x7f, 0x98, - 0x81, 0x73, 0xa9, 0xb4, 0xe4, 0x3a, 0x40, 0xa4, 0x53, 0x12, 0xbd, 0x84, 0x3b, 0x66, 0x14, 0x9d, - 0xc6, 0x54, 0x30, 0xc8, 0x57, 0xe2, 0xda, 0xa0, 0xd3, 0x0f, 0xc2, 0x05, 0x19, 0x7d, 0x4c, 0xd7, - 0x06, 0xa5, 0xe8, 0x80, 0x8c, 0x5f, 0xc9, 0xc1, 0x8c, 0x12, 0xfc, 0x86, 0xb7, 0xf5, 0x14, 0x03, - 0xf0, 0x03, 0x98, 0x60, 0x5f, 0xe3, 0xd4, 0x85, 0x27, 0x1d, 0xb7, 0x64, 0x79, 0x35, 0xe1, 0x86, - 0x28, 0xb8, 0x5d, 0x57, 0x91, 0x79, 0x4c, 0x40, 0xdc, 0x3a, 0xf1, 0x41, 0xa2, 0x9e, 0xf4, 0xa8, - 0xd3, 0x98, 0x13, 0x1f, 0x26, 0x2b, 0x47, 0x6d, 0xbb, 0x15, 0xd6, 0xc6, 0x2d, 0x5a, 0x3e, 0xd5, - 0xb3, 0x36, 0x0d, 0x9b, 0x57, 0x17, 0x39, 0xec, 0xf0, 0xb2, 0x14, 0x5f, 0x71, 0x8d, 0x6a, 0xe1, - 0x3d, 0x98, 0x49, 0x34, 0xfa, 0x4c, 0xe1, 0x09, 0xb7, 0x81, 0x24, 0xdb, 0x91, 0xc2, 0xe1, 0x53, - 0x7a, 0xf0, 0xcb, 0x73, 0xe1, 0xe3, 0x35, 0x66, 0x74, 0xe7, 0xf6, 0x31, 0x8b, 0x6a, 0xf0, 0xc2, - 0x9f, 0xcb, 0xaa, 0xae, 0xa0, 0x4f, 0xfb, 0xaa, 0xfb, 0x82, 0x76, 0x1b, 0xbe, 0xd4, 0x6b, 0x4c, - 0x07, 0xd2, 0x3a, 0x7c, 0x27, 0x07, 0x17, 0x7a, 0x50, 0x92, 0xa3, 0xf8, 0x24, 0xe2, 0x5a, 0x88, - 0x9b, 0xfd, 0x2b, 0x7c, 0x12, 0x53, 0x89, 0x7c, 0x8e, 0x07, 0x83, 0xa8, 0x63, 0xd6, 0x70, 0x71, - 0xff, 0x46, 0x35, 0xfe, 0x41, 0x08, 0x8d, 0x47, 0x81, 0xe0, 0x50, 0xf2, 0x1e, 0x0c, 0xa3, 0x1f, - 0x70, 0x2c, 0xf8, 0x1e, 0xc3, 0x40, 0xb8, 0x12, 0xa9, 0x90, 0xfd, 0xd4, 0x22, 0x15, 0x32, 0x00, - 0xf9, 0x2c, 0xe4, 0x4a, 0xdb, 0x35, 0x31, 0x2e, 0x53, 0x2a, 0xf9, 0x76, 0x2d, 0xca, 0xb2, 0x60, - 0x6b, 0xe9, 0x10, 0x18, 0x05, 0x23, 0xbc, 0x5b, 0xde, 0x10, 0xa3, 0xa2, 0x12, 0xde, 0x2d, 0x6f, - 0x44, 0x84, 0x7b, 0x75, 0x2d, 0x98, 0xd1, 0xdd, 0xf2, 0xc6, 0xc7, 0x37, 0xed, 0xff, 0xad, 0x2c, - 0x8f, 0x60, 0xc1, 0x3f, 0xec, 0x3d, 0x98, 0xd0, 0x82, 0x13, 0x67, 0x22, 0x79, 0x2c, 0x0c, 0x24, - 0x1d, 0x33, 0x01, 0xd2, 0x08, 0x64, 0xbe, 0x12, 0xf6, 0x1b, 0x25, 0x5e, 0xd5, 0xd8, 0x26, 0xe4, - 0x80, 0x32, 0x71, 0x3c, 0x5f, 0x49, 0x48, 0x42, 0x6e, 0x41, 0x7e, 0x93, 0xb6, 0xed, 0x76, 0x10, - 0x2a, 0x44, 0xd1, 0x5a, 0x38, 0x40, 0x98, 0x2e, 0x35, 0x84, 0x88, 0x68, 0xd9, 0xda, 0xdd, 0xf1, - 0xeb, 0x9e, 0x83, 0x91, 0x6e, 0xc2, 0xb3, 0x98, 0x5b, 0xb6, 0x2a, 0x25, 0x3a, 0x83, 0x18, 0x91, - 0xf1, 0x73, 0x19, 0x18, 0x15, 0x03, 0xc9, 0xf3, 0x4c, 0xed, 0x45, 0x67, 0x89, 0xf0, 0x06, 0xd8, - 0x73, 0xe2, 0xde, 0x00, 0x7b, 0x3c, 0x9c, 0xcc, 0x98, 0xf0, 0x6d, 0x0b, 0x9f, 0x06, 0x71, 0x36, - 0x4a, 0x2f, 0x40, 0x3d, 0x8d, 0x50, 0x88, 0x3a, 0xa8, 0x87, 0x95, 0xf1, 0x0f, 0x44, 0xcb, 0xee, - 0x96, 0x37, 0xc8, 0x22, 0xe4, 0x57, 0x5d, 0x1e, 0xaa, 0x48, 0x4d, 0x1a, 0xda, 0x14, 0x30, 0xb5, - 0x83, 0x24, 0x1e, 0x6b, 0xdf, 0x86, 0xe7, 0x8a, 0xbb, 0x8c, 0xd2, 0xbe, 0x0e, 0x07, 0xc6, 0xda, - 0x17, 0xa2, 0x0e, 0xdc, 0x3e, 0x9a, 0xb2, 0x49, 0x3c, 0xbc, 0x85, 0x89, 0x1c, 0xee, 0xa9, 0x9e, - 0x6b, 0xa2, 0x48, 0xee, 0x14, 0x0b, 0xbd, 0x76, 0x8a, 0x87, 0xb7, 0xcc, 0x14, 0x2a, 0x7c, 0x57, - 0x8b, 0xc0, 0x35, 0xea, 0x3d, 0x7a, 0x8a, 0x77, 0xe9, 0xf4, 0x77, 0xb5, 0xf8, 0xe7, 0x0d, 0xb4, - 0x49, 0xff, 0x61, 0x16, 0xce, 0xa7, 0x13, 0xaa, 0xdf, 0x92, 0xe9, 0xf3, 0x2d, 0x57, 0x21, 0xbf, - 0xe2, 0xfa, 0x81, 0x62, 0xf5, 0x87, 0xea, 0xff, 0x7d, 0x01, 0x33, 0xc3, 0x52, 0x76, 0xe7, 0x66, - 0x7f, 0x87, 0xcb, 0x13, 0xf9, 0x61, 0xdc, 0x06, 0x76, 0xe7, 0xe6, 0x45, 0xe4, 0x2e, 0xe4, 0x4d, - 0xe1, 0x39, 0x15, 0xeb, 0x1a, 0x09, 0x0e, 0xa5, 0x29, 0xe2, 0x09, 0x88, 0x16, 0x23, 0x5a, 0xc0, - 0x48, 0x09, 0x46, 0xc5, 0xe8, 0xc7, 0x9e, 0x8e, 0x53, 0xa6, 0x8c, 0x1e, 0xb6, 0x5d, 0xd2, 0xb1, - 0x1d, 0x05, 0x1f, 0x01, 0xab, 0x15, 0xe9, 0x04, 0x85, 0x3b, 0x0a, 0x7f, 0x24, 0xd4, 0x0d, 0x2c, - 0x43, 0x44, 0xe3, 0x87, 0xb3, 0x00, 0x52, 0x6b, 0xf3, 0xd4, 0xce, 0xb0, 0xcf, 0x6a, 0x33, 0x4c, - 0xb1, 0x37, 0x1a, 0x3c, 0x2f, 0xea, 0x03, 0x34, 0xe7, 0x19, 0x3c, 0x2b, 0x6a, 0x11, 0x86, 0x37, - 0x23, 0x85, 0x96, 0xf0, 0x31, 0x41, 0x75, 0x34, 0x87, 0x1b, 0x3b, 0x30, 0x77, 0x97, 0x06, 0x91, - 0x7a, 0x4b, 0x3e, 0x3d, 0xf6, 0x67, 0xfb, 0x1a, 0x8c, 0x09, 0xfc, 0x70, 0xff, 0xe2, 0xba, 0x18, - 0x11, 0x0a, 0x05, 0x75, 0x31, 0x12, 0x81, 0xed, 0x46, 0x15, 0xda, 0xa4, 0x01, 0xfd, 0x78, 0xab, - 0xa9, 0x01, 0xe1, 0x9f, 0x82, 0x5f, 0x36, 0x58, 0x0d, 0xa7, 0xf6, 0xcf, 0x43, 0x38, 0x17, 0xb6, - 0xfd, 0x49, 0xf2, 0xbd, 0xc1, 0xae, 0x94, 0x22, 0xe2, 0x79, 0xc4, 0xb1, 0x8f, 0xed, 0xc9, 0x63, - 0x58, 0x90, 0x04, 0xdb, 0x4e, 0x68, 0x38, 0x39, 0x10, 0x2d, 0x79, 0x1b, 0xc6, 0x15, 0x1a, 0x11, - 0xb1, 0x1b, 0xd5, 0xd4, 0x87, 0x4e, 0xb0, 0x6f, 0xf9, 0x1c, 0xae, 0xaa, 0xa9, 0x15, 0x74, 0xe3, - 0xcb, 0xf0, 0x6c, 0xe8, 0x07, 0x94, 0x52, 0x75, 0x8c, 0x79, 0xe6, 0x6c, 0xcc, 0xd7, 0xa3, 0xcf, - 0xaa, 0xb6, 0x43, 0x57, 0x67, 0xc9, 0x9b, 0xa8, 0x9f, 0x25, 0x3e, 0xe6, 0xb9, 0x84, 0xf3, 0xb4, - 0xe2, 0x23, 0x6d, 0xbc, 0xa5, 0x34, 0x36, 0x85, 0xa1, 0x46, 0x9c, 0x89, 0x13, 0xff, 0x70, 0x16, - 0xa6, 0x1f, 0x54, 0x2b, 0xe5, 0xd0, 0xfa, 0xe8, 0x13, 0x96, 0xb5, 0x55, 0xfb, 0xb6, 0xde, 0xfb, - 0x8d, 0xb1, 0x05, 0xb3, 0xb1, 0x6e, 0x40, 0xd1, 0xe1, 0x5d, 0xee, 0x41, 0x12, 0x82, 0xa5, 0xd8, - 0x70, 0x3e, 0x8d, 0xfd, 0xc3, 0x5b, 0x66, 0x0c, 0xdb, 0xf8, 0x2f, 0x21, 0xc6, 0x57, 0x6c, 0x61, - 0xaf, 0xc1, 0x58, 0xd5, 0xf7, 0xbb, 0xd4, 0xdb, 0x32, 0x57, 0x55, 0x55, 0x81, 0x83, 0x40, 0xab, - 0xeb, 0x35, 0xcd, 0x08, 0x81, 0x5c, 0x83, 0xbc, 0x08, 0x62, 0x2d, 0xf7, 0x04, 0xd4, 0xda, 0x86, - 0x31, 0xb0, 0xcd, 0xb0, 0x98, 0xbc, 0x01, 0x13, 0xfc, 0x6f, 0x3e, 0xdb, 0x44, 0x87, 0xa3, 0x72, - 0x50, 0xa0, 0xf3, 0xd9, 0x69, 0x6a, 0x68, 0xe4, 0x55, 0xc8, 0x95, 0xca, 0xa6, 0x50, 0x07, 0x09, - 0xb9, 0x11, 0x73, 0xb1, 0x77, 0xa9, 0x7e, 0x89, 0x28, 0x9b, 0x4c, 0xfa, 0x93, 0xf1, 0x1e, 0x84, - 0x26, 0x9b, 0xa7, 0x8c, 0x17, 0xb0, 0xd8, 0x61, 0x86, 0x30, 0x72, 0x03, 0x46, 0x2b, 0xdc, 0x64, - 0x4e, 0xe8, 0xb1, 0x79, 0x4a, 0x32, 0x0e, 0xd2, 0xa2, 0x25, 0x70, 0x10, 0xb9, 0x26, 0x53, 0x35, - 0xe5, 0x23, 0x47, 0x94, 0x1e, 0xf9, 0x98, 0x5e, 0x83, 0x11, 0x11, 0xea, 0x79, 0x4c, 0x49, 0xe2, - 0x10, 0x0f, 0xf1, 0x2c, 0x70, 0x92, 0x1e, 0xa9, 0xf0, 0x24, 0x3d, 0x52, 0x77, 0xe0, 0xc2, 0x5d, - 0xd4, 0xde, 0xe8, 0xf1, 0x91, 0xb6, 0xcc, 0xaa, 0xd0, 0x87, 0xe3, 0x33, 0x10, 0x57, 0xf0, 0xc4, - 0x43, 0x2c, 0x59, 0x5d, 0x4f, 0xcd, 0xb0, 0xd9, 0x8b, 0x11, 0xf9, 0x12, 0xcc, 0xa5, 0x15, 0x09, - 0xad, 0x39, 0x46, 0x02, 0x4a, 0xaf, 0x40, 0x8d, 0x04, 0x94, 0xc6, 0x81, 0xac, 0x42, 0x81, 0xc3, - 0x4b, 0x8d, 0x96, 0xd3, 0xe6, 0x9a, 0x7f, 0xae, 0x55, 0x47, 0xcf, 0x10, 0xc1, 0xd5, 0x66, 0x85, - 0xfc, 0x05, 0x40, 0xf3, 0x25, 0x8a, 0x51, 0x92, 0x9f, 0xca, 0xb0, 0xdb, 0x1c, 0x0f, 0x8c, 0xbc, - 0x65, 0xae, 0xfa, 0x22, 0x8a, 0xdc, 0xf9, 0xc8, 0x4d, 0xa8, 0x16, 0x78, 0x4e, 0x7b, 0x4f, 0xf8, - 0x09, 0x6d, 0x0a, 0x3f, 0xa1, 0xb7, 0x3f, 0x94, 0x9f, 0x10, 0x67, 0xe5, 0x9f, 0x1c, 0x17, 0x27, - 0x3c, 0x51, 0x27, 0xae, 0x22, 0xad, 0x05, 0xac, 0xeb, 0xd0, 0x59, 0x76, 0xab, 0xcd, 0xc3, 0xb2, - 0xd2, 0x06, 0xff, 0xc8, 0x69, 0xdc, 0xc1, 0xb1, 0xeb, 0x30, 0x39, 0x80, 0xd5, 0x0d, 0x11, 0x12, - 0x1f, 0x9a, 0xca, 0x81, 0x5d, 0x3c, 0xa5, 0x2f, 0x0a, 0x77, 0xaf, 0x2d, 0x44, 0x17, 0x4f, 0xe9, - 0xb8, 0x62, 0xe1, 0x34, 0x52, 0x27, 0x8f, 0x46, 0x42, 0x6e, 0xc0, 0xc8, 0x9a, 0xfd, 0xb8, 0xb4, - 0x47, 0x45, 0x0a, 0xbe, 0x49, 0xb9, 0xfd, 0x21, 0x70, 0x29, 0xff, 0x47, 0xdc, 0xd7, 0xe1, 0x19, - 0x53, 0xa0, 0x91, 0xef, 0xcb, 0xc0, 0x79, 0xbe, 0x8c, 0xe5, 0x57, 0xd6, 0x68, 0x10, 0xb0, 0x7e, - 0x10, 0xe1, 0xe4, 0x2e, 0x47, 0x06, 0xdb, 0xe9, 0x78, 0xe8, 0x4a, 0x6f, 0x88, 0x9d, 0x21, 0xec, - 0x38, 0x5f, 0x94, 0x6a, 0x81, 0x72, 0x53, 0xe9, 0xc9, 0x26, 0x8c, 0xaf, 0xdd, 0x29, 0x85, 0xd5, - 0xf2, 0xe8, 0xd9, 0xc5, 0xb4, 0xdd, 0x51, 0x41, 0x4b, 0xf3, 0x34, 0x50, 0xd9, 0x08, 0xef, 0x80, - 0xcf, 0xca, 0xfe, 0x20, 0xaf, 0xab, 0xbe, 0xa5, 0x39, 0x94, 0x9e, 0x47, 0x5b, 0xf6, 0x63, 0xcb, - 0xde, 0xa3, 0xda, 0x2b, 0xb9, 0xd0, 0x5e, 0xff, 0x4c, 0x06, 0x2e, 0xf6, 0xfc, 0x64, 0x72, 0x1b, - 0x2e, 0xd8, 0xdc, 0x63, 0xda, 0xda, 0x0f, 0x82, 0x8e, 0x6f, 0xc9, 0x2b, 0x86, 0xf0, 0x46, 0x35, - 0xcf, 0x89, 0xe2, 0x15, 0x56, 0x2a, 0x6f, 0x1d, 0x3e, 0x79, 0x0f, 0x9e, 0x73, 0xda, 0x3e, 0xad, - 0x77, 0x3d, 0x6a, 0x49, 0x06, 0x75, 0xa7, 0xe1, 0x59, 0x9e, 0xdd, 0xde, 0x93, 0xae, 0xb5, 0xe6, - 0x45, 0x89, 0x23, 0xbc, 0xb2, 0xcb, 0x4e, 0xc3, 0x33, 0x11, 0xc1, 0xf8, 0xe3, 0x0c, 0xcc, 0xf7, - 0xea, 0x12, 0x32, 0x0f, 0xa3, 0xb4, 0x6d, 0xef, 0x34, 0xa5, 0x43, 0x91, 0x29, 0x7f, 0x92, 0x67, - 0x21, 0xda, 0xe9, 0xc5, 0xe9, 0x9f, 0xaf, 0x8b, 0x9c, 0x06, 0x68, 0xda, 0xae, 0xee, 0xeb, 0xc2, - 0x40, 0x79, 0xa2, 0xae, 0xee, 0xee, 0xcf, 0x03, 0x44, 0xdb, 0x39, 0x57, 0x4c, 0x98, 0x63, 0x76, - 0xdd, 0xe3, 0x2b, 0x8f, 0x9c, 0x87, 0x11, 0xbe, 0x5d, 0x0a, 0xff, 0x07, 0xf1, 0x8b, 0x9d, 0xdb, - 0xa2, 0x93, 0x71, 0x9f, 0xcf, 0x2d, 0x4d, 0x68, 0x9d, 0x3d, 0xd2, 0xc2, 0xc1, 0x31, 0x7e, 0x7a, - 0x92, 0x8b, 0x10, 0xa5, 0x6e, 0xb0, 0x2f, 0x85, 0x8e, 0xc5, 0x34, 0x07, 0x30, 0x6e, 0x4b, 0xa9, - 0xd8, 0x65, 0xeb, 0x6e, 0x5f, 0xf2, 0xed, 0x27, 0x9b, 0xfa, 0xf6, 0xf3, 0x1a, 0x8c, 0x95, 0xf7, - 0x69, 0xfd, 0x20, 0x74, 0xc2, 0xc9, 0x0b, 0xe5, 0x3a, 0x03, 0xf2, 0x90, 0xd5, 0x11, 0x02, 0xb9, - 0x01, 0x80, 0x7e, 0xa7, 0x5c, 0x22, 0x55, 0xd2, 0x4e, 0xa0, 0x9b, 0xaa, 0x30, 0x4f, 0x51, 0x50, - 0x90, 0x7d, 0xcd, 0xbc, 0xa3, 0xda, 0xb3, 0x70, 0xf6, 0xbe, 0xb7, 0x2b, 0xd0, 0x23, 0x04, 0xf6, - 0x79, 0xca, 0xbe, 0x22, 0x4e, 0xc1, 0x42, 0x62, 0xf3, 0x51, 0x91, 0xc8, 0x75, 0x18, 0xdb, 0x90, - 0x8e, 0x04, 0x78, 0x08, 0x4e, 0x20, 0x05, 0x44, 0x4e, 0x07, 0xf3, 0x19, 0x33, 0x42, 0x21, 0x9f, - 0x85, 0xd1, 0x32, 0xf5, 0x82, 0xcd, 0xcd, 0x55, 0x34, 0x3a, 0xe1, 0xd9, 0x19, 0xf2, 0x18, 0x49, - 0x3f, 0x08, 0x9a, 0xdf, 0x3d, 0x2e, 0x4e, 0x06, 0x4e, 0x8b, 0x86, 0x51, 0xa7, 0x4d, 0x89, 0x4d, - 0x96, 0xa0, 0xc0, 0x9f, 0xc5, 0xa3, 0xbb, 0x07, 0x9e, 0x8c, 0x79, 0x7e, 0x4e, 0x8b, 0x37, 0xf4, - 0x43, 0xba, 0x13, 0xe6, 0x11, 0x48, 0xe0, 0x93, 0x65, 0x99, 0x7e, 0x43, 0xfd, 0x4c, 0x88, 0x94, - 0x61, 0xf1, 0x1d, 0x83, 0x7d, 0x6d, 0x92, 0x82, 0x94, 0x60, 0xb2, 0xec, 0xb6, 0x3a, 0x76, 0xe0, - 0x60, 0x42, 0xbc, 0x23, 0x71, 0x08, 0xa2, 0x42, 0xaf, 0xae, 0x16, 0x68, 0x27, 0xaa, 0x5a, 0x40, - 0xee, 0xc0, 0x94, 0xe9, 0x76, 0xd9, 0x30, 0xc9, 0x5b, 0x38, 0x3f, 0xe7, 0xd0, 0x34, 0xc4, 0x63, - 0x25, 0xec, 0x58, 0x16, 0x57, 0x6e, 0x2d, 0x20, 0xa8, 0x46, 0x45, 0xd6, 0x53, 0x9e, 0x43, 0xd4, - 0xc3, 0x4d, 0xcd, 0x26, 0x90, 0x60, 0x96, 0xf2, 0x92, 0x72, 0x0b, 0xc6, 0x6b, 0xb5, 0x07, 0x9b, - 0xd4, 0x0f, 0xee, 0x34, 0xdd, 0x43, 0x3c, 0xdb, 0xf2, 0x22, 0xcb, 0x92, 0xef, 0x5a, 0x01, 0xf5, - 0x03, 0x6b, 0xb7, 0xe9, 0x1e, 0x9a, 0x2a, 0x16, 0xf9, 0x1a, 0xeb, 0x0f, 0x45, 0x12, 0x14, 0xa1, - 0x4f, 0xfb, 0x09, 0xab, 0x78, 0x82, 0x44, 0x8b, 0x86, 0x89, 0xac, 0x7a, 0x67, 0x29, 0xe8, 0xe8, - 0x53, 0xe6, 0xb9, 0x8f, 0x8f, 0x4a, 0x8d, 0x86, 0x47, 0x7d, 0x5f, 0x1c, 0x42, 0xdc, 0xa7, 0x0c, - 0x95, 0x0d, 0x36, 0x2f, 0xd0, 0x7c, 0xca, 0x14, 0x02, 0xf2, 0xa3, 0x19, 0x38, 0xa7, 0x7a, 0x9b, - 0xe0, 0x72, 0x41, 0x33, 0x17, 0x7e, 0x24, 0xbd, 0x7e, 0x5d, 0x1e, 0xc2, 0xd7, 0x15, 0xb4, 0xeb, - 0x8f, 0x6e, 0x5e, 0x2f, 0x45, 0x3f, 0x6b, 0x92, 0x08, 0xc3, 0xb8, 0x15, 0x53, 0xf9, 0x45, 0x2d, - 0x98, 0xcf, 0x98, 0x73, 0x76, 0x0a, 0x31, 0x29, 0x33, 0x49, 0x8d, 0xcd, 0x28, 0x34, 0x9c, 0xaa, - 0x6e, 0xe0, 0x99, 0x26, 0x34, 0xaa, 0x62, 0xfe, 0x71, 0x13, 0x2b, 0xa7, 0xa3, 0x0b, 0x64, 0x0a, - 0x0d, 0xa9, 0xc2, 0x34, 0x07, 0xb0, 0x6d, 0x81, 0x27, 0xe1, 0x99, 0x8d, 0x12, 0x01, 0x08, 0x36, - 0xf8, 0xd6, 0x8f, 0x89, 0x78, 0xd4, 0x58, 0x9d, 0x31, 0x3a, 0xf2, 0x1e, 0x4c, 0xf9, 0xfe, 0xbe, - 0xa5, 0xac, 0xd7, 0x39, 0x5c, 0xc5, 0x18, 0x72, 0x54, 0x94, 0xc4, 0x3c, 0xef, 0x26, 0x7c, 0x7f, - 0x3f, 0x5a, 0xd1, 0xef, 0xc1, 0x14, 0xda, 0xea, 0x44, 0x0c, 0xce, 0x45, 0x0c, 0x44, 0x49, 0x9c, - 0x41, 0xd0, 0xf4, 0x23, 0x06, 0x7f, 0x37, 0x03, 0x17, 0x59, 0x45, 0xe9, 0x23, 0x74, 0xfe, 0xc3, - 0x8c, 0x10, 0x06, 0x61, 0xec, 0xc9, 0x53, 0x15, 0x47, 0x7d, 0x7f, 0x3f, 0x8d, 0x03, 0x36, 0x8a, - 0x35, 0x3e, 0xbd, 0x51, 0x17, 0x3e, 0x74, 0xa3, 0x7a, 0xf2, 0x54, 0x1b, 0x15, 0x34, 0xfd, 0x34, - 0x0e, 0x78, 0xad, 0xad, 0x95, 0xd6, 0x56, 0xa3, 0xbb, 0xd9, 0x27, 0xcb, 0x6d, 0x45, 0xfb, 0xb6, - 0x3e, 0x6e, 0x2b, 0x5b, 0xdc, 0x2d, 0x5a, 0xe9, 0x06, 0x79, 0xad, 0xd5, 0xc0, 0xf1, 0x6b, 0x6d, - 0x8c, 0xc6, 0x8c, 0x61, 0x1b, 0xbf, 0x04, 0x31, 0xbe, 0xc2, 0x54, 0xd5, 0x80, 0x11, 0x7e, 0x6b, - 0x15, 0x9d, 0x8c, 0x36, 0x0b, 0xfc, 0x4e, 0x6b, 0x8a, 0x12, 0x72, 0x11, 0x72, 0xb5, 0xda, 0x03, - 0xd1, 0xc9, 0x68, 0xb0, 0xea, 0xfb, 0xae, 0xc9, 0x60, 0x6c, 0x84, 0xd0, 0x0a, 0x55, 0x09, 0x51, - 0xcf, 0xce, 0x3b, 0x13, 0xa1, 0xac, 0xbf, 0xe5, 0x1d, 0x72, 0x28, 0xea, 0x6f, 0x71, 0x87, 0x8c, - 0x6e, 0x8e, 0x65, 0x98, 0x2f, 0xf9, 0x3e, 0xf5, 0xd8, 0x84, 0x10, 0xc6, 0x8d, 0x9e, 0xb8, 0xe7, - 0x88, 0x83, 0x1d, 0x2b, 0xb5, 0xeb, 0xbe, 0xd9, 0x13, 0x91, 0x5c, 0x85, 0x7c, 0xa9, 0xdb, 0x70, - 0x68, 0xbb, 0xae, 0xc5, 0x59, 0xb3, 0x05, 0xcc, 0x0c, 0x4b, 0xc9, 0x17, 0xe1, 0x5c, 0x2c, 0x08, - 0xa2, 0xe8, 0x81, 0xd1, 0x68, 0xef, 0x95, 0xf7, 0xb0, 0xc8, 0x20, 0x83, 0x77, 0x49, 0x3a, 0x25, - 0x29, 0x41, 0x61, 0x19, 0xdd, 0xb4, 0x2a, 0x94, 0xbf, 0x0d, 0xb9, 0x1e, 0xf7, 0xcf, 0xe3, 0xb7, - 0x66, 0xee, 0xc2, 0x65, 0x35, 0xc2, 0x42, 0x33, 0x81, 0x4e, 0xee, 0xc3, 0x6c, 0x1c, 0xc6, 0x4e, - 0x70, 0x7e, 0x41, 0xc6, 0xfd, 0x26, 0xc1, 0x05, 0xcf, 0xf0, 0x34, 0x2a, 0xb2, 0x03, 0x33, 0x91, - 0x41, 0x92, 0x7e, 0x6d, 0x96, 0x76, 0xce, 0x61, 0xb9, 0xbc, 0x3a, 0x3f, 0x2b, 0x26, 0xe3, 0x6c, - 0x64, 0xdc, 0x14, 0x5e, 0x9f, 0xcd, 0x24, 0x3b, 0xd2, 0x80, 0xa9, 0x9a, 0xb3, 0xd7, 0x76, 0xda, - 0x7b, 0xf7, 0xe9, 0xd1, 0x86, 0xed, 0x78, 0xc2, 0xe2, 0x54, 0xda, 0x93, 0x97, 0xfc, 0xa3, 0x56, - 0x8b, 0x06, 0x1e, 0x6e, 0x84, 0xac, 0x1c, 0x7d, 0xd0, 0xd9, 0x75, 0x68, 0xc1, 0xe7, 0x74, 0xe8, - 0xb6, 0xd9, 0xb1, 0x1d, 0x4d, 0x08, 0xd0, 0x79, 0x6a, 0xaa, 0x8b, 0x89, 0x01, 0x55, 0x17, 0x4d, - 0x98, 0x59, 0x6e, 0xd7, 0xbd, 0x23, 0x7c, 0xa2, 0x93, 0x8d, 0x9b, 0x3c, 0xa5, 0x71, 0x2f, 0x89, - 0xc6, 0x3d, 0x67, 0xcb, 0x19, 0x96, 0xd6, 0xbc, 0x24, 0x63, 0x52, 0x83, 0x19, 0xbc, 0x38, 0x54, - 0x2b, 0x1b, 0xd5, 0xb6, 0x13, 0x38, 0x76, 0x40, 0x1b, 0x42, 0xb8, 0x78, 0x59, 0xf0, 0x7c, 0x9e, - 0x5f, 0x51, 0x9d, 0x46, 0xc7, 0x72, 0x24, 0x8a, 0xca, 0x34, 0x41, 0xdf, 0xef, 0x9e, 0x38, 0xfd, - 0x57, 0x74, 0x4f, 0xac, 0xc2, 0x74, 0x3c, 0x36, 0x43, 0x21, 0x3a, 0x87, 0x7d, 0x2c, 0x62, 0xc7, - 0xb9, 0xdb, 0x45, 0x61, 0x52, 0xcb, 0xa2, 0xa8, 0xd3, 0xc5, 0xaf, 0x9c, 0x33, 0xda, 0x95, 0x53, - 0xdb, 0x95, 0xce, 0x70, 0xe5, 0x24, 0x1b, 0x00, 0x77, 0x5c, 0xaf, 0x4e, 0x4b, 0xe8, 0x1f, 0x4d, - 0xb4, 0x7c, 0x44, 0x8c, 0x69, 0x54, 0xc8, 0xd7, 0xcf, 0x2e, 0xfb, 0x6d, 0xc5, 0xdd, 0xdc, 0x15, - 0x1e, 0xc6, 0x8f, 0x65, 0x61, 0xbe, 0x57, 0x73, 0xfa, 0x5c, 0xf7, 0x3e, 0x05, 0xc9, 0x15, 0x2e, - 0xae, 0x7d, 0x05, 0x1a, 0x5f, 0xe7, 0x8b, 0x90, 0xbe, 0x90, 0xc5, 0x35, 0x70, 0x36, 0x4e, 0xb0, - 0xe5, 0x35, 0xc9, 0x6d, 0x18, 0x57, 0x1a, 0x8f, 0x7b, 0x69, 0xaf, 0x4f, 0x35, 0x61, 0x37, 0xfc, - 0x9b, 0x5d, 0x13, 0xf9, 0xbe, 0x25, 0xaf, 0x89, 0xfc, 0x17, 0x29, 0x70, 0x17, 0xf1, 0x11, 0x6e, - 0x05, 0xe0, 0xfb, 0x2e, 0x21, 0x80, 0xfb, 0x36, 0xdf, 0x02, 0x4d, 0xfc, 0xdb, 0xf8, 0x8d, 0x09, - 0x7e, 0x22, 0xab, 0xb7, 0xc4, 0x5e, 0xf6, 0xc1, 0xb1, 0xdb, 0x63, 0xf6, 0x2c, 0xb7, 0xc7, 0xdc, - 0xe9, 0xb7, 0xc7, 0xa1, 0xd3, 0x6e, 0x8f, 0xb1, 0xeb, 0xdd, 0xf0, 0x99, 0xaf, 0x77, 0x23, 0x67, - 0xba, 0xde, 0x8d, 0x9e, 0xe9, 0x7a, 0xa7, 0xdd, 0x54, 0xf3, 0xa7, 0xdd, 0x54, 0xff, 0xe6, 0x32, - 0xf8, 0xb4, 0x5e, 0x06, 0xd3, 0x44, 0xbc, 0x33, 0x5d, 0x06, 0x7f, 0xa4, 0xe7, 0x5d, 0xae, 0xf0, - 0x61, 0x84, 0xf2, 0x17, 0x07, 0xb8, 0xcb, 0x0d, 0x7a, 0x93, 0x9b, 0x79, 0x32, 0x37, 0x39, 0xf2, - 0xc4, 0x6e, 0x72, 0xb3, 0x1f, 0xf5, 0x26, 0x37, 0xf7, 0x24, 0x6f, 0x72, 0xe7, 0xfe, 0x3a, 0xde, - 0xe4, 0xce, 0xff, 0xeb, 0xb9, 0xc9, 0xfd, 0x2d, 0x28, 0xc4, 0x85, 0xcb, 0xd3, 0xc3, 0x18, 0x3f, - 0xb1, 0x18, 0x92, 0x4c, 0xf4, 0x8d, 0x0b, 0x77, 0xe4, 0x06, 0xc0, 0x86, 0xe7, 0x3c, 0xb2, 0x03, - 0x7a, 0x5f, 0x5a, 0xbf, 0x89, 0x10, 0xdc, 0x1c, 0xca, 0x46, 0xde, 0x54, 0x50, 0xc2, 0x7b, 0x4d, - 0x36, 0xed, 0x5e, 0x63, 0xfc, 0x68, 0x16, 0x66, 0x78, 0x20, 0xb6, 0xa7, 0xff, 0x11, 0xf6, 0x5d, - 0xed, 0xb6, 0x2a, 0x6d, 0xad, 0x63, 0x5f, 0xd7, 0xe7, 0x19, 0xf6, 0xab, 0x70, 0x2e, 0xd1, 0x15, - 0x78, 0x63, 0xad, 0xc8, 0x10, 0x78, 0x89, 0x3b, 0xeb, 0x7c, 0x7a, 0x25, 0x0f, 0x6f, 0x99, 0x09, - 0x0a, 0xe3, 0x2f, 0x86, 0x12, 0xfc, 0xc5, 0x83, 0xac, 0xfa, 0xc4, 0x9a, 0x39, 0xdb, 0x13, 0x6b, - 0x76, 0xb0, 0x27, 0xd6, 0x98, 0x50, 0x91, 0x1b, 0x44, 0xa8, 0xf8, 0x22, 0x4c, 0x6e, 0x52, 0xbb, - 0xe5, 0x6f, 0xba, 0x22, 0xff, 0x10, 0xf7, 0xb5, 0x90, 0x11, 0xee, 0x58, 0x99, 0xbc, 0x70, 0x85, - 0x36, 0xa3, 0x01, 0x23, 0x60, 0xc7, 0x20, 0x4f, 0x48, 0x64, 0xea, 0x1c, 0xd4, 0x5b, 0xf4, 0x70, - 0x9f, 0x5b, 0x74, 0x0d, 0x26, 0x04, 0x5d, 0x14, 0xbb, 0x39, 0xba, 0xee, 0xb1, 0x22, 0x84, 0xcb, - 0xda, 0xc3, 0xb4, 0xd8, 0x61, 0xed, 0xfc, 0xa6, 0xa7, 0x31, 0x61, 0x5d, 0xb0, 0xdc, 0x6e, 0x74, - 0x5c, 0xa7, 0x8d, 0x5d, 0x30, 0x1a, 0x75, 0x01, 0x15, 0x60, 0xde, 0x05, 0x0a, 0x12, 0x79, 0x1b, - 0xa6, 0x4a, 0x1b, 0x55, 0x95, 0x2c, 0x1f, 0xbd, 0xf2, 0xda, 0x1d, 0xc7, 0xd2, 0x48, 0x63, 0xb8, - 0xfd, 0x6e, 0x3e, 0x63, 0x7f, 0x35, 0x37, 0x1f, 0xe3, 0x5f, 0x4c, 0xc8, 0xe5, 0xfd, 0xf1, 0x3e, - 0x90, 0xe8, 0x4f, 0x1e, 0xb9, 0x33, 0x3e, 0x79, 0x0c, 0x9d, 0x26, 0x48, 0x6a, 0xf2, 0xed, 0xf0, - 0x99, 0xe4, 0xdb, 0x91, 0x8f, 0xfc, 0x7c, 0x31, 0x7a, 0x46, 0x89, 0x35, 0xb6, 0xd6, 0xf2, 0x83, - 0xac, 0xb5, 0x54, 0x29, 0x77, 0xec, 0xa3, 0x4b, 0xb9, 0x70, 0x66, 0x29, 0xb7, 0x16, 0xf9, 0x2e, - 0x8f, 0x9f, 0xea, 0x12, 0xf2, 0xbc, 0xd0, 0x0a, 0xcc, 0xa4, 0x47, 0xe1, 0x0b, 0xbd, 0x98, 0x3f, - 0x51, 0xa2, 0xf3, 0xd7, 0xd3, 0x45, 0xe7, 0xfe, 0xe7, 0xcd, 0x99, 0x84, 0xe7, 0x1f, 0x7d, 0xb2, - 0xc2, 0xf3, 0x93, 0x7d, 0x08, 0xf9, 0x1b, 0xf1, 0xf9, 0x6f, 0xc4, 0xe7, 0x01, 0xc5, 0x67, 0x0f, - 0x97, 0xd7, 0xb6, 0xed, 0xb5, 0x51, 0xed, 0x74, 0x03, 0x46, 0x65, 0x18, 0xd2, 0x4c, 0xa4, 0x51, - 0x4e, 0xc6, 0x1f, 0x95, 0x58, 0x64, 0x11, 0xf2, 0x92, 0x58, 0x4d, 0x74, 0x73, 0x28, 0x60, 0x5a, - 0x84, 0x47, 0x01, 0x33, 0xfe, 0x83, 0x21, 0xb9, 0x85, 0xb3, 0x39, 0xb3, 0x61, 0x7b, 0x76, 0x0b, - 0x33, 0xa8, 0x85, 0x2b, 0x4c, 0x11, 0xde, 0x63, 0x8b, 0x32, 0x66, 0xda, 0xaf, 0x93, 0x7c, 0xa8, - 0xc0, 0xb0, 0x51, 0x92, 0xda, 0xdc, 0x00, 0x49, 0x6a, 0xdf, 0xd4, 0x32, 0xbc, 0x0e, 0x45, 0x29, - 0x05, 0xd9, 0xb6, 0xd6, 0x3f, 0xb7, 0xeb, 0x6d, 0x35, 0x15, 0xeb, 0x70, 0x14, 0xd5, 0x0b, 0x29, - 0xfb, 0x24, 0x61, 0x0d, 0x6f, 0x23, 0x23, 0x67, 0x09, 0xb9, 0x3c, 0xfa, 0xaf, 0x35, 0xe4, 0xf2, - 0x32, 0x80, 0x38, 0x6a, 0x23, 0xf3, 0x84, 0x97, 0x71, 0xf5, 0x0b, 0x33, 0xe5, 0x20, 0x68, 0xf6, - 0xc8, 0xc9, 0xa1, 0x10, 0x1a, 0x7f, 0x40, 0x60, 0xa6, 0x56, 0x7b, 0x50, 0x71, 0xec, 0xbd, 0xb6, - 0xeb, 0x07, 0x4e, 0xbd, 0xda, 0xde, 0x75, 0x99, 0x28, 0x1e, 0x1e, 0x07, 0x4a, 0x6c, 0xdd, 0xe8, - 0x28, 0x08, 0x8b, 0xd9, 0x55, 0x6f, 0xd9, 0xf3, 0xa4, 0x7e, 0x94, 0x5f, 0xf5, 0x28, 0x03, 0x98, - 0x1c, 0xce, 0xa4, 0xdd, 0x5a, 0x17, 0x23, 0x5b, 0x08, 0x9b, 0x11, 0x94, 0x76, 0x7d, 0x0e, 0x32, - 0x65, 0x19, 0xa1, 0xc9, 0x09, 0x2b, 0x6e, 0x3f, 0x17, 0xb4, 0xc0, 0xcd, 0x51, 0x31, 0x3f, 0xec, - 0x84, 0x30, 0x82, 0xdb, 0x66, 0x07, 0xe1, 0xaa, 0x45, 0x5c, 0x62, 0x0d, 0x1c, 0xc1, 0x39, 0xcd, - 0xe7, 0x79, 0xd0, 0xc7, 0x94, 0x57, 0x85, 0x74, 0x6d, 0x60, 0x88, 0x8d, 0x94, 0x17, 0x15, 0x35, - 0x25, 0x5a, 0x6a, 0x0d, 0xec, 0x3c, 0x7b, 0x3e, 0xb5, 0x24, 0x5c, 0xdd, 0xe3, 0x5a, 0xf0, 0x6c, - 0x65, 0xd3, 0xe0, 0xc9, 0xdf, 0x7a, 0x55, 0x6d, 0xa5, 0x6c, 0x05, 0xfd, 0x6b, 0x22, 0xbf, 0x99, - 0x81, 0x0b, 0x1a, 0x46, 0xb8, 0x5d, 0xf9, 0x61, 0x38, 0x90, 0xd4, 0x79, 0xfd, 0xc1, 0x93, 0x99, - 0xd7, 0x2f, 0xea, 0xdf, 0x12, 0x6d, 0xa8, 0xea, 0x37, 0xf4, 0x6a, 0x21, 0x79, 0x04, 0x33, 0x58, - 0x24, 0x1f, 0x76, 0xd8, 0x9c, 0x15, 0xef, 0x41, 0x73, 0x51, 0xb3, 0xb9, 0x1f, 0x3f, 0x26, 0xf0, - 0x5e, 0xfc, 0xce, 0x71, 0x71, 0x52, 0x43, 0x97, 0xe1, 0xa8, 0xad, 0xe8, 0x75, 0xc8, 0x69, 0xef, - 0xba, 0xaa, 0xa0, 0x94, 0xa8, 0x82, 0xfc, 0xd7, 0x19, 0xfe, 0x9c, 0xc0, 0x3f, 0xe3, 0x8e, 0xe7, - 0xb6, 0xc2, 0x72, 0x69, 0x5a, 0xd9, 0xa3, 0xdb, 0x9a, 0x4f, 0xa6, 0xdb, 0x5e, 0xc6, 0x26, 0xf3, - 0x3d, 0xc1, 0xda, 0xf5, 0xdc, 0x56, 0xd4, 0x7c, 0xb5, 0xe3, 0x7a, 0x36, 0x92, 0x7c, 0x7f, 0x06, - 0x2e, 0x6a, 0x5a, 0x4d, 0x35, 0x37, 0x88, 0x88, 0x96, 0x30, 0x1b, 0xc6, 0x51, 0x89, 0x8a, 0x96, - 0xae, 0x8b, 0xf9, 0x7f, 0x05, 0x5b, 0xa0, 0x84, 0xed, 0x64, 0x48, 0x56, 0x8b, 0x63, 0x29, 0x4d, - 0xe8, 0x5d, 0x0b, 0x71, 0x60, 0x06, 0xad, 0x6c, 0x34, 0x13, 0xe0, 0xb9, 0xde, 0x26, 0xc0, 0x61, - 0xd6, 0x1f, 0xcc, 0x08, 0xd0, 0xdb, 0x0e, 0x38, 0xc9, 0x95, 0x7c, 0x2f, 0x5c, 0x4c, 0x00, 0xc3, - 0xd5, 0x76, 0xae, 0xe7, 0x6a, 0xfb, 0xd4, 0xc9, 0x71, 0xf1, 0x95, 0xb4, 0xda, 0xd2, 0x56, 0x5a, - 0xef, 0x1a, 0x88, 0x0d, 0x10, 0x15, 0x0a, 0xf1, 0x23, 0x7d, 0x82, 0x7e, 0x4a, 0xcc, 0x0f, 0x05, - 0x9f, 0xed, 0xe5, 0x4a, 0x1b, 0xd4, 0x23, 0x2f, 0x42, 0x22, 0x14, 0x26, 0x94, 0x6c, 0x08, 0x47, - 0xc2, 0xd8, 0xa3, 0x47, 0x25, 0xdf, 0x39, 0x2e, 0x6a, 0xd8, 0xec, 0x42, 0xa4, 0xa6, 0x59, 0xd0, - 0xa4, 0x3d, 0x15, 0x91, 0xfc, 0x7a, 0x06, 0xe6, 0x18, 0x20, 0x9a, 0x54, 0xe2, 0xa3, 0xe6, 0xfb, - 0xcd, 0xfa, 0xfd, 0x27, 0x33, 0xeb, 0x5f, 0xc0, 0x36, 0xaa, 0xb3, 0x3e, 0xd1, 0x25, 0xa9, 0x8d, - 0xc3, 0xd9, 0xae, 0x19, 0x74, 0x69, 0xb3, 0xfd, 0xe2, 0x00, 0xb3, 0x9d, 0x0f, 0xc0, 0xe9, 0xb3, - 0xbd, 0x67, 0x2d, 0x64, 0x13, 0x26, 0xc4, 0x5d, 0x88, 0x77, 0xd8, 0x25, 0x2d, 0x8c, 0xb3, 0x5a, - 0xc4, 0x2f, 0xa8, 0x22, 0x59, 0x44, 0xe2, 0x0b, 0x35, 0x2e, 0xa4, 0x0d, 0xb3, 0xfc, 0xb7, 0xae, - 0x9b, 0x2a, 0xf6, 0xd4, 0x4d, 0x5d, 0x15, 0x5f, 0x74, 0x59, 0xf0, 0x8f, 0xa9, 0xa8, 0xd4, 0xf0, - 0x4b, 0x29, 0x8c, 0x49, 0x07, 0x88, 0x06, 0xe6, 0x8b, 0xf6, 0x72, 0x7f, 0x8d, 0xd4, 0x2b, 0xa2, - 0xce, 0x62, 0xbc, 0xce, 0xf8, 0xca, 0x4d, 0xe1, 0x4d, 0x6c, 0x98, 0x16, 0x50, 0xf7, 0x80, 0xf2, - 0x1d, 0xfe, 0x05, 0x2d, 0x00, 0x56, 0xac, 0x94, 0x5f, 0xa2, 0x64, 0x4d, 0x18, 0xa0, 0x2c, 0xb6, - 0xa1, 0xc7, 0xf9, 0x91, 0x07, 0x30, 0x53, 0xea, 0x74, 0x9a, 0x0e, 0x6d, 0xe0, 0x57, 0x9a, 0x5d, - 0xf6, 0x4d, 0x46, 0x94, 0x6f, 0xcd, 0xe6, 0x85, 0xe2, 0x66, 0xe7, 0x75, 0x63, 0xdb, 0x4d, 0x82, - 0xd6, 0xf8, 0x91, 0x4c, 0xa2, 0xd1, 0xe4, 0x35, 0x18, 0xc3, 0x1f, 0x4a, 0x4c, 0x15, 0x54, 0xf1, - 0xf0, 0x26, 0xa2, 0xf2, 0x28, 0x42, 0x60, 0xc2, 0x92, 0x1a, 0x57, 0x31, 0xc7, 0x85, 0x25, 0xa1, - 0x57, 0x88, 0x34, 0x09, 0x45, 0xe9, 0x9a, 0x91, 0x8b, 0x84, 0x2e, 0x74, 0xcd, 0x10, 0x0e, 0x19, - 0xc6, 0xf7, 0x67, 0xf5, 0x69, 0x47, 0xae, 0x2a, 0x72, 0xbb, 0x12, 0xd9, 0x51, 0xca, 0xed, 0x8a, - 0xb4, 0xfe, 0x0f, 0x33, 0x30, 0xfb, 0xc0, 0xdb, 0xb3, 0xdb, 0xce, 0x37, 0x79, 0x18, 0x6d, 0x17, - 0xc7, 0xa5, 0x7f, 0xea, 0xca, 0x27, 0x95, 0x82, 0xcf, 0x55, 0x2a, 0x66, 0x33, 0x05, 0xa7, 0x8c, - 0x99, 0xd6, 0x1e, 0x74, 0x76, 0xc3, 0x86, 0x29, 0x99, 0x10, 0x39, 0x3a, 0x87, 0x1b, 0x3f, 0x91, - 0x85, 0x71, 0x65, 0x09, 0x90, 0xcf, 0xc0, 0x84, 0xca, 0x47, 0x55, 0xf8, 0xa9, 0xd5, 0x9a, 0x1a, - 0x16, 0x6a, 0xfc, 0xa8, 0xdd, 0xd2, 0x34, 0x7e, 0x6c, 0xa2, 0x23, 0xf4, 0x8c, 0x57, 0x9b, 0xf7, - 0x52, 0xae, 0x36, 0x38, 0x6d, 0x15, 0x8d, 0x4d, 0xdf, 0x0b, 0xce, 0xdb, 0xc9, 0x0b, 0x0e, 0x2a, - 0x8f, 0x14, 0xfa, 0xde, 0xd7, 0x1c, 0xe3, 0xa7, 0x33, 0x50, 0x88, 0x2f, 0xd2, 0x8f, 0xa5, 0x57, - 0xce, 0xf0, 0xba, 0xf3, 0xe3, 0xd9, 0x30, 0x15, 0x8a, 0x74, 0xe1, 0x7d, 0x5a, 0xcd, 0x04, 0xdf, - 0xd1, 0x1e, 0x5e, 0x9e, 0xd5, 0xa3, 0xd1, 0xa9, 0xc1, 0x2f, 0xd2, 0x43, 0x50, 0x0e, 0x7d, 0xfb, - 0x17, 0x8b, 0xcf, 0x18, 0xef, 0xc3, 0x5c, 0xbc, 0x3b, 0xf0, 0xf1, 0xa5, 0x04, 0xd3, 0x3a, 0x3c, - 0x9e, 0x48, 0x29, 0x4e, 0x65, 0xc6, 0xf1, 0x8d, 0x3f, 0xca, 0xc6, 0x79, 0x0b, 0x93, 0x41, 0xb6, - 0xe9, 0xa8, 0x86, 0x30, 0x62, 0xd3, 0xe1, 0x20, 0x53, 0x96, 0x9d, 0x25, 0x81, 0x59, 0xe8, 0x88, - 0x9a, 0x4b, 0x77, 0x44, 0x25, 0xb7, 0x63, 0x56, 0xd2, 0x4a, 0xd4, 0xa4, 0x43, 0xba, 0x63, 0x45, - 0x96, 0xd2, 0x31, 0xe3, 0xe8, 0x32, 0xcc, 0x69, 0x21, 0xc0, 0x25, 0xfd, 0x70, 0xa4, 0x6b, 0x0f, - 0xb0, 0x80, 0x13, 0xa7, 0x22, 0x93, 0x15, 0x18, 0x65, 0xcd, 0x5c, 0xb3, 0x3b, 0xe2, 0x4d, 0x85, - 0x84, 0x6e, 0xe9, 0xcd, 0xf0, 0xc2, 0xa7, 0x78, 0xa6, 0x37, 0x29, 0x3b, 0xf2, 0xd5, 0x89, 0x25, - 0x10, 0x8d, 0x7f, 0x9e, 0x61, 0xeb, 0xbf, 0x7e, 0xf0, 0x09, 0xcb, 0x82, 0xc6, 0x3e, 0xa9, 0x8f, - 0x45, 0xeb, 0x9f, 0x66, 0x79, 0x2e, 0x1c, 0x31, 0x7d, 0xde, 0x84, 0x91, 0x4d, 0xdb, 0xdb, 0x13, - 0x59, 0xa3, 0x75, 0x2e, 0xbc, 0x20, 0x8a, 0xe9, 0x14, 0xe0, 0x6f, 0x53, 0x10, 0xa8, 0xba, 0xb0, - 0xec, 0x40, 0xba, 0x30, 0x45, 0x2f, 0x9f, 0x7b, 0x62, 0x7a, 0xf9, 0xef, 0x09, 0xd3, 0xde, 0x94, - 0x82, 0x01, 0x22, 0x4c, 0x5f, 0x8e, 0xa7, 0x8d, 0x4a, 0xc4, 0x02, 0x8f, 0xd8, 0x91, 0xdb, 0x6a, - 0x22, 0x2a, 0xc5, 0xb7, 0xf3, 0x94, 0x94, 0x53, 0xc6, 0x9f, 0xe6, 0x78, 0x1f, 0x8b, 0x8e, 0xba, - 0xa2, 0xf9, 0x7d, 0xe3, 0x3a, 0x61, 0x1b, 0xbd, 0x1a, 0x82, 0x03, 0xcd, 0xa6, 0xae, 0xc0, 0x10, - 0x9b, 0x9b, 0xa2, 0x37, 0x11, 0x8f, 0xcd, 0x5f, 0x15, 0x8f, 0x95, 0xb3, 0xb5, 0x8c, 0x67, 0x92, - 0x9a, 0x61, 0x10, 0x8f, 0x2d, 0x75, 0x2d, 0x23, 0x06, 0xb9, 0x0a, 0x43, 0xeb, 0x6e, 0x43, 0x46, - 0x32, 0x9f, 0xc3, 0xe8, 0x1f, 0x5a, 0x0a, 0xd3, 0xf9, 0x8c, 0x89, 0x18, 0xec, 0x5b, 0xc3, 0xfc, - 0x0f, 0xea, 0xb7, 0xb6, 0x76, 0xed, 0x64, 0xe6, 0x38, 0x25, 0xe9, 0xcc, 0x32, 0x4c, 0xe9, 0xa9, - 0xea, 0x85, 0xbd, 0x2f, 0x6a, 0xd7, 0x63, 0x19, 0xef, 0xd5, 0x67, 0x11, 0x9d, 0x88, 0x2c, 0xc1, - 0xa4, 0x16, 0x41, 0x55, 0x3c, 0x6e, 0xa2, 0x7a, 0x53, 0x8f, 0xbf, 0xaa, 0xaa, 0x37, 0x35, 0x12, - 0x76, 0x9e, 0x8b, 0xf6, 0x2b, 0x4f, 0x9c, 0x89, 0xb6, 0x0b, 0x1c, 0x72, 0x0b, 0xf2, 0x3c, 0xcc, - 0x46, 0xb5, 0xa2, 0x3e, 0x53, 0xf9, 0x08, 0x8b, 0x85, 0xa9, 0x91, 0x88, 0x4a, 0x58, 0x85, 0x4f, - 0x43, 0x41, 0x6c, 0x49, 0x51, 0xf2, 0xf3, 0xe7, 0x60, 0xa8, 0x5c, 0xad, 0x98, 0xea, 0x36, 0x52, - 0x77, 0x1a, 0x9e, 0x89, 0x50, 0xf4, 0xaa, 0x5b, 0xa7, 0xc1, 0xa1, 0xeb, 0x1d, 0x98, 0xd4, 0x0f, - 0x3c, 0x87, 0x27, 0xa8, 0xc4, 0x85, 0xf8, 0x19, 0xf2, 0x36, 0x0c, 0xa3, 0xe1, 0x69, 0xec, 0x64, - 0x88, 0xd7, 0xb1, 0x34, 0x29, 0x26, 0xf0, 0x30, 0x5a, 0xb1, 0x9a, 0x9c, 0x88, 0xbc, 0x09, 0x43, - 0x15, 0xda, 0x3e, 0x8a, 0xe5, 0xce, 0x4b, 0x10, 0x87, 0x1b, 0x42, 0x83, 0xb6, 0x8f, 0x4c, 0x24, - 0x31, 0x7e, 0x3a, 0x0b, 0xe7, 0x52, 0x9a, 0xf5, 0xf0, 0x33, 0x4f, 0xe9, 0xae, 0xb8, 0xa4, 0xed, - 0x8a, 0xf2, 0x7d, 0xba, 0x67, 0xc7, 0xa7, 0x6e, 0x92, 0x3f, 0x9f, 0x81, 0x0b, 0xfa, 0x04, 0x15, - 0x96, 0xe6, 0x0f, 0x6f, 0x91, 0xb7, 0x60, 0x64, 0x85, 0xda, 0x0d, 0x2a, 0xf3, 0x6a, 0x9d, 0x0b, - 0x03, 0xe2, 0xf1, 0x18, 0x02, 0xbc, 0x90, 0xb3, 0x8d, 0x3c, 0x4e, 0x39, 0x94, 0x54, 0x44, 0xe3, - 0xb8, 0x3c, 0x6e, 0xc8, 0x78, 0x1e, 0x69, 0x55, 0xf5, 0xb1, 0xf2, 0xf8, 0x4e, 0x06, 0x9e, 0xed, - 0x43, 0xc3, 0x06, 0x8e, 0x0d, 0xbd, 0x3a, 0x70, 0x78, 0xa2, 0x22, 0x94, 0xbc, 0x0b, 0xd3, 0x9b, - 0x42, 0x9e, 0x97, 0xc3, 0x91, 0x8d, 0xd6, 0x8b, 0x14, 0xf5, 0x2d, 0x39, 0x2e, 0x71, 0x64, 0x2d, - 0xd0, 0x4c, 0xae, 0x6f, 0xa0, 0x19, 0x35, 0x6e, 0xcb, 0xd0, 0xa0, 0x71, 0x5b, 0xde, 0x87, 0x39, - 0xfd, 0xdb, 0x44, 0xf8, 0xdc, 0x28, 0x6a, 0x4d, 0xa6, 0x77, 0xd4, 0x9a, 0xbe, 0x41, 0x3a, 0x8d, - 0x9f, 0xc8, 0x40, 0x41, 0xe7, 0xfd, 0x51, 0xc7, 0xf3, 0x1d, 0x6d, 0x3c, 0x9f, 0x4d, 0x1f, 0xcf, - 0xde, 0x03, 0xf9, 0x7f, 0x67, 0xe2, 0x1f, 0x3b, 0xd0, 0x08, 0x1a, 0x30, 0x52, 0x71, 0x5b, 0xb6, - 0xd3, 0x56, 0x73, 0xe9, 0x37, 0x10, 0x62, 0x8a, 0x92, 0xc1, 0x82, 0xfc, 0x5c, 0x86, 0xe1, 0x75, - 0xb7, 0x5d, 0xaa, 0x08, 0x93, 0x5e, 0xe4, 0xd3, 0x76, 0xdb, 0x96, 0xdd, 0x30, 0x79, 0x01, 0x59, - 0x05, 0xa8, 0xd5, 0x3d, 0x4a, 0xdb, 0x35, 0xe7, 0x9b, 0x34, 0x26, 0x69, 0xb0, 0x1e, 0x6a, 0x76, - 0x71, 0x63, 0xe1, 0x4f, 0x97, 0x88, 0x68, 0xf9, 0xce, 0x37, 0xd5, 0xfd, 0x56, 0xa1, 0xc7, 0x75, - 0x25, 0xe2, 0xa0, 0xc5, 0xc6, 0xe1, 0xe6, 0xc7, 0xb1, 0xae, 0x52, 0xab, 0xc2, 0x1e, 0xbe, 0x99, - 0x3a, 0x1c, 0x7f, 0x98, 0x81, 0x67, 0xfb, 0xd0, 0x3c, 0x81, 0x51, 0xf9, 0xab, 0xee, 0x70, 0x0a, - 0x10, 0x11, 0x61, 0x6a, 0x62, 0xa7, 0x11, 0xf0, 0x5c, 0x79, 0x93, 0x22, 0x35, 0x31, 0x03, 0x68, - 0xa9, 0x89, 0x19, 0x80, 0x9d, 0xa5, 0x2b, 0xd4, 0xd9, 0xdb, 0xe7, 0xe6, 0x59, 0x93, 0x7c, 0x6f, - 0xd8, 0x47, 0x88, 0x7a, 0x96, 0x72, 0x1c, 0xe3, 0x5f, 0x0e, 0xc3, 0x45, 0x93, 0xee, 0x39, 0xec, - 0x5e, 0xb2, 0xe5, 0x3b, 0xed, 0x3d, 0x2d, 0xee, 0x8d, 0x11, 0x5b, 0xb9, 0x22, 0x49, 0x04, 0x83, - 0x84, 0x33, 0xf1, 0x1a, 0xe4, 0x99, 0x18, 0xa2, 0x2c, 0x5e, 0x7c, 0xb4, 0x62, 0xc2, 0x8a, 0x08, - 0xac, 0x2c, 0x8b, 0xc9, 0xab, 0x42, 0x4c, 0x52, 0xd2, 0xf8, 0x30, 0x31, 0xe9, 0xbb, 0xc7, 0x45, - 0xa8, 0x1d, 0xf9, 0x01, 0xc5, 0x2b, 0xb2, 0x10, 0x95, 0xc2, 0xbb, 0xcc, 0x50, 0x8f, 0xbb, 0xcc, - 0x1a, 0xcc, 0x95, 0x1a, 0xfc, 0x74, 0xb4, 0x9b, 0x1b, 0x9e, 0xd3, 0xae, 0x3b, 0x1d, 0xbb, 0x29, - 0xef, 0xe7, 0xd8, 0xcb, 0x76, 0x58, 0x6e, 0x75, 0x42, 0x04, 0x33, 0x95, 0x8c, 0x7d, 0x46, 0x65, - 0xbd, 0x86, 0xe1, 0x61, 0xc4, 0x7b, 0x24, 0x7e, 0x46, 0xa3, 0xed, 0xe3, 0x57, 0xf8, 0x66, 0x58, - 0x8c, 0xb7, 0x28, 0x7c, 0x90, 0xdf, 0x5c, 0xad, 0x45, 0x2e, 0xcd, 0x3c, 0xcb, 0x00, 0x7f, 0xd8, - 0x0f, 0x9a, 0x3e, 0x9a, 0x42, 0x6a, 0x78, 0x11, 0x5d, 0xad, 0xb6, 0xc2, 0xe8, 0xf2, 0x09, 0x3a, - 0xdf, 0xdf, 0x57, 0xe9, 0x38, 0x1e, 0xb9, 0xc1, 0xa6, 0x42, 0xcb, 0x0d, 0x28, 0x4e, 0xe1, 0xb1, - 0xe8, 0xce, 0xe5, 0x21, 0x94, 0xdf, 0xb9, 0x14, 0x14, 0xf2, 0x36, 0xcc, 0x2e, 0x97, 0x17, 0xa5, - 0x16, 0xb9, 0xe2, 0xd6, 0xbb, 0xf8, 0x10, 0x0f, 0x58, 0x1f, 0x8e, 0x21, 0xad, 0x2f, 0xb2, 0xdd, - 0x24, 0x0d, 0x8d, 0x5c, 0x81, 0xd1, 0x6a, 0x85, 0xf7, 0xfd, 0xb8, 0x9a, 0x4a, 0x4b, 0x58, 0x46, - 0xc9, 0x42, 0xf2, 0x20, 0xba, 0x14, 0x4c, 0x9c, 0x2a, 0xbd, 0x5f, 0x1c, 0xe0, 0x42, 0xf0, 0x26, - 0x4c, 0x2e, 0xb9, 0x41, 0xb5, 0xed, 0x07, 0x76, 0xbb, 0x4e, 0xab, 0x15, 0x35, 0xae, 0xf5, 0x8e, - 0x1b, 0x58, 0x8e, 0x28, 0x61, 0x2d, 0xd7, 0x31, 0xc9, 0xe7, 0x90, 0xf4, 0x2e, 0x6d, 0x53, 0x2f, - 0x8a, 0x67, 0x3d, 0xcc, 0xfb, 0x96, 0x91, 0xee, 0x85, 0x25, 0xa6, 0x8e, 0x28, 0xd2, 0x7c, 0xf1, - 0xe4, 0x9c, 0x65, 0xb7, 0x41, 0x7d, 0xbe, 0x5b, 0x7c, 0x82, 0xd2, 0x7c, 0x29, 0xdf, 0xd6, 0x67, - 0x07, 0xfd, 0x77, 0x30, 0xcd, 0x57, 0x02, 0x97, 0x7c, 0x0e, 0x86, 0xf1, 0xa7, 0x90, 0x6e, 0x67, - 0x53, 0xd8, 0x46, 0x92, 0x6d, 0x9d, 0x61, 0x9a, 0x9c, 0x80, 0x54, 0x61, 0x54, 0x5c, 0xac, 0xce, - 0x92, 0xac, 0x46, 0xdc, 0xd0, 0xf8, 0xcc, 0x10, 0xf4, 0x46, 0x03, 0x26, 0xd4, 0x0a, 0xd9, 0x8a, - 0x58, 0xb1, 0xfd, 0x7d, 0xda, 0x60, 0xbf, 0x44, 0x9e, 0x39, 0x5c, 0x11, 0xfb, 0x08, 0xb5, 0x58, - 0x3b, 0x4c, 0x05, 0x85, 0x9d, 0xa9, 0x55, 0x7f, 0xcb, 0x17, 0x4d, 0x11, 0xaa, 0x16, 0x07, 0xd5, - 0x76, 0x0d, 0x53, 0x14, 0x19, 0xdf, 0x03, 0x73, 0xeb, 0xdd, 0x66, 0xd3, 0xde, 0x69, 0x52, 0x99, - 0x87, 0x04, 0x33, 0x78, 0x2f, 0xc1, 0x70, 0x4d, 0xc9, 0x09, 0x1e, 0xe6, 0x82, 0x54, 0x70, 0xd0, - 0x08, 0x35, 0x83, 0xa1, 0x7a, 0x62, 0xd9, 0xc0, 0x39, 0xa9, 0xf1, 0xfb, 0x19, 0x98, 0x93, 0xef, - 0xff, 0x9e, 0x5d, 0x3f, 0x08, 0x13, 0xc3, 0x5f, 0xd1, 0xe6, 0x1a, 0x4e, 0xd8, 0xd8, 0x34, 0xe2, - 0xb3, 0xee, 0x9e, 0x6c, 0x84, 0x2e, 0xb0, 0xa4, 0x35, 0xf8, 0xb4, 0xc6, 0x90, 0xb7, 0x61, 0x5c, - 0x1c, 0x8f, 0x4a, 0x80, 0x49, 0x8c, 0xe2, 0x25, 0xae, 0x7b, 0x71, 0x6b, 0x14, 0x15, 0x1d, 0x65, - 0x31, 0xfd, 0x53, 0x3e, 0xaa, 0x0c, 0x90, 0x2e, 0x8b, 0xe9, 0x75, 0xf4, 0x99, 0xba, 0xbf, 0x3d, - 0x1e, 0xef, 0x5b, 0x31, 0x77, 0x6f, 0xab, 0x21, 0xe5, 0x32, 0xd1, 0xcd, 0x38, 0x0a, 0x29, 0xa7, - 0xde, 0x8c, 0x43, 0xd4, 0x70, 0x4c, 0xb2, 0xa7, 0x8c, 0xc9, 0xbb, 0x72, 0x4c, 0x72, 0xbd, 0x27, - 0xc6, 0x6c, 0x9f, 0x71, 0xa8, 0x45, 0x2b, 0x64, 0x68, 0x20, 0xb5, 0xca, 0x33, 0x18, 0x3b, 0x9f, - 0x93, 0xc4, 0x77, 0x51, 0xc1, 0x49, 0xd5, 0xd5, 0x0c, 0x0f, 0xce, 0xf4, 0x94, 0xad, 0xf9, 0xf3, - 0x30, 0x51, 0x0a, 0x02, 0xbb, 0xbe, 0x4f, 0x1b, 0x15, 0xb6, 0x3d, 0x29, 0xd1, 0xaf, 0x6c, 0x01, - 0x57, 0x1f, 0xcd, 0x54, 0x5c, 0x1e, 0xcd, 0xd5, 0xf6, 0x85, 0x31, 0x6b, 0x18, 0xcd, 0x95, 0x41, - 0xf4, 0x68, 0xae, 0x0c, 0x42, 0x6e, 0xc0, 0x68, 0xb5, 0xfd, 0xc8, 0x61, 0x7d, 0xc2, 0x03, 0x60, - 0xa1, 0x6e, 0xca, 0xe1, 0x20, 0x75, 0x73, 0x15, 0x58, 0xe4, 0x4d, 0xe5, 0x52, 0x33, 0x16, 0x29, - 0x30, 0xb8, 0xca, 0x2b, 0x8c, 0x70, 0xa3, 0x5e, 0x58, 0xc2, 0x5b, 0xce, 0x6d, 0x18, 0x95, 0x9a, - 0x4c, 0x88, 0x94, 0x16, 0x82, 0x32, 0x19, 0x30, 0x42, 0x22, 0x63, 0x92, 0x6f, 0x25, 0x5f, 0xde, - 0xb8, 0x92, 0xe4, 0x5b, 0xc9, 0x97, 0xa7, 0x25, 0xf9, 0x56, 0x32, 0xe7, 0x85, 0x4a, 0xa0, 0x89, - 0x53, 0x95, 0x40, 0x0f, 0x61, 0x62, 0xc3, 0xf6, 0x02, 0x87, 0xc9, 0x28, 0xed, 0xc0, 0x9f, 0x9f, - 0xd4, 0xf4, 0xa6, 0x4a, 0xd1, 0xd2, 0x25, 0x99, 0x97, 0xba, 0xa3, 0xe0, 0xeb, 0x09, 0x94, 0x23, - 0x78, 0xba, 0x29, 0xeb, 0xd4, 0x47, 0x31, 0x65, 0xc5, 0x4e, 0x45, 0x5d, 0xd9, 0x74, 0xa4, 0x91, - 0xc1, 0x4b, 0x4b, 0x4c, 0x61, 0x16, 0x22, 0x92, 0xaf, 0xc0, 0x04, 0xfb, 0x7b, 0xc3, 0x6d, 0x3a, - 0x75, 0x87, 0xfa, 0xf3, 0x05, 0xfc, 0xb8, 0x4b, 0xa9, 0xab, 0x1f, 0x91, 0x8e, 0x6a, 0x34, 0xe0, - 0x0b, 0x18, 0x19, 0xc7, 0x95, 0xe0, 0x1a, 0x37, 0xf2, 0x1e, 0x4c, 0xb0, 0xd9, 0xb7, 0x63, 0xfb, - 0x5c, 0x34, 0x9d, 0x89, 0x8c, 0x91, 0x1b, 0x02, 0x9e, 0x08, 0xa8, 0xac, 0x12, 0xb0, 0x63, 0xbe, - 0xd4, 0xe1, 0x1b, 0x24, 0x51, 0x66, 0x7b, 0x27, 0xb1, 0x39, 0x4a, 0x34, 0xf2, 0x05, 0x98, 0x28, - 0x75, 0x3a, 0xd1, 0x8e, 0x33, 0xab, 0x28, 0xc2, 0x3a, 0x1d, 0x2b, 0x75, 0xd7, 0xd1, 0x28, 0xe2, - 0x1b, 0xf3, 0xdc, 0x99, 0x36, 0x66, 0xf2, 0x7a, 0x28, 0xad, 0x9f, 0x8b, 0xb4, 0xba, 0xe2, 0xe2, - 0xa8, 0x89, 0xfe, 0x5c, 0x70, 0x2f, 0xc3, 0x24, 0x57, 0x73, 0x4a, 0x69, 0xe6, 0x7c, 0x62, 0xf5, - 0xa4, 0x08, 0x35, 0x3a, 0x0d, 0x59, 0x86, 0x29, 0xee, 0x6d, 0xdd, 0x14, 0x91, 0xae, 0xe7, 0x2f, - 0xe0, 0xaa, 0x45, 0x2e, 0xdc, 0x49, 0xbb, 0x89, 0x09, 0x50, 0x6c, 0x8d, 0x4b, 0x8c, 0xc8, 0xf8, - 0xb3, 0x0c, 0x5c, 0xe8, 0x31, 0xe2, 0x61, 0x1c, 0xe4, 0x4c, 0xff, 0x38, 0xc8, 0x6c, 0xe7, 0xd0, - 0xb5, 0x22, 0xf8, 0xfd, 0x42, 0xca, 0x52, 0xc7, 0x4b, 0xca, 0x5b, 0x2e, 0x10, 0x91, 0x63, 0x48, - 0x54, 0x7d, 0xcf, 0x45, 0xd5, 0x6c, 0x2e, 0x79, 0x08, 0x09, 0x3c, 0xde, 0xa8, 0x25, 0xe3, 0xe4, - 0xb8, 0x78, 0x49, 0xa4, 0x30, 0x0a, 0x87, 0xf5, 0x03, 0x57, 0x5b, 0xc1, 0x29, 0xac, 0x8d, 0xe3, - 0x0c, 0x8c, 0x2b, 0xeb, 0x90, 0x5c, 0x56, 0xbc, 0x80, 0x0b, 0x3c, 0x09, 0x96, 0xc2, 0x21, 0xcb, - 0x4f, 0x22, 0x5c, 0x54, 0xd9, 0xd3, 0x15, 0xd0, 0x6b, 0x4c, 0x14, 0x52, 0x62, 0x45, 0xb7, 0x34, - 0x6d, 0xb1, 0x89, 0xe5, 0x98, 0x4e, 0xdf, 0xf6, 0x83, 0x52, 0x3d, 0x70, 0x1e, 0xd1, 0x01, 0x0e, - 0x9d, 0x28, 0x9d, 0xbe, 0xed, 0x07, 0x96, 0x8d, 0x64, 0x89, 0x74, 0xfa, 0x21, 0x43, 0xe3, 0x07, - 0x32, 0x00, 0x5b, 0xd5, 0x32, 0x06, 0x7b, 0xff, 0xa8, 0x42, 0x41, 0x7a, 0x00, 0x5d, 0xc9, 0xbd, - 0x8f, 0x38, 0xf0, 0x3f, 0x65, 0x60, 0x4a, 0x47, 0x23, 0xef, 0xc2, 0x74, 0xad, 0xee, 0xb9, 0xcd, - 0xe6, 0x8e, 0x5d, 0x3f, 0x58, 0x75, 0xda, 0x94, 0x87, 0x2e, 0x1d, 0xe6, 0x67, 0x91, 0x1f, 0x16, - 0x59, 0x4d, 0x56, 0x66, 0xc6, 0x91, 0xc9, 0x0f, 0x66, 0x60, 0xb2, 0xb6, 0xef, 0x1e, 0x86, 0xd1, - 0x46, 0xc5, 0x80, 0x7c, 0x95, 0xad, 0x6d, 0x7f, 0xdf, 0x3d, 0x8c, 0x32, 0x68, 0x6a, 0xc6, 0x9f, - 0xef, 0x0c, 0xf6, 0x2e, 0x5f, 0x77, 0xf1, 0x26, 0x13, 0xf8, 0xd7, 0xb5, 0x4a, 0x4c, 0xbd, 0x4e, - 0xe3, 0x2f, 0x33, 0x30, 0x8e, 0x77, 0x9e, 0x66, 0x13, 0x65, 0xae, 0x4f, 0x52, 0x3a, 0xc6, 0xf0, - 0xbb, 0xfa, 0x0c, 0xec, 0x1b, 0x30, 0x1d, 0x43, 0x23, 0x06, 0x8c, 0xd4, 0xd0, 0xc1, 0x5f, 0x55, - 0x50, 0x70, 0x97, 0x7f, 0x53, 0x94, 0x18, 0xcb, 0x0a, 0xd9, 0xc3, 0x9b, 0xf8, 0xac, 0xbb, 0x08, - 0xe0, 0x48, 0x90, 0xbc, 0xd9, 0x90, 0x78, 0x4b, 0x1e, 0xde, 0x34, 0x15, 0x2c, 0x63, 0x1d, 0x46, - 0x6a, 0xae, 0x17, 0x2c, 0x1d, 0xf1, 0xcb, 0x44, 0x85, 0xfa, 0x75, 0xf5, 0xdd, 0xd6, 0xc1, 0xb7, - 0x92, 0xba, 0x29, 0x8a, 0x48, 0x11, 0x86, 0xef, 0x38, 0xb4, 0xd9, 0x50, 0x0d, 0x74, 0x77, 0x19, - 0xc0, 0xe4, 0x70, 0x76, 0xe1, 0x3a, 0x1f, 0xe5, 0x44, 0x89, 0x2c, 0x81, 0x3f, 0xea, 0xba, 0x29, - 0x6b, 0xfd, 0xfb, 0x42, 0x98, 0x87, 0x20, 0x59, 0x53, 0x9f, 0xae, 0xfe, 0x8f, 0x33, 0xb0, 0xd0, - 0x9b, 0x44, 0x35, 0x2e, 0xce, 0xf4, 0x31, 0x2e, 0x7e, 0x39, 0xfe, 0xce, 0x88, 0x68, 0xe2, 0x9d, - 0x31, 0x7a, 0x5d, 0xac, 0xa0, 0x6d, 0x77, 0x9d, 0xca, 0x44, 0x28, 0x97, 0xfb, 0xb4, 0x19, 0x11, - 0xf9, 0x30, 0x07, 0x48, 0x63, 0x0a, 0x5a, 0xe3, 0xb7, 0x86, 0xe0, 0x62, 0x4f, 0x0a, 0xb2, 0xa2, - 0xa4, 0x57, 0x9a, 0x0a, 0x13, 0xbb, 0xf4, 0xc4, 0xbf, 0x8e, 0xff, 0xa2, 0xf9, 0x5e, 0xdc, 0xdb, - 0xec, 0x41, 0x98, 0x56, 0x27, 0x8b, 0xbc, 0x3e, 0x75, 0x2a, 0x2f, 0x8e, 0x8e, 0xcc, 0x20, 0x99, - 0x61, 0x07, 0xfd, 0x12, 0x69, 0x60, 0x3b, 0x4d, 0x5f, 0x5d, 0x76, 0x0d, 0x0e, 0x32, 0x65, 0x59, - 0x64, 0xf1, 0x3d, 0x94, 0x6e, 0xf1, 0x6d, 0xfc, 0xcb, 0x0c, 0x8c, 0x85, 0xcd, 0x26, 0x0b, 0x70, - 0x7e, 0xd3, 0x2c, 0x95, 0x97, 0xad, 0xcd, 0xf7, 0x37, 0x96, 0xad, 0xad, 0xf5, 0xda, 0xc6, 0x72, - 0xb9, 0x7a, 0xa7, 0xba, 0x5c, 0x29, 0x3c, 0x43, 0x66, 0x60, 0x72, 0x6b, 0xfd, 0xfe, 0xfa, 0x83, - 0xed, 0x75, 0x6b, 0xd9, 0x34, 0x1f, 0x98, 0x85, 0x0c, 0x99, 0x84, 0x31, 0x73, 0xa9, 0x54, 0xb6, - 0xd6, 0x1f, 0x54, 0x96, 0x0b, 0x59, 0x52, 0x80, 0x89, 0xf2, 0x83, 0xf5, 0xf5, 0xe5, 0xf2, 0x66, - 0xf5, 0x61, 0x75, 0xf3, 0xfd, 0x42, 0x8e, 0x10, 0x98, 0x42, 0x84, 0x0d, 0xb3, 0xba, 0x5e, 0xae, - 0x6e, 0x94, 0x56, 0x0b, 0x43, 0x0c, 0xc6, 0xf0, 0x15, 0xd8, 0x70, 0xc8, 0xe8, 0xfe, 0xd6, 0xd2, - 0x72, 0x61, 0x84, 0xa1, 0xb0, 0xbf, 0x14, 0x94, 0x51, 0x56, 0x3d, 0xa2, 0x54, 0x4a, 0x9b, 0xa5, - 0xa5, 0x52, 0x6d, 0xb9, 0x90, 0x27, 0x17, 0x60, 0x56, 0x03, 0x59, 0xab, 0x0f, 0xee, 0x56, 0xd7, - 0x0b, 0x63, 0x64, 0x0e, 0x0a, 0x21, 0xac, 0xb2, 0x64, 0x6d, 0xd5, 0x96, 0xcd, 0x02, 0xc4, 0xa1, - 0xeb, 0xa5, 0xb5, 0xe5, 0xc2, 0xb8, 0xf1, 0x0e, 0xf7, 0x03, 0xe4, 0x5d, 0x4d, 0xce, 0x03, 0xa9, - 0x6d, 0x96, 0x36, 0xb7, 0x6a, 0xb1, 0x8f, 0x1f, 0x87, 0xd1, 0xda, 0x56, 0xb9, 0xbc, 0x5c, 0xab, - 0x15, 0x32, 0x04, 0x60, 0xe4, 0x4e, 0xa9, 0xba, 0xba, 0x5c, 0x29, 0x64, 0x8d, 0x9f, 0xca, 0xc0, - 0x8c, 0x94, 0x00, 0xe5, 0xa3, 0xd1, 0x47, 0x5c, 0x8b, 0xef, 0x6a, 0x17, 0x5b, 0xe9, 0xa4, 0x15, - 0xab, 0xa4, 0xcf, 0x32, 0xfc, 0xf9, 0x0c, 0x9c, 0x4b, 0xc5, 0x26, 0xef, 0x43, 0x41, 0xb6, 0x60, - 0xcd, 0x0e, 0xea, 0xfb, 0xd1, 0x3e, 0x76, 0x29, 0x56, 0x4b, 0x0c, 0x8d, 0xab, 0x35, 0xa3, 0x84, - 0xcf, 0x09, 0x36, 0x83, 0xa7, 0x23, 0x30, 0xbe, 0x9d, 0x81, 0x0b, 0x3d, 0xaa, 0x21, 0x65, 0x18, - 0x09, 0x13, 0xd3, 0xf4, 0xb1, 0x60, 0x9b, 0xfb, 0xce, 0x71, 0x51, 0x20, 0x62, 0x86, 0x5c, 0xfc, - 0xcb, 0x1c, 0x09, 0x33, 0xcd, 0x60, 0xba, 0x17, 0xde, 0x7d, 0x17, 0x63, 0x3d, 0x2f, 0x6a, 0x2a, - 0x6d, 0xd7, 0x96, 0xc6, 0x45, 0xdf, 0xe5, 0xec, 0x43, 0x1f, 0xf3, 0xbd, 0x18, 0x3f, 0x93, 0x61, - 0xc2, 0x5d, 0x1c, 0x91, 0xc9, 0xbc, 0x25, 0xdf, 0xef, 0xb6, 0xa8, 0xe9, 0x36, 0x69, 0xc9, 0x5c, - 0x17, 0xc7, 0x06, 0x4a, 0xab, 0x36, 0x16, 0xe0, 0xb5, 0xc2, 0xb2, 0xbd, 0xb6, 0xf6, 0x5a, 0xad, - 0xd2, 0x90, 0x37, 0x01, 0x96, 0x1f, 0x07, 0xd4, 0x6b, 0xdb, 0xcd, 0x30, 0x46, 0x0b, 0x8f, 0x2c, - 0x25, 0xa0, 0xba, 0xbc, 0xad, 0x20, 0x1b, 0x7f, 0x27, 0x03, 0x13, 0xe2, 0xd2, 0x54, 0x6a, 0x52, - 0x2f, 0xf8, 0x68, 0xd3, 0xeb, 0x4d, 0x6d, 0x7a, 0x85, 0x0e, 0x1b, 0x0a, 0x7f, 0x56, 0x9c, 0x3a, - 0xb3, 0xfe, 0x69, 0x06, 0x0a, 0x71, 0x44, 0xf2, 0x2e, 0xe4, 0x6b, 0xf4, 0x11, 0xf5, 0x9c, 0xe0, - 0x48, 0x6c, 0x94, 0x32, 0x85, 0x1f, 0xc7, 0x11, 0x65, 0x7c, 0x3e, 0xf8, 0xe2, 0x97, 0x19, 0xd2, - 0x0c, 0xba, 0xdf, 0x2b, 0x6a, 0x8f, 0xdc, 0x93, 0x52, 0x7b, 0x18, 0xff, 0x7b, 0x16, 0x2e, 0xdc, - 0xa5, 0x81, 0xfa, 0x4d, 0xa1, 0x79, 0xc1, 0xa7, 0x07, 0xfb, 0x2e, 0xe5, 0x4b, 0xe6, 0x61, 0x14, - 0x8b, 0xe4, 0xf8, 0x9a, 0xf2, 0x27, 0x59, 0x0a, 0xe7, 0x75, 0x4e, 0xcb, 0x11, 0xd6, 0xa3, 0xee, - 0xeb, 0x4a, 0xd6, 0xa0, 0x70, 0x5a, 0x5f, 0x81, 0x29, 0x0c, 0x8b, 0xdf, 0x65, 0xcb, 0x81, 0x36, - 0x84, 0xfa, 0x27, 0x6f, 0xc6, 0xa0, 0xe4, 0x55, 0x28, 0x30, 0x48, 0xa9, 0x7e, 0xd0, 0x76, 0x0f, - 0x9b, 0xb4, 0xb1, 0x47, 0x1b, 0x78, 0xac, 0xe7, 0xcd, 0x04, 0x5c, 0xf2, 0xdc, 0x6a, 0xf3, 0xab, - 0x1b, 0x6d, 0xa0, 0x8e, 0x46, 0xf0, 0x8c, 0xa0, 0x0b, 0x6f, 0xc2, 0xf8, 0x87, 0xcc, 0x00, 0x66, - 0xfc, 0x6f, 0x19, 0x98, 0xc3, 0x8f, 0x53, 0x2a, 0x96, 0xd9, 0x59, 0x65, 0x6f, 0x29, 0x49, 0x71, - 0x6c, 0x06, 0xd2, 0x97, 0x42, 0xd8, 0x8b, 0x91, 0x4e, 0x28, 0x3b, 0x80, 0x4e, 0xa8, 0x76, 0x96, - 0x4c, 0xf4, 0x03, 0xaa, 0xb4, 0xee, 0x0d, 0xe5, 0x73, 0x85, 0xa1, 0x68, 0xc8, 0x8d, 0x1f, 0xcc, - 0xc2, 0xa8, 0x49, 0x31, 0x45, 0x37, 0xb9, 0x02, 0xa3, 0xeb, 0x6e, 0x40, 0xfd, 0x35, 0x2d, 0x1f, - 0x7b, 0x9b, 0x81, 0xac, 0x56, 0xc3, 0x94, 0x85, 0x6c, 0xc2, 0x6f, 0x78, 0x6e, 0xa3, 0x5b, 0x0f, - 0xd4, 0x09, 0xdf, 0xe1, 0x20, 0x53, 0x96, 0x91, 0xd7, 0x60, 0x4c, 0x70, 0x0e, 0x1f, 0x75, 0xd1, - 0x18, 0xd9, 0xa3, 0x61, 0x8a, 0xf7, 0x08, 0x01, 0x65, 0x5a, 0x2e, 0x60, 0x0c, 0x29, 0x32, 0x6d, - 0x42, 0x66, 0x90, 0xa2, 0xfa, 0x70, 0x1f, 0x51, 0xfd, 0xd3, 0x30, 0x52, 0xf2, 0x7d, 0x1a, 0xc8, - 0x28, 0x06, 0x13, 0x61, 0xd8, 0x36, 0x9f, 0x06, 0x9c, 0xb1, 0x8d, 0xe5, 0xa6, 0xc0, 0x33, 0xfe, - 0x79, 0x16, 0x86, 0xf1, 0x4f, 0x7c, 0x32, 0xf5, 0xea, 0xfb, 0xda, 0x93, 0xa9, 0x57, 0xdf, 0x37, - 0x11, 0x4a, 0x6e, 0xa2, 0xa6, 0x42, 0xe6, 0x6f, 0x12, 0x5f, 0x8f, 0x2a, 0xf8, 0x46, 0x04, 0x36, - 0x55, 0x9c, 0xf0, 0x85, 0x3f, 0x97, 0x1a, 0xbb, 0xe4, 0x3c, 0x64, 0x1f, 0xd4, 0xc4, 0x17, 0x63, - 0x44, 0x2c, 0xd7, 0x37, 0xb3, 0x0f, 0x6a, 0xd8, 0x1b, 0x2b, 0xa5, 0xc5, 0x37, 0x6e, 0x8b, 0x0f, - 0xe5, 0xbd, 0xb1, 0x6f, 0x2f, 0xbe, 0x71, 0xdb, 0x14, 0x25, 0xac, 0x7f, 0xb1, 0xcd, 0xf8, 0xf0, - 0xca, 0x7d, 0xee, 0xb1, 0x7f, 0xf1, 0xdb, 0xf0, 0x91, 0xd5, 0x8c, 0x10, 0xc8, 0x22, 0x8c, 0x8b, - 0x58, 0x0f, 0x88, 0xaf, 0xc4, 0x62, 0x10, 0xb1, 0x20, 0x38, 0x85, 0x8a, 0xc4, 0x9f, 0xe0, 0xc4, - 0x00, 0xc9, 0x2c, 0xb3, 0xe2, 0x09, 0x4e, 0x0e, 0xa1, 0x6f, 0x2a, 0x28, 0xac, 0x49, 0xfc, 0x0d, - 0x2f, 0xf2, 0xa5, 0x9f, 0x52, 0x82, 0x06, 0x60, 0x9a, 0x83, 0x10, 0xc1, 0xf8, 0xe5, 0x2c, 0xe4, - 0x37, 0x9a, 0xdd, 0x3d, 0xa7, 0xfd, 0xf0, 0x26, 0x21, 0x80, 0xd7, 0x38, 0x99, 0x07, 0x83, 0xfd, - 0x4d, 0x2e, 0x42, 0x5e, 0xde, 0xdc, 0xe4, 0x86, 0xe4, 0x8b, 0x5b, 0xdb, 0x3c, 0xc8, 0x71, 0x17, - 0xa1, 0xcf, 0xe4, 0x4f, 0x72, 0x13, 0xc2, 0xfb, 0x57, 0xaf, 0x8b, 0xda, 0x10, 0x5b, 0x2c, 0x66, - 0x88, 0x46, 0x5e, 0x07, 0x3c, 0x24, 0xc4, 0xe5, 0x41, 0x2a, 0xb4, 0x79, 0xd3, 0x84, 0x9c, 0xc2, - 0x49, 0x10, 0x8d, 0xdc, 0x02, 0x31, 0x31, 0x45, 0x36, 0xf3, 0x73, 0x3a, 0x01, 0xcf, 0x0f, 0x29, - 0x49, 0x04, 0x2a, 0x79, 0x1b, 0xc6, 0xeb, 0x1e, 0xc5, 0x57, 0x47, 0xbb, 0x19, 0x25, 0x29, 0x57, - 0x29, 0xcb, 0x51, 0xf9, 0xc3, 0x9b, 0xa6, 0x8a, 0x6e, 0xfc, 0x72, 0x1e, 0x26, 0xd4, 0xf6, 0x10, - 0x13, 0x66, 0xfd, 0x26, 0xbb, 0xbb, 0x0b, 0x63, 0xb3, 0x0e, 0x16, 0x8a, 0xe3, 0xf4, 0xb2, 0xde, - 0x20, 0x86, 0xc7, 0x2d, 0xcf, 0x64, 0x90, 0x8a, 0x95, 0x67, 0xcc, 0x19, 0x3f, 0x02, 0x73, 0x3c, - 0x52, 0x82, 0xbc, 0xdb, 0xf1, 0xf7, 0x68, 0xdb, 0x91, 0xef, 0x2d, 0x2f, 0x6a, 0x8c, 0x1e, 0x88, - 0xc2, 0x04, 0xaf, 0x90, 0x8c, 0xbc, 0x01, 0x23, 0x6e, 0x87, 0xb6, 0x6d, 0x47, 0x9c, 0x71, 0xcf, - 0xc6, 0x18, 0xd0, 0x76, 0xa9, 0xaa, 0x10, 0x0a, 0x64, 0x72, 0x03, 0x86, 0xdc, 0x83, 0x70, 0xbc, - 0x2e, 0xea, 0x44, 0x07, 0x81, 0xad, 0x90, 0x20, 0x22, 0x23, 0xf8, 0xc0, 0x6e, 0xed, 0x8a, 0x11, - 0xd3, 0x09, 0xee, 0xd9, 0xad, 0x5d, 0x95, 0x80, 0x21, 0x92, 0xf7, 0x00, 0x3a, 0xf6, 0x1e, 0xf5, - 0xac, 0x46, 0x37, 0x38, 0x12, 0xe3, 0x76, 0x49, 0x23, 0xdb, 0x60, 0xc5, 0x95, 0x6e, 0x70, 0xa4, - 0xd0, 0x8e, 0x75, 0x24, 0x90, 0x94, 0x00, 0x5a, 0x76, 0x10, 0x50, 0xaf, 0xe5, 0x0a, 0x6b, 0xbf, - 0x28, 0x08, 0x21, 0x67, 0xb0, 0x16, 0x16, 0x2b, 0x1c, 0x14, 0x22, 0x6c, 0xb4, 0xe3, 0xd9, 0x22, - 0xa7, 0x7c, 0xac, 0xd1, 0x8e, 0xa7, 0x7d, 0x25, 0x43, 0x24, 0x9f, 0x83, 0xd1, 0x86, 0xe3, 0xd7, - 0x5d, 0xaf, 0x21, 0xa2, 0x97, 0x3c, 0xa7, 0xd1, 0x54, 0x78, 0x99, 0x42, 0x26, 0xd1, 0x59, 0x6b, - 0x45, 0x10, 0xd2, 0x75, 0xf7, 0x10, 0xd5, 0xfc, 0xf1, 0xd6, 0xd6, 0xc2, 0x62, 0xb5, 0xb5, 0x11, - 0x11, 0x1b, 0xca, 0x3d, 0x27, 0x68, 0xda, 0x3b, 0xe2, 0x9d, 0x5b, 0x1f, 0xca, 0xbb, 0x58, 0xa4, - 0x0e, 0x25, 0x47, 0x26, 0x6f, 0x42, 0x9e, 0xb6, 0x03, 0xcf, 0xb6, 0x9c, 0x86, 0xf0, 0x92, 0xd4, - 0x1b, 0xcd, 0x0e, 0x60, 0xbb, 0x5a, 0x51, 0x1b, 0x8d, 0xf8, 0xd5, 0x06, 0xeb, 0x1f, 0xbf, 0xee, - 0xb4, 0x84, 0x73, 0xa3, 0xde, 0x3f, 0xb5, 0x72, 0x75, 0x4d, 0xed, 0x1f, 0x86, 0x48, 0xde, 0x85, - 0x51, 0xb6, 0x7e, 0x1b, 0xee, 0x9e, 0x08, 0x08, 0x61, 0xe8, 0xfd, 0xc3, 0xcb, 0x12, 0xd3, 0x55, - 0x12, 0xb1, 0x85, 0x6c, 0x1f, 0xfa, 0x96, 0x53, 0x17, 0x41, 0x1e, 0xf4, 0xe5, 0x58, 0xda, 0xae, - 0x55, 0xcb, 0x0a, 0xd9, 0xb0, 0x7d, 0xe8, 0x57, 0xeb, 0x64, 0x11, 0x86, 0x31, 0x45, 0x84, 0x08, - 0x44, 0xa9, 0xd3, 0x60, 0x72, 0x08, 0x95, 0x06, 0x51, 0xd9, 0x40, 0xb6, 0x7c, 0xf4, 0x17, 0x11, - 0x89, 0x1a, 0xf4, 0x3e, 0x59, 0xab, 0xa1, 0x13, 0x89, 0xda, 0x44, 0x81, 0x4e, 0x2e, 0x01, 0x44, - 0xaf, 0xf8, 0xfc, 0xcd, 0xc5, 0x54, 0x20, 0x9f, 0x1f, 0xfa, 0xbf, 0x7e, 0xb1, 0x98, 0x59, 0x02, - 0xc8, 0xcb, 0x08, 0x35, 0xc6, 0x2a, 0x5c, 0xec, 0xb9, 0xee, 0xc9, 0x35, 0x28, 0xec, 0xda, 0x42, - 0xeb, 0x57, 0xdf, 0xb7, 0xdb, 0x6d, 0xda, 0x14, 0x3b, 0xee, 0xb4, 0x84, 0x97, 0x39, 0x98, 0x73, - 0x36, 0xde, 0x83, 0xb9, 0xb4, 0x01, 0x27, 0x2f, 0xc0, 0x84, 0x1a, 0x8c, 0x47, 0x30, 0x19, 0xb7, - 0x3b, 0x8e, 0x0c, 0xc7, 0x23, 0x18, 0xfc, 0x66, 0x06, 0x9e, 0xeb, 0xb7, 0x7d, 0x90, 0x05, 0xc8, - 0x77, 0x3c, 0xc7, 0x45, 0x31, 0x55, 0x64, 0x3b, 0x90, 0xbf, 0x31, 0x91, 0x01, 0xca, 0x53, 0x81, - 0xbd, 0x27, 0x1c, 0x3c, 0xcc, 0x31, 0x84, 0x6c, 0xda, 0x7b, 0x3e, 0xf9, 0x14, 0xcc, 0x34, 0xe8, - 0xae, 0xdd, 0x6d, 0x06, 0x96, 0x5f, 0xdf, 0xa7, 0x0d, 0xf4, 0xa9, 0x42, 0xc3, 0x3d, 0xb3, 0x20, - 0x0a, 0x6a, 0x12, 0x9e, 0x68, 0xf1, 0x70, 0x8f, 0x16, 0xdf, 0x1b, 0xca, 0x67, 0x0a, 0x59, 0x13, - 0x2d, 0xa5, 0x8c, 0xef, 0xcb, 0xc2, 0x7c, 0xaf, 0xf5, 0x42, 0xde, 0x49, 0xeb, 0x03, 0xfe, 0x70, - 0xa1, 0xc2, 0xd5, 0x87, 0x0b, 0xa5, 0x36, 0xb2, 0x08, 0xa1, 0x47, 0xd4, 0x69, 0xd1, 0x0d, 0x24, - 0x8c, 0xd1, 0x74, 0x6c, 0xdf, 0x3f, 0x64, 0x5b, 0x42, 0x4e, 0x09, 0x68, 0x2b, 0x60, 0x2a, 0x8d, - 0x84, 0x91, 0xcf, 0x02, 0xd4, 0x9b, 0xae, 0x4f, 0xd1, 0x3e, 0x40, 0xc8, 0x1a, 0xdc, 0x2c, 0x3c, - 0x84, 0xaa, 0x0f, 0xc2, 0x08, 0x2d, 0xbb, 0x0d, 0x2a, 0x06, 0xd0, 0x86, 0x0b, 0x3d, 0x36, 0x48, - 0x36, 0x3c, 0x51, 0x76, 0x78, 0x99, 0x6b, 0xaa, 0x1b, 0xe6, 0x88, 0x8f, 0xf7, 0x78, 0xb6, 0xd7, - 0x1c, 0x39, 0x02, 0x92, 0xdc, 0x05, 0x19, 0x77, 0x61, 0xdc, 0xdc, 0xf5, 0x42, 0xee, 0x1c, 0xb2, - 0xe5, 0x35, 0x49, 0x11, 0xc6, 0x65, 0x2e, 0x49, 0x26, 0xcb, 0x73, 0xe6, 0x20, 0x40, 0xf7, 0x29, - 0x4e, 0x1e, 0x8c, 0x58, 0x8a, 0x7e, 0x6f, 0x42, 0x4a, 0x18, 0x43, 0xc8, 0xe6, 0x51, 0x47, 0x7e, - 0xdd, 0x73, 0x72, 0x7e, 0xeb, 0x67, 0x93, 0x28, 0xfd, 0xd9, 0x8c, 0x1c, 0xfe, 0xe4, 0xe6, 0x7e, - 0x5a, 0xfb, 0x08, 0xa0, 0x97, 0x92, 0x68, 0x18, 0xfe, 0xcd, 0xa4, 0x16, 0xb9, 0xea, 0x84, 0xd4, - 0x22, 0x7e, 0x92, 0x2b, 0x30, 0xed, 0x71, 0x3b, 0xd6, 0xc0, 0x15, 0xfd, 0xc9, 0xf3, 0x76, 0x4c, - 0x72, 0xf0, 0xa6, 0x8b, 0x7d, 0x2a, 0xda, 0x75, 0x2f, 0xec, 0x30, 0xe5, 0xac, 0x23, 0xd7, 0x61, - 0x8c, 0x9d, 0x75, 0x18, 0xe9, 0x26, 0xe6, 0x1e, 0x81, 0x78, 0x28, 0x39, 0x98, 0xf9, 0x0f, 0xc4, - 0xdf, 0x82, 0xd7, 0xb7, 0xb3, 0x92, 0x99, 0x7a, 0xd2, 0x92, 0x0b, 0x30, 0xea, 0x7a, 0x7b, 0xca, - 0xa7, 0x8d, 0xb8, 0xde, 0x1e, 0xfb, 0xae, 0xab, 0x50, 0xe0, 0xde, 0x3a, 0x3c, 0x0c, 0x82, 0x7f, - 0xd4, 0xe6, 0x57, 0xf1, 0xbc, 0x39, 0xc5, 0xe1, 0x98, 0x30, 0xff, 0xa8, 0x5d, 0x67, 0x98, 0xbe, - 0xef, 0x5a, 0x6a, 0x80, 0x2b, 0xf1, 0xd9, 0x53, 0xbe, 0xef, 0xfe, 0xff, 0xec, 0x7d, 0x4b, 0x6c, - 0x23, 0xc9, 0x79, 0xf0, 0x34, 0x49, 0x49, 0xd4, 0x47, 0x3d, 0x5a, 0x35, 0x2f, 0xad, 0x34, 0x8f, - 0x9d, 0xde, 0x99, 0xf1, 0x0c, 0xd7, 0xbb, 0xf6, 0xcc, 0xfe, 0xeb, 0xdd, 0xb5, 0x7f, 0x3f, 0x5a, - 0x64, 0x53, 0xe2, 0x88, 0x2f, 0x77, 0x93, 0x92, 0xc7, 0x63, 0xbb, 0xdd, 0x4b, 0xb6, 0xa4, 0x8e, - 0x29, 0x92, 0x66, 0x93, 0x3b, 0x1e, 0x23, 0x40, 0x62, 0x04, 0xb0, 0x81, 0xbc, 0x9c, 0x38, 0x01, - 0x62, 0xe4, 0xe2, 0x43, 0x8c, 0x20, 0x87, 0x5c, 0x83, 0x04, 0x49, 0x2e, 0xbe, 0x19, 0x30, 0x0c, - 0x18, 0x48, 0x4e, 0x49, 0xb0, 0x48, 0x16, 0x48, 0x80, 0x3c, 0x6e, 0x41, 0x7c, 0xf0, 0x29, 0xa8, - 0xaf, 0xaa, 0xba, 0xab, 0x1f, 0xe4, 0x68, 0x3c, 0xeb, 0x24, 0x06, 0x7c, 0x92, 0xf8, 0xd5, 0x57, - 0xd5, 0xf5, 0xfc, 0xea, 0xfb, 0xbe, 0xfa, 0x1e, 0x61, 0xa4, 0xab, 0x1e, 0xd9, 0x81, 0x55, 0xda, - 0x4e, 0x10, 0x66, 0x8b, 0x33, 0x02, 0x57, 0x93, 0x8c, 0xc0, 0x93, 0x41, 0x57, 0x74, 0xd1, 0x5c, - 0xf1, 0xa5, 0x5f, 0x64, 0x1f, 0x54, 0x89, 0x63, 0x42, 0x7f, 0xcc, 0x98, 0x4d, 0x75, 0xd8, 0x8c, - 0xc4, 0x69, 0x55, 0x07, 0x47, 0x43, 0x73, 0xbd, 0x1b, 0x05, 0xf0, 0xa9, 0xf9, 0x8e, 0x22, 0x68, - 0x69, 0x4a, 0x25, 0xa2, 0xc1, 0xea, 0x89, 0xe3, 0xdb, 0xbe, 0x7f, 0xca, 0x6c, 0xc4, 0x78, 0x60, - 0xdf, 0xc2, 0x89, 0xe3, 0x5b, 0xfe, 0xa9, 0x48, 0x1c, 0x72, 0x91, 0xe2, 0x0c, 0x9d, 0xe9, 0xe4, - 0xc4, 0x96, 0xf9, 0x3f, 0x36, 0x63, 0xe7, 0x4f, 0x1c, 0xbf, 0x49, 0xcb, 0xa4, 0xb6, 0xc9, 0x4d, - 0x58, 0xc3, 0x76, 0xbb, 0x9e, 0x68, 0x18, 0x43, 0x59, 0x98, 0x2b, 0xb4, 0xe1, 0xae, 0xc7, 0x5a, - 0xe6, 0x3d, 0xfc, 0xd7, 0x0c, 0x5c, 0x4a, 0x9f, 0x1d, 0xdc, 0x9e, 0x74, 0x4e, 0xd1, 0x47, 0x8f, - 0xf7, 0x6d, 0x99, 0x42, 0x58, 0x18, 0x92, 0xb4, 0xc5, 0xc9, 0xa4, 0x2e, 0x4e, 0x11, 0x36, 0xb0, - 0x21, 0xce, 0x69, 0xf6, 0x3d, 0x7f, 0xc2, 0xa3, 0x6b, 0x98, 0xeb, 0xb4, 0x80, 0xd1, 0xf3, 0x1a, - 0x05, 0x93, 0x5b, 0xb0, 0x26, 0x28, 0xf2, 0xf0, 0xf1, 0x80, 0x7e, 0x98, 0x91, 0xe3, 0x55, 0x0e, - 0x6d, 0x22, 0x90, 0x5c, 0x84, 0x45, 0x67, 0x34, 0xa2, 0x9f, 0x64, 0x54, 0x78, 0xc1, 0x19, 0x8d, - 0x58, 0x72, 0x1b, 0xf4, 0x48, 0xb4, 0x8f, 0xd0, 0x4a, 0x88, 0x9b, 0x24, 0x9a, 0x2b, 0x08, 0x64, - 0x96, 0x43, 0x3e, 0x3d, 0xf7, 0xb4, 0xae, 0x40, 0x59, 0x42, 0x14, 0x70, 0x46, 0x01, 0xc2, 0x0b, - 0x90, 0x17, 0xef, 0xd5, 0xcc, 0xb1, 0xc2, 0x5c, 0x72, 0xf8, 0x5b, 0xf5, 0xeb, 0x70, 0xb9, 0xe7, - 0xf9, 0xb8, 0x79, 0xd9, 0x90, 0x46, 0x23, 0xee, 0x03, 0xc9, 0x82, 0xe4, 0x9a, 0x17, 0x78, 0x31, - 0x9d, 0x49, 0x7d, 0x34, 0x62, 0x9e, 0x90, 0x7c, 0xae, 0xdf, 0x84, 0x75, 0xce, 0x71, 0xf1, 0x2b, - 0x12, 0xfb, 0xc2, 0x0f, 0x30, 0x15, 0x85, 0x78, 0x3a, 0x21, 0xe0, 0xa0, 0x6a, 0x4f, 0xd4, 0xfc, - 0x07, 0x05, 0x2e, 0xa6, 0xb2, 0x6c, 0xe4, 0x8b, 0xc0, 0x5c, 0xbe, 0x26, 0x43, 0x7b, 0xec, 0x76, - 0xbd, 0x91, 0x87, 0x41, 0x31, 0x98, 0x4a, 0xf3, 0xfe, 0x3c, 0x66, 0x0f, 0xdd, 0xc7, 0xda, 0x43, - 0x33, 0xa8, 0xc4, 0x74, 0x2d, 0xea, 0x38, 0x06, 0xde, 0x7a, 0x04, 0x17, 0x53, 0x51, 0x53, 0x74, - 0x20, 0x1f, 0x8c, 0x26, 0x73, 0x16, 0x8f, 0x54, 0xb1, 0x41, 0x4b, 0xba, 0x11, 0x3e, 0xbc, 0xef, - 0x05, 0xc3, 0x8b, 0x31, 0x77, 0xc4, 0x88, 0x9f, 0xeb, 0x34, 0xf9, 0x44, 0x54, 0x9a, 0x7d, 0xb4, - 0x1f, 0xc1, 0x45, 0xbe, 0xf9, 0x8e, 0xc7, 0xce, 0xe8, 0x24, 0x6c, 0x8e, 0x75, 0xf4, 0x03, 0x69, - 0xcd, 0xb1, 0x5d, 0xb9, 0x4b, 0xf1, 0x83, 0x56, 0xcf, 0x3b, 0x49, 0x20, 0x1f, 0xc3, 0xd7, 0x32, - 0xe2, 0xa8, 0xa7, 0x74, 0x27, 0x65, 0x5b, 0x2b, 0x69, 0xdb, 0xfa, 0xec, 0x67, 0xaa, 0x01, 0x44, - 0x26, 0x56, 0x4c, 0xeb, 0xc9, 0x0d, 0xaa, 0x04, 0x9f, 0xce, 0x3b, 0x22, 0x91, 0x06, 0x8b, 0x25, - 0xd3, 0xdc, 0xe8, 0xc6, 0x41, 0x64, 0x1b, 0x96, 0x83, 0x7c, 0xd5, 0xfc, 0xe2, 0xc8, 0x33, 0x40, - 0xb5, 0x47, 0x5e, 0x84, 0x15, 0xc6, 0x92, 0x47, 0xce, 0x1c, 0x20, 0x4c, 0xa7, 0x07, 0x4f, 0xcc, - 0x81, 0x02, 0x2f, 0x3e, 0x6d, 0x0e, 0xc9, 0x21, 0x5c, 0x42, 0xb3, 0x0e, 0x7f, 0x18, 0x2c, 0x83, - 0xdd, 0x75, 0xba, 0x27, 0x2e, 0xdf, 0xb5, 0x5a, 0xea, 0x62, 0x8c, 0x46, 0x96, 0xd5, 0x94, 0xd6, - 0x61, 0x34, 0xb2, 0xfc, 0xa1, 0xf8, 0x5d, 0xa2, 0xd5, 0x79, 0x1f, 0x7a, 0xb0, 0x3d, 0xa7, 0xa6, - 0x44, 0x38, 0x14, 0x99, 0x70, 0xdc, 0x01, 0xf5, 0xc8, 0xed, 0x51, 0x9e, 0xd8, 0xed, 0x61, 0xd7, - 0xde, 0xb9, 0xcf, 0x32, 0xb4, 0x9b, 0x6b, 0x01, 0xdc, 0xf2, 0x87, 0x07, 0xf7, 0xf9, 0x57, 0x4e, - 0xc5, 0x95, 0x27, 0x8b, 0x15, 0xe4, 0x55, 0x38, 0x1f, 0x0b, 0x38, 0x12, 0x7a, 0xb0, 0x9b, 0x1b, - 0xb4, 0x28, 0x1a, 0x9e, 0xea, 0x06, 0xac, 0x88, 0x5d, 0x31, 0x0e, 0xfc, 0xe0, 0xcc, 0x02, 0x87, - 0xd1, 0x53, 0xc7, 0x3f, 0x37, 0x15, 0x83, 0x4a, 0x95, 0x48, 0xce, 0xc0, 0x4b, 0x93, 0x57, 0x80, - 0x04, 0x7c, 0x7b, 0x40, 0x28, 0xf8, 0x07, 0x37, 0x44, 0x49, 0x70, 0xc2, 0xf9, 0x67, 0xff, 0x3a, - 0x03, 0xe7, 0x53, 0x44, 0x19, 0x2a, 0x04, 0x78, 0x83, 0x89, 0x7b, 0xcc, 0x44, 0x08, 0x79, 0x90, - 0xeb, 0x12, 0x9c, 0xeb, 0xa7, 0x16, 0x59, 0x06, 0x72, 0xfe, 0x2d, 0xfe, 0x8b, 0x12, 0x0f, 0x67, - 0x2c, 0x54, 0x2f, 0xf4, 0x5f, 0x52, 0x85, 0x0d, 0x4c, 0xab, 0xe0, 0x7b, 0x43, 0xcc, 0xce, 0x80, - 0x4c, 0x48, 0x2e, 0x22, 0xec, 0x60, 0x2f, 0x5a, 0x12, 0x12, 0xe5, 0x42, 0x4c, 0x75, 0x14, 0x83, - 0x90, 0x8f, 0xc1, 0x96, 0x74, 0xd7, 0xd8, 0xb1, 0x93, 0x87, 0x96, 0xee, 0xe6, 0x65, 0x27, 0xb8, - 0x75, 0xca, 0x91, 0x33, 0xb8, 0x03, 0xd7, 0x70, 0x11, 0xbd, 0xde, 0xc8, 0x4e, 0xe4, 0xe1, 0xc0, - 0xa1, 0xb2, 0xc0, 0xf5, 0x5b, 0x14, 0xab, 0xda, 0x1b, 0xc5, 0x52, 0x72, 0xd0, 0x51, 0xf3, 0xe9, - 0x7b, 0x04, 0x17, 0x53, 0x7b, 0x4c, 0x2f, 0x18, 0x34, 0xa4, 0x0a, 0x79, 0xa3, 0x25, 0xfa, 0x9b, - 0x32, 0x47, 0x37, 0x60, 0xe5, 0x6d, 0xd7, 0x19, 0xbb, 0x63, 0x7e, 0x73, 0xf3, 0x2d, 0xc1, 0x60, - 0xf2, 0xc5, 0xdd, 0x8b, 0x2e, 0x0d, 0xd7, 0x19, 0x91, 0x3a, 0x9c, 0x67, 0x37, 0xa0, 0x77, 0x8a, - 0xcc, 0x20, 0xd7, 0x33, 0x29, 0x11, 0x76, 0x08, 0xab, 0xe0, 0xd5, 0x54, 0x45, 0x2c, 0x56, 0xdb, - 0xdc, 0x38, 0x8e, 0x83, 0xe8, 0x89, 0xbe, 0x94, 0x8e, 0x4d, 0x76, 0xa0, 0xc0, 0x1a, 0x67, 0x62, - 0x01, 0x7b, 0x20, 0xb8, 0x31, 0xf7, 0x0b, 0x25, 0xb4, 0x2f, 0xf6, 0x83, 0xff, 0xe9, 0x7d, 0x8d, - 0x6f, 0xb1, 0xf6, 0xa9, 0xfc, 0xfe, 0x61, 0xae, 0x20, 0x90, 0xbf, 0x7b, 0x68, 0x7f, 0xa3, 0x88, - 0xa1, 0x46, 0x84, 0x63, 0xba, 0xb5, 0x7c, 0x77, 0x20, 0xde, 0x80, 0x96, 0x4d, 0xfe, 0xeb, 0x19, - 0xb7, 0x3a, 0x79, 0x03, 0x56, 0x68, 0xb3, 0xc7, 0xd3, 0x01, 0xdb, 0x72, 0xd9, 0x48, 0xa0, 0x9d, - 0x3a, 0x2b, 0xa2, 0xcb, 0xb6, 0x77, 0xce, 0x2c, 0x9c, 0x86, 0x3f, 0x29, 0xb7, 0xec, 0x9f, 0x4e, - 0x46, 0xf2, 0x46, 0x15, 0x8a, 0x42, 0xab, 0xde, 0x6e, 0xf1, 0x2a, 0x79, 0x8a, 0x13, 0x72, 0xcb, - 0x3b, 0x8b, 0x4c, 0x55, 0xa8, 0xbd, 0x0c, 0x05, 0xa9, 0x6d, 0x3a, 0x18, 0xe6, 0x39, 0x23, 0x06, - 0xc3, 0x7e, 0xf1, 0xc5, 0x7e, 0x1b, 0xf2, 0xa2, 0x49, 0x2a, 0x16, 0x9c, 0x0c, 0x7d, 0x71, 0xc8, - 0xf1, 0x7f, 0x0a, 0xa3, 0xb3, 0x8c, 0x83, 0x5c, 0x30, 0xf1, 0x7f, 0xbc, 0x4b, 0x26, 0x0e, 0x95, - 0x07, 0xfa, 0xbe, 0x3d, 0x42, 0x0b, 0xac, 0x80, 0x79, 0xa6, 0xf0, 0x76, 0xdf, 0x67, 0x76, 0x59, - 0xfc, 0x1b, 0x7f, 0x11, 0x5c, 0xc2, 0x31, 0x6d, 0xc2, 0x2c, 0x9a, 0x19, 0xb9, 0x32, 0x32, 0xc9, - 0x2b, 0x83, 0x05, 0x50, 0xe1, 0x35, 0xd9, 0x97, 0x01, 0x61, 0x78, 0x65, 0x48, 0x94, 0x21, 0x17, - 0xa1, 0x0c, 0x92, 0x4c, 0x1e, 0xae, 0x1e, 0xbb, 0x71, 0x84, 0x4c, 0x1e, 0xa7, 0x53, 0x7f, 0x9c, - 0x11, 0x2a, 0x82, 0x9d, 0xe1, 0x70, 0xe2, 0x4f, 0xc6, 0xce, 0x28, 0xa2, 0x0a, 0x25, 0xa7, 0xf0, - 0x02, 0x72, 0xd0, 0xf7, 0x31, 0x85, 0xc5, 0x70, 0x2c, 0x62, 0x76, 0x04, 0x3b, 0xb7, 0x70, 0xff, - 0x43, 0x51, 0x1e, 0x5f, 0xa7, 0xd8, 0xba, 0x8c, 0x4c, 0x37, 0xac, 0xd4, 0xea, 0xde, 0x39, 0xf3, - 0x32, 0x6b, 0x33, 0x81, 0x45, 0xf6, 0x52, 0x0e, 0x71, 0x5c, 0x17, 0xba, 0x13, 0x9e, 0xe8, 0x68, - 0xab, 0xf2, 0x59, 0x27, 0x9f, 0x80, 0x65, 0xaf, 0x27, 0x67, 0x6a, 0x8c, 0x6b, 0xe1, 0xaa, 0x3d, - 0x16, 0x2d, 0x3a, 0x6c, 0x83, 0xee, 0x39, 0x8f, 0x43, 0x77, 0x56, 0x23, 0x4a, 0x63, 0x6d, 0x47, - 0x48, 0xa3, 0xc9, 0x6a, 0x64, 0x0d, 0x32, 0xc1, 0x0a, 0x67, 0xbc, 0x1e, 0x3b, 0x5e, 0x61, 0xbc, - 0x6a, 0x93, 0xff, 0xd2, 0x7e, 0x19, 0xee, 0x9c, 0x75, 0x8e, 0xe8, 0x51, 0x9c, 0x31, 0xe1, 0xcb, - 0xe6, 0x86, 0x93, 0x98, 0xb7, 0x1b, 0x20, 0x87, 0xdb, 0xf5, 0x04, 0xf1, 0x13, 0xb0, 0xce, 0xd8, - 0xd3, 0xfe, 0x3c, 0x0b, 0x6b, 0x51, 0x35, 0x39, 0x79, 0x19, 0x72, 0x12, 0x05, 0xba, 0x9c, 0xa2, - 0x4b, 0x47, 0xba, 0x83, 0x48, 0x67, 0xa2, 0x38, 0xe4, 0x01, 0xac, 0xa1, 0xe1, 0x1e, 0xb2, 0x9e, - 0x13, 0x8f, 0x3f, 0xbe, 0xcc, 0x7f, 0x3f, 0xcb, 0x7f, 0xff, 0xdd, 0xeb, 0xe7, 0xf0, 0xa9, 0x6c, - 0x85, 0xd6, 0xa5, 0xdc, 0x1f, 0x2d, 0x94, 0xb4, 0xa0, 0xb9, 0xd9, 0x5a, 0x50, 0x3e, 0x94, 0x19, - 0x5a, 0xd0, 0x85, 0x39, 0x5a, 0xd0, 0xb0, 0xa6, 0xac, 0x05, 0x45, 0x5d, 0xf8, 0xd2, 0x2c, 0x5d, - 0x78, 0x58, 0x87, 0xe9, 0xc2, 0x43, 0x2d, 0x66, 0x7e, 0xa6, 0x16, 0x33, 0xac, 0xc3, 0xb5, 0x98, - 0x37, 0xf9, 0x1c, 0x8d, 0x9d, 0xc7, 0x36, 0x4e, 0x1e, 0xbf, 0x16, 0x71, 0xf4, 0xa6, 0xf3, 0x18, - 0x8d, 0x6b, 0x76, 0x96, 0x41, 0x58, 0xe4, 0x68, 0xbf, 0xa7, 0xc4, 0x34, 0x81, 0x62, 0xfd, 0x6e, - 0xc1, 0x1a, 0xbb, 0xac, 0xdc, 0x9e, 0x24, 0x6b, 0xae, 0x9a, 0xab, 0x02, 0xca, 0xe4, 0xcd, 0x0f, - 0xc0, 0x7a, 0x80, 0xc6, 0x45, 0x2e, 0xf4, 0xd4, 0x33, 0x83, 0xda, 0x3c, 0xec, 0xcc, 0xcb, 0xb0, - 0x11, 0x20, 0x72, 0x6d, 0x0e, 0x13, 0x37, 0x57, 0x4d, 0x55, 0x14, 0xb4, 0x38, 0x5c, 0x3b, 0x8e, - 0x4b, 0x1e, 0x3f, 0xa3, 0x5e, 0x69, 0xdf, 0xcb, 0x46, 0xb4, 0x24, 0xe2, 0x33, 0xf4, 0x16, 0xf5, - 0x87, 0x36, 0x9f, 0x24, 0x4e, 0x8b, 0x6e, 0xcc, 0x58, 0x33, 0x6e, 0xd3, 0x64, 0x59, 0x4d, 0x13, - 0x7c, 0x7f, 0x28, 0x4c, 0x9c, 0x6c, 0xc6, 0x51, 0xb3, 0x7b, 0x1f, 0xf7, 0xac, 0x68, 0x8e, 0x11, - 0x9e, 0xe2, 0xfc, 0xe6, 0x84, 0x98, 0x4a, 0xb7, 0x2c, 0x72, 0xd6, 0xc1, 0x2f, 0xf1, 0x81, 0x0e, - 0xa0, 0x52, 0xd1, 0x8f, 0x36, 0x9e, 0x4d, 0x91, 0x9d, 0x12, 0x8d, 0xe3, 0x2c, 0x61, 0xcb, 0xea, - 0x54, 0xfc, 0x2b, 0x9a, 0x35, 0x60, 0x05, 0x75, 0x14, 0xa2, 0xc1, 0x5c, 0x8a, 0x0a, 0x3e, 0x39, - 0xf8, 0x52, 0xb5, 0x6e, 0x16, 0x68, 0x3d, 0xd1, 0xcc, 0x09, 0xbc, 0x20, 0x6b, 0x16, 0xa2, 0x9d, - 0x5c, 0x10, 0x51, 0x74, 0xe7, 0xce, 0x40, 0xa8, 0x80, 0xc0, 0xae, 0x5e, 0x72, 0xa2, 0x00, 0x8e, - 0xa6, 0x9d, 0xc0, 0xd6, 0xec, 0x25, 0x99, 0x93, 0xa1, 0x29, 0xbc, 0x40, 0x33, 0xf2, 0x05, 0x2a, - 0xeb, 0x19, 0xb2, 0x11, 0x3d, 0x83, 0xf6, 0x47, 0x59, 0x78, 0xe9, 0x0c, 0xcb, 0x35, 0xe7, 0x9b, - 0x9f, 0x8a, 0xb2, 0x67, 0x99, 0x88, 0x64, 0x48, 0x1b, 0xe5, 0x04, 0x92, 0x4a, 0xa9, 0xe9, 0xcc, - 0xd9, 0x17, 0x61, 0x9d, 0x51, 0x41, 0x66, 0x96, 0x78, 0x34, 0xed, 0x9f, 0x81, 0x0c, 0x6e, 0x0b, - 0x1f, 0xaa, 0x58, 0x55, 0xa4, 0x8c, 0x48, 0x31, 0xac, 0x00, 0x46, 0xda, 0x50, 0x40, 0xb4, 0x23, - 0xc7, 0xeb, 0x9f, 0xc9, 0x99, 0x47, 0x78, 0x68, 0xc9, 0xd5, 0x98, 0x35, 0x35, 0x05, 0x54, 0xf0, - 0x37, 0xb9, 0x0d, 0xeb, 0x83, 0xe9, 0x29, 0x65, 0x3c, 0xd8, 0x5e, 0xe0, 0xd6, 0x1f, 0x0b, 0xe6, - 0xea, 0x60, 0x7a, 0xaa, 0x8f, 0x46, 0xb8, 0xa4, 0x68, 0x26, 0xb2, 0x41, 0xf1, 0xd8, 0xa9, 0x15, - 0x98, 0x8b, 0x88, 0x49, 0x1b, 0x60, 0xe7, 0x96, 0xe3, 0x5e, 0x00, 0x66, 0x34, 0xc8, 0x33, 0x54, - 0xb1, 0x1f, 0xda, 0x8f, 0x33, 0x42, 0xde, 0x9d, 0xbd, 0xef, 0x7f, 0xb1, 0x44, 0x29, 0x4b, 0x74, - 0x07, 0x54, 0x3a, 0xf5, 0x21, 0x51, 0x09, 0xd6, 0x68, 0x6d, 0x30, 0x3d, 0x0d, 0xe6, 0x4e, 0x9e, - 0xf8, 0x45, 0x79, 0xe2, 0xdf, 0x10, 0xf2, 0x70, 0x2a, 0x79, 0x98, 0x3d, 0xe5, 0xda, 0x7f, 0x64, - 0xe1, 0xf6, 0xd9, 0x88, 0xc0, 0x2f, 0xd6, 0x2d, 0x65, 0xdd, 0x62, 0xaa, 0xd3, 0x85, 0x84, 0xea, - 0x34, 0xe5, 0xec, 0x2d, 0xa6, 0x9d, 0xbd, 0x84, 0xa2, 0x76, 0x29, 0x45, 0x51, 0x9b, 0x7a, 0x40, - 0xf3, 0x4f, 0x39, 0xa0, 0xcb, 0xf2, 0x3e, 0xf9, 0x97, 0x40, 0x81, 0x11, 0x95, 0x07, 0x1e, 0xc1, - 0x79, 0x21, 0x0f, 0xb0, 0x9b, 0x23, 0xd4, 0xbf, 0x17, 0xee, 0xdf, 0x4d, 0x93, 0x04, 0x10, 0x2d, - 0x85, 0x5b, 0xdf, 0xe0, 0x32, 0x40, 0x58, 0xfe, 0x7f, 0x87, 0xfb, 0x27, 0x0f, 0xe1, 0x12, 0xc6, - 0x77, 0xef, 0xca, 0x2f, 0x07, 0xf6, 0xd8, 0x3d, 0xe2, 0xfb, 0xe1, 0x46, 0x82, 0x57, 0xf6, 0xba, - 0x52, 0x77, 0x4c, 0xf7, 0x68, 0xef, 0x9c, 0x79, 0xc1, 0x4f, 0x81, 0xc7, 0x05, 0x8b, 0x3f, 0x55, - 0x40, 0x7b, 0xfa, 0x7c, 0xa1, 0xa2, 0x2a, 0x3e, 0xe1, 0xcb, 0x66, 0xc1, 0x91, 0x66, 0xef, 0x25, - 0x58, 0x1d, 0xbb, 0x47, 0x63, 0xd7, 0x3f, 0x89, 0x68, 0x40, 0x56, 0x38, 0x50, 0x4c, 0x8c, 0x88, - 0x32, 0xf9, 0x4c, 0x9c, 0xb9, 0xa8, 0xa4, 0x55, 0x02, 0x79, 0x31, 0x75, 0x1d, 0xe8, 0x6e, 0x92, - 0x3b, 0xc8, 0x7e, 0x3c, 0xc8, 0xe5, 0x33, 0x6a, 0xd6, 0xe4, 0xb1, 0x30, 0x8f, 0xbc, 0xbe, 0xab, - 0xfd, 0xa5, 0x22, 0x38, 0x82, 0xb4, 0xc9, 0x23, 0x8f, 0x24, 0x63, 0xde, 0x6c, 0x82, 0x0d, 0x49, - 0xab, 0x22, 0xdb, 0x3d, 0xf2, 0xf0, 0x8c, 0x08, 0x88, 0x84, 0x67, 0x44, 0xc8, 0x73, 0x58, 0x24, - 0x72, 0xa9, 0xf9, 0x2d, 0x61, 0x11, 0x44, 0x69, 0xde, 0xc1, 0x3d, 0x72, 0x17, 0x96, 0x98, 0x11, - 0x90, 0xe8, 0xee, 0x7a, 0xa4, 0xbb, 0x07, 0xf7, 0x4c, 0x51, 0xae, 0x7d, 0x3b, 0x78, 0xd7, 0x4a, - 0x0c, 0xe2, 0xe0, 0x1e, 0x79, 0xe3, 0x6c, 0xc6, 0xb9, 0x79, 0x61, 0x9c, 0x1b, 0x18, 0xe6, 0xbe, - 0x19, 0x31, 0xcc, 0xbd, 0x39, 0x7f, 0xb6, 0xf8, 0x6b, 0x24, 0x0b, 0x47, 0x18, 0x86, 0xa9, 0xfa, - 0xb1, 0x02, 0x57, 0xe7, 0xd6, 0x20, 0x57, 0x20, 0xaf, 0xb7, 0xaa, 0xed, 0x70, 0x7d, 0xe9, 0x99, - 0x11, 0x10, 0xb2, 0x0b, 0xcb, 0x3b, 0x8e, 0xef, 0x75, 0xe9, 0x36, 0x4e, 0x7d, 0x1e, 0x48, 0x34, - 0x1b, 0xa0, 0xef, 0x9d, 0x33, 0xc3, 0xba, 0xc4, 0x86, 0x0d, 0x3c, 0x0b, 0x91, 0xd4, 0x4f, 0xd9, - 0x14, 0x5d, 0x43, 0xa2, 0xc1, 0x44, 0x35, 0x4a, 0x67, 0x12, 0xc0, 0xf8, 0x11, 0x7c, 0x47, 0xf0, - 0x22, 0xb3, 0x3b, 0xf8, 0x0c, 0x71, 0x55, 0xef, 0x40, 0xbe, 0x25, 0xec, 0x04, 0x24, 0x6b, 0x76, - 0x61, 0x13, 0x60, 0x06, 0xa5, 0xda, 0x6f, 0x2a, 0x42, 0x21, 0xf0, 0xf4, 0x81, 0x48, 0x59, 0xb3, - 0x7a, 0xf3, 0xb3, 0x66, 0xf5, 0x7e, 0xca, 0xac, 0x59, 0xda, 0x9f, 0xf0, 0xa8, 0xe7, 0xd5, 0x5e, - 0x2b, 0xa6, 0x99, 0x7d, 0x5e, 0xaf, 0x04, 0x23, 0xb2, 0x3b, 0x5f, 0x92, 0xb2, 0x2e, 0x26, 0xbf, - 0x35, 0xdb, 0x39, 0x41, 0xda, 0xaa, 0x7f, 0x90, 0x85, 0x2b, 0xf3, 0xaa, 0xa7, 0xe6, 0x75, 0x56, - 0x9e, 0x2d, 0xaf, 0xf3, 0x5d, 0xc8, 0x33, 0x58, 0x60, 0x72, 0x8f, 0x13, 0xce, 0xab, 0xd2, 0x09, - 0x17, 0xc5, 0xe4, 0x25, 0x58, 0xd4, 0x4b, 0x56, 0x98, 0x6a, 0x0c, 0x6d, 0x63, 0x9d, 0xae, 0x8f, - 0x56, 0x97, 0xbc, 0x88, 0x7c, 0x21, 0x99, 0x5d, 0x8f, 0xe7, 0x18, 0xdb, 0x96, 0x26, 0x24, 0x91, - 0x90, 0x00, 0xfb, 0x1b, 0x06, 0xd0, 0xe7, 0x31, 0xa9, 0xcd, 0x64, 0xa6, 0x3e, 0x0d, 0x16, 0x5b, - 0x63, 0xd7, 0x77, 0x27, 0xb2, 0xdd, 0xea, 0x08, 0x21, 0x26, 0x2f, 0xe1, 0x56, 0xa5, 0xce, 0x13, - 0x16, 0x44, 0x60, 0x51, 0x0e, 0xec, 0x82, 0x66, 0xa8, 0x14, 0x6c, 0x4a, 0x28, 0xb4, 0x42, 0xcd, - 0x99, 0x0e, 0xba, 0x27, 0x1d, 0xb3, 0xc6, 0x59, 0x0d, 0x56, 0xa1, 0x8f, 0x50, 0x3a, 0x40, 0xdf, - 0x94, 0x50, 0xb4, 0x6f, 0x28, 0x70, 0x21, 0x6d, 0x1c, 0xe4, 0x0a, 0xe4, 0x06, 0xa9, 0x89, 0x04, - 0x07, 0xcc, 0xf7, 0xb9, 0x40, 0xff, 0xda, 0x47, 0xc3, 0xf1, 0xa9, 0x33, 0x91, 0xad, 0x7b, 0x25, - 0xb0, 0x09, 0xf4, 0x47, 0x05, 0xff, 0x27, 0xd7, 0x05, 0x8d, 0xce, 0x26, 0x52, 0x0f, 0xe2, 0x1f, - 0x4d, 0x07, 0xa8, 0xf6, 0x5a, 0xcd, 0x11, 0x0b, 0x88, 0xff, 0x1a, 0xe4, 0x68, 0xb7, 0x62, 0xbb, - 0x97, 0xee, 0x1f, 0xbd, 0x5e, 0xe3, 0x48, 0xac, 0x57, 0xbe, 0x73, 0xda, 0x37, 0x11, 0x59, 0x3b, - 0x84, 0xb5, 0x28, 0x06, 0x31, 0xa2, 0x21, 0x54, 0x0b, 0xf7, 0x55, 0xde, 0xd2, 0xce, 0x70, 0xc8, - 0x3c, 0x4c, 0x76, 0x5e, 0xf8, 0xbb, 0x77, 0xaf, 0x03, 0xfd, 0xc9, 0xea, 0xa4, 0x85, 0x58, 0xd5, - 0xbe, 0x99, 0x81, 0x0b, 0xa1, 0x53, 0xbb, 0x38, 0x43, 0x3f, 0xb7, 0x1e, 0x96, 0x7a, 0xc4, 0x03, - 0x50, 0x30, 0x5a, 0xc9, 0x01, 0xce, 0x71, 0x3c, 0xda, 0x85, 0xcd, 0x59, 0xf8, 0xe4, 0x65, 0x58, - 0xc6, 0x38, 0x48, 0x23, 0xa7, 0xeb, 0xca, 0xb4, 0x6f, 0x20, 0x80, 0x66, 0x58, 0xae, 0xfd, 0x50, - 0x81, 0x2d, 0xee, 0x17, 0x51, 0x77, 0xbc, 0x01, 0xaa, 0xd5, 0xbb, 0xee, 0xfb, 0xe3, 0x21, 0xbc, - 0x1b, 0xa1, 0x63, 0xb7, 0xa2, 0xee, 0x2f, 0x89, 0xaf, 0xcd, 0x1e, 0x2d, 0xb9, 0x8b, 0xb1, 0xbd, - 0xf8, 0xb3, 0x73, 0x8e, 0x45, 0x64, 0x18, 0x50, 0x80, 0x1c, 0x91, 0x01, 0x31, 0xb4, 0x5f, 0x81, - 0x6b, 0xf3, 0x3f, 0x40, 0x3e, 0x0f, 0xab, 0x98, 0x2c, 0xaa, 0x33, 0x3a, 0x1e, 0x3b, 0x3d, 0x57, - 0xa8, 0xc2, 0x84, 0xfa, 0x52, 0x2e, 0x63, 0xa1, 0xca, 0x78, 0x84, 0x80, 0x63, 0x4c, 0x43, 0xc5, - 0x2b, 0x45, 0x9c, 0x8f, 0xe4, 0xd6, 0xb4, 0x5f, 0x55, 0x80, 0x24, 0xdb, 0x20, 0x1f, 0x81, 0x95, - 0x4e, 0xbb, 0x64, 0x4d, 0x9c, 0xf1, 0x64, 0x6f, 0x38, 0x1d, 0xf3, 0x38, 0x61, 0xcc, 0x61, 0x7c, - 0xd2, 0xb5, 0xd9, 0x03, 0xca, 0xc9, 0x70, 0x3a, 0x36, 0x23, 0x78, 0x98, 0xe5, 0xc8, 0x75, 0xbf, - 0xd4, 0x73, 0x9e, 0x44, 0xb3, 0x1c, 0x71, 0x58, 0x24, 0xcb, 0x11, 0x87, 0x69, 0xdf, 0x55, 0x60, - 0x5b, 0x58, 0x13, 0xf6, 0x52, 0xfa, 0x52, 0xc2, 0xb0, 0x28, 0x63, 0x11, 0x98, 0x76, 0x1e, 0x4b, - 0xbb, 0x21, 0x22, 0x07, 0x61, 0x07, 0x91, 0xb7, 0x65, 0x75, 0xc9, 0xa7, 0x20, 0x67, 0x4d, 0x86, - 0xa3, 0x33, 0x84, 0x0e, 0x52, 0x83, 0x15, 0x9d, 0x0c, 0x47, 0xd8, 0x04, 0xd6, 0xd4, 0x5c, 0xb8, - 0x20, 0x77, 0x4e, 0xf4, 0x98, 0xd4, 0x61, 0x89, 0xc7, 0x88, 0x8b, 0x3d, 0xd4, 0xcf, 0x19, 0xd3, - 0xce, 0xba, 0x88, 0x4f, 0xc4, 0x03, 0xa3, 0x9a, 0xa2, 0x0d, 0xed, 0xb7, 0x15, 0x28, 0x50, 0x6e, - 0x03, 0xa5, 0xb8, 0xe7, 0xdd, 0xd2, 0x51, 0xc6, 0x51, 0xd8, 0x9d, 0x04, 0xcd, 0x9f, 0xe9, 0x36, - 0x7e, 0x1d, 0xd6, 0x63, 0x15, 0x88, 0x86, 0x91, 0x29, 0xfa, 0x5e, 0xd7, 0x61, 0x49, 0x53, 0x98, - 0xcd, 0x46, 0x04, 0xa6, 0xfd, 0xba, 0x02, 0x17, 0xa8, 0xcc, 0xcf, 0xde, 0x39, 0xcd, 0x69, 0x5f, - 0x9c, 0x77, 0xca, 0x41, 0x09, 0xb3, 0x54, 0xe6, 0x35, 0xcf, 0x38, 0x28, 0x0e, 0x33, 0x83, 0x52, - 0xb2, 0x07, 0x79, 0x7e, 0xbf, 0xf8, 0x3c, 0x9e, 0xe9, 0x35, 0x49, 0x99, 0x10, 0x36, 0xcc, 0x91, - 0xe8, 0x48, 0x90, 0x84, 0xf1, 0x3a, 0x66, 0x50, 0x5b, 0xfb, 0x4f, 0x05, 0x2e, 0xcf, 0xa8, 0x43, - 0x3e, 0x0e, 0x0b, 0xe8, 0xd1, 0xc7, 0x57, 0xef, 0xca, 0x8c, 0x4f, 0x4c, 0xba, 0x27, 0x07, 0xf7, - 0xd8, 0x45, 0x74, 0x4a, 0x7f, 0x98, 0xac, 0x16, 0x79, 0x04, 0xcb, 0x7a, 0xaf, 0xc7, 0xc5, 0x99, - 0x4c, 0x44, 0x9c, 0x99, 0xf1, 0xc5, 0x57, 0x03, 0x7c, 0x26, 0xce, 0x30, 0xdf, 0x92, 0x5e, 0xcf, - 0xe6, 0xde, 0x8a, 0x61, 0x7b, 0x5b, 0xff, 0x1f, 0xd6, 0xa2, 0xc8, 0xcf, 0xe4, 0x60, 0xf5, 0x6d, - 0x05, 0xd4, 0x68, 0x1f, 0x7e, 0x36, 0x91, 0x95, 0xd2, 0x96, 0xf9, 0x29, 0x9b, 0xea, 0x77, 0x33, - 0x70, 0x31, 0x75, 0x86, 0xc9, 0x2b, 0xb0, 0xa8, 0x8f, 0x46, 0xd5, 0x32, 0xdf, 0x55, 0x9c, 0x43, - 0x42, 0x2d, 0x71, 0x44, 0xda, 0x63, 0x48, 0xe4, 0x35, 0xc8, 0xb3, 0xe7, 0xf4, 0xb2, 0x20, 0x38, - 0x18, 0x2a, 0x86, 0xbf, 0xf5, 0x47, 0x23, 0x8b, 0x0a, 0x44, 0x52, 0x81, 0x35, 0x1e, 0x64, 0xc5, - 0x74, 0x8f, 0xdd, 0xaf, 0x04, 0x21, 0xee, 0x31, 0x0a, 0xbf, 0x50, 0x3d, 0xdb, 0x63, 0x56, 0x26, - 0x87, 0x19, 0x89, 0xd6, 0x22, 0x35, 0x50, 0xb1, 0x4d, 0xb9, 0x25, 0x16, 0xde, 0x14, 0xc3, 0xde, - 0xb0, 0x4e, 0xcc, 0x68, 0x2b, 0x51, 0x33, 0x58, 0x2e, 0xdd, 0xf7, 0xbd, 0xe3, 0xc1, 0xa9, 0x3b, - 0x98, 0xfc, 0xec, 0x96, 0x2b, 0xfc, 0xc6, 0x99, 0x96, 0xeb, 0xf7, 0x73, 0xec, 0x30, 0xc7, 0xab, - 0x51, 0x8e, 0x46, 0x8a, 0x68, 0x8d, 0x1c, 0x0d, 0x15, 0x9a, 0x78, 0x18, 0x91, 0x32, 0x2c, 0xb1, - 0xf0, 0x2e, 0xe2, 0x64, 0x5c, 0x4d, 0xed, 0x02, 0xc3, 0x39, 0xb8, 0xc7, 0xd8, 0x17, 0xe6, 0x5a, - 0xe8, 0x9b, 0xa2, 0x2a, 0x39, 0x80, 0x42, 0xa9, 0xef, 0x3a, 0x83, 0xe9, 0xa8, 0x7d, 0xb6, 0x27, - 0xc7, 0x4d, 0x3e, 0x96, 0x95, 0x2e, 0xab, 0x86, 0x4f, 0x95, 0x48, 0xc9, 0xe5, 0x86, 0x48, 0x3b, - 0xf0, 0x36, 0xca, 0xa1, 0xa6, 0xf2, 0xc3, 0x73, 0xe6, 0x27, 0x0e, 0xc4, 0x7a, 0x51, 0x57, 0x3a, - 0xee, 0x8e, 0x64, 0xc3, 0x5a, 0xcd, 0xf1, 0x27, 0xed, 0xb1, 0x33, 0xf0, 0x31, 0x2c, 0xe4, 0x19, - 0xc2, 0x66, 0x6d, 0x8b, 0x94, 0xc3, 0xa8, 0x63, 0x9c, 0x04, 0x55, 0x99, 0x06, 0x33, 0xda, 0x1c, - 0xe5, 0x97, 0x2a, 0xde, 0xc0, 0xe9, 0x7b, 0x5f, 0x15, 0x4e, 0x99, 0x8c, 0x5f, 0x3a, 0x12, 0x40, - 0x33, 0x2c, 0xd7, 0x3e, 0x97, 0x58, 0x37, 0xd6, 0xcb, 0x02, 0x2c, 0x71, 0x97, 0x7d, 0xe6, 0xc2, - 0xde, 0x32, 0x1a, 0xe5, 0x6a, 0x63, 0x57, 0x55, 0xc8, 0x1a, 0x40, 0xcb, 0x6c, 0x96, 0x0c, 0xcb, - 0xa2, 0xbf, 0x33, 0xf4, 0x37, 0xf7, 0x6f, 0xaf, 0x74, 0x6a, 0x6a, 0x56, 0x72, 0x71, 0xcf, 0x69, - 0x3f, 0x50, 0xe0, 0x52, 0xfa, 0x52, 0x92, 0x36, 0x60, 0x90, 0x03, 0xfe, 0xf8, 0xfc, 0x91, 0xb9, - 0xeb, 0x9e, 0x0a, 0x8e, 0x07, 0x4b, 0x98, 0x30, 0x27, 0xfc, 0x8c, 0x78, 0x2c, 0x62, 0x5e, 0x7d, - 0x5e, 0xcf, 0xcc, 0x78, 0x3d, 0xad, 0x04, 0x9b, 0xb3, 0xda, 0x88, 0x0e, 0x75, 0x1d, 0x0a, 0x7a, - 0xab, 0x55, 0xab, 0x96, 0xf4, 0x76, 0xb5, 0xd9, 0x50, 0x15, 0xb2, 0x0c, 0x0b, 0xbb, 0x66, 0xb3, - 0xd3, 0x52, 0x33, 0xda, 0xb7, 0x14, 0x58, 0xad, 0x86, 0x66, 0x5a, 0xcf, 0x7b, 0xf8, 0x3e, 0x1a, - 0x39, 0x7c, 0x9b, 0x41, 0x38, 0x90, 0xe0, 0x03, 0x67, 0x3a, 0x79, 0x7f, 0xab, 0xc0, 0x46, 0xa2, - 0x0e, 0xb1, 0x60, 0x49, 0x3f, 0xb4, 0x9a, 0xd5, 0x72, 0x89, 0xf7, 0xec, 0x7a, 0x68, 0x5f, 0x84, - 0x19, 0x9f, 0x12, 0x5f, 0x61, 0x2e, 0xb4, 0x8f, 0x7d, 0x7b, 0xe8, 0xf5, 0xa4, 0x6c, 0xad, 0x7b, - 0xe7, 0x4c, 0xd1, 0x12, 0xde, 0x64, 0x5f, 0x9d, 0x8e, 0x5d, 0x6c, 0x36, 0x13, 0x51, 0x84, 0x06, - 0xf0, 0x64, 0xc3, 0xe8, 0xf0, 0xe0, 0xd0, 0xf2, 0x64, 0xd3, 0x61, 0x7b, 0x3b, 0xab, 0x50, 0xe0, - 0x52, 0x0b, 0x0a, 0x04, 0xdf, 0x53, 0x60, 0x73, 0x56, 0x5f, 0xa9, 0x20, 0x14, 0xf5, 0xa7, 0xbf, - 0x14, 0x64, 0x70, 0x88, 0x3a, 0xd2, 0x0b, 0x34, 0xf2, 0x49, 0x28, 0x54, 0x7d, 0x7f, 0xea, 0x8e, - 0xad, 0xd7, 0x3a, 0x66, 0x95, 0x6f, 0x90, 0xab, 0xff, 0xf6, 0xee, 0xf5, 0xcb, 0xe8, 0x96, 0x30, - 0xb6, 0xfd, 0xd7, 0xec, 0xe9, 0xd8, 0x8b, 0x44, 0xbb, 0x97, 0x6b, 0x50, 0xbe, 0xd5, 0x99, 0xf6, - 0x3c, 0x57, 0x70, 0xed, 0xc2, 0xe7, 0x98, 0xc3, 0xe4, 0x5b, 0x44, 0xc0, 0xb4, 0xaf, 0x2b, 0xb0, - 0x35, 0x7b, 0x62, 0xe8, 0xcd, 0xd4, 0x66, 0x56, 0x3f, 0xc2, 0xeb, 0x17, 0x6f, 0xa6, 0xc0, 0x34, - 0x48, 0x6e, 0x53, 0x20, 0xd2, 0x4a, 0x41, 0xf6, 0xf4, 0x4c, 0x22, 0x65, 0x72, 0xb4, 0x92, 0x40, - 0xd4, 0xfe, 0x3d, 0x03, 0x97, 0xe8, 0xa6, 0xeb, 0xbb, 0xbe, 0xaf, 0x4f, 0x27, 0x27, 0xee, 0x60, - 0xc2, 0xd9, 0x30, 0xf2, 0x06, 0x2c, 0x9e, 0x3c, 0x9b, 0xca, 0x91, 0xa1, 0x13, 0x02, 0x48, 0xc8, - 0x85, 0x93, 0x05, 0xfd, 0x9f, 0xdc, 0x00, 0x39, 0x49, 0x75, 0x16, 0xc3, 0x64, 0x66, 0x36, 0x15, - 0x73, 0x79, 0x14, 0xe4, 0x93, 0x7d, 0x13, 0x16, 0x50, 0xcd, 0xc0, 0x49, 0xaa, 0x60, 0x85, 0xd3, - 0x7b, 0x87, 0x4a, 0x08, 0x93, 0x55, 0x20, 0x1f, 0x02, 0x08, 0x33, 0x0c, 0x70, 0x9a, 0x29, 0xc4, - 0xef, 0x20, 0xc9, 0x80, 0xb9, 0x7c, 0x7a, 0xe4, 0xf0, 0xb0, 0xfd, 0x45, 0xd8, 0x10, 0xd3, 0x32, - 0x12, 0xd1, 0xf5, 0xf8, 0x6b, 0xd8, 0x3a, 0x2b, 0xa8, 0x8e, 0x44, 0x84, 0xbd, 0x9b, 0x89, 0x44, - 0xbb, 0x18, 0x64, 0x37, 0x96, 0x4d, 0xf7, 0x66, 0x22, 0x9b, 0x6e, 0x9e, 0x61, 0xc9, 0x29, 0x73, - 0xb5, 0x7f, 0xce, 0xc0, 0xf2, 0x21, 0x65, 0x56, 0x50, 0x04, 0x9f, 0x2f, 0xd2, 0xdf, 0x87, 0x42, - 0x6d, 0xe8, 0xf0, 0x67, 0x07, 0xee, 0x9b, 0xc0, 0x7c, 0x83, 0xfb, 0x43, 0x47, 0xbc, 0x60, 0xf8, - 0xa6, 0x8c, 0xf4, 0x14, 0xbf, 0xe6, 0x07, 0xb0, 0xc8, 0x9e, 0x81, 0xb8, 0x76, 0x49, 0xb0, 0xab, - 0x41, 0x8f, 0x5e, 0x65, 0xc5, 0x92, 0xa6, 0x9c, 0x3d, 0x25, 0xc9, 0xbc, 0x13, 0x8f, 0x15, 0x2a, - 0x29, 0x1c, 0x16, 0xce, 0xa6, 0x70, 0x90, 0x62, 0xa2, 0x2d, 0x9e, 0x25, 0x26, 0xda, 0xd6, 0x5b, - 0x50, 0x90, 0xfa, 0xf3, 0x4c, 0xdc, 0xeb, 0xd7, 0x32, 0xb0, 0x8a, 0xa3, 0x0a, 0x6c, 0x42, 0x7e, - 0x3e, 0xd5, 0x27, 0x1f, 0x8d, 0xa8, 0x4f, 0x36, 0xe5, 0xf5, 0x62, 0x23, 0x9b, 0xa3, 0x37, 0x79, - 0x00, 0x1b, 0x09, 0x44, 0xf2, 0x3a, 0x2c, 0xd0, 0xee, 0x0b, 0x71, 0x53, 0x8d, 0xef, 0x80, 0x30, - 0x7e, 0x2e, 0x1d, 0xb8, 0x6f, 0x32, 0x6c, 0xed, 0xbf, 0x14, 0x58, 0xe1, 0xe9, 0x2b, 0x06, 0x47, - 0xc3, 0xa7, 0x4e, 0xe7, 0xed, 0xf8, 0x74, 0xb2, 0x28, 0x1d, 0x7c, 0x3a, 0xff, 0xa7, 0x27, 0xf1, - 0xad, 0xc8, 0x24, 0x5e, 0x0e, 0xa2, 0xe9, 0x89, 0xe1, 0xcc, 0x99, 0xc3, 0xbf, 0xc2, 0xf8, 0xb2, - 0x51, 0x44, 0xf2, 0x05, 0x58, 0x6e, 0xb8, 0x8f, 0x23, 0x52, 0xdb, 0xed, 0x19, 0x8d, 0xbe, 0x1a, - 0x20, 0xb2, 0x33, 0x85, 0x17, 0xde, 0xc0, 0x7d, 0x6c, 0x27, 0x5e, 0xa0, 0xc2, 0x26, 0xa9, 0xe0, - 0x16, 0xad, 0xf6, 0x2c, 0x5b, 0x9f, 0x3b, 0x4a, 0x62, 0xe0, 0x99, 0x6f, 0x64, 0x01, 0x42, 0x1f, - 0x33, 0x7a, 0x00, 0x23, 0x8f, 0xef, 0x42, 0xe1, 0x8d, 0x20, 0x79, 0x8f, 0x8b, 0x37, 0xf9, 0xdb, - 0x5c, 0x31, 0x9b, 0x99, 0x1d, 0xed, 0x10, 0x55, 0xb4, 0x25, 0xee, 0xd4, 0xd4, 0x73, 0xfb, 0x0e, - 0xa3, 0xed, 0xd9, 0x9d, 0x9b, 0x18, 0xdc, 0x36, 0x80, 0xce, 0xc8, 0x43, 0x8c, 0xae, 0x4f, 0x65, - 0x8a, 0x90, 0xf0, 0xdb, 0xcc, 0x3d, 0x9b, 0xdf, 0x66, 0x0b, 0x96, 0xbd, 0xc1, 0x3b, 0xee, 0x60, - 0x32, 0x1c, 0x3f, 0x41, 0x6d, 0x74, 0xa8, 0xe6, 0xa2, 0x53, 0x50, 0x15, 0x65, 0x6c, 0x1d, 0xf0, - 0x62, 0x0c, 0xf0, 0xe5, 0x65, 0x08, 0x80, 0x81, 0xdf, 0xe9, 0x82, 0xba, 0xf8, 0x20, 0x97, 0x5f, - 0x54, 0x97, 0x1e, 0xe4, 0xf2, 0x79, 0x75, 0xf9, 0x41, 0x2e, 0xbf, 0xac, 0x82, 0x29, 0xbd, 0xef, - 0x04, 0xef, 0x37, 0xd2, 0x93, 0x4b, 0xf4, 0x39, 0x45, 0xfb, 0x49, 0x06, 0x48, 0xb2, 0x1b, 0xe4, - 0xa3, 0x50, 0x60, 0x04, 0xd6, 0x1e, 0xfb, 0x5f, 0xe6, 0x66, 0xeb, 0x2c, 0x7c, 0x8f, 0x04, 0x96, - 0xc3, 0xf7, 0x30, 0xb0, 0xe9, 0x7f, 0xb9, 0x4f, 0x3e, 0x0f, 0xe7, 0x71, 0x7a, 0x47, 0xee, 0xd8, - 0x1b, 0xf6, 0x6c, 0x8c, 0xb5, 0xea, 0xf4, 0x79, 0xce, 0xc0, 0x57, 0x30, 0xb9, 0x6d, 0xb2, 0x78, - 0xc6, 0x32, 0xa0, 0x2b, 0x59, 0x0b, 0x31, 0x5b, 0x0c, 0x91, 0xb4, 0x41, 0x95, 0xeb, 0x1f, 0x4d, - 0xfb, 0x7d, 0xbe, 0xb2, 0x45, 0x2a, 0xe8, 0xc6, 0xcb, 0x66, 0x34, 0xbc, 0x16, 0x36, 0x5c, 0x99, - 0xf6, 0xfb, 0xe4, 0x0d, 0x80, 0xe1, 0xc0, 0x3e, 0xf5, 0x7c, 0x9f, 0xbd, 0x71, 0x04, 0x5e, 0xaf, - 0x21, 0x54, 0x5e, 0x8c, 0xe1, 0xa0, 0xce, 0x80, 0xe4, 0xff, 0x01, 0x7a, 0xfd, 0x63, 0x38, 0x0c, - 0x66, 0xd5, 0xc2, 0xb3, 0x80, 0x08, 0x60, 0xd4, 0xc9, 0xf6, 0xd8, 0xb5, 0xbc, 0xaf, 0x0a, 0x97, - 0x81, 0xcf, 0xc2, 0x06, 0x37, 0x42, 0x3d, 0xf4, 0x26, 0x27, 0x9c, 0xc3, 0x7e, 0x1e, 0xf6, 0x5c, - 0x62, 0xb1, 0xff, 0x3e, 0x07, 0xa0, 0x1f, 0x5a, 0x22, 0xd2, 0xd4, 0x5d, 0x58, 0xa0, 0x72, 0x83, - 0xd0, 0x3f, 0xa0, 0xf6, 0x16, 0xdb, 0x95, 0xb5, 0xb7, 0x88, 0x41, 0x4f, 0xa3, 0x89, 0xc6, 0xd9, - 0x42, 0xf7, 0x80, 0xa7, 0x91, 0xd9, 0x6b, 0x47, 0x22, 0xfd, 0x72, 0x2c, 0x52, 0x03, 0x08, 0x63, - 0x3f, 0x71, 0x49, 0x76, 0x23, 0x0c, 0xa2, 0xc2, 0x0b, 0x78, 0xb6, 0x81, 0x30, 0x7e, 0x94, 0xbc, - 0x7d, 0x42, 0x34, 0xb2, 0x0f, 0xb9, 0xb6, 0x13, 0xf8, 0x74, 0xce, 0x88, 0x88, 0xf5, 0x22, 0xcf, - 0xe9, 0x18, 0x46, 0xc5, 0x5a, 0x9b, 0x38, 0x91, 0xd4, 0xb7, 0xd8, 0x08, 0x31, 0x60, 0x91, 0xe7, - 0xeb, 0x9e, 0x11, 0x49, 0x91, 0xa7, 0xeb, 0xe6, 0xf1, 0x93, 0x11, 0x28, 0xf3, 0x14, 0x3c, 0x33, - 0xf7, 0x7d, 0xc8, 0x5a, 0x56, 0x9d, 0xc7, 0x81, 0x58, 0x0d, 0xa5, 0x12, 0xcb, 0xaa, 0xb3, 0x37, - 0x4a, 0xdf, 0x3f, 0x95, 0xaa, 0x51, 0x64, 0xf2, 0x31, 0x28, 0x48, 0xec, 0x33, 0x8f, 0xa0, 0x82, - 0x73, 0x20, 0x79, 0xcd, 0xc8, 0x44, 0x43, 0xc2, 0x26, 0x35, 0x50, 0xf7, 0xa7, 0x6f, 0xbb, 0xfa, - 0x68, 0x84, 0xee, 0x74, 0xef, 0xb8, 0x63, 0xc6, 0xb6, 0xe5, 0xc3, 0xd0, 0xc3, 0x68, 0x6b, 0xdf, - 0x13, 0xa5, 0xb2, 0x0e, 0x26, 0x5e, 0x93, 0xb4, 0x60, 0xc3, 0x72, 0x27, 0xd3, 0x11, 0xb3, 0xd3, - 0xa8, 0x0c, 0xc7, 0x54, 0x08, 0x61, 0xf1, 0x56, 0x30, 0x4a, 0xab, 0x4f, 0x0b, 0x85, 0x71, 0xcc, - 0xd1, 0x70, 0x1c, 0x13, 0x48, 0x92, 0x95, 0x35, 0x57, 0x5e, 0x72, 0x7a, 0xab, 0x46, 0x45, 0x1b, - 0xbc, 0x55, 0x85, 0x68, 0x13, 0x0a, 0x34, 0x1f, 0x4a, 0x89, 0x09, 0x86, 0x0f, 0x66, 0x52, 0x4c, - 0xb0, 0x48, 0x24, 0xb0, 0xef, 0xe6, 0xa4, 0xb0, 0x94, 0x7c, 0x2d, 0x3e, 0x0e, 0xf0, 0x60, 0xe8, - 0x0d, 0xea, 0xee, 0xe4, 0x64, 0xd8, 0x93, 0x42, 0x93, 0x15, 0x7e, 0x69, 0xe8, 0x0d, 0xec, 0x53, - 0x04, 0xff, 0xe4, 0xdd, 0xeb, 0x12, 0x92, 0x29, 0xfd, 0x4f, 0x3e, 0x08, 0xcb, 0xf4, 0x57, 0x3b, - 0xb4, 0x36, 0x61, 0xaa, 0x4a, 0xac, 0xcd, 0x92, 0x37, 0x84, 0x08, 0xe4, 0x2d, 0x4c, 0x57, 0xe2, - 0x8d, 0x26, 0x12, 0xf3, 0x2a, 0x72, 0x93, 0x78, 0xa3, 0x49, 0x3c, 0xd2, 0xb0, 0x84, 0x4c, 0xf6, - 0x82, 0xae, 0x8b, 0x0c, 0x43, 0x3c, 0x2b, 0x0a, 0xea, 0xe3, 0xf8, 0x5e, 0xb3, 0x45, 0x88, 0x53, - 0x39, 0x17, 0x6c, 0xac, 0x1a, 0x76, 0xc2, 0xda, 0x2b, 0xb3, 0x07, 0x14, 0xce, 0xd4, 0xb2, 0x4e, - 0xf8, 0x27, 0x3d, 0xbb, 0x8b, 0xe0, 0x48, 0x27, 0x02, 0x64, 0xb2, 0x03, 0xeb, 0x8c, 0xc7, 0x0f, - 0x32, 0x15, 0x72, 0x16, 0x17, 0x69, 0x5b, 0x98, 0xca, 0x50, 0xfe, 0x7c, 0xac, 0x02, 0xa9, 0xc0, - 0x02, 0x0a, 0x84, 0xdc, 0xc4, 0x7c, 0x5b, 0x96, 0x9e, 0xe3, 0xe7, 0x08, 0xe9, 0x0a, 0xca, 0xcd, - 0x32, 0x5d, 0x41, 0x54, 0xf2, 0x19, 0x00, 0x63, 0x30, 0x1e, 0xf6, 0xfb, 0x18, 0x84, 0x37, 0x8f, - 0xa2, 0xd4, 0xd5, 0xe8, 0x79, 0xc4, 0x56, 0x42, 0x24, 0x1e, 0x30, 0x0e, 0x7f, 0xdb, 0xb1, 0x50, - 0xbd, 0x52, 0x5b, 0x5a, 0x15, 0x16, 0xd9, 0x61, 0xc4, 0x80, 0xd6, 0x3c, 0x45, 0x87, 0x14, 0x0e, - 0x99, 0x05, 0xb4, 0xe6, 0xf0, 0x64, 0x40, 0x6b, 0xa9, 0x82, 0xb6, 0x0f, 0x17, 0xd2, 0x06, 0x16, - 0x11, 0x61, 0x95, 0xb3, 0x8a, 0xb0, 0xdf, 0xc9, 0xc2, 0x0a, 0xb6, 0x26, 0xa8, 0xb0, 0x0e, 0xab, - 0xd6, 0xf4, 0xed, 0x20, 0xda, 0x93, 0xa0, 0xc6, 0xd8, 0x3f, 0x5f, 0x2e, 0x90, 0x9f, 0xb6, 0x22, - 0x35, 0x88, 0x01, 0x6b, 0xe2, 0x26, 0xd8, 0x15, 0x16, 0xe8, 0x41, 0x2c, 0x69, 0x11, 0xb1, 0x30, - 0x99, 0xa9, 0x35, 0x56, 0x29, 0xbc, 0x0f, 0xb2, 0xcf, 0x72, 0x1f, 0xe4, 0xce, 0x74, 0x1f, 0x3c, - 0x82, 0x15, 0xf1, 0x35, 0xa4, 0xe4, 0x0b, 0xcf, 0x47, 0xc9, 0x23, 0x8d, 0x91, 0x5a, 0x40, 0xd1, - 0x17, 0xe7, 0x52, 0x74, 0x7c, 0x2f, 0x14, 0xa7, 0x6c, 0x84, 0xb0, 0x24, 0x61, 0xc7, 0x54, 0x86, - 0xbb, 0xa5, 0xd6, 0x4f, 0x71, 0x4b, 0xbe, 0x0e, 0xcb, 0xb5, 0xa1, 0x78, 0x2a, 0x92, 0x74, 0xf4, - 0x7d, 0x01, 0x94, 0xd9, 0x85, 0x00, 0x33, 0xb8, 0xdd, 0xb2, 0xef, 0xc7, 0xed, 0xf6, 0x16, 0x00, - 0x77, 0x6d, 0x08, 0x53, 0x90, 0xe1, 0x91, 0x11, 0x91, 0x2e, 0xa2, 0x4f, 0x05, 0x12, 0x32, 0xa5, - 0x4e, 0xdc, 0x0a, 0x45, 0xef, 0x76, 0x87, 0xd3, 0xc1, 0x24, 0x92, 0xb3, 0x57, 0x78, 0x42, 0x3a, - 0xbc, 0x4c, 0x26, 0x0f, 0xb1, 0x6a, 0xef, 0xef, 0x82, 0x90, 0x4f, 0x07, 0x46, 0x74, 0x4b, 0xf3, - 0x66, 0x48, 0x4b, 0xcc, 0xd0, 0x4c, 0xd3, 0x39, 0xed, 0x07, 0x8a, 0x1c, 0xc8, 0xff, 0xa7, 0x58, - 0xea, 0x37, 0x01, 0x82, 0xb7, 0x7a, 0xb1, 0xd6, 0x4c, 0x5e, 0x0a, 0xa0, 0xf2, 0x2c, 0x87, 0xb8, - 0xd2, 0x68, 0xb2, 0xef, 0xd7, 0x68, 0xda, 0x50, 0x68, 0x7e, 0x69, 0xe2, 0x84, 0xc6, 0x1d, 0x60, - 0x05, 0x9c, 0x2c, 0x52, 0xa6, 0xec, 0xce, 0x2d, 0xbc, 0x1b, 0x42, 0x3e, 0x78, 0x06, 0x0b, 0x2c, - 0x55, 0xd4, 0xfe, 0x4c, 0x81, 0x75, 0xd9, 0x7d, 0xfb, 0xc9, 0xa0, 0x4b, 0x3e, 0xc1, 0xe2, 0x8a, - 0x2a, 0x11, 0x91, 0x45, 0x42, 0xa2, 0x24, 0xf7, 0xc9, 0xa0, 0xcb, 0x18, 0x20, 0xe7, 0xb1, 0xdc, - 0x59, 0x5a, 0x91, 0xbc, 0x0d, 0x2b, 0xad, 0x61, 0xbf, 0x4f, 0xd9, 0x9a, 0xf1, 0x3b, 0x5c, 0x00, - 0xa0, 0x0d, 0xc5, 0x5f, 0x0c, 0x44, 0x87, 0x76, 0x5e, 0xe2, 0x72, 0xee, 0xe5, 0x11, 0xa5, 0xf7, - 0x1e, 0xaf, 0x17, 0x36, 0xfb, 0x6d, 0xf4, 0xb7, 0x92, 0xdb, 0xd4, 0x7e, 0xa4, 0x00, 0x49, 0x76, - 0x49, 0x26, 0x59, 0xca, 0xff, 0x02, 0x0b, 0x1b, 0x63, 0xfd, 0x72, 0xcf, 0xc2, 0xfa, 0x15, 0x7f, - 0x47, 0x81, 0xf5, 0xaa, 0x5e, 0xe7, 0xa1, 0xfd, 0xd9, 0xc3, 0xc6, 0x0d, 0xb8, 0x5a, 0xd5, 0xeb, - 0x76, 0xab, 0x59, 0xab, 0x96, 0x1e, 0xda, 0xa9, 0x11, 0x7b, 0xaf, 0xc2, 0x0b, 0x49, 0x94, 0xf0, - 0x01, 0xe4, 0x0a, 0x6c, 0x26, 0x8b, 0x45, 0x54, 0xdf, 0xf4, 0xca, 0x22, 0x00, 0x70, 0xb6, 0xf8, - 0x49, 0x58, 0x17, 0x11, 0x6c, 0xdb, 0x35, 0x0b, 0x63, 0xe4, 0xaf, 0x43, 0xe1, 0xc0, 0x30, 0xab, - 0x95, 0x87, 0x76, 0xa5, 0x53, 0xab, 0xa9, 0xe7, 0xc8, 0x2a, 0x2c, 0x73, 0x40, 0x49, 0x57, 0x15, - 0xb2, 0x02, 0xf9, 0x6a, 0xc3, 0x32, 0x4a, 0x1d, 0xd3, 0x50, 0x33, 0xc5, 0x4f, 0xc2, 0x5a, 0x6b, - 0xec, 0xbd, 0xe3, 0x4c, 0xdc, 0x7d, 0xf7, 0x09, 0xbe, 0x5f, 0x2c, 0x41, 0xd6, 0xd4, 0x0f, 0xd5, - 0x73, 0x04, 0x60, 0xb1, 0xb5, 0x5f, 0xb2, 0xee, 0xdd, 0x53, 0x15, 0x52, 0x80, 0xa5, 0xdd, 0x52, - 0xcb, 0xde, 0xaf, 0x5b, 0x6a, 0x86, 0xfe, 0xd0, 0x0f, 0x2d, 0xfc, 0x91, 0x2d, 0x7e, 0x18, 0x36, - 0x90, 0x21, 0xa9, 0x79, 0xfe, 0xc4, 0x1d, 0xb8, 0x63, 0xec, 0xc3, 0x0a, 0xe4, 0x2d, 0x97, 0x52, - 0x92, 0x89, 0xcb, 0x3a, 0x50, 0x9f, 0xf6, 0x27, 0xde, 0xa8, 0xef, 0x7e, 0x45, 0x55, 0x8a, 0x6f, - 0xc1, 0xba, 0x39, 0x9c, 0x4e, 0xbc, 0xc1, 0xb1, 0x35, 0xa1, 0x18, 0xc7, 0x4f, 0xc8, 0x45, 0xd8, - 0xe8, 0x34, 0xf4, 0xfa, 0x4e, 0x75, 0xb7, 0xd3, 0xec, 0x58, 0x76, 0x5d, 0x6f, 0x97, 0xf6, 0xd8, - 0xeb, 0x49, 0xbd, 0x69, 0xb5, 0x6d, 0xd3, 0x28, 0x19, 0x8d, 0xb6, 0xaa, 0x14, 0xbf, 0x89, 0xba, - 0x95, 0xee, 0x70, 0xd0, 0xab, 0x38, 0xdd, 0xc9, 0x70, 0x8c, 0x1d, 0xd6, 0xe0, 0x9a, 0x65, 0x94, - 0x9a, 0x8d, 0xb2, 0x5d, 0xd1, 0x4b, 0xed, 0xa6, 0x99, 0x16, 0x32, 0x7a, 0x0b, 0x2e, 0xa5, 0xe0, - 0x34, 0xdb, 0x2d, 0x55, 0x21, 0xd7, 0x61, 0x3b, 0xa5, 0xec, 0xd0, 0xd8, 0xd1, 0x3b, 0xed, 0xbd, - 0x86, 0x9a, 0x99, 0x51, 0xd9, 0xb2, 0x9a, 0x6a, 0xb6, 0xf8, 0x1b, 0x0a, 0xac, 0x75, 0x7c, 0x6e, - 0xba, 0xdc, 0x41, 0xaf, 0xc5, 0x17, 0xe1, 0x4a, 0xc7, 0x32, 0x4c, 0xbb, 0xdd, 0xdc, 0x37, 0x1a, - 0x76, 0xc7, 0xd2, 0x77, 0xe3, 0xbd, 0xb9, 0x0e, 0xdb, 0x12, 0x86, 0x69, 0x94, 0x9a, 0x07, 0x86, - 0x69, 0xb7, 0x74, 0xcb, 0x3a, 0x6c, 0x9a, 0x65, 0x55, 0xa1, 0x5f, 0x4c, 0x41, 0xa8, 0x57, 0x74, - 0xd6, 0x9b, 0x48, 0x59, 0xc3, 0x38, 0xd4, 0x6b, 0xf6, 0x4e, 0xb3, 0xad, 0x66, 0x8b, 0x75, 0x7a, - 0xbf, 0x63, 0xe0, 0x56, 0x66, 0x70, 0x97, 0x87, 0x5c, 0xa3, 0xd9, 0x30, 0xe2, 0x6f, 0x6e, 0x2b, - 0x90, 0xd7, 0x5b, 0x2d, 0xb3, 0x79, 0x80, 0x5b, 0x0c, 0x60, 0xb1, 0x6c, 0x34, 0x68, 0xcf, 0xb2, - 0xb4, 0xa4, 0x65, 0x36, 0xeb, 0xcd, 0xb6, 0x51, 0x56, 0x73, 0x45, 0x53, 0x1c, 0x61, 0xd1, 0x68, - 0x77, 0xc8, 0x1e, 0xb8, 0xca, 0x46, 0x45, 0xef, 0xd4, 0xda, 0x7c, 0x89, 0x1e, 0xda, 0xa6, 0xf1, - 0xe9, 0x8e, 0x61, 0xb5, 0x2d, 0x55, 0x21, 0x2a, 0xac, 0x34, 0x0c, 0xa3, 0x6c, 0xd9, 0xa6, 0x71, - 0x50, 0x35, 0x0e, 0xd5, 0x0c, 0x6d, 0x93, 0xfd, 0x4f, 0xbf, 0x50, 0xfc, 0xae, 0x02, 0x84, 0x05, - 0xbd, 0x15, 0x99, 0x54, 0x70, 0xc7, 0x5c, 0x83, 0xad, 0x3d, 0xba, 0xd4, 0x38, 0xb4, 0x7a, 0xb3, - 0x1c, 0x9f, 0xb2, 0x4b, 0x40, 0x62, 0xe5, 0xcd, 0x4a, 0x45, 0x55, 0xc8, 0x36, 0x9c, 0x8f, 0xc1, - 0xcb, 0x66, 0xb3, 0xa5, 0x66, 0xb6, 0x32, 0x79, 0x85, 0x5c, 0x4e, 0x14, 0xee, 0x1b, 0x46, 0x4b, - 0xcd, 0xd2, 0x25, 0x8a, 0x15, 0x88, 0x23, 0xc1, 0xaa, 0xe7, 0x8a, 0x5f, 0x57, 0xe0, 0x12, 0xeb, - 0xa6, 0x38, 0x5f, 0x41, 0x57, 0xaf, 0xc0, 0x26, 0x0f, 0xe5, 0x9d, 0xd6, 0xd1, 0x0b, 0xa0, 0x46, - 0x4a, 0x59, 0x37, 0x2f, 0xc2, 0x46, 0x04, 0x8a, 0xfd, 0xc8, 0x50, 0xea, 0x11, 0x01, 0xef, 0x18, - 0x56, 0xdb, 0x36, 0x2a, 0x95, 0xa6, 0xd9, 0x66, 0x1d, 0xc9, 0x16, 0x35, 0xd8, 0x28, 0xb9, 0xe3, - 0x09, 0x15, 0xbd, 0x06, 0xbe, 0x37, 0x1c, 0x60, 0x17, 0x56, 0x61, 0xd9, 0xf8, 0x4c, 0xdb, 0x68, - 0x58, 0xd5, 0x66, 0x43, 0x3d, 0x57, 0xbc, 0x12, 0xc3, 0x11, 0xe7, 0xd8, 0xb2, 0xf6, 0xd4, 0x73, - 0x45, 0x07, 0x56, 0x85, 0x91, 0x30, 0xdb, 0x15, 0xd7, 0x60, 0x4b, 0xec, 0x35, 0xa4, 0x28, 0xf1, - 0x21, 0x6c, 0xc2, 0x85, 0x64, 0xb9, 0xd1, 0x56, 0x15, 0xba, 0x0a, 0xb1, 0x12, 0x0a, 0xcf, 0x14, - 0x7f, 0x4d, 0x81, 0xd5, 0xe0, 0xd1, 0x04, 0xd5, 0xb4, 0xd7, 0x61, 0xbb, 0x5e, 0xd1, 0xed, 0xb2, - 0x71, 0x50, 0x2d, 0x19, 0xf6, 0x7e, 0xb5, 0x51, 0x8e, 0x7d, 0xe4, 0x05, 0xb8, 0x98, 0x82, 0x80, - 0x5f, 0xd9, 0x84, 0x0b, 0xf1, 0xa2, 0x36, 0x3d, 0xaa, 0x19, 0x3a, 0xf5, 0xf1, 0x92, 0xe0, 0x9c, - 0x66, 0x8b, 0x07, 0xb0, 0x66, 0xe9, 0xf5, 0x5a, 0x65, 0x38, 0xee, 0xba, 0xfa, 0x74, 0x72, 0x32, - 0x20, 0xdb, 0x70, 0xb9, 0xd2, 0x34, 0x4b, 0x86, 0x8d, 0x28, 0xb1, 0x1e, 0x9c, 0x87, 0x75, 0xb9, - 0xf0, 0xa1, 0x41, 0xb7, 0x2f, 0x81, 0x35, 0x19, 0xd8, 0x68, 0xaa, 0x99, 0xe2, 0xe7, 0x60, 0x25, - 0x92, 0x50, 0xed, 0x32, 0x9c, 0x97, 0x7f, 0xb7, 0xdc, 0x41, 0xcf, 0x1b, 0x1c, 0xab, 0xe7, 0xe2, - 0x05, 0xe6, 0x74, 0x30, 0xa0, 0x05, 0x78, 0x9e, 0xe5, 0x82, 0xb6, 0x3b, 0x3e, 0xf5, 0x06, 0xce, - 0xc4, 0xed, 0xa9, 0x99, 0xe2, 0xab, 0xb0, 0x1a, 0x09, 0xe3, 0x4c, 0x17, 0xae, 0xd6, 0xe4, 0x04, - 0xb8, 0x6e, 0x94, 0xab, 0x9d, 0xba, 0xba, 0x40, 0x4f, 0xf2, 0x5e, 0x75, 0x77, 0x4f, 0x85, 0xe2, - 0xb7, 0x14, 0x2a, 0x67, 0x60, 0x72, 0x96, 0x7a, 0x45, 0x17, 0x4b, 0x4d, 0xb7, 0x19, 0x0b, 0x0e, - 0x6f, 0x58, 0x16, 0x7b, 0x6a, 0xbe, 0x02, 0x9b, 0xfc, 0x87, 0xad, 0x37, 0xca, 0xf6, 0x9e, 0x6e, - 0x96, 0x0f, 0x75, 0x93, 0xee, 0xbd, 0x87, 0x6a, 0x06, 0x0f, 0x94, 0x04, 0xb1, 0xdb, 0xcd, 0x4e, - 0x69, 0x4f, 0xcd, 0xd2, 0xfd, 0x1b, 0x81, 0xb7, 0xaa, 0x0d, 0x35, 0x87, 0xc7, 0x33, 0x81, 0x8d, - 0xcd, 0xd2, 0xf2, 0x85, 0xe2, 0x7b, 0x0a, 0x5c, 0xb6, 0xbc, 0xe3, 0x81, 0x33, 0x99, 0x8e, 0x5d, - 0xbd, 0x7f, 0x3c, 0x1c, 0x7b, 0x93, 0x93, 0x53, 0x6b, 0xea, 0x4d, 0x5c, 0x72, 0x17, 0x6e, 0x59, - 0xd5, 0xdd, 0x86, 0xde, 0xa6, 0xc7, 0x4b, 0xaf, 0xed, 0x36, 0xcd, 0x6a, 0x7b, 0xaf, 0x6e, 0x5b, - 0x9d, 0x6a, 0x62, 0xe7, 0xdd, 0x84, 0x17, 0x67, 0xa3, 0xd6, 0x8c, 0x5d, 0xbd, 0xf4, 0x50, 0x55, - 0xe6, 0x37, 0xb8, 0xa3, 0xd7, 0xf4, 0x46, 0xc9, 0x28, 0xdb, 0x07, 0xf7, 0xd4, 0x0c, 0xb9, 0x05, - 0x37, 0x66, 0xa3, 0x56, 0xaa, 0x2d, 0x8b, 0xa2, 0x65, 0xe7, 0x7f, 0x77, 0xcf, 0xaa, 0x53, 0xac, - 0x5c, 0xf1, 0x0f, 0x15, 0xd8, 0x9c, 0x15, 0xcb, 0x87, 0xdc, 0x06, 0xcd, 0x68, 0xb4, 0x4d, 0xbd, - 0x5a, 0xb6, 0x4b, 0xa6, 0x51, 0x36, 0x1a, 0xed, 0xaa, 0x5e, 0xb3, 0x6c, 0xab, 0xd9, 0xa1, 0xbb, - 0x29, 0xb4, 0x08, 0x78, 0x09, 0xae, 0xcf, 0xc1, 0x6b, 0x56, 0xcb, 0x25, 0x55, 0x21, 0xf7, 0xe0, - 0x95, 0x39, 0x48, 0xd6, 0x43, 0xab, 0x6d, 0xd4, 0xe5, 0x12, 0x35, 0x53, 0x2c, 0xc1, 0xd6, 0xec, - 0x60, 0x1f, 0x94, 0x4c, 0x47, 0x67, 0x3a, 0x0f, 0xb9, 0x32, 0xbd, 0x19, 0x22, 0x39, 0x04, 0x8a, - 0x1e, 0xa8, 0x71, 0x7f, 0xfd, 0x84, 0xe9, 0x86, 0xd9, 0x69, 0x34, 0xd8, 0x35, 0xb2, 0x0e, 0x85, - 0x66, 0x7b, 0xcf, 0x30, 0x79, 0x16, 0x06, 0x4c, 0xbb, 0xd0, 0x69, 0xd0, 0x83, 0xd3, 0x34, 0xab, - 0x9f, 0xc5, 0xfb, 0x64, 0x13, 0x2e, 0x58, 0x35, 0xbd, 0xb4, 0x6f, 0x37, 0x9a, 0x6d, 0xbb, 0xda, - 0xb0, 0x4b, 0x7b, 0x7a, 0xa3, 0x61, 0xd4, 0x54, 0xc0, 0xc9, 0x9c, 0xe5, 0xa3, 0x47, 0x3e, 0x08, - 0x77, 0x9a, 0xfb, 0x6d, 0xdd, 0x6e, 0xd5, 0x3a, 0xbb, 0xd5, 0x86, 0x6d, 0x3d, 0x6c, 0x94, 0x04, - 0xef, 0x53, 0x4a, 0x92, 0xdc, 0x3b, 0x70, 0x73, 0x2e, 0x76, 0x98, 0x2f, 0xe1, 0x36, 0x68, 0x73, - 0x31, 0xf9, 0x40, 0x8a, 0x3f, 0x54, 0x60, 0x7b, 0xce, 0x1b, 0x32, 0x79, 0x05, 0xee, 0xee, 0x19, - 0x7a, 0xb9, 0x66, 0x58, 0x16, 0x12, 0x0a, 0xba, 0x0c, 0xcc, 0xc4, 0x23, 0x95, 0xa0, 0xde, 0x85, - 0x5b, 0xf3, 0xd1, 0xc3, 0xab, 0xf9, 0x0e, 0xdc, 0x9c, 0x8f, 0xca, 0xaf, 0xea, 0x0c, 0x29, 0xc2, - 0xed, 0xf9, 0x98, 0xc1, 0x15, 0x9f, 0x2d, 0xfe, 0x96, 0x02, 0x97, 0xd2, 0x15, 0x39, 0xb4, 0x6f, - 0xd5, 0x86, 0xd5, 0xd6, 0x6b, 0x35, 0xbb, 0xa5, 0x9b, 0x7a, 0xdd, 0x36, 0x1a, 0x66, 0xb3, 0x56, - 0x4b, 0xbb, 0xda, 0x6e, 0xc2, 0x8b, 0xb3, 0x51, 0xad, 0x92, 0x59, 0x6d, 0x51, 0xea, 0xad, 0xc1, - 0xb5, 0xd9, 0x58, 0x46, 0xb5, 0x64, 0xa8, 0x99, 0x9d, 0x8f, 0x7f, 0xff, 0x9f, 0xae, 0x9d, 0xfb, - 0xfe, 0x7b, 0xd7, 0x94, 0x1f, 0xbd, 0x77, 0x4d, 0xf9, 0xc7, 0xf7, 0xae, 0x29, 0x9f, 0x7d, 0xf9, - 0x6c, 0xa9, 0x86, 0x90, 0xef, 0x7f, 0x7b, 0x11, 0x25, 0x94, 0xd7, 0xfe, 0x3b, 0x00, 0x00, 0xff, - 0xff, 0x55, 0xbe, 0x56, 0x52, 0x69, 0xb6, 0x01, 0x00, + 0x2c, 0xe7, 0x89, 0x60, 0x85, 0xaf, 0xce, 0xfc, 0x43, 0x29, 0x56, 0x1b, 0x57, 0xcd, 0xe8, 0x5f, + 0x44, 0xbe, 0x07, 0x2e, 0xf0, 0x20, 0x50, 0xec, 0x86, 0xef, 0xb4, 0xbb, 0x6e, 0xd7, 0x5f, 0xb2, + 0xeb, 0x07, 0x4c, 0xcc, 0xe7, 0xde, 0xb6, 0xd8, 0xf2, 0x7a, 0x58, 0x68, 0xed, 0xf0, 0x52, 0x2d, + 0xba, 0x40, 0x3a, 0x03, 0xb2, 0x02, 0x33, 0xbc, 0xa8, 0xd4, 0x0d, 0xdc, 0x5a, 0xdd, 0x6e, 0x3a, + 0xed, 0x3d, 0x94, 0x25, 0xf2, 0x5c, 0x94, 0xb1, 0xbb, 0x81, 0x6b, 0xf9, 0x1c, 0xae, 0x6a, 0x6a, + 0x12, 0x44, 0xa4, 0x0a, 0xd3, 0x26, 0xb5, 0x1b, 0x6b, 0xf6, 0xe3, 0xb2, 0xdd, 0xb1, 0xeb, 0x4e, + 0xc0, 0xa3, 0x52, 0xe6, 0xb8, 0x40, 0xe7, 0x51, 0xbb, 0x61, 0xb5, 0xec, 0xc7, 0x56, 0x5d, 0x14, + 0xea, 0x2a, 0x7b, 0x8d, 0x2e, 0x64, 0xe5, 0xb4, 0x43, 0x56, 0x63, 0x71, 0x56, 0x4e, 0xbb, 0x37, + 0xab, 0x88, 0x4e, 0xb2, 0xda, 0xb4, 0xbd, 0x3d, 0x1a, 0x70, 0xf3, 0x68, 0xb8, 0x9c, 0xb9, 0x9a, + 0x51, 0x58, 0x05, 0x58, 0x66, 0xa1, 0xa9, 0x74, 0x9c, 0x95, 0x42, 0xc7, 0x66, 0xde, 0xb6, 0xe7, + 0x04, 0x54, 0x6d, 0xe1, 0x38, 0x7e, 0x16, 0xf6, 0x3f, 0x1a, 0x96, 0xf7, 0x6a, 0x62, 0x82, 0x32, + 0xe2, 0xa6, 0x34, 0x72, 0x22, 0xc1, 0x2d, 0xbd, 0x95, 0x09, 0xca, 0x90, 0x9b, 0xda, 0xce, 0x49, + 0x6c, 0xa7, 0xc2, 0xad, 0x47, 0x43, 0x13, 0x94, 0x64, 0x9d, 0x75, 0x5a, 0xc0, 0xe4, 0x26, 0xb7, + 0x2d, 0x2c, 0xb8, 0xa7, 0xf0, 0xd3, 0x5e, 0x11, 0x66, 0x88, 0x05, 0x4f, 0x16, 0x5b, 0x29, 0xf6, + 0xdc, 0x71, 0x62, 0xf2, 0x37, 0x60, 0x7a, 0xcb, 0xa7, 0x77, 0xaa, 0x1b, 0x35, 0x19, 0x33, 0x0a, + 0x95, 0x8b, 0x53, 0x8b, 0x37, 0x4f, 0xd9, 0x74, 0xae, 0xab, 0x34, 0x98, 0xa8, 0x84, 0x8f, 0x5b, + 0xd7, 0xa7, 0xd6, 0xae, 0xd3, 0xf1, 0xc3, 0x00, 0x7c, 0xea, 0xb8, 0xc5, 0xaa, 0x32, 0x56, 0x60, + 0x26, 0xc1, 0x86, 0x4c, 0x01, 0x30, 0xa0, 0xb5, 0xb5, 0x5e, 0x5b, 0xde, 0x2c, 0x3c, 0x47, 0x0a, + 0x30, 0x81, 0xbf, 0x97, 0xd7, 0x4b, 0x4b, 0xab, 0xcb, 0x95, 0x42, 0x86, 0xcc, 0xc0, 0x24, 0x42, + 0x2a, 0xd5, 0x1a, 0x07, 0x65, 0x79, 0x98, 0x7a, 0xb3, 0xc0, 0x97, 0x6e, 0xc0, 0x16, 0x00, 0x9e, + 0x29, 0xc6, 0xdf, 0xcf, 0xc2, 0x45, 0x79, 0xac, 0xd0, 0x80, 0x09, 0x8e, 0x4e, 0x7b, 0xef, 0x19, + 0x3f, 0x1d, 0xee, 0x68, 0xa7, 0xc3, 0x2b, 0xb1, 0x93, 0x3a, 0xd6, 0xca, 0x3e, 0x47, 0xc4, 0x6f, + 0x8f, 0xc1, 0x8b, 0x7d, 0xa9, 0xc8, 0x17, 0xd9, 0x69, 0xee, 0xd0, 0x76, 0x50, 0x6d, 0x34, 0xe9, + 0xa6, 0xd3, 0xa2, 0x6e, 0x37, 0x10, 0x1e, 0x03, 0x2f, 0xa3, 0x3e, 0x0f, 0x0b, 0x2d, 0xa7, 0xd1, + 0xa4, 0x56, 0xc0, 0x8b, 0xb5, 0xe9, 0x96, 0xa4, 0x66, 0x2c, 0xc3, 0xa4, 0x49, 0xd5, 0x76, 0x40, + 0xbd, 0x47, 0x68, 0x95, 0x18, 0xb2, 0x3c, 0xa0, 0xb4, 0x63, 0xd9, 0xac, 0xd4, 0x72, 0x44, 0xb1, + 0xce, 0x32, 0x41, 0x4d, 0xee, 0x28, 0x2c, 0xcb, 0xec, 0xf6, 0xbf, 0x66, 0x3f, 0x16, 0x66, 0x52, + 0x22, 0x06, 0x69, 0xc8, 0x92, 0x3b, 0xf1, 0xb5, 0xec, 0xc7, 0x66, 0x92, 0x84, 0x7c, 0x15, 0xce, + 0x89, 0x03, 0x48, 0x04, 0x34, 0x91, 0x2d, 0xe6, 0xe1, 0x52, 0x5e, 0x3b, 0x39, 0x2e, 0x5e, 0x90, + 0xd1, 0x5b, 0x65, 0x08, 0x9b, 0xb4, 0x56, 0xa7, 0x73, 0x21, 0x9b, 0xec, 0x40, 0x8e, 0x75, 0xc7, + 0x1a, 0xf5, 0x7d, 0xe9, 0xa9, 0x29, 0x6e, 0xc6, 0x6a, 0x67, 0x5a, 0x2d, 0x5e, 0x6e, 0xf6, 0xa4, + 0x24, 0x2b, 0x30, 0xb5, 0x4d, 0x77, 0xd4, 0xf1, 0x19, 0x09, 0xb7, 0xaa, 0xc2, 0x21, 0xdd, 0xe9, + 0x3d, 0x38, 0x31, 0x3a, 0xe2, 0xe0, 0xfb, 0xc0, 0xe3, 0xa3, 0x55, 0xc7, 0x0f, 0x68, 0x9b, 0x7a, + 0x18, 0x28, 0x6b, 0x14, 0x37, 0x83, 0xf9, 0x48, 0x42, 0xd6, 0xcb, 0x97, 0x5e, 0x3a, 0x39, 0x2e, + 0xbe, 0xc8, 0x5d, 0x9e, 0x9b, 0x02, 0x6e, 0xc5, 0x52, 0x0e, 0x25, 0xb9, 0x92, 0xaf, 0xc3, 0xb4, + 0xe9, 0x76, 0x03, 0xa7, 0xbd, 0x57, 0x0b, 0x3c, 0x3b, 0xa0, 0x7b, 0xfc, 0x40, 0x8a, 0x22, 0x72, + 0xc5, 0x4a, 0xc5, 0xd3, 0x32, 0x07, 0x5a, 0xbe, 0x80, 0x6a, 0x27, 0x82, 0x4e, 0x40, 0xbe, 0x06, + 0x53, 0x3c, 0x94, 0x45, 0x58, 0xc1, 0x98, 0x96, 0x2e, 0x41, 0x2f, 0x7c, 0x78, 0x53, 0x58, 0xb5, + 0x20, 0x34, 0xad, 0x82, 0x18, 0x37, 0xf2, 0x65, 0xd1, 0x59, 0x1b, 0x4e, 0x7b, 0x2f, 0x9c, 0xc6, + 0x80, 0x3d, 0xff, 0x66, 0xd4, 0x25, 0x1d, 0xf6, 0xb9, 0x72, 0x1a, 0xf7, 0x30, 0xd1, 0x4b, 0xf2, + 0x21, 0x01, 0xbc, 0x58, 0xf2, 0x7d, 0xc7, 0x0f, 0x84, 0x5f, 0xcd, 0xf2, 0x63, 0x5a, 0xef, 0x32, + 0x64, 0x76, 0xbd, 0xa5, 0x1e, 0xb7, 0xeb, 0x1e, 0x5e, 0xba, 0x7e, 0x72, 0x5c, 0x7c, 0xdd, 0x46, + 0x44, 0x4b, 0xb8, 0xe2, 0x58, 0x54, 0xa2, 0x5a, 0x87, 0x1c, 0x57, 0x69, 0x43, 0x7f, 0xa6, 0xe4, + 0x6b, 0x70, 0xbe, 0x6c, 0xfb, 0xb4, 0xda, 0xf6, 0x69, 0xdb, 0x77, 0x02, 0xe7, 0x11, 0x15, 0x9d, + 0x8a, 0x87, 0x5f, 0x1e, 0x93, 0x33, 0x19, 0x75, 0xdb, 0x67, 0x0b, 0x33, 0x44, 0xb1, 0xc4, 0xa0, + 0x28, 0xd5, 0xf4, 0xe0, 0x42, 0x4c, 0x98, 0xaa, 0xd5, 0x56, 0x2a, 0x8e, 0x1d, 0xae, 0xab, 0x49, + 0xec, 0xaf, 0xd7, 0x51, 0xb5, 0xe7, 0xef, 0x5b, 0x0d, 0xc7, 0x0e, 0x17, 0x54, 0x8f, 0xce, 0x8a, + 0x71, 0x30, 0x8e, 0x33, 0x50, 0x88, 0x0f, 0x25, 0xf9, 0x12, 0x8c, 0x71, 0xfb, 0x36, 0xea, 0xef, + 0x8b, 0xc8, 0x0e, 0xd2, 0x5c, 0x2a, 0x84, 0xeb, 0x44, 0xc2, 0x89, 0x8e, 0x5b, 0xcf, 0x51, 0xd5, + 0x5a, 0x06, 0x9d, 0xe8, 0x24, 0x11, 0x69, 0xc0, 0x04, 0x1f, 0x2d, 0x8a, 0xe1, 0xf8, 0x84, 0x99, + 0xf3, 0x4b, 0xea, 0xea, 0x10, 0x45, 0x31, 0xfe, 0xf8, 0x6a, 0x28, 0xe6, 0x04, 0x47, 0xd0, 0xaa, + 0xd0, 0xb8, 0x2e, 0x01, 0xe4, 0x25, 0xa1, 0x71, 0x11, 0x2e, 0xf4, 0xf8, 0x66, 0xe3, 0x11, 0x5a, + 0x12, 0xf4, 0xa8, 0x91, 0x7c, 0x09, 0xe6, 0x90, 0xb0, 0xec, 0xb6, 0xdb, 0xb4, 0x1e, 0xe0, 0x76, + 0x24, 0xb5, 0xef, 0x39, 0x6e, 0xe9, 0xc2, 0xdb, 0x5b, 0x0f, 0x11, 0xac, 0xb8, 0x12, 0x3e, 0x95, + 0x83, 0xf1, 0x33, 0x59, 0x98, 0x17, 0x3b, 0x9c, 0x49, 0xeb, 0xae, 0xd7, 0x78, 0xf6, 0x4f, 0xd4, + 0x65, 0xed, 0x44, 0x7d, 0x39, 0x0c, 0xe5, 0x93, 0xd6, 0xc8, 0x3e, 0x07, 0xea, 0xaf, 0x64, 0xe0, + 0x85, 0x7e, 0x44, 0xac, 0x77, 0xc2, 0xf0, 0x83, 0x63, 0x89, 0x30, 0x83, 0x1d, 0x98, 0xc5, 0x01, + 0x2d, 0xef, 0xd3, 0xfa, 0x81, 0xbf, 0xe2, 0xfa, 0x01, 0x7a, 0x5a, 0x64, 0x7b, 0xbc, 0x75, 0xbf, + 0x91, 0xfa, 0xd6, 0x7d, 0x9e, 0xcf, 0xb2, 0x3a, 0xf2, 0xe0, 0x01, 0x12, 0x0f, 0xe8, 0x91, 0x6f, + 0xa6, 0xb1, 0x46, 0x8b, 0xf9, 0x52, 0x37, 0xd8, 0xdf, 0xf0, 0xe8, 0x2e, 0xf5, 0x68, 0xbb, 0x4e, + 0xbf, 0xcb, 0x2c, 0xe6, 0xf5, 0xc6, 0x0d, 0xa4, 0xc1, 0xf8, 0xc7, 0x93, 0x30, 0x97, 0x46, 0xc6, + 0xfa, 0x45, 0xb9, 0x34, 0xc7, 0x73, 0x47, 0xfe, 0x40, 0x06, 0x26, 0x6a, 0xb4, 0xee, 0xb6, 0x1b, + 0x77, 0xd0, 0xa2, 0x48, 0xf4, 0x8e, 0xc5, 0x85, 0x06, 0x06, 0xb7, 0x76, 0x63, 0xa6, 0x46, 0xdf, + 0x39, 0x2e, 0x7e, 0x61, 0xb0, 0xbb, 0x6a, 0xdd, 0xc5, 0x70, 0x3c, 0x01, 0xe6, 0x36, 0x08, 0xab, + 0xc0, 0xc7, 0x41, 0xad, 0x52, 0xb2, 0x04, 0x93, 0x62, 0xb9, 0xba, 0x6a, 0xf4, 0x49, 0x1e, 0xed, + 0x48, 0x16, 0x24, 0x54, 0xd7, 0x1a, 0x09, 0xb9, 0x05, 0xb9, 0xad, 0xc5, 0x3b, 0x62, 0x0c, 0x64, + 0x76, 0x88, 0xad, 0xc5, 0x3b, 0xa8, 0x0e, 0x63, 0x57, 0x8c, 0xc9, 0xee, 0xa2, 0x66, 0xe4, 0xb3, + 0xb5, 0x78, 0x87, 0xfc, 0x4d, 0x38, 0x57, 0x71, 0x7c, 0x51, 0x05, 0xf7, 0xdd, 0x68, 0xa0, 0xc7, + 0xe2, 0x48, 0x8f, 0xd9, 0xfb, 0xd9, 0xd4, 0xd9, 0xfb, 0x52, 0x23, 0x64, 0x62, 0x71, 0xc7, 0x90, + 0x46, 0x3c, 0xca, 0x66, 0x7a, 0x3d, 0xe4, 0x23, 0x98, 0x42, 0x65, 0x36, 0xba, 0xb3, 0x60, 0x7c, + 0xf4, 0xd1, 0x1e, 0x35, 0x7f, 0x3a, 0xb5, 0xe6, 0x05, 0x1e, 0x65, 0x03, 0x9d, 0x62, 0x30, 0x96, + 0xba, 0x76, 0xeb, 0xd7, 0x38, 0x93, 0x7b, 0x30, 0x2d, 0xc4, 0xaf, 0x07, 0xbb, 0x9b, 0xfb, 0xb4, + 0x62, 0x1f, 0x09, 0xfb, 0x1c, 0xbc, 0xd1, 0x09, 0x99, 0xcd, 0x72, 0x77, 0xad, 0x60, 0x9f, 0x5a, + 0x0d, 0x5b, 0x13, 0x54, 0x62, 0x84, 0xe4, 0x5b, 0x30, 0xbe, 0xea, 0xd6, 0x99, 0xe4, 0x8d, 0x3b, + 0x03, 0x37, 0xd9, 0xf9, 0x10, 0xb3, 0x13, 0x72, 0x70, 0x4c, 0x9c, 0xfa, 0xce, 0x71, 0xf1, 0x9d, + 0xb3, 0x4e, 0x1a, 0xa5, 0x02, 0x53, 0xad, 0x8d, 0x94, 0x21, 0xbf, 0x4d, 0x77, 0x58, 0x6b, 0xe3, + 0x99, 0xcb, 0x24, 0x58, 0x58, 0xe4, 0x89, 0x5f, 0x9a, 0x45, 0x9e, 0x80, 0x11, 0x0f, 0x66, 0xb0, + 0x7f, 0x36, 0x6c, 0xdf, 0x3f, 0x74, 0xbd, 0x06, 0xa6, 0xa8, 0xe8, 0x65, 0x0d, 0xb4, 0x98, 0xda, + 0xf9, 0x2f, 0xf0, 0xce, 0xef, 0x28, 0x1c, 0x54, 0x01, 0x32, 0xc1, 0x9e, 0x7c, 0x1d, 0xa6, 0x44, + 0xc4, 0x82, 0xb5, 0x3b, 0x25, 0x5c, 0x95, 0x13, 0x9a, 0xdf, 0xa7, 0x5e, 0xc8, 0xa5, 0x54, 0x11, + 0x00, 0x41, 0x6a, 0xa0, 0xac, 0xd6, 0xae, 0xad, 0x2b, 0xfd, 0x55, 0x12, 0xb2, 0x01, 0xe3, 0x15, + 0xcc, 0x9f, 0x8b, 0xbe, 0x69, 0xc2, 0x2e, 0x3c, 0x4c, 0xbd, 0x14, 0x95, 0x70, 0x5d, 0x8c, 0x48, + 0xb5, 0x8b, 0x9e, 0x6e, 0xba, 0xad, 0x6e, 0x88, 0x48, 0x6e, 0x43, 0xae, 0x5a, 0xd9, 0x10, 0x66, + 0xe1, 0x33, 0x61, 0x5c, 0x90, 0x0d, 0x99, 0xa8, 0x06, 0xed, 0xe7, 0x9c, 0x86, 0x66, 0x54, 0x5e, + 0xad, 0x6c, 0x90, 0x5d, 0x98, 0xc4, 0x0e, 0x58, 0xa1, 0x36, 0xef, 0xdb, 0xe9, 0x1e, 0x7d, 0x7b, + 0x3d, 0xb5, 0x6f, 0xe7, 0x79, 0xdf, 0xee, 0x0b, 0x6a, 0x2d, 0xf3, 0x86, 0xca, 0x96, 0x89, 0xb4, + 0x22, 0x1b, 0x90, 0xcc, 0x17, 0xb1, 0xb9, 0x8a, 0xf6, 0x41, 0x42, 0xa4, 0x95, 0xc9, 0x83, 0xc2, + 0x04, 0x16, 0x3d, 0xbd, 0x4e, 0x92, 0x7c, 0xc8, 0xe7, 0x61, 0xe8, 0xc1, 0x41, 0x60, 0x0b, 0x03, + 0x70, 0xd9, 0x8f, 0x0c, 0x24, 0x9b, 0x8f, 0x5a, 0x48, 0xf7, 0x40, 0x8b, 0xc3, 0x86, 0x34, 0x6c, + 0x28, 0x56, 0x6c, 0xaf, 0x71, 0x68, 0x7b, 0xe8, 0x20, 0x3c, 0xab, 0xb1, 0x50, 0x4a, 0xf8, 0x50, + 0xec, 0x0b, 0x40, 0xcc, 0x6b, 0x58, 0x65, 0x41, 0xbe, 0x07, 0x2e, 0xfa, 0xce, 0x5e, 0xdb, 0x0e, + 0xba, 0x1e, 0xb5, 0xec, 0xe6, 0x9e, 0xeb, 0x39, 0xc1, 0x7e, 0xcb, 0xf2, 0xbb, 0x4e, 0x40, 0xe7, + 0xe7, 0xb4, 0xdc, 0xc1, 0x35, 0x89, 0x57, 0x92, 0x68, 0x35, 0x86, 0x65, 0x5e, 0xf0, 0xd3, 0x0b, + 0xc8, 0x97, 0x61, 0x52, 0xdd, 0x92, 0xfd, 0xf9, 0x73, 0x97, 0x73, 0x57, 0xa7, 0xc2, 0x8b, 0x47, + 0x7c, 0x03, 0x97, 0x31, 0x77, 0x95, 0x13, 0xc2, 0xd7, 0x63, 0xee, 0x2a, 0xbc, 0xc2, 0x6c, 0x7c, + 0xa4, 0x30, 0x6b, 0xce, 0x88, 0x19, 0x2b, 0x7a, 0x79, 0xed, 0x4e, 0xc9, 0x1c, 0xdd, 0xa8, 0x3e, + 0xac, 0x35, 0xdd, 0xc0, 0xf8, 0xcf, 0x32, 0xb8, 0x89, 0x93, 0xd7, 0x31, 0x7c, 0x54, 0xf8, 0x7a, + 0x86, 0xfa, 0x5b, 0xbb, 0x13, 0x0b, 0xd8, 0xce, 0x51, 0xc8, 0x1b, 0x30, 0x72, 0xc7, 0xae, 0xcb, + 0xd0, 0x35, 0x02, 0x79, 0x17, 0x21, 0xaa, 0xb2, 0x97, 0xe3, 0x30, 0xf9, 0x92, 0x4f, 0xee, 0x52, + 0x94, 0x96, 0xba, 0x5c, 0x92, 0xcf, 0xf5, 0x28, 0x5f, 0x8a, 0x45, 0xa1, 0xe4, 0xad, 0x8e, 0x59, + 0xc5, 0xa7, 0x72, 0x30, 0xfe, 0x2c, 0x13, 0xed, 0x4a, 0xe4, 0x35, 0x18, 0x32, 0x37, 0xc2, 0xef, + 0xe7, 0x4e, 0xbf, 0xb1, 0xcf, 0x47, 0x04, 0xf2, 0x65, 0x38, 0xa7, 0xf0, 0x49, 0x98, 0xe8, 0xbf, + 0x8a, 0x3e, 0xa9, 0xca, 0x97, 0xa4, 0xdb, 0xe9, 0xa7, 0xf3, 0x40, 0x61, 0x3a, 0x2a, 0xa8, 0xd0, + 0xb6, 0xc3, 0x79, 0x2b, 0x8d, 0x55, 0x79, 0x37, 0x10, 0x21, 0xde, 0xd8, 0x34, 0x0e, 0xdc, 0x25, + 0xd5, 0xf8, 0xad, 0x8c, 0xb6, 0xdb, 0x84, 0x79, 0x7c, 0x33, 0xa7, 0xe4, 0xf1, 0x7d, 0x1b, 0xa0, + 0xd4, 0x0d, 0xdc, 0xe5, 0xb6, 0xe7, 0x36, 0xb9, 0x16, 0x45, 0xe4, 0x2c, 0x40, 0xdd, 0x30, 0x45, + 0xb0, 0xe6, 0x39, 0x17, 0x22, 0xa7, 0x7a, 0x33, 0xe4, 0x3e, 0xae, 0x37, 0x83, 0xf1, 0x07, 0x19, + 0x6d, 0x8d, 0x32, 0x29, 0x51, 0x4c, 0x45, 0xd5, 0x62, 0xac, 0xe3, 0x3c, 0xb2, 0xfc, 0xa6, 0xab, + 0x05, 0xa9, 0x10, 0x68, 0xe4, 0xff, 0x9f, 0x81, 0xf3, 0xdc, 0x2d, 0x60, 0xbd, 0xdb, 0xda, 0xa1, + 0xde, 0x43, 0xbb, 0xe9, 0x34, 0xb8, 0xe3, 0x35, 0x17, 0x80, 0xaf, 0x26, 0x17, 0x7c, 0x3a, 0x3e, + 0xbf, 0xa8, 0x72, 0x37, 0x05, 0xab, 0x8d, 0x85, 0xd6, 0xa3, 0xb0, 0x54, 0xbd, 0xa8, 0xa6, 0xd3, + 0x1b, 0xbf, 0x9a, 0x81, 0x97, 0x4e, 0xad, 0x85, 0xdc, 0x80, 0x51, 0x99, 0x2c, 0x22, 0x83, 0x1d, + 0x8f, 0x76, 0xb6, 0xc9, 0x44, 0x11, 0x12, 0x8b, 0x7c, 0x05, 0xce, 0xa9, 0xac, 0x36, 0x3d, 0xdb, + 0x51, 0x53, 0x32, 0xa4, 0x7c, 0x75, 0xc0, 0x50, 0xe2, 0xd2, 0x5a, 0x3a, 0x13, 0xe3, 0xff, 0xcd, + 0x28, 0x99, 0xbd, 0x9f, 0x51, 0x19, 0xfe, 0xb6, 0x26, 0xc3, 0xcb, 0xc0, 0x9d, 0x61, 0xab, 0x58, + 0x59, 0xea, 0xbd, 0x6b, 0x5a, 0xb1, 0x17, 0x47, 0xc0, 0x0f, 0x65, 0x61, 0x7c, 0xcb, 0xa7, 0x1e, + 0x7f, 0xc8, 0xfd, 0xee, 0x0a, 0xd0, 0x18, 0xb6, 0x6b, 0xa0, 0x10, 0x7a, 0x7f, 0x92, 0x41, 0x05, + 0xbf, 0x4a, 0xc1, 0x7a, 0x43, 0xc9, 0xe6, 0x87, 0xbd, 0x81, 0x79, 0xfc, 0x10, 0xca, 0x03, 0x8a, + 0xad, 0xea, 0x89, 0x3d, 0x31, 0xbb, 0xeb, 0x2a, 0xf9, 0x02, 0x0c, 0x6f, 0xa1, 0xba, 0x52, 0x0f, + 0xb2, 0x11, 0xf2, 0xc7, 0x42, 0xbe, 0x49, 0x77, 0x7d, 0x3d, 0xda, 0x1c, 0x27, 0x24, 0x35, 0x18, + 0x2d, 0x7b, 0x14, 0xf3, 0x74, 0x0f, 0x0d, 0xee, 0x22, 0x5e, 0xe7, 0x24, 0x71, 0x17, 0x71, 0xc1, + 0xc9, 0xf8, 0xe9, 0x2c, 0x90, 0xa8, 0x8d, 0x98, 0x94, 0xca, 0x7f, 0x66, 0x07, 0xfd, 0x03, 0x6d, + 0xd0, 0x5f, 0x4c, 0x0c, 0x3a, 0x6f, 0xde, 0x40, 0x63, 0xff, 0x3b, 0x19, 0x38, 0x9f, 0x4e, 0x48, + 0x5e, 0x86, 0x91, 0x07, 0x9b, 0x1b, 0x32, 0x4e, 0x8b, 0x68, 0x8a, 0xdb, 0x41, 0x5d, 0x81, 0x29, + 0x8a, 0xc8, 0x9b, 0x30, 0xf2, 0x45, 0xb3, 0xcc, 0xce, 0x21, 0x25, 0xed, 0xc1, 0x37, 0x3c, 0xab, + 0xae, 0x1f, 0x45, 0x02, 0x49, 0x1d, 0xdb, 0xdc, 0x53, 0x1b, 0xdb, 0x1f, 0xcf, 0xc2, 0x74, 0xa9, + 0x5e, 0xa7, 0xbe, 0xcf, 0xa4, 0x1d, 0xea, 0x07, 0xcf, 0xec, 0xc0, 0xa6, 0x47, 0x60, 0xd1, 0xda, + 0x36, 0xd0, 0xa8, 0xfe, 0x5e, 0x06, 0xce, 0x49, 0xaa, 0x47, 0x0e, 0x3d, 0xdc, 0xdc, 0xf7, 0xa8, + 0xbf, 0xef, 0x36, 0x1b, 0x03, 0xe7, 0x56, 0x61, 0x82, 0x1e, 0x06, 0x4c, 0x57, 0x5f, 0xf5, 0x77, + 0x11, 0xa2, 0x09, 0x7a, 0x3c, 0xa8, 0xfa, 0x0d, 0x18, 0x2d, 0x75, 0x3a, 0x9e, 0xfb, 0x88, 0x2f, + 0x7b, 0x11, 0x4f, 0xd2, 0xe6, 0x20, 0xcd, 0xc3, 0x9e, 0x83, 0xd8, 0x67, 0x54, 0x68, 0x9b, 0x07, + 0xf0, 0x9b, 0xe4, 0x9f, 0xd1, 0xa0, 0x6d, 0x55, 0x16, 0xc7, 0x72, 0xa3, 0x06, 0x64, 0xc3, 0x73, + 0x5b, 0x6e, 0x40, 0x1b, 0xbc, 0x3d, 0x18, 0x98, 0xe0, 0xd4, 0x40, 0x5a, 0x9b, 0x4e, 0xd0, 0xd4, + 0x02, 0x69, 0x05, 0x0c, 0x60, 0x72, 0xb8, 0xf1, 0x7f, 0x0f, 0xc3, 0x84, 0xda, 0x3b, 0xc4, 0xe0, + 0x09, 0x13, 0x5c, 0x4f, 0x8d, 0x8e, 0x61, 0x23, 0xc4, 0x14, 0x25, 0x51, 0x68, 0x99, 0xec, 0xa9, + 0xa1, 0x65, 0xb6, 0x61, 0x72, 0xc3, 0x73, 0x31, 0xf0, 0x25, 0xbe, 0x56, 0x8a, 0xad, 0x70, 0x56, + 0xb9, 0x77, 0xb2, 0x81, 0xc4, 0xf7, 0x50, 0x94, 0xec, 0x3b, 0x02, 0x1b, 0xd3, 0x08, 0x6a, 0x5a, + 0x17, 0x8d, 0x0f, 0x37, 0xb5, 0xb0, 0x7d, 0x11, 0xbd, 0x36, 0x34, 0xb5, 0x60, 0x10, 0xdd, 0xd4, + 0x82, 0x41, 0xd4, 0xb5, 0x36, 0xfc, 0xb4, 0xd6, 0x1a, 0xf9, 0xe9, 0x0c, 0x8c, 0x97, 0xda, 0x6d, + 0x11, 0xb2, 0xe6, 0x14, 0x6f, 0xfd, 0xaf, 0x08, 0x6b, 0x8b, 0x77, 0x3e, 0x96, 0xb5, 0x05, 0xca, + 0x2d, 0x3e, 0x4a, 0xaa, 0x51, 0x85, 0xea, 0x6d, 0x4d, 0xf9, 0x0e, 0xf2, 0x0e, 0x14, 0xc2, 0x49, + 0x5e, 0x6d, 0x37, 0xe8, 0x63, 0xca, 0x13, 0xce, 0x4d, 0x8a, 0xb8, 0xd5, 0xaa, 0x64, 0x1a, 0x47, + 0x24, 0x9b, 0x00, 0x76, 0x38, 0xbb, 0x62, 0x99, 0x33, 0x93, 0xd3, 0x4f, 0x48, 0xcf, 0xf8, 0x1b, + 0x1f, 0xb4, 0x54, 0xe9, 0x39, 0xe2, 0x43, 0x5a, 0x30, 0xcd, 0xd3, 0x56, 0xd6, 0x02, 0xdb, 0x0b, + 0x30, 0x3d, 0x03, 0x9c, 0x3a, 0x0e, 0xaf, 0x09, 0xfd, 0xd9, 0xf3, 0x22, 0x19, 0xa6, 0xcf, 0x68, + 0xad, 0x94, 0x5c, 0x0d, 0x71, 0xde, 0x3c, 0x4a, 0xb8, 0x79, 0x21, 0xf9, 0xbd, 0x7c, 0xd2, 0xff, + 0x78, 0x06, 0xce, 0xab, 0x93, 0xbe, 0xd6, 0xdd, 0x11, 0x01, 0x43, 0xc9, 0x75, 0x18, 0x13, 0x73, + 0x32, 0xbc, 0x44, 0x25, 0xb3, 0x4c, 0x44, 0x28, 0x64, 0x99, 0x4d, 0x43, 0xc6, 0x43, 0x48, 0xdd, + 0xb3, 0xb1, 0x7d, 0x8a, 0x15, 0x45, 0x29, 0x91, 0x3d, 0xfc, 0xad, 0xcf, 0x4f, 0x06, 0x31, 0xde, + 0x87, 0x19, 0x7d, 0x24, 0x6a, 0x34, 0x20, 0xd7, 0x60, 0x54, 0x0e, 0x5f, 0x26, 0x7d, 0xf8, 0x64, + 0xb9, 0xb1, 0x0d, 0x24, 0x41, 0xef, 0xa3, 0x59, 0x14, 0xbb, 0x9f, 0x72, 0xb3, 0x3d, 0xf9, 0x28, + 0x99, 0x40, 0x5c, 0x9a, 0x15, 0xdf, 0x37, 0xae, 0xb9, 0x25, 0x60, 0xf0, 0xd4, 0x3f, 0x9b, 0x82, + 0xd9, 0x94, 0x3d, 0xf7, 0x14, 0x99, 0xa8, 0xa8, 0x6f, 0x10, 0x63, 0x61, 0xb0, 0x0f, 0xb9, 0x2d, + 0xbc, 0x0f, 0xc3, 0xa7, 0x6e, 0x07, 0xdc, 0x29, 0x25, 0xb6, 0x0b, 0x70, 0xb2, 0x4f, 0x44, 0x2e, + 0x52, 0xe3, 0xf1, 0x0c, 0x3f, 0xb5, 0x78, 0x3c, 0x4b, 0x30, 0x29, 0x5a, 0x25, 0xb6, 0x2b, 0xc5, + 0x38, 0xda, 0xe3, 0x05, 0x56, 0x62, 0xdb, 0xd2, 0x49, 0x38, 0x0f, 0xdf, 0x6d, 0x3e, 0xa2, 0x82, + 0xc7, 0xa8, 0xca, 0x03, 0x0b, 0x52, 0x79, 0x28, 0x24, 0xe4, 0x3f, 0xc0, 0x94, 0x79, 0x08, 0x51, + 0xf7, 0xac, 0x7c, 0xbf, 0x3d, 0xab, 0xf1, 0x74, 0xf6, 0xac, 0x17, 0xe5, 0x37, 0xa6, 0xef, 0x5d, + 0x29, 0x9f, 0x45, 0x7e, 0x29, 0x03, 0x33, 0x3c, 0x28, 0x8c, 0xfa, 0xb1, 0x7d, 0x03, 0x7d, 0xd4, + 0x9f, 0xce, 0xc7, 0xbe, 0x20, 0x52, 0x45, 0xa5, 0x7f, 0x6b, 0xf2, 0xa3, 0xc8, 0xf7, 0x00, 0x84, + 0x2b, 0x8a, 0x07, 0x90, 0x1d, 0x5f, 0x7c, 0x21, 0x65, 0x17, 0x08, 0x91, 0xa2, 0xb4, 0x16, 0x41, + 0x48, 0xa7, 0x25, 0x4a, 0x0c, 0xa1, 0xe4, 0x6f, 0xc2, 0x1c, 0x5b, 0x2f, 0x21, 0x44, 0x84, 0xb0, + 0x9a, 0x1f, 0xc7, 0x5a, 0x3e, 0xd3, 0x5b, 0x26, 0xba, 0x9e, 0x46, 0xc6, 0xc3, 0x0d, 0x47, 0x39, + 0xab, 0x03, 0x35, 0xda, 0x45, 0x6a, 0x45, 0x18, 0x19, 0x0e, 0xbf, 0x9e, 0xa7, 0x9e, 0xe8, 0xb1, + 0xbf, 0x5d, 0x94, 0x6b, 0x81, 0xef, 0x6f, 0xbe, 0xee, 0xa3, 0x8c, 0x20, 0xf2, 0x45, 0x20, 0x61, + 0x34, 0x15, 0x0e, 0xa3, 0x32, 0x2d, 0x05, 0x57, 0x37, 0x47, 0x51, 0x59, 0x3c, 0x59, 0xac, 0x4e, + 0x92, 0x24, 0x31, 0xa1, 0x30, 0x27, 0x1a, 0xcd, 0xa0, 0x32, 0x9f, 0x9d, 0x3f, 0x3f, 0xa5, 0x05, + 0x08, 0x8b, 0x4a, 0xa2, 0xe4, 0xd6, 0x4a, 0x52, 0x3c, 0x4d, 0xe5, 0x94, 0xc6, 0x8e, 0xdc, 0x86, + 0x31, 0x74, 0x14, 0x5e, 0x91, 0xc6, 0x5e, 0xc2, 0xf0, 0x04, 0x5d, 0x8a, 0xad, 0x7d, 0xdd, 0x64, + 0x2b, 0x42, 0x65, 0xd7, 0x81, 0x8a, 0x77, 0x64, 0x76, 0xdb, 0xa8, 0x14, 0x16, 0xfa, 0x8e, 0x86, + 0x77, 0x64, 0x79, 0x5d, 0xdd, 0x93, 0x1c, 0x91, 0xc8, 0xd7, 0x61, 0x7c, 0xcd, 0x7e, 0x2c, 0x75, + 0xc2, 0x42, 0xf1, 0xdb, 0x6f, 0x07, 0x32, 0x64, 0x6b, 0x5a, 0xf6, 0x63, 0xab, 0xd1, 0x8d, 0x07, + 0x3b, 0xc6, 0x6d, 0x48, 0x65, 0x49, 0xbe, 0x0a, 0xa0, 0x68, 0xaa, 0xc9, 0xa9, 0x15, 0xbc, 0x24, + 0xc3, 0xde, 0xa5, 0x6a, 0xb0, 0x91, 0xbf, 0xc2, 0x30, 0x26, 0x39, 0xcc, 0x7d, 0x72, 0x92, 0xc3, + 0xb9, 0x4f, 0x4e, 0x72, 0x58, 0xd8, 0x81, 0x8b, 0x3d, 0x97, 0x4e, 0x4a, 0xa8, 0xe3, 0x1b, 0x7a, + 0xa8, 0xe3, 0x8b, 0xbd, 0x8e, 0x58, 0x5f, 0xcf, 0x64, 0x32, 0x5b, 0x98, 0xeb, 0x2d, 0x9d, 0x7c, + 0x3b, 0x1b, 0x3b, 0x72, 0xc5, 0xc5, 0x82, 0x67, 0xbe, 0xea, 0x25, 0x93, 0x64, 0x31, 0xd9, 0x31, + 0x3f, 0x94, 0x95, 0x68, 0xf0, 0xec, 0x50, 0x56, 0x0f, 0x75, 0x3c, 0x9e, 0x9f, 0xf4, 0xf4, 0x7d, + 0x17, 0xa6, 0x78, 0x7e, 0xd2, 0xfb, 0xf4, 0xe8, 0xd0, 0xf5, 0x1a, 0x3c, 0xa7, 0x8f, 0x90, 0xc1, + 0x13, 0xc9, 0xc5, 0x63, 0xb8, 0xa4, 0x22, 0x7d, 0x4f, 0x87, 0xb1, 0xf6, 0x8b, 0xa9, 0xbb, 0x18, + 0x43, 0xe8, 0xe7, 0x96, 0x4a, 0xde, 0x0a, 0x05, 0x35, 0xea, 0xa9, 0xf9, 0x4c, 0x3c, 0x09, 0x4c, + 0x91, 0xd7, 0xa8, 0x67, 0xfc, 0xb3, 0x1c, 0x10, 0x5e, 0x53, 0xd9, 0xee, 0xd8, 0xe8, 0x99, 0xed, + 0x60, 0xac, 0xa5, 0x82, 0xc0, 0xb1, 0x77, 0x9a, 0x54, 0x0d, 0x54, 0x26, 0x8c, 0x6b, 0xc3, 0x32, + 0x2b, 0x7e, 0xd1, 0x49, 0x10, 0xf6, 0xd8, 0xea, 0xb2, 0x4f, 0xb2, 0xd5, 0x7d, 0x1d, 0x9e, 0x2f, + 0x75, 0x30, 0xd1, 0xb1, 0xac, 0xe5, 0x8e, 0xeb, 0xc9, 0x4d, 0x4a, 0xf3, 0xf9, 0xb3, 0x43, 0xb4, + 0xc4, 0x97, 0xf6, 0x63, 0xa1, 0xc8, 0x29, 0x6c, 0x5e, 0x76, 0x02, 0x35, 0x86, 0x84, 0x94, 0x53, + 0x3a, 0x58, 0x92, 0x22, 0xa7, 0x70, 0x12, 0xc9, 0xc3, 0xf1, 0xa4, 0x9c, 0x82, 0x19, 0xbc, 0x22, + 0x1e, 0x8e, 0x47, 0x7b, 0xc8, 0x3a, 0x21, 0x09, 0x79, 0x17, 0xc6, 0x4b, 0xdd, 0xc0, 0x15, 0x8c, + 0x85, 0x55, 0x78, 0x64, 0xbf, 0x2d, 0x3e, 0x45, 0xbb, 0xfa, 0x44, 0xe8, 0xc6, 0x9f, 0xe6, 0xe0, + 0x62, 0x72, 0x78, 0x45, 0x69, 0xb8, 0x3e, 0x32, 0xa7, 0xac, 0x8f, 0xb4, 0xd9, 0x90, 0x8d, 0xf2, + 0x4b, 0x3c, 0x8d, 0xd9, 0xc0, 0xf3, 0x25, 0x7f, 0xcc, 0xd9, 0x50, 0x83, 0x71, 0xf5, 0xbc, 0x1b, + 0xfa, 0xb8, 0xe7, 0x9d, 0xca, 0x85, 0x5d, 0xea, 0x79, 0xe8, 0x8c, 0xe1, 0xe8, 0xe9, 0x28, 0x1e, + 0x35, 0x83, 0x63, 0x90, 0xff, 0x1f, 0x5c, 0xe6, 0x7b, 0x52, 0xbc, 0xb1, 0x4b, 0x47, 0x92, 0xa3, + 0x18, 0xb8, 0xc5, 0x93, 0xe3, 0xe2, 0x75, 0xae, 0x2a, 0xb1, 0x12, 0xdd, 0x66, 0xed, 0x1c, 0x59, + 0xf2, 0xcb, 0x94, 0x4a, 0x4e, 0xe5, 0x6d, 0x94, 0xe1, 0xa2, 0x28, 0x8d, 0x9c, 0xb6, 0x65, 0x21, + 0x1b, 0xe4, 0x83, 0x48, 0xdb, 0x85, 0x83, 0x1c, 0x53, 0x64, 0x61, 0x39, 0x66, 0x5a, 0x56, 0xb2, + 0xe0, 0xbe, 0x99, 0xe6, 0x73, 0xc3, 0xa3, 0x76, 0x73, 0xb0, 0xee, 0x6e, 0x23, 0x75, 0x6a, 0xd9, + 0x54, 0x9d, 0x9a, 0x54, 0xca, 0xe4, 0x52, 0x95, 0x32, 0x15, 0x98, 0xae, 0x75, 0x77, 0x64, 0xdd, + 0x71, 0x7f, 0x4d, 0xbf, 0xbb, 0x93, 0xd6, 0x2b, 0x71, 0x12, 0xe3, 0x87, 0xb3, 0x30, 0xb1, 0xd1, + 0xec, 0xee, 0x39, 0xed, 0x8a, 0x1d, 0xd8, 0xcf, 0xac, 0x9a, 0xef, 0x6d, 0x4d, 0xcd, 0x17, 0xba, + 0x96, 0x85, 0x0d, 0x1b, 0x48, 0xc7, 0xf7, 0x53, 0x19, 0x98, 0x8e, 0x48, 0xf8, 0x61, 0xbd, 0x02, + 0x43, 0xec, 0x87, 0xb8, 0xfc, 0x5e, 0x4e, 0x30, 0xe6, 0xa9, 0x17, 0xc3, 0xbf, 0x84, 0xe2, 0x4d, + 0xcf, 0x6b, 0x86, 0x1c, 0x16, 0x3e, 0x0b, 0x63, 0x11, 0xdb, 0xb3, 0xa4, 0x5c, 0xfc, 0xb5, 0x0c, + 0x14, 0xe2, 0x2d, 0x21, 0xf7, 0x61, 0x94, 0x71, 0x72, 0xa8, 0xbc, 0x97, 0xbf, 0xd2, 0xa3, 0xcd, + 0xd7, 0x05, 0x1a, 0xff, 0x3c, 0xec, 0x7c, 0xca, 0x21, 0xa6, 0xe4, 0xb0, 0x60, 0xc2, 0x84, 0x8a, + 0x95, 0xf2, 0x75, 0x6f, 0xe8, 0x12, 0xca, 0xf9, 0xf4, 0x7e, 0xd0, 0x12, 0x45, 0x6a, 0x5f, 0x2d, + 0x84, 0x8f, 0x2b, 0xda, 0xe4, 0x4a, 0x5d, 0x55, 0x38, 0x69, 0x16, 0xa3, 0x2c, 0x05, 0xea, 0x3c, + 0x4b, 0x99, 0xd0, 0x21, 0x1e, 0x79, 0x03, 0x46, 0x78, 0x7d, 0x6a, 0xc2, 0xb4, 0x0e, 0x42, 0x54, + 0x39, 0x99, 0xe3, 0x18, 0xff, 0x20, 0x07, 0xe7, 0xa3, 0xcf, 0xdb, 0xea, 0x34, 0xec, 0x80, 0x6e, + 0xd8, 0x9e, 0xdd, 0xf2, 0x4f, 0x59, 0x01, 0x57, 0x13, 0x9f, 0x86, 0x09, 0xb4, 0xe4, 0xa7, 0x29, + 0x1f, 0x64, 0xc4, 0x3e, 0x08, 0x75, 0xa0, 0xfc, 0x83, 0xe4, 0x67, 0x90, 0xfb, 0x90, 0xab, 0xd1, + 0x40, 0xec, 0xbd, 0x57, 0x12, 0xbd, 0xaa, 0x7e, 0xd7, 0xf5, 0x1a, 0x0d, 0xf8, 0x20, 0xf2, 0xb8, + 0x50, 0x5a, 0x70, 0x3e, 0xc6, 0x85, 0x6c, 0xc3, 0xc8, 0xf2, 0xe3, 0x0e, 0xad, 0x07, 0x22, 0x61, + 0xe8, 0xb5, 0xfe, 0xfc, 0x38, 0xae, 0x92, 0x2f, 0x94, 0x22, 0x40, 0xed, 0x2c, 0x8e, 0xb2, 0x70, + 0x1b, 0xf2, 0xb2, 0xf2, 0xb3, 0xcc, 0xdc, 0x85, 0xb7, 0x61, 0x5c, 0xa9, 0xe4, 0x4c, 0x93, 0xfe, + 0xe7, 0xd9, 0xbe, 0xea, 0x36, 0x65, 0x8e, 0xd1, 0xe5, 0x84, 0xac, 0xa8, 0xe4, 0xa0, 0xe2, 0xb2, + 0xa2, 0x75, 0x20, 0x8a, 0xfa, 0x08, 0x8d, 0x55, 0x98, 0xae, 0x1d, 0x38, 0x9d, 0x28, 0x50, 0xac, + 0x76, 0x22, 0x63, 0x9e, 0x1b, 0x71, 0x71, 0x8f, 0x9f, 0xc8, 0x71, 0x3a, 0xe3, 0x2f, 0x32, 0x30, + 0xc2, 0xfe, 0x7a, 0x78, 0xfb, 0x19, 0xdd, 0x32, 0x6f, 0x69, 0x5b, 0xe6, 0x8c, 0x12, 0xab, 0x1d, + 0x37, 0x8e, 0xdb, 0xa7, 0x6c, 0x96, 0xc7, 0x62, 0x80, 0x38, 0x32, 0xb9, 0x0b, 0xa3, 0xc2, 0xa4, + 0x48, 0xd8, 0x7e, 0xab, 0xc1, 0xdf, 0xa5, 0xb1, 0x51, 0x78, 0xc3, 0x77, 0x3b, 0x71, 0x95, 0x88, + 0xa4, 0x66, 0x72, 0xbd, 0x0c, 0xd9, 0xab, 0x65, 0xa6, 0x76, 0xd1, 0x59, 0x8f, 0x87, 0x2e, 0x57, + 0x72, 0xc9, 0xf7, 0xf0, 0xad, 0x2f, 0x89, 0xd7, 0x90, 0x5c, 0x3f, 0x26, 0xe7, 0x65, 0xe2, 0xde, + 0xd4, 0x87, 0x92, 0x16, 0x9c, 0xaf, 0xd5, 0x56, 0xd0, 0xfc, 0x70, 0xc3, 0xf5, 0x82, 0x3b, 0xae, + 0x77, 0x68, 0xa3, 0x6d, 0x31, 0x6a, 0xf8, 0x14, 0x1b, 0x84, 0x34, 0xa3, 0xb0, 0xd7, 0x52, 0x8d, + 0xc2, 0xfa, 0xd8, 0x29, 0x18, 0x6d, 0xb8, 0x50, 0xab, 0xad, 0xf0, 0xc0, 0xe1, 0x7f, 0x19, 0xf5, + 0xfd, 0x5a, 0x06, 0x66, 0x6a, 0xb5, 0x95, 0x58, 0x55, 0xab, 0x32, 0x62, 0x79, 0x46, 0x7b, 0x08, + 0x4d, 0xef, 0x08, 0x1c, 0x85, 0x0c, 0x97, 0xf0, 0xea, 0x5a, 0x70, 0x4a, 0xce, 0x84, 0x6c, 0x84, + 0x31, 0xd2, 0xb3, 0x9a, 0x3f, 0x40, 0x8f, 0x86, 0xa2, 0x86, 0x5b, 0x78, 0xd3, 0xb1, 0x52, 0x5d, + 0xc3, 0xcd, 0x20, 0xc6, 0x7f, 0x75, 0x9e, 0x47, 0x61, 0x97, 0xb3, 0xe5, 0x3d, 0x98, 0x10, 0xf4, + 0x68, 0x34, 0x2f, 0x6c, 0x42, 0x2e, 0xb2, 0x0d, 0x72, 0x97, 0xc3, 0x79, 0x74, 0xde, 0xef, 0x1c, + 0x17, 0x87, 0x58, 0xd7, 0x98, 0x1a, 0x3a, 0x79, 0x00, 0x93, 0x6b, 0xf6, 0x63, 0x45, 0x9d, 0xc1, + 0x5d, 0xa2, 0xae, 0xb1, 0x5d, 0xa5, 0x65, 0x3f, 0x1e, 0xc0, 0xe8, 0x4e, 0xa7, 0x27, 0x07, 0x30, + 0xa5, 0xb7, 0x49, 0xcc, 0xc0, 0xe4, 0x88, 0xdd, 0x4c, 0x1d, 0xb1, 0x8b, 0x1d, 0xd7, 0x0b, 0xac, + 0xdd, 0x90, 0x5c, 0xcb, 0x38, 0x10, 0x63, 0x4d, 0xde, 0x83, 0x19, 0x25, 0x04, 0xe8, 0x1d, 0xd7, + 0x6b, 0xd9, 0xf2, 0xc2, 0x85, 0x3a, 0x7e, 0xb4, 0x25, 0xda, 0x45, 0xb0, 0x99, 0xc4, 0x24, 0x5f, + 0x4e, 0x73, 0x33, 0x1b, 0x8e, 0x2c, 0x0f, 0x53, 0xdc, 0xcc, 0x7a, 0x59, 0x1e, 0x26, 0x1d, 0xce, + 0xf6, 0xfa, 0x59, 0x26, 0xe7, 0x79, 0xeb, 0x07, 0xb2, 0x3c, 0x0e, 0x47, 0xae, 0x87, 0x05, 0xf2, + 0x22, 0xe4, 0x96, 0x36, 0xee, 0xe0, 0xcb, 0x94, 0x34, 0xa2, 0x6a, 0xef, 0xdb, 0xed, 0x3a, 0x5e, + 0x84, 0x84, 0x37, 0x80, 0x7a, 0x50, 0x2e, 0x6d, 0xdc, 0x21, 0x36, 0xcc, 0x62, 0x76, 0xb7, 0xe0, + 0x4b, 0x37, 0x6f, 0x2a, 0x43, 0x95, 0xc7, 0x4f, 0xbb, 0x21, 0x3e, 0xad, 0x88, 0xb9, 0xe1, 0x02, + 0xeb, 0xf1, 0xcd, 0x9b, 0xa9, 0x03, 0x12, 0x7e, 0x58, 0x1a, 0x2f, 0x76, 0x60, 0xad, 0xd9, 0x8f, + 0x23, 0x27, 0x0e, 0x5f, 0x38, 0xec, 0xbe, 0x28, 0xa7, 0x56, 0xe4, 0x00, 0xa2, 0x1d, 0x58, 0x3a, + 0x11, 0xbb, 0xc7, 0x46, 0x13, 0xcc, 0x17, 0xae, 0x4e, 0x0b, 0x52, 0x5d, 0x27, 0xbd, 0xba, 0xd5, + 0xcb, 0x98, 0x82, 0x4e, 0xb6, 0xc2, 0xdb, 0x38, 0xbf, 0xcd, 0x8a, 0x6c, 0xc1, 0x37, 0xd4, 0xdb, + 0x38, 0x57, 0x92, 0x69, 0xcd, 0x9a, 0x0e, 0x55, 0x38, 0xdc, 0xab, 0xc5, 0xd4, 0xb9, 0x24, 0x2f, + 0xf9, 0x13, 0x67, 0xbf, 0xe4, 0x53, 0x18, 0x5a, 0x75, 0xeb, 0x07, 0x22, 0x38, 0xdf, 0x17, 0xd9, + 0x2e, 0xdc, 0x74, 0xeb, 0x07, 0x4f, 0xcf, 0xe2, 0x1a, 0xd9, 0x93, 0x75, 0xf6, 0xa9, 0x6c, 0x16, + 0x88, 0x3e, 0x11, 0x56, 0xbc, 0x73, 0xe1, 0x2d, 0x57, 0x29, 0xe3, 0xf2, 0x28, 0x9f, 0x34, 0xb2, + 0x6b, 0x4d, 0x9d, 0x9c, 0x50, 0x28, 0x54, 0xa8, 0x7f, 0x10, 0xb8, 0x9d, 0x72, 0xd3, 0xe9, 0xec, + 0xb8, 0xb6, 0x27, 0x43, 0x39, 0x0f, 0xbc, 0x27, 0x37, 0x38, 0xbd, 0x55, 0x97, 0x0c, 0xcc, 0x04, + 0x4b, 0xf2, 0x65, 0x98, 0x62, 0x93, 0x7b, 0xf9, 0x71, 0x40, 0xdb, 0x7c, 0xe4, 0x67, 0x50, 0xa2, + 0x9b, 0x53, 0x72, 0x97, 0x84, 0x85, 0x7c, 0x4e, 0xe1, 0x62, 0xa7, 0x21, 0x81, 0x16, 0xd8, 0x50, + 0x63, 0x45, 0x1a, 0x30, 0xbf, 0x66, 0x3f, 0x56, 0x72, 0x1c, 0x2b, 0x93, 0x94, 0xe0, 0x04, 0xbb, + 0x7a, 0x72, 0x5c, 0x7c, 0x85, 0x4d, 0xb0, 0x28, 0xba, 0x78, 0x8f, 0xf9, 0xda, 0x93, 0x13, 0xf9, + 0x16, 0x5c, 0x10, 0xcd, 0xaa, 0x60, 0xb6, 0x30, 0xd7, 0x3b, 0xaa, 0xed, 0xdb, 0xe8, 0xbf, 0x35, + 0xdb, 0xa3, 0xc3, 0x6e, 0xa4, 0x6f, 0x89, 0xb2, 0xc3, 0x1a, 0x92, 0x8f, 0xe5, 0x73, 0x46, 0x66, + 0xaf, 0x1a, 0xc8, 0x47, 0x30, 0xc5, 0x9f, 0xe3, 0x56, 0x5c, 0x3f, 0x40, 0x65, 0xcd, 0xdc, 0xd9, + 0xdc, 0x12, 0xf8, 0x1b, 0x1f, 0x77, 0xe4, 0x89, 0x29, 0x77, 0x62, 0x9c, 0xc9, 0x3b, 0x30, 0xbe, + 0xe1, 0xb4, 0x79, 0xe8, 0xd1, 0xea, 0x06, 0xaa, 0x95, 0xc5, 0x09, 0xd4, 0x71, 0xda, 0x96, 0xd4, + 0x98, 0x74, 0xc2, 0xed, 0x42, 0xc5, 0x26, 0xdb, 0x30, 0x5e, 0xab, 0xad, 0xdc, 0x71, 0x98, 0x5c, + 0xd2, 0x39, 0x9a, 0x3f, 0xdf, 0xe3, 0x2b, 0x5f, 0x4e, 0xfd, 0xca, 0x49, 0xdf, 0xdf, 0xb7, 0x76, + 0x9d, 0x26, 0xb5, 0xea, 0x6e, 0xe7, 0xc8, 0x54, 0x39, 0xa5, 0x98, 0xea, 0x5f, 0x78, 0xca, 0xa6, + 0xfa, 0x55, 0x98, 0x56, 0x8c, 0x67, 0xd1, 0x70, 0x76, 0x3e, 0x8a, 0x57, 0xa5, 0x9a, 0xe6, 0xc7, + 0x5d, 0x53, 0xe3, 0x74, 0xd2, 0x46, 0xff, 0xe2, 0x59, 0x6d, 0xf4, 0x1d, 0x98, 0xe1, 0x83, 0x21, + 0xe6, 0x01, 0x8e, 0xf4, 0x42, 0x8f, 0x3e, 0xbc, 0x96, 0xda, 0x87, 0xb3, 0x62, 0xa4, 0xe5, 0x24, + 0xc3, 0xe7, 0xe7, 0x24, 0x57, 0xb2, 0x0b, 0x44, 0x00, 0xed, 0xc0, 0xde, 0xb1, 0x7d, 0x8a, 0x75, + 0x3d, 0xdf, 0xa3, 0xae, 0x57, 0x52, 0xeb, 0x9a, 0x92, 0x75, 0xed, 0xf0, 0x6a, 0x52, 0x38, 0x92, + 0xb6, 0xac, 0x47, 0xce, 0x2f, 0xec, 0xd8, 0x17, 0x34, 0x1d, 0x77, 0x12, 0x81, 0x87, 0x7e, 0x8a, + 0x4f, 0xda, 0x78, 0xbf, 0xa7, 0x70, 0x26, 0x8f, 0xe1, 0x7c, 0xf2, 0x2b, 0xb0, 0xce, 0x17, 0xb1, + 0xce, 0x17, 0xb5, 0x3a, 0xe3, 0x48, 0x7c, 0xde, 0xe8, 0xcd, 0x8a, 0xd7, 0xda, 0x83, 0x3f, 0xf9, + 0xdb, 0x19, 0xb8, 0xb0, 0x76, 0xa7, 0x84, 0x39, 0x44, 0x1d, 0x1e, 0x89, 0x2e, 0x74, 0xe9, 0xbd, + 0x24, 0xde, 0x41, 0xe2, 0x6f, 0x33, 0x52, 0xe2, 0xc0, 0xad, 0x82, 0x89, 0xee, 0x2f, 0xb7, 0x76, + 0x6d, 0x9e, 0x9a, 0x54, 0xb0, 0x48, 0xf1, 0xfb, 0xfd, 0xd9, 0x3f, 0x2e, 0x66, 0xcc, 0x5e, 0x55, + 0x91, 0x26, 0x2c, 0xe8, 0xdd, 0x22, 0xbd, 0x28, 0xf6, 0x69, 0xb3, 0x39, 0x5f, 0xc4, 0x19, 0xfd, + 0xc6, 0xc9, 0x71, 0xf1, 0x6a, 0xa2, 0x77, 0x43, 0xcf, 0x0c, 0x86, 0xa9, 0x34, 0xb8, 0x0f, 0x3f, + 0xd2, 0x4a, 0x11, 0xba, 0xe7, 0x2f, 0x6b, 0xb1, 0x7f, 0x12, 0xe5, 0x4b, 0xaf, 0x0a, 0x89, 0xe4, + 0x45, 0xb6, 0xde, 0x7b, 0x0a, 0x88, 0x66, 0x92, 0xf3, 0xbd, 0xa1, 0xfc, 0x64, 0x61, 0x2a, 0xc5, + 0x65, 0xc1, 0xf8, 0xed, 0x6c, 0xec, 0x60, 0x24, 0x55, 0x18, 0x15, 0xf3, 0xbd, 0xe7, 0x25, 0xe3, + 0xc5, 0xd4, 0x59, 0x3d, 0x2a, 0x96, 0x8e, 0x29, 0xe9, 0xc9, 0x21, 0x63, 0x85, 0x8d, 0x16, 0x37, + 0xde, 0xaf, 0xf2, 0x73, 0x0f, 0x41, 0xda, 0x09, 0x5f, 0x39, 0xbb, 0x23, 0x9e, 0xee, 0xe7, 0x89, + 0x47, 0xbd, 0xac, 0x8d, 0x1c, 0xf0, 0x54, 0x52, 0xb9, 0xd0, 0x9b, 0x4b, 0xcf, 0x1b, 0xf5, 0xd4, + 0x2a, 0x64, 0xb5, 0x18, 0xbf, 0x95, 0x81, 0x49, 0xed, 0x64, 0x25, 0xb7, 0x15, 0x57, 0xc5, 0xc8, + 0x7b, 0x5f, 0xc3, 0xc1, 0xcd, 0x36, 0xee, 0xc4, 0x78, 0x5b, 0xf8, 0x1d, 0x64, 0x7b, 0xd3, 0xe1, + 0x62, 0x8b, 0x7b, 0xae, 0xf6, 0xd7, 0x0f, 0x87, 0xd9, 0x2f, 0x87, 0x7a, 0x64, 0xbf, 0xfc, 0x8d, + 0x4b, 0x30, 0xa5, 0xdf, 0x88, 0xc9, 0x1b, 0x30, 0x82, 0xba, 0x79, 0xa9, 0x5e, 0x41, 0xb5, 0x10, + 0xaa, 0xef, 0x35, 0x67, 0x14, 0x8e, 0x43, 0x5e, 0x05, 0x08, 0x0d, 0xc0, 0xe5, 0xcb, 0xd4, 0xf0, + 0xc9, 0x71, 0x31, 0xf3, 0xa6, 0xa9, 0x14, 0x90, 0xaf, 0x01, 0xac, 0xbb, 0x0d, 0x1a, 0xa6, 0x34, + 0xee, 0x63, 0x7d, 0xf1, 0x5a, 0x22, 0xcd, 0xca, 0xb9, 0xb6, 0xdb, 0xa0, 0xc9, 0x9c, 0x2a, 0x0a, + 0x47, 0xf2, 0x79, 0x18, 0x36, 0xbb, 0x4d, 0x2a, 0x5f, 0x30, 0xc6, 0xe5, 0x09, 0xd7, 0x6d, 0xd2, + 0x48, 0x4f, 0xe0, 0x75, 0xe3, 0x86, 0x85, 0x0c, 0x40, 0x3e, 0xe0, 0xe9, 0x57, 0x44, 0x8c, 0xd0, + 0xe1, 0xe8, 0xad, 0x4e, 0x91, 0x7c, 0x12, 0x51, 0x42, 0x15, 0x12, 0xf2, 0x00, 0x46, 0xd5, 0x47, + 0x26, 0xc5, 0xe7, 0x5d, 0x7d, 0x88, 0x54, 0x94, 0x0e, 0x22, 0x17, 0x72, 0xfc, 0xfd, 0x49, 0x72, + 0x21, 0xef, 0xc2, 0x18, 0x63, 0xcf, 0x76, 0x0e, 0x5f, 0xdc, 0x6a, 0xf0, 0x45, 0x4e, 0xf9, 0x20, + 0xb6, 0xfb, 0x68, 0x91, 0x3c, 0x43, 0x02, 0xf2, 0x65, 0xcc, 0x5e, 0x2b, 0xba, 0xba, 0xaf, 0x55, + 0xce, 0x95, 0x44, 0x57, 0x63, 0x3a, 0xdb, 0x44, 0x4f, 0x47, 0xfc, 0xc8, 0x5e, 0x18, 0x72, 0x6d, + 0x90, 0x94, 0x39, 0xaf, 0x27, 0x2a, 0x98, 0x97, 0x51, 0xc4, 0x92, 0xa9, 0xa9, 0x35, 0xbe, 0xa4, + 0x03, 0x85, 0x48, 0xa8, 0x14, 0x75, 0x41, 0xbf, 0xba, 0xde, 0x4c, 0xd4, 0xa5, 0x0e, 0x60, 0xa2, + 0xba, 0x04, 0x77, 0xd2, 0x80, 0x29, 0x79, 0x40, 0x89, 0xfa, 0xc6, 0xfb, 0xd5, 0xf7, 0x6a, 0xa2, + 0xbe, 0xd9, 0xc6, 0x4e, 0xb2, 0x9e, 0x18, 0x4f, 0xf2, 0x2e, 0x4c, 0x4a, 0x08, 0x4f, 0x14, 0x3d, + 0x11, 0x65, 0xda, 0x6d, 0xec, 0x24, 0xd2, 0x43, 0xeb, 0xc8, 0x2a, 0x35, 0x9f, 0x1d, 0x93, 0x1a, + 0x75, 0x7c, 0x56, 0xe8, 0xc8, 0xe4, 0x43, 0x18, 0xaf, 0xb6, 0x58, 0x43, 0xdc, 0xb6, 0x1d, 0x50, + 0xe1, 0x0f, 0x29, 0x2d, 0x8c, 0x94, 0x12, 0x65, 0xaa, 0xf2, 0x14, 0xd8, 0x51, 0x91, 0x96, 0x02, + 0x3b, 0x02, 0xb3, 0xce, 0xe3, 0xaf, 0x8a, 0x62, 0x0e, 0x4b, 0x5f, 0xc9, 0x17, 0x53, 0xac, 0x7c, + 0x14, 0xf6, 0x22, 0x1e, 0x24, 0x83, 0xca, 0x57, 0xbd, 0x58, 0x2c, 0x5e, 0x95, 0x27, 0x79, 0x0f, + 0xc6, 0x45, 0x36, 0xb1, 0x92, 0xb9, 0xee, 0xcf, 0x17, 0xb0, 0xf1, 0x18, 0xe1, 0x41, 0x26, 0x1e, + 0xb3, 0x6c, 0x2f, 0x66, 0xce, 0x1a, 0xe1, 0x93, 0x2f, 0xc1, 0xdc, 0xb6, 0xd3, 0x6e, 0xb8, 0x87, + 0xbe, 0x38, 0xa6, 0xc4, 0x46, 0x37, 0x13, 0x39, 0x93, 0x1d, 0xf2, 0xf2, 0x50, 0x16, 0x4c, 0x6c, + 0x7c, 0xa9, 0x1c, 0xc8, 0xf7, 0x26, 0x38, 0xf3, 0x19, 0x44, 0xfa, 0xcd, 0xa0, 0xc5, 0xc4, 0x0c, + 0x4a, 0x56, 0x1f, 0x9f, 0x4e, 0xa9, 0xd5, 0x10, 0x17, 0x88, 0x7e, 0xbe, 0xdf, 0x73, 0x9d, 0xf6, + 0xfc, 0x2c, 0xee, 0x85, 0xcf, 0xc7, 0x63, 0x2a, 0x20, 0x9e, 0x48, 0x25, 0x6e, 0x9c, 0x1c, 0x17, + 0x2f, 0xc5, 0x65, 0xfe, 0x8f, 0x5c, 0xed, 0xb9, 0x24, 0x85, 0x35, 0xf9, 0x10, 0x26, 0xd8, 0xff, + 0xa1, 0x52, 0x62, 0x4e, 0xb3, 0x0b, 0x55, 0x30, 0x45, 0x3d, 0x38, 0x46, 0x98, 0xee, 0x2c, 0x45, + 0x5f, 0xa1, 0xb1, 0x22, 0x6f, 0x03, 0x30, 0xb1, 0x49, 0x6c, 0xc7, 0xe7, 0xa2, 0xd0, 0xc7, 0x28, + 0x75, 0x25, 0x37, 0xe2, 0x08, 0x99, 0xbc, 0x0b, 0xe3, 0xec, 0x57, 0xad, 0xdb, 0x70, 0xd9, 0xda, + 0x38, 0x8f, 0xb4, 0xdc, 0x35, 0x95, 0xd1, 0xfa, 0x1c, 0xae, 0xb9, 0xa6, 0x46, 0xe8, 0x64, 0x05, + 0xa6, 0x31, 0x44, 0xb5, 0x08, 0x8e, 0xea, 0x50, 0x7f, 0xfe, 0x82, 0x62, 0x0d, 0xc1, 0x8a, 0x2c, + 0x27, 0x2c, 0x53, 0xef, 0x32, 0x31, 0x32, 0xe2, 0xc3, 0x6c, 0xf2, 0x39, 0xd9, 0x9f, 0x9f, 0xc7, + 0x4e, 0x92, 0x12, 0x7c, 0x12, 0x83, 0xef, 0xc7, 0x6c, 0x44, 0x94, 0x8d, 0x4b, 0x3e, 0x2a, 0xa9, + 0x15, 0xa6, 0x71, 0x27, 0x26, 0x90, 0xbb, 0xe5, 0x8d, 0x78, 0x0c, 0xe7, 0x8b, 0xd8, 0x02, 0x1c, + 0xe6, 0xbd, 0x7a, 0x94, 0x3b, 0x3c, 0x25, 0x8e, 0x73, 0x0a, 0x35, 0xf9, 0x26, 0x9c, 0x93, 0x3b, + 0x88, 0x28, 0x12, 0xf3, 0x7a, 0xe1, 0x8c, 0x3b, 0x71, 0x63, 0x27, 0xac, 0x3a, 0x31, 0xa5, 0xd3, + 0xab, 0x20, 0x36, 0x8c, 0xe3, 0xb0, 0x8a, 0x1a, 0x9f, 0xef, 0x57, 0xe3, 0xd5, 0x44, 0x8d, 0xe7, + 0x71, 0xa2, 0x24, 0x2b, 0x53, 0x79, 0x92, 0x25, 0x98, 0x14, 0xeb, 0x48, 0xcc, 0xb6, 0x17, 0xb0, + 0xb7, 0x50, 0x89, 0x25, 0x57, 0x60, 0x62, 0xc2, 0xe9, 0x24, 0xea, 0x8e, 0xcc, 0x1f, 0x93, 0x5e, + 0xd4, 0x76, 0xe4, 0xf8, 0x1b, 0x92, 0x8e, 0xcc, 0x76, 0xa4, 0x48, 0x8a, 0x59, 0x7e, 0xdc, 0xf1, + 0x84, 0x8a, 0xea, 0x52, 0x94, 0x15, 0x49, 0x11, 0x7e, 0x2c, 0x1a, 0x62, 0xa8, 0x5b, 0x42, 0x1a, + 0x07, 0xb2, 0x05, 0xb3, 0xe1, 0xa9, 0xad, 0x30, 0x2e, 0x46, 0x51, 0x82, 0xa3, 0xa3, 0x3e, 0x9d, + 0x6f, 0x1a, 0x3d, 0xb1, 0xe1, 0x82, 0x76, 0x4e, 0x2b, 0xac, 0x2f, 0x23, 0x6b, 0xcc, 0x55, 0xaf, + 0x1f, 0xf2, 0xe9, 0xec, 0x7b, 0xf1, 0x21, 0x1f, 0xc1, 0x42, 0xfc, 0x6c, 0x56, 0x6a, 0x79, 0x09, + 0x6b, 0x79, 0xfd, 0xe4, 0xb8, 0x78, 0x25, 0x71, 0xbc, 0xa7, 0x57, 0xd4, 0x87, 0x1b, 0xf9, 0x1a, + 0xcc, 0xeb, 0xe7, 0xb3, 0x52, 0x93, 0x81, 0x35, 0xe1, 0xd2, 0x09, 0x0f, 0xf6, 0xf4, 0x1a, 0x7a, + 0xf2, 0x20, 0x01, 0x14, 0x53, 0x67, 0xb7, 0x52, 0xcd, 0xcb, 0x51, 0x83, 0x12, 0xab, 0x24, 0xbd, + 0xba, 0xd3, 0x58, 0x92, 0x43, 0xb8, 0x94, 0x76, 0x4c, 0x28, 0x95, 0xbe, 0x12, 0x2a, 0x81, 0x3f, + 0x95, 0x7e, 0xe4, 0xa4, 0xd7, 0x7c, 0x0a, 0x5b, 0xf2, 0x65, 0x38, 0xa7, 0xac, 0x2f, 0xa5, 0xbe, + 0x57, 0xb1, 0x3e, 0x74, 0x05, 0x57, 0x17, 0x66, 0x7a, 0x2d, 0xe9, 0x3c, 0x48, 0x0b, 0x66, 0x65, + 0xc3, 0x51, 0xdb, 0x2e, 0x8e, 0x9e, 0x2b, 0xda, 0xae, 0x9a, 0xc4, 0x58, 0xba, 0x2c, 0x76, 0xd5, + 0xf9, 0xc6, 0x8e, 0xd5, 0x89, 0x08, 0xd5, 0x99, 0x9e, 0xc2, 0x97, 0xac, 0xc0, 0x48, 0x6d, 0xa3, + 0x7a, 0xe7, 0xce, 0xf2, 0xfc, 0x6b, 0x58, 0x83, 0xf4, 0x1b, 0xe3, 0x40, 0xed, 0xd2, 0x24, 0xcc, + 0x15, 0x3b, 0xce, 0xee, 0xae, 0xf6, 0x60, 0xc5, 0x51, 0xc9, 0xf7, 0xa2, 0xa1, 0x20, 0xdb, 0x51, + 0x4b, 0xbe, 0xef, 0xec, 0x61, 0xd4, 0x69, 0x7f, 0xfe, 0x75, 0xed, 0xbd, 0x5f, 0x46, 0xe4, 0x2e, + 0x63, 0xc2, 0xb2, 0x04, 0x3a, 0x97, 0x36, 0xd9, 0xfd, 0x5f, 0xec, 0xdc, 0x96, 0x1d, 0xb1, 0x52, + 0x37, 0xf1, 0x64, 0x45, 0xe4, 0x07, 0x32, 0x70, 0x7e, 0xdb, 0xf5, 0x0e, 0x9a, 0xae, 0xdd, 0x90, + 0xd5, 0x88, 0x4d, 0xf5, 0x8d, 0x7e, 0x9b, 0xea, 0x67, 0x12, 0x9b, 0xaa, 0x71, 0x28, 0xd8, 0x58, + 0x61, 0x84, 0xf1, 0xc4, 0x06, 0xdb, 0xa3, 0x2a, 0xf2, 0xbd, 0x70, 0x39, 0xbd, 0x44, 0x99, 0x25, + 0x6f, 0xe2, 0x2c, 0xb9, 0x79, 0x72, 0x5c, 0x7c, 0xb3, 0x57, 0x4d, 0xe9, 0x33, 0xe6, 0x54, 0xd6, + 0xf7, 0x86, 0xf2, 0x57, 0x0b, 0xd7, 0xee, 0x0d, 0xe5, 0xaf, 0x15, 0x5e, 0x37, 0x5f, 0xa8, 0x95, + 0xd6, 0x56, 0xab, 0x0d, 0x79, 0xda, 0xc9, 0x20, 0xe8, 0x9c, 0xc6, 0xbc, 0xd2, 0xaf, 0x34, 0xe2, + 0x68, 0xfc, 0xbd, 0x0c, 0x14, 0x4f, 0x19, 0x35, 0x76, 0xc0, 0x44, 0x53, 0xaa, 0x46, 0x03, 0x35, + 0x94, 0x7a, 0x34, 0x15, 0x2d, 0xdd, 0x8e, 0x43, 0x27, 0x41, 0x2f, 0x40, 0x91, 0xbf, 0x43, 0x71, + 0x06, 0x4d, 0xe6, 0xed, 0x90, 0x58, 0xc6, 0xcf, 0x67, 0x60, 0x36, 0x65, 0x92, 0x92, 0x2b, 0x30, + 0x84, 0x09, 0xb9, 0x14, 0xc3, 0x9b, 0x58, 0x22, 0x2e, 0x2c, 0x27, 0x9f, 0x86, 0xd1, 0xca, 0x7a, + 0xad, 0x56, 0x5a, 0x97, 0xf7, 0x79, 0x7e, 0x96, 0xb5, 0x7d, 0xcb, 0xb7, 0xf5, 0xf7, 0x7a, 0x81, + 0x46, 0xde, 0x84, 0x91, 0xea, 0x06, 0x12, 0x70, 0xf3, 0x51, 0xfc, 0x42, 0xa7, 0x13, 0xc7, 0x17, + 0x48, 0xc6, 0x8f, 0x66, 0x80, 0x24, 0x57, 0x1c, 0xb9, 0x09, 0xe3, 0xea, 0xba, 0xe6, 0xda, 0x07, + 0x7c, 0xc4, 0x54, 0x56, 0xad, 0xa9, 0xe2, 0x90, 0x0a, 0x0c, 0x63, 0x2a, 0xd5, 0xd0, 0x50, 0x20, + 0x75, 0x22, 0x5f, 0x48, 0x4c, 0xe4, 0x61, 0x4c, 0xd4, 0x6a, 0x72, 0x62, 0xe3, 0xf7, 0x32, 0x40, + 0xd2, 0xcd, 0xff, 0x06, 0x32, 0x54, 0x7a, 0x4b, 0x71, 0xff, 0x57, 0x53, 0xee, 0x84, 0xf9, 0xd2, + 0xd4, 0x9b, 0x74, 0x14, 0x28, 0xe0, 0x8a, 0xa6, 0xb9, 0xe9, 0xed, 0x33, 0x7a, 0x0d, 0x86, 0x1f, + 0x52, 0x6f, 0x47, 0x5a, 0x46, 0xa3, 0x35, 0xe5, 0x23, 0x06, 0x50, 0x35, 0x19, 0x88, 0x61, 0xfc, + 0x69, 0x06, 0xe6, 0xd2, 0xc4, 0xfc, 0x53, 0x5c, 0x3b, 0x8d, 0x98, 0x57, 0x2a, 0x1a, 0x29, 0x71, + 0x53, 0xcb, 0xd0, 0x17, 0xb5, 0x08, 0xc3, 0xac, 0xb1, 0x72, 0x84, 0x51, 0x93, 0xc4, 0x7a, 0xc3, + 0x37, 0x39, 0x9c, 0x21, 0xf0, 0x30, 0x77, 0x43, 0x18, 0x21, 0x11, 0x11, 0x70, 0x3e, 0x9a, 0x1c, + 0xce, 0x10, 0xd6, 0xdc, 0x06, 0x95, 0x1a, 0x16, 0x44, 0x68, 0x31, 0x80, 0xc9, 0xe1, 0xe4, 0x0a, + 0x8c, 0x3e, 0x68, 0xaf, 0x52, 0xfb, 0x91, 0x4c, 0xfb, 0x80, 0x46, 0x55, 0x6e, 0xdb, 0x6a, 0x32, + 0x98, 0x29, 0x0b, 0x8d, 0x9f, 0xca, 0xc0, 0x4c, 0xe2, 0x86, 0x71, 0xba, 0xf7, 0x6a, 0x7f, 0x37, + 0xb2, 0x41, 0xda, 0xc7, 0x3f, 0x7f, 0x28, 0xfd, 0xf3, 0x8d, 0xff, 0x66, 0x04, 0x2e, 0xf4, 0x50, + 0xf8, 0x44, 0x6e, 0xae, 0x99, 0x53, 0xdd, 0x5c, 0xbf, 0x02, 0x93, 0xe5, 0xa6, 0xed, 0xb4, 0xfc, + 0x4d, 0x37, 0xfa, 0xe2, 0xc8, 0x5b, 0x06, 0xcb, 0x84, 0x2b, 0x41, 0xe8, 0x56, 0x71, 0xb1, 0x8e, + 0x14, 0x56, 0xe0, 0x26, 0xe5, 0x4d, 0x8d, 0x59, 0xc2, 0xd1, 0x34, 0xf7, 0x57, 0xc4, 0xd1, 0x54, + 0x77, 0x7d, 0x1a, 0x7a, 0xaa, 0xae, 0x4f, 0xe9, 0x66, 0xd3, 0xc3, 0x4f, 0x62, 0x44, 0x5f, 0x86, + 0x49, 0x6e, 0x55, 0x56, 0xf2, 0xf9, 0x20, 0x8d, 0x24, 0x2c, 0xd1, 0x6c, 0x3f, 0x39, 0x16, 0x1a, + 0x0d, 0x59, 0xd1, 0xdd, 0x74, 0x46, 0xf1, 0xd9, 0xf5, 0x4a, 0x6f, 0x37, 0x1c, 0xcd, 0xdc, 0x42, + 0x73, 0xc7, 0xf9, 0x16, 0xcc, 0xa5, 0xdd, 0x18, 0xe7, 0xf3, 0x9a, 0xc1, 0x6a, 0x4f, 0x43, 0xe7, + 0xc1, 0xef, 0x9d, 0x07, 0xa9, 0xf7, 0x4e, 0xe9, 0x3e, 0x3d, 0xa6, 0x45, 0x45, 0xee, 0xb1, 0x16, + 0x38, 0x6e, 0x7f, 0x27, 0x6b, 0xe3, 0x2b, 0xf0, 0x62, 0x5f, 0x72, 0xf2, 0x8e, 0x16, 0xa6, 0xe7, + 0xb5, 0x64, 0x98, 0x9e, 0xef, 0x1c, 0x17, 0x67, 0x34, 0xd7, 0xc7, 0xb5, 0x50, 0x67, 0x6e, 0xfc, + 0x54, 0x56, 0x77, 0xda, 0xfd, 0xab, 0xb8, 0x50, 0xaf, 0xc1, 0xf0, 0xf6, 0x3e, 0xf5, 0xe4, 0xf1, + 0x80, 0x1f, 0x72, 0xc8, 0x00, 0xea, 0x87, 0x20, 0x06, 0xb9, 0x03, 0x53, 0x1b, 0x7c, 0xe2, 0xca, + 0xd9, 0x38, 0x14, 0xa9, 0x2d, 0x3a, 0x42, 0xb9, 0x96, 0x32, 0x1d, 0x63, 0x54, 0xc6, 0xdd, 0x58, + 0xa7, 0x8b, 0x20, 0x43, 0xdc, 0xb9, 0x88, 0x0b, 0x10, 0x53, 0x91, 0x3b, 0x55, 0xb4, 0xd9, 0x9a, + 0x31, 0xa8, 0xb1, 0x0b, 0x97, 0xfa, 0x32, 0x62, 0xe7, 0x36, 0x74, 0xc2, 0x5f, 0x31, 0xe3, 0xe5, + 0xbe, 0xa4, 0xa6, 0x42, 0x67, 0x7c, 0x0b, 0x26, 0xd4, 0x5e, 0xc6, 0x23, 0x88, 0xfd, 0x16, 0xb3, + 0x82, 0x1f, 0x41, 0x0c, 0x60, 0x72, 0x78, 0xf4, 0x1c, 0x92, 0x4d, 0x7f, 0x0e, 0x89, 0x86, 0x3f, + 0x77, 0xda, 0xf0, 0xb3, 0xca, 0x71, 0x87, 0x53, 0x2a, 0xc7, 0xdf, 0x6a, 0xe5, 0x18, 0x45, 0xc8, + 0xe4, 0xf0, 0xa7, 0x5a, 0xf9, 0xef, 0xca, 0x3c, 0x61, 0xe8, 0xbb, 0x24, 0x97, 0x7b, 0x26, 0x4a, + 0xf6, 0x95, 0xb6, 0x7a, 0x23, 0xcc, 0x48, 0xa6, 0xc8, 0x9e, 0x26, 0x53, 0x9c, 0x65, 0x22, 0xa2, + 0xa4, 0xca, 0x87, 0x74, 0x28, 0x92, 0x03, 0xed, 0x84, 0xc1, 0x88, 0xc4, 0x32, 0x7e, 0x36, 0x03, + 0xe7, 0x52, 0xd5, 0xce, 0xac, 0x56, 0xae, 0xdf, 0x56, 0xd6, 0x61, 0x5c, 0xb9, 0xcd, 0x31, 0xce, + 0x12, 0x42, 0x62, 0xf0, 0xb6, 0x18, 0x2f, 0xc1, 0x58, 0xf8, 0xe8, 0x49, 0xe6, 0xe4, 0xd0, 0xa1, + 0x69, 0xa1, 0x7c, 0x3b, 0xab, 0x01, 0xb0, 0x2f, 0x78, 0xaa, 0xd6, 0xc9, 0xc6, 0xef, 0x66, 0x79, + 0x0e, 0xd9, 0x67, 0x36, 0x1a, 0x6c, 0xba, 0x49, 0x31, 0x6b, 0x52, 0xef, 0x18, 0xb0, 0x64, 0x19, + 0x46, 0x6a, 0x81, 0x1d, 0x74, 0x65, 0xe4, 0x8b, 0x59, 0x95, 0x0c, 0x0b, 0x1e, 0x2e, 0x46, 0xb1, + 0x0f, 0x7c, 0x84, 0x68, 0x17, 0x6d, 0x84, 0x28, 0x96, 0xc9, 0x7f, 0x98, 0x81, 0x09, 0x95, 0x98, + 0x7c, 0x08, 0x53, 0x32, 0xc6, 0x25, 0x8f, 0x07, 0x22, 0x5e, 0x68, 0xa5, 0x35, 0x95, 0x8c, 0x71, + 0xa9, 0xc6, 0x0f, 0xd1, 0xf0, 0xd5, 0xad, 0xba, 0xa3, 0x22, 0x93, 0x06, 0x90, 0xd6, 0xae, 0x6d, + 0x1d, 0x52, 0xfb, 0x80, 0xfa, 0x81, 0xc5, 0xad, 0x5e, 0xc4, 0x43, 0xae, 0x64, 0xbf, 0x76, 0xa7, + 0xc4, 0x0d, 0x5e, 0xd8, 0x48, 0x88, 0x60, 0xa5, 0x09, 0x1a, 0xf5, 0x75, 0xaa, 0xb5, 0x6b, 0x6f, + 0xf3, 0x42, 0x4e, 0x67, 0xfc, 0xd9, 0x08, 0x9f, 0x6e, 0x22, 0x24, 0xee, 0x0e, 0x4c, 0x3d, 0xa8, + 0x56, 0xca, 0x8a, 0xae, 0x5a, 0xcf, 0xa8, 0xb4, 0xfc, 0x38, 0xa0, 0x5e, 0xdb, 0x6e, 0xca, 0x1b, + 0x6a, 0x74, 0x04, 0xb9, 0x4e, 0xa3, 0x9e, 0xae, 0xc7, 0x8e, 0x71, 0x64, 0x75, 0xf0, 0xbb, 0x70, + 0x58, 0x47, 0x76, 0xc0, 0x3a, 0x7c, 0xbb, 0xd5, 0xec, 0x51, 0x87, 0xce, 0x91, 0xec, 0x43, 0xe1, + 0x2e, 0x4a, 0x97, 0x4a, 0x2d, 0xb9, 0xfe, 0xb5, 0xbc, 0x2c, 0x6a, 0x79, 0x9e, 0x8b, 0xa5, 0xe9, + 0xf5, 0x24, 0xb8, 0x46, 0xfb, 0xc4, 0xd0, 0xa9, 0xfb, 0xc4, 0xdf, 0xc9, 0xc0, 0x08, 0x17, 0x5f, + 0xc5, 0x34, 0xee, 0x21, 0x20, 0x6f, 0x3f, 0x1d, 0x01, 0xb9, 0x80, 0xe7, 0x84, 0x36, 0xa1, 0x79, + 0x19, 0xa9, 0xc4, 0xd6, 0x85, 0x34, 0xa8, 0xc7, 0x57, 0x27, 0x5e, 0x72, 0xfa, 0xb2, 0x20, 0xd5, + 0x28, 0x1a, 0xc5, 0xe8, 0xa9, 0x0e, 0xcf, 0x32, 0x82, 0xc7, 0xa8, 0x88, 0x46, 0xa1, 0xc7, 0xa0, + 0x58, 0x85, 0x31, 0x11, 0xe3, 0x62, 0xe9, 0x48, 0xbc, 0x2d, 0x17, 0x34, 0xeb, 0xa0, 0xc6, 0xd2, + 0x51, 0x24, 0x9a, 0x8b, 0x28, 0x19, 0xd6, 0xce, 0x91, 0x96, 0x92, 0x57, 0x22, 0x92, 0x07, 0x3c, + 0x55, 0x25, 0x0f, 0x1a, 0xac, 0x67, 0x09, 0x08, 0xe1, 0x22, 0x7a, 0x96, 0x74, 0x94, 0x4f, 0x89, + 0x11, 0x1c, 0xf1, 0x20, 0xab, 0x50, 0x40, 0x8b, 0x32, 0xda, 0xe0, 0xab, 0xa6, 0x5a, 0xe1, 0x71, + 0x14, 0x84, 0x55, 0x70, 0xc0, 0xcb, 0xc4, 0x72, 0x8b, 0xb9, 0x30, 0x26, 0x28, 0xd9, 0x75, 0xba, + 0x10, 0x9f, 0x7d, 0xe4, 0x5d, 0x18, 0x0f, 0x83, 0x36, 0x87, 0x4e, 0xd4, 0xf8, 0xc6, 0x14, 0x45, + 0x79, 0xd6, 0x13, 0x1c, 0x2a, 0xe8, 0x64, 0x11, 0xf2, 0x6c, 0x11, 0xc7, 0x93, 0x01, 0x77, 0x05, + 0x4c, 0x75, 0x6a, 0x92, 0x78, 0xa4, 0x06, 0xb3, 0x6c, 0xd1, 0xd4, 0x9c, 0xf6, 0x5e, 0x93, 0xae, + 0xba, 0x7b, 0x6e, 0x37, 0x88, 0xf2, 0xfd, 0xf1, 0x0b, 0x8c, 0xdd, 0x6a, 0x6a, 0xc5, 0x7a, 0xb6, + 0xbf, 0x14, 0x6a, 0x65, 0xab, 0xfc, 0xe3, 0x2c, 0x8c, 0x2b, 0xf3, 0x89, 0x5c, 0x83, 0x7c, 0xd5, + 0x5f, 0x75, 0xeb, 0x07, 0x61, 0x78, 0xc5, 0xc9, 0x93, 0xe3, 0xe2, 0x98, 0xe3, 0x5b, 0x4d, 0x04, + 0x9a, 0x61, 0x31, 0x59, 0x82, 0x49, 0xfe, 0x97, 0x4c, 0xa6, 0x91, 0x8d, 0xd4, 0x5b, 0x1c, 0x59, + 0xa6, 0xd1, 0x50, 0x77, 0x4f, 0x8d, 0x84, 0x7c, 0x15, 0x80, 0x03, 0xd0, 0x21, 0x3f, 0x37, 0x78, + 0x28, 0x01, 0x51, 0x41, 0x8a, 0x2b, 0xbe, 0xc2, 0x90, 0x7c, 0x9d, 0x07, 0x79, 0x96, 0xf3, 0x7f, + 0x68, 0xf0, 0x58, 0x08, 0x8c, 0xbf, 0x95, 0x1e, 0x92, 0x45, 0x65, 0x29, 0xf2, 0xdf, 0x2c, 0x98, + 0xb4, 0xee, 0x3e, 0xa2, 0xde, 0x51, 0x29, 0x40, 0x44, 0x05, 0xc3, 0xf8, 0x5f, 0x32, 0xca, 0xaa, + 0x21, 0xeb, 0x98, 0xbf, 0x9a, 0xcf, 0x08, 0x61, 0x66, 0x15, 0xde, 0x19, 0x24, 0xdc, 0xa4, 0xbb, + 0x4b, 0xcf, 0x0b, 0x8b, 0xaf, 0xd9, 0x70, 0x5e, 0xc5, 0xf2, 0x5a, 0x73, 0x20, 0xf9, 0x02, 0x0c, + 0x61, 0xd7, 0x65, 0x4f, 0x6d, 0x9a, 0x3c, 0xb6, 0x87, 0x58, 0x9f, 0x61, 0x43, 0x90, 0x92, 0x7c, + 0x5a, 0x38, 0x33, 0xf3, 0xce, 0x9f, 0x52, 0xce, 0x5e, 0xf6, 0x1d, 0xe1, 0x79, 0x1d, 0x45, 0xe5, + 0x51, 0x66, 0xcf, 0xdf, 0xcb, 0x42, 0x21, 0xbe, 0x56, 0xc9, 0x07, 0x30, 0x21, 0xcf, 0xd3, 0x15, + 0x5b, 0x64, 0x82, 0x98, 0x10, 0x99, 0x18, 0xe4, 0xa1, 0xba, 0x6f, 0xab, 0x66, 0x59, 0xa6, 0x46, + 0xc0, 0x84, 0x9b, 0x4d, 0x11, 0x25, 0x4f, 0x59, 0x25, 0x81, 0x1b, 0x74, 0x62, 0xb1, 0x85, 0x25, + 0x1a, 0x79, 0x0b, 0x72, 0x6b, 0x77, 0x4a, 0xc2, 0xe9, 0xad, 0x10, 0x3f, 0x75, 0xb9, 0xf5, 0xa8, + 0x6e, 0xcb, 0xca, 0xf0, 0xc9, 0xaa, 0x12, 0x86, 0x7b, 0x44, 0x33, 0xc1, 0x93, 0xe0, 0xb0, 0x71, + 0xa7, 0xc7, 0xe3, 0xbe, 0x37, 0x94, 0xcf, 0x15, 0x86, 0x44, 0x60, 0xd9, 0xff, 0x2e, 0x07, 0x63, + 0x61, 0xfd, 0x84, 0xa8, 0xae, 0xc4, 0xdc, 0x6d, 0x98, 0x5c, 0x84, 0xbc, 0x14, 0xd7, 0x84, 0xef, + 0xdb, 0xa8, 0x2f, 0x44, 0xb5, 0x79, 0x90, 0x72, 0x19, 0x5f, 0xe6, 0xa6, 0xfc, 0x49, 0x6e, 0x42, + 0x28, 0x74, 0xf5, 0x92, 0xce, 0x86, 0xd8, 0x80, 0x99, 0x21, 0x1a, 0x99, 0x82, 0xac, 0xc3, 0x83, + 0x95, 0x8d, 0x99, 0x59, 0xa7, 0x41, 0x3e, 0x80, 0xbc, 0xdd, 0x68, 0xd0, 0x86, 0x65, 0x4b, 0x7b, + 0xa5, 0x7e, 0x93, 0x26, 0xcf, 0xb8, 0xf1, 0x43, 0x00, 0xa9, 0x4a, 0x01, 0x29, 0xc1, 0x58, 0xd3, + 0xe6, 0x16, 0x90, 0x8d, 0x01, 0x4e, 0x94, 0x88, 0x43, 0x9e, 0x91, 0x6d, 0xf9, 0xb4, 0x41, 0x5e, + 0x83, 0x21, 0x36, 0x9a, 0xe2, 0x08, 0x91, 0x52, 0x22, 0x1b, 0x4c, 0xde, 0x61, 0x2b, 0xcf, 0x99, + 0x88, 0x40, 0x5e, 0x81, 0x5c, 0x77, 0x71, 0x57, 0x1c, 0x0e, 0x85, 0x28, 0x24, 0x7e, 0x88, 0xc6, + 0x8a, 0xc9, 0x2d, 0xc8, 0x1f, 0xea, 0xd1, 0xd4, 0xcf, 0xc5, 0x86, 0x31, 0xc4, 0x0f, 0x11, 0xc9, + 0x6b, 0x90, 0xf3, 0x7d, 0x57, 0x18, 0xf9, 0xcc, 0x86, 0x96, 0x97, 0x0f, 0xc2, 0x51, 0x63, 0xdc, + 0x7d, 0xdf, 0x5d, 0xca, 0xc3, 0x08, 0x3f, 0x31, 0x8c, 0x4b, 0x00, 0xd1, 0x37, 0x26, 0x7d, 0x19, + 0x8d, 0xaf, 0xc2, 0x58, 0xf8, 0x6d, 0xe4, 0x45, 0x80, 0x03, 0x7a, 0x64, 0xed, 0xdb, 0xed, 0x46, + 0x93, 0x8b, 0x9b, 0x13, 0xe6, 0xd8, 0x01, 0x3d, 0x5a, 0x41, 0x00, 0xb9, 0x00, 0xa3, 0x1d, 0x36, + 0xfc, 0x62, 0x8e, 0x4f, 0x98, 0x23, 0x9d, 0xee, 0x0e, 0x9b, 0xca, 0xf3, 0x30, 0x8a, 0x8a, 0x53, + 0xb1, 0x22, 0x27, 0x4d, 0xf9, 0xd3, 0xf8, 0xf3, 0x1c, 0xa6, 0x1c, 0x52, 0x1a, 0x44, 0x5e, 0x86, + 0xc9, 0xba, 0x47, 0xf1, 0x70, 0xb2, 0x99, 0xc8, 0x25, 0xea, 0x99, 0x88, 0x80, 0xd5, 0x06, 0xb9, + 0x02, 0xd3, 0x9d, 0xee, 0x4e, 0xd3, 0xa9, 0xb3, 0xda, 0xac, 0xfa, 0x8e, 0xc8, 0x91, 0x30, 0x61, + 0x4e, 0x72, 0xf0, 0x7d, 0x7a, 0x54, 0xde, 0xc1, 0x68, 0x7c, 0x05, 0x35, 0x98, 0x72, 0x10, 0x26, + 0x83, 0x37, 0xa7, 0x15, 0x38, 0xda, 0x2b, 0x9e, 0x87, 0x11, 0xdb, 0xde, 0xeb, 0x3a, 0x3c, 0x6a, + 0xd6, 0x84, 0x29, 0x7e, 0x91, 0x4f, 0xc1, 0x4c, 0x14, 0xdf, 0x5b, 0x36, 0x63, 0x18, 0x9b, 0x51, + 0x08, 0x0b, 0xca, 0x1c, 0x4e, 0xde, 0x04, 0xa2, 0xd6, 0xe7, 0xee, 0x7c, 0x44, 0xeb, 0x7c, 0x4e, + 0x4e, 0x98, 0x33, 0x4a, 0xc9, 0x03, 0x2c, 0x20, 0x2f, 0xc1, 0x84, 0x47, 0x7d, 0x14, 0xf7, 0xb0, + 0xdb, 0x30, 0x23, 0x9f, 0x39, 0x2e, 0x61, 0xac, 0xef, 0xae, 0x42, 0x41, 0xe9, 0x0e, 0x8c, 0x57, + 0xcd, 0x13, 0x04, 0x98, 0x53, 0x11, 0xdc, 0xec, 0x54, 0x1b, 0xe4, 0x4b, 0xb0, 0xa0, 0x60, 0xf2, + 0xe4, 0x80, 0x16, 0x6d, 0x3a, 0x7b, 0xce, 0x4e, 0x93, 0x8a, 0xf9, 0x96, 0x9c, 0xd5, 0xe1, 0x9d, + 0xd0, 0x9c, 0x8f, 0xa8, 0x79, 0xda, 0xc0, 0x65, 0x41, 0x4b, 0x56, 0x61, 0x2e, 0xc6, 0x99, 0x36, + 0xac, 0x6e, 0xa7, 0x67, 0x98, 0xba, 0x88, 0x27, 0xd1, 0x79, 0xd2, 0xc6, 0x56, 0xc7, 0xf8, 0x16, + 0x4c, 0xa8, 0x73, 0x92, 0x75, 0x82, 0x2a, 0x68, 0x88, 0xd9, 0x37, 0x1e, 0xc2, 0xaa, 0xec, 0xa2, + 0x37, 0x15, 0xa1, 0x04, 0x61, 0xde, 0x7b, 0x73, 0x32, 0x84, 0xe2, 0x10, 0xbe, 0x04, 0x13, 0x0d, + 0xc7, 0xef, 0x34, 0xed, 0x23, 0x2b, 0xca, 0x7a, 0x6d, 0x8e, 0x0b, 0x18, 0x6a, 0x72, 0x96, 0x60, + 0x26, 0xb1, 0x0f, 0x92, 0x37, 0xf9, 0x0d, 0x55, 0x08, 0x3f, 0x13, 0xfc, 0x96, 0x8f, 0xd6, 0xd0, + 0x9a, 0xdc, 0x23, 0x90, 0x8c, 0x36, 0x4c, 0xa8, 0xe7, 0xda, 0x29, 0xc9, 0x3c, 0xce, 0x63, 0x68, + 0x1a, 0xbe, 0xe9, 0x8f, 0x9c, 0x1c, 0x17, 0xb3, 0x4e, 0x03, 0x03, 0xd2, 0x5c, 0x85, 0xbc, 0x14, + 0xc1, 0x84, 0xe4, 0x83, 0xaf, 0x03, 0xf2, 0x75, 0xd0, 0x0c, 0x4b, 0x8d, 0xd7, 0x60, 0x54, 0x1c, + 0x5d, 0xfd, 0xdf, 0x04, 0x8c, 0x1f, 0xcc, 0xc2, 0xb4, 0x49, 0xd9, 0xc6, 0x4a, 0x79, 0x06, 0x9f, + 0x67, 0xf6, 0xce, 0x9d, 0x1e, 0xe0, 0x54, 0x6b, 0x5b, 0x9f, 0xdc, 0x39, 0xbf, 0x9c, 0x81, 0xd9, + 0x14, 0xdc, 0x8f, 0x95, 0x3b, 0xf6, 0x36, 0x8c, 0x55, 0x1c, 0xbb, 0x59, 0x6a, 0x34, 0xc2, 0x38, + 0x35, 0x28, 0xb8, 0x63, 0x82, 0x29, 0x9b, 0x41, 0x55, 0x21, 0x26, 0x44, 0x25, 0xaf, 0x8b, 0x49, + 0x11, 0x65, 0x5e, 0xc7, 0x49, 0xf1, 0x9d, 0xe3, 0x22, 0xf0, 0x6f, 0xda, 0x0c, 0xa7, 0x08, 0x06, + 0x1d, 0xe6, 0xc0, 0xc8, 0xd7, 0xe8, 0x99, 0x1d, 0xba, 0xf4, 0xa0, 0xc3, 0xf1, 0xe6, 0x0d, 0x94, + 0x3e, 0xe7, 0xc7, 0xb2, 0x70, 0x3e, 0x9d, 0xf0, 0xe3, 0xa6, 0x01, 0xc6, 0xc4, 0x45, 0x4a, 0xa0, + 0x74, 0x4c, 0x03, 0xcc, 0xb3, 0x1c, 0x21, 0x7e, 0x84, 0x40, 0x76, 0x61, 0x72, 0xd5, 0xf6, 0x83, + 0x15, 0x6a, 0x7b, 0xc1, 0x0e, 0xb5, 0x83, 0x01, 0x24, 0xf9, 0x57, 0xa4, 0x5d, 0x06, 0x0a, 0x13, + 0xfb, 0x92, 0x32, 0x26, 0x6b, 0xeb, 0x6c, 0xc3, 0x89, 0x32, 0x34, 0xc0, 0x44, 0xf9, 0x06, 0x4c, + 0xd7, 0x68, 0xcb, 0xee, 0xec, 0xbb, 0x9e, 0x8c, 0x21, 0x70, 0x1d, 0x26, 0x43, 0x50, 0xea, 0x6c, + 0xd1, 0x8b, 0x35, 0x7c, 0xa5, 0x23, 0xa2, 0xad, 0x44, 0x2f, 0x36, 0xfe, 0x7e, 0x16, 0x2e, 0x94, + 0xea, 0xc2, 0x5c, 0x52, 0x14, 0x48, 0xab, 0xee, 0x4f, 0xb8, 0x6e, 0x72, 0x03, 0xc6, 0xd6, 0xec, + 0xc7, 0xab, 0xd4, 0xf6, 0xa9, 0x2f, 0x92, 0x30, 0x72, 0xb1, 0xd7, 0x7e, 0x1c, 0xbd, 0xe6, 0x98, + 0x11, 0x8e, 0xaa, 0x17, 0x18, 0x7a, 0x42, 0xbd, 0x80, 0x01, 0x23, 0x2b, 0x6e, 0xb3, 0x21, 0xce, + 0x7a, 0xf1, 0x84, 0xbc, 0x8f, 0x10, 0x53, 0x94, 0xb0, 0xeb, 0xf4, 0x54, 0xf8, 0xc5, 0xf8, 0x09, + 0x9f, 0x78, 0x97, 0x5c, 0x81, 0x51, 0xac, 0x28, 0xcc, 0x16, 0x8f, 0x87, 0x46, 0x93, 0x62, 0x2a, + 0xbd, 0x86, 0x29, 0x0b, 0xd5, 0x9e, 0x18, 0x7e, 0xb2, 0x9e, 0x30, 0xfe, 0x11, 0xbe, 0x4e, 0xab, + 0xad, 0x64, 0x27, 0x91, 0xf2, 0x21, 0x99, 0x01, 0x3f, 0x24, 0xfb, 0xd4, 0x86, 0x24, 0xd7, 0x73, + 0x48, 0x7e, 0x28, 0x0b, 0xe3, 0xe1, 0xc7, 0x7e, 0x97, 0x45, 0xeb, 0x0f, 0xdb, 0x35, 0x50, 0xdc, + 0x9f, 0x9a, 0xb2, 0x57, 0x88, 0xf0, 0x3a, 0x5f, 0x80, 0x11, 0xb1, 0x98, 0x32, 0x31, 0xeb, 0xe6, + 0xd8, 0xe8, 0x2e, 0x4d, 0x09, 0xd6, 0x23, 0x38, 0xa0, 0xbe, 0x29, 0xe8, 0x30, 0xb0, 0xd2, 0x36, + 0xdd, 0x11, 0xc6, 0x0a, 0xcf, 0xec, 0x19, 0x95, 0x1e, 0x58, 0x29, 0x6a, 0xd8, 0x40, 0xa7, 0xd3, + 0x3f, 0xc9, 0x43, 0x21, 0x4e, 0x72, 0x7a, 0x3e, 0x84, 0x8d, 0xee, 0x0e, 0xbf, 0xaa, 0xf0, 0x7c, + 0x08, 0x9d, 0xee, 0x8e, 0xc9, 0x60, 0x68, 0xcb, 0xe4, 0x39, 0x8f, 0xb0, 0xd5, 0x13, 0xc2, 0x96, + 0xc9, 0x73, 0x1e, 0x69, 0xb6, 0x4c, 0x9e, 0xf3, 0x08, 0x15, 0x09, 0xab, 0x35, 0x0c, 0x3a, 0x80, + 0xf7, 0x14, 0xa1, 0x48, 0x68, 0xfa, 0xf1, 0xdc, 0x66, 0x12, 0x8d, 0x1d, 0x95, 0x4b, 0xd4, 0xf6, + 0x44, 0xec, 0x7e, 0xb1, 0x9d, 0xe1, 0x51, 0xb9, 0x83, 0x60, 0x2b, 0x60, 0x70, 0x53, 0x45, 0x22, + 0x4d, 0x20, 0xca, 0x4f, 0xb9, 0x80, 0x4f, 0xbf, 0x5b, 0x4b, 0xcb, 0xc4, 0x39, 0x95, 0xb5, 0xa5, + 0xae, 0xe6, 0x14, 0xbe, 0x4f, 0x53, 0x9d, 0xbb, 0x21, 0x02, 0x92, 0xa2, 0x02, 0x29, 0x7f, 0x2a, + 0x33, 0x19, 0x2c, 0x05, 0x78, 0xc0, 0xd2, 0x50, 0x8d, 0x14, 0x31, 0x21, 0xef, 0xc3, 0xb8, 0x1a, + 0x4a, 0x82, 0x07, 0x3c, 0x78, 0x81, 0xc7, 0x98, 0xec, 0x91, 0x0d, 0x57, 0x25, 0x20, 0x3b, 0x70, + 0xa1, 0xec, 0xb6, 0xfd, 0x6e, 0x4b, 0x46, 0xb3, 0x8c, 0x62, 0x68, 0x03, 0x0e, 0x05, 0xfa, 0xa5, + 0xd7, 0x05, 0x8a, 0x88, 0x5c, 0x20, 0x5d, 0x47, 0xf4, 0x0b, 0x48, 0x2f, 0x46, 0x64, 0x13, 0xc6, + 0x51, 0x25, 0x2a, 0xac, 0x0e, 0xc7, 0xf5, 0x6d, 0x23, 0x2a, 0xa9, 0xb0, 0x85, 0xc1, 0x23, 0xa9, + 0xd9, 0xad, 0xa6, 0xf4, 0x5c, 0x50, 0x55, 0xbb, 0x0a, 0x32, 0xf9, 0x2a, 0x4c, 0xf1, 0x2b, 0xda, + 0x36, 0xdd, 0xe1, 0x73, 0x67, 0x42, 0xd3, 0x44, 0xe8, 0x85, 0xfc, 0x75, 0x5e, 0x28, 0xa2, 0x0f, + 0xe9, 0x0e, 0x1f, 0x7b, 0xcd, 0x6f, 0x48, 0xc3, 0x27, 0x5b, 0x30, 0xbb, 0x62, 0xfb, 0x1c, 0xa8, + 0xc4, 0x04, 0x98, 0x44, 0x0d, 0x2d, 0xda, 0x73, 0xef, 0xdb, 0xbe, 0xd4, 0x6c, 0xa7, 0xc6, 0x00, + 0x48, 0xa3, 0x27, 0x3f, 0x98, 0x81, 0x79, 0x4d, 0xf1, 0x2d, 0x0c, 0xc7, 0x5a, 0xb4, 0x1d, 0xa0, + 0x83, 0xd0, 0xd4, 0x62, 0x51, 0x0a, 0xa5, 0x3d, 0xd0, 0xf8, 0x90, 0xc4, 0x74, 0xeb, 0x5e, 0x54, + 0xae, 0x1a, 0x4a, 0xf7, 0xe2, 0x21, 0x16, 0x2a, 0xae, 0xe9, 0x69, 0x7d, 0xa1, 0xc6, 0xd6, 0xb5, + 0x44, 0x33, 0x6e, 0xc7, 0xfb, 0x5b, 0x28, 0xba, 0x32, 0xa1, 0xa2, 0x6b, 0x0e, 0x86, 0xb1, 0x57, + 0x65, 0x64, 0x29, 0xfc, 0x61, 0x7c, 0x5a, 0xdd, 0x87, 0x84, 0x58, 0xd8, 0x77, 0x1f, 0x32, 0xfe, + 0x87, 0x11, 0x98, 0x8e, 0x4d, 0x0b, 0x71, 0x4f, 0xcd, 0x24, 0xee, 0xa9, 0x35, 0x00, 0xae, 0xea, + 0x1d, 0x50, 0x27, 0x2b, 0x9d, 0x13, 0xc7, 0x85, 0x6b, 0x71, 0xb8, 0xa6, 0x14, 0x36, 0x8c, 0x29, + 0x5f, 0xb1, 0x03, 0xea, 0xc8, 0x43, 0xa6, 0x7c, 0xd1, 0x2b, 0x4c, 0x23, 0x36, 0xa4, 0x08, 0xc3, + 0x18, 0x53, 0x56, 0xf5, 0x0d, 0x75, 0x18, 0xc0, 0xe4, 0x70, 0xf2, 0x32, 0x8c, 0x30, 0x21, 0xaa, + 0x5a, 0x11, 0x9b, 0x20, 0x9e, 0x2d, 0x4c, 0xca, 0x62, 0x12, 0x8b, 0x28, 0x22, 0xb7, 0x61, 0x82, + 0xff, 0x25, 0x42, 0xcf, 0x8c, 0xe8, 0xd6, 0x8c, 0x96, 0xd3, 0x90, 0xd1, 0x67, 0x34, 0x3c, 0x76, + 0xbb, 0xa8, 0x75, 0x51, 0xad, 0x53, 0xad, 0x88, 0x20, 0xe4, 0x78, 0xbb, 0xf0, 0x39, 0x90, 0x55, + 0x11, 0x21, 0x30, 0x59, 0x46, 0x78, 0x68, 0xe4, 0xf1, 0x4e, 0x89, 0xb2, 0x0c, 0xf7, 0xcc, 0x30, + 0x45, 0x09, 0xb9, 0xc6, 0x9f, 0x56, 0x50, 0x2c, 0xe4, 0xb9, 0x1c, 0xf1, 0xdd, 0x02, 0x15, 0x13, + 0x28, 0x1b, 0x86, 0xc5, 0xac, 0x72, 0xf6, 0xf7, 0x72, 0xcb, 0x76, 0x9a, 0x62, 0x5b, 0xc1, 0xca, + 0x11, 0x97, 0x32, 0xa8, 0x19, 0x21, 0x90, 0x77, 0x61, 0x8a, 0xfd, 0x28, 0xbb, 0xad, 0x96, 0xdb, + 0x46, 0xf6, 0xe3, 0x51, 0x70, 0x39, 0x24, 0xa9, 0x63, 0x11, 0xaf, 0x25, 0x86, 0xcb, 0xce, 0x13, + 0x7c, 0xb6, 0xed, 0xf2, 0x47, 0x9f, 0x89, 0xe8, 0x3c, 0x41, 0x52, 0x9f, 0xc3, 0x4d, 0x15, 0x89, + 0xbc, 0x0d, 0x93, 0xec, 0xe7, 0x5d, 0xe7, 0x11, 0xe5, 0x15, 0x4e, 0x46, 0xf6, 0x0a, 0x48, 0xb5, + 0xc7, 0x4a, 0x78, 0x7d, 0x3a, 0x26, 0xf9, 0x22, 0x9c, 0x43, 0x4e, 0x75, 0xb7, 0x43, 0x1b, 0xa5, + 0xdd, 0x5d, 0xa7, 0xe9, 0x70, 0xf3, 0x32, 0x1e, 0x64, 0x05, 0x75, 0xf0, 0xbc, 0x62, 0xc4, 0xb0, + 0xec, 0x08, 0xc5, 0x4c, 0xa7, 0x24, 0xdb, 0x50, 0x28, 0x77, 0xfd, 0xc0, 0x6d, 0x95, 0x82, 0xc0, + 0x73, 0x76, 0xba, 0x01, 0xf5, 0xe7, 0xa7, 0xb5, 0x50, 0x24, 0x6c, 0x71, 0x84, 0x85, 0x5c, 0x1f, + 0x54, 0x47, 0x0a, 0xcb, 0x0e, 0x49, 0xcc, 0x04, 0x13, 0xe3, 0x9f, 0x66, 0x60, 0x52, 0x23, 0x25, + 0x6f, 0xc1, 0xc4, 0x1d, 0xcf, 0xa1, 0xed, 0x46, 0xf3, 0x48, 0xb9, 0xa8, 0xe2, 0x2d, 0x66, 0x57, + 0xc0, 0x79, 0xab, 0x35, 0xb4, 0x50, 0xcf, 0x93, 0x4d, 0xb5, 0xfd, 0xbc, 0xc1, 0x5d, 0x94, 0xc5, + 0x04, 0xcd, 0x45, 0xb1, 0x91, 0x70, 0x82, 0x8a, 0xd9, 0xa9, 0xa0, 0x90, 0xf7, 0x60, 0x84, 0x3f, + 0xf0, 0x0a, 0x43, 0xc4, 0x8b, 0x69, 0xcd, 0xe4, 0xee, 0xf0, 0x38, 0x11, 0xd1, 0x8a, 0xc7, 0x37, + 0x05, 0x91, 0xf1, 0xd3, 0x19, 0x20, 0x49, 0xd4, 0x53, 0xf4, 0x5e, 0xa7, 0x5a, 0x07, 0x7d, 0x21, + 0x5c, 0x8d, 0x39, 0x4d, 0x67, 0xce, 0x6a, 0xe2, 0x05, 0xbc, 0xe3, 0xc5, 0xaa, 0x53, 0x15, 0x71, + 0xbc, 0xd8, 0xf8, 0xdb, 0x59, 0x80, 0x08, 0x9b, 0x7c, 0x8e, 0xa7, 0xee, 0xfa, 0x62, 0xd7, 0x6e, + 0x3a, 0xbb, 0x8e, 0x1e, 0xcb, 0x16, 0x99, 0x7c, 0x43, 0x96, 0x98, 0x3a, 0x22, 0xf9, 0x00, 0xa6, + 0x6b, 0x1b, 0x3a, 0xad, 0x62, 0x99, 0xee, 0x77, 0xac, 0x18, 0x79, 0x1c, 0x1b, 0x0d, 0x8e, 0xd5, + 0xd1, 0xe0, 0x06, 0xc7, 0x7c, 0x20, 0x44, 0x09, 0xdb, 0x58, 0x6a, 0x1b, 0xc2, 0xf8, 0xbe, 0x51, + 0xad, 0x88, 0x5d, 0x0a, 0xbf, 0xce, 0xef, 0x58, 0x1d, 0x61, 0x95, 0xcf, 0xf6, 0x09, 0x0d, 0x2f, + 0xea, 0xc8, 0xe1, 0x1e, 0x2e, 0xef, 0x3f, 0x83, 0x6a, 0xbf, 0x96, 0x1b, 0x50, 0xa1, 0xed, 0x78, + 0x66, 0xef, 0x3d, 0x91, 0x75, 0xc0, 0xb0, 0xe6, 0xc9, 0xab, 0xb5, 0x4e, 0x58, 0xc0, 0xdc, 0x8a, + 0x2e, 0x29, 0xdc, 0x4e, 0x20, 0xc5, 0x68, 0xe6, 0x1f, 0x66, 0xe0, 0x5c, 0x2a, 0x2d, 0xb9, 0x0e, + 0x10, 0xe9, 0x94, 0x44, 0x2f, 0xe1, 0x8e, 0x19, 0x45, 0x04, 0x32, 0x15, 0x0c, 0xf2, 0x95, 0xb8, + 0x36, 0xe8, 0xf4, 0x83, 0x70, 0x41, 0x06, 0xe2, 0xd3, 0xb5, 0x41, 0x29, 0x3a, 0x20, 0xe3, 0x97, + 0x73, 0x30, 0xa3, 0x04, 0x1c, 0xe2, 0xdf, 0x7a, 0x8a, 0x01, 0xf8, 0x01, 0x4c, 0xb0, 0xd6, 0x38, + 0x75, 0xe1, 0xf9, 0xc2, 0x2d, 0x59, 0x5e, 0x4f, 0xf8, 0x62, 0x0a, 0x6e, 0xd7, 0x55, 0x64, 0x1e, + 0x1e, 0x13, 0xb7, 0x4e, 0x7c, 0x90, 0xa8, 0x27, 0xbd, 0x5e, 0x34, 0xe6, 0xc4, 0x87, 0xc9, 0xca, + 0x51, 0xdb, 0x6e, 0x85, 0xb5, 0x71, 0x8b, 0x96, 0x4f, 0xf5, 0xac, 0x4d, 0xc3, 0xe6, 0xd5, 0x45, + 0x5e, 0x4b, 0xbc, 0x2c, 0xc5, 0x61, 0x5e, 0xa3, 0x5a, 0xf8, 0x00, 0x66, 0x12, 0x1f, 0x7d, 0xa6, + 0x48, 0x9d, 0xdb, 0x40, 0x92, 0xdf, 0x91, 0xc2, 0xe1, 0x53, 0x7a, 0x1c, 0xd8, 0x73, 0xe1, 0xe3, + 0x75, 0xab, 0x65, 0xb7, 0x1b, 0xdc, 0x3e, 0x66, 0x51, 0x8d, 0xe3, 0xf9, 0x33, 0x59, 0xd5, 0x1f, + 0xf6, 0x59, 0x5f, 0x75, 0x5f, 0xd0, 0x6e, 0xc3, 0x97, 0x7a, 0x8d, 0xe9, 0x40, 0x5a, 0x87, 0x6f, + 0xe7, 0xe0, 0x42, 0x0f, 0x4a, 0x72, 0x14, 0x9f, 0x44, 0x5c, 0x0b, 0x71, 0xb3, 0x7f, 0x85, 0x4f, + 0x63, 0x2a, 0x91, 0xcf, 0xf1, 0x88, 0x18, 0x75, 0x4c, 0xa0, 0x2f, 0xee, 0xdf, 0xa8, 0xc6, 0x3f, + 0x08, 0xa1, 0xf1, 0x50, 0x18, 0x1c, 0x4a, 0x3e, 0x80, 0x61, 0x74, 0x86, 0x8e, 0x85, 0x3c, 0x64, + 0x18, 0x08, 0x57, 0x82, 0x76, 0xb2, 0x9f, 0x5a, 0xd0, 0x4e, 0x06, 0x20, 0x9f, 0x85, 0x5c, 0x69, + 0xbb, 0x26, 0xc6, 0x65, 0x4a, 0x25, 0xdf, 0xae, 0x45, 0x09, 0x47, 0x6c, 0x2d, 0x33, 0x08, 0xa3, + 0x60, 0x84, 0x77, 0xcb, 0x1b, 0x62, 0x54, 0x54, 0xc2, 0xbb, 0xe5, 0x8d, 0x88, 0x70, 0xaf, 0xae, + 0x05, 0x90, 0xba, 0x5b, 0xde, 0xf8, 0xe4, 0xa6, 0xfd, 0xbf, 0x91, 0xe5, 0x61, 0x3c, 0x78, 0xc3, + 0x3e, 0x80, 0x09, 0x2d, 0x4e, 0x77, 0x26, 0x92, 0xc7, 0xc2, 0x98, 0xea, 0x31, 0x13, 0x20, 0x8d, + 0x40, 0xa6, 0xee, 0x61, 0xbf, 0x51, 0xe2, 0x55, 0x8d, 0x6d, 0x42, 0x0e, 0x28, 0x13, 0xc7, 0x53, + 0xf7, 0x84, 0x24, 0xe4, 0x16, 0xe4, 0x37, 0x69, 0xdb, 0x6e, 0x07, 0xa1, 0x42, 0x14, 0xad, 0x85, + 0x03, 0x84, 0xe9, 0x52, 0x43, 0x88, 0x88, 0x96, 0xad, 0xdd, 0x1d, 0xbf, 0xee, 0x39, 0x18, 0xee, + 0x27, 0x3c, 0x8b, 0xb9, 0x65, 0xab, 0x52, 0xa2, 0x33, 0x88, 0x11, 0x19, 0x3f, 0x93, 0x81, 0x51, + 0x31, 0x90, 0x3c, 0xe5, 0xda, 0x5e, 0x74, 0x96, 0x08, 0x6f, 0x80, 0x3d, 0x27, 0xee, 0x0d, 0xb0, + 0xc7, 0x63, 0xea, 0x8c, 0x09, 0xdf, 0xb6, 0xf0, 0x69, 0x10, 0x67, 0xa3, 0x74, 0x85, 0xd4, 0x33, + 0x6a, 0x85, 0xa8, 0x83, 0x7a, 0x58, 0x19, 0xff, 0x40, 0x7c, 0xd9, 0xdd, 0xf2, 0x06, 0x59, 0x84, + 0xfc, 0xaa, 0xcb, 0xc3, 0x43, 0xa9, 0xf9, 0x73, 0x9b, 0x02, 0xa6, 0x76, 0x90, 0xc4, 0x63, 0xdf, + 0xb7, 0xe1, 0xb9, 0xe2, 0x2e, 0xa3, 0x7c, 0x5f, 0x87, 0x03, 0x63, 0xdf, 0x17, 0xa2, 0x0e, 0xfc, + 0x7d, 0x34, 0x65, 0x93, 0x78, 0x78, 0x0b, 0x73, 0x9a, 0xdc, 0x53, 0x3d, 0xd7, 0x44, 0x91, 0xdc, + 0x29, 0x16, 0x7a, 0xed, 0x14, 0x0f, 0x6f, 0x99, 0x29, 0x54, 0xf8, 0xae, 0x16, 0x81, 0x6b, 0xd4, + 0x7b, 0xf4, 0x0c, 0xef, 0xd2, 0xe9, 0xef, 0x6a, 0xf1, 0xe6, 0x0d, 0xb4, 0x49, 0xff, 0x61, 0x16, + 0xce, 0xa7, 0x13, 0xaa, 0x6d, 0xc9, 0xf4, 0x69, 0xcb, 0x55, 0xc8, 0xaf, 0xb8, 0x7e, 0xa0, 0x58, + 0xfd, 0xa1, 0xfa, 0x7f, 0x5f, 0xc0, 0xcc, 0xb0, 0x94, 0xdd, 0xb9, 0xd9, 0xdf, 0xe1, 0xf2, 0x44, + 0x7e, 0x18, 0xbc, 0x82, 0xdd, 0xb9, 0x79, 0x11, 0xb9, 0x0b, 0x79, 0x53, 0x78, 0x4e, 0xc5, 0xba, + 0x46, 0x82, 0x43, 0x69, 0x8a, 0x78, 0x02, 0xa2, 0x85, 0x4b, 0x17, 0x30, 0x52, 0x82, 0x51, 0x31, + 0xfa, 0xb1, 0xa7, 0xe3, 0x94, 0x29, 0xa3, 0x67, 0x30, 0x90, 0x74, 0x6c, 0x47, 0xc1, 0x47, 0xc0, + 0x6a, 0x45, 0x3a, 0x41, 0xe1, 0x8e, 0xc2, 0x1f, 0x09, 0x75, 0x03, 0xcb, 0x10, 0xd1, 0xf8, 0xc1, + 0x2c, 0x80, 0xd4, 0xda, 0x3c, 0xb3, 0x33, 0xec, 0xb3, 0xda, 0x0c, 0x53, 0xec, 0x8d, 0x06, 0x4f, + 0x11, 0xfc, 0x00, 0xcd, 0x79, 0x06, 0x4f, 0x10, 0x5c, 0x84, 0xe1, 0xcd, 0x48, 0xa1, 0x25, 0x7c, + 0x4c, 0x50, 0x1d, 0xcd, 0xe1, 0xc6, 0x0e, 0xcc, 0xdd, 0xa5, 0x41, 0xa4, 0xde, 0x92, 0x4f, 0x8f, + 0xfd, 0xd9, 0xbe, 0x01, 0x63, 0x02, 0x3f, 0xdc, 0xbf, 0xb8, 0x2e, 0x46, 0xc4, 0x83, 0x41, 0x5d, + 0x8c, 0x44, 0x60, 0xbb, 0x51, 0x85, 0x36, 0x69, 0x40, 0x3f, 0xd9, 0x6a, 0x6a, 0x40, 0x78, 0x53, + 0xb0, 0x65, 0x83, 0xd5, 0x70, 0x6a, 0xff, 0x3c, 0x84, 0x73, 0xe1, 0xb7, 0x3f, 0x4d, 0xbe, 0x37, + 0xd8, 0x95, 0x52, 0x04, 0xff, 0x8f, 0x38, 0xf6, 0xb1, 0x3d, 0x79, 0x0c, 0x0b, 0x92, 0x60, 0xdb, + 0x09, 0x0d, 0x27, 0x07, 0xa2, 0x25, 0xef, 0xc2, 0xb8, 0x42, 0x23, 0x82, 0xd7, 0xa3, 0x9a, 0xfa, + 0xd0, 0x09, 0xf6, 0x2d, 0x9f, 0xc3, 0x55, 0x35, 0xb5, 0x82, 0x6e, 0x7c, 0x19, 0x9e, 0x0f, 0xfd, + 0x80, 0x52, 0xaa, 0x8e, 0x31, 0xcf, 0x9c, 0x8d, 0xf9, 0x7a, 0xd4, 0xac, 0x6a, 0x3b, 0x74, 0x75, + 0x96, 0xbc, 0x89, 0xda, 0x2c, 0xd1, 0x98, 0x17, 0x12, 0xce, 0xd3, 0x8a, 0x8f, 0xb4, 0xf1, 0x8e, + 0xf2, 0xb1, 0x29, 0x0c, 0x35, 0xe2, 0x4c, 0x9c, 0xf8, 0x07, 0xb3, 0x30, 0xfd, 0xa0, 0x5a, 0x29, + 0x87, 0xd6, 0x47, 0xdf, 0x65, 0x09, 0x8c, 0xb5, 0xb6, 0xf5, 0xde, 0x6f, 0x8c, 0x2d, 0x98, 0x8d, + 0x75, 0x03, 0x8a, 0x0e, 0xef, 0x73, 0x0f, 0x92, 0x10, 0x2c, 0xc5, 0x86, 0xf3, 0x69, 0xec, 0x1f, + 0xde, 0x32, 0x63, 0xd8, 0xc6, 0x7f, 0x0e, 0x31, 0xbe, 0x62, 0x0b, 0x7b, 0x03, 0xc6, 0xaa, 0xbe, + 0xdf, 0xa5, 0xde, 0x96, 0xb9, 0xaa, 0xaa, 0x0a, 0x1c, 0x04, 0x5a, 0x5d, 0xaf, 0x69, 0x46, 0x08, + 0xe4, 0x1a, 0xe4, 0x45, 0xe0, 0x70, 0xb9, 0x27, 0xa0, 0xd6, 0x36, 0x8c, 0x3b, 0x6e, 0x86, 0xc5, + 0xe4, 0x2d, 0x98, 0xe0, 0x7f, 0xf3, 0xd9, 0x26, 0x3a, 0x1c, 0x95, 0x83, 0x02, 0x9d, 0xcf, 0x4e, + 0x53, 0x43, 0x23, 0xaf, 0x43, 0xae, 0x54, 0x36, 0x85, 0x3a, 0x48, 0xc8, 0x8d, 0x9e, 0xc5, 0x75, + 0x76, 0xda, 0x25, 0xa2, 0x6c, 0x32, 0xe9, 0x4f, 0xc6, 0x7b, 0x10, 0x9a, 0x6c, 0x9c, 0x01, 0x52, + 0xdb, 0x14, 0x3b, 0xcc, 0x10, 0x46, 0x6e, 0xc0, 0x68, 0x85, 0x9b, 0xcc, 0x09, 0x3d, 0x36, 0xcf, + 0xce, 0xc7, 0x41, 0x5a, 0xb4, 0x04, 0x0e, 0x22, 0xd7, 0x64, 0xd6, 0xb2, 0x7c, 0xe4, 0x88, 0xd2, + 0x23, 0x35, 0xd9, 0x1b, 0x30, 0x22, 0xc2, 0x6b, 0x8f, 0x29, 0xf9, 0x4c, 0xe2, 0x61, 0xb5, 0x05, + 0x4e, 0xd2, 0x23, 0x15, 0x9e, 0xa6, 0x47, 0xea, 0x0e, 0x5c, 0xb8, 0x8b, 0xda, 0x1b, 0x3d, 0x48, + 0xd4, 0x96, 0x59, 0x15, 0xfa, 0x70, 0x7c, 0x06, 0xe2, 0x0a, 0x9e, 0x78, 0x9c, 0x29, 0xab, 0xeb, + 0xa9, 0xc9, 0x66, 0x7b, 0x31, 0x22, 0x5f, 0x82, 0xb9, 0xb4, 0x22, 0xa1, 0x35, 0xc7, 0x70, 0x48, + 0xe9, 0x15, 0xa8, 0xe1, 0x90, 0xd2, 0x38, 0x90, 0x55, 0x28, 0x70, 0x78, 0xa9, 0xd1, 0x72, 0xda, + 0x5c, 0xf3, 0xcf, 0xb5, 0xea, 0xe8, 0x19, 0x22, 0xb8, 0xda, 0xac, 0x90, 0xbf, 0x00, 0x68, 0xbe, + 0x44, 0x31, 0x4a, 0xf2, 0x13, 0x19, 0x76, 0x9b, 0xe3, 0xc1, 0xa8, 0xb7, 0xcc, 0x55, 0x5f, 0x84, + 0xd2, 0x3b, 0x1f, 0xb9, 0x09, 0xd5, 0x02, 0xcf, 0x69, 0xef, 0x09, 0x3f, 0xa1, 0x4d, 0xe1, 0x27, + 0xf4, 0xee, 0xc7, 0xf2, 0x13, 0xe2, 0xac, 0xfc, 0x93, 0xe3, 0xe2, 0x84, 0x27, 0xea, 0xc4, 0x55, + 0xa4, 0x7d, 0x01, 0xeb, 0x3a, 0x74, 0x96, 0xdd, 0x6a, 0xf3, 0x50, 0xb8, 0xb4, 0xc1, 0x1b, 0x39, + 0x8d, 0x3b, 0x38, 0x76, 0x1d, 0xe6, 0xc9, 0xb0, 0xba, 0x21, 0x42, 0xa2, 0xa1, 0xa9, 0x1c, 0xd8, + 0xc5, 0x53, 0xfa, 0xa2, 0x70, 0xf7, 0xda, 0x42, 0x74, 0xf1, 0x94, 0x8e, 0x2b, 0x16, 0x4e, 0x23, + 0x75, 0xf2, 0x68, 0x24, 0xe4, 0x06, 0x8c, 0xac, 0xd9, 0x8f, 0x4b, 0x7b, 0x54, 0x64, 0xa3, 0x9c, + 0x94, 0xdb, 0x1f, 0x02, 0x97, 0xf2, 0x7f, 0xc4, 0x7d, 0x1d, 0x9e, 0x33, 0x05, 0x1a, 0xf9, 0xbe, + 0x0c, 0x9c, 0xe7, 0xcb, 0x58, 0xb6, 0xb2, 0x46, 0x83, 0x80, 0xf5, 0x83, 0x88, 0xa9, 0x77, 0x39, + 0x32, 0xd8, 0x4e, 0xc7, 0x43, 0x57, 0x7a, 0x43, 0xec, 0x0c, 0x61, 0xc7, 0xf9, 0xa2, 0x54, 0x0b, + 0x4e, 0x9c, 0x4a, 0x4f, 0x36, 0x61, 0x7c, 0xed, 0x4e, 0x29, 0xac, 0x96, 0x47, 0x2c, 0x2f, 0xa6, + 0xed, 0x8e, 0x0a, 0x5a, 0x9a, 0xa7, 0x81, 0xca, 0x46, 0x78, 0x07, 0x7c, 0x56, 0xf6, 0x07, 0x79, + 0x53, 0xf5, 0x2d, 0xcd, 0xa1, 0xf4, 0x3c, 0xda, 0xb2, 0x1f, 0x5b, 0xf6, 0x1e, 0xd5, 0x5e, 0xc9, + 0x85, 0xf6, 0xfa, 0xa7, 0x32, 0x70, 0xb1, 0x67, 0x93, 0xc9, 0x6d, 0xb8, 0x60, 0x73, 0x8f, 0x69, + 0x6b, 0x3f, 0x08, 0x3a, 0xbe, 0x25, 0xaf, 0x18, 0xc2, 0x1b, 0xd5, 0x3c, 0x27, 0x8a, 0x57, 0x58, + 0xa9, 0xbc, 0x75, 0xf8, 0xe4, 0x03, 0x78, 0xc1, 0x69, 0xfb, 0xb4, 0xde, 0xf5, 0xa8, 0x25, 0x19, + 0xd4, 0x9d, 0x86, 0x67, 0x79, 0x76, 0x7b, 0x4f, 0xba, 0xd6, 0x9a, 0x17, 0x25, 0x8e, 0xf0, 0xca, + 0x2e, 0x3b, 0x0d, 0xcf, 0x44, 0x04, 0xe3, 0x9f, 0x66, 0x60, 0xbe, 0x57, 0x97, 0x90, 0x79, 0x18, + 0xa5, 0x4a, 0xee, 0x92, 0xbc, 0x29, 0x7f, 0x92, 0xe7, 0x21, 0xda, 0xe9, 0xc5, 0xe9, 0x9f, 0xaf, + 0x8b, 0x3c, 0x12, 0x68, 0xda, 0xae, 0xee, 0xeb, 0xc2, 0x40, 0x79, 0xa2, 0xae, 0xee, 0xee, 0x2f, + 0x02, 0x44, 0xdb, 0x39, 0x57, 0x4c, 0x98, 0x63, 0x76, 0xdd, 0xe3, 0x2b, 0x8f, 0x9c, 0x87, 0x11, + 0xbe, 0x5d, 0x0a, 0xff, 0x07, 0xf1, 0x8b, 0x9d, 0xdb, 0xa2, 0x93, 0x71, 0x9f, 0xcf, 0x2d, 0x4d, + 0x68, 0x9d, 0x3d, 0xd2, 0xc2, 0xc1, 0x31, 0x7e, 0x72, 0x92, 0x8b, 0x10, 0xa5, 0x6e, 0xb0, 0x2f, + 0x85, 0x8e, 0xc5, 0x34, 0x07, 0x30, 0x6e, 0x4b, 0xa9, 0xd8, 0x65, 0xeb, 0x6e, 0x5f, 0xf2, 0xed, + 0x27, 0x9b, 0xfa, 0xf6, 0xf3, 0x06, 0x8c, 0x95, 0xf7, 0x69, 0xfd, 0x20, 0x74, 0xc2, 0xc9, 0x0b, + 0xe5, 0x3a, 0x03, 0xf2, 0x30, 0xe1, 0x11, 0x02, 0xb9, 0x01, 0x80, 0x7e, 0xa7, 0x5c, 0x22, 0x55, + 0x52, 0x7d, 0xa0, 0x9b, 0xaa, 0x30, 0x4f, 0x51, 0x50, 0x90, 0x7d, 0xcd, 0xbc, 0xa3, 0xda, 0xb3, + 0x70, 0xf6, 0xbe, 0xb7, 0x2b, 0xd0, 0x23, 0x04, 0xd6, 0x3c, 0x65, 0x5f, 0x11, 0xa7, 0x60, 0x21, + 0xb1, 0xf9, 0xa8, 0x48, 0xe4, 0x3a, 0x8c, 0x6d, 0x48, 0x47, 0x02, 0x3c, 0x04, 0x27, 0x90, 0x02, + 0x22, 0xa7, 0x83, 0xf9, 0x8c, 0x19, 0xa1, 0x90, 0xcf, 0xc2, 0x68, 0x99, 0x7a, 0xc1, 0xe6, 0xe6, + 0x2a, 0x1a, 0x9d, 0xf0, 0x8c, 0x18, 0x79, 0xcc, 0x5e, 0x10, 0x04, 0xcd, 0xef, 0x1c, 0x17, 0x27, + 0x03, 0xa7, 0x45, 0xc3, 0x48, 0xdf, 0xa6, 0xc4, 0x26, 0x4b, 0x50, 0xe0, 0xcf, 0xe2, 0xd1, 0xdd, + 0x03, 0x4f, 0xc6, 0x3c, 0x3f, 0xa7, 0xc5, 0x1b, 0xfa, 0x21, 0xdd, 0x09, 0x73, 0x37, 0x24, 0xf0, + 0xc9, 0xb2, 0x4c, 0x79, 0xa2, 0x36, 0x13, 0x22, 0x65, 0x58, 0x7c, 0xc7, 0x60, 0xad, 0x4d, 0x52, + 0x90, 0x12, 0x4c, 0x96, 0xdd, 0x56, 0xc7, 0x0e, 0x1c, 0xcc, 0x0d, 0x79, 0x24, 0x0e, 0x41, 0x54, + 0xe8, 0xd5, 0xd5, 0x02, 0xed, 0x44, 0x55, 0x0b, 0xc8, 0x1d, 0x98, 0x32, 0xdd, 0x2e, 0x1b, 0x26, + 0x79, 0x0b, 0xe7, 0xe7, 0x1c, 0x9a, 0x86, 0x78, 0xac, 0x84, 0x1d, 0xcb, 0xe2, 0xca, 0xad, 0x45, + 0x45, 0xd5, 0xa8, 0xc8, 0x7a, 0xca, 0x73, 0x88, 0x7a, 0xb8, 0xa9, 0x19, 0x1c, 0x12, 0xcc, 0x52, + 0x5e, 0x52, 0x6e, 0xc1, 0x78, 0xad, 0xf6, 0x60, 0x93, 0xfa, 0xc1, 0x9d, 0xa6, 0x7b, 0x88, 0x67, + 0x5b, 0x5e, 0x24, 0x1c, 0xf3, 0x5d, 0x2b, 0xa0, 0x7e, 0x60, 0xed, 0x36, 0xdd, 0x43, 0x53, 0xc5, + 0x22, 0x5f, 0x63, 0xfd, 0xa1, 0x48, 0x82, 0x22, 0xfe, 0x6b, 0x3f, 0x61, 0x15, 0x4f, 0x90, 0x68, + 0xd1, 0x30, 0x91, 0x55, 0xef, 0x2c, 0x05, 0x1d, 0x7d, 0xca, 0x3c, 0xf7, 0xf1, 0x51, 0xa9, 0xd1, + 0xf0, 0xa8, 0xef, 0x8b, 0x43, 0x88, 0xfb, 0x94, 0xa1, 0xb2, 0xc1, 0xe6, 0x05, 0x9a, 0x4f, 0x99, + 0x42, 0x40, 0x7e, 0x38, 0x03, 0xe7, 0x54, 0x6f, 0x13, 0x5c, 0x2e, 0x68, 0xe6, 0xc2, 0x8f, 0xa4, + 0x37, 0xaf, 0xcb, 0x43, 0xf8, 0xba, 0x82, 0x76, 0xfd, 0xd1, 0xcd, 0xeb, 0xa5, 0xe8, 0x67, 0x4d, + 0x12, 0x61, 0x2c, 0xbb, 0x62, 0x2a, 0x3f, 0x2d, 0x5f, 0xcf, 0x9c, 0x9d, 0x42, 0x4c, 0xca, 0x4c, + 0x52, 0x63, 0x33, 0x0a, 0x0d, 0xa7, 0xaa, 0x1b, 0x78, 0xa6, 0x09, 0x8d, 0xaa, 0x98, 0x7f, 0xdc, + 0xc4, 0xca, 0xe9, 0xe8, 0x02, 0x99, 0x42, 0x43, 0xaa, 0x30, 0xcd, 0x01, 0x6c, 0x5b, 0xe0, 0xa9, + 0x8f, 0x66, 0xa3, 0xe4, 0x0b, 0x82, 0x0d, 0xbe, 0xf5, 0x63, 0xfa, 0x23, 0x35, 0x60, 0x69, 0x8c, + 0x8e, 0x7c, 0x00, 0x53, 0x18, 0x57, 0x3e, 0x5a, 0xaf, 0x73, 0xb8, 0x8a, 0x31, 0xee, 0xaa, 0x28, + 0x89, 0x79, 0xde, 0x4d, 0xf8, 0xfe, 0x7e, 0xb4, 0xa2, 0x3f, 0x80, 0x29, 0xb4, 0xd5, 0x89, 0x18, + 0x9c, 0x8b, 0x18, 0x88, 0x92, 0x38, 0x83, 0xa0, 0xe9, 0x47, 0x0c, 0xfe, 0x6e, 0x06, 0x2e, 0xb2, + 0x8a, 0xd2, 0x47, 0xe8, 0xfc, 0xc7, 0x19, 0x21, 0x8c, 0x44, 0xd9, 0x93, 0xa7, 0x2a, 0x8e, 0xfa, + 0xfe, 0x7e, 0x1a, 0x07, 0xfc, 0x28, 0xf6, 0xf1, 0xe9, 0x1f, 0x75, 0xe1, 0x63, 0x7f, 0x54, 0x4f, + 0x9e, 0xea, 0x47, 0x05, 0x4d, 0x3f, 0x8d, 0x03, 0x5e, 0x6b, 0x6b, 0xa5, 0xb5, 0xd5, 0xe8, 0x6e, + 0xf6, 0xdd, 0xe5, 0xb6, 0xa2, 0xb5, 0xad, 0x8f, 0xdb, 0xca, 0x16, 0x77, 0x8b, 0x56, 0xba, 0x41, + 0x5e, 0x6b, 0x35, 0x70, 0xfc, 0x5a, 0x1b, 0xa3, 0x31, 0x63, 0xd8, 0xc6, 0x2f, 0x42, 0x8c, 0xaf, + 0x30, 0x55, 0x35, 0x60, 0x84, 0xdf, 0x5a, 0x45, 0x27, 0xa3, 0xcd, 0x02, 0xbf, 0xd3, 0x9a, 0xa2, + 0x84, 0x5c, 0x84, 0x5c, 0xad, 0xf6, 0x40, 0x74, 0x32, 0x1a, 0xac, 0xfa, 0xbe, 0x6b, 0x32, 0x18, + 0x1b, 0x21, 0xb4, 0x42, 0x55, 0xe2, 0xf4, 0xb3, 0xf3, 0xce, 0x44, 0x28, 0xeb, 0x6f, 0x79, 0x87, + 0x1c, 0x8a, 0xfa, 0x5b, 0xdc, 0x21, 0xa3, 0x9b, 0x63, 0x19, 0xe6, 0x4b, 0xbe, 0x4f, 0x3d, 0x36, + 0x21, 0x84, 0x71, 0xa3, 0x27, 0xee, 0x39, 0xe2, 0x60, 0xc7, 0x4a, 0xed, 0xba, 0x6f, 0xf6, 0x44, + 0x24, 0x57, 0x21, 0x5f, 0xea, 0x36, 0x1c, 0xda, 0xae, 0x6b, 0x71, 0xd6, 0x6c, 0x01, 0x33, 0xc3, + 0x52, 0xf2, 0x45, 0x38, 0x17, 0x0b, 0x82, 0x28, 0x7a, 0x60, 0x34, 0xda, 0x7b, 0xe5, 0x3d, 0x2c, + 0x32, 0xc8, 0xe0, 0x5d, 0x92, 0x4e, 0x49, 0x4a, 0x50, 0x58, 0x46, 0x37, 0xad, 0x0a, 0xe5, 0x6f, + 0x43, 0xae, 0xc7, 0xfd, 0xf3, 0xf8, 0xad, 0x59, 0x84, 0x7a, 0x6c, 0x84, 0x85, 0x66, 0x02, 0x9d, + 0xdc, 0x87, 0xd9, 0x38, 0x8c, 0x9d, 0xe0, 0xfc, 0x82, 0x8c, 0xfb, 0x4d, 0x82, 0x0b, 0x9e, 0xe1, + 0x69, 0x54, 0x64, 0x07, 0x66, 0x22, 0x83, 0x24, 0xfd, 0xda, 0x2c, 0xed, 0x9c, 0xc3, 0x72, 0x79, + 0x75, 0x7e, 0x5e, 0x4c, 0xc6, 0xd9, 0xc8, 0xb8, 0x29, 0xbc, 0x3e, 0x9b, 0x49, 0x76, 0xa4, 0x01, + 0x53, 0x35, 0x67, 0xaf, 0xed, 0xb4, 0xf7, 0xee, 0xd3, 0xa3, 0x0d, 0xdb, 0xf1, 0x84, 0xc5, 0xa9, + 0xb4, 0x27, 0x2f, 0xf9, 0x47, 0xad, 0x16, 0x0d, 0x3c, 0xdc, 0x08, 0x59, 0x39, 0xfa, 0xa0, 0xb3, + 0xeb, 0xd0, 0x82, 0xcf, 0xe9, 0xd0, 0x6d, 0xb3, 0x63, 0x3b, 0x9a, 0x10, 0xa0, 0xf3, 0xd4, 0x54, + 0x17, 0x13, 0x03, 0xaa, 0x2e, 0x9a, 0x30, 0xb3, 0xdc, 0xae, 0x7b, 0x47, 0xf8, 0x44, 0x27, 0x3f, + 0x6e, 0xf2, 0x94, 0x8f, 0x7b, 0x45, 0x7c, 0xdc, 0x0b, 0xb6, 0x9c, 0x61, 0x69, 0x9f, 0x97, 0x64, + 0x4c, 0x6a, 0x30, 0x83, 0x17, 0x87, 0x6a, 0x65, 0xa3, 0xda, 0x76, 0x02, 0xc7, 0x0e, 0x68, 0x43, + 0x08, 0x17, 0x61, 0x76, 0x13, 0x7e, 0x45, 0x75, 0x1a, 0x1d, 0xcb, 0x91, 0x28, 0x2a, 0xd3, 0x04, + 0x7d, 0xbf, 0x7b, 0xe2, 0xf4, 0x5f, 0xd2, 0x3d, 0xb1, 0x0a, 0xd3, 0xf1, 0xd8, 0x0c, 0x85, 0xe8, + 0x1c, 0xf6, 0xb1, 0x88, 0x1d, 0xe7, 0x6e, 0x17, 0x85, 0x49, 0x2d, 0xa1, 0xa8, 0x4e, 0x17, 0xbf, + 0x72, 0xce, 0x68, 0x57, 0x4e, 0x6d, 0x57, 0x3a, 0xc3, 0x95, 0x93, 0x6c, 0x00, 0xdc, 0x71, 0xbd, + 0x3a, 0x2d, 0xa1, 0x7f, 0x34, 0xd1, 0x72, 0x40, 0x31, 0xa6, 0x51, 0x21, 0x5f, 0x3f, 0xbb, 0xec, + 0xb7, 0x15, 0x77, 0x73, 0x57, 0x78, 0x18, 0x3f, 0x92, 0x85, 0xf9, 0x5e, 0x9f, 0xd3, 0xe7, 0xba, + 0xf7, 0x29, 0x48, 0xae, 0x70, 0x71, 0xed, 0x2b, 0xd0, 0xf8, 0x3a, 0x5f, 0x84, 0xf4, 0x85, 0x2c, + 0xae, 0x81, 0xb3, 0x71, 0x82, 0x2d, 0xaf, 0x49, 0x6e, 0xc3, 0xb8, 0xf2, 0xf1, 0xb8, 0x97, 0xf6, + 0x6a, 0xaa, 0x09, 0xbb, 0xe1, 0xdf, 0xec, 0x9a, 0xc8, 0xf7, 0x2d, 0x79, 0x4d, 0xe4, 0xbf, 0x48, + 0x81, 0xbb, 0x88, 0x8f, 0x70, 0x2b, 0x00, 0xdf, 0x77, 0x09, 0x01, 0xdc, 0xb7, 0xf9, 0x16, 0x68, + 0xe2, 0xdf, 0xc6, 0xaf, 0x4f, 0xf0, 0x13, 0x59, 0xbd, 0x25, 0xf6, 0xb2, 0x0f, 0x8e, 0xdd, 0x1e, + 0xb3, 0x67, 0xb9, 0x3d, 0xe6, 0x4e, 0xbf, 0x3d, 0x0e, 0x9d, 0x76, 0x7b, 0x8c, 0x5d, 0xef, 0x86, + 0xcf, 0x7c, 0xbd, 0x1b, 0x39, 0xd3, 0xf5, 0x6e, 0xf4, 0x4c, 0xd7, 0x3b, 0xed, 0xa6, 0x9a, 0x3f, + 0xed, 0xa6, 0xfa, 0xd7, 0x97, 0xc1, 0x67, 0xf5, 0x32, 0x98, 0x26, 0xe2, 0x9d, 0xe9, 0x32, 0xf8, + 0x43, 0x3d, 0xef, 0x72, 0x85, 0x8f, 0x23, 0x94, 0xbf, 0x3c, 0xc0, 0x5d, 0x6e, 0xd0, 0x9b, 0xdc, + 0xcc, 0xd3, 0xb9, 0xc9, 0x91, 0xa7, 0x76, 0x93, 0x9b, 0x7d, 0xd2, 0x9b, 0xdc, 0xdc, 0xd3, 0xbc, + 0xc9, 0x9d, 0xfb, 0xab, 0x78, 0x93, 0x3b, 0xff, 0xaf, 0xe7, 0x26, 0xf7, 0x37, 0xa0, 0x10, 0x17, + 0x2e, 0x4f, 0x0f, 0x63, 0xfc, 0xd4, 0x62, 0x48, 0x32, 0xd1, 0x37, 0x2e, 0xdc, 0x91, 0x1b, 0x00, + 0x1b, 0x9e, 0xf3, 0xc8, 0x0e, 0xe8, 0x7d, 0x69, 0xfd, 0x26, 0x42, 0x70, 0x73, 0x28, 0x1b, 0x79, + 0x53, 0x41, 0x09, 0xef, 0x35, 0xd9, 0xb4, 0x7b, 0x8d, 0xf1, 0xc3, 0x59, 0x98, 0xe1, 0x81, 0xd8, + 0x9e, 0xfd, 0x47, 0xd8, 0xf7, 0xb5, 0xdb, 0xaa, 0xb4, 0xb5, 0x8e, 0xb5, 0xae, 0xcf, 0x33, 0xec, + 0x57, 0xe1, 0x5c, 0xa2, 0x2b, 0xf0, 0xc6, 0x5a, 0x91, 0x21, 0xf0, 0x12, 0x77, 0xd6, 0xf9, 0xf4, + 0x4a, 0x1e, 0xde, 0x32, 0x13, 0x14, 0xc6, 0x9f, 0x0f, 0x25, 0xf8, 0x8b, 0x07, 0x59, 0xf5, 0x89, + 0x35, 0x73, 0xb6, 0x27, 0xd6, 0xec, 0x60, 0x4f, 0xac, 0x31, 0xa1, 0x22, 0x37, 0x88, 0x50, 0xf1, + 0x45, 0x98, 0xdc, 0xa4, 0x76, 0xcb, 0xdf, 0x74, 0x45, 0x12, 0x26, 0xee, 0x6b, 0x21, 0x23, 0xdc, + 0xb1, 0x32, 0x79, 0xe1, 0x0a, 0x6d, 0x46, 0x03, 0x46, 0xc0, 0x8e, 0x41, 0x9e, 0x95, 0xc9, 0xd4, + 0x39, 0xa8, 0xb7, 0xe8, 0xe1, 0x3e, 0xb7, 0xe8, 0x1a, 0x4c, 0x08, 0xba, 0x28, 0x76, 0x73, 0x74, + 0xdd, 0x63, 0x45, 0x08, 0x97, 0xb5, 0x87, 0x19, 0xe2, 0xc3, 0xda, 0xf9, 0x4d, 0x4f, 0x63, 0xc2, + 0xba, 0x60, 0xb9, 0xdd, 0xe8, 0xb8, 0x4e, 0x1b, 0xbb, 0x60, 0x34, 0xea, 0x02, 0x2a, 0xc0, 0xbc, + 0x0b, 0x14, 0x24, 0xf2, 0x2e, 0x4c, 0x95, 0x36, 0xaa, 0x2a, 0x59, 0x3e, 0x7a, 0xe5, 0xb5, 0x3b, + 0x8e, 0xa5, 0x91, 0xc6, 0x70, 0xfb, 0xdd, 0x7c, 0xc6, 0xfe, 0x72, 0x6e, 0x3e, 0xc6, 0xbf, 0x98, + 0x90, 0xcb, 0xfb, 0x93, 0x7d, 0x20, 0xd1, 0x9f, 0x3c, 0x72, 0x67, 0x7c, 0xf2, 0x18, 0x3a, 0x4d, + 0x90, 0xd4, 0xe4, 0xdb, 0xe1, 0x33, 0xc9, 0xb7, 0x23, 0x4f, 0xfc, 0x7c, 0x31, 0x7a, 0x46, 0x89, + 0x35, 0xb6, 0xd6, 0xf2, 0x83, 0xac, 0xb5, 0x54, 0x29, 0x77, 0xec, 0xc9, 0xa5, 0x5c, 0x38, 0xb3, + 0x94, 0x5b, 0x8b, 0x7c, 0x97, 0xc7, 0x4f, 0x75, 0x09, 0x79, 0x51, 0x68, 0x05, 0x66, 0xd2, 0xa3, + 0xf0, 0x85, 0x5e, 0xcc, 0xdf, 0x55, 0xa2, 0xf3, 0xd7, 0xd3, 0x45, 0xe7, 0xfe, 0xe7, 0xcd, 0x99, + 0x84, 0xe7, 0x1f, 0x7e, 0xba, 0xc2, 0xf3, 0xd3, 0x7d, 0x08, 0xf9, 0x6b, 0xf1, 0xf9, 0xaf, 0xc5, + 0xe7, 0x01, 0xc5, 0x67, 0x0f, 0x97, 0xd7, 0xb6, 0xed, 0xb5, 0x51, 0xed, 0x74, 0x03, 0x46, 0x65, + 0x18, 0xd2, 0x4c, 0xa4, 0x51, 0x4e, 0xc6, 0x1f, 0x95, 0x58, 0x64, 0x11, 0xf2, 0x92, 0x58, 0x4d, + 0x74, 0x73, 0x28, 0x60, 0x5a, 0x84, 0x47, 0x01, 0x33, 0xfe, 0xbd, 0x21, 0xb9, 0x85, 0xb3, 0x39, + 0xb3, 0x61, 0x7b, 0x76, 0x0b, 0xd3, 0xc8, 0x85, 0x2b, 0x4c, 0x11, 0xde, 0x63, 0x8b, 0x32, 0x66, + 0xda, 0xaf, 0x93, 0x7c, 0xac, 0xc0, 0xb0, 0x51, 0xa6, 0xde, 0xdc, 0x00, 0x99, 0x7a, 0xdf, 0xd6, + 0xd2, 0xdc, 0x0e, 0x45, 0x79, 0x15, 0xd9, 0xb6, 0xd6, 0x3f, 0xc1, 0xed, 0x6d, 0x35, 0x1f, 0xed, + 0x70, 0x14, 0xd5, 0x0b, 0x29, 0xfb, 0x64, 0xa2, 0x0d, 0x6f, 0x23, 0x23, 0x67, 0x09, 0xb9, 0x3c, + 0xfa, 0xaf, 0x35, 0xe4, 0xf2, 0x32, 0x80, 0x38, 0x6a, 0x23, 0xf3, 0x84, 0x57, 0x71, 0xf5, 0x0b, + 0x33, 0xe5, 0x20, 0x68, 0xf6, 0xc8, 0xc9, 0xa1, 0x10, 0x1a, 0x7f, 0x40, 0x60, 0xa6, 0x56, 0x7b, + 0x50, 0x71, 0xec, 0xbd, 0xb6, 0xeb, 0x07, 0x4e, 0xbd, 0xda, 0xde, 0x75, 0x99, 0x28, 0x1e, 0x1e, + 0x07, 0x4a, 0x6c, 0xdd, 0xe8, 0x28, 0x08, 0x8b, 0xd9, 0x55, 0x6f, 0xd9, 0xf3, 0xa4, 0x7e, 0x94, + 0x5f, 0xf5, 0x28, 0x03, 0x98, 0x1c, 0xce, 0xa4, 0xdd, 0x5a, 0x17, 0x23, 0x5b, 0x08, 0x9b, 0x11, + 0x94, 0x76, 0x7d, 0x0e, 0x32, 0x65, 0x19, 0xa1, 0xc9, 0x09, 0x2b, 0x6e, 0x3f, 0x17, 0xb4, 0xc0, + 0xcd, 0x51, 0x31, 0x3f, 0xec, 0x84, 0x30, 0x82, 0xdb, 0x66, 0x07, 0xe1, 0xaa, 0x45, 0x5c, 0x62, + 0x0d, 0x1c, 0xc1, 0x39, 0xcd, 0xe7, 0x79, 0xd0, 0xc7, 0x94, 0xd7, 0x85, 0x74, 0x6d, 0x60, 0x88, + 0x8d, 0x94, 0x17, 0x15, 0x35, 0x2f, 0x5c, 0x6a, 0x0d, 0xec, 0x3c, 0x7b, 0x31, 0xb5, 0x24, 0x5c, + 0xdd, 0xe3, 0x5a, 0xf0, 0x6c, 0x65, 0xd3, 0xe0, 0x19, 0xf0, 0x7a, 0x55, 0x6d, 0xa5, 0x6c, 0x05, + 0xfd, 0x6b, 0x22, 0xbf, 0x99, 0x81, 0x0b, 0x1a, 0x46, 0xb8, 0x5d, 0xf9, 0x61, 0x38, 0x90, 0xd4, + 0x79, 0xfd, 0xd1, 0xd3, 0x99, 0xd7, 0x2f, 0xeb, 0x6d, 0x89, 0x36, 0x54, 0xb5, 0x0d, 0xbd, 0xbe, + 0x90, 0x3c, 0x82, 0x19, 0x2c, 0x92, 0x0f, 0x3b, 0x6c, 0xce, 0x8a, 0xf7, 0xa0, 0xb9, 0xe8, 0xb3, + 0xb9, 0x1f, 0x3f, 0x66, 0x31, 0x5f, 0xfc, 0xf6, 0x71, 0x71, 0x52, 0x43, 0x97, 0xe1, 0xa8, 0xad, + 0xe8, 0x75, 0xc8, 0x69, 0xef, 0xba, 0x5a, 0x8a, 0xfa, 0x78, 0x15, 0xe4, 0xbf, 0xcc, 0xf0, 0xe7, + 0x04, 0xde, 0x8c, 0x3b, 0x9e, 0xdb, 0x0a, 0xcb, 0xa5, 0x69, 0x65, 0x8f, 0x6e, 0x6b, 0x3e, 0x9d, + 0x6e, 0x7b, 0x15, 0x3f, 0x99, 0xef, 0x09, 0xd6, 0xae, 0xe7, 0xb6, 0xa2, 0xcf, 0x57, 0x3b, 0xae, + 0xe7, 0x47, 0x92, 0xef, 0xcf, 0xc0, 0x45, 0x4d, 0xab, 0xa9, 0xe6, 0x06, 0x11, 0xd1, 0x12, 0x66, + 0xc3, 0x38, 0x2a, 0x51, 0xd1, 0xd2, 0x75, 0x31, 0xff, 0xaf, 0xe0, 0x17, 0x28, 0x61, 0x3b, 0x19, + 0x92, 0xd5, 0xe2, 0x58, 0xca, 0x27, 0xf4, 0xae, 0x85, 0x38, 0x30, 0x83, 0x56, 0x36, 0x9a, 0x09, + 0xf0, 0x5c, 0x6f, 0x13, 0xe0, 0x30, 0xeb, 0x0f, 0x66, 0x04, 0xe8, 0x6d, 0x07, 0x9c, 0xe4, 0x4a, + 0xbe, 0x17, 0x2e, 0x26, 0x80, 0xe1, 0x6a, 0x3b, 0xd7, 0x73, 0xb5, 0x7d, 0xea, 0xe4, 0xb8, 0xf8, + 0x5a, 0x5a, 0x6d, 0x69, 0x2b, 0xad, 0x77, 0x0d, 0xc4, 0x06, 0x88, 0x0a, 0x85, 0xf8, 0x91, 0x3e, + 0x41, 0x3f, 0x25, 0xe6, 0x87, 0x82, 0xcf, 0xf6, 0x72, 0xe5, 0x1b, 0xd4, 0x23, 0x2f, 0x42, 0x22, + 0x14, 0x26, 0x94, 0x6c, 0x08, 0x47, 0xc2, 0xd8, 0xa3, 0x47, 0x25, 0xdf, 0x3e, 0x2e, 0x6a, 0xd8, + 0xec, 0x42, 0xa4, 0xa6, 0x59, 0xd0, 0xa4, 0x3d, 0x15, 0x91, 0xfc, 0x5a, 0x06, 0xe6, 0x18, 0x20, + 0x9a, 0x54, 0xa2, 0x51, 0xf3, 0xfd, 0x66, 0xfd, 0xfe, 0xd3, 0x99, 0xf5, 0x2f, 0xe1, 0x37, 0xaa, + 0xb3, 0x3e, 0xd1, 0x25, 0xa9, 0x1f, 0x87, 0xb3, 0x5d, 0x33, 0xe8, 0xd2, 0x66, 0xfb, 0xc5, 0x01, + 0x66, 0x3b, 0x1f, 0x80, 0xd3, 0x67, 0x7b, 0xcf, 0x5a, 0xc8, 0x26, 0x4c, 0x88, 0xbb, 0x10, 0xef, + 0xb0, 0x4b, 0x5a, 0x18, 0x67, 0xb5, 0x88, 0x5f, 0x50, 0x45, 0xb2, 0x88, 0x44, 0x0b, 0x35, 0x2e, + 0xa4, 0x0d, 0xb3, 0xfc, 0xb7, 0xae, 0x9b, 0x2a, 0xf6, 0xd4, 0x4d, 0x5d, 0x15, 0x2d, 0xba, 0x2c, + 0xf8, 0xc7, 0x54, 0x54, 0x6a, 0xf8, 0xa5, 0x14, 0xc6, 0xa4, 0x03, 0x44, 0x03, 0xf3, 0x45, 0x7b, + 0xb9, 0xbf, 0x46, 0xea, 0x35, 0x51, 0x67, 0x31, 0x5e, 0x67, 0x7c, 0xe5, 0xa6, 0xf0, 0x26, 0x36, + 0x4c, 0x0b, 0xa8, 0x7b, 0x40, 0xf9, 0x0e, 0xff, 0x92, 0x16, 0x00, 0x2b, 0x56, 0xca, 0x2f, 0x51, + 0xb2, 0x26, 0x0c, 0x50, 0x16, 0xdb, 0xd0, 0xe3, 0xfc, 0xc8, 0x03, 0x98, 0x29, 0x75, 0x3a, 0x4d, + 0x87, 0x36, 0xb0, 0x95, 0x66, 0x97, 0xb5, 0xc9, 0x88, 0xf2, 0xad, 0xd9, 0xbc, 0x50, 0xdc, 0xec, + 0xbc, 0x6e, 0x6c, 0xbb, 0x49, 0xd0, 0x1a, 0x3f, 0x94, 0x49, 0x7c, 0x34, 0x79, 0x03, 0xc6, 0xf0, + 0x87, 0x12, 0x53, 0x05, 0x55, 0x3c, 0xfc, 0x13, 0x51, 0x79, 0x14, 0x21, 0x30, 0x61, 0x49, 0x8d, + 0xab, 0x98, 0xe3, 0xc2, 0x92, 0xd0, 0x2b, 0x44, 0x9a, 0x84, 0xa2, 0x74, 0xcd, 0xc8, 0x45, 0x42, + 0x17, 0xba, 0x66, 0x08, 0x87, 0x0c, 0xe3, 0xfb, 0xb3, 0xfa, 0xb4, 0x23, 0x57, 0x15, 0xb9, 0x5d, + 0x89, 0xec, 0x28, 0xe5, 0x76, 0x45, 0x5a, 0xff, 0x87, 0x19, 0x98, 0x7d, 0xe0, 0xed, 0xd9, 0x6d, + 0xe7, 0x9b, 0x3c, 0x8c, 0xb6, 0x8b, 0xe3, 0xd2, 0x3f, 0x75, 0xe5, 0xd3, 0x4a, 0xc1, 0xe7, 0x2a, + 0x15, 0xb3, 0x99, 0x82, 0x53, 0xc6, 0x4c, 0xfb, 0x1e, 0x74, 0x76, 0xc3, 0x0f, 0x53, 0x32, 0x21, + 0x72, 0x74, 0x0e, 0x37, 0x7e, 0x2c, 0x0b, 0xe3, 0xca, 0x12, 0x20, 0x9f, 0x81, 0x09, 0x95, 0x8f, + 0xaa, 0xf0, 0x53, 0xab, 0x35, 0x35, 0x2c, 0xd4, 0xf8, 0x51, 0xbb, 0xa5, 0x69, 0xfc, 0xd8, 0x44, + 0x47, 0xe8, 0x19, 0xaf, 0x36, 0x1f, 0xa4, 0x5c, 0x6d, 0x70, 0xda, 0x2a, 0x1a, 0x9b, 0xbe, 0x17, + 0x9c, 0x77, 0x93, 0x17, 0x1c, 0x54, 0x1e, 0x29, 0xf4, 0xbd, 0xaf, 0x39, 0xc6, 0x4f, 0x66, 0xa0, + 0x10, 0x5f, 0xa4, 0x9f, 0x48, 0xaf, 0x9c, 0xe1, 0x75, 0xe7, 0x47, 0xb3, 0x61, 0x2a, 0x14, 0xe9, + 0xc2, 0xfb, 0xac, 0x9a, 0x09, 0xbe, 0xa7, 0x3d, 0xbc, 0x3c, 0xaf, 0x47, 0xa3, 0x53, 0x83, 0x5f, + 0xa4, 0x87, 0xa0, 0x1c, 0xfa, 0xd9, 0x5f, 0x28, 0x3e, 0x67, 0x7c, 0x08, 0x73, 0xf1, 0xee, 0xc0, + 0xc7, 0x97, 0x12, 0x4c, 0xeb, 0xf0, 0x78, 0x22, 0xa5, 0x38, 0x95, 0x19, 0xc7, 0x37, 0xfe, 0x28, + 0x1b, 0xe7, 0x2d, 0x4c, 0x06, 0xd9, 0xa6, 0xa3, 0x1a, 0xc2, 0x88, 0x4d, 0x87, 0x83, 0x4c, 0x59, + 0x76, 0x96, 0x04, 0x66, 0xa1, 0x23, 0x6a, 0x2e, 0xdd, 0x11, 0x95, 0xdc, 0x8e, 0x59, 0x49, 0x2b, + 0x51, 0x93, 0x0e, 0xe9, 0x8e, 0x15, 0x59, 0x4a, 0xc7, 0x8c, 0xa3, 0xcb, 0x30, 0xa7, 0x85, 0x00, + 0x97, 0xf4, 0xc3, 0x91, 0xae, 0x3d, 0xc0, 0x02, 0x4e, 0x9c, 0x8a, 0x4c, 0x56, 0x60, 0x94, 0x7d, + 0xe6, 0x9a, 0xdd, 0x11, 0x6f, 0x2a, 0x24, 0x74, 0x4b, 0x6f, 0x86, 0x17, 0x3e, 0xc5, 0x33, 0xbd, + 0x49, 0xd9, 0x91, 0xaf, 0x4e, 0x2c, 0x81, 0x68, 0xfc, 0xf3, 0x0c, 0x5b, 0xff, 0xf5, 0x83, 0xef, + 0xb2, 0x2c, 0x68, 0xac, 0x49, 0x7d, 0x2c, 0x5a, 0xff, 0x24, 0xcb, 0x73, 0xe1, 0x88, 0xe9, 0xf3, + 0x36, 0x8c, 0x6c, 0xda, 0xde, 0x9e, 0xc8, 0x1a, 0xad, 0x73, 0xe1, 0x05, 0x51, 0x4c, 0xa7, 0x00, + 0x7f, 0x9b, 0x82, 0x40, 0xd5, 0x85, 0x65, 0x07, 0xd2, 0x85, 0x29, 0x7a, 0xf9, 0xdc, 0x53, 0xd3, + 0xcb, 0x7f, 0x4f, 0x98, 0xf6, 0xa6, 0x14, 0x0c, 0x10, 0x61, 0xfa, 0x72, 0x3c, 0x6d, 0x54, 0x22, + 0x16, 0x78, 0xc4, 0x8e, 0xdc, 0x56, 0x13, 0x51, 0x29, 0xbe, 0x9d, 0xa7, 0xa4, 0x9c, 0x32, 0xfe, + 0x24, 0xc7, 0xfb, 0x58, 0x74, 0xd4, 0x15, 0xcd, 0xef, 0x1b, 0xd7, 0x09, 0xdb, 0xe8, 0xd5, 0x10, + 0x1c, 0x68, 0x36, 0x75, 0x05, 0x86, 0xd8, 0xdc, 0x14, 0xbd, 0x89, 0x78, 0x6c, 0xfe, 0xaa, 0x78, + 0xac, 0x9c, 0xad, 0x65, 0x3c, 0x93, 0xd4, 0x0c, 0x83, 0x78, 0x6c, 0xa9, 0x6b, 0x19, 0x31, 0xc8, + 0x55, 0x18, 0x5a, 0x77, 0x1b, 0x32, 0x92, 0xf9, 0x1c, 0x46, 0xff, 0xd0, 0x52, 0x98, 0xce, 0x67, + 0x4c, 0xc4, 0x60, 0x6d, 0x0d, 0xf3, 0x3f, 0xa8, 0x6d, 0x6d, 0xed, 0xda, 0xc9, 0xcc, 0x71, 0x4a, + 0xd2, 0x99, 0x65, 0x98, 0xd2, 0xf3, 0xf5, 0x0b, 0x7b, 0x5f, 0xd4, 0xae, 0xc7, 0xd2, 0xfe, 0xab, + 0xcf, 0x22, 0x3a, 0x11, 0x59, 0x82, 0x49, 0x2d, 0x82, 0xaa, 0x78, 0xdc, 0x44, 0xf5, 0xa6, 0x1e, + 0x7f, 0x55, 0x55, 0x6f, 0x6a, 0x24, 0xec, 0x3c, 0x17, 0xdf, 0xaf, 0x3c, 0x71, 0x26, 0xbe, 0x5d, + 0xe0, 0x90, 0x5b, 0x90, 0xe7, 0x61, 0x36, 0xaa, 0x15, 0xf5, 0x99, 0xca, 0x47, 0x58, 0x2c, 0x4c, + 0x8d, 0x44, 0x54, 0xc2, 0x2a, 0x7c, 0x1a, 0x0a, 0x62, 0x4b, 0x8a, 0x92, 0x9f, 0xbf, 0x00, 0x43, + 0xe5, 0x6a, 0xc5, 0x54, 0xb7, 0x91, 0xba, 0xd3, 0xf0, 0x4c, 0x84, 0xa2, 0x57, 0xdd, 0x3a, 0x0d, + 0x0e, 0x5d, 0xef, 0xc0, 0xa4, 0x7e, 0xe0, 0x39, 0x3c, 0x41, 0x25, 0x2e, 0xc4, 0xcf, 0x90, 0x77, + 0x61, 0x18, 0x0d, 0x4f, 0x63, 0x27, 0x43, 0xbc, 0x8e, 0xa5, 0x49, 0x31, 0x81, 0x87, 0xd1, 0x8a, + 0xd5, 0xe4, 0x44, 0xe4, 0x6d, 0x18, 0xaa, 0xd0, 0xf6, 0x51, 0x2c, 0x77, 0x5e, 0x82, 0x38, 0xdc, + 0x10, 0x1a, 0xb4, 0x7d, 0x64, 0x22, 0x89, 0xf1, 0x93, 0x59, 0x38, 0x97, 0xf2, 0x59, 0x0f, 0x3f, + 0xf3, 0x8c, 0xee, 0x8a, 0x4b, 0xda, 0xae, 0x28, 0xdf, 0xa7, 0x7b, 0x76, 0x7c, 0xea, 0x26, 0xf9, + 0x73, 0x19, 0xb8, 0xa0, 0x4f, 0x50, 0x61, 0x69, 0xfe, 0xf0, 0x16, 0x79, 0x07, 0x46, 0x56, 0xa8, + 0xdd, 0xa0, 0x32, 0xaf, 0xd6, 0xb9, 0x30, 0x20, 0x1e, 0x8f, 0x21, 0xc0, 0x0b, 0x39, 0xdb, 0xc8, + 0xe3, 0x94, 0x43, 0x49, 0x45, 0x7c, 0x1c, 0x97, 0xc7, 0x0d, 0x19, 0xcf, 0x23, 0xad, 0xaa, 0x3e, + 0x56, 0x1e, 0xdf, 0xce, 0xc0, 0xf3, 0x7d, 0x68, 0xd8, 0xc0, 0xb1, 0xa1, 0x57, 0x07, 0x0e, 0x4f, + 0x54, 0x84, 0x92, 0xf7, 0x61, 0x7a, 0x53, 0xc8, 0xf3, 0x72, 0x38, 0xb2, 0xd1, 0x7a, 0x91, 0xa2, + 0xbe, 0x25, 0xc7, 0x25, 0x8e, 0xac, 0x05, 0x9a, 0xc9, 0xf5, 0x0d, 0x34, 0xa3, 0xc6, 0x6d, 0x19, + 0x1a, 0x34, 0x6e, 0xcb, 0x87, 0x30, 0xa7, 0xb7, 0x4d, 0x84, 0xcf, 0x8d, 0xa2, 0xd6, 0x64, 0x7a, + 0x47, 0xad, 0xe9, 0x1b, 0xa4, 0xd3, 0xf8, 0xb1, 0x0c, 0x14, 0x74, 0xde, 0x4f, 0x3a, 0x9e, 0xef, + 0x69, 0xe3, 0xf9, 0x7c, 0xfa, 0x78, 0xf6, 0x1e, 0xc8, 0xff, 0x2b, 0x13, 0x6f, 0xec, 0x40, 0x23, + 0x68, 0xc0, 0x48, 0xc5, 0x6d, 0xd9, 0x4e, 0x5b, 0xcd, 0xa5, 0xdf, 0x40, 0x88, 0x29, 0x4a, 0x06, + 0x0b, 0xf2, 0x73, 0x19, 0x86, 0xd7, 0xdd, 0x76, 0xa9, 0x22, 0x4c, 0x7a, 0x91, 0x4f, 0xdb, 0x6d, + 0x5b, 0x76, 0xc3, 0xe4, 0x05, 0x64, 0x15, 0xa0, 0x56, 0xf7, 0x28, 0x6d, 0xd7, 0x9c, 0x6f, 0xd2, + 0x98, 0xa4, 0xc1, 0x7a, 0xa8, 0xd9, 0xc5, 0x8d, 0x85, 0x3f, 0x5d, 0x22, 0xa2, 0xe5, 0x3b, 0xdf, + 0x54, 0xf7, 0x5b, 0x85, 0x1e, 0xd7, 0x95, 0x88, 0x83, 0x16, 0x1b, 0x87, 0x9b, 0x9f, 0xc4, 0xba, + 0x4a, 0xad, 0x0a, 0x7b, 0xf8, 0x66, 0xea, 0x70, 0xfc, 0x61, 0x06, 0x9e, 0xef, 0x43, 0xf3, 0x14, + 0x46, 0xe5, 0x2f, 0xbb, 0xc3, 0x29, 0x40, 0x44, 0x84, 0xa9, 0x89, 0x9d, 0x46, 0xc0, 0x73, 0xe5, + 0x4d, 0x8a, 0xd4, 0xc4, 0x0c, 0xa0, 0xa5, 0x26, 0x66, 0x00, 0x76, 0x96, 0xae, 0x50, 0x67, 0x6f, + 0x9f, 0x9b, 0x67, 0x4d, 0xf2, 0xbd, 0x61, 0x1f, 0x21, 0xea, 0x59, 0xca, 0x71, 0x8c, 0x7f, 0x39, + 0x0c, 0x17, 0x4d, 0xba, 0xe7, 0xb0, 0x7b, 0xc9, 0x96, 0xef, 0xb4, 0xf7, 0xb4, 0xb8, 0x37, 0x46, + 0x6c, 0xe5, 0x8a, 0x24, 0x11, 0x0c, 0x12, 0xce, 0xc4, 0x6b, 0x90, 0x67, 0x62, 0x88, 0xb2, 0x78, + 0xf1, 0xd1, 0x8a, 0x09, 0x2b, 0x22, 0xb0, 0xb2, 0x2c, 0x26, 0xaf, 0x0b, 0x31, 0x49, 0x49, 0xe3, + 0xc3, 0xc4, 0xa4, 0xef, 0x1c, 0x17, 0xa1, 0x76, 0xe4, 0x07, 0x14, 0xaf, 0xc8, 0x42, 0x54, 0x0a, + 0xef, 0x32, 0x43, 0x3d, 0xee, 0x32, 0x6b, 0x30, 0x57, 0x6a, 0xf0, 0xd3, 0xd1, 0x6e, 0x6e, 0x78, + 0x4e, 0xbb, 0xee, 0x74, 0xec, 0xa6, 0xbc, 0x9f, 0x63, 0x2f, 0xdb, 0x61, 0xb9, 0xd5, 0x09, 0x11, + 0xcc, 0x54, 0x32, 0xd6, 0x8c, 0xca, 0x7a, 0x0d, 0xc3, 0xc3, 0x88, 0xf7, 0x48, 0x6c, 0x46, 0xa3, + 0xed, 0x63, 0x2b, 0x7c, 0x33, 0x2c, 0xc6, 0x5b, 0x14, 0x3e, 0xc8, 0x6f, 0xae, 0xd6, 0x22, 0x97, + 0x66, 0x9e, 0x65, 0x80, 0x3f, 0xec, 0x07, 0x4d, 0x1f, 0x4d, 0x21, 0x35, 0xbc, 0x88, 0xae, 0x56, + 0x5b, 0x61, 0x74, 0xf9, 0x04, 0x9d, 0xef, 0xef, 0xab, 0x74, 0x1c, 0x8f, 0xdc, 0x60, 0x53, 0xa1, + 0xe5, 0x06, 0x14, 0xa7, 0xf0, 0x58, 0x74, 0xe7, 0xf2, 0x10, 0xca, 0xef, 0x5c, 0x0a, 0x0a, 0x79, + 0x17, 0x66, 0x97, 0xcb, 0x8b, 0x52, 0x8b, 0x5c, 0x71, 0xeb, 0x5d, 0x7c, 0x88, 0x07, 0xac, 0x0f, + 0xc7, 0x90, 0xd6, 0x17, 0xd9, 0x6e, 0x92, 0x86, 0x46, 0xae, 0xc0, 0x68, 0xb5, 0xc2, 0xfb, 0x7e, + 0x5c, 0x4d, 0xa5, 0x25, 0x2c, 0xa3, 0x64, 0x21, 0x79, 0x10, 0x5d, 0x0a, 0x26, 0x4e, 0x95, 0xde, + 0x2f, 0x0e, 0x70, 0x21, 0x78, 0x1b, 0x26, 0x97, 0xdc, 0xa0, 0xda, 0xf6, 0x03, 0xbb, 0x5d, 0xa7, + 0xd5, 0x8a, 0x1a, 0xd7, 0x7a, 0xc7, 0x0d, 0x2c, 0x47, 0x94, 0xb0, 0x2f, 0xd7, 0x31, 0xc9, 0xe7, + 0x90, 0xf4, 0x2e, 0x6d, 0x53, 0x2f, 0x8a, 0x67, 0x3d, 0xcc, 0xfb, 0x96, 0x91, 0xee, 0x85, 0x25, + 0xa6, 0x8e, 0x28, 0xd2, 0x7c, 0xf1, 0xe4, 0x9c, 0x65, 0xb7, 0x41, 0x7d, 0xbe, 0x5b, 0x7c, 0x17, + 0xa5, 0xf9, 0x52, 0xda, 0xd6, 0x67, 0x07, 0xfd, 0xb7, 0x30, 0xcd, 0x57, 0x02, 0x97, 0x7c, 0x0e, + 0x86, 0xf1, 0xa7, 0x90, 0x6e, 0x67, 0x53, 0xd8, 0x46, 0x92, 0x6d, 0x9d, 0x61, 0x9a, 0x9c, 0x80, + 0x54, 0x61, 0x54, 0x5c, 0xac, 0xce, 0x92, 0xac, 0x46, 0xdc, 0xd0, 0xf8, 0xcc, 0x10, 0xf4, 0x46, + 0x03, 0x26, 0xd4, 0x0a, 0xd9, 0x8a, 0x58, 0xb1, 0xfd, 0x7d, 0xda, 0x60, 0xbf, 0x44, 0x9e, 0x39, + 0x5c, 0x11, 0xfb, 0x08, 0xb5, 0xd8, 0x77, 0x98, 0x0a, 0x0a, 0x3b, 0x53, 0xab, 0xfe, 0x96, 0x2f, + 0x3e, 0x45, 0xa8, 0x5a, 0x1c, 0x54, 0xdb, 0x35, 0x4c, 0x51, 0x64, 0x7c, 0x0f, 0xcc, 0xad, 0x77, + 0x9b, 0x4d, 0x7b, 0xa7, 0x49, 0x65, 0x1e, 0x12, 0xcc, 0xe0, 0xbd, 0x04, 0xc3, 0x35, 0x25, 0x27, + 0x78, 0x98, 0x0b, 0x52, 0xc1, 0x41, 0x23, 0xd4, 0x0c, 0x86, 0xea, 0x89, 0x65, 0x03, 0xe7, 0xa4, + 0xc6, 0xef, 0x67, 0x60, 0x4e, 0xbe, 0xff, 0x7b, 0x76, 0xfd, 0x20, 0x4c, 0x0c, 0x7f, 0x45, 0x9b, + 0x6b, 0x38, 0x61, 0x63, 0xd3, 0x88, 0xcf, 0xba, 0x7b, 0xf2, 0x23, 0x74, 0x81, 0x25, 0xed, 0x83, + 0x4f, 0xfb, 0x18, 0xf2, 0x2e, 0x8c, 0x8b, 0xe3, 0x51, 0x09, 0x30, 0x89, 0x51, 0xbc, 0xc4, 0x75, + 0x2f, 0x6e, 0x8d, 0xa2, 0xa2, 0xa3, 0x2c, 0xa6, 0x37, 0xe5, 0x49, 0x65, 0x80, 0x74, 0x59, 0x4c, + 0xaf, 0xa3, 0xcf, 0xd4, 0xfd, 0xed, 0xf1, 0x78, 0xdf, 0x8a, 0xb9, 0x7b, 0x5b, 0x0d, 0x29, 0x97, + 0x89, 0x6e, 0xc6, 0x51, 0x48, 0x39, 0xf5, 0x66, 0x1c, 0xa2, 0x86, 0x63, 0x92, 0x3d, 0x65, 0x4c, + 0xde, 0x97, 0x63, 0x92, 0xeb, 0x3d, 0x31, 0x66, 0xfb, 0x8c, 0x43, 0x2d, 0x5a, 0x21, 0x43, 0x03, + 0xa9, 0x55, 0x9e, 0xc3, 0xd8, 0xf9, 0x9c, 0x24, 0xbe, 0x8b, 0x0a, 0x4e, 0xaa, 0xae, 0x66, 0x78, + 0x70, 0xa6, 0xa7, 0x6c, 0xcd, 0x9f, 0x87, 0x89, 0x52, 0x10, 0xd8, 0xf5, 0x7d, 0xda, 0xa8, 0xb0, + 0xed, 0x49, 0x89, 0x7e, 0x65, 0x0b, 0xb8, 0xfa, 0x68, 0xa6, 0xe2, 0xf2, 0x68, 0xae, 0xb6, 0x2f, + 0x8c, 0x59, 0xc3, 0x68, 0xae, 0x0c, 0xa2, 0x47, 0x73, 0x65, 0x10, 0x72, 0x03, 0x46, 0xab, 0xed, + 0x47, 0x0e, 0xeb, 0x13, 0x1e, 0x00, 0x0b, 0x75, 0x53, 0x0e, 0x07, 0xa9, 0x9b, 0xab, 0xc0, 0x22, + 0x6f, 0x2b, 0x97, 0x9a, 0xb1, 0x48, 0x81, 0xc1, 0x55, 0x5e, 0x61, 0x84, 0x1b, 0xf5, 0xc2, 0x12, + 0xde, 0x72, 0x6e, 0xc3, 0xa8, 0xd4, 0x64, 0x42, 0xa4, 0xb4, 0x10, 0x94, 0xc9, 0x80, 0x11, 0x12, + 0x19, 0x93, 0x7c, 0x2b, 0xf9, 0xf2, 0xc6, 0x95, 0x24, 0xdf, 0x4a, 0xbe, 0x3c, 0x2d, 0xc9, 0xb7, + 0x92, 0x39, 0x2f, 0x54, 0x02, 0x4d, 0x9c, 0xaa, 0x04, 0x7a, 0x08, 0x13, 0x1b, 0xb6, 0x17, 0x38, + 0x4c, 0x46, 0x69, 0x07, 0xfe, 0xfc, 0xa4, 0xa6, 0x37, 0x55, 0x8a, 0x96, 0x2e, 0xc9, 0xbc, 0xd4, + 0x1d, 0x05, 0x5f, 0x4f, 0xa0, 0x1c, 0xc1, 0xd3, 0x4d, 0x59, 0xa7, 0x9e, 0xc4, 0x94, 0x15, 0x3b, + 0x15, 0x75, 0x65, 0xd3, 0x91, 0x46, 0x06, 0x2f, 0x2d, 0x31, 0x85, 0x59, 0x88, 0x48, 0xbe, 0x02, + 0x13, 0xec, 0xef, 0x0d, 0xb7, 0xe9, 0xd4, 0x1d, 0xea, 0xcf, 0x17, 0xb0, 0x71, 0x97, 0x52, 0x57, + 0x3f, 0x22, 0x1d, 0xd5, 0x68, 0xc0, 0x17, 0x30, 0x32, 0x8e, 0x2b, 0xc1, 0x35, 0x6e, 0xe4, 0x03, + 0x98, 0x60, 0xb3, 0x6f, 0xc7, 0xf6, 0xb9, 0x68, 0x3a, 0x13, 0x19, 0x23, 0x37, 0x04, 0x3c, 0x11, + 0x50, 0x59, 0x25, 0x60, 0xc7, 0x7c, 0xa9, 0xc3, 0x37, 0x48, 0xa2, 0xcc, 0xf6, 0x4e, 0x62, 0x73, + 0x94, 0x68, 0xe4, 0x0b, 0x30, 0x51, 0xea, 0x74, 0xa2, 0x1d, 0x67, 0x56, 0x51, 0x84, 0x75, 0x3a, + 0x56, 0xea, 0xae, 0xa3, 0x51, 0xc4, 0x37, 0xe6, 0xb9, 0x33, 0x6d, 0xcc, 0xe4, 0xcd, 0x50, 0x5a, + 0x3f, 0x17, 0x69, 0x75, 0xc5, 0xc5, 0x51, 0x13, 0xfd, 0xb9, 0xe0, 0x5e, 0x86, 0x49, 0xae, 0xe6, + 0x94, 0xd2, 0xcc, 0xf9, 0xc4, 0xea, 0x49, 0x11, 0x6a, 0x74, 0x1a, 0xb2, 0x0c, 0x53, 0xdc, 0xdb, + 0xba, 0x29, 0x22, 0x5d, 0xcf, 0x5f, 0xc0, 0x55, 0x8b, 0x5c, 0xb8, 0x93, 0x76, 0x13, 0x13, 0xa0, + 0xd8, 0x1a, 0x97, 0x18, 0x91, 0xf1, 0xa7, 0x19, 0xb8, 0xd0, 0x63, 0xc4, 0xc3, 0x38, 0xc8, 0x99, + 0xfe, 0x71, 0x90, 0xd9, 0xce, 0xa1, 0x6b, 0x45, 0xb0, 0xfd, 0x42, 0xca, 0x52, 0xc7, 0x4b, 0xca, + 0x5b, 0x2e, 0x10, 0x91, 0x63, 0x48, 0x54, 0x7d, 0xcf, 0x45, 0xd5, 0x6c, 0x2e, 0x79, 0x08, 0x09, + 0x3c, 0xfe, 0x51, 0x4b, 0xc6, 0xc9, 0x71, 0xf1, 0x92, 0x48, 0x61, 0x14, 0x0e, 0xeb, 0x47, 0xae, + 0xb6, 0x82, 0x53, 0x58, 0x1b, 0xc7, 0x19, 0x18, 0x57, 0xd6, 0x21, 0xb9, 0xac, 0x78, 0x01, 0x17, + 0x78, 0x12, 0x2c, 0x85, 0x43, 0x96, 0x9f, 0x44, 0xb8, 0xa8, 0xb2, 0xa7, 0x2b, 0xa0, 0xd7, 0x98, + 0x28, 0xa4, 0xc4, 0x8a, 0x6e, 0x69, 0xda, 0x62, 0x13, 0xcb, 0x31, 0x9d, 0xbe, 0xed, 0x07, 0xa5, + 0x7a, 0xe0, 0x3c, 0xa2, 0x03, 0x1c, 0x3a, 0x51, 0x3a, 0x7d, 0xdb, 0x0f, 0x2c, 0x1b, 0xc9, 0x12, + 0xe9, 0xf4, 0x43, 0x86, 0xc6, 0xdf, 0xca, 0x00, 0x6c, 0x55, 0xcb, 0x18, 0xec, 0xfd, 0x49, 0x85, + 0x82, 0xf4, 0x00, 0xba, 0x92, 0x7b, 0x1f, 0x71, 0xe0, 0x7f, 0xcc, 0xc0, 0x94, 0x8e, 0x46, 0xde, + 0x87, 0xe9, 0x5a, 0xdd, 0x73, 0x9b, 0xcd, 0x1d, 0xbb, 0x7e, 0xb0, 0xea, 0xb4, 0x29, 0x0f, 0x5d, + 0x3a, 0xcc, 0xcf, 0x22, 0x3f, 0x2c, 0xb2, 0x9a, 0xac, 0xcc, 0x8c, 0x23, 0x93, 0x1f, 0xc8, 0xc0, + 0x64, 0x6d, 0xdf, 0x3d, 0x0c, 0xa3, 0x8d, 0x8a, 0x01, 0xf9, 0x2a, 0x5b, 0xdb, 0xfe, 0xbe, 0x7b, + 0x18, 0x65, 0xd0, 0xd4, 0x8c, 0x3f, 0xdf, 0x1b, 0xec, 0x5d, 0xbe, 0xee, 0xe2, 0x4d, 0x26, 0xf0, + 0xaf, 0x6b, 0x95, 0x98, 0x7a, 0x9d, 0xc6, 0x5f, 0x64, 0x60, 0x1c, 0xef, 0x3c, 0xcd, 0x26, 0xca, + 0x5c, 0xdf, 0x4d, 0xe9, 0x18, 0xc3, 0x76, 0xf5, 0x19, 0xd8, 0xb7, 0x60, 0x3a, 0x86, 0x46, 0x0c, + 0x18, 0xa9, 0xa1, 0x83, 0xbf, 0xaa, 0xa0, 0xe0, 0x2e, 0xff, 0xa6, 0x28, 0x31, 0x96, 0x15, 0xb2, + 0x87, 0x37, 0xf1, 0x59, 0x77, 0x11, 0xc0, 0x91, 0x20, 0x79, 0xb3, 0x21, 0xf1, 0x2f, 0x79, 0x78, + 0xd3, 0x54, 0xb0, 0x8c, 0x75, 0x18, 0xa9, 0xb9, 0x5e, 0xb0, 0x74, 0xc4, 0x2f, 0x13, 0x15, 0xea, + 0xd7, 0xd5, 0x77, 0x5b, 0x07, 0xdf, 0x4a, 0xea, 0xa6, 0x28, 0x22, 0x45, 0x18, 0xbe, 0xe3, 0xd0, + 0x66, 0x43, 0x35, 0xd0, 0xdd, 0x65, 0x00, 0x93, 0xc3, 0xd9, 0x85, 0xeb, 0x7c, 0x94, 0x13, 0x25, + 0xb2, 0x04, 0x7e, 0xd2, 0x75, 0x53, 0xd6, 0xfa, 0xf7, 0xa5, 0x30, 0x0f, 0x41, 0xb2, 0xa6, 0x3e, + 0x5d, 0xfd, 0x1f, 0x66, 0x60, 0xa1, 0x37, 0x89, 0x6a, 0x5c, 0x9c, 0xe9, 0x63, 0x5c, 0xfc, 0x6a, + 0xfc, 0x9d, 0x11, 0xd1, 0xc4, 0x3b, 0x63, 0xf4, 0xba, 0x58, 0x41, 0xdb, 0xee, 0x3a, 0x95, 0x89, + 0x50, 0x2e, 0xf7, 0xf9, 0x66, 0x44, 0xe4, 0xc3, 0x1c, 0x20, 0x8d, 0x29, 0x68, 0x8d, 0xdf, 0x1a, + 0x82, 0x8b, 0x3d, 0x29, 0xc8, 0x8a, 0x92, 0x5e, 0x69, 0x2a, 0x4c, 0xec, 0xd2, 0x13, 0xff, 0x3a, + 0xfe, 0x8b, 0xe6, 0x7b, 0x71, 0x6f, 0xb3, 0x07, 0x61, 0x5a, 0x9d, 0x2c, 0xf2, 0xfa, 0xd4, 0xa9, + 0xbc, 0x38, 0x3a, 0x32, 0x83, 0x64, 0x86, 0x1d, 0xf4, 0x4b, 0xa4, 0x81, 0xed, 0x34, 0x7d, 0x75, + 0xd9, 0x35, 0x38, 0xc8, 0x94, 0x65, 0x91, 0xc5, 0xf7, 0x50, 0xba, 0xc5, 0xb7, 0xf1, 0x2f, 0x33, + 0x30, 0x16, 0x7e, 0x36, 0x59, 0x80, 0xf3, 0x9b, 0x66, 0xa9, 0xbc, 0x6c, 0x6d, 0x7e, 0xb8, 0xb1, + 0x6c, 0x6d, 0xad, 0xd7, 0x36, 0x96, 0xcb, 0xd5, 0x3b, 0xd5, 0xe5, 0x4a, 0xe1, 0x39, 0x32, 0x03, + 0x93, 0x5b, 0xeb, 0xf7, 0xd7, 0x1f, 0x6c, 0xaf, 0x5b, 0xcb, 0xa6, 0xf9, 0xc0, 0x2c, 0x64, 0xc8, + 0x24, 0x8c, 0x99, 0x4b, 0xa5, 0xb2, 0xb5, 0xfe, 0xa0, 0xb2, 0x5c, 0xc8, 0x92, 0x02, 0x4c, 0x94, + 0x1f, 0xac, 0xaf, 0x2f, 0x97, 0x37, 0xab, 0x0f, 0xab, 0x9b, 0x1f, 0x16, 0x72, 0x84, 0xc0, 0x14, + 0x22, 0x6c, 0x98, 0xd5, 0xf5, 0x72, 0x75, 0xa3, 0xb4, 0x5a, 0x18, 0x62, 0x30, 0x86, 0xaf, 0xc0, + 0x86, 0x43, 0x46, 0xf7, 0xb7, 0x96, 0x96, 0x0b, 0x23, 0x0c, 0x85, 0xfd, 0xa5, 0xa0, 0x8c, 0xb2, + 0xea, 0x11, 0xa5, 0x52, 0xda, 0x2c, 0x2d, 0x95, 0x6a, 0xcb, 0x85, 0x3c, 0xb9, 0x00, 0xb3, 0x1a, + 0xc8, 0x5a, 0x7d, 0x70, 0xb7, 0xba, 0x5e, 0x18, 0x23, 0x73, 0x50, 0x08, 0x61, 0x95, 0x25, 0x6b, + 0xab, 0xb6, 0x6c, 0x16, 0x20, 0x0e, 0x5d, 0x2f, 0xad, 0x2d, 0x17, 0xc6, 0x8d, 0xf7, 0xb8, 0x1f, + 0x20, 0xef, 0x6a, 0x72, 0x1e, 0x48, 0x6d, 0xb3, 0xb4, 0xb9, 0x55, 0x8b, 0x35, 0x7e, 0x1c, 0x46, + 0x6b, 0x5b, 0xe5, 0xf2, 0x72, 0xad, 0x56, 0xc8, 0x10, 0x80, 0x91, 0x3b, 0xa5, 0xea, 0xea, 0x72, + 0xa5, 0x90, 0x35, 0x7e, 0x22, 0x03, 0x33, 0x52, 0x02, 0x94, 0x8f, 0x46, 0x4f, 0xb8, 0x16, 0xdf, + 0xd7, 0x2e, 0xb6, 0xd2, 0x49, 0x2b, 0x56, 0x49, 0x9f, 0x65, 0xf8, 0x73, 0x19, 0x38, 0x97, 0x8a, + 0x4d, 0x3e, 0x84, 0x82, 0xfc, 0x82, 0x35, 0x3b, 0xa8, 0xef, 0x47, 0xfb, 0xd8, 0xa5, 0x58, 0x2d, + 0x31, 0x34, 0xae, 0xd6, 0x8c, 0x12, 0x3e, 0x27, 0xd8, 0x0c, 0x9e, 0x8e, 0xc0, 0xf8, 0xd9, 0x0c, + 0x5c, 0xe8, 0x51, 0x0d, 0x29, 0xc3, 0x48, 0x98, 0x98, 0xa6, 0x8f, 0x05, 0xdb, 0xdc, 0xb7, 0x8f, + 0x8b, 0x02, 0x11, 0x33, 0xe4, 0xe2, 0x5f, 0xe6, 0x48, 0x98, 0x69, 0x06, 0xd3, 0xbd, 0xf0, 0xee, + 0xbb, 0x18, 0xeb, 0x79, 0x51, 0x53, 0x69, 0xbb, 0xb6, 0x34, 0x2e, 0xfa, 0x2e, 0x67, 0x1f, 0xfa, + 0x98, 0xef, 0xc5, 0xf8, 0xa9, 0x0c, 0x13, 0xee, 0xe2, 0x88, 0x4c, 0xe6, 0x2d, 0xf9, 0x7e, 0xb7, + 0x45, 0x4d, 0xb7, 0x49, 0x4b, 0xe6, 0xba, 0x38, 0x36, 0x50, 0x5a, 0xb5, 0xb1, 0x00, 0xaf, 0x15, + 0x96, 0xed, 0xb5, 0xb5, 0xd7, 0x6a, 0x95, 0x86, 0xbc, 0x0d, 0xb0, 0xfc, 0x38, 0xa0, 0x5e, 0xdb, + 0x6e, 0x86, 0x31, 0x5a, 0x78, 0x64, 0x29, 0x01, 0xd5, 0xe5, 0x6d, 0x05, 0xd9, 0xf8, 0x3b, 0x19, + 0x98, 0x10, 0x97, 0xa6, 0x52, 0x93, 0x7a, 0xc1, 0x93, 0x4d, 0xaf, 0xb7, 0xb5, 0xe9, 0x15, 0x3a, + 0x6c, 0x28, 0xfc, 0x59, 0x71, 0xea, 0xcc, 0xfa, 0x27, 0x19, 0x28, 0xc4, 0x11, 0xc9, 0xfb, 0x90, + 0xaf, 0xd1, 0x47, 0xd4, 0x73, 0x82, 0x23, 0xb1, 0x51, 0xca, 0x14, 0x7e, 0x1c, 0x47, 0x94, 0xf1, + 0xf9, 0xe0, 0x8b, 0x5f, 0x66, 0x48, 0x33, 0xe8, 0x7e, 0xaf, 0xa8, 0x3d, 0x72, 0x4f, 0x4b, 0xed, + 0x61, 0xfc, 0x6f, 0x59, 0xb8, 0x70, 0x97, 0x06, 0x6a, 0x9b, 0x42, 0xf3, 0x82, 0x4f, 0x0f, 0xd6, + 0x2e, 0xa5, 0x25, 0xf3, 0x30, 0x8a, 0x45, 0x72, 0x7c, 0x4d, 0xf9, 0x93, 0x2c, 0x85, 0xf3, 0x3a, + 0xa7, 0xe5, 0x08, 0xeb, 0x51, 0xf7, 0x75, 0x25, 0x6b, 0x50, 0x38, 0xad, 0xaf, 0xc0, 0x14, 0x86, + 0xc5, 0xef, 0xb2, 0xe5, 0x40, 0x1b, 0x42, 0xfd, 0x93, 0x37, 0x63, 0x50, 0xf2, 0x3a, 0x14, 0x18, + 0xa4, 0x54, 0x3f, 0x68, 0xbb, 0x87, 0x4d, 0xda, 0xd8, 0xa3, 0x0d, 0x3c, 0xd6, 0xf3, 0x66, 0x02, + 0x2e, 0x79, 0x6e, 0xb5, 0xf9, 0xd5, 0x8d, 0x36, 0x50, 0x47, 0x23, 0x78, 0x46, 0xd0, 0x85, 0xb7, + 0x61, 0xfc, 0x63, 0x66, 0x00, 0x33, 0xfe, 0xd7, 0x0c, 0xcc, 0x61, 0xe3, 0x94, 0x8a, 0x65, 0x76, + 0x56, 0xd9, 0x5b, 0x4a, 0x52, 0x1c, 0x9b, 0x81, 0xf4, 0xa5, 0x10, 0xf6, 0x62, 0xa4, 0x13, 0xca, + 0x0e, 0xa0, 0x13, 0xaa, 0x9d, 0x25, 0x13, 0xfd, 0x80, 0x2a, 0xad, 0x7b, 0x43, 0xf9, 0x5c, 0x61, + 0x28, 0x1a, 0x72, 0xe3, 0x07, 0xb2, 0x30, 0x6a, 0x52, 0x4c, 0xd1, 0x4d, 0xae, 0xc0, 0xe8, 0xba, + 0x1b, 0x50, 0x7f, 0x4d, 0xcb, 0xc7, 0xde, 0x66, 0x20, 0xab, 0xd5, 0x30, 0x65, 0x21, 0x9b, 0xf0, + 0x1b, 0x9e, 0xdb, 0xe8, 0xd6, 0x03, 0x75, 0xc2, 0x77, 0x38, 0xc8, 0x94, 0x65, 0xe4, 0x0d, 0x18, + 0x13, 0x9c, 0xc3, 0x47, 0x5d, 0x34, 0x46, 0xf6, 0x68, 0x98, 0xe2, 0x3d, 0x42, 0x40, 0x99, 0x96, + 0x0b, 0x18, 0x43, 0x8a, 0x4c, 0x9b, 0x90, 0x19, 0xa4, 0xa8, 0x3e, 0xdc, 0x47, 0x54, 0xff, 0x34, + 0x8c, 0x94, 0x7c, 0x9f, 0x06, 0x32, 0x8a, 0xc1, 0x44, 0x18, 0xb6, 0xcd, 0xa7, 0x01, 0x67, 0x6c, + 0x63, 0xb9, 0x29, 0xf0, 0x8c, 0x7f, 0x9e, 0x85, 0x61, 0xfc, 0x13, 0x9f, 0x4c, 0xbd, 0xfa, 0xbe, + 0xf6, 0x64, 0xea, 0xd5, 0xf7, 0x4d, 0x84, 0x92, 0x9b, 0xa8, 0xa9, 0x90, 0xf9, 0x9b, 0x44, 0xeb, + 0x51, 0x05, 0xdf, 0x88, 0xc0, 0xa6, 0x8a, 0x13, 0xbe, 0xf0, 0xe7, 0x52, 0x63, 0x97, 0x9c, 0x87, + 0xec, 0x83, 0x9a, 0x68, 0x31, 0x46, 0xc4, 0x72, 0x7d, 0x33, 0xfb, 0xa0, 0x86, 0xbd, 0xb1, 0x52, + 0x5a, 0x7c, 0xeb, 0xb6, 0x68, 0x28, 0xef, 0x8d, 0x7d, 0x7b, 0xf1, 0xad, 0xdb, 0xa6, 0x28, 0x61, + 0xfd, 0x8b, 0xdf, 0x8c, 0x0f, 0xaf, 0xdc, 0xe7, 0x1e, 0xfb, 0x17, 0xdb, 0x86, 0x8f, 0xac, 0x66, + 0x84, 0x40, 0x16, 0x61, 0x5c, 0xc4, 0x7a, 0x40, 0x7c, 0x25, 0x16, 0x83, 0x88, 0x05, 0xc1, 0x29, + 0x54, 0x24, 0xfe, 0x04, 0x27, 0x06, 0x48, 0x66, 0x99, 0x15, 0x4f, 0x70, 0x72, 0x08, 0x7d, 0x53, + 0x41, 0x61, 0x9f, 0xc4, 0xdf, 0xf0, 0x22, 0x5f, 0xfa, 0x29, 0x25, 0x68, 0x00, 0xa6, 0x39, 0x08, + 0x11, 0x8c, 0x5f, 0xca, 0x42, 0x7e, 0xa3, 0xd9, 0xdd, 0x73, 0xda, 0x0f, 0x6f, 0x12, 0x02, 0x78, + 0x8d, 0x93, 0x79, 0x30, 0xd8, 0xdf, 0xe4, 0x22, 0xe4, 0xe5, 0xcd, 0x4d, 0x6e, 0x48, 0xbe, 0xb8, + 0xb5, 0xcd, 0x83, 0x1c, 0x77, 0x11, 0xfa, 0x4c, 0xfe, 0x24, 0x37, 0x21, 0xbc, 0x7f, 0xf5, 0xba, + 0xa8, 0x0d, 0xb1, 0xc5, 0x62, 0x86, 0x68, 0xe4, 0x4d, 0xc0, 0x43, 0x42, 0x5c, 0x1e, 0xa4, 0x42, + 0x9b, 0x7f, 0x9a, 0x90, 0x53, 0x38, 0x09, 0xa2, 0x91, 0x5b, 0x20, 0x26, 0xa6, 0xc8, 0x66, 0x7e, + 0x4e, 0x27, 0xe0, 0xf9, 0x21, 0x25, 0x89, 0x40, 0x25, 0xef, 0xc2, 0x78, 0xdd, 0xa3, 0xf8, 0xea, + 0x68, 0x37, 0xa3, 0x24, 0xe5, 0x2a, 0x65, 0x39, 0x2a, 0x7f, 0x78, 0xd3, 0x54, 0xd1, 0x8d, 0x5f, + 0xca, 0xc3, 0x84, 0xfa, 0x3d, 0xc4, 0x84, 0x59, 0xbf, 0xc9, 0xee, 0xee, 0xc2, 0xd8, 0xac, 0x83, + 0x85, 0xe2, 0x38, 0xbd, 0xac, 0x7f, 0x10, 0xc3, 0xe3, 0x96, 0x67, 0x32, 0x48, 0xc5, 0xca, 0x73, + 0xe6, 0x8c, 0x1f, 0x81, 0x39, 0x1e, 0x29, 0x41, 0xde, 0xed, 0xf8, 0x7b, 0xb4, 0xed, 0xc8, 0xf7, + 0x96, 0x97, 0x35, 0x46, 0x0f, 0x44, 0x61, 0x82, 0x57, 0x48, 0x46, 0xde, 0x82, 0x11, 0xb7, 0x43, + 0xdb, 0xb6, 0x23, 0xce, 0xb8, 0xe7, 0x63, 0x0c, 0x68, 0xbb, 0x54, 0x55, 0x08, 0x05, 0x32, 0xb9, + 0x01, 0x43, 0xee, 0x41, 0x38, 0x5e, 0x17, 0x75, 0xa2, 0x83, 0xc0, 0x56, 0x48, 0x10, 0x91, 0x11, + 0x7c, 0x64, 0xb7, 0x76, 0xc5, 0x88, 0xe9, 0x04, 0xf7, 0xec, 0xd6, 0xae, 0x4a, 0xc0, 0x10, 0xc9, + 0x07, 0x00, 0x1d, 0x7b, 0x8f, 0x7a, 0x56, 0xa3, 0x1b, 0x1c, 0x89, 0x71, 0xbb, 0xa4, 0x91, 0x6d, + 0xb0, 0xe2, 0x4a, 0x37, 0x38, 0x52, 0x68, 0xc7, 0x3a, 0x12, 0x48, 0x4a, 0x00, 0x2d, 0x3b, 0x08, + 0xa8, 0xd7, 0x72, 0x85, 0xb5, 0x5f, 0x14, 0x84, 0x90, 0x33, 0x58, 0x0b, 0x8b, 0x15, 0x0e, 0x0a, + 0x11, 0x7e, 0xb4, 0xe3, 0xd9, 0x22, 0xa7, 0x7c, 0xec, 0xa3, 0x1d, 0x4f, 0x6b, 0x25, 0x43, 0x24, + 0x9f, 0x83, 0xd1, 0x86, 0xe3, 0xd7, 0x5d, 0xaf, 0x21, 0xa2, 0x97, 0xbc, 0xa0, 0xd1, 0x54, 0x78, + 0x99, 0x42, 0x26, 0xd1, 0xd9, 0xd7, 0x8a, 0x20, 0xa4, 0xeb, 0xee, 0x21, 0xaa, 0xf9, 0xe3, 0x5f, + 0x5b, 0x0b, 0x8b, 0xd5, 0xaf, 0x8d, 0x88, 0xd8, 0x50, 0xee, 0x39, 0x41, 0xd3, 0xde, 0x11, 0xef, + 0xdc, 0xfa, 0x50, 0xde, 0xc5, 0x22, 0x75, 0x28, 0x39, 0x32, 0x79, 0x1b, 0xf2, 0xb4, 0x1d, 0x78, + 0xb6, 0xe5, 0x34, 0x84, 0x97, 0xa4, 0xfe, 0xd1, 0xec, 0x00, 0xb6, 0xab, 0x15, 0xf5, 0xa3, 0x11, + 0xbf, 0xda, 0x60, 0xfd, 0xe3, 0xd7, 0x9d, 0x96, 0x70, 0x6e, 0xd4, 0xfb, 0xa7, 0x56, 0xae, 0xae, + 0xa9, 0xfd, 0xc3, 0x10, 0xc9, 0xfb, 0x30, 0xca, 0xd6, 0x6f, 0xc3, 0xdd, 0x13, 0x01, 0x21, 0x0c, + 0xbd, 0x7f, 0x78, 0x59, 0x62, 0xba, 0x4a, 0x22, 0xb6, 0x90, 0xed, 0x43, 0xdf, 0x72, 0xea, 0x22, + 0xc8, 0x83, 0xbe, 0x1c, 0x4b, 0xdb, 0xb5, 0x6a, 0x59, 0x21, 0x1b, 0xb6, 0x0f, 0xfd, 0x6a, 0x9d, + 0x2c, 0xc2, 0x30, 0xa6, 0x88, 0x10, 0x81, 0x28, 0x75, 0x1a, 0x4c, 0x0e, 0xa1, 0xd2, 0x20, 0x2a, + 0x1b, 0xc8, 0x96, 0x8f, 0xfe, 0x22, 0x22, 0x51, 0x83, 0xde, 0x27, 0x6b, 0x35, 0x74, 0x22, 0x51, + 0x3f, 0x51, 0xa0, 0x93, 0x4b, 0x00, 0xd1, 0x2b, 0x3e, 0x7f, 0x73, 0x31, 0x15, 0xc8, 0xe7, 0x87, + 0xfe, 0xcf, 0x5f, 0x28, 0x66, 0x96, 0x00, 0xf2, 0x32, 0x42, 0x8d, 0xb1, 0x0a, 0x17, 0x7b, 0xae, + 0x7b, 0x72, 0x0d, 0x0a, 0xbb, 0xb6, 0xd0, 0xfa, 0xd5, 0xf7, 0xed, 0x76, 0x9b, 0x36, 0xc5, 0x8e, + 0x3b, 0x2d, 0xe1, 0x65, 0x0e, 0xe6, 0x9c, 0x8d, 0x0f, 0x60, 0x2e, 0x6d, 0xc0, 0xc9, 0x4b, 0x30, + 0xa1, 0x06, 0xe3, 0x11, 0x4c, 0xc6, 0xed, 0x8e, 0x23, 0xc3, 0xf1, 0x08, 0x06, 0xbf, 0x99, 0x81, + 0x17, 0xfa, 0x6d, 0x1f, 0x64, 0x01, 0xf2, 0x1d, 0xcf, 0x71, 0x51, 0x4c, 0x15, 0xd9, 0x0e, 0xe4, + 0x6f, 0x4c, 0x64, 0x80, 0xf2, 0x54, 0x60, 0xef, 0x09, 0x07, 0x0f, 0x73, 0x0c, 0x21, 0x9b, 0xf6, + 0x9e, 0x4f, 0x3e, 0x05, 0x33, 0x0d, 0xba, 0x6b, 0x77, 0x9b, 0x81, 0xe5, 0xd7, 0xf7, 0x69, 0x03, + 0x7d, 0xaa, 0xd0, 0x70, 0xcf, 0x2c, 0x88, 0x82, 0x9a, 0x84, 0x27, 0xbe, 0x78, 0xb8, 0xc7, 0x17, + 0xdf, 0x1b, 0xca, 0x67, 0x0a, 0x59, 0x13, 0x2d, 0xa5, 0x8c, 0xef, 0xcb, 0xc2, 0x7c, 0xaf, 0xf5, + 0x42, 0xde, 0x4b, 0xeb, 0x03, 0xfe, 0x70, 0xa1, 0xc2, 0xd5, 0x87, 0x0b, 0xa5, 0x36, 0xb2, 0x08, + 0xa1, 0x47, 0xd4, 0x69, 0xd1, 0x0d, 0x24, 0x8c, 0xd1, 0x74, 0x6c, 0xdf, 0x3f, 0x64, 0x5b, 0x42, + 0x4e, 0x09, 0x68, 0x2b, 0x60, 0x2a, 0x8d, 0x84, 0x91, 0xcf, 0x02, 0xd4, 0x9b, 0xae, 0x4f, 0xd1, + 0x3e, 0x40, 0xc8, 0x1a, 0xdc, 0x2c, 0x3c, 0x84, 0xaa, 0x0f, 0xc2, 0x08, 0x2d, 0xbb, 0x0d, 0x2a, + 0x06, 0xd0, 0x86, 0x0b, 0x3d, 0x36, 0x48, 0x36, 0x3c, 0x51, 0x76, 0x78, 0x99, 0x6b, 0xaa, 0x1b, + 0xe6, 0x88, 0x8f, 0xf7, 0x78, 0xb6, 0xd7, 0x1c, 0x39, 0x02, 0x92, 0xdc, 0x05, 0x19, 0x77, 0x61, + 0xdc, 0xdc, 0xf5, 0x42, 0xee, 0x1c, 0xb2, 0xe5, 0x35, 0x49, 0x11, 0xc6, 0x65, 0x2e, 0x49, 0x26, + 0xcb, 0x73, 0xe6, 0x20, 0x40, 0xf7, 0x29, 0x4e, 0x1e, 0x8c, 0x58, 0x8a, 0x7e, 0x6f, 0x42, 0x4a, + 0xf8, 0xff, 0xd8, 0xfb, 0x96, 0xd8, 0x46, 0x92, 0xf3, 0xe0, 0x69, 0x92, 0x92, 0xa8, 0x8f, 0x7a, + 0xb4, 0x6a, 0x5e, 0xda, 0xd1, 0x3c, 0x76, 0x7a, 0x67, 0xc6, 0x33, 0x5c, 0xef, 0xda, 0x33, 0xfb, + 0xaf, 0x77, 0xd7, 0xfe, 0xfd, 0x68, 0x91, 0x2d, 0x89, 0x33, 0x7c, 0xb9, 0x9b, 0x94, 0x3c, 0x1e, + 0xdb, 0xed, 0x5e, 0xb2, 0x25, 0xb5, 0x4d, 0xb1, 0x69, 0x36, 0xb9, 0xe3, 0x31, 0x02, 0x24, 0x46, + 0x00, 0x1b, 0xc8, 0xcb, 0x89, 0x93, 0x20, 0x8b, 0x5c, 0x7c, 0x88, 0x11, 0xe4, 0x90, 0x6b, 0x90, + 0x20, 0xc9, 0xc5, 0x37, 0x03, 0x86, 0x01, 0x03, 0xc9, 0x29, 0x09, 0x16, 0xc9, 0x02, 0x09, 0x90, + 0xc7, 0x2d, 0x88, 0x0f, 0x3e, 0x05, 0xf5, 0x55, 0x55, 0x77, 0xf5, 0x83, 0x1c, 0x8d, 0x77, 0x9d, + 0xc4, 0x80, 0x4f, 0x12, 0xbf, 0xfa, 0xea, 0xeb, 0x7a, 0xd7, 0xf7, 0x7d, 0xf5, 0x3d, 0x96, 0x11, + 0xd2, 0x79, 0x32, 0x12, 0xbd, 0xbb, 0x2c, 0xd6, 0x77, 0xfc, 0x6e, 0xe2, 0xa5, 0xbf, 0xaf, 0x88, + 0xe9, 0x4f, 0x1f, 0xee, 0x4f, 0x6b, 0x1f, 0x01, 0xf4, 0x52, 0xe2, 0x0d, 0xc3, 0xff, 0x29, 0xd7, + 0x22, 0x76, 0x1d, 0xe7, 0x5a, 0xf8, 0x4f, 0x72, 0x0b, 0xd6, 0xc7, 0xcc, 0x8e, 0x75, 0xe2, 0xf3, + 0xf1, 0x64, 0x79, 0x3b, 0x56, 0x19, 0xb8, 0xe3, 0xe3, 0x98, 0xf2, 0x76, 0xdd, 0x0f, 0x07, 0x4c, + 0xba, 0xeb, 0xc8, 0xcb, 0xb0, 0x4c, 0xef, 0x3a, 0x8c, 0x74, 0x93, 0x70, 0x8f, 0x40, 0x3c, 0xe4, + 0x1c, 0xcc, 0xe2, 0x97, 0xf8, 0xff, 0x9c, 0xd6, 0xdb, 0x39, 0x41, 0x4c, 0xbe, 0x69, 0xc9, 0x45, + 0x58, 0xf2, 0xc7, 0x47, 0x52, 0xd7, 0x16, 0xfd, 0xf1, 0x11, 0xed, 0xd7, 0x6d, 0x50, 0x99, 0xb7, + 0x0e, 0x0b, 0x83, 0x10, 0x3c, 0x19, 0x32, 0x51, 0xbc, 0x68, 0xae, 0x31, 0x38, 0x26, 0xcc, 0x7f, + 0x32, 0xec, 0x51, 0xcc, 0x20, 0xf0, 0x6d, 0x39, 0xc0, 0x15, 0xef, 0xf6, 0x5a, 0x10, 0xf8, 0x51, + 0xa4, 0xab, 0x3e, 0xd9, 0x86, 0x55, 0x4a, 0x27, 0x0c, 0xb3, 0xc5, 0x19, 0x81, 0x2b, 0x69, 0x46, + 0xe0, 0xc9, 0xb0, 0x27, 0x9a, 0x68, 0xae, 0x04, 0xd2, 0x2f, 0xf2, 0x00, 0x54, 0x89, 0x63, 0x42, + 0x7f, 0xcc, 0x84, 0x4d, 0x75, 0x44, 0x46, 0xe2, 0xb4, 0x6a, 0xc3, 0x43, 0xdf, 0x5c, 0xef, 0xc5, + 0x01, 0x7c, 0x68, 0xbe, 0xa3, 0x88, 0xb3, 0x34, 0xa3, 0x12, 0xd1, 0x60, 0xf5, 0xd8, 0x09, 0xec, + 0x20, 0x38, 0x61, 0x36, 0x62, 0x3c, 0xb0, 0x6f, 0xe9, 0xd8, 0x09, 0xac, 0xe0, 0x44, 0x24, 0x0e, + 0x39, 0x4f, 0x71, 0x7c, 0x67, 0x3a, 0x39, 0xb6, 0x65, 0xfe, 0x8f, 0x8d, 0xd8, 0xd9, 0x63, 0x27, + 0x68, 0xd1, 0x32, 0x89, 0x36, 0xb9, 0x01, 0x6b, 0x48, 0xb7, 0xe7, 0x09, 0xc2, 0x18, 0xca, 0xc2, + 0x5c, 0xa1, 0x84, 0x7b, 0x1e, 0xa3, 0xcc, 0x5b, 0xf8, 0xaf, 0x39, 0xb8, 0x90, 0x3d, 0x3a, 0xb8, + 0x3c, 0xe9, 0x98, 0xa2, 0x8f, 0x1e, 0x6f, 0xdb, 0x32, 0x85, 0xb0, 0x30, 0x24, 0x59, 0x93, 0x93, + 0xcb, 0x9c, 0x9c, 0x32, 0x6c, 0x20, 0x21, 0xce, 0x69, 0x0e, 0xbc, 0x60, 0xc2, 0xa3, 0x6b, 0x98, + 0xeb, 0xb4, 0x80, 0x9d, 0xe7, 0x75, 0x0a, 0x26, 0x37, 0x61, 0x4d, 0x9c, 0xc8, 0xfe, 0xe3, 0x21, + 0xfd, 0x30, 0x3b, 0x8e, 0x57, 0x39, 0xb4, 0x85, 0x40, 0x72, 0x1e, 0x16, 0x9d, 0xd1, 0x88, 0x7e, + 0x92, 0x9d, 0xc2, 0x0b, 0xce, 0x68, 0xc4, 0x92, 0xdb, 0xa0, 0x47, 0xa2, 0x7d, 0x88, 0x56, 0x42, + 0xdc, 0x24, 0xd1, 0x5c, 0x41, 0x20, 0xb3, 0x1c, 0x0a, 0xe8, 0xbe, 0xa7, 0x75, 0x05, 0xca, 0x12, + 0xa2, 0x80, 0x33, 0x0a, 0x11, 0x9e, 0x83, 0xa2, 0x78, 0xaf, 0x66, 0x8e, 0x15, 0xe6, 0x92, 0xc3, + 0xdf, 0xaa, 0x5f, 0x85, 0x8b, 0x7d, 0x2f, 0xc0, 0xc5, 0xcb, 0xba, 0x34, 0x1a, 0x71, 0x1f, 0x48, + 0x16, 0x24, 0xd7, 0x3c, 0xc7, 0x8b, 0xe9, 0x48, 0xea, 0xa3, 0x11, 0xf3, 0x84, 0xe4, 0x63, 0xfd, + 0x3a, 0xac, 0x73, 0x8e, 0x8b, 0x5f, 0x91, 0xd8, 0x16, 0xbe, 0x81, 0xa9, 0x28, 0xc4, 0xd3, 0x09, + 0x01, 0x07, 0xd5, 0xfa, 0xa2, 0xe6, 0x3f, 0x28, 0x70, 0x3e, 0x93, 0x65, 0x23, 0x5f, 0x04, 0xe6, + 0xf2, 0x35, 0xf1, 0xed, 0xb1, 0xdb, 0xf3, 0x46, 0x1e, 0x06, 0xc5, 0x60, 0x2a, 0xcd, 0x7b, 0xf3, + 0x98, 0x3d, 0x74, 0x1f, 0xeb, 0xf8, 0x66, 0x58, 0x89, 0xe9, 0x5a, 0xd4, 0x71, 0x02, 0x7c, 0xe9, + 0x11, 0x9c, 0xcf, 0x44, 0xcd, 0xd0, 0x81, 0x7c, 0x30, 0x9e, 0xcc, 0x59, 0x3c, 0x52, 0x25, 0x3a, + 0x2d, 0xe9, 0x46, 0x78, 0xf7, 0xbe, 0x17, 0x76, 0x2f, 0xc1, 0xdc, 0x11, 0x23, 0xb9, 0xaf, 0xb3, + 0xe4, 0x13, 0x51, 0x69, 0xf6, 0xd6, 0x7e, 0x04, 0xe7, 0xf9, 0xe2, 0x3b, 0x1a, 0x3b, 0xa3, 0xe3, + 0x88, 0x1c, 0x6b, 0xe8, 0x07, 0xb2, 0xc8, 0xb1, 0x55, 0xb9, 0x4b, 0xf1, 0x43, 0xaa, 0x67, 0x9d, + 0x34, 0x90, 0xf7, 0xe1, 0xeb, 0x39, 0xb1, 0xd5, 0x33, 0x9a, 0x93, 0xb1, 0xac, 0x95, 0xac, 0x65, + 0x7d, 0xfa, 0x3d, 0xd5, 0x04, 0x22, 0x1f, 0x56, 0x4c, 0xeb, 0xc9, 0x0d, 0xaa, 0x04, 0x9f, 0xce, + 0x1b, 0x22, 0x1d, 0x0d, 0x16, 0x4b, 0xa6, 0xb9, 0xd1, 0x4b, 0x82, 0xc8, 0x16, 0x2c, 0x87, 0xf9, + 0xaa, 0xf9, 0xc5, 0x51, 0x64, 0x80, 0x5a, 0x9f, 0x3c, 0x0f, 0x2b, 0x8c, 0x25, 0x8f, 0xed, 0x39, + 0x40, 0x98, 0x4e, 0x37, 0x9e, 0x18, 0x03, 0x05, 0x9e, 0x7f, 0xda, 0x18, 0x92, 0x03, 0xb8, 0x80, + 0x66, 0x1d, 0x81, 0x1f, 0x4e, 0x83, 0xdd, 0x73, 0x7a, 0xc7, 0x2e, 0x5f, 0xb5, 0x5a, 0xe6, 0x64, + 0x8c, 0x46, 0x96, 0xd5, 0x92, 0xe6, 0x61, 0x34, 0xb2, 0x02, 0x5f, 0xfc, 0xae, 0xd0, 0xea, 0xbc, + 0x0d, 0x7d, 0xd8, 0x9a, 0x53, 0x53, 0x3a, 0x38, 0x14, 0xf9, 0xe0, 0xb8, 0x0d, 0xea, 0xa1, 0xdb, + 0xa7, 0x3c, 0xb1, 0xdb, 0xc7, 0xa6, 0xbd, 0x75, 0x8f, 0x65, 0x68, 0x37, 0xd7, 0x42, 0xb8, 0x15, + 0xf8, 0xfb, 0xf7, 0xf8, 0x57, 0x4e, 0xc4, 0x95, 0x27, 0x8b, 0x15, 0xe4, 0x65, 0x38, 0x9b, 0x08, + 0x38, 0x12, 0x79, 0xb0, 0x9b, 0x1b, 0xb4, 0x28, 0x1e, 0x9e, 0xea, 0x3a, 0xac, 0x88, 0x55, 0x31, + 0x0e, 0xfd, 0xe0, 0xcc, 0x12, 0x87, 0xd1, 0x5d, 0xc7, 0x3f, 0x37, 0x15, 0x9d, 0xca, 0x94, 0x48, + 0x4e, 0xc1, 0x4b, 0x93, 0x97, 0x80, 0x84, 0x7c, 0x7b, 0x78, 0x50, 0xf0, 0x0f, 0x6e, 0x88, 0x92, + 0x70, 0x87, 0xf3, 0xcf, 0xfe, 0x75, 0x0e, 0xce, 0x66, 0x88, 0x32, 0x54, 0x08, 0xf0, 0x86, 0x13, + 0xf7, 0x88, 0x89, 0x10, 0x72, 0x27, 0xd7, 0x25, 0x38, 0xd7, 0x4f, 0x2d, 0xb2, 0x0c, 0xe4, 0xfc, + 0x5b, 0xfc, 0x17, 0x3d, 0x3c, 0x9c, 0xb1, 0x50, 0xbd, 0xd0, 0x7f, 0x49, 0x0d, 0x36, 0x30, 0xad, + 0x42, 0xe0, 0xf9, 0x98, 0x9d, 0x01, 0x99, 0x90, 0x42, 0x4c, 0xd8, 0xc1, 0x56, 0xb4, 0x25, 0x24, + 0xca, 0x85, 0x98, 0xea, 0x28, 0x01, 0x21, 0x1f, 0x83, 0x4b, 0xd2, 0x5d, 0x63, 0x27, 0x76, 0x1e, + 0x5a, 0xba, 0x9b, 0x17, 0x9d, 0xf0, 0xd6, 0xa9, 0xc6, 0xf6, 0xe0, 0x36, 0x5c, 0xc5, 0x49, 0xf4, + 0xfa, 0x23, 0x3b, 0x95, 0x87, 0x03, 0xbb, 0xca, 0x02, 0xd7, 0x5f, 0xa2, 0x58, 0xb5, 0xfe, 0x28, + 0x91, 0x92, 0x83, 0xf6, 0x9a, 0x0f, 0xdf, 0x23, 0x38, 0x9f, 0xd9, 0x62, 0x7a, 0xc1, 0xa0, 0x21, + 0x55, 0xc4, 0x1b, 0x2d, 0xd1, 0xdf, 0x94, 0x39, 0xba, 0x0e, 0x2b, 0x6f, 0xba, 0xce, 0xd8, 0x1d, + 0xf3, 0x9b, 0x9b, 0x2f, 0x09, 0x06, 0x93, 0x2f, 0xee, 0x7e, 0x7c, 0x6a, 0xb8, 0xce, 0x88, 0x34, + 0xe0, 0x2c, 0xbb, 0x01, 0xbd, 0x13, 0x64, 0x06, 0xb9, 0x9e, 0x49, 0x89, 0xb1, 0x43, 0x58, 0x05, + 0xaf, 0xa6, 0x1a, 0x62, 0xb1, 0xda, 0xe6, 0xc6, 0x51, 0x12, 0x44, 0x77, 0xf4, 0x85, 0x6c, 0x6c, + 0xb2, 0x0d, 0x25, 0x46, 0x9c, 0x89, 0x05, 0xec, 0x81, 0xe0, 0xfa, 0xdc, 0x2f, 0x54, 0xd0, 0xbe, + 0x38, 0x08, 0xff, 0xa7, 0xf7, 0x35, 0xbe, 0xc5, 0xda, 0x27, 0xf2, 0xfb, 0x87, 0xb9, 0x82, 0x40, + 0xfe, 0xee, 0xa1, 0xfd, 0x8d, 0x22, 0xba, 0x1a, 0x13, 0x8e, 0xe9, 0xd2, 0x0a, 0xdc, 0xa1, 0x78, + 0x03, 0x5a, 0x36, 0xf9, 0xaf, 0x67, 0x5c, 0xea, 0xe4, 0x35, 0x58, 0xa1, 0x64, 0x8f, 0xa6, 0x43, + 0xb6, 0xe4, 0xf2, 0xb1, 0x40, 0x3b, 0x0d, 0x56, 0x44, 0xa7, 0x6d, 0xef, 0x8c, 0x59, 0x3a, 0x89, + 0x7e, 0x52, 0x6e, 0x39, 0x38, 0x99, 0x8c, 0xe4, 0x85, 0x2a, 0x14, 0x85, 0x56, 0xa3, 0xd3, 0xe6, + 0x55, 0x8a, 0x14, 0x27, 0xe2, 0x96, 0xb7, 0x17, 0x99, 0xaa, 0x50, 0x7b, 0x11, 0x4a, 0x12, 0x6d, + 0xda, 0x19, 0xe6, 0x39, 0x23, 0x3a, 0xc3, 0x7e, 0xf1, 0xc9, 0x7e, 0x13, 0x8a, 0x82, 0x24, 0x15, + 0x0b, 0x8e, 0xfd, 0x40, 0x6c, 0x72, 0xfc, 0x9f, 0xc2, 0xe8, 0x28, 0x63, 0x27, 0x17, 0x4c, 0xfc, + 0x1f, 0xef, 0x92, 0x89, 0x43, 0xe5, 0x81, 0x41, 0x60, 0x8f, 0xd0, 0x02, 0x2b, 0x64, 0x9e, 0x29, + 0xbc, 0x33, 0x08, 0x98, 0x5d, 0x16, 0xff, 0xc6, 0x5f, 0x84, 0x97, 0x70, 0x42, 0x9b, 0x30, 0xeb, + 0xcc, 0x8c, 0x5d, 0x19, 0xb9, 0xf4, 0x95, 0xc1, 0x02, 0xa8, 0xf0, 0x9a, 0xec, 0xcb, 0x80, 0x30, + 0xbc, 0x32, 0xa4, 0x93, 0xa1, 0x10, 0x3b, 0x19, 0x24, 0x99, 0x3c, 0x9a, 0x3d, 0x76, 0xe3, 0x08, + 0x99, 0x3c, 0x79, 0x4e, 0xfd, 0x71, 0x4e, 0xa8, 0x08, 0xb6, 0x7d, 0x7f, 0x12, 0x4c, 0xc6, 0xce, + 0x28, 0xa6, 0x0a, 0x25, 0x27, 0xf0, 0x1c, 0x72, 0xd0, 0xf7, 0x30, 0x85, 0x85, 0x3f, 0x16, 0x31, + 0x3b, 0xc2, 0x95, 0x5b, 0xba, 0xf7, 0xa1, 0x38, 0x8f, 0xaf, 0x53, 0x6c, 0x5d, 0x46, 0xa6, 0x0b, + 0x56, 0xa2, 0xba, 0x77, 0xc6, 0xbc, 0xc8, 0x68, 0xa6, 0xb0, 0xc8, 0x5e, 0xc6, 0x26, 0x4e, 0xea, + 0x42, 0xb7, 0xa3, 0x1d, 0x1d, 0xa7, 0x2a, 0xef, 0x75, 0xf2, 0x09, 0x58, 0xf6, 0xfa, 0x72, 0xa6, + 0xc6, 0xa4, 0x16, 0xae, 0xd6, 0x67, 0xd1, 0xa2, 0x23, 0x1a, 0x74, 0xcd, 0x79, 0x1c, 0xba, 0xbd, + 0x1a, 0x53, 0x1a, 0x6b, 0xdb, 0x42, 0x1a, 0x4d, 0x57, 0x23, 0x6b, 0x90, 0x0b, 0x67, 0x38, 0xe7, + 0xf5, 0xd9, 0xf6, 0x8a, 0xe2, 0x55, 0x9b, 0xfc, 0x97, 0xf6, 0x4b, 0x70, 0xfb, 0xb4, 0x63, 0x44, + 0xb7, 0xe2, 0x8c, 0x01, 0x5f, 0x36, 0x37, 0x9c, 0xd4, 0xb8, 0x5d, 0x07, 0x39, 0xdc, 0xae, 0x27, + 0x0e, 0x3f, 0x01, 0xeb, 0x8e, 0x3d, 0xed, 0xcf, 0xf3, 0xb0, 0x16, 0x57, 0x93, 0x93, 0x17, 0xa1, + 0x20, 0x9d, 0x40, 0x17, 0x33, 0x74, 0xe9, 0x78, 0xee, 0x20, 0xd2, 0xa9, 0x4e, 0x1c, 0x72, 0x1f, + 0xd6, 0xd0, 0x70, 0x0f, 0x59, 0xcf, 0x89, 0xc7, 0x1f, 0x5f, 0xe6, 0xbf, 0x9f, 0x15, 0xbf, 0xff, + 0xce, 0xb5, 0x33, 0xf8, 0x54, 0xb6, 0x42, 0xeb, 0x52, 0xee, 0x8f, 0x16, 0x4a, 0x5a, 0xd0, 0xc2, + 0x6c, 0x2d, 0x28, 0xef, 0xca, 0x0c, 0x2d, 0xe8, 0xc2, 0x1c, 0x2d, 0x68, 0x54, 0x53, 0xd6, 0x82, + 0xa2, 0x2e, 0x7c, 0x69, 0x96, 0x2e, 0x3c, 0xaa, 0xc3, 0x74, 0xe1, 0x91, 0x16, 0xb3, 0x38, 0x53, + 0x8b, 0x19, 0xd5, 0xe1, 0x5a, 0xcc, 0x1b, 0x7c, 0x8c, 0xc6, 0xce, 0x63, 0x1b, 0x07, 0x8f, 0x5f, + 0x8b, 0xd8, 0x7b, 0xd3, 0x79, 0x8c, 0xc6, 0x35, 0xdb, 0xcb, 0x20, 0x2c, 0x72, 0xb4, 0xdf, 0x55, + 0x12, 0x9a, 0x40, 0x31, 0x7f, 0x37, 0x61, 0x8d, 0x5d, 0x56, 0x6e, 0x5f, 0x92, 0x35, 0x57, 0xcd, + 0x55, 0x01, 0x65, 0xf2, 0xe6, 0x07, 0x60, 0x3d, 0x44, 0xe3, 0x22, 0x17, 0x7a, 0xea, 0x99, 0x61, + 0x6d, 0x1e, 0x76, 0xe6, 0x45, 0xd8, 0x08, 0x11, 0xb9, 0x36, 0x87, 0x89, 0x9b, 0xab, 0xa6, 0x2a, + 0x0a, 0xda, 0x1c, 0xae, 0x1d, 0x25, 0x25, 0x8f, 0x9f, 0x51, 0xab, 0xb4, 0xef, 0xe5, 0x63, 0x5a, + 0x12, 0xf1, 0x19, 0x7a, 0x8b, 0x06, 0xbe, 0xcd, 0x07, 0x89, 0x9f, 0x45, 0xd7, 0x67, 0xcc, 0x19, + 0xb7, 0x69, 0xb2, 0xac, 0x96, 0x09, 0x41, 0xe0, 0x0b, 0x13, 0x27, 0x9b, 0x71, 0xd4, 0xec, 0xde, + 0xc7, 0x35, 0x2b, 0xc8, 0xb1, 0x83, 0xa7, 0x3c, 0x9f, 0x9c, 0x10, 0x53, 0xe9, 0x92, 0x45, 0xce, + 0x3a, 0xfc, 0x25, 0x3e, 0xd0, 0x05, 0x54, 0x2a, 0x06, 0x71, 0xe2, 0xf9, 0x0c, 0xd9, 0x29, 0x45, + 0x1c, 0x47, 0x09, 0x29, 0xab, 0x53, 0xf1, 0xaf, 0x20, 0x6b, 0xc0, 0x0a, 0xea, 0x28, 0x04, 0xc1, + 0x42, 0x86, 0x0a, 0x3e, 0xdd, 0xf9, 0x4a, 0xad, 0x61, 0x96, 0x68, 0x3d, 0x41, 0xe6, 0x18, 0x9e, + 0x93, 0x35, 0x0b, 0xf1, 0x46, 0x2e, 0x88, 0x28, 0xba, 0x73, 0x47, 0x20, 0x52, 0x40, 0x60, 0x53, + 0x2f, 0x38, 0x71, 0x00, 0x47, 0xd3, 0x8e, 0xe1, 0xd2, 0xec, 0x29, 0x99, 0x93, 0xa1, 0x29, 0xba, + 0x40, 0x73, 0xf2, 0x05, 0x2a, 0xeb, 0x19, 0xf2, 0x31, 0x3d, 0x83, 0xf6, 0x47, 0x79, 0x78, 0xe1, + 0x14, 0xd3, 0x35, 0xe7, 0x9b, 0x9f, 0x8a, 0xb3, 0x67, 0xb9, 0x98, 0x64, 0x48, 0x89, 0xf2, 0x03, + 0x92, 0x4a, 0xa9, 0xd9, 0xcc, 0xd9, 0x17, 0x61, 0x9d, 0x9d, 0x82, 0xcc, 0x2c, 0xf1, 0x70, 0x3a, + 0x38, 0xc5, 0x31, 0xb8, 0x25, 0x7c, 0xa8, 0x12, 0x55, 0xf1, 0x64, 0xc4, 0x13, 0xc3, 0x0a, 0x61, + 0xa4, 0x03, 0x25, 0x44, 0x3b, 0x74, 0xbc, 0xc1, 0xa9, 0x9c, 0x79, 0x84, 0x87, 0x96, 0x5c, 0x8d, + 0x59, 0x53, 0x53, 0xc0, 0x0e, 0xfe, 0x26, 0xb7, 0x60, 0x7d, 0x38, 0x3d, 0xa1, 0x8c, 0x07, 0x5b, + 0x0b, 0xdc, 0xfa, 0x63, 0xc1, 0x5c, 0x1d, 0x4e, 0x4f, 0xf4, 0xd1, 0x08, 0xa7, 0x14, 0xcd, 0x44, + 0x36, 0x28, 0x1e, 0xdb, 0xb5, 0x02, 0x73, 0x11, 0x31, 0x29, 0x01, 0xb6, 0x6f, 0x39, 0xee, 0x39, + 0x60, 0x46, 0x83, 0x3c, 0x43, 0x15, 0xfb, 0xa1, 0xfd, 0x38, 0x27, 0xe4, 0xdd, 0xd9, 0xeb, 0xfe, + 0x17, 0x53, 0x94, 0x31, 0x45, 0xb7, 0x41, 0xa5, 0x43, 0x1f, 0x1d, 0x2a, 0xe1, 0x1c, 0xad, 0x0d, + 0xa7, 0x27, 0xe1, 0xd8, 0xc9, 0x03, 0xbf, 0x28, 0x0f, 0xfc, 0x6b, 0x42, 0x1e, 0xce, 0x3c, 0x1e, + 0x66, 0x0f, 0xb9, 0xf6, 0x1f, 0x79, 0xb8, 0x75, 0xba, 0x43, 0xe0, 0x17, 0xf3, 0x96, 0x31, 0x6f, + 0x09, 0xd5, 0xe9, 0x42, 0x4a, 0x75, 0x9a, 0xb1, 0xf7, 0x16, 0xb3, 0xf6, 0x5e, 0x4a, 0x51, 0xbb, + 0x94, 0xa1, 0xa8, 0xcd, 0xdc, 0xa0, 0xc5, 0xa7, 0x6c, 0xd0, 0x65, 0x79, 0x9d, 0xfc, 0x4b, 0xa8, + 0xc0, 0x88, 0xcb, 0x03, 0x8f, 0xe0, 0xac, 0x90, 0x07, 0xd8, 0xcd, 0x11, 0xe9, 0xdf, 0x4b, 0xf7, + 0xee, 0x64, 0x49, 0x02, 0x88, 0x96, 0xc1, 0xad, 0x6f, 0x70, 0x19, 0x20, 0x2a, 0xff, 0xbf, 0xc3, + 0xfd, 0x93, 0x87, 0x70, 0x01, 0xe3, 0xbb, 0xf7, 0xe4, 0x97, 0x03, 0x7b, 0xec, 0x1e, 0xf2, 0xf5, + 0x70, 0x3d, 0xc5, 0x2b, 0x7b, 0x3d, 0xa9, 0x39, 0xa6, 0x7b, 0xb8, 0x77, 0xc6, 0x3c, 0x17, 0x64, + 0xc0, 0x93, 0x82, 0xc5, 0x9f, 0x2a, 0xa0, 0x3d, 0x7d, 0xbc, 0x50, 0x51, 0x95, 0x1c, 0xf0, 0x65, + 0xb3, 0xe4, 0x48, 0xa3, 0xf7, 0x02, 0xac, 0x8e, 0xdd, 0xc3, 0xb1, 0x1b, 0x1c, 0xc7, 0x34, 0x20, + 0x2b, 0x1c, 0x28, 0x06, 0x46, 0x44, 0x99, 0x7c, 0x26, 0xce, 0x5c, 0x54, 0xd2, 0x76, 0x42, 0x79, + 0x31, 0x73, 0x1e, 0xe8, 0x6a, 0x92, 0x1b, 0xc8, 0x7e, 0xdc, 0x2f, 0x14, 0x73, 0x6a, 0xde, 0xe4, + 0xb1, 0x30, 0x0f, 0xbd, 0x81, 0xab, 0xfd, 0xa5, 0x22, 0x38, 0x82, 0xac, 0xc1, 0x23, 0x8f, 0x24, + 0x63, 0xde, 0x7c, 0x8a, 0x0d, 0xc9, 0xaa, 0x22, 0xdb, 0x3d, 0xf2, 0xf0, 0x8c, 0x08, 0x88, 0x85, + 0x67, 0x44, 0xc8, 0x7b, 0xb0, 0x48, 0xe4, 0x52, 0xf3, 0x1b, 0xc2, 0x22, 0x88, 0x9e, 0x79, 0xfb, + 0x77, 0xc9, 0x1d, 0x58, 0x62, 0x46, 0x40, 0xa2, 0xb9, 0xeb, 0xb1, 0xe6, 0xee, 0xdf, 0x35, 0x45, + 0xb9, 0xf6, 0x76, 0xf8, 0xae, 0x95, 0xea, 0xc4, 0xfe, 0x5d, 0xf2, 0xda, 0xe9, 0x8c, 0x73, 0x8b, + 0xc2, 0x38, 0x37, 0x34, 0xcc, 0x7d, 0x3d, 0x66, 0x98, 0x7b, 0x63, 0xfe, 0x68, 0xf1, 0xd7, 0x48, + 0x16, 0x8e, 0x30, 0x0a, 0x53, 0xf5, 0x63, 0x05, 0xae, 0xcc, 0xad, 0x41, 0x2e, 0x43, 0x51, 0x6f, + 0xd7, 0x3a, 0xd1, 0xfc, 0xd2, 0x3d, 0x23, 0x20, 0x64, 0x17, 0x96, 0xb7, 0x9d, 0xc0, 0xeb, 0xd1, + 0x65, 0x9c, 0xf9, 0x3c, 0x90, 0x22, 0x1b, 0xa2, 0xef, 0x9d, 0x31, 0xa3, 0xba, 0xc4, 0x86, 0x0d, + 0xdc, 0x0b, 0xb1, 0xd4, 0x4f, 0xf9, 0x0c, 0x5d, 0x43, 0x8a, 0x60, 0xaa, 0x1a, 0x3d, 0x67, 0x52, + 0xc0, 0xe4, 0x16, 0x7c, 0x4b, 0xf0, 0x22, 0xb3, 0x1b, 0xf8, 0x0c, 0x71, 0x55, 0x6f, 0x43, 0xb1, + 0x2d, 0xec, 0x04, 0x24, 0x6b, 0x76, 0x61, 0x13, 0x60, 0x86, 0xa5, 0xda, 0x6f, 0x28, 0x42, 0x21, + 0xf0, 0xf4, 0x8e, 0x48, 0x59, 0xb3, 0xfa, 0xf3, 0xb3, 0x66, 0xf5, 0x7f, 0xca, 0xac, 0x59, 0xda, + 0x9f, 0xf0, 0xa8, 0xe7, 0xb5, 0x7e, 0x3b, 0xa1, 0x99, 0x7d, 0xaf, 0x5e, 0x09, 0x46, 0x6c, 0x75, + 0xbe, 0x20, 0x65, 0x5d, 0x4c, 0x7f, 0x6b, 0xb6, 0x73, 0x82, 0xb4, 0x54, 0xff, 0x20, 0x0f, 0x97, + 0xe7, 0x55, 0xcf, 0xcc, 0xeb, 0xac, 0x3c, 0x5b, 0x5e, 0xe7, 0x3b, 0x50, 0x64, 0xb0, 0xd0, 0xe4, + 0x1e, 0x07, 0x9c, 0x57, 0xa5, 0x03, 0x2e, 0x8a, 0xc9, 0x0b, 0xb0, 0xa8, 0x57, 0xac, 0x28, 0xd5, + 0x18, 0xda, 0xc6, 0x3a, 0xbd, 0x00, 0xad, 0x2e, 0x79, 0x11, 0xf9, 0x42, 0x3a, 0xbb, 0x1e, 0xcf, + 0x31, 0xb6, 0x25, 0x0d, 0x48, 0x2a, 0x21, 0x01, 0xb6, 0x37, 0x0a, 0xa0, 0xcf, 0x63, 0x52, 0x9b, + 0xe9, 0x4c, 0x7d, 0x1a, 0x2c, 0xb6, 0xc7, 0x6e, 0xe0, 0x4e, 0x64, 0xbb, 0xd5, 0x11, 0x42, 0x4c, + 0x5e, 0xc2, 0xad, 0x4a, 0x9d, 0x27, 0x2c, 0x88, 0xc0, 0xa2, 0x1c, 0xd8, 0x05, 0xcd, 0x50, 0x29, + 0xd8, 0x94, 0x50, 0x68, 0x85, 0xba, 0x33, 0x1d, 0xf6, 0x8e, 0xbb, 0x66, 0x9d, 0xb3, 0x1a, 0xac, + 0xc2, 0x00, 0xa1, 0xb4, 0x83, 0x81, 0x29, 0xa1, 0x68, 0xdf, 0x54, 0xe0, 0x5c, 0x56, 0x3f, 0xc8, + 0x65, 0x28, 0x0c, 0x33, 0x13, 0x09, 0x0e, 0x99, 0xef, 0x73, 0x89, 0xfe, 0xb5, 0x0f, 0xfd, 0xf1, + 0x89, 0x33, 0x91, 0xad, 0x7b, 0x25, 0xb0, 0x09, 0xf4, 0xc7, 0x0e, 0xfe, 0x4f, 0xae, 0x89, 0x33, + 0x3a, 0x9f, 0x4a, 0x3d, 0x88, 0x7f, 0x34, 0x1d, 0xa0, 0xd6, 0x6f, 0xb7, 0x46, 0x2c, 0x20, 0xfe, + 0x2b, 0x50, 0xa0, 0xcd, 0x4a, 0xac, 0x5e, 0xba, 0x7e, 0xf4, 0x46, 0x9d, 0x23, 0xb1, 0x56, 0x05, + 0xce, 0xc9, 0xc0, 0x44, 0x64, 0xed, 0x00, 0xd6, 0xe2, 0x18, 0xc4, 0x88, 0x87, 0x50, 0x2d, 0xdd, + 0x53, 0x39, 0xa5, 0x6d, 0xdf, 0x67, 0x1e, 0x26, 0xdb, 0xcf, 0xfd, 0xdd, 0x3b, 0xd7, 0x80, 0xfe, + 0x64, 0x75, 0xb2, 0x42, 0xac, 0x6a, 0xdf, 0xca, 0xc1, 0xb9, 0xc8, 0xa9, 0x5d, 0xec, 0xa1, 0x9f, + 0x5b, 0x0f, 0x4b, 0x3d, 0xe6, 0x01, 0x28, 0x18, 0xad, 0x74, 0x07, 0xe7, 0x38, 0x1e, 0xed, 0xc2, + 0xe6, 0x2c, 0x7c, 0xf2, 0x22, 0x2c, 0x63, 0x1c, 0xa4, 0x91, 0xd3, 0x73, 0xe5, 0xb3, 0x6f, 0x28, + 0x80, 0x66, 0x54, 0xae, 0xfd, 0x50, 0x81, 0x4b, 0xdc, 0x2f, 0xa2, 0xe1, 0x78, 0x43, 0x54, 0xab, + 0xf7, 0xdc, 0xf7, 0xc7, 0x43, 0x78, 0x37, 0x76, 0x8e, 0xdd, 0x8c, 0xbb, 0xbf, 0xa4, 0xbe, 0x36, + 0xbb, 0xb7, 0xe4, 0x0e, 0xc6, 0xf6, 0xe2, 0xcf, 0xce, 0x05, 0x16, 0x91, 0x61, 0x48, 0x01, 0x72, + 0x44, 0x06, 0xc4, 0xd0, 0x7e, 0x19, 0xae, 0xce, 0xff, 0x00, 0xf9, 0x3c, 0xac, 0x62, 0xb2, 0xa8, + 0xee, 0xe8, 0x68, 0xec, 0xf4, 0x5d, 0xa1, 0x0a, 0x13, 0xea, 0x4b, 0xb9, 0x8c, 0x85, 0x2a, 0xe3, + 0x11, 0x02, 0x8e, 0x30, 0x0d, 0x15, 0xaf, 0x14, 0x73, 0x3e, 0x92, 0xa9, 0x69, 0xbf, 0xa2, 0x00, + 0x49, 0xd3, 0x20, 0x1f, 0x81, 0x95, 0x6e, 0xa7, 0x62, 0x4d, 0x9c, 0xf1, 0x64, 0xcf, 0x9f, 0x8e, + 0x79, 0x9c, 0x30, 0xe6, 0x30, 0x3e, 0xe9, 0xd9, 0xec, 0x01, 0xe5, 0xd8, 0x9f, 0x8e, 0xcd, 0x18, + 0x1e, 0x66, 0x39, 0x72, 0xdd, 0x2f, 0xf7, 0x9d, 0x27, 0xf1, 0x2c, 0x47, 0x1c, 0x16, 0xcb, 0x72, + 0xc4, 0x61, 0xda, 0x77, 0x15, 0xd8, 0x12, 0xd6, 0x84, 0xfd, 0x8c, 0xb6, 0x54, 0x30, 0x2c, 0xca, + 0x58, 0x04, 0xa6, 0x9d, 0xc7, 0xd2, 0x6e, 0x88, 0xc8, 0x41, 0xd8, 0x40, 0xe4, 0x6d, 0x59, 0x5d, + 0xf2, 0x29, 0x28, 0x58, 0x13, 0x7f, 0x74, 0x8a, 0xd0, 0x41, 0x6a, 0x38, 0xa3, 0x13, 0x7f, 0x84, + 0x24, 0xb0, 0xa6, 0xe6, 0xc2, 0x39, 0xb9, 0x71, 0xa2, 0xc5, 0xa4, 0x01, 0x4b, 0x3c, 0x46, 0x5c, + 0xe2, 0xa1, 0x7e, 0x4e, 0x9f, 0xb6, 0xd7, 0x45, 0x7c, 0x22, 0x1e, 0x18, 0xd5, 0x14, 0x34, 0xb4, + 0xdf, 0x52, 0xa0, 0x44, 0xb9, 0x0d, 0x94, 0xe2, 0xde, 0xeb, 0x92, 0x8e, 0x33, 0x8e, 0xc2, 0xee, + 0x24, 0x24, 0x7f, 0xaa, 0xdb, 0xf8, 0x55, 0x58, 0x4f, 0x54, 0x20, 0x1a, 0x46, 0xa6, 0x18, 0x78, + 0x3d, 0x87, 0x25, 0x4d, 0x61, 0x36, 0x1b, 0x31, 0x98, 0xf6, 0x6b, 0x0a, 0x9c, 0xa3, 0x32, 0x3f, + 0x7b, 0xe7, 0x34, 0xa7, 0x03, 0xb1, 0xdf, 0x29, 0x07, 0x25, 0xcc, 0x52, 0x99, 0xd7, 0x3c, 0xe3, + 0xa0, 0x38, 0xcc, 0x0c, 0x4b, 0xc9, 0x1e, 0x14, 0xf9, 0xfd, 0x12, 0xf0, 0x78, 0xa6, 0x57, 0x25, + 0x65, 0x42, 0x44, 0x98, 0x23, 0xd1, 0x9e, 0xe0, 0x11, 0xc6, 0xeb, 0x98, 0x61, 0x6d, 0xed, 0x3f, + 0x15, 0xb8, 0x38, 0xa3, 0x0e, 0xf9, 0x38, 0x2c, 0xa0, 0x47, 0x1f, 0x9f, 0xbd, 0xcb, 0x33, 0x3e, + 0x31, 0xe9, 0x1d, 0xef, 0xdf, 0x65, 0x17, 0xd1, 0x09, 0xfd, 0x61, 0xb2, 0x5a, 0xe4, 0x11, 0x2c, + 0xeb, 0xfd, 0x3e, 0x17, 0x67, 0x72, 0x31, 0x71, 0x66, 0xc6, 0x17, 0x5f, 0x0e, 0xf1, 0x99, 0x38, + 0xc3, 0x7c, 0x4b, 0xfa, 0x7d, 0x9b, 0x7b, 0x2b, 0x46, 0xf4, 0x2e, 0xfd, 0x7f, 0x58, 0x8b, 0x23, + 0x3f, 0x93, 0x83, 0xd5, 0xdb, 0x0a, 0xa8, 0xf1, 0x36, 0xfc, 0x6c, 0x22, 0x2b, 0x65, 0x4d, 0xf3, + 0x53, 0x16, 0xd5, 0xef, 0xe4, 0xe0, 0x7c, 0xe6, 0x08, 0x93, 0x97, 0x60, 0x51, 0x1f, 0x8d, 0x6a, + 0x55, 0xbe, 0xaa, 0x38, 0x87, 0x84, 0x5a, 0xe2, 0x98, 0xb4, 0xc7, 0x90, 0xc8, 0x2b, 0x50, 0x64, + 0xcf, 0xe9, 0x55, 0x71, 0xe0, 0x60, 0xa8, 0x18, 0xfe, 0xd6, 0x1f, 0x8f, 0x2c, 0x2a, 0x10, 0xc9, + 0x0e, 0xac, 0xf1, 0x20, 0x2b, 0xa6, 0x7b, 0xe4, 0x7e, 0x35, 0x0c, 0x71, 0x8f, 0x51, 0xf8, 0x85, + 0xea, 0xd9, 0x1e, 0xb3, 0x32, 0x39, 0xcc, 0x48, 0xbc, 0x16, 0xa9, 0x83, 0x8a, 0x34, 0x65, 0x4a, + 0x2c, 0xbc, 0x29, 0x86, 0xbd, 0x61, 0x8d, 0x98, 0x41, 0x2b, 0x55, 0x33, 0x9c, 0x2e, 0x3d, 0x08, + 0xbc, 0xa3, 0xe1, 0x89, 0x3b, 0x9c, 0xfc, 0xec, 0xa6, 0x2b, 0xfa, 0xc6, 0xa9, 0xa6, 0xeb, 0xf7, + 0x0a, 0x6c, 0x33, 0x27, 0xab, 0x51, 0x8e, 0x46, 0x8a, 0x68, 0x8d, 0x1c, 0x0d, 0x15, 0x9a, 0x78, + 0x18, 0x91, 0x2a, 0x2c, 0xb1, 0xf0, 0x2e, 0x62, 0x67, 0x5c, 0xc9, 0x6c, 0x02, 0xc3, 0xd9, 0xbf, + 0xcb, 0xd8, 0x17, 0xe6, 0x5a, 0x18, 0x98, 0xa2, 0x2a, 0xd9, 0x87, 0x52, 0x65, 0xe0, 0x3a, 0xc3, + 0xe9, 0xa8, 0x73, 0xba, 0x27, 0xc7, 0x4d, 0xde, 0x97, 0x95, 0x1e, 0xab, 0x86, 0x4f, 0x95, 0x78, + 0x92, 0xcb, 0x84, 0x48, 0x27, 0xf4, 0x36, 0x2a, 0xa0, 0xa6, 0xf2, 0xc3, 0x73, 0xc6, 0x27, 0x09, + 0xc4, 0x7a, 0x71, 0x57, 0x3a, 0xee, 0x8e, 0x64, 0xc3, 0x5a, 0xdd, 0x09, 0x26, 0x9d, 0xb1, 0x33, + 0x0c, 0x30, 0x2c, 0xe4, 0x29, 0xc2, 0x66, 0x6d, 0x89, 0x94, 0xc3, 0xa8, 0x63, 0x9c, 0x84, 0x55, + 0x99, 0x06, 0x33, 0x4e, 0x8e, 0xf2, 0x4b, 0x3b, 0xde, 0xd0, 0x19, 0x78, 0x5f, 0x13, 0x4e, 0x99, + 0x8c, 0x5f, 0x3a, 0x14, 0x40, 0x33, 0x2a, 0xd7, 0x3e, 0x97, 0x9a, 0x37, 0xd6, 0xca, 0x12, 0x2c, + 0x71, 0x97, 0x7d, 0xe6, 0xc2, 0xde, 0x36, 0x9a, 0xd5, 0x5a, 0x73, 0x57, 0x55, 0xc8, 0x1a, 0x40, + 0xdb, 0x6c, 0x55, 0x0c, 0xcb, 0xa2, 0xbf, 0x73, 0xf4, 0x37, 0xf7, 0x6f, 0xdf, 0xe9, 0xd6, 0xd5, + 0xbc, 0xe4, 0xe2, 0x5e, 0xd0, 0x7e, 0xa0, 0xc0, 0x85, 0xec, 0xa9, 0x24, 0x1d, 0xc0, 0x20, 0x07, + 0xfc, 0xf1, 0xf9, 0x23, 0x73, 0xe7, 0x3d, 0x13, 0x9c, 0x0c, 0x96, 0x30, 0x61, 0x4e, 0xf8, 0x39, + 0xf1, 0x58, 0xc4, 0xbc, 0xfa, 0xbc, 0xbe, 0x99, 0xf3, 0xfa, 0x5a, 0x05, 0x36, 0x67, 0xd1, 0x88, + 0x77, 0x75, 0x1d, 0x4a, 0x7a, 0xbb, 0x5d, 0xaf, 0x55, 0xf4, 0x4e, 0xad, 0xd5, 0x54, 0x15, 0xb2, + 0x0c, 0x0b, 0xbb, 0x66, 0xab, 0xdb, 0x56, 0x73, 0xda, 0xb7, 0x15, 0x58, 0xad, 0x45, 0x66, 0x5a, + 0xef, 0x75, 0xf3, 0x7d, 0x34, 0xb6, 0xf9, 0x36, 0xc3, 0x70, 0x20, 0xe1, 0x07, 0x4e, 0xb5, 0xf3, + 0xfe, 0x56, 0x81, 0x8d, 0x54, 0x1d, 0x62, 0xc1, 0x92, 0x7e, 0x60, 0xb5, 0x6a, 0xd5, 0x0a, 0x6f, + 0xd9, 0xb5, 0xc8, 0xbe, 0x08, 0x33, 0x3e, 0xa5, 0xbe, 0xc2, 0x5c, 0x68, 0x1f, 0x07, 0xb6, 0xef, + 0xf5, 0xa5, 0x6c, 0xad, 0x7b, 0x67, 0x4c, 0x41, 0x09, 0x6f, 0xb2, 0xaf, 0x4d, 0xc7, 0x2e, 0x92, + 0xcd, 0xc5, 0x14, 0xa1, 0x21, 0x3c, 0x4d, 0x18, 0x1d, 0x1e, 0x1c, 0x5a, 0x9e, 0x26, 0x1d, 0xd1, + 0xdb, 0x5e, 0x85, 0x12, 0x97, 0x5a, 0x50, 0x20, 0xf8, 0x9e, 0x02, 0x9b, 0xb3, 0xda, 0x4a, 0x05, + 0xa1, 0xb8, 0x3f, 0xfd, 0x85, 0x30, 0x83, 0x43, 0xdc, 0x91, 0x5e, 0xa0, 0x91, 0x4f, 0x42, 0xa9, + 0x16, 0x04, 0x53, 0x77, 0x6c, 0xbd, 0xd2, 0x35, 0x6b, 0x7c, 0x81, 0x5c, 0xf9, 0xb7, 0x77, 0xae, + 0x5d, 0x44, 0xb7, 0x84, 0xb1, 0x1d, 0xbc, 0x62, 0x4f, 0xc7, 0x5e, 0x2c, 0xda, 0xbd, 0x5c, 0x83, + 0xf2, 0xad, 0xce, 0xb4, 0xef, 0xb9, 0x82, 0x6b, 0x17, 0x3e, 0xc7, 0x1c, 0x26, 0xdf, 0x22, 0x02, + 0xa6, 0x7d, 0x43, 0x81, 0x4b, 0xb3, 0x07, 0x86, 0xde, 0x4c, 0x1d, 0x66, 0xf5, 0x23, 0xbc, 0x7e, + 0xf1, 0x66, 0x0a, 0x4d, 0x83, 0x64, 0x9a, 0x02, 0x91, 0x56, 0x0a, 0xb3, 0xa7, 0xe7, 0x52, 0x29, + 0x93, 0xe3, 0x95, 0x04, 0xa2, 0xf6, 0xef, 0x39, 0xb8, 0x40, 0x17, 0xdd, 0xc0, 0x0d, 0x02, 0x7d, + 0x3a, 0x39, 0x76, 0x87, 0x13, 0xce, 0x86, 0x91, 0xd7, 0x60, 0xf1, 0xf8, 0xd9, 0x54, 0x8e, 0x0c, + 0x9d, 0x10, 0xc0, 0x83, 0x5c, 0x38, 0x59, 0xd0, 0xff, 0xc9, 0x75, 0x90, 0x93, 0x54, 0xe7, 0x31, + 0x4c, 0x66, 0x6e, 0x53, 0x31, 0x97, 0x47, 0x61, 0x3e, 0xd9, 0xd7, 0x61, 0x01, 0xd5, 0x0c, 0xfc, + 0x48, 0x15, 0xac, 0x70, 0x76, 0xeb, 0x50, 0x09, 0x61, 0xb2, 0x0a, 0xe4, 0x43, 0x00, 0x51, 0x86, + 0x01, 0x7e, 0x66, 0x0a, 0xf1, 0x3b, 0x4c, 0x32, 0x60, 0x2e, 0x9f, 0x1c, 0x3a, 0x3c, 0x6c, 0x7f, + 0x19, 0x36, 0xc4, 0xb0, 0x8c, 0x44, 0x74, 0x3d, 0xfe, 0x1a, 0xb6, 0xce, 0x0a, 0x6a, 0x23, 0x11, + 0x61, 0xef, 0x46, 0x2a, 0xd1, 0x2e, 0x06, 0xd9, 0x4d, 0x64, 0xd3, 0xbd, 0x91, 0xca, 0xa6, 0x5b, + 0x64, 0x58, 0x72, 0xca, 0x5c, 0xed, 0x9f, 0x73, 0xb0, 0x7c, 0x40, 0x99, 0x15, 0x14, 0xc1, 0xe7, + 0x8b, 0xf4, 0xf7, 0xa0, 0x54, 0xf7, 0x1d, 0xfe, 0xec, 0xc0, 0x7d, 0x13, 0x98, 0x6f, 0xf0, 0xc0, + 0x77, 0xc4, 0x0b, 0x46, 0x60, 0xca, 0x48, 0x4f, 0xf1, 0x6b, 0xbe, 0x0f, 0x8b, 0xec, 0x19, 0x88, + 0x6b, 0x97, 0x04, 0xbb, 0x1a, 0xb6, 0xe8, 0x65, 0x56, 0x2c, 0x69, 0xca, 0xd9, 0x53, 0x92, 0xcc, + 0x3b, 0xf1, 0x58, 0xa1, 0x92, 0xc2, 0x61, 0xe1, 0x74, 0x0a, 0x07, 0x29, 0x26, 0xda, 0xe2, 0x69, + 0x62, 0xa2, 0x5d, 0x7a, 0x03, 0x4a, 0x52, 0x7b, 0x9e, 0x89, 0x7b, 0xfd, 0x7a, 0x0e, 0x56, 0xb1, + 0x57, 0xa1, 0x4d, 0xc8, 0xcf, 0xa7, 0xfa, 0xe4, 0xa3, 0x31, 0xf5, 0xc9, 0xa6, 0x3c, 0x5f, 0xac, + 0x67, 0x73, 0xf4, 0x26, 0xf7, 0x61, 0x23, 0x85, 0x48, 0x5e, 0x85, 0x05, 0xda, 0x7c, 0x21, 0x6e, + 0xaa, 0xc9, 0x15, 0x10, 0xc5, 0xcf, 0xa5, 0x1d, 0x0f, 0x4c, 0x86, 0xad, 0xfd, 0x97, 0x02, 0x2b, + 0x3c, 0x7d, 0xc5, 0xf0, 0xd0, 0x7f, 0xea, 0x70, 0xde, 0x4a, 0x0e, 0x27, 0x8b, 0xd2, 0xc1, 0x87, + 0xf3, 0x7f, 0x7a, 0x10, 0xdf, 0x88, 0x0d, 0xe2, 0xc5, 0x30, 0x9a, 0x9e, 0xe8, 0xce, 0x9c, 0x31, + 0xfc, 0x2b, 0x8c, 0x2f, 0x1b, 0x47, 0x24, 0x5f, 0x80, 0xe5, 0xa6, 0xfb, 0x38, 0x26, 0xb5, 0xdd, + 0x9a, 0x41, 0xf4, 0xe5, 0x10, 0x91, 0xed, 0x29, 0xbc, 0xf0, 0x86, 0xee, 0x63, 0x3b, 0xf5, 0x02, + 0x15, 0x91, 0xa4, 0x82, 0x5b, 0xbc, 0xda, 0xb3, 0x2c, 0x7d, 0xee, 0x28, 0x89, 0x81, 0x67, 0xbe, + 0x99, 0x07, 0x88, 0x7c, 0xcc, 0xe8, 0x06, 0x8c, 0x3d, 0xbe, 0x0b, 0x85, 0x37, 0x82, 0xe4, 0x35, + 0x2e, 0xde, 0xe4, 0x6f, 0x71, 0xc5, 0x6c, 0x6e, 0x76, 0xb4, 0x43, 0x54, 0xd1, 0x56, 0xb8, 0x53, + 0x53, 0xdf, 0x1d, 0x38, 0xec, 0x6c, 0xcf, 0x6f, 0xdf, 0xc0, 0xe0, 0xb6, 0x21, 0x74, 0x46, 0x1e, + 0x62, 0x74, 0x7d, 0xaa, 0x52, 0x84, 0x94, 0xdf, 0x66, 0xe1, 0xd9, 0xfc, 0x36, 0xdb, 0xb0, 0xec, + 0x0d, 0xdf, 0x72, 0x87, 0x13, 0x7f, 0xfc, 0x04, 0xb5, 0xd1, 0x91, 0x9a, 0x8b, 0x0e, 0x41, 0x4d, + 0x94, 0xb1, 0x79, 0xc0, 0x8b, 0x31, 0xc4, 0x97, 0xa7, 0x21, 0x04, 0x86, 0x7e, 0xa7, 0x0b, 0xea, + 0xe2, 0xfd, 0x42, 0x71, 0x51, 0x5d, 0xba, 0x5f, 0x28, 0x16, 0xd5, 0xe5, 0xfb, 0x85, 0xe2, 0xb2, + 0x0a, 0xa6, 0xf4, 0xbe, 0x13, 0xbe, 0xdf, 0x48, 0x4f, 0x2e, 0xf1, 0xe7, 0x14, 0xed, 0x27, 0x39, + 0x20, 0xe9, 0x66, 0x90, 0x8f, 0x42, 0x89, 0x1d, 0xb0, 0xf6, 0x38, 0xf8, 0x0a, 0x37, 0x5b, 0x67, + 0xe1, 0x7b, 0x24, 0xb0, 0x1c, 0xbe, 0x87, 0x81, 0xcd, 0xe0, 0x2b, 0x03, 0xf2, 0x79, 0x38, 0x8b, + 0xc3, 0x3b, 0x72, 0xc7, 0x9e, 0xdf, 0xb7, 0x31, 0xd6, 0xaa, 0x33, 0xe0, 0x39, 0x03, 0x5f, 0xc2, + 0xe4, 0xb6, 0xe9, 0xe2, 0x19, 0xd3, 0x80, 0xae, 0x64, 0x6d, 0xc4, 0x6c, 0x33, 0x44, 0xd2, 0x01, + 0x55, 0xae, 0x7f, 0x38, 0x1d, 0x0c, 0xf8, 0xcc, 0x96, 0xa9, 0xa0, 0x9b, 0x2c, 0x9b, 0x41, 0x78, + 0x2d, 0x22, 0xbc, 0x33, 0x1d, 0x0c, 0xc8, 0x6b, 0x00, 0xfe, 0xd0, 0x3e, 0xf1, 0x82, 0x80, 0xbd, + 0x71, 0x84, 0x5e, 0xaf, 0x11, 0x54, 0x9e, 0x0c, 0x7f, 0xd8, 0x60, 0x40, 0xf2, 0xff, 0x00, 0xbd, + 0xfe, 0x31, 0x1c, 0x06, 0xb3, 0x6a, 0xe1, 0x59, 0x40, 0x04, 0x30, 0xee, 0x64, 0x7b, 0xe4, 0x5a, + 0xde, 0xd7, 0x84, 0xcb, 0xc0, 0x67, 0x61, 0x83, 0x1b, 0xa1, 0x1e, 0x78, 0x93, 0x63, 0xce, 0x61, + 0xbf, 0x17, 0xf6, 0x5c, 0x62, 0xb1, 0xff, 0xbe, 0x00, 0xa0, 0x1f, 0x58, 0x22, 0xd2, 0xd4, 0x1d, + 0x58, 0xa0, 0x72, 0x83, 0xd0, 0x3f, 0xa0, 0xf6, 0x16, 0xe9, 0xca, 0xda, 0x5b, 0xc4, 0xa0, 0xbb, + 0xd1, 0x44, 0xe3, 0x6c, 0xa1, 0x7b, 0xc0, 0xdd, 0xc8, 0xec, 0xb5, 0x63, 0x91, 0x7e, 0x39, 0x16, + 0xa9, 0x03, 0x44, 0xb1, 0x9f, 0xb8, 0x24, 0xbb, 0x11, 0x05, 0x51, 0xe1, 0x05, 0x3c, 0xdb, 0x40, + 0x14, 0x3f, 0x4a, 0x5e, 0x3e, 0x11, 0x1a, 0x79, 0x00, 0x85, 0x8e, 0x13, 0xfa, 0x74, 0xce, 0x88, + 0x88, 0xf5, 0x3c, 0xcf, 0xe9, 0x18, 0x45, 0xc5, 0x5a, 0x9b, 0x38, 0xb1, 0xd4, 0xb7, 0x48, 0x84, + 0x18, 0xb0, 0xc8, 0xf3, 0x75, 0xcf, 0x88, 0xa4, 0xc8, 0xd3, 0x75, 0xf3, 0xf8, 0xc9, 0x08, 0x94, + 0x79, 0x0a, 0x9e, 0x99, 0xfb, 0x1e, 0xe4, 0x2d, 0xab, 0xc1, 0xe3, 0x40, 0xac, 0x46, 0x52, 0x89, + 0x65, 0x35, 0xd8, 0x1b, 0x65, 0x10, 0x9c, 0x48, 0xd5, 0x28, 0x32, 0xf9, 0x18, 0x94, 0x24, 0xf6, + 0x99, 0x47, 0x50, 0xc1, 0x31, 0x90, 0xbc, 0x66, 0xe4, 0x43, 0x43, 0xc2, 0x26, 0x75, 0x50, 0x1f, + 0x4c, 0xdf, 0x74, 0xf5, 0xd1, 0x08, 0xdd, 0xe9, 0xde, 0x72, 0xc7, 0x8c, 0x6d, 0x2b, 0x46, 0xa1, + 0x87, 0xd1, 0xd6, 0xbe, 0x2f, 0x4a, 0x65, 0x1d, 0x4c, 0xb2, 0x26, 0x69, 0xc3, 0x86, 0xe5, 0x4e, + 0xa6, 0x23, 0x66, 0xa7, 0xb1, 0xe3, 0x8f, 0xa9, 0x10, 0xc2, 0xe2, 0xad, 0x60, 0x94, 0xd6, 0x80, + 0x16, 0x0a, 0xe3, 0x98, 0x43, 0x7f, 0x9c, 0x10, 0x48, 0xd2, 0x95, 0x35, 0x57, 0x9e, 0x72, 0x7a, + 0xab, 0xc6, 0x45, 0x1b, 0xbc, 0x55, 0x85, 0x68, 0x13, 0x09, 0x34, 0x1f, 0xca, 0x88, 0x09, 0x86, + 0x0f, 0x66, 0x52, 0x4c, 0xb0, 0x58, 0x24, 0xb0, 0xef, 0x16, 0xa4, 0xb0, 0x94, 0x7c, 0x2e, 0x3e, + 0x0e, 0x70, 0xdf, 0xf7, 0x86, 0x0d, 0x77, 0x72, 0xec, 0xf7, 0xa5, 0xd0, 0x64, 0xa5, 0x2f, 0xf9, + 0xde, 0xd0, 0x3e, 0x41, 0xf0, 0x4f, 0xde, 0xb9, 0x26, 0x21, 0x99, 0xd2, 0xff, 0xe4, 0x83, 0xb0, + 0x4c, 0x7f, 0x75, 0x22, 0x6b, 0x13, 0xa6, 0xaa, 0xc4, 0xda, 0x2c, 0x79, 0x43, 0x84, 0x40, 0xde, + 0xc0, 0x74, 0x25, 0xde, 0x68, 0x22, 0x31, 0xaf, 0x22, 0x37, 0x89, 0x37, 0x9a, 0x24, 0x23, 0x0d, + 0x4b, 0xc8, 0x64, 0x2f, 0x6c, 0xba, 0xc8, 0x30, 0xc4, 0xb3, 0xa2, 0xa0, 0x3e, 0x8e, 0xaf, 0x35, + 0x5b, 0x84, 0x38, 0x95, 0x73, 0xc1, 0x26, 0xaa, 0x61, 0x23, 0xac, 0xbd, 0x2a, 0x7b, 0x40, 0xe1, + 0x4c, 0x2d, 0x6b, 0x44, 0x70, 0xdc, 0xb7, 0x7b, 0x08, 0x8e, 0x35, 0x22, 0x44, 0x26, 0xdb, 0xb0, + 0xce, 0x78, 0xfc, 0x30, 0x53, 0x21, 0x67, 0x71, 0xf1, 0x6c, 0x8b, 0x52, 0x19, 0xca, 0x9f, 0x4f, + 0x54, 0x20, 0x3b, 0xb0, 0x80, 0x02, 0x21, 0x37, 0x31, 0xdf, 0x92, 0xa5, 0xe7, 0xe4, 0x3e, 0xc2, + 0x73, 0x05, 0xe5, 0x66, 0xf9, 0x5c, 0x41, 0x54, 0xf2, 0x19, 0x00, 0x63, 0x38, 0xf6, 0x07, 0x03, + 0x0c, 0xc2, 0x5b, 0x44, 0x51, 0xea, 0x4a, 0x7c, 0x3f, 0x22, 0x95, 0x08, 0x89, 0x07, 0x8c, 0xc3, + 0xdf, 0x76, 0x22, 0x54, 0xaf, 0x44, 0x4b, 0xab, 0xc1, 0x22, 0xdb, 0x8c, 0x18, 0xd0, 0x9a, 0xa7, + 0xe8, 0x90, 0xc2, 0x21, 0xb3, 0x80, 0xd6, 0x1c, 0x9e, 0x0e, 0x68, 0x2d, 0x55, 0xd0, 0x1e, 0xc0, + 0xb9, 0xac, 0x8e, 0xc5, 0x44, 0x58, 0xe5, 0xb4, 0x22, 0xec, 0x77, 0xf2, 0xb0, 0x82, 0xd4, 0xc4, + 0x29, 0xac, 0xc3, 0xaa, 0x35, 0x7d, 0x33, 0x8c, 0xf6, 0x24, 0x4e, 0x63, 0x6c, 0x5f, 0x20, 0x17, + 0xc8, 0x4f, 0x5b, 0xb1, 0x1a, 0xc4, 0x80, 0x35, 0x71, 0x13, 0xec, 0x0a, 0x0b, 0xf4, 0x30, 0x96, + 0xb4, 0x88, 0x58, 0x98, 0xce, 0xd4, 0x9a, 0xa8, 0x14, 0xdd, 0x07, 0xf9, 0x67, 0xb9, 0x0f, 0x0a, + 0xa7, 0xba, 0x0f, 0x1e, 0xc1, 0x8a, 0xf8, 0x1a, 0x9e, 0xe4, 0x0b, 0xef, 0xed, 0x24, 0x8f, 0x11, + 0x23, 0xf5, 0xf0, 0x44, 0x5f, 0x9c, 0x7b, 0xa2, 0xe3, 0x7b, 0xa1, 0xd8, 0x65, 0x23, 0x84, 0xa5, + 0x0f, 0x76, 0x4c, 0x65, 0xb8, 0x5b, 0x69, 0xff, 0x14, 0xb7, 0xe4, 0xab, 0xb0, 0x5c, 0xf7, 0xc5, + 0x53, 0x91, 0xa4, 0xa3, 0x1f, 0x08, 0xa0, 0xcc, 0x2e, 0x84, 0x98, 0xe1, 0xed, 0x96, 0x7f, 0x3f, + 0x6e, 0xb7, 0x37, 0x00, 0xb8, 0x6b, 0x43, 0x94, 0x82, 0x0c, 0xb7, 0x8c, 0x88, 0x74, 0x11, 0x7f, + 0x2a, 0x90, 0x90, 0xe9, 0xe9, 0xc4, 0xad, 0x50, 0xf4, 0x5e, 0xcf, 0x9f, 0x0e, 0x27, 0xb1, 0x9c, + 0xbd, 0xc2, 0x13, 0xd2, 0xe1, 0x65, 0xf2, 0xf1, 0x90, 0xa8, 0xf6, 0xfe, 0x4e, 0x08, 0xf9, 0x74, + 0x68, 0x44, 0xb7, 0x34, 0x6f, 0x84, 0xb4, 0xd4, 0x08, 0xcd, 0x34, 0x9d, 0xd3, 0x7e, 0xa0, 0xc8, + 0x81, 0xfc, 0x7f, 0x8a, 0xa9, 0x7e, 0x1d, 0x20, 0x7c, 0xab, 0x17, 0x73, 0xcd, 0xe4, 0xa5, 0x10, + 0x2a, 0x8f, 0x72, 0x84, 0x2b, 0xf5, 0x26, 0xff, 0x7e, 0xf5, 0xa6, 0x03, 0xa5, 0xd6, 0x97, 0x27, + 0x4e, 0x64, 0xdc, 0x01, 0x56, 0xc8, 0xc9, 0xe2, 0xc9, 0x94, 0xdf, 0xbe, 0x89, 0x77, 0x43, 0xc4, + 0x07, 0xcf, 0x60, 0x81, 0xa5, 0x8a, 0xda, 0x9f, 0x29, 0xb0, 0x2e, 0xbb, 0x6f, 0x3f, 0x19, 0xf6, + 0xc8, 0x27, 0x58, 0x5c, 0x51, 0x25, 0x26, 0xb2, 0x48, 0x48, 0xf4, 0xc8, 0x7d, 0x32, 0xec, 0x31, + 0x06, 0xc8, 0x79, 0x2c, 0x37, 0x96, 0x56, 0x24, 0x6f, 0xc2, 0x4a, 0xdb, 0x1f, 0x0c, 0x28, 0x5b, + 0x33, 0x7e, 0x8b, 0x0b, 0x00, 0x94, 0x50, 0xf2, 0xc5, 0x40, 0x34, 0x68, 0xfb, 0x05, 0x2e, 0xe7, + 0x5e, 0x1c, 0xd1, 0xf3, 0xde, 0xe3, 0xf5, 0x22, 0xb2, 0x6f, 0xa3, 0xbf, 0x95, 0x4c, 0x53, 0xfb, + 0x91, 0x02, 0x24, 0xdd, 0x24, 0xf9, 0xc8, 0x52, 0xfe, 0x17, 0x58, 0xd8, 0x04, 0xeb, 0x57, 0x78, + 0x16, 0xd6, 0xaf, 0xfc, 0xdb, 0x0a, 0xac, 0xd7, 0xf4, 0x06, 0x0f, 0xed, 0xcf, 0x1e, 0x36, 0xae, + 0xc3, 0x95, 0x9a, 0xde, 0xb0, 0xdb, 0xad, 0x7a, 0xad, 0xf2, 0xd0, 0xce, 0x8c, 0xd8, 0x7b, 0x05, + 0x9e, 0x4b, 0xa3, 0x44, 0x0f, 0x20, 0x97, 0x61, 0x33, 0x5d, 0x2c, 0xa2, 0xfa, 0x66, 0x57, 0x16, + 0x01, 0x80, 0xf3, 0xe5, 0x4f, 0xc2, 0xba, 0x88, 0x60, 0xdb, 0xa9, 0x5b, 0x18, 0x23, 0x7f, 0x1d, + 0x4a, 0xfb, 0x86, 0x59, 0xdb, 0x79, 0x68, 0xef, 0x74, 0xeb, 0x75, 0xf5, 0x0c, 0x59, 0x85, 0x65, + 0x0e, 0xa8, 0xe8, 0xaa, 0x42, 0x56, 0xa0, 0x58, 0x6b, 0x5a, 0x46, 0xa5, 0x6b, 0x1a, 0x6a, 0xae, + 0xfc, 0x49, 0x58, 0x6b, 0x8f, 0xbd, 0xb7, 0x9c, 0x89, 0xfb, 0xc0, 0x7d, 0x82, 0xef, 0x17, 0x4b, + 0x90, 0x37, 0xf5, 0x03, 0xf5, 0x0c, 0x01, 0x58, 0x6c, 0x3f, 0xa8, 0x58, 0x77, 0xef, 0xaa, 0x0a, + 0x29, 0xc1, 0xd2, 0x6e, 0xa5, 0x6d, 0x3f, 0x68, 0x58, 0x6a, 0x8e, 0xfe, 0xd0, 0x0f, 0x2c, 0xfc, + 0x91, 0x2f, 0x7f, 0x18, 0x36, 0x90, 0x21, 0xa9, 0x7b, 0xc1, 0xc4, 0x1d, 0xba, 0x63, 0x6c, 0xc3, + 0x0a, 0x14, 0x2d, 0x97, 0x9e, 0x24, 0x13, 0x97, 0x35, 0xa0, 0x31, 0x1d, 0x4c, 0xbc, 0xd1, 0xc0, + 0xfd, 0xaa, 0xaa, 0x94, 0xdf, 0x80, 0x75, 0xd3, 0x9f, 0x4e, 0xbc, 0xe1, 0x91, 0x35, 0xa1, 0x18, + 0x47, 0x4f, 0xc8, 0x79, 0xd8, 0xe8, 0x36, 0xf5, 0xc6, 0x76, 0x6d, 0xb7, 0xdb, 0xea, 0x5a, 0x76, + 0x43, 0xef, 0x54, 0xf6, 0xd8, 0xeb, 0x49, 0xa3, 0x65, 0x75, 0x6c, 0xd3, 0xa8, 0x18, 0xcd, 0x8e, + 0xaa, 0x94, 0xbf, 0x85, 0xba, 0x95, 0x9e, 0x3f, 0xec, 0xef, 0x38, 0xbd, 0x89, 0x3f, 0xc6, 0x06, + 0x6b, 0x70, 0xd5, 0x32, 0x2a, 0xad, 0x66, 0xd5, 0xde, 0xd1, 0x2b, 0x9d, 0x96, 0x99, 0x15, 0x32, + 0xfa, 0x12, 0x5c, 0xc8, 0xc0, 0x69, 0x75, 0xda, 0xaa, 0x42, 0xae, 0xc1, 0x56, 0x46, 0xd9, 0x81, + 0xb1, 0xad, 0x77, 0x3b, 0x7b, 0x4d, 0x35, 0x37, 0xa3, 0xb2, 0x65, 0xb5, 0xd4, 0x7c, 0xf9, 0xd7, + 0x15, 0x58, 0xeb, 0x06, 0xdc, 0x74, 0xb9, 0x8b, 0x5e, 0x8b, 0xcf, 0xc3, 0xe5, 0xae, 0x65, 0x98, + 0x76, 0xa7, 0xf5, 0xc0, 0x68, 0xda, 0x5d, 0x4b, 0xdf, 0x4d, 0xb6, 0xe6, 0x1a, 0x6c, 0x49, 0x18, + 0xa6, 0x51, 0x69, 0xed, 0x1b, 0xa6, 0xdd, 0xd6, 0x2d, 0xeb, 0xa0, 0x65, 0x56, 0x55, 0x85, 0x7e, + 0x31, 0x03, 0xa1, 0xb1, 0xa3, 0xb3, 0xd6, 0xc4, 0xca, 0x9a, 0xc6, 0x81, 0x5e, 0xb7, 0xb7, 0x5b, + 0x1d, 0x35, 0x5f, 0x6e, 0xd0, 0xfb, 0x1d, 0x03, 0xb7, 0x32, 0x83, 0xbb, 0x22, 0x14, 0x9a, 0xad, + 0xa6, 0x91, 0x7c, 0x73, 0x5b, 0x81, 0xa2, 0xde, 0x6e, 0x9b, 0xad, 0x7d, 0x5c, 0x62, 0x00, 0x8b, + 0x55, 0xa3, 0x49, 0x5b, 0x96, 0xa7, 0x25, 0x6d, 0xb3, 0xd5, 0x68, 0x75, 0x8c, 0xaa, 0x5a, 0x28, + 0x9b, 0x62, 0x0b, 0x0b, 0xa2, 0x3d, 0x9f, 0x3d, 0x70, 0x55, 0x8d, 0x1d, 0xbd, 0x5b, 0xef, 0xf0, + 0x29, 0x7a, 0x68, 0x9b, 0xc6, 0xa7, 0xbb, 0x86, 0xd5, 0xb1, 0x54, 0x85, 0xa8, 0xb0, 0xd2, 0x34, + 0x8c, 0xaa, 0x65, 0x9b, 0xc6, 0x7e, 0xcd, 0x38, 0x50, 0x73, 0x94, 0x26, 0xfb, 0x9f, 0x7e, 0xa1, + 0xfc, 0x5d, 0x05, 0x08, 0x0b, 0x7a, 0x2b, 0x32, 0xa9, 0xe0, 0x8a, 0xb9, 0x0a, 0x97, 0xf6, 0xe8, + 0x54, 0x63, 0xd7, 0x1a, 0xad, 0x6a, 0x72, 0xc8, 0x2e, 0x00, 0x49, 0x94, 0xb7, 0x76, 0x76, 0x54, + 0x85, 0x6c, 0xc1, 0xd9, 0x04, 0xbc, 0x6a, 0xb6, 0xda, 0x6a, 0xee, 0x52, 0xae, 0xa8, 0x90, 0x8b, + 0xa9, 0xc2, 0x07, 0x86, 0xd1, 0x56, 0xf3, 0x74, 0x8a, 0x12, 0x05, 0x62, 0x4b, 0xb0, 0xea, 0x85, + 0xf2, 0x37, 0x14, 0xb8, 0xc0, 0x9a, 0x29, 0xf6, 0x57, 0xd8, 0xd4, 0xcb, 0xb0, 0xc9, 0x43, 0x79, + 0x67, 0x35, 0xf4, 0x1c, 0xa8, 0xb1, 0x52, 0xd6, 0xcc, 0xf3, 0xb0, 0x11, 0x83, 0x62, 0x3b, 0x72, + 0xf4, 0xf4, 0x88, 0x81, 0xb7, 0x0d, 0xab, 0x63, 0x1b, 0x3b, 0x3b, 0x2d, 0xb3, 0xc3, 0x1a, 0x92, + 0x2f, 0x6b, 0xb0, 0x51, 0x71, 0xc7, 0x13, 0x2a, 0x7a, 0x0d, 0x03, 0xcf, 0x1f, 0x62, 0x13, 0x56, + 0x61, 0xd9, 0xf8, 0x4c, 0xc7, 0x68, 0x5a, 0xb5, 0x56, 0x53, 0x3d, 0x53, 0xbe, 0x9c, 0xc0, 0x11, + 0xfb, 0xd8, 0xb2, 0xf6, 0xd4, 0x33, 0x65, 0x07, 0x56, 0x85, 0x91, 0x30, 0x5b, 0x15, 0x57, 0xe1, + 0x92, 0x58, 0x6b, 0x78, 0xa2, 0x24, 0xbb, 0xb0, 0x09, 0xe7, 0xd2, 0xe5, 0x46, 0x47, 0x55, 0xe8, + 0x2c, 0x24, 0x4a, 0x28, 0x3c, 0x57, 0xfe, 0x55, 0x05, 0x56, 0xc3, 0x47, 0x13, 0x54, 0xd3, 0x5e, + 0x83, 0xad, 0xc6, 0x8e, 0x6e, 0x57, 0x8d, 0xfd, 0x5a, 0xc5, 0xb0, 0x1f, 0xd4, 0x9a, 0xd5, 0xc4, + 0x47, 0x9e, 0x83, 0xf3, 0x19, 0x08, 0xf8, 0x95, 0x4d, 0x38, 0x97, 0x2c, 0xea, 0xd0, 0xad, 0x9a, + 0xa3, 0x43, 0x9f, 0x2c, 0x09, 0xf7, 0x69, 0xbe, 0xbc, 0x0f, 0x6b, 0x96, 0xde, 0xa8, 0xef, 0xf8, + 0xe3, 0x9e, 0xab, 0x4f, 0x27, 0xc7, 0x43, 0xb2, 0x05, 0x17, 0x77, 0x5a, 0x66, 0xc5, 0xb0, 0x11, + 0x25, 0xd1, 0x82, 0xb3, 0xb0, 0x2e, 0x17, 0x3e, 0x34, 0xe8, 0xf2, 0x25, 0xb0, 0x26, 0x03, 0x9b, + 0x2d, 0x35, 0x57, 0xfe, 0x1c, 0xac, 0xc4, 0x12, 0xaa, 0x5d, 0x84, 0xb3, 0xf2, 0xef, 0xb6, 0x3b, + 0xec, 0x7b, 0xc3, 0x23, 0xf5, 0x4c, 0xb2, 0xc0, 0x9c, 0x0e, 0x87, 0xb4, 0x00, 0xf7, 0xb3, 0x5c, + 0xd0, 0x71, 0xc7, 0x27, 0xde, 0xd0, 0x99, 0xb8, 0x7d, 0x35, 0x57, 0x7e, 0x19, 0x56, 0x63, 0x61, + 0x9c, 0xe9, 0xc4, 0xd5, 0x5b, 0xfc, 0x00, 0x6e, 0x18, 0xd5, 0x5a, 0xb7, 0xa1, 0x2e, 0xd0, 0x9d, + 0xbc, 0x57, 0xdb, 0xdd, 0x53, 0xa1, 0xfc, 0x6d, 0x85, 0xca, 0x19, 0x98, 0x9c, 0xa5, 0xb1, 0xa3, + 0x8b, 0xa9, 0xa6, 0xcb, 0x8c, 0x05, 0x87, 0x37, 0x2c, 0x8b, 0x3d, 0x35, 0x5f, 0x86, 0x4d, 0xfe, + 0xc3, 0xd6, 0x9b, 0x55, 0x7b, 0x4f, 0x37, 0xab, 0x07, 0xba, 0x49, 0xd7, 0xde, 0x43, 0x35, 0x87, + 0x1b, 0x4a, 0x82, 0xd8, 0x9d, 0x56, 0xb7, 0xb2, 0xa7, 0xe6, 0xe9, 0xfa, 0x8d, 0xc1, 0xdb, 0xb5, + 0xa6, 0x5a, 0xc0, 0xed, 0x99, 0xc2, 0x46, 0xb2, 0xb4, 0x7c, 0xa1, 0xfc, 0xae, 0x02, 0x17, 0x2d, + 0xef, 0x68, 0xe8, 0x4c, 0xa6, 0x63, 0x57, 0x1f, 0x1c, 0xf9, 0x63, 0x6f, 0x72, 0x7c, 0x62, 0x4d, + 0xbd, 0x89, 0x4b, 0xee, 0xc0, 0x4d, 0xab, 0xb6, 0xdb, 0xd4, 0x3b, 0x74, 0x7b, 0xe9, 0xf5, 0xdd, + 0x96, 0x59, 0xeb, 0xec, 0x35, 0x6c, 0xab, 0x5b, 0x4b, 0xad, 0xbc, 0x1b, 0xf0, 0xfc, 0x6c, 0xd4, + 0xba, 0xb1, 0xab, 0x57, 0x1e, 0xaa, 0xca, 0x7c, 0x82, 0xdb, 0x7a, 0x5d, 0x6f, 0x56, 0x8c, 0xaa, + 0xbd, 0x7f, 0x57, 0xcd, 0x91, 0x9b, 0x70, 0x7d, 0x36, 0xea, 0x4e, 0xad, 0x6d, 0x51, 0xb4, 0xfc, + 0xfc, 0xef, 0xee, 0x59, 0x0d, 0x8a, 0x55, 0x28, 0xff, 0xa1, 0x02, 0x9b, 0xb3, 0x62, 0xf9, 0x90, + 0x5b, 0xa0, 0x19, 0xcd, 0x8e, 0xa9, 0xd7, 0xaa, 0x76, 0xc5, 0x34, 0xaa, 0x46, 0xb3, 0x53, 0xd3, + 0xeb, 0x96, 0x6d, 0xb5, 0xba, 0x74, 0x35, 0x45, 0x16, 0x01, 0x2f, 0xc0, 0xb5, 0x39, 0x78, 0xad, + 0x5a, 0xb5, 0xa2, 0x2a, 0xe4, 0x2e, 0xbc, 0x34, 0x07, 0xc9, 0x7a, 0x68, 0x75, 0x8c, 0x86, 0x5c, + 0xa2, 0xe6, 0xca, 0x15, 0xb8, 0x34, 0x3b, 0xd8, 0x07, 0x3d, 0xa6, 0xe3, 0x23, 0x5d, 0x84, 0x42, + 0x95, 0xde, 0x0c, 0xb1, 0x1c, 0x02, 0x65, 0x0f, 0xd4, 0xa4, 0xbf, 0x7e, 0xca, 0x74, 0xc3, 0xec, + 0x36, 0x9b, 0xec, 0x1a, 0x59, 0x87, 0x52, 0xab, 0xb3, 0x67, 0x98, 0x3c, 0x0b, 0x03, 0xa6, 0x5d, + 0xe8, 0x36, 0xe9, 0xc6, 0x69, 0x99, 0xb5, 0xcf, 0xe2, 0x7d, 0xb2, 0x09, 0xe7, 0xac, 0xba, 0x5e, + 0x79, 0x60, 0x37, 0x5b, 0x1d, 0xbb, 0xd6, 0xb4, 0x2b, 0x7b, 0x7a, 0xb3, 0x69, 0xd4, 0x55, 0xc0, + 0xc1, 0x9c, 0xe5, 0xa3, 0x47, 0x3e, 0x08, 0xb7, 0x5b, 0x0f, 0x3a, 0xba, 0xdd, 0xae, 0x77, 0x77, + 0x6b, 0x4d, 0xdb, 0x7a, 0xd8, 0xac, 0x08, 0xde, 0xa7, 0x92, 0x3e, 0x72, 0x6f, 0xc3, 0x8d, 0xb9, + 0xd8, 0x51, 0xbe, 0x84, 0x5b, 0xa0, 0xcd, 0xc5, 0xe4, 0x1d, 0x29, 0xff, 0x50, 0x81, 0xad, 0x39, + 0x6f, 0xc8, 0xe4, 0x25, 0xb8, 0xb3, 0x67, 0xe8, 0xd5, 0xba, 0x61, 0x59, 0x78, 0x50, 0xd0, 0x69, + 0x60, 0x26, 0x1e, 0x99, 0x07, 0xea, 0x1d, 0xb8, 0x39, 0x1f, 0x3d, 0xba, 0x9a, 0x6f, 0xc3, 0x8d, + 0xf9, 0xa8, 0xfc, 0xaa, 0xce, 0x91, 0x32, 0xdc, 0x9a, 0x8f, 0x19, 0x5e, 0xf1, 0xf9, 0xf2, 0x6f, + 0x2a, 0x70, 0x21, 0x5b, 0x91, 0x43, 0xdb, 0x56, 0x6b, 0x5a, 0x1d, 0xbd, 0x5e, 0xb7, 0xdb, 0xba, + 0xa9, 0x37, 0x6c, 0xa3, 0x69, 0xb6, 0xea, 0xf5, 0xac, 0xab, 0xed, 0x06, 0x3c, 0x3f, 0x1b, 0xd5, + 0xaa, 0x98, 0xb5, 0x36, 0x3d, 0xbd, 0x35, 0xb8, 0x3a, 0x1b, 0xcb, 0xa8, 0x55, 0x0c, 0x35, 0xb7, + 0xfd, 0xf1, 0xef, 0xff, 0xd3, 0xd5, 0x33, 0xdf, 0x7f, 0xf7, 0xaa, 0xf2, 0xa3, 0x77, 0xaf, 0x2a, + 0xff, 0xf8, 0xee, 0x55, 0xe5, 0xb3, 0x2f, 0x9e, 0x2e, 0xd5, 0x10, 0xf2, 0xfd, 0x6f, 0x2e, 0xa2, + 0x84, 0xf2, 0xca, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x03, 0xd6, 0x08, 0x80, 0x74, 0xb9, 0x01, + 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -33425,6 +33571,135 @@ func (m *RoleSpecV6) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SSHLocalPortForwarding) 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 *SSHLocalPortForwarding) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSHLocalPortForwarding) 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 m.Enabled != nil { + { + size := m.Enabled.Size() + i -= size + if _, err := m.Enabled.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SSHRemotePortForwarding) 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 *SSHRemotePortForwarding) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSHRemotePortForwarding) 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 m.Enabled != nil { + { + size := m.Enabled.Size() + i -= size + if _, err := m.Enabled.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SSHPortForwarding) 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 *SSHPortForwarding) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSHPortForwarding) 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 m.Remote != nil { + { + size, err := m.Remote.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Local != nil { + { + size, err := m.Local.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *RoleOptions) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -33449,6 +33724,20 @@ func (m *RoleOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.SSHPortForwarding != nil { + { + size, err := m.SSHPortForwarding.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0x82 + } if len(m.CreateHostUserDefaultShell) > 0 { i -= len(m.CreateHostUserDefaultShell) copy(dAtA[i:], m.CreateHostUserDefaultShell) @@ -33458,12 +33747,12 @@ func (m *RoleOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xfa } - n152, err152 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) - if err152 != nil { - return 0, err152 + n157, err157 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) + if err157 != nil { + return 0, err157 } - i -= n152 - i = encodeVarintTypes(dAtA, i, uint64(n152)) + i -= n157 + i = encodeVarintTypes(dAtA, i, uint64(n157)) i-- dAtA[i] = 0x1 i-- @@ -33873,6 +34162,27 @@ func (m *RoleConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.WorkloadIdentityLabelsExpression) > 0 { + i -= len(m.WorkloadIdentityLabelsExpression) + copy(dAtA[i:], m.WorkloadIdentityLabelsExpression) + i = encodeVarintTypes(dAtA, i, uint64(len(m.WorkloadIdentityLabelsExpression))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xea + } + { + size := m.WorkloadIdentityLabels.Size() + i -= size + if _, err := m.WorkloadIdentityLabels.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xe2 if len(m.AccountAssignments) > 0 { for iNdEx := len(m.AccountAssignments) - 1; iNdEx >= 0; iNdEx-- { { @@ -35404,12 +35714,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n182, err182 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err182 != nil { - return 0, err182 + n188, err188 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err188 != nil { + return 0, err188 } - i -= n182 - i = encodeVarintTypes(dAtA, i, uint64(n182)) + i -= n188 + i = encodeVarintTypes(dAtA, i, uint64(n188)) i-- dAtA[i] = 0x3a { @@ -35558,20 +35868,20 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err185 != nil { - return 0, err185 + n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) + if err191 != nil { + return 0, err191 } - i -= n185 - i = encodeVarintTypes(dAtA, i, uint64(n185)) + i -= n191 + i = encodeVarintTypes(dAtA, i, uint64(n191)) i-- dAtA[i] = 0x22 - n186, err186 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) - if err186 != nil { - return 0, err186 + n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err192 != nil { + return 0, err192 } - i -= n186 - i = encodeVarintTypes(dAtA, i, uint64(n186)) + i -= n192 + i = encodeVarintTypes(dAtA, i, uint64(n192)) i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { @@ -35628,12 +35938,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n188, err188 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err188 != nil { - return 0, err188 + n194, err194 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err194 != nil { + return 0, err194 } - i -= n188 - i = encodeVarintTypes(dAtA, i, uint64(n188)) + i -= n194 + i = encodeVarintTypes(dAtA, i, uint64(n194)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -35751,20 +36061,20 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err191 != nil { - return 0, err191 + n197, err197 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) + if err197 != nil { + return 0, err197 } - i -= n191 - i = encodeVarintTypes(dAtA, i, uint64(n191)) + i -= n197 + i = encodeVarintTypes(dAtA, i, uint64(n197)) i-- dAtA[i] = 0x3a - n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) - if err192 != nil { - return 0, err192 + n198, err198 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err198 != nil { + return 0, err198 } - i -= n192 - i = encodeVarintTypes(dAtA, i, uint64(n192)) + i -= n198 + i = encodeVarintTypes(dAtA, i, uint64(n198)) i-- dAtA[i] = 0x32 if len(m.Id) > 0 { @@ -36461,12 +36771,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n204, err204 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err204 != nil { - return 0, err204 + n210, err210 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err210 != nil { + return 0, err210 } - i -= n204 - i = encodeVarintTypes(dAtA, i, uint64(n204)) + i -= n210 + i = encodeVarintTypes(dAtA, i, uint64(n210)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -36558,12 +36868,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n205, err205 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err205 != nil { - return 0, err205 + n211, err211 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err211 != nil { + return 0, err211 } - i -= n205 - i = encodeVarintTypes(dAtA, i, uint64(n205)) + i -= n211 + i = encodeVarintTypes(dAtA, i, uint64(n211)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -36612,12 +36922,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n206, err206 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err206 != nil { - return 0, err206 + n212, err212 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err212 != nil { + return 0, err212 } - i -= n206 - i = encodeVarintTypes(dAtA, i, uint64(n206)) + i -= n212 + i = encodeVarintTypes(dAtA, i, uint64(n212)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -36675,12 +36985,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n207, err207 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err207 != nil { - return 0, err207 + n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err213 != nil { + return 0, err213 } - i -= n207 - i = encodeVarintTypes(dAtA, i, uint64(n207)) + i -= n213 + i = encodeVarintTypes(dAtA, i, uint64(n213)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -36952,28 +37262,28 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err214 != nil { - return 0, err214 + n220, err220 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) + if err220 != nil { + return 0, err220 } - i -= n214 - i = encodeVarintTypes(dAtA, i, uint64(n214)) + i -= n220 + i = encodeVarintTypes(dAtA, i, uint64(n220)) i-- dAtA[i] = 0x42 - n215, err215 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err215 != nil { - return 0, err215 + n221, err221 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err221 != nil { + return 0, err221 } - i -= n215 - i = encodeVarintTypes(dAtA, i, uint64(n215)) + i -= n221 + i = encodeVarintTypes(dAtA, i, uint64(n221)) i-- dAtA[i] = 0x3a - n216, err216 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) - if err216 != nil { - return 0, err216 + n222, err222 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err222 != nil { + return 0, err222 } - i -= n216 - i = encodeVarintTypes(dAtA, i, uint64(n216)) + i -= n222 + i = encodeVarintTypes(dAtA, i, uint64(n222)) i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { @@ -37206,20 +37516,20 @@ func (m *SAMLSessionData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - n217, err217 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) - if err217 != nil { - return 0, err217 + n223, err223 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) + if err223 != nil { + return 0, err223 } - i -= n217 - i = encodeVarintTypes(dAtA, i, uint64(n217)) + i -= n223 + i = encodeVarintTypes(dAtA, i, uint64(n223)) i-- dAtA[i] = 0x1a - n218, err218 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) - if err218 != nil { - return 0, err218 + n224, err224 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + if err224 != nil { + return 0, err224 } - i -= n218 - i = encodeVarintTypes(dAtA, i, uint64(n218)) + i -= n224 + i = encodeVarintTypes(dAtA, i, uint64(n224)) i-- dAtA[i] = 0x12 if len(m.ID) > 0 { @@ -37501,12 +37811,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n222, err222 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err222 != nil { - return 0, err222 + n228, err228 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err228 != nil { + return 0, err228 } - i -= n222 - i = encodeVarintTypes(dAtA, i, uint64(n222)) + i -= n228 + i = encodeVarintTypes(dAtA, i, uint64(n228)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -40275,12 +40585,12 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x62 } if m.Expires != nil { - n263, err263 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err263 != nil { - return 0, err263 + n269, err269 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err269 != nil { + return 0, err269 } - i -= n263 - i = encodeVarintTypes(dAtA, i, uint64(n263)) + i -= n269 + i = encodeVarintTypes(dAtA, i, uint64(n269)) i-- dAtA[i] = 0x5a } @@ -41292,21 +41602,21 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a } - n281, err281 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) - if err281 != nil { - return 0, err281 + n287, err287 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) + if err287 != nil { + return 0, err287 } - i -= n281 - i = encodeVarintTypes(dAtA, i, uint64(n281)) + i -= n287 + i = encodeVarintTypes(dAtA, i, uint64(n287)) i-- dAtA[i] = 0x22 if m.Expires != nil { - n282, err282 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err282 != nil { - return 0, err282 + n288, err288 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err288 != nil { + return 0, err288 } - i -= n282 - i = encodeVarintTypes(dAtA, i, uint64(n282)) + i -= n288 + i = encodeVarintTypes(dAtA, i, uint64(n288)) i-- dAtA[i] = 0x1a } @@ -42023,12 +42333,12 @@ func (m *RegisterUsingTokenRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro dAtA[i] = 0x6a } if m.Expires != nil { - n294, err294 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err294 != nil { - return 0, err294 + n300, err300 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err300 != nil { + return 0, err300 } - i -= n294 - i = encodeVarintTypes(dAtA, i, uint64(n294)) + i -= n300 + i = encodeVarintTypes(dAtA, i, uint64(n300)) i-- dAtA[i] = 0x62 } @@ -42208,12 +42518,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n297, err297 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err297 != nil { - return 0, err297 + n303, err303 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err303 != nil { + return 0, err303 } - i -= n297 - i = encodeVarintTypes(dAtA, i, uint64(n297)) + i -= n303 + i = encodeVarintTypes(dAtA, i, uint64(n303)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -42593,20 +42903,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n301, err301 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err301 != nil { - return 0, err301 + n307, err307 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err307 != nil { + return 0, err307 } - i -= n301 - i = encodeVarintTypes(dAtA, i, uint64(n301)) + i -= n307 + i = encodeVarintTypes(dAtA, i, uint64(n307)) i-- dAtA[i] = 0x2a - n302, err302 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err302 != nil { - return 0, err302 + n308, err308 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err308 != nil { + return 0, err308 } - i -= n302 - i = encodeVarintTypes(dAtA, i, uint64(n302)) + i -= n308 + i = encodeVarintTypes(dAtA, i, uint64(n308)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -42710,12 +43020,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n303, err303 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err303 != nil { - return 0, err303 + n309, err309 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err309 != nil { + return 0, err309 } - i -= n303 - i = encodeVarintTypes(dAtA, i, uint64(n303)) + i -= n309 + i = encodeVarintTypes(dAtA, i, uint64(n309)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -43427,12 +43737,12 @@ func (m *ClusterAlertSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n316, err316 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err316 != nil { - return 0, err316 + n322, err322 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err322 != nil { + return 0, err322 } - i -= n316 - i = encodeVarintTypes(dAtA, i, uint64(n316)) + i -= n322 + i = encodeVarintTypes(dAtA, i, uint64(n322)) i-- dAtA[i] = 0x1a if len(m.Message) > 0 { @@ -43562,12 +43872,12 @@ func (m *AlertAcknowledgement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n317, err317 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err317 != nil { - return 0, err317 + n323, err323 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err323 != nil { + return 0, err323 } - i -= n317 - i = encodeVarintTypes(dAtA, i, uint64(n317)) + i -= n323 + i = encodeVarintTypes(dAtA, i, uint64(n323)) i-- dAtA[i] = 0x22 if len(m.Reason) > 0 { @@ -45894,12 +46204,12 @@ func (m *PluginStatusV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n352, err352 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) - if err352 != nil { - return 0, err352 + n358, err358 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) + if err358 != nil { + return 0, err358 } - i -= n352 - i = encodeVarintTypes(dAtA, i, uint64(n352)) + i -= n358 + i = encodeVarintTypes(dAtA, i, uint64(n358)) i-- dAtA[i] = 0x1a if len(m.ErrorMessage) > 0 { @@ -46260,22 +46570,22 @@ func (m *PluginOktaStatusDetailsAppGroupSync) MarshalToSizedBuffer(dAtA []byte) dAtA[i] = 0x28 } if m.LastFailed != nil { - n362, err362 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err362 != nil { - return 0, err362 + n368, err368 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err368 != nil { + return 0, err368 } - i -= n362 - i = encodeVarintTypes(dAtA, i, uint64(n362)) + i -= n368 + i = encodeVarintTypes(dAtA, i, uint64(n368)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n363, err363 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err363 != nil { - return 0, err363 + n369, err369 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err369 != nil { + return 0, err369 } - i -= n363 - i = encodeVarintTypes(dAtA, i, uint64(n363)) + i -= n369 + i = encodeVarintTypes(dAtA, i, uint64(n369)) i-- dAtA[i] = 0x1a } @@ -46334,22 +46644,22 @@ func (m *PluginOktaStatusDetailsUsersSync) MarshalToSizedBuffer(dAtA []byte) (in dAtA[i] = 0x28 } if m.LastFailed != nil { - n364, err364 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err364 != nil { - return 0, err364 + n370, err370 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err370 != nil { + return 0, err370 } - i -= n364 - i = encodeVarintTypes(dAtA, i, uint64(n364)) + i -= n370 + i = encodeVarintTypes(dAtA, i, uint64(n370)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n365, err365 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err365 != nil { - return 0, err365 + n371, err371 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err371 != nil { + return 0, err371 } - i -= n365 - i = encodeVarintTypes(dAtA, i, uint64(n365)) + i -= n371 + i = encodeVarintTypes(dAtA, i, uint64(n371)) i-- dAtA[i] = 0x1a } @@ -46468,22 +46778,22 @@ func (m *PluginOktaStatusDetailsAccessListsSync) MarshalToSizedBuffer(dAtA []byt } } if m.LastFailed != nil { - n366, err366 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err366 != nil { - return 0, err366 + n372, err372 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err372 != nil { + return 0, err372 } - i -= n366 - i = encodeVarintTypes(dAtA, i, uint64(n366)) + i -= n372 + i = encodeVarintTypes(dAtA, i, uint64(n372)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n367, err367 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err367 != nil { - return 0, err367 + n373, err373 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err373 != nil { + return 0, err373 } - i -= n367 - i = encodeVarintTypes(dAtA, i, uint64(n367)) + i -= n373 + i = encodeVarintTypes(dAtA, i, uint64(n373)) i-- dAtA[i] = 0x1a } @@ -46649,12 +46959,12 @@ func (m *PluginOAuth2AccessTokenCredentials) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n372, err372 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err372 != nil { - return 0, err372 + n378, err378 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err378 != nil { + return 0, err378 } - i -= n372 - i = encodeVarintTypes(dAtA, i, uint64(n372)) + i -= n378 + i = encodeVarintTypes(dAtA, i, uint64(n378)) i-- dAtA[i] = 0x1a if len(m.RefreshToken) > 0 { @@ -47534,20 +47844,20 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n386, err386 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err386 != nil { - return 0, err386 + n392, err392 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) + if err392 != nil { + return 0, err392 } - i -= n386 - i = encodeVarintTypes(dAtA, i, uint64(n386)) + i -= n392 + i = encodeVarintTypes(dAtA, i, uint64(n392)) i-- dAtA[i] = 0x12 - n387, err387 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) - if err387 != nil { - return 0, err387 + n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err393 != nil { + return 0, err393 } - i -= n387 - i = encodeVarintTypes(dAtA, i, uint64(n387)) + i -= n393 + i = encodeVarintTypes(dAtA, i, uint64(n393)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -47974,12 +48284,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err394 != nil { - return 0, err394 + n400, err400 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err400 != nil { + return 0, err400 } - i -= n394 - i = encodeVarintTypes(dAtA, i, uint64(n394)) + i -= n400 + i = encodeVarintTypes(dAtA, i, uint64(n400)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -47987,12 +48297,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err395 != nil { - return 0, err395 + n401, err401 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err401 != nil { + return 0, err401 } - i -= n395 - i = encodeVarintTypes(dAtA, i, uint64(n395)) + i -= n401 + i = encodeVarintTypes(dAtA, i, uint64(n401)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -49435,12 +49745,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n418, err418 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err418 != nil { - return 0, err418 + n424, err424 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err424 != nil { + return 0, err424 } - i -= n418 - i = encodeVarintTypes(dAtA, i, uint64(n418)) + i -= n424 + i = encodeVarintTypes(dAtA, i, uint64(n424)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -53373,6 +53683,58 @@ func (m *RoleSpecV6) Size() (n int) { return n } +func (m *SSHLocalPortForwarding) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled != nil { + l = m.Enabled.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SSHRemotePortForwarding) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled != nil { + l = m.Enabled.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SSHPortForwarding) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Local != nil { + l = m.Local.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Remote != nil { + l = m.Remote.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *RoleOptions) Size() (n int) { if m == nil { return 0 @@ -53489,6 +53851,10 @@ func (m *RoleOptions) Size() (n int) { if l > 0 { n += 2 + l + sovTypes(uint64(l)) } + if m.SSHPortForwarding != nil { + l = m.SSHPortForwarding.Size() + n += 2 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -53737,6 +54103,12 @@ func (m *RoleConditions) Size() (n int) { n += 2 + l + sovTypes(uint64(l)) } } + l = m.WorkloadIdentityLabels.Size() + n += 2 + l + sovTypes(uint64(l)) + l = len(m.WorkloadIdentityLabelsExpression) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -86154,40 +86526,364 @@ func (m *RoleV6) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RoleSpecV6) 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: RoleSpecV6: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RoleSpecV6: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", 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.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Allow", 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.Allow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Deny", 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.Deny.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SSHLocalPortForwarding) 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: SSHLocalPortForwarding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SSHLocalPortForwarding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Enabled == nil { + m.Enabled = &BoolOption{} + } + if err := m.Enabled.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SSHRemotePortForwarding) 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: SSHRemotePortForwarding: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SSHRemotePortForwarding: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Enabled == nil { + m.Enabled = &BoolOption{} } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Enabled.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -86213,7 +86909,7 @@ func (m *RoleV6) Unmarshal(dAtA []byte) error { } return nil } -func (m *RoleSpecV6) Unmarshal(dAtA []byte) error { +func (m *SSHPortForwarding) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -86236,15 +86932,15 @@ func (m *RoleSpecV6) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RoleSpecV6: wiretype end group for non-group") + return fmt.Errorf("proto: SSHPortForwarding: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RoleSpecV6: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SSHPortForwarding: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Local", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86271,13 +86967,16 @@ func (m *RoleSpecV6) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Local == nil { + m.Local = &SSHLocalPortForwarding{} + } + if err := m.Local.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Allow", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Remote", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86304,40 +87003,10 @@ func (m *RoleSpecV6) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Allow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Deny", wireType) + if m.Remote == nil { + m.Remote = &SSHRemotePortForwarding{} } - 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.Deny.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Remote.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -86914,36 +87583,195 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CreateHostUser == nil { - m.CreateHostUser = &BoolOption{} + if m.CreateHostUser == nil { + m.CreateHostUser = &BoolOption{} + } + if err := m.CreateHostUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 21: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PinSourceIP", 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.PinSourceIP = Bool(v != 0) + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSHFileCopy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SSHFileCopy == nil { + m.SSHFileCopy = &BoolOption{} + } + if err := m.SSHFileCopy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 23: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequireMFAType", wireType) + } + m.RequireMFAType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RequireMFAType |= RequireMFAType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceTrustMode", 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.DeviceTrustMode = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IDP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.IDP == nil { + m.IDP = &IdPOptions{} + } + if err := m.IDP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 26: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateDesktopUser", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CreateDesktopUser == nil { + m.CreateDesktopUser = &BoolOption{} } - if err := m.CreateHostUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CreateDesktopUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 21: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PinSourceIP", 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.PinSourceIP = Bool(v != 0) - case 22: + case 27: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SSHFileCopy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CreateDatabaseUser", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86970,18 +87798,18 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SSHFileCopy == nil { - m.SSHFileCopy = &BoolOption{} + if m.CreateDatabaseUser == nil { + m.CreateDatabaseUser = &BoolOption{} } - if err := m.SSHFileCopy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.CreateDatabaseUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 23: + case 28: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RequireMFAType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CreateHostUserMode", wireType) } - m.RequireMFAType = 0 + m.CreateHostUserMode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -86991,16 +87819,16 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.RequireMFAType |= RequireMFAType(b&0x7F) << shift + m.CreateHostUserMode |= CreateHostUserMode(b&0x7F) << shift if b < 0x80 { break } } - case 24: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeviceTrustMode", wireType) + case 29: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateDatabaseUserMode", wireType) } - var stringLen uint64 + m.CreateDatabaseUserMode = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -87010,27 +87838,14 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.CreateDatabaseUserMode |= CreateDatabaseUserMode(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.DeviceTrustMode = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 25: + case 30: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IDP", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MFAVerificationInterval", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87057,18 +87872,15 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.IDP == nil { - m.IDP = &IdPOptions{} - } - if err := m.IDP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MFAVerificationInterval, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 26: + case 31: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreateDesktopUser", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CreateHostUserDefaultShell", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -87078,31 +87890,27 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if m.CreateDesktopUser == nil { - m.CreateDesktopUser = &BoolOption{} - } - if err := m.CreateDesktopUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.CreateHostUserDefaultShell = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 27: + case 32: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreateDatabaseUser", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SSHPortForwarding", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87129,116 +87937,13 @@ func (m *RoleOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CreateDatabaseUser == nil { - m.CreateDatabaseUser = &BoolOption{} - } - if err := m.CreateDatabaseUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 28: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreateHostUserMode", wireType) - } - m.CreateHostUserMode = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreateHostUserMode |= CreateHostUserMode(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 29: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreateDatabaseUserMode", wireType) - } - m.CreateDatabaseUserMode = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreateDatabaseUserMode |= CreateDatabaseUserMode(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 30: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MFAVerificationInterval", 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 m.SSHPortForwarding == nil { + m.SSHPortForwarding = &SSHPortForwarding{} } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.MFAVerificationInterval, dAtA[iNdEx:postIndex]); err != nil { + if err := m.SSHPortForwarding.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 31: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreateHostUserDefaultShell", 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.CreateHostUserDefaultShell = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -88908,6 +89613,71 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 44: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityLabels", 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.WorkloadIdentityLabels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 45: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityLabelsExpression", 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.WorkloadIdentityLabelsExpression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/api/version.go b/api/version.go index ec5a0ba02d9b6..09129558c95a1 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "17.0.4" +const Version = "17.0.6" var SemVersion = semver.New(Version) diff --git a/assets/backport/go.mod b/assets/backport/go.mod index 8a86d7cd26c6e..82cd73e471083 100644 --- a/assets/backport/go.mod +++ b/assets/backport/go.mod @@ -14,7 +14,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/net v0.24.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/assets/backport/go.sum b/assets/backport/go.sum index d82f43d14889f..cc6c5a67a02a8 100644 --- a/assets/backport/go.sum +++ b/assets/backport/go.sum @@ -877,8 +877,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= diff --git a/build.assets/Makefile b/build.assets/Makefile index ecb0f7674c3f4..21e40af91d59e 100644 --- a/build.assets/Makefile +++ b/build.assets/Makefile @@ -35,19 +35,7 @@ ifneq ("$(KUBECONFIG)","") DOCKERFLAGS := $(DOCKERFLAGS) -v $(KUBECONFIG):/mnt/kube/config -e KUBECONFIG=/mnt/kube/config -e TEST_KUBE=$(TEST_KUBE) endif -# conditionally force the use of UID/GID 1000:1000 if we're running in Github Actions (in which case CI env var will be set) ifeq ("$(CI)","true") -# The UID/GID of the runner user on ARC runners is 1001, not 1000 -# This var is currently only set for ARC runners via https://github.com/gravitational/cloud-terraform/pull/2473 -ifeq ("$(CI_SYSTEM)","ARC") -UID := 1001 -GID := 1001 -NOROOT := -u 1001:1001 -else -UID := 1000 -GID := 1000 -NOROOT := -u 1000:1000 -endif # if running in CI and the GOCACHE environment variable is not set, set it to a sensible default ifeq ("$(GOCACHE)",) GOCACHE := /go/cache diff --git a/build.assets/build-package.sh b/build.assets/build-package.sh index 56274d0a1dee8..91bb4daa8409a 100755 --- a/build.assets/build-package.sh +++ b/build.assets/build-package.sh @@ -74,9 +74,9 @@ FPM_IMAGE_RPM="public.ecr.aws/gravitational/fpm:centos8-1.15.1-1" # extra package information for linux MAINTAINER="info@goteleport.com" -LICENSE="Apache-2.0" +LICENSE="Teleport Community Edition License" VENDOR="Gravitational" -DESCRIPTION="Teleport is a gateway for managing access to clusters of Linux servers via SSH or the Kubernetes API" +DESCRIPTION="Teleport provides on-demand, least-privileged access to your infrastructure, on a foundation of cryptographic identity and zero trust, with built-in identity and policy governance" DOCS_URL="https://goteleport.com/docs" # check that curl is installed @@ -194,6 +194,7 @@ if [[ "${TELEPORT_TYPE}" == "ent" ]]; then else TYPE_DESCRIPTION="[${TEXT_ARCH} Enterprise edition]" fi + LICENSE_STANZA=() else TARBALL_FILENAME="teleport-v${TELEPORT_VERSION}-${PLATFORM}-${TARBALL_ARCH}${OPTIONAL_TARBALL_SECTION}${OPTIONAL_RUNTIME_SECTION}-bin.tar.gz" TAR_PATH="teleport" @@ -204,6 +205,8 @@ else else TYPE_DESCRIPTION="[${TEXT_ARCH} Open source edition]" fi + TYPE_DESCRIPTION="${TYPE_DESCRIPTION} Distributed under the ${LICENSE}" + LICENSE_STANZA=(--license "${LICENSE}") fi # set file list @@ -359,7 +362,6 @@ else --version "${TELEPORT_VERSION}" \ --maintainer "${MAINTAINER}" \ --url "${DOCS_URL}" \ - --license "${LICENSE}" \ --vendor "${VENDOR}" \ --description "${DESCRIPTION} ${TYPE_DESCRIPTION}" \ --architecture ${PACKAGE_ARCH} \ @@ -372,6 +374,7 @@ else --after-upgrade /src/post-upgrade \ ${CONFIG_FILE_STANZA} \ ${FILE_PERMISSIONS_STANZA} \ + "${LICENSE_STANZA[@]}" \ ${RPM_SIGN_STANZA} . # copy created package back to current directory diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index 19b70a1d39732..32ede0823e8a8 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 17.0.4 + 17.0.6 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 17.0.4 + 17.0.6 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index b1273e855094b..a578ad5286f6f 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 17.0.4 + 17.0.6 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 17.0.4 + 17.0.6 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index 43b983e74cb10..cae9d9a7bc9dd 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -53,10 +53,10 @@ require ( github.com/spf13/cast v1.7.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect - golang.org/x/crypto v0.26.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/net v0.26.0 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/build.assets/tooling/go.sum b/build.assets/tooling/go.sum index 5b40ec5037acb..215bd93ede22c 100644 --- a/build.assets/tooling/go.sum +++ b/build.assets/tooling/go.sum @@ -991,8 +991,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1163,8 +1163,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1250,8 +1250,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1280,8 +1280,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/docs/config.json b/docs/config.json index c983edb0091a3..7c23bd686f97d 100644 --- a/docs/config.json +++ b/docs/config.json @@ -135,7 +135,7 @@ "aws_secret_access_key": "zyxw9876-this-is-an-example" }, "cloud": { - "version": "16.4.8", + "version": "16.4.9", "major_version": "16", "sla": { "monthly_percentage": "99.9%", @@ -185,18 +185,18 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "17", - "version": "17.0.4", + "version": "17.0.5", "url": "teleport.example.com", "golang": "1.23.4", "plugin": { - "version": "17.0.4" + "version": "17.0.5" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:17.0.4", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:17.0.4", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:17.0.4", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:17.0.4", - "teleport_install_script_url": "https://cdn.teleport.dev/install-v17.0.4.sh" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:17.0.5", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:17.0.5", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:17.0.5", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:17.0.5", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v17.0.5.sh" }, "terraform": { "version": "1.0.0" diff --git a/docs/img/access-graph/integrations.png b/docs/img/access-graph/integrations.png index 0c1222e81788d..e12762cbb3b3f 100644 Binary files a/docs/img/access-graph/integrations.png and b/docs/img/access-graph/integrations.png differ diff --git a/docs/pages/admin-guides/access-controls/access-monitoring.mdx b/docs/pages/admin-guides/access-controls/access-monitoring.mdx index 073072c977ab0..7f5a7b2a0a864 100644 --- a/docs/pages/admin-guides/access-controls/access-monitoring.mdx +++ b/docs/pages/admin-guides/access-controls/access-monitoring.mdx @@ -23,7 +23,7 @@ Users are able to write their own custom access monitoring queries by querying t ## Prerequisites - Teleport v14 or later. -- For self-hosted Teleport the [AWS Athena Backend](../../reference/backends.mdx) is required. +- For self-hosted Teleport the [Amazon Athena Backend](../../reference/backends.mdx) is required. ### Configuration @@ -281,7 +281,8 @@ FROM WHERE identity_user = 'admin-annie' ``` -- Show access requests and their reviews: +- Show Access Requests and their reviews: + ```sql SELECT * @@ -291,7 +292,8 @@ WHERE access_request_create.id = access_request_review.id ``` -- Show details about access request and review: +- Show details about an Access Request and its reviews: + ```sql SELECT request.user, request.reason, request.roles, request.resource_ids, review.reviewer, review.state @@ -313,7 +315,7 @@ The report allows to identify the following weak security events: ### Database sessions with weak security The following query identifies database sessions with weak security -such as as sessions with missing access requests, MFA, impersonation, and trusted device identification. +such as as sessions with missing Access Requests, MFA, impersonation, and trusted device identification. ```sql SELECT @@ -340,12 +342,12 @@ ORDER BY ![privileged access report](../../../img/access-monitoring/privileged_access_report.png) -**Suggestion:** Set up access requests, device trust and per-session MFA. +**Suggestion:** Set up Access Requests, Device Trust and per-session MFA. ### SSH sessions with weak security The following query identifies SSH sessions with weak security, -such as as sessions with missing access requests, MFA, impersonation, and trusted device identification. +such as as sessions with missing Access Requests, MFA, impersonation, and trusted device identification. ```sql SELECT @@ -372,12 +374,12 @@ ORDER BY event_date ``` -**Suggestion:** Set up access requests, device trust and per-session MFA. +**Suggestion:** Set up Access Requests, Device Trust and per-session MFA. ### Kubernetes API calls with weak security The following query identifies Kubernetes sessions with weak security, -such as sessions with missing access requests, MFA, impersonation, and trusted device identification. +such as sessions with missing Access Requests, MFA, impersonation, and trusted device identification. ```sql SELECT @@ -401,7 +403,7 @@ ORDER BY event_date ``` -**Suggestion:** Set up access requests, device trust and per-session MFA. +**Suggestion:** Set up Access Requests, Device Trust and per-session MFA. ### Privileged Postgres sessions diff --git a/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx b/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx index bcdd0fa4adc80..141372e340c63 100644 --- a/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx +++ b/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx @@ -8,8 +8,10 @@ This guide will show you how to set up your Teleport Cluster to use the Google Cloud Key Management Service (KMS) to store and handle the CA private key material used to sign all certificates issued by your Teleport cluster. +## How it works + Teleport generates private key material for its internal Certificate Authorities -(CAs) during the first Auth Server's initial startup. +(CAs) during the first Auth Service instance's initial startup. These CAs are used to sign all certificates issued to clients and hosts in the Teleport cluster. When configured to use Google Cloud KMS, all private key material for these CAs @@ -35,12 +37,12 @@ learn more. ## Step 1/5. Create a key ring in GCP -Each Teleport Auth Server will need to be configured to use a GCP key ring -which will hold all keys generated and used by that Auth Server. +Each Teleport Auth Service instance will need to be configured to use a GCP key +ring which will hold all keys generated and used by that Auth Service instance. If running a High-Availability Teleport cluster with two or more Auth Servers, -every Auth Server can be configured to use the same key ring, or if desired each -can be configured to use a unique key ring in a different region (for redundancy -or to decrease latency). +every Auth Service instance can be configured to use the same key ring, or if +desired each can be configured to use a unique key ring in a different region +(for redundancy or to decrease latency). It is recommended to create a dedicated key ring for use by Teleport to logically separate it from any other keys in your cloud account. @@ -90,7 +92,7 @@ custom role and must be used in later steps. $ export IAM_ROLE= ``` -If you don't already have a GCP service account for your Teleport Auth Server +If you don't already have a GCP service account for your Teleport Auth Service you can create one with the following command, otherwise use your existing service account. @@ -125,13 +127,13 @@ It should be considered highly privileged and access should be restricted as much as possible. -## Step 3/5. Provide the service account credentials to your Auth Server +## Step 3/5. Provide the service account credentials to the Auth Service -The Teleport Auth Server will use Application Default Credentials to make +The Teleport Auth Service will use Application Default Credentials to make requests to the GCP KMS service. Provide credentials for the `teleport-auth-server` service account created in step 2 to the Application Default Credentials of the environment you are running -your Teleport Auth Server in. +your Teleport Auth Service in. Supported environments include GCE VMs, GKE pods, and others. See the GCP docs for @@ -141,7 +143,7 @@ to learn how to provide them for your preferred environment.
To make sure the credentials have been configured correctly, you can run the -`gcloud` CLI tool from your Teleport Auth Server's environment. Some example +`gcloud` CLI tool from your Teleport Auth Service's environment. Some example commands you could use to debug are listed here: ```code @@ -163,10 +165,10 @@ $ gcloud kms keys versions destroy --keyring "" --
-## Step 4/5. Configure your Auth Server to use KMS keys +## Step 4/5. Configure the Auth Service to use KMS keys CA key parameters are statically configured in the `teleport.yaml` configuration -file of the Teleport Auth Server(s) in your cluster. +file of the Teleport Auth Service instances in your cluster. Find the fully qualified name of the KMS key ring you created in [step 1](#step-15-create-a-key-ring-in-gcp) @@ -220,9 +222,9 @@ KMS keys, read on to ## Step 5/5. Make sure everything is working -After starting up your Auth Server with the `gcp_kms` configuration, you can +After starting up your Auth Service with the `gcp_kms` configuration, you can confirm that Teleport has generated keys in your keyring in the GCP Console or -by running +by running: ```code $ gcloud kms keys list --keyring "" --location diff --git a/docs/pages/admin-guides/infrastructure-as-code/terraform-provider/dedicated-server.mdx b/docs/pages/admin-guides/infrastructure-as-code/terraform-provider/dedicated-server.mdx index 683f4f3082bf8..121ed798ad5b9 100644 --- a/docs/pages/admin-guides/infrastructure-as-code/terraform-provider/dedicated-server.mdx +++ b/docs/pages/admin-guides/infrastructure-as-code/terraform-provider/dedicated-server.mdx @@ -35,8 +35,7 @@ Terraform provider. The daemon stores its identity on the disk and refresh the t - A Linux host that you wish to run the Teleport Terraform provider onto. -- A Linux user on that host that you wish Terraform and `tbot` to run as. In the guide, - we will use for this. +- A Linux user on that host that you wish Terraform and `tbot` to run as. ## Step 1/4. Install `tbot` on your server diff --git a/docs/pages/admin-guides/teleport-policy/integrations/integrations.mdx b/docs/pages/admin-guides/teleport-policy/integrations/integrations.mdx index ad79351d3b7d5..ff313c03ce916 100644 --- a/docs/pages/admin-guides/teleport-policy/integrations/integrations.mdx +++ b/docs/pages/admin-guides/teleport-policy/integrations/integrations.mdx @@ -45,12 +45,9 @@ The preset `editor` role has the required permissions by default. ## Set up a new integration -Visit the Teleport Web UI and click **Access Management** on the menu bar at the -top of the screen. - -On the left sidebar, click **Access Graph**. Click the connection icon: +On the left sidebar, click **Policy**. Click the connection icon labeled Integrations: ![Connection view](../../../../img/access-graph/connection_view.png) -Choose an application to integrate with. +Select the "Set up new integration" button. Teleport can also import and grant access to resources from Okta organizations, such as user profiles, groups and applications. You can view connection data in diff --git a/docs/pages/enroll-resources/desktop-access/getting-started.mdx b/docs/pages/enroll-resources/desktop-access/getting-started.mdx index 3fefc79ec2b00..ce4eb8e951a52 100644 --- a/docs/pages/enroll-resources/desktop-access/getting-started.mdx +++ b/docs/pages/enroll-resources/desktop-access/getting-started.mdx @@ -62,6 +62,10 @@ interactively and select the Teleport certificate that you exported when prompte - Disables Network Level Authentication (NLA) for remote desktop services. - Enables RemoteFX compression, if using Teleport version 15 or newer. + Note: in order for the Windows Local Security Authority (LSA) to load the Teleport DLL, + [LSA protection](https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection) + must be disabled. + {/*lint ignore ordered-list-marker-value*/} 5. Restart the computer. diff --git a/docs/pages/includes/application-access/aws-database-prerequisites.mdx b/docs/pages/includes/application-access/aws-database-prerequisites.mdx index 3555e61d05e4e..6b0b3ec12a44c 100644 --- a/docs/pages/includes/application-access/aws-database-prerequisites.mdx +++ b/docs/pages/includes/application-access/aws-database-prerequisites.mdx @@ -14,6 +14,6 @@ If you have not yet deployed the Auth Service and Proxy Service, you should foll We will assume your Teleport cluster is accessible at `teleport.example.com` and `*.teleport.example.com`. You can substitute the address of your Teleport Proxy Service. (For Teleport Cloud customers, this will be similar to `mytenant.teleport.sh`.) - + (!docs/pages/includes/dns-app-access.mdx!) diff --git a/docs/pages/includes/database-access/azure-configure-service-principal.mdx b/docs/pages/includes/database-access/azure-configure-service-principal.mdx index fbebd9faa2957..1f6d8a809ef12 100644 --- a/docs/pages/includes/database-access/azure-configure-service-principal.mdx +++ b/docs/pages/includes/database-access/azure-configure-service-principal.mdx @@ -4,10 +4,10 @@ resources: - The Database Service can run on an Azure VM with attached managed identity. This is the recommended way of deploying the Database Service in production since it eliminates the need to manage Azure credentials. -- The Database Service can be registered as an Azure AD application (via AD's "App - registrations") and configured with its credentials. This is only recommended - for development and testing purposes since it requires Azure credentials to - be present in the Database Service's environment. +- The Database Service can be registered as a Microsoft Entra ID application + (via "App registrations") and configured with its credentials. This is only + recommended for development and testing purposes since it requires Azure + credentials to be present in the Database Service's environment. @@ -35,14 +35,15 @@ resources: - Registering the Database Service as Azure AD application is suitable for - test and development scenarios, or if your Database Service does not run on - an Azure VM. For production scenarios prefer to use the managed identity + Registering the Database Service as a Microsoft Entra ID application is + suitable for test and development scenarios, or if your Database Service + does not run on an Azure VM. For production scenarios prefer to use the + managed identity approach. Go to the [App registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) - page of your Azure Active Directory and click on *New registration*: + page of Microsoft Entra ID and click on *New registration*: ![App registrations](../../../img/azure/app-registrations@2x.png) diff --git a/docs/pages/includes/database-access/db-helm-install.mdx b/docs/pages/includes/database-access/db-helm-install.mdx index 224d5ea9ea21b..ee7ad5b7fd97a 100644 --- a/docs/pages/includes/database-access/db-helm-install.mdx +++ b/docs/pages/includes/database-access/db-helm-install.mdx @@ -42,7 +42,7 @@ $ helm install teleport-kube-agent teleport/teleport-kube-agent \ -Make sure that the Teleport agent pod is running. You should see one +Make sure that the Teleport Agent pod is running. You should see one `teleport-kube-agent` pod with a single ready container: ```code diff --git a/docs/pages/includes/database-access/self-hosted-db-helm-install.mdx b/docs/pages/includes/database-access/self-hosted-db-helm-install.mdx index 3f6a1cf24efb7..e670586de3ca0 100644 --- a/docs/pages/includes/database-access/self-hosted-db-helm-install.mdx +++ b/docs/pages/includes/database-access/self-hosted-db-helm-install.mdx @@ -1,5 +1,5 @@ {{ dbName="test" }} -Install a Teleport agent into your Kubernetes Cluster with the Teleport Database +Install a Teleport Agent into your Kubernetes Cluster with the Teleport Database Service configuration. Create a file called `values.yaml` with the following content. Update diff --git a/docs/pages/includes/device-trust/support-notice.mdx b/docs/pages/includes/device-trust/support-notice.mdx index ee55c48303130..182a081877c87 100644 --- a/docs/pages/includes/device-trust/support-notice.mdx +++ b/docs/pages/includes/device-trust/support-notice.mdx @@ -2,7 +2,7 @@ Device Trust supports all platforms and clients, including `tsh`, Teleport Connect and the Web UI (requires Teleport Connect to be installed). - The following resources are protected by device trust: + The following resources are protected by Device Trust: - Role-based enforcement only: Apps and Desktops - Cluster and role-based enforcement: SSH nodes, databases, and Kubernetes diff --git a/docs/pages/includes/device-trust/troubleshooting.mdx b/docs/pages/includes/device-trust/troubleshooting.mdx index aeac5c840d216..9e8435e87ad98 100644 --- a/docs/pages/includes/device-trust/troubleshooting.mdx +++ b/docs/pages/includes/device-trust/troubleshooting.mdx @@ -77,7 +77,7 @@ follow the steps below: URL handler). 3. Make sure Teleport Connect can access the same resource you are trying to access on the Web -4. Ask your cluster administrator if device trust is enabled (cluster mode +4. Ask your cluster administrator if Device Trust is enabled (cluster mode "optional" or higher) After the steps above are done try logging out from the Web UI and logging in diff --git a/docs/pages/includes/discovery/database-service-troubleshooting.mdx b/docs/pages/includes/discovery/database-service-troubleshooting.mdx index 96f07241b8663..31ed6a52a5663 100644 --- a/docs/pages/includes/discovery/database-service-troubleshooting.mdx +++ b/docs/pages/includes/discovery/database-service-troubleshooting.mdx @@ -63,9 +63,9 @@ and then try the connection again. Check the Teleport Database Service logs with DEBUG level logging enabled and look for network or permissions errors. -Refer to -[Troubleshooting Database Access](../../enroll-resources/database-access/troubleshooting.mdx) -for more general troubleshooting steps. +Refer to the [Database Service troubleshooting +guide](../../enroll-resources/database-access/troubleshooting.mdx) for more +general troubleshooting steps. Additionally, a guide specific to the type of database in [Enroll AWS Databases](../../enroll-resources/database-access/enroll-aws-databases/enroll-aws-databases.mdx). diff --git a/docs/pages/includes/edition-comparison.mdx b/docs/pages/includes/edition-comparison.mdx index f9d91d92eaf65..d9ff6ec133199 100644 --- a/docs/pages/includes/edition-comparison.mdx +++ b/docs/pages/includes/edition-comparison.mdx @@ -45,12 +45,12 @@ _Available as an add-on to Teleport Enterprise_ ||Community Edition|Enterprise|Cloud| |---|---|---|---| |Agentless Integration with [OpenSSH Servers](../enroll-resources/server-access/openssh/openssh-agentless.mdx)|✔|✔|✔| -|[Application Access](../enroll-resources/application-access/getting-started.mdx)|✔|✔|✔| -|[Database Access](../enroll-resources/database-access/getting-started.mdx)|✔|✔|✔| -|[Desktop Access](../enroll-resources/desktop-access/introduction.mdx)|✔|✔|✔| -|[Kubernetes Access](../enroll-resources/kubernetes-access/getting-started.mdx)|✔|✔|✔| +|[Protecting Applications](../enroll-resources/application-access/getting-started.mdx)|✔|✔|✔| +|[Protecting Databases](../enroll-resources/database-access/getting-started.mdx)|✔|✔|✔| +|[Protecting Windows Desktops](../enroll-resources/desktop-access/introduction.mdx)|✔|✔|✔| +|[Protecting Kubernetes Clusters](../enroll-resources/kubernetes-access/getting-started.mdx)|✔|✔|✔| |[Machine ID](../enroll-resources/machine-id/getting-started.mdx)|✔|✔|✔| -|[Server Access](../enroll-resources/server-access/getting-started.mdx)|✔|✔|✔| +|[Protecting Linux Servers](../enroll-resources/server-access/getting-started.mdx)|✔|✔|✔| ### Licensing and usage management diff --git a/docs/pages/includes/enterprise/hsm-warning.mdx b/docs/pages/includes/enterprise/hsm-warning.mdx index b67021b3490ad..22ead5d767c75 100644 --- a/docs/pages/includes/enterprise/hsm-warning.mdx +++ b/docs/pages/includes/enterprise/hsm-warning.mdx @@ -1,5 +1,5 @@ -Teleport Cloud and Teleport Open Source do not currently support HSMs or +Teleport Cloud and Teleport Community Edition do not currently support HSMs or Key Management Services. diff --git a/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx b/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx index c7fb92710685e..f7b7542c5311f 100644 --- a/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx +++ b/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx @@ -77,7 +77,7 @@ roles `App` and `Kube`. ## `joinParams` -`joinParams` controls how the Teleport agent joins the Teleport cluster. +`joinParams` controls how the Teleport Agent joins the Teleport cluster. These sub-values must be configured for the agent to connect to a cluster. This value serves the same purpose as [`authToken`](#authToken) but supports @@ -131,7 +131,7 @@ is provided through an existing Kubernetes Secret, see | `string` | `""` | `kubeClusterName` sets the name used for the Kubernetes cluster proxied by -the Teleport agent. This name will be shown to Teleport users connecting to +the Teleport Agent. This name will be shown to Teleport users connecting to the cluster. This setting is required if the chart `roles` contains `kube`. @@ -372,7 +372,7 @@ databases: ``` - You can see a list of all the supported [values which can be used in a Teleport database service configuration here](../../reference/agent-services/database-access-reference/configuration.mdx). + You can see a list of all the supported [values which can be used in a Teleport Database Service configuration here](../../reference/agent-services/database-access-reference/configuration.mdx). @@ -917,7 +917,7 @@ labels: ## `highAvailability` `highAvailability` contains settings controlling the availability of the -Teleport agent deployed by the chart. +Teleport Agent deployed by the chart. The availability can be increased by: - running more replicas with `replicaCount` @@ -1112,24 +1112,25 @@ cluster role binding. |------|---------| | `string` | `"public.ecr.aws/gravitational/teleport-distroless"` | -`image` sets the container image used for Teleport OSS agent pods -created by the chart. +`image` sets the container image used for Teleport Community Edition +Agent pods created by the chart. -You can override this to use your own Teleport image rather than a Teleport-published image. +You can override this to use your own Teleport image rather than a +Teleport-published image. - When using the Teleport Kube Agent Updater, you must ensure the image is - available before the updater version target gets updated and Kubernetes tries - to pull the image. +When using the Teleport Kube Agent Updater, you must ensure the +image is available before the updater version target gets updated and +Kubernetes tries to pull the image. - For this reason, it is strongly discouraged to set a custom image when - using automatic updates. Teleport Cloud uses automatic updates by default. +For this reason, it is strongly discouraged to set a custom image when using +automatic updates. Teleport Cloud uses automatic updates by default. -Since version 13, hardened distroless images are used by default. -You can use the deprecated debian-based images by setting the value to -`public.ecr.aws/gravitational/teleport`. Those images will be -removed with teleport 15. +Since version 13, hardened distroless images are used by default. You can use +the deprecated debian-based images by setting the value to +`public.ecr.aws/gravitational/teleport`. Those images will be removed with +teleport 15. This setting only takes effect when [`enterprise`](#enterprise) is `false`. When running an enterprise version, you must use diff --git a/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx b/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx index a1cda3b612cda..09fd0fb3a48c6 100644 --- a/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx +++ b/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx @@ -52,8 +52,8 @@ For example: | `list[string]` | `[]` | `caPins` is a list of Teleport CA fingerprints that is used by the operator to -validate the identity of the Teleport Auth server. This is only used when joining -an Auth server directly (on port `3025`) and is ignored when joining through a Proxy +validate the identity of the Teleport Auth Service. This is only used when joining +an Auth Service directly (on port `3025`) and is ignored when joining through a Proxy (port `443` or `3080`). ## `joinMethod` diff --git a/docs/pages/includes/kubernetes-access/helm/teleport-cluster-cloud-warning.mdx b/docs/pages/includes/kubernetes-access/helm/teleport-cluster-cloud-warning.mdx index f73a7d4435a6b..ff5b0229c4b21 100644 --- a/docs/pages/includes/kubernetes-access/helm/teleport-cluster-cloud-warning.mdx +++ b/docs/pages/includes/kubernetes-access/helm/teleport-cluster-cloud-warning.mdx @@ -3,9 +3,10 @@ intended to help you get started with Teleport by deploying the Auth Service and Proxy Service in a Kubernetes cluster so you can access that cluster via the Kubernetes Service. -Since the Auth and Proxy Services are fully managed in Teleport Cloud, you should -install our `teleport-kube-agent` chart, which is intended for deployments where -the Auth Service and Proxy Service run outside your Kubernetes cluster. +Since the Auth Service and Proxy Service are fully managed in Teleport Cloud, +you should install our `teleport-kube-agent` chart, which is intended for +deployments where the Auth Service and Proxy Service run outside your Kubernetes +cluster. You can use the `teleport-kube-agent` chart to enable the Application Service and Database Service in addition to the Kubernetes Service. diff --git a/docs/pages/includes/metrics.mdx b/docs/pages/includes/metrics.mdx index e875f84e75968..d3ff005ac946b 100644 --- a/docs/pages/includes/metrics.mdx +++ b/docs/pages/includes/metrics.mdx @@ -133,10 +133,10 @@ | `teleport_db_connection_setup_time_seconds` | histogram | Teleport Database Service | Initial time to setup DB connection, before any requests are handled. | | `teleport_db_errors_total` | counter | Teleport Database Service | Number of synthetic DB errors sent to the client. | -### Kubernetes Access +### Kubernetes access -The following tables identify all metrics available in the proxy service if -Kubernetes access is enabled. +The following tables identify all metrics available in the Teleport Proxy +Service if at least one Kubernetes cluster is enrolled in your Teleport cluster. #### Client diff --git a/docs/pages/includes/permission-warning.mdx b/docs/pages/includes/permission-warning.mdx index f5a1e09797ea5..ab9cbc629560f 100644 --- a/docs/pages/includes/permission-warning.mdx +++ b/docs/pages/includes/permission-warning.mdx @@ -14,7 +14,7 @@ For example, don't assign users the built-in `access,editor` roles, which give them permissions to access and edit all cluster resources. Instead, define roles with the minimum required permissions for each user and configure - **access requests** to provide temporary elevated permissions. + **Access Requests** to provide temporary elevated permissions. - When you enroll Teleport resources—for example, new databases or applications—you should save the invitation token to a file. If you enter the token directly on the command line, a malicious user could view diff --git a/docs/pages/includes/soc2.mdx b/docs/pages/includes/soc2.mdx index 69172e4dc153f..e89794a225495 100644 --- a/docs/pages/includes/soc2.mdx +++ b/docs/pages/includes/soc2.mdx @@ -2,7 +2,7 @@ We undergo an annual SOC 2 Type II audit of the Teleport Access Platform. The audit report covers: -- Teleport Open Source +- Teleport Community Edition - Teleport Enterprise, self-hosted - Teleport Enterprise, cloud-hosted (SaaS) diff --git a/docs/pages/reference/helm-reference/teleport-cluster.mdx b/docs/pages/reference/helm-reference/teleport-cluster.mdx index b28c0c36540dd..e852ca2cff451 100644 --- a/docs/pages/reference/helm-reference/teleport-cluster.mdx +++ b/docs/pages/reference/helm-reference/teleport-cluster.mdx @@ -109,11 +109,13 @@ This is merged with chart-scoped values and takes precedence in case of conflict For example, to override the [`postStart`](#postStart) value only for auth pods: ```yaml # By default all pods postStart command should be "echo starting" -postStart: ["echo", "starting"] +postStart: + command: ["echo", "starting"] auth: # But we override the `postStart` value specifically for auth pods - postStart: ["curl", "http://hook"] + postStart: + command: ["curl", "http://hook"] imagePullPolicy: Always ``` @@ -193,11 +195,13 @@ For example, to override the [`postStart`](#postStart) value only for Teleport P and annotate the Kubernetes Service deployed for the Teleport Proxy Service: ```yaml # By default all pods postStart command should be "echo starting" -postStart: ["echo", "starting"] +postStart: + command: ["echo", "starting"] proxy: # But we override the `postStart` value specifically for proxy pods - postStart: ["curl", "http://hook"] + postStart: + command: ["curl", "http://hook"] imagePullPolicy: Always # We also annotate only the Kubernetes Service sending traffic to Proxy Service pods. diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx index 97ac53a0ca62c..1957f1349ec59 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx @@ -73,6 +73,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.allow.account_assignments items @@ -245,6 +247,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.deny.account_assignments items @@ -402,12 +406,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |mfa_verification_interval|string|MFAVerificationInterval optionally defines the maximum duration that can elapse between successive MFA verifications. This variable is used to ensure that users are periodically prompted to verify their identity, enhancing security by preventing prolonged sessions without re-authentication when using tsh proxy * derivatives. It's only effective if the session requires MFA. If not set, defaults to `max_session_ttl`.| |permit_x11_forwarding|boolean|PermitX11Forwarding authorizes use of X11 forwarding.| |pin_source_ip|boolean|PinSourceIP forces the same client IP for certificate generation and usage| -|port_forwarding|boolean|PortForwarding defines if the certificate will have "permit-port-forwarding" in the certificate. PortForwarding is "yes" if not set, that's why this is a pointer| +|port_forwarding|boolean|Deprecated: Use SSHPortForwarding instead| |record_session|[object](#specoptionsrecord_session)|RecordDesktopSession indicates whether desktop access sessions should be recorded. It defaults to true unless explicitly set to false.| |request_access|string|RequestAccess defines the request strategy (optional|note|always) where optional is the default.| |request_prompt|string|RequestPrompt is an optional message which tells users what they aught to request.| |require_session_mfa|string or integer|RequireMFAType is the type of MFA requirement enforced for this user. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". Can be either the string or the integer representation of each option.| |ssh_file_copy|boolean|SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false.| +|ssh_port_forwarding|[object](#specoptionsssh_port_forwarding)|SSHPortForwarding configures what types of SSH port forwarding are allowed by a role.| ### spec.options.cert_extensions items @@ -438,6 +443,25 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |desktop|boolean|Desktop indicates whether desktop sessions should be recorded. It defaults to true unless explicitly set to false.| |ssh|string|SSH indicates the session mode used on SSH sessions.| +### spec.options.ssh_port_forwarding + +|Field|Type|Description| +|---|---|---| +|local|[object](#specoptionsssh_port_forwardinglocal)|Allow local port forwarding.| +|remote|[object](#specoptionsssh_port_forwardingremote)|Allow remote port forwarding.| + +### spec.options.ssh_port_forwarding.local + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + +### spec.options.ssh_port_forwarding.remote + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + ## resources.teleport.dev/v6 **apiVersion:** resources.teleport.dev/v6 @@ -500,6 +524,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.allow.account_assignments items @@ -672,6 +698,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.deny.account_assignments items @@ -829,12 +857,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |mfa_verification_interval|string|MFAVerificationInterval optionally defines the maximum duration that can elapse between successive MFA verifications. This variable is used to ensure that users are periodically prompted to verify their identity, enhancing security by preventing prolonged sessions without re-authentication when using tsh proxy * derivatives. It's only effective if the session requires MFA. If not set, defaults to `max_session_ttl`.| |permit_x11_forwarding|boolean|PermitX11Forwarding authorizes use of X11 forwarding.| |pin_source_ip|boolean|PinSourceIP forces the same client IP for certificate generation and usage| -|port_forwarding|boolean|PortForwarding defines if the certificate will have "permit-port-forwarding" in the certificate. PortForwarding is "yes" if not set, that's why this is a pointer| +|port_forwarding|boolean|Deprecated: Use SSHPortForwarding instead| |record_session|[object](#specoptionsrecord_session)|RecordDesktopSession indicates whether desktop access sessions should be recorded. It defaults to true unless explicitly set to false.| |request_access|string|RequestAccess defines the request strategy (optional|note|always) where optional is the default.| |request_prompt|string|RequestPrompt is an optional message which tells users what they aught to request.| |require_session_mfa|string or integer|RequireMFAType is the type of MFA requirement enforced for this user. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". Can be either the string or the integer representation of each option.| |ssh_file_copy|boolean|SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false.| +|ssh_port_forwarding|[object](#specoptionsssh_port_forwarding)|SSHPortForwarding configures what types of SSH port forwarding are allowed by a role.| ### spec.options.cert_extensions items @@ -865,3 +894,22 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |desktop|boolean|Desktop indicates whether desktop sessions should be recorded. It defaults to true unless explicitly set to false.| |ssh|string|SSH indicates the session mode used on SSH sessions.| +### spec.options.ssh_port_forwarding + +|Field|Type|Description| +|---|---|---| +|local|[object](#specoptionsssh_port_forwardinglocal)|Allow local port forwarding.| +|remote|[object](#specoptionsssh_port_forwardingremote)|Allow remote port forwarding.| + +### spec.options.ssh_port_forwarding.local + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + +### spec.options.ssh_port_forwarding.remote + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx index 2fb435f13e960..e8845bc0784b3 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx @@ -73,6 +73,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.allow.account_assignments items @@ -245,6 +247,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.deny.account_assignments items @@ -402,12 +406,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |mfa_verification_interval|string|MFAVerificationInterval optionally defines the maximum duration that can elapse between successive MFA verifications. This variable is used to ensure that users are periodically prompted to verify their identity, enhancing security by preventing prolonged sessions without re-authentication when using tsh proxy * derivatives. It's only effective if the session requires MFA. If not set, defaults to `max_session_ttl`.| |permit_x11_forwarding|boolean|PermitX11Forwarding authorizes use of X11 forwarding.| |pin_source_ip|boolean|PinSourceIP forces the same client IP for certificate generation and usage| -|port_forwarding|boolean|PortForwarding defines if the certificate will have "permit-port-forwarding" in the certificate. PortForwarding is "yes" if not set, that's why this is a pointer| +|port_forwarding|boolean|Deprecated: Use SSHPortForwarding instead| |record_session|[object](#specoptionsrecord_session)|RecordDesktopSession indicates whether desktop access sessions should be recorded. It defaults to true unless explicitly set to false.| |request_access|string|RequestAccess defines the request strategy (optional|note|always) where optional is the default.| |request_prompt|string|RequestPrompt is an optional message which tells users what they aught to request.| |require_session_mfa|string or integer|RequireMFAType is the type of MFA requirement enforced for this user. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". Can be either the string or the integer representation of each option.| |ssh_file_copy|boolean|SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false.| +|ssh_port_forwarding|[object](#specoptionsssh_port_forwarding)|SSHPortForwarding configures what types of SSH port forwarding are allowed by a role.| ### spec.options.cert_extensions items @@ -438,3 +443,22 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |desktop|boolean|Desktop indicates whether desktop sessions should be recorded. It defaults to true unless explicitly set to false.| |ssh|string|SSH indicates the session mode used on SSH sessions.| +### spec.options.ssh_port_forwarding + +|Field|Type|Description| +|---|---|---| +|local|[object](#specoptionsssh_port_forwardinglocal)|Allow local port forwarding.| +|remote|[object](#specoptionsssh_port_forwardingremote)|Allow remote port forwarding.| + +### spec.options.ssh_port_forwarding.local + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + +### spec.options.ssh_port_forwarding.remote + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx index 9e847a9ea9fd0..e00769555d578 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx @@ -73,6 +73,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.allow.account_assignments items @@ -245,6 +247,8 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels|object|WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops.| |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +|workload_identity_labels|object|WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.| +|workload_identity_labels_expression|string|WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.| ### spec.deny.account_assignments items @@ -402,12 +406,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |mfa_verification_interval|string|MFAVerificationInterval optionally defines the maximum duration that can elapse between successive MFA verifications. This variable is used to ensure that users are periodically prompted to verify their identity, enhancing security by preventing prolonged sessions without re-authentication when using tsh proxy * derivatives. It's only effective if the session requires MFA. If not set, defaults to `max_session_ttl`.| |permit_x11_forwarding|boolean|PermitX11Forwarding authorizes use of X11 forwarding.| |pin_source_ip|boolean|PinSourceIP forces the same client IP for certificate generation and usage| -|port_forwarding|boolean|PortForwarding defines if the certificate will have "permit-port-forwarding" in the certificate. PortForwarding is "yes" if not set, that's why this is a pointer| +|port_forwarding|boolean|Deprecated: Use SSHPortForwarding instead| |record_session|[object](#specoptionsrecord_session)|RecordDesktopSession indicates whether desktop access sessions should be recorded. It defaults to true unless explicitly set to false.| |request_access|string|RequestAccess defines the request strategy (optional|note|always) where optional is the default.| |request_prompt|string|RequestPrompt is an optional message which tells users what they aught to request.| |require_session_mfa|string or integer|RequireMFAType is the type of MFA requirement enforced for this user. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". Can be either the string or the integer representation of each option.| |ssh_file_copy|boolean|SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false.| +|ssh_port_forwarding|[object](#specoptionsssh_port_forwarding)|SSHPortForwarding configures what types of SSH port forwarding are allowed by a role.| ### spec.options.cert_extensions items @@ -438,3 +443,22 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |desktop|boolean|Desktop indicates whether desktop sessions should be recorded. It defaults to true unless explicitly set to false.| |ssh|string|SSH indicates the session mode used on SSH sessions.| +### spec.options.ssh_port_forwarding + +|Field|Type|Description| +|---|---|---| +|local|[object](#specoptionsssh_port_forwardinglocal)|Allow local port forwarding.| +|remote|[object](#specoptionsssh_port_forwardingremote)|Allow remote port forwarding.| + +### spec.options.ssh_port_forwarding.local + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + +### spec.options.ssh_port_forwarding.remote + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|| + diff --git a/docs/pages/reference/terraform-provider/data-sources/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index d6007d1a790e6..e9517adab3e37 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -88,6 +88,8 @@ Optional: - `windows_desktop_labels` (Map of List of String) WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops. - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +- `workload_identity_labels` (Map of List of String) WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself. +- `workload_identity_labels_expression` (String) WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity. ### Nested Schema for `spec.allow.account_assignments` @@ -276,6 +278,8 @@ Optional: - `windows_desktop_labels` (Map of List of String) WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops. - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +- `workload_identity_labels` (Map of List of String) WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself. +- `workload_identity_labels_expression` (String) WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity. ### Nested Schema for `spec.deny.account_assignments` @@ -449,12 +453,13 @@ Optional: - `mfa_verification_interval` (String) MFAVerificationInterval optionally defines the maximum duration that can elapse between successive MFA verifications. This variable is used to ensure that users are periodically prompted to verify their identity, enhancing security by preventing prolonged sessions without re-authentication when using tsh proxy * derivatives. It's only effective if the session requires MFA. If not set, defaults to `max_session_ttl`. - `permit_x11_forwarding` (Boolean) PermitX11Forwarding authorizes use of X11 forwarding. - `pin_source_ip` (Boolean) PinSourceIP forces the same client IP for certificate generation and usage -- `port_forwarding` (Boolean) PortForwarding defines if the certificate will have "permit-port-forwarding" in the certificate. PortForwarding is "yes" if not set, that's why this is a pointer +- `port_forwarding` (Boolean) Deprecated: Use SSHPortForwarding instead - `record_session` (Attributes) RecordDesktopSession indicates whether desktop access sessions should be recorded. It defaults to true unless explicitly set to false. (see [below for nested schema](#nested-schema-for-specoptionsrecord_session)) - `request_access` (String) RequestAccess defines the request strategy (optional|note|always) where optional is the default. - `request_prompt` (String) RequestPrompt is an optional message which tells users what they aught to request. - `require_session_mfa` (Number) RequireMFAType is the type of MFA requirement enforced for this user. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". - `ssh_file_copy` (Boolean) SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. +- `ssh_port_forwarding` (Attributes) SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. (see [below for nested schema](#nested-schema-for-specoptionsssh_port_forwarding)) ### Nested Schema for `spec.options.cert_extensions` @@ -488,3 +493,24 @@ Optional: - `desktop` (Boolean) Desktop indicates whether desktop sessions should be recorded. It defaults to true unless explicitly set to false. - `ssh` (String) SSH indicates the session mode used on SSH sessions. + +### Nested Schema for `spec.options.ssh_port_forwarding` + +Optional: + +- `local` (Attributes) Allow local port forwarding. (see [below for nested schema](#nested-schema-for-specoptionsssh_port_forwardinglocal)) +- `remote` (Attributes) Allow remote port forwarding. (see [below for nested schema](#nested-schema-for-specoptionsssh_port_forwardingremote)) + +### Nested Schema for `spec.options.ssh_port_forwarding.local` + +Optional: + +- `enabled` (Boolean) + + +### Nested Schema for `spec.options.ssh_port_forwarding.remote` + +Optional: + +- `enabled` (Boolean) + diff --git a/docs/pages/reference/terraform-provider/resources/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index 143ab376caea9..f206757ec4552 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -142,6 +142,8 @@ Optional: - `windows_desktop_labels` (Map of List of String) WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops. - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +- `workload_identity_labels` (Map of List of String) WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself. +- `workload_identity_labels_expression` (String) WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity. ### Nested Schema for `spec.allow.account_assignments` @@ -330,6 +332,8 @@ Optional: - `windows_desktop_labels` (Map of List of String) WindowsDesktopLabels are used in the RBAC system to allow/deny access to Windows desktops. - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +- `workload_identity_labels` (Map of List of String) WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself. +- `workload_identity_labels_expression` (String) WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity. ### Nested Schema for `spec.deny.account_assignments` @@ -503,12 +507,13 @@ Optional: - `mfa_verification_interval` (String) MFAVerificationInterval optionally defines the maximum duration that can elapse between successive MFA verifications. This variable is used to ensure that users are periodically prompted to verify their identity, enhancing security by preventing prolonged sessions without re-authentication when using tsh proxy * derivatives. It's only effective if the session requires MFA. If not set, defaults to `max_session_ttl`. - `permit_x11_forwarding` (Boolean) PermitX11Forwarding authorizes use of X11 forwarding. - `pin_source_ip` (Boolean) PinSourceIP forces the same client IP for certificate generation and usage -- `port_forwarding` (Boolean) PortForwarding defines if the certificate will have "permit-port-forwarding" in the certificate. PortForwarding is "yes" if not set, that's why this is a pointer +- `port_forwarding` (Boolean) Deprecated: Use SSHPortForwarding instead - `record_session` (Attributes) RecordDesktopSession indicates whether desktop access sessions should be recorded. It defaults to true unless explicitly set to false. (see [below for nested schema](#nested-schema-for-specoptionsrecord_session)) - `request_access` (String) RequestAccess defines the request strategy (optional|note|always) where optional is the default. - `request_prompt` (String) RequestPrompt is an optional message which tells users what they aught to request. - `require_session_mfa` (Number) RequireMFAType is the type of MFA requirement enforced for this user. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". - `ssh_file_copy` (Boolean) SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. +- `ssh_port_forwarding` (Attributes) SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. (see [below for nested schema](#nested-schema-for-specoptionsssh_port_forwarding)) ### Nested Schema for `spec.options.cert_extensions` @@ -542,3 +547,24 @@ Optional: - `desktop` (Boolean) Desktop indicates whether desktop sessions should be recorded. It defaults to true unless explicitly set to false. - `ssh` (String) SSH indicates the session mode used on SSH sessions. + +### Nested Schema for `spec.options.ssh_port_forwarding` + +Optional: + +- `local` (Attributes) Allow local port forwarding. (see [below for nested schema](#nested-schema-for-specoptionsssh_port_forwardinglocal)) +- `remote` (Attributes) Allow remote port forwarding. (see [below for nested schema](#nested-schema-for-specoptionsssh_port_forwardingremote)) + +### Nested Schema for `spec.options.ssh_port_forwarding.local` + +Optional: + +- `enabled` (Boolean) + + +### Nested Schema for `spec.options.ssh_port_forwarding.remote` + +Optional: + +- `enabled` (Boolean) + diff --git a/e b/e index 007aaf25dfddc..f1770e0d19da6 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 007aaf25dfddcdef87ece7ffaa0c1e090d958c23 +Subproject commit f1770e0d19da62794bdeec035b9cacd21091bbe1 diff --git a/examples/access-plugin-minimal/go.mod b/examples/access-plugin-minimal/go.mod index 6214f88ce768c..85aee3c5a99da 100644 --- a/examples/access-plugin-minimal/go.mod +++ b/examples/access-plugin-minimal/go.mod @@ -46,13 +46,13 @@ require ( go.opentelemetry.io/otel/sdk v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect diff --git a/examples/access-plugin-minimal/go.sum b/examples/access-plugin-minimal/go.sum index 1e47f25aebafb..fe8f19d63479a 100644 --- a/examples/access-plugin-minimal/go.sum +++ b/examples/access-plugin-minimal/go.sum @@ -176,8 +176,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -217,8 +217,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -232,22 +232,22 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/examples/api-sync-roles/go.mod b/examples/api-sync-roles/go.mod index 5027109379401..e4134f2934472 100644 --- a/examples/api-sync-roles/go.mod +++ b/examples/api-sync-roles/go.mod @@ -57,13 +57,13 @@ require ( go.opentelemetry.io/otel/sdk v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.15.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect diff --git a/examples/api-sync-roles/go.sum b/examples/api-sync-roles/go.sum index 52b2807234af8..be4b25422f0cd 100644 --- a/examples/api-sync-roles/go.sum +++ b/examples/api-sync-roles/go.sum @@ -208,8 +208,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -261,22 +261,22 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -289,8 +289,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/examples/chart/access/datadog/Chart.yaml b/examples/chart/access/datadog/Chart.yaml index 3ba7fd4c76a46..74930b2663511 100644 --- a/examples/chart/access/datadog/Chart.yaml +++ b/examples/chart/access/datadog/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-datadog diff --git a/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap index 6f88b9c772837..abb9fbd37fc1a 100644 --- a/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-datadog - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-datadog-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-datadog-17.0.6 name: RELEASE-NAME-teleport-plugin-datadog diff --git a/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap index 0b1dbfa022071..d49d0fe549c99 100644 --- a/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-datadog - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-datadog-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-datadog-17.0.6 name: RELEASE-NAME-teleport-plugin-datadog spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-datadog - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-datadog-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-datadog-17.0.6 spec: containers: - command: diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index 1f36b0159b8b1..51bf986c400b8 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index 2bd071e42ab93..82c244244592c 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-discord-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-discord-17.0.6 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index f4923e35775ad..ce508924cab1e 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-discord-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-discord-17.0.6 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-discord-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-discord-17.0.6 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index 8f767e3053edd..bc96e2cf5e48c 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index 4d5442ee245a3..adc74392d269d 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index 871ef0c973042..69629fe383ee0 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-email-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-email-17.0.6 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index dacd5ef921ed3..35b67dde00b90 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index 696c8f74f07cd..7a1748127a50d 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-jira-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-jira-17.0.6 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index 51f07dd218313..08f71952a3d5f 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-jira-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-jira-17.0.6 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-jira-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-jira-17.0.6 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index a81f8ff24e1c0..023c0277bd1da 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index 72537cb6e6e4a..1cc5477b03372 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index 57e97b33ac478..da1d20b0482a6 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-mattermost-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-mattermost-17.0.6 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index 3d6c444644664..c67893bb2aeb1 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index 5375a7d5a3815..fd45c046c34c5 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-msteams-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-msteams-17.0.6 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index 2fd504cc02bd7..245ec2ef42d80 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-msteams-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-msteams-17.0.6 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-msteams-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-msteams-17.0.6 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index e23b185fe02f4..cc48c7ac86371 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index a8f177811f71a..01c3f9d42be8b 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-pagerduty-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-pagerduty-17.0.6 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index cc12b05a8ed6e..5330fc1504070 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-pagerduty-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-pagerduty-17.0.6 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-pagerduty-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-pagerduty-17.0.6 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 18593ba4a8123..ec2aeae4e6b29 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index f07475f9388c6..97a67e51e7db7 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-slack-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-slack-17.0.6 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index 2c43b6e233db0..1c91e211f8809 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-slack-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-slack-17.0.6 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-slack-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-slack-17.0.6 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index 993c5667c876f..7decf3f05a889 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index 630caadfbd9e9..e057c5dd6ed43 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-event-handler-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-event-handler-17.0.6 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 7556759cfc49c..2c37f339d88da 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-plugin-event-handler-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-plugin-event-handler-17.0.6 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:17.0.4 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:17.0.6 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/tbot/Chart.yaml b/examples/chart/tbot/Chart.yaml index e08615060b385..d7c6add69f045 100644 --- a/examples/chart/tbot/Chart.yaml +++ b/examples/chart/tbot/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" name: tbot apiVersion: v2 diff --git a/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap index 3c90aa7e97849..4812478fd6088 100644 --- a/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap @@ -29,7 +29,7 @@ should match the snapshot (full): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: tbot - helm.sh/chart: tbot-17.0.4 + helm.sh/chart: tbot-17.0.6 test-key: test-label-pod spec: affinity: @@ -68,7 +68,7 @@ should match the snapshot (full): value: "1" - name: TEST_ENV value: test-value - image: public.ecr.aws/gravitational/tbot-distroless:17.0.4 + image: public.ecr.aws/gravitational/tbot-distroless:17.0.6 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -154,7 +154,7 @@ should match the snapshot (simple): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: tbot - helm.sh/chart: tbot-17.0.4 + helm.sh/chart: tbot-17.0.6 spec: containers: - args: @@ -176,7 +176,7 @@ should match the snapshot (simple): fieldPath: spec.nodeName - name: KUBERNETES_TOKEN_PATH value: /var/run/secrets/tokens/join-sa-token - image: public.ecr.aws/gravitational/tbot-distroless:17.0.4 + image: public.ecr.aws/gravitational/tbot-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index cf9e942a69328..75916ecac7d87 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index ca8bab514af5d..504eca75e215b 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml index 6f45a69d0cd2f..f7b4a591b6f8f 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml @@ -595,6 +595,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -1160,6 +1171,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -1309,9 +1331,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1349,6 +1369,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: @@ -2004,6 +2044,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -2569,6 +2620,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -2718,9 +2780,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -2758,6 +2818,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml index d3f56242f7c49..c90af3b7e8161 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml @@ -598,6 +598,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -1163,6 +1174,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -1312,9 +1334,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1352,6 +1372,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml index 059d8711dd2ef..64324e5d6fd39 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml @@ -598,6 +598,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -1163,6 +1174,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -1312,9 +1334,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1352,6 +1372,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml index e79f4bb4b5222..f96b8ec1ab483 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml @@ -28,8 +28,8 @@ installCRDs: "dynamic" teleportAddress: "" # caPins(list[string]) -- is a list of Teleport CA fingerprints that is used by the operator to -# validate the identity of the Teleport Auth server. This is only used when joining -# an Auth server directly (on port `3025`) and is ignored when joining through a Proxy +# validate the identity of the Teleport Auth Service. This is only used when joining +# an Auth Service directly (on port `3025`) and is ignored when joining through a Proxy # (port `443` or `3080`). caPins: [] diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index f36a7cb215c43..1b201bbe800f7 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-cluster-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-cluster-17.0.6 teleport.dev/majorVersion: "17" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index 28434d84c2031..36d88417fdf3c 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-cluster-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-cluster-17.0.6 teleport.dev/majorVersion: "17" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index 23cfb6dd74f69..7aecfb2f9c53e 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index 2a825c63f754f..ae083f0e351c6 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-cluster-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-cluster-17.0.6 teleport.dev/majorVersion: "17" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index e88d6755849f1..a3e597cbd374e 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-cluster-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-cluster-17.0.6 teleport.dev/majorVersion: "17" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: 75e7880364b55dc899e7e003c20f73c24bc08a212d5d0466dfeabb99616c0817 + checksum/config: 121c7a9476b34471e3760b985a9d43ea565ab0ff57ae3315cedda64b1848a0fa kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.4 - helm.sh/chart: teleport-cluster-17.0.4 + app.kubernetes.io/version: 17.0.6 + helm.sh/chart: teleport-cluster-17.0.6 teleport.dev/majorVersion: "17" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-cluster/values.yaml b/examples/chart/teleport-cluster/values.yaml index 69344fc594897..7e948c15a3570 100644 --- a/examples/chart/teleport-cluster/values.yaml +++ b/examples/chart/teleport-cluster/values.yaml @@ -61,7 +61,8 @@ teleportVersionOverride: "" # For example: # # auth: -# postStart: ["curl", "http://hook"] +# postStart: +# command: ["curl", "http://hook"] # imagePullPolicy: Always auth: # auth.teleportConfig contains YAML teleport configuration for auth pods @@ -84,7 +85,8 @@ auth: # This is merged with chart-scoped values and takes precedence in case of conflict. # For example: # proxy: -# postStart: ["curl", "http://hook"] +# postStart: +# command: ["curl", "http://hook"] # imagePullPolicy: Always # annotations: # service: diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index 6b62ab01c6a4d..f716238fac7d5 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.4" +.version: &version "17.0.6" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index 0aa8a875c6f82..ae0ec7d5f5ed6 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index 2cabef21a2c19..ecdda8690f02d 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -108,7 +108,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -138,7 +138,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -168,7 +168,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -200,7 +200,7 @@ should set resources in the Job's pod spec if resources is set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent name: post-delete-job resources: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index 01c9af5dd81a0..141b7234de23d 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -18,7 +18,7 @@ sets Pod annotations when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -91,7 +91,7 @@ sets Pod labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -188,7 +188,7 @@ sets StatefulSet labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -293,7 +293,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -366,7 +366,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -459,7 +459,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -542,7 +542,7 @@ should add volumeMount for data volume when using StatefulSet: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -615,7 +615,7 @@ should expose diag port: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -688,7 +688,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -775,7 +775,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -860,7 +860,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -933,7 +933,7 @@ should have one replica when replicaCount is not set: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1006,7 +1006,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1081,7 +1081,7 @@ should mount extraVolumes and extraVolumeMounts: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1159,7 +1159,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1240,7 +1240,7 @@ should mount jamfCredentialsSecret.name when role is jamf: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1323,7 +1323,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1408,7 +1408,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1489,7 +1489,7 @@ should not add emptyDir for data when using StatefulSet: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1562,7 +1562,7 @@ should provision initContainer correctly when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1693,7 +1693,7 @@ should set affinity when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1766,7 +1766,7 @@ should set default serviceAccountName when not set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1852,7 +1852,7 @@ should set environment when extraEnv set in values: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1998,7 +1998,7 @@ should set imagePullPolicy when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -2071,7 +2071,7 @@ should set nodeSelector if set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2158,7 +2158,7 @@ should set preferred affinity when more than one replica is used: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2231,7 +2231,7 @@ should set probeTimeoutSeconds when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2314,7 +2314,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2387,7 +2387,7 @@ should set resources when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2467,7 +2467,7 @@ should set serviceAccountName when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2540,7 +2540,7 @@ should set storage.requests when set in values and action is an Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2613,7 +2613,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2686,7 +2686,7 @@ should set tolerations when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index 2b89f2bfde90a..fda763430b083 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.4 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.4 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.6 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/values.yaml b/examples/chart/teleport-kube-agent/values.yaml index 66f7e6c33db3f..c51491783e11c 100644 --- a/examples/chart/teleport-kube-agent/values.yaml +++ b/examples/chart/teleport-kube-agent/values.yaml @@ -56,7 +56,7 @@ enterprise: false # roles `App` and `Kube`. authToken: "" -# joinParams -- controls how the Teleport agent joins the Teleport cluster. +# joinParams -- controls how the Teleport Agent joins the Teleport cluster. # These sub-values must be configured for the agent to connect to a cluster. # # This value serves the same purpose as [`authToken`](#authToken) but supports @@ -98,7 +98,7 @@ joinParams: ################################################################ # kubeClusterName(string) -- sets the name used for the Kubernetes cluster proxied by -# the Teleport agent. This name will be shown to Teleport users connecting to +# the Teleport Agent. This name will be shown to Teleport users connecting to # the cluster. # # This setting is required if the chart `roles` contains `kube`. @@ -320,7 +320,7 @@ azureDatabases: [] # ``` # # -# You can see a list of all the supported [values which can be used in a Teleport database service configuration here](../../reference/agent-services/database-access-reference/configuration.mdx). +# You can see a list of all the supported [values which can be used in a Teleport Database Service configuration here](../../reference/agent-services/database-access-reference/configuration.mdx). # # # @@ -748,7 +748,7 @@ podSecurityPolicy: labels: {} # highAvailability -- contains settings controlling the availability of the -# Teleport agent deployed by the chart. +# Teleport Agent deployed by the chart. # # The availability can be increased by: # - running more replicas with `replicaCount` @@ -876,24 +876,25 @@ adminClusterRoleBinding: # Values that you shouldn't need to change. ################################################################ -# image(string) -- sets the container image used for Teleport OSS agent pods -# created by the chart. +# image(string) -- sets the container image used for Teleport Community Edition +# Agent pods created by the chart. # -# You can override this to use your own Teleport image rather than a Teleport-published image. +# You can override this to use your own Teleport image rather than a +# Teleport-published image. # -# -# When using the Teleport Kube Agent Updater, you must ensure the image is -# available before the updater version target gets updated and Kubernetes tries -# to pull the image. +# +# When using the Teleport Kube Agent Updater, you must ensure the +# image is available before the updater version target gets updated and +# Kubernetes tries to pull the image. # -# For this reason, it is strongly discouraged to set a custom image when -# using automatic updates. Teleport Cloud uses automatic updates by default. +# For this reason, it is strongly discouraged to set a custom image when using +# automatic updates. Teleport Cloud uses automatic updates by default. # # -# Since version 13, hardened distroless images are used by default. -# You can use the deprecated debian-based images by setting the value to -# `public.ecr.aws/gravitational/teleport`. Those images will be -# removed with teleport 15. +# Since version 13, hardened distroless images are used by default. You can use +# the deprecated debian-based images by setting the value to +# `public.ecr.aws/gravitational/teleport`. Those images will be removed with +# teleport 15. # # This setting only takes effect when [`enterprise`](#enterprise) is `false`. # When running an enterprise version, you must use diff --git a/examples/desktop-registration/go.mod b/examples/desktop-registration/go.mod index a7633a03340aa..5da92f124caa3 100644 --- a/examples/desktop-registration/go.mod +++ b/examples/desktop-registration/go.mod @@ -36,12 +36,12 @@ require ( go.opentelemetry.io/otel/sdk v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/grpc v1.61.1 // indirect diff --git a/examples/desktop-registration/go.sum b/examples/desktop-registration/go.sum index 36a788107e189..0b5eedd0047a0 100644 --- a/examples/desktop-registration/go.sum +++ b/examples/desktop-registration/go.sum @@ -159,8 +159,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -212,21 +212,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/examples/go-client/go.mod b/examples/go-client/go.mod index d51d7be223196..f843df505b16b 100644 --- a/examples/go-client/go.mod +++ b/examples/go-client/go.mod @@ -38,12 +38,12 @@ require ( go.opentelemetry.io/otel/sdk v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect google.golang.org/grpc v1.61.1 // indirect diff --git a/examples/go-client/go.sum b/examples/go-client/go.sum index 36a788107e189..0b5eedd0047a0 100644 --- a/examples/go-client/go.sum +++ b/examples/go-client/go.sum @@ -159,8 +159,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -212,21 +212,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/examples/service-discovery-api-client/go.mod b/examples/service-discovery-api-client/go.mod index 9d37ee90fba1d..5cfe290b880fb 100644 --- a/examples/service-discovery-api-client/go.mod +++ b/examples/service-discovery-api-client/go.mod @@ -53,15 +53,16 @@ require ( go.opentelemetry.io/otel/sdk v1.25.0 // indirect go.opentelemetry.io/otel/trace v1.25.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/examples/service-discovery-api-client/go.sum b/examples/service-discovery-api-client/go.sum index 22bbf60678294..2511aa0d9ec69 100644 --- a/examples/service-discovery-api-client/go.sum +++ b/examples/service-discovery-api-client/go.sum @@ -186,8 +186,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -198,8 +198,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -214,8 +214,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= @@ -228,8 +228,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -244,21 +244,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -271,8 +271,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.mod b/go.mod index 3b6ae97b36357..b010cc11d3ee2 100644 --- a/go.mod +++ b/go.mod @@ -198,15 +198,15 @@ require ( go.opentelemetry.io/otel/trace v1.30.0 go.opentelemetry.io/proto/otlp v1.3.1 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.27.0 + golang.org/x/crypto v0.31.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/mod v0.21.0 golang.org/x/net v0.29.0 golang.org/x/oauth2 v0.23.0 - golang.org/x/sync v0.8.0 - golang.org/x/sys v0.25.0 - golang.org/x/term v0.24.0 - golang.org/x/text v0.19.0 + golang.org/x/sync v0.10.0 + golang.org/x/sys v0.28.0 + golang.org/x/term v0.27.0 + golang.org/x/text v0.21.0 golang.org/x/time v0.6.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 google.golang.org/api v0.197.0 diff --git a/go.sum b/go.sum index 3c570a4e09445..0291b60459f94 100644 --- a/go.sum +++ b/go.sum @@ -2361,8 +2361,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2546,8 +2546,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2656,8 +2656,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2676,8 +2676,8 @@ golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2698,8 +2698,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/integration/helpers/instance.go b/integration/helpers/instance.go index cdff68ef04e2a..b132b027b3bef 100644 --- a/integration/helpers/instance.go +++ b/integration/helpers/instance.go @@ -448,6 +448,7 @@ func (i *TeleInstance) Create(t *testing.T, trustedSecrets []*InstanceSecrets, e tconf.Proxy.DisableWebInterface = true tconf.CircuitBreakerConfig = breaker.NoopBreakerConfig() tconf.InstanceMetadataClient = imds.NewDisabledIMDSClient() + tconf.DebugService.Enabled = false return i.CreateEx(t, trustedSecrets, tconf) } @@ -473,6 +474,7 @@ func (i *TeleInstance) GenerateConfig(t *testing.T, trustedSecrets []*InstanceSe tconf.Auth.ClusterName, err = services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ ClusterName: i.Secrets.SiteName, }) + tconf.DebugService.Enabled = false if err != nil { return nil, trace.Wrap(err) } @@ -741,6 +743,7 @@ func (i *TeleInstance) StartNodeWithTargetPort(tconf *servicecfg.Config, authPor } tconf.Auth.Enabled = false tconf.Proxy.Enabled = false + tconf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -783,6 +786,7 @@ func (i *TeleInstance) StartApp(conf *servicecfg.Config) (*service.TeleportProce conf.Testing.UploadEventsC = i.UploadEventsC conf.Auth.Enabled = false conf.Proxy.Enabled = false + conf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -833,6 +837,7 @@ func (i *TeleInstance) StartApps(configs []*servicecfg.Config) ([]*service.Telep cfg.Testing.UploadEventsC = i.UploadEventsC cfg.Auth.Enabled = false cfg.Proxy.Enabled = false + cfg.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -898,6 +903,7 @@ func (i *TeleInstance) StartDatabase(conf *servicecfg.Config) (*service.Teleport conf.Proxy.Enabled = false conf.Apps.Enabled = false conf.SSH.Enabled = false + conf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -960,6 +966,7 @@ func (i *TeleInstance) StartKube(t *testing.T, conf *servicecfg.Config, clusterN conf.Apps.Enabled = false conf.SSH.Enabled = false conf.Databases.Enabled = false + conf.DebugService.Enabled = false conf.Kube.KubeconfigPath = filepath.Join(dataDir, "kube_config") if err := EnableKube(t, conf, clusterName); err != nil { @@ -1035,6 +1042,7 @@ func (i *TeleInstance) StartNodeAndProxy(t *testing.T, name string) (sshPort, we } tconf.CircuitBreakerConfig = breaker.NoopBreakerConfig() tconf.InstanceMetadataClient = imds.NewDisabledIMDSClient() + tconf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -1128,6 +1136,7 @@ func (i *TeleInstance) StartProxy(cfg ProxyConfig, opts ...Option) (reversetunne tconf.Proxy.DisableALPNSNIListener = cfg.DisableALPNSNIListener tconf.CircuitBreakerConfig = breaker.NoopBreakerConfig() tconf.InstanceMetadataClient = imds.NewDisabledIMDSClient() + tconf.DebugService.Enabled = false tconf.FileDescriptors = cfg.FileDescriptors // apply options for _, o := range opts { diff --git a/integration/hsm/helpers.go b/integration/hsm/helpers.go index a51f1ea2e8dbd..a8a91c470a814 100644 --- a/integration/hsm/helpers.go +++ b/integration/hsm/helpers.go @@ -71,7 +71,7 @@ func newTeleportService(ctx context.Context, config *servicecfg.Config, name str } go func() { defer close(t.errC) - t.err = svc.WaitForSignals(ctx, nil) + t.err = svc.Wait() }() t.process = svc diff --git a/integration/integration_test.go b/integration/integration_test.go index e1f3e9e07796b..ae3e5c6fdcfa2 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -930,7 +930,7 @@ func testSessionRecordingModes(t *testing.T, suite *integrationTestSuite) { // waitSessionTermination wait until the errCh returns something and assert // it with the provided function. waitSessionTermination := func(t *testing.T, errCh chan error, errorAssertion require.ErrorAssertionFunc) { - errorAssertion(t, waitForError(errCh, 10*time.Second)) + errorAssertion(t, waitForError(errCh, 30*time.Second)) } // enableDiskFailure changes the OpenFileFunc on filesession package. The @@ -4306,12 +4306,18 @@ func testDiscoveryNode(t *testing.T, suite *integrationTestSuite) { helpers.WaitForActiveTunnelConnections(t, main.Tunnel, helpers.Site, 1) helpers.WaitForActiveTunnelConnections(t, proxyTunnel, helpers.Site, 1) + // Wait for the nodes to be visible to both Proxy instances. + require.NoError(t, main.WaitForNodeCount(ctx, helpers.Site, 1)) + instance := helpers.TeleInstance{Tunnel: proxyTunnel} + require.NoError(t, instance.WaitForNodeCount(ctx, helpers.Site, 1)) + // Execute the connection via first proxy. cfg := helpers.ClientConfig{ Login: suite.Me.Username, Cluster: helpers.Site, Host: "cluster-main-node", } + output, err := runCommand(t, main, []string{"echo", "hello world"}, cfg, 1) require.NoError(t, err) require.Equal(t, "hello world\n", output) diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index de19613a07771..0675425c1743c 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -282,14 +282,14 @@ require ( go.opentelemetry.io/otel/trace v1.30.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect - golang.org/x/crypto v0.28.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/api v0.197.0 // indirect google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index 115bcb50fe51a..e22d08081a424 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -1652,8 +1652,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1828,8 +1828,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1922,8 +1922,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1940,8 +1940,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1962,8 +1962,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml index 6f45a69d0cd2f..f7b4a591b6f8f 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -595,6 +595,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -1160,6 +1171,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -1309,9 +1331,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1349,6 +1369,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: @@ -2004,6 +2044,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -2569,6 +2620,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -2718,9 +2780,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -2758,6 +2818,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml index d3f56242f7c49..c90af3b7e8161 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml @@ -598,6 +598,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -1163,6 +1174,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -1312,9 +1334,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1352,6 +1372,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml index 059d8711dd2ef..64324e5d6fd39 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml @@ -598,6 +598,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object deny: description: Deny is the set of conditions evaluated to deny access. @@ -1163,6 +1174,17 @@ spec: type: string nullable: true type: array + workload_identity_labels: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: WorkloadIdentityLabels controls whether or not specific + WorkloadIdentity resources can be invoked. Further authorization + controls exist on the WorkloadIdentity resource itself. + type: object + workload_identity_labels_expression: + description: WorkloadIdentityLabelsExpression is a predicate expression + used to allow/deny access to issuing a WorkloadIdentity. + type: string type: object options: description: Options is for OpenSSH options like agent forwarding. @@ -1312,9 +1334,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1352,6 +1372,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 6b1008be193ed..8a2f036e2cec4 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -348,15 +348,15 @@ require ( go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/mock v0.4.0 // indirect - golang.org/x/crypto v0.27.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect golang.org/x/mod v0.21.0 // indirect golang.org/x/net v0.29.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/term v0.24.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.24.0 // indirect google.golang.org/api v0.197.0 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index dd6ea8f399bcc..47f1ef18542bd 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -1998,8 +1998,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2179,8 +2179,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2280,8 +2280,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2299,8 +2299,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2321,8 +2321,8 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index 77ccbefa53a1c..cd0c9e9d53fb7 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -2050,6 +2050,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, + "workload_identity_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + Description: "WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.", + Optional: true, + }), + "workload_identity_labels_expression": { + Description: "WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, }), Description: "Allow is the set of conditions evaluated to grant access.", Optional: true, @@ -2517,6 +2526,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, + "workload_identity_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + Description: "WorkloadIdentityLabels controls whether or not specific WorkloadIdentity resources can be invoked. Further authorization controls exist on the WorkloadIdentity resource itself.", + Optional: true, + }), + "workload_identity_labels_expression": { + Description: "WorkloadIdentityLabelsExpression is a predicate expression used to allow/deny access to issuing a WorkloadIdentity.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, }), Description: "Deny is the set of conditions evaluated to deny access. Deny takes priority over allow.", Optional: true, @@ -2673,7 +2691,7 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Type: github_com_hashicorp_terraform_plugin_framework_types.BoolType, }, "port_forwarding": GenSchemaBoolOption(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ - Description: "PortForwarding defines if the certificate will have \"permit-port-forwarding\" in the certificate. PortForwarding is \"yes\" if not set, that's why this is a pointer", + Description: "Deprecated: Use SSHPortForwarding instead", Optional: true, }), "record_session": { @@ -2715,6 +2733,28 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Description: "SSHFileCopy indicates whether remote file operations via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false.", Optional: true, }), + "ssh_port_forwarding": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "local": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"enabled": GenSchemaBoolOption(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + Description: "", + Optional: true, + })}), + Description: "Allow local port forwarding.", + Optional: true, + }, + "remote": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"enabled": GenSchemaBoolOption(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + Description: "", + Optional: true, + })}), + Description: "Allow remote port forwarding.", + Optional: true, + }, + }), + Description: "SSHPortForwarding configures what types of SSH port forwarding are allowed by a role.", + Optional: true, + }, }), Description: "Options is for OpenSSH options like agent forwarding.", Optional: true, @@ -16881,6 +16921,74 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["ssh_port_forwarding"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Options.SSHPortForwarding", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.SSHPortForwarding = nil + if !v.Null && !v.Unknown { + tf := v + obj.SSHPortForwarding = &github_com_gravitational_teleport_api_types.SSHPortForwarding{} + obj := obj.SSHPortForwarding + { + a, ok := tf.Attrs["local"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Local"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Options.SSHPortForwarding.Local", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.Local = nil + if !v.Null && !v.Unknown { + tf := v + obj.Local = &github_com_gravitational_teleport_api_types.SSHLocalPortForwarding{} + obj := obj.Local + { + a, ok := tf.Attrs["enabled"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Local.Enabled"}) + } + CopyFromBoolOption(diags, a, &obj.Enabled) + } + } + } + } + } + { + a, ok := tf.Attrs["remote"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Remote"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Options.SSHPortForwarding.Remote", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.Remote = nil + if !v.Null && !v.Unknown { + tf := v + obj.Remote = &github_com_gravitational_teleport_api_types.SSHRemotePortForwarding{} + obj := obj.Remote + { + a, ok := tf.Attrs["enabled"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Remote.Enabled"}) + } + CopyFromBoolOption(diags, a, &obj.Enabled) + } + } + } + } + } + } + } + } + } } } } @@ -18830,6 +18938,30 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["workload_identity_labels"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.WorkloadIdentityLabels"}) + } + CopyFromLabels(diags, a, &obj.WorkloadIdentityLabels) + } + { + a, ok := tf.Attrs["workload_identity_labels_expression"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.WorkloadIdentityLabelsExpression"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.WorkloadIdentityLabelsExpression", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.WorkloadIdentityLabelsExpression = t + } + } + } } } } @@ -20779,6 +20911,30 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["workload_identity_labels"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.WorkloadIdentityLabels"}) + } + CopyFromLabels(diags, a, &obj.WorkloadIdentityLabels) + } + { + a, ok := tf.Attrs["workload_identity_labels_expression"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.WorkloadIdentityLabelsExpression"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.WorkloadIdentityLabelsExpression", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.WorkloadIdentityLabelsExpression = t + } + } + } } } } @@ -21945,6 +22101,120 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["create_host_user_default_shell"] = v } } + { + a, ok := tf.AttrTypes["ssh_port_forwarding"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Options.SSHPortForwarding", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["ssh_port_forwarding"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.SSHPortForwarding == nil { + v.Null = true + } else { + obj := obj.SSHPortForwarding + tf := &v + { + a, ok := tf.AttrTypes["local"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Local"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Options.SSHPortForwarding.Local", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["local"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.Local == nil { + v.Null = true + } else { + obj := obj.Local + tf := &v + { + t, ok := tf.AttrTypes["enabled"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Local.Enabled"}) + } else { + v := CopyToBoolOption(diags, obj.Enabled, t, tf.Attrs["enabled"]) + tf.Attrs["enabled"] = v + } + } + } + v.Unknown = false + tf.Attrs["local"] = v + } + } + } + { + a, ok := tf.AttrTypes["remote"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Remote"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Options.SSHPortForwarding.Remote", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["remote"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.Remote == nil { + v.Null = true + } else { + obj := obj.Remote + tf := &v + { + t, ok := tf.AttrTypes["enabled"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Options.SSHPortForwarding.Remote.Enabled"}) + } else { + v := CopyToBoolOption(diags, obj.Enabled, t, tf.Attrs["enabled"]) + tf.Attrs["enabled"] = v + } + } + } + v.Unknown = false + tf.Attrs["remote"] = v + } + } + } + } + v.Unknown = false + tf.Attrs["ssh_port_forwarding"] = v + } + } + } } v.Unknown = false tf.Attrs["options"] = v @@ -25343,6 +25613,37 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te } } } + { + t, ok := tf.AttrTypes["workload_identity_labels"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.WorkloadIdentityLabels"}) + } else { + v := CopyToLabels(diags, obj.WorkloadIdentityLabels, t, tf.Attrs["workload_identity_labels"]) + tf.Attrs["workload_identity_labels"] = v + } + } + { + t, ok := tf.AttrTypes["workload_identity_labels_expression"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.WorkloadIdentityLabelsExpression"}) + } else { + v, ok := tf.Attrs["workload_identity_labels_expression"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Allow.WorkloadIdentityLabelsExpression", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.WorkloadIdentityLabelsExpression", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.WorkloadIdentityLabelsExpression) == "" + } + v.Value = string(obj.WorkloadIdentityLabelsExpression) + v.Unknown = false + tf.Attrs["workload_identity_labels_expression"] = v + } + } } v.Unknown = false tf.Attrs["allow"] = v @@ -28741,6 +29042,37 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te } } } + { + t, ok := tf.AttrTypes["workload_identity_labels"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.WorkloadIdentityLabels"}) + } else { + v := CopyToLabels(diags, obj.WorkloadIdentityLabels, t, tf.Attrs["workload_identity_labels"]) + tf.Attrs["workload_identity_labels"] = v + } + } + { + t, ok := tf.AttrTypes["workload_identity_labels_expression"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.WorkloadIdentityLabelsExpression"}) + } else { + v, ok := tf.Attrs["workload_identity_labels_expression"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Deny.WorkloadIdentityLabelsExpression", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.WorkloadIdentityLabelsExpression", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.WorkloadIdentityLabelsExpression) == "" + } + v.Value = string(obj.WorkloadIdentityLabelsExpression) + v.Unknown = false + tf.Attrs["workload_identity_labels_expression"] = v + } + } } v.Unknown = false tf.Attrs["deny"] = v diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index d9ac852bba65b..f03ced9931b17 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -103,6 +103,7 @@ type Config struct { Users services.UsersService WebSession types.WebSessionInterface WebToken types.WebTokenInterface + WorkloadIdentity cache.WorkloadIdentityReader DynamicWindowsDesktops services.DynamicWindowsDesktops WindowsDesktops services.WindowsDesktops AutoUpdateService services.AutoUpdateServiceGetter @@ -201,6 +202,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { Users: cfg.Users, WebSession: cfg.WebSession, WebToken: cfg.WebToken, + WorkloadIdentity: cfg.WorkloadIdentity, WindowsDesktops: cfg.WindowsDesktops, DynamicWindowsDesktops: cfg.DynamicWindowsDesktops, ProvisioningStates: cfg.ProvisioningStates, diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 090be4f938777..bbd42f083718b 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -390,6 +390,13 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { return nil, trace.Wrap(err, "creating SPIFFEFederation service") } } + if cfg.WorkloadIdentity == nil { + workloadIdentity, err := local.NewWorkloadIdentityService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err, "creating WorkloadIdentity service") + } + cfg.WorkloadIdentity = workloadIdentity + } if cfg.Logger == nil { cfg.Logger = slog.With(teleport.ComponentKey, teleport.ComponentAuth) } @@ -486,6 +493,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { StaticHostUser: cfg.StaticHostUsers, ProvisioningStates: cfg.ProvisioningStates, IdentityCenter: cfg.IdentityCenter, + WorkloadIdentities: cfg.WorkloadIdentity, } as := Server{ @@ -703,6 +711,7 @@ type Services struct { services.AutoUpdateService services.ProvisioningStates services.IdentityCenter + services.WorkloadIdentities } // GetWebSession returns existing web session described by req. @@ -5098,47 +5107,11 @@ func (a *Server) CreateAccessRequestV2(ctx context.Context, req types.AccessRequ } // Look for user groups and associated applications to the request. - requestedResourceIDs := req.GetRequestedResourceIDs() - var additionalResources []types.ResourceID - - var userGroups []types.ResourceID - existingApps := map[string]struct{}{} - for _, resource := range requestedResourceIDs { - switch resource.Kind { - case types.KindApp: - existingApps[resource.Name] = struct{}{} - case types.KindUserGroup: - userGroups = append(userGroups, resource) - } - } - - for _, resource := range userGroups { - if resource.Kind != types.KindUserGroup { - continue - } - - userGroup, err := a.GetUserGroup(ctx, resource.Name) - if err != nil { - return nil, trace.Wrap(err) - } - - for _, app := range userGroup.GetApplications() { - // Only add to the request if we haven't already added it. - if _, ok := existingApps[app]; !ok { - additionalResources = append(additionalResources, types.ResourceID{ - ClusterName: resource.ClusterName, - Kind: types.KindApp, - Name: app, - }) - existingApps[app] = struct{}{} - } - } - } - - if len(additionalResources) > 0 { - requestedResourceIDs = append(requestedResourceIDs, additionalResources...) - req.SetRequestedResourceIDs(requestedResourceIDs) + requestedResourceIDs, err := a.appendImplicitlyRequiredResources(ctx, req.GetRequestedResourceIDs()) + if err != nil { + return nil, trace.Wrap(err, "adding additional implicitly required resources") } + req.SetRequestedResourceIDs(requestedResourceIDs) if req.GetDryRun() { _, promotions := a.generateAccessRequestPromotions(ctx, req) @@ -5168,7 +5141,7 @@ func (a *Server) CreateAccessRequestV2(ctx context.Context, req types.AccessRequ } } - err := a.emitter.EmitAuditEvent(a.closeCtx, &apievents.AccessRequestCreate{ + err = a.emitter.EmitAuditEvent(a.closeCtx, &apievents.AccessRequestCreate{ Metadata: apievents.Metadata{ Type: events.AccessRequestCreateEvent, Code: events.AccessRequestCreateCode, @@ -5218,6 +5191,8 @@ func (a *Server) CreateAccessRequestV2(ctx context.Context, req types.AccessRequ }, }, }, + // Prevent the requester from seeing the notification for their own access request. + ExcludeUsers: []string{req.GetUser()}, Notification: ¬ificationsv1.Notification{ Spec: ¬ificationsv1.NotificationSpec{}, SubKind: types.NotificationAccessRequestPendingSubKind, @@ -5248,6 +5223,69 @@ func (a *Server) CreateAccessRequestV2(ctx context.Context, req types.AccessRequ return req, nil } +// appendImplicitlyRequiredResources examines the set of requested resources and adds +// any extra resources that are implicitly required by the request. +func (a *Server) appendImplicitlyRequiredResources(ctx context.Context, resources []types.ResourceID) ([]types.ResourceID, error) { + addedApps := utils.NewSet[string]() + var userGroups []types.ResourceID + var accountAssignments []types.ResourceID + + for _, resource := range resources { + switch resource.Kind { + case types.KindApp: + addedApps.Add(resource.Name) + case types.KindUserGroup: + userGroups = append(userGroups, resource) + case types.KindIdentityCenterAccountAssignment: + accountAssignments = append(accountAssignments, resource) + } + } + + for _, resource := range userGroups { + userGroup, err := a.GetUserGroup(ctx, resource.Name) + if err != nil { + return nil, trace.Wrap(err) + } + + for _, app := range userGroup.GetApplications() { + // Only add to the request if we haven't already added it. + if !addedApps.Contains(app) { + resources = append(resources, types.ResourceID{ + ClusterName: resource.ClusterName, + Kind: types.KindApp, + Name: app, + }) + addedApps.Add(app) + } + } + } + + icAccounts := utils.NewSet[string]() + for _, resource := range accountAssignments { + // The UI needs access to the account associated with an Account Assignment + // in order to display the enclosing Account, otherwise the user will not + // be able to see their assigned permission sets. + assignmentID := services.IdentityCenterAccountAssignmentID(resource.Name) + asmt, err := a.Services.IdentityCenter.GetAccountAssignment(ctx, assignmentID) + if err != nil { + return nil, trace.Wrap(err, "fetching identity center account assignment") + } + + if icAccounts.Contains(asmt.GetSpec().GetAccountId()) { + continue + } + + resources = append(resources, types.ResourceID{ + ClusterName: resource.ClusterName, + Kind: types.KindIdentityCenterAccount, + Name: asmt.GetSpec().GetAccountId(), + }) + icAccounts.Add(asmt.GetSpec().GetAccountId()) + } + + return resources, nil +} + // generateAccessRequestPromotions will return potential access list promotions for an access request. On error, this function will log // the error and return whatever it has. The caller is expected to deal with the possibility of a nil promotions object. func (a *Server) generateAccessRequestPromotions(ctx context.Context, req types.AccessRequest) (types.AccessRequest, *types.AccessRequestAllowedPromotions) { diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 2c2bbad853b89..70cce69fe8260 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -40,6 +40,8 @@ import ( "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" auditlogpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/auditlog/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/internalutils/stream" "github.com/gravitational/teleport/api/metadata" @@ -1301,7 +1303,7 @@ func (c *resourceAccess) checkAccess(resource types.ResourceWithLabels, filter s return true, nil } - // check access normally if base checker doesnt exist + // check access normally if base checker doesn't exist if c.baseAuthChecker == nil { if err := c.accessChecker.CanAccess(resource); err != nil { if trace.IsAccessDenied(err) { @@ -1503,6 +1505,16 @@ func (a *ServerWithRoles) ListUnifiedResources(ctx context.Context, req *proto.L } r.Logins = logins } else if d := r.GetAppServer(); d != nil { + // Apps representing an Identity Center Account have a collection of Permission Sets + // that can be thought of as individually-addressable sub-resources. To present a consitent + // view of the account we check access for each Permission Set, filter out those that have + // no access and treat the whole app as requiring an access request if _any_ of the contained + // permission sets require one. + if err := a.filterICPermissionSets(r, d.GetApp(), resourceAccess); err != nil { + log.WithError(err).WithField("resource", d.GetApp().GetName()).Warn("Unable to filter ") + continue + } + logins, err := checker.GetAllowedLoginsForResource(d.GetApp()) if err != nil { log.WithError(err).WithField("resource", d.GetApp().GetName()).Warn("Unable to determine logins for app") @@ -1519,6 +1531,56 @@ func (a *ServerWithRoles) ListUnifiedResources(ctx context.Context, req *proto.L }, nil } +func (a *ServerWithRoles) filterICPermissionSets(r *proto.PaginatedResource, app types.Application, checker *resourceAccess) error { + appV3, ok := app.(*types.AppV3) + if !ok { + return trace.BadParameter("resource must be an app") + } + + pss := appV3.Spec.IdentityCenter.GetPermissionSets() + if pss == nil { + return nil + } + + assignment := services.IdentityCenterAccountAssignment{ + AccountAssignment: &identitycenterv1.AccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: types.V1, + Metadata: &headerv1.Metadata{}, + Spec: &identitycenterv1.AccountAssignmentSpec{ + AccountId: appV3.GetName(), + PermissionSet: &identitycenterv1.PermissionSetInfo{}, + }, + }, + } + permissionSetQuery := assignment.Spec.PermissionSet + checkable := types.Resource153ToResourceWithLabels(assignment) + + var output []*types.IdentityCenterPermissionSet + for _, ps := range pss { + assignment.Metadata.Name = ps.AssignmentID + permissionSetQuery.Arn = ps.ARN + + hasAccess, err := checker.checkAccess(checkable, services.MatchResourceFilter{ + ResourceKind: types.KindIdentityCenterAccountAssignment, + }) + if err != nil { + return trace.Wrap(err) + } + + if !hasAccess { + continue + } + output = append(output, ps) + if _, requestable := checker.requestableMap[ps.AssignmentID]; requestable { + r.RequiresRequest = true + } + } + appV3.Spec.IdentityCenter.PermissionSets = output + + return nil +} + func (a *ServerWithRoles) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { if err := a.action(namespace, types.KindNode, types.VerbList); err != nil { return nil, trace.Wrap(err) @@ -1860,8 +1922,18 @@ func (r resourceChecker) CanAccess(resource types.Resource) error { return r.CheckAccess(rr, state) case types.Resource153Unwrapper: - if checkable, ok := rr.(services.AccessCheckable); ok { - return r.CheckAccess(checkable, state) + checkable, isCheckable := rr.(services.AccessCheckable) + if isCheckable { + switch unwrapped := rr.Unwrap().(type) { + case services.IdentityCenterAccount: + return r.CheckAccess(checkable, state, services.NewIdentityCenterAccountMatcher(unwrapped)) + + case services.IdentityCenterAccountAssignment: + return r.CheckAccess(checkable, state, services.NewIdentityCenterAccountAssignmentMatcher(unwrapped)) + + default: + return r.CheckAccess(checkable, state) + } } } diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index ae64df0a23c06..fdf1b644d4de0 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -5742,7 +5742,28 @@ func TestListUnifiedResources_WithPredicate(t *testing.T) { require.Error(t, err) } +func withAccountAssignment(condition types.RoleConditionType, accountID, permissionSet string) CreateUserAndRoleOption { + return WithRoleMutator(func(role types.Role) { + r := role.(*types.RoleV6) + cond := &r.Spec.Deny + if condition == types.Allow { + cond = &r.Spec.Allow + } + cond.AccountAssignments = append( + cond.AccountAssignments, + types.IdentityCenterAccountAssignment{ + Account: accountID, + PermissionSet: permissionSet, + }) + }) +} + func TestUnifiedResources_IdentityCenter(t *testing.T) { + const ( + validAccountID = "11111111" + validPermissionSetARN = "some:ps:arn" + ) + ctx := context.Background() srv := newTestTLSServer(t, withCacheEnabled(true)) @@ -5750,16 +5771,15 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { return srv.Auth().UnifiedResourceCache.IsInitialized() }, 5*time.Second, 200*time.Millisecond, "unified resource watcher never initialized") - setAccountAssignment := func(role types.Role) { - r := role.(*types.RoleV6) - r.Spec.Allow.AccountAssignments = []types.IdentityCenterAccountAssignment{ - { - Account: "11111111", - PermissionSet: "some:arn", - }, - } + allowByGenericKind := []types.Rule{ + types.NewRule(types.KindIdentityCenter, services.RO()), } + // adds a Rule ALLOW condition for the valid account ID and Permission set + // pair + withMatchingAccountAssignment := withAccountAssignment(types.Allow, + validAccountID, validPermissionSetARN) + testCases := []struct { name string kind string @@ -5780,8 +5800,8 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { }, }, Spec: &identitycenterv1.AccountSpec{ - Id: "11111111", - Arn: "some:arn", + Id: validAccountID, + Arn: "some:account:arn", Name: "Test Account", }, }, @@ -5818,11 +5838,11 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { }, }, Spec: &identitycenterv1.AccountAssignmentSpec{ - AccountId: "11111111", + AccountId: validAccountID, Display: "Test Account Assignment", PermissionSet: &identitycenterv1.PermissionSetInfo{ - Arn: "some:arn", - Name: "Test Account", + Arn: validPermissionSetARN, + Name: "Test permission set", AssignmentId: "Test Assignment on Test Account", }, }, @@ -5851,6 +5871,10 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { t.Run(test.name, func(t *testing.T) { test.init(t) + allowBySpecificKind := []types.Rule{ + types.NewRule(test.kind, services.RO()), + } + t.Run("no access", func(t *testing.T) { userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "no-access", nil, nil) require.NoError(t, err) @@ -5870,12 +5894,53 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { require.Empty(t, resp.Resources) }) + t.Run("no access via no matching account condition ", func(t *testing.T) { + userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "no-access-account-mismatch", nil, + allowByGenericKind, + withAccountAssignment(types.Allow, "22222222", validPermissionSetARN)) + require.NoError(t, err) + + identity := TestUser(userNoAccess.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.NoError(t, err) + require.Empty(t, resp.Resources) + }) + + t.Run("access denied by account deny condition", func(t *testing.T) { + userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "no-access-account-mismatch", nil, + allowBySpecificKind, + withMatchingAccountAssignment, + withAccountAssignment(types.Deny, validAccountID, "*")) + require.NoError(t, err) + + identity := TestUser(userNoAccess.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.NoError(t, err) + require.Empty(t, resp.Resources) + }) + t.Run("access via generic kind", func(t *testing.T) { user, _, err := CreateUserAndRole(srv.Auth(), "read-generic", nil, - []types.Rule{ - types.NewRule(types.KindIdentityCenter, services.RO()), - }, - WithRoleMutator(setAccountAssignment)) + allowByGenericKind, + withMatchingAccountAssignment) require.NoError(t, err) identity := TestUser(user.GetName()) @@ -5895,10 +5960,8 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { t.Run("access via specific kind", func(t *testing.T) { user, _, err := CreateUserAndRole(srv.Auth(), "read-specific", nil, - []types.Rule{ - types.NewRule(test.kind, services.RO()), - }, - WithRoleMutator(setAccountAssignment)) + allowBySpecificKind, + withMatchingAccountAssignment) require.NoError(t, err) identity := TestUser(user.GetName()) @@ -5913,13 +5976,11 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { require.Len(t, resp.Resources, 1) }) - t.Run("denied via specific kind beats allow via generic kind", func(t *testing.T) { + t.Run("access denied via specific kind beats allow via generic kind", func(t *testing.T) { user, _, err := CreateUserAndRole(srv.Auth(), "specific-beats-generic", nil, - []types.Rule{ - types.NewRule(types.KindIdentityCenter, services.RO()), - }, + allowByGenericKind, + withMatchingAccountAssignment, WithRoleMutator(func(r types.Role) { - setAccountAssignment(r) r.SetRules(types.Deny, []types.Rule{ types.NewRule(test.kind, services.RO()), }) @@ -5937,6 +5998,59 @@ func TestUnifiedResources_IdentityCenter(t *testing.T) { require.True(t, trace.IsAccessDenied(err), "Expected Access Denied, got %v", err) }) + + // The tests below this point are only applicable to Identity Center + // Account assignments + if test.kind == types.KindIdentityCenterAccount { + return + } + + // Asserts that a role ALLOW condition with a matching Account ID but + // nonmatching PermissionSet ARN does not allow access + t.Run("no access via no matching allow permission set condition", func(t *testing.T) { + userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "no-access-allow-ps-mismatch", nil, + allowByGenericKind, + withAccountAssignment(types.Allow, validAccountID, "some:other:ps:arn")) + require.NoError(t, err) + + identity := TestUser(userNoAccess.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.NoError(t, err) + require.Empty(t, resp.Resources) + }) + + // Asserts that a role DENY condition with a matching Account ID but + // nonmatching PermissionSet ARN does not block access + t.Run("access via no matching deny permission set condition", func(t *testing.T) { + userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "access-deny-ps-mismatch", nil, + allowByGenericKind, + withMatchingAccountAssignment, + withAccountAssignment(types.Deny, "*", "some:other:ps")) + require.NoError(t, err) + + identity := TestUser(userNoAccess.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.NoError(t, err) + require.Len(t, resp.Resources, 1) + }) }) } } @@ -9513,3 +9627,206 @@ func TestRoleRequestReasonModeValidation(t *testing.T) { }) } } + +func testUserName(testName string) string { + return strings.ReplaceAll(testName, " ", "_") +} + +func TestFilterIdentityCenterPermissionSets(t *testing.T) { + const ( + allAccessRoleName = "all-access" + accountID = "1234567890" + permissionSetArnPrefix = "aws:awn:test:permission:set:" + ) + + // GIVEN a test cluster... + ctx := context.Background() + srv := newTestTLSServer(t) + s := newTestServerWithRoles(t, srv.AuthServer, types.RoleAdmin) + + // GIVEN an Identity Center Account with some associated Permission Set + // resources + permissionSets := []*identitycenterv1.PermissionSetInfo{ + { + Name: "PS One", + Arn: permissionSetArnPrefix + "one", + AssignmentId: accountID + "-" + "ps_one", + }, + { + Name: "PS Two", + Arn: permissionSetArnPrefix + "two", + AssignmentId: accountID + "-" + "ps_two", + }, + { + Name: "PS Three", + Arn: permissionSetArnPrefix + "ps_three", + AssignmentId: accountID + "-" + "ps_three", + }, + } + + _, err := s.authServer.CreateIdentityCenterAccount(ctx, + services.IdentityCenterAccount{ + Account: &identitycenterv1.Account{ + Kind: types.KindIdentityCenterAccount, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: accountID, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }, + Spec: &identitycenterv1.AccountSpec{ + Id: accountID, + Arn: "aws:arn:test:account", + Name: "Test Account", + Description: "An account for testing", + PermissionSetInfo: permissionSets, + }, + }, + }) + require.NoError(t, err) + + // GIVEN a role that allows access to all permission sets on the target + // Identity Center account + roleAccessAll, err := types.NewRole(allAccessRoleName, types.RoleSpecV6{ + Allow: types.RoleConditions{ + AccountAssignments: []types.IdentityCenterAccountAssignment{ + { + Account: accountID, + PermissionSet: types.Wildcard, + }, + }, + }, + }) + require.NoError(t, err, "Constructing role should succeed") + _, err = srv.Auth().CreateRole(ctx, roleAccessAll) + require.NoError(t, err, "Cretaing role should succeed") + + withRequesterRole := WithRoleMutator(func(role types.Role) { + r := role.(*types.RoleV6) + r.Spec.Allow.Request = &types.AccessRequestConditions{ + SearchAsRoles: []string{allAccessRoleName}, + } + }) + + // EXPECT that the IC Account has made it to the cache + inlineEventually(t, + func() bool { + testAssignments, _, err := srv.Auth().ListIdentityCenterAccounts( + ctx, 100, &pagination.PageRequestToken{}) + require.NoError(t, err) + return len(testAssignments) == 1 + }, + 5*time.Second, 200*time.Millisecond, + "Target resource missing from cache") + + testCases := []struct { + name string + roleModifiers []CreateUserAndRoleOption + includeRequestable bool + expectedPSs []*types.IdentityCenterPermissionSet + expectedRequireRequest require.BoolAssertionFunc + }{ + { + name: "basic access", + roleModifiers: []CreateUserAndRoleOption{ + withAccountAssignment(types.Allow, accountID, permissionSets[0].Arn), + withAccountAssignment(types.Allow, accountID, permissionSets[1].Arn), + }, + expectedPSs: []*types.IdentityCenterPermissionSet{ + paginatedAppPermissionSet(permissionSets[0]), + paginatedAppPermissionSet(permissionSets[1]), + }, + expectedRequireRequest: require.False, + }, + { + name: "ignore search as roles when disabled", + roleModifiers: []CreateUserAndRoleOption{ + withAccountAssignment(types.Allow, accountID, permissionSets[1].Arn), + withRequesterRole, + }, + includeRequestable: false, + expectedPSs: []*types.IdentityCenterPermissionSet{ + paginatedAppPermissionSet(permissionSets[1]), + }, + expectedRequireRequest: require.False, + }, + { + name: "requestable access", + roleModifiers: []CreateUserAndRoleOption{ + withAccountAssignment(types.Allow, accountID, permissionSets[1].Arn), + withRequesterRole, + }, + includeRequestable: true, + expectedPSs: []*types.IdentityCenterPermissionSet{ + paginatedAppPermissionSet(permissionSets[0]), + paginatedAppPermissionSet(permissionSets[1]), + paginatedAppPermissionSet(permissionSets[2]), + }, + expectedRequireRequest: require.True, + }, + { + name: "no access", + roleModifiers: []CreateUserAndRoleOption{ + withAccountAssignment(types.Allow, accountID, "some-non-existent-ps"), + }, + expectedRequireRequest: require.False, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + // GIVEN a user who has a role that allows a test-defined level of + // Identity Center access + user, _, err := CreateUserAndRole(srv.Auth(), testUserName(test.name), + nil, nil, test.roleModifiers...) + require.NoError(t, err) + + // GIVEN an auth client using the above user + identity := TestUser(user.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + t.Cleanup(func() { clt.Close() }) + + // WHEN I list the unified resources, with a filter specifically for + // the account resource defined above... + resp, err := clt.ListUnifiedResources(ctx, &proto.ListUnifiedResourcesRequest{ + Kinds: []string{types.KindApp}, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + UseSearchAsRoles: test.includeRequestable, + IncludeRequestable: test.includeRequestable, + IncludeLogins: true, + SortBy: types.SortBy{IsDesc: true, Field: types.ResourceMetadataName}, + }) + + // EXPECT that the listing succeeds and returns a single resource + require.NoError(t, err) + require.Len(t, resp.Resources, 1, "Must return exactly one resource") + + // EXPECT that the contained resource has the test-defined value for + // the RequiresRequest flag + resource := resp.Resources[0] + test.expectedRequireRequest(t, resource.RequiresRequest) + + // EXPECT that the returned resource is an App + appServer := resp.Resources[0].GetAppServer() + require.NotNil(t, appServer, "Expected resource to be an app") + app := appServer.GetApp() + + // EXPECT that the app PermissionSets are filtered to the test-defined + // list + require.ElementsMatch(t, + test.expectedPSs, app.GetIdentityCenter().PermissionSets) + }) + } +} + +func paginatedAppPermissionSet(src *identitycenterv1.PermissionSetInfo) *types.IdentityCenterPermissionSet { + return &types.IdentityCenterPermissionSet{ + ARN: src.Arn, + Name: src.Name, + AssignmentID: src.AssignmentId, + } +} diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index d2e206fd8dd51..d792141673874 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -38,6 +38,7 @@ import ( userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/discoveryconfig" @@ -1229,6 +1230,12 @@ type Cache interface { // pagination. ListSPIFFEFederations(ctx context.Context, pageSize int, lastToken string) ([]*machineidv1.SPIFFEFederation, string, error) + // GetWorkloadIdentity gets a WorkloadIdentity by name. + GetWorkloadIdentity(ctx context.Context, name string) (*workloadidentityv1pb.WorkloadIdentity, error) + // ListWorkloadIdentities lists all SPIFFE Federations using Google style + // pagination. + ListWorkloadIdentities(ctx context.Context, pageSize int, lastToken string) ([]*workloadidentityv1pb.WorkloadIdentity, string, error) + // ListStaticHostUsers lists static host users. ListStaticHostUsers(ctx context.Context, pageSize int, startKey string) ([]*userprovisioningpb.StaticHostUser, string, error) // GetStaticHostUser returns a static host user by name. diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 3ce5c78a330ec..20cda50d900aa 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -73,6 +73,7 @@ import ( usersv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" usertaskv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" vnetv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" userpreferencesv1pb "github.com/gravitational/teleport/api/gen/proto/go/userpreferences/v1" "github.com/gravitational/teleport/api/internalutils/stream" "github.com/gravitational/teleport/api/metadata" @@ -80,6 +81,7 @@ import ( apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/types/installers" "github.com/gravitational/teleport/api/types/wrappers" + apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/auth/accessmonitoringrules/accessmonitoringrulesv1" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/autoupdate/autoupdatev1" @@ -93,6 +95,7 @@ import ( "github.com/gravitational/teleport/lib/auth/kubewaitingcontainer/kubewaitingcontainerv1" "github.com/gravitational/teleport/lib/auth/loginrule/loginrulev1" "github.com/gravitational/teleport/lib/auth/machineid/machineidv1" + "github.com/gravitational/teleport/lib/auth/machineid/workloadidentityv1" "github.com/gravitational/teleport/lib/auth/notifications/notificationsv1" "github.com/gravitational/teleport/lib/auth/presence/presencev1" "github.com/gravitational/teleport/lib/auth/trust/trustv1" @@ -1973,11 +1976,58 @@ func (g *GRPCServer) DeleteAllKubernetesServers(ctx context.Context, req *authpb // version for some features of the role returns a shallow copy of the given // role downgraded for compatibility with the older version. func maybeDowngradeRole(ctx context.Context, role *types.RoleV6) (*types.RoleV6, error) { - // Teleport 16 supports all role features that Teleport 15 does, - // so no downgrade is necessary. + clientVersionString, ok := metadata.ClientVersionFromContext(ctx) + if !ok { + // This client is not reporting its version via gRPC metadata. Teleport + // clients have been reporting their version for long enough that older + // clients won't even support v6 roles at all, so this is likely a + // third-party client, and we shouldn't assume that downgrading the role + // will do more good than harm. + return role, nil + } + + clientVersion, err := semver.NewVersion(clientVersionString) + if err != nil { + return nil, trace.BadParameter("unrecognized client version: %s is not a valid semver", clientVersionString) + } + + role = maybeDowngradeRoleSSHPortForwarding(role, clientVersion) return role, nil } +var minSupportedSSHPortForwardingVersions = map[int64]semver.Version{ + 17: {Major: 17, Minor: 1, Patch: 0}, +} + +func maybeDowngradeRoleSSHPortForwarding(role *types.RoleV6, clientVersion *semver.Version) *types.RoleV6 { + sshPortForwarding := role.GetOptions().SSHPortForwarding + if sshPortForwarding == nil || (sshPortForwarding.Remote == nil && sshPortForwarding.Local == nil) { + return role + } + + minSupportedVersion, ok := minSupportedSSHPortForwardingVersions[clientVersion.Major] + if ok { + if supported, err := utils.MinVerWithoutPreRelease(clientVersion.String(), minSupportedVersion.String()); supported || err != nil { + return role + } + } + + role = apiutils.CloneProtoMsg(role) + options := role.GetOptions() + + //nolint:staticcheck // this field is preserved for backwards compatibility + options.PortForwarding = types.NewBoolOption(services.RoleSet{role}.CanPortForward()) + role.SetOptions(options) + reason := fmt.Sprintf(`Client version %q does not support granular SSH port forwarding. Role %q will be downgraded `+ + `to simple port forwarding rules instead. In order to support granular SSH port forwarding, all clients must be `+ + `updated to version %q or higher.`, clientVersion, role.GetName(), minSupportedVersion) + if role.Metadata.Labels == nil { + role.Metadata.Labels = make(map[string]string, 1) + } + role.Metadata.Labels[types.TeleportDowngradedLabel] = reason + return role +} + // GetRole retrieves a role by name. func (g *GRPCServer) GetRole(ctx context.Context, req *authpb.GetRoleRequest) (*types.RoleV6, error) { auth, err := g.authenticate(ctx) @@ -2060,6 +2110,15 @@ func (g *GRPCServer) CreateRole(ctx context.Context, req *authpb.CreateRoleReque return nil, trace.Wrap(err) } + // This check *must* happen at the RPC layer rather than somewhere like ValidateRole or CheckAndSetDefaults. We want to prevent role + // creation and updates from defining both port_forwarding and ssh_port_forwarding for the same role. However, when making effective + // roles available to nodes it should be possible for both fields to be assigned in order to maintain backwards compatibility with older + // agents (similar to a role downgrade). + //nolint:staticcheck // this field is preserved for backwards compatibility, but shouldn't be used going forward + if req.Role.GetOptions().SSHPortForwarding != nil && req.Role.GetOptions().PortForwarding != nil { + return nil, trace.BadParameter("options define both 'port_forwarding' and 'ssh_port_forwarding', only one can be set") + } + if err = services.ValidateRole(req.Role); err != nil { return nil, trace.Wrap(err) } @@ -2087,6 +2146,15 @@ func (g *GRPCServer) UpdateRole(ctx context.Context, req *authpb.UpdateRoleReque return nil, trace.Wrap(err) } + // This check *must* happen at the RPC layer rather than somewhere like ValidateRole or CheckAndSetDefaults. We want to prevent role + // creation and updates from defining both port_forwarding and ssh_port_forwarding for the same role. However, when making effective + // roles available to nodes it should be possible for both fields to be assigned in order to maintain backwards compatibility with older + // agents (similar to a role downgrade). + //nolint:staticcheck // this field is preserved for backwards compatibility, but shouldn't be used going forward + if req.Role.GetOptions().SSHPortForwarding != nil && req.Role.GetOptions().PortForwarding != nil { + return nil, trace.BadParameter("options define both 'port_forwarding' and 'ssh_port_forwarding', only one can be set") + } + if err = services.ValidateRole(req.Role); err != nil { return nil, trace.Wrap(err) } @@ -2114,6 +2182,15 @@ func (g *GRPCServer) UpsertRoleV2(ctx context.Context, req *authpb.UpsertRoleReq return nil, trace.Wrap(err) } + // This check *must* happen at the RPC layer rather than somewhere like ValidateRole or CheckAndSetDefaults. We want to prevent role + // creation and updates from defining both port_forwarding and ssh_port_forwarding for the same role. However, when making effective + // roles available to nodes it should be possible for both fields to be assigned in order to maintain backwards compatibility with older + // agents (similar to a role downgrade). + //nolint:staticcheck // this field is preserved for backwards compatibility, but shouldn't be used going forward + if req.Role.GetOptions().SSHPortForwarding != nil && req.Role.GetOptions().PortForwarding != nil { + return nil, trace.BadParameter("options define both 'port_forwarding' and 'ssh_port_forwarding', only one can be set") + } + if err = services.ValidateRole(req.Role); err != nil { return nil, trace.Wrap(err) } @@ -5093,6 +5170,18 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } machineidv1pb.RegisterSPIFFEFederationServiceServer(server, spiffeFederationService) + workloadIdentityResourceService, err := workloadidentityv1.NewResourceService(&workloadidentityv1.ResourceServiceConfig{ + Authorizer: cfg.Authorizer, + Backend: cfg.AuthServer.Services.WorkloadIdentities, + Cache: cfg.AuthServer.Cache, + Emitter: cfg.Emitter, + Clock: cfg.AuthServer.GetClock(), + }) + if err != nil { + return nil, trace.Wrap(err, "creating workload identity resource service") + } + workloadidentityv1pb.RegisterWorkloadIdentityResourceServiceServer(server, workloadIdentityResourceService) + dbObjectImportRuleService, err := dbobjectimportrulev1.NewDatabaseObjectImportRuleService(dbobjectimportrulev1.DatabaseObjectImportRuleServiceConfig{ Authorizer: cfg.Authorizer, Backend: cfg.AuthServer.Services, diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index ed8e61bd00a85..8a91f952e001e 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -57,6 +57,7 @@ import ( clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/internalutils/stream" + "github.com/gravitational/teleport/api/metadata" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/observability/tracing" "github.com/gravitational/teleport/api/types" @@ -4604,6 +4605,255 @@ func TestGRPCServer_GetInstallers(t *testing.T) { } } +func TestRoleVersions(t *testing.T) { + t.Parallel() + srv := newTestTLSServer(t) + + newRole := func(name string, version string, spec types.RoleSpecV6) types.Role { + role, err := types.NewRoleWithVersion(name, version, spec) + meta := role.GetMetadata() + role.SetMetadata(meta) + require.NoError(t, err) + return role + } + + enabledRole := newRole("test_role_enabled", types.V7, types.RoleSpecV6{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + types.NewRule(types.KindRole, services.RW()), + }, + }, + Options: types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{ + Enabled: types.NewBoolOption(true), + }, + Local: &types.SSHLocalPortForwarding{ + Enabled: types.NewBoolOption(true), + }, + }, + }, + }) + + disabledRole := newRole("test_role_disabled", types.V7, types.RoleSpecV6{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + types.NewRule(types.KindRole, services.RW()), + }, + }, + Options: types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{ + Enabled: types.NewBoolOption(false), + }, + Local: &types.SSHLocalPortForwarding{ + Enabled: types.NewBoolOption(false), + }, + }, + }, + }) + + undefinedRole := newRole("test_role_implicit", types.V7, types.RoleSpecV6{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + types.NewRule(types.KindRole, services.RW()), + }, + }, + }) + + user, err := CreateUser(context.Background(), srv.Auth(), "user", enabledRole, disabledRole, undefinedRole) + require.NoError(t, err) + + client, err := srv.NewClient(TestUser(user.GetName())) + require.NoError(t, err) + + for _, tc := range []struct { + desc string + clientVersions []string + expectError bool + inputRole types.Role + expectedRole types.Role + expectDowngraded bool + }{ + { + desc: "up to date - enabled", + clientVersions: []string{ + "17.1.0", "17.1.0-dev", "", + }, + inputRole: enabledRole, + expectedRole: enabledRole, + }, + { + desc: "up to date - disabled", + clientVersions: []string{ + "17.1.0", "17.1.0-dev", "", + }, + inputRole: disabledRole, + expectedRole: disabledRole, + }, + { + desc: "up to date - undefined", + clientVersions: []string{ + "17.1.0", "17.1.0-dev", "", + }, + inputRole: undefinedRole, + expectedRole: undefinedRole, + }, + { + desc: "downgrade SSH access control granularity - enabled", + clientVersions: []string{ + "17.0.0", + }, + inputRole: enabledRole, + expectedRole: newRole(enabledRole.GetName(), types.V7, types.RoleSpecV6{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + types.NewRule(types.KindRole, services.RW()), + }, + }, + Options: types.RoleOptions{ + PortForwarding: types.NewBoolOption(true), + SSHPortForwarding: enabledRole.GetOptions().SSHPortForwarding, + }, + }), + expectDowngraded: true, + }, + { + desc: "downgrade SSH access control granularity - disabled", + clientVersions: []string{ + "17.0.0", + }, + inputRole: disabledRole, + expectedRole: newRole(disabledRole.GetName(), types.V7, types.RoleSpecV6{ + Allow: types.RoleConditions{ + Rules: []types.Rule{ + types.NewRule(types.KindRole, services.RW()), + }, + }, + Options: types.RoleOptions{ + PortForwarding: types.NewBoolOption(false), + SSHPortForwarding: disabledRole.GetOptions().SSHPortForwarding, + }, + }), + expectDowngraded: true, + }, + { + desc: "downgrade SSH access control granularity - undefined", + clientVersions: []string{ + "17.0.0", + }, + inputRole: undefinedRole, + expectedRole: undefinedRole, + expectDowngraded: false, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + for _, clientVersion := range tc.clientVersions { + t.Run(clientVersion, func(t *testing.T) { + // setup client metadata + ctx := context.Background() + if clientVersion == "" { + ctx = context.WithValue(ctx, metadata.DisableInterceptors{}, struct{}{}) + } else { + ctx = metadata.AddMetadataToContext(ctx, map[string]string{ + metadata.VersionKey: clientVersion, + }) + } + + checkRole := func(gotRole types.Role) { + t.Helper() + if tc.expectError { + return + } + require.Empty(t, cmp.Diff(tc.expectedRole, gotRole, + cmpopts.IgnoreFields(types.Metadata{}, "Revision", "Labels"))) + // The downgraded label value won't match exactly because it + // includes the client version, so just check it's not empty + // and ignore it in the role diff. + if tc.expectDowngraded { + require.NotEmpty(t, gotRole.GetMetadata().Labels[types.TeleportDowngradedLabel]) + } + } + checkErr := func(err error) { + t.Helper() + if tc.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + } + + // Test GetRole + gotRole, err := client.GetRole(ctx, tc.inputRole.GetName()) + checkErr(err) + checkRole(gotRole) + + // Test GetRoles + gotRoles, err := client.GetRoles(ctx) + checkErr(err) + if !tc.expectError { + foundTestRole := false + for _, gotRole := range gotRoles { + if gotRole.GetName() != tc.inputRole.GetName() { + continue + } + checkRole(gotRole) + foundTestRole = true + break + } + require.True(t, foundTestRole, "GetRoles result does not include expected role") + } + + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + // Test WatchEvents + watcher, err := client.NewWatcher(ctx, types.Watch{Name: "roles", Kinds: []types.WatchKind{{Kind: types.KindRole}}}) + require.NoError(t, err) + defer watcher.Close() + + // Swallow the init event + e := <-watcher.Events() + require.Equal(t, types.OpInit, e.Type) + + // Re-upsert the role so that the watcher sees it, do this + // on the auth server directly to avoid the + // TeleportDowngradedLabel check in ServerWithRoles + tc.inputRole, err = srv.Auth().UpsertRole(ctx, tc.inputRole) + require.NoError(t, err) + + gotRole, err = func() (types.Role, error) { + for { + select { + case <-watcher.Done(): + return nil, watcher.Error() + case e := <-watcher.Events(): + if gotRole, ok := e.Resource.(types.Role); ok && gotRole.GetName() == tc.inputRole.GetName() { + return gotRole, nil + } + } + } + }() + checkErr(err) + checkRole(gotRole) + + if !tc.expectError { + // Try to re-upsert the role we got. If it was + // downgraded, it should be rejected due to the + // TeleportDowngradedLabel + _, err = client.UpsertRole(ctx, gotRole) + if tc.expectDowngraded { + require.Error(t, err) + } else { + require.NoError(t, err) + } + } + }) + } + }) + } +} + func TestUpsertApplicationServerOrigin(t *testing.T) { t.Parallel() diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index dd1b2fcf7e414..61bef6d89721c 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -360,6 +360,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { SecReports: svces.SecReports, SnowflakeSession: svces.Identity, SPIFFEFederations: svces.SPIFFEFederations, + WorkloadIdentity: svces.WorkloadIdentities, StaticHostUsers: svces.StaticHostUser, Trust: svces.TrustInternal, UserGroups: svces.UserGroups, diff --git a/lib/auth/init.go b/lib/auth/init.go index c546981439d82..aaacaca8dfad4 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -322,6 +322,10 @@ type InitConfig struct { // SPIFFEFederations is a service that manages storing SPIFFE federations. SPIFFEFederations services.SPIFFEFederations + // WorkloadIdentity is the service for storing and retrieving + // WorkloadIdentity resources. + WorkloadIdentity services.WorkloadIdentities + // StaticHostUsers is a service that manages host users that should be // created on SSH nodes. StaticHostUsers services.StaticHostUser diff --git a/lib/auth/init_test.go b/lib/auth/init_test.go index ad0b04189f3d7..59fab636b43a0 100644 --- a/lib/auth/init_test.go +++ b/lib/auth/init_test.go @@ -737,6 +737,40 @@ func keysIn[K comparable, V any](m map[K]V) []K { return result } +type failingTrustInternal struct { + services.TrustInternal +} + +func (t *failingTrustInternal) CreateCertAuthority(ctx context.Context, ca types.CertAuthority) error { + return trace.Errorf("error") +} + +// TestInitCertFailureRecovery ensures the auth server is able to recover from +// a failure in the cert creation process. +func TestInitCertFailureRecovery(t *testing.T) { + ctx := context.Background() + cap, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ + Type: constants.SAML, + }) + require.NoError(t, err) + + conf := setupConfig(t) + + // BootstrapResources have lead to an unrecoverable state in the past. + // See https://github.com/gravitational/teleport/pull/49638. + conf.BootstrapResources = []types.Resource{cap} + _, err = Init(ctx, conf, func(s *Server) error { + s.TrustInternal = &failingTrustInternal{ + TrustInternal: s.TrustInternal, + } + return nil + }) + require.Error(t, err) + + _, err = Init(ctx, conf) + require.NoError(t, err) +} + // TestPresets tests behavior of presets func TestPresets(t *testing.T) { ctx := context.Background() diff --git a/lib/auth/join_azure.go b/lib/auth/join_azure.go index 428ac15c90679..721a53ff2d7fa 100644 --- a/lib/auth/join_azure.go +++ b/lib/auth/join_azure.go @@ -269,7 +269,7 @@ func verifyVMIdentity(ctx context.Context, cfg *azureRegisterConfig, accessToken // If the token is from a user-assigned managed identity, the resource ID is // for the identity and we need to look the VM up by VM ID. } else { - vm, err = vmClient.GetByVMID(ctx, types.Wildcard, vmID) + vm, err = vmClient.GetByVMID(ctx, vmID) if err != nil { if trace.IsNotFound(err) { return nil, trace.AccessDenied("no VM found with matching VM ID") diff --git a/lib/auth/join_azure_test.go b/lib/auth/join_azure_test.go index 54a105fe0f0cf..0944e1ac9ed48 100644 --- a/lib/auth/join_azure_test.go +++ b/lib/auth/join_azure_test.go @@ -73,13 +73,13 @@ func (m *mockAzureVMClient) Get(_ context.Context, resourceID string) (*azure.Vi return vm, nil } -func (m *mockAzureVMClient) GetByVMID(_ context.Context, resourceGroup, vmID string) (*azure.VirtualMachine, error) { +func (m *mockAzureVMClient) GetByVMID(_ context.Context, vmID string) (*azure.VirtualMachine, error) { for _, vm := range m.vms { - if vm.VMID == vmID && (resourceGroup == types.Wildcard || vm.ResourceGroup == resourceGroup) { + if vm.VMID == vmID { return vm, nil } } - return nil, trace.NotFound("no vm in groups %q with id %q", resourceGroup, vmID) + return nil, trace.NotFound("no vm with id %q", vmID) } func makeVMClientGetter(clients map[string]*mockAzureVMClient) vmClientGetter { diff --git a/lib/auth/machineid/workloadidentityv1/resource_service.go b/lib/auth/machineid/workloadidentityv1/resource_service.go new file mode 100644 index 0000000000000..6ca893e1b1fa9 --- /dev/null +++ b/lib/auth/machineid/workloadidentityv1/resource_service.go @@ -0,0 +1,362 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package workloadidentityv1 + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/gravitational/teleport" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/events" +) + +type workloadIdentityReader interface { + GetWorkloadIdentity(ctx context.Context, name string) (*workloadidentityv1pb.WorkloadIdentity, error) + ListWorkloadIdentities(ctx context.Context, pageSize int, token string) ([]*workloadidentityv1pb.WorkloadIdentity, string, error) +} + +type workloadIdentityReadWriter interface { + workloadIdentityReader + + CreateWorkloadIdentity(ctx context.Context, identity *workloadidentityv1pb.WorkloadIdentity) (*workloadidentityv1pb.WorkloadIdentity, error) + UpdateWorkloadIdentity(ctx context.Context, identity *workloadidentityv1pb.WorkloadIdentity) (*workloadidentityv1pb.WorkloadIdentity, error) + DeleteWorkloadIdentity(ctx context.Context, name string) error + UpsertWorkloadIdentity(ctx context.Context, identity *workloadidentityv1pb.WorkloadIdentity) (*workloadidentityv1pb.WorkloadIdentity, error) +} + +// ResourceServiceConfig holds configuration options for the ResourceService. +type ResourceServiceConfig struct { + Authorizer authz.Authorizer + Backend workloadIdentityReadWriter + Cache workloadIdentityReader + Clock clockwork.Clock + Emitter apievents.Emitter + Logger *slog.Logger +} + +// ResourceService is the gRPC service for managing workload identity resources. +// It implements the workloadidentityv1pb.WorkloadIdentityResourceServiceServer +type ResourceService struct { + workloadidentityv1pb.UnimplementedWorkloadIdentityResourceServiceServer + + authorizer authz.Authorizer + backend workloadIdentityReadWriter + cache workloadIdentityReader + clock clockwork.Clock + emitter apievents.Emitter + logger *slog.Logger +} + +// NewResourceService returns a new instance of the ResourceService. +func NewResourceService(cfg *ResourceServiceConfig) (*ResourceService, error) { + switch { + case cfg.Backend == nil: + return nil, trace.BadParameter("backend service is required") + case cfg.Cache == nil: + return nil, trace.BadParameter("cache service is required") + case cfg.Authorizer == nil: + return nil, trace.BadParameter("authorizer is required") + case cfg.Emitter == nil: + return nil, trace.BadParameter("emitter is required") + } + + if cfg.Logger == nil { + cfg.Logger = slog.With(teleport.ComponentKey, "workload_identity_resource.service") + } + if cfg.Clock == nil { + cfg.Clock = clockwork.NewRealClock() + } + return &ResourceService{ + authorizer: cfg.Authorizer, + backend: cfg.Backend, + cache: cfg.Cache, + clock: cfg.Clock, + emitter: cfg.Emitter, + logger: cfg.Logger, + }, nil +} + +// GetWorkloadIdentity returns a WorkloadIdentity by name. +// Implements teleport.workloadidentity.v1.ResourceService/GetWorkloadIdentity +func (s *ResourceService) GetWorkloadIdentity( + ctx context.Context, req *workloadidentityv1pb.GetWorkloadIdentityRequest, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindWorkloadIdentity, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + if req.Name == "" { + return nil, trace.BadParameter("name: must be non-empty") + } + + resource, err := s.cache.GetWorkloadIdentity(ctx, req.Name) + if err != nil { + return nil, trace.Wrap(err) + } + + return resource, nil +} + +// ListWorkloadIdentities returns a list of WorkloadIdentity resources. It +// follows the Google API design guidelines for list pagination. +// Implements teleport.workloadidentity.v1.ResourceService/ListWorkloadIdentities +func (s *ResourceService) ListWorkloadIdentities( + ctx context.Context, req *workloadidentityv1pb.ListWorkloadIdentitiesRequest, +) (*workloadidentityv1pb.ListWorkloadIdentitiesResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindWorkloadIdentity, types.VerbRead, types.VerbList); err != nil { + return nil, trace.Wrap(err) + } + + resources, nextToken, err := s.cache.ListWorkloadIdentities( + ctx, + int(req.PageSize), + req.PageToken, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + return &workloadidentityv1pb.ListWorkloadIdentitiesResponse{ + WorkloadIdentities: resources, + NextPageToken: nextToken, + }, nil +} + +// DeleteWorkloadIdentity deletes a WorkloadIdentity by name. +// Implements teleport.workloadidentity.v1.ResourceService/DeleteWorkloadIdentity +func (s *ResourceService) DeleteWorkloadIdentity( + ctx context.Context, req *workloadidentityv1pb.DeleteWorkloadIdentityRequest, +) (*emptypb.Empty, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindWorkloadIdentity, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + if req.Name == "" { + return nil, trace.BadParameter("name: must be non-empty") + } + + if err := s.backend.DeleteWorkloadIdentity(ctx, req.Name); err != nil { + return nil, trace.Wrap(err) + } + + if err := s.emitter.EmitAuditEvent(ctx, &apievents.WorkloadIdentityDelete{ + Metadata: apievents.Metadata{ + Code: events.WorkloadIdentityDeleteCode, + Type: events.WorkloadIdentityDeleteEvent, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ConnectionMetadata: authz.ConnectionMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.Name, + }, + }); err != nil { + s.logger.ErrorContext( + ctx, "Failed to emit audit event for deletion of WorkloadIdentity", + "error", err, + ) + } + + return &emptypb.Empty{}, nil +} + +// CreateWorkloadIdentity creates a new WorkloadIdentity. +// Implements teleport.workloadidentity.v1.ResourceService/CreateWorkloadIdentity +func (s *ResourceService) CreateWorkloadIdentity( + ctx context.Context, req *workloadidentityv1pb.CreateWorkloadIdentityRequest, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindWorkloadIdentity, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + created, err := s.backend.CreateWorkloadIdentity(ctx, req.WorkloadIdentity) + if err != nil { + return nil, trace.Wrap(err) + } + + evt := &apievents.WorkloadIdentityCreate{ + Metadata: apievents.Metadata{ + Code: events.WorkloadIdentityCreateCode, + Type: events.WorkloadIdentityCreateEvent, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ConnectionMetadata: authz.ConnectionMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.WorkloadIdentity.Metadata.Name, + }, + } + evt.WorkloadIdentityData, err = resourceToStruct(created) + if err != nil { + s.logger.ErrorContext( + ctx, + "Failed to convert WorkloadIdentity to struct for audit log", + "error", err, + ) + } + if err := s.emitter.EmitAuditEvent(ctx, evt); err != nil { + s.logger.ErrorContext( + ctx, "Failed to emit audit event for creation of WorkloadIdentity", + "error", err, + ) + } + + return created, nil +} + +// UpdateWorkloadIdentity updates an existing WorkloadIdentity. +// Implements teleport.workloadidentity.v1.ResourceService/UpdateWorkloadIdentity +func (s *ResourceService) UpdateWorkloadIdentity( + ctx context.Context, req *workloadidentityv1pb.UpdateWorkloadIdentityRequest, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindWorkloadIdentity, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + created, err := s.backend.UpdateWorkloadIdentity(ctx, req.WorkloadIdentity) + if err != nil { + return nil, trace.Wrap(err) + } + + evt := &apievents.WorkloadIdentityUpdate{ + Metadata: apievents.Metadata{ + Code: events.WorkloadIdentityUpdateCode, + Type: events.WorkloadIdentityUpdateEvent, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ConnectionMetadata: authz.ConnectionMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.WorkloadIdentity.Metadata.Name, + }, + } + evt.WorkloadIdentityData, err = resourceToStruct(created) + if err != nil { + s.logger.ErrorContext( + ctx, + "Failed to convert WorkloadIdentity to struct for audit log", + "error", err, + ) + } + if err := s.emitter.EmitAuditEvent(ctx, evt); err != nil { + s.logger.ErrorContext( + ctx, "Failed to emit audit event for updating of WorkloadIdentity", + "error", err, + ) + } + + return created, nil +} + +// UpsertWorkloadIdentity updates or creates an existing WorkloadIdentity. +// Implements teleport.workloadidentity.v1.ResourceService/UpsertWorkloadIdentity +func (s *ResourceService) UpsertWorkloadIdentity( + ctx context.Context, req *workloadidentityv1pb.UpsertWorkloadIdentityRequest, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind( + types.KindWorkloadIdentity, types.VerbCreate, types.VerbUpdate, + ); err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + created, err := s.backend.UpsertWorkloadIdentity(ctx, req.WorkloadIdentity) + if err != nil { + return nil, trace.Wrap(err) + } + + evt := &apievents.WorkloadIdentityCreate{ + Metadata: apievents.Metadata{ + Code: events.WorkloadIdentityCreateCode, + Type: events.WorkloadIdentityCreateEvent, + }, + UserMetadata: authz.ClientUserMetadata(ctx), + ConnectionMetadata: authz.ConnectionMetadata(ctx), + ResourceMetadata: apievents.ResourceMetadata{ + Name: req.WorkloadIdentity.Metadata.Name, + }, + } + evt.WorkloadIdentityData, err = resourceToStruct(created) + if err != nil { + s.logger.ErrorContext( + ctx, + "Failed to convert WorkloadIdentity to struct for audit log", + "error", err, + ) + } + if err := s.emitter.EmitAuditEvent(ctx, evt); err != nil { + s.logger.ErrorContext( + ctx, "Failed to emit audit event for upsertion of WorkloadIdentity", + "error", err, + ) + } + + return created, nil +} + +func resourceToStruct(in *workloadidentityv1pb.WorkloadIdentity) (*apievents.Struct, error) { + data, err := protojson.MarshalOptions{UseProtoNames: true}.Marshal(in) + if err != nil { + return nil, trace.Wrap(err, "marshaling resource for audit log") + } + out := &apievents.Struct{} + if err := out.UnmarshalJSON(data); err != nil { + return nil, trace.Wrap(err, "unmarshaling resource for audit log") + } + return out, nil +} diff --git a/lib/auth/machineid/workloadidentityv1/workloadidentityv1_test.go b/lib/auth/machineid/workloadidentityv1/workloadidentityv1_test.go new file mode 100644 index 0000000000000..1c0601a34dd54 --- /dev/null +++ b/lib/auth/machineid/workloadidentityv1/workloadidentityv1_test.go @@ -0,0 +1,984 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package workloadidentityv1_test + +import ( + "context" + "errors" + "fmt" + "net" + "os" + "slices" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/testing/protocmp" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/auth/authclient" + libevents "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/events/eventstest" + "github.com/gravitational/teleport/lib/modules" +) + +func TestMain(m *testing.M) { + modules.SetInsecureTestMode(true) + os.Exit(m.Run()) +} + +func newTestTLSServer(t testing.TB) (*auth.TestTLSServer, *eventstest.MockRecorderEmitter) { + as, err := auth.NewTestAuthServer(auth.TestAuthServerConfig{ + Dir: t.TempDir(), + Clock: clockwork.NewFakeClockAt(time.Now().Round(time.Second).UTC()), + }) + require.NoError(t, err) + + emitter := &eventstest.MockRecorderEmitter{} + srv, err := as.NewTestTLSServer(func(config *auth.TestTLSServerConfig) { + config.APIConfig.Emitter = emitter + }) + require.NoError(t, err) + + t.Cleanup(func() { + err := srv.Close() + if errors.Is(err, net.ErrClosed) { + return + } + require.NoError(t, err) + }) + + return srv, emitter +} + +func TestResourceService_CreateWorkloadIdentity(t *testing.T) { + t.Parallel() + srv, eventRecorder := newTestTLSServer(t) + ctx := context.Background() + + authorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "authorized", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindWorkloadIdentity}, + Verbs: []string{types.VerbCreate}, + }, + }) + require.NoError(t, err) + authorizedClient, err := srv.NewClient(auth.TestUser(authorizedUser.GetName())) + require.NoError(t, err) + unauthorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "unauthorized", + []string{}, + []types.Rule{}, + ) + require.NoError(t, err) + unauthorizedClient, err := srv.NewClient(auth.TestUser(unauthorizedUser.GetName())) + require.NoError(t, err) + + // Create a pre-existing workload identity + preExisting, err := srv.Auth().CreateWorkloadIdentity( + ctx, + &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "preexisting", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }) + require.NoError(t, err) + + tests := []struct { + name string + client *authclient.Client + req *workloadidentityv1pb.CreateWorkloadIdentityRequest + requireError require.ErrorAssertionFunc + checkResultReturned bool + requireEvent *events.WorkloadIdentityCreate + }{ + { + name: "success", + client: authorizedClient, + req: &workloadidentityv1pb.CreateWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + }, + requireError: require.NoError, + checkResultReturned: true, + requireEvent: &events.WorkloadIdentityCreate{ + Metadata: events.Metadata{ + Code: libevents.WorkloadIdentityCreateCode, + Type: libevents.WorkloadIdentityCreateEvent, + }, + ResourceMetadata: events.ResourceMetadata{ + Name: "new", + }, + UserMetadata: events.UserMetadata{ + User: authorizedUser.GetName(), + UserKind: events.UserKind_USER_KIND_HUMAN, + }, + }, + }, + { + name: "pre-existing", + client: authorizedClient, + req: &workloadidentityv1pb.CreateWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: preExisting.GetMetadata().GetName(), + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAlreadyExists(err)) + }, + }, + { + name: "validation fail", + client: authorizedClient, + req: &workloadidentityv1pb.CreateWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "", + }, + }, + }, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsBadParameter(err)) + require.ErrorContains(t, err, "spec.spiffe.id: is required") + }, + }, + { + name: "unauthorized", + client: unauthorizedClient, + req: &workloadidentityv1pb.CreateWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "unauthorized", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err)) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + eventRecorder.Reset() + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + tt.client.GetConnection(), + ) + res, err := client.CreateWorkloadIdentity(ctx, tt.req) + tt.requireError(t, err) + + if tt.checkResultReturned { + require.NotEmpty(t, res.Metadata.Revision) + // Expect returned result to match request, but also have a + // revision + require.Empty( + t, + cmp.Diff( + res, + tt.req.WorkloadIdentity, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + ), + ) + // Expect the value fetched from the store to match returned + // item. + fetched, err := srv.Auth().GetWorkloadIdentity(ctx, res.Metadata.Name) + require.NoError(t, err) + require.Empty( + t, + cmp.Diff( + res, + fetched, + protocmp.Transform(), + ), + ) + } + if tt.requireEvent != nil { + evt, ok := eventRecorder.LastEvent().(*events.WorkloadIdentityCreate) + require.True(t, ok) + require.NotEmpty(t, evt.ConnectionMetadata.RemoteAddr) + require.Empty(t, cmp.Diff( + evt, + tt.requireEvent, + cmpopts.IgnoreFields(events.WorkloadIdentityCreate{}, "ConnectionMetadata", "WorkloadIdentityData"), + )) + } + }) + } +} + +func TestResourceService_DeleteWorkloadIdentity(t *testing.T) { + t.Parallel() + srv, eventRecorder := newTestTLSServer(t) + ctx := context.Background() + + authorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "authorized", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindWorkloadIdentity}, + Verbs: []string{types.VerbDelete}, + }, + }) + require.NoError(t, err) + authorizedClient, err := srv.NewClient(auth.TestUser(authorizedUser.GetName())) + require.NoError(t, err) + unauthorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "unauthorized", + []string{}, + []types.Rule{}, + ) + require.NoError(t, err) + unauthorizedClient, err := srv.NewClient(auth.TestUser(unauthorizedUser.GetName())) + require.NoError(t, err) + + // Create a pre-existing workload identity + preExisting, err := srv.Auth().CreateWorkloadIdentity( + ctx, + &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "preexisting", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }) + require.NoError(t, err) + + tests := []struct { + name string + client *authclient.Client + req *workloadidentityv1pb.DeleteWorkloadIdentityRequest + requireError require.ErrorAssertionFunc + checkNonExisting bool + requireEvent *events.WorkloadIdentityDelete + }{ + { + name: "success", + client: authorizedClient, + req: &workloadidentityv1pb.DeleteWorkloadIdentityRequest{ + Name: preExisting.GetMetadata().GetName(), + }, + requireError: require.NoError, + checkNonExisting: true, + requireEvent: &events.WorkloadIdentityDelete{ + Metadata: events.Metadata{ + Code: libevents.WorkloadIdentityDeleteCode, + Type: libevents.WorkloadIdentityDeleteEvent, + }, + ResourceMetadata: events.ResourceMetadata{ + Name: preExisting.GetMetadata().GetName(), + }, + UserMetadata: events.UserMetadata{ + User: authorizedUser.GetName(), + UserKind: events.UserKind_USER_KIND_HUMAN, + }, + }, + }, + { + name: "non-existing", + client: authorizedClient, + req: &workloadidentityv1pb.DeleteWorkloadIdentityRequest{ + Name: "i-do-not-exist", + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsNotFound(err)) + }, + }, + { + name: "validation fail", + client: authorizedClient, + req: &workloadidentityv1pb.DeleteWorkloadIdentityRequest{ + Name: "", + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsBadParameter(err)) + require.ErrorContains(t, err, "name: must be non-empty") + }, + }, + { + name: "unauthorized", + client: unauthorizedClient, + req: &workloadidentityv1pb.DeleteWorkloadIdentityRequest{ + Name: "unauthorized", + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err)) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + eventRecorder.Reset() + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + tt.client.GetConnection(), + ) + _, err := client.DeleteWorkloadIdentity(ctx, tt.req) + tt.requireError(t, err) + + if tt.checkNonExisting { + _, err := srv.Auth().GetWorkloadIdentity(ctx, tt.req.Name) + require.True(t, trace.IsNotFound(err)) + } + if tt.requireEvent != nil { + evt, ok := eventRecorder.LastEvent().(*events.WorkloadIdentityDelete) + require.True(t, ok) + require.NotEmpty(t, evt.ConnectionMetadata.RemoteAddr) + require.Empty(t, cmp.Diff( + tt.requireEvent, + evt, + cmpopts.IgnoreFields(events.WorkloadIdentityDelete{}, "ConnectionMetadata"), + )) + } + }) + } +} + +func TestResourceService_GetWorkloadIdentity(t *testing.T) { + t.Parallel() + srv, _ := newTestTLSServer(t) + ctx := context.Background() + + authorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "authorized", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindWorkloadIdentity}, + Verbs: []string{types.VerbRead}, + }, + }) + require.NoError(t, err) + authorizedClient, err := srv.NewClient(auth.TestUser(authorizedUser.GetName())) + require.NoError(t, err) + unauthorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "unauthorized", + []string{}, + []types.Rule{}, + ) + require.NoError(t, err) + unauthorizedClient, err := srv.NewClient(auth.TestUser(unauthorizedUser.GetName())) + require.NoError(t, err) + + // Create a pre-existing workload identity + preExisting, err := srv.Auth().CreateWorkloadIdentity( + ctx, + &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "preexisting", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }) + require.NoError(t, err) + + tests := []struct { + name string + client *authclient.Client + req *workloadidentityv1pb.GetWorkloadIdentityRequest + wantRes *workloadidentityv1pb.WorkloadIdentity + requireError require.ErrorAssertionFunc + }{ + { + name: "success", + client: authorizedClient, + req: &workloadidentityv1pb.GetWorkloadIdentityRequest{ + Name: preExisting.GetMetadata().GetName(), + }, + wantRes: preExisting, + requireError: require.NoError, + }, + { + name: "non-existing", + client: authorizedClient, + req: &workloadidentityv1pb.GetWorkloadIdentityRequest{ + Name: "i-do-not-exist", + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsNotFound(err)) + }, + }, + { + name: "validation fail", + client: authorizedClient, + req: &workloadidentityv1pb.GetWorkloadIdentityRequest{ + Name: "", + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsBadParameter(err)) + require.ErrorContains(t, err, "name: must be non-empty") + }, + }, + { + name: "unauthorized", + client: unauthorizedClient, + req: &workloadidentityv1pb.GetWorkloadIdentityRequest{ + Name: "unauthorized", + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err)) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + tt.client.GetConnection(), + ) + got, err := client.GetWorkloadIdentity(ctx, tt.req) + tt.requireError(t, err) + + if tt.wantRes != nil { + require.Empty( + t, + cmp.Diff( + tt.wantRes, + got, + protocmp.Transform(), + ), + ) + } + }) + } +} + +func TestResourceService_ListWorkloadIdentities(t *testing.T) { + t.Parallel() + srv, _ := newTestTLSServer(t) + ctx := context.Background() + + authorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "authorized", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindWorkloadIdentity}, + Verbs: []string{types.VerbRead, types.VerbList}, + }, + }) + require.NoError(t, err) + authorizedClient, err := srv.NewClient(auth.TestUser(authorizedUser.GetName())) + require.NoError(t, err) + unauthorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "unauthorized", + []string{}, + []types.Rule{}, + ) + require.NoError(t, err) + unauthorizedClient, err := srv.NewClient(auth.TestUser(unauthorizedUser.GetName())) + require.NoError(t, err) + + // Create a pre-existing workload identities + // Two complete pages of ten, plus one incomplete page of nine + created := []*workloadidentityv1pb.WorkloadIdentity{} + for i := 0; i < 29; i++ { + r, err := srv.Auth().CreateWorkloadIdentity( + ctx, + &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: fmt.Sprintf("preexisting-%d", i), + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }) + require.NoError(t, err) + created = append(created, r) + } + + t.Run("unauthorized", func(t *testing.T) { + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + unauthorizedClient.GetConnection(), + ) + + _, err := client.ListWorkloadIdentities(ctx, &workloadidentityv1pb.ListWorkloadIdentitiesRequest{}) + require.True(t, trace.IsAccessDenied(err)) + }) + + t.Run("success - default page", func(t *testing.T) { + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + authorizedClient.GetConnection(), + ) + + // For the default page size, we expect to get all results in one page + res, err := client.ListWorkloadIdentities(ctx, &workloadidentityv1pb.ListWorkloadIdentitiesRequest{}) + require.NoError(t, err) + require.Len(t, res.WorkloadIdentities, 29) + require.Empty(t, res.NextPageToken) + for _, created := range created { + slices.ContainsFunc(res.WorkloadIdentities, func(resource *workloadidentityv1pb.WorkloadIdentity) bool { + return proto.Equal(created, resource) + }) + } + }) + + t.Run("success - page size 10", func(t *testing.T) { + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + authorizedClient.GetConnection(), + ) + + fetched := []*workloadidentityv1pb.WorkloadIdentity{} + token := "" + iterations := 0 + for { + iterations++ + res, err := client.ListWorkloadIdentities(ctx, &workloadidentityv1pb.ListWorkloadIdentitiesRequest{ + PageSize: 10, + PageToken: token, + }) + require.NoError(t, err) + fetched = append(fetched, res.WorkloadIdentities...) + if res.NextPageToken == "" { + break + } + token = res.NextPageToken + } + + require.Len(t, fetched, 29) + require.Equal(t, 3, iterations) + for _, created := range created { + slices.ContainsFunc(fetched, func(resource *workloadidentityv1pb.WorkloadIdentity) bool { + return proto.Equal(created, resource) + }) + } + }) +} + +func TestResourceService_UpdateWorkloadIdentity(t *testing.T) { + t.Parallel() + srv, eventRecorder := newTestTLSServer(t) + ctx := context.Background() + + authorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "authorized", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindWorkloadIdentity}, + Verbs: []string{types.VerbUpdate}, + }, + }) + require.NoError(t, err) + authorizedClient, err := srv.NewClient(auth.TestUser(authorizedUser.GetName())) + require.NoError(t, err) + unauthorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "unauthorized", + []string{}, + []types.Rule{}, + ) + require.NoError(t, err) + unauthorizedClient, err := srv.NewClient(auth.TestUser(unauthorizedUser.GetName())) + require.NoError(t, err) + + // Create a pre-existing workload identity + preExisting, err := srv.Auth().CreateWorkloadIdentity( + ctx, + &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "preexisting", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }) + require.NoError(t, err) + preExisting2, err := srv.Auth().CreateWorkloadIdentity( + ctx, + &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "preexisting-2", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }) + require.NoError(t, err) + + tests := []struct { + name string + client *authclient.Client + req *workloadidentityv1pb.UpdateWorkloadIdentityRequest + requireError require.ErrorAssertionFunc + checkResultReturned bool + requireEvent *events.WorkloadIdentityUpdate + }{ + { + name: "success", + client: authorizedClient, + req: &workloadidentityv1pb.UpdateWorkloadIdentityRequest{ + WorkloadIdentity: preExisting, + }, + requireError: require.NoError, + checkResultReturned: true, + requireEvent: &events.WorkloadIdentityUpdate{ + Metadata: events.Metadata{ + Code: libevents.WorkloadIdentityUpdateCode, + Type: libevents.WorkloadIdentityUpdateEvent, + }, + ResourceMetadata: events.ResourceMetadata{ + Name: preExisting.GetMetadata().GetName(), + }, + UserMetadata: events.UserMetadata{ + User: authorizedUser.GetName(), + UserKind: events.UserKind_USER_KIND_HUMAN, + }, + }, + }, + { + name: "incorrect revision", + client: authorizedClient, + req: (func() *workloadidentityv1pb.UpdateWorkloadIdentityRequest { + preExisting2.Metadata.Revision = "incorrect" + return &workloadidentityv1pb.UpdateWorkloadIdentityRequest{ + WorkloadIdentity: preExisting2, + } + })(), + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsCompareFailed(err)) + }, + }, + { + name: "not existing", + client: authorizedClient, + req: &workloadidentityv1pb.UpdateWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/test", + }, + }, + }, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.Error(t, err) + }, + }, + { + name: "unauthorized", + client: unauthorizedClient, + req: &workloadidentityv1pb.UpdateWorkloadIdentityRequest{ + WorkloadIdentity: preExisting, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err)) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + eventRecorder.Reset() + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + tt.client.GetConnection(), + ) + res, err := client.UpdateWorkloadIdentity(ctx, tt.req) + tt.requireError(t, err) + + if tt.checkResultReturned { + require.NotEmpty(t, res.Metadata.Revision) + require.NotEqual(t, tt.req.WorkloadIdentity.GetMetadata().GetRevision(), res.Metadata.Revision) + // Expect returned result to match request, but also have a + // revision + require.Empty( + t, + cmp.Diff( + res, + tt.req.WorkloadIdentity, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + ), + ) + // Expect the value fetched from the store to match returned + // item. + fetched, err := srv.Auth().GetWorkloadIdentity(ctx, res.Metadata.Name) + require.NoError(t, err) + require.Empty( + t, + cmp.Diff( + res, + fetched, + protocmp.Transform(), + ), + ) + } + if tt.requireEvent != nil { + evt, ok := eventRecorder.LastEvent().(*events.WorkloadIdentityUpdate) + require.True(t, ok) + require.NotEmpty(t, evt.ConnectionMetadata.RemoteAddr) + require.Empty(t, cmp.Diff( + evt, + tt.requireEvent, + cmpopts.IgnoreFields(events.WorkloadIdentityUpdate{}, "ConnectionMetadata", "WorkloadIdentityData"), + )) + } + }) + } +} + +func TestResourceService_UpsertWorkloadIdentity(t *testing.T) { + t.Parallel() + srv, eventRecorder := newTestTLSServer(t) + ctx := context.Background() + + authorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "authorized", + []string{}, + []types.Rule{ + { + Resources: []string{types.KindWorkloadIdentity}, + Verbs: []string{types.VerbCreate, types.VerbUpdate}, + }, + }) + require.NoError(t, err) + authorizedClient, err := srv.NewClient(auth.TestUser(authorizedUser.GetName())) + require.NoError(t, err) + unauthorizedUser, _, err := auth.CreateUserAndRole( + srv.Auth(), + "unauthorized", + []string{}, + []types.Rule{}, + ) + require.NoError(t, err) + unauthorizedClient, err := srv.NewClient(auth.TestUser(unauthorizedUser.GetName())) + require.NoError(t, err) + + tests := []struct { + name string + client *authclient.Client + req *workloadidentityv1pb.UpsertWorkloadIdentityRequest + requireError require.ErrorAssertionFunc + checkResultReturned bool + requireEvent *events.WorkloadIdentityCreate + }{ + { + name: "success", + client: authorizedClient, + req: &workloadidentityv1pb.UpsertWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + }, + requireError: require.NoError, + checkResultReturned: true, + requireEvent: &events.WorkloadIdentityCreate{ + Metadata: events.Metadata{ + Code: libevents.WorkloadIdentityCreateCode, + Type: libevents.WorkloadIdentityCreateEvent, + }, + ResourceMetadata: events.ResourceMetadata{ + Name: "new", + }, + UserMetadata: events.UserMetadata{ + User: authorizedUser.GetName(), + UserKind: events.UserKind_USER_KIND_HUMAN, + }, + }, + }, + { + name: "validation fail", + client: authorizedClient, + req: &workloadidentityv1pb.UpsertWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "", + }, + }, + }, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsBadParameter(err)) + require.ErrorContains(t, err, "spec.spiffe.id: is required") + }, + }, + { + name: "unauthorized", + client: unauthorizedClient, + req: &workloadidentityv1pb.UpsertWorkloadIdentityRequest{ + WorkloadIdentity: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "unauthorized", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + }, + requireError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err)) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + eventRecorder.Reset() + client := workloadidentityv1pb.NewWorkloadIdentityResourceServiceClient( + tt.client.GetConnection(), + ) + res, err := client.UpsertWorkloadIdentity(ctx, tt.req) + tt.requireError(t, err) + + if tt.checkResultReturned { + require.NotEmpty(t, res.Metadata.Revision) + // Expect returned result to match request, but also have a + // revision + require.Empty( + t, + cmp.Diff( + res, + tt.req.WorkloadIdentity, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + ), + ) + // Expect the value fetched from the store to match returned + // item. + fetched, err := srv.Auth().GetWorkloadIdentity(ctx, res.Metadata.Name) + require.NoError(t, err) + require.Empty( + t, + cmp.Diff( + res, + fetched, + protocmp.Transform(), + ), + ) + } + if tt.requireEvent != nil { + evt, ok := eventRecorder.LastEvent().(*events.WorkloadIdentityCreate) + require.True(t, ok) + require.NotEmpty(t, evt.ConnectionMetadata.RemoteAddr) + require.Empty(t, cmp.Diff( + evt, + tt.requireEvent, + cmpopts.IgnoreFields(events.WorkloadIdentityCreate{}, "ConnectionMetadata", "WorkloadIdentityData"), + )) + } + }) + } +} diff --git a/lib/auth/notification_test.go b/lib/auth/notification_test.go index 74d353f1bbde2..9bf65157aa99e 100644 --- a/lib/auth/notification_test.go +++ b/lib/auth/notification_test.go @@ -459,6 +459,32 @@ func TestNotifications(t *testing.T) { }) require.Error(t, err) require.True(t, trace.IsAccessDenied(err), "got error %T, expected an access denied error due to manager trying to upsert a last seen notification timestamp for a different user", err) + + // Verify that users can't list a global notification they are explicitly excluded from. + + // Create a global notification that matches all users with an exclusion for the manager. + _, err = srv.Auth().CreateGlobalNotification(ctx, newGlobalNotification(t, "all-except-manager", ¬ificationsv1.GlobalNotificationSpec{ + Matcher: ¬ificationsv1.GlobalNotificationSpec_All{ + All: true, + }, + ExcludeUsers: []string{managerUsername}, + })) + require.NoError(t, err) + + // Verify that the manager doesn't see the new notification. + resp, err = managerClient.ListNotifications(ctx, ¬ificationsv1.ListNotificationsRequest{ + PageSize: 10, + }) + require.NoError(t, err) + require.NotEqual(t, "all-except-manager", resp.Notifications[0].GetMetadata().GetLabels()[types.NotificationTitleLabel]) + + // Verify that the auditor can see the new notification. + resp, err = auditorClient.ListNotifications(ctx, ¬ificationsv1.ListNotificationsRequest{ + PageSize: 10, + }) + require.NoError(t, err) + require.Equal(t, "all-except-manager", resp.Notifications[0].GetMetadata().GetLabels()[types.NotificationTitleLabel]) + } func newUserNotification(t *testing.T, username string, title string) *notificationsv1.Notification { diff --git a/lib/auth/notifications/notificationsv1/service.go b/lib/auth/notifications/notificationsv1/service.go index 49a75548ad4e0..8fb30cff72410 100644 --- a/lib/auth/notifications/notificationsv1/service.go +++ b/lib/auth/notifications/notificationsv1/service.go @@ -297,6 +297,11 @@ func (s *Service) matchGlobalNotification(ctx context.Context, authCtx *authz.Co return false } + // If the user is explicitly excluded by the notification, return false early. + if gn.Spec.ExcludeUsers != nil && slices.Contains(gn.Spec.ExcludeUsers, authCtx.User.GetName()) { + return false + } + switch matcher := gn.Spec.Matcher.(type) { case *notificationsv1.GlobalNotificationSpec_All: // Always return true if the matcher is "all." diff --git a/lib/auth/usertasks/usertasksv1/service.go b/lib/auth/usertasks/usertasksv1/service.go index 5a1e388150dd2..cf94dd57ac447 100644 --- a/lib/auth/usertasks/usertasksv1/service.go +++ b/lib/auth/usertasks/usertasksv1/service.go @@ -24,6 +24,7 @@ import ( "time" "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" @@ -48,6 +49,9 @@ type ServiceConfig struct { // Cache is the cache for storing UserTask. Cache Reader + // Clock is used to control time - mainly used for testing. + Clock clockwork.Clock + // UsageReporter is the reporter for sending usage without it be related to an API call. UsageReporter func() usagereporter.UsageReporter @@ -74,6 +78,9 @@ func (s *ServiceConfig) CheckAndSetDefaults() error { if s.Emitter == nil { return trace.BadParameter("emitter is required") } + if s.Clock == nil { + s.Clock = clockwork.NewRealClock() + } return nil } @@ -92,6 +99,7 @@ type Service struct { authorizer authz.Authorizer backend services.UserTasks cache Reader + clock clockwork.Clock usageReporter func() usagereporter.UsageReporter emitter apievents.Emitter } @@ -106,6 +114,7 @@ func NewService(cfg ServiceConfig) (*Service, error) { authorizer: cfg.Authorizer, backend: cfg.Backend, cache: cfg.Cache, + clock: cfg.Clock, usageReporter: cfg.UsageReporter, emitter: cfg.Emitter, }, nil @@ -122,6 +131,8 @@ func (s *Service) CreateUserTask(ctx context.Context, req *usertasksv1.CreateUse return nil, trace.Wrap(err) } + s.updateStatus(req.UserTask) + rsp, err := s.backend.CreateUserTask(ctx, req.UserTask) s.emitCreateAuditEvent(ctx, rsp, authCtx, err) if err != nil { @@ -249,13 +260,19 @@ func (s *Service) UpdateUserTask(ctx context.Context, req *usertasksv1.UpdateUse return nil, trace.Wrap(err) } + stateChanged := existingUserTask.GetSpec().GetState() != req.GetUserTask().GetSpec().GetState() + + if stateChanged { + s.updateStatus(req.UserTask) + } + rsp, err := s.backend.UpdateUserTask(ctx, req.UserTask) s.emitUpdateAuditEvent(ctx, existingUserTask, req.GetUserTask(), authCtx, err) if err != nil { return nil, trace.Wrap(err) } - if existingUserTask.GetSpec().GetState() != req.GetUserTask().GetSpec().GetState() { + if stateChanged { s.usageReporter().AnonymizeAndSubmit(userTaskToUserTaskStateEvent(req.GetUserTask())) } @@ -299,18 +316,22 @@ func (s *Service) UpsertUserTask(ctx context.Context, req *usertasksv1.UpsertUse return nil, trace.Wrap(err) } - var emitStateChangeEvent bool + var stateChanged bool existingUserTask, err := s.backend.GetUserTask(ctx, req.GetUserTask().GetMetadata().GetName()) switch { case trace.IsNotFound(err): - emitStateChangeEvent = true + stateChanged = true case err != nil: return nil, trace.Wrap(err) default: - emitStateChangeEvent = existingUserTask.GetSpec().GetState() != req.GetUserTask().GetSpec().GetState() + stateChanged = existingUserTask.GetSpec().GetState() != req.GetUserTask().GetSpec().GetState() + } + + if stateChanged { + s.updateStatus(req.UserTask) } rsp, err := s.backend.UpsertUserTask(ctx, req.UserTask) @@ -319,13 +340,19 @@ func (s *Service) UpsertUserTask(ctx context.Context, req *usertasksv1.UpsertUse return nil, trace.Wrap(err) } - if emitStateChangeEvent { + if stateChanged { s.usageReporter().AnonymizeAndSubmit(userTaskToUserTaskStateEvent(req.GetUserTask())) } return rsp, nil } +func (s *Service) updateStatus(ut *usertasksv1.UserTask) { + ut.Status = &usertasksv1.UserTaskStatus{ + LastStateChange: timestamppb.New(s.clock.Now()), + } +} + func (s *Service) emitUpsertAuditEvent(ctx context.Context, old, new *usertasksv1.UserTask, authCtx *authz.Context, err error) { if old == nil { s.emitCreateAuditEvent(ctx, new, authCtx, err) diff --git a/lib/auth/usertasks/usertasksv1/service_test.go b/lib/auth/usertasks/usertasksv1/service_test.go index 0f0a56fb4ef1c..d40b3740af591 100644 --- a/lib/auth/usertasks/usertasksv1/service_test.go +++ b/lib/auth/usertasks/usertasksv1/service_test.go @@ -28,7 +28,9 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/timestamppb" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" "github.com/gravitational/teleport/api/types" @@ -88,7 +90,7 @@ func TestServiceAccess(t *testing.T) { t.Run(tt.name, func(t *testing.T) { for _, verbs := range utils.Combinations(tt.allowedVerbs) { t.Run(fmt.Sprintf("verbs=%v", verbs), func(t *testing.T) { - service := newService(t, fakeChecker{allowedVerbs: verbs}, testReporter, &libevents.DiscardEmitter{}) + service := newService(t, fakeChecker{allowedVerbs: verbs}, testReporter, &libevents.DiscardEmitter{}, clockwork.NewFakeClock()) err := callMethod(t, service, tt.name) // expect access denied except with full set of verbs. if len(verbs) == len(tt.allowedVerbs) { @@ -119,7 +121,8 @@ func TestEvents(t *testing.T) { rwVerbs := []string{types.VerbList, types.VerbCreate, types.VerbRead, types.VerbUpdate, types.VerbDelete} testReporter := &mockUsageReporter{} auditEventsSink := eventstest.NewChannelEmitter(10) - service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, testReporter, auditEventsSink) + fakeClock := clockwork.NewFakeClock() + service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, testReporter, auditEventsSink, fakeClock) ctx := context.Background() ut1, err := usertasks.NewDiscoverEC2UserTask(&usertasksv1.UserTaskSpec{ @@ -142,29 +145,37 @@ func TestEvents(t *testing.T) { require.NoError(t, err) userTaskName := ut1.GetMetadata().GetName() - _, err = service.CreateUserTask(ctx, &usertasksv1.CreateUserTaskRequest{UserTask: ut1}) + createUserTaskResp, err := service.CreateUserTask(ctx, &usertasksv1.CreateUserTaskRequest{UserTask: ut1}) require.NoError(t, err) // Usage reporting happens when user task is created, so we expect to see an event. require.Len(t, testReporter.emittedEvents, 1) consumeAssertEvent(t, auditEventsSink.C(), auditEventFor(userTaskName, "create", "", "")) + // LastStateChange is updated. + require.Equal(t, timestamppb.New(fakeClock.Now()), createUserTaskResp.Status.LastStateChange) ut1.Spec.DiscoverEc2.Instances["i-345"] = &usertasksv1.DiscoverEC2Instance{ InstanceId: "i-345", DiscoveryConfig: "dc01", DiscoveryGroup: "dg01", } - _, err = service.UpsertUserTask(ctx, &usertasksv1.UpsertUserTaskRequest{UserTask: ut1}) + fakeClock.Advance(1 * time.Minute) + upsertUserTaskResp, err := service.UpsertUserTask(ctx, &usertasksv1.UpsertUserTaskRequest{UserTask: ut1}) require.NoError(t, err) // State was not updated, so usage events must not increase. require.Len(t, testReporter.emittedEvents, 1) consumeAssertEvent(t, auditEventsSink.C(), auditEventFor(userTaskName, "update", "OPEN", "OPEN")) + // LastStateChange is not updated. + require.Equal(t, createUserTaskResp.Status.LastStateChange, upsertUserTaskResp.Status.LastStateChange) ut1.Spec.State = "RESOLVED" - _, err = service.UpdateUserTask(ctx, &usertasksv1.UpdateUserTaskRequest{UserTask: ut1}) + fakeClock.Advance(1 * time.Minute) + updateUserTaskResp, err := service.UpdateUserTask(ctx, &usertasksv1.UpdateUserTaskRequest{UserTask: ut1}) require.NoError(t, err) // State was updated, so usage events include this new usage report. require.Len(t, testReporter.emittedEvents, 2) consumeAssertEvent(t, auditEventsSink.C(), auditEventFor(userTaskName, "update", "OPEN", "RESOLVED")) + // LastStateChange was updated because the state changed. + require.Equal(t, timestamppb.New(fakeClock.Now()), updateUserTaskResp.Status.LastStateChange) _, err = service.DeleteUserTask(ctx, &usertasksv1.DeleteUserTaskRequest{Name: userTaskName}) require.NoError(t, err) @@ -241,9 +252,21 @@ func consumeAssertEvent(t *testing.T, q <-chan apievents.AuditEvent, expectedEve // callMethod calls a method with given name in the UserTask service func callMethod(t *testing.T, service *Service, method string) error { + emptyUserTask := &usertasksv1.UserTask{ + Spec: &usertasksv1.UserTaskSpec{}, + } + for _, desc := range usertasksv1.UserTaskService_ServiceDesc.Methods { if desc.MethodName == method { - _, err := desc.Handler(service, context.Background(), func(_ any) error { return nil }, nil) + _, err := desc.Handler(service, context.Background(), func(arg any) error { + switch arg := arg.(type) { + case *usertasksv1.CreateUserTaskRequest: + arg.UserTask = emptyUserTask + case *usertasksv1.UpsertUserTaskRequest: + arg.UserTask = emptyUserTask + } + return nil + }, nil) return err } } @@ -266,7 +289,7 @@ func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resourc return trace.AccessDenied("access denied to rule=%v/verb=%v", resource, verb) } -func newService(t *testing.T, checker services.AccessChecker, usageReporter usagereporter.UsageReporter, emitter apievents.Emitter) *Service { +func newService(t *testing.T, checker services.AccessChecker, usageReporter usagereporter.UsageReporter, emitter apievents.Emitter, clock clockwork.Clock) *Service { t.Helper() b, err := memory.New(memory.Config{}) @@ -297,6 +320,7 @@ func newService(t *testing.T, checker services.AccessChecker, usageReporter usag Cache: backendService, UsageReporter: func() usagereporter.UsageReporter { return usageReporter }, Emitter: emitter, + Clock: clock, }) require.NoError(t, err) return service diff --git a/lib/cache/cache.go b/lib/cache/cache.go index d0e8408e07d0b..2a7cae63ce99e 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -198,6 +198,7 @@ func ForAuth(cfg Config) Config { {Kind: types.KindIdentityCenterAccount}, {Kind: types.KindIdentityCenterPrincipalAssignment}, {Kind: types.KindIdentityCenterAccountAssignment}, + {Kind: types.KindWorkloadIdentity}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -550,6 +551,7 @@ type Cache struct { staticHostUsersCache *local.StaticHostUserService provisioningStatesCache *local.ProvisioningStateService identityCenterCache *local.IdentityCenterService + workloadIdentityCache workloadIdentityCacher // closed indicates that the cache has been closed closed atomic.Bool @@ -732,6 +734,9 @@ type Config struct { SPIFFEFederations SPIFFEFederationReader // StaticHostUsers is the static host user service. StaticHostUsers services.StaticHostUser + // WorkloadIdentity is the upstream Workload Identities service that we're + // caching + WorkloadIdentity WorkloadIdentityReader // Backend is a backend for local cache Backend backend.Backend // MaxRetryPeriod is the maximum period between cache retries on failures @@ -998,6 +1003,12 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + workloadIdentityCache, err := local.NewWorkloadIdentityService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + staticHostUserCache, err := local.NewStaticHostUserService(config.Backend) if err != nil { cancel() @@ -1070,6 +1081,7 @@ func New(config Config) (*Cache, error) { staticHostUsersCache: staticHostUserCache, provisioningStatesCache: provisioningStatesCache, identityCenterCache: identityCenterCache, + workloadIdentityCache: workloadIdentityCache, Logger: log.WithFields(log.Fields{ teleport.ComponentKey: config.Component, }), diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 0fe28e4dbc702..379e77d897e8e 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -141,6 +141,7 @@ type testPack struct { autoUpdateService services.AutoUpdateService provisioningStates services.ProvisioningStates identityCenter services.IdentityCenter + workloadIdentity *local.WorkloadIdentityService } // testFuncs are functions to support testing an object in a cache. @@ -362,6 +363,12 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { } p.spiffeFederations = spiffeFederationsSvc + workloadIdentitySvc, err := local.NewWorkloadIdentityService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + p.workloadIdentity = workloadIdentitySvc + databaseObjectsSvc, err := local.NewDatabaseObjectService(p.backend) if err != nil { return nil, trace.Wrap(err) @@ -455,6 +462,7 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + WorkloadIdentity: p.workloadIdentity, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -866,6 +874,7 @@ func TestCompletenessInit(t *testing.T) { StaticHostUsers: p.staticHostUsers, AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, + WorkloadIdentity: p.workloadIdentity, MaxRetryPeriod: 200 * time.Millisecond, IdentityCenter: p.identityCenter, EventsC: p.eventsC, @@ -951,6 +960,7 @@ func TestCompletenessReset(t *testing.T) { AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + WorkloadIdentity: p.workloadIdentity, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -1161,6 +1171,7 @@ func TestListResources_NodesTTLVariant(t *testing.T) { AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + WorkloadIdentity: p.workloadIdentity, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, neverOK: true, // ensure reads are never healthy @@ -1256,6 +1267,7 @@ func initStrategy(t *testing.T) { AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + WorkloadIdentity: p.workloadIdentity, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -3521,6 +3533,7 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindIdentityCenterAccount: types.Resource153ToLegacy(newIdentityCenterAccount("some_account")), types.KindIdentityCenterAccountAssignment: types.Resource153ToLegacy(newIdentityCenterAccountAssignment("some_account_assignment")), types.KindIdentityCenterPrincipalAssignment: types.Resource153ToLegacy(newIdentityCenterPrincipalAssignment("some_principal_assignment")), + types.KindWorkloadIdentity: types.Resource153ToLegacy(newWorkloadIdentity("some_identifier")), } for name, cfg := range cases { diff --git a/lib/cache/collections.go b/lib/cache/collections.go index c6aa7c73898a3..b13b2601e2c41 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -41,6 +41,7 @@ import ( userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" userspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/users/v1" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/discoveryconfig" @@ -176,6 +177,7 @@ type cacheCollections struct { identityCenterAccounts collectionReader[identityCenterAccountGetter] identityCenterPrincipalAssignments collectionReader[identityCenterPrincipalAssignmentGetter] identityCenterAccountAssignments collectionReader[identityCenterAccountAssignmentGetter] + workloadIdentity collectionReader[WorkloadIdentityReader] } // setupCollections returns a registry of collections. @@ -704,6 +706,15 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.spiffeFederations + case types.KindWorkloadIdentity: + if c.Config.WorkloadIdentity == nil { + return nil, trace.BadParameter("missing parameter WorkloadIdentity") + } + collections.workloadIdentity = &genericCollection[*workloadidentityv1pb.WorkloadIdentity, WorkloadIdentityReader, workloadIdentityExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.workloadIdentity case types.KindAutoUpdateConfig: if c.AutoUpdateService == nil { return nil, trace.BadParameter("missing parameter AutoUpdateService") diff --git a/lib/cache/resource_workload_identity.go b/lib/cache/resource_workload_identity.go new file mode 100644 index 0000000000000..75efb50fedbd5 --- /dev/null +++ b/lib/cache/resource_workload_identity.go @@ -0,0 +1,119 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//nolint:unused // Because the executors generate a large amount of false positives. +package cache + +import ( + "context" + + "github.com/gravitational/trace" + + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" +) + +// WorkloadIdentityReader is an interface that defines the methods for getting +// WorkloadIdentity. This is returned as the reader for the WorkloadIdentity +// collection but is also used by the executor to read the full list of +// WorkloadIdentity on initialization. +type WorkloadIdentityReader interface { + ListWorkloadIdentities(ctx context.Context, pageSize int, nextToken string) ([]*workloadidentityv1pb.WorkloadIdentity, string, error) + GetWorkloadIdentity(ctx context.Context, name string) (*workloadidentityv1pb.WorkloadIdentity, error) +} + +// workloadIdentityCacher is used for storing and retrieving WorkloadIdentity +// from the cache's local backend. +type workloadIdentityCacher interface { + WorkloadIdentityReader + UpsertWorkloadIdentity(ctx context.Context, resource *workloadidentityv1pb.WorkloadIdentity) (*workloadidentityv1pb.WorkloadIdentity, error) + DeleteWorkloadIdentity(ctx context.Context, name string) error + DeleteAllWorkloadIdentities(ctx context.Context) error +} + +type workloadIdentityExecutor struct{} + +var _ executor[*workloadidentityv1pb.WorkloadIdentity, WorkloadIdentityReader] = workloadIdentityExecutor{} + +func (workloadIdentityExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*workloadidentityv1pb.WorkloadIdentity, error) { + var out []*workloadidentityv1pb.WorkloadIdentity + var nextToken string + for { + var page []*workloadidentityv1pb.WorkloadIdentity + var err error + + const defaultPageSize = 0 + page, nextToken, err = cache.Config.WorkloadIdentity.ListWorkloadIdentities(ctx, defaultPageSize, nextToken) + if err != nil { + return nil, trace.Wrap(err) + } + out = append(out, page...) + if nextToken == "" { + break + } + } + return out, nil +} + +func (workloadIdentityExecutor) upsert(ctx context.Context, cache *Cache, resource *workloadidentityv1pb.WorkloadIdentity) error { + _, err := cache.workloadIdentityCache.UpsertWorkloadIdentity(ctx, resource) + return trace.Wrap(err) +} + +func (workloadIdentityExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return trace.Wrap(cache.workloadIdentityCache.DeleteAllWorkloadIdentities(ctx)) +} + +func (workloadIdentityExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return trace.Wrap(cache.workloadIdentityCache.DeleteWorkloadIdentity(ctx, resource.GetName())) +} + +func (workloadIdentityExecutor) isSingleton() bool { return false } + +func (workloadIdentityExecutor) getReader(cache *Cache, cacheOK bool) WorkloadIdentityReader { + if cacheOK { + return cache.workloadIdentityCache + } + return cache.Config.WorkloadIdentity +} + +// ListWorkloadIdentities returns a paginated list of WorkloadIdentity resources. +func (c *Cache) ListWorkloadIdentities(ctx context.Context, pageSize int, nextToken string) ([]*workloadidentityv1pb.WorkloadIdentity, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListWorkloadIdentities") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.workloadIdentity) + if err != nil { + return nil, "", trace.Wrap(err) + } + defer rg.Release() + out, nextKey, err := rg.reader.ListWorkloadIdentities(ctx, pageSize, nextToken) + return out, nextKey, trace.Wrap(err) +} + +// GetWorkloadIdentity returns a single WorkloadIdentity by name +func (c *Cache) GetWorkloadIdentity(ctx context.Context, name string) (*workloadidentityv1pb.WorkloadIdentity, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetWorkloadIdentity") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.workloadIdentity) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + out, err := rg.reader.GetWorkloadIdentity(ctx, name) + return out, trace.Wrap(err) +} diff --git a/lib/cache/resource_workload_identity_test.go b/lib/cache/resource_workload_identity_test.go new file mode 100644 index 0000000000000..da82d64fec27c --- /dev/null +++ b/lib/cache/resource_workload_identity_test.go @@ -0,0 +1,74 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" +) + +func newWorkloadIdentity(name string) *workloadidentityv1pb.WorkloadIdentity { + return &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: name, + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + } +} + +func TestWorkloadIdentity(t *testing.T) { + t.Parallel() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + testResources153(t, p, testFuncs153[*workloadidentityv1pb.WorkloadIdentity]{ + newResource: func(s string) (*workloadidentityv1pb.WorkloadIdentity, error) { + return newWorkloadIdentity(s), nil + }, + + create: func(ctx context.Context, item *workloadidentityv1pb.WorkloadIdentity) error { + _, err := p.workloadIdentity.CreateWorkloadIdentity(ctx, item) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]*workloadidentityv1pb.WorkloadIdentity, error) { + items, _, err := p.workloadIdentity.ListWorkloadIdentities(ctx, 0, "") + return items, trace.Wrap(err) + }, + deleteAll: func(ctx context.Context) error { + return p.workloadIdentity.DeleteAllWorkloadIdentities(ctx) + }, + + cacheList: func(ctx context.Context) ([]*workloadidentityv1pb.WorkloadIdentity, error) { + items, _, err := p.cache.ListWorkloadIdentities(ctx, 0, "") + return items, trace.Wrap(err) + }, + cacheGet: p.cache.GetWorkloadIdentity, + }) +} diff --git a/lib/client/client_store.go b/lib/client/client_store.go index f00992b513cef..d10b1b47a7b4b 100644 --- a/lib/client/client_store.go +++ b/lib/client/client_store.go @@ -127,11 +127,11 @@ func (s *Store) GetKeyRing(idx KeyRingIndex, opts ...CertOption) (*KeyRing, erro return nil, trace.Wrap(err) } - tlsCertExpiration, err := keyRing.TeleportTLSCertValidBefore() + // verify that the key ring has a TLS certificate + _, err = keyRing.TeleportTLSCertValidBefore() if err != nil { return nil, trace.Wrap(err) } - s.log.Debugf("Teleport TLS certificate valid until %q.", tlsCertExpiration) // Validate the SSH certificate. if keyRing.Cert != nil { diff --git a/lib/client/x11_session.go b/lib/client/x11_session.go index c951cd156e353..3ad6c4f67ca31 100644 --- a/lib/client/x11_session.go +++ b/lib/client/x11_session.go @@ -20,6 +20,8 @@ package client import ( "context" + "fmt" + "log/slog" "os" "time" @@ -42,7 +44,7 @@ func (ns *NodeSession) handleX11Forwarding(ctx context.Context, sess *tracessh.S display, err := x11.GetXDisplay() if err != nil { - log.WithError(err).Info("X11 forwarding requested but $DISPLAY is invalid") + slog.InfoContext(ctx, "X11 forwarding requested but $DISPLAY is invalid", "err", err) return ns.rejectX11Channels(ctx) } @@ -61,8 +63,8 @@ func (ns *NodeSession) handleX11Forwarding(ctx context.Context, sess *tracessh.S if err := x11.RequestForwarding(sess.Session, ns.spoofedXAuthEntry); err != nil { // Notify the user that x11 forwarding request failed regardless of debug level - log.Print("X11 forwarding request failed") - log.WithError(err).Debug("X11 forwarding request error") + fmt.Fprintln(os.Stderr, "X11 forwarding request failed") + slog.DebugContext(ctx, "X11 forwarding request error", "err", err) // If the X11 forwarding request fails, we must reject all X11 channel requests. return ns.rejectX11Channels(ctx) } @@ -77,25 +79,35 @@ func (ns *NodeSession) handleX11Forwarding(ctx context.Context, sess *tracessh.S // This will be used during X11 forwarding to forward and authorize // XServer requests from the remote server to the client's XServer. func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) error { + checkXauthErr := x11.CheckXAuthPath() + if checkXauthErr != nil && !ns.nodeClient.TC.X11ForwardingTrusted { + slog.WarnContext(ctx, "Untrusted X11 forwarding requires xauth to be installed in order generated xauth key data") + return trace.Wrap(checkXauthErr) + } + if ns.nodeClient.TC.X11ForwardingTrusted { - // For trusted X11 forwarding, we can create a random cookie without xauth + slog.WarnContext(ctx, "Trusted X11 forwarding provides unmitigated access to your local XServer, use with caution") + + // Check for existing xauth data. If found, it must be used in order to connect to the client's XServer. + var err error + if checkXauthErr == nil { + ns.clientXAuthEntry, err = x11.NewXAuthCommand(ctx, "" /* xauthFile */).ReadEntry(display) + if !trace.IsNotFound(err) { + return trace.Wrap(err) + } + } + + // If no xauth data was found, we can create a random cookie without xauth // as it is only used to validate the server-client connection. Locally, // the client's XServer will ignore the cookie and use whatever authentication // mechanisms it would use as if the client made the request locally. - log.Info("Creating a fake xauth cookie for trusted X11 forwarding.") - log.Warn("Trusted X11 forwarding provides unmitigated access to your local XServer, use with caution") + slog.InfoContext(ctx, "No xauth data found, creating a fake xauth cookie for trusted X11 forwarding.") - var err error ns.clientXAuthEntry, err = x11.NewFakeXAuthEntry(display) return trace.Wrap(err) } - if err := x11.CheckXAuthPath(); err != nil { - log.Info("trusted X11 forwarding requested but xauth is not installed") - return trace.Wrap(err) - } - - // Generate the xauth entry in a temporary file so it only exists within the context of this request. + // Generate an untrusted xauth entry in a temporary file so it only exists within the context of this request. // The XServer will recognize the xauth data regardless of it's existence within the file system. xauthFile, err := os.CreateTemp("", "tsh-xauthfile-*") if err != nil { @@ -111,7 +123,7 @@ func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) er defer func() { if err := os.Remove(xauthFile.Name()); err != nil { - log.WithError(err).Debug("Failed to remove temporary xauth file") + slog.DebugContext(ctx, "Failed to remove temporary xauth file", "err", err) } }() @@ -124,7 +136,7 @@ func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) er ns.x11RefuseTime = time.Now().Add(ns.nodeClient.TC.X11ForwardingTimeout) } - log.Info("creating an untrusted xauth cookie for untrusted X11 forwarding") + slog.InfoContext(ctx, "creating an untrusted xauth cookie for untrusted X11 forwarding", "xauth_file", xauthFile.Name()) cmd := x11.NewXAuthCommand(ctx, xauthFile.Name()) if err := cmd.GenerateUntrustedCookie(display, ns.nodeClient.TC.X11ForwardingTimeout); err != nil { return trace.Wrap(err) @@ -132,6 +144,7 @@ func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) er ns.clientXAuthEntry, err = x11.NewXAuthCommand(ctx, xauthFile.Name()).ReadEntry(display) if err != nil { + slog.ErrorContext(ctx, "untrusted X11 forwarding setup failed: failed to generate xauth key data") return trace.Wrap(err) } @@ -143,21 +156,21 @@ func (ns *NodeSession) serveX11Channels(ctx context.Context, sess *tracessh.Sess err := x11.ServeChannelRequests(ctx, ns.nodeClient.Client.Client, func(ctx context.Context, nch ssh.NewChannel) { if !ns.x11RefuseTime.IsZero() && time.Now().After(ns.x11RefuseTime) { nch.Reject(ssh.Prohibited, "rejected X11 channel request after ForwardX11Timeout") - log.Warn("rejected X11 forwarding attempt after the ForwardX11Timeout") + slog.WarnContext(ctx, "rejected X11 forwarding attempt after the ForwardX11Timeout") return } var req x11.ChannelRequestPayload if err := ssh.Unmarshal(nch.ExtraData(), &req); err != nil { nch.Reject(ssh.Prohibited, "invalid payload") - log.WithError(err).Debug("rejected X11 channel request with invalid payload") + slog.DebugContext(ctx, "rejected X11 channel request with invalid payload", "err", err) return } - log.Debugf("received X11 channel request from %s:%d", req.OriginatorAddress, req.OriginatorPort) + slog.DebugContext(ctx, "received X11 channel request from %s:%d", req.OriginatorAddress, req.OriginatorPort) xchan, sin, err := nch.Accept() if err != nil { - log.WithError(err).Debug("failed to accept X11 channel request") + slog.DebugContext(ctx, "failed to accept X11 channel request", "err", err) return } defer xchan.Close() @@ -167,24 +180,24 @@ func (ns *NodeSession) serveX11Channels(ctx context.Context, sess *tracessh.Sess // client's xauth cookie. Otherwise, the request will be denied. authPacket, err := x11.ReadAndRewriteXAuthPacket(xchan, ns.spoofedXAuthEntry, ns.clientXAuthEntry) if trace.IsAccessDenied(err) { - log.Error("X11 connection rejected due to wrong authentication") + slog.ErrorContext(ctx, "X11 connection rejected due to wrong authentication", "err", err) return } else if err != nil { - log.WithError(err).Debug("Failed to read xauth packet from X11 channel request") + slog.DebugContext(ctx, "Failed to read xauth packet from X11 channel request", "err", err) return } // Dial a connection to the client's XServer. xconn, err := ns.clientXAuthEntry.Display.Dial() if err != nil { - log.WithError(err).Debug("Failed to connect to client's display") + slog.DebugContext(ctx, "Failed to connect to client's display", "err", err) return } defer xconn.Close() // Send the processed X11 auth packet to the client's XServer connection. if _, err := xconn.Write(authPacket); err != nil { - log.WithError(err).Debug("Failed to write xauth packet") + slog.DebugContext(ctx, "Failed to write xauth packet", "err", err) return } @@ -195,12 +208,12 @@ func (ns *NodeSession) serveX11Channels(ctx context.Context, sess *tracessh.Sess go func() { err := sshutils.ForwardRequests(ctx, sin, sess) if err != nil { - log.WithError(err).Debug("Failed to forward ssh request from server during X11 forwarding") + slog.DebugContext(ctx, "Failed to forward ssh request from server during X11 forwarding", "err", err) } }() if err := utils.ProxyConn(ctx, xconn, xchan); err != nil { - log.WithError(err).Debug("Encountered error during X11 forwarding") + slog.DebugContext(ctx, "Encountered error during X11 forwarding", "err", err) } }) return trace.Wrap(err) @@ -212,7 +225,7 @@ func (ns *NodeSession) rejectX11Channels(ctx context.Context) error { // According to RFC 4254, client "implementations MUST reject any X11 channel // open requests if they have not requested X11 forwarding". Following openssh's // example, we treat such a request as a break in attempt and warn the user. - log.Warn("server tried X11 forwarding without client requesting it, this is likely a break-in attempt by a malicious user") + slog.WarnContext(ctx, "server tried X11 forwarding without client requesting it, this is likely a break-in attempt by a malicious user") nch.Reject(ssh.Prohibited, "") }) return trace.Wrap(err) diff --git a/lib/cloud/azure/vm.go b/lib/cloud/azure/vm.go index 2c9242712d4ba..48572cbc2066e 100644 --- a/lib/cloud/azure/vm.go +++ b/lib/cloud/azure/vm.go @@ -46,7 +46,7 @@ type VirtualMachinesClient interface { // Get returns the virtual machine for the given resource ID. Get(ctx context.Context, resourceID string) (*VirtualMachine, error) // GetByVMID returns the virtual machine for a given VM ID. - GetByVMID(ctx context.Context, resourceGroup, vmID string) (*VirtualMachine, error) + GetByVMID(ctx context.Context, vmID string) (*VirtualMachine, error) // ListVirtualMachines gets all of the virtual machines in the given resource group. ListVirtualMachines(ctx context.Context, resourceGroup string) ([]*armcompute.VirtualMachine, error) } @@ -146,15 +146,19 @@ func (c *vmClient) Get(ctx context.Context, resourceID string) (*VirtualMachine, } // GetByVMID returns the virtual machine for a given VM ID. -func (c *vmClient) GetByVMID(ctx context.Context, resourceGroup, vmID string) (*VirtualMachine, error) { - vms, err := c.ListVirtualMachines(ctx, resourceGroup) - if err != nil { - return nil, trace.Wrap(err) - } - for _, vm := range vms { - if vm.Properties != nil && *vm.Properties.VMID == vmID { - result, err := parseVirtualMachine(vm) - return result, trace.Wrap(err) +func (c *vmClient) GetByVMID(ctx context.Context, vmID string) (*VirtualMachine, error) { + pager := newListAllPager(c.api.NewListAllPager(&armcompute.VirtualMachinesClientListAllOptions{})) + for pager.more() { + res, err := pager.nextPage(ctx) + if err != nil { + return nil, trace.Wrap(ConvertResponseError(err)) + } + + for _, vm := range res { + if vm.Properties != nil && *vm.Properties.VMID == vmID { + result, err := parseVirtualMachine(vm) + return result, trace.Wrap(err) + } } } return nil, trace.NotFound("no VM with ID %q", vmID) diff --git a/lib/cloud/clients.go b/lib/cloud/clients.go index bc21d126b9903..a100cdb4a4605 100644 --- a/lib/cloud/clients.go +++ b/lib/cloud/clients.go @@ -398,6 +398,9 @@ type awsOptions struct { // maxRetries is the maximum number of retries to use for the session. maxRetries *int + + // withoutSessionCache disables the session cache for the AWS session. + withoutSessionCache bool } func (a *awsOptions) checkAndSetDefaults() error { @@ -429,6 +432,13 @@ func WithAssumeRole(roleARN, externalID string) AWSOptionsFn { } } +// WithoutSessionCache disables the session cache for the AWS session. +func WithoutSessionCache() AWSOptionsFn { + return func(options *awsOptions) { + options.withoutSessionCache = true + } +} + // WithAssumeRoleFromAWSMeta extracts options needed from AWS metadata for // assuming an AWS role. func WithAssumeRoleFromAWSMeta(meta types.AWS) AWSOptionsFn { @@ -495,7 +505,7 @@ func (c *cloudClients) GetAWSSession(ctx context.Context, region string, opts .. } var err error if options.baseSession == nil { - options.baseSession, err = c.getAWSSessionForRegion(region, options) + options.baseSession, err = c.getAWSSessionForRegion(ctx, region, options) if err != nil { return nil, trace.Wrap(err) } @@ -793,17 +803,12 @@ func awsAmbientSessionProvider(ctx context.Context, region string) (*awssession. } // getAWSSessionForRegion returns AWS session for the specified region. -func (c *cloudClients) getAWSSessionForRegion(region string, opts awsOptions) (*awssession.Session, error) { +func (c *cloudClients) getAWSSessionForRegion(ctx context.Context, region string, opts awsOptions) (*awssession.Session, error) { if err := opts.checkAndSetDefaults(); err != nil { return nil, trace.Wrap(err) } - cacheKey := awsSessionCacheKey{ - region: region, - integration: opts.integration, - } - - sess, err := utils.FnCacheGet(context.Background(), c.awsSessionsCache, cacheKey, func(ctx context.Context) (*awssession.Session, error) { + createSession := func(ctx context.Context) (*awssession.Session, error) { if opts.credentialsSource == credentialsSourceIntegration { if c.awsIntegrationSessionProviderFn == nil { return nil, trace.BadParameter("missing aws integration session provider") @@ -817,6 +822,30 @@ func (c *cloudClients) getAWSSessionForRegion(region string, opts awsOptions) (* logrus.Debugf("Initializing AWS session for region %v using environment credentials.", region) session, err := awsAmbientSessionProvider(ctx, region) return session, trace.Wrap(err) + } + + if opts.withoutSessionCache { + sess, err := createSession(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if opts.customRetryer != nil || opts.maxRetries != nil { + return sess.Copy(&aws.Config{ + Retryer: opts.customRetryer, + MaxRetries: opts.maxRetries, + }), nil + } + return sess, trace.Wrap(err) + } + + cacheKey := awsSessionCacheKey{ + region: region, + integration: opts.integration, + } + + sess, err := utils.FnCacheGet(ctx, c.awsSessionsCache, cacheKey, func(ctx context.Context) (*awssession.Session, error) { + session, err := createSession(ctx) + return session, trace.Wrap(err) }) if err != nil { return nil, trace.Wrap(err) @@ -836,6 +865,16 @@ func (c *cloudClients) getAWSSessionForRole(ctx context.Context, region string, return nil, trace.Wrap(err) } + createSession := func(ctx context.Context) (*awssession.Session, error) { + stsClient := sts.New(options.baseSession) + return newSessionWithRole(ctx, stsClient, region, options.assumeRoleARN, options.assumeRoleExternalID) + } + + if options.withoutSessionCache { + session, err := createSession(ctx) + return session, trace.Wrap(err) + } + cacheKey := awsSessionCacheKey{ region: region, integration: options.integration, @@ -843,8 +882,8 @@ func (c *cloudClients) getAWSSessionForRole(ctx context.Context, region string, externalID: options.assumeRoleExternalID, } return utils.FnCacheGet(ctx, c.awsSessionsCache, cacheKey, func(ctx context.Context) (*awssession.Session, error) { - stsClient := sts.New(options.baseSession) - return newSessionWithRole(ctx, stsClient, region, options.assumeRoleARN, options.assumeRoleExternalID) + session, err := createSession(ctx) + return session, trace.Wrap(err) }) } diff --git a/lib/kube/proxy/cluster_details.go b/lib/kube/proxy/cluster_details.go index b74e81f1b5ddb..c949494ac982d 100644 --- a/lib/kube/proxy/cluster_details.go +++ b/lib/kube/proxy/cluster_details.go @@ -131,11 +131,9 @@ func newClusterDetails(ctx context.Context, cfg clusterDetailsConfig) (_ *kubeDe go dynLabels.Start() } - kubeClient := creds.getKubeClient() - var isClusterOffline bool // Create the codec factory and the list of supported types for RBAC. - codecFactory, rbacSupportedTypes, gvkSupportedRes, err := newClusterSchemaBuilder(cfg.log, kubeClient) + codecFactory, rbacSupportedTypes, gvkSupportedRes, err := newClusterSchemaBuilder(cfg.log, creds.getKubeClient()) if err != nil { cfg.log.WithError(err).Warn("Failed to create cluster schema. Possibly the cluster is offline.") // If the cluster is offline, we will not be able to create the codec factory @@ -145,7 +143,7 @@ func newClusterDetails(ctx context.Context, cfg clusterDetailsConfig) (_ *kubeDe isClusterOffline = true } - kubeVersion, err := kubeClient.Discovery().ServerVersion() + kubeVersion, err := creds.getKubeClient().Discovery().ServerVersion() if err != nil { cfg.log.WithError(err).Warn("Failed to get Kubernetes cluster version. Possibly the cluster is offline.") } @@ -204,7 +202,7 @@ func newClusterDetails(ctx context.Context, cfg clusterDetailsConfig) (_ *kubeDe continue } - kubeVersion, err := kubeClient.Discovery().ServerVersion() + kubeVersion, err := creds.getKubeClient().Discovery().ServerVersion() if err != nil { cfg.log.WithError(err).Warn("Failed to get Kubernetes cluster version. Possibly the cluster is offline.") } @@ -342,6 +340,7 @@ func getAWSClientRestConfig(cloudClients cloud.Clients, clock clockwork.Clock, r region := cluster.GetAWSConfig().Region opts := []cloud.AWSOptionsFn{ cloud.WithAmbientCredentials(), + cloud.WithoutSessionCache(), } if awsAssume := getAWSResourceMatcherToCluster(cluster, resourceMatchers); awsAssume != nil { opts = append(opts, cloud.WithAssumeRole(awsAssume.AssumeRoleARN, awsAssume.ExternalID)) diff --git a/lib/proxy/peer/quic/quic_test.go b/lib/proxy/peer/quic/quic_test.go index 2d0b7c4a4be82..2071d78ebe229 100644 --- a/lib/proxy/peer/quic/quic_test.go +++ b/lib/proxy/peer/quic/quic_test.go @@ -221,6 +221,8 @@ func TestCertificateVerification(t *testing.T) { } func TestBasicFunctionality(t *testing.T) { + t.Skip("disabled until quic-go/quic-go#4303 is fixed (data race)") + t.Parallel() hostCA := newCA(t) diff --git a/lib/service/service.go b/lib/service/service.go index 6431eba5f0e17..d817a31c80324 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2531,6 +2531,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.WebSession = services.Identity.WebSessions() cfg.WebToken = services.Identity.WebTokens() cfg.WindowsDesktops = services.WindowsDesktops + cfg.WorkloadIdentity = services.WorkloadIdentities cfg.DynamicWindowsDesktops = services.DynamicWindowsDesktops cfg.AutoUpdateService = services.AutoUpdateService cfg.ProvisioningStates = services.ProvisioningStates diff --git a/lib/service/service_test.go b/lib/service/service_test.go index 7495a9c7d681e..cf28ef5ebed79 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -41,6 +41,7 @@ import ( "github.com/jonboulle/clockwork" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -1816,19 +1817,28 @@ func TestInitDatabaseService(t *testing.T) { cfg.Databases.Enabled = test.enabled cfg.Databases.Databases = test.databases + // This timeout should consider time to receive the event + shutdown + // time. + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + + var eg errgroup.Group process, err := NewTeleport(cfg) require.NoError(t, err) + require.NoError(t, process.Start()) + eg.Go(func() error { return process.WaitForSignals(ctx, nil) }) + // Ensures the process is closed in failure scenarios. t.Cleanup(func() { - require.NoError(t, process.Close()) + cancel() + _ = eg.Wait() }) - require.NoError(t, process.Start()) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() if !test.expectErr { _, err := process.WaitForEvent(ctx, TeleportReadyEvent) require.NoError(t, err) + require.NoError(t, process.Close()) + // Expect Teleport to shutdown without reporting any issue. + require.NoError(t, eg.Wait()) return } @@ -1838,6 +1848,9 @@ func TestInitDatabaseService(t *testing.T) { exitPayload, ok := event.Payload.(ExitEventPayload) require.True(t, ok, "expected ExitEventPayload but got %T", event.Payload) require.Equal(t, "db.init", exitPayload.Service.Name()) + // Database service init is a critical service, meaning failures on + // it should cause the process to exit with error. + require.Error(t, eg.Wait()) }) } } diff --git a/lib/services/access_checker.go b/lib/services/access_checker.go index 6174f56d7f7ba..2c7317b42d98d 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -111,6 +111,9 @@ type AccessChecker interface { // CanPortForward returns true if this RoleSet can forward ports. CanPortForward() bool + // SSHPortForwardMode returns the SSHPortForwardMode that the RoleSet allows. + SSHPortForwardMode() SSHPortForwardMode + // DesktopClipboard returns true if the role set has enabled shared // clipboard for desktop sessions. Clipboard sharing is disabled if // one or more of the roles in the set has disabled it. diff --git a/lib/services/access_checker_test.go b/lib/services/access_checker_test.go index 37d0247bb8442..41b3bc8aaad59 100644 --- a/lib/services/access_checker_test.go +++ b/lib/services/access_checker_test.go @@ -24,6 +24,8 @@ import ( "github.com/stretchr/testify/require" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" "github.com/gravitational/teleport/api/types" ) @@ -565,6 +567,213 @@ func TestAccessCheckerHostUsersShell(t *testing.T) { require.Equal(t, expectedShell, hui.Shell) } +func TestSSHPortForwarding(t *testing.T) { + anyLabels := types.Labels{"*": {"*"}} + localCluster := "cluster" + + allAllow := newRole(func(rv *types.RoleV6) { + rv.SetName("all-allow") + rv.SetOptions(types.RoleOptions{ + PortForwarding: types.NewBoolOption(true), + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{Enabled: types.NewBoolOption(true)}, + Local: &types.SSHLocalPortForwarding{Enabled: types.NewBoolOption(true)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + allDeny := newRole(func(rv *types.RoleV6) { + rv.SetName("all-deny") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{Enabled: types.NewBoolOption(false)}, + Local: &types.SSHLocalPortForwarding{Enabled: types.NewBoolOption(false)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + allow := newRole(func(rv *types.RoleV6) { + rv.SetName("allow") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{Enabled: types.NewBoolOption(true)}, + Local: &types.SSHLocalPortForwarding{Enabled: types.NewBoolOption(true)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + deny := newRole(func(rv *types.RoleV6) { + rv.SetName("deny") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{Enabled: types.NewBoolOption(false)}, + Local: &types.SSHLocalPortForwarding{Enabled: types.NewBoolOption(false)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + legacyAllow := newRole(func(rv *types.RoleV6) { + rv.SetName("legacy-allow") + rv.SetOptions(types.RoleOptions{ + PortForwarding: types.NewBoolOption(true), + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + legacyDeny := newRole(func(rv *types.RoleV6) { + rv.SetName("legacy-deny") + rv.SetOptions(types.RoleOptions{ + PortForwarding: types.NewBoolOption(false), + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + remoteAllow := newRole(func(rv *types.RoleV6) { + rv.SetName("remote-allow") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{Enabled: types.NewBoolOption(true)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + remoteDeny := newRole(func(rv *types.RoleV6) { + rv.SetName("remote-deny") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{Enabled: types.NewBoolOption(false)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + localAllow := newRole(func(rv *types.RoleV6) { + rv.SetName("local-allow") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Local: &types.SSHLocalPortForwarding{Enabled: types.NewBoolOption(true)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + localDeny := newRole(func(rv *types.RoleV6) { + rv.SetName("local-deny") + rv.SetOptions(types.RoleOptions{ + SSHPortForwarding: &types.SSHPortForwarding{ + Local: &types.SSHLocalPortForwarding{Enabled: types.NewBoolOption(false)}, + }, + }) + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + implicitAllow := newRole(func(rv *types.RoleV6) { + rv.SetName("implicit-allow") + rv.SetNodeLabels(types.Allow, anyLabels) + }) + + testCases := []struct { + name string + roleSet RoleSet + expectedMode SSHPortForwardMode + }{ + { + name: "allow all", + roleSet: NewRoleSet(allAllow), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "deny all", + roleSet: NewRoleSet(allDeny), + expectedMode: SSHPortForwardModeOff, + }, + { + name: "allow remote and local", + roleSet: NewRoleSet(allow), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "deny remote and local", + roleSet: NewRoleSet(deny), + expectedMode: SSHPortForwardModeOff, + }, + { + name: "legacy allow", + roleSet: NewRoleSet(legacyAllow), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "legacy deny", + roleSet: NewRoleSet(legacyDeny), + expectedMode: SSHPortForwardModeOff, + }, + { + name: "remote allow", + roleSet: NewRoleSet(remoteAllow), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "remote deny", + roleSet: NewRoleSet(remoteDeny), + expectedMode: SSHPortForwardModeLocal, + }, + { + name: "local allow", + roleSet: NewRoleSet(localAllow), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "local deny", + roleSet: NewRoleSet(localDeny), + expectedMode: SSHPortForwardModeRemote, + }, + { + name: "implicit allow", + roleSet: NewRoleSet(implicitAllow), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "conflicting roles: allow all with remote deny", + roleSet: NewRoleSet(allow, remoteDeny), + expectedMode: SSHPortForwardModeLocal, + }, + { + name: "conflicting roles: allow all with local deny", + roleSet: NewRoleSet(allow, localDeny), + expectedMode: SSHPortForwardModeRemote, + }, + { + // legacy behavior prefers explicit allow, so make sure we respect that if one is given + name: "conflicting roles: deny all with legacy allow", + roleSet: NewRoleSet(deny, legacyAllow), + expectedMode: SSHPortForwardModeOn, + }, + { + // legacy behavior prioritizes explicit allow, so make sure we respect that if another role would allow access + name: "conflicting roles: allow all with legacy deny", + roleSet: NewRoleSet(allow, legacyDeny), + expectedMode: SSHPortForwardModeOn, + }, + { + name: "conflicting roles implicit allow explicit deny", + roleSet: NewRoleSet(implicitAllow, deny), + expectedMode: SSHPortForwardModeOff, + }, + } + + for _, c := range testCases { + t.Run(c.name, func(t *testing.T) { + accessChecker := NewAccessCheckerWithRoleSet(&AccessInfo{}, localCluster, c.roleSet) + require.Equal(t, c.expectedMode, accessChecker.SSHPortForwardMode()) + }) + } +} + type serverStub struct { types.Server } @@ -572,3 +781,96 @@ type serverStub struct { func (serverStub) GetKind() string { return types.KindNode } + +func TestAccessCheckerWorkloadIdentity(t *testing.T) { + localCluster := "cluster" + + noLabelsWI := &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Metadata: &headerv1.Metadata{ + Name: "no-labels", + }, + } + fooLabeledWI := &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Metadata: &headerv1.Metadata{ + Name: "foo-labeled", + Labels: map[string]string{ + "foo": "bar", + }, + }, + } + + roleNoLabels := newRole(func(rv *types.RoleV6) {}) + roleWildcard := newRole(func(rv *types.RoleV6) { + rv.Spec.Allow.WorkloadIdentityLabels = types.Labels{types.Wildcard: []string{types.Wildcard}} + }) + roleFooLabel := newRole(func(rv *types.RoleV6) { + rv.Spec.Allow.WorkloadIdentityLabels = types.Labels{"foo": {"bar"}} + }) + tests := []struct { + name string + roleSet RoleSet + resource *workloadidentityv1pb.WorkloadIdentity + requireError require.ErrorAssertionFunc + }{ + { + name: "wildcard role, no labels wi", + roleSet: NewRoleSet( + roleWildcard, + ), + resource: noLabelsWI, + requireError: require.NoError, + }, + { + name: "no labels role, no labels wi", + roleSet: NewRoleSet( + roleNoLabels, + ), + resource: noLabelsWI, + requireError: require.Error, + }, + { + name: "labels role, no labels wi", + roleSet: NewRoleSet( + roleFooLabel, + ), + resource: noLabelsWI, + requireError: require.Error, + }, + { + name: "wildcard role, labels wi", + roleSet: NewRoleSet( + roleWildcard, + ), + resource: fooLabeledWI, + requireError: require.NoError, + }, + { + name: "no labels role, labels wi", + roleSet: NewRoleSet( + roleNoLabels, + ), + resource: fooLabeledWI, + requireError: require.Error, + }, + { + name: "labels role, labels wi", + roleSet: NewRoleSet( + roleFooLabel, + ), + resource: fooLabeledWI, + requireError: require.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + accessChecker := NewAccessCheckerWithRoleSet(&AccessInfo{}, localCluster, tt.roleSet) + err := accessChecker.CheckAccess( + types.Resource153ToResourceWithLabels(tt.resource), + AccessState{}, + ) + tt.requireError(t, err) + }) + } +} diff --git a/lib/services/identitycenter.go b/lib/services/identitycenter.go index f1b3988e5adfc..5bac0349b804b 100644 --- a/lib/services/identitycenter.go +++ b/lib/services/identitycenter.go @@ -242,20 +242,16 @@ type IdentityCenter interface { IdentityCenterAccountAssignments } -// NewIdentityCenterAccountMatcher creates a new [IdentityCenterMatcher] -// configured to match the supplied [IdentityCenterAccount]. -func NewIdentityCenterAccountMatcher(account IdentityCenterAccount) RoleMatcher { +// NewIdentityCenterAccountMatcher creates a new [RoleMatcher] configured to +// match the supplied [IdentityCenterAccount]. +func NewIdentityCenterAccountMatcher(account IdentityCenterAccount) *IdentityCenterAccountMatcher { return &IdentityCenterAccountMatcher{ accountID: account.GetSpec().GetId(), } } // IdentityCenterMatcher implements a [RoleMatcher] for comparing Identity Center -// resources against the AccountAssignments specified in a Role condition. -// -// The same type is used for matching both [IdentityCenterAccount]s and -// [IdentityCenterAccountAssignment]s, the permission set is `nil` when matching -// an Account. +// Account resources against the AccountAssignments specified in a Role condition. type IdentityCenterAccountMatcher struct { accountID string } @@ -284,18 +280,16 @@ func (m *IdentityCenterAccountMatcher) String() string { // NewIdentityCenterAccountAssignmentMatcher creates a new [IdentityCenterAccountAssignmentMatcher] // configured to match the supplied [IdentityCenterAccountAssignment]. -func NewIdentityCenterAccountAssignmentMatcher(account IdentityCenterAccountAssignment) RoleMatcher { - return &IdentityCenterAccountMatcher{ - accountID: account.GetSpec().GetAccountId(), +func NewIdentityCenterAccountAssignmentMatcher(assignment IdentityCenterAccountAssignment) *IdentityCenterAccountAssignmentMatcher { + return &IdentityCenterAccountAssignmentMatcher{ + accountID: assignment.GetSpec().GetAccountId(), + permissionSetARN: assignment.GetSpec().GetPermissionSet().Arn, } } // IdentityCenterMatcher implements a [RoleMatcher] for comparing Identity Center -// resources against the AccountAssignments specified in a Role condition. -// -// The same type is used for matching both [IdentityCenterAccount]s and -// [IdentityCenterAccountAssignment]s, the permission set is `nil` when matching -// an Account. +// Account Assignment resources against the AccountAssignments specified in a +// Role condition. type IdentityCenterAccountAssignmentMatcher struct { accountID string permissionSetARN string diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 2f1c9854da9cd..ebf5613d81159 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -248,6 +248,8 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newIdentityCenterPrincipalAssignmentParser() case types.KindIdentityCenterAccountAssignment: parser = newIdentityCenterAccountAssignmentParser() + case types.KindWorkloadIdentity: + parser = newWorkloadIdentityParser() default: if watch.AllowPartialSuccess { continue @@ -3175,6 +3177,46 @@ func (p *spiffeFederationParser) parse(event backend.Event) (types.Resource, err } } +func newWorkloadIdentityParser() *workloadIdentityParser { + return &workloadIdentityParser{ + baseParser: newBaseParser(backend.NewKey(workloadIdentityPrefix)), + } +} + +type workloadIdentityParser struct { + baseParser +} + +func (p *workloadIdentityParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + name := event.Item.Key.TrimPrefix(backend.NewKey(workloadIdentityPrefix)).String() + if name == "" { + return nil, trace.NotFound("failed parsing %v", event.Item.Key.String()) + } + + return &types.ResourceHeader{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: types.Metadata{ + Name: strings.TrimPrefix(name, backend.SeparatorString), + Namespace: apidefaults.Namespace, + }, + }, nil + case types.OpPut: + resource, err := services.UnmarshalWorkloadIdentity( + event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision)) + if err != nil { + return nil, trace.Wrap(err, "unmarshalling resource from event") + } + return types.Resource153ToLegacy(resource), nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + func newProvisioningStateParser() *provisioningStateParser { return &provisioningStateParser{ baseParser: newBaseParser(backend.NewKey(provisioningStatePrefix)), diff --git a/lib/services/local/identitycenter_events.go b/lib/services/local/identitycenter_events.go index b8cc8933b200b..967db5ae731bc 100644 --- a/lib/services/local/identitycenter_events.go +++ b/lib/services/local/identitycenter_events.go @@ -65,7 +65,7 @@ func (p *identityCenterAccountParser) parse(event backend.Event) (types.Resource if err != nil { return nil, trace.Wrap(err) } - return types.Resource153ToLegacy(services.IdentityCenterAccount{Account: r}), nil + return types.Resource153ToResourceWithLabels(services.IdentityCenterAccount{Account: r}), nil default: return nil, trace.BadParameter("event %v is not supported", event.Type) } @@ -109,7 +109,7 @@ func (p *identityCenterPrincipalAssignmentParser) parse(event backend.Event) (ty if err != nil { return nil, trace.Wrap(err) } - return types.Resource153ToLegacy(r), nil + return types.Resource153ToResourceWithLabels(r), nil default: return nil, trace.BadParameter("event %v is not supported", event.Type) diff --git a/lib/services/local/resource.go b/lib/services/local/resource.go index c21a3fac4665c..e12eb673a1c62 100644 --- a/lib/services/local/resource.go +++ b/lib/services/local/resource.go @@ -30,8 +30,8 @@ import ( ) // CreateResources attempts to dynamically create the supplied resources. -// This function returns `trace.AlreadyExistsError` if one or more resources -// would be overwritten, and `trace.NotImplementedError` if any resources +// If any resources already exist they are skipped and not overwritten. +// This function returns a `trace.NotImplementedError` if any resources // are of an unsupported type (see `itemsFromResources(...)`). // // NOTE: This function is non-atomic and performs no internal synchronization; @@ -41,20 +41,9 @@ func CreateResources(ctx context.Context, b backend.Backend, resources ...types. if err != nil { return trace.Wrap(err) } - // ensure all items do not exist before continuing. - for _, item := range items { - _, err = b.Get(ctx, item.Key) - if !trace.IsNotFound(err) { - if err != nil { - return trace.Wrap(err) - } - return trace.AlreadyExists("resource %q already exists", item.Key.String()) - } - } - // create all items. for _, item := range items { _, err := b.Create(ctx, item) - if err != nil { + if !trace.IsAlreadyExists(err) && err != nil { return trace.Wrap(err) } } diff --git a/lib/services/local/resource_test.go b/lib/services/local/resource_test.go index 330a5cd931984..97e866c022253 100644 --- a/lib/services/local/resource_test.go +++ b/lib/services/local/resource_test.go @@ -30,6 +30,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/crypto/bcrypt" + "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/services" @@ -55,6 +56,34 @@ func TestCreateResourcesProvisionToken(t *testing.T) { require.Empty(t, cmp.Diff(token, fetchedToken, cmpopts.IgnoreFields(types.Metadata{}, "Revision"))) } +func TestCreateResource(t *testing.T) { + t.Parallel() + ctx := context.Background() + tt := setupServicesContext(ctx, t) + cap, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ + Type: constants.Local, + }) + require.NoError(t, err) + + // Check that the initial call to CreateResources creates the given resources. + s, err := NewClusterConfigurationService(tt.bk) + require.NoError(t, err) + err = CreateResources(ctx, tt.bk, cap) + require.NoError(t, err) + got, err := s.GetAuthPreference(ctx) + require.NoError(t, err) + require.Equal(t, cap.GetType(), got.GetType()) + + // Check that already exists errors are ignored and the resource is not + // updated. + cap.SetType(constants.SAML) + err = CreateResources(ctx, tt.bk, cap) + require.NoError(t, err) + got, err = s.GetAuthPreference(ctx) + require.NoError(t, err) + require.NotEqual(t, cap.GetType(), got.GetType()) +} + func TestUserResource(t *testing.T) { t.Parallel() ctx := context.Background() diff --git a/lib/services/local/spiffe_federations_test.go b/lib/services/local/spiffe_federations_test.go index edc9a1ac3c1f9..7ce3ffaa25529 100644 --- a/lib/services/local/spiffe_federations_test.go +++ b/lib/services/local/spiffe_federations_test.go @@ -246,7 +246,7 @@ func TestSPIFFEFederationService_DeleteSPIFFEFederation(t *testing.T) { require.True(t, trace.IsNotFound(err)) }) t.Run("not found", func(t *testing.T) { - _, err := service.GetSPIFFEFederation(ctx, "foo.example.com") + err := service.DeleteSPIFFEFederation(ctx, "foo.example.com") require.Error(t, err) require.True(t, trace.IsNotFound(err)) }) diff --git a/lib/services/local/workload_identity.go b/lib/services/local/workload_identity.go new file mode 100644 index 0000000000000..e0504e989cbe8 --- /dev/null +++ b/lib/services/local/workload_identity.go @@ -0,0 +1,118 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package local + +import ( + "context" + + "github.com/gravitational/trace" + + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local/generic" +) + +const ( + workloadIdentityPrefix = "workload_identity" +) + +// WorkloadIdentityService exposes backend functionality for storing +// WorkloadIdentity resources +type WorkloadIdentityService struct { + service *generic.ServiceWrapper[*workloadidentityv1pb.WorkloadIdentity] +} + +// NewWorkloadIdentityService creates a new WorkloadIdentityService +func NewWorkloadIdentityService(b backend.Backend) (*WorkloadIdentityService, error) { + service, err := generic.NewServiceWrapper( + generic.ServiceWrapperConfig[*workloadidentityv1pb.WorkloadIdentity]{ + Backend: b, + ResourceKind: types.KindWorkloadIdentity, + BackendPrefix: backend.NewKey(workloadIdentityPrefix), + MarshalFunc: services.MarshalWorkloadIdentity, + UnmarshalFunc: services.UnmarshalWorkloadIdentity, + ValidateFunc: services.ValidateWorkloadIdentity, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return &WorkloadIdentityService{ + service: service, + }, nil +} + +// CreateWorkloadIdentity inserts a new WorkloadIdentity into the backend. +func (b *WorkloadIdentityService) CreateWorkloadIdentity( + ctx context.Context, resource *workloadidentityv1pb.WorkloadIdentity, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + created, err := b.service.CreateResource(ctx, resource) + return created, trace.Wrap(err) +} + +// GetWorkloadIdentity retrieves a specific WorkloadIdentity given a name +func (b *WorkloadIdentityService) GetWorkloadIdentity( + ctx context.Context, name string, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + resource, err := b.service.GetResource(ctx, name) + return resource, trace.Wrap(err) +} + +// ListWorkloadIdentities lists all WorkloadIdentities using a given page size +// and last key. +func (b *WorkloadIdentityService) ListWorkloadIdentities( + ctx context.Context, pageSize int, currentToken string, +) ([]*workloadidentityv1pb.WorkloadIdentity, string, error) { + r, nextToken, err := b.service.ListResources(ctx, pageSize, currentToken) + return r, nextToken, trace.Wrap(err) +} + +// DeleteWorkloadIdentity deletes a specific WorkloadIdentity. +func (b *WorkloadIdentityService) DeleteWorkloadIdentity( + ctx context.Context, name string, +) error { + return trace.Wrap(b.service.DeleteResource(ctx, name)) +} + +// DeleteAllWorkloadIdentities deletes all SPIFFE resources, this is typically +// only meant to be used by the cache. +func (b *WorkloadIdentityService) DeleteAllWorkloadIdentities( + ctx context.Context, +) error { + return trace.Wrap(b.service.DeleteAllResources(ctx)) +} + +// UpsertWorkloadIdentity upserts a WorkloadIdentitys. Prefer using +// CreateWorkloadIdentity. This is only designed for usage by the cache. +func (b *WorkloadIdentityService) UpsertWorkloadIdentity( + ctx context.Context, resource *workloadidentityv1pb.WorkloadIdentity, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + upserted, err := b.service.UpsertResource(ctx, resource) + return upserted, trace.Wrap(err) +} + +// UpdateWorkloadIdentity updates a specific WorkloadIdentity. The resource must +// already exist, and, condition update semantics are used - e.g the submitted +// resource must have a revision matching the revision of the resource in the +// backend. +func (b *WorkloadIdentityService) UpdateWorkloadIdentity( + ctx context.Context, resource *workloadidentityv1pb.WorkloadIdentity, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + updated, err := b.service.ConditionalUpdateResource(ctx, resource) + return updated, trace.Wrap(err) +} diff --git a/lib/services/local/workload_identity_test.go b/lib/services/local/workload_identity_test.go new file mode 100644 index 0000000000000..acba05d9c8e4a --- /dev/null +++ b/lib/services/local/workload_identity_test.go @@ -0,0 +1,355 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package local + +import ( + "context" + "fmt" + "slices" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/testing/protocmp" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/backend/memory" +) + +func setupWorkloadIdentityServiceTest( + t *testing.T, +) (context.Context, *WorkloadIdentityService) { + t.Parallel() + ctx := context.Background() + clock := clockwork.NewFakeClock() + mem, err := memory.New(memory.Config{ + Context: ctx, + Clock: clock, + }) + require.NoError(t, err) + service, err := NewWorkloadIdentityService(backend.NewSanitizer(mem)) + require.NoError(t, err) + return ctx, service +} + +func newValidWorkloadIdentity(name string) *workloadidentityv1pb.WorkloadIdentity { + return &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: name, + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/test", + }, + }, + } +} + +func TestWorkloadIdentityService_CreateWorkloadIdentity(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + + t.Run("ok", func(t *testing.T) { + want := newValidWorkloadIdentity("example") + got, err := service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(want).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + require.NotEmpty(t, got.Metadata.Revision) + require.Empty(t, cmp.Diff( + want, + got, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + )) + }) + t.Run("validation occurs", func(t *testing.T) { + out, err := service.CreateWorkloadIdentity(ctx, newValidWorkloadIdentity("")) + require.ErrorContains(t, err, "metadata.name: is required") + require.Nil(t, out) + }) + t.Run("no upsert", func(t *testing.T) { + res := newValidWorkloadIdentity("duplicate") + _, err := service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(res).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + _, err = service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(res).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.Error(t, err) + require.True(t, trace.IsAlreadyExists(err)) + }) +} + +func TestWorkloadIdentityService_UpsertWorkloadIdentity(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + + t.Run("ok", func(t *testing.T) { + want := newValidWorkloadIdentity("example") + got, err := service.UpsertWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(want).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + require.NotEmpty(t, got.Metadata.Revision) + require.Empty(t, cmp.Diff( + want, + got, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + )) + + // Ensure we can upsert over an existing resource + _, err = service.UpsertWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(want).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + }) + t.Run("validation occurs", func(t *testing.T) { + out, err := service.UpdateWorkloadIdentity(ctx, newValidWorkloadIdentity("")) + require.ErrorContains(t, err, "metadata.name: is required") + require.Nil(t, out) + }) +} + +func TestWorkloadIdentityService_ListWorkloadIdentities(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + // Create entities to list + createdObjects := []*workloadidentityv1pb.WorkloadIdentity{} + // Create 49 entities to test an incomplete page at the end. + for i := 0; i < 49; i++ { + created, err := service.CreateWorkloadIdentity( + ctx, + newValidWorkloadIdentity(fmt.Sprintf("%d", i)), + ) + require.NoError(t, err) + createdObjects = append(createdObjects, created) + } + t.Run("default page size", func(t *testing.T) { + page, nextToken, err := service.ListWorkloadIdentities(ctx, 0, "") + require.NoError(t, err) + require.Len(t, page, 49) + require.Empty(t, nextToken) + + // Expect that we get all the things we have created + for _, created := range createdObjects { + slices.ContainsFunc(page, func(resource *workloadidentityv1pb.WorkloadIdentity) bool { + return proto.Equal(created, resource) + }) + } + }) + t.Run("pagination", func(t *testing.T) { + fetched := []*workloadidentityv1pb.WorkloadIdentity{} + token := "" + iterations := 0 + for { + iterations++ + page, nextToken, err := service.ListWorkloadIdentities(ctx, 10, token) + require.NoError(t, err) + fetched = append(fetched, page...) + if nextToken == "" { + break + } + token = nextToken + } + require.Equal(t, 5, iterations) + + require.Len(t, fetched, 49) + // Expect that we get all the things we have created + for _, created := range createdObjects { + slices.ContainsFunc(fetched, func(resource *workloadidentityv1pb.WorkloadIdentity) bool { + return proto.Equal(created, resource) + }) + } + }) +} + +func TestWorkloadIdentityService_GetWorkloadIdentity(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + + t.Run("ok", func(t *testing.T) { + want := newValidWorkloadIdentity("example") + _, err := service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(want).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + got, err := service.GetWorkloadIdentity(ctx, "example") + require.NoError(t, err) + require.NotEmpty(t, got.Metadata.Revision) + require.Empty(t, cmp.Diff( + want, + got, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + )) + }) + t.Run("not found", func(t *testing.T) { + _, err := service.GetWorkloadIdentity(ctx, "not-found") + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) +} + +func TestWorkloadIdentityService_DeleteWorkloadIdentity(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + + t.Run("ok", func(t *testing.T) { + _, err := service.CreateWorkloadIdentity( + ctx, + newValidWorkloadIdentity("example"), + ) + require.NoError(t, err) + + _, err = service.GetWorkloadIdentity(ctx, "example") + require.NoError(t, err) + + err = service.DeleteWorkloadIdentity(ctx, "example") + require.NoError(t, err) + + _, err = service.GetWorkloadIdentity(ctx, "example") + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) + t.Run("not found", func(t *testing.T) { + err := service.DeleteWorkloadIdentity(ctx, "foo.example.com") + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) +} + +func TestWorkloadIdentityService_DeleteAllWorkloadIdentities(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + _, err := service.CreateWorkloadIdentity( + ctx, + newValidWorkloadIdentity("1"), + ) + require.NoError(t, err) + _, err = service.CreateWorkloadIdentity( + ctx, + newValidWorkloadIdentity("2"), + ) + require.NoError(t, err) + + page, _, err := service.ListWorkloadIdentities(ctx, 0, "") + require.NoError(t, err) + require.Len(t, page, 2) + + err = service.DeleteAllWorkloadIdentities(ctx) + require.NoError(t, err) + + page, _, err = service.ListWorkloadIdentities(ctx, 0, "") + require.NoError(t, err) + require.Empty(t, page) +} + +func TestWorkloadIdentityService_UpdateWorkloadIdentity(t *testing.T) { + ctx, service := setupWorkloadIdentityServiceTest(t) + + t.Run("ok", func(t *testing.T) { + // Create first to support updating + toCreate := newValidWorkloadIdentity("example") + got, err := service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(toCreate).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + require.NotEmpty(t, got.Metadata.Revision) + got.Spec.Spiffe.Id = "/changed" + got2, err := service.UpdateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(got).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + require.NotEmpty(t, got2.Metadata.Revision) + require.Empty(t, cmp.Diff( + got, + got2, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + )) + }) + t.Run("validation occurs", func(t *testing.T) { + // Create first to support updating + toCreate := newValidWorkloadIdentity("example2") + got, err := service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(toCreate).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + require.NotEmpty(t, got.Metadata.Revision) + got.Spec.Spiffe.Id = "" + got2, err := service.UpdateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(got).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.ErrorContains(t, err, "spec.spiffe.id: is required") + require.Nil(t, got2) + }) + t.Run("cond update blocks", func(t *testing.T) { + toCreate := newValidWorkloadIdentity("example4") + got, err := service.CreateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(toCreate).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + // We'll now update it twice, but on the second update, we will use the + // revision from the creation not the second update. + _, err = service.UpdateWorkloadIdentity( + ctx, + proto.Clone(got).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.NoError(t, err) + _, err = service.UpdateWorkloadIdentity( + ctx, + proto.Clone(got).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.ErrorIs(t, err, backend.ErrIncorrectRevision) + }) + t.Run("no upsert", func(t *testing.T) { + toUpdate := newValidWorkloadIdentity("example3") + _, err := service.UpdateWorkloadIdentity( + ctx, + // Clone to avoid Marshaling modifying want + proto.Clone(toUpdate).(*workloadidentityv1pb.WorkloadIdentity), + ) + require.Error(t, err) + }) +} diff --git a/lib/services/presets.go b/lib/services/presets.go index 6af90e02110c4..887545d164cf6 100644 --- a/lib/services/presets.go +++ b/lib/services/presets.go @@ -117,9 +117,16 @@ func NewPresetEditorRole() types.Role { Options: types.RoleOptions{ CertificateFormat: constants.CertificateFormatStandard, MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), - PortForwarding: types.NewBoolOption(true), - ForwardAgent: types.NewBool(true), - BPF: apidefaults.EnhancedEvents(), + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{ + Enabled: types.NewBoolOption(true), + }, + Local: &types.SSHLocalPortForwarding{ + Enabled: types.NewBoolOption(true), + }, + }, + ForwardAgent: types.NewBool(true), + BPF: apidefaults.EnhancedEvents(), RecordSession: &types.RecordSession{ Desktop: types.NewBoolOption(false), }, @@ -184,6 +191,7 @@ func NewPresetEditorRole() types.Role { types.NewRule(types.KindUserTask, RW()), types.NewRule(types.KindIdentityCenter, RW()), types.NewRule(types.KindContact, RW()), + types.NewRule(types.KindWorkloadIdentity, RW()), }, }, }, @@ -209,10 +217,17 @@ func NewPresetAccessRole() types.Role { Options: types.RoleOptions{ CertificateFormat: constants.CertificateFormatStandard, MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), - PortForwarding: types.NewBoolOption(true), - ForwardAgent: types.NewBool(true), - BPF: apidefaults.EnhancedEvents(), - RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, + SSHPortForwarding: &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{ + Enabled: types.NewBoolOption(true), + }, + Local: &types.SSHLocalPortForwarding{ + Enabled: types.NewBoolOption(true), + }, + }, + ForwardAgent: types.NewBool(true), + BPF: apidefaults.EnhancedEvents(), + RecordSession: &types.RecordSession{Desktop: types.NewBoolOption(true)}, }, Allow: types.RoleConditions{ Namespaces: []string{apidefaults.Namespace}, @@ -614,6 +629,7 @@ func NewPresetTerraformProviderRole() types.Role { types.KindInstaller, types.KindAccessMonitoringRule, types.KindStaticHostUser, + types.KindWorkloadIdentity, }, Verbs: RW(), }, diff --git a/lib/services/resource.go b/lib/services/resource.go index d2fba666fa6fd..4ba89f2527078 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -245,6 +245,8 @@ func ParseShortcut(in string) (string, error) { return types.KindAccessGraphSettings, nil case types.KindSPIFFEFederation, types.KindSPIFFEFederation + "s": return types.KindSPIFFEFederation, nil + case types.KindWorkloadIdentity, types.KindWorkloadIdentity + "s", "workload_identities", "workloadidentity", "workloadidentities", "workloadidentitys": + return types.KindWorkloadIdentity, nil case types.KindStaticHostUser, types.KindStaticHostUser + "s", "host_user", "host_users": return types.KindStaticHostUser, nil case types.KindUserTask, types.KindUserTask + "s": diff --git a/lib/services/role.go b/lib/services/role.go index ad3ea438c2b51..eaf951c518d16 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -133,9 +133,6 @@ func NewImplicitRole() types.Role { Spec: types.RoleSpecV6{ Options: types.RoleOptions{ MaxSessionTTL: types.MaxDuration(), - // Explicitly disable options that default to true, otherwise the option - // will always be enabled, as this implicit role is part of every role set. - PortForwarding: types.NewBoolOption(false), RecordSession: &types.RecordSession{ Desktop: types.NewBoolOption(false), }, @@ -251,7 +248,7 @@ func withWarningReporter(f func(error)) validateRoleOption { } } -// ValidateRole parses validates the role, and sets default values. +// ValidateRole parses, validates, and sets default values on a role. func ValidateRole(r types.Role, opts ...validateRoleOption) error { options := defaultValidateRoleOptions() for _, opt := range opts { @@ -2848,14 +2845,93 @@ func (set RoleSet) CanForwardAgents() bool { return false } -// CanPortForward returns true if a role in the RoleSet allows port forwarding. -func (set RoleSet) CanPortForward() bool { +// SSHPortForwardMode enumerates the possible SSH port forwarding modes available at a given time. +type SSHPortForwardMode int + +const ( + // SSHPortForwardModeOn is the default mode, both remote and local port forwarding is allowed + SSHPortForwardModeOn SSHPortForwardMode = iota + // SSHPortForwardModeOff disallows any port forwarding. + SSHPortForwardModeOff + // SSHPortForwardModeRemote allows remote port forwarding. + SSHPortForwardModeRemote + // SSHPortForwardModeLocal allows local port forwarding. + SSHPortForwardModeLocal +) + +// String implements the Stringer interface for SSHPortForwardMode +func (m SSHPortForwardMode) String() string { + switch m { + case SSHPortForwardModeOff: + return "off" + case SSHPortForwardModeLocal: + return "local" + case SSHPortForwardModeRemote: + return "remote" + default: + return "on" + } +} + +// SSHPortForwardMode returns the SSHPortForwardMode permitted by a RoleSet. Port forwarding is implicitly allowed, but explicit denies take +// precedence of explicit allows when using SSHPortForwarding. The legacy PortForwarding field prefers explicit allows for backwards +// compatibility reasons, but is only evaluated in the absence of an SSHPortForwarding config on the same role. +func (set RoleSet) SSHPortForwardMode() SSHPortForwardMode { + var denyRemote, denyLocal, legacyDeny bool + legacyCanDeny := true + for _, role := range set { - if types.BoolDefaultTrue(role.GetOptions().PortForwarding) { - return true + config := role.GetOptions().SSHPortForwarding + // only consider legacy allows when config isn't provided on the same role + if config == nil { + //nolint:staticcheck // this field is preserved for backwards compatibility, but shouldn't be used going forward + if legacy := role.GetOptions().PortForwarding; legacy != nil { + if legacy.Value { + return SSHPortForwardModeOn + } + legacyDeny = true + } + + continue + } + + if config.Remote != nil && config.Remote.Enabled != nil { + if !config.Remote.Enabled.Value { + denyRemote = true + } + + // an explicit legacy deny is only possible if no explicit SSHPortForwarding config has been provided + legacyCanDeny = false + } + + if config.Local != nil && config.Local.Enabled != nil { + if !config.Local.Enabled.Value { + denyLocal = true + } + + // an explicit legacy deny is only possible if no explicit SSHPortForwarding config has been provided + legacyCanDeny = false } } - return false + + // enforcing implicit allow and preferring allow over explicit deny + switch { + case denyRemote && denyLocal: + return SSHPortForwardModeOff + case legacyDeny && legacyCanDeny: + return SSHPortForwardModeOff + case denyRemote: + return SSHPortForwardModeLocal + case denyLocal: + return SSHPortForwardModeRemote + default: + return SSHPortForwardModeOn + } +} + +// CanPortForward returns true if the RoleSet allows both local and remote port forwarding. +func (set RoleSet) CanPortForward() bool { + return set.SSHPortForwardMode() == SSHPortForwardModeOn } // RecordDesktopSession returns true if the role set has enabled desktop diff --git a/lib/services/role_test.go b/lib/services/role_test.go index d474585e58cbf..6c86a86feecaf 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -267,7 +267,6 @@ func TestRoleParse(t *testing.T) { Options: types.RoleOptions{ CertificateFormat: constants.CertificateFormatStandard, MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), - PortForwarding: types.NewBoolOption(true), RecordSession: &types.RecordSession{ Default: constants.SessionRecordingModeBestEffort, Desktop: types.NewBoolOption(true), @@ -321,7 +320,6 @@ func TestRoleParse(t *testing.T) { Options: types.RoleOptions{ CertificateFormat: constants.CertificateFormatStandard, MaxSessionTTL: types.NewDuration(apidefaults.MaxCertDuration), - PortForwarding: types.NewBoolOption(true), RecordSession: &types.RecordSession{ Default: constants.SessionRecordingModeBestEffort, Desktop: types.NewBoolOption(true), diff --git a/lib/services/unified_resource.go b/lib/services/unified_resource.go index 31582e9dbc3ea..2cbb267caee22 100644 --- a/lib/services/unified_resource.go +++ b/lib/services/unified_resource.go @@ -20,7 +20,6 @@ package services import ( "context" - "maps" "strings" "sync" "time" @@ -1015,37 +1014,36 @@ func makePaginatedIdentityCenterAccount(resourceKind string, resource types.Reso } } - protoResource := &proto.PaginatedResource{ - Resource: &proto.PaginatedResource_AppServer{ - AppServer: &types.AppServerV3{ - Kind: types.KindAppServer, + appServer := &types.AppServerV3{ + Kind: types.KindAppServer, + Version: types.V3, + Metadata: resource.GetMetadata(), + Spec: types.AppServerSpecV3{ + App: &types.AppV3{ + Kind: types.KindApp, + SubKind: types.KindIdentityCenterAccount, Version: types.V3, - Metadata: resource.GetMetadata(), - Spec: types.AppServerSpecV3{ - App: &types.AppV3{ - Kind: types.KindApp, - SubKind: types.KindIdentityCenterAccount, - Version: types.V3, - Metadata: types.Metadata{ - Name: acct.Spec.Name, - Description: acct.Spec.Description, - Labels: maps.Clone(acct.Metadata.Labels), - }, - Spec: types.AppSpecV3{ - URI: acct.Spec.StartUrl, - PublicAddr: acct.Spec.StartUrl, - AWS: &types.AppAWS{ - ExternalID: acct.Spec.Id, - }, - IdentityCenter: &types.AppIdentityCenter{ - AccountID: acct.Spec.Id, - PermissionSets: pss, - }, - }, + Metadata: types.Metadata153ToLegacy(acct.Metadata), + Spec: types.AppSpecV3{ + URI: acct.Spec.StartUrl, + PublicAddr: acct.Spec.StartUrl, + AWS: &types.AppAWS{ + ExternalID: acct.Spec.Id, + }, + IdentityCenter: &types.AppIdentityCenter{ + AccountID: acct.Spec.Id, + PermissionSets: pss, }, }, }, }, + } + appServer.Metadata.Description = acct.Spec.Name + + protoResource := &proto.PaginatedResource{ + Resource: &proto.PaginatedResource_AppServer{ + AppServer: appServer, + }, RequiresRequest: requiresRequest, } diff --git a/lib/services/workload_identity.go b/lib/services/workload_identity.go new file mode 100644 index 0000000000000..89b87ba0d2473 --- /dev/null +++ b/lib/services/workload_identity.go @@ -0,0 +1,122 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package services + +import ( + "context" + "strings" + + "github.com/gravitational/trace" + + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" +) + +// WorkloadIdentities is an interface over the WorkloadIdentities service. This +// interface may also be implemented by a client to allow remote and local +// consumers to access the resource in a similar way. +type WorkloadIdentities interface { + // GetWorkloadIdentity gets a SPIFFE Federation by name. + GetWorkloadIdentity( + ctx context.Context, name string, + ) (*workloadidentityv1pb.WorkloadIdentity, error) + // ListWorkloadIdentities lists all WorkloadIdentities using Google style + // pagination. + ListWorkloadIdentities( + ctx context.Context, pageSize int, lastToken string, + ) ([]*workloadidentityv1pb.WorkloadIdentity, string, error) + // CreateWorkloadIdentity creates a new WorkloadIdentity. + CreateWorkloadIdentity( + ctx context.Context, workloadIdentity *workloadidentityv1pb.WorkloadIdentity, + ) (*workloadidentityv1pb.WorkloadIdentity, error) + // DeleteWorkloadIdentity deletes a SPIFFE Federation by name. + DeleteWorkloadIdentity(ctx context.Context, name string) error + // UpdateWorkloadIdentity updates a specific WorkloadIdentity. The resource must + // already exist, and, condition update semantics are used - e.g the submitted + // resource must have a revision matching the revision of the resource in the + // backend. + UpdateWorkloadIdentity( + ctx context.Context, workloadIdentity *workloadidentityv1pb.WorkloadIdentity, + ) (*workloadidentityv1pb.WorkloadIdentity, error) + // UpsertWorkloadIdentity creates or updates a WorkloadIdentity. + UpsertWorkloadIdentity( + ctx context.Context, workloadIdentity *workloadidentityv1pb.WorkloadIdentity, + ) (*workloadidentityv1pb.WorkloadIdentity, error) +} + +// MarshalWorkloadIdentity marshals the WorkloadIdentity object into a JSON byte +// array. +func MarshalWorkloadIdentity( + object *workloadidentityv1pb.WorkloadIdentity, opts ...MarshalOption, +) ([]byte, error) { + return MarshalProtoResource(object, opts...) +} + +// UnmarshalWorkloadIdentity unmarshals the WorkloadIdentity object from a +// JSON byte array. +func UnmarshalWorkloadIdentity( + data []byte, opts ...MarshalOption, +) (*workloadidentityv1pb.WorkloadIdentity, error) { + return UnmarshalProtoResource[*workloadidentityv1pb.WorkloadIdentity](data, opts...) +} + +// ValidateWorkloadIdentity validates the WorkloadIdentity object. This is +// performed prior to writing to the backend. +func ValidateWorkloadIdentity(s *workloadidentityv1pb.WorkloadIdentity) error { + switch { + case s == nil: + return trace.BadParameter("object cannot be nil") + case s.Version != types.V1: + return trace.BadParameter("version: only %q is supported", types.V1) + case s.Kind != types.KindWorkloadIdentity: + return trace.BadParameter("kind: must be %q", types.KindWorkloadIdentity) + case s.Metadata == nil: + return trace.BadParameter("metadata: is required") + case s.Metadata.Name == "": + return trace.BadParameter("metadata.name: is required") + case s.Spec == nil: + return trace.BadParameter("spec: is required") + case s.Spec.Spiffe.Id == "": + return trace.BadParameter("spec.spiffe.id: is required") + case !strings.HasPrefix(s.Spec.Spiffe.Id, "/"): + return trace.BadParameter("spec.spiffe.id: must start with a /") + } + + for i, rule := range s.GetSpec().GetRules().GetAllow() { + if len(rule.Conditions) == 0 { + return trace.BadParameter("spec.rules.allow[%d].conditions: must be non-empty", i) + } + for j, condition := range rule.Conditions { + if condition.Attribute == "" { + return trace.BadParameter("spec.rules.allow[%d].conditions[%d].attribute: must be non-empty", i, j) + } + // Ensure exactly one operator is set. + operatorsSet := 0 + if condition.Equals != "" { + operatorsSet++ + } + if operatorsSet == 0 || operatorsSet > 1 { + return trace.BadParameter( + "spec.rules.allow[%d].conditions[%d]: exactly one operator must be specified, found %d", + i, j, operatorsSet, + ) + } + } + } + + return nil +} diff --git a/lib/services/workload_identity_test.go b/lib/services/workload_identity_test.go new file mode 100644 index 0000000000000..429612ed48555 --- /dev/null +++ b/lib/services/workload_identity_test.go @@ -0,0 +1,231 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package services + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" +) + +func TestWorkloadIdentityMarshaling(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + in *workloadidentityv1pb.WorkloadIdentity + }{ + { + name: "normal", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + gotBytes, err := MarshalWorkloadIdentity(tc.in) + require.NoError(t, err) + // Test that unmarshaling gives us the same object + got, err := UnmarshalWorkloadIdentity(gotBytes) + require.NoError(t, err) + require.Empty(t, cmp.Diff(tc.in, got, protocmp.Transform())) + }) + } +} + +func TestValidateWorkloadIdentity(t *testing.T) { + t.Parallel() + + var errContains = func(contains string) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.ErrorContains(t, err, contains, msgAndArgs...) + } + } + + testCases := []struct { + name string + in *workloadidentityv1pb.WorkloadIdentity + requireErr require.ErrorAssertionFunc + }{ + { + name: "success - full", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Rules: &workloadidentityv1pb.WorkloadIdentityRules{ + Allow: []*workloadidentityv1pb.WorkloadIdentityRule{ + { + Conditions: []*workloadidentityv1pb.WorkloadIdentityCondition{ + { + Attribute: "example", + Equals: "foo", + }, + }, + }, + }, + }, + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + requireErr: require.NoError, + }, + { + name: "success - minimal", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + requireErr: require.NoError, + }, + { + name: "missing name", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{}, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + requireErr: errContains("metadata.name: is required"), + }, + { + name: "missing spiffe id", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{}, + }, + }, + requireErr: errContains("spec.spiffe.id: is required"), + }, + { + name: "spiffe id must have leading /", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "example", + }, + }, + }, + requireErr: errContains("spec.spiffe.id: must start with a /"), + }, + { + name: "missing attribute", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Rules: &workloadidentityv1pb.WorkloadIdentityRules{ + Allow: []*workloadidentityv1pb.WorkloadIdentityRule{ + { + Conditions: []*workloadidentityv1pb.WorkloadIdentityCondition{ + { + Attribute: "", + Equals: "foo", + }, + }, + }, + }, + }, + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + requireErr: errContains("spec.rules.allow[0].conditions[0].attribute: must be non-empty"), + }, + { + name: "missing operator", + in: &workloadidentityv1pb.WorkloadIdentity{ + Kind: types.KindWorkloadIdentity, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "example", + }, + Spec: &workloadidentityv1pb.WorkloadIdentitySpec{ + Rules: &workloadidentityv1pb.WorkloadIdentityRules{ + Allow: []*workloadidentityv1pb.WorkloadIdentityRule{ + { + Conditions: []*workloadidentityv1pb.WorkloadIdentityCondition{ + { + Attribute: "example", + }, + }, + }, + }, + }, + Spiffe: &workloadidentityv1pb.WorkloadIdentitySPIFFE{ + Id: "/example", + }, + }, + }, + requireErr: errContains("spec.rules.allow[0].conditions[0]: exactly one operator must be specified, found 0"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := ValidateWorkloadIdentity(tc.in) + tc.requireErr(t, err) + }) + } +} diff --git a/lib/srv/authhandlers.go b/lib/srv/authhandlers.go index d80f5704acfe4..eed3b37c0a53f 100644 --- a/lib/srv/authhandlers.go +++ b/lib/srv/authhandlers.go @@ -262,8 +262,13 @@ func (h *AuthHandlers) CheckFileCopying(ctx *ServerContext) error { } // CheckPortForward checks if port forwarding is allowed for the users RoleSet. -func (h *AuthHandlers) CheckPortForward(addr string, ctx *ServerContext) error { - if ok := ctx.Identity.AccessChecker.CanPortForward(); !ok { +func (h *AuthHandlers) CheckPortForward(addr string, ctx *ServerContext, requestedMode services.SSHPortForwardMode) error { + allowedMode := ctx.Identity.AccessChecker.SSHPortForwardMode() + if allowedMode == services.SSHPortForwardModeOn { + return nil + } + + if allowedMode == services.SSHPortForwardModeOff || allowedMode != requestedMode { systemErrorMessage := fmt.Sprintf("port forwarding not allowed by role set: %v", ctx.Identity.AccessChecker.RoleNames()) userErrorMessage := "port forwarding not allowed" diff --git a/lib/srv/desktop/rdp/rdpclient/Cargo.toml b/lib/srv/desktop/rdp/rdpclient/Cargo.toml index ed092859f5c42..7b3eba0019872 100644 --- a/lib/srv/desktop/rdp/rdpclient/Cargo.toml +++ b/lib/srv/desktop/rdp/rdpclient/Cargo.toml @@ -10,12 +10,13 @@ crate-type = ["staticlib"] [dependencies] bitflags = "2.5.0" -boring = { git = "https://github.com/gravitational/boring", rev="99897308abb5976ea05625b8314c24b16eebb01b", optional = true } +boring = { git = "https://github.com/gravitational/boring", rev = "99897308abb5976ea05625b8314c24b16eebb01b", optional = true } byteorder = "1.5.0" -bytes = "1.7.2" +bytes = "1.9.0" env_logger = "0.11.5" ironrdp-cliprdr.workspace = true ironrdp-connector.workspace = true +ironrdp-core.workspace = true ironrdp-pdu.workspace = true ironrdp-rdpdr.workspace = true ironrdp-rdpsnd.workspace = true @@ -25,28 +26,29 @@ ironrdp-dvc.workspace = true ironrdp-displaycontrol.workspace = true ironrdp-tls.workspace = true ironrdp-tokio.workspace = true -iso7816 = "0.1.2" +iso7816 = "0.1.3" iso7816-tlv = "0.4.4" log = "0.4.22" parking_lot = "0.12.3" rand = { version = "0.8.5", features = ["getrandom"] } rand_chacha = "0.3.1" -rsa = "0.9.6" -sspi = { version = "0.13.0", features = ["network_client"] } -tokio = { version = "1.40", features = ["full"] } -tokio-boring = { git = "https://github.com/gravitational/boring", rev="99897308abb5976ea05625b8314c24b16eebb01b", optional = true } +rsa = "0.9.7" +sspi = { version = "0.15.0", features = ["network_client"] } +tokio = { version = "1.42", features = ["full"] } +tokio-boring = { git = "https://github.com/gravitational/boring", rev = "99897308abb5976ea05625b8314c24b16eebb01b", optional = true } utf16string = "0.2.0" -uuid = { version = "1.10.0", features = ["v4"] } -url = "2.5.0" -picky = { version = "7.0.0-rc.9", default-features = false } -picky-asn1-der = "0.5.0" -picky-asn1-x509 = "0.13.0" +uuid = { version = "1.11.0", features = ["v4"] } +url = "2.5.4" +picky = { version = "7.0.0-rc.11", default-features = false } +picky-asn1-der = "0.5.1" +picky-asn1-x509 = "0.14.1" +picky-krb = "0.9.2" reqwest = { version = "0.12", default-features = false } -rustls = { version = "0.23.18", default-features = false, features = ["aws-lc-rs"] } +rustls = { version = "0.23.19", default-features = false, features = ["aws-lc-rs"] } [build-dependencies] cbindgen = "0.27.0" -tempfile = "3.13.0" +tempfile = "3.14.0" [features] fips = ["tokio-boring/fips", "boring/fips"] diff --git a/lib/srv/desktop/rdp/rdpclient/src/client.rs b/lib/srv/desktop/rdp/rdpclient/src/client.rs index 6ee16f0b16624..d4e010c8e1fa9 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/client.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/client.rs @@ -31,6 +31,8 @@ use ironrdp_connector::credssp::KerberosConfig; use ironrdp_connector::{ Config, ConnectorError, ConnectorErrorKind, Credentials, DesktopSize, SmartCardIdentity, }; +use ironrdp_core::{encode_vec, EncodeError}; +use ironrdp_core::{function, WriteBuf}; use ironrdp_displaycontrol::client::DisplayControlClient; use ironrdp_displaycontrol::pdu::{ DisplayControlMonitorLayout, DisplayControlPdu, MonitorLayoutEntry, @@ -42,22 +44,21 @@ use ironrdp_pdu::input::fast_path::{ }; use ironrdp_pdu::input::mouse::PointerFlags; use ironrdp_pdu::input::{InputEventError, MousePdu}; -use ironrdp_pdu::mcs::DisconnectReason; use ironrdp_pdu::rdp::capability_sets::MajorPlatformType; use ironrdp_pdu::rdp::client_info::PerformanceFlags; use ironrdp_pdu::rdp::RdpError; -use ironrdp_pdu::write_buf::WriteBuf; +use ironrdp_pdu::PduError; use ironrdp_pdu::PduResult; -use ironrdp_pdu::{custom_err, function, PduError}; +use ironrdp_pdu::{encode_err, pdu_other_err}; use ironrdp_rdpdr::pdu::efs::ClientDeviceListAnnounce; use ironrdp_rdpdr::pdu::RdpdrPdu; use ironrdp_rdpdr::Rdpdr; use ironrdp_rdpsnd::client::{NoopRdpsndBackend, Rdpsnd}; -use ironrdp_session::x224::{self, ProcessorOutput}; +use ironrdp_session::x224::{self, DisconnectDescription, ProcessorOutput}; use ironrdp_session::SessionErrorKind::Reason; use ironrdp_session::{reason_err, SessionError, SessionResult}; use ironrdp_svc::{SvcMessage, SvcProcessor, SvcProcessorMessages}; -use ironrdp_tokio::{single_sequence_step_read, Framed, TokioStream}; +use ironrdp_tokio::{single_sequence_step_read, Framed, FramedWrite, TokioStream}; use log::debug; use rand::{Rng, SeedableRng}; use std::error::Error; @@ -113,7 +114,7 @@ impl Client { pub fn run( cgo_handle: CgoHandle, params: ConnectParams, - ) -> ClientResult> { + ) -> ClientResult> { global::TOKIO_RT.block_on(async { Self::connect(cgo_handle, params) .await? @@ -280,7 +281,7 @@ impl Client { /// which it then executes. /// /// When either loop returns, the other is aborted and the result is returned. - async fn run_loops(mut self) -> ClientResult> { + async fn run_loops(mut self) -> ClientResult> { let read_stream = self .read_stream .take() @@ -335,7 +336,7 @@ impl Client { mut read_stream: RdpReadStream, x224_processor: Arc>, write_requester: ClientHandle, - ) -> tokio::task::JoinHandle>> { + ) -> tokio::task::JoinHandle>> { global::TOKIO_RT.spawn(async move { loop { let (action, mut frame) = read_stream.read_pdu().await?; @@ -375,6 +376,7 @@ impl Client { &mut read_stream, sequence.as_mut(), &mut buf, + None, ) .await?; @@ -518,7 +520,7 @@ impl Client { debug!("DisplayControlClient channel opened"); // We've been notified that the DisplayControl dvc channel has been opened: let mut pending_resize = - Self::resize_manager_lock(pending_resize).map_err(|err| custom_err!(err))?; + Self::resize_manager_lock(pending_resize).map_err(ClientError::from)?; let pending_resize = pending_resize.pending_resize.take(); if let Some((width, height)) = pending_resize { // If there was a resize pending, perform it now. @@ -531,7 +533,8 @@ impl Client { height, None, Some((width, height)), - )? + ) + .map_err(|e| encode_err!(e))? .into(); return Ok(vec![Box::new(pdu)]); } @@ -683,7 +686,7 @@ impl Client { event: FastPathInputEvent, ) -> ClientResult<()> { write_stream - .write_all(&ironrdp_pdu::encode_vec(&FastPathInput(vec![event]))?) + .write_all(&encode_vec(&FastPathInput(vec![event]))?) .await?; Ok(()) } @@ -1406,15 +1409,12 @@ fn create_config(params: &ConnectParams, pin: String) -> Config { enable_tls: true, enable_credssp: params.ad && params.nla, credentials: Credentials::SmartCard { - config: params.ad.then(|| { - SmartCardIdentity { - csp_name: "Microsoft Base Smart Card Crypto Provider".to_string(), - reader_name: "Teleport".to_string(), - container_name: "".to_string(), - certificate: params.cert_der.clone(), - private_key: params.key_der.clone(), - } - .into() + config: params.ad.then(|| SmartCardIdentity { + csp_name: "Microsoft Base Smart Card Crypto Provider".to_string(), + reader_name: "Teleport".to_string(), + container_name: "".to_string(), + certificate: params.cert_der.clone(), + private_key: params.key_der.clone(), }), pin, }, @@ -1442,6 +1442,7 @@ fn create_config(params: &ConnectParams, pin: String) -> Config { platform: MajorPlatformType::UNSPECIFIED, no_server_pointer: false, autologon: true, + request_data: None, pointer_software_rendering: false, performance_flags: PerformanceFlags::default() | PerformanceFlags::DISABLE_CURSOR_SHADOW // this is required for pointer to work correctly in Windows 2019 @@ -1474,6 +1475,7 @@ pub struct ConnectParams { pub enum ClientError { Tcp(IoError), Rdp(RdpError), + EncodeError(EncodeError), PduError(PduError), SessionError(SessionError), ConnectorError(ConnectorError), @@ -1523,6 +1525,7 @@ impl Display for ClientError { ClientError::SendError(msg) => Display::fmt(&msg.to_string(), f), ClientError::InternalError(msg) => Display::fmt(&msg.to_string(), f), ClientError::UnknownAddress => Display::fmt("Unknown address", f), + ClientError::EncodeError(e) => Display::fmt(e, f), ClientError::PduError(e) => Display::fmt(e, f), ClientError::UrlError(e) => Display::fmt(e, f), #[cfg(feature = "fips")] @@ -1575,6 +1578,12 @@ impl From for ClientError { } } +impl From for ClientError { + fn from(e: EncodeError) -> Self { + ClientError::EncodeError(e) + } +} + impl From for ClientError { fn from(e: PduError) -> Self { ClientError::PduError(e) @@ -1583,7 +1592,7 @@ impl From for ClientError { impl From for PduError { fn from(e: ClientError) -> Self { - custom_err!(e) + pdu_other_err!("", source:e) } } diff --git a/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs b/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs index 9d7e2b699af1c..70b105da84be8 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/cliprdr.rs @@ -22,8 +22,8 @@ use ironrdp_cliprdr::pdu::{ FileContentsResponse, FormatDataRequest, FormatDataResponse, LockDataId, }; use ironrdp_cliprdr::{Client, CliprdrClient as Cliprdr, CliprdrSvcMessages}; +use ironrdp_core::impl_as_any; use ironrdp_pdu::PduResult; -use ironrdp_svc::impl_as_any; use log::{debug, error, info, trace, warn}; use std::fmt::{Debug, Formatter}; diff --git a/lib/srv/desktop/rdp/rdpclient/src/lib.rs b/lib/srv/desktop/rdp/rdpclient/src/lib.rs index 8b2ffb902a339..2c79722e73af0 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/lib.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/lib.rs @@ -28,6 +28,7 @@ use crate::client::global::get_client_handle; use crate::client::Client; use crate::rdpdr::tdp::SharedDirectoryAnnounce; use client::{ClientHandle, ClientResult, ConnectParams}; +use ironrdp_session::x224::DisconnectDescription; use log::{error, trace, warn}; use rdpdr::path::UnixPath; use rdpdr::tdp::{ @@ -125,9 +126,16 @@ pub unsafe extern "C" fn client_run(cgo_handle: CgoHandle, params: CGOConnectPar Ok(res) => CGOResult { err_code: CGOErrCode::ErrCodeSuccess, message: match res { - Some(reason) => CString::new(reason.description().to_string()) - .map(|c| c.into_raw()) - .unwrap_or(ptr::null_mut()), + Some(DisconnectDescription::McsDisconnect(reason)) => { + CString::new(reason.description().to_string()) + .map(|c| c.into_raw()) + .unwrap_or(ptr::null_mut()) + } + Some(DisconnectDescription::ErrorInfo(info)) => { + CString::new(info.description().to_string()) + .map(|c| c.into_raw()) + .unwrap_or(ptr::null_mut()) + } None => ptr::null_mut(), }, }, diff --git a/lib/srv/desktop/rdp/rdpclient/src/piv.rs b/lib/srv/desktop/rdp/rdpclient/src/piv.rs index 8c7b2e4a10ac5..29a2c02a5daab 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/piv.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/piv.rs @@ -15,7 +15,7 @@ // along with this program. If not, see . use crate::rdpdr::TeleportRdpdrBackendError; -use ironrdp_pdu::{custom_err, other_err, PduResult}; +use ironrdp_pdu::{pdu_other_err, PduResult}; use iso7816::aid::Aid; use iso7816::command::instruction::Instruction; use iso7816::command::Command; @@ -58,7 +58,7 @@ pub struct Card { impl Card { pub fn new(uuid: Uuid, cert_der: &[u8], key_der: &[u8], pin: String) -> PduResult { let piv_auth_key = RsaPrivateKey::from_pkcs1_der(key_der) - .map_err(|_e| other_err!("failed to parse private key from DER"))?; + .map_err(|_e| pdu_other_err!("failed to parse private key from DER"))?; Ok(Self { chuid: Self::build_chuid(uuid), @@ -79,7 +79,7 @@ impl Card { None => cmd, Some(pending) => { pending.extend_from_command(&cmd).map_err(|e| { - custom_err!(TeleportRdpdrBackendError(format!( + pdu_other_err!("", source: TeleportRdpdrBackendError(format!( "could not build chained command: {e:?}" ))) })?; @@ -158,8 +158,9 @@ impl Card { if cmd.p1 != 0x3F && cmd.p2 != 0xFF { return Ok(Response::new(Status::NotFound)); } - let request_tlv = Tlv::from_bytes(cmd.data()) - .map_err(|e| custom_err!(TeleportRdpdrBackendError(format!("TLV invalid: {e:?}"))))?; + let request_tlv = Tlv::from_bytes(cmd.data()).map_err( + |e| pdu_other_err!("", source:TeleportRdpdrBackendError(format!("TLV invalid: {e:?}"))), + )?; if *request_tlv.tag() != tlv_tag(0x5C)? { return Ok(Response::new(Status::NotFound)); } @@ -189,7 +190,9 @@ impl Card { None => Ok(Response::new(Status::NotFound)), Some(cursor) => { let mut chunk = [0; CHUNK_SIZE]; - let n = cursor.read(&mut chunk).map_err(|e| custom_err!(e))?; + let n = cursor + .read(&mut chunk) + .map_err(|e| pdu_other_err!("", source:e))?; let mut chunk = chunk.to_vec(); chunk.truncate(n); let remaining = cursor.get_ref().len() as u64 - cursor.position(); @@ -237,23 +240,24 @@ impl Card { // https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-78-4.pdf // TODO(zmb3): support non-RSA keys, if needed. if cmd.p1 != 0x07 { - return Err(custom_err!(TeleportRdpdrBackendError(format!( + return Err(pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "unsupported algorithm identifier P1:{:#X} in general authenticate command", cmd.p1 )))); } // P2='9A' means PIV Authentication Key (matches our cert '5FC105' in handle_get_data). if cmd.p2 != 0x9A { - return Err(custom_err!(TeleportRdpdrBackendError(format!( + return Err(pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "unsupported key reference P2:{:#X} in general authenticate command", cmd.p2 )))); } - let request_tlv = Tlv::from_bytes(cmd.data()) - .map_err(|e| custom_err!(TeleportRdpdrBackendError(format!("TLV invalid: {e:?}"))))?; + let request_tlv = Tlv::from_bytes(cmd.data()).map_err( + |e| pdu_other_err!("", source:TeleportRdpdrBackendError(format!("TLV invalid: {e:?}"))), + )?; if *request_tlv.tag() != tlv_tag(TLV_TAG_DYNAMIC_AUTHENTICATION_TEMPLATE)? { - return Err(custom_err!(TeleportRdpdrBackendError(format!( + return Err(pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "general authenticate command TLV invalid: {request_tlv:?}" )))); } @@ -261,7 +265,7 @@ impl Card { // Extract the challenge field. let request_tlvs = match request_tlv.value() { Value::Primitive(_) => { - return Err(custom_err!(TeleportRdpdrBackendError(format!( + return Err(pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "general authenticate command TLV invalid: {request_tlv:?}" )))); } @@ -275,14 +279,14 @@ impl Card { challenge = match data.value() { Value::Primitive(chal) => Some(chal), Value::Constructed(_) => { - return Err(custom_err!(TeleportRdpdrBackendError(format!( + return Err(pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "general authenticate command TLV invalid: {request_tlv:?}" )))); } }; } let challenge = challenge.ok_or_else(|| { - custom_err!(TeleportRdpdrBackendError(format!( + pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "general authenticate command TLV invalid: {request_tlv:?}, missing challenge data" ))) })?; @@ -407,7 +411,7 @@ const TLV_TAG_RESPONSE: u8 = 0x82; fn tlv(tag: u8, value: Value) -> PduResult { Tlv::new(tlv_tag(tag)?, value).map_err(|e| { - custom_err!(TeleportRdpdrBackendError(format!( + pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "TLV with tag {tag:#X} invalid: {e:?}" ))) }) @@ -415,7 +419,7 @@ fn tlv(tag: u8, value: Value) -> PduResult { fn tlv_tag(val: u8) -> PduResult { Tag::try_from(val).map_err(|e| { - custom_err!(TeleportRdpdrBackendError(format!( + pdu_other_err!("", source:TeleportRdpdrBackendError(format!( "TLV tag {val:#X} invalid: {e:?}" ))) }) diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr.rs index 61b12da5547fd..bf6c2e7ff6d51 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr.rs @@ -28,13 +28,14 @@ use self::tdp::{ }; use crate::client::ClientHandle; use crate::CgoHandle; -use ironrdp_pdu::{custom_err, PduResult}; +use ironrdp_core::impl_as_any; +use ironrdp_pdu::{pdu_other_err, PduResult}; use ironrdp_rdpdr::pdu::efs::{ DeviceControlRequest, NtStatus, ServerDeviceAnnounceResponse, ServerDriveIoRequest, }; use ironrdp_rdpdr::pdu::esc::{ScardCall, ScardIoCtlCode}; use ironrdp_rdpdr::RdpdrBackend; -use ironrdp_svc::{impl_as_any, SvcMessage}; +use ironrdp_svc::SvcMessage; #[derive(Debug)] pub struct TeleportRdpdrBackend { @@ -56,10 +57,13 @@ impl RdpdrBackend for TeleportRdpdrBackend { // If the device announce for the smart card failed, return an error that will end the session. // Authentication is impossible without a smart card. if pdu.device_id == SCARD_DEVICE_ID && pdu.result_code != NtStatus::SUCCESS { - return Err(custom_err!(TeleportRdpdrBackendError(format!( - "ServerDeviceAnnounceResponse for smartcard failed with NtStatus: {:?}", - pdu.result_code - )))); + return Err(pdu_other_err!( + "", + source:TeleportRdpdrBackendError(format!( + "ServerDeviceAnnounceResponse for smartcard failed with NtStatus: {:?}", + pdu.result_code + )) + )); } // If the device announce is not for a smart card, assume it's for a directory @@ -87,9 +91,13 @@ impl RdpdrBackend for TeleportRdpdrBackend { self.fs.handle_rdp_drive_io_request(req)?; Ok(vec![]) } else { - Err(custom_err!(TeleportRdpdrBackendError( - "Received a directory sharing PDU but directory sharing is not enabled".to_string() - ))) + Err(pdu_other_err!( + "", + source:TeleportRdpdrBackendError( + "Received a directory sharing PDU but directory sharing is not enabled" + .to_string() + ) + )) } } } diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs index a954af5d0571e..422947f215190 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs @@ -18,13 +18,16 @@ use super::{ path::UnixPath, tdp::{self, TdpErrCode}, }; +use crate::client::{ClientError, ClientResult}; use crate::{ cgo_tdp_sd_acknowledge, cgo_tdp_sd_create_request, cgo_tdp_sd_delete_request, cgo_tdp_sd_info_request, cgo_tdp_sd_list_request, cgo_tdp_sd_move_request, cgo_tdp_sd_read_request, cgo_tdp_sd_truncate_request, cgo_tdp_sd_write_request, client::ClientHandle, CGOErrCode, CgoHandle, }; -use ironrdp_pdu::{cast_length, custom_err, other_err, PduResult}; +use ironrdp_core::{cast_length, EncodeError}; +use ironrdp_pdu::PduResult; +use ironrdp_pdu::{pdu_other_err, PduError, PduErrorExt}; use ironrdp_rdpdr::pdu::{ self, efs::{self, NtStatus}, @@ -33,6 +36,17 @@ use ironrdp_rdpdr::pdu::{ use log::{debug, warn}; use std::collections::HashMap; use std::convert::TryInto; +use std::fmt::Debug; + +pub(crate) fn cast_length>( + ctx: &str, + field: &str, + s: S, +) -> ClientResult { + s.try_into().map_err(|e| { + ClientError::InternalError(format!("{}: can't convert {}: {:?}", ctx, field, e)) + }) +} /// `FilesystemBackend` implements the filesystem redirection backend as described in [\[MS-RDPEFS\]: Remote Desktop Protocol: File System Virtual Channel Extension]. /// It does so in concert with the TDP directory sharing extension described in [RFD 0067]. @@ -164,10 +178,13 @@ impl FilesystemBackend { ) -> PduResult<()> { match res.err_code { TdpErrCode::Failed | TdpErrCode::AlreadyExists => { - return Err(custom_err!(FilesystemBackendError(format!( - "received unexpected TDP error code in SharedDirectoryInfoResponse: {:?}", - res.err_code, - )))); + return Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received unexpected TDP error code in SharedDirectoryInfoResponse: {:?}", + res.err_code, + )) + )); } TdpErrCode::Nil => { // The file exists @@ -314,14 +331,17 @@ impl FilesystemBackend { } } _ => { - return Err(custom_err!(FilesystemBackendError(format!( - "received unknown CreateDisposition value for RDP {req:?}", - req = req - )))); + return Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received unknown CreateDisposition value for RDP {req:?}", + req = req + )) + )); } } - Err(other_err!( + Err(pdu_other_err!( "Programmer error, this line should never be reached" )) } @@ -364,9 +384,7 @@ impl FilesystemBackend { ), Some(dir) => { if dir.fso.file_type != tdp::FileType::Directory { - return Err(other_err!( - "received ServerDriveQueryDirectoryRequest request for a file rather than a directory", - )); + return Err(pdu_other_err!("received ServerDriveQueryDirectoryRequest request for a file rather than a directory")); } if rdp_req.initial_query == 0 { @@ -417,10 +435,13 @@ impl FilesystemBackend { // For now any error will kill the session. // In the future, we might want to make this send back // an NTSTATUS::STATUS_UNSUCCESSFUL instead. - return Err(custom_err!(FilesystemBackendError(format!( - "SharedDirectoryListRequest failed with err_code = {:?}", - tdp_resp.err_code - )))); + return Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "SharedDirectoryListRequest failed with err_code = {:?}", + tdp_resp.err_code + )) + )); } // If SharedDirectoryListRequest succeeded, move the @@ -455,10 +476,13 @@ impl FilesystemBackend { ) -> PduResult<()> { match self.file_cache.get(rdp_req.device_io_request.file_id) { // File not found in cache - None => Err(custom_err!(FilesystemBackendError(format!( - "failed to retrieve an item from the file cache with FileId = {}", - rdp_req.device_io_request.file_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "failed to retrieve an item from the file cache with FileId = {}", + rdp_req.device_io_request.file_id + )) + )), Some(dir) => { let buffer: Option = match rdp_req .fs_info_class_lvl @@ -470,7 +494,8 @@ impl FilesystemBackend { "FilesystemBackend::handle_query_volume_req", "dir.fso.last_modified", dir.fso.last_modified - )?, + ) + .map_err(|e: EncodeError| ClientError::from(e))?, // Equivalent to `u32::MAX & 0xffff` which is what FreeRDP does between // https://github.com/FreeRDP/FreeRDP/blob/511444a65e7aa2f537c5e531fa68157a50c1bd4d/winpr/libwinpr/file/file.c#L1018-L1021 // https://github.com/FreeRDP/FreeRDP/blob/511444a65e7aa2f537c5e531fa68157a50c1bd4d/channels/drive/client/drive_main.c#L492 @@ -618,10 +643,13 @@ impl FilesystemBackend { // https://github.com/FreeRDP/FreeRDP/blob/dfa231c0a55b005af775b833f92f6bcd30363d77/channels/drive/client/drive_file.c#L579 self.send_rdp_set_info_response(&rdp_req, io_status) } - _ => Err(custom_err!(FilesystemBackendError(format!( - "received unsupported FileInformationClass value for RDP {:?}", - rdp_req - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received unsupported FileInformationClass value for RDP {:?}", + rdp_req + )) + )), } } @@ -873,7 +901,7 @@ impl FilesystemBackend { completion_id: rdp_req.device_io_request.completion_id, directory_id: rdp_req.device_io_request.device_id, path: file.path.clone(), - end_of_file: cast_length!("end_of_file", end_of_file)?, + end_of_file: cast_length("tdp_sd_truncate", "end_of_file", end_of_file)?, })?; self.pending_sd_truncate_resp_handlers.insert( @@ -891,7 +919,8 @@ impl FilesystemBackend { this.file_cache.get_mut(rdp_req.device_io_request.file_id) { // Truncate succeeded, update our internal books to reflect the new size. - file.fso.size = cast_length!("end_of_file", end_of_file)?; + file.fso.size = + cast_length("tdp_sd_truncate", "end_of_file", end_of_file)?; io_status } else { // This shouldn't happen. @@ -960,10 +989,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_acknowledge(self.cgo_handle, &mut tdp_req) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_acknowledge failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_acknowledge failed: {:?}", + err + )) + )), } } @@ -974,10 +1006,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_info_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_info_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_info_request failed: {:?}", + err + )) + )), } } @@ -991,10 +1026,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_truncate_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_truncate_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_truncate_request failed: {:?}", + err + )) + )), } } @@ -1008,10 +1046,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_create_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_create_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_create_request failed: {:?}", + err + )) + )), } } @@ -1025,10 +1066,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_delete_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_delete_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_delete_request failed: {:?}", + err + )) + )), } } @@ -1039,10 +1083,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_list_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_list_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_list_request failed: {:?}", + err + )) + )), } } @@ -1053,10 +1100,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_read_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_read_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_read_request failed: {:?}", + err + )) + )), } } @@ -1070,10 +1120,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_write_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_write_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_write_request failed: {:?}", + err + )) + )), } } @@ -1084,10 +1137,13 @@ impl FilesystemBackend { let err = unsafe { cgo_tdp_sd_move_request(self.cgo_handle, req.cgo()) }; match err { CGOErrCode::ErrCodeSuccess => Ok(()), - _ => Err(custom_err!(FilesystemBackendError(format!( - "call to tdp_sd_move_request failed: {:?}", - err - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "call to tdp_sd_move_request failed: {:?}", + err + )) + )), } } @@ -1104,10 +1160,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1124,10 +1183,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1144,10 +1206,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1164,10 +1229,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1184,10 +1252,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1204,10 +1275,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1220,10 +1294,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1236,10 +1313,13 @@ impl FilesystemBackend { .remove(&tdp_resp.completion_id) { Some(handler) => handler.call(self, tdp_resp), - None => Err(custom_err!(FilesystemBackendError(format!( - "received invalid completion id: {}", - tdp_resp.completion_id - )))), + None => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received invalid completion id: {}", + tdp_resp.completion_id + )) + )), } } @@ -1266,7 +1346,7 @@ impl FilesystemBackend { { Ok(efs::Information::FILE_OVERWRITTEN) } else { - Err(other_err!( + Err(pdu_other_err!( "program error, CreateDispositionFlags check should be exhaustive" )) }?; @@ -1325,10 +1405,13 @@ impl FilesystemBackend { efs::FileInformationClassLevel::FILE_ATTRIBUTE_TAG_INFORMATION => { self.send_rdp_file_attr_tag_info(device_io_response, file) } - _ => Err(custom_err!(FilesystemBackendError(format!( - "received unsupported FileInformationClass: {:?}", - rdp_req.file_info_class_lvl - )))), + _ => Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received unsupported FileInformationClass: {:?}", + rdp_req.file_info_class_lvl + )) + )), } } @@ -1364,10 +1447,10 @@ impl FilesystemBackend { device_io_response: efs::DeviceIoResponse, file: &FileCacheObject, ) -> PduResult<()> { - let file_fso_size: i64 = cast_length!( + let file_fso_size: i64 = cast_length( "FilesystemBackend::send_file_standard_info", "file.fso.size", - file.fso.size + file.fso.size, )?; self.client_handle.write_rdpdr( @@ -1465,10 +1548,13 @@ impl FilesystemBackend { Some(efs::FileInformationClass::Directory(fso.into_directory()?)) } _ => { - return Err(custom_err!(FilesystemBackendError(format!( - "received unsupported file information class level: {:?}", - req.file_info_class_lvl, - )))); + return Err(pdu_other_err!( + "", + source:FilesystemBackendError(format!( + "received unsupported file information class level: {:?}", + req.file_info_class_lvl, + )) + )); } }; @@ -1586,8 +1672,11 @@ impl FilesystemBackend { req: &efs::ServerDriveSetInformationRequest, io_status: NtStatus, ) -> PduResult<()> { - self.client_handle - .write_rdpdr(efs::ClientDriveSetInformationResponse::new(req, io_status)?.into())?; + self.client_handle.write_rdpdr( + efs::ClientDriveSetInformationResponse::new(req, io_status) + .map_err(|e| PduError::encode("send_rdp_set_info_response", e))? + .into(), + )?; Ok(()) } } @@ -1615,9 +1704,7 @@ impl FileCache { if self.cache.insert(self.next_file_id, file).is_none() { Ok(self.next_file_id) } else { - Err(other_err!( - "attempted to insert a FileCacheObject into the file cache with a file_id that already exists in the cache" - )) + Err(pdu_other_err!("attempted to insert a FileCacheObject into the file cache with a file_id that already exists in the cache")) } } diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/path.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/path.rs index b5d3d7db97b80..fdff99feb1ebd 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/path.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/path.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use ironrdp_pdu::{custom_err, PduResult}; +use ironrdp_pdu::{pdu_other_err, PduResult}; use std::ffi::CString; /// WindowsPath is a String that we assume to be in the form @@ -63,10 +63,10 @@ impl UnixPath { /// any characters that can't be handled by CString::new(). pub fn to_cstring(&self) -> PduResult { CString::new(self.path.clone()).map_err(|e| { - custom_err!(PathError(format!( - "Error converting UnixPath to CString: {}", - e - ))) + pdu_other_err!( + "", + source:PathError(format!("Error converting UnixPath to CString: {}", e)) + ) }) } diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/scard.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/scard.rs index cb54d492d8fa4..f5e4acd4962fa 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/scard.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/scard.rs @@ -16,8 +16,9 @@ use crate::client::ClientHandle; use crate::{piv, util}; +use ironrdp_pdu::pdu_other_err; use ironrdp_pdu::utils::CharacterSet; -use ironrdp_pdu::{custom_err, other_err, PduResult}; +use ironrdp_pdu::PduResult; use ironrdp_rdpdr::pdu::efs::{DeviceControlRequest, DeviceControlResponse, NtStatus}; use ironrdp_rdpdr::pdu::esc::{ rpce, CardProtocol, CardState, CardStateFlags, ConnectCall, ConnectReturn, ContextCall, @@ -154,10 +155,13 @@ impl ScardBackend { ScardCall::GetReaderIconCall(_) => self.handle_get_reader_icon(req), _ => Self::unsupported_combo_error(req.io_control_code, call), }, - _ => Err(custom_err!(SmartcardBackendError(format!( - "received unhandled ScardIoCtlCode: {:?}", - req.io_control_code - )))), + _ => Err(pdu_other_err!( + "", + source:SmartcardBackendError(format!( + "received unhandled ScardIoCtlCode: {:?}", + req.io_control_code + )) + )), }?; Ok(()) @@ -336,10 +340,13 @@ impl ScardBackend { ) -> PduResult<()> { let cmd = CardCommand::::try_from(&call.send_buffer).map_err(|err| { - custom_err!(SmartcardBackendError(format!( - "failed to parse smartcard command {:?}: {:?}", - &call.send_buffer, err - ))) + pdu_other_err!( + "", + source:SmartcardBackendError(format!( + "failed to parse smartcard command {:?}: {:?}", + &call.send_buffer, err + )) + ) })?; let card = self.contexts.get_card(&call.handle)?; @@ -356,10 +363,13 @@ impl ScardBackend { ScardIoCtlCode::StatusW => CharacterSet::Unicode, ScardIoCtlCode::StatusA => CharacterSet::Ansi, _ => { - return Err(custom_err!(SmartcardBackendError(format!( - "got unexpected ScardIoCtlCode with a StatusCall: {:?}", - req.io_control_code - )))); + return Err(pdu_other_err!( + "", + source:SmartcardBackendError(format!( + "got unexpected ScardIoCtlCode with a StatusCall: {:?}", + req.io_control_code + )) + )); } }; @@ -457,10 +467,13 @@ impl ScardBackend { GetDeviceTypeIdReturn::new(ReturnCode::Success, SCARD_READER_TYPE_VENDOR), ) } else { - Err(custom_err!(SmartcardBackendError(format!( - "got GetDeviceTypeIdCall for unknown context [{}]", - call.context.value - )))) + Err(pdu_other_err!( + "", + source:SmartcardBackendError(format!( + "got GetDeviceTypeIdCall for unknown context [{}]", + call.context.value + )) + )) } } @@ -497,10 +510,13 @@ impl ScardBackend { /// This function returns the error for unsupported combinations of [`ScardIoCtlCode`] and [`ScardCall`]. fn unsupported_combo_error(ioctl: ScardIoCtlCode, call: ScardCall) -> PduResult<()> { - Err(custom_err!(SmartcardBackendError(format!( - "received unsupported combination of ScardIoCtlCode [{:?}] with ScardCall [{:?}]", - ioctl, call - )))) + Err(pdu_other_err!( + "", + source:SmartcardBackendError(format!( + "received unsupported combination of ScardIoCtlCode [{:?}] with ScardCall [{:?}]", + ioctl, call + )) + )) } fn send_device_control_response( @@ -570,7 +586,7 @@ impl Contexts { fn get_card(&mut self, handle: &ScardHandle) -> PduResult<&mut piv::Card> { self.get_internal_mut(handle.context.value)? .get(handle.value) - .ok_or_else(|| other_err!("unknown ScardHandle")) + .ok_or_else(|| pdu_other_err!("unknown ScardHandle")) } fn exists(&self, id: u32) -> bool { @@ -592,7 +608,7 @@ impl Contexts { fn get_internal_mut(&mut self, id: u32) -> PduResult<&mut ContextInternal> { self.contexts .get_mut(&id) - .ok_or_else(|| other_err!("unknown context id")) + .ok_or_else(|| pdu_other_err!("unknown context id")) } fn release(&mut self, id: u32) { @@ -627,7 +643,7 @@ impl ContextInternal { fn set_scard_cancel_response(&mut self, resp: DeviceControlResponse) -> PduResult<()> { if self.scard_cancel_response.is_some() { - return Err(other_err!("SCARD_IOCTL_CANCEL already received",)); + return Err(pdu_other_err!("SCARD_IOCTL_CANCEL already received",)); } self.scard_cancel_response = Some(resp); Ok(()) diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs index 0c87aaca06162..34cbccfd5aed8 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs @@ -15,6 +15,7 @@ // along with this program. If not, see . use super::{filesystem::FileCacheObject, path::UnixPath}; +use crate::rdpdr::filesystem::cast_length; use crate::{ util::{self, from_c_string, from_go_array}, CGOSharedDirectoryAnnounce, CGOSharedDirectoryCreateRequest, CGOSharedDirectoryCreateResponse, @@ -23,11 +24,13 @@ use crate::{ CGOSharedDirectoryReadRequest, CGOSharedDirectoryReadResponse, CGOSharedDirectoryTruncateRequest, CGOSharedDirectoryWriteRequest, }; -use ironrdp_pdu::{cast_length, custom_err, PduResult}; + +use ironrdp_pdu::pdu_other_err; +use ironrdp_pdu::PduResult; use ironrdp_rdpdr::pdu::efs::{ self, DeviceCloseRequest, DeviceCreateRequest, DeviceReadRequest, DeviceWriteRequest, }; -use std::convert::TryInto; + use std::ffi::CString; /// SharedDirectoryAnnounce is sent by the TDP client to the server @@ -137,10 +140,13 @@ impl FileSystemObject { if let Some(name) = self.path.last() { Ok(name.to_string()) } else { - Err(custom_err!(TdpHandlingError(format!( - "failed to extract name from path: {:?}", - self.path - )))) + Err(pdu_other_err!( + "", + source:TdpHandlingError(format!( + "failed to extract name from path: {:?}", + self.path + )) + )) } } @@ -158,10 +164,10 @@ impl FileSystemObject { last_modified, last_modified, last_modified, - cast_length!( + cast_length( "FileSystemObject::into_both_directory", "self.size", - self.size + self.size, )?, file_attributes, self.name()?, @@ -182,10 +188,10 @@ impl FileSystemObject { last_modified, last_modified, last_modified, - cast_length!( + cast_length( "FileSystemObject::into_both_directory", "self.size", - self.size + self.size, )?, file_attributes, self.name()?, @@ -210,7 +216,7 @@ impl FileSystemObject { last_modified, last_modified, last_modified, - cast_length!("FileSystemObject::into_directory", "self.size", self.size)?, + cast_length("FileSystemObject::into_directory", "self.size", self.size)?, file_attributes, self.name()?, )) diff --git a/lib/srv/desktop/rdp/rdpclient/src/util.rs b/lib/srv/desktop/rdp/rdpclient/src/util.rs index 95b6f6cf56357..bc1c61fb03ab7 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/util.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/util.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use ironrdp_pdu::{other_err, PduResult}; +use ironrdp_pdu::pdu_other_err; +use ironrdp_pdu::PduResult; use std::ffi::CStr; use std::os::raw::c_char; use std::slice; @@ -40,7 +41,7 @@ pub fn to_unicode(s: &str, with_null_term: bool) -> Vec { #[allow(clippy::bind_instead_of_map)] pub fn from_unicode(s: Vec) -> PduResult { let mut with_null_terminator = WString::from_utf16le(s) - .or_else(|_| Err(other_err!("invalid Unicode")))? + .or_else(|_| Err(pdu_other_err!("invalid Unicode")))? .to_utf8(); with_null_terminator.pop(); let without_null_terminator = with_null_terminator; @@ -49,7 +50,7 @@ pub fn from_unicode(s: Vec) -> PduResult { pub fn from_utf8(s: Vec) -> PduResult { let mut with_null_terminator = - String::from_utf8(s).map_err(|_| other_err!("invalid Unicode"))?; + String::from_utf8(s).map_err(|_| pdu_other_err!("invalid Unicode"))?; with_null_terminator.pop(); let without_null_terminator = with_null_terminator; Ok(without_null_terminator) diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index 7e67fdcc80539..6b7ca3f4ff94d 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -2511,7 +2511,7 @@ func (m *mockAzureClient) Get(_ context.Context, _ string) (*azure.VirtualMachin return nil, nil } -func (m *mockAzureClient) GetByVMID(_ context.Context, _, _ string) (*azure.VirtualMachine, error) { +func (m *mockAzureClient) GetByVMID(_ context.Context, _ string) (*azure.VirtualMachine, error) { return nil, nil } diff --git a/lib/srv/forward/sshserver.go b/lib/srv/forward/sshserver.go index 978be8c89ea32..bdc4cd69dc620 100644 --- a/lib/srv/forward/sshserver.go +++ b/lib/srv/forward/sshserver.go @@ -25,6 +25,7 @@ import ( "fmt" "io" "net" + "os" "strings" "time" @@ -1017,6 +1018,18 @@ func (s *Server) checkTCPIPForwardRequest(r *ssh.Request) error { return err } + // RBAC checks are only necessary when connecting to an agentless node + if s.targetServer != nil && s.targetServer.IsOpenSSHNode() { + _, scx, err := srv.NewServerContext(s.Context(), s.connectionContext, s, s.identityContext) + if err != nil { + return err + } + + if err := s.authHandlers.CheckPortForward(scx.DstAddr, scx, services.SSHPortForwardModeRemote); err != nil { + return trace.Wrap(err) + } + } + return nil } @@ -1074,8 +1087,12 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r if err != nil { s.log.Errorf("Unable to create connection context: %v.", err) s.stderrWrite(ch, "Unable to create connection context.") + if err := ch.Close(); err != nil { + s.log.Warnf("Failed to close channel: %v", err) + } return } + scx.AddCloser(ch) scx.RemoteClient = s.remoteClient scx.ExecType = teleport.ChanDirectTCPIP scx.SrcAddr = sshutils.JoinHostPort(req.Orig, req.OrigPort) @@ -1084,11 +1101,13 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r ch = scx.TrackActivity(ch) - // Check if the role allows port forwarding for this user. - err = s.authHandlers.CheckPortForward(scx.DstAddr, scx) - if err != nil { - s.stderrWrite(ch, err.Error()) - return + // RBAC checks are only necessary when connecting to an agentless node + if s.targetServer != nil && s.targetServer.IsOpenSSHNode() { + err = s.authHandlers.CheckPortForward(scx.DstAddr, scx, services.SSHPortForwardModeLocal) + if err != nil { + s.stderrWrite(ch, err.Error()) + return + } } s.log.Debugf("Opening direct-tcpip channel from %v to %v in context %v.", scx.SrcAddr, scx.DstAddr, scx.ID()) @@ -1107,8 +1126,8 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r scx.WithError(err).Warn("Failed to emit port forward event.") } - if err := utils.ProxyConn(ctx, ch, conn); err != nil { - s.log.WithError(err).Warn("Pailed proxying data for port forwarding connection.") + if err := utils.ProxyConn(ctx, ch, conn); err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, os.ErrClosed) { + s.log.WithError(err).Warn("Failed proxying data for port forwarding connection.") } } diff --git a/lib/srv/forward/sshserver_test.go b/lib/srv/forward/sshserver_test.go index 98e409e63b692..8b4c572f27382 100644 --- a/lib/srv/forward/sshserver_test.go +++ b/lib/srv/forward/sshserver_test.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/teleport/api/utils/keys" apisshutils "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/fixtures" + "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/utils" @@ -190,6 +191,7 @@ func TestDirectTCPIP(t *testing.T) { cases := []struct { name string login string + accessChecker services.AccessChecker expectAccepted bool expectRejected bool }{ diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index a4bbd56a552df..de400ac756989 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -1420,16 +1420,16 @@ func (s *Server) HandleNewChan(ctx context.Context, ccx *sshutils.ConnectionCont // canPortForward determines if port forwarding is allowed for the current // user/role/node combo. Returns nil if port forwarding is allowed, non-nil // if denied. -func (s *Server) canPortForward(scx *srv.ServerContext) error { +func (s *Server) canPortForward(scx *srv.ServerContext, mode services.SSHPortForwardMode) error { // Is the node configured to allow port forwarding? if !s.allowTCPForwarding { return trace.AccessDenied("node does not allow port forwarding") } // Check if the role allows port forwarding for this user. - err := s.authHandlers.CheckPortForward(scx.DstAddr, scx) + err := s.authHandlers.CheckPortForward(scx.DstAddr, scx, mode) if err != nil { - return err + return trace.Wrap(err) } return nil @@ -1472,7 +1472,7 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ccx *sshutils.Con // Bail out now if TCP port forwarding is not allowed for this node/user/role // combo - if err = s.canPortForward(scx); err != nil { + if err = s.canPortForward(scx, services.SSHPortForwardModeLocal); err != nil { writeStderr(channel, err.Error()) return } @@ -2178,7 +2178,7 @@ func (s *Server) createForwardingContext(ctx context.Context, ccx *sshutils.Conn scx.SessionRecordingConfig.SetMode(types.RecordOff) scx.SetAllowFileCopying(s.allowFileCopying) - if err := s.canPortForward(scx); err != nil { + if err := s.canPortForward(scx, services.SSHPortForwardModeRemote); err != nil { scx.Close() return nil, nil, trace.Wrap(err) } diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 480d603a97338..4c62e387e9569 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -474,6 +474,7 @@ func TestSessionAuditLog(t *testing.T) { roleOptions := role.GetOptions() roleOptions.PermitX11Forwarding = types.NewBool(true) roleOptions.ForwardAgent = types.NewBool(true) + //nolint:staticcheck // this field is preserved for existing deployments, but shouldn't be used going forward roleOptions.PortForwarding = types.NewBoolOption(true) role.SetOptions(roleOptions) _, err = f.testSrv.Auth().UpsertRole(ctx, role) @@ -768,15 +769,43 @@ func TestLockInForce(t *testing.T) { require.NoError(t, err) } +func setPortForwarding(t *testing.T, ctx context.Context, f *sshTestFixture, legacy, remote, local *types.BoolOption) { + roleName := services.RoleNameForUser(f.user) + role, err := f.testSrv.Auth().GetRole(ctx, roleName) + require.NoError(t, err) + roleOptions := role.GetOptions() + roleOptions.PermitX11Forwarding = types.NewBool(true) + roleOptions.ForwardAgent = types.NewBool(true) + //nolint:staticcheck // this field is preserved for existing deployments, but shouldn't be used going forward + roleOptions.PortForwarding = legacy + + if remote != nil || local != nil { + roleOptions.SSHPortForwarding = &types.SSHPortForwarding{ + Remote: &types.SSHRemotePortForwarding{ + Enabled: remote, + }, + Local: &types.SSHLocalPortForwarding{ + Enabled: local, + }, + } + } + + role.SetOptions(roleOptions) + _, err = f.testSrv.Auth().UpsertRole(ctx, role) + require.NoError(t, err) +} + // TestDirectTCPIP ensures that the server can create a "direct-tcpip" // channel to the target address. The "direct-tcpip" channel is what port // forwarding is built upon. func TestDirectTCPIP(t *testing.T) { + ctx := context.Background() t.Parallel() f := newFixtureWithoutDiskBasedLogging(t) // Startup a test server that will reply with "hello, world\n" ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "hello, world") })) defer ts.Close() @@ -785,26 +814,60 @@ func TestDirectTCPIP(t *testing.T) { u, err := url.Parse(ts.URL) require.NoError(t, err) - // Build a http.Client that will dial through the server to establish the - // connection. That's why a custom dialer is used and the dialer uses - // s.clt.Dial (which performs the "direct-tcpip" request). - httpClient := http.Client{ - Transport: &http.Transport{ - Dial: func(network string, addr string) (net.Conn, error) { - return f.ssh.clt.DialContext(context.Background(), "tcp", u.Host) + t.Run("Local forwarding is successful", func(t *testing.T) { + // Build a http.Client that will dial through the server to establish the + // connection. That's why a custom dialer is used and the dialer uses + // s.clt.Dial (which performs the "direct-tcpip" request). + httpClient := http.Client{ + Transport: &http.Transport{ + Dial: func(network string, addr string) (net.Conn, error) { + return f.ssh.clt.DialContext(context.Background(), "tcp", u.Host) + }, }, - }, - } + } - // Perform a HTTP GET to the test HTTP server through a "direct-tcpip" request. - resp, err := httpClient.Get(ts.URL) - require.NoError(t, err) - defer resp.Body.Close() + // Perform a HTTP GET to the test HTTP server through a "direct-tcpip" request. + resp, err := httpClient.Get(ts.URL) + require.NoError(t, err) + defer resp.Body.Close() - // Make sure the response is what was expected. - body, err := io.ReadAll(resp.Body) - require.NoError(t, err) - require.Equal(t, []byte("hello, world\n"), body) + // Make sure the response is what was expected. + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Equal(t, []byte("hello, world\n"), body) + }) + + t.Run("Local forwarding fails when access is denied", func(t *testing.T) { + httpClient := http.Client{ + Transport: &http.Transport{ + Dial: func(network string, addr string) (net.Conn, error) { + return f.ssh.clt.DialContext(context.Background(), "tcp", u.Host) + }, + }, + } + + setPortForwarding(t, ctx, f, nil, nil, types.NewBoolOption(false)) + // Perform a HTTP GET to the test HTTP server through a "direct-tcpip" request. + //nolint:bodyclose // We expect an error here, no need to close. + _, err := httpClient.Get(ts.URL) + require.Error(t, err) + }) + + t.Run("Local forwarding fails when access is denied by legacy config", func(t *testing.T) { + httpClient := http.Client{ + Transport: &http.Transport{ + Dial: func(network string, addr string) (net.Conn, error) { + return f.ssh.clt.DialContext(context.Background(), "tcp", u.Host) + }, + }, + } + + setPortForwarding(t, ctx, f, types.NewBoolOption(false), nil, nil) + // Perform a HTTP GET to the test HTTP server through a "direct-tcpip" request. + //nolint:bodyclose // We expect an error here, no need to close. + _, err := httpClient.Get(ts.URL) + require.Error(t, err) + }) t.Run("SessionJoinPrincipal cannot use direct-tcpip", func(t *testing.T) { // Ensure that ssh client using SessionJoinPrincipal as Login, cannot @@ -831,8 +894,12 @@ func TestTCPIPForward(t *testing.T) { hostname, err := os.Hostname() require.NoError(t, err) tests := []struct { - name string - listenAddr string + name string + listenAddr string + legacyAllow *types.BoolOption + remoteAllow *types.BoolOption + localAllow *types.BoolOption + expectErr bool }{ { name: "localhost", @@ -846,14 +913,37 @@ func TestTCPIPForward(t *testing.T) { name: "hostname", listenAddr: hostname + ":0", }, + { + name: "remote deny", + listenAddr: "localhost:0", + remoteAllow: types.NewBoolOption(false), + expectErr: true, + }, + { + name: "legacy deny", + listenAddr: "localhost:0", + legacyAllow: types.NewBoolOption(false), + expectErr: true, + }, + { + name: "local deny", + listenAddr: "localhost:0", + localAllow: types.NewBoolOption(false), + expectErr: false, + }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { f := newFixtureWithoutDiskBasedLogging(t) - + setPortForwarding(t, context.Background(), f, tc.legacyAllow, tc.remoteAllow, tc.localAllow) // Request a listener from the server. listener, err := f.ssh.clt.Listen("tcp", tc.listenAddr) - require.NoError(t, err) + if tc.expectErr { + require.Error(t, err) + return + } else { + require.NoError(t, err) + } // Start up a test server that uses the port forwarded listener. ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -870,6 +960,7 @@ func TestTCPIPForward(t *testing.T) { require.NoError(t, err) resp, err := ts.Client().Do(req) require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, resp.Body.Close()) }) diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index cf2b6aa76ced5..73752db274baa 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -924,7 +924,7 @@ func (h *Handler) bindDefaultEndpoints() { // Device Trust. // Do not enforce bearer token for /webconfirm, it is called from outside the // Web UI. - h.GET("/webapi/devices/webconfirm", h.WithAuthCookieAndCSRF(h.deviceWebConfirm)) + h.GET("/webapi/devices/webconfirm", h.WithSession(h.deviceWebConfirm)) // trusted clusters h.POST("/webapi/trustedclusters/validate", h.WithUnauthenticatedLimiter(h.validateTrustedCluster)) @@ -1012,6 +1012,9 @@ func (h *Handler) bindDefaultEndpoints() { // SAML IDP integration endpoints h.GET("/webapi/scripts/integrations/configure/gcp-workforce-saml.sh", h.WithLimiter(h.gcpWorkforceConfigScript)) + // Okta integration endpoints. + h.GET("/.well-known/jwks-okta", h.WithLimiter(h.jwksOkta)) + // Azure OIDC integration endpoints h.GET("/webapi/scripts/integrations/configure/azureoidc.sh", h.WithLimiter(h.azureOIDCConfigure)) @@ -4660,9 +4663,22 @@ func (h *Handler) WithMetaRedirect(fn redirectHandlerFunc) httprouter.Handle { } // WithAuth ensures that a request is authenticated. +// Authenticated requests require both a session cookie as well as a bearer token. func (h *Handler) WithAuth(fn ContextHandler) httprouter.Handle { return httplib.MakeHandler(func(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { - sctx, err := h.AuthenticateRequest(w, r, true) + sctx, err := h.AuthenticateRequest(w, r, true /* check bearer token */) + if err != nil { + return nil, trace.Wrap(err) + } + return fn(w, r, p, sctx) + }) +} + +// WithSession ensures that the request provides a session cookie. +// It does not check for a bearer token. +func (h *Handler) WithSession(fn ContextHandler) httprouter.Handle { + return httplib.MakeHandler(func(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { + sctx, err := h.AuthenticateRequest(w, r, false /* check bearer token */) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/jwt.go b/lib/web/jwt.go new file mode 100644 index 0000000000000..40ae3011db979 --- /dev/null +++ b/lib/web/jwt.go @@ -0,0 +1,65 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package web + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/jwt" +) + +func (h *Handler) jwks(ctx context.Context, caType types.CertAuthType, includeBlankKeyID bool) (*JWKSResponse, error) { + clusterName, err := h.GetProxyClient().GetDomainName(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + // Fetch the JWT public keys only. + ca, err := h.GetProxyClient().GetCertAuthority(ctx, types.CertAuthID{ + Type: caType, + DomainName: clusterName, + }, false /* loadKeys */) + if err != nil { + return nil, trace.Wrap(err) + } + + pairs := ca.GetTrustedJWTKeyPairs() + + // Create response and allocate space for the keys. + var resp JWKSResponse + resp.Keys = make([]jwt.JWK, 0, len(pairs)) + + // Loop over and all add public keys in JWK format. + for _, key := range pairs { + jwk, err := jwt.MarshalJWK(key.PublicKey) + if err != nil { + return nil, trace.Wrap(err) + } + resp.Keys = append(resp.Keys, jwk) + + // Return an additional copy of the same JWK + // with KeyID set to the empty string for compatibility. + if includeBlankKeyID { + jwk.KeyID = "" + resp.Keys = append(resp.Keys, jwk) + } + } + return &resp, nil +} diff --git a/lib/web/oidcidp.go b/lib/web/oidcidp.go index 28a9b7b7465b0..7b9c433f378f7 100644 --- a/lib/web/oidcidp.go +++ b/lib/web/oidcidp.go @@ -19,7 +19,6 @@ package web import ( - "context" "net/http" "github.com/gravitational/trace" @@ -27,7 +26,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/integrations/awsoidc" - "github.com/gravitational/teleport/lib/jwt" "github.com/gravitational/teleport/lib/utils/oidc" ) @@ -51,45 +49,6 @@ func (h *Handler) jwksOIDC(_ http.ResponseWriter, r *http.Request, _ httprouter. return h.jwks(r.Context(), types.OIDCIdPCA, true) } -func (h *Handler) jwks(ctx context.Context, caType types.CertAuthType, includeBlankKeyID bool) (*JWKSResponse, error) { - clusterName, err := h.GetProxyClient().GetDomainName(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - - // Fetch the JWT public keys only. - ca, err := h.GetProxyClient().GetCertAuthority(ctx, types.CertAuthID{ - Type: caType, - DomainName: clusterName, - }, false /* loadKeys */) - if err != nil { - return nil, trace.Wrap(err) - } - - pairs := ca.GetTrustedJWTKeyPairs() - - // Create response and allocate space for the keys. - var resp JWKSResponse - resp.Keys = make([]jwt.JWK, 0, len(pairs)) - - // Loop over and all add public keys in JWK format. - for _, key := range pairs { - jwk, err := jwt.MarshalJWK(key.PublicKey) - if err != nil { - return nil, trace.Wrap(err) - } - resp.Keys = append(resp.Keys, jwk) - - // Return an additional copy of the same JWK - // with KeyID set to the empty string for compatibility. - if includeBlankKeyID { - jwk.KeyID = "" - resp.Keys = append(resp.Keys, jwk) - } - } - return &resp, nil -} - // thumbprint returns the thumbprint as required by AWS when adding an OIDC Identity Provider. // This is documented here: // https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html diff --git a/lib/web/oidcidp_test.go b/lib/web/oidcidp_test.go index a663a13db6a92..20c9063a7fcb0 100644 --- a/lib/web/oidcidp_test.go +++ b/lib/web/oidcidp_test.go @@ -72,41 +72,14 @@ func TestOIDCIdPPublicEndpoints(t *testing.T) { resp, err = publicClt.Get(ctx, gotConfiguration.JWKSURI, nil) require.NoError(t, err) - type jwksKey struct { - Use string `json:"use"` - KeyID *string `json:"kid"` - KeyType string `json:"kty"` - Alg string `json:"alg"` - } - type jwksKeys struct { - Keys []jwksKey `json:"keys"` - } - - var gotKeys jwksKeys + var gotKeys JWKSResponse err = json.Unmarshal(resp.Bytes(), &gotKeys) require.NoError(t, err) // Expect the same key twice, once with a synthesized Key ID, and once with an empty Key ID for compatibility. require.Len(t, gotKeys.Keys, 2) - require.NotEmpty(t, *gotKeys.Keys[0].KeyID) - require.Equal(t, "", *gotKeys.Keys[1].KeyID) - expectedKeys := jwksKeys{ - Keys: []jwksKey{ - { - Use: "sig", - KeyType: "RSA", - Alg: "RS256", - KeyID: gotKeys.Keys[0].KeyID, - }, - { - Use: "sig", - KeyType: "RSA", - Alg: "RS256", - KeyID: new(string), - }, - }, - } - require.Equal(t, expectedKeys, gotKeys) + require.NotEmpty(t, gotKeys.Keys[0].KeyID) + require.Empty(t, gotKeys.Keys[1].KeyID) } func TestThumbprint(t *testing.T) { diff --git a/lib/web/okta.go b/lib/web/okta.go new file mode 100644 index 0000000000000..67dec290784ae --- /dev/null +++ b/lib/web/okta.go @@ -0,0 +1,32 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package web + +import ( + "net/http" + + "github.com/julienschmidt/httprouter" + + "github.com/gravitational/teleport/api/types" +) + +// jwksOkta returns public keys used to verify JWT tokens signed for use with Okta API Service App +// machine-to-machine authentication. +// https://developer.okta.com/docs/guides/implement-oauth-for-okta-serviceapp/main/ +func (h *Handler) jwksOkta(_ http.ResponseWriter, r *http.Request, _ httprouter.Params) (interface{}, error) { + return h.jwks(r.Context(), types.OktaCA, false /* includeBlankKeyID */) +} diff --git a/lib/web/okta_test.go b/lib/web/okta_test.go new file mode 100644 index 0000000000000..b884aa5f85283 --- /dev/null +++ b/lib/web/okta_test.go @@ -0,0 +1,46 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package web + +import ( + "context" + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" +) + +// TestJWKSOktaPublicEndpoint ensures the public endpoint for the Okta API Service App integration +// is available. +func TestJWKSOktaPublicEndpoint(t *testing.T) { + t.Parallel() + ctx := context.Background() + env := newWebPack(t, 1) + proxy := env.proxies[0] + + publicClt := proxy.newClient(t) + + resp, err := publicClt.Get(ctx, publicClt.Endpoint(".well-known/jwks-okta"), nil) + require.NoError(t, err) + + var gotKeys JWKSResponse + err = json.Unmarshal(resp.Bytes(), &gotKeys) + require.NoError(t, err) + + require.Len(t, gotKeys.Keys, 1) + require.NotEmpty(t, gotKeys.Keys[0].KeyID) +} diff --git a/lib/web/resources_test.go b/lib/web/resources_test.go index 06a72e099f5c4..3a593cc0df1d7 100644 --- a/lib/web/resources_test.go +++ b/lib/web/resources_test.go @@ -240,7 +240,6 @@ spec: enabled: true max_session_ttl: 30h0m0s pin_source_ip: false - port_forwarding: true record_session: default: best_effort desktop: true diff --git a/lib/web/session/cookie.go b/lib/web/session/cookie.go index f7d8712ee2016..df9bb4b538a6b 100644 --- a/lib/web/session/cookie.go +++ b/lib/web/session/cookie.go @@ -67,6 +67,7 @@ func SetCookie(w http.ResponseWriter, user, sid string) error { Path: "/", HttpOnly: true, Secure: true, + SameSite: http.SameSiteLaxMode, } http.SetCookie(w, c) return nil @@ -80,6 +81,7 @@ func ClearCookie(w http.ResponseWriter) { Path: "/", HttpOnly: true, Secure: true, + SameSite: http.SameSiteLaxMode, }) } diff --git a/lib/web/session/cookie_test.go b/lib/web/session/cookie_test.go index 12c4221d6243a..8f7d685033cfe 100644 --- a/lib/web/session/cookie_test.go +++ b/lib/web/session/cookie_test.go @@ -48,7 +48,7 @@ func TestCookies(t *testing.T) { require.Len(t, setCookies, 2) // SetCookie will store the encoded session in the cookie - require.Equal(t, "__Host-session=7b2275736572223a226c6c616d61222c22736964223a223938373635227d; Path=/; HttpOnly; Secure", setCookies[0]) + require.Equal(t, "__Host-session=7b2275736572223a226c6c616d61222c22736964223a223938373635227d; Path=/; HttpOnly; Secure; SameSite=Lax", setCookies[0]) // ClearCookie will add an entry with the cookie value cleared out - require.Equal(t, "__Host-session=; Path=/; HttpOnly; Secure", setCookies[1]) + require.Equal(t, "__Host-session=; Path=/; HttpOnly; Secure; SameSite=Lax", setCookies[1]) } diff --git a/lib/web/spiffe_test.go b/lib/web/spiffe_test.go index eef680d411123..1eb49b33b4369 100644 --- a/lib/web/spiffe_test.go +++ b/lib/web/spiffe_test.go @@ -131,30 +131,10 @@ func TestSPIFFEJWTPublicEndpoints(t *testing.T) { resp, err = publicClt.Get(ctx, gotConfiguration.JWKSURI, nil) require.NoError(t, err) - type jwksKey struct { - Use string `json:"use"` - KeyID string `json:"kid"` - KeyType string `json:"kty"` - Alg string `json:"alg"` - } - type jwksKeys struct { - Keys []jwksKey `json:"keys"` - } - gotKeys := jwksKeys{} + var gotKeys JWKSResponse err = json.Unmarshal(resp.Bytes(), &gotKeys) require.NoError(t, err) require.Len(t, gotKeys.Keys, 1) require.NotEmpty(t, gotKeys.Keys[0].KeyID) - expectedKeys := jwksKeys{ - Keys: []jwksKey{ - { - Use: "sig", - KeyType: "EC", - Alg: "ES256", - KeyID: gotKeys.Keys[0].KeyID, - }, - }, - } - require.Equal(t, expectedKeys, gotKeys) } diff --git a/lib/web/ui/app.go b/lib/web/ui/app.go index 313cb4f103603..5661d3290960c 100644 --- a/lib/web/ui/app.go +++ b/lib/web/ui/app.go @@ -36,7 +36,7 @@ type App struct { Kind string `json:"kind"` // SubKind is the subkind of the app resource. Used to differentiate different // flavors of app. - SubKind string `json:"subkind,omitempty"` + SubKind string `json:"subKind,omitempty"` // Name is the name of the application. Name string `json:"name"` // Description is the app description. @@ -89,9 +89,9 @@ type IdentityCenterPermissionSet struct { Name string `json:"name"` // ARN is the AWS-assigned ARN of the permission set ARN string `json:"arn"` - // AssignmentID is the assignment resource that will provision an Account - // Assignment for this Permission Set on the enclosing account - AssignmentID string `json:"accountAssignment,omitempty"` + // AssignmentID is the assignment resource ID that will provision an Account + // assignment for this permission set on the enclosing account. + AssignmentID string `json:"assignmentId,omitempty"` RequiresRequest bool `json:"requiresRequest,omitempty"` } diff --git a/lib/web/ui/usertask.go b/lib/web/ui/usertask.go index 603867a66b017..f6d9835f96dfc 100644 --- a/lib/web/ui/usertask.go +++ b/lib/web/ui/usertask.go @@ -19,6 +19,8 @@ package ui import ( + "time" + "github.com/gravitational/trace" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" @@ -37,6 +39,8 @@ type UserTask struct { IssueType string `json:"issueType,omitempty"` // Integration is the Integration Name this User Task refers to. Integration string `json:"integration,omitempty"` + // LastStateChange indicates when the current's user task state was last changed. + LastStateChange time.Time `json:"lastStateChange,omitempty"` } // UserTaskDetail contains all the details for a User Task. @@ -94,10 +98,11 @@ func MakeDetailedUserTask(ut *usertasksv1.UserTask) UserTaskDetail { // MakeUserTask creates a UI UserTask representation. func MakeUserTask(ut *usertasksv1.UserTask) UserTask { return UserTask{ - Name: ut.GetMetadata().GetName(), - TaskType: ut.GetSpec().GetTaskType(), - State: ut.GetSpec().GetState(), - IssueType: ut.GetSpec().GetIssueType(), - Integration: ut.GetSpec().GetIntegration(), + Name: ut.GetMetadata().GetName(), + TaskType: ut.GetSpec().GetTaskType(), + State: ut.GetSpec().GetState(), + IssueType: ut.GetSpec().GetIssueType(), + Integration: ut.GetSpec().GetIntegration(), + LastStateChange: ut.GetStatus().GetLastStateChange().AsTime(), } } diff --git a/lib/web/usertasks_test.go b/lib/web/usertasks_test.go index 79a8a553e799d..0bb2dbb9a9f9a 100644 --- a/lib/web/usertasks_test.go +++ b/lib/web/usertasks_test.go @@ -139,6 +139,7 @@ func TestUserTask(t *testing.T) { require.NoError(t, err) require.Equal(t, "OPEN", userTaskDetailResp.State) require.NotEmpty(t, userTaskDetailResp.DiscoverEC2) + lastStateChangeT0 := userTaskDetailResp.LastStateChange // Mark it as resolved. _, err = pack.clt.PutJSON(ctx, updateStateEndpoint(userTaskName), ui.UpdateUserTaskStateRequest{ @@ -153,5 +154,8 @@ func TestUserTask(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, userTaskDetailResp.DiscoverEC2) require.Equal(t, "RESOLVED", userTaskDetailResp.State) + // Its last changed state should be updated. + lastStateChangeT1 := userTaskDetailResp.LastStateChange + require.True(t, lastStateChangeT1.After(lastStateChangeT0), "last state change was not updated after changing the UserTask state") }) } diff --git a/package.json b/package.json index f662ef6987204..383af8fa4af00 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "prettier": "^3.3.3", "react-select-event": "^5.5.1", "storybook": "^8.3.4", - "typescript": "^5.6.2", + "typescript": "^5.7.2", "vite": "^5.4.8" }, "dependencies": { @@ -101,3 +101,4 @@ }, "packageManager": "pnpm@9.9.0" } + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1e1b3e75d117..d9a3561b44de4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -109,10 +109,10 @@ importers: version: 8.3.4(storybook@8.3.4) '@storybook/react': specifier: ^8.3.4 - version: 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.6.2) + version: 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.7.2) '@storybook/react-vite': specifier: ^8.3.4 - version: 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3) + version: 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.3.4)(typescript@5.7.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3) '@storybook/test-runner': specifier: ^0.19.1 version: 0.19.1(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(storybook@8.3.4) @@ -163,10 +163,10 @@ importers: version: 1.13.1 msw: specifier: ^2.4.9 - version: 2.4.9(typescript@5.6.2) + version: 2.4.9(typescript@5.7.2) msw-storybook-addon: specifier: ^2.0.3 - version: 2.0.3(msw@2.4.9(typescript@5.6.2)) + version: 2.0.3(msw@2.4.9(typescript@5.7.2)) playwright: specifier: ^1.47.2 version: 1.47.2 @@ -180,8 +180,8 @@ importers: specifier: ^8.3.4 version: 8.3.4 typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.7.2 + version: 5.7.2 vite: specifier: ^5.4.8 version: 5.4.8(@types/node@20.16.10)(terser@5.31.1) @@ -222,16 +222,16 @@ importers: version: 8.57.0 eslint-import-resolver-typescript: specifier: ^3.6.3 - version: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) eslint-plugin-babel: specifier: ^5.3.1 version: 5.3.1(eslint@8.57.0) eslint-plugin-import: specifier: 2.30.0 - version: 2.30.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + version: 2.30.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jest: specifier: ^28.8.3 - version: 28.8.3(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0))(typescript@5.6.2) + version: 28.8.3(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0))(typescript@5.7.2) eslint-plugin-jest-dom: specifier: ^5.4.0 version: 5.4.0(@testing-library/dom@10.1.0)(eslint@8.57.0) @@ -243,7 +243,7 @@ importers: version: 4.6.2(eslint@8.57.0) eslint-plugin-testing-library: specifier: ^6.3.0 - version: 6.3.0(eslint@8.57.0)(typescript@5.6.2) + version: 6.3.0(eslint@8.57.0)(typescript@5.7.2) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -258,13 +258,13 @@ importers: version: 5.12.0(rollup@4.23.0) typescript-eslint: specifier: ^7.14.1 - version: 7.14.1(eslint@8.57.0)(typescript@5.6.2) + version: 7.14.1(eslint@8.57.0)(typescript@5.7.2) vite-plugin-wasm: specifier: ^3.3.0 version: 3.3.0(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) + version: 5.0.1(typescript@5.7.2)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) web/packages/design: dependencies: @@ -464,11 +464,11 @@ importers: specifier: ^5.5.0 version: 5.5.0 electron: - specifier: 33.1.0 - version: 33.1.0 + specifier: 33.2.1 + version: 33.2.1 electron-builder: - specifier: ^25.1.7 - version: 25.1.7(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)) + specifier: ^25.1.8 + version: 25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) electron-vite: specifier: ^2.3.0 version: 2.3.0(@swc/core@1.7.26)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) @@ -2971,12 +2971,12 @@ packages: app-builder-bin@5.0.0-alpha.10: resolution: {integrity: sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==} - app-builder-lib@25.1.7: - resolution: {integrity: sha512-JxmN+D/Dn7BLQoN+cTFO+zbMHcpI10v/xjyjFO1FKpHbApOG+OQt/xUyVjKWp4FYplIfuHdpxqTXo1PN/Wzm/A==} + app-builder-lib@25.1.8: + resolution: {integrity: sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 25.1.7 - electron-builder-squirrel-windows: 25.1.7 + dmg-builder: 25.1.8 + electron-builder-squirrel-windows: 25.1.8 append-transform@2.0.0: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} @@ -3719,8 +3719,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@25.1.7: - resolution: {integrity: sha512-Hac0AfXQrAV62JT99Had6bvUJb/f7vjJTaLOsmA/gAQcrc/cLmNAqCJ0ZZDqwKy2+LKXnxx45TvMXvovKd4iMg==} + dmg-builder@25.1.8: + resolution: {integrity: sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -3787,11 +3787,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-builder-squirrel-windows@25.1.7: - resolution: {integrity: sha512-nJMvw1FNy+6YP8HmjSb0JwMowpdlZpydZGab9KevKO/fIC9wTcr5rkhbLsTfEPOjdAqOTycRoK0mOJCFB/1uig==} + electron-builder-squirrel-windows@25.1.8: + resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@25.1.7: - resolution: {integrity: sha512-lsKtX93GSHWnmuteNRvBzgJIjRiiYB0qrJVRjShwBi75Ns+mRdWeOGZiXItqOWj+3g5UyY722kgoq2WlqCB87A==} + electron-builder@25.1.8: + resolution: {integrity: sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==} engines: {node: '>=14.0.0'} hasBin: true @@ -3812,8 +3812,8 @@ packages: '@swc/core': optional: true - electron@33.1.0: - resolution: {integrity: sha512-7KiY6MtRo1fVFLPGyHS7Inh8yZfrbUTy43nNwUgMD2CBk729BgSwOC2WhmcptNJVlzHJpVxSWkiVi2hp9mH/bw==} + electron@33.2.1: + resolution: {integrity: sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg==} engines: {node: '>= 12.20.55'} hasBin: true @@ -5405,8 +5405,8 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -6582,8 +6582,8 @@ packages: typescript: optional: true - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} hasBin: true @@ -8517,15 +8517,15 @@ snapshots: '@types/yargs': 17.0.29 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.7.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.6.2) + react-docgen-typescript: 2.2.2(typescript@5.7.2) vite: 5.4.8(@types/node@20.16.10)(terser@5.31.1) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -9026,7 +9026,7 @@ snapshots: dependencies: storybook: 8.3.4 - '@storybook/builder-vite@8.3.4(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3)': + '@storybook/builder-vite@8.3.4(storybook@8.3.4)(typescript@5.7.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3)': dependencies: '@storybook/csf-plugin': 8.3.4(storybook@8.3.4)(webpack-sources@3.2.3) '@types/find-cache-dir': 3.2.1 @@ -9040,7 +9040,7 @@ snapshots: ts-dedent: 2.2.0 vite: 5.4.8(@types/node@20.16.10)(terser@5.31.1) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - webpack-sources @@ -9108,12 +9108,12 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.3.4 - '@storybook/react-vite@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3)': + '@storybook/react-vite@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.3.4)(typescript@5.7.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3)': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.7.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1)) '@rollup/pluginutils': 5.1.2(rollup@4.23.0) - '@storybook/builder-vite': 8.3.4(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3) - '@storybook/react': 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.6.2) + '@storybook/builder-vite': 8.3.4(storybook@8.3.4)(typescript@5.7.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3) + '@storybook/react': 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.7.2) find-up: 5.0.0 magic-string: 0.30.11 react: 18.3.1 @@ -9132,7 +9132,7 @@ snapshots: - vite-plugin-glimmerx - webpack-sources - '@storybook/react@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.6.2)': + '@storybook/react@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.7.2)': dependencies: '@storybook/components': 8.3.4(storybook@8.3.4) '@storybook/global': 5.0.0 @@ -9158,7 +9158,7 @@ snapshots: type-fest: 2.19.0 util-deprecate: 1.0.2 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 '@storybook/test-runner@0.19.1(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(storybook@8.3.4)': dependencies: @@ -9638,34 +9638,34 @@ snapshots: '@types/node': 20.16.10 optional: true - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/type-utils': 7.14.1(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/visitor-keys': 7.14.1 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 7.14.1 '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.7.2) '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.7 eslint: 8.57.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -9679,15 +9679,15 @@ snapshots: '@typescript-eslint/types': 7.14.1 '@typescript-eslint/visitor-keys': 7.14.1 - '@typescript-eslint/type-utils@7.14.1(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/type-utils@7.14.1(eslint@8.57.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.7.2) + '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.7.2) debug: 4.3.7 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -9695,7 +9695,7 @@ snapshots: '@typescript-eslint/types@7.14.1': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -9703,13 +9703,13 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) + tsutils: 3.21.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@7.14.1(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 7.14.1 '@typescript-eslint/visitor-keys': 7.14.1 @@ -9718,20 +9718,20 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.3 @@ -9739,12 +9739,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.14.1(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/utils@7.14.1(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.14.1 '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.7.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -9929,7 +9929,7 @@ snapshots: app-builder-bin@5.0.0-alpha.10: {} - app-builder-lib@25.1.7(dmg-builder@25.1.7(electron-builder-squirrel-windows@25.1.7))(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)): + app-builder-lib@25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -9945,11 +9945,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.3.7 - dmg-builder: 25.1.7(electron-builder-squirrel-windows@25.1.7) + dmg-builder: 25.1.8(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.6 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.7(dmg-builder@25.1.7) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@25.1.8) electron-publish: 25.1.7 form-data: 4.0.0 fs-extra: 10.1.0 @@ -10562,7 +10562,7 @@ snapshots: config-file-ts@0.2.8-rc1: dependencies: glob: 10.4.5 - typescript: 5.6.2 + typescript: 5.7.2 console-control-strings@1.1.0: {} @@ -10860,9 +10860,9 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@25.1.7(electron-builder-squirrel-windows@25.1.7): + dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 25.1.7(dmg-builder@25.1.7(electron-builder-squirrel-windows@25.1.7))(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)) + app-builder-lib: 25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) builder-util: 25.1.7 builder-util-runtime: 9.2.10 fs-extra: 10.1.0 @@ -10946,9 +10946,9 @@ snapshots: dependencies: jake: 10.8.5 - electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7): + electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8): dependencies: - app-builder-lib: 25.1.7(dmg-builder@25.1.7(electron-builder-squirrel-windows@25.1.7))(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)) + app-builder-lib: 25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -10957,13 +10957,13 @@ snapshots: - dmg-builder - supports-color - electron-builder@25.1.7(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)): + electron-builder@25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)): dependencies: - app-builder-lib: 25.1.7(dmg-builder@25.1.7(electron-builder-squirrel-windows@25.1.7))(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)) + app-builder-lib: 25.1.8(dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8))(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) builder-util: 25.1.7 builder-util-runtime: 9.2.10 chalk: 4.1.2 - dmg-builder: 25.1.7(electron-builder-squirrel-windows@25.1.7) + dmg-builder: 25.1.8(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -11002,7 +11002,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@33.1.0: + electron@33.2.1: dependencies: '@electron/get': 2.0.2 '@types/node': 20.16.10 @@ -11232,43 +11232,43 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.1.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.2(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.2(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -11277,7 +11277,7 @@ snapshots: eslint: 8.57.0 eslint-rule-composer: 0.3.0 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -11288,7 +11288,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -11299,7 +11299,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -11313,12 +11313,12 @@ snapshots: optionalDependencies: '@testing-library/dom': 10.1.0 - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0))(typescript@5.6.2): + eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0))(typescript@5.7.2): dependencies: - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) jest: 29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - supports-color @@ -11350,9 +11350,9 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.6.2): + eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.7.2): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -13101,12 +13101,12 @@ snapshots: ms@2.1.3: {} - msw-storybook-addon@2.0.3(msw@2.4.9(typescript@5.6.2)): + msw-storybook-addon@2.0.3(msw@2.4.9(typescript@5.7.2)): dependencies: is-node-process: 1.2.0 - msw: 2.4.9(typescript@5.6.2) + msw: 2.4.9(typescript@5.7.2) - msw@2.4.9(typescript@5.6.2): + msw@2.4.9(typescript@5.7.2): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 @@ -13126,11 +13126,11 @@ snapshots: type-fest: 4.26.1 yargs: 17.7.2 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 mute-stream@1.0.0: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -13435,13 +13435,13 @@ snapshots: postcss@8.4.38: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.0.1 source-map-js: 1.2.0 postcss@8.4.47: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.0 source-map-js: 1.2.1 @@ -13579,9 +13579,9 @@ snapshots: '@types/node': 22.7.4 '@types/react': 18.3.10 - react-docgen-typescript@2.2.2(typescript@5.6.2): + react-docgen-typescript@2.2.2(typescript@5.7.2): dependencies: - typescript: 5.6.2 + typescript: 5.7.2 react-docgen@7.0.3: dependencies: @@ -14390,15 +14390,15 @@ snapshots: dependencies: utf8-byte-length: 1.0.4 - ts-api-utils@1.3.0(typescript@5.6.2): + ts-api-utils@1.3.0(typescript@5.7.2): dependencies: - typescript: 5.6.2 + typescript: 5.7.2 ts-dedent@2.2.0: {} - tsconfck@3.1.0(typescript@5.6.2): + tsconfck@3.1.0(typescript@5.7.2): optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 tsconfig-paths@3.15.0: dependencies: @@ -14419,10 +14419,10 @@ snapshots: tslib@2.7.0: {} - tsutils@3.21.0(typescript@5.6.2): + tsutils@3.21.0(typescript@5.7.2): dependencies: tslib: 1.14.1 - typescript: 5.6.2 + typescript: 5.7.2 type-check@0.4.0: dependencies: @@ -14484,18 +14484,18 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@7.14.1(eslint@8.57.0)(typescript@5.6.2): + typescript-eslint@7.14.1(eslint@8.57.0)(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - typescript@5.6.2: {} + typescript@5.7.2: {} unbox-primitive@1.0.2: dependencies: @@ -14598,11 +14598,11 @@ snapshots: dependencies: vite: 5.4.8(@types/node@22.7.4)(terser@5.31.1) - vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)): + vite-tsconfig-paths@5.0.1(typescript@5.7.2)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)): dependencies: debug: 4.3.6 globrex: 0.1.2 - tsconfck: 3.1.0(typescript@5.6.2) + tsconfck: 3.1.0(typescript@5.7.2) optionalDependencies: vite: 5.4.8(@types/node@22.7.4)(terser@5.31.1) transitivePeerDependencies: diff --git a/tool/tctl/common/cmds.go b/tool/tctl/common/cmds.go index 1c727eba01e25..c233761e044b9 100644 --- a/tool/tctl/common/cmds.go +++ b/tool/tctl/common/cmds.go @@ -42,6 +42,7 @@ func Commands() []CLICommand { &DesktopCommand{}, &LockCommand{}, &BotsCommand{}, + &WorkloadIdentityCommand{}, &InventoryCommand{}, &RecordingsCommand{}, &AlertCommand{}, diff --git a/tool/tctl/common/collection.go b/tool/tctl/common/collection.go index c5134bb82f617..3c844a28637a7 100644 --- a/tool/tctl/common/collection.go +++ b/tool/tctl/common/collection.go @@ -42,6 +42,7 @@ import ( userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/discoveryconfig" @@ -1784,6 +1785,37 @@ func (c *spiffeFederationCollection) writeText(w io.Writer, verbose bool) error return trace.Wrap(err) } +type workloadIdentityCollection struct { + items []*workloadidentityv1pb.WorkloadIdentity +} + +func (c *workloadIdentityCollection) resources() []types.Resource { + r := make([]types.Resource, 0, len(c.items)) + for _, resource := range c.items { + r = append(r, types.Resource153ToLegacy(resource)) + } + return r +} + +func (c *workloadIdentityCollection) writeText(w io.Writer, verbose bool) error { + headers := []string{"Name", "SPIFFE ID"} + + var rows [][]string + for _, item := range c.items { + rows = append(rows, []string{ + item.Metadata.Name, + item.GetSpec().GetSpiffe().GetId(), + }) + } + + t := asciitable.MakeTable(headers, rows...) + + // stable sort by name. + t.SortRowsBy([]int{0}, true) + _, err := t.AsBuffer().WriteTo(w) + return trace.Wrap(err) +} + type staticHostUserCollection struct { items []*userprovisioningpb.StaticHostUser } diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index a702992f68ea0..3faa1d656fa02 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -55,6 +55,7 @@ import ( userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" "github.com/gravitational/teleport/api/internalutils/stream" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" @@ -171,6 +172,7 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, config *servicec types.KindAccessGraphSettings: rc.upsertAccessGraphSettings, types.KindPlugin: rc.createPlugin, types.KindSPIFFEFederation: rc.createSPIFFEFederation, + types.KindWorkloadIdentity: rc.createWorkloadIdentity, types.KindStaticHostUser: rc.createStaticHostUser, types.KindUserTask: rc.createUserTask, types.KindAutoUpdateConfig: rc.createAutoUpdateConfig, @@ -1076,6 +1078,32 @@ func (rc *ResourceCommand) createSPIFFEFederation(ctx context.Context, client *a return nil } +func (rc *ResourceCommand) createWorkloadIdentity(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + in, err := services.UnmarshalWorkloadIdentity(raw.Raw) + if err != nil { + return trace.Wrap(err) + } + + c := client.WorkloadIdentityResourceServiceClient() + if rc.force { + if _, err := c.UpsertWorkloadIdentity(ctx, &workloadidentityv1pb.UpsertWorkloadIdentityRequest{ + WorkloadIdentity: in, + }); err != nil { + return trace.Wrap(err) + } + } else { + if _, err := c.CreateWorkloadIdentity(ctx, &workloadidentityv1pb.CreateWorkloadIdentityRequest{ + WorkloadIdentity: in, + }); err != nil { + return trace.Wrap(err) + } + } + + fmt.Printf("Workload identity %q has been created\n", in.GetMetadata().GetName()) + + return nil +} + func (rc *ResourceCommand) updateCrownJewel(ctx context.Context, client *authclient.Client, resource services.UnknownResource) error { in, err := services.UnmarshalCrownJewel(resource.Raw) if err != nil { @@ -1969,6 +1997,14 @@ func (rc *ResourceCommand) Delete(ctx context.Context, client *authclient.Client return trace.Wrap(err) } fmt.Printf("SPIFFE federation %q has been deleted\n", rc.ref.Name) + case types.KindWorkloadIdentity: + if _, err := client.WorkloadIdentityResourceServiceClient().DeleteWorkloadIdentity( + ctx, &workloadidentityv1pb.DeleteWorkloadIdentityRequest{ + Name: rc.ref.Name, + }); err != nil { + return trace.Wrap(err) + } + fmt.Printf("Workload identity %q has been deleted\n", rc.ref.Name) case types.KindStaticHostUser: if err := client.StaticHostUserClient().DeleteStaticHostUser(ctx, rc.ref.Name); err != nil { return trace.Wrap(err) @@ -3122,6 +3158,36 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client *authclient } return &spiffeFederationCollection{items: resources}, nil + case types.KindWorkloadIdentity: + if rc.ref.Name != "" { + resource, err := client.WorkloadIdentityResourceServiceClient().GetWorkloadIdentity(ctx, &workloadidentityv1pb.GetWorkloadIdentityRequest{ + Name: rc.ref.Name, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return &workloadIdentityCollection{items: []*workloadidentityv1pb.WorkloadIdentity{resource}}, nil + } + + var resources []*workloadidentityv1pb.WorkloadIdentity + pageToken := "" + for { + resp, err := client.WorkloadIdentityResourceServiceClient().ListWorkloadIdentities(ctx, &workloadidentityv1pb.ListWorkloadIdentitiesRequest{ + PageToken: pageToken, + }) + if err != nil { + return nil, trace.Wrap(err) + } + + resources = append(resources, resp.WorkloadIdentities...) + + if resp.NextPageToken == "" { + break + } + pageToken = resp.NextPageToken + } + + return &workloadIdentityCollection{items: resources}, nil case types.KindBotInstance: if rc.ref.Name != "" && rc.ref.SubKind != "" { // Gets a specific bot instance, e.g. bot_instance// diff --git a/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_ls.golden b/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_ls.golden new file mode 100644 index 0000000000000..80f6254aa91dc --- /dev/null +++ b/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_ls.golden @@ -0,0 +1,4 @@ +Name SPIFFE ID +---- --------- +test /test + diff --git a/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_ls_empty.golden b/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_ls_empty.golden new file mode 100644 index 0000000000000..1e9ddb9aaa645 --- /dev/null +++ b/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_ls_empty.golden @@ -0,0 +1 @@ +No workload identities configured diff --git a/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_rm.golden b/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_rm.golden new file mode 100644 index 0000000000000..3195b79b30d87 --- /dev/null +++ b/tool/tctl/common/testdata/TestWorkloadIdentity/workload-identity_rm.golden @@ -0,0 +1 @@ +Workload Identity "test" deleted successfully. diff --git a/tool/tctl/common/workload_identity_command.go b/tool/tctl/common/workload_identity_command.go new file mode 100644 index 0000000000000..54ceff23dfdaa --- /dev/null +++ b/tool/tctl/common/workload_identity_command.go @@ -0,0 +1,164 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package common + +import ( + "context" + "fmt" + "io" + "os" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/lib/asciitable" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/service/servicecfg" + "github.com/gravitational/teleport/lib/utils" +) + +// WorkloadIdentityCommand is a group of commands pertaining to Teleport +// Workload Identity. +type WorkloadIdentityCommand struct { + format string + workloadIdentityName string + + listCmd *kingpin.CmdClause + rmCmd *kingpin.CmdClause + + stdout io.Writer +} + +// Initialize sets up the "tctl workload-identity" command. +func (c *WorkloadIdentityCommand) Initialize( + app *kingpin.Application, config *servicecfg.Config, +) { + // TODO(noah): Remove the hidden flag once base functionality is released. + cmd := app.Command( + "workload-identity", + "Manage Teleport Workload Identity.", + ).Hidden() + + c.listCmd = cmd.Command( + "ls", + "List workload identity configurations.", + ) + c.listCmd. + Flag( + "format", + "Output format, 'text' or 'json'", + ). + Hidden(). + Default(teleport.Text). + EnumVar(&c.format, teleport.Text, teleport.JSON) + + c.rmCmd = cmd.Command( + "rm", + "Delete a workload identity configuration.", + ) + c.rmCmd. + Arg("name", "Name of the workload identity configuration to delete."). + Required(). + StringVar(&c.workloadIdentityName) + + if c.stdout == nil { + c.stdout = os.Stdout + } +} + +// TryRun attempts to run subcommands. +func (c *WorkloadIdentityCommand) TryRun( + ctx context.Context, cmd string, client *authclient.Client, +) (match bool, err error) { + switch cmd { + case c.listCmd.FullCommand(): + err = c.ListWorkloadIdentities(ctx, client) + case c.rmCmd.FullCommand(): + err = c.DeleteWorkloadIdentity(ctx, client) + default: + return false, nil + } + + return true, trace.Wrap(err) +} + +func (c *WorkloadIdentityCommand) DeleteWorkloadIdentity( + ctx context.Context, + client *authclient.Client, +) error { + workloadIdentityClient := client.WorkloadIdentityResourceServiceClient() + _, err := workloadIdentityClient.DeleteWorkloadIdentity( + ctx, &workloadidentityv1pb.DeleteWorkloadIdentityRequest{ + Name: c.workloadIdentityName, + }) + if err != nil { + return trace.Wrap(err) + } + + fmt.Fprintf( + c.stdout, + "Workload Identity %q deleted successfully.\n", + c.workloadIdentityName, + ) + + return nil +} + +// ListWorkloadIdentities writes a listing of the WorkloadIdentity resources +func (c *WorkloadIdentityCommand) ListWorkloadIdentities( + ctx context.Context, client *authclient.Client, +) error { + workloadIdentityClient := client.WorkloadIdentityResourceServiceClient() + var workloadIdentities []*workloadidentityv1pb.WorkloadIdentity + req := &workloadidentityv1pb.ListWorkloadIdentitiesRequest{} + for { + resp, err := workloadIdentityClient.ListWorkloadIdentities(ctx, req) + if err != nil { + return trace.Wrap(err) + } + + workloadIdentities = append( + workloadIdentities, resp.WorkloadIdentities..., + ) + if resp.NextPageToken == "" { + break + } + req.PageToken = resp.NextPageToken + } + + if c.format == teleport.Text { + if len(workloadIdentities) == 0 { + fmt.Fprintln(c.stdout, "No workload identities configured") + return nil + } + t := asciitable.MakeTable([]string{"Name", "SPIFFE ID"}) + for _, u := range workloadIdentities { + t.AddRow([]string{ + u.GetMetadata().GetName(), u.GetSpec().GetSpiffe().GetId(), + }) + } + fmt.Fprintln(c.stdout, t.AsBuffer().String()) + } else { + err := utils.WriteJSONArray(c.stdout, workloadIdentities) + if err != nil { + return trace.Wrap(err, "failed to marshal workload identities") + } + } + return nil +} diff --git a/tool/tctl/common/workload_identity_test.go b/tool/tctl/common/workload_identity_test.go new file mode 100644 index 0000000000000..818ec2cb1d8f4 --- /dev/null +++ b/tool/tctl/common/workload_identity_test.go @@ -0,0 +1,163 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "bytes" + "os" + "path/filepath" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + "gopkg.in/yaml.v3" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/golden" + "github.com/gravitational/teleport/tool/teleport/testenv" +) + +func runWorkloadIdentityCommand( + t *testing.T, clt *authclient.Client, args []string, +) (*bytes.Buffer, error) { + var stdoutBuf bytes.Buffer + cmd := &WorkloadIdentityCommand{ + stdout: &stdoutBuf, + } + return &stdoutBuf, runCommand(t, clt, cmd, args) +} + +func TestWorkloadIdentity(t *testing.T) { + t.Parallel() + + process := testenv.MakeTestServer(t, testenv.WithLogger(utils.NewSlogLoggerForTests())) + rootClient := testenv.MakeDefaultAuthClient(t, process) + + yamlData := `kind: workload_identity +version: v1 +metadata: + name: test +spec: + spiffe: + id: /test +` + var expected workloadidentityv1pb.WorkloadIdentity + require.NoError(t, yaml.Unmarshal([]byte(yamlData), &expected)) + + t.Run("workload-identity ls empty", func(t *testing.T) { + buf, err := runWorkloadIdentityCommand( + t, rootClient, []string{ + "workload-identity", "ls", + }, + ) + require.NoError(t, err) + if golden.ShouldSet() { + golden.Set(t, buf.Bytes()) + } + require.Equal(t, string(golden.Get(t)), buf.String()) + }) + + t.Run("resource list empty", func(t *testing.T) { + buf, err := runResourceCommand( + t, rootClient, []string{ + "get", + types.KindWorkloadIdentity, + "--format=json", + }, + ) + require.NoError(t, err) + + resources := mustDecodeJSON[[]*workloadidentityv1pb.WorkloadIdentity](t, buf) + require.Empty(t, resources) + }) + + t.Run("create", func(t *testing.T) { + + yamlPath := filepath.Join(t.TempDir(), "workload_identity.yaml") + require.NoError(t, os.WriteFile(yamlPath, []byte(yamlData), 0644)) + _, err := runResourceCommand(t, rootClient, []string{"create", yamlPath}) + require.NoError(t, err) + }) + + t.Run("workload-identity ls", func(t *testing.T) { + buf, err := runWorkloadIdentityCommand( + t, rootClient, []string{ + "workload-identity", "ls", + }, + ) + require.NoError(t, err) + if golden.ShouldSet() { + golden.Set(t, buf.Bytes()) + } + require.Equal(t, string(golden.Get(t)), buf.String()) + }) + + t.Run("resource list", func(t *testing.T) { + buf, err := runResourceCommand( + t, rootClient, []string{ + "get", + types.KindWorkloadIdentity, + "--format=json", + }, + ) + require.NoError(t, err) + + resources := mustDecodeJSON[[]*workloadidentityv1pb.WorkloadIdentity](t, buf) + require.NotEmpty(t, resources) + require.Empty(t, cmp.Diff( + []*workloadidentityv1pb.WorkloadIdentity{&expected}, + resources, + protocmp.Transform(), + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision"), + )) + }) + + t.Run("workload-identity rm", func(t *testing.T) { + buf, err := runWorkloadIdentityCommand( + t, rootClient, []string{ + "workload-identity", "rm", + expected.GetMetadata().GetName(), + }, + ) + require.NoError(t, err) + if golden.ShouldSet() { + golden.Set(t, buf.Bytes()) + } + require.Equal(t, string(golden.Get(t)), buf.String()) + }) + + t.Run("resource list empty after delete", func(t *testing.T) { + buf, err := runResourceCommand( + t, rootClient, []string{ + "get", + types.KindWorkloadIdentity, + "--format=json", + }, + ) + require.NoError(t, err) + + resources := mustDecodeJSON[[]*workloadidentityv1pb.WorkloadIdentity](t, buf) + require.Empty(t, resources) + }) +} diff --git a/tool/tsh/common/tsh_test.go b/tool/tsh/common/tsh_test.go index d8c58df31ec99..e19a3b945517d 100644 --- a/tool/tsh/common/tsh_test.go +++ b/tool/tsh/common/tsh_test.go @@ -5871,11 +5871,11 @@ func TestLogout(t *testing.T) { err = Run(context.Background(), []string{"logout"}, setHomePath(tmpHomePath)) require.NoError(t, err, trace.DebugReport(err)) - // direcory should be empty. + // directory should be empty. f, err := os.Open(tmpHomePath) require.NoError(t, err) - _, err = f.Readdir(1) - require.ErrorIs(t, err, io.EOF) + entries, err := f.ReadDir(1) + require.ErrorIs(t, err, io.EOF, "expected empty directory, but found %v", entries) }) } } diff --git a/web/packages/design/src/Alert/Alert.story.tsx b/web/packages/design/src/Alert/Alert.story.tsx index 3751836206ab9..422cbec301dee 100644 --- a/web/packages/design/src/Alert/Alert.story.tsx +++ b/web/packages/design/src/Alert/Alert.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Restore } from 'design/Icon'; import { Box } from '..'; diff --git a/web/packages/design/src/Alert/Alert.test.tsx b/web/packages/design/src/Alert/Alert.test.tsx index 16000b2f29510..d5eedcf377f2b 100644 --- a/web/packages/design/src/Alert/Alert.test.tsx +++ b/web/packages/design/src/Alert/Alert.test.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render, screen, theme, userEvent } from 'design/utils/testing'; import { Alert, Banner } from '.'; diff --git a/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.story.tsx b/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.story.tsx index 2c2305301d031..f21bdba181929 100644 --- a/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.story.tsx +++ b/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { AnimatedProgressBar as Component } from './AnimatedProgressBar'; export default { diff --git a/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.tsx b/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.tsx index d5ad45a1f3bd0..928a91b36b533 100644 --- a/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.tsx +++ b/web/packages/design/src/AnimatedProgressBar/AnimatedProgressBar.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import Flex from '../Flex'; diff --git a/web/packages/design/src/Box/Box.story.tsx b/web/packages/design/src/Box/Box.story.tsx index 947f24c8042ac..6c2332ba35d7e 100644 --- a/web/packages/design/src/Box/Box.story.tsx +++ b/web/packages/design/src/Box/Box.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import styled from 'styled-components'; import Box from './Box'; diff --git a/web/packages/design/src/Button/buttons.story.tsx b/web/packages/design/src/Button/buttons.story.tsx index b885753e46852..1ad26d1a361ad 100644 --- a/web/packages/design/src/Button/buttons.story.tsx +++ b/web/packages/design/src/Button/buttons.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React from 'react'; +import { Fragment } from 'react'; import styled from 'styled-components'; @@ -66,7 +66,7 @@ export const Buttons = () => { {fills.map(fill => ( - + {fill} neutral @@ -84,7 +84,7 @@ export const Buttons = () => { success - + ))} {' '} diff --git a/web/packages/design/src/ButtonIcon/ButtonIcon.jsx b/web/packages/design/src/ButtonIcon/ButtonIcon.jsx index 96fa44907e0e5..7a73900fe8e6d 100644 --- a/web/packages/design/src/ButtonIcon/ButtonIcon.jsx +++ b/web/packages/design/src/ButtonIcon/ButtonIcon.jsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { space, color, alignSelf } from 'design/system'; diff --git a/web/packages/design/src/ButtonIcon/ButtonIcon.test.jsx b/web/packages/design/src/ButtonIcon/ButtonIcon.test.jsx index d4f17256db13b..a95dfe77771d7 100644 --- a/web/packages/design/src/ButtonIcon/ButtonIcon.test.jsx +++ b/web/packages/design/src/ButtonIcon/ButtonIcon.test.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render } from 'design/utils/testing'; import ButtonIcon from './index'; diff --git a/web/packages/design/src/ButtonLink/ButtonLink.test.tsx b/web/packages/design/src/ButtonLink/ButtonLink.test.tsx index e72657b715dbc..ee105a2c9fc5f 100644 --- a/web/packages/design/src/ButtonLink/ButtonLink.test.tsx +++ b/web/packages/design/src/ButtonLink/ButtonLink.test.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render } from 'design/utils/testing'; import ButtonLink from './index'; diff --git a/web/packages/design/src/ButtonLink/ButtonLink.tsx b/web/packages/design/src/ButtonLink/ButtonLink.tsx index 12b3ed65020ab..38eb9261fb6c1 100644 --- a/web/packages/design/src/ButtonLink/ButtonLink.tsx +++ b/web/packages/design/src/ButtonLink/ButtonLink.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { Button, ButtonProps } from 'design/Button'; diff --git a/web/packages/design/src/Card/Card.story.tsx b/web/packages/design/src/Card/Card.story.tsx index c3f97c4984b67..32fc41fc11834 100644 --- a/web/packages/design/src/Card/Card.story.tsx +++ b/web/packages/design/src/Card/Card.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Flex, Text } from '..'; import Card from '.'; diff --git a/web/packages/design/src/CardError/CardError.jsx b/web/packages/design/src/CardError/CardError.jsx index 0443d9ba83325..76b2b1564fb5e 100644 --- a/web/packages/design/src/CardError/CardError.jsx +++ b/web/packages/design/src/CardError/CardError.jsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import PropTypes from 'prop-types'; import styled from 'styled-components'; diff --git a/web/packages/design/src/CardError/CardError.story.jsx b/web/packages/design/src/CardError/CardError.story.jsx index ca2a00143cf2f..ae51dc44a009d 100644 --- a/web/packages/design/src/CardError/CardError.story.jsx +++ b/web/packages/design/src/CardError/CardError.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import * as CardError from './CardError'; const message = 'some error message'; diff --git a/web/packages/design/src/CardIcon/CardIcon.jsx b/web/packages/design/src/CardIcon/CardIcon.jsx index 59773128fd4c2..3d11845a9a8f6 100644 --- a/web/packages/design/src/CardIcon/CardIcon.jsx +++ b/web/packages/design/src/CardIcon/CardIcon.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Card from 'design/Card'; import { H1 } from 'design'; diff --git a/web/packages/design/src/CardIcon/CardIcon.story.jsx b/web/packages/design/src/CardIcon/CardIcon.story.jsx index ea17e5d6da50a..a39a5c7addb4a 100644 --- a/web/packages/design/src/CardIcon/CardIcon.story.jsx +++ b/web/packages/design/src/CardIcon/CardIcon.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Apple } from '../Icon'; import CardIcon from './index'; diff --git a/web/packages/design/src/CardSuccess/CardSuccess.jsx b/web/packages/design/src/CardSuccess/CardSuccess.jsx index 62f0923640eb9..cbef579df5577 100644 --- a/web/packages/design/src/CardSuccess/CardSuccess.jsx +++ b/web/packages/design/src/CardSuccess/CardSuccess.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import CardIcon from 'design/CardIcon'; import { CircleCheck } from 'design/Icon'; diff --git a/web/packages/design/src/CardSuccess/CardSuccess.story.jsx b/web/packages/design/src/CardSuccess/CardSuccess.story.jsx index 4497545492023..5da295230e5dc 100644 --- a/web/packages/design/src/CardSuccess/CardSuccess.story.jsx +++ b/web/packages/design/src/CardSuccess/CardSuccess.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import CardSuccess, { CardSuccessLogin } from './index'; export default { diff --git a/web/packages/design/src/Checkbox/Checkbox.story.tsx b/web/packages/design/src/Checkbox/Checkbox.story.tsx index 1d3e737327381..0072618366112 100644 --- a/web/packages/design/src/Checkbox/Checkbox.story.tsx +++ b/web/packages/design/src/Checkbox/Checkbox.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import styled from 'styled-components'; import { Flex } from '..'; diff --git a/web/packages/design/src/DataTable/InputSearch/InputSearch.tsx b/web/packages/design/src/DataTable/InputSearch/InputSearch.tsx index 57ba12a521071..e701adb5c6a62 100644 --- a/web/packages/design/src/DataTable/InputSearch/InputSearch.tsx +++ b/web/packages/design/src/DataTable/InputSearch/InputSearch.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { JSX, FormEvent } from 'react'; +import { JSX, FormEvent } from 'react'; import styled from 'styled-components'; import { diff --git a/web/packages/design/src/DataTable/Pager/ClientSidePager/ClientSidePager.tsx b/web/packages/design/src/DataTable/Pager/ClientSidePager/ClientSidePager.tsx index b75a0032fc96d..5129ee3bcd2b0 100644 --- a/web/packages/design/src/DataTable/Pager/ClientSidePager/ClientSidePager.tsx +++ b/web/packages/design/src/DataTable/Pager/ClientSidePager/ClientSidePager.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Flex } from 'design'; import { CircleArrowLeft, CircleArrowRight } from 'design/Icon'; import { PageIndicatorText } from 'design/DataTable/Pager/PageIndicatorText'; diff --git a/web/packages/design/src/DataTable/Pager/PageIndicatorText.tsx b/web/packages/design/src/DataTable/Pager/PageIndicatorText.tsx index c0d39004116ae..bed92e5288bbd 100644 --- a/web/packages/design/src/DataTable/Pager/PageIndicatorText.tsx +++ b/web/packages/design/src/DataTable/Pager/PageIndicatorText.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Text } from 'design'; export function PageIndicatorText({ diff --git a/web/packages/design/src/DataTable/Pager/ServerSidePager.tsx b/web/packages/design/src/DataTable/Pager/ServerSidePager.tsx index ab194d151b798..fa98b06771625 100644 --- a/web/packages/design/src/DataTable/Pager/ServerSidePager.tsx +++ b/web/packages/design/src/DataTable/Pager/ServerSidePager.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Flex } from 'design'; import { CircleArrowLeft, CircleArrowRight } from 'design/Icon'; diff --git a/web/packages/design/src/DataTable/Table.test.tsx b/web/packages/design/src/DataTable/Table.test.tsx index 77ee038dbfb9d..eef900310b99d 100644 --- a/web/packages/design/src/DataTable/Table.test.tsx +++ b/web/packages/design/src/DataTable/Table.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; diff --git a/web/packages/design/src/Dialog/Dialog.story.jsx b/web/packages/design/src/Dialog/Dialog.story.jsx index 812401753150b..8bbde5665b2e3 100644 --- a/web/packages/design/src/Dialog/Dialog.story.jsx +++ b/web/packages/design/src/Dialog/Dialog.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { ButtonPrimary, Input, LabelInput } from './..'; import Dialog, { diff --git a/web/packages/design/src/Dialog/DialogHeader.jsx b/web/packages/design/src/Dialog/DialogHeader.jsx index ff30b39d7e65f..43bd809df8e0b 100644 --- a/web/packages/design/src/Dialog/DialogHeader.jsx +++ b/web/packages/design/src/Dialog/DialogHeader.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import styled from 'styled-components'; import { typography } from 'design/system'; diff --git a/web/packages/design/src/Dialog/DialogTitle.jsx b/web/packages/design/src/Dialog/DialogTitle.jsx index 0ad1e7c03b349..df9ab4beb45f7 100644 --- a/web/packages/design/src/Dialog/DialogTitle.jsx +++ b/web/packages/design/src/Dialog/DialogTitle.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { H2 } from 'design'; export default function DialogTitle(props) { diff --git a/web/packages/design/src/Flex/Flex.story.jsx b/web/packages/design/src/Flex/Flex.story.jsx index dd64b1c07f0d9..8f57b04789139 100644 --- a/web/packages/design/src/Flex/Flex.story.jsx +++ b/web/packages/design/src/Flex/Flex.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import styled from 'styled-components'; import Box from '../Box'; diff --git a/web/packages/design/src/Icon/Icons/Add.tsx b/web/packages/design/src/Icon/Icons/Add.tsx index eb99f4bdb9779..67a9d045f54bf 100644 --- a/web/packages/design/src/Icon/Icons/Add.tsx +++ b/web/packages/design/src/Icon/Icons/Add.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/AddCircle.tsx b/web/packages/design/src/Icon/Icons/AddCircle.tsx index 59af81a7f7a91..a45873ed1cdc5 100644 --- a/web/packages/design/src/Icon/Icons/AddCircle.tsx +++ b/web/packages/design/src/Icon/Icons/AddCircle.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/AddUsers.tsx b/web/packages/design/src/Icon/Icons/AddUsers.tsx index 080e21809b28e..4daa30af03e9e 100644 --- a/web/packages/design/src/Icon/Icons/AddUsers.tsx +++ b/web/packages/design/src/Icon/Icons/AddUsers.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/AlarmRing.tsx b/web/packages/design/src/Icon/Icons/AlarmRing.tsx index 8ddbb2030df91..3a281b895a7a2 100644 --- a/web/packages/design/src/Icon/Icons/AlarmRing.tsx +++ b/web/packages/design/src/Icon/Icons/AlarmRing.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/AmazonAws.tsx b/web/packages/design/src/Icon/Icons/AmazonAws.tsx index 149c2646198d5..2a7d1c3d25c93 100644 --- a/web/packages/design/src/Icon/Icons/AmazonAws.tsx +++ b/web/packages/design/src/Icon/Icons/AmazonAws.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Apartment.tsx b/web/packages/design/src/Icon/Icons/Apartment.tsx index 260ad5226c710..c7f94a1dd130f 100644 --- a/web/packages/design/src/Icon/Icons/Apartment.tsx +++ b/web/packages/design/src/Icon/Icons/Apartment.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Apple.tsx b/web/packages/design/src/Icon/Icons/Apple.tsx index 08e51b7e8ae06..1646852494d26 100644 --- a/web/packages/design/src/Icon/Icons/Apple.tsx +++ b/web/packages/design/src/Icon/Icons/Apple.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Application.tsx b/web/packages/design/src/Icon/Icons/Application.tsx index 1fdacf70dfe6c..8463784e06942 100644 --- a/web/packages/design/src/Icon/Icons/Application.tsx +++ b/web/packages/design/src/Icon/Icons/Application.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Archive.tsx b/web/packages/design/src/Icon/Icons/Archive.tsx index da51153f2eb18..bb0d928fa815b 100644 --- a/web/packages/design/src/Icon/Icons/Archive.tsx +++ b/web/packages/design/src/Icon/Icons/Archive.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowBack.tsx b/web/packages/design/src/Icon/Icons/ArrowBack.tsx index 6f932b80f32c8..0de01b394a7f4 100644 --- a/web/packages/design/src/Icon/Icons/ArrowBack.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowBack.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowDown.tsx b/web/packages/design/src/Icon/Icons/ArrowDown.tsx index 6d5d38e5f95e6..907178413e8f6 100644 --- a/web/packages/design/src/Icon/Icons/ArrowDown.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowDown.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowFatLinesUp.tsx b/web/packages/design/src/Icon/Icons/ArrowFatLinesUp.tsx index c8789f01ec5db..90f912bc95c73 100644 --- a/web/packages/design/src/Icon/Icons/ArrowFatLinesUp.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowFatLinesUp.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowForward.tsx b/web/packages/design/src/Icon/Icons/ArrowForward.tsx index dd6f14eef2a34..50c9157d56b48 100644 --- a/web/packages/design/src/Icon/Icons/ArrowForward.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowForward.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowLeft.tsx b/web/packages/design/src/Icon/Icons/ArrowLeft.tsx index bb128b9f13994..a7496ae93920f 100644 --- a/web/packages/design/src/Icon/Icons/ArrowLeft.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowLeft.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowLineLeft.tsx b/web/packages/design/src/Icon/Icons/ArrowLineLeft.tsx index 524da7bfd894e..8eceb19b95985 100644 --- a/web/packages/design/src/Icon/Icons/ArrowLineLeft.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowLineLeft.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowRight.tsx b/web/packages/design/src/Icon/Icons/ArrowRight.tsx index b293a34537761..3ac8846d4a811 100644 --- a/web/packages/design/src/Icon/Icons/ArrowRight.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowRight.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowSquareOut.tsx b/web/packages/design/src/Icon/Icons/ArrowSquareOut.tsx index 473f8f12a2dda..309810dcea743 100644 --- a/web/packages/design/src/Icon/Icons/ArrowSquareOut.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowSquareOut.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowUp.tsx b/web/packages/design/src/Icon/Icons/ArrowUp.tsx index 6c6d89e584255..b932ea5886975 100644 --- a/web/packages/design/src/Icon/Icons/ArrowUp.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowUp.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowsIn.tsx b/web/packages/design/src/Icon/Icons/ArrowsIn.tsx index f1c7736116eb2..d5e54b7bbf996 100644 --- a/web/packages/design/src/Icon/Icons/ArrowsIn.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowsIn.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ArrowsOut.tsx b/web/packages/design/src/Icon/Icons/ArrowsOut.tsx index 2f67140ef38bd..215beffb58f77 100644 --- a/web/packages/design/src/Icon/Icons/ArrowsOut.tsx +++ b/web/packages/design/src/Icon/Icons/ArrowsOut.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/BellRinging.tsx b/web/packages/design/src/Icon/Icons/BellRinging.tsx index 0c044d83711d1..97cea1e9e506f 100644 --- a/web/packages/design/src/Icon/Icons/BellRinging.tsx +++ b/web/packages/design/src/Icon/Icons/BellRinging.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/BookOpenText.tsx b/web/packages/design/src/Icon/Icons/BookOpenText.tsx index 11bc990e199e9..aa86e0a5d0f18 100644 --- a/web/packages/design/src/Icon/Icons/BookOpenText.tsx +++ b/web/packages/design/src/Icon/Icons/BookOpenText.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Bots.tsx b/web/packages/design/src/Icon/Icons/Bots.tsx index fed9d36a2a789..d58983844689b 100644 --- a/web/packages/design/src/Icon/Icons/Bots.tsx +++ b/web/packages/design/src/Icon/Icons/Bots.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Broadcast.tsx b/web/packages/design/src/Icon/Icons/Broadcast.tsx index 86934a91464cf..160e232e2f3b2 100644 --- a/web/packages/design/src/Icon/Icons/Broadcast.tsx +++ b/web/packages/design/src/Icon/Icons/Broadcast.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/BroadcastSlash.tsx b/web/packages/design/src/Icon/Icons/BroadcastSlash.tsx index 9ee535f661831..9daee15d4bced 100644 --- a/web/packages/design/src/Icon/Icons/BroadcastSlash.tsx +++ b/web/packages/design/src/Icon/Icons/BroadcastSlash.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Bubble.tsx b/web/packages/design/src/Icon/Icons/Bubble.tsx index 120637bae25a1..c94ada7cff62e 100644 --- a/web/packages/design/src/Icon/Icons/Bubble.tsx +++ b/web/packages/design/src/Icon/Icons/Bubble.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CCAmex.tsx b/web/packages/design/src/Icon/Icons/CCAmex.tsx index 4237484ba8e40..542d55fc92e10 100644 --- a/web/packages/design/src/Icon/Icons/CCAmex.tsx +++ b/web/packages/design/src/Icon/Icons/CCAmex.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CCDiscover.tsx b/web/packages/design/src/Icon/Icons/CCDiscover.tsx index 4324a3be10807..7667482ecc24c 100644 --- a/web/packages/design/src/Icon/Icons/CCDiscover.tsx +++ b/web/packages/design/src/Icon/Icons/CCDiscover.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CCMasterCard.tsx b/web/packages/design/src/Icon/Icons/CCMasterCard.tsx index 81eb50f65dea5..436f1275d9755 100644 --- a/web/packages/design/src/Icon/Icons/CCMasterCard.tsx +++ b/web/packages/design/src/Icon/Icons/CCMasterCard.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CCStripe.tsx b/web/packages/design/src/Icon/Icons/CCStripe.tsx index 278ba8363d098..b4ba6f3287ca1 100644 --- a/web/packages/design/src/Icon/Icons/CCStripe.tsx +++ b/web/packages/design/src/Icon/Icons/CCStripe.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CCVisa.tsx b/web/packages/design/src/Icon/Icons/CCVisa.tsx index 1d99eb0eeec75..0d72543be8e63 100644 --- a/web/packages/design/src/Icon/Icons/CCVisa.tsx +++ b/web/packages/design/src/Icon/Icons/CCVisa.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CSSVisa.tsx b/web/packages/design/src/Icon/Icons/CSSVisa.tsx index 3ca96caf66a66..01a5c148e061c 100644 --- a/web/packages/design/src/Icon/Icons/CSSVisa.tsx +++ b/web/packages/design/src/Icon/Icons/CSSVisa.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Calendar.tsx b/web/packages/design/src/Icon/Icons/Calendar.tsx index 64bacd022aebe..224ee96feacf9 100644 --- a/web/packages/design/src/Icon/Icons/Calendar.tsx +++ b/web/packages/design/src/Icon/Icons/Calendar.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Camera.tsx b/web/packages/design/src/Icon/Icons/Camera.tsx index 521d795803d6e..a8d7d728bbb09 100644 --- a/web/packages/design/src/Icon/Icons/Camera.tsx +++ b/web/packages/design/src/Icon/Icons/Camera.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CardView.tsx b/web/packages/design/src/Icon/Icons/CardView.tsx index d3e1c32781c38..ee0dcc238e8c9 100644 --- a/web/packages/design/src/Icon/Icons/CardView.tsx +++ b/web/packages/design/src/Icon/Icons/CardView.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Cash.tsx b/web/packages/design/src/Icon/Icons/Cash.tsx index 9d8827f181cb6..83dd3b199412c 100644 --- a/web/packages/design/src/Icon/Icons/Cash.tsx +++ b/web/packages/design/src/Icon/Icons/Cash.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Chart.tsx b/web/packages/design/src/Icon/Icons/Chart.tsx index f6acc8c2b1ad5..4baecea557d5a 100644 --- a/web/packages/design/src/Icon/Icons/Chart.tsx +++ b/web/packages/design/src/Icon/Icons/Chart.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChatBubble.tsx b/web/packages/design/src/Icon/Icons/ChatBubble.tsx index 2c5878e3707a8..ed809e95fc934 100644 --- a/web/packages/design/src/Icon/Icons/ChatBubble.tsx +++ b/web/packages/design/src/Icon/Icons/ChatBubble.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChatCircleSparkle.tsx b/web/packages/design/src/Icon/Icons/ChatCircleSparkle.tsx index 3ded36c468373..cd046fb281347 100644 --- a/web/packages/design/src/Icon/Icons/ChatCircleSparkle.tsx +++ b/web/packages/design/src/Icon/Icons/ChatCircleSparkle.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Check.tsx b/web/packages/design/src/Icon/Icons/Check.tsx index bbfe128b1a3de..f1de7010e4f3f 100644 --- a/web/packages/design/src/Icon/Icons/Check.tsx +++ b/web/packages/design/src/Icon/Icons/Check.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CheckThick.tsx b/web/packages/design/src/Icon/Icons/CheckThick.tsx index 17dedac23d247..486e3c7aa923f 100644 --- a/web/packages/design/src/Icon/Icons/CheckThick.tsx +++ b/web/packages/design/src/Icon/Icons/CheckThick.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Checks.tsx b/web/packages/design/src/Icon/Icons/Checks.tsx index 6057c8f896e74..d954dc9280dbc 100644 --- a/web/packages/design/src/Icon/Icons/Checks.tsx +++ b/web/packages/design/src/Icon/Icons/Checks.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronCircleDown.tsx b/web/packages/design/src/Icon/Icons/ChevronCircleDown.tsx index b61fc25e10435..91a7c1f7a5b16 100644 --- a/web/packages/design/src/Icon/Icons/ChevronCircleDown.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronCircleDown.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronCircleLeft.tsx b/web/packages/design/src/Icon/Icons/ChevronCircleLeft.tsx index 7253d6dbc08dd..104a4df38804c 100644 --- a/web/packages/design/src/Icon/Icons/ChevronCircleLeft.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronCircleLeft.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronCircleRight.tsx b/web/packages/design/src/Icon/Icons/ChevronCircleRight.tsx index 2fef67ed3f2a4..47ccf26a49971 100644 --- a/web/packages/design/src/Icon/Icons/ChevronCircleRight.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronCircleRight.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronCircleUp.tsx b/web/packages/design/src/Icon/Icons/ChevronCircleUp.tsx index ddf2e2d3b2d48..f985f5e66c6a0 100644 --- a/web/packages/design/src/Icon/Icons/ChevronCircleUp.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronCircleUp.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronDown.tsx b/web/packages/design/src/Icon/Icons/ChevronDown.tsx index a04f7869e449a..c5af174bfec8e 100644 --- a/web/packages/design/src/Icon/Icons/ChevronDown.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronDown.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronLeft.tsx b/web/packages/design/src/Icon/Icons/ChevronLeft.tsx index 707a833332bcc..85b71f40eaadf 100644 --- a/web/packages/design/src/Icon/Icons/ChevronLeft.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronLeft.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronRight.tsx b/web/packages/design/src/Icon/Icons/ChevronRight.tsx index 42b897a9a5f16..7f4a6d0191a2d 100644 --- a/web/packages/design/src/Icon/Icons/ChevronRight.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronRight.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronUp.tsx b/web/packages/design/src/Icon/Icons/ChevronUp.tsx index 5d47af3827cfc..c5fd2eb30803d 100644 --- a/web/packages/design/src/Icon/Icons/ChevronUp.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronUp.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ChevronsVertical.tsx b/web/packages/design/src/Icon/Icons/ChevronsVertical.tsx index e07fe1e817502..347ff0b8b9c08 100644 --- a/web/packages/design/src/Icon/Icons/ChevronsVertical.tsx +++ b/web/packages/design/src/Icon/Icons/ChevronsVertical.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CircleArrowLeft.tsx b/web/packages/design/src/Icon/Icons/CircleArrowLeft.tsx index edc3c68e0b32a..8012d3142b1a9 100644 --- a/web/packages/design/src/Icon/Icons/CircleArrowLeft.tsx +++ b/web/packages/design/src/Icon/Icons/CircleArrowLeft.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CircleArrowRight.tsx b/web/packages/design/src/Icon/Icons/CircleArrowRight.tsx index 1bb9287126811..7001c924817cb 100644 --- a/web/packages/design/src/Icon/Icons/CircleArrowRight.tsx +++ b/web/packages/design/src/Icon/Icons/CircleArrowRight.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CircleCheck.tsx b/web/packages/design/src/Icon/Icons/CircleCheck.tsx index f85d9c91705cd..39db44d733a33 100644 --- a/web/packages/design/src/Icon/Icons/CircleCheck.tsx +++ b/web/packages/design/src/Icon/Icons/CircleCheck.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CircleCross.tsx b/web/packages/design/src/Icon/Icons/CircleCross.tsx index e383743fb3ccb..aa3a24cb51552 100644 --- a/web/packages/design/src/Icon/Icons/CircleCross.tsx +++ b/web/packages/design/src/Icon/Icons/CircleCross.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CirclePause.tsx b/web/packages/design/src/Icon/Icons/CirclePause.tsx index 119b9a8330427..3150774b82681 100644 --- a/web/packages/design/src/Icon/Icons/CirclePause.tsx +++ b/web/packages/design/src/Icon/Icons/CirclePause.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CirclePlay.tsx b/web/packages/design/src/Icon/Icons/CirclePlay.tsx index aa490f81b5b64..c28d3546b650d 100644 --- a/web/packages/design/src/Icon/Icons/CirclePlay.tsx +++ b/web/packages/design/src/Icon/Icons/CirclePlay.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CircleStop.tsx b/web/packages/design/src/Icon/Icons/CircleStop.tsx index ba68d53bf4785..efaaa00e62d01 100644 --- a/web/packages/design/src/Icon/Icons/CircleStop.tsx +++ b/web/packages/design/src/Icon/Icons/CircleStop.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Cli.tsx b/web/packages/design/src/Icon/Icons/Cli.tsx index bde9ff9e3dfe7..7222ba641585e 100644 --- a/web/packages/design/src/Icon/Icons/Cli.tsx +++ b/web/packages/design/src/Icon/Icons/Cli.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Clipboard.tsx b/web/packages/design/src/Icon/Icons/Clipboard.tsx index 7cfec4410b59e..b15961ca1cba0 100644 --- a/web/packages/design/src/Icon/Icons/Clipboard.tsx +++ b/web/packages/design/src/Icon/Icons/Clipboard.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ClipboardUser.tsx b/web/packages/design/src/Icon/Icons/ClipboardUser.tsx index 6b713a451cfc6..367ab412e6c65 100644 --- a/web/packages/design/src/Icon/Icons/ClipboardUser.tsx +++ b/web/packages/design/src/Icon/Icons/ClipboardUser.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Clock.tsx b/web/packages/design/src/Icon/Icons/Clock.tsx index d43cb8b15cfe4..edcea59a432c7 100644 --- a/web/packages/design/src/Icon/Icons/Clock.tsx +++ b/web/packages/design/src/Icon/Icons/Clock.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Cloud.tsx b/web/packages/design/src/Icon/Icons/Cloud.tsx index bb8d72741b061..a9a6177628e8e 100644 --- a/web/packages/design/src/Icon/Icons/Cloud.tsx +++ b/web/packages/design/src/Icon/Icons/Cloud.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Cluster.tsx b/web/packages/design/src/Icon/Icons/Cluster.tsx index 5ef9e15d0bc82..0401a992421c8 100644 --- a/web/packages/design/src/Icon/Icons/Cluster.tsx +++ b/web/packages/design/src/Icon/Icons/Cluster.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Code.tsx b/web/packages/design/src/Icon/Icons/Code.tsx index f5121d10f974f..60d05a8959e99 100644 --- a/web/packages/design/src/Icon/Icons/Code.tsx +++ b/web/packages/design/src/Icon/Icons/Code.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Cog.tsx b/web/packages/design/src/Icon/Icons/Cog.tsx index b8d0f185b681c..9f1d1d4b2e5cd 100644 --- a/web/packages/design/src/Icon/Icons/Cog.tsx +++ b/web/packages/design/src/Icon/Icons/Cog.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Config.tsx b/web/packages/design/src/Icon/Icons/Config.tsx index 8f7dffeafc9fb..aaa2de7747b90 100644 --- a/web/packages/design/src/Icon/Icons/Config.tsx +++ b/web/packages/design/src/Icon/Icons/Config.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Contract.tsx b/web/packages/design/src/Icon/Icons/Contract.tsx index 76eeec7826f8d..7a900edf4bf0b 100644 --- a/web/packages/design/src/Icon/Icons/Contract.tsx +++ b/web/packages/design/src/Icon/Icons/Contract.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Copy.tsx b/web/packages/design/src/Icon/Icons/Copy.tsx index 81ffc53347451..a27280c09fb7c 100644 --- a/web/packages/design/src/Icon/Icons/Copy.tsx +++ b/web/packages/design/src/Icon/Icons/Copy.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/CreditCard.tsx b/web/packages/design/src/Icon/Icons/CreditCard.tsx index 73f184fd807a9..5911ddc3140d0 100644 --- a/web/packages/design/src/Icon/Icons/CreditCard.tsx +++ b/web/packages/design/src/Icon/Icons/CreditCard.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Cross.tsx b/web/packages/design/src/Icon/Icons/Cross.tsx index a127d46357fe9..dc9545e4e1bb0 100644 --- a/web/packages/design/src/Icon/Icons/Cross.tsx +++ b/web/packages/design/src/Icon/Icons/Cross.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Crown.tsx b/web/packages/design/src/Icon/Icons/Crown.tsx index 8b00c37fa6e35..4d6ccb97d9d43 100644 --- a/web/packages/design/src/Icon/Icons/Crown.tsx +++ b/web/packages/design/src/Icon/Icons/Crown.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Database.tsx b/web/packages/design/src/Icon/Icons/Database.tsx index 342af6baaa3a7..7c0b1a2b14be6 100644 --- a/web/packages/design/src/Icon/Icons/Database.tsx +++ b/web/packages/design/src/Icon/Icons/Database.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Desktop.tsx b/web/packages/design/src/Icon/Icons/Desktop.tsx index 14bea61e48f28..5ecdbec38b5a2 100644 --- a/web/packages/design/src/Icon/Icons/Desktop.tsx +++ b/web/packages/design/src/Icon/Icons/Desktop.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/DeviceMobileCamera.tsx b/web/packages/design/src/Icon/Icons/DeviceMobileCamera.tsx index 09b75a91c8fb9..a1a0b628aaec1 100644 --- a/web/packages/design/src/Icon/Icons/DeviceMobileCamera.tsx +++ b/web/packages/design/src/Icon/Icons/DeviceMobileCamera.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Devices.tsx b/web/packages/design/src/Icon/Icons/Devices.tsx index c248e678096a0..dd4f6037b9fc0 100644 --- a/web/packages/design/src/Icon/Icons/Devices.tsx +++ b/web/packages/design/src/Icon/Icons/Devices.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Download.tsx b/web/packages/design/src/Icon/Icons/Download.tsx index 84058bfc3cefc..388b84d2fbed9 100644 --- a/web/packages/design/src/Icon/Icons/Download.tsx +++ b/web/packages/design/src/Icon/Icons/Download.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Earth.tsx b/web/packages/design/src/Icon/Icons/Earth.tsx index 3f2a9e0b57e0c..65bb7e21a4d2a 100644 --- a/web/packages/design/src/Icon/Icons/Earth.tsx +++ b/web/packages/design/src/Icon/Icons/Earth.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Edit.tsx b/web/packages/design/src/Icon/Icons/Edit.tsx index 42894eee3b9cd..57b0303d2c1ab 100644 --- a/web/packages/design/src/Icon/Icons/Edit.tsx +++ b/web/packages/design/src/Icon/Icons/Edit.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Ellipsis.tsx b/web/packages/design/src/Icon/Icons/Ellipsis.tsx index 078f9c2048968..fc4c96918955f 100644 --- a/web/packages/design/src/Icon/Icons/Ellipsis.tsx +++ b/web/packages/design/src/Icon/Icons/Ellipsis.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/EmailSolid.tsx b/web/packages/design/src/Icon/Icons/EmailSolid.tsx index c8120d1c23487..5360af236538e 100644 --- a/web/packages/design/src/Icon/Icons/EmailSolid.tsx +++ b/web/packages/design/src/Icon/Icons/EmailSolid.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/EnvelopeOpen.tsx b/web/packages/design/src/Icon/Icons/EnvelopeOpen.tsx index 41d26d7949b30..0b9793cff885f 100644 --- a/web/packages/design/src/Icon/Icons/EnvelopeOpen.tsx +++ b/web/packages/design/src/Icon/Icons/EnvelopeOpen.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Equalizer.tsx b/web/packages/design/src/Icon/Icons/Equalizer.tsx index 2c50f6cdaf77a..9d7acaff68376 100644 --- a/web/packages/design/src/Icon/Icons/Equalizer.tsx +++ b/web/packages/design/src/Icon/Icons/Equalizer.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/EqualizerVertical.tsx b/web/packages/design/src/Icon/Icons/EqualizerVertical.tsx index 3a646afa6e3fd..7f113fdbf2505 100644 --- a/web/packages/design/src/Icon/Icons/EqualizerVertical.tsx +++ b/web/packages/design/src/Icon/Icons/EqualizerVertical.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/EqualizersVertical.tsx b/web/packages/design/src/Icon/Icons/EqualizersVertical.tsx index 4fe64c0976ed8..540da0de4a764 100644 --- a/web/packages/design/src/Icon/Icons/EqualizersVertical.tsx +++ b/web/packages/design/src/Icon/Icons/EqualizersVertical.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Expand.tsx b/web/packages/design/src/Icon/Icons/Expand.tsx index 22783c2bf7a18..780b626486e1f 100644 --- a/web/packages/design/src/Icon/Icons/Expand.tsx +++ b/web/packages/design/src/Icon/Icons/Expand.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Facebook.tsx b/web/packages/design/src/Icon/Icons/Facebook.tsx index 4b5132b122ae2..68321b7d1c714 100644 --- a/web/packages/design/src/Icon/Icons/Facebook.tsx +++ b/web/packages/design/src/Icon/Icons/Facebook.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Fingerprint.tsx b/web/packages/design/src/Icon/Icons/Fingerprint.tsx index 58150517f954d..6ed2278a6d6b0 100644 --- a/web/packages/design/src/Icon/Icons/Fingerprint.tsx +++ b/web/packages/design/src/Icon/Icons/Fingerprint.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/FingerprintSimple.tsx b/web/packages/design/src/Icon/Icons/FingerprintSimple.tsx index c192bb20419dd..b26fc3eae42c3 100644 --- a/web/packages/design/src/Icon/Icons/FingerprintSimple.tsx +++ b/web/packages/design/src/Icon/Icons/FingerprintSimple.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Floppy.tsx b/web/packages/design/src/Icon/Icons/Floppy.tsx index e04547b5d1198..3d4e535e94360 100644 --- a/web/packages/design/src/Icon/Icons/Floppy.tsx +++ b/web/packages/design/src/Icon/Icons/Floppy.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/FlowArrow.tsx b/web/packages/design/src/Icon/Icons/FlowArrow.tsx index c8f52ead6a81a..28b67f46ead22 100644 --- a/web/packages/design/src/Icon/Icons/FlowArrow.tsx +++ b/web/packages/design/src/Icon/Icons/FlowArrow.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/FolderPlus.tsx b/web/packages/design/src/Icon/Icons/FolderPlus.tsx index 02356ff40517b..7aaa6cc4e0ae4 100644 --- a/web/packages/design/src/Icon/Icons/FolderPlus.tsx +++ b/web/packages/design/src/Icon/Icons/FolderPlus.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/FolderShared.tsx b/web/packages/design/src/Icon/Icons/FolderShared.tsx index ee7b2b5d75df2..bebbf3a5ea0e4 100644 --- a/web/packages/design/src/Icon/Icons/FolderShared.tsx +++ b/web/packages/design/src/Icon/Icons/FolderShared.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/GitHub.tsx b/web/packages/design/src/Icon/Icons/GitHub.tsx index 4624c68cfaaa4..a691b48c92190 100644 --- a/web/packages/design/src/Icon/Icons/GitHub.tsx +++ b/web/packages/design/src/Icon/Icons/GitHub.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Google.tsx b/web/packages/design/src/Icon/Icons/Google.tsx index d26ba35168709..9cde7f9a26e8c 100644 --- a/web/packages/design/src/Icon/Icons/Google.tsx +++ b/web/packages/design/src/Icon/Icons/Google.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Graph.tsx b/web/packages/design/src/Icon/Icons/Graph.tsx index 93ef887a51362..18cd6b75b8193 100644 --- a/web/packages/design/src/Icon/Icons/Graph.tsx +++ b/web/packages/design/src/Icon/Icons/Graph.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Hashtag.tsx b/web/packages/design/src/Icon/Icons/Hashtag.tsx index 8e49fd847a455..51edfdc8c9790 100644 --- a/web/packages/design/src/Icon/Icons/Hashtag.tsx +++ b/web/packages/design/src/Icon/Icons/Hashtag.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Headset.tsx b/web/packages/design/src/Icon/Icons/Headset.tsx index 3cc693a972fee..8441b61f5d17b 100644 --- a/web/packages/design/src/Icon/Icons/Headset.tsx +++ b/web/packages/design/src/Icon/Icons/Headset.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Home.tsx b/web/packages/design/src/Icon/Icons/Home.tsx index 3e631fa2343ff..6bc2ad3fac9cc 100644 --- a/web/packages/design/src/Icon/Icons/Home.tsx +++ b/web/packages/design/src/Icon/Icons/Home.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Hometemp.tsx b/web/packages/design/src/Icon/Icons/Hometemp.tsx index a170e55fb0ac3..a05c80d7e06b1 100644 --- a/web/packages/design/src/Icon/Icons/Hometemp.tsx +++ b/web/packages/design/src/Icon/Icons/Hometemp.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { SVGIcon, SVGIconProps } from 'design/SVGIcon'; /* diff --git a/web/packages/design/src/Icon/Icons/Info.tsx b/web/packages/design/src/Icon/Icons/Info.tsx index b1ee3fc9b0848..2c2a05b0c084c 100644 --- a/web/packages/design/src/Icon/Icons/Info.tsx +++ b/web/packages/design/src/Icon/Icons/Info.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/InfoFilled.tsx b/web/packages/design/src/Icon/Icons/InfoFilled.tsx index 4facf34563a57..3dafd7bd73f36 100644 --- a/web/packages/design/src/Icon/Icons/InfoFilled.tsx +++ b/web/packages/design/src/Icon/Icons/InfoFilled.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { SVGIcon, SVGIconProps } from 'design/SVGIcon'; export function InfoFilled({ size = 24, fill }: SVGIconProps) { diff --git a/web/packages/design/src/Icon/Icons/Integrations.tsx b/web/packages/design/src/Icon/Icons/Integrations.tsx index de056e0ec1474..336e8c08db40f 100644 --- a/web/packages/design/src/Icon/Icons/Integrations.tsx +++ b/web/packages/design/src/Icon/Icons/Integrations.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Invoices.tsx b/web/packages/design/src/Icon/Icons/Invoices.tsx index af49b3595df6f..c655cd3a02999 100644 --- a/web/packages/design/src/Icon/Icons/Invoices.tsx +++ b/web/packages/design/src/Icon/Icons/Invoices.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Key.tsx b/web/packages/design/src/Icon/Icons/Key.tsx index b1e2206adba0a..914dec7b3ffb1 100644 --- a/web/packages/design/src/Icon/Icons/Key.tsx +++ b/web/packages/design/src/Icon/Icons/Key.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/KeyHole.tsx b/web/packages/design/src/Icon/Icons/KeyHole.tsx index afc86a7543647..d4de448b1c294 100644 --- a/web/packages/design/src/Icon/Icons/KeyHole.tsx +++ b/web/packages/design/src/Icon/Icons/KeyHole.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Keyboard.tsx b/web/packages/design/src/Icon/Icons/Keyboard.tsx index b795702d86606..83d4f855aa940 100644 --- a/web/packages/design/src/Icon/Icons/Keyboard.tsx +++ b/web/packages/design/src/Icon/Icons/Keyboard.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Keypair.tsx b/web/packages/design/src/Icon/Icons/Keypair.tsx index 6b06748123d53..03b6b47d21c0d 100644 --- a/web/packages/design/src/Icon/Icons/Keypair.tsx +++ b/web/packages/design/src/Icon/Icons/Keypair.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Kubernetes.tsx b/web/packages/design/src/Icon/Icons/Kubernetes.tsx index 07ee085465f04..5d437e3c335e8 100644 --- a/web/packages/design/src/Icon/Icons/Kubernetes.tsx +++ b/web/packages/design/src/Icon/Icons/Kubernetes.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Label.tsx b/web/packages/design/src/Icon/Icons/Label.tsx index db78a30389672..30d15b93a18a4 100644 --- a/web/packages/design/src/Icon/Icons/Label.tsx +++ b/web/packages/design/src/Icon/Icons/Label.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Lan.tsx b/web/packages/design/src/Icon/Icons/Lan.tsx index a2daf4135b2ea..b096de016591c 100644 --- a/web/packages/design/src/Icon/Icons/Lan.tsx +++ b/web/packages/design/src/Icon/Icons/Lan.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Laptop.tsx b/web/packages/design/src/Icon/Icons/Laptop.tsx index 39eaa612961f5..19677af6c9213 100644 --- a/web/packages/design/src/Icon/Icons/Laptop.tsx +++ b/web/packages/design/src/Icon/Icons/Laptop.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Layout.tsx b/web/packages/design/src/Icon/Icons/Layout.tsx index 5de7721ff412c..d5c1852b80a21 100644 --- a/web/packages/design/src/Icon/Icons/Layout.tsx +++ b/web/packages/design/src/Icon/Icons/Layout.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/License.tsx b/web/packages/design/src/Icon/Icons/License.tsx index fa619b01cc11b..5e97fa4095a64 100644 --- a/web/packages/design/src/Icon/Icons/License.tsx +++ b/web/packages/design/src/Icon/Icons/License.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/LineSegment.tsx b/web/packages/design/src/Icon/Icons/LineSegment.tsx index 69bb5f62cac81..d3bf34cdfd31c 100644 --- a/web/packages/design/src/Icon/Icons/LineSegment.tsx +++ b/web/packages/design/src/Icon/Icons/LineSegment.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/LineSegments.tsx b/web/packages/design/src/Icon/Icons/LineSegments.tsx index f8cb5c41abe78..4651cfa5974f8 100644 --- a/web/packages/design/src/Icon/Icons/LineSegments.tsx +++ b/web/packages/design/src/Icon/Icons/LineSegments.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Link.tsx b/web/packages/design/src/Icon/Icons/Link.tsx index cd04f696dfc65..de4c3ff1e6458 100644 --- a/web/packages/design/src/Icon/Icons/Link.tsx +++ b/web/packages/design/src/Icon/Icons/Link.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Linkedin.tsx b/web/packages/design/src/Icon/Icons/Linkedin.tsx index fc1327e5b61dd..ca886d25738f0 100644 --- a/web/packages/design/src/Icon/Icons/Linkedin.tsx +++ b/web/packages/design/src/Icon/Icons/Linkedin.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Linux.tsx b/web/packages/design/src/Icon/Icons/Linux.tsx index 47bcb9b81b454..6ba83d5480907 100644 --- a/web/packages/design/src/Icon/Icons/Linux.tsx +++ b/web/packages/design/src/Icon/Icons/Linux.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ListAddCheck.tsx b/web/packages/design/src/Icon/Icons/ListAddCheck.tsx index 05a11e483c8b1..4434b2c203909 100644 --- a/web/packages/design/src/Icon/Icons/ListAddCheck.tsx +++ b/web/packages/design/src/Icon/Icons/ListAddCheck.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ListMagnifyingGlass.tsx b/web/packages/design/src/Icon/Icons/ListMagnifyingGlass.tsx index 5050b481440a2..4442a2fef2634 100644 --- a/web/packages/design/src/Icon/Icons/ListMagnifyingGlass.tsx +++ b/web/packages/design/src/Icon/Icons/ListMagnifyingGlass.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ListThin.tsx b/web/packages/design/src/Icon/Icons/ListThin.tsx index 81fec18dbea2e..b36f4f0d3cf9d 100644 --- a/web/packages/design/src/Icon/Icons/ListThin.tsx +++ b/web/packages/design/src/Icon/Icons/ListThin.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ListView.tsx b/web/packages/design/src/Icon/Icons/ListView.tsx index 0e22a14be46ac..89c936890a154 100644 --- a/web/packages/design/src/Icon/Icons/ListView.tsx +++ b/web/packages/design/src/Icon/Icons/ListView.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Lock.tsx b/web/packages/design/src/Icon/Icons/Lock.tsx index 2755006346c61..3923fc952f4ce 100644 --- a/web/packages/design/src/Icon/Icons/Lock.tsx +++ b/web/packages/design/src/Icon/Icons/Lock.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/LockKey.tsx b/web/packages/design/src/Icon/Icons/LockKey.tsx index 65a953566d71d..a3efdab311c60 100644 --- a/web/packages/design/src/Icon/Icons/LockKey.tsx +++ b/web/packages/design/src/Icon/Icons/LockKey.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Logout.tsx b/web/packages/design/src/Icon/Icons/Logout.tsx index f4a1e44dfe3cc..fdffb67bf2e7d 100644 --- a/web/packages/design/src/Icon/Icons/Logout.tsx +++ b/web/packages/design/src/Icon/Icons/Logout.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Magnifier.tsx b/web/packages/design/src/Icon/Icons/Magnifier.tsx index 2e748f8234834..f6cf426ed470e 100644 --- a/web/packages/design/src/Icon/Icons/Magnifier.tsx +++ b/web/packages/design/src/Icon/Icons/Magnifier.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/MagnifyingMinus.tsx b/web/packages/design/src/Icon/Icons/MagnifyingMinus.tsx index e1e63a5c7a15c..5919e5d2ea3be 100644 --- a/web/packages/design/src/Icon/Icons/MagnifyingMinus.tsx +++ b/web/packages/design/src/Icon/Icons/MagnifyingMinus.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/MagnifyingPlus.tsx b/web/packages/design/src/Icon/Icons/MagnifyingPlus.tsx index 7dafdd5ebfffd..802f6bd222e98 100644 --- a/web/packages/design/src/Icon/Icons/MagnifyingPlus.tsx +++ b/web/packages/design/src/Icon/Icons/MagnifyingPlus.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Memory.tsx b/web/packages/design/src/Icon/Icons/Memory.tsx index a5b509e5505b3..2ada215529af7 100644 --- a/web/packages/design/src/Icon/Icons/Memory.tsx +++ b/web/packages/design/src/Icon/Icons/Memory.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Minus.tsx b/web/packages/design/src/Icon/Icons/Minus.tsx index b718add336a55..e8b0afa4e6e72 100644 --- a/web/packages/design/src/Icon/Icons/Minus.tsx +++ b/web/packages/design/src/Icon/Icons/Minus.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/MobileCamera.tsx b/web/packages/design/src/Icon/Icons/MobileCamera.tsx index 13523914ced5f..90b141468ea83 100644 --- a/web/packages/design/src/Icon/Icons/MobileCamera.tsx +++ b/web/packages/design/src/Icon/Icons/MobileCamera.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Moon.tsx b/web/packages/design/src/Icon/Icons/Moon.tsx index 969920cec6b7a..06b5340f80bd6 100644 --- a/web/packages/design/src/Icon/Icons/Moon.tsx +++ b/web/packages/design/src/Icon/Icons/Moon.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/MoreHoriz.tsx b/web/packages/design/src/Icon/Icons/MoreHoriz.tsx index 77934633df356..e9695c13d7548 100644 --- a/web/packages/design/src/Icon/Icons/MoreHoriz.tsx +++ b/web/packages/design/src/Icon/Icons/MoreHoriz.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/MoreVert.tsx b/web/packages/design/src/Icon/Icons/MoreVert.tsx index 299c6778bf28c..7803bf267c4d1 100644 --- a/web/packages/design/src/Icon/Icons/MoreVert.tsx +++ b/web/packages/design/src/Icon/Icons/MoreVert.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Mute.tsx b/web/packages/design/src/Icon/Icons/Mute.tsx index 1fb6f31748729..f7f29176f5306 100644 --- a/web/packages/design/src/Icon/Icons/Mute.tsx +++ b/web/packages/design/src/Icon/Icons/Mute.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/NewTab.tsx b/web/packages/design/src/Icon/Icons/NewTab.tsx index 0d5c149c25bcf..dc54aca3184b8 100644 --- a/web/packages/design/src/Icon/Icons/NewTab.tsx +++ b/web/packages/design/src/Icon/Icons/NewTab.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/NoteAdded.tsx b/web/packages/design/src/Icon/Icons/NoteAdded.tsx index 29d1aa935634b..615c027a59d99 100644 --- a/web/packages/design/src/Icon/Icons/NoteAdded.tsx +++ b/web/packages/design/src/Icon/Icons/NoteAdded.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Notification.tsx b/web/packages/design/src/Icon/Icons/Notification.tsx index 7fbb968df7051..8525bdb063edc 100644 --- a/web/packages/design/src/Icon/Icons/Notification.tsx +++ b/web/packages/design/src/Icon/Icons/Notification.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/NotificationsActive.tsx b/web/packages/design/src/Icon/Icons/NotificationsActive.tsx index 11f557a578142..f2e17823b55f4 100644 --- a/web/packages/design/src/Icon/Icons/NotificationsActive.tsx +++ b/web/packages/design/src/Icon/Icons/NotificationsActive.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/PaperPlane.tsx b/web/packages/design/src/Icon/Icons/PaperPlane.tsx index 8b5e6454459d8..da7149819be11 100644 --- a/web/packages/design/src/Icon/Icons/PaperPlane.tsx +++ b/web/packages/design/src/Icon/Icons/PaperPlane.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Password.tsx b/web/packages/design/src/Icon/Icons/Password.tsx index 86b70e2420c29..58c61e55fee4b 100644 --- a/web/packages/design/src/Icon/Icons/Password.tsx +++ b/web/packages/design/src/Icon/Icons/Password.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Pencil.tsx b/web/packages/design/src/Icon/Icons/Pencil.tsx index 8e1a4736fa6d9..f5365bdb8f34a 100644 --- a/web/packages/design/src/Icon/Icons/Pencil.tsx +++ b/web/packages/design/src/Icon/Icons/Pencil.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Person.tsx b/web/packages/design/src/Icon/Icons/Person.tsx index 9c49fda118bc0..8347867a5a595 100644 --- a/web/packages/design/src/Icon/Icons/Person.tsx +++ b/web/packages/design/src/Icon/Icons/Person.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/PersonAdd.tsx b/web/packages/design/src/Icon/Icons/PersonAdd.tsx index 614136d66c3ee..5f10a67bc2ca0 100644 --- a/web/packages/design/src/Icon/Icons/PersonAdd.tsx +++ b/web/packages/design/src/Icon/Icons/PersonAdd.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Planet.tsx b/web/packages/design/src/Icon/Icons/Planet.tsx index a7c85ac2fdbf9..094830e362e69 100644 --- a/web/packages/design/src/Icon/Icons/Planet.tsx +++ b/web/packages/design/src/Icon/Icons/Planet.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Plugs.tsx b/web/packages/design/src/Icon/Icons/Plugs.tsx index 09cf4a4851605..85a0bd37e2524 100644 --- a/web/packages/design/src/Icon/Icons/Plugs.tsx +++ b/web/packages/design/src/Icon/Icons/Plugs.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/PlugsConnected.tsx b/web/packages/design/src/Icon/Icons/PlugsConnected.tsx index ec991cd95b2ee..c5ac04e1bc50a 100644 --- a/web/packages/design/src/Icon/Icons/PlugsConnected.tsx +++ b/web/packages/design/src/Icon/Icons/PlugsConnected.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Plus.tsx b/web/packages/design/src/Icon/Icons/Plus.tsx index fcd4287d52792..34e2fa1c6b449 100644 --- a/web/packages/design/src/Icon/Icons/Plus.tsx +++ b/web/packages/design/src/Icon/Icons/Plus.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/PowerSwitch.tsx b/web/packages/design/src/Icon/Icons/PowerSwitch.tsx index f66d3ff3911bc..67fc1a91675ca 100644 --- a/web/packages/design/src/Icon/Icons/PowerSwitch.tsx +++ b/web/packages/design/src/Icon/Icons/PowerSwitch.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Printer.tsx b/web/packages/design/src/Icon/Icons/Printer.tsx index 009d1f0a66c54..3d21ae29d3ccf 100644 --- a/web/packages/design/src/Icon/Icons/Printer.tsx +++ b/web/packages/design/src/Icon/Icons/Printer.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Profile.tsx b/web/packages/design/src/Icon/Icons/Profile.tsx index 7b595ee3758ed..889c4816c6e77 100644 --- a/web/packages/design/src/Icon/Icons/Profile.tsx +++ b/web/packages/design/src/Icon/Icons/Profile.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/PushPin.tsx b/web/packages/design/src/Icon/Icons/PushPin.tsx index d3f0d5388727c..025f6cccc1638 100644 --- a/web/packages/design/src/Icon/Icons/PushPin.tsx +++ b/web/packages/design/src/Icon/Icons/PushPin.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/PushPinFilled.tsx b/web/packages/design/src/Icon/Icons/PushPinFilled.tsx index 4645dcdefcad4..18d06de5014de 100644 --- a/web/packages/design/src/Icon/Icons/PushPinFilled.tsx +++ b/web/packages/design/src/Icon/Icons/PushPinFilled.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Question.tsx b/web/packages/design/src/Icon/Icons/Question.tsx index 46a2933cf277d..6596b7ae58790 100644 --- a/web/packages/design/src/Icon/Icons/Question.tsx +++ b/web/packages/design/src/Icon/Icons/Question.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Refresh.tsx b/web/packages/design/src/Icon/Icons/Refresh.tsx index b9719f537976f..04e7a78e54682 100644 --- a/web/packages/design/src/Icon/Icons/Refresh.tsx +++ b/web/packages/design/src/Icon/Icons/Refresh.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Restore.tsx b/web/packages/design/src/Icon/Icons/Restore.tsx index 4f0b6c68445b6..9ebf98fec530f 100644 --- a/web/packages/design/src/Icon/Icons/Restore.tsx +++ b/web/packages/design/src/Icon/Icons/Restore.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Rows.tsx b/web/packages/design/src/Icon/Icons/Rows.tsx index b0a4e4f774c1f..7abbbbe61f1c1 100644 --- a/web/packages/design/src/Icon/Icons/Rows.tsx +++ b/web/packages/design/src/Icon/Icons/Rows.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Ruler.tsx b/web/packages/design/src/Icon/Icons/Ruler.tsx index 43c2746adf20d..6385435788595 100644 --- a/web/packages/design/src/Icon/Icons/Ruler.tsx +++ b/web/packages/design/src/Icon/Icons/Ruler.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Run.tsx b/web/packages/design/src/Icon/Icons/Run.tsx index 49e7099bb1fe9..1849f30733505 100644 --- a/web/packages/design/src/Icon/Icons/Run.tsx +++ b/web/packages/design/src/Icon/Icons/Run.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Scan.tsx b/web/packages/design/src/Icon/Icons/Scan.tsx index daefc016bc639..3958fcb89978f 100644 --- a/web/packages/design/src/Icon/Icons/Scan.tsx +++ b/web/packages/design/src/Icon/Icons/Scan.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Server.tsx b/web/packages/design/src/Icon/Icons/Server.tsx index 5e6506acda2e1..4cf45cde553c3 100644 --- a/web/packages/design/src/Icon/Icons/Server.tsx +++ b/web/packages/design/src/Icon/Icons/Server.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Share.tsx b/web/packages/design/src/Icon/Icons/Share.tsx index ae76b379b6f54..1d3ee4fc17e86 100644 --- a/web/packages/design/src/Icon/Icons/Share.tsx +++ b/web/packages/design/src/Icon/Icons/Share.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ShieldCheck.tsx b/web/packages/design/src/Icon/Icons/ShieldCheck.tsx index 38eb4ec8c6a8c..81e0e07c06784 100644 --- a/web/packages/design/src/Icon/Icons/ShieldCheck.tsx +++ b/web/packages/design/src/Icon/Icons/ShieldCheck.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/ShieldWarning.tsx b/web/packages/design/src/Icon/Icons/ShieldWarning.tsx index 0d3274d654d30..efe86555542ae 100644 --- a/web/packages/design/src/Icon/Icons/ShieldWarning.tsx +++ b/web/packages/design/src/Icon/Icons/ShieldWarning.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Sliders.tsx b/web/packages/design/src/Icon/Icons/Sliders.tsx index aab357378c5ba..29d00763a60db 100644 --- a/web/packages/design/src/Icon/Icons/Sliders.tsx +++ b/web/packages/design/src/Icon/Icons/Sliders.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/SlidersVertical.tsx b/web/packages/design/src/Icon/Icons/SlidersVertical.tsx index 4d45128dd563c..1d5516cea0881 100644 --- a/web/packages/design/src/Icon/Icons/SlidersVertical.tsx +++ b/web/packages/design/src/Icon/Icons/SlidersVertical.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Speed.tsx b/web/packages/design/src/Icon/Icons/Speed.tsx index 816ca9f5601db..b13e226a9ae67 100644 --- a/web/packages/design/src/Icon/Icons/Speed.tsx +++ b/web/packages/design/src/Icon/Icons/Speed.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Spinner.tsx b/web/packages/design/src/Icon/Icons/Spinner.tsx index 922c2435a5e1b..a2531e04bfa83 100644 --- a/web/packages/design/src/Icon/Icons/Spinner.tsx +++ b/web/packages/design/src/Icon/Icons/Spinner.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/SquaresFour.tsx b/web/packages/design/src/Icon/Icons/SquaresFour.tsx index 0dfc463b033a4..f92dee14796cb 100644 --- a/web/packages/design/src/Icon/Icons/SquaresFour.tsx +++ b/web/packages/design/src/Icon/Icons/SquaresFour.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Stars.tsx b/web/packages/design/src/Icon/Icons/Stars.tsx index d66303c7ff498..e2a3772248c42 100644 --- a/web/packages/design/src/Icon/Icons/Stars.tsx +++ b/web/packages/design/src/Icon/Icons/Stars.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Sun.tsx b/web/packages/design/src/Icon/Icons/Sun.tsx index 4f6764dff5c58..5d6a010667989 100644 --- a/web/packages/design/src/Icon/Icons/Sun.tsx +++ b/web/packages/design/src/Icon/Icons/Sun.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/SyncAlt.tsx b/web/packages/design/src/Icon/Icons/SyncAlt.tsx index f74d61203aa28..ef97c1bbf8bd5 100644 --- a/web/packages/design/src/Icon/Icons/SyncAlt.tsx +++ b/web/packages/design/src/Icon/Icons/SyncAlt.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Table.tsx b/web/packages/design/src/Icon/Icons/Table.tsx index 11db553f5274c..eeb8c2c490a2e 100644 --- a/web/packages/design/src/Icon/Icons/Table.tsx +++ b/web/packages/design/src/Icon/Icons/Table.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Tablet.tsx b/web/packages/design/src/Icon/Icons/Tablet.tsx index 07fc6da33d6b0..19bc87a1b4588 100644 --- a/web/packages/design/src/Icon/Icons/Tablet.tsx +++ b/web/packages/design/src/Icon/Icons/Tablet.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Tags.tsx b/web/packages/design/src/Icon/Icons/Tags.tsx index c73a000c607e4..5eda6492f1d3c 100644 --- a/web/packages/design/src/Icon/Icons/Tags.tsx +++ b/web/packages/design/src/Icon/Icons/Tags.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Terminal.tsx b/web/packages/design/src/Icon/Icons/Terminal.tsx index 0f8ae32294b8c..d97b57aafad5f 100644 --- a/web/packages/design/src/Icon/Icons/Terminal.tsx +++ b/web/packages/design/src/Icon/Icons/Terminal.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Trash.tsx b/web/packages/design/src/Icon/Icons/Trash.tsx index f00b64d378fbe..91cc228a8905b 100644 --- a/web/packages/design/src/Icon/Icons/Trash.tsx +++ b/web/packages/design/src/Icon/Icons/Trash.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Twitter.tsx b/web/packages/design/src/Icon/Icons/Twitter.tsx index d5510c5e2c45a..534beaa7f8a95 100644 --- a/web/packages/design/src/Icon/Icons/Twitter.tsx +++ b/web/packages/design/src/Icon/Icons/Twitter.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Unarchive.tsx b/web/packages/design/src/Icon/Icons/Unarchive.tsx index df28e0fecf5e4..9a94dcb3efe58 100644 --- a/web/packages/design/src/Icon/Icons/Unarchive.tsx +++ b/web/packages/design/src/Icon/Icons/Unarchive.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Unlink.tsx b/web/packages/design/src/Icon/Icons/Unlink.tsx index 71a10510ec7f6..b37625602faf0 100644 --- a/web/packages/design/src/Icon/Icons/Unlink.tsx +++ b/web/packages/design/src/Icon/Icons/Unlink.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Unlock.tsx b/web/packages/design/src/Icon/Icons/Unlock.tsx index 902e61273be05..204504d9fe7ba 100644 --- a/web/packages/design/src/Icon/Icons/Unlock.tsx +++ b/web/packages/design/src/Icon/Icons/Unlock.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Upload.tsx b/web/packages/design/src/Icon/Icons/Upload.tsx index d7604433c239a..03b2672311be8 100644 --- a/web/packages/design/src/Icon/Icons/Upload.tsx +++ b/web/packages/design/src/Icon/Icons/Upload.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UsbDrive.tsx b/web/packages/design/src/Icon/Icons/UsbDrive.tsx index f41daeb68cb57..92edd134e15da 100644 --- a/web/packages/design/src/Icon/Icons/UsbDrive.tsx +++ b/web/packages/design/src/Icon/Icons/UsbDrive.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/User.tsx b/web/packages/design/src/Icon/Icons/User.tsx index 27da93ef6e41c..788281c91cda3 100644 --- a/web/packages/design/src/Icon/Icons/User.tsx +++ b/web/packages/design/src/Icon/Icons/User.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UserAdd.tsx b/web/packages/design/src/Icon/Icons/UserAdd.tsx index ff1528bd1f2d6..e3e5765d47ab9 100644 --- a/web/packages/design/src/Icon/Icons/UserAdd.tsx +++ b/web/packages/design/src/Icon/Icons/UserAdd.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UserCircleGear.tsx b/web/packages/design/src/Icon/Icons/UserCircleGear.tsx index f7cf1cc00f652..c17c37454bab3 100644 --- a/web/packages/design/src/Icon/Icons/UserCircleGear.tsx +++ b/web/packages/design/src/Icon/Icons/UserCircleGear.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UserFocus.tsx b/web/packages/design/src/Icon/Icons/UserFocus.tsx index 5eed01b5973d4..de99762dcc5aa 100644 --- a/web/packages/design/src/Icon/Icons/UserFocus.tsx +++ b/web/packages/design/src/Icon/Icons/UserFocus.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UserIdBadge.tsx b/web/packages/design/src/Icon/Icons/UserIdBadge.tsx index 66fba9e97e347..f340c591ea015 100644 --- a/web/packages/design/src/Icon/Icons/UserIdBadge.tsx +++ b/web/packages/design/src/Icon/Icons/UserIdBadge.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UserList.tsx b/web/packages/design/src/Icon/Icons/UserList.tsx index 48449c8e955c2..49b90b8042aea 100644 --- a/web/packages/design/src/Icon/Icons/UserList.tsx +++ b/web/packages/design/src/Icon/Icons/UserList.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Users.tsx b/web/packages/design/src/Icon/Icons/Users.tsx index e692c7782d826..93b0313cc4e6e 100644 --- a/web/packages/design/src/Icon/Icons/Users.tsx +++ b/web/packages/design/src/Icon/Icons/Users.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/UsersTriple.tsx b/web/packages/design/src/Icon/Icons/UsersTriple.tsx index a238478004aa3..314f934eaddc1 100644 --- a/web/packages/design/src/Icon/Icons/UsersTriple.tsx +++ b/web/packages/design/src/Icon/Icons/UsersTriple.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Vault.tsx b/web/packages/design/src/Icon/Icons/Vault.tsx index 0b42f0255086f..e4389813ca53c 100644 --- a/web/packages/design/src/Icon/Icons/Vault.tsx +++ b/web/packages/design/src/Icon/Icons/Vault.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/VideoGame.tsx b/web/packages/design/src/Icon/Icons/VideoGame.tsx index 1c33fefca965d..921e5c6873525 100644 --- a/web/packages/design/src/Icon/Icons/VideoGame.tsx +++ b/web/packages/design/src/Icon/Icons/VideoGame.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/VolumeUp.tsx b/web/packages/design/src/Icon/Icons/VolumeUp.tsx index e5b7bf83a471a..e73821d0d469a 100644 --- a/web/packages/design/src/Icon/Icons/VolumeUp.tsx +++ b/web/packages/design/src/Icon/Icons/VolumeUp.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/VpnKey.tsx b/web/packages/design/src/Icon/Icons/VpnKey.tsx index ef337ecdc8743..6276a9ec4ee24 100644 --- a/web/packages/design/src/Icon/Icons/VpnKey.tsx +++ b/web/packages/design/src/Icon/Icons/VpnKey.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Wand.tsx b/web/packages/design/src/Icon/Icons/Wand.tsx index 6048923e5b253..2cfa8a811f68f 100644 --- a/web/packages/design/src/Icon/Icons/Wand.tsx +++ b/web/packages/design/src/Icon/Icons/Wand.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Warning.tsx b/web/packages/design/src/Icon/Icons/Warning.tsx index 75a0bc385f7e5..e31c760e89565 100644 --- a/web/packages/design/src/Icon/Icons/Warning.tsx +++ b/web/packages/design/src/Icon/Icons/Warning.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/WarningCircle.tsx b/web/packages/design/src/Icon/Icons/WarningCircle.tsx index 30b1fab890be0..3ffc90d7e30fc 100644 --- a/web/packages/design/src/Icon/Icons/WarningCircle.tsx +++ b/web/packages/design/src/Icon/Icons/WarningCircle.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Wifi.tsx b/web/packages/design/src/Icon/Icons/Wifi.tsx index 59f033859e4fa..0e026e1552250 100644 --- a/web/packages/design/src/Icon/Icons/Wifi.tsx +++ b/web/packages/design/src/Icon/Icons/Wifi.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Windows.tsx b/web/packages/design/src/Icon/Icons/Windows.tsx index 2d9f02c48c0d5..d8a11289af6f3 100644 --- a/web/packages/design/src/Icon/Icons/Windows.tsx +++ b/web/packages/design/src/Icon/Icons/Windows.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Wrench.tsx b/web/packages/design/src/Icon/Icons/Wrench.tsx index dd9de45daae5b..094c3a998fbf6 100644 --- a/web/packages/design/src/Icon/Icons/Wrench.tsx +++ b/web/packages/design/src/Icon/Icons/Wrench.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Icon/Icons/Youtube.tsx b/web/packages/design/src/Icon/Icons/Youtube.tsx index d959b2c066f56..a84aaa7b6c92b 100644 --- a/web/packages/design/src/Icon/Icons/Youtube.tsx +++ b/web/packages/design/src/Icon/Icons/Youtube.tsx @@ -40,8 +40,6 @@ SOFTWARE. */ -import React from 'react'; - import { Icon, IconProps } from '../Icon'; /* diff --git a/web/packages/design/src/Image/Image.story.jsx b/web/packages/design/src/Image/Image.story.jsx index 11367d027bbe7..685c2f6901d42 100644 --- a/web/packages/design/src/Image/Image.story.jsx +++ b/web/packages/design/src/Image/Image.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import teleportSvg from './../assets/images/enterprise-dark.svg'; import Image from '.'; diff --git a/web/packages/design/src/Indicator/Indicator.test.tsx b/web/packages/design/src/Indicator/Indicator.test.tsx index fa4ccc89c8d00..59c9ba700607a 100644 --- a/web/packages/design/src/Indicator/Indicator.test.tsx +++ b/web/packages/design/src/Indicator/Indicator.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render } from 'design/utils/testing'; diff --git a/web/packages/design/src/Input/Input.story.tsx b/web/packages/design/src/Input/Input.story.tsx index 3d214c6f4677b..d221e4360a910 100644 --- a/web/packages/design/src/Input/Input.story.tsx +++ b/web/packages/design/src/Input/Input.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import * as Icon from 'design/Icon'; import { H2 } from 'design/Text'; import Flex from 'design/Flex'; diff --git a/web/packages/design/src/Input/Input.test.tsx b/web/packages/design/src/Input/Input.test.tsx index c8da7554f9c45..2103472ba1cfc 100644 --- a/web/packages/design/src/Input/Input.test.tsx +++ b/web/packages/design/src/Input/Input.test.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render, screen, theme } from 'design/utils/testing'; import Input from './Input'; diff --git a/web/packages/design/src/Label/Label.test.jsx b/web/packages/design/src/Label/Label.test.jsx index d112e0633d480..fe745edecadd2 100644 --- a/web/packages/design/src/Label/Label.test.jsx +++ b/web/packages/design/src/Label/Label.test.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render, theme } from 'design/utils/testing'; import Label, { Primary, Secondary, Warning, Danger } from './Label'; diff --git a/web/packages/design/src/LabelState/LabelState.test.jsx b/web/packages/design/src/LabelState/LabelState.test.jsx index 9939fd81b28d6..712700d915879 100644 --- a/web/packages/design/src/LabelState/LabelState.test.jsx +++ b/web/packages/design/src/LabelState/LabelState.test.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render, theme } from 'design/utils/testing'; import LabelState, { diff --git a/web/packages/design/src/LabelState/LabelState.tsx b/web/packages/design/src/LabelState/LabelState.tsx index 9f8f0430e10bc..139b528da8a9f 100644 --- a/web/packages/design/src/LabelState/LabelState.tsx +++ b/web/packages/design/src/LabelState/LabelState.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { diff --git a/web/packages/design/src/Link/Link.jsx b/web/packages/design/src/Link/Link.jsx index 260c31f85094b..d81be004d5424 100644 --- a/web/packages/design/src/Link/Link.jsx +++ b/web/packages/design/src/Link/Link.jsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { space, color } from 'design/system'; diff --git a/web/packages/design/src/Mark/Mark.story.tsx b/web/packages/design/src/Mark/Mark.story.tsx index f5db507159963..fdc202a8f2044 100644 --- a/web/packages/design/src/Mark/Mark.story.tsx +++ b/web/packages/design/src/Mark/Mark.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Box from 'design/Box'; import { Mark as M } from './Mark'; diff --git a/web/packages/design/src/Menu/Menu.jsx b/web/packages/design/src/Menu/Menu.jsx index 17e33c5c8a9f9..05d648a053920 100644 --- a/web/packages/design/src/Menu/Menu.jsx +++ b/web/packages/design/src/Menu/Menu.jsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { createRef } from 'react'; +import { Component, createRef } from 'react'; import PropTypes from 'prop-types'; import Popover from '../Popover'; @@ -29,7 +29,7 @@ const POSITION = { horizontal: 'right', }; -class Menu extends React.Component { +class Menu extends Component { menuListRef = createRef(); getContentAnchorEl = () => this.menuListRef.current?.firstChild; diff --git a/web/packages/design/src/Menu/Menu.story.test.tsx b/web/packages/design/src/Menu/Menu.story.test.tsx index 5f4f768207d1c..b770a488ff938 100644 --- a/web/packages/design/src/Menu/Menu.story.test.tsx +++ b/web/packages/design/src/Menu/Menu.story.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render } from 'design/utils/testing'; diff --git a/web/packages/design/src/MultiRowBox/MultiRowBox.story.tsx b/web/packages/design/src/MultiRowBox/MultiRowBox.story.tsx index e4e13edb33a29..9fd56649d0d22 100644 --- a/web/packages/design/src/MultiRowBox/MultiRowBox.story.tsx +++ b/web/packages/design/src/MultiRowBox/MultiRowBox.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { MultiRowBox, Row, SingleRowBox } from './MultiRowBox'; export default { diff --git a/web/packages/design/src/MultiRowBox/MultiRowBox.tsx b/web/packages/design/src/MultiRowBox/MultiRowBox.tsx index 2ab551cdfde7b..4b8df2845ff93 100644 --- a/web/packages/design/src/MultiRowBox/MultiRowBox.tsx +++ b/web/packages/design/src/MultiRowBox/MultiRowBox.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; import styled from 'styled-components'; diff --git a/web/packages/design/src/Pill/Pill.story.tsx b/web/packages/design/src/Pill/Pill.story.tsx index 07963c0d8841a..a92415e5e4f68 100644 --- a/web/packages/design/src/Pill/Pill.story.tsx +++ b/web/packages/design/src/Pill/Pill.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Pill } from './Pill'; export default { diff --git a/web/packages/design/src/Pill/Pill.test.tsx b/web/packages/design/src/Pill/Pill.test.tsx index 5f36a507b4b59..6fb72c4864601 100644 --- a/web/packages/design/src/Pill/Pill.test.tsx +++ b/web/packages/design/src/Pill/Pill.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render, fireEvent } from 'design/utils/testing'; diff --git a/web/packages/design/src/Popover/Popover.story.test.tsx b/web/packages/design/src/Popover/Popover.story.test.tsx index b35cb266e03c8..cf52671acb12c 100644 --- a/web/packages/design/src/Popover/Popover.story.test.tsx +++ b/web/packages/design/src/Popover/Popover.story.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render, fireEvent } from 'design/utils/testing'; diff --git a/web/packages/design/src/Popover/Popover.story.tsx b/web/packages/design/src/Popover/Popover.story.tsx index 43fb7d1c2b833..d23f8dc0b7e30 100644 --- a/web/packages/design/src/Popover/Popover.story.tsx +++ b/web/packages/design/src/Popover/Popover.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState, MouseEvent } from 'react'; +import { Component, useState, MouseEvent } from 'react'; import styled from 'styled-components'; import { ButtonPrimary, Box, Flex, Text, H2 } from '..'; @@ -47,7 +47,7 @@ type SimplePopoverState = { contentMultiplier: number; }; -class SimplePopover extends React.Component { +class SimplePopover extends Component { btnRef: Element | null = null; growContentTimer: ReturnType | undefined; @@ -219,7 +219,7 @@ class SimplePopover extends React.Component { } } -class MouseOverPopover extends React.Component { +class MouseOverPopover extends Component { state = { anchorEl: null, }; diff --git a/web/packages/design/src/RadioButton/RadioButton.story.tsx b/web/packages/design/src/RadioButton/RadioButton.story.tsx index 86e0a18924759..12f0fa186dcaf 100644 --- a/web/packages/design/src/RadioButton/RadioButton.story.tsx +++ b/web/packages/design/src/RadioButton/RadioButton.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import styled from 'styled-components'; import { Flex } from '..'; diff --git a/web/packages/design/src/RadioGroup/RadioGroup.story.tsx b/web/packages/design/src/RadioGroup/RadioGroup.story.tsx index 9ae7d6d7430c5..2fe45bfc0dd5e 100644 --- a/web/packages/design/src/RadioGroup/RadioGroup.story.tsx +++ b/web/packages/design/src/RadioGroup/RadioGroup.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Box, Flex } from 'design'; import { RadioGroup } from './RadioGroup'; diff --git a/web/packages/design/src/RadioGroup/RadioGroup.tsx b/web/packages/design/src/RadioGroup/RadioGroup.tsx index 7cb6b952cb108..4df14b26650d3 100644 --- a/web/packages/design/src/RadioGroup/RadioGroup.tsx +++ b/web/packages/design/src/RadioGroup/RadioGroup.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; import { FieldRadio } from 'design/FieldRadio'; diff --git a/web/packages/design/src/ResourceIcon/index.tsx b/web/packages/design/src/ResourceIcon/index.tsx index 209b1c7f641d2..79fd4087de0e4 100644 --- a/web/packages/design/src/ResourceIcon/index.tsx +++ b/web/packages/design/src/ResourceIcon/index.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { ComponentProps } from 'react'; +import { ComponentProps } from 'react'; import { useTheme } from 'styled-components'; import { Image } from 'design'; diff --git a/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx b/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx index 3d1dd7904855f..3656a2d105f32 100644 --- a/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx +++ b/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { useTheme } from 'styled-components'; import { SVGIcon } from './SVGIcon'; diff --git a/web/packages/design/src/ShimmerBox/ShimmerBox.story.jsx b/web/packages/design/src/ShimmerBox/ShimmerBox.story.jsx index e4bf517293f81..2ee4f49cd8dde 100644 --- a/web/packages/design/src/ShimmerBox/ShimmerBox.story.jsx +++ b/web/packages/design/src/ShimmerBox/ShimmerBox.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Box, Flex } from 'design'; import { ShimmerBox } from './ShimmerBox'; diff --git a/web/packages/design/src/ShimmerBox/ShimmerBox.tsx b/web/packages/design/src/ShimmerBox/ShimmerBox.tsx index fea7a7d95929d..b44b3e0297733 100644 --- a/web/packages/design/src/ShimmerBox/ShimmerBox.tsx +++ b/web/packages/design/src/ShimmerBox/ShimmerBox.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled, { keyframes } from 'styled-components'; import Box, { BoxProps } from 'design/Box'; diff --git a/web/packages/design/src/SlideTabs/SlideTabs.story.tsx b/web/packages/design/src/SlideTabs/SlideTabs.story.tsx index bb3eb8c49818a..8de3315463db9 100644 --- a/web/packages/design/src/SlideTabs/SlideTabs.story.tsx +++ b/web/packages/design/src/SlideTabs/SlideTabs.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import * as Icon from 'design/Icon'; import Flex from 'design/Flex'; diff --git a/web/packages/design/src/SlideTabs/SlideTabs.test.tsx b/web/packages/design/src/SlideTabs/SlideTabs.test.tsx index fe4137f34b28b..75c68780f1cda 100644 --- a/web/packages/design/src/SlideTabs/SlideTabs.test.tsx +++ b/web/packages/design/src/SlideTabs/SlideTabs.test.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { screen } from '@testing-library/react'; import { render, userEvent } from 'design/utils/testing'; diff --git a/web/packages/design/src/StepSlider/StepHeader.tsx b/web/packages/design/src/StepSlider/StepHeader.tsx index 005e00d9deb4e..8f6f974aae22f 100644 --- a/web/packages/design/src/StepSlider/StepHeader.tsx +++ b/web/packages/design/src/StepSlider/StepHeader.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Box from 'design/Box'; import Text, { H2 } from 'design/Text'; diff --git a/web/packages/design/src/StepSlider/StepSlider.story.tsx b/web/packages/design/src/StepSlider/StepSlider.story.tsx index 50bcff2f3be78..c488b04bc9e67 100644 --- a/web/packages/design/src/StepSlider/StepSlider.story.tsx +++ b/web/packages/design/src/StepSlider/StepSlider.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import styled from 'styled-components'; import { Box, ButtonLink, ButtonPrimary, Text, Card, H1, H2 } from 'design'; diff --git a/web/packages/design/src/StepSlider/StepSlider.test.tsx b/web/packages/design/src/StepSlider/StepSlider.test.tsx index aec7a11831649..6ddd11f33a67e 100644 --- a/web/packages/design/src/StepSlider/StepSlider.test.tsx +++ b/web/packages/design/src/StepSlider/StepSlider.test.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render, fireEvent, screen } from 'design/utils/testing'; import { diff --git a/web/packages/design/src/Text/Text.story.tsx b/web/packages/design/src/Text/Text.story.tsx index fa3ff2abed2a5..b85858ee7d166 100644 --- a/web/packages/design/src/Text/Text.story.tsx +++ b/web/packages/design/src/Text/Text.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Box from 'design/Box'; import Text, { H1, H2, H3, H4, P1, P2 } from '.'; diff --git a/web/packages/design/src/TextArea/TextArea.story.tsx b/web/packages/design/src/TextArea/TextArea.story.tsx index 0338c52d80500..7297d8768dd25 100644 --- a/web/packages/design/src/TextArea/TextArea.story.tsx +++ b/web/packages/design/src/TextArea/TextArea.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { H2 } from 'design/Text/Text'; import Flex from 'design/Flex'; import Box from 'design/Box'; diff --git a/web/packages/design/src/ThemeProvider/index.tsx b/web/packages/design/src/ThemeProvider/index.tsx index 49c7f7620b4a2..8f3a1aa4070da 100644 --- a/web/packages/design/src/ThemeProvider/index.tsx +++ b/web/packages/design/src/ThemeProvider/index.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; import { WebTarget, StyleSheetManager, diff --git a/web/packages/design/src/Toggle/Toggle.story.tsx b/web/packages/design/src/Toggle/Toggle.story.tsx index ec23c98ed69a0..e4a03ec12d25b 100644 --- a/web/packages/design/src/Toggle/Toggle.story.tsx +++ b/web/packages/design/src/Toggle/Toggle.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import Text from '../Text'; import Flex from '../Flex'; diff --git a/web/packages/design/src/Toggle/Toggle.tsx b/web/packages/design/src/Toggle/Toggle.tsx index 807322044aae2..3a8b5c445777b 100644 --- a/web/packages/design/src/Toggle/Toggle.tsx +++ b/web/packages/design/src/Toggle/Toggle.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { ReactNode } from 'react'; +import { ReactNode } from 'react'; import styled from 'styled-components'; export function Toggle({ diff --git a/web/packages/design/src/Tooltip/IconTooltip.story.tsx b/web/packages/design/src/Tooltip/IconTooltip.story.tsx index 8062ae357752a..7cb9b2aed622e 100644 --- a/web/packages/design/src/Tooltip/IconTooltip.story.tsx +++ b/web/packages/design/src/Tooltip/IconTooltip.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import styled, { useTheme } from 'styled-components'; import { Text, Flex, ButtonPrimary } from 'design'; diff --git a/web/packages/design/src/TopNav/TopNav.jsx b/web/packages/design/src/TopNav/TopNav.jsx index 43f9356c2ff04..52d76f1ca78a0 100644 --- a/web/packages/design/src/TopNav/TopNav.jsx +++ b/web/packages/design/src/TopNav/TopNav.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Flex from 'design/Flex'; export default function TopNav(props) { diff --git a/web/packages/design/src/TopNav/TopNav.story.jsx b/web/packages/design/src/TopNav/TopNav.story.jsx index 54ad85425e3dc..f5c0091c97e78 100644 --- a/web/packages/design/src/TopNav/TopNav.story.jsx +++ b/web/packages/design/src/TopNav/TopNav.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import TopNav from './TopNav'; import TopNavItem from './TopNavItem'; diff --git a/web/packages/design/src/assets/images/Assets.story.tsx b/web/packages/design/src/assets/images/Assets.story.tsx index 8de945545abde..7fa6241aeb473 100644 --- a/web/packages/design/src/assets/images/Assets.story.tsx +++ b/web/packages/design/src/assets/images/Assets.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from "react"; - import Image from "design/Image"; import teleportLogo from "design/assets/images/enterprise-light.svg"; import cloudCity from "design/assets/images/backgrounds/cloud-city.png" diff --git a/web/packages/design/src/index.ts b/web/packages/design/src/index.ts index f5260ba2ac1c7..89c45fa08a326 100644 --- a/web/packages/design/src/index.ts +++ b/web/packages/design/src/index.ts @@ -34,7 +34,7 @@ import CardSuccess, { CardSuccessLogin } from './CardSuccess'; import { Indicator } from './Indicator'; import Input from './Input'; import Label from './Label'; -import LabelInput from './LabelInput'; +import { LabelInput } from './LabelInput'; import LabelState from './LabelState'; import Link from './Link'; import { Mark } from './Mark'; diff --git a/web/packages/design/src/labels.story.jsx b/web/packages/design/src/labels.story.jsx index 7907e70cd46dd..37f94216cece5 100644 --- a/web/packages/design/src/labels.story.jsx +++ b/web/packages/design/src/labels.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Label from './Label'; import LabelState from './LabelState'; import Flex from './Flex'; diff --git a/web/packages/design/src/theme/palette.story.jsx b/web/packages/design/src/theme/palette.story.jsx index 8d45d73478aa3..4b4aae91b4ca0 100644 --- a/web/packages/design/src/theme/palette.story.jsx +++ b/web/packages/design/src/theme/palette.story.jsx @@ -18,8 +18,6 @@ /*eslint import/namespace: ['error', { allowComputed: true }]*/ -import React from 'react'; - import { Flex, Box } from '..'; import * as colors from './palette'; diff --git a/web/packages/design/src/theme/themeColors.story.tsx b/web/packages/design/src/theme/themeColors.story.tsx index 24dd192f75cba..37a441bc70bab 100644 --- a/web/packages/design/src/theme/themeColors.story.tsx +++ b/web/packages/design/src/theme/themeColors.story.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { useTheme } from 'styled-components'; import Text, { H1, H2 } from '../Text'; diff --git a/web/packages/design/src/theme/typography.story.jsx b/web/packages/design/src/theme/typography.story.jsx index e5eb0a08a5da7..46be53ce4c8a2 100644 --- a/web/packages/design/src/theme/typography.story.jsx +++ b/web/packages/design/src/theme/typography.story.jsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Text, Box } from '..'; import typography from './typography'; diff --git a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx index 35cfac569c462..a751566765c27 100644 --- a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx +++ b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Flex, LabelInput, Text } from 'design'; import { IconTooltip } from 'design/Tooltip'; diff --git a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationReview.tsx b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationReview.tsx index 426cb1ca81729..39c2c77c0a954 100644 --- a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationReview.tsx +++ b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationReview.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Flex, Text } from 'design'; import { IconTooltip } from 'design/Tooltip'; diff --git a/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx b/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx index f33c43f4892b8..d20ea9527bc00 100644 --- a/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx +++ b/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Box, Text } from 'design'; diff --git a/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx b/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx index f10b940050628..46b29b8333b26 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Flex, Text } from 'design'; import { components, OptionProps } from 'react-select'; @@ -24,7 +23,7 @@ import { Option as BaseOption } from 'shared/components/Select'; export type Option = BaseOption & { isAdded?: boolean; - kind: 'app' | 'user_group' | 'namespace'; + kind: 'app' | 'user_group' | 'namespace' | 'aws_ic_account_assignment'; }; export const CheckableOptionComponent = ( diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx index f27c721e77914..2d6f89e019c02 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Flex, Text, ButtonIcon, Box, LabelInput } from 'design'; import * as Icon from 'design/Icon'; diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx index ba2b088c7091b..55ef62d05b61a 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { MemoryRouter, Link } from 'react-router-dom'; import { Box, ButtonPrimary, ButtonText } from 'design'; @@ -241,6 +241,11 @@ const baseProps: RequestCheckoutWithSliderProps = { name: 'app-saml', id: 'app-name', }, + { + kind: 'aws_ic_account_assignment', + name: 'account1', + id: 'admin-on-account1', + }, ], clearAttempt: () => null, onClose: () => null, diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx index fd4bc1578869d..6f13bb99657d4 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx @@ -791,6 +791,8 @@ function getPrettyResourceKind(kind: RequestableResourceKind): string { return 'SAML Application'; case 'namespace': return 'Namespace'; + case 'aws_ic_account_assignment': + return 'AWS IAM Identity Center Account Assignment'; default: kind satisfies never; return kind; diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/SelectReviewers.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/SelectReviewers.tsx index aedade1435fe7..b1ea398954d48 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/SelectReviewers.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/SelectReviewers.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState, useRef } from 'react'; +import { useEffect, useState, useRef } from 'react'; import { components } from 'react-select'; import ReactSelectCreatable from 'react-select/creatable'; import styled from 'styled-components'; @@ -40,7 +40,7 @@ export function SelectReviewers({ () => reviewers.map(r => ({ value: r, label: r, isDisabled: true })) ); - React.useEffect(() => { + useEffect(() => { // When editing reviewers, auto focus on input box. if (editReviewers) { reactSelectRef.current.focus(); diff --git a/web/packages/shared/components/AccessRequests/NewRequest/resource.ts b/web/packages/shared/components/AccessRequests/NewRequest/resource.ts index f56ad58110d25..7d4b274dd880c 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/resource.ts +++ b/web/packages/shared/components/AccessRequests/NewRequest/resource.ts @@ -45,5 +45,6 @@ export function getEmptyResourceState(): ResourceMap { role: {}, saml_idp_service_provider: {}, namespace: {}, + aws_ic_account_assignment: {}, }; } diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.story.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.story.tsx index 52482cc5f1274..2e947ab2b8dfd 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.story.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { makeEmptyAttempt, makeProcessingAttempt, diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.tsx index 447da3448da94..8870401c429c6 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestDelete/RequestDelete.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { ButtonWarning, ButtonSecondary, Flex, Alert } from 'design'; import TextSelectCopy from 'teleport/components/TextSelectCopy'; diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.story.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.story.tsx index 7348178391c47..f755aa1106e31 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.story.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { makeSuccessAttempt, makeEmptyAttempt, diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.story.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.story.tsx index 5880a1f5c94ee..3feab1d9a952c 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.story.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { makeSuccessAttempt, makeEmptyAttempt, diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx index 9a3e424787378..e6655f64668ac 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React from 'react'; +import { Fragment } from 'react'; import styled from 'styled-components'; import { Alert, @@ -617,7 +617,7 @@ function Reviews({ reviews }: { reviews: AccessRequestReview[] }) { review; return ( - + )} - + ); }); diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RolesRequested.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RolesRequested.tsx index 40716141f6339..ccdeb3bcd6c1b 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RolesRequested.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RolesRequested.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Box, Label } from 'design'; export default function RolesRequested({ roles }: { roles: string[] }) { diff --git a/web/packages/shared/components/AccessRequests/Shared/Shared.tsx b/web/packages/shared/components/AccessRequests/Shared/Shared.tsx index 2159f6309c95e..eb8b9ef0bf86a 100644 --- a/web/packages/shared/components/AccessRequests/Shared/Shared.tsx +++ b/web/packages/shared/components/AccessRequests/Shared/Shared.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { ButtonPrimary, Text, Box, ButtonIcon, Menu } from 'design'; import { Info } from 'design/Icon'; import { displayDateWithPrefixedTime } from 'design/datetime'; diff --git a/web/packages/shared/components/AccessRequests/Shared/utils.ts b/web/packages/shared/components/AccessRequests/Shared/utils.ts index 6185e568c4c21..1079ca9796f09 100644 --- a/web/packages/shared/components/AccessRequests/Shared/utils.ts +++ b/web/packages/shared/components/AccessRequests/Shared/utils.ts @@ -41,6 +41,7 @@ export function getNumAddedResources(addedResources: ResourceMap) { Object.keys(addedResources.user_group).length + Object.keys(addedResources.windows_desktop).length + Object.keys(addedResources.saml_idp_service_provider).length + - Object.keys(addedResources.namespace).length + Object.keys(addedResources.namespace).length + + Object.keys(addedResources.aws_ic_account_assignment).length ); } diff --git a/web/packages/shared/components/AccessRequests/fixtures/index.ts b/web/packages/shared/components/AccessRequests/fixtures/index.ts index ffb2c0f28343d..cf20f928fd2f4 100644 --- a/web/packages/shared/components/AccessRequests/fixtures/index.ts +++ b/web/packages/shared/components/AccessRequests/fixtures/index.ts @@ -141,6 +141,16 @@ export const requestSearchPending: AccessRequest = { friendlyName: 'app-saml', }, }, + { + id: { + kind: 'aws_ic_account_assignment', + name: 'admin-on-account1', + clusterName: 'cluster-name', + }, + details: { + friendlyName: 'account1', + }, + }, ], }; diff --git a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.story.tsx b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.story.tsx index b2efff7f98c3c..0ce3d0dd52b98 100644 --- a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.story.tsx +++ b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { AdvancedSearchToggle } from './AdvancedSearchToggle'; diff --git a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx index ea37fe2de003d..36a607dbbc5ea 100644 --- a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx +++ b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { Text, Toggle, Link, Flex, H2 } from 'design'; import { P } from 'design/Text/Text'; diff --git a/web/packages/shared/components/AnimatedTerminal/AnimatedTerminal.tsx b/web/packages/shared/components/AnimatedTerminal/AnimatedTerminal.tsx index d2923a8ae5029..3a320d93dc248 100644 --- a/web/packages/shared/components/AnimatedTerminal/AnimatedTerminal.tsx +++ b/web/packages/shared/components/AnimatedTerminal/AnimatedTerminal.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useEffect, useMemo, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { KeywordHighlight, diff --git a/web/packages/shared/components/AnimatedTerminal/TerminalContent.tsx b/web/packages/shared/components/AnimatedTerminal/TerminalContent.tsx index b025bb8e0e80e..5e231094578ea 100644 --- a/web/packages/shared/components/AnimatedTerminal/TerminalContent.tsx +++ b/web/packages/shared/components/AnimatedTerminal/TerminalContent.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useEffect, useLayoutEffect, useRef } from 'react'; +import { Fragment, useEffect, useLayoutEffect, useRef } from 'react'; import styled from 'styled-components'; import { BufferEntry } from 'shared/components/AnimatedTerminal/content'; @@ -125,14 +125,14 @@ function renderLines(lines: BufferEntry[], highlights?: KeywordHighlight[]) { } const result = lines.map(line => ( - + {line.isCommand ? ( ${line.text.length > 0 ? ' ' : ''} ) : null} {formatText(line.text, line.isCommand, highlights)} {line.isCurrent && line.isCommand ? : null}
-
+ )); return result; @@ -193,7 +193,7 @@ function formatText( outer: for (const [index, word] of words.entries()) { if (!isCommand && /(https?:\/\/\S+)/g.test(word)) { result.push( - + {word} {' '} - + ); continue; diff --git a/web/packages/shared/components/AwsLaunchButton/AwsLaunchButton.tsx b/web/packages/shared/components/AwsLaunchButton/AwsLaunchButton.tsx index 3fd51c5b1fe53..1bb9d7bc85627 100644 --- a/web/packages/shared/components/AwsLaunchButton/AwsLaunchButton.tsx +++ b/web/packages/shared/components/AwsLaunchButton/AwsLaunchButton.tsx @@ -48,7 +48,8 @@ export class AwsLaunchButton extends React.Component { render() { const { open } = this.state; - const { awsRoles, getLaunchUrl, onLaunchUrl } = this.props; + const { awsRoles, getLaunchUrl, onLaunchUrl, isAwsIdentityCenterApp } = + this.props; return ( <> { onLaunchUrl={onLaunchUrl} closeMenu={this.onClose} onChange={this.onChange} + isAwsIdentityCenterApp={isAwsIdentityCenterApp} /> @@ -107,6 +109,7 @@ function RoleItemList({ closeMenu, onChange, onLaunchUrl, + isAwsIdentityCenterApp, }: Props & { closeMenu: () => void; onChange: (event: React.ChangeEvent) => void; @@ -118,6 +121,9 @@ function RoleItemList({ if (display !== name) { text = `${text} (${name})`; } + if (isAwsIdentityCenterApp) { + text = name; + } return ( . */ -import React from 'react'; - import ButtonSso from './ButtonSso'; export default { diff --git a/web/packages/shared/components/ButtonSso/ButtonSso.test.tsx b/web/packages/shared/components/ButtonSso/ButtonSso.test.tsx index fb337001d13b8..aefdc8d5360ba 100644 --- a/web/packages/shared/components/ButtonSso/ButtonSso.test.tsx +++ b/web/packages/shared/components/ButtonSso/ButtonSso.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render } from 'design/utils/testing'; diff --git a/web/packages/shared/components/ButtonSso/ButtonSso.tsx b/web/packages/shared/components/ButtonSso/ButtonSso.tsx index 9cc4d8c208660..349128a9a1c95 100644 --- a/web/packages/shared/components/ButtonSso/ButtonSso.tsx +++ b/web/packages/shared/components/ButtonSso/ButtonSso.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { forwardRef } from 'react'; +import { forwardRef } from 'react'; import * as Icons from 'design/Icon'; import { ButtonProps, ButtonSecondary } from 'design/Button'; diff --git a/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.story.tsx b/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.story.tsx index 23ffd4ff43a3b..6036e570303b3 100644 --- a/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.story.tsx +++ b/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import Flex from 'design/Flex'; import { ButtonTextWithAddIcon } from './ButtonTextWithAddIcon'; diff --git a/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.test.tsx b/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.test.tsx index 6d88f3c1d26b5..06d24ef84b182 100644 --- a/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.test.tsx +++ b/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.test.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { render, fireEvent, screen } from 'design/utils/testing'; import { ButtonTextWithAddIcon } from './ButtonTextWithAddIcon'; diff --git a/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.tsx b/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.tsx index d025dbbceacbe..3d65b59944f06 100644 --- a/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.tsx +++ b/web/packages/shared/components/ButtonTextWithAddIcon/ButtonTextWithAddIcon.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { ButtonText } from 'design'; import { Add as AddIcon } from 'design/Icon'; diff --git a/web/packages/shared/components/ClusterDropdown/ClusterDropdown.story.tsx b/web/packages/shared/components/ClusterDropdown/ClusterDropdown.story.tsx index 1a26d46287c49..b982926874c1d 100644 --- a/web/packages/shared/components/ClusterDropdown/ClusterDropdown.story.tsx +++ b/web/packages/shared/components/ClusterDropdown/ClusterDropdown.story.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { MemoryRouter } from 'react-router'; import { Cluster } from 'teleport/services/clusters'; diff --git a/web/packages/shared/components/DownloadConnect/DownloadConnect.story.tsx b/web/packages/shared/components/DownloadConnect/DownloadConnect.story.tsx index 9758176f55156..fa206cb57b914 100644 --- a/web/packages/shared/components/DownloadConnect/DownloadConnect.story.tsx +++ b/web/packages/shared/components/DownloadConnect/DownloadConnect.story.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Box, Text } from 'design'; import { Platform } from 'design/platform'; diff --git a/web/packages/shared/components/Editor/Tabs.tsx b/web/packages/shared/components/Editor/Tabs.tsx index 80c43c890e7a5..582e973f78c69 100644 --- a/web/packages/shared/components/Editor/Tabs.tsx +++ b/web/packages/shared/components/Editor/Tabs.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import * as Icons from 'design/Icon'; diff --git a/web/packages/shared/components/FieldCheckbox/FieldCheckbox.story.tsx b/web/packages/shared/components/FieldCheckbox/FieldCheckbox.story.tsx index fd646a956a7e2..3c940aeb61a0c 100644 --- a/web/packages/shared/components/FieldCheckbox/FieldCheckbox.story.tsx +++ b/web/packages/shared/components/FieldCheckbox/FieldCheckbox.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import Box from 'design/Box'; import { FieldCheckbox } from '.'; diff --git a/web/packages/shared/components/FieldInput/FieldInput.story.tsx b/web/packages/shared/components/FieldInput/FieldInput.story.tsx index 1cbcef38cc66e..8de1116cf6f31 100644 --- a/web/packages/shared/components/FieldInput/FieldInput.story.tsx +++ b/web/packages/shared/components/FieldInput/FieldInput.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { ButtonPrimary, Text } from 'design'; import { EmailSolid } from 'design/Icon'; diff --git a/web/packages/shared/components/FieldInput/FieldInput.test.tsx b/web/packages/shared/components/FieldInput/FieldInput.test.tsx index 064ca9f612bf9..2440f5587659a 100644 --- a/web/packages/shared/components/FieldInput/FieldInput.test.tsx +++ b/web/packages/shared/components/FieldInput/FieldInput.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render, fireEvent } from 'design/utils/testing'; diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx index 2f798d4d923d1..565f1769ace84 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import Box from 'design/Box'; diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx index 89b191e1e5b2d..4d10c34449f26 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx @@ -17,7 +17,7 @@ */ import userEvent from '@testing-library/user-event'; -import React, { useState } from 'react'; +import { useState } from 'react'; import { act, render, screen } from 'design/utils/testing'; diff --git a/web/packages/shared/components/FieldSelect/FieldSelect.test.tsx b/web/packages/shared/components/FieldSelect/FieldSelect.test.tsx index 08d9a384b05d3..2c3f1cd829fbd 100644 --- a/web/packages/shared/components/FieldSelect/FieldSelect.test.tsx +++ b/web/packages/shared/components/FieldSelect/FieldSelect.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render, fireEvent } from 'design/utils/testing'; diff --git a/web/packages/shared/components/FieldSelect/FieldSelectCreatable.test.tsx b/web/packages/shared/components/FieldSelect/FieldSelectCreatable.test.tsx index 13a5ae39089ea..a2f013ad13254 100644 --- a/web/packages/shared/components/FieldSelect/FieldSelectCreatable.test.tsx +++ b/web/packages/shared/components/FieldSelect/FieldSelectCreatable.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render } from 'design/utils/testing'; diff --git a/web/packages/shared/components/FieldTextArea/FieldTextArea.story.tsx b/web/packages/shared/components/FieldTextArea/FieldTextArea.story.tsx index bdfc4534ba585..ac63d6eee4373 100644 --- a/web/packages/shared/components/FieldTextArea/FieldTextArea.story.tsx +++ b/web/packages/shared/components/FieldTextArea/FieldTextArea.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { ButtonPrimary, Text } from 'design'; import Validation from '../../components/Validation'; diff --git a/web/packages/shared/components/FileTransfer/FileTransfer.test.tsx b/web/packages/shared/components/FileTransfer/FileTransfer.test.tsx index 11de431965aad..fbc7caaed47a4 100644 --- a/web/packages/shared/components/FileTransfer/FileTransfer.test.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransfer.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { act, fireEvent, diff --git a/web/packages/shared/components/FileTransfer/FileTransfer.tsx b/web/packages/shared/components/FileTransfer/FileTransfer.tsx index a192461b61447..72d88a8dcc0fc 100644 --- a/web/packages/shared/components/FileTransfer/FileTransfer.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransfer.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { useFileTransferContext } from './FileTransferContextProvider'; import { FileTransferDialogDirection, diff --git a/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx b/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx index 74c0616f8add0..ccb61201fca83 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Flex, ButtonIcon, Text } from 'design'; import * as Icons from 'design/Icon'; import { HoverTooltip } from 'design/Tooltip'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferContextProvider.tsx b/web/packages/shared/components/FileTransfer/FileTransferContextProvider.tsx index 031d4bbb0608c..bf804472cc17d 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferContextProvider.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferContextProvider.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { +import { useContext, useState, FC, diff --git a/web/packages/shared/components/FileTransfer/FileTransferRequests.story.tsx b/web/packages/shared/components/FileTransfer/FileTransferRequests.story.tsx index 72c33603237b7..d36e79d7ea9f0 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferRequests.story.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferRequests.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import ConsoleContextProvider from 'teleport/Console/consoleContextProvider'; import ConsoleContext from 'teleport/Console/consoleContext'; import { FileTransferRequest } from 'teleport/Console/DocumentSsh/useFileTransfer'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferRequests.tsx b/web/packages/shared/components/FileTransfer/FileTransferRequests.tsx index 16e864ef7a16b..e526e7c945c44 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferRequests.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferRequests.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { ButtonBorder, Box, Flex, Text, Button } from 'design'; import * as Icons from 'design/Icon'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.test.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.test.tsx index be91459bbd712..be88e37eb1c57 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.test.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { fireEvent, render, screen } from 'design/utils/testing'; import { DownloadForm } from './DownloadForm'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.tsx index f0b457dbf4447..d428d76f4d09d 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/DownloadForm/DownloadForm.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useId, useState } from 'react'; +import { useId, useState } from 'react'; import { Flex, LabelInput } from 'design'; import { ButtonPrimary } from 'design/Button'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.test.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.test.tsx index 9e1c64d6e8b73..ebc4d8fc620cc 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.test.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { fireEvent, render, screen } from 'design/utils/testing'; import { TransferredFile } from '../types'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.tsx index 052e9e100a86e..305be469d9bc4 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileList.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { TransferredFile } from '../types'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileListItem.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileListItem.tsx index f55a27612a0bd..9c048535de51a 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileListItem.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileList/FileListItem.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { FC, PropsWithChildren, useEffect } from 'react'; +import { FC, PropsWithChildren, useEffect } from 'react'; import styled from 'styled-components'; import { ButtonIcon, Flex, Text } from 'design'; import { CircleCheck, Cross, Warning } from 'design/Icon'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.story.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.story.tsx index c2a212ea68b4d..b7ae036ad3070 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.story.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.story.tsx @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; - import { FileTransferContainer } from '../FileTransferContainer'; import { diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.tsx index a67f6ac03de16..1d9eea8d995f7 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/FileTransferStateless.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { ButtonIcon, Flex, Text } from 'design'; import { Cross as CloseIcon } from 'design/Icon'; diff --git a/web/packages/shared/components/FileTransfer/FileTransferStateless/UploadForm/UploadForm.test.tsx b/web/packages/shared/components/FileTransfer/FileTransferStateless/UploadForm/UploadForm.test.tsx index 465387081d940..4493b575717fe 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferStateless/UploadForm/UploadForm.test.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferStateless/UploadForm/UploadForm.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { fireEvent, render, screen } from 'design/utils/testing'; import { UploadForm } from './UploadForm'; diff --git a/web/packages/shared/components/Highlight/Highlight.story.tsx b/web/packages/shared/components/Highlight/Highlight.story.tsx index 946dc1f512ddf..46a1817087d88 100644 --- a/web/packages/shared/components/Highlight/Highlight.story.tsx +++ b/web/packages/shared/components/Highlight/Highlight.story.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import styled from 'styled-components'; import { Flex, Text } from 'design'; diff --git a/web/packages/shared/components/Highlight/Highlight.tsx b/web/packages/shared/components/Highlight/Highlight.tsx index 017c1903729c4..c1a3c73767471 100644 --- a/web/packages/shared/components/Highlight/Highlight.tsx +++ b/web/packages/shared/components/Highlight/Highlight.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { findAll } from 'highlight-words-core'; /** diff --git a/web/packages/shared/components/MenuAction/MenuAction.story.tsx b/web/packages/shared/components/MenuAction/MenuAction.story.tsx index 156193ea6aeac..4b5bbc4a5ed1e 100644 --- a/web/packages/shared/components/MenuAction/MenuAction.story.tsx +++ b/web/packages/shared/components/MenuAction/MenuAction.story.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Flex } from 'design'; import { Cog } from 'design/Icon'; diff --git a/web/packages/shared/components/MenuAction/MenuAction.test.tsx b/web/packages/shared/components/MenuAction/MenuAction.test.tsx index 184bb434e495a..e376c2ecf98dc 100644 --- a/web/packages/shared/components/MenuAction/MenuAction.test.tsx +++ b/web/packages/shared/components/MenuAction/MenuAction.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { screen } from '@testing-library/react'; import { render, fireEvent } from 'design/utils/testing'; diff --git a/web/packages/shared/components/MenuLogin/MenuLogin.test.tsx b/web/packages/shared/components/MenuLogin/MenuLogin.test.tsx index 585fc04b8b54e..fec647363bb23 100644 --- a/web/packages/shared/components/MenuLogin/MenuLogin.test.tsx +++ b/web/packages/shared/components/MenuLogin/MenuLogin.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { render, fireEvent, screen, waitFor } from 'design/utils/testing'; import { MenuLogin } from './MenuLogin'; diff --git a/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx b/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx index aaef46ec0baf6..f414c2526318f 100644 --- a/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx +++ b/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx @@ -20,14 +20,22 @@ import { Box, Text, Flex } from 'design'; export const MissingPermissionsTooltip = ({ missingPermissions, + requiresAll = true, }: { missingPermissions: string[]; + requiresAll?: boolean; }) => { return ( You do not have all of the required permissions. - Missing permissions: + {requiresAll ? ( + Missing permissions: + ) : ( + + You must have at least one of these role permissions: + + )} {missingPermissions.map(perm => ( {perm} diff --git a/web/packages/shared/components/Notification/Notification.story.tsx b/web/packages/shared/components/Notification/Notification.story.tsx index 4df7b2e7ee299..b3b2b1b9fe5ad 100644 --- a/web/packages/shared/components/Notification/Notification.story.tsx +++ b/web/packages/shared/components/Notification/Notification.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import { useState } from 'react'; import { Bots } from 'design/Icon'; import Flex from 'design/Flex'; diff --git a/web/packages/shared/components/Search/SearchPagination.tsx b/web/packages/shared/components/Search/SearchPagination.tsx index d4d31851abf7d..f2cdbe89ec7e6 100644 --- a/web/packages/shared/components/Search/SearchPagination.tsx +++ b/web/packages/shared/components/Search/SearchPagination.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { Flex } from 'design'; import { StyledPanel } from 'design/DataTable/StyledTable'; import { StyledArrowBtn } from 'design/DataTable/Pager/StyledPager'; diff --git a/web/packages/shared/components/Search/SearchPanel.tsx b/web/packages/shared/components/Search/SearchPanel.tsx index e4dec55a30776..4c470b6b790b9 100644 --- a/web/packages/shared/components/Search/SearchPanel.tsx +++ b/web/packages/shared/components/Search/SearchPanel.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import styled from 'styled-components'; import { Flex } from 'design'; import InputSearch from 'design/DataTable/InputSearch'; diff --git a/web/packages/shared/components/Select/Select.tsx b/web/packages/shared/components/Select/Select.tsx index 2f86a5d87a0cf..1beaab055b905 100644 --- a/web/packages/shared/components/Select/Select.tsx +++ b/web/packages/shared/components/Select/Select.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import ReactSelect, { ClearIndicatorProps, DropdownIndicatorProps, diff --git a/web/packages/shared/components/Select/SelectCreatable.story.tsx b/web/packages/shared/components/Select/SelectCreatable.story.tsx index 02bfcba2cc647..e813e6f4496cd 100644 --- a/web/packages/shared/components/Select/SelectCreatable.story.tsx +++ b/web/packages/shared/components/Select/SelectCreatable.story.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React from 'react'; +import { useState } from 'react'; import { Flex, Box } from 'design'; import { SelectCreatable, Option } from '../Select'; @@ -26,10 +26,10 @@ export default { }; export const Selects = () => { - const [input, setInput] = React.useState(''); - const [inputMulti, setInputMulti] = React.useState(''); - const [selected, setSelected] = React.useState