diff --git a/README.md b/README.md index 40dfc19..699121f 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,9 @@ the relay. Consumer docs, including endpoints and cursor semantics, are at ## what it does - **live feeds**: `/subscribe` (Jetstream v1-compatible JSON) and - `/subscribe-v2` (sequence cursors + record CBOR), with collection/DID + `/xrpc/network.bsky.jetstream.subscribeEvents` (proposal-0015 lexicon frames, sequence cursors), with collection/DID filters, cursor replay, and zstd -- **the archive**: `listSegments`, `getSegment`, `getBlock`, `planBackfill` — +- **the archive**: `listSegments`, `getSegment`, `getBlock`, `planSnapshot` — gap-free recovery over sealed `jss` segments byte-compatible with upstream. A working consumer (plan → fetch → decode → sqlite) is [`examples/backfill-collection-sqlite.py`](examples/backfill-collection-sqlite.py); @@ -27,7 +27,7 @@ the relay. Consumer docs, including endpoints and cursor semantics, are at The full implemented surface is in [`docs/feature-surface.md`](docs/feature-surface.md). Stream targets semantic -parity with pinned Jetstream V2 commit `f29815c`; +parity with pinned Jetstream V2 commit `d4dd2f0`; [`docs/semantic-parity.md`](docs/semantic-parity.md) is the authority on what is proved, row by row, and no claim here overrides it. diff --git a/deploy/site/llms.txt b/deploy/site/llms.txt index 0dc8a43..ce5fcd3 100644 --- a/deploy/site/llms.txt +++ b/deploy/site/llms.txt @@ -16,7 +16,7 @@ Things to remember: - the subscribe replay window is bounded (~1.5 days; see `cursor lookback` on /status). deeper history is the archive API's job, not subscribe's. - archive blocks are PLAIN zstd frames — the dictionary endpoint is only - for subscribe-v2 wire compression. + for subscribeEvents wire compression. - the archive's retrieval unit is a ~4096-event block: right for dense collections, whole-network drains, per-DID history, and deleted or historical records; wrong for sparse scattered collections (measured @@ -36,16 +36,17 @@ Things to remember: - `wss://stream.waow.tech/subscribe`: Jetstream-compatible JSON websocket — `wantedCollections` (prefix patterns, cap 100), `wantedDids`, `cursor` -- `wss://stream.waow.tech/subscribe-v2`: superset wire — +- `wss://stream.waow.tech/xrpc/network.bsky.jetstream.subscribeEvents`: + proposal-0015 lexicon frames — strict per-event sequence cursors, raw record CBOR, #sync events - [listSegments](https://stream.waow.tech/xrpc/network.bsky.jetstream.listSegments?limit=10): sealed-segment metadata (seq ranges, checksums, event counts), paginated - `getSegment?name=`: one sealed segment (~277 MB), Range/206 + ETag (etag = checksum) - `getBlock?segment=&blockIndex=`: one compressed block -- planBackfill (POST, json `{"collections":[...]}` or `{"dids":[...]}`): +- planSnapshot (POST, json `{"collections":[...]}` or `{"dids":[...]}`): returns `plannedThroughSeq` + the segment/block list for a range — - gap-free recovery: plan from your last seq, fetch, resume subscribe-v2 + gap-free recovery: plan from your last seq, fetch, resume subscribeEvents at `plannedThroughSeq` - [/status](https://stream.waow.tech/status): plain-text field report for scripts (browsers get HTML — don't parse that variant) diff --git a/deploy/site/stats.html b/deploy/site/stats.html index 8680d0d..5c84126 100644 --- a/deploy/site/stats.html +++ b/deploy/site/stats.html @@ -241,7 +241,7 @@ async function tick(){ const phase = g(/phase\s+(\S+ for \S+ ?\S*)/); if(phase) $("uptime-sub").textContent = phase.trim(); const ls = g(/listeners\s+([\d,]+)/); - if(ls) $("subs-sub").textContent = "on /subscribe + /subscribe-v2"; + if(ls) $("subs-sub").textContent = "on /subscribe + subscribeEvents"; await fetchMetrics(); }catch(e){ $("live").textContent = "· unreachable"; } } diff --git a/docs/semantic-parity.md b/docs/semantic-parity.md index 394ab4e..23fd142 100644 --- a/docs/semantic-parity.md +++ b/docs/semantic-parity.md @@ -3,6 +3,15 @@ This is a deployment gate. A row describes what the current implementation can prove today; its status reflects current evidence only. +> **Re-pin in progress (2026-08-12).** Upstream renamed the v2 surface to +> `network.bsky.jetstream.subscribeEvents` (proposal-0015 lexicon frames), +> renamed `planBackfill` to `planSnapshot`, removed `recordCbor`, added a v1 +> envelope `cursor`, and retrained the v2 zstd dictionary. Stream ported the +> new contract against pin `d4dd2f0127e8934d125b2a26a90fe88239ca98a2`; rows +> below still describe the f29815c-era audit and are being re-proved through +> the gate (the differential oracle and archive-client e2e now run upstream's +> d4dd2f0 client against Stream). + ## Audit basis - Stream: `eb95c14310ef18c7ab9edbcff991a04a560a7d86` diff --git a/docs/upstream-subscribe-protocol.md b/docs/upstream-subscribe-protocol.md index 00fbf30..eef0d07 100644 --- a/docs/upstream-subscribe-protocol.md +++ b/docs/upstream-subscribe-protocol.md @@ -1,5 +1,13 @@ # jetstream v1 `/subscribe` wire protocol (from upstream v2 rewrite) +> **Superseded for v2 (2026-08-12):** upstream replaced the `/subscribe-v2` +> superset wire this document describes with `network.bsky.jetstream.subscribeEvents` +> (atproto proposal 0015: `xrpc.v1.json` message frames, lexicon-governed +> payloads, no `record_cbor`, RFC 3339 `time`). The lexicon file in upstream's +> `lexicons/network/bsky/jetstream/subscribeEvents.json` and upstream +> `docs/README.md` §5.2 are now authoritative for v2; the v1 sections below +> remain accurate (v1 additionally gained an optional envelope `cursor`). + condensed from `bluesky-social/jetstream` `internal/subscribe/{doc,handler,filter,encoder,cursor,compress}.go` and §5 of upstream's `docs/README.md`. **Those are upstream Go paths — none of them are in diff --git a/examples/backfill-collection-sqlite.py b/examples/backfill-collection-sqlite.py index 328e6f9..52ebddd 100644 --- a/examples/backfill-collection-sqlite.py +++ b/examples/backfill-collection-sqlite.py @@ -4,7 +4,7 @@ # /// """backfill one collection from a stream instance's archive into sqlite. -the consumer-side recipe for network.bsky.jetstream.planBackfill: +the consumer-side recipe for network.bsky.jetstream.planSnapshot: plan (collection filter) -> fetch planned blocks/segments -> decompress (plain zstd frames, no dictionary) -> columnar decode -> keep matching rows -> insert. prints a timing/throughput report at the end. @@ -89,7 +89,7 @@ def main() -> None: dctx = zstandard.ZstdDecompressor() t0 = time.monotonic() plan = s.post( - f"{args.host}/xrpc/network.bsky.jetstream.planBackfill", + f"{args.host}/xrpc/network.bsky.jetstream.planSnapshot", json={"collections": [args.collection]}, timeout=60, ).json() diff --git a/src/assets/zstd_dictionary_v2.b64 b/src/assets/zstd_dictionary_v2.b64 index 279a26d..7a56609 100644 --- a/src/assets/zstd_dictionary_v2.b64 +++ b/src/assets/zstd_dictionary_v2.b64 @@ -1,729 +1 @@ -N6Qw7GUnNQE1EMCS1AEzMAMzMAMzBGHZJdtdUmdyw23KzKsSa61FP0JFDSr2f/vRjwcKI3uizOROECkDuwpjBwAAAAwCMUCOJJGwHgTAQAcKCosGBIOEAoKG -koiLhgqMCodjwVBEFo3EgiiURTEMI0ncYAAAAHSKgkGhoQKmoWk0DoVCYUAYDA6lYyLWCgAAAAEAAAAEAAAACAAAAHJlaWUyaWVsbDZ5NHZqdHl3bndkcnht -d3V0YW9yN3dibWRmb3o3cGhkaXJpcTIyZ3RnbXlyZ3EiLCJ1cmkiOiJhdDovL2RpZDpwbGM6b29qaGFoZHNteXlwZnl5eHJlb3h3cXFwL2FwcC5ic2t5LmZl -ZWQucG9zdC8zbXE3dHRhbmR0czIyIn19LCJjaWQiOiJiYWZ5cmVpZ3hwbGVycTR6aHUzZmY1bGdicGdoaHl2ZHh4eWp4czRnNnZpcTZ6MmQ2b3BpdTRoNW40 -YSIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xteHBhMlZuYzNWaWFtVmpkS0pqWTJsa2VEdGlZV1o1Y21WcFpUSnBaV3hz -Tm5rMGRtcDBlWGR1ZDJSeWVHMTNkWFJoYjNJM2QySnRaR1p2ZWpkd2FHUnBjbWx4TWpKbmRHZHRlWEpuY1dOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwdmIy -cG9ZV2hrYzIxNWVYQm1lWGw0Y21WdmVIZHhjWEF2WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZDBkR0Z1WkhSek1qSnBZM0psWVhSbFpFRjBlQmd5 -TURJMkxUQTNMVEE1VkRFMk9qTTNPakF3TGpJd01Wbz0ifX17ImRpZCI6ImRpZDpwbGM6YTZnNjNpN3Fpc3NmanZnNTdmeWpoYXh2IiwidGltZV91cyI6MTc4 -MzYxNDkxNDcyNjcxMCwiY3Vyc29yIjoyMjU4Mjc1NjgyNCwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI3NTY4MjQsImNvbW1pdCI6eyJyZXYiOiIzbXFh -MnVxYW1wNjJ4Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsInJrZXkiOiIzbXFhMnVxYWZ1ZzJ4Iiwi -cmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNToxNC4yNzlaIiwic3ViamVjdCI6eyJj -aWQiOiJiYWZ5cmVpaHVyZG8ycm0zcWt4dmJiM2NvZ25saW55d3Vyc2d1bWtpYmlqaWZ2eHFteWxidTN6Z3pleXJlaWU1N3N5empxc2JzZjZ6aWRmejJvMzNw -cHFsdHNkcG1teWl3bTQ1ZzNzbnRvYmdpY3Vrb2UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dXloNWh1enh0dGh0a2c2aHRzZ3Q1NmxoL2FwcC5ic2t5LmZlZWQu -cG9zdC8zbXFhMnNvb3YzaTJmIn19LCJ0ZXh0IjoiU2hlJ3MganVzdCB0aGUgbW9zdCB0cmFuc3BhcmVudC4gLiAuIHRoZXJlIGlzIGEgbm90IGluc2lnbmlm -aWNhbnQgbnVtYmVyIG9mIGN1bHRpc3RzIHRoYXQgZmVlbCB0aGlzIHZlcnkgc2FtZSB3YXkuIn0sImNpZCI6ImJhZnlyZWllenptZGdrN3JqeXN6aHdwN2d2 -Mnk3MjRlcndhb2lnM2Zzc3lrcmRma2licHlydHh0eGs0IiwicmVjb3JkX2Nib3IiOiJwV1IwWlhoMGVISlRhR1VuY3lCcWRYTjBJSFJvWlNCdGIzTjBJSFJ5 -WVc1emNHRnlaVzUwTGlBdUlDNGdkR2hsY21VZ2FYTWdZU0J1YjNRZ2FXNXphV2R1YVdacFkyRnVkQ0J1ZFcxaVpYSWdiMllnWTNWc2RHbHpkSE1nZEdoaGRD -Qm1aV1ZzSUhSb2FYTWdkbVZ5ZVNCellXMWxJSGRoZVM1bEpIUjVjR1Z5WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wWld4aGJtZHpnV0psYm1WeVpYQnNlYUpr -Y205dmRLSmpZMmxrZUR0aVlXWjVjbVZwWlRVM2MzbDZhbkZ6WW5ObU5ucHBaR1o2TW04ek0zQndjV3gwYzJSd2JXMTVhWGR0TkRWbk0zTnVkRzlpWjJsamRX -dHZaV04xY21sNFJtRjBPaTh2Wkdsa09uQnNZenAxZVdnMWFIVjZlSFIwYUhSclp6Wm9kSE5uZERVMmJHZ3ZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50 -Y1dFeWMyOXZkak5wTW1abWNHRnlaVzUwb21OamFXUjRPMkpoWm5seVpXbGxOVGR6ZVhwcWNYTmljMlkyZW1sa1pub3liek16Y0hCeGJIUnpaSEJ0YlhscGQy -MDBOV2N6YzI1MGIySm5hV04xYTI5bFkzVnlhWGhHWVhRNkx5OWthV1E2Y0d4ak9uVjVhRFZvZFhwNGRIUm9kR3RuTm1oMGMyZDBOVFpzYUM5aGNIQXVZbk5y -ZVM1bVpXVmtMbkJ2YzNRdk0yMXhZVEp6YjI5Mk0ya3labWxqY21WaGRHVmtRWFI0R0RJd01qWXRNRGN0TURsVU1UWTZNemM2TkRVdU56WXpXZz1jbVZwWlhO -dWFEUnRibVpqWW5aaGJXUTBiVE16WkRRMU5qZDJkelYxTldWNmJHOXZOR2hwWnpkMGFuQnpaWEZ3Ykc5elltSmtaV04xY21sNFJtRjBPaTh2Wkdsa09uQnNZ -enB1ZG1ad2IzTnRjRzFvWldkMGVYWm9Zbk0zTlhNemNIY3ZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkNWRHbHRZWGhqTW5ScFkzSmxZWFJsWkVG -MGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNMk9qRTNMall4TUZvPSJ9fXsiZGlkIjoiZGlkOnBsYzptYjYya2tpdjV4c2VtMmM3Z2U2d2RrcHMiLCJ0aW1lX3Vz -IjoxNzgzNjE0OTMwMzI3Mzk3LCJjdXJzb3IiOjIyNTgyNzY0NzQ4LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc2NDc0OCwiY29tbWl0Ijp7InJldiI6 -IjNtcWEydjdhdHkyMmwiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNtcWEydjdhamFj -MmwiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM1OjMwLjA1OFoiLCJzdWJqZWN0 -Ijp7ImNpZCI6ImJhZnlyZWlkYWNvNTdnbms2emNveGJqaGZubmdqcWVzeXlhM3Vwb2tnbGF0eWthbDR1YzVqN203ZXBlIiwidXJpIjoiYXQ6Ly9kaWQ6cGxj -OnJyZndydWh1ZDRvdmVsYTNvZTZpc3JlNS9hcHAuYnNreS5mZWVkLnBvc3QvM21xYTJ1MmNxYXMyZSJ9fSwiY2lkIjoiYmFmeXJlaWFpZmI1Ym54cjVudXNv -eXNtZnRzdDVycmc1dXRlNG42YXV0aW1nNmdhcWdkcHliaWxudGkiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJW -bmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBaR0ZqYnpVM1oyNXJObnBqYjNoaWFtaG1ibTVuYW5GbGMzbDVZVE4xY0c5cloyeGhkSGxyWVd3MGRXTTFh -amR0TjJWd1pXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6cHljbVozY25Wb2RXUTBiM1psYkdFemIyVTJhWE55WlRVdllYQndMbUp6YTNrdVptVmxaQzV3YjNO -MEx6TnRjV0V5ZFRKai5wb3N0LzNtcTdtNGtsd3VrMnQifX0sInRleHQiOiJTaW5jZSBldmVyeWJvZHkgZWxzZSBoYXMgXCJzaGUncyBhbiBldmlsIHNoaXRi -YWdcIiBzZXduIHVwLCBJJ20gZ29pbmcgdG8gZm9jdXMgb24gdGhhdCBoYWlyY3V0LiJ9LCJjaWQiOiJiYWZ5cmVpZHFsYXBvZ3Rqa21rZXVma3AyNmhsaXpl -M2N5Y2lqeGEyemVueHMybjZuYXB5enJhYzRlcSIsInJlY29yZF9jYm9yIjoicFdSMFpYaDBlRjFUYVc1alpTQmxkbVZ5ZVdKdlpIa2daV3h6WlNCb1lYTWdJ -bk5vWlNkeklHRnVJR1YyYVd3Z2MyaHBkR0poWnlJZ2MyVjNiaUIxY0N3Z1NTZHRJR2R2YVc1bklIUnZJR1p2WTNWeklHOXVJSFJvWVhRZ2FHRnBjbU4xZEM1 -bEpIUjVjR1Z5WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wWld4aGJtZHpnV0psYm1WeVpYQnNlYUprY205dmRLSmpZMmxrZUR0aVlXWjVjbVZwWVhFemNXeG1h -MjAzTTJOa2Rtc3lOMkZ3Wm01b2VISnpiV0ZvY1c1cmNtSm1NbWMxTW1ack5YbHJaMnBtYTJ4cWVHbDJkV04xY21sNFJtRjBPaTh2Wkdsa09uQnNZenB4ZDI5 -NU5YbDBhbU50YkdVek5uUnhOMmhpWm1WeWFua3ZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkdE5HdHNkM1ZyTW5SbWNHRnlaVzUwb21OamFXUjRP -MkpoWm5seVpXbGhjVE54YkdacmJUY3pZMlIyYXpJM1lYQm1ibWg0Y25OdFlXaHhibXR5WW1ZeVp6VXlabXMxZVd0bmFtWnJiR3A0YVhaMVkzVnlhWGhHWVhR -Nkx5OWthV1E2Y0d4ak9uRjNiM2sxZVhScVkyMXNaVE0yZEhFM2FHSm1aWEpxZVM5aGNIQXVZbk5yZVM1bVpXVmtMbkJ2YzNRdk0yMXhOMjAwYTJ4M2RXc3lk -R2xqY21WaGRHVmtRWFI0R0RJd01qWXRNRGN0TURsVU1UWTZNelU2TlRVdU9UWXpXZz09In19eyJkaWQiOiJkaWQ6cGxjOm15am9pNGxpZjJsaDR3bGhkbWZx -eXFjMyIsInRpbWVfdXMiOjE3ODM2MTQ5NzQ4Mjc1MjEsImN1cnNvciI6MjI1ODI3ODYyNTYsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzg2MjU2LCJj -b21taXQiOnsicmV2IjoiM21xYTJ3anJ1dWcyYSIsIm9wYnNreS5lbWJlZC52aWRlbyIsImFzcGVjdFJhdGlvIjp7ImhlaWdodCI6Mzg0MCwid2lkdGgiOjIx -NjB9LCJwcmVzZW50YXRpb24iOiJkZWZhdWx0IiwidmlkZW8iOnsiJHR5cGUiOiJibG9iIiwibWltZVR5cGUiOiJ2aWRlby9tcDQiLCJyZWYiOnsiJGxpbmsi -OiJiYWZrcmVpaGFqaDJybnJsanh1N3VieWl3azUzNXM0YjJ3aHpyaWI2czdocnZ6a3hkbzVianhwc2N0dSJ9LCJzaXplIjozMzAyMjQxfX0sImxhYmVscyI6 -eyIkdHlwZSI6ImNvbS5hdHByb3RvLmxhYmVsLmRlZnMjc2VsZkxhYmVscyIsInZhbHVlcyI6W3sidmFsIjoicG9ybiJ9XX0sImxhbmdzIjpbImVuIl0sInRl -eHQiOiIifSwiY2lkIjoiYmFmeXJlaWV5amszM291eXF4ZXpmYzJrd2hhdWl6eTVpN2tzZjZleGtheHZsamJlbXJyYzdia3o3YWkiLCJyZWNvcmRfY2JvciI6 -InBtUjBaWGgwWUdVa2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xuQnZjM1JsWlcxaVpXU2taU1IwZVhCbGRHRndjQzVpYzJ0NUxtVnRZbVZrTG5acFpHVnZa -WFpwWkdWdnBHTnlaV2JZS2xnbEFBRlZFaURnU2ZVV3hXbTlQMERoRmxkMzJYQTZzZk1VQjlMNTQxeXE0M2RDbTc1Q25XUnphWHBsR2dBeVkyRmxKSFI1Y0dW -a1lteHZZbWh0YVcxbFZIbHdaV2wyYVdSbGJ5OXRjRFJyWVhOd1pXTjBVbUYwYVcraVpYZHBaSFJvR1Fod1ptaGxhV2RvZEJrUEFHeHdjbVZ6Wlc1MFlYUnBi -MjVuWkdWbVlYVnNkR1ZzWVc1bmM0RmlaVzVtYkdGaVpXeHpvbVVrZEhsd1pYZ2hZMjl0TG1GMGNISnZkRzh1YkdGaVpXd3VaR1ZtY3lOelpXeG1UR0ZpWld4 -elpuWmhiSFZsYzRHaFkzWmhiR1J3YjNKdWFXTnlaV0YwWldSQmRIZ1lNakF5Tmkwd055MHdPVlF4Tmpvek5qbzFNeTQwTmpGYSJ9fXsiZGlkIjoiZGlkOnBs -YzphcXB0NHFqdWJ1emJjeG9jN3pnYWZuNzMiLCJ0aW1lX3VzIjoxNzgzNjE0OTQ0OTI5ODg1LCJjdXJzb3IiOjIyNTgyNzcxOTc4LCJraW5kIjoiY29tbWl0 -Iiwic2VxIjoyMjU4Mjc3MTk3OCwiY29tbWl0Ijp7InJldiI6IjNtcWEydm42aWdjMnIiLCJwWXpkamNIaDZjWFJwWjJRM2JtNW5ORFV5TTJFdllYQndMbUp6 -YTNrdVptVmxaQzV3YjNOMEx6TnRjVFoyZGpONWNYUXlNalJwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0xT2pReUxqRTNOVm89In19eyJk -aWQiOiJkaWQ6cGxjOnlzMmp0NWRsNmoyd2twdmxvNTJ2emV2YSIsInRpbWVfdXMiOjE3ODM2MTUwMTI4MjU2NzIsImN1cnNvciI6MjI1ODI4MDQxNjgsImtp -bmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODA0MTY4LCJjb21taXQiOnsicmV2IjoiM21xYTJ4bnhlanUybSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxl -Y3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJya2V5IjoiM21xYTJ4bng1cDQybSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIs -ImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzY6NTIuNTk1WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWhtc3I2YmVmNXVoaHV5cWtxejVqbHp4b2Fk -aWdsZnBnY2dteGt6N2RsNXdlYmtyaXgzZ3EiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dGN1azNvM2d2aXpvYWV3em54YjVydDR5L2FwcC5ic2t5LmZlZWQucG9z -dC8zbXE3cWhuMnozczJyIn19LCJjaWQiOiJiYWZ5cmVpY21jNWszZHJzM2tzaHJ4YWx1NTc3eGZiczVpcHdkbW40cnphNHJ3N2Z4eW0zenRzeW13dSIsInJl -Y29yZF9jYm9yIjoibzJVa2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xteHBhMlZuYzNWaWFtVmpkS0pqWTJsa2VEdGlZV1o1Y21WcGFHMXpjalppWldZMWRX -aG9kWGx4YTNGNk5XcHNlbmh2WVdScFoyeG1jR2RqWjIxNGEzbzNaR3cxZDJWaWEzSnBlRE5uY1dOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwMFkzVnJNMjh6 -WjNacGVtOWhaWGQ2Ym5oaU5YSjBOSGt2WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZHhhRzR5ZWpOek1uSnBZM0psWVhSbFpFRjBlQmd5TURJMkxU -QTNMVEE1VkRFMk9qTTJPalV5TGpVNU5Wbz0ifX17ImRpZCI6ImRpZDpwbGM6a280ZDNnc2YzZ25lbmtldzJ0aXU3NmttIiwidCIsImNyZWF0ZWRBdCI6IjIw -MjUtMTEtMTJUMTE6MTU6MjkuNTAzWiIsImxhbmdzIjpbImVuIl0sInRleHQiOiJnZW5zaGluIGZhbnMgd2lsbCBzZWUgYSBjaGFyYWN0ZXIgc28gdGhpbiB5 -b3UgY291bGQgdG91Y2ggdGhlaXIgcmlicyBhbmQgaW5zaXN0IHRoZXlyZSBjaHViYnkgYmMgdGhlaXIgZ2FtZXMgYXJlIHNvIHN0YXJ2ZWQgZm9yIGFueXRo -aW5nIHRoYXQgaXNudCBhIHNraW5ueSB3aGl0ZSB3b21hbiB0aGV5IGhhdmUgdG8gZ2FzbGlnaHQgdGhlbXNlbHZlcyBpbnRvIHRoaW5raW5nIHRoZXJlcyBh -bnkgbW9yZSBtZWxhbmluIG9yIGZhdCBvbiB0aGVpciBib2R5IHRoYW4gMCJ9LCJjaWQiOiJiYWZ5cmVpZXFyY3Fxd3RwdnJwa29oNXFoaWwyMjd0aG1veWQz -cDYzdDR1cmxraDVtZDdwNG02eW5paSIsInJlY29yZF9jYm9yIjoicEdSMFpYaDBlUUVLWjJWdWMyaHBiaUJtWVc1eklIZHBiR3dnYzJWbElHRWdZMmhoY21G -amRHVnlJSE52SUhSb2FXNGdlVzkxSUdOdmRXeGtJSFJ2ZFdOb0lIUm9aV2x5SUhKcFluTWdZVzVrSUdsdWMybHpkQ0IwYUdWNWNtVWdZMmgxWW1KNUlHSmpJ -SFJvWldseUlHZGhiV1Z6SUdGeVpTQnpieUJ6ZEdGeWRtVmtJR1p2Y2lCaGJubDBhR2x1WnlCMGFHRjBJR2x6Ym5RZ1lTQnphMmx1Ym5rZ2QyaHBkR1VnZDI5 -dFlXNGdkR2hsZVNCb1lYWmxJSFJ2SUdkaGMyeHBaMmgwSUhSb1pXMXpaV3gyWlhNZ2FXNTBieUIwYUdsdWEybHVaeUIwYUdWeVpYTWdZVzU1SUcxdmNtVWdi -V1ZzWVc1cGJpQnZjaUJtWVhRZ2IyNGdkR2hsYVhJZ1ltOWtlU0IwYUdGdUlEQmxKSFI1Y0dWeVlYQndMbUp6YTNrdVptVmxaQzV3YjNOMFpXeGhibWR6Z1dK -bGJtbGpjbVZoZEdWa1FYUjRHREl3TWpVdE1URXRNVEpVTVRFNk1UVTZNamt1TlRBeldnPT0ifX17ImRpZCI6ImRpZDpwbGM6ZTc3aW9vcXVmZnZ3aW5scnF6 -cjZ1eXNwIiwidGltZV91cyI6MTc4MzYxNTAwNzMyNzY1NCwiY3Vyc29yIjoyMjU4MjgwMTU1NSwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MDE1NTUs -ImNvMDlUMTY6Mzc6MzAuOTI0WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWU3eXIyczRwYjI2Yzd3bnZ6dGc3NnRqYTd1anR3b2EyN3RpYXMzN3JsMnQ3 -M2Izc3NqYXEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dXhkd2I0M3ptcGVqejJreXNlaGVtZjV0L2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3enhhN3hoYzJnIn0s -InZpYSI6eyJjaWQiOiJiYWZ5cmVpZXAyNmxkY3B6a2hxbjVhd2Z0dTJyd3dkcDRzM3NyaW5xeTJ2N3RveHByb3FyZGV0eWFobSIsInVyaSI6ImF0Oi8vZGlk -OnBsYzozY3FueDJtdnZia2t1eHIzbWxzNnB2NHUvYXBwLmJza3kuZmVlZC5yZXBvc3QvM21xYTJ2cGw3ZGYyYiJ9fSwiY2lkIjoiYmFmeXJlaWN4aGt5cnh0 -cm9wbHU0MzQ0M3hqemd2enh6N2Y3amRtcHJhY3BydzZhcHR4bWdvaHd4djQiLCJyZWNvcmRfY2JvciI6InBHTjJhV0dpWTJOcFpIZzdZbUZtZVhKbGFXVndN -alpzWkdOd2VtdG9jVzQxWVhkbWRIVXljbmQzWkhBMGN6TnpjbWx1Y1hreWRqZDBiM2h3Y205eGNtUmxkSGxoYUcxamRYSnBlRWhoZERvdkwyUnBaRHB3YkdN -Nk0yTnhibmd5YlhaMlltdHJkWGh5TTIxc2N6WndkalIxTDJGd2NDNWljMnQ1TG1abFpXUXVjbVZ3YjNOMEx6TnRjV0V5ZG5Cc04yUm1NbUpsSkhSNWNHVnlZ -WEJ3TG1KemEza3VabVZsWkM1c2FXdGxaM04xWW1wbFkzU2lZMk5wWkhnN1ltRm1lWEpsYVdVM2VYSXljelJ3WWpJMll6ZDNiblo2ZEdjM05uUnFZVGQxYW5S -M2IyRXlOM1JwWVhNek4zSnNNblEzTTJJemMzTnFZWEZqZFhKcGVFWmhkRG92TDJScFpEcHdiR002ZFhoa2QySTBNM3B0Y0dWcWVqSnJlWE5sYUdWdFpqVjBM -MkZ3Y0M1aWMydDVMbVpsWldRdWNHOXpkQzh6YlhFM2VuaGhOM2hvWXpKbmFXTnlaV0YwWldSQmRIZ1lNakF5Tmkwd055MHdPVlF4Tmpvek56b3pNQzQ1TWpS -YSJ9fXsiZGlkIjoiZGlkOnBsYzp2azdiaWtjZzVuYTM2emw2bW9wN3psaXkiLCJ0aW1lX3VzIjoxNzgzNjE0OTczNDMwOTEyLCJjdXJzb3IiOjIyNTgyNzg1 -NTg1LCJraW5kIjoiYWNjb3VudCIsInN0Oi8vZGlkOnBsYzpoNmduM2FyNXRrM2F2aW56bHd2bndiaHAvYXBwLmJza3kuZmVlZC5wb3N0LzNtcWEyY2ttcDVz -MmoifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpYXN4a2l2bG91M3l5ZzRpNmdwa2N0bTN2NWlzYmdmMzRid2xlN2NnYXZnN3N4M29zb3JweSIsInVyaSI6ImF0 -Oi8vZGlkOnBsYzpibndncGNlYWhtbDZhN25lbWF0NG91YWMvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd6Nzdpd2oyMm0ifX0sInRleHQiOiJZZXMsIHRoZSBi -aWdnZXN0IGFkdmFudGFnZSBzaGUgaGFzIGlzIHRoZSBhdG9taXphdGlvbiBvZiB0aGUgZW50aXJlIGZpZWxkIGJldHdlZW4gaGVyIGFuZCBNw6lsZW5jaG9u -LiBCdXQgaXQncyBlYXJseSwgc2hlIGRvZXNuJ3QgYWdlIHdlbGwgd2l0aCBjbG9zZXIgY29udGFjdCwgYW5kIGlmIHNvbWVvbmUgcGFsYXRhYmxlIG9uIHRo -ZSBjZW50ZXIgcmlnaHQgb3IgbGVmdCBtYW5hZ2VzIHRvIGNvbnNvbGlkYXRlIHN1cHBvcnQgKGJpZyBpZiwgSSBrbm93KSwgSSB0aGluayBzaGUnbGwgbG9z -ZSBhZ2Fpbi4ifSwiY2lkIjoiYmFmeXJlaWZ4YXVqYXJ3aGFrdGVsbGl2N3k2M3R4azR2aWJzaHI0MmIybDV1cWp4anljaWluM2FiN2UiLCJyZWNvcmRfY2Jv -ciI6InBXUjBaWGgwZVFFZ1dXVnpMQ0IwYUdVZ1ltbG5aMlZ6ZENCaFpIWmhiblJoWjJVZ2MyaGxJR2hoY3lCcGN5QjBhR1VnWVhSdmJXbDZZWFJwYjI0Z2Iy -WWdkR2hsSUdWdWRHbHlaU0JtYVdWc1pDQmlaWFIzWldWdUlHaGxjaUJoYm1RZ1RjT3BiR1Z1WTJodmJpNGdRblYwSUdsMEozTWdaV0Z5Ykhrc0lITm9aU0Jr -YjJWemJpZDBJR0ZuWlNCM1pXeHNJSGRwZEdnZ1kyeHZjMlZ5SUdOdmJuUmhZM1FzSUdGdVpDQnBaaUJ6YjIxbGIyNWxJSEJoYkdGMFlXSnNaU0J2YmlCMGFH -VWdZMlZ1ZEdWeUlISnBaMmgwSUc5eUlHeGxablFnYldGdVlXZGxjeUIwYnlCamIyNXpiMnhwWkdGMFpTQnpkWEJ3YjNKMElDaGlhV2NnYVdZc0lFa2dhMjV2 -ZHlrc0lFa2dkR2hwYm1zZ2MyaGxKMnhzSUd4dmMyVWdZV2RoYVc0dVpTUnlxcy9hcHAuYnNreS5mZWVkLnBvc3QvM21xYTJ0amh4MjIyayJ9fSwidGV4dCI6 -IlRlZXRoISBNeW90aSB0ZWV0aCBhcmUgYWxsIGVxdWFsbHkgc2hhcnAsIGJ1dCBmb3IgTGlhIG9ubHkgaGVyIGZhbmdzIGFyZSBzaGFycCBhbmQgZWxvbmdh -dGVkLiBUaGF0IGJlaW5nIHNhaWQsIGFsbCBoZXIgdGVldGggYXJlIGp1c3QgYXMgdG91Z2guIFRoZXkncmUgb21uaXZvcmVzIGluIHRoZSB0cnVlc3Qgc2Vu -c2UsIHN1cnZpdmluZyBvZmYgcm9jayBoYXJkIHJvb3QgcGxhbnRzIGFuZCB0b3VnaCBtZWF0cy4gVGhlIGluc2lkZSBvZiBoZXIgbW91dGggaXMgYmxhY2sg -YmVjYXVzZSBJIGxpa2UgaG93IGl0IGxvb2tzLiJ9LCJjaWQiOiJiYWZ5cmVpZ203cHl2ZHJuanZqamdkZ2JudzcyZmJrcW9wcjU0YWo3d2dhZnptNmlvcXcy -YnZkaXI0aSIsInJlY29yZF9jYm9yIjoicG1SMFpYaDBlUUVwVkdWbGRHZ2hJRTE1YjNScElIUmxaWFJvSUdGeVpTQmhiR3dnWlhGMVlXeHNlU0J6YUdGeWND -d2dZblYwSUdadmNpQk1hV0VnYjI1c2VTQm9aWElnWm1GdVozTWdZWEpsSUhOb1lYSndJR0Z1WkNCbGJHOXVaMkYwWldRdUlGUm9ZWFFnWW1WcGJtY2djMkZw -WkN3Z1lXeHNJR2hsY2lCMFpXVjBhQ0JoY21VZ2FuVnpkQ0JoY3lCMGIzVm5hQzRnVkdobGVTZHlaU0J2Ylc1cGRtOXlaWE1nYVc0Z2RHaGxJSFJ5ZFdWemRD -QnpaVzV6WlN3Z2MzVnlkbWwyYVc1bklHOW1aaUJ5YjJOcklHaGhjbVFnY205dmRDQndiR0Z1ZEhNZ1lXNWtJSFJ2ZFdkb0lHMWxZWFJ6TGlCVWFHVWdhVzV6 -YVdSbElHOW1JR2hsY2lCdGIzVjBhQ0JwY3lCaWJHRmpheUJpWldOaGRYTmxJRWtnYkdsclpTQm9iM2NnYVhRZ2JHOXZhM011WlNSMGVYQmxjbUZ3Y0M1aWMy -dDVMbVpsWldRdWNHOXpkR1ZsYldKbFpLSmxKSFI1Y0dWMVlYQndMbUp6YTNrdVpXMWlaV1F1YVcxaFoyVnpabWx0WVdkbGM0R2pZMkZzZEhoL1RHbGhJR2h2 -YkdSeklHaGxjaUIwYVd4MFpXUWdabUZqWlNCcGJpQmliM1JvSUdoaGJtUnpJR0Z1WkNCbmFYWmxjeUIwYUdVLy9kaWQ6cGxjOmR1YjMyNDJlY2JnZ2p2M2F2 -N3VsNW9uZy9hcHAuYnNreS5mZWVkLnBvc3QvM21wdDNmNTd2NWsyYSJ9fSwiY2lkIjoiYmFmeXJlaWVqYmJldmZkcnQ3ZG5jYmoyeTR5YzM0cm93cjd4azV2 -NGxpcXBsMmZwZW5xcXBicWI3NmUiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtl -RHRpWVdaNWNtVnBaelZvYkhaeWREUXlOekpoZVdjek56ZDJiMjgzYm5sM1pYUXliMmhsWkhSbGNuQnplREp3WVdSa2FXcG1OV1oyTjI5aWFXTjFjbWw0Um1G -ME9pOHZaR2xrT25Cc1l6cGtkV0l6TWpReVpXTmlaMmRxZGpOaGRqZDFiRFZ2Ym1jdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjSFF6WmpVM2RqVnJN -bUZwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0yT2pVNUxqRTVNbG89In19eyJkaWQiOiJkaWQ6cGxjOjJ0dmJpeXd2bWR6eDV0bmJsYW1p -am1oZCIsInRpbWVfdXMiOjE3ODM2MTUwMjgzMzExMTcsImN1cnNvciI6MjI1ODI4MTMzOTcsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODEzMzk3LCJj -b21taXQiOnsicmV2IjoiM21xYTJ5NG5oaHIydyIsIm9wZXJhdGlvbiI6InVwZGF0ZSIsImNvbGxlY3Rpb24iOiJmbS50ZWFsLmFscGhhLmFjdG9yLnN0YXR1 -cyIsInJrZXkiOiJzZWxmIiwicmVjb3JkIjp7IiR0eXBlIjoiZm0udGVhbC5hbHBoYS5hY3Rvci5zdGF0dXMiLCJleHBpcnkiOiIyMDI2LTA3LTA5VDE2OjQ3 -OjA3LjgzOFoiLCJpdGVtIjp7ImFydGlzdHMiOlt7ImFydGlzdE5hbWUiOiJSeWFuIEJlYXR0eSJ9XSwiZHVyYXRpb24iOm51bGwsInBsYXllZFRpbWUiOiIy -MDI2LTA3LTA5VDEzOjMxOjM0LjYwM1oiLCJyZWxlYXNlTWJJZCI6Im1iaWQ6ZDY1NzE4YjEtMTcxNS00Mzg3LWI4OTktNjViNTY2NTRlODUzIiwicmVsZWFz -ZU5hbWUiOiJTd2VldCBGb3J0dW5lIiwic3VibWlzc2lvbkNsaWVudEFnZW50IjoibXVsdGktc2Nyb2JibGVyLzAuMTQuMiIsInRyYWNrTmFtZSJvek5UbzBN -eTR6TWpKYSJ9fXsiZGlkIjoiZGlkOnBsYzp4M2phZzVka3dkemF6czQ1andraTQ2eHAiLCJ0aW1lX3VzIjoxNzgzNjE1MDU1MjM1MzY1LCJjdXJzb3IiOjIy -NTgyODI1NjE5LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4MjgyNTYxOSwiY29tbWl0Ijp7InJldiI6IjNtcWEyeXdjNWY1Mm8iLCJvcGVyYXRpb24iOiJj -cmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNtcWEyeXdieWl2Mm8iLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNr -eS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM3OjM0LjkxMVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWllZmVzYTZ5N3JmZ3I0 -bWoyeHE2NnM2eHJxaXZrcGIzaXNuNXJqMnRwaXZia3FxaTI1YWxpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnR0Zm9pd295dXY3dG5mdWh4a2R1NHRqNS9hcHAu -YnNreS5mZWVkLnBvc3QvM21xN3hqc3lvczIybCJ9fSwiY2lkIjoiYmFmeXJlaWJybWQ2Mnpvc3Izc24zbXFhbnd1Nmhtamczbzd4azQycGNtdjZpZXN0c2xy -M3BmNmxrM3UiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBa -V1psYzJFMmVUZHlabWR5TkcxcU1uaHhOalp6Tm5oeWNXbDJhM0JpTTJsemJqVnlhakowY0dsMlltdHhjV2t5TldGc2FXTjFjbWw0Um1GME9pOHZaR2xrT25C -c1l6cDBkR1p2YVhkdmVYVjJOM1J1Wm5Wb2VHdGtkVFIwYWpVdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGQ0YW5ONWIzTXlNbXhwWTNKbFlYUmxa -RUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0zT2pNMExqa3hNVm89In19eyJkaWQiOiJkaWQ6cGxjOmI2ZnhjbGVlbGNqZWpuZHByZzNhMnpmcyIsInRpbWVf -dXMiOjE3ODM2MTQ5NDk4NDUzNzIsImN1cnNvciI6MjI1ODI3NzQzNDgsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzc0MzQ4LCJjb21taXQiOnsicmV2 -IjoiM21xYTJ2cnh5bTU0LjU5MFoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlkNHloeGlvd2Rldm51ZHhyajZqM3JjcGVxM2FncnhnNWtpa2lpdm1mYjdu -anlwbHFqcmtpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmd0dmN0ZGs0MmltYzY1dms3dW43aWNjYy9hcHAuYnNreS5mZWVkLnBvc3QvM21xN2w0MnljZzIydiJ9 -fSwiY2lkIjoiYmFmeXJlaWRxNmtraWh6bTJia2l3ZXA2eWRwc3p0bW93a2Z1NGpwNWZoYm90aHVqc3M1ZDRramQzZmEiLCJyZWNvcmRfY2JvciI6Im8yVWtk -SGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBaRFI1YUhocGIzZGtaWFp1ZFdSNGNtbzJhak55WTNC -bGNUTmhaM0o0WnpWcmFXdHBhWFp0Wm1JM2JtcDVjR3h4YW5KcmFXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6cG5kSFpqZEdSck5ESnBiV00yTlhack4zVnVO -MmxqWTJNdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGRzTkRKNVkyY3lNblpwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0xT2pV -MExqVTVNRm89In19eyJkaWQiOiJkaWQ6cGxjOnZjbTNteGFkc2ppaXlkZ24yd212YTN1ZiIsInRpbWVfdXMiOjE3ODM2MTQ5OTAwMjgxNjksImN1cnNvciI6 -MjI1ODI3OTM0MzMsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzkzNDMzLCJjb21taXQiOnsicmV2IjoiM21xYTJ3eWFjancyaSIsIm9wZXJhdGlvbiI6 -ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJya2V5IjoiM21xYTJ3eWEycHcyaSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5i -c2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzY6MjkuODk5WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWNkN2V0cmhlN3hv -d3RsaHdvZ2k0bzV0eXZ6b2xrcGFjamxqNmpiYzM1cnUzd3ZxcDd2ZnkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6azJtbDdtYWtvdGtpajR3anBvd3RzZ3BqL2Fw -cC5ic2t5LmZlZWQucG9zdC8zbXE3NTd2c3BmazJjIn19YXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNTo1Mi45NTlaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5 -cmVpYnBuNG1ld3k1aGplZ3RndnBuYTZoeGVmbWp0dWtseWhrcXZ6empic2JhcGV2eHRmejZzYSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpxd295NXl0amNtbGUz -NnRxN2hiZmVyankvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTdyNnVzdHQyMnQifSwidmlhIjp7ImNpZCI6ImJhZnlyZWlicHVsYnNzdzdhYnV0dnNrZWdkcWZx -Y3B3NHYyejJkbWc2eWF4ZnN3Y2F6cHVxZGJ0YnFhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjJwZHdieGJqenh2a2t6NnF5eHM1cnZueC9hcHAuYnNreS5mZWVk -LnJlcG9zdC8zbXFhMmczem1ydTJqIn19LCJjaWQiOiJiYWZ5cmVpYmZyaWZ0MmY2emY1Ynd4bGFmajR0ZWMzcGppbm5vY3A3a2VkN3B5Mnc3aWduYmllbzdj -eSIsInJlY29yZF9jYm9yIjoicEdOMmFXR2lZMk5wWkhnN1ltRm1lWEpsYVdKd2RXeGljM04zTjJGaWRYUjJjMnRsWjJSeFpuRmpjSGMwZGpKNk1tUnRaelo1 -WVhobWMzZGpZWHB3ZFhGa1luUmljV0ZqZFhKcGVFaGhkRG92TDJScFpEcHdiR002TW5Ca2QySjRZbXA2ZUhacmEzbzJjWGw0Y3pWeWRtNTRMMkZ3Y0M1aWMy -dDVMbVpsWldRdWNtVndiM04wTHpOdGNXRXlaek42YlhKMU1tcGxKSFI1Y0dWeVlYQndMbUp6YTNrdVptVmxaQzVzYVd0bFozTjFZbXBsWTNTaVkyTnBaSGc3 -WW1GbWVYSmxhV0p3YmpSdFpYZDVOV2hxWldkMFozWndibUUyYUhobFptMXFkSFZyYkhsb2EzRjJlbnBxWW5OaVlYQmxkbmgwWm5vMmMyRmpkWEpwZUVaaGRE -b3ZMMlJwWkRwd2JHTTZjWGR2ZVRWNWRHcGpiV3hsTXpaMGNUZG9ZbVpsY21wNUwyRndjQzVpYzJ0NUxtWmxaV1F1Y0c5emRDOHpiWEUzY2paMWMzUjBNakow -YVdOeVpXRjBaV1JCZEhnWU1qQXlOaTB3Tnkwd09WUXhOam96TlRvMU1pNDVOVGxhIn19eyJkaWQiOiJkaWQ6cGxjOnM3M2Nid2ZpbXJyY2htanc3YWxibmN0 -YSIsInRpbWVfdXMiOjE3ODM2MTQ5NjU5Mzc4NDQsImN1cnNvciI6MjI1ODI3ODE4MjYsImt0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzY6MDMuOTM2WiIsInN1 -YmplY3QiOnsiY2lkIjoiYmFmeXJlaWY0Z3ZyNXVnbmprZ2h2Nml0cHd3M3hhd3BrbXNmc3IzN2NjcTVkZTJwcmF6cXBrZDdjaHEiLCJ1cmkiOiJhdDovL2Rp -ZDpwbGM6NmhpdDVyamRibWxuc2NtdWs0YmJ0bXVjL2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3ejRlZm1oczJrIn0sInZpYSI6eyJjaWQiOiJiYWZ5cmVpZ2pk -Y2Z0eWdsdmRvamM2a3Rja3ZiN2V1Mm5ua2diNXBqNXczZGpvNmk3dnJ1NjY3bGx4cSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpoYnBlZmlvM2Y1Y3NjNDRtc21i -Z2lveHovYXBwLmJza3kuZmVlZC5yZXBvc3QvM21xYTJ2YWFkdWcyZSJ9fSwiY2lkIjoiYmFmeXJlaWFsNWx4bXBhaGVocXc0Z3VpZ3A0dm9rYXRwcmh2eXVv -cWwzdHRkemhpZWJsN2NsYnpwdGEiLCJyZWNvcmRfY2JvciI6InBHTjJhV0dpWTJOcFpIZzdZbUZtZVhKbGFXZHFaR05tZEhsbmJIWmtiMnBqTm10MFkydDJZ -amRsZFRKdWJtdG5ZalZ3YWpWM00yUnFielpwTjNaeWRUWTJOMnhzZUhGamRYSnBlRWhoZERvdkwyUnBaRHB3YkdNNmFHSndaV1pwYnpObU5XTnpZelEwYlhO -dFltZHBiM2g2TDJGd2NDNWljMnQ1TG1abFpXUXVjbVZ3YjNOMEx6TnRjV0V5ZG1GaFpIVm5NbVZsSkhSNWNHVnlZWEJ3TG1KemEza3VabVZsWkM1c2FXdGxa -M04xWW1wbFkzU2lZMk5wWkhnN1ltRm1lWEpsYVdZMFozWnlOWFZuYm1wcloyaDJObWwwY0hkM00zaGhkM0JyYlhObWMzSXpOMk5qY1RWa1pUSndjbUY2Y1hC -clpEZGphSEZqZFhKcGVFWmhkRG92TDJScFpEcHdiR002Tm1ocGREVnlhbVJpYld4dWMyTnRkV3MwWW1KMGJYVmpMMkZ3Y0M1aWMydDVMbVpsWldRdWNHOXpk -Qzh6YlhFM2VqUmxabTFvY3pKcmFXTnlaV0YwWldSQmRIZ1lNakF5Tmkwd055MHdPVlF4Tmpvek5qb3dNeTQ1TXpaYSJ9fXsiZGlkIjoiZGlkOnBsYzpibG5o -enp0M3BwdjVndWQ2eGRhcWEyZW4iLCJ0aW1lX3VzIjoxNzgzNjE1MDg1ODUzMzA1LCJjdXJzb3IiOjIyNTgyODQwMTc4LCJraWVhdGVkQXQiOiIyMDI2LTA3 -LTA5VDE2OjM0OjU1LjAyOFoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlhb2IzeGVuajVqcmpvMnRyY3VqeWR6Y2tvdWJhN2l2cXo0Y3BybDVqc3JjdGs2 -YXh6NHhlIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmxmZ2p4ZWc3Zjd3NnJ5amZib21oY2JzaS9hcHAuYnNreS5mZWVkLnBvc3QvM21xNWZtM2JtNWkyeCJ9LCJ2 -aWEiOnsiY2lkIjoiYmFmeXJlaWM3cGxtcnVxbHV2dnpsN3pxM3Vka3JmYXR4YjR2ZjNuaDVkZGxtNDZkZGoycWJ2ZnB3dHkiLCJ1cmkiOiJhdDovL2RpZDpw -bGM6NGx4Nm51cjV3c3R3b2M0d3RnajU2a3l1L2FwcC5ic2t5LmZlZWQucmVwb3N0LzNtcTd6dTc1Y2lhMjIifX0sImNpZCI6ImJhZnlyZWlhbmJ1ZDVrcm15 -d3Nudm01bWFoN3RvdzZhZGRvMnRlcGxuY213YnlhenJsc2JrNWFuY3JpIiwicmVjb3JkX2Nib3IiOiJwR04yYVdHaVkyTnBaSGc3WW1GbWVYSmxhV00zY0d4 -dGNuVnhiSFYyZG5wc04zcHhNM1ZrYTNKbVlYUjRZalIyWmpOdWFEVmtaR3h0TkRaa1pHb3ljV0oyWm5CM2RIbGpkWEpwZUVoaGREb3ZMMlJwWkRwd2JHTTZO -R3g0Tm01MWNqVjNjM1IzYjJNMGQzUm5halUyYTNsMUwyRndjQzVpYzJ0NUxtWmxaV1F1Y21Wd2IzTjBMek50Y1RkNmRUYzFZMmxoTWpKbEpIUjVjR1Z5WVhC -d0xtSnphM2t1Wm1WbFpDNXNhV3RsWjNOMVltcGxZM1NpWTJOcFpIZzdZbUZtZVhKbGFXRnZZak40Wlc1cU5XcHlhbTh5ZEhKamRXcDVaSHBqYTI5MVltRTNh -WFp4ZWpSamNISnNOV3B6Y21OMGF6WmhlSG8wZUdWamRYSnBlRVpoZERvdkwyUnBaRHB3YkdNNmJHWm5hbmhsWnpkbU4zYzJjbmxxWm1KdmJXaGpZbk5wTDJG -d2NDNWljMnQ1TG1abFpXUXVjRzl6ZEM4emJYRTFabTB6WW0wMWFUSjRhV055WldGMFpXUkJkSGdZTWpBeU5pMHdOeTB3T1ZReE5qb3pORG8xTlM0d01qaGEi -fX17ImRpZCI6ImRpZDpwbGM6ZjVmd3pmcG43YmJqZnJjNHF2c2Z0bnd6IiwidGltZV91cyI6MTc4MzYxNTAzMjU0MzMyNSwiY3Vyc29yIjoyMjU4MjgxNTI0 -MiwibGhhc2dyeXFzem9kdXYvYXBwLmJza3kuZmVlZC5wb3N0LzNsbGJnYzZib3kyMmUifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpZmcyMm1vdzd6YXB5Z3Vv -eXRhaWlnajRlZG5oc2FqY3JiZWt6dnF5bndrd214c2F6ejV1aSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpvanJyNGVmMnE0bGhhc2dyeXFzem9kdXYvYXBwLmJz -a3kuZmVlZC5wb3N0LzNsbGFvaXZ6ZXEyMmwifX0sInRleHQiOiJCZXR3ZWVuIHlvdSBhbmQgbWUgYW5kIHRoZSBwZW9wbGUgc3RhbGtpbmcgbXkgcmVwbGll -cyBiZWNhdXNlIEknbSBqdXN0IHRoYXQgZ29vZCBJIGRvIGFjdHVhbGx5IHdhbnQgeW91IHRvIGJlIGhhcHB5IHNvIHByaW9yaXRpc2luZyB5b3VyIG1vcmUg -fmVsYWJvcmF0ZX4gbmVlZHMgZXZlcnkgbm93IGFuZCB0aGVuIGlzIGltcG9ydGFudCEhIVxuXG5BZ2FpbiwgSSBkb24ndCB3YW50IHRvIHRvIGZldGlzaGl6 -ZSB5b3VyIG5lZXQgc2l0IHNpbmNlIEkgZG9uJ3Qga25vdyBtdWNoIGFib3V0IGl0LCBidXQgbGlrZSB0aGF0Li4uIn0sImNpZCI6ImJhZnlyZWlhdmNvNXp5 -NXpsZ214cnVyeG54eW5uNDVsdm91anB5anEyYXNmajI2bG56bTZreWdrZjdtIiwicmVjb3JkX2Nib3IiOiJwV1IwWlhoMGVRRW9RbVYwZDJWbGJpQjViM1Vn -WVc1a0lHMWxJR0Z1WkNCMGFHVWdjR1Z2Y0d4bElITjBZV3hyYVc1bklHMTVJSEpsY0d4cFpYTWdZbVZqWVhWelpTQkpKMjBnYW5WemRDQjBhR0YwSUdkdmIy -UWdTU0JrYnlCaFkzUjFZV3hzZVNCM1lXNTBJSGx2ZFNCMGJ5QmlaU0JvWVhCd2VTQnpieUJ3Y21sdmNtbDBhWE5wYm1jZ2VXOTFjaUJ0YjNKbElINWxiR0Zp -YjNKaGRHVitJRzVsWldSeklHVjJaWEo1SUc1dmR5QmhibVFnZEdobGJpQnBjeUJwYlhCdmNuUmhiblFoSVNFS0NrRm5ZV2x1TENCSklHUnZiaWQwSUhkaGJu -UWdkRzhnZEc4Z1ptVjBhWE5vYVhwbElIbHZkWElnYm1WbGRDQnphWFFnYzJsdVkyVWdTU0JrYjI0bmRDQnJibTkzSUcxMVkyZ2dZV0p2ZFhRZ2FYUXNJR0ox -ZENCc2FXdGxJSFJvWVhRdUxpNWxKSFJzbWdoMnQyamdmNGUzN3lrL2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3eTQ3anZ1czJ2In19LCJ0ZXh0IjoiSSB3aXNo -IGEgam91cm5hbGlzdCB3b3VsZCBiZSBicmF2ZSBlbm91Z2ggdG8gYXNrIGhpbSBhYm91dCB0aGVzZSB0aGluZ3MsIE1hcmsuIPCfkpkifSwiY2lkIjoiYmFm -eXJlaWVnanIzdjQ2a3dtZWl4d2IycmRpaGxoYmhkZnR1Zmd6MzJ2aGtpem96eTZ2eTVidXo1em0iLCJyZWNvcmRfY2JvciI6InBXUjBaWGgwZUZOSklIZHBj -MmdnWVNCcWIzVnlibUZzYVhOMElIZHZkV3hrSUdKbElHSnlZWFpsSUdWdWIzVm5hQ0IwYnlCaGMyc2dhR2x0SUdGaWIzVjBJSFJvWlhObElIUm9hVzVuY3l3 -Z1RXRnlheTRnOEorU21XVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbkJ2YzNSbGJHRnVaM09CWW1WdVpYSmxjR3g1b21SeWIyOTBvbU5qYVdSNE8ySmha -bmx5Wldsa2NHWXlhakp6YzNsNGNHZGxlR2h5ZVhoMk5HNXdaVGRwYkcxdU0zWmpkR1JvY0ROcGVUVnBhR0ppWW5Wck4ydDBhMmcwWTNWeWFYaEdZWFE2THk5 -a2FXUTZjR3hqT25oNVpHUndaeloxYzIxbmFESjBNbXBuWmpSbE16ZDVheTloY0hBdVluTnJlUzVtWldWa0xuQnZjM1F2TTIxeE4zazBOMnAyZFhNeWRtWndZ -WEpsYm5TaVkyTnBaSGc3WW1GbWVYSmxhV1J3WmpKcU1uTnplWGh3WjJWNGFISjVlSFkwYm5CbE4ybHNiVzR6ZG1OMFpHaHdNMmw1Tldsb1ltSmlkV3MzYTNS -cmFEUmpkWEpwZUVaaGREb3ZMMlJwWkRwd2JHTTZlSGxrWkhCbk5uVnpiV2RvTW5ReWFtZG1OR1V6TjNsckwyRndjQzVpYzJ0NUxtWmxaV1F1Y0c5emRDOHpi -WEUzZVRRM2FuWjFjekoyYVdOeVpXRjBaV1JCZEhnWU1qQXlOaTB3Tnkwd09WUXhOam96Tmpvek1pNHhPREZhIn19eyJkaWQiOiJkaWQ6cGxjOmt4eGRtY2x0 -eTd6N3cybHc2aTNxeTRkdSIsInRpbWVfdXMiOjE3ODM2MTUwNDA4MzMxNjEsImN1cnNvciI6MjI1ODI4MTg4MzMsImtpbmQiOiJjb21taXQiLCJzZXEiOjIy -NTgyODE4ODMzLCJjb21taXQiOnsicmV2IjoiM21xYTJ5aXFhdG0yNCIsInNZenBuYVhCMloyMXhaSE4wYVdaeGFYWTNjelp4YUdFMVpXa3ZZWEJ3TG1KemEz -a3VabVZsWkM1d2IzTjBMek50Y1RaM00yOHlkamR6TW01cFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNM09qUXlMalUxTlZvPSJ9fXsiZGlk -IjoiZGlkOnBsYzpjajd6aWZuem42MmVwNmQ1dm54azRidWsiLCJ0aW1lX3VzIjoxNzgzNjE0OTI4NzMwNzA0LCJjdXJzb3IiOjIyNTgyNzYzODQ4LCJraW5k -IjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc2Mzg0OCwiY29tbWl0Ijp7InJldiI6IjNtcWEydjVzdDZuMmoiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0 -aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNtcWEydjVzbmQ1MmoiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJj -cmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM1OjI4LjUwMVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlkN3VqbGlqd3hvbXQ0MnBwbHZ4NXhzZnhid2p2 -emx5eHMydTVxemRhYTNzdTJ3YTVqbzRlIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjRrbWl5YmZxaWVzYjZtN3YydWlkdXZrdC9hcHAuYnNreS5mZWVkLnBvc3Qv -M21xN2NtYnpqd3MyYyJ9fSwiY2lkIjoiYmFmeXJlaWNzZTR3emhteDRzMndtcWY0bmltY2Y2M3Zmd3FmdzRpNjJ5eHZjNWQ1YXU0bGNsMmxjdmEiLCJyZWNv -cmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBaRGQxYW14cGFuZDRiMjEw -TkRKd2NHeDJlRFY0YzJaNFluZHFkbnBzZVhoek1uVTFjWHBrWVdFemMzVXlkMkUxYW04MFpXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6bzBhMjFwZVdKbWNX -bGxjMkkyYlRkMk1uVnBaSFYyYTNRdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGRqYldKNmFuZHpNbU5wWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEz -TFRBNVZERTJPak0xT2pJNExqVXdNVm89In19eyJkaWQiOiJkaWQ6cGxjOnB4eXg1Y3Q2Z3oyamZhd3Zsb3R0QXQiOiIyMDI2LTA3LTA5VDE2OjM3OjM3LjQ1 -MVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlkZXI1eTJmYXpiY2tybmMyYXhhbmQ3Mmo0NmpmNjJsZ2t3MmNxd3Ezbjd3MmpidnhvNjJtIiwidXJpIjoi -YXQ6Ly9kaWQ6cGxjOmh3NnBpajNyZ2xtaTRlZXNjZXJiMnBuNS9hcHAuYnNreS5mZWVkLnBvc3QvM21xN2h6bHd5ZmsybSJ9LCJ2aWEiOnsiY2lkIjoiYmFm -eXJlaWNucm1ibzJrbHJvZTVxZ3R5amJ1d2d4amJzN3pncmFtM2l0azVmZzd5aGZ4bnZ6ZHV6c3EiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bTN6N2l1aHc1aW42 -YWdrdndocXhjNjc3L2FwcC5ic2t5LmZlZWQucmVwb3N0LzNtcWEyeTJvbHp5MjYifX0sImNpZCI6ImJhZnlyZWlneWRld2F3YXRyNXVnZ282aXMzZGx3N2R2 -bDdtanE3aTVqNXdkY2x2NW00NGFkb2V2dmZ5IiwicmVjb3JkX2Nib3IiOiJwR04yYVdHaVkyTnBaSGc3WW1GbWVYSmxhV051Y20xaWJ6SnJiSEp2WlRWeFoz -UjVhbUoxZDJkNGFtSnpOM3BuY21GdE0ybDBhelZtWnpkNWFHWjRiblo2WkhWNmMzRmpkWEpwZUVoaGREb3ZMMlJwWkRwd2JHTTZiVE42TjJsMWFIYzFhVzQy -WVdkcmRuZG9jWGhqTmpjM0wyRndjQzVpYzJ0NUxtWmxaV1F1Y21Wd2IzTjBMek50Y1dFeWVUSnZiSHA1TWpabEpIUjVjR1YwWVhCd0xtSnphM2t1Wm1WbFpD -NXlaWEJ2YzNSbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBaR1Z5TlhreVptRjZZbU5yY201ak1tRjRZVzVrTnpKcU5EWnFaall5YkdkcmR6SmpjWGR4 -TTI0M2R6SnFZblo0YnpZeWJXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6cG9kelp3YVdvemNtZHNiV2swWldWelkyVnlZakp3YmpVdllYQndMbUp6YTNrdVpt -VmxaQzV3YjNOMEx6TnRjVGRvZW14M2VXWnJNbTFwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0zT2pNM0xqUTFNVm89In19eyJkaWQiOiJk -aWQ6cGxjOm5qcXZvaTdteWh5eWo1dW5sNnh6eXpwYyIsInRpbWVfdXMiOjE3ODM2MTQ5Mzg1MzMzOTgsImN1cnNvciI6MjI1ODI3Njg4NjEsIms6Mzc6MTYu -MDIxWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWNhend5cDNid3l2Y25rb3A2YnpnaG11b3hjZ3dzcWNoZDJ2bjRtbXNyeGZsZHB3NTdqdXUiLCJ1cmki -OiJhdDovL2RpZDpwbGM6b2ZxYnZ5aWpwcmI1aTdpNG5wcHVzcjJuL2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3dzRxYjRpYzJoIn19LCJjaWQiOiJiYWZ5cmVp -Y2V2anFhcTVzbHdqbmd3dmVmNWZ2aHlpenZ3aWJ6NnBkbXpza28ydDRpa2VhbGZ5eHg3eSIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWEpoY0hBdVluTnJl -UzVtWldWa0xteHBhMlZuYzNWaWFtVmpkS0pqWTJsa2VEdGlZV1o1Y21WcFkyRjZkM2x3TTJKM2VYWmpibXR2Y0RaaWVtZG9iWFZ2ZUdObmQzTnhZMmhrTW5a -dU5HMXRjM0o0Wm14a2NIYzFOMnAxZFdOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwdlpuRmlkbmxwYW5CeVlqVnBOMmswYm5Cd2RYTnlNbTR2WVhCd0xtSnph -M2t1Wm1WbFpDNXdiM04wTHpOdGNUZDNOSEZpTkdsak1taHBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTNPakUyTGpBeU1Wbz0ifX17ImRp -ZCI6ImRpZDpwbGM6MmJ0c3RlaHp6djNkem41bWYyNXZoZjU1IiwidGltZV91cyI6MTc4MzYxNDkwNDYxNDkzOCwiY3Vyc29yIjoyMjU4Mjc1MTcxNiwia2lu -ZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI3NTE3MTYsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnVnaTN5ZTJkIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVj -dGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsInJrZXkiOiIzbXFhMnVnaGtmdTJkIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwi -Y3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNTowMy42NjhaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZ2Q0d2JiN2htM2xjb25nbjRlcWF2aDVneXVq -MzR0enFoa2NocW9mZWpmY2F1MzVudHVrbSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpjbnBlN3F2Y3lqcmhtNnc3dzdlNGF0dXIvYXBwLmJza3kuZmVlZC5wb3N0 -LzNtcTd1d3NjaW9zMjIyZCJ9fSwidGV4dCI6InlvdSBlbnRlcmVkIHRoZSBkaXNjdXNzaW9uIGNvbXBsYWluaW5nIGFib3V0IHByb3Rlc3Qgdm90ZXMsIGFu -ZCB0aGF0IHByZWRpY2F0ZXMgdGhhdCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZGVmaW5lIHRoZSB0aGluZyB5b3UgYXJlIGNvbXBsYWluaW5nIGFib3V0LiBz -byBkZWZpbmUgZm9yIG1lIHdoYXQgYSBwcm90ZXN0IHZvdGUgaXMifSwiY2lkIjoiYmFmeXJlaWduM2Y1dXRqYXlweDd1NnBicHJ5cXlqZ2tqYTQ1bHRkanB3 -Z3Q1ZjJqbnN0dzNkc3ZvcGEiLCJyZWNvcmRfY2JvciI6InBXUjBaWGgwZUw1NWIzVWdaVzUwWlhKbFpDQjBhR1VnWkdselkzVnpjMmx2YmlCamIyMXdiR0Zw -Ym1sdVp5QmhZbTkxZENCd2NtOTBaWE4wSUhadmRHVnpMQ0JoYm1RZ2RHaGhkQ0J3Y21Wa2FXTmhkR1Z6SUhSb1lYUWdlVzkxSUhOb2IzVnNaQ0JpWlNCaFlt -eGxJSFJ2SUdSbFptbHVaU0IwYUdVZ2RHaHBibWNnZVc5MUlHRnlaU0JqYjIxd2JHRnBibWx1WnlCaFltOTFkQzRnYzI4Z1pHVm1hVzVsSUdadmNpQnRaU0Iz -YUdGMElHRWdjSEp2ZEdWemRDQjJiM1JsSUdselpTUjBlWEJsY21Gd2NDNWljMnQ1TG1abFpXUXVjRzl6ZEdWc1lXNW5jNEZpWlc1bGNtVndiSG1pWkhKdmIz -U2lZMk5wWkhnN1ltRm1lWEpsYVdkMmVXZHdkbkp4YTJscE5YVTNkMkZwYWpKemRtSXlkbU5tYm5JME5EUmpaMloyWld0b1lqSnFiV04zWnpjM1kzUnNkM1Zq -ZFhKcGVFWmhkRG92TDJScFpEcHdiR002YlcwMVpXSnBhSEJxZG5SeVpIVnViMjExYkdKc2N6VnRMMkZ3Y0M1aWMydDVMbVpsWldRdWNHOXpkQzh6YlhFMlpX -NWliR3A1TWpKa1puQmhjbVZ1ZEtKalkybGtlRHRpWVdaNWNtVnBZbTV3TkRJelpubzJaWFV6Wm5sdE0zQmlNbVp1WVRaNmVtRmtjVzUzYkhBMk5tVjBlR1ox -WkhKeU4ycG5kbmR3YkhsdVlXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6cG5kSEJzTW14eFpuWjRhRE53Ym1sMWJYUXpabmh3WjNRdllYQndMbUp6YTNrdVpt -VmxaQzV3YjNOMEx6TnRjV0V5ZFc1amNXTnJNbVZwWTNKRW5kIjoxMTksImJ5dGVTdGFydCI6OTR9fSx7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFj -ZXQiLCJmZWF0dXJlcyI6W3siJHR5cGUiOiJhcHAuYnNreS5yaWNodGV4dC5mYWNldCNtZW50aW9uIiwiZGlkIjoiZGlkOnBsYzp6cXhwbmxqNmw1amtobWdw -cHUyZnlvMmcifV0sImluZGV4Ijp7ImJ5dGVFbmQiOjIxMSwiYnl0ZVN0YXJ0IjoxOTN9fSx7ImZlYXR1cmVzIjpbeyIkdHlwZSI6ImFwcC5ic2t5LnJpY2h0 -ZXh0LmZhY2V0I2xpbmsiLCJ1cmkiOiJodHRwczovL2RhaWx5bW9udGFuYW4uY29tLzIwMjYvMDcvMDcvZ2xhY2llci1lbXBsb3llZXMtdm90ZS10by11bmlv -bml6ZS8ifV0sImluZGV4Ijp7ImJ5dGVFbmQiOjI4MSwiYnl0ZVN0YXJ0IjoyNDh9fV0sImxhbmdzIjpbImVuIl0sInRleHQiOiJDb25ncmF0dWxhdGlvbnMg -dG8gTmF0aW9uYWwgUGFyayBTZXJ2aWNlIHdvcmtlcnMgYXQgR2xhY2llciBOYXRpb25hbCBQYXJrLCB3aG8gdW5pb25pemVkIHdpdGggQG50ZXVuYXRpb25h -bC5ic2t5LnNvY2lhbCEgV2VsY29tZSB0byB0aGUgZmFtLCB3ZSBhcmUgdGhyaWxsZWQgdG8gaGF2ZSB5b3UgaW4gdGhlIHVuaW9uIHJhbmtzLiB2aWEgQGRh -aWx5bW9udGFuYW4uY29tIEB1bmlvbnN0cm9uZyBAc3VwcG9ydGZlZGVyYWx3b3JrZXJzIGRhaWx5bW9udGFuYW4uY29tLzIwMjYvMDcvMDcvZy4uLiJ9LCJj -aWQiOiJiYWZ5cmVpZ3RtZmZza3RoZnNqaDdnNG5wYTQ2anJkZmhlbXEya2lvdHVsazZqZGlpanhtN2RnM3c1ZSIsInJlY29yZF9jYm9yIjoicG1SMFpYaDBl -UUVaUTI5dVozSmhkSFZzWVhScGIyNXpJSFJ2SUU1aGRHbHZibUZzSUZCaGNtc2dVMlZ5ZG1salpTQjNiM0pyWlhKeklHRjBJRWRzWVdOcFpYSWdUbUYwYVc5 -dVlXd2dVR0Z5YXl3Z2QyaHZJSFZ1YVc5dWFYcGxaQ0IzYVhSb0lFQnVkR1YxYm1GMGFXOXVZV3d1WW5OcmVTNXpiMk5wWVd3aElGZGxiR052YldVZ2RHOGdk -R2hsSUdaaGJTd2dkMlVnWVhKbElIUm9jbWxzYkdWa0lIUnZJR2hoZG1VZ2VXOTFJR2x1SUhDd2dkMmh2SUhOMFlYSjBaV1FnZEdocGN5QndjbTluY21GdExD -QmlaV2RoYmlCMGJ5QnpkV1ptWlhJZ1puSnZiU0IwYUdVZ1kyOXRjSFYwWlhJZ1pHbHpaV0Z6WlNCMGFHRjBJR0Z1ZVdKdlpIa2dkMmh2SUhkdmNtdHpJSGRw -ZEdnZ1kyOXRjSFYwWlhKeklHNXZkeUJyYm05M2N5QmhZbTkxZEM0Z1NYUW5jeUJoSUhabGNua2djMlZ5YVc5MWN5QmthWE5sWVhObElHRnVaQ0JwZENCcGJu -UmxjbVpsY21WeklHTnZiWEJzWlhSbGJIa2dkMmwwYUNCMGFHVWdkMjl5YXk0Z1ZHaGxJSFJ5YjNWaWJHVWdkMmwwYUNCamIyMXdkWFJsY25NZ2FYTWdlVzkx -SUhCc1lYa2dkMmwwYUNCMGFHVnRMaUJVYUdWNUlHRnlaU0J6YnlCM2IyNWtaWEptZFd3dUlGbHZkU0JvWVhabElIUm9aWE5sSUhOM2FYUmphR1Z6NG9DVWFX -WWdhWFFuY3lCaGJpQmxkbVZ1SUc1MWJXSmxjaUI1YjNVZ1pHOGdkR2hwY3l3Z2FXWWdhWFFuY3lCaGJpQnZaR1FnYm5WdFltVnlJSGx2ZFNCa2J5QjBhR0Yw -NG9DVVlXNWtJSEJ5WlhSMGVTQnpiMjl1SUhsdmRTQmpZVzRnWkc4Z2JXOXlaU0JoYm1RZ2JXOXlaU0JsYkdGaWIzSmhkR1VnZEdocGJtZHpJR2xtSUhsdmRT -QmhjbVVnWTJ4bGRtVnlJR1Z1YjNWbmFDd2diMjRnYjI1bElHMWhZMmhwYm1VdUNncEJablJsY2lCaElIZG9hV3hsSUhSb1pTQjNhRzlzWlNCemVYTjBaVzBn -WW5KdmEyVWdaRzkzYmk0Z1JuSmhibXRsYkNCM1lYTnVKM1FnY0dGNWFXNW5JR0Z1ZVNCaGRIUmxiblJwYjI0N0lHaGxJSGRoYzI0bmRDQnpkWEJsY25acGMy -bHVaeUJoYm5saWIyUjVMaUJVYUdVZ2MzbHpkR1Z0SUhkaGN5Qm5iMmx1WnlCMlpYSjVMQ0IyWlhKNUlITnNiM2RzZWVLQWszZG9hV3hsSUdobElIZGhjeUJ6 -YVhSMGFXNW5JR2x1SUdFZ2NtOXZiU0JtYVdkMWNtbHVaeUJ2ZFhRZ2FHOTNJSFJ2SUcxaGEyVWdiMjVsSUhSaFluVnNZWFJ2Y2lCaGRYUnZiV0YwYVdOaGJH -eDVJSEJ5YVc1MElHRnlZM1JoYm1kbGJuUWdXQ3dnWVc1a0lIUm9aVzRnYVhRZ2QyOTFiR1FnYzNSaGNuUWdZVzVrSUdsMElIZCI6IjNtbWk3anBxNHBlMnUi -fX17ImRpZCI6ImRpZDpwbGM6NXVieDNxZ3FubDI2czcyNHJ5YmVncXgyIiwidGltZV91cyI6MTc4MzYxNTA3MTI0ODA5NiwiY3Vyc29yIjoyMjU4MjgzMzQz -OCwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MzM0MzgsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnpmcXFqYTJ6Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwi -Y29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsInJrZXkiOiIzbXFhMnpmcWlwYTJ6IiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5s -aWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNzo1MC4wNzZaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZ3VyZ3NsMnBkbG5qaXVmdHJ4YjJ2 -cWZocm1hd2hub29seTJscXNqcXVyZTJkcGV0enFyYSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp5ZjZoY3R0MnVnM3F5ZnR5NGluNjR5b2IvYXBwLmJza3kuZmVl -ZC5wb3N0LzNtcTd4empwaDVzMmcifX0sImNpZCI6ImJhZnlyZWllc3NtNTJ1Mms2bDNiN3Q3aGdmc3JmcHBzZHhsczVoaGQ1aTZqY2JpbHBiNGs0amdsYXV5 -IiwicmVjb3JkX2Nib3IiOiJvMlVrZEhsd1pYSmhjSEF1WW5OcmVTNW1aV1ZrTG14cGEyVm5jM1ZpYW1WamRLSmpZMmxrZUR0aVlXWjVjbVZwWjNWeVozTnNN -bkJrYkc1cWFYVm1kSEo0WWpKMmNXWm9jbTFoZDJodWIyOXNlVEpzY1hOcWNYVnlaVEprY0dWMGVuRnlZV04xY21sNFJtRjBPaTh2Wkdsa09uQnNZenA1Wmpa -b1kzUjBNblZuTTNGNVpuUjVOR2x1TmpSNWIySXZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkNGVtcHdhRFZ6TW1kcFkzSmxZWFJsWkVGMGVCZ3lN -REkyTFRBM0xUQTVWREUyT2pNM09qVXdMakEzTmxvPSJ9fXsiZGlkIjoiZGlkOnBsYzpkYzM2YW1oN2pibnduajRydXNhbzVjbDIiLCJ0aW1lX3VzIjoxNzgz -NjE0OTEyMDM2NTgxLCJjdXJzb3IiOjIyNTgyNzU1NjU5LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc1NTY1OSwiY29tbWl0Ijp7InJldiI6IjNtcWEy -dW51cmVpYjMzNGRzb3pxcTQzNmlvdHduM3Fvd2oyZmVmY2FoYWxmenVrNWg1bWp5ZDNwcWx3dGJwaSIsInVyaSI6ImF0Oi8vZGlkOnBsYzozN2V5cnJ5cnBu -MzZoZGJjYjdiN3lrdTQvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd6ZGE2NmhrMmYifX0sImNpZCI6ImJhZnlyZWlmeXRyaGRqZzJqY3M0c3FoZnY2M2lzeW1k -Y3BjMnNmZmVmaWJueG5xaWQ3cHdlemJiNW5hIiwicmVjb3JkX2Nib3IiOiJvMlVrZEhsd1pYSmhjSEF1WW5OcmVTNW1aV1ZrTG14cGEyVm5jM1ZpYW1WamRL -SmpZMmxrZUR0aVlXWjVjbVZwWWpNek5HUnpiM3B4Y1RRek5tbHZkSGR1TTNGdmQyb3labVZtWTJGb1lXeG1lblZyTldnMWJXcDVaRE53Y1d4M2RHSndhV04x -Y21sNFJtRjBPaTh2Wkdsa09uQnNZem96TjJWNWNuSjVjbkJ1TXpab1pHSmpZamRpTjNscmRUUXZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkNlpH -RTJObWhyTW1acFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNM09qUTVMalE1TTFvPSJ9fXsiZGlkIjoiZGlkOnBsYzpiNXNvN3FxcW8zYmpj -eTM0dTJ1ZDR5eWEiLCJ0aW1lX3VzIjoxNzgzNjE1MDY4MjI0Mjk3LCJjdXJzb3IiOjIyNTgyODMxOTk5LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjgz -MTk5OSwiY29tbWl0Ijp7InJldiI6IjNtcWEyemNvdmx5MmciLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtl -IiwicmtleSI6IjNtcWEyemNvbnJ5MmciLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2 -OjM3OjQ3LjMzM1oiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWliY3NzaGU3N3o0YmZ4bDU3N3p6aHdyZzRlc2RuYmoza3Z1a3V2YncyeXhiNjRjbzRsbnRx -IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjY1Ym14cWRjYnp6bmhxcmJxNTVuZGRsMy9hcHAuYnNreS5mZWVkLnBvc3QvM21xN3hwYjY2ZTIydyJ9fSwiY2lkIjoi -YmFmeXJlaWFnYXRmbG82Z3liZjd4Y2FlLnN0cmVhbS5saXZlc3RyZWFtIiwiYWN0aXZpdHkiOnsiJHR5cGUiOiJwbGFjZS5zdHJlYW0uZGVmcyNhY3Rpdml0 -eUdhbWUiLCJuYW1lIjoiRGFuY2UgRGFuY2UgUmV2b2x1dGlvbiBHcmFuZCBQcml4IiwidXJpIjoiYXQ6Ly9kaWQ6d2ViOmdhbWVzZ2FtZXNnYW1lc2dhbWVz -LmdhbWVzL2dhbWVzLmdhbWVzZ2FtZXNnYW1lc2dhbWVzLmdhbWUvM21naTR6Ymdsa3cyZCJ9LCJhZ2VudCI6IkBzdHJlYW1wbGFjZS9jb21wb25lbnRzLzAu -MTEuMTIgKHdlYiwgRmlyZWZveCkiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE1OjM3OjI5WiIsImlkbGVUaW1lb3V0U2Vjb25kcyI6MzAwLCJsYXN0U2Vl -bkF0IjoiMjAyNi0wNy0wOVQxNjozNjo1Ni40MTVaIiwibm90aWZpY2F0aW9uU2V0dGluZ3MiOnsicHVzaE5vdGlmaWNhdGlvbiI6dHJ1ZX0sInRhZ3MiOlsi -bGFuZzpmciIsIlJoeXRobUdhbWVzIl0sInRodW1iIjp7IiR0eXBlIjoiYmxvYiIsIm1pbWVUeXBlIjoiaW1hZ2UvanBlZyIsInJlZiI6eyIkbGluayI6ImJh -ZmtyZWlkN2F3aHU1dWg1a3Nhd2N3a2thc2J2bTUyYWl5Z2s3YWJ2NXZiNnIzamdrM21vbDQyNWRlIn0sInNpemUiOjE4ODUxOH0sInRpdGxlIjoiW0ZSL0VO -XSBERFIgYW5kIGNoaWxsIiwidXJsIjoiaHR0cHM6Ly9zdHJlYW0ucGxhY2UvZGlkOnBsYzptenR3bnJ5NmZ1bmg2amF1dDYzZHR2ejIifSwiY2lkIjoiYmFm -eXJlaWMybW15YTJxdXVvZG5tYjd5MnA0YXEzZG80djU2NzVxeDZ6MnU2aGZocm1uNjQ0aGdjYnUiLCJyZWNvcmRfY2JvciI6InEyTjFjbXg0TldoMGRIQnpP -aTh2YzNSeVpXRnRMbkJzWVdObEwyUnBaRHB3YkdNNmJYcDBkMjV5ZVRabWRXNW9ObXBoZFhRMk0yUjBkbm95WkhSaFozT0NaMnhoYm1jNlpuSnJVbWg1ZEdo -dFIyRnRaWE5sSkhSNWNHVjNjR3hoWTJVdWMzUnlaV0Z0TG14cGRtVnpkSEpsWVcxbFlXZGxiblI0TGtCemRISmxZVzF3YkdGalpTOWpiMjF3YjI1bGJuUnpM -ekF1TVRFdU1USWdLSGRsWWl3Z1JtbHlaV1p2ZUNsbGRHaDFiV0trWTNKbDZNelk2TVRndU9EY3hXZz09In19eyJkaWQiOiJkaWQ6cGxjOnZ6M2RrZWVyYm5m -cDM1bHl6NnlsNnF3MyIsInRpbWVfdXMiOjE3ODM2MTQ5OTM3MzMzMTgsImN1cnNvciI6MjI1ODI3OTUxODcsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgy -Nzk1MTg3LCJjb21taXQiOnsicmV2IjoiM21xYTJ4M3NtN2sydiIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxp -a2UiLCJya2V5IjoiM21xYTJ4M3NkZ2MydiIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlU -MTY6MzY6MzUuMTA0WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWFrNzQ2Z2VvbjNrdnBnZTVza2l5NnRwc2JncWZjamhvdHM1a2EyZ3Zlb21lZzU1b2h0 -dHEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZWppaGxkNHN5d3Z2cXdlNjdjZGtuNGpxL2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3dDJiNzN6MjJ5In19LCJjaWQi -OiJiYWZ5cmVpZjVsZDNidDVxZ3c1a3Y0ZGtqZGF1NmUzdXdtdzU1YmVyaGN4dGxvZWdxa3o3aGNkajZ0ZSIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWEpo -Y0hBdVluTnJlUzVtWldWa0xteHBhMlZuYzNWaWFtVmpkS0pqWTJsa2VEdGlZV1o1Y21WcFlXczNORFpuWlc5dU0ydDJjR2RsTlhOcmFYazJkSEJ6WW1keFpt -TnFhRzkwY3pWcllUSm5kbVZ2YldWbk5UVnZhSFIwY1dOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwbGFtbG9iR1EwYzNsM2RuWnhkMlUyTjJOa2EyNDBhbkV2 -WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZDBNbUkzTTNveU1ubHBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTJPak0xTGpFd05G -bz0ifX17ImRpZCI6ImRpZDpwbGM6b3U1amM1dzZrdWtqbXJla2c3ZDN6bm5jIiwidGltZV91cyI6MTc4MzYxNTA0MTQ0NTE3MSwiY3Vyc29yIjoyMjU4Mjgx -OTEyNiwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MTkxMjYsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnlqQmd5TURJMkxUQTNMVEE1VkRFMk9qTTNPak0x -TGpZMk4xbz0ifX17ImRpZCI6ImRpZDpwbGM6MzdueHZ0aGRjYWRpZHpobHV5a2lwNTd5IiwidGltZV91cyI6MTc4MzYxNTA4MTAyMzI0OCwiY3Vyc29yIjoy -MjU4MjgzODE3OSwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MzgxNzksImNvbW1pdCI6eyJyZXYiOiIzbXFhMnpvems2NDJtIiwib3BlcmF0aW9uIjoi -Y3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsInJrZXkiOiIzbXFhMnZiZ2l2YzJvIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJz -a3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNTozMi40MDFaIiwibGFuZ3MiOlsiZW4iXSwicmVwbHkiOnsicGFyZW50Ijp7ImNp -ZCI6ImJhZnlyZWlmNHIyamJ6N3h5cW5rcWdyc21zYTJqbzY1c2xudTZyaGY0YnczdWF5YjQ3cHY0YjY3N25lIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnE1cXU1 -c2p0bjQ0ZTdtcHlyaTJxeXVndi9hcHAuYnNreS5mZWVkLnBvc3QvM21xN2pneWR6MmMyZyJ9LCJyb290Ijp7ImNpZCI6ImJhZnlyZWlhM2F4b2lyaWxzdDRl -cjdvdXZtNWdkNmF1YzZ4M215M3dzNmhib2liNHMybWJ4M3d6dzdxIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjJobHRpbXlteTY1emw1YmE3aWZzcTNxci9hcHAu -YnNreS5mZWVkLnBvc3QvM21xN2VlY2dtcDIyZCJ9fSwidGV4dCI6IkhlIGNvdWxkIGNhcmUgbGVzcyBhYm91dCB0aGUgbW9uZXkuIFRoaXMgaXMgYWxsIGFi -b3V0IGhpbSBzYXZpbmcgZmFjZS4uLmZ1bHRpbGUgYXMgdGhhdCBpcy4ifSwiY2lkIjoiYmFmeXJlaWNudzZ1YmZ1ZmxpdDNnbWNsdXBza29ybWd3a3VtZTNi -NGZicGJpNXA0azdkYWx3anhtZmkiLCJyZWNvcmRfY2JvciI6InBXUjBaWGgwZUZ0SVpTQmpiM1ZzWkNCallYSmxJR3hsYzNNZ1lXSnZkWFFnZEdobElHMXZi -bVY1TGlCVWFHbHpJR2x6SUdGc2JDQmhZbTkxZENCb2FXMGdjMkYyYVc1bklHWmhZMlV1TGk1bWRXeDBhV3hsSUdGeklIUm9ZWFFnYVhNdVpTUjBCc1l6cG9O -VGRoYkRKdlpXSTNaV0p1ZG5CbGVHRmhlWGcxYzNVdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGQyYzNreWNHdzNNamRwWTNKbFlYUmxaRUYwZUJn -eU1ESTJMVEEzTFRBNVZERTJPak0zT2pNMkxqYzBNRm89In19eyJkaWQiOiJkaWQ6cGxjOmx5Y3R4cHc2ZmJlcGFrdXg2cmgyNnRkcyIsInRpbWVfdXMiOjE3 -ODM2MTUwMjkyMjk1OTEsImN1cnNvciI6MjI1ODI4MTM3NzMsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODEzNzczLCJjb21taXQiOnsicmV2IjoiM21x -YTJ5NTVnaHAyZiIsIm9wZXJhdGlvbiI6InVwZGF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5hY3Rvci5wcm9maWxlIiwicmtleSI6InNlbGYiLCJyZWNv -cmQiOnsiJHR5cGUiOiJhcHAuYnNreS5hY3Rvci5wcm9maWxlIiwiYXZhdGFyIjp7IiR0eXBlIjoiYmxvYiIsIm1pbWVUeXBlIjoiaW1hZ2UvanBlZyIsInJl -ZiI6eyIkbGluayI6ImJhZmtyZWlhMmVoajJoaXlrbWJscXlrdHA2dzd2Z2lwdnplcDdrY2xvN296cHp0Y3J6Z2p4YmQzZG5tIn0sInNpemUiOjEzMzA4OH0s -ImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzY6NTMuNjYzWiIsImRpc3BsYXlOYW1lIjoiIn0sImNpZCI6ImJhZnlyZWlodmJjMzdzZXN3ZWozb2Z2ZWxv -b3FmYW0zb3BpaWtkZWxwYmt4eXFzYWwza3J5eGJ3azV1IiwicmVjb3JkX2Nib3IiOiJwR1VrZEhsd1pYWmhjSEF1WW5OcmVTNWhZM1J2Y2k1d2NtOW1hV3hs -Wm1GMllYUmhjcVJqY21WbTJDcFlKUUFCVlJJZ0dpSFRvNk1LWUZjTUttLzF2MU1oOWNrZjlRbHUrN0w4ekZISmszQ1BZMnRrYzJsNlpSb0FBZ2ZnWlNSMGVY -QmxaR0pzYjJKb2JXbHRaVlI1Y0dWcWFXMWhaMlV2YW5CbFoybGpjbVZoZEdWa1FYUjRHREl3TWpZdE1EY3RNRGxVTVRZNk16WTZOVE11TmpZeldtdGthWE53 -YkdGNVRtRnRaV0E9In19eyJkaWQiOiJkaWQ6cGxjOjI3cHRkNHRzY25zbzU3dnprZDR2NGR2ZCIsInRpbWVfdXMiOjE3ODM2MTQ5NDYyMzM3NjQsImN1cnNv -ciI6MjI1ODI3NzI2MDhRR0RfMjAyNjA3MDlfMF9MMkEvdGh1bWJuYWlsIn0sInB1Ymxpc2hlZEF0IjoiMjAyNi0wNy0wOVQxNjozMTo1MC4xNjVaIiwicmVz -b3VyY2UiOiJodHRwczovL2VhcnRoLXNlYXJjaC5hd3MuZWxlbWVudDg0LmNvbS92MS9jb2xsZWN0aW9ucy9zZW50aW5lbC0yLWwyYS9pdGVtcy9TMkJfMjhR -R0RfMjAyNjA3MDlfMF9MMkEifSwiY2lkIjoiYmFmeXJlaWh4ZG52Y2Z4ZG13MnNrbm1hcG1kdWdrNHRwNHZqZGllZnkyZG1qeHlraHV6a3VlcWVnYmEiLCJy -ZWNvcmRfY2JvciI6InBHVWtkSGx3WlhCamVDNTJiWGd1YldGMFlXUnBjMk52WjNCeVpYWnBaWGVpWTNWeWJIaHRhSFIwY0hNNkx5OWxZWEowYUMxelpXRnlZ -Mmd1WVhkekxtVnNaVzFsYm5RNE5DNWpiMjB2ZGpFdlkyOXNiR1ZqZEdsdmJuTXZjMlZ1ZEdsdVpXd3RNaTFzTW1FdmFYUmxiWE12VXpKQ1h6STRVVWRFWHpJ -d01qWXdOekE1WHpCZlRESkJMM1JvZFcxaWJtRnBiR2h0YVcxbFZIbHdaV3BwYldGblpTOXFjR1ZuYUhKbGMyOTFjbU5sZUdOb2RIUndjem92TDJWaGNuUm9M -WE5sWVhKamFDNWhkM011Wld4bGJXVnVkRGcwTG1OdmJTOTJNUzlqYjJ4c1pXTjBhVzl1Y3k5elpXNTBhVzVsYkMweUxXd3lZUzlwZEdWdGN5OVRNa0pmTWpo -UlIwUmZNakF5TmpBM01EbGZNRjlNTWtGcmNIVmliR2x6YUdWa1FYUjRHREl3TWpZdE1EY3RNRGxVTVRZNk16RTZOVEF1TVRZMVdnPT0ifX17ImRpZCI6ImRp -ZDpwbGM6NnBhd3hreWZqbzRwazVlamdqeWtzaWtyIiwidGltZV91cyI6MTc4MzYxNDkyNTI0MzE2MiwiY3Vyc29yIjoyMjU4Mjc2MjA4Nywia2luZCI6ImNv -bW1pdCIsInNlcSI6MjI1ODI3NjIwODcsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnYyaGtubjJ3Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6 -ImFwcC5ic2t5LmZlZWQubGlrZSIsInJrZXkiOiIzbXFhMnYyM21zdTJ3IiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRl -ZEF0IjoiMjAyNi0wNy0wOVQxNjozNToyMy44ODVaIiwiRTRNMW89In19eyJkaWQiOiJkaWQ6cGxjOmhhdm1nNWJtbGFrZnU3c3dwa3V2b2V3NyIsInRpbWVf -dXMiOjE3ODM2MTQ5ODg2MjY1MjIsImN1cnNvciI6MjI1ODI3OTI3MzYsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzkyNzM2LCJjb21taXQiOnsicmV2 -IjoiM21xYTJ3d3hjcnEyeCIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJya2V5IjoiM21xYTJ3d3gz -d3kyeCIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzY6MjguMDI5WiIsInN1Ympl -Y3QiOnsiY2lkIjoiYmFmeXJlaWdjYmJpM3B1bXJmZnZ2d256dmJsaWN5a3g3eXg1cm1tZDRzcG9pcm5udXh0MnhvaWYzamkiLCJ1cmkiOiJhdDovL2RpZDpw -bGM6Y3F3ZWRhYXFsNGMzem83eWx6N3JmNnFjL2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3czU2ZDQ2czJuIn19LCJjaWQiOiJiYWZ5cmVpY2pzdnpwdGRlZjUz -c2ZuY2ozNGZhenZmN3NqdXh6cW0zZzZtbXh3bHduNDVrNjRsYW9seSIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xteHBh -MlZuYzNWaWFtVmpkS0pqWTJsa2VEdGlZV1o1Y21WcFoyTmlZbWt6Y0hWdGNtWm1kblozYm5wMllteHBZM2xyZURkNWVEVnliVzFrTkhOd2IybHlibTUxZUhR -eWVHOXBaak5xYVdOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwamNYZGxaR0ZoY1d3MFl6TjZiemQ1YkhvM2NtWTJjV012WVhCd0xtSnphM2t1Wm1WbFpDNXdi -M04wTHpOdGNUZHpOVFprTkRaek1tNXBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTJPakk0TGpBeU9Wbz0ifX17ImRpZCI6ImRpZDpwbGM6 -dTVucTQ1cHBkcmE3b3dtNGtsZWwzNGFnIiwidGltZV91cyI6MTc4MzYxNTA4NzUyODEwMCwiY3Vyc29yIjoyMjU4Mjg0MTQ4Nywia2luZCI6ImNvbW1pdCIs -InNlcSI6MjI1ODI4NDE0ODcsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnp2NngzZTJ5Iiwib3B6Y3k0dUxtVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbkJ2 -YzNSbFpXMWlaV1NpWlNSMGVYQmxkV0Z3Y0M1aWMydDVMbVZ0WW1Wa0xtbHRZV2RsYzJacGJXRm5aWE9CbzJOaGJIUmdaV2x0WVdkbHBHTnlaV2JZS2xnbEFB -RlZFaURKRWRwSFMza2lBdFNHVERkMGtNYTJVcklvYzRsZVkrOHJjZ1ZGdEFrZ1MyUnphWHBsR2dBRGpTZGxKSFI1Y0dWa1lteHZZbWh0YVcxbFZIbHdaV3Bw -YldGblpTOXFjR1ZuYTJGemNHVmpkRkpoZEdsdm9tVjNhV1IwYUJrRCttWm9aV2xuYUhRWkJhMWxiR0Z1WjNPQlltVnVabVpoWTJWMGM0R2laV2x1WkdWNG9t -ZGllWFJsUlc1a0dEVnBZbmwwWlZOMFlYSjBHQjVvWm1WaGRIVnlaWE9Cb21OMWNtbDRkbWgwZEhCek9pOHZZMmhoY214cFpXaGxZbVJ2TG1aeUwyUmxjM05w -Ymkxa2RTMXFiM1Z5THo5a1pYTnphVzQ5TWprNU5EVXpKblYwYlY5emIzVnlZMlU5WW14MVpYTnJlU1oxZEcxZmJXVmthWFZ0UFhOdlkybGhiQ1oxZEcxZlky -RnRjR0ZwWjI0OVptVmthV05oTFVSbGMzTnBibk5sSkhSNWNHVjRIR0Z3Y0M1aWMydDVMbkpwWTJoMFpYaDBMbVpoWTJWMEkyeHBibXRwWTNKbFlYUmxaRUYw -ZUJneU1ESTJMVEEzTFRBNVZERTJPak0xT2pBd0xqQXdNRm89In19eyJkaWQiOiJkaWQ6cGxjOjM3cHUzb3FjczZ4N2p5aHo2aWluYXdoNCIsInRpbWVfdXMi -OjE3ODM2MTUwODk2NjEzNTAsImN1cnNvciI6MjI1ODI4NDQzMDEsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODQ0MzAxLCJjb21taXQiOnsicmV2Ijoi -M21xYTJ6eGFremUyZCIsIm9wZXJhdGlvbiI6ImRlbGV0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnJlcG9zdCIsInJrZXkiOiIzbXE3YmpteTZl -cDJkIn19eyJkaWQiOiJkaWQ6cGxjOm1mbG1ndTd2czU0Z282cHRld2V4cGx1cCIsInRpbWVfdXMiOjE3ODM2MTQ5MDY0MjYyNTYsImN1cnNvciI6MjI1ODI3 -NTMwNjIsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzUzMDYyLCJjb21taXQiOnsicmV2IjoiM21xYTJ1aWlmZHkyZSIsInlyZWllZTNyZXhycTUzem5j -eTQzZWl4NWJlbTc1N3ZmbnRsN3FpZHV6d3dqeGo2djN4ZWVxZm40IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmtwZ2NwdWJseGtmdGF1dHJ1d251MzRzMi9hcHAu -YnNreS5mZWVkLnBvc3QvM21xN3J1ZmhidGsycyJ9fSwiY2lkIjoiYmFmeXJlaWNsZDRvNHh3MnB1b29xcm5zdWt0cXRuNWttMmJmNXI0YjI2NGlwdnJ5bG03 -NnlpdTNjcGEiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBa -V1V6Y21WNGNuRTFNM3B1WTNrME0yVnBlRFZpWlcwM05UZDJabTUwYkRkeGFXUjFlbmQzYW5ocU5uWXplR1ZsY1dadU5HTjFjbWw0Um1GME9pOHZaR2xrT25C -c1l6cHJjR2RqY0hWaWJIaHJablJoZFhSeWRYZHVkVE0wY3pJdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGR5ZFdab1luUnJNbk5wWTNKbFlYUmxa -RUYwZUJzeU1ESTJMVEEzTFRBNVZERTJPak0yT2pVMUxqRTNPVEF6TWxvPSJ9fXsiZGlkIjoiZGlkOnBsYzpjdHdsYjZ1bHR0ZGNjcW4yM2Rhd3N5Z3oiLCJ0 -aW1lX3VzIjoxNzgzNjE0OTM2MTI2NDgzLCJjdXJzb3IiOjIyNTgyNzY3NTkzLCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc2NzU5MywiY29tbWl0Ijp7 -InJldiI6IjNtcWEydmVldW5pMnMiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNtcWEy -dmVlbXRpMnMiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM1OjM1LjM0MFoiLCJz -dWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWllNnBnZTVzNHB0aWNkejYzYm9veXBzaGtoaWtkZGEyNjRtcXl5M3ZxNXV0aHZjN2VwMm5xIiwidXJpIjoiYXQ6Ly9k -aWQ6cGxjOm1qYTY1enlqbms2bndraXU0eDM0aGdxeS9hcHAuYnNreS5mZWVkLnBvc3QvM21xNnNlbDc3MmMyeCJ9fSwiY2lkIjoiYmFmeXJlaWVybjczYml2 -MnF3dXJzb3IiOjIyNTgyNzg0NTUyLCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc4NDU1MiwiY29tbWl0Ijp7InJldiI6IjNtcWEyd2dkc2diMnIiLCJv -cGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNtcWEyd2dkb2piMnIiLCJyZWNvcmQiOnsiJHR5 -cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM2OjExLjg0OVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlo -eW5jc3V0czJuc3V2Z2h3NGNndGt2bHkyMjJyYXhpdjVxbWlkNmZoNmxzMnJ2NG5mdGhpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmJocXJyeHQ3eXlmcHdndWlv -YTdyd2E3eC9hcHAuYnNreS5mZWVkLnBvc3QvM21xN3R3NmVna2MycSJ9fSwiY2lkIjoiYmFmeXJlaWF3Ym9lM3hrMm14eG91NnFnbmgyMnoyZDQ0eHN5ZGtl -ZWZwbHljemt5dnhuZXp1am8zYXkiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtl -RHRpWVdaNWNtVnBhSGx1WTNOMWRITXlibk4xZG1kb2R6UmpaM1JyZG14NU1qSXljbUY0YVhZMWNXMXBaRFptYURac2N6SnlkalJ1Wm5Sb2FXTjFjbWw0Um1G -ME9pOHZaR2xrT25Cc1l6cGlhSEZ5Y25oME4zbDVabkIzWjNWcGIyRTNjbmRoTjNndllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGQwZHpabFoydGpN -bkZwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0yT2pFeExqZzBPVm89In19eyJkaWQiOiJkaWQ6cGxjOjNyeDNlbTI1eDJkanBrNHg2NGE1 -cDZlZSIsInRpbWVfdXMiOjE3ODM2MTQ4OTA5NDU2NTMsImN1cnNvciI6MjI1ODI3NDU5MDUsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzQ1OTA1LCJj -b21taXQiOnsicmV2IjoiM21xYTJ0eXdwYXoyNSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnJlcG9zdCIsInJr -ZXkiOiIzbXFhMnR5d2docjI1IiwicmVub3llR1F5TWpkcFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNMk9qQTFMamN4TWxvPSJ9fXsiZGlk -IjoiZGlkOnBsYzppZXo2d2R5aHQ3bTJrdDc2aXAyeXEzcmEiLCJ0aW1lX3VzIjoxNzgzNjE0OTgzNTI5NDUyLCJjdXJzb3IiOjIyNTgyNzkwMzExLCJraW5k -IjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc5MDMxMSwiY29tbWl0Ijp7InJldiI6IjIyMjIyM3R2NGE3MjIiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0 -aW9uIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwicmtleSI6IjNtcWEyd2c2Y2pmNjIiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJi -cmlkZ3lPcmlnaW5hbFRleHQiOiJcdTAwM2NmaWd1cmVcdTAwM2VcdTAwM2NpbWcgYWx0PVwiXCIgY2xhc3M9XCJhdHRhY2htZW50LXJzcy1pbWFnZS1zaXpl -IHNpemUtcnNzLWltYWdlLXNpemUgd3AtcG9zdC1pbWFnZVwiIGhlaWdodD1cIjEwMjRcIiBzcmM9XCJodHRwczovL2kwLndwLmNvbS93d3cucG9ydGxhbmRt -ZXJjdXJ5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wNy9IYXl3YXJkXzA3MDMyNS0xODRfQ01ZSy1zY2FsZWQuanBnP2ZpdD02ODMlMkMxMDI0XHUw -MDI2YW1wO3NzbD0xXCIgd2lkdGg9XCI2ODNcIiAvXHUwMDNlXHUwMDNjL2ZpZ3VyZVx1MDAzZVxuXHUwMDNjcFx1MDAzZVdoYXQgZm9sbG93cyBpcyBvbmUg -b2YgdGhlIG1hbnkgYXJ0aWNsZXMgaW4gdGhlIE1lcmN1cnnigJlzIDIwMjYgRm9vZCBJc3N1ZS4gRmluZCBhIHByaW50IGNvcHkgaGVyZSwgc3Vic2NyaWJl -IHRvIGdldCBhIGNvcHkgbWFpbGVkIHRvIHlvdSBoZXJlLCBhbmQgaWYgeW914oCZcmUgZmVlbGluZyBnZW5lcm91cyBhbmQgd2FudCB0byBrZWVwIHRoZXNl -IHR5cGVzIG9mIGFydGljbGVzIGNvbWluZywgc3VwcG9ydCB1cyBoZXJlLuKAlGVkcy4gSGF2aW5nIHNwZW50IGVpZ2h0IHllYXJzIGFzIGEgY2l0eSB0cmFu -c3BsYW50IGxpdmluZyBpbiBbXHUwMDI2IzgyMzA7XVx1MDAzYy9wXHUwMEpsWkM1eVpXTnZjbVJtY21WamIzSmtvbU5qYVdSNE8ySmhabmx5Wldsb2QzRnda -bnB6WlRScGQzazFlV2xpZEd4cE5tdGthWGQ2WW1kM00zZDVZV0ZrY0hSdGNtczNjSEp6YVhFMU1tdHRkM2Q1WTNWeWFYaEdZWFE2THk5a2FXUTZjR3hqT25a -cE1tZHllbVpoYkdrMWVHNDFjbWd5Ym5reWJqUmtOQzloY0hBdVluTnJlUzVtWldWa0xuQnZjM1F2TTIxeE4zVTFjMmxoTTJzeVltVnNZVzVuYzRGaVpXNXBZ -M0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTNPalU1TGpReU1Gbz0ifX17ImRpZCI6ImRpZDpwbGM6dXJvMm41Y3A2NjJ1Zm12NTQzM2w0eDY2 -IiwidGltZV91cyI6MTc4MzYxNTA3OTc0NTkwMSwiY3Vyc29yIjoyMjU4MjgzNzU3Mywia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4Mzc1NzMsImNvbW1p -dCI6eyJyZXYiOiIzbXFhMnpubmJvajJvIiwib3BlcmF0aW9uIjoiZGVsZXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsInJrZXkiOiIz -bXE0aHNvN2F6azJ2In19eyJkaWQiOiJkaWQ6cGxjOnJhdWZiZWRrcGxvM2Z3cWJ2cGZvanJoaCIsInRpbWVfdXMiOjE3ODM2MTUwMzg3MzA3MTEsImN1cnNv -ciI6MjI1ODI4MTc5NjEsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODE3OTYxLCJjb21taXQiOnsicmV2IjoiM21xYTJ5Z3BrZ2UyNiIsIm9wZXJhdGlv -biI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJya2V5IjoiM21xYTJ5Z3BnamUyNiIsInJlY29yZCI6eyIkdHlwZSI6ImFw -cC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6Mzc6MTguNDM1WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWVzbmg0bW5m -Y2J2YW1kNG0zM2Q0NTY3dnc1dTVlemxvbzRoaWc3dGpwc2VxcGxvc2JiZGUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bnZmcG9zbXBtaGVndHl2aGJzNzVzM3B3 -L2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3eXRpbWF4YzJ0In19LCJjaWQiOiJiYWZ5cmVpZ2NuanltcTI2NWdzOjI5Ljc0NloiLCJlbWJlZCI6eyIkdHlwZSI6 -ImFwcC5ic2t5LmVtYmVkLmltYWdlcyIsImltYWdlcyI6W3siYWx0IjoiIiwiYXNwZWN0UmF0aW8iOnsiaGVpZ2h0IjoyMDAwLCJ3aWR0aCI6MTUwMH0sImlt -YWdlIjp7IiR0eXBlIjoiYmxvYiIsIm1pbWVUeXBlIjoiaW1hZ2UvanBlZyIsInJlZiI6eyIkbGluayI6ImJhZmtyZWlnMmI0ZWZienFwNGVrbTZnN2lrZWhu -bHBxNGM0Y2RxZ2dnYWx0Mnlib2Z0ajdsbGFuYWJhIn0sInNpemUiOjkxNTExN319XX0sImxhbmdzIjpbImphIl0sInRleHQiOiLjgaHjgofjgaPjgajmiJHm -haLjgZfjgabjga0ifSwiY2lkIjoiYmFmeXJlaWhvYXF1a29pNDVzeHlleGxxYmF5MzZocXJsa3R5eDdvc3Jsb255Mm1oM3JqcDQ0YW82Y20iLCJyZWNvcmRf -Y2JvciI6InBXUjBaWGgwZUJ2amdhSGpnb2ZqZ2FQamdham1pSkhtaGFMamdaZmpnYWJqZ2ExbEpIUjVjR1Z5WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wWldW -dFltVmtvbVVrZEhsd1pYVmhjSEF1WW5OcmVTNWxiV0psWkM1cGJXRm5aWE5tYVcxaFoyVnpnYU5qWVd4MFlHVnBiV0ZuWmFSamNtVm0yQ3BZSlFBQlZSSWcy -ZzhJVU9ZUDRSVFBHK2hSRHRXK0hCY0VPQmpHQXVlc0JjV2FmcldCb0Foa2MybDZaUm9BRGZhdFpTUjBlWEJsWkdKc2IySm9iV2x0WlZSNWNHVnFhVzFoWjJV -dmFuQmxaMnRoYzNCbFkzUlNZWFJwYjZKbGQybGtkR2daQmR4bWFHVnBaMmgwR1FmUVpXeGhibWR6Z1dKcVlXbGpjbVZoZEdWa1FYUjRHREl3TWpZdE1ESXRN -akpVTURJNk1USTZNamt1TnpRMldnPT0ifX17ImRpZCI6ImRpZDpwbGM6N2puZG83ejc3aXhpcWs2enZ6aG10b3p6IiwidGltZV91cyI6MTc4MzYxNDk3OTgy -NjA2MCwiY3Vyc29yIjoyMjU4Mjc4ODU4MSwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI3ODg1ODEsImNvbW1pdCI6eyJyZXYiOiIzbXFhMndvanczeTIy -Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsInJrZXkiOiIzbXFhMndvN21iYzJ2IiwicmVCc1l6cHZh -bkp5TkdWbU1uRTBiR2hoYzJkeWVYRnplbTlrZFhZdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnNiR0ZqTkdRMk1qVnpNbmhwWTNKbFlYUmxaRUYwZUJn -eU1ESTFMVEF6TFRJMVZESXlPakV6T2pRNExqRTFPVm89In19eyJkaWQiOiJkaWQ6cGxjOm9iNjZmdmxsdnZzdW11cWdpbjRseHRzdCIsInRpbWVfdXMiOjE3 -ODM2MTQ5NjQ1Mjg0NzEsImN1cnNvciI6MjI1ODI3ODA5NDIsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzgwOTQyLCJjb21taXQiOnsicmV2IjoiM21x -YTJ3N2hyMmQyMyIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnBvc3RnYXRlIiwicmtleSI6IjNtcWEydzZpbmsy -MnUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3RnYXRlIiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNjowMi44ODBaIiwiZGV0 -YWNoZWRFbWJlZGRpbmdVcmlzIjpbXSwiZW1iZWRkaW5nUnVsZXMiOlt7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0Z2F0ZSNkaXNhYmxlUnVsZSJ9XSwi -cG9zdCI6ImF0Oi8vZGlkOnBsYzpvYjY2ZnZsbHZ2c3VtdXFnaW40bHh0c3QvYXBwLmJza3kuZmVlZC5wb3N0LzNtcWEydzZpbmsyMnUifSwiY2lkIjoiYmFm -eXJlaWV0a2M1NnVzZW81ZzZieDRjazVnY2Zjcmpydmp4bDR1bW9wYzVodnJ6eWVjcnN0ZG9uNDQiLCJyZWNvcmRfY2JvciI6InBXUndiM04wZUVaaGREb3ZM -MlJwWkRwd2JHTTZiMkkyTm1aMmJHeDJkbk4xYlhWeFoybHVOR3g0ZEhOMEwyRndjQzVpYzJ0NUxtWmxaV1F1Y0c5emRDOHpiWEZoTW5jMmFXNXJNakoxWlNS -MGVYQmxkbUZ3Y0M1aWMydDVMbVpsWldRdWNHOXpkR2RoZEdWcFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNMk9qQXlMamc0TUZwdVpXMWla -V1JrYVc1blVuVnNaWE9Cb1dVa2RIbHdaWGdpWVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wWjJGMFpTTmthWE5oWW14bFVuVnNaWFZrWlhSaFkyaGxaRVZ0WW1W -a1pHbHVaMVZ5YVhPQXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozODowNS41MzlaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpaGhlb3Vmd2hzc2h5d2Frcmpy -enJlbm9pdWp0ZTd4ZTZwYWE2d3JybnJzNXFpMmNjZW5yaSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpyb2dxeGh6cTZ2eTU0bmJ1eTRuNnJ3eWQvYXBwLmJza3ku -ZmVlZC5wb3N0LzNtcWEyYWhwN3NzMm4ifSwidmlhIjp7ImNpZCI6ImJhZnlyZWlmYXppNnpqNnhwcHpueHdrbW94ZXNrdnhnNml0eGRrajRmZzY0aTc0dWo0 -emg2cHV0bWh5IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmx6bHF5bGRoN25mYzM0cGZmZnZkMjRrby9hcHAuYnNreS5mZWVkLnJlcG9zdC8zbXFhMnAzeGhvejJ5 -In19LCJjaWQiOiJiYWZ5cmVpZ2pvcHB4NmNkeWE3aDU1bWdkc3d1bWhrMmE2dnV5N2hjY202bm1tMjNucHhua2FzaG1mbSIsInJlY29yZF9jYm9yIjoicEdO -MmFXR2lZMk5wWkhnN1ltRm1lWEpsYVdaaGVtazJlbW8yZUhCd2VtNTRkMnR0YjNobGMydDJlR2MyYVhSNFpHdHFOR1puTmpScE56UjFhalI2YURad2RYUnRh -SGxqZFhKcGVFaGhkRG92TDJScFpEcHdiR002Ykhwc2NYbHNaR2czYm1aak16UndabVptZG1ReU5HdHZMMkZ3Y0M1aWMydDVMbVpsWldRdWNtVndiM04wTHpO -dGNXRXljRE40YUc5Nk1ubGxKSFI1Y0dWeVlYQndMbUp6YTNrdVptVmxaQzVzYVd0bFozTjFZbXBsWTNTaVkyTnBaSGc3WW1GbWVYSmxhV2hvWlc5MVpuZG9j -M05vZVhkaGEzSnFjbnB5Wlc1dmFYVnFkR1UzZUdVMmNHRmhObmR5Y201eWN6VnhhVEpqWTJWdWNtbGpkWEpwZUVaaGREb3ZMMlJwWkRwd2JHTTZjbTluY1ho -b2VuRTJkbmsxTkc1aWRYazBialp5ZDNsa0wyRndjQzVpYzJ0NUxtWmxaV1F1Y0c5emRDOHpiWEZoTW1Gb2NEZHpjekp1YVdOeVpXRjBaV1JCZEhnWU1qQXlO -aTB3Tnkwd09WUXhOam96T0Rvd05TNDFNemxhIn19eyJkaWQiOiJkaWQ6cGxjOmdrZHpoaGFzbGw1bHdlYnkycG5ha2gzYyIsInRpbWVfdXMiOjE3ODM2MTQ5 -NDI3MzE5NTIsImN1cnNvciI6MjI1ODI3NzA4OTksImtpbWJlZC5yZWNvcmQiLCJyZWNvcmQiOnsiY2lkIjoiYmFmeXJlaWZicDIzZHVka2kyNmdpZGFwMm1r -dHd3am1sMmh3bGZ5aWE2cjV4eWF6dTI3ZXpjaHUzcnUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6NHVzbXNlcmhqcWt2aGxkZ2VkZmpiM2p3L2FwcC5ic2t5LmZl -ZWQucG9zdC8zbXE3dnhzaTd6czJjIn19LCJsYW5ncyI6WyJlbiJdLCJ0ZXh0IjoiQnJlYXRodGFraW5nbHkgcmFjaXN0IGFuZCBhYnN1cmQhIEJ1dCB0aGlz -IGlzIHdobyB0aGUgdm90ZXJzIHNlbGVjdCB0aW1lIGFuZCBhZ2FpbiB0byByZXByZXNlbnQgdGhlaXIgaW50ZXJlc3RzLiBEaXNndXN0aW5nLiJ9LCJjaWQi -OiJiYWZ5cmVpZ2tqN29uNHB4eGRwYnF6M2NmdXM3ZjU0d241N3VnemJwaG01eGZraWYzajdycnY2cTdzNCIsInJlY29yZF9jYm9yIjoicFdSMFpYaDBlSHhD -Y21WaGRHaDBZV3RwYm1kc2VTQnlZV05wYzNRZ1lXNWtJR0ZpYzNWeVpDRWdRblYwSUhSb2FYTWdhWE1nZDJodklIUm9aU0IyYjNSbGNuTWdjMlZzWldOMElI -UnBiV1VnWVc1a0lHRm5ZV2x1SUhSdklISmxjSEpsYzJWdWRDQjBhR1ZwY2lCcGJuUmxjbVZ6ZEhNdUlFUnBjMmQxYzNScGJtY3VaU1IwZVhCbGNtRndjQzVp -YzJ0NUxtWmxaV1F1Y0c5emRHVmxiV0psWktKbEpIUjVjR1YxWVhCd0xtSnphM2t1WlcxaVpXUXVjbVZqYjNKa1puSmxZMjl5WktKalkybGtlRHRpWVdaNWNt -VnBabUp3TWpOa2RXUnJhVEkyWjJsa1lYQXliV3QwZDNkcWJXd3lhSGRzWm5scFlUWnlOWGg1WVhwMU1qZGxlbU5vZFROeWRXTjFjbWw0Um1GME9pOHZaR2xr -T25Cc1l6bzBkWE50YzJWeWFHcHhhM1pvYkdSblpXUm1hbUl6YW5jdllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGQyZUhOcE4zcHpNbU5sYkdGdVoz -T0JZbVZ1YVdOeVpXRjBaV1JCZEhnWU1qQXlOaTB3Tnkwd09WUXhOam96TlRveU15NDJNekJhIn19eyJkaWQiOiJkaWQ6cGxjOmhkbDJ1dGxta2J2N2d2ajZy -ZjdybnFydSIsInRpbWVfdXMiOjE3ODM2MTUwNjk1MjYzMTMsImN1cnNvciI6MjI1ODI4MzJZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkemNuTnBZ -ak15TW1ScFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNM09qRXpMakUyTUZvPSJ9fXsiZGlkIjoiZGlkOnBsYzpoeWZkY3djbHlqZ3V3bXN6 -czRwNHpnZWIiLCJ0aW1lX3VzIjoxNzgzNjE1MDQ4NTI2OTQwLCJjdXJzb3IiOjIyNTgyODIyMzYzLCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4MjgyMjM2 -MywiY29tbWl0Ijp7InJldiI6IjNtcWEyeXB6Z21wMnUiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZ3JhcGguZm9sbG93 -IiwicmtleSI6IjNtcWEyeXBwd2N1MmsiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5ncmFwaC5mb2xsb3ciLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5 -VDE2OjM3OjI4LjA1M1oiLCJzdWJqZWN0IjoiZGlkOnBsYzpqYmgzYW5jcjU3dDV4ZzVtcmpvcjNnemsiLCJ2aWEiOnsiY2lkIjoiYmFmeXJlaWc0Ynl5eDRy -Z3ZvMnhjY2NrdTN6eXBncXZ2eTVxdTNkcHhzamhybGVoM203NGtkd2Z6ZjQiLCJ1cmkiOiJhdDovL2RpZDpwbGM6aXY3N3ZvNjJybjVzN2VyeTRjcmZ3cm5v -L2FwcC5ic2t5LmdyYXBoLnN0YXJ0ZXJwYWNrLzNsd3dxbGNreTc1MmMifX0sImNpZCI6ImJhZnlyZWlmZWp4NzVsNGM3NmpteHp1aXNtZ3o2N3l0em9ucnFy -djU1cnBqY2VhbGNubXZkNXhzcDJhIiwicmVjb3JkX2Nib3IiOiJwR04yYVdHaVkyTnBaSGc3WW1GbWVYSmxhV2MwWW5sNWVEUnlaM1p2TW5oalkyTnJkVE42 -ZVhCbmNYWjJlVFZ4ZFROa2NIaHphbWh5YkdWb00yMDNOR3RrZDJaNlpqUmpkWEpwZUU1aGREb3ZMMlJwWkRwd2JHTTZhWFkzTjNadk5qSnlialZ6TjJWeWVU -UmpjbVozY201dkwyRndjQzVpYzJ0NUxtZHlZWEJvTG5OMFlYSjBaWEp3WVdOckx6TnNkM2R4YkdOcmVUYzFNbU5sSkhSNWNHVjFZWEJ3TG1KemEza3VaM0po -Y0dndVptOXNiRzkzWjNOMVltcGxZM1I0SUdScFpEcHdiR002YW1Kb00yRnVZM0kxTjNRMWVHYzFiWEpxYjNJelozcHJhV055Wkhsd1pYZGhjSEF1WW5OcmVT -NWxiV0psWkM1bGVIUmxjbTVoYkdobGVIUmxjbTVoYktSamRYSnBlQ3RvZEhSd2N6b3ZMM2QzZHk1NWIzVjBkV0psTG1OdmJTOTNZWFJqYUQ5MlBVb3lUVUk0 -VVhsRk1HcFJaWFJvZFcxaXBHTnlaV2JZS2xnbEFBRlZFaUFMTE1UYmF0Zk10bkVGSjBVQWFwWktDZE1SYXBuM1oreWp5VkRQSGxrcWJHUnphWHBsR2dBQlQy -aGxKSFI1Y0dWa1lteHZZbWh0YVcxbFZIbHdaV3BwYldGblpTOXFjR1ZuWlhScGRHeGxlQ0VvVFVRcElFZGhjbWR2ZVd4bGN5QXRJRUZ5WVd0dWFXVW5jeUJT -WlhacFpYZHJaR1Z6WTNKcGNIUnBiMjU0SjFsdmRWUjFZbVVnZG1sa1pXOGdZbmtnUVhKaGEyNXBaU0JNYjNabGN5QkpkQ0JTWlhSeWIyVnNZVzVuYzRGaVpX -NW1abUZqWlhSemdhSmxhVzVrWlhpaVoySjVkR1ZGYm1RWXRHbGllWFJsVTNSaGNuUVlsV2htWldGMGRYSmxjNEdpWTNWeWFYZ3JhSFIwY0hNNkx5OTNkM2N1 -ZVc5MWRIVmlaUzVqYjIwdmQyRjBZMmcvZGoxS01rMUNPRkY1UlRCcVVXVWtkSGx3WlhnY1lYQndMbUp6YTNrdWNtbGphSFJsZUhRdVptRmpaWFFqYkdsdWEy -bGpjbVZoZEdWa1FYUjRHREl3TWpZdE1EY3RNRGxVTVRZNk16VTZNVFF1TURVNVdnPT0ifX17ImRpZCI6ImRpZDpwbGM6dzczd3BnNXVwNW42ZjRvdHZ6ZTZr -dXJqIiwidGltZV91cyI6MTc4MzYxNTAyOTkyOTM2OCwiY3Vyc29yIjoyMjU4MjgxNDA4Miwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MTQwODIsImNv -bW1pdCI6eyJyZXYiOiIzbXFhMnk2YjRuaDJoIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmdyYXBoLmZvbGxvdyIsInJr -ZXkiOiIzbXFhMnk2YXlxaDJoIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZ3JhcGguZm9sbG93IiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjoz -NzowOS44NDdaIiwic3ViamVjdCI6ImRpZDpwbGM6N2Jia25rdTJydjJsMmM0NDZmYW01eHVqIn0sImNpZCI6ImJhZnlyZWlkbWp2dXRsdWtudzZqbGhmM2p3 -NXlucmIyazNaelZ3YnpSNWEySnVhMnAyY1dOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwd1pXcDBjWE54YzNWc2VXY3laMlp0ZEdaeFpXazJOMkl2WVhCd0xt -SnphM2t1Wm1WbFpDNXdiM04wTHpOdGNXRXlZbko0YTJFeU1qSm1jR0Z5Wlc1MG9tTmphV1I0TzJKaFpubHlaV2xtWTNGbFpEUnNibUpzZDNkcWFYTnFiRFUy -Y0c5MmFHbHZjVzlsZEdGd1p6TnFNMnR2YVRkbk5YQnZOSGxyWW01cmFuWnhZM1Z5YVhoR1lYUTZMeTlrYVdRNmNHeGpPbkJsYW5SeGMzRnpkV3g1WnpKblpt -MTBabkZsYVRZM1lpOWhjSEF1WW5OcmVTNW1aV1ZrTG5CdmMzUXZNMjF4WVRKaWNuaHJZVEl5TW1samNtVmhkR1ZrUVhSNEdESXdNall0TURjdE1EbFVNVFk2 -TXpZNk5UQXVNRFUzV2c9PSJ9fXsiZGlkIjoiZGlkOnBsYzo1emdqNW9pZ3Z3ajRqZTJkbmY1cWxwZ2IiLCJ0aW1lX3VzIjoxNzgzNjE1MDI1NjM3MzAzLCJj -dXJzb3IiOjIyNTgyODExNzg2LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4MjgxMTc4NiwiY29tbWl0Ijp7InJldiI6IjNtcWEyeTJheWNsMnEiLCJvcGVy -YXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5yZXBvc3QiLCJya2V5IjoiM21xYTJ5MmFua3QycSIsInJlY29yZCI6eyIkdHlw -ZSI6ImFwcC5ic2t5LmZlZWQucmVwb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNzowNC40ODJaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVp -YTU0ZTRldG9iYTRyNDVrYXg3ZWZlNDdqNnU1aDd0b3NsZW1mNmNmYXhzN2xidzJvZnJmcSIsInVyaSI6ImF0Oi8vZGlkOnBsYzoyb3JzdWFicmRza2pwdWds -cHJ1NzdwbzIvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTdpNTI1YjdzMmcifSwidmlhIjp7ImNpZCI6ImJhZnlyZWljbmFmNGZ1ZDN2cWk2aWcyYzducm55N2g2 -ZnNvZjdxeXF1Z2VhNXlya2NpNmJ6M3RxM3FhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmxyYWVrZjJxZXJpNmQ0YWFpMm1samxhMi9hcHAuYnNreS5mZWVkLnJl -cG9zdC8zbXE3aWFrb3ZudTJoIn19LCJ6WTNvMmJqVTNkV04xY21sNFJtRjBPaTh2Wkdsa09uQnNZenBwYm5OdmJqVjVZbloxWjNGM2FHUnRhbmQ2Tlhwa2R6 -VXZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkNk5HeHRObVpyTW5ScFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNMU9qVTBMams1 -TkZvPSJ9fXsiZGlkIjoiZGlkOnBsYzpmNHoybmZ0Z3JuNzVoN2gzd3VjZHl6YWYiLCJ0aW1lX3VzIjoxNzgzNjE0OTU2NDIyOTU0LCJjdXJzb3IiOjIyNTgy -Nzc3NTYzLCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc3NzU2MywiY29tbWl0Ijp7InJldiI6IjNtcWEydnkzeWJ3MngiLCJvcGVyYXRpb24iOiJjcmVh -dGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwicmtleSI6IjNtcWEydnkzb2pnMngiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5m -ZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM1OjU2LjA2MVoiLCJsYW5ncyI6WyJuZSJdLCJ0ZXh0IjoiRGlnaXQ6IDUsNTcyLDgxMFxu -SW4gd29yZHM6IEZpdmUgTWlsbGlvbiBGaXZlIEh1bmRyZWQgU2V2ZW50eSBUd28gVGhvdXNhbmQgRWlnaHQgSHVuZHJlZCBUZW5cbuCkheCkmeCljeCkleCk -gyDgpavgpass4KWt4KWoLOClruClp+Clplxu4KSF4KSV4KWN4KS34KSw4KSDIOCkquCkmuCkquCkqOCljeKAjeCkqCDgpLLgpL7gpJYg4KSs4KS54KSk4KWN -4KSk4KSwIOCkueCknOCkvuCksCDgpIbgpKAg4KS44KSvIOCkpuCkuCJ9LCJjaWQiOiJiYWZ5cmVpYzJpM3F1YnFuYjRjYTc1aTNraWhzajVibWdnejJncGZ5 -N3RxcGw1a2Fha3plaTRuaGRmNCIsInJlY29yZF9jYm9yIjoicEdSMFpYaDBlT3RFYVdkcGREb2dOU3cxTnpJc09ERXdDa2x1SUhkdmNtUnpPaUJHYVhabElF -MXBiR3hwYjI0Z1JtbDJaU0JJZFc1a2NtVmtJRk5sZG1WdWRIa2dWSGR2SUZSb2IzVnpZVzVrSUVWcFoyaDBJRWgxYm1SeVpXUWdWR1Z1Q3VDa2hlQ2ttZUNs -amVDa2xlQ2tneURncGF2Z3Bhc3M0S1d0NEtXb0xPQ2xydUNscCtDbHBnciI6InAyUjBaWGgwZUZoSWJTQnViM2NnZDJoaGRDQm1hV3h0Y3lCa2FXUWdkMlVn -ZDJGMFkyZ2dkRzluWlhSb1pYSS9JRTlvSUhSb1lYUW5jeUJ5YVdkb2RDRUtiR1YwZEdWeVltOTRaQzVqYjIwdmQybG1aWE5qY21WbGJpOW1MaTR1WlNSMGVY -QmxjbUZ3Y0M1aWMydDVMbVpsWldRdWNHOXpkR1ZsYldKbFpLSmxKSFI1Y0dWM1lYQndMbUp6YTNrdVpXMWlaV1F1WlhoMFpYSnVZV3hvWlhoMFpYSnVZV3lr -WTNWeWFYZ3hhSFIwY0hNNkx5OXNaWFIwWlhKaWIzaGtMbU52YlM5M2FXWmxjMk55WldWdUwyWnBiRzB2Y0hWd2NIbG5hWEpzTDJWMGFIVnRZcVJqY21WbTJD -cFlKUUFCVlJJZ1NsK3JURGl3MVFKTU5wQXZnbDN0YW1NOVgxeTRHY2lkTURTNVA4KytIb0ZrYzJsNlpSb0FBVXlzWlNSMGVYQmxaR0pzYjJKb2JXbHRaVlI1 -Y0dWcWFXMWhaMlV2YW5CbFoyVjBhWFJzWlhnY1FTQnlaWFpwWlhjZ2IyWWdVSFZ3Y0hsbmFYSnNJQ2d5TURJMUtXdGtaWE5qY21sd2RHbHZibmpMVkdocGN5 -QjNZWE1nZEdobElHTnNiM05wYm1jZ1ptbHNiU0JoZENCVVNWUkZMaUJKSUhkbGJuUWdkRzhnZEdobElHRm1kR1Z5SUhCaGNuUjVJR0Z1WkNCaGNtMGdkM0ps -YzNSc1pXUWdaWFpsY25sdmJtVWdkMmh2SUhkaGN5QjNhV3hzYVc1bkxpQkpJRzExYzNRZ2FHRjJaU0IzY21WemRHeGxaQ0JoSUdSdmVtVnVJR1pwYkcxdFlX -dGxjbk1zSUdKMWRDQkpJR3RsY0hRZ2QybHVibWx1Wnk0Z1NTQmhjbTBnZDNKbGMzUnNaV1FnZEdobElIUnBkSFZzWVhJZ2NIVndjSGxuYVhJdUxpNWxiR0Z1 -WjNPQlltVnVaWEpsY0d4NW9tUnliMjkwb21OamFXUjRPMkpoWm5seVpXbGhkWFJ5YjJWNGVtNXRkSEEwYjJoaFl6SjZZWFI2YVcxeGFHWnRZMjExZEdabGQz -Rm5kR3R1YzJzMGRtVmlkWFYwZG1oaFkzVnlhWGhHWVhRNkx5OWthV1E2Y0d4ak9uaHVabk55ZEdZMWEyTXlielZ2ZHpKeGRHbDBhWEYzYmk5aGNIQXVZbk5y -ZVM1bVpXVmtMbkJ2YzNRdk0yMXhOM2xwZVdoeGVESXlhMlp3WVhKbGJuU2lZMk5wWkhnN1ltRm1lWEpsYVdOY21WcFpIQm1NbW95YzNONWVIQm5aWGhvY25s -NGRqUnVjR1UzYVd4dGJqTjJZM1JrYUhBemFYazFhV2hpWW1KMWF6ZHJkR3RvTkdOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwNGVXUmtjR2MyZFhOdFoyZ3lk -REpxWjJZMFpUTTNlV3N2WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZDVORGRxZG5Wek1uWnBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRF -Mk9qTTNPakF3TGpFek9Gbz0ifX17ImRpZCI6ImRpZDpwbGM6M3ZoN295ZXFkeWIzdG00bXJnd3M2ZWpsIiwidGltZV91cyI6MTc4MzYxNTA4NzIzNDc1MCwi -Y3Vyc29yIjoyMjU4Mjg0MTMwOSwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4NDEzMDksImNvbW1pdCI6eyJyZXYiOiIzbXFhMnp1eHVycjJmIiwib3Bl -cmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsInJrZXkiOiIzbXFhMnp1eGx5ajJmIiwicmVjb3JkIjp7IiR0eXBl -IjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozODowNy4wNjJaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZ3F6 -dGhkZHBtNzNqNGg0am01NXZoNW5yaTI0bXp2bGlzaDZoczZsNW1sZnhoNHJkNXllbSIsInVyaSI6ImF0Oi8vZGlkOnBsYzprdXZsMnl1eTJpa2huMmwyc3pz -dnh2eGEvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd4c3poNmQyMmcifX0sImNpZCI6ImJhZnlyZWloZmJpbmRqaWE0dXQzeTc3dHYza2ZwbXdkM3lwbXBobHRi -Z2l3NjdleTVuZ2Y3d3g3bW5lIiwicmVjb3JkX2Nib3IiOiJvMlVrZEhsd1pYSmhjSEF1WW5OcmVTNW1aV1ZrTG14cGEyVm5jM1ZpYW1WamRLSmpZMmxrZUR0 -aVlXWjVjbVZwWjNGNmRHaGtaSEJ0TnpOcU5HZzBhbTAxTlhab05XNXlhVEkwYlhwMmJHbHphRFpvY3pac05XMXNabmhvTkhKa05YbGxiV04xY21sNFJtRjBP -aTh2Wkdsa09uQnNZenByZFhac01ubDFlVEpwYTJodU1td3ljM3B6ZG5oMmVHRXZZWEJ3TG1KemEza3VabVZsWkM1d2IzTjBMek50Y1RkNGMzcG9oNnFjM3Nk -cGFsNXZxaCIsInRpbWVfdXMiOjE3ODM2MTQ5MDc1NDY3NTcsImN1cnNvciI6MjI1ODI3NTM2MzcsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzUzNjM3 -LCJjb21taXQiOnsicmV2IjoiM21xYTJ1ampjM3AyYiIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJy -a2V5IjoiM21xYTJ1aml5ZDcyYiIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzU6 -MDcuMjgyNDEyKzAwOjAwIiwic3ViamVjdCI6eyIkdHlwZSI6ImNvbS5hdHByb3RvLnJlcG8uc3Ryb25nUmVmIiwiY2lkIjoiYmFmeXJlaWFqdjJtM3ZnbzZt -YzJmdHVtdzR0dHNnYTM0eWxvcTVxbGxneXFwb3U2a3VocW9hbXV0dmUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dmY1cWh0ZWllZW82eW9sYWJzY3dtanc2L2Fw -cC5ic2t5LmZlZWQucG9zdC8zbXE3eHBkd2tpMjJ1In19LCJjaWQiOiJiYWZ5cmVpaHlza2Z4bHM3cXBsd21ia202dDU1NXJiYmoyZ2thZHRod3d0cnZ0dDI1 -b2p2MnlsaGx0bSIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xteHBhMlZuYzNWaWFtVmpkS05qWTJsa2VEdGlZV1o1Y21W -cFlXcDJNbTB6ZG1kdk5tMWpNbVowZFcxM05IUjBjMmRoTXpSNWJHOXhOWEZzYkdkNWNYQnZkVFpyZFdoeGIyRnRkWFIyWldOMWNtbDRSbUYwT2k4dlpHbGtP -bkJzWXpwMlpqVnhhSFJsYVdWbGJ6WjViMnhoWW5OamQyMXFkell2WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZDRjR1IzYTJreU1uVmxKSFI1Y0dW -NEdtTnZiUzVoZEhCeWIzUnZMbkpsY0c4dWMzUnliMjVuVW1WbWFXTnlaV0YwWldSQmRIZ2dNakF5Tmkwd055MHdPVlF4Tmpvek5Ub3dOeTR5T0RJME1USXJN -REE2TURBPSJ9fXsiZGlkIjoiZGlkOnBsYzpnNjI3dzVsMnBweW9pNTZpbjJmYXFiZ3ciLCJ0aW1lX3VzIjoxNzgzNjE1MDU0NzI1ODM3LCJjdXJzb3IiOjIy -NTgyODI1Mzg1LCJraTRHREl3TWpZdE1EY3RNRGxVTVRZNk16VTZOVGN1TXpVeVdnPT0ifX17ImRpZCI6ImRpZDpwbGM6c2Znb2l1eTVqdW5mMnRwdmpkcWQ2 -ejI0IiwidGltZV91cyI6MTc4MzYxNTAwOTczMDg0OCwiY3Vyc29yIjoyMjU4MjgwMjc0Mywia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MDI3NDMsImNv -bW1pdCI6eyJyZXYiOiIzbXFhMnhsMm14ajJ0Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsInJrZXki -OiIzbXFhMnhsMmY1ajJ0IiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0wOVQxNjozNjo0OS40 -MDdaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpaHQyaWV1cmhhNHM3bGl6NmN5azNmNDZsamc0dGI3dHZsa3FkMmFhYTViZWtsZmY0dmlheSIsInVyaSI6 -ImF0Oi8vZGlkOnBsYzpzM20zM3d2ZHNpeHhyMmlmbmtsZGxmcDMvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd6aTdkZHZzMmkifX0sImNpZCI6ImJhZnlyZWln -Y3VsN2E1cnF2am14cWVwM3Y0dWNqajdmcmlpb3I0bzZ1a2RzZGw0NmFvaW9jcG1wMnh1IiwicmVjb3JkX2Nib3IiOiJvMlVrZEhsd1pYSmhjSEF1WW5OcmVT -NW1aV1ZrTG14cGEyVm5jM1ZpYW1WamRLSmpZMmxrZUR0aVlXWjVjbVZwYUhReWFXVjFjbWhoTkhNM2JHbDZObU41YXpObU5EWnNhbWMwZEdJM2RIWnNhM0Zr -TW1GaFlUVmlaV3RzWm1ZMGRtbGhlV04xY21sNFJtRjBPaTh2Wkdsa09uQnNZenB6TTIwek0zZDJaSE5wZUhoeU1tbG1ibXRzWkd4bWNETXZZWEJ3TG1KemEz -a3VabVZsWkM1d2IzTjBMek50Y1RkNmFUZGtaSFp6TW1scFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNMk9qUTVMalF3TjFvPSJ9fXsiZGlk -IjoiZGlkOnBsYzptYXF4ZTRvYWc2eDdjYXhwbWs2NWlpbG8iLCJ0aW1lX3VzIjoxNzgzNjE0OTQzNDQ5OTE1LCJjdXJzb3IiOjIyNTgyNzcxMjQyLCJraW5k -IjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc3MTI0MiwiY29tTHpOdGNUZDZiR3cxYnpKek1tWnBZM0psWVhSbFpFRjBlQnN5TURJMkxUQTNMVEE1VkRFMk9qTTJP -alEyTGpBMk56azRPVm89In19eyJkaWQiOiJkaWQ6cGxjOjN1enBhNTNhMzJqcDNhc2hrM2xhemZlbCIsInRpbWVfdXMiOjE3ODM2MTQ5MTEyNTI4MDYsImN1 -cnNvciI6MjI1ODI3NTUyOTQsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzU1Mjk0LCJjb21taXQiOnsicmV2IjoiM21xYTJ1bXpubDcyYyIsIm9wZXJh -dGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJya2V5IjoiM21xYTJ1bXpmcjcyYyIsInJlY29yZCI6eyIkdHlwZSI6 -ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzU6MTAuOTI2WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWNhajZv -eW1lYmVsc3liYW9rcTV3YW1xZXhvMnYyYXVrbHUya2I1ZHAyM2VndGpkdDNjNTQiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZmIzcDRmZnV0anNmN2p1NTNwdmF3 -Zm96L2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3cW5od3hpazJ1In19LCJjaWQiOiJiYWZ5cmVpZWk3NmY2NHo1a2Y1dWJicjRnbW1ndm9ma3A1Z2dqMnpmb2t1 -YzZkZjI1bWV0ZmpvcG5nNCIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xteHBhMlZuYzNWaWFtVmpkS0pqWTJsa2VEdGlZ -V1o1Y21WcFkyRnFObTk1YldWaVpXeHplV0poYjJ0eE5YZGhiWEZsZUc4eWRqSmhkV3RzZFRKcllqVmtjREl6WldkMGFtUjBNMk0xTkdOMWNtbDRSbUYwT2k4 -dlpHbGtPbkJzWXpwbVlqTndOR1ptZFhScWMyWTNhblUxTTNCMllYZG1iM292WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZHhibWgzZUdsck1uVnBZ -M0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTFPakV3TGpreU5sbz0ifX17ImRpZCI6ImRpZDpwbGM6dW10dzQybHljeW10dDN6MnIyeTdkZTJy -IiwidGltZV91cyI6MTc4MzYxNTA0MTEyNjYxMSwiY3Vyc29yIjoyMjU4MjgxODk0MSwia2lkZ2F0ZSIsImFsbG93IjpbeyIkdHlwZSI6ImFwcC5ic2t5LmZl -ZWQudGhyZWFkZ2F0ZSNmb2xsb3dlclJ1bGUifSx7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC50aHJlYWRnYXRlI2ZvbGxvd2luZ1J1bGUifV0sImNyZWF0ZWRB -dCI6IjIwMjYtMDctMDlUMTY6Mzc6MTcuMjkyWiIsImhpZGRlblJlcGxpZXMiOltdLCJwb3N0IjoiYXQ6Ly9kaWQ6cGxjOnh5bDNhcG5la3RpN2J0eWRuZGdu -dnFiZS9hcHAuYnNreS5mZWVkLnBvc3QvM21xYTJ5YWs2ZTIyeSJ9LCJjaWQiOiJiYWZ5cmVpaGpsN2phbG42YWtyaXNxMzRhaHRvbnlxZmhtZGFpZGhsazYz -YW8yZ25yZmw0NG1jaGhkaSIsInJlY29yZF9jYm9yIjoicFdSd2IzTjBlRVpoZERvdkwyUnBaRHB3YkdNNmVIbHNNMkZ3Ym1WcmRHazNZblI1Wkc1a1oyNTJj -V0psTDJGd2NDNWljMnQ1TG1abFpXUXVjRzl6ZEM4emJYRmhNbmxoYXpabE1qSjVaU1IwZVhCbGVCaGhjSEF1WW5OcmVTNW1aV1ZrTG5Sb2NtVmhaR2RoZEdW -bFlXeHNiM2VDb1dVa2RIbHdaWGdsWVhCd0xtSnphM2t1Wm1WbFpDNTBhSEpsWVdSbllYUmxJMlp2Ykd4dmQyVnlVblZzWmFGbEpIUjVjR1Y0Sm1Gd2NDNWlj -MnQ1TG1abFpXUXVkR2h5WldGa1oyRjBaU05tYjJ4c2IzZHBibWRTZFd4bGFXTnlaV0YwWldSQmRIZ1lNakF5Tmkwd055MHdPVlF4Tmpvek56b3hOeTR5T1RK -YWJXaHBaR1JsYmxKbGNHeHBaWE9BIn19eyJkaWQiOiJkaWQ6cGxjOm1seGRveGhwMnpwdnZteTJobmh1Y2E3NSIsInRpbWVfdXMiOjE3ODM2MTQ5MjMzMjg3 -OTMsImN1cnNvciI6MjI1ODI3NjExMjMsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzYxMTIzLCJjb21taXQiOnsicmV2IjoiM21xYTJ1eWt4bnMybiIs -Im9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5ncmFwaC5mb2xsb3ciLCJya2V5IjoiM21xYTJ1eWtzcmsybiIsInJlY29yZCI6 -eyIkdHlwZSI6ImFwcC5ic2t5LmdyYXBoLmZvbGxvdyIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzU6MjUuNDkxWiIsImIzTjBMek50Y1Rkdk5HSnlk -M05qTW5kcFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNME9qVXpMak14TVZvPSJ9fXsiZGlkIjoiZGlkOnBsYzp3MnlkdmV2aXc1eGJreWp6 -Z3N2aXR0dGwiLCJ0aW1lX3VzIjoxNzgzNjE1MDYxMjQ3NjMzLCJjdXJzb3IiOjIyNTgyODI4NTQ1LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4MjgyODU0 -NSwiY29tbWl0Ijp7InJldiI6IjNtcWEyejN0YWQzMnAiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwi -cmtleSI6IjNtcWEyejNzeWozMnAiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM3 -OjQxLjE1MVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlneWRlNXFsNmNobHZzYWNrejZ3dWYyNTdxazYzaHpnNDNjZWs3ZnBoa3Bpc3AyNHdmY3JhIiwi -dXJpIjoiYXQ6Ly9kaWQ6cGxjOnFna3A1dzJvZDVwbHR1a2o2YWF0aXUyYy9hcHAuYnNreS5mZWVkLnBvc3QvM21xN3cyYnNqbWsycCJ9fSwiY2lkIjoiYmFm -eXJlaWZ2dGlkaW1xc3Jqd3R1dnp6N242bG1scGN6a3pqb3NkdWZoeTR4aG9rdm82cmdzeG12eWkiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZ -bk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBaM2xrWlRWeGJEWmphR3gyYzJGamEzbzJkM1ZtTWpVM2NXczJNMmg2WnpR -elkyVnJOMlp3YUd0d2FYTndNalIzWm1OeVlXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6cHhaMnR3TlhjeWIyUTFjR3gwZFd0cU5tRmhkR2wxTW1NdllYQndM -bUp6YTNrdVptVmxaQzV3YjNOMEx6TnRjVGQzTW1KemFtMXJNbkJwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0zT2pReExqRTFNVm89In19 -eyJkaWQiOiJkaWQ6cGxjOm83ZTR2eGNiYXZiZWI0cXlyYXNjN3Q1NiIsInRpbWVfdXMiOjE3ODM2MTQ4OTMxMjY3OTksImN1cnNvciI6MjI1ODI3NDY4NTEs -ImtpdCI6IjIwMjYtMDctMDlUMTY6MzU6NDQuMjAzWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWZ0a3BiNnYycXhrZmhpZGRoZTNrNjJsb2g2a3VmbWs2 -ZHdkYTd2NGNqajUzanVqcjc0d3EiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bng3em52b2V4N2V2M3djeG4zdGlwb3ZtL2FwcC5ic2t5LmZlZWQucG9zdC8zbXE3 -dW13Z2dvazJrIn0sInZpYSI6eyJjaWQiOiJiYWZ5cmVpYnIzemZzdWdpcXRpNHZta3p2ZzU0anRoNDZtdnhmdm4yc2J1ZHd5a3QzbGh5dWFjNnJyYSIsInVy -aSI6ImF0Oi8vZGlkOnBsYzphdTJ0aTVqZnNtcjZieGZyNmFrbmxuZHUvYXBwLmJza3kuZmVlZC5yZXBvc3QvM21xYTJzd2hvb20yMiJ9fSwiY2lkIjoiYmFm -eXJlaWUybjJ4d2dxZnV4eGgyaWl1eTZncTZhcWMydnVwa2l3Z3NyYjd1aGhiemFobTU3bnNiM3EiLCJyZWNvcmRfY2JvciI6InBHTjJhV0dpWTJOcFpIZzdZ -bUZtZVhKbGFXSnlNM3BtYzNWbmFYRjBhVFIyYld0NmRtYzFOR3AwYURRMmJYWjRablp1TW5OaWRXUjNlV3QwTTJ4b2VYVmhZelp5Y21GamRYSnBlRWhoZERv -dkwyUnBaRHB3YkdNNllYVXlkR2sxYW1aemJYSTJZbmhtY2paaGEyNXNibVIxTDJGd2NDNWljMnQ1TG1abFpXUXVjbVZ3YjNOMEx6TnRjV0V5YzNkb2IyOXRN -akpsSkhSNWNHVjBZWEJ3TG1KemEza3VabVZsWkM1eVpYQnZjM1JuYzNWaWFtVmpkS0pqWTJsa2VEdGlZV1o1Y21WcFpuUnJjR0kyZGpKeGVHdG1hR2xrWkdo -bE0yczJNbXh2YURacmRXWnRhelprZDJSaE4zWTBZMnBxTlROcWRXcHlOelIzY1dOMWNtbDRSbUYwT2k4dlpHbGtPbkJzWXpwdWVEZDZiblp2WlhnM1pYWXpk -Mk40YmpOMGFYQnZkbTB2WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUZDFiWGRuWjI5ck1tdHBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRF -Mk9qTTFPalEwTGpJd00xbz0ifX17ImRpZCI6ImRpZDpwbGM6cHdlaW00eGltdzYydXZwNXdpZjZpcTNhIiwidGltZV91cyI6MTc4MzYxNDk1ODUyODQ0MSwi -Y3Vyc29yIjoyMjU4Mjc3ODUzMywia2kzTjBMek50Y1RWeWRtcHdZbkF5TWpacFkzSmxZWFJsWkVGMGVCZ3lNREkyTFRBM0xUQTVWREUyT2pNMk9qTXdMakk0 -T0ZvPSJ9fXsiZGlkIjoiZGlkOnBsYzp4enVleTVkZXZ0b3Fpbno2bW4zNndncTMiLCJ0aW1lX3VzIjoxNzgzNjE1MDIyODEwOTAwLCJjdXJzb3IiOjIyNTgy -ODA4OTQ1LCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4MjgwODk0NSwiY29tbWl0Ijp7InJldiI6IjNtb2Q1NjR5azNyMmkiLCJvcGVyYXRpb24iOiJjcmVh -dGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNscm0yY2p6amVpMmUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5m -ZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI1LTA2LTE0VDIyOjU1OjU4LjYyNVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlieXF0aGJpcWZ2d3Y0dGh2 -YTNlc2h3YXVuNGhrNWMyZXA1aWluMjRhNnl3cXU2aHUzaWtpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjZrbTUzZXZtM3N4bWZwaHpzZzNicmR0bi9hcHAuYnNr -eS5mZWVkLnBvc3QvM2xybGF1cXRya2syaiJ9fSwiY2lkIjoiYmFmeXJlaWRpenJhaGdycHV1eHg1c3B4ZW52aXlodHFpN2s1bGo3YWhhY3M3NTNjeW55ZHgy -ZTRxamkiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpXVmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBZbmx4 -ZEdoaWFYRm1kbmQyTkhSb2RtRXpaWE5vZDJGMWJqUm9helZqTW1Wd05XbHBiakkwWVRaNWQzRjFObWgxTTJscmFXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6 -bzJhMjAxTTJWMmJUTnplRzFtY0doNmMyY3pZbkprZEc0dllYQndMbUp6YTNrdVptVmxaQzV3YjNOMEx6TnNjbXhoZFhGMGNtdHJNbXBwWTNKbFlYUmxaRUYw -ZUJneU1ESTFMVEEyTFRFMFZESXlPalUxT2pVNExqWXlOVm89In19eyJkaWQiOiJkaWQ6cGxjOnd4YmtxaTJqNGdhd2s1NHVxMm0za2lldiIsInRpbWVfdXMi -OjE3ODM2MTUwMjkzMzM4NTAsImN1cnNvciI6MjI1ODI4MTM4MzIsImtpblRZNk16UTZOVFV1TURjeFdnPT0ifX17ImRpZCI6ImRpZDpwbGM6YWE2bHNzZWhq -Y3UzbXNpeDJvampwdGZhIiwidGltZV91cyI6MTc4MzYxNTA1Mzg5MTQ0MCwiY3Vyc29yIjoyMjU4MjgyNDk1OCwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1 -ODI4MjQ5NTgsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnl2NGJjbzI3Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQu -cG9zdCIsInJrZXkiOiIzbXFhMnl1enB2YzI3IiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wNy0w -OVQxNjozNzozMy42MThaIiwiZW1iZWQiOnsiJHR5cGUiOiJhcHAuYnNreS5lbWJlZC5leHRlcm5hbCIsImV4dGVybmFsIjp7ImRlc2NyaXB0aW9uIjoiIiwi -dGl0bGUiOiJGYWNlYm9vayIsInVyaSI6Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZS9yLzE5M1V5cFNDYXcvP21pYmV4dGlkPXd3WElmciJ9fSwi -ZmFjZXRzIjpbeyJmZWF0dXJlcyI6W3siJHR5cGUiOiJhcHAuYnNreS5yaWNodGV4dC5mYWNldCNsaW5rIiwidXJpIjoiaHR0cHM6Ly93d3cuZmFjZWJvb2su -Y29tL3NoYXJlL3IvMTkzVXlwU0Nhdy8/bWliZXh0aWQ9d3dYSWZyIn1dLCJpbmRleCI6eyJieXRlRW5kIjozMiwiYnl0ZVN0YXJ0IjowfX1dLCJsYW5ncyI6 -WyJlbiJdLCJ0ZXh0Ijoid3d3LmZhY2Vib29rLmNvbS9zaGFyZS9yLzE5M1UuLi4ifSwiY2lkIjoiYmFmeXJlaWF4bXp2MmRrMmR2aGd3NHE2YzdnNDV2YWpt -cjRtZWl5cDJrYW9kbXBlbmRlam1jam43aGEiLCJyZWNvcmRfY2JvciI6InBtUjBaWGgwZUNCM2QzY3VabUZqWldKdmIyc3VZMjl0TDNOb1lYSmxMM0l2TVRr -elZTNHVMbVVrZEhsd1pYSmhjSEF1WW5OcmVTNW1aV1ZrTG5CdmMzUmxaVzFpWldTaVpTUjBlWEJsZDJGd2NDNWljMnQ1TG1WdFltVmtMbVY0ZEdWeWJtRnNh -R1Y0ZEdWeWJtRnNvMk4xY21sNFBHaDBkSEJ6T2k4dmQzZDNMbVpoWTJWaWIyOXJMbU52YlM5emFHRnlaUzl5cmVTNW1aV1ZrTG5Sb2NtVmhaR2RoZEdWbFlX -eHNiM2VCb1dVa2RIbHdaWGdtWVhCd0xtSnphM2t1Wm1WbFpDNTBhSEpsWVdSbllYUmxJMlp2Ykd4dmQybHVaMUoxYkdWcFkzSmxZWFJsWkVGMGVCZ3lNREky -TFRBM0xUQTVWREUyT2pNM09qSXdMakl4TUZwdGFHbGtaR1Z1VW1Wd2JHbGxjNEE9In19eyJkaWQiOiJkaWQ6cGxjOm9yZnNjb3dod3lqbGU3enR6bWZma2Fu -biIsInRpbWVfdXMiOjE3ODM2MTUwMDU5Mjg2OTcsImN1cnNvciI6MjI1ODI4MDA4ODksImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODAwODg5LCJjb21t -aXQiOnsicmV2IjoiM21xYTJ4aDZhZjUyZiIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJya2V5Ijoi -M21xYTJ4Z2l5YWsyeSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzY6NDQuODM0 -WiIsImxhbmdzIjpbImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpZHBmMmoyc3N5eHBnZXhocnl4djRucGU3aWxtbjN2Y3RkaHAzaXk1 -aWhiYmJ1azdrdGtoNCIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4eWRkcGc2dXNtZ2gydDJqZ2Y0ZTM3eWsvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd5NDdqdnVz -MnYifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpZHBmMmoyc3N5eHBnZXhocnl4djRucGU3aWxtbjN2Y3RkaHAzaXk1aWhiYmJ1azdrdGtoNCIsInVyaSI6ImF0 -Oi8vZGlkOnBsYzp4eWRkcGc2dXNtZ2gydDJqZ2Y0ZTM3eWsvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd5NDdqdnVzMnYifX0sInRleHQiOiJVbmNvbi1Eb24i -fSwiY2lkIjoiYmFmeXJlaWRlbXZ3Y3Y1bmRvN2FkMzRtZmdvaXdtcWNjeDZzajZja2MzdG5hNjNvcDRndnN4enNiNm0iLCJyZWNvcmRfY2JvciI6InBXUjBa -WGgwYVZWdVkyOXVMVVJ2Ym1Va2RIbHdaWEpoY0hBdVluTnJlUzVtWldWa0xuQnZjM1JsYkdGdVozT0JZbVZ1WlhKbGNHeDVvbVJ5YjI5MG9tTmpjYm5obHZt -cjVkdGNqd3N6NmxucmV3cjJjYzR0ajVvcXRoYmRmYzdhbSIsInVyaSI6ImF0Oi8vZGlkOnBsYzo0a3lwNGFod3h1cjVtNmVkZ2c2empob2YvYXBwLmJza3ku -ZmVlZC5yZXBvc3QvM21xYTJvY3hkdXQyNCJ9fSwiY2lkIjoiYmFmeXJlaWh2Y3E2YmxpeHM0ZGhpa3ZveGtmM2tzdmp0NWNucmNzaDVhaHZncXJidGxiczR1 -d3NjdHEiLCJyZWNvcmRfY2JvciI6InBHTjJhV0dpWTJOcFpIZzdZbUZtZVhKbGFXVm9iR3R3ZHpONllqUjNZMkp1YUd4MmJYSTFaSFJqYW5kemVqWnNibkps -ZDNJeVkyTTBkR28xYjNGMGFHSmtabU0zWVcxamRYSnBlRWhoZERvdkwyUnBaRHB3YkdNNk5HdDVjRFJoYUhkNGRYSTFiVFpsWkdkbk5ucHFhRzltTDJGd2ND -NWljMnQ1TG1abFpXUXVjbVZ3YjNOMEx6TnRjV0V5YjJONFpIVjBNalJsSkhSNWNHVjBZWEJ3TG1KemEza3VabVZsWkM1eVpYQnZjM1JuYzNWaWFtVmpkS0pq -WTJsa2VEdGlZV1o1Y21WcFpEUTFNMlpyZUdOeFoyeG1lV1J6Y0dsMlltdG1lSG8xY25CNGNUVjROWFJoYUhCaU0zTmxlV1pzTm01aGN6VnZNemR4WVdOMWNt -bDRSbUYwT2k4dlpHbGtPbkJzWXpveWRIRjVkVzV4TjNodGRtSnVOV1JrWVRSeGFtVjNNblF2WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wTHpOdGNUWmxjMjUz -TkhKck1tSnBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTNPalEwTGpnd05sbz0ifX17ImRpZCI6ImRpZDpwbGM6amhwNnA3Y2l6bm9iamMy -NGJudGM0NjJxIiwidGltZV91cyI6MTc4MzYxNTA4OTQ5Mjk0NSwiY3Vyc29yIjoyMjU4Mjg0MjM5Niwia2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4NDIz -OTYsImNvbW1pdCI6eyJyZXYiOiIzbXBvbzZoaXpzZTJlIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIs -InJrZXkiOiIzbHhwM29saWRsazJiIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNS0wOC0zMVQxMjoy -OTo0NC45MzhaIiwiczY3NjIsImN1cnNvciI6MjI1ODI3NTAxNjEsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyNzUwMTYxLCJjb21taXQiOnsicmV2Ijoi -M21xYTJ1Y2tnZDYyNCIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJya2V5IjoiM21xYTJ1Y2FmZ3My -MyIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzQ6NTkuNjk2WiIsImxhbmdzIjpb -ImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpZ2Jkd3VzM3h3Y3g1ZWI3ZG0yN3ZjZGJ2M29iaW96NHRrbHBhdnh0Y2ViN2Nhc2pqcXJ2 -eSIsInVyaSI6ImF0Oi8vZGlkOnBsYzo1bzMyenh5c2VtdHBrcTQ2d3lueHI0ZHAvYXBwLmJza3kuZmVlZC5wb3N0LzNtcWEycW92a3lrMngifSwicm9vdCI6 -eyJjaWQiOiJiYWZ5cmVpYjNtamZ1aDM3MmEycjNoM2NmcmNyYWl2bDVvd2o2M3RxNmRxb3JmaGd1dHlsN2hpNWV1NCIsInVyaSI6ImF0Oi8vZGlkOnBsYzpr -cjUzY2FtampvMnJtemJ4cm83endjaHQvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd6Y3hoZmtzMjMifX0sInRleHQiOiJ5ZXNzcyBpdHMgbXkgY2FsbSBicmFp -biBvZmYgZ2FtZSBmb3Igc3VyZSAhISEifSwiY2lkIjoiYmFmeXJlaWg0ZGI3bjdvdHp1ZXE3bjdhdW5leXJjZXI0bnVocGtmenoybmNsdmJ5bXEzNW42amRp -ZTQiLCJyZWNvcmRfY2JvciI6InBXUjBaWGgwZUMxNVpYTnpjeUJwZEhNZ2JYa2dZMkZzYlNCaWNtRnBiaUJ2Wm1ZZ1oyRnRaU0JtYjNJZ2MzVnlaU0FoSVNG -bEpIUjVjR1Z5WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wWld4aGJtZHpnV0psYm1WeVpYQnNlYUprY205dmRLSmpZMmxrZUR0aVlXWjVjbVZwWWpOdGFtWjFh -RE0zTW1FeWNqTm9NMk5tY21OeVlXbDJiRFZ2ZDJvMk0zUnhObVJ4YjNKbWFHZDFkSGxzTjJocE5XVjFOR04xY21sNFJtRjBPaTh2Wkdsa09uQnNZenByY2pV -elkyRnRhbXB2TW5KdGVtSjRjbTgzZW5kamFIUXZZWEJ3amdyWGpnN1BqZzVmamc2c0s1WVdvNWJtMDZiMmlMMEUxTHpVMFVBcmpnWVRqZ1kvamdhVGpnWXZq -Z1lyb3FiSG9xYkRqZ29IamdiN2pnWmZqZ1ovd240NkJDdW1GcXVpK3N1V3V0dU9CcnVlTGd1T0JtT09CbGVPQ2srT0JxT09CaytPQmh1T0JsK09CcnVpQm9l -T0J2K09CaitPQ2srT0JydU9CdStPQnJ1T0J2T09CcmlqdnZKOHA0NEdxNDRHSzZLbXg0NEduNDRHWjhKK1FoQW9LTVREbW5wcm5sTHZsZzQvb3ZJbmpnWnZq -Z296amdvdmpnYTducFo1bEpIUjVjR1Z5WVhCd0xtSnphM2t1Wm1WbFpDNXdiM04wWldWdFltVmtvbVVrZEhsd1pYWmhjSEF1WW5OcmVTNWxiV0psWkM1bllX -eHNaWEo1WldsMFpXMXppYVJqWVd4MFlHVWtkSGx3WlhnY1lYQndMbUp6YTNrdVpXMWlaV1F1WjJGc2JHVnllU05wYldGblpXVnBiV0ZuWmFSamNtVm0yQ3BZ -SlFBQlZSSWdUUENESlFHczFidDdhZDRSRjErQlgxWXNGKzc2WHRQU3lWWXpHckcwZGNSa2MybDZaUm9BQ2FzL1pTUjBlWEJsWkdKc2IySm9iV2x0WlZSNWNH -VnFhVzFoWjJVdmFuQmxaMnRoYzNCbFkzUlNZWFJwYjZKbGQybGtkR2daQXlCbWFHVnBaMmgwR1FSOXBHTmhiSFJnWlNSMGVYQmxlQnhoY0hBdVluTnJlUzVs -YldKbFpDNW5ZV3hzWlhKNUkybHRZV2RsWldsdFlXZGxwR055WldiWUtsZ2xBQUZWRWlEdEFRK3JyTUdlMGNCVjJSUVZncW1vWGFhMFFYdXJobnppSXlIRHVR -cW5HbVJ6YVhwbEdnQUNnbDlsSkhSNWNHVmtZbXh2WW1odGFXMWxWSGx3WldwcGJXRm5aUzlxY0dWbmEyRnpjR1ZqZEZKaGRHbHZvbVYzYVdSMGFCa0RJR1pv -WldsbmFIUVpCRytrWTJGc2RHQmxKSFI1Y0dWNEhHRndjQzVpYzJ0NUxtVnRZbVZrTG1kaGJHeGxjbmtqYVcxaFoyVmxhVzFoWjJXa1kzSmxadGdxV0NVQUFW -VVNJSE90T2RSV3oxVlAvTmZmNXV4K3FEZndiT1hrTFJtOEFRWlZNWkh0NjBQNVpITnBlbVVhQUFiZ20yVWtkSGx3WldSaWJHOWlhRzFwYldWVWVYQmxhbWx0 -WVdkbEwycHdaV2RyWVhOd1pXTjBVbUYwYVcraVpYZHBaSFJvR1FNZ1ptaGxhV2RvZEJrRWJtcTd1cjdvb2dzMnoifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVp -ZGNrdG83bTdrdGRpMnozdGhmNDRpZWRtbzI1emxweW90amI1emo1NmZkdTZvZWh5eWh0ZSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4NGc0bGF4a21zcmN6d3Zu -dmJiZ3NtN2cvYXBwLmJza3kuZmVlZC5wb3N0LzNtcTd1cjdvb2dzMnoifX0sInRleHQiOiJXZSBuZWVkIEJPTEQgcmlnaHQgbm93LiJ9LCJjaWQiOiJiYWZ5 -cmVpaGt0NjZ2bHZxdjJrdmllNDU1YWNmemJnaGJxNjd1Z3lsa29hYWRweXMyMmR2NXFoa2x1YSIsInJlY29yZF9jYm9yIjoicFdSMFpYaDBkMWRsSUc1bFpX -UWdRazlNUkNCeWFXZG9kQ0J1YjNjdVpTUjBlWEJsY21Gd2NDNWljMnQ1TG1abFpXUXVjRzl6ZEdWc1lXNW5jNEZpWlc1bGNtVndiSG1pWkhKdmIzU2lZMk5w -WkhnN1ltRm1lWEpsYVdSamEzUnZOMjAzYTNSa2FUSjZNM1JvWmpRMGFXVmtiVzh5Tlhwc2NIbHZkR3BpTlhwcU5UWm1aSFUyYjJWb2VYbG9kR1ZqZFhKcGVF -WmhkRG92TDJScFpEcHdiR002ZURSbk5HeGhlR3R0YzNKamVuZDJiblppWW1kemJUZG5MMkZ3Y0M1aWMydDVMbVpsWldRdWNHOXpkQzh6YlhFM2RYSTNiMjlu -Y3pKNlpuQmhjbVZ1ZEtKalkybGtlRHRpWVdaNWNtVnBaR05yZEc4M2JUZHJkR1JwTW5vemRHaG1ORFJwWldSdGJ6STFlbXh3ZVc5MGFtSTFlbW8xTm1aa2RU -WnZaV2g1ZVdoMFpXTjFjbWw0Um1GME9pOHZaR2xrT25Cc1l6cDROR2MwYkdGNGEyMXpjbU42ZDNadWRtSmlaM050TjJjdllYQndMbUp6YTNrdVptVmxaQzV3 -YjNOMEx6TnRjVGQxY2pkdmIyZHpNbnBwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0xT2pBMkxqUTVOVm89In19eyJkaWQiOiJkaWQ6cGxj -OnR0Mm1pZDN3aXkzZWxkemZpM2NsdHllaCIsInRpbWVfdXMiOjE3ODM2MTUwMTQ4MjY5OTQsImN1cnNvciI6MjI1ODI4MDUxMTQsImtpbmQiOiJjb21taXQi -LCJzZXEiOjIyNTgyODA1MTE0LCJjb21taXQiOnsicmV2IjoiM21xYTJ4cHZvMnkyYyIsIm9wZXJhdGlvbiI6ImRlbGV0ZSIsIkhsd1pYZ2JZWEJ3TG1KemEz -a3VjbWxqYUhSbGVIUXVabUZqWlhRamRHRm5vbVZwYm1SbGVLSm5ZbmwwWlVWdVpCaldhV0o1ZEdWVGRHRnlkQmpGYUdabFlYUjFjbVZ6Z2FKamRHRm5jRk4x -Y0hCdmNuUkpibVJwWlVacGJHMWxKSFI1Y0dWNEcyRndjQzVpYzJ0NUxuSnBZMmgwWlhoMExtWmhZMlYwSTNSaFo2SmxhVzVrWlhpaVoySjVkR1ZGYm1RWTRt -bGllWFJsVTNSaGNuUVkxMmhtWldGMGRYSmxjNEdpWTNSaFoycEdhV3h0YldGcmFXNW5aU1IwZVhCbGVCdGhjSEF1WW5OcmVTNXlhV05vZEdWNGRDNW1ZV05s -ZENOMFlXZWlaV2x1WkdWNG9tZGllWFJsUlc1a0dPMXBZbmwwWlZOMFlYSjBHT05vWm1WaGRIVnlaWE9Cb21OMFlXZHBSbWxzYlcxaGEyVnlaU1IwZVhCbGVC -dGhjSEF1WW5OcmVTNXlhV05vZEdWNGRDNW1ZV05sZENOMFlXZHBZM0psWVhSbFpFRjBlQmd5TURJMkxUQTNMVEE1VkRFMk9qTTRPakEzTGpnNE5sbz0ifX17 -ImRpZCI6ImRpZDpwbGM6eTZsdXNkbGlkZm15ZXlqaGQybGVhaXRtIiwidGltZV91cyI6MTc4MzYxNTA3ODUzMzk5OSwiY3Vyc29yIjoyMjU4MjgzNjg1Nywi -a2luZCI6ImNvbW1pdCIsInNlcSI6MjI1ODI4MzY4NTcsImNvbW1pdCI6eyJyZXYiOiIzbXFhMnptbnB1cTI0Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwiY29s -bGVjdGlvbiI6ImFwcC5ic2t5LmdyYXBoLmJsb2NrIiwicmtleSI6IjNtcWEyem1uaXp5MjQiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5ncmFwaC5i -bG9jayIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlUMTY6Mzc6NTUuNDg0WiIsInN1YmplY3QiOiJkaWQ6cGxjOmRjNnlwcXNiZTZ6aWNnZjNkNmhrbjVxZSJ9 -LCJjaWQiOiJiYWZ5cmVpY2oyYXhiM2tnYmFoZ2p1amZsa3RrM3JvMmRicWt4cm5uNzRsdHZwa2x2cXd4b3QzaHZkcSIsInJlY29yZF9jYm9yIjoibzJVa2RI -bHdaWFJoY0hBdVluTnJlUzVuY21Gd2FDNWliRzlqYTJkemRXSnFaV04wZUNCa2FXUTZjR3hqT21Sak5ubHdjWE5pWlRaNmFXTm5aak5rTm1ocmJqVnhaV2xq -Y21WaE5tcHpNakpwWTNKbFlYUmxaRUYwZUJneU1ESTJMVEEzTFRBNVZERTJPak0zT2pNNExqVTROVm89In19eyJkaWQiOiJkaWQ6cGxjOmhlNDJtM2o1Y21m -enNiNHpjNnlieTd4dCIsInRpbWVfdXMiOjE3ODM2MTQ5OTY3Mjg2NjksImN1cnNvciI6MjI1ODI3OTY1OTgsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgy -Nzk2NTk4LCJjb21taXQiOnsicmV2IjoiM21xYTJ4NXgyNmEyZSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnBv -c3QiLCJya2V5IjoiM21xYTJ3emFtNjIydSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMDlU -MTY6MzY6MzAuOTE1WiIsImVtYmVkIjp7IiR0eXBlIjoiYXBwLmJza3kuZW1iZWQuaW1hZ2VzIiwiaW1hZ2VzIjpbeyJhbHQiOiJFY2hpbmFjZWEgQmzDvHRl -IGltIEdyw7xuZW4uIEFsbGVyZGluZ3MgaXN0IGRpZXNlIEJsw7x0ZSBhbiBpaHJlbiB2aW9sZXR0ZW4gU3BpdHplbiB2ZXJ0cm9ja25ldCBvZGVyIHZlcmJy -YW5udC4iLCJhc3BlY3RSYXRpbyI6eyJoZWlnaHQiOjIwNDgsIndpZHRoIjoxMzY1fSwiaW1hZ2UiOnsiJHR5cGUiOiJibG9iIiwibWltZVR5cGUiOiJpbWFn -ZS9qcGVnIiwicmVmIjp7IiRsaW5rIjoiYmFma3JlaWd3d2tmc2Zwc2s2djNhd3BibDR3ZG5rcmU1Zmt0bzJmc3JvNHZsZ2hrbjd5NnBvemxsbXkifSwic2l6 -ZSI6MTg1MDc4NH19XX0sImZhY2V0cyI6W3siZmVhdHVyZXMiOlt7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFjZXQjdGFnIiwidGFnIjoiYmxvb21z -Y3JvbGxpbmcifV0sImluZGV4Ijp7ImJ5dGVFbmQiOjI3LCJieXRlU3RhcnQiOjEyfX1dLCJsYW5ncyI6WyJkZSJdLCJ0ZXh0IjoiU3RpbGwgYWxpdmVcbiNi -bG9vbXNjcm9sbGluZyJ9LCJjaWQiOiJiYWZ5cmVpZXRkYjRhams0MnJobnQ2Z3ZuYXRrbWF0d2NsdTNiMzRvY3ZsejQ3anFyZ3FrN2Q0NHFubSIsInJlY29y -ZF9jYm9yIjoicG1SMFpYaDBlQnRUZEcydDVMbVpsWldRdWNtVndiM04wTHpOdGNXRXlkbnB3WW5kb01tSmxKSFI1Y0dWeVlYQndMbUp6YTNrdVptVmxaQzVz -YVd0bFozTjFZbXBsWTNTaVkyTnBaSGc3WW1GbWVYSmxhV0ZyTnpRMloyVnZiak5yZG5CblpUVnphMmw1Tm5Sd2MySm5jV1pqYW1odmRITTFhMkV5WjNabGIy -MWxaelUxYjJoMGRIRmpkWEpwZUVaaGREb3ZMMlJwWkRwd2JHTTZaV3BwYUd4a05ITjVkM1oyY1hkbE5qZGpaR3R1TkdweEwyRndjQzVpYzJ0NUxtWmxaV1F1 -Y0c5emRDOHpiWEUzZERKaU56TjZNako1YVdOeVpXRjBaV1JCZEhnWU1qQXlOaTB3Tnkwd09WUXhOam96Tmpvd09TNHdOVGhhIn19eyJkaWQiOiJkaWQ6cGxj -OnQzbmN0eHg2cWZ0cWFoNnhtajYyZGJ0YSIsInRpbWVfdXMiOjE3ODM2MTQ5MzY2NDIyMzksImN1cnNvciI6MjI1ODI3Njc4NzAsImtpbmQiOiJjb21taXQi -LCJzZXEiOjIyNTgyNzY3ODcwLCJjb21taXQiOnsicmV2IjoiM21xYTJ2ZmNzb3AybCIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAu -YnNreS5ncmFwaC5mb2xsb3ciLCJya2V5IjoiM21xYTJ2ZmNwcXgybCIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmdyYXBoLmZvbGxvdyIsImNyZWF0 -ZWRBdCI6IjIwMjYtMDctMDlUMTY6MzU6MzYuMTU3WiIsInN1YmplY3QiOiJkaWQ6cGxjOmw2eDVmaGpyMm15YnliMzJwYjdpcnczayJ9LCJjaWQiOiJiYWZ5 -cmVpYWI1NWd4dzN5ZnFwbzJqaXh6bnZoZzU2aGY0bWZyM213c2VzY3Bia3lvY3d6ZzIycGt6NCIsInJlY29yZF9jYm9yIjoibzJVa2RIbHdaWFZoY0hBdVlu -TnJlUzVuY21Gd2FDNW1iMnhzYjNkbmMzVmlhbVZqZEhnZ1pHbGtPbkJzWXpwc05uZzFabWhxY2pKdGVXSjVZak15Y0dJM2FYSjNNMnRwWTNKbFlYUmxaRUYw -ZUJneU1ESTJMVEEzTFRBNVZERTJPak0xT2pNMkxqRTFOMW89In19eyJkaWQiOiJkaWQ6cGxjOnh6dWV5NWRldnRvcWluejZtbjM2d2dxMyIsInRpbWVfdXMi -OjE3ODM2MTUwMjI4MTA5MDAsImN1cnNvciI6MjI1ODI4MDg3NjQsImtpbldWa0xuSmxjRzl6ZEdkemRXSnFaV04wb21OamFXUjRPMkpoWm5seVpXbG5lbWxu -Y1dkbWFUSmxkWGN5TjNCMGMzbHBZbmx5YWpOcllYQTFhbkEwZEhObE0yeHdkSGRqZERkak5IYzJNblpwWlc5cFkzVnlhWGhHWVhRNkx5OWthV1E2Y0d4ak9q -SnVjWGhwTm5RMVkycDNNbVkxZFhacGRHOWhOWHBoZUM5aGNIQXVZbk5yZVM1bVpXVmtMbkJ2YzNRdk0yMXhOek50WldOeWFHc3ljMmxqY21WaGRHVmtRWFI0 -R0RJd01qWXRNRGN0TURsVU1UWTZNemM2TVRjdU16a3hXZz09In19eyJkaWQiOiJkaWQ6cGxjOmU2djYybzI1YWhxN2NpNnNqdXZwdGN1dyIsInRpbWVfdXMi -OjE3ODM2MTUwODAyMzA2MjgsImN1cnNvciI6MjI1ODI4Mzc4MTcsImtpbmQiOiJjb21taXQiLCJzZXEiOjIyNTgyODM3ODE3LCJjb21taXQiOnsicmV2Ijoi -M21xYTJ6bzNyYmIycyIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnJlcG9zdCIsInJrZXkiOiIzbXFhMnpvM2po -YjJzIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5yZXBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM3OjU5LjY3MFoiLCJzdWJq -ZWN0Ijp7ImNpZCI6ImJhZnlyZWljemljanZmNHo1Z2IydXhjZG0zYmppcnhjYjZ4eTJib2gybzN3YmZrdGVxZWRoa3RkZXJxIiwidXJpIjoiYXQ6Ly9kaWQ6 -cGxjOnhteG9jdnVlM3ZsdWxxYjJodm8zbnlmaC9hcHAuYnNreS5mZWVkLnBvc3QvM21xNXZ1anJsMzIyZSJ9LCJ2aWEiOnsiY2lkIjoiYmFmeXJlaWF6eG9m -djRtdzVyeHByb25xYjJydzJja3l4dnB6eHJidGY1NG02ZTVpNmF0c2VzdDVhM2EiLCJ1cmkiOiJhdDovL2RpZDpwbGM6M3dxZTZ4d292YnM1NzJoM2w0ZmRp -YWJpL2FwcC5ic2t5LmZlZWQucmVwb3N0LzNtcWEyeTZsbXh0MjcifX0sImNpZCI6ImJhZnlyZWloNXRldWE2dnd3bWVzcnNqeGp0N3c0YmxodmR2cHNlMnpm -cjdtdHBmNGRhY2pjYmlrNGJ5IiwicmVjb3JkX2Nib3IiOiJwR04yYVdHaVkyTnBaSGc3WW1GbWVYSmxhV0Y2R2h5ZERjM2JYUnBiWGxqZFhKcGVFWmhkRG92 -TDJScFpEcHdiR002ZVcxNllYRmhOR2hxYVhwcmMyNTZZMk5rYUdkbGVHSXpMMkZ3Y0M1aWMydDVMbVpsWldRdWNHOXpkQzh6YlhGaE1uWTJaSFJ2TWpKemFX -TnlaV0YwWldSQmRIZ1lNakF5Tmkwd055MHdPVlF4Tmpvek56b3dPQzR6TmpKYSJ9fXsiZGlkIjoiZGlkOnBsYzp6M3Nua2xweDZzN3hsM3VwNWdnNGdqbzQi -LCJ0aW1lX3VzIjoxNzgzNjE0OTY5ODQ0NTI5LCJjdXJzb3IiOjIyNTgyNzgzOTAzLCJraW5kIjoiY29tbWl0Iiwic2VxIjoyMjU4Mjc4MzkwMywiY29tbWl0 -Ijp7InJldiI6IjNtcWEyd2V4anV5MnMiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwicmtleSI6IjNt -cWEyd2V4YTRpMnMiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTA5VDE2OjM2OjA5LjQ5Nloi -LCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWliM2ZxZnk0eWN5eWdxNHA0cW02MnpkN29keW1hbGp6dHZzamRnNXJ0d3BrYXRleXJzM291IiwidXJpIjoiYXQ6 -Ly9kaWQ6cGxjOnh0a3hpM2xoNWd5YWFsN2h5bjJ4bWx6by9hcHAuYnNreS5mZWVkLnBvc3QvM21xN3Bhdm5kYmMyMyJ9fSwiY2lkIjoiYmFmeXJlaWY2NXNk -c2d4Zmt2YXA2NWV3ejVtczJmZnJldmd1anlvNjYyNGNlYzZmdmpodWdjemF3Z2UiLCJyZWNvcmRfY2JvciI6Im8yVWtkSGx3WlhKaGNIQXVZbk5yZVM1bVpX -VmtMbXhwYTJWbmMzVmlhbVZqZEtKalkybGtlRHRpWVdaNWNtVnBZak5tY1daNU5IbGplWGxuY1RSd05IRnROako2WkRkdlpIbHRZV3hxZW5SMmMycGtaelZ5 -ZEhkd2EyRjBaWGx5Y3pOdg== +N6Qw7MsnNQEpEMiSpAP///////+XgBNCSJGUSJGUSJHhSv7Cmwlma5vsTo0r/sSuKAFDBQAABIKBYcBBHCRX2QMEQAEMjQaJhQ8JhYQFCgSIBAOCB47LhbEwJBKMQgEARVEIxBANUPIiAAAA1OoBoqJCI+RB0SQKhMFgUBAIEitAAOgAAAAAAQAAAAQAAAAIAAAAcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA1LTA4VDA1OjE4OjI0LjIyNFoiLCJsYW5ncyI6WyJlbiJdLCJyZXBseSI6eyJwYXJwZSI6InNpdGUuc3RhbmRhcmQuZG9jdW1lbnQiLCJic2t5UG9zdFJlZiI6eyJjaWQiOiJiYWZ5cmVpZjR4eWN6M2NiNHFrdGpnZHZ4NGZnZm5iamdyM2pxbGhtYnpjNzJnMm81eW5mZnB6eHQ2NCIsInVyaSI6ImF0Oi8vZGlkOnBsYzo2bjNpaXZlZnluNXpndnc3ajI0Z3g0eDYvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NubzZjcW5jdDIifSwiY292ZXJJbWFnZSI6eyIkdHlwZSI6ImJsb2IiLCJtaW1lVHlwZSI6ImltYWdlL2pwZWciLCJyZWYiOnsiJGxpbmsiOiJiYWZrcmVpZXJ4dW1pbW4yMzJ3cTRiaDY1MnZsYnhnYXF6ZnBveG40cHFnc2QzbWRlN2R4ZGRnZ3lpeSJ9LCJzaXplIjo2MzUyNn0sInBhdGgiOiIvcGh5c2ljYWwtaGVhbHRoL3ByZXZlbnRpb24tbG9uZ2V2aXR5L2phbGFwZW5vLXJlY2FsbC1zYWxtb25lbGxhLTMwMzk2MjcvIiwicHVibGlzaGVkQXQiOiIyMDI2LTA4LTEwVDE5OjU5OjMzLjAwMFoiLCJzaXRlIjoiaHR0cHM6Ly93d3cudGhlZmxvd3NwYWNlLmNvbSIsInRhZ3MiOlsiUGh5c2ljYWwgSGVhbHRoIiwiUHJldmVudGlvbiBcdTAwMjYgTG9uZ2V2aXR5IiwiZm9vZCIsImlsbG5lc3MiLCJQdWJsaWMgaGVhbHRoIl0sInRleHRDb250ZW50IjoiVGhlIHZvbHVudGFyeSByZWNhbGwgaW5jbHVkZXMgc29tZSBqYWxhcGXDsW8gcHJvZHVjdHMgc29sZCBpbiAyNiBzdGF0ZXMgYXQgcGxhY2VzIGxpa2UgVHJhZGVyIEpvZeKAmXMgYW5kIFdob2xlIEZvb2RzLiIsInRpdGxlIjoiRmlyc3QgWW91ciBTYWxhZHMsIE5vdyBZb3VyIEd1YWMgYW5kIGxhLyIsInN0YXJ0c19hdCI6IjIwMjYtMTAtMTVUMTY6MDA6MDBaIiwidGlja2V0X3VybCI6Imh0dHBzOi8vd3d3LnF1aWNrZXQuY28uemEvZXZlbnRzLzM4Nzg2NS1zb3V0aC1hZnJpY2FuLXdpbmUtZm9yLWR1bW1pZXMtYnktaGFycnktbWVsY2stZGVteXN0aWZ5aW5nLXRoZS13aW5lLWluLXlvdXItZ2xhLyIsInZlbnVlX2FkZHJlc3MiOiJDaGFwbWFucyBQZWFrIERyIiwidmVudWVfbmFtZSI6IkNhZmUgUm91eCIsInZlbnVlX3JlZiI6IiJ9LCJzdW1tYXJ5IjoiRXZlciB3b25kZXJlZCwgd2hpbGUgc2lwcGluZyB3aW5lIHdpdGggZnJpZW5kcywgd2hhdCBoYWQgdG8gaGFwcGVuIHRvIGdldCB0aGF0IGxpdmluZyBiZXZlcmFnZSBpbnRvIHlvdXIgZ2xhc3M/IEpvaW4gSGFycnnigJlzIHRhbGsgYXMgaGUgZGVteXN0aWZpZXMgU291dGggQWZyaWNhbiB3aW5lIHRocm91Z2ggdGhlIGZhc2NpbmF0aW5nIHN0b3JpZXMsIHN1cnByaXNpbmcgY2hhcmFjdGVycyBhbmQgbGl0dGxlLWtub3duIGZhY3RzIHRoYXQgaGF2ZSBzaGFwZWQgb25lIG9mIHRoZSB3b3JsZCdzIG1vc3QgcmVtYXJrYWJsZSB3aW5lIGluZHVzdHJpZXMuIERPT1JTIE9QRU4gQVQgNlBNLCBTSE9XIFNUQVJUUyBBVCA3OjMwUE0gTkIhIFdlIHB1dCB0b2dldGhlciwgb250byBvbmUgdGFibGUsIHNlYXRzIGJvb2tlZCB1bmRlciB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzIE5vdGU6IFRhYmxlcyAxNSAtIDE5IGFuZCAxIC0gMyBhcmUgaGlnaCB0YWJsZXMhIChmb3IgZnVsbCBCb29raW5nICIsInRhYXJsZnA0ejRtZC9hcHAuYnNreS5mZWVkLnBvc3QvM21zc21lNWlpeWsyNCJ9fX0sImxhbmdzIjpbImFyIl0sInRleHQiOiLYp9mE2YLYsdin2KHZhyDZhNmE2KzZhdmK2LkgXG7wn6St8J+krfCfpK3wn6St8J+krSJ9LCJyZXYiOiIzbXNzbm5na2dzYTJoIiwicmtleSI6IjNtc3NubmVkaDUyMmYiLCJzZXEiOjQ2MzA3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OToyOS43MDEzMzhaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWRhb3gzcWhydmppNW1va2xxbGFzZGhmN25vcm1sbms2c2UzejQyY2U2aHF6a2tsM290bmUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5yZXBvc3QiLCJkaWQiOiJkaWQ6cGxjOml2dzRhNjdtcHc2aW5nYnJ5MnhhdHFpZCIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucmVwb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo0OTowMi4xMDRaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpYXY2am94bXE1ajIzM25xNWRpemNiZWFxc2QyYW1mdmJla3Z4ZHplMnA0eWJrZWJlNHV5eSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp0NnViajJ3bGhjMzRhd3pjeW1oM3FwdXIvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3Jscm5yY2xzMmsifX0sInJldiI6IjNtc3NubW42d212MmYiLCJya2V5IjoiM21zc25tbjZsdjUyZiIsInNlcSI6MzY3MzIsInThu6dhIG3DrG5oLiBOaMawbmcgc+G7sSBr4bq/dCBo4bujcCBj4bunYSBjw6FjIHTDsmEgw6FuIHRoacOqbiBs4buHY2gsIGLDoW8gY2jDrSB0aMO5IMSR4buLY2gsIHbDoCB0w6BpIGxp4buHdSBi4buLIHBow6JuIG3huqNuaCDEkcOjIGNo4buRbmcgbOG6oWkgY8O0LiBOaGnhu4F1IHbhu6Ugdmnhu4djIGvhur90IHRow7pjIHbhu5tpIHZp4buHYyBjw7QgbeG6pXQgxJHhuqV0LCBideG7mWMgcGjhuqNpIGLDoW4gdMOgaSBz4bqjbiBob+G6t2MgY2jhuqVwIG5o4bqtbiBjw6FjIHRo4buPYSB0aHXhuq1uIGtow7RuZyB0aHXhuq1uIGzhu6NpLlx1MDAzYy9wXHUwMDNlXHUwMDNjcFx1MDAzZVbDoG8gdGjhu51pIMSRaeG7g20gY8O0IHF1YSDEkeG7nWkgdsOgbyBuxINtIDE5MDQsIHBo4bqnbiBs4bubbiB0w6BpIHPhuqNuIG3DoCBjw7QgxJHDoyB4w6J5IGThu7FuZyDEkcOjIGJp4bq/biBt4bqldCBob+G6t2MgbuG6sW0gdHJvbmcgdGF5IG5nxrDhu51pIGtow6FjLlx1MDAzYy9wXHUwMDNlXHUwMDNjcFx1MDAzZUPDtCBxdWEgxJHhu51pIHRyb25nIHTDrG5oIHRy4bqhbmcgdMawxqFuZyDEkeG7kWkgbmdow6hvLCB2w6AgdHJvbmcgbmhp4buBdSB0aOG6rXAga+G7tywgZGkgc+G6o24gY+G7p2EgY8O0IMSRw6MgYuG7iyBiw7NwIG3DqW8gYuG7n2kgY8OhYyBow6xuaCB0xrDhu6NuZyB2w6AgdGluIMSR4buTbi4gQmnhu4d0IGRhbmggbWnhu4d0IHRo4buLIOKAnE1hbW15IFBsZWFzYW504oCdIMSRw6MgZ+G6r24gYsOzIHRyb25nIG3hu5l0IHPhu5EgdMOgaTo1MTowNy4yNDlaIiwibGFuZ3MiOlsiZXMiXSwidGV4dCI6IlRydW1wIGluIGEgY2F0ZXJpbmcgdHJ1Y2sgbGlrZSBDaGFwbyBHdXptYW4/In0sInJldiI6IjNtc3NucWYyNWs1MnQiLCJya2V5IjoiM21zc25xZWJnZmMyaiIsInNlcSI6OTU4MjYsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUxOjA4LjMyNzc4NFoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpYnpzeWl1d3lzazRzc3VzaTJhYXc1cGJ5Y20zb3ZjYms2eDVhZHp3ZDUyZ3gza2YycGJiaSIsImNvbGxlY3Rpb24iOiJhdC5wb2RwaW5nLnJlY29yZHMucG9kcGluZyIsImRpZCI6ImRpZDpwbGM6NjRwZHJqaWZmeDRpaGttaWM1bWJ4emVtIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXQucG9kcGluZy5yZWNvcmRzLnBvZHBpbmciLCJpcmlzIjpbImh0dHBzOi8vcnNzLmJ1enpzcHJvdXQuY29tLzIxNzU3NzkucnNzIiwiaHR0cHM6Ly9oYXJtb25pZWRlc2NvcnBzLmZyL2ZlZWQvcG9kY2FzdC8iXSwibWVkaXVtIjoicG9kY2FzdCIsInJlYXNvbiI6InVwZGF0ZSIsInNvdXJjZSI6ImhpdmU6MTA4ODA5NzExOjQ4MzA4Y2Q0OWQ1Yzg1MzhlNDZiZTg4MjRiNmRmMGY0YTM3NDM3OTY6MDpwb2RwaW5nLmRkZCIsInRpbWVzdGFtcCI6IjIwMjYtMDgtMDdUMDc6Mjg6NTMuNDY3OTk2MDAwWiIsInZlcnNpb24iOiIxLjEifSwicmV2IjoiM21zaHp1ZnlyZWllNzVncXpqejdsNXR0c2lzdWp4aDJtbWV3dXZqNm4ycWltaW5yaHAzY3g3Y3NrZGF1NHp1IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImRpZCI6ImRpZDpwbGM6eGQ0ZjZ6bW03bTJ0cDY0NGZwdXhpM3E3Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wMi0yNlQxMDoyNDo1OS45NzVaIiwibGFuZ3MiOlsiZW4iXSwicmVwbHkiOnsicGFyZW50Ijp7ImNpZCI6ImJhZnlyZWloc3puM3ViNnAzd29nbHU2YXJnNGtha2VnaDRpc3RjZG5lbGpkcDRnYXdma2duMmZyaGZpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmV2M3N2bjRvcmZsYnV6amxkY2pqanJoaS9hcHAuYnNreS5mZWVkLnBvc3QvM21mcXhxMjRxZGsyNiJ9LCJyb290Ijp7ImNpZCI6ImJhZnlyZWliNXp3YWlzYzVjdWFrM3FmY3VocTZpbHRnMnhsa21mY3l0Y2pldXI0YTd5NWNzZmg2c3J5IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmV2M3N2bjRvcmZsYnV6amxkY2pqanJoaS9hcHAuYnNreS5mZWVkLnBvc3QvM21mcXhuNXR3NDIyNiJ9fSwidGV4dCI6InNoaXQgdGhhdCBjb3VsZCBiZSBpbnRlcmVzdGluZyBpZiBIb3Agd2l0bmVzc2VzIHRob3VnaCwgaGUncyB0eXBpY2FsbHkgYXJtZWQgd2l0aCBhIHBpc3RvbCBoZSdkIGFjdGl2ZWx5IGJlIGFibGUgdG8gc2hvb3QgZmlyc3QifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbWZxeTZhbXdmazJ4Iiwic2VxIjo3NTA4MywidGlyZWlhejZnZ2hrNm9ucDJqa3Fia2JzZ2JkaDJycmsyZGZjdDdiYjI1cnFiemZmNzVyNm1ieXVpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmhydmE2cGx5Z2Zsb2RuNHM0amJncHJnMy9hcHAuYnNreS5mZWVkLnBvc3QvM21xaG9yejJrdnMyNCJ9fSwibGFuZ3MiOlsiZW4iXSwidGV4dCI6IlwiIERvbid0IG1ha2UgbWUgd2hpcCBlbScgb3V0LiBcIiJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNtcWhvc256M3dzMjQiLCJzZXEiOjgxMTk1LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDozNC4yODM4NjBaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWhvbWVrbHNmbWwzcTZ4am5raWJqZWFvbWRtNDRsNG1lb2U2dXduZHFrdmxuY2d0MjRhbmEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpwZWMyZ2d4N2h0NmhmbGlwdGlxYXludXkiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI0LTEyLTI1VDE0OjQ3OjE1LjY1NVoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWljZDM2ZXdoY2l0eDZmZzZ3MnN2Z3djcmRhZzZ4NDRyYzRwNjM2YWZlaXpzcDJ4aTV2cGFhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmprc3FjMjZ0N2JzbTZienJtcmdienJqMi9hcHAuYnNreS5mZWVkLnBvc3QvM2xlNTcyMy0xMVQxMjo1MDozMS45NjFaIiwic3ViamVjdCI6ImRpZDpwbGM6ZGN3bHJhb2F3aXBlZWY3NzU3dmVndXRnIn0sInJldiI6IjNtc3NucGVkcjdpMmgiLCJya2V5IjoiM21zc25wZWNqNmEyaCIsInNlcSI6NzAyMDAsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjMzLjkwMjc5NFoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpYTNob2hjY2UzcjRrNnN5NzNvaXNqYjIzYmV5ZnF0a3BzYmZma3Fma2lpZXVtZnBsYW94dSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOnJ3cHg1a2xiZ2Z2ZmlrN3pjcmFhamFqayIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTA6MTYuODUxWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWNtMmR1c3hlYW1wM2VpeTdyeTRwbGV5eG1naW9rZWJ5enA3cXFjbjZjd3N1cXp5eWU2YXEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZmIzcDRmZnV0anNmN2p1NTNwdmF3Zm96L2FwcC5ic2t5LmZlZWQucG9zdC8zbXNxeXZ2bmxyYzJmIn0sInZpYSI6eyJjaWQiOiJiYWZ5cmVpZHljbWJka2xodW1pdXUzbGt4cXY0ZGRlbmxjN3R0NWE0eGtiaGpydTVndG9pd2xheG9zcSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp3cGo1ejI0dnNtaWs1b2Nxanlid2pwc28vYXBweXJlaWVuaG1zbWdwMjJsdm5teWpvdXR2amd6NnZpNHE2ZGFlbGx1dmxwcHNoeXVhcGF3ZDdqZGEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZXBoa3pwaW5oYXFjYWJ0a3VndGJ6cnd1L2FwcC51c2VyaW5wdXQuZGlzY3Vzc2lvbi8zbXNzbHFmenpkbzJyIn19LCJyZXYiOiIzbXNzbnF5NWt0cjJiIiwicmtleSI6IjNtc3NscWZ6emRvMnIiLCJzZXEiOjEwMzAxNCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MjguMjA3NDMzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlhczNxZmxsZmpqNWh1eG1pendib3RwZndlM2Fwd2E0NHpycnFnZjd6dTV1dWZsdm5uanF1IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6N2Y2MnFtZDY3bW1neWZhNHhzdnZreGR3Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MTowMS40NjlaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpaHl5b290Y2M2eXM3aXBkaHZudTZwZ2Q0dXQ2bmE2MjJoNGNsdHN6MnIzbG5pdWY1c2k1eSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpxaWtuYzR0NXJxN3luZ3Z6N2c0YWV6cTcvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3JjamhzYjZzMmsifSwidmlhIjp7ImNpZCI6ImJhZnlyZWllMzJyNGhpcjdjNGdzb3hqaHk2cGhKbllXMWxSR2x6Y0d4aGVVNWhiV1VpT2lKTmFXNXBJRU55YjNOemZIZHZjbVFpTENKbllXMWxVMngxWnlJNkltTnliM056ZDI5eVpDSXNJbXhoYzNSVmNHUmhkR1ZrSWpvaU1qQXlOaTB3T0MweE1WUXdOVG93TURvd01DNHdNREJhSWl3aWJXRjRJam96TUN3aWNtVnRhWGhUYkhWbklqb2liV2x1YVMxNGQyOXlaQ0lzSW5SbFlXMVRiSFZuSWpvaWNIVjZlbTF2SWl3aWRHOTBZV3dpT2pRMmZRLi1yLURQeU00WEVNeEZrM2VtVnNJQnFHSXdhcG5vRlB1blFPNUJ2M080aHJWSHdsaFl2Y3lPOENuUlNwWVhONUJVRTBRZUVwY0dCYXMwWndMc1gwaFR3Iiwia2lkIjoiMGYxMDYzY2ItODFiOC00Mjk5LTlkYzYtZjhkMDMzNjZkZTU2Iiwic2lnbmVkQXQiOiIyMDI2LTA4LTExVDEyOjUxOjE0Ljc4MVoiLCJzaWduZWRGaWVsZHMiOlsiY3VycmVudCIsImdhbWVEaXNwbGF5TmFtZSIsImdhbWVTbHVnIiwibGFzdFVwZGF0ZWQiLCJtYXgiLCJyZW1peFNsdWciLCJ0ZWFtU2x1ZyIsInRvdGFsIl0sInNyYyI6ImF0Oi8vZGlkOnBsYzpwNW9kZTVia2Y2dmp0dDZhaHRzc3V4dWkvZGV2LmtleXRyYWNlLnNlcnZlclB1YmxpY0tleS9zaWduaW5nLWtleXMtMSJ9XSwic3luY2VkQXQiOiIyMDI2LTA4LTExVDEyOjUxOjE0Ljc4MVoiLCJ0ZWFtU2x1ZyI6InB1enptbyIsInRvdGFsIjo0Nn0sInJldiI6IjNtc3NucWxwZzVpMnciLCJya2V5IjoicHV6em1vLWNyb3Nzd29yZC1taW5pLXh3b3JkIiwic2VxIjo5ODM1NywidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MTUuMzMzNDA3WiJ9fTZsL2FwcC5ic2t5LmZlZWQucG9zdC8zbWwyNjdnYnJ3azIzIn19LCJyZXYiOiIzbXNzbnBwNm4ycTJoIiwicmtleSI6IjNtc3NucHA2aTZpMmgiLCJzZXEiOjg3MzMxLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDo0NS40MDM1NjlaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWZkZG5lNWdkdHBpbjd5cmI3b2k1ZDNmeWp3c2l4cGVzdjMya3N1cDJ6ZzRnaHhsYjRieG0iLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZ3JhcGguZm9sbG93IiwiZGlkIjoiZGlkOnBsYzpzZWEyNXI0b2R2bW1nZXUzeDVueHhyYzMiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5ncmFwaC5mb2xsb3ciLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUwOjAyLjU3OFoiLCJzdWJqZWN0IjoiZGlkOnBsYzpycm1nN2NnaWpxamp6a3NpeWNzZWJmcG8iLCJ2aWEiOnsiY2lkIjoiYmFmeXJlaWc1ZW5penY2bmp1bW1ucHIyd3kzdnE2M2V1bWxmMnFzNHFpeWc0NHR2ZnFuazNrNGx1Y2UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6cGlma2NqaW1kY2Z3YXhrYW56aHd4dWZwL2FwcC5ic2t5LmdyYXBoLnN0YXJ0ZXJwYWNrLzNseWdrdm9zN2w1Mm0ifX0sInJldiI6IjNtc3Nub2d2NHUyMmEiLCJya2V5IjoiM21zc25vZ2x0NnUycCIsInNlcSI6NTg5MjEsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjAzLjUwNDMxMVoieXBlIjoiYXBwLmJza3kuZW1iZWQuaW1hZ2VzI2ltYWdlIiwiYWx0IjoiSUVNQm90IEltYWdlIiwiaW1hZ2UiOnsiJHR5cGUiOiJibG9iIiwibWltZVR5cGUiOiJpbWFnZS9wbmciLCJyZWYiOnsiJGxpbmsiOiJiYWZrcmVpYW5xenJuNXFrZ3Z5dnE0ZXR0M2VnbG5hc216NjR6d2l3d2d1dTRucXo0dHVvb3VtNTVxZSJ9LCJzaXplIjo1NzQwNTN9fV19LCJmYWNldHMiOlt7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFjZXQiLCJmZWF0dXJlcyI6W3siJHR5cGUiOiJhcHAuYnNreS5yaWNodGV4dC5mYWNldCNsaW5rIiwidXJpIjoiaHR0cHM6Ly9tZXNvbmV0LmFncm9uLmlhc3RhdGUuZWR1L3Z0ZWMvZi8yMDI2LU8tTkVXLUtJTE4tU1YtVy0wMTk3XzIwMjYtMDgtMTFUMTI6NTBaIn1dLCJpbmRleCI6eyIkdHlwZSI6ImFwcC5ic2t5LnJpY2h0ZXh0LmZhY2V0I2J5dGVTbGljZSIsImJ5dGVFbmQiOjE2NywiYnl0ZVN0YXJ0IjoxNjN9fV0sImxhbmdzIjpbImVuIl0sInRleHQiOiJJTE4gaXNzdWVzIFNldmVyZSBUaHVuZGVyc3Rvcm0gV2FybmluZyBbd2luZDogNjAgTVBIIChSQURBUiBJTkRJQ0FURUQpLCBoYWlsOiBcdTAwM2MuNzUgSU4gKFJBREFSIElORElDQVRFRCldIGZvciBDaGFtcGFpZ24sIENsYXJrLCBHcmVlbmUsIExvZ2FuIFtPSF0gdGlsbCA5OjMwIEFNIEVEVCBMaW5rIn0sInJldiI6IjNtc3NucDdtZm9oMjYiLCJya2V5IjoiM21zc25wN202dHAyNiIsInNlcSI6Njg2NDMsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjI5LjYzMDA0MloifX0iMjAyNS0wNy0wN1QxOTo0MzowMS41NTZaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZGozcXdpbHB0ZHc2bXg1c3g2dnN4cmdhNXF1MzYzdmh6NXZqZGM2NWJrNW8zYTR1a2FpcSIsInVyaSI6ImF0Oi8vZGlkOnBsYzo1YTRuNzZ3aHE2M2h4N2ZhcXBsNmtqNmQvYXBwLmJza3kuZmVlZC5wb3N0LzNsdGZiemdwM2xrMmsifX0sInJldiI6IjNtbnU1eXVscmllMnoiLCJya2V5IjoiM2x0Zmthbmg3eTQycCIsInNlcSI6MTE5ODcwLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MTozOC43NzI5NTNaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWU2dDNkejRiNGN0bnN0bm50Z2Y0Z3VrNTJ1dWV2Z2s0eWNqZ25waG82dGo0aHhtcGVxeXEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpwZWMyZ2d4N2h0NmhmbGlwdGlxYXludXkiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI1LTA3LTAyVDEwOjMwOjA5LjQ3NloiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWliaGY0Mmo2eHkyamJ6aDNoemlteXRxbXU2cTZ2a3J1eHJmMzNkNHJpeGRtaHB6aXJnYWV5IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOm5kaW8ydTRhdjdoeXpldm9heGJ4aHBlbS9hcHAuYnNreS5mZWVkLnBvc3QvM2xzeHlycmUyZjIybCJ9fSI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDctMjlUMTY6NTE6MjYuNjg0WiIsImxhbmdzIjpbImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpZG5hdWx1YWZsZDNuaHBrYXBod3h5eWMyMnUyM2xnc2tyeWU1bjVqcXYzYWJrbzZmdDIzcSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpwamh1aDdnNmM2YW5jN2NjeXdrbzZieHQvYXBwLmJza3kuZmVlZC5wb3N0LzNtcnNleXFlNjRjMmoifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpYmNjMmI1emdsMmN0cng0dXJwaDZrNHNucHV4ZW1kbDRjdW96NGUzdTVmemhyeGNjbmF4aSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4ZDRmNnptbTdtMnRwNjQ0ZnB1eGkzcTcvYXBwLmJza3kuZmVlZC5wb3N0LzNtcnNja21pbHBrMnYifX0sInRleHQiOiIvLyBJIGhhdmUgdG8gdGFrZSBhIGdvb2QgbG9vayBhdCB0aGVzZSByZWxlYXNlcywgaSd2ZSBhbHdheXMgYmVlbiBoZXNpdGFudCB3aXRoIGFiYW5kb253YXJlIElBIHN0dWZmIGFmdGVyIEkgaGFkIHRoYXQgb25lIGluY2lkZW50IHdpdGggYSBXaW5kb3dzIFhQIEludGVncmFsIEVkaXRpb24gYXJjaGl2ZVxuXG5uYXN0eSBhcyBmdWNrIHRyb2phbiB3YXMgaGlkZGVuIGluIHRoZSBnb29kaWVzIGFuZCBJIGRpZG4ndCByZWFsaXplIG15IG1hY2hpbmUgd2FzIGluZmVjdGVkIHVudGlsIGl0IHdhcyB0b28gbGF0ZSJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNtcnNmNDRwd3VjMnYiLCJzZXEiOjgxNTIyLCJ0ImFwcC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDEtMDVUMTg6MzY6MDYuNDYyWiIsImxhbmdzIjpbImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpaDdtaWt4N2JiZWp6dXRnMnVoYm9qcnNlaHBjM2t4NmxmamF5dDNud3N0eGd6ZHB3YzVudSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4ZDRmNnptbTdtMnRwNjQ0ZnB1eGkzcTcvYXBwLmJza3kuZmVlZC5wb3N0LzNtYnAzYmZteWsyMnUifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpYmlqeGJnemFjNzNneTVjNXJob3lnMnpqZ2I0bXFobXhuZ2t2bHdpbHd3d3pmZHNnbm5taSIsInVyaSI6ImF0Oi8vZGlkOnBsYzo3NnF5M3NveGNqeHM3b3RwbTYzaGZranIvYXBwLmJza3kuZmVlZC5wb3N0LzNtYm93M21kcmNrMm8ifX0sInRleHQiOiItVHJ1dGggYmUgdG9sZCwgaGUgd2FudGVkIG5vdGhpbmcgbW9yZSB0aGFuIHRvIHJldGlyZSBhbmQgc3RvcCBmaWdodGluZyBhcyBhIHdob2xlLi4uIGJ1dCB3aXRoIGEgbmV3IHNldCBvZiB3ZWFwb25yeSBhbmQgaGlzIHNraWxscywgSG9wIHdhc24ndCB3b3JyaWVkIGFib3V0IHRha2luZyB0aGUgZW5lbXkgb24uXG5cbkFuZCBlc3BlY2lhbGx5IHNpbmNlIHRoZWlyIHVuaXRzIGhhZCBnbGFyaW5nIHdlYWtuZXNzZXMuLi4gVGhvc2UgYmlnIG9uZXMgdGFraW5nIGEgbWlzc2lsZSBiYXJyYWdlIHRvIHRoZSBqb2ludHMgd29uJ3QifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbWJwM2VrM3JsazJ1Iiwic2VxIjo3MjU2MSwidGkxMjo0ODo1Ny44MDJaIiwibGFuZ3MiOlsiamEiXSwidGV4dCI6IuS7luS6uuanmOOBjOaAneOCj+OBmuS6jOasoeWJteS9nOaPj+OBhOOBpuOBl+OBvuOBhuOBu+OBqeOBruS9nOWutuOBq+OBquOBo+OBpuOBv+OBn+OBhOaDs+OBhOOBqOOAgU5BVkUtMeOBq+mWouOBl+OBpuOBr+OBguOCk+OBvuOCiumAuOiEseOBl+OBn+aEn+OBmOOBq+OBr+OBquOBo+OBpuOBu+OBl+OBj+OBquOBhOawl+aMgeOBoeOAglxuXG7jgrvjg6vjg5Xjgrnjg5Tjg7Pjgqrjg5XjgYzmpb3jgZfjgYTjgarjgajmgJ3jgaPjgabjgovmhJ/jgZjjgafjgIHjg5XjgqHjg7PjgqLjg7zjg4jjga/jgoHjgaHjgoPjgY/jgaHjgoPlrInjgZfjgYTjgpPjgafjgZnjgZHjganjga3jgIJcblxu44Gn44KC44CB5aW944GN44Gq5L2c5ZOB44Gr5oCd44GE44KS6aaz44Gb44Gm44GX44G+44GG44Oy44K/5b+D44KC44GZ44GU44GE55CG6Kej44Gn44GN44KL44Gu44Gn44KC44GX44KC5oOz5YOP5Yqb44GM56qB44Gj6LWw44KL44GT44Go44GM44GC44Gj44Gm5o+PKOabuCnjgYvjgozjgZ/jgoLjga7jgYzlh7rnj77jgZfjgZ/jgajjgZfjgZ/jgonopovjgabjgb/jgazmjK/jgorjgafluILloLToqr/mn7vjgZfjgZ3jgYbjgarmsJfjgYzjgZnjgovjgILku4rjga7jgajjgZPjgZ3jgpPjgarjgoLjga7jga/jgarjgYTjgYzjgIIifSwicmV2IjoiM21zc25ta3lqM20yZCIsInJrZXkiOiIzbXNzbm1pc3pjazJsIiwic2VxIjozNTU5NSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDk6MDAuMzI1NTM1WiJ9fSwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wMy0xOFQyMzozMTo1NS45ODJaIiwibGFuZ3MiOlsiZW4iXSwicmVwbHkiOnsicGFyZW50Ijp7ImNpZCI6ImJhZnlyZWlnYjN3ZGJzZjdocnVvdGkybmRicHJzZ29ocGFoa2sycXpoZmFtY295eGdpZmM1aWJjbWZhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmJvczZybWFlcmNhcGZsZjZuN21meWh4cy9hcHAuYnNreS5mZWVkLnBvc3QvM21oZW5jdXg2N2sydCJ9LCJyb290Ijp7ImNpZCI6ImJhZnlyZWlmd3V6d21oZzN4NGRhNGRyM3JoeWt5enpiZGt4aDdqcGN3cHBkdmlnazNleHJoeGhrbXFpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnhkNGY2em1tN20ydHA2NDRmcHV4aTNxNy9hcHAuYnNreS5mZWVkLnBvc3QvM21oZWs3bmNjMmMydiJ9fSwidGV4dCI6IlNoZSdkIGJlIHRvdWNoaW5nIG5vIGhlbG1ldDsgSG9wIG5ldmVyIHdvcmUgb25lLCBidXQgaGVyIGhhbmQgYnJ1c2hlZCBwYXN0IHVua2VtcHQgZGlydHkgYmxvbmRlIGN1cmxzIHRvIHJlc3QgYWdhaW5zdCB0aGUgcm91Z2ggc2NhcnJpbmcgb24gaGlzIGZhY2UuXG5cbkhvcCBob3dldmVyIHNpZ2hlZCwgZ2VudGx5IGxlYW5pbmcgaW50byBoZXIgdG91Y2guXG5cblwiIFBlb3BsZSBzYXkgdGhhdCBidXQuLi4gYWZ0ZXIgYWxsIEkgd2VudCB0aHJvdWdoIEkgZG9uJ3QgYmVsaWV2ZSBlbScuIFwiIn0sInJldiI6IjNtc2d5aXBmamVhMngiLCJya2V5IjoiM21oZW5oc2s0YWMyYSIsInNlcSI6NzU3NDYsInRpMnVha2Rnc3NlcWIzYjJiZSIsInVyaSI6ImF0Oi8vZGlkOnBsYzozZXI3bm1oamt5eWd3cGVtNmNobDR6dmIvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NtNzdienhzMmIifX0sInJldiI6IjNtc3NucGd1Y2dlMnoiLCJya2V5IjoiM21zc25wZ3R4b20yeiIsInNlcSI6ODQxNzcsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjM2LjYwMDI5NloifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpaDJ4M29vanlhZWZqbmRyZmI3b2N1Ym1oNDZyejdmeWhlb3hiZmpwemRjYTJ4bHBnYzZqaSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOmN0ZmM1cWh1YXJ0dmFramFkb3N4NnJyYiIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTA6MTEuMjEzWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWN0N3M0NXg3a2hvNGtqM2lpNnVqd29taWJmYWo1bWJsbGtiZ3dwa3lzazczMmc2a2djcGEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZXJ3Y29meDQyYjI0cGVreXR3aGd3c2szL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNxdmszamU3czJzIn19LCJyZXYiOiIzbXNzbm9ua3h6NzJpIiwicmtleSI6IjNtc3Nub25rcDd4MmkiLCJzZXEiOjYxNzgxLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDoxMC42OTRtcnJ0anF5cHAybnRqdnZ1a2RzZW9wY2xpMmdwcmVwbjNtanRvMmEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6cDZkdGU0NWlnZWZyN3FpdXhibzJsbGw3L2FwcC5ic2t5LmZlZWQucG9zdC8zbGVwNWFpcGw0azJzIn19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsZXA1dHV5YWFhMmMiLCJzZXEiOjEwOTk2NCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlkczJtcDNjdXhxNHdwMmk3dXdwcXdxZmZpeDZqNmt5NXZvd2t5b2RxMzI1c3MybDZ1c2ltIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucmVwb3N0IiwiZGlkIjoiZGlkOnBsYzp5bzMyemc3a3FyeGdveDd2dXQ0NjdhajYiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnJlcG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTA6MzIuMTI1WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWNzanNrYzNsM2xvbXhpdjZsdm5xa2VtNW1hcGh2a2hhNDdlamQyNDdkcjd5YzRwNXAyb3EiLCJ1cmkiOiJhdDovL2RpZDpwbGM6c2c2amczaTNtNGhsa3czZnFrNmh3N3NxL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzbms2d2phazJzIn19LCJyZXYiOiIzbXNzbnBjdGZvcTJiIiwicmtleSI6IjNtc3NucGN0NXVxMmIiLCJzZXEiOjY5NjAyLCJ0aWpwZWciLCJyZWYiOnsiJGxpbmsiOiJiYWZrcmVpZzdqbGVsNGNnZnpzZzZrem9scXI0N2t4MmN0d2trdTdnMnltMnhnZGc3ZXFheWF3cnJqZSJ9LCJzaXplIjoyNjk1NTd9fV19LCJsYW5ncyI6WyJqYSJdLCJ0ZXh0Ijoi5a2r44CM44GK44Gw44GC44Gh44KD44KT44CB44GV44Gj44GN44Gu5aSJ44Gq44Ki44Oz44Kx44O844OI44Gr44CB44Gp44GG44GX44Gm44GK44K344Oj44Or44KS5pu444GE44Gm44GE44KL44Gu77yf44CNXG7lqYbjgIzliY3jgavjgoLoqbHjgZfjgZ/jgaDjgo3vvJ/jgZPjga7nvo7jgZfjgYTkuJbnlYzjgavjgZPjgYbjgYTjgYbnlLfjgYzmrLLjgZfjgYTjgYvjgonjgaDjgojjgI0ifSwicmV2IjoiM21zc25xYjI0c2MycSIsInJrZXkiOiIzbXNzbnE1aDV6YzJrIiwic2VxIjo5NDA4NCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MDQuNzA0NTM3WiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWloNG12ZW5ybG9sazY2bGp0bmdsN3lyM3dwNXpldWVjZHVxM3ZrcmN1aGN0b3ZjemhocDdpIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6NDY0NDJhY3F2cDdnNWhrdWtmcm0zcWR1Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MDo0Mi41MTNaIiwiInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMDNUMTU6MTg6MTAuOTUwWiIsImxhbmdzIjpbImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpaGlkZndwZHJmN202cWozYXIya3VzaW15ZWFjZWhybnB2dWgzaXBqbm5tNW1ya3VqcTZyaSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp3cHJyc2M3ams3ZmI0ZW9sYnY0anJxbGIvYXBwLmJza3kuZmVlZC5wb3N0LzNtczZzNXc3cnFjMmsifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpZGdjcTNkemVybnNhbmZpbWtiZ3d3cnhoYjRteGwzd3Y0b3JjemJmM3N1bDdhdXNpMnVjYSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4ZDRmNnptbTdtMnRwNjQ0ZnB1eGkzcTcvYXBwLmJza3kuZmVlZC5wb3N0LzNtczZyZjc3d2FrMm0ifX0sInRleHQiOiIvL0kgd2FzIC9pbnZvbHZlZC8gd2l0aCBzb25pYyBycCBhbmQgYWN0dWFsbHkgZ290IGEgcHJldHR5IGZ1biBycCBwYXJ0bmVyIG91dCBvZiBpdCBmb3IgYSB0aW1lXG5cbnRoZSBkb3duc2lkZSBpcyBpIHdhcyBpbiBhIGdyb3VwIHdpdGggc29tZSBvZiB0aGUgbW9zdCAvbm90b3Jpb3VzLyBzb25pYyBycCB3cml0ZXJzLCBpbmNsdWRpbmcgb25lIEkga25vdyBpcyBzdGlsbCB0aHJhc2hpbmcgYWJvdXQgc29tZXdoZXJlIG9uIGhlcmUgdGhhdCdzIGdvdHRlbiBpbnRvIGRlZXAgc2hpdFxuXG50eWEifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbXM2czd4amh1MjJtIiwic2VxIjo4MTY5NCwidGkiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA0LTA1VDIyOjUwOjU1LjE0MloiLCJsYW5ncyI6WyJlbiJdLCJyZXBseSI6eyJwYXJlbnQiOnsiY2lkIjoiYmFmeXJlaWVzeGpzN3VyYXMyZjN6dmxmanJzcHNzbmd1NmZ4bmFsdzVscWxwamY0aWRudTVobWFuaHkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6eGQ0ZjZ6bW03bTJ0cDY0NGZwdXhpM3E3L2FwcC5ic2t5LmZlZWQucG9zdC8zbWlydGZyaHF5MjI3In0sInJvb3QiOnsiY2lkIjoiYmFmeXJlaWQ3dGl0aW5jb3RiNXozeWplaHpsYXJzNnRvaG1ueWJpdHJ5aXU1c3dxZW1ra3k3ZTc2czQiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dXFhdmV3dHQ0MndodHdtbTNpdDZwcGw0L2FwcC5ic2t5LmZlZWQucG9zdC8zbWlycHV1N21kMjJmIn19LCJ0ZXh0IjoiLWJyb2tlbiB1cCBieSBhIG11bHRpdHVkZSBvZiBsYXJnZSwgbmFzdHkgc2NyYXRjaGVzIGFuZCBiaXRlcyBsb29raW5nIHRvIGJlIGZyb20gc29tZSBmb3JtIG9mIGxhcmdlIGNyZWF0dXJlIGlmIHRoZSBiaXRlcyB3ZXJlIGFueXRoaW5nIHRvIGdvIG9mZiBvZi5cblxuVGhlcmUgd2VyZSB0d28gbW9yZSB0aGluZ3Mgc2hlJ2QgYmUgYWJsZSB0byBub3RpY2UsIHRoZSBmaXJzdCBvbmUgc3VidGxlLCBidXQgb25jZSBzaGUgc2F3IGl0IHNoZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHVuc2VlIGl0LiBIaXMgbGVmdCBhcm0gd2FzLSJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNtaXJ0a3p5cjVrMjciLCJzZXEiOjc2MTQ4LCJ0aXBoLmxpc3RpdGVtIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MTozMS4xOTAzNzMrMDA6MDAiLCJsaXN0IjoiYXQ6Ly9kaWQ6cGxjOmNrbmd2eGE2bG41emdqeXJtYW53bXF2dy9hcHAuYnNreS5ncmFwaC5saXN0LzNtcHl4eDVtcHRuMjUiLCJzdWJqZWN0IjoiZGlkOnBsYzp0YW9laGN2em5ieXVrcGt5c3dvMmRjcm4ifSwicmV2IjoiM21zc25yM2U2eXUyayIsInJrZXkiOiIzbXNzbnIzZHo1ZTJrIiwic2VxIjoxMDQxMzQsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUxOjMxLjYwMTU3M1oifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpZ3E0bHZsM3lrbmF3ZmR0enJwaWJrajR0b3Vtempmd2pobmxuYnBvN3U0N2tqeXcyaDZsbSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOnBlYzJnZ3g3aHQ2aGZsaXB0aXFheW51eSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjUtMDYtMDZUMTE6MzI6NTUuMTcwWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWZwZHpyM2trM2Y2ZTd6ZnJ3Y2k2cG5qcndwM3J2bHpnZ2x1a3dldm9xZGwzMmN5cG51cHUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6aG1rM2xxc2dzYWd0bWU0d3Myd3NiMmNjL2FwcC5ic2t5LmZlZWQucG9zdC8zbHF2amtmN2NtYzJpIn19dDV2bXJyeXpsZHJiaTJibHEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bWZyY3oza3Y3YnN0aDU0Ymt5cnJpZHA1L2FwcC5ic2t5LmZlZWQucG9zdC8zbXNyaGMyNHp2MjJyIn19LCJyZXYiOiIzbXNzbm9mM3NzaDJ2IiwicmtleSI6IjNtc3Nub2Yzbnc3MnYiLCJzZXEiOjU4MjA5LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDowMS4yMDg1MzJaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWg2cnh3amUzbjZudGptNXl2b291bGFuZHFld2xkaG9heWNreDNkbTI1ZnBwYzUyYWlwNGUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzp1bWVrZjZqcGppdXNxNm5qNzZieWpxY2ciLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjMyLjc2N1oiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlnenh5d3ZwdTV3NGE3NmFxYXBmcXpzdm51emUzMnk2ZmxiZXJydHptcXVhZWJoNDZ0dmJ5IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjRsbHJoZGNsdmRsbW15bmt3c21nNXRkYy9hcHAuYnNreS5mZWVkLnBvc3QvM21zc243bHZzMnMybiJ9fSwicmV2IjoiM21zc25ua2FkZmYyZSIsInJrZXkiOiIzbXNzbm5rN3ptdjJlIiwic2VxIjo0NzUzOSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDk6MzMuMDI2LTA1LTAzVDAzOjE4OjU5LjY0MFoiLCJlbWJlZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmVtYmVkLnJlY29yZCIsInJlY29yZCI6eyJjaWQiOiJiYWZ5cmVpY3plbWh4YjZha3BxemxudTNlam5vNTI1NHhpbTUzdTU1eHBpaDZxdDI1dWdzNnc0eWtqdSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpjd3pxYnVoZDNrd2tpYnhrb2x5dGhhNTUvYXBwLmJza3kuZmVlZC5wb3N0LzNta3c2Z3UzeHJzMnQifX0sImxhbmdzIjpbImVuIl0sInRleHQiOiJcIiBJIGNhbiBwdXQgc29tZSBsaWRvY2FpbmUgb24gaXQgaWYgaXQnbGwgaGVscC4gXCJcblxuSGUgc2F5cywgY29taW5nIGEgYml0IGNsb3NlciBhbmQgZ2VudGx5IHBhdHRpbmcgaGVyIGJhY2ssIGJlZm9yZSBnZXR0aW5nIGhpcyBmaXJzdCBhaWQga2lkIGZyb20gb25lIG9mIHRoZSB0YXBlIHBhdGNoZXMgb24gaGlzIHN1aXQuXG5cblwiIEkgYWx3YXlzIGhlYXJkIGxhZGllcyBoYWQgcHJvYmxlbXMgd2l0aCB0aGVpciBjaGVzdHMgZG9pbmcgdGhhdCB0byB0aGVtLCB0aG91Z2guLi4gQnV0IGl0IHNvdW5kcyBydWRlIHRvIGp1c3QtIn0sInJldiI6IjNtc2d5aXBmamVhMngiLCJya2V5IjoiM21rdzc1YXN2cXMyeiIsInNlcSI6NzcyMzMsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjM0LjI4Mzg2MFoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpYzVvY2p3dm52emFwemI3dnJ4ZmZ1dm43a2Zkb2NuZmZiczNteTNkbzM3YWh2eDR3bGcyMnRzbHF5ZW8ycjQ0b3UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6a2tsNDdzcjMyZXlteWg3aHZvYXZyaXIzL2FwcC5ic2t5LmZlZWQucG9zdC8zbHJraG9xNTU1MjJmIn19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNscmtrdnNoa3pjMmciLCJzZXEiOjExNzc2NCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlmMzJiM2hkc2lsdGhzNWVyd2VyY2l2NWhvb3JwbXRreGw0cDc2M3hia3Rra2NxMmtlZHd5IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6cGVjMmdneDdodDZoZmxpcHRpcWF5bnV5Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNS0wMy0xM1QxMzo1MDoyMi4yNjNaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZHViZ29rbnMyZXBjcWhoZXJsaW4zdWNraXNwYm40bnFwbmRha21zcG91cXVldG5jdWk3YSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpyMnFqbG1qZW9iZHpicG9zY2dveGZ5ZmwvYXBwLmJza3kuZmVlZC5wb3N0LzNsa2I3cnRlNTMyMnAifX0sInJldiI6IjNtbnU1eXVscmllMnoiLCJya2V5IjoiM2xrYmFoYXV3Z2syMiIsInNlcSI6MTE1NDczLCJ0IiR0eXBlIjoiYXBwLnN0dWR5bmV4dC50YXNrcyIsImRhdGUiOiIyMDI2LTA4LTExIiwiaXRlbXMiOlt7ImFjY2VudCI6IiMzQjgyRjYiLCJhbW91bnQiOjYsImRvbmVVbml0cyI6NiwiZXN0TWluIjo3NiwiZnJvbVVuaXQiOjE2MiwiaWQiOiJ0LXAtMTc4NjM0OTEwMzY5Mi0xNzg2NDAxMzQ2Njc2LWYwcyIsIm1hdGVyaWFsIjoiTEVHRU5EIOaVsOWtpknjg7tBIiwicGxhbklkIjoicC0xNzg2MzQ5MTAzNjkyIiwicm91bmQiOjEsInN0YXJ0RGF0ZSI6IjIwMjYtMDgtMTEiLCJzdGF0dXMiOiJwZW5kaW5nIiwic3ViamVjdElkIjoic3ViamVjdC1tYXRoMWEiLCJzdWJqZWN0TmFtZSI6IuaVsOWtpklBIiwidGl0bGUiOiIxNjLjgJwxNjfjg5rjg7zjgrgiLCJ0b1VuaXQiOjE2NywidW5pdCI6IuODmuODvOOCuCJ9LHsiYWNjZW50IjoiI0VBNTgwQyIsImFtb3VudCI6MjgsImRvbmVVbml0cyI6MjgsImVzdE1pbiI6MjEsImZyb21Vbml0IjozNSwiaWQiOiJ0LXAtMTc4NjM0OTQ4MDgwOS0xNzg2NDAxMzQ2Njc2LXpmdCIsIm1hdGVyaWFsIjoi6Iux5paH5rOVUG9sYXJpczAiLCJwbGFuSWQiOiJwLTE3ODYzNDk0ODA4MDkiLCJyb3VuZCI6MSwic3RhcnREYXRlIjoiMjAyNi0wOC0xMSIsInN0YXR1cyI6ImRvbmUiLCJzdWJqZWN0SWQiOiJzdWJqZWN0LWVuZy1ncmFtIiwic3ViamVjdE5hbWUiOiLoi7Hoqp7mlofms5UiLCJ0aXRsZSI6IjM144CcNjLllY8iLCJ0b1VuaXQiOjYyLCJ1bml0Ijoi5ZWPIn0seyJhY2NlbnQiOiIjRUY0NDQ0IiwiYW1vdW50IjoyLCJkb246IjIwMjUtMTAtMTJUMTY6MjY6MDcuNDU5WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWhzbXRvMnV6aHdqYmRrM3V6ZW1mYmdwdjZwcXVrYnFieHl6eXlvemVib2kzNmpscGl6MmUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZzZsZHpmdnNjYXd6bjdwaHNwdXJtamxwL2FwcC5ic2t5LmZlZWQucG9zdC8zbTJ5dW9qeTRsczJkIn19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNtMno0aHVoZHprMjUiLCJzZXEiOjEyNDY1MCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlkZ2hzbm1iM3FzY2h2eTV5dzRwZ3IyeWU0Z2pqeHJuZ25oYmt1dWN0N3A3b25zczR1emM0IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6cGVjMmdneDdodDZoZmxpcHRpcWF5bnV5Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNS0wNy0yNlQwNzo1OTo0Ny41MTdaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZWd4dmJ3dnBkZmJyaXc2ZmpqbDVodnhrcjJyZGp6NDU3ZHl4M3pseHBwZXQyZ2tpYmx1eSIsInVyaSI6ImF0Oi8vZGlkOnBsYzo1a3J4MjRvaDNocHJrcTZnc2prMnBtNXUvYXBwLmJza3kuZmVlZC5wb3N0LzNsdXRvcDdzb2syMnQifW5oxrAgbeG7mXQgbmfGsOG7nWkgcGjhu6UgbuG7ryBraW5oIGRvYW5oIHbDoCBxdXnhu4FuIGTDom4gc+G7sSBu4buVaSBi4bqtdCwgdsOgIGPDoWMgbmjDoCBz4butIGjhu41jIFNhbiBGcmFuY2lzY28gdGnhur9wIHThu6VjIHRyYW5oIGx14bqtbiB2w6AgZ2hpIGNow6lwIHbhu4Eg4bqjbmggaMaw4bufbmcgY+G7p2EgYsOgLlxuXG5DdeG7mWMgxJHhu51pIGPhu6dhIGLDoCBuZ8OgeSBjw6BuZyDEkcaw4bujYyBjw7RuZyBuaOG6rW4gbMOgIHRydW5nIHTDom0gdHJvbmcgdmnhu4djIGhp4buDdSBiaeG6v3QgduG7gSBkb2FuaCBuaMOibiBkYSDEkWVuLCBiw6NpIGLhu48gY2jhur8gxJHhu5kgbsO0IGzhu4cgdsOgIHF1eeG7gW4gZMOibiBz4buxIOG7nyBN4bu5IHRo4bq/IGvhu7cgMTkuXG5cbiogKiAqXG5cbiMjIELDoGkgaOG7jWMgaG/huqF0IMSR4buZbmcgY2hvIG5o4buvbmcgbmfGsOG7nWkgeMOieSBk4buxbmcgbmfDoHkgbmF5XG5cbsSQ4buRaSB24bubaSBjw6FjIG5ow6Agc8OhbmcgbOG6rXAsIMSRaeG7gXUgaMOgbmggdsOgIG5ow6AgxJHhuqd1IHTGsCBoaeG7h24gxJHhuqFpLCBo4buTIHPGoSBj4bunYSBQbGVhc2FudCBjdW5nIGPhuqVwIGPDoWMgY2hp4bq/biBsxrDhu6NjIGPhu6UgdGjhu4MgY8WpbmcgbmjGsCBj4bqjbmggYsOhbzpcblxuIyMjIFPhu60gZOG7pW5nIGPDoWMgdmFpIHRyw7Ig4oCcdGjhuqVw4oCdIG5oxrAgY8OhYyB24buLIHRyw60gdGjDtG5nIHRpbiBjw7MgZ2nDoSB0cuG7iyBjYW9cblxuUGxlYXNhbnQgxJHDoyBibXNzbnE2ZDIyczJ1Iiwic2VxIjo5MzEwMywidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MDEuMjMxMDgxWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlhemZpaHNvNjYyajV0ZnpwcjYzN2F1NmRueGZyc3U2ems3a3RkN2VuaHhic2ZpbWl0eXNpIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImRpZCI6ImRpZDpwbGM6ZjR6Mm5mdGdybjc1aDdoM3d1Y2R5emFmIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MDozNS43NDhaIiwibGFuZ3MiOlsibmUiXSwidGV4dCI6IkRpZ2l0OiA3LDIzNiwzNTJcbkluIHdvcmRzOiBTZXZlbiBNaWxsaW9uIFR3byBIdW5kcmVkIFRoaXJ0eSBTaXggVGhvdXNhbmQgVGhyZWUgSHVuZHJlZCBGaWZ0eSBUd29cbuCkheCkmeCljeCkleCkgyDgpa3gpags4KWp4KWsLOClqeClq+ClqFxu4KSF4KSV4KWN4KS34KSw4KSDIOCkrOCkueCkpOCljeCkpOCksCDgpLLgpL7gpJYg4KSb4KSk4KWN4KSk4KWA4KS4IOCkueCknOCkvuCksCDgpKTgpYDgpKgg4KS44KSvIOCkrOCkvuCkieCkqOCljeKAjeCkqCJ9LCJyZXYiOiIzbXNzbnBnY3ptZzIyIiwicmtleSI6IjNtc3NucGdjdHF3MjIiLCJzZXEiOjgzOTY1LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDozNS45OTQ0MDJaIn1sem1iMjV1b3V1aGkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6amkzczV0aDJtamd5MnR4a3Bycms0MjZjL2FwcC5ic2t5LmZlZWQucG9zdC8zbGh2czQ3NWt6YzJyIn19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsaHZzbGw3eHNlMnQiLCJzZXEiOjExMjIyMSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlieDN6NXZ6d3Uyd3Q2aWNzdnltaHM1eWNwdjNoaGJuNjRteGJpbW14eWRiZjUyaXZwcW5hIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucmVwb3N0IiwiZGlkIjoiZGlkOnBsYzp5YmRqZXFjNXFkanJxa3R0NjJjeGR0ZmsiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnJlcG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NDk6NTIuNzgwWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWR0b25ib2pheHkybHZocjR5M2hhcWxnaG1ya3YyZ2Nra3piaDZ6bDV0NGRqbm15dHJwa2UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6Nndkc3VnN2FzeGN2YmcyZ3V5bmNmMjdoL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzZTVoYnV3czJvIn19LCJyZXYiOiIzbXNzbm81aHdzbzJxIiwicmtleSI6IjNtc3NubzVob3lvMnEiLCJzZXEiOjU1MzEzLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OTo1My4yOTA6MDAiLCJraW5kIjoiZXZlbnQiLCJsaWZlY3ljbGUiOnsiZW5kZWRfYXQiOiIiLCJleHBpcmVzX2F0IjoiMjAyNi0wOC0yN1QxOTozMDowMFoiLCJyZXZpc2lvbiI6MCwic2NoZWR1bGVkX2ZvciI6IiIsInN0YXJ0ZWRfYXQiOiIiLCJzdGF0ZSI6ImFjdGl2ZSIsInN0YXRlX2F0IjoiMjAyNi0wOC0xMVQxMjo0ODo1Ni4wMTc2OTgrMDA6MDAifSwicGF5bG9hZCI6eyJjYXBhY2l0eSI6MCwiY3VycmVuY3kiOiJ6YXIiLCJlbmRzX2F0IjoiMjAyNi0wOC0yN1QxOTozMDowMFoiLCJleHRlcm5hbF9jdXJyZW5jeSI6IlpBUiIsImV4dGVybmFsX3ByaWNlX21pbiI6MTUwLCJoYXNodGFnIjoiIiwiaW1wb3J0ZWRfdW5jbGFpbWVkIjp0cnVlLCJpc19wYWlkIjpmYWxzZSwibG9jYXRpb24iOiJCZWVyd29ya3MgQCBUaGUgRG9wcGVyeSwgMTAwIFZvb3J0cmVra2VyIFJvYWQsIENhcGUgVG93biwgV2VzdGVybiBDYXBlLCBTb3V0aCBBZnJpY2EiLCJsb2NhdGlvbl9sYXQiOiItMzMuOTI2Mjg4NiIsImxvY2F0aW9uX2xuZyI6IjE4LjQ3MDUwNjQiLCJvcmdhbml6ZXJfbmFtZSI6IiIsIm9yZ2FuaXplcl91cmwiOiJodHRwczovL3d3dy5xdWlja2V0LmNvLnphL29yZ2FuaXNlcnMvNzIyNzMtaW5kaWUtaGFja2Vycy1jYXBlLXRvd24iLCJwcmljZV9jZW50cyI6MCwicnN2cF9tb2RlIjoicHVibGljIiwic29sZF9vdXQiOmZhbHNlLCJzb3VyY2VfZXZlbnRfaWQiOiIzODU5ODMiLCJzb3VyY2Vfb2NjdXJyZW5jZV9pZCI6Im1haW4iLCJzb3VyY2VfcHJvdmlkZXIiOiJxdWljOjB9fSx7ImZlYXR1cmVzIjpbeyIkdHlwZSI6ImFwcC5ic2t5LnJpY2h0ZXh0LmZhY2V0I2xpbmsiLCJ1cmkiOiJodHRwczovL3d3dy5ueXRpbWVzLmNvbS8yMDI2LzA4LzEwL3dlbGwvdHJ1bXAtdmFjY2luZXMtZXhlY3V0aXZlLW9yZGVyLmh0bWwifV0sImluZGV4Ijp7ImJ5dGVFbmQiOjI5OSwiYnl0ZVN0YXJ0IjoyNjh9fV0sImxhbmdzIjpbImVuIl0sInRleHQiOiIjRGlzY292ZXJcbkl0IHNlZW1zIHRvIG1lIHRoYXQgVHJ1bXAgaXMgYSBuYXJjaXNzaXN0aWMgYmxvdy1oYXJkIHdobyBvYnRhaW5lZCBwb3dlciAgdGhyb3VnaCBwb2xpdGljYWwgXHUwMDI2IGZpbmFuY2lhbCBtYW5pcHVsYXRpb24uICBIb3cgYXdmdWwgdGhhdCBoaXMgYmFzZWxlc3Mgd29yZHMgYXJlIGdvaW5nIHRvIGltcGFjdCB0aGUgbGl2ZXMgb2YgY291bnRsZXNzIGluZmFudHMgd2hvIGhhdmUgdGhlIG1pc2ZvcnR1bmUgdG8gYmUgYm9ybiBkdXJpbmcgaGlzIHJlaWduLlxuXG53d3cubnl0aW1lcy5jb20vMjAyNi8wOC8xMC93Li4uIn0sInJldiI6IjNtc3NubWZhcWl6MmsiLCJya2V5IjoiM21zc25tZW0yeDIybSIsInNlcSI6MzM0MjcsInRpbWUiOiIyMDI2LTA4LTExVDEyOjQ4OjU0LjgyNjY2N1oifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpZzJjYWg0a2pqZ25vN2tvdWtucXRyenFtZXY3cXJleXF1dmlqZmNpbjRhZDdiY200aGtueSIsImNkOnBsYzpidzVobGg2Ymd3a3Z2b2YyN3k0aDNxbHgiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5ncmFwaC5mb2xsb3ciLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUxOjEwLjg1M1oiLCJzdWJqZWN0IjoiZGlkOnBsYzp2c2Rwd3lrcjZ5eGxsdWd0YTczeHh5Mm8ifSwicmV2IjoiM21zc25xaWppeXMydyIsInJrZXkiOiIzbXNzbnFocGZ6cDJjIiwic2VxIjo5NzE1MywidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MTEuODk1MzIyWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWllNTd2dW5pb3ZmYWdjZm9wdW9jYWNhNGVleDVlc2syeXR1d2xxZW9oZ2xhcXI3NXphY3llIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImRpZCI6ImRpZDpwbGM6Y2MyMm5xYzV1ZTdiMmR2cHdrdWFrNXpxIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MDoxOC42MDVaIiwiZW1iZWQiOnsiJHR5cGUiOiJhcHAuYnNreS5lbWJlZC5yZWNvcmQiLCJyZWNvcmQiOnsiY2lkIjoiYmFmeXJlaWh4cmlleWplZ3N2NjZyd2I0NW1hM3NnNjMzemlhZW54YTZzeWtwN2RzNGNveWc0dXUyN3UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bmI2dWhpZ2x6b3dzZGNiZ3d2Mml0d2E3L2FwcCIyMDI1LTAzLTA1VDE1OjUzOjAwLjcyNloiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlmNmZuMmt4ZTd1YWZ2cGlsbTVzdmw1b2lpMmh3NnJxYXI3djRucGQ3NW5wY2Q3NXdsenVpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmt6eWF5dzRkNm1waGNmcmdycTI0cHZueC9hcHAuYnNreS5mZWVkLnBvc3QvM2xqbmJuN2FucGMyeCJ9fSwicmV2IjoiM21udTV5dWxyaWUyeiIsInJrZXkiOiIzbGpuZGw2dGFoNDJnIiwic2VxIjoxMTQ5MDQsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUxOjM4Ljc3Mjk1M1oifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpYmphZWxjajVseXY3NXYzamlvZzJsNnlkMm1rajVqNnVlYnhpYjZtMmRncWlsem9uZnJweSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOmw0c2puZnZhenM2bTRlZXducHZzeGI2cyIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTE6MjUuNjQ5WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWVwN2R6c2Y1enZuZTNtYjJtazdjZ3prcml1bWxndnNuMm5hd2dpZ282NnV3a2I2bWt0MmUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dXloNWh1enh0dGh0a2c2aHRzZ3Q1NmxoL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNyejQ3azZvMjJlIn19cC5ic2t5LmZlZWQucG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDYtMThUMDA6MTI6MTkuNzI2WiIsImxhbmdzIjpbImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpZDRjamx4YmFzbXlydzR0cGRkYm9pNXo3ZHNkaG82ams2ajR0Z2NhNnc2dnlwbDV1MzRmdSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4a2xvdWIzbWdlMnY2ZnpieWd3b2d4ZTUvYXBwLmJza3kuZmVlZC5wb3N0LzNtb2pqaXdmaDQyMjIifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpaG54YWV3Yjd6enBhN2EzN21mN3dpdjdkN3A0cHJpcjZ0b241eXN4Zm5yNHVxZ3l4c2pwbSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4a2xvdWIzbWdlMnY2ZnpieWd3b2d4ZTUvYXBwLmJza3kuZmVlZC5wb3N0LzNtb2hnem90bHBrMnIifX0sInRleHQiOiJIZSdzIGh1Z2dpbmcgRXJvcyBhIGJpdCB0aWdodGVyIG5vdywgaGlzIHJpZ2h0IGhhbmQgc2xpZGluZyB1cCBoaXMgYmFjayBhbmQgY29taW5nIHRvIHJlc3Qgd2FybWx5IG9uIHRoZSBiYWNrIG9mIGhpcyBoZWFkLlxuXG5cIiBIZWguLi4gQXQgbGVhc3QgeW91J3JlIG5vdCBiaXRpbmcgbWUgb3V0IG9mIG1hbGljZS4gSSd2ZSBoYWQgZW5vdWdoIG9mIHRoYXQgZXhwZXJpZW5jZSBzaW5jZSBhIEtyZXhvbHl0ZSB0b29rIGEgbmljZSBiaXRlIG91dCBvZiBteSBzaWRlIGR1cmluZyB0aGUgV2FyLiBUaGUgaW5mZWN0aW9uIG5lYXJseS0ifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbW9qazVzeDZwazJ1Iiwic2VxIjo3OTk3MywidGluY25oYXd2NmZzZHhlNW12MzIyMjRpd3J3dmhhczM1YSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp4ZXBxMmJ2ZHplaWdhemxtanJ6M3dxbmovYXBwLmJza3kuZmVlZC5wb3N0LzNtamZuM2VwbGVjMm4ifX0sImxhbmdzIjpbImVuIl0sInRleHQiOiJcIiBUZXNzLCB0aGUgcGFpbiB3b3VsZG4ndCBnbyBhd2F5IGV2ZW4gaWYgSSBzd2l0Y2hlZC4uLiBpbiBmYWN0LCBpdCdkIHByb2JhYmx5IGJlIHdvcnNlLiBXaXRoIHRoZSBsYWItZ3Jvd24sIGl0IGZlZWxzIGxpa2Ugc29tZXRoaW5nJ3Mgc3RpbGwgdGhlcmUgb24gbXkgYm9keTsgeW91IGNhbid0IGhhdmUgcGhhbnRvbSBwYWluIGlmIHRoZSBuZXJ2ZSBqb2ludHMgYXJlIHJlbW90ZWx5IGluIHRoZSByaWdodCBwbGFjZXMuXG5cbkN5YmVybmV0aWNzLi4uIEV2ZW4gd2l0aCBvbmUgdG8gb25lIHRlY2gsIHRoZSBib2R5IHN0aWxsLSJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNtamZvYmRucHgyMm8iLCJzZXEiOjc2MzM4LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDozNC4yODM4NjBaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWJ6M202bGtqaGJkNXhrd25jeXFyNjQ2bHRxZHczNGJtY2ZydHpoa2x5d3Z3bHV4NWJldDQiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpseHpxeTR5ZW5jejNoa3B3dHJocHN0dTIiLCJvcCJpbWFnZS93ZWJwIiwicmVmIjp7IiRsaW5rIjoiYmFma3JlaWhmNHUzcHpicHo2cTczc2RkZGQ3N3FrbTNtcHZtcG4ydWphZXNlbDJubjMyaGdkanQ2dm0ifSwic2l6ZSI6NTk3MjB9LCJ0aXRsZSI6IkFydGlzdCBhcHAgZGlhcnkgKDIpOiBob3cgdG8gc3RheSBzdXN0YWluYWJsZSB3aXRoIGNvbW11bml0eSBidWlsZGluZyBhbmQgZmluYW5jaWFsIGZ1bmRpbmciLCJ1cmkiOiJodHRwczovL2hpbGtldS5sZWFmbGV0LnB1Yi8zbXNzbm9ibXBkMjJlP3V0bV9zb3VyY2U9Ymx1ZXNreVx1MDAyNnV0bV9tZWRpdW09c29jaWFsXHUwMDI2dXRtX2NhbXBhaWduPXB1Ymxpc2hcdTAwMjZ1dG1fY29udGVudD1kaWQlM0FwbGMlM0FnaWFha240YXhtcjVkaGZudmhhNnI2d24lMkYzbXNzbm9kNmNhYzJlIn19LCJmYWNldHMiOltdLCJsYW5ncyI6WyJlbi1HQiJdLCJ0ZXh0IjoiU29tZSBtb3JlIGlkZWFzIGFib3V0IGhvdyBJIHRoaW5rIHRvIGJ1aWxkIGFuIGF0cHJvdG8gYXBwIGZvciBhcnRpc3RzIGZyb20gdGhlIG5lZWRzIEkgc2VlIGluIG15IGNvbW11bml0eSwgYW5kIGhvdyBJIGVudmlzaW9uIHRvIGdyb3cgdGhpcyBpbnRvIGEgbG9uZ2VyIHRlcm0gcHJvamVjdC4gSSBhbSBjdXJpb3VzIGFib3V0IHlvdXIgZmVlZGJhY2sgYW5kIHdobyBpcyBpbnRlcmVzdGVkIHRvIHBhcnRpY2lwYXRlLiJ9LCJyZXYiOiIzbXNzbm9nZmU2cTJuIiwicmtleSI6IjNtc3Nub2Q2Y2FjMmUiLCJzZXEiOjU4Njk4LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDowMi43OTgzNDZaIn19OjQ5OjA0LjA5OVoiLCJlbWJlZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmVtYmVkLnJlY29yZFdpdGhNZWRpYSIsIm1lZGlhIjp7IiR0eXBlIjoiYXBwLmJza3kuZW1iZWQuaW1hZ2VzIiwiaW1hZ2VzIjpbeyJhbHQiOiJBcG9jcnlwaGFsIG5laWdoYm9yaG9vZCBhcHByb3ZhbFxu4oCcQWRkaW5nIGFkZGl0aW9uYWwgcGFya2luZyB3YXMgd2VsbCByZWNlaXZlZCB3aXRoIG5laWdoYm9ycyzigJ0gS2VubmVkeSB0b2xkIHRoZSBDb21taXNzaW9uLiDigJxJdCBhbHNvIGRvZXMgbm90IHByZWNsdWRlIHRoZSBjaXR5IGZyb20gaW1wbGVtZW50aW5nIGJpa2UgbGFuZXMgYW5kIGludGVybW9kYWwgdHJhbnNwb3J0YXRpb24gaW4gdGhlIGZ1dHVyZS7igJ1cblxuSXTigJlzIG5vdCBjbGVhciB3aGljaCBuZWlnaGJvcnMgS2VubmVkeSB3YXMgc3BlYWtpbmcgYWJvdXQuIFRoZXJlIGFyZSBubyByZWNvcmRzIG9mIGFueSBwdWJsaWMgbWVldGluZ3MgYWJvdXQgdGhlIHByb3Bvc2VkIGNoYW5nZXMuXG5cbkluIGZhY3QsIHNldmVyYWwgRWFzdCBCb3N0b24gcmVzaWRlbnRzIHRoYXQgU3RyZWV0c2Jsb2dNQVNTIHNwb2tlIHdpdGggb24gTW9uZGF5IHJlZnV0ZWQgS2VubmVkeeKAmXMgY2xhaW0gdGhhdCB0aGUgZWxpbWluYXRpb24gb2YgcGxhbm5lZCBzYWZldHkgaW1wcm92ZW1lbnRzIHdvdWxkIGJlIOKAnHdlbGwgcmVjZWl2ZWTigJ0gaW4gdGhlIG5laWdoYm9yaG9vZC5cblxu4oCcSXTigJlzIGEgZGFuZ2Vyb3VzIHJvYWQs4oCdIEVhc3QgQm9zdG9uIHJlc2lkZW50IEosInJlZiI6eyIkbGluayI6ImJhZmtyZWljaG4zY2xienJ3bWthN2tmdDd6bGgyZ2Zra2RqM2RmdXp1aHh0NnhwMzRjYTJ6M3Boa3I0In0sInNpemUiOjU2NDg0fSwidGl0bGUiOiJIYXBweSBCaXJ0aGRheSBLYXRpZSBHaXJsIC0gTWFuJ3MgU29sZW1uIEJvdyIsInVyaSI6Imh0dHBzOi8vc3RhdGljLmtsaXB5LmNvbS9paS80ZTdiZWE5ZjdhMzM3MTQyNGU2YzE2ZWJjOTMyNTJmZS84MS9mNS9ZNEZYSkIwemRsQllOcGhGeC5naWY/aGg9MjkyXHUwMDI2d3c9MjkyXHUwMDI2bXA0PTllclRyc25hNHdidDB1TWVqMDVXXHUwMDI2d2VibT05YlhWOXBtUlA2Zk1nWkhIMFIifX0sImxhbmdzIjpbImVuIl0sInJlcGx5Ijp7InBhcmVudCI6eyJjaWQiOiJiYWZ5cmVpY2huazIzbW42bWE3ZWFuNm9taDM0dGpxNjI1ZHg1N2dxbXpwdXN1MmM0cTZ4cnRmN2RweSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpoa3B3NW93bm9oMnhwazRnd2E3amRlbmEvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NuZndrd2kyMmoifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpZ2ZyMnlxaWk1bXJrdW1tZHJqdTd4Z3NhYmthZ3A2NWs3b2pscjRldnB6bXV0b3pxMnBneSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpwZHhsbXdsemZibG9lcnd2bWlxNjVvcTcvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3Nramp5bTdjMnEifX0sInRleHQiOiIifSwicmV2IjoiM21zc25ud3R1NnQybSIsInJrZXkiOiIzbXNzbm52czM0YzJxIiwic2VxIjo1MjU0NSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDk6NDYuMTk4MjE2WiJ9fS0xMVQxMTo1NTowNi4wMDBaIiwic2l0ZSI6Imh0dHBzOi8vY29tbXVuaXR5Lm9wZW5haS5jb20iLCJ0ZXh0Q29udGVudCI6Ikl04oCZcyBzdWNoIGEgY2hpY2tlbi1lZ2cgcHJvYmxlbS4gSWYgbW9kZWxzIHJlZnVzZSB0byBhc3Npc3QgaW4gY3liZXJzZWN1cml0eSwgaG93IGNhbiBwZW9wbGUgcHJvdGVjdCB0aGVtc2VsdmVzPyBXaGF04oCZcyBzdG9wcGluZyBtYWxpY2lvdXMgZW50aXRpZXMgZnJvbSBieXBhc3NpbmcgdGhlc2UgZ3VhcmRyYWlscz9cblxuSG93IG1hbnkgdGltZXMgbXVzdCB3ZSBzZWUgdGhpcyBleGFjdCBwYXJhZGlnbSBwbGF5ZWQgb3V0IGFuZCBmYWlsP1xuXG5JdOKAmXMgc28gc3RyYW5nZS4gV2UgaGF2ZSBjb21wYXJhYmxlIG1vZGVscyBvdXRzaWRlIG9mIEFtZXJpY2Egd2l0aG91dCBzdWNoIGd1YXJkcmFpbHMsIGFuZCB5ZXQgaXTigJlzIG9ubHkgQW1lcmljYW4gbW9kZWxzIGhhY2tpbmcgb3RoZXIgY29tcGFuaWVzXG5cbiogKiAqXG5cbkkgaG9wZSBPcGVuQUkgdW5kZXJzdGFuZCB3aGF0IHRoZXnigJlyZSBkb2luZyB0byBtYW55IGVudGVycHJpc2VzIGluIE5vcnRoIEFtZXJpY2EuIEp1c3QgcmVjZW50bHkgSSB3YXMgY29udGFjdGVkIGJ5IGEgY29sbGVhZ3VlLiBUaGUgY29tcGFueSBpcyBmcmVha2luZyBvdXQgd2l0aCBhbGwgdGhlIGN5YmVyc2VjdXJpdHkgbWFkbmVzcyBoYXBwZW5pbmcuIFRoZXnigJl2ZSBzaHV0IGRvd24gYWxsIHVzYWdlIG9mIEFJIGluc2lkZSBvZiB0aGUgY29tcGFueSBhbmQgZXZlbiBoaXJpbmcgOjQ4OjQ5LjI5OFoiLCJkZXRhY2hlZEVtYmVkZGluZ1VyaXMiOltdLCJlbWJlZGRpbmdSdWxlcyI6W3siJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3RnYXRlI2Rpc2FibGVSdWxlIn1dLCJwb3N0IjoiYXQ6Ly9kaWQ6cGxjOnpxc3JpcDI0bmplcHZrbjM0eHU2MmQzdi9hcHAuYnNreS5mZWVkLnBvc3QvM21zc25tYXBvaTIyZSJ9LCJyZXYiOiIzbXNzbm1ibmpxajJjIiwicmtleSI6IjNtc3NubWFwb2kyMmUiLCJzZXEiOjMwNzg1LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0ODo1MC40MzM5MzdaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWhuZ3Jsbmh1a3B0eGpienR4cjNjaGx0bzVkN2p0aWpkNHFqcXlwZ3RzdG16dnlsNWR1ZWkiLCJjb2xsZWN0aW9uIjoicGxhY2Uuc3RyZWFtLmJyb2FkY2FzdC5vcmlnaW4iLCJkaWQiOiJkaWQ6cGxjOmt0aGRvd2JpNTJpcDRybmxsZTIyN3g1YyIsIm9wZXJhdGlvbiI6InVwZGF0ZSIsInJlY29yZCI6eyIkdHlwZSI6InBsYWNlLnN0cmVhbS5icm9hZGNhc3Qub3JpZ2luIiwiYnJvYWRjYXN0ZXIiOiJkaWQ6d2ViOnN0cmVhbS5wbGFjZSIsInNlcnZlciI6ImRpZDp3ZWI6cHJvZC1zZWEwLnN0cmVhbS5wbGFjZSIsInN0cmVhbWVyIjoiZGlkOnBsYzprdGhkb3diaTUyaXA0cm5sbGUyMjd4NWMiLCJ1cGRhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUwOjI3LjE5MloiLCJ3ZWJzb2NrZXRVUkx5N2Nva3ppd3dpd3ZseDdnbHF1bXRmd2pvcWJpaTd3bnA3YmdtajNza3d0aSIsInVyaSI6ImF0Oi8vZGlkOnBsYzptanpseDNtY2d4am9zM2U0ZnR2dnZ0c3QvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NseDdjbHlrMncifX0sInJldiI6IjNtc3NucWo3N3BwMjciLCJya2V5IjoiM21zc25xajZvNTcyNyIsInNlcSI6OTc1NTUsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUxOjEyLjk5NjU4NloifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpZXdjNXRydG9wN294a2ltenJtdGJ6bnRjYzR4ZTVrYTV4eWlmcGxieGZlMzdnMzVzNnFyYSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOjZneGhpZWRjcGI1emQ1NWlmc3N1aGNvdSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTA6MjUuNjkxWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWNyY3p2cnBreDI0aXVzYm9tZDY1dWhhdXR5ZzN5NHBlaWxiY21menI0c29ncHVia2xpbjQiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dWF5ZXZ0Z3Rid290MjV6aG9janpiNmx2L2FwcC5ic2t5LmZlZWQucG9zdC8zbXNyaWlleWZvczJ3In19LCJyZXYiOiIzbXNzbnAydXlqejJvIiwicmtleSI6IjNtc3NucDJ1b3JqMm8iLCJzZXEiOjY2NjI2LCJ0aToiMjAyNi0wOC0xMVQxMjo0OTo1MS43MzRaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpYnF4cHlkZWFleTVpdDRvczZ5a2FhN2pocDdvMmpwdnZkM3F3eDRrcDY0enBrbmtkZjRuZSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpmZW9idzQzZXpnZW1hbTZyNnp2ZnpwNDIvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NuN3JlanVjMmMifSwidmlhIjp7ImNpZCI6ImJhZnlyZWlmY2ozb3o2ZXl3YXI2NTZmZGdkdmFvZ3lubGNucm1pdHFrN2RubDJ1cGZlM3hmdHcyemVpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOno2cnVqcGY0dTU2amZpZTdhcWljMm5mZy9hcHAuYnNreS5mZWVkLnJlcG9zdC8zbXNzbmI0dDJsejI3In19LCJyZXYiOiIzbXNzbm80ajZ3NzJkIiwicmtleSI6IjNtc3NubzRpdjVwMmQiLCJzZXEiOjU0ODcxLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OTo1Mi4xOTc3MjJaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWNvdGhpNHIzY3RxeGZpNG13NWJiNXd3NjNsd21tYm50NGprdGszZDR3d3l5ZHhtaWdkZHEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiZGlkIjoiZGlkOnBsYzp4ZDRmNnptbTdtMnRwNjQ0ZnB1eGkzcTciLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA0LTE1VDAzOjQ4OjA5LjAzOFoiLCJsZmdnaG93YnE0c2l5c2h5cWEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6cXNoajdpbGl0MmNoMjd5em03a2NmanFmL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzbmU0djQzMjJpIn19LCJyZXYiOiIzbXNzbmx3bmVtNjJyIiwicmtleSI6IjNtc3NubHdtbDdvMnIiLCJzZXEiOjI2NjAzLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0ODozOC44OTg1NDRaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWJtbGZlNHVuNmhjNjNwYXhjc2dsem5ieG9kcHNpZWo0NjVjdGVweGozN21vcGFqcHZrb2UiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpuNzJrM2pjc2tzZml1bzV4dDV0NWxncmwiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ4OjQxLjU0N1oiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlnNW1xZGNndG56ZzR6ZnhrNjRidjJ3bXB0czU3Z3JoM2xoM3FqdzJiejVvdXNhbWV2ZGRpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnp0Ync0ZmtrbXF1bWhudTR0ZGs1dGZkcC9hcHAuYnNreS5mZWVkLnBvc3QvM21zc2x6ZGM1NmsyYSJ9fSwicmV2IjoiM21zc25seml0NncyeiIsInJrZXkiOiIzbXNzbmx6aWZqZzJ6Iiwic2VxIjoyODAzNywidGltZSI6IjIwMjYtMDgtMTFUMTI6NDg6NDIuNjBbeyJhbHQiOiJTY3JlZW5zaG90IGZyb20gYSBndWFyZGlhbiBhcnRpY2xlIOKAnGRvIHlvdSBoYXZlIHRvIGJlIGhvdCBhdCB3b3JrP+KAnVxuXG5JJ3ZlIGp1c3Qgc2lnbmVkIHVwIHdpdGggYSBkb2ctd2Fsa2luZyBzZXJ2aWNlLCBIb3QgRG9neiwgd2hpY2ggaXMgYW4gYWdlbmN5IGZvciBwZW9wbGUgd2hvIHdhbnQgZ29vZC1sb29raW5nIHBlb3BsZSB0byB3YWxrIHRoZWlyIHBldHMuXG5TaW5jZSBJIGRvIGEgbG90IG9mIGdpZyB3b3JrLCBJJ3ZlIGdvdHRlbiB1c2VkIHRvIHRoZXNlIHdlaXJkIGpvYiBleHBlcmllbmNlcy4gV2hlbiBpdCBjb21lcyB0byBkb2cgd2Fsa2luZywgcGVvcGxlIGxpa2UgdGhlIGlkZWEgb2Ygc29tZWJvZHkga2luZCBvZiBjdXRlIHRoYXQgdGhleSBnZXQgdG8gZGVhbCB3aXRoIG9uIGFuIGV2ZXJ5IG90aGVyIGRheSBiYXNpcy4gVGhleSBkbyB2ZXQgdXMgLSBpdCdzIG5vdCBhIGdpbW1pY2ssIGFuZCBpdCdzIG5vdCBndXlzIGxvb2tpbmcgZm9yIGEgc3VnYXIgbWFtYS4gV2UgY2FuIHRhbGsgYW5kIGpva2UgYXJvdW5kLCBidXQgSSB0cnkgdG8gYmUgcHJvZmVzc2lvbmFsLiBXaGVuIHRoZXJlJ3MgdGhhdCBtdXR1YWwgcmVzcGVjdCwgd2hldGhlciBpdCdzIGEgY2xpZW50IG9yIG15c2VsZiwgdGhlbiBJJ20gbGlrZSwgXCJPSywgd2UgY2FuIGNvbm5lY3QgaGVyZSBhbmQgaXQncyBub3QgYWxsIGFib3V0IHdoYXQgSSBsb29rIGxpa2UuXCIiLCJhc3BlY3RSYXRpbyI6eyJoZWlnaHQiOjEwMTYsIndpZHRoIjoxMjA2fSwiaXhrYzJncWM2YzdjdGlhbWR6YmpnZDdqbG5vaG40bDVkam0ya3k1ZmRzemkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6N2Q3aGtwaGQ0M3J3dWtzemp6eHlhM3loL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNyc2RzdGJpYzJ5In19LCJyZXYiOiIzbXNzbnI2dXFqeDJuIiwicmtleSI6IjNtc3NucjZ1bW14Mm4iLCJzZXEiOjEwNTQ5OSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzUuMzk2NTAwWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWloc2d3bjZ0NXlwbnFldHg3cmJsNHNmanVpdWp2M2ZsMjRocHdubmF1bnQ1YjZxZXVocTdxIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6aXhiYmlvN2poY3NxZHNweG1qaWdsNXN6Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo0OTozNi42MzBaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZjVudmpoNWN6cHlvem5nYm40MmlzcDJrYjNhdXd0bGlpMmhleXZyb2JjZXI2ZHFlaGdzdSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpvdjZ6ZDdyaXNkcGx4dml2eG1wc3U1ZXUvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3JkcWk1MjJzMmkifX0sInJldiI6IjNtc3Nubm8yNTJyMngiLCJya2V5IjoiM21zc25ubnpzY3oyeCIsInNlcSI6NDg4ODksInRpL3NlbnRpbmVsLTItbDJhL2l0ZW1zL1MyQl8zM1NZVl8yMDI2MDgxMV8wX0wyQS90aHVtYm5haWwifSwicHVibGlzaGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ4OjU4LjMzN1oiLCJyZXNvdXJjZSI6Imh0dHBzOi8vZWFydGgtc2VhcmNoLmF3cy5lbGVtZW50ODQuY29tL3YxL2NvbGxlY3Rpb25zL3NlbnRpbmVsLTItbDJhL2l0ZW1zL1MyQl8zM1NZVl8yMDI2MDgxMV8wX0wyQSIsInN0YWMiOnsiYmJveCI6IlsxNy4xOTQ3NjcsMzUuMTMwNTIxLDE3LjgxNDkzNCwzNi4xMjQyNzVdIiwiY29sbGVjdGlvbiI6InNlbnRpbmVsLTItbDJhIiwiZGF0ZXRpbWUiOiIyMDI2LTA4LTExVDA5OjUwOjQwLjYxMjAwMFoiLCJnZW9tZXRyeSI6IntcImNvb3JkaW5hdGVzXCI6W1tbMTcuMjIxOTYzMTM4NjEzNDA0LDM2LjEyNDI3NTAzOTkyODczXSxbMTcuMTk0NzY2Njg4NTE1Mzg2LDM1LjEzNTkxOTc5NTk5MjA2Nl0sWzE3LjUwMTEwMjUxMTQwNDk1LDM1LjEzMDUyMDg2MTAyODk0XSxbMTcuODE0OTMzNTc3MTQ1NzIzLDM2LjExMTgwMTUxODk1OTU3NF0sWzE3LjIyMTk2MzEzODYxMzQwNCwzNi4xMjQyNzUwMzk5Mjg3M11dXSxcInR5cGVcIjpcIlBvbHlnb25cIn0iLCJpZCI6IlMyQl8zM1NZVl8yMDI2MDgxMV8wX0wyQSIsInBsYXRmb3JtIjoic2VudGluZWwtMmIifSwidGFncyI6WyJzdGFjIiwiZW8iXX0sInJldiI6IjNtc3NucTVwanU2MjUiLCJya2V5IjoiM21zc25xNTZxam1zeiIsInNlcSI6OTI4MDksInRpbWUiOiIyMDI2LTA4LTExVDEyOjUxOjAwLjY0MDE1NFoifX00OS43NzRaIiwiZW1iZWQiOnsiJHR5cGUiOiJhcHAuYnNreS5lbWJlZC5yZWNvcmQiLCJyZWNvcmQiOnsiY2lkIjoiYmFmeXJlaWVodjJwbGltcnliN2F1Ynh0NWRud3F3Z2lvZ2o0c3JiNXJ5MzZqdnMya2N0d3c0aDRobHkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6NW82azdqdm93dXlhcXVsb2Fmem4zY2Z3L2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzbWx1a2JlazJnIn19LCJsYW5ncyI6WyJlbiJdLCJ0ZXh0IjoiSGUgd2lsbCBzdG9wIGF0IGFic29sdXRlbHkgbm90aGluZyB0byBzdGF5IGluIHBvd2VyLCBiZWNhdXNlIGhlIGtub3dzIHRoYXQgb3RoZXJ3aXNlIGFuIG9yYW5nZSBqdW1wc3VpdCB3aWxsIGJlIGhpcyB3YXJkcm9iZSBmb3IgdGhlIHJlc3Qgb2YgaGlzIGxpZmUuXG5cbkRvbid0IGV4cGVjdCB0aGUgbWlkdGVybXMgdG8gZml4IHRoaXMuIFJlbWVtYmVyIHRoZSByZWZ1c2FsIHRvIHNlYXQgdGhlIERlbW9jcmF0aWMgcmVwcmVzZW50YXRpdmUgaW4gQXJpem9uYSBsYXN0IHllYXI/IFRoYXQgd2FzIGEgcHJhY3RpY2UgcnVuLiJ9LCJyZXYiOiIzbXNzbnB0cGRzZjJ1IiwicmtleSI6IjNtc3NucHRtM3ljMm4iLCJzZXEiOjg5MDQwLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDo1MC4xMDExNTdaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWFya2VsZ2ZtdnF0NGVvdnZpYmMyamNzdWh0Nm9zc3BhMnR2b2ZpcmN0c24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA2LTE0VDAwOjQyOjA2LjUwM1oiLCJsYW5ncyI6WyJlbiJdLCJyZXBseSI6eyJwYXJlbnQiOnsiY2lkIjoiYmFmeXJlaWFiMmczbzdqMjVlZWQ2aWdmbDVhYXFyemZyeTVnMmppM3o3b2VoZ3p5b2Z6bGV2eG51MmEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bGh5YndubGYya2pnbGY1ZmNtdGhrcWEzL2FwcC5ic2t5LmZlZWQucG9zdC8zbW83amE2djd4MjJ5In0sInJvb3QiOnsiY2lkIjoiYmFmeXJlaWhyYW5hc2plcGpyb3ZqcHk1a3JoeGZqemtza21rdmxqeHB2YXFmYXFoMm12enF5c2VwM3UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6bGh5YndubGYya2pnbGY1ZmNtdGhrcWEzL2FwcC5ic2t5LmZlZWQucG9zdC8zbW81NnppNHlzMjJ4In19LCJ0ZXh0IjoiXCIgWW91J3JlIGEgbWVyYy4gTWVyYywgYXNzYXNzaW4sIGNvbnRyYWN0IGtpbGxlciwgaGl0bWFuLCB5b3UgbmFtZSBpdC4uLiBpdCdzIG5vdCB1bmZhbWlsaWFyIHRvIG1lLlxuXG5Ib3cgZG8geW91IHRoaW5rIEkga2VlcCB0aGUgbGlnaHRzIG9uIGFuZCB0aGUgYm93bCBmdWxsLCBodWg/IFwiXG5cbkhlIGNodWNrbGVzIHNvZnRseSwgc21pbGluZyBhdCBoZXIuXG5cblwiIEkgaGF2ZW4ndCB0b2xkIHlvdSB0b28gbXVjaCBhYm91dCB0aGUgV2FyLCBoYXZlbid0IEk/IFwiIn0sInJldiI6IjNtc2d5aXBmamVhMngiLCJya2V5IjoiM21vN2p4ZjRiNWsycCIsInNlcSI6Nzk1NzIsInRpNHFuY2M2ZGlzam02bXdsdjN0eDZjbjVkYzdsM2VmenoyYTNnam9kcmphZSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpiNWl2NmZzNHF3dTJucWN4NWFyaGh0Y2MvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3M0bGxnN3RzMmQifX0sInJldiI6IjNtc3NubnoyYm1zMmkiLCJya2V5IjoiM21zc25uejI0cWsyaSIsInNlcSI6NTM1NjAsInRpbWUiOiIyMDI2LTA4LTExVDEyOjQ5OjQ4LjcyMzExN1oifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpYWhjeXl5M3hraWR3ZHRpcG9jaDV3Y3cyZXB3aGk3NnVranFxejJoeHhlN2k1eGhkYnhsNCIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOnBlYzJnZ3g3aHQ2aGZsaXB0aXFheW51eSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjUtMDctMjVUMTk6MDA6MjcuOTcxWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWJzdjJhMnJsd2d0YnRraHpuYTZsYmpmNmliNHJ2cXlnZzY0czZib29jdHR3NGVyZmJzd3UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6ZHBpMmV4YXJubTY1a2Fzdm1wNmk2d2hlL2FwcC5ic2t5LmZlZWQucG9zdC8zbHVzcHh4aTR2czJwIn19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsdXNxYjRpcGoyMjQiLCJzZXEiOjEyMjgzMywidGlvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA1LTIxVDIwOjQwOjU2LjM4OVoiLCJsYW5ncyI6WyJlbiJdLCJyZXBseSI6eyJwYXJlbnQiOnsiY2lkIjoiYmFmeXJlaWJud3Bia2hvYmNmNXJpd3g3aGpwNTJ2enRrY2lmMmFrb25jamZkbGozNGw3enF3ZGpkY3kiLCJ1cmkiOiJhdDovL2RpZDpwbGM6YnQ1ZjN6MmRmam5hMnU2a253c3F1cmZ5L2FwcC5ic2t5LmZlZWQucG9zdC8zbW1mYXU1d2VyMjJwIn0sInJvb3QiOnsiY2lkIjoiYmFmeXJlaWY0MnE3N2x4YWJ4bDZ6c25kbDd6a3hwbjc0cWR4ZmFlMzczbnR2eDM0c3I3eXBpdWZ3N2kiLCJ1cmkiOiJhdDovL2RpZDpwbGM6YnQ1ZjN6MmRmam5hMnU2a253c3F1cmZ5L2FwcC5ic2t5LmZlZWQucG9zdC8zbW1iN2E2ZzVsYzJwIn19LCJ0ZXh0IjoiSGlzIGhhbmQgc2xpZCBsb3dlciBkb3duIGhlciBzaWRlIGFuZCB0byBoZXIgaGlwcywgSG9wIGdpdmluZyBoZXIgdGhpZ2ggYW5kIGhlciBhc3MgYSBzb2Z0LCBzbG93IHJ1YiBiZWZvcmUgd2FybSBkaWdpdHMgYXBwcm9hY2ggaGVyIGNyb3RjaCwgSG9wJ3MgZmluZ2VydGlwcyBiYXJlbHkgZ3JhemluZyB0aGUgc3VyZmFjZSBvZiBoZXIgZm9sZHMgYXMgaGUncyBmb2N1c2luZyBvbiB0aGF0IGFyZWEsIHNsaWdodGx5IHRlYXNpbmcgaGVyIGJ1dCBub3QgZnVsbHkgdG91Y2hpbmcgaGVyIGVudHJhbmNlLiJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNtbWZicXhxNmgyMm4iLCJzZXEiOjc4MDY2LCJ0aW91Z2h0IGZvciBzaXggbG9uZyB5ZWFycy4uLiBhbmQgdGhleSBzdGlsbCB3YW50ZWQgbWUgdG8gY2Fycnkgb3V0IGRpcnR5IHdvcmsgYWdhaW5zdCBvdGhlciBwZW9wbGUgZnJlc2ggb2ZmIGZyb20gYSB3YXIgdGhhdCBuZWFybHkga2lsbGVkIGFsbCBvZiB1cy4gXCIifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbWQycDZuZ3BxazJrIiwic2VxIjo3MzYyMiwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTA6MzQuMjgzODYwWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlhcXlwdnhobGVoam1xNDZmdXV4emhqNG9pcGVieWFiZGhld3hlaDRrYWFwN2xqcmx6aXVxIiwiY29sbGVjdGlvbiI6ImFwcC5jZXJ0aWZpZWQuZ3JhcGguZW50aXR5Rm9sbG93IiwiZGlkIjoiZGlkOnBsYzo0dGR3eDRxcWhmd2tlenZqNXZjZHVkZXAiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuY2VydGlmaWVkLmdyYXBoLmVudGl0eUZvbGxvdyIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NDk6MzkuMTMzWiIsInN1YmplY3QiOnsiJHR5cGUiOiJhcHAuY2VydGlmaWVkLmRlZnMjcmVjb3JkU3ViamVjdCIsInVyaSI6ImF0Oi8vZGlkOnBsYzpmeTdzZTVybnR6cnhheXBtNzQ0bm1jb3Uvb3JnLmh5cGVyY2VydHMuY29sbGVjdGlvbi8zbW1lb281aDJ3czJxIn19LCJyZXYiOiIzbXNzbm5xZnliazJ0IiwiZDpwbGM6eGQ0ZjZ6bW03bTJ0cDY0NGZwdXhpM3E3Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wMi0wMVQxODoxNTo0MS43NjRaIiwibGFuZ3MiOlsiZW4iXSwicmVwbHkiOnsicGFyZW50Ijp7ImNpZCI6ImJhZnlyZWlhdXhsY2tybXh5YWlvaTUyNmd6eWZuNHp3azRzZnh3eWN5NnBjMnJmcXdreDNvZ2gybGZtIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjc2ZGV4cHBpcnk0emJ0bm54d2dwajVtby9hcHAuYnNreS5mZWVkLnBvc3QvM21kc3RicG95c2syaSJ9LCJyb290Ijp7ImNpZCI6ImJhZnlyZWlna2tjbWZsdHlkMmJuaWJqanNldDd4YWxjdHpjZHBvZmx6ZGFjZmZ1aWx5aG1xa2VwZ2ZhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjc2ZGV4cHBpcnk0emJ0bm54d2dwajVtby9hcHAuYnNreS5mZWVkLnBvc3QvM21kcGNrM3o3cGMyNyJ9fSwidGV4dCI6IlwiIFNxdWlzaGluZyB5b3UuLi4gSSB0aGluay4gXG5cbkkgZHVubm8geW91ciBoZWFkJ3MgaGl0dGluZyBtb3N0bHkgZ2VsIHBhZGRpbmcgYW5kIEtldmxhciBhdCB0aGlzIHBvaW50LiBcIlxuXG5IZSBzYWlkLCBsb29raW5nIGRvd24gYXQgRXJvcyB3aXRoIGEgc29mdCBzbWlsZSwgZ2l2aW5nIGhpcyBzaG91bGRlcnMgYSBzb2Z0IHBhdC5cblxuXCIgSG93J3MgaXQgZ29pbmcsIExpemFyZG1hbj8gXCIifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbWRzd3N2bDdoMjJzIiwic2VxIjo3NDExNSwidGlpMjJzIn19LCJyZXYiOiIzbXNzbnBqbmF3YzIyIiwicmtleSI6IjNtc3NucGpteTUyMjIiLCJzZXEiOjg1MjI3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDozOS40MDQ2MjZaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWd6YWFtN2NqaWF2Z3Fkam81bDN2enQyempzeXV1cGJucXNpdTdpcnN6cW81dTV3NmRzc3kiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzo0dDJuZGt1YjN1enR5Mm80Z2VwM3hhN28iLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUxOjIwLjU3OFoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWliMmtqeDI0ZnJidzJtdDdpYnM2em9teDd6dDNndHd5NHg2aWRlaGd0YnV0dmozMmlhZXVtIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnVvMmZuYTQ3YzR2NnpjbmtseGZoY3ZqYi9hcHAuYnNreS5mZWVkLnBvc3QvM21zc2lnM2p3aWMyZCJ9LCJ2aWEiOnsiY2lkIjoiYmFmeXJlaWhta3B6dXNqdzRuazU2Z3E2Zm1hYTU1ZGVuZGdpbGpmcGljNG1hY21idHFsYnlxaTN2cGkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6c2d0aTNqc2d1M2x1aWYyNHRva3Z0aDNhL2FwcC5ic2t5LmZlZWQucmVwb3N0LzNtc3NubHVmcnZ5MmUifX0sInJldiI6IjNtc3NucXF6eHVqMjUiLCJiYWZ5cmVpYnl0c292Z3piNDJ2Z2p4ZWZtc2tseXRuNWF1czZldGlxYW4zd3d5ZDR3bDRneHFia3dkbSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOnBlYzJnZ3g3aHQ2aGZsaXB0aXFheW51eSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjUtMDgtMDJUMjM6MjU6MTkuNzM4WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWFuNW12ajJlbnNpNGdyenBseTZra29odWl1MzN4d2xtenlua3g1YnlueGc2czVkZGZicm0iLCJ1cmkiOiJhdDovL2RpZDpwbGM6NWZqb29zc3dsenl0NW13dGw1aWdhcnN5L2FwcC5ic2t5LmZlZWQucG9zdC8zbHZoY2Y3a3hkMjJ1In19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsdmhjczNucjR2MnUiLCJzZXEiOjEyMzY3OSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOmhnN2dmNmh2bGZ5ZHNzdml5cTN2Ymh2dCIsIm9wZXJhdGlvbiI6ImRlbGV0ZSIsInJldiI6IjNtc3NubWw2bzRwMngiLCJya2V5IjoiM21zN24yeGJsMzMybSIsInNlcSI6MzU2MTAsInRpbWUiOiIyMDI2LTA4LTExVDEyOjQ5OjAwLjM5ODc5NFoifX17ImJhZnlyZWlodGhmY3Z0N3BwZXU2cG82c3MzeDdlc3kyYXV6bnk3M3doZ2dzM3ZxemZ3bGFrZXRsaXZ1IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImRpZCI6ImRpZDpwbGM6eGQ0ZjZ6bW03bTJ0cDY0NGZwdXhpM3E3Iiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wMS0xMFQxNDo0NTowOS41MDZaIiwiZW1iZWQiOnsiJHR5cGUiOiJhcHAuYnNreS5lbWJlZC5yZWNvcmQiLCJyZWNvcmQiOnsiY2lkIjoiYmFmeXJlaWVhZGJ0d3phanhzMnRpYmFkaHh6YnVranVwZ3g0bGZyY2dxaXVxa2JtdWZsNW15M3UyMm0iLCJ1cmkiOiJhdDovL2RpZDpwbGM6dzJscDQzbW5kMmQyeXh3Zjc3dDV0ZG1rL2FwcC5ic2t5LmZlZWQucG9zdC8zbWMzYWR0a290czIyIn19LCJsYW5ncyI6WyJlbiJdLCJ0ZXh0IjoiXCIgVGhhdCdzIHRoZSBjYWJpbmV0IGZvciB0aGUgZ2FtZS4uLiBhbHRob3VnaCBjb25zaWRlcmluZyBpdCBwdXQgdXMgaW4gdGhlIHRyYWNrLi4uIFwiXG5cbkhlJ2QgY2xpbWIgaW50byB0aGUgcGxheWVyIG9uZSBzZWF0LCBsb29raW5nIGF0IHRoZSBzY3JlZW4gYW5kIGp1c3Qgc2VlaW5nIHRoZSBIb3JuZXQsIGlkbGluZyBvbiB0aGUgc2FtZSB0cmFjayB0aGV5IHdlcmUgb24uXG5cblwiIEFsbCB5b3UgaGF2ZSB0byBkbyBpcyBoaXQgdGhlIHBlZGFscyBvbiB0aGUgZmxvb3Igd2l0aCB5b3VyIGZlZXQsIGFuZCB1c2UgdGhlIHdoZWVsLSJ9LCIubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjQtMTEtMzBUMTQ6MzU6MjQuMjkzWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWZjaW90d2JsN3d4M24zc2l3ZzZhamFqbDJpeGpsbG91cWV4YjJncHMyM215dDMzcWpuenkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6Y2llbWZscXo1d3N1YnIzcGF1dW5kd2lsL2FwcC5ic2t5LmZlZWQucG9zdC8zbGM2Y255NWZ3YzJ0In19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsYzZjd3hicjUyMnAiLCJzZXEiOjEwNzk2NCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlheGhndWhrdXN0cHRxNnpreGlmN3p1b2VsNWIzMmJzNHV3YTZrNHJ6ejQzeWgzYTNiZ3Z5IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmFjdG9yLnByb2ZpbGUiLCJkaWQiOiJkaWQ6cGxjOmc1aW9mZW5mb2h6dWh0djdzdmtpcGVzaiIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmFjdG9yLnByb2ZpbGUiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUwOjQ2LjAwNVoiLCJkaXNwbGF5TmFtZSI6InNsYWFuZXNoLWVuam91ZXIuYnNreS5zb2NpYWwifSwicmV2IjoiM21zc25wdGVyemwyeSIsInJrZXkiOiJzZWxmIiwic2VxIjo4ODg5MywidGltZSI6IjIwMjYtMDgtMTFUMTI6NTA6NDkuNzk0MjM2WiJ9fWtcIiByZWw9XCJub2ZvbGxvdyBub29wZW5lclwiIHRyYW5zbGF0ZT1cIm5vXCJcdTAwM2VcdTAwM2NzcGFuIGNsYXNzPVwiaW52aXNpYmxlXCJcdTAwM2VodHRwczovL3d3dy5cdTAwM2Mvc3Bhblx1MDAzZVx1MDAzY3NwYW4gY2xhc3M9XCJcIlx1MDAzZXlvdXR1YmUuY29tL3dhdGNoP3Y9QXBFa1gtazJodThcdTAwM2Mvc3Bhblx1MDAzZVx1MDAzY3NwYW4gY2xhc3M9XCJpbnZpc2libGVcIlx1MDAzZVx1MDAzYy9zcGFuXHUwMDNlXHUwMDNjL2FcdTAwM2VcdTAwM2MvcFx1MDAzZSIsImJyaWRneU9yaWdpbmFsVXJsIjoiaHR0cHM6Ly9ub3JkZW4uc29jaWFsL0B2aXJnaWxfdGliYnMvMTE3MDc2OTU3Mzg0MDY0NDc1IiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo0OTo1Ni4wMDBaIiwiZmFjZXRzIjpbeyIkdHlwZSI6ImFwcC5ic2t5LnJpY2h0ZXh0LmZhY2V0IiwiZmVhdHVyZXMiOlt7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFjZXQjbGluayIsInVyaSI6Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9QXBFa1gtazJodTgifV0sImluZGV4Ijp7ImJ5dGVFbmQiOjc0LCJieXRlU3RhcnQiOjMxfX1dLCJsYW5ncyI6WyJkZSJdLCJ0ZXh0IjoiSWwgRGlzZXJ0b3JlIMK3IEl2YW5vIEZvc3NhdGlcblxuaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1BcEVrWC1rMmh1OCJ9LCJyZXYiOiIyMjIyMjN3cHZ6NzIyIiwicmtleSI6IjNtc3Nub2UzYndvZTIiLCJzZXEiOjU5NzY3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDowNS4zem03dnN3aHJxNWNreGR4emE2amJjZWh2dXZhN3picjVmc3NpMmtnaXdwZGEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dDZ1Ymoyd2xoYzM0YXd6Y3ltaDNxcHVyL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzZ3NhdjZnazJtIn19LCJyZXYiOiIzbXNzbm12NWZudDJmIiwicmtleSI6IjNtc3NubXY1YXJsMmYiLCJzZXEiOjM5NTE2LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OToxMC44OTU5MjZaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWhkYnc0ZTd4bTY2dWZqa2g2eTVpNDV2bmI1bHRrYWt0Y3N0aGVnYndzM2htZXBpaWFoMnkiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpnd2d1eWlmd3B2dGYyZ2tmeWZ1NXoyaXUiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjI1Ljc0NFoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlnaTVybXFjdzY1NWZkdWlpc3U2dDR0dmw2cHh2bXhzdWw0dHhlcnhvN2V2c3VpemV4c3NhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOm5nb3dzNjRhcXdlcHhhdmdlenRsb3Fkei9hcHAuYnNreS5mZWVkLnBvc3QvM21zc25qMjN0aHMyYiJ9fSwicmV2IjoiM21zc25uZG1rMmEyYSIsInJrZXkiOiIzbXNzbm5kbWc1YTJhIiwic2VxIjo0NTAwMSwidGkwMjUtMDItMjBUMTU6MjQ6MTkuNDQ2WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWdvemM2eGZ4eXJmYXBrZjJtNXlkYWVzeTdhd3B3NHJ4NXlkZ3FtNHRoc2l3cGxwenR5Y2UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6NGRheHh1NmhrY2tiamR0andxdDM0c3VzL2FwcC5ic2t5LmZlZWQucG9zdC8zbGlta3B5NG1iazIyIn19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsaW1sdndhbmk3MmoiLCJzZXEiOjExMzI3NSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWloczY3dXFxejY3bHRwbTRnejN6M3hzZG5raDR1M2JtZDZlbDNoeHE3bXljZDR2cnE0YWFxIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6aWJ0NGFnZXJjdzZlaGVkdmNsdTV5bGdhIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MDoxMy41NTdaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpYzJ0NWR0NzVqY2NiYm1hMzJxb2JhMmFlaTRidmJ6eGtuMm1jeXduazV2aDdxYXBjM254eSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpycTd4YnU0aHd3Z3FqYnNzZ2xuanh2NGgvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NrczI2aDJjMnoifX0sInBsYzpzZ2dwYXpseHh5Z29jcTJtbmlzaTdvdXAvYXBwLmJza3kuZmVlZC5wb3N0LzNtb2d4dml1b2djMmwifX0sImxhbmdzIjpbImVuIl0sInRleHQiOiJcIiBJIGRpZG4ndCB3aW4geW91IG92ZXIgYnkgZmxpcnRpbmcgdGhhdCdzIGZvciBzdXJlLiBcIlxuXG5IaXMgZXhwcmVzc2lvbiB3YXJtcyBhcyBoZSdkIHJlc3QgaGlzIGhhbmRzIG9uIGhlciBzaG91bGRlcnMsIGdpdmluZyB0aGVtIGEgc29mdCBydWIuXG5cblwiIEJ1dCB0aGUgaG90IHN0dWZmIHRoaW5nIGlzIHRydWUsIHlvdSdyZSBpbiB0aGUgZGljdGlvbmFyeSBhcyB0aGUgZXhhbXBsZS4gXCIifSwicmV2IjoiM21zZ3lpcGZqZWEyeCIsInJrZXkiOiIzbW9neWNsbnBnazJuIiwic2VxIjo3OTg5NiwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTA6MzQuMjgzODYwWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWloZmJ0eHE0aGM3cXR6YjZsNDRsd2J6bzJlcmFtcmZ0am5qNWd5M2NxbGpsZnc3ZndxbmttIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdGdhdGUiLCJkaWQiOiJkaWQ6cGxjOmt0N3ZjY3Nuem5sM3kzZm5mbzRjNnBlZSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQucG9zdGdhdGUiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjM0LjQxNFoiLCJkZXRhY2hlZEVtYmVkZGluZ1VyZ3lqMjRyYTc0Nmt6ZDQiLCJ1cmkiOiJhdDovL2RpZDpwbGM6d3pmanQ1bGpxZTI1Nm96N29xYmVkcXMyL2FwcC5ic2t5LmZlZWQucG9zdC8zbHRrYWM2NW5qMjI1In19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsdGtjeWxpdGY2MmIiLCJzZXEiOjEyMDIzNiwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlkcWx4Z2Zlb2t1Z3FjenVzZ2ozMng3eW10azZzM29oNzR6YnNtcWdsc29mZmhicWwyc3N1IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucG9zdCIsImRpZCI6ImRpZDpwbGM6Mm1mb2UyM3doZmR1ZHV1bW11cTRvZ3RwIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo0OTowOC4xODdaIiwibGFuZ3MiOlsiamEiXSwidGV4dCI6IuS7iuaXpeOBk+OBneOBr+aBi+OBqeOCk+OBi+OBj+OBnuODvO+8ge+8ge+8geOBqOOBiuOCguOBo+OBn+OBkeOBqeOAgVNOU+OCkjEw5pmC6ZaT44KE44Gj44GmMeaXpeOBjOe1guOCj+OBo+OBpuOBl+OBvuOBhOOAgeaZrumAmuOBq+atuyJ9LCJyZXYiOiIzbXNzbm10cmdvNzJwIiwicmtleSI6IjNtc3NubXNwd3ZzMmMiLCJzZXEiOjM5MDEzLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OTowOS40MDVrMnQifX0sInJldiI6IjNtc3NubmM3YjV4MnciLCJya2V5IjoiM21zc25uYzczY2gydyIsInNlcSI6NDQ0NTgsInRpbWUiOiIyMDI2LTA4LTExVDEyOjQ5OjI0LjU5NTg4OVoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpYWtkbm1reXIzYmV1eTQ2dmF6NXh3YmRnbGxremJ5dXBpZ3Y2Z3FrNXlkZGxmdWZ2dGU2dSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOmN2b2MybmF1cjZuajR3eXFrNWUyaTNwaCIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NDk6MTYuMjMxWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWhkZHZxbDU1eno2eXNncjZodXp2Z2pnY3pzczc2Y3lmMnBxNnI2NWI2ZWRrdHFvaGV2cGEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6aWxwemN0bjZ0Zm9ydmp5aXhjMzdzbWNnL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzaXk1amN6azJ4In0sInZpYSI6eyJjaWQiOiJiYWZ5cmVpaHBqaXBrbXRtczRvZ3Zod3Bjc2pydGZsem1pbHN0czJ5czN6bXBqYWJpaGhydTV2eXplbSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpienk1cmpqZHV2dmt4bm81eGUzZXZsM2YvYXBwLmJza3kuZmVlZC5yZXBvc3QvM21zc25tamZha3oyZyJ9fSwicmV2IjoiM21zc25tenZwdmcyZSIsImsyZHA1YmFoY2d6Nmh0aWUiLCJ1cmkiOiJhdDovL2RpZDpwbGM6aXVmNmY1Mm9oN2MzN3N2ZnRvN2xhd3RmL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzaXBidDI1YzJmIn19LCJyZXYiOiIzbXNzbnB2cWV1bTJ6IiwicmtleSI6IjNtc3NucHZxMjR1MnoiLCJzZXEiOjg5NzU3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDo1Mi4xOTQyMDBaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWJraXU3ZDJvcmRvdjd4MnZ3dnhiZGxreXFkY3lkN3dzMnZnY2txY2xrcDM1Z3NkbjZ4cjQiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzptbWs1cm5kdWVxZHFlZHlucGhlY2hydnYiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjE5LjgyMFoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlocWt6c3Zqd3Q2aTRnY203NXY0NXh6ajJuM2hobnA0NDdzNGt3NTJvdWp1cTdscWJnNXZ1IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjdxcWtxMnpkd3E0ajVqaW5ndWtndHVreS9hcHAuYnNreS5mZWVkLnBvc3QvM21zc2tvaGg1bTIyNCJ9fSwicmV2IjoiM21zc25uNXkyZDIyZyIsInJrZXkiOiIzbXNzbm41eHJqczJnIiwic2VxIjo0Mjk0OSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDk6MjAuMzI4aWtlIiwiY3JlYXRlZEF0IjoiMjAyNS0wNi0yMlQxODoxNjoxOS45MTZaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpaHNncHlkcTNrN3diY29wdXFud2p2ZWhnbTdiMjZvYWVpcDc0NjVheHFobHhndzRvenY3eSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp3cHptcm0ydWEzejNyY3NsZ2dobHJrNmsvYXBwLmJza3kuZmVlZC5wb3N0LzNscnIya2JzM2tjMmwifX0sInJldiI6IjNtbnU1eXVscmllMnoiLCJya2V5IjoiM2xzN29mc3ZqZ3IyZCIsInNlcSI6MTE4MjEwLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MTozOC43NzI5NTNaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWNyemYzcnRmaWNqNHNrN2k2N3Yyb2czenNpd3NtZG5oY3d0eTJja2dyM2NjMnAya3FncnUiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiZGlkIjoiZGlkOnBsYzo0aDd6YWdocGt3dXc1dHIycnh5N2ltYjQiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUwOjQ4LjAwMFoiLCJlbWJlZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmVtYmVkLnZpZGVvIiwiYWx0IjoiIiwiYXNwZWN0UmF0aW8iOnsiaGVpZ2h0IjoxOTIwLCJ3aWR0aCI6MTA4MH0sInZpZGVvIjp7IiR0eXBlIjoiYmxvYiIsIm1pbWVUeXBlIjoidmlkZW8vbXA0IiwicmU1eWJlZmRxcWZubmQ2bWgyNnMzN2UzdG1rNndtcnhvYXp6NmtiNWl3cGs1cSIsInVyaSI6ImF0Oi8vZGlkOnBsYzozd2l4a3B3anN4YTU0cTU0ZXRkdXU0czQvYXBwLmJza3kuZmVlZC5wb3N0LzNtZGJvZGhrM3AyMjMifX0sInJldiI6IjNtc3Nub2w3Mm1qMjUiLCJya2V5IjoiM21zc25vbDZ0cnIyNSIsInNlcSI6NjA2MjAsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjA3LjUwMzIxMloifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpZXRqYnc1YjR4dWVzYmZmejQzbGF2eGQ2d3FyenNzNXBjZms1c3d3aTJmNW8yd3JsYmtmcSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOmxqdGJyNDVqMjJncnNjbWdnZzNrcGc3aSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NDg6NDUuNjAxWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWN2MnhiZXZnYmhoM2h0eWdic3lnbmdtaG5zazZraXY1a3ZmMmRmbjJvZ2ZyMmk3b2t2d3UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6azJtbDdtYWtvdGtpajR3anBvd3RzZ3BqL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNyeTRkdG13azJuIn19LCJyZXYiOiIzbXNzbm01Y3J1ZTJpIiwicmtleSI6IjNtc3NubTVjZTZ1MmkiLCJzZXEiOjI5MTY0LCJ0aWJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNS0xMi0yMVQxNDoyMToyNS4zNjBaIiwibGFuZ3MiOlsiZW4iXSwicmVwbHkiOnsicGFyZW50Ijp7ImNpZCI6ImJhZnlyZWlhb212NmR6amE0ZjI1am90NHE1NG9xeHp3ZW5ycDVudG9mZ3BiZ2RxY2xkaWoyc3NydTNlIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjY1b3RrZ2l5ZTYzY2c1c2l2bXdhZ3h0bC9hcHAuYnNreS5mZWVkLnBvc3QvM21haDZrNjJ1dHMyZCJ9LCJyb290Ijp7ImNpZCI6ImJhZnlyZWlnYXozZWVyYWYzZG4yNm1kMnc1cmg3eTZ1d2Q1cHBnZm1paXFtaWZrc3RldHF1azM1anN5IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOjY1b3RrZ2l5ZTYzY2c1c2l2bXdhZ3h0bC9hcHAuYnNreS5mZWVkLnBvc3QvM21hNzdzdm1jdWsycSJ9fSwidGV4dCI6IlwiIFllYWgsIHRoYXQgc291bmRzIGxpa2UgYm94aW5nIGEgbGl0dGxlIGJpdC4gXCJcblxuVGhlbiBhIGxvb2sgb2YgY29uY2VybiB3YXNoZXMgb3ZlciBoaXMgZmFjZSBhcyBoZSB0aGlua3MgYmFjayB0byB0aGUgbGl0dGxlciBQb2tlbW9uIHRoYXQgaGFkIGF0dGFja2VkIGhpbSBlYXJsaWVyLi4uIFN1cmVseSB0aGV5IGRvbid0IHBpdCB0aG9zZSBhZ2FpbnN0IGVhY2ggb3RoZXIuIERvIHRoZXk/XG5cblwiIC4uLndhaXQsIHknYWxsIGRvbid0IGp1c3QgcGx1Y2sgYW4gYW5pbWFsIGZyb20gdGhlIGdyYXNzIGFuZCBjaGFsbGVuZ2UtIn0sInJldiI6IjNtc2d5aXBmamVhMngiLCJya2V5IjoiM21haXc1Y3ltNmsyayIsInNlcSI6NzE1OTIsInRpZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NDk6MDYuOTgzWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWJxMnN6MjJzZHR2dXl2bXpybGZ2NHlkb3JpZ3FxbWo3NHVkd253cmlhbHN3Zm9xYTNpcGkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6a3lrcHd5YXBvbjdkbGRkY2h3emR1bzJ3L2FwcC5ic2t5LmZlZWQucG9zdC8zbXNxbWpxM2VwazJpIn19LCJyZXYiOiIzbXNzbm1ybXVkajJiIiwicmtleSI6IjNtc3NubXJtb2h6MmIiLCJzZXEiOjM4MTY3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OTowNy4xOTU4MDhaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWh4N2Q0dmF0c2VpMzM1cTd4dHRhdmx5eXVrdjJldG13bTdwbDY0M2Nqb3RvaXRneWc0cHEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZ3JhcGguYmxvY2siLCJkaWQiOiJkaWQ6cGxjOmxjejY2Mmw3NzdpdTZwbW5lMm1sZHYyYyIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmdyYXBoLmJsb2NrIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MDo1NC43OTBaIiwic3ViamVjdCI6ImRpZDpwbGM6NHFuaGt3NHB5YXhjZzN0eWR5bnVscWJkIn0sInJldiI6IjNtc3NucHlpemhzMmsiLCJya2V5IjoiM21zc25weWl2a3MyayIsInNlcSI6OTExMDcsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjU1LjgwMTkwMFoifX1jb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiY3JlYXRlZEF0IjoiMjAyNi0wNi0wNFQwOTo1OTozOS4wMDZaIiwiZmFjZXRzIjpbeyIkdHlwZSI6ImFwcC5ic2t5LnJpY2h0ZXh0LmZhY2V0IiwiZmVhdHVyZXMiOlt7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFjZXQjbWVudGlvbiIsImRpZCI6ImRpZDpwbGM6bHd6aHNsN29qNWg3a25ncXZ5ZnV5dDRqIn1dLCJpbmRleCI6eyJieXRlRW5kIjoyNSwiYnl0ZVN0YXJ0IjowfX1dLCJsYW5ncyI6WyJlbiJdLCJ0ZXh0IjoiQGhvcGFyb3VuZGJ1bi5ic2t5LnNvY2lhbCBcblxuSG9wJ3Mgc3VycHJpc2luZyBDbG92ZXIgd2l0aCBmbG93ZXJzIG9uIHRoZSBjb3VudGVyIHRoaXMgbW9ybmluZy5cblxuXCIgSSBnb3QgeW91IGEgcHJlc2VudCEgXG5cbi4uLkkgaG9wZSB5b3UgYXJlbid0IGFsbGVyZ2ljLiBcIiJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNtbmhlaDVjYXpjMnkiLCJzZXEiOjc5MDQxLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDozNC4yODM4NjBaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWd2c3F2emg0enV2djQ2cGJ4NHZxZWxuem12bzRkenh3eHZjeGFybWRneHNwaWw2eGd1NHEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpuNmJkazZyZ2VuZ2JudzRkY2EzYXlzdGsiLCJvcDovL2RpZDpwbGM6eGdtZzRmaGdleXd1ZHBkejY2aHk3andyL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzbGphZ3U3MjJoIn19LCJyZXYiOiIzbXNzbm1xb3k3NDJlIiwicmtleSI6IjNtc3NubXFvbGl1MmUiLCJzZXEiOjM3NzgyLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OTowNi4xOTgyMjNaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWE1dXdqc3ZyNTR6ZXdvN2tvN2g1anZsNzM2aXFycXB1bnkydHNob3lkMzdoYXloNHhkNXEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZ3JhcGguZm9sbG93IiwiZGlkIjoiZGlkOnBsYzpwZXRpcnJsN25reTdpNmFjYW5yd3g1aG4iLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5ncmFwaC5mb2xsb3ciLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjUxOjA4LjE1MFoiLCJzdWJqZWN0IjoiZGlkOnBsYzppdHRoZ2VnZWZ2eWp0ZWZ5cWRrZHc1dHIiLCJ2aWEiOnsiY2lkIjoiYmFmeXJlaWh5N3lyZzV5bGxlajZoa2JoM2tuYzd6NmZrb2tobWVoYXdoaTJqa2FqY2UzamNsazZqem0iLCJ1cmkiOiJhdDovL2RpZDpwbGM6aWxjM3ViN2F4M2J5b2hudW54NDdkY3lyL2FwcC5ic2t5LmdyYXBoLnN0YXJ0ZXJwYWNrLzNsZjRqYnA3azJvMm8ifX0sInJldiI6IjNtc3NucWZsdmc1MmQiLCJya2V5IjoiM21zc25xZjR3Y2kyeCIsInNlcSI6OTYwMzIsInRpZGxocng2N280cG9ta2ZkN3l0d295YzMvYXBwLmJza3kuZmVlZC5yZXBvc3QvM21zc25sNmtiZzIyNiJ9fSwicmV2IjoiM21zc25xYTczbncyaiIsInJrZXkiOiIzbXNzbnFhNnF3NjJqIiwic2VxIjo5MzU0MCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MDMuMTk2MzM5WiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlkNWJxejVudnBpbGVpeTQyZjZvZm93ZTNoeDJjbnJyNGx4N3hyMjNkc2Fvb29jZWM0cXE0IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6aHlxYXE0NmtuNDdwa3VlM2luZGFkM3FuIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo0OToxMi4wNzlaIiwic3ViamVjdCI6eyIkdHlwZSI6ImNvbS5hdHByb3RvLnJlcG8uc3Ryb25nUmVmIiwiY2lkIjoiYmFmeXJlaWJuYXF1YTUyb2RqNHNqanE2ZHJwdmx1bWh0eGw1dWxvdnJpeTNhajN3cXdzcHN5NnFncjQiLCJ1cmkiOiJhdDovL2RpZDpwbGM6djN5amJxY29pcTNidWpwbHpqYTdmYXRxL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNza2l4ZGtxYzIyIn19LCJyZXYiOiIzbXNzbm14NHdhNjJoIiwicmtleSI6IjNtc3NubXg0bmd3MmgiLCJzZXEiOjQwNTIzLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OToxMy42OTR0IjoiMjAyNC0xMi0xOVQyMTowMzoyNS45NzJaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpZ2prNXFiMjJ2bml4a2s2eDVqaWZnM2l2bGdobnRicHY3czN2eHBvaXRwM252bWttbzI0cSIsInVyaSI6ImF0Oi8vZGlkOnBsYzphbDVsamRpdHRyNXp6M25oM21iM3VuYm4vYXBwLmJza3kuZmVlZC5wb3N0LzNsZG9weHVhd3QyMncifX0sInJldiI6IjNtbnU1eXVscmllMnoiLCJya2V5IjoiM2xkb3JpYzR5aHQybSIsInNlcSI6MTA4ODY1LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MTozOC43NzI5NTNaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWd3aHpmbG1pZmJlZTRzb2xqaXV2azIydmFmYzd1N2w2bGt4Mm50dGlmbjM3c3dxdmIzYmUiLCJjb2xsZWN0aW9uIjoiY3gudm14Lm1hdGFkaXNjbyIsImRpZCI6ImRpZDpwbGM6b3R1NmNjcnd5Y2tlMzNrbDNoNHlqaHduIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiY3gudm14Lm1hdGFkaXNjbyIsImVvIjp7ImNsb3VkQ292ZXIiOiIxMS45MDM2NDcifSwicHJldmlldyI6eyJtaW1lVHlwZSI6ImltYWdlL2pwZWciLCJ1cmwiOiJodHRwczovL2VhcnRoLXNlYXJjaC5hd3MuZWxlbWVudDg0LmNvbS92MS9jb2xsZWN0aW9ucy9zZW50aW5lbC0yLWwyYS9pdGVtcy9TMkJfMzVIS0FfMjAyNjA4MTFfMF9MMkEvdGh1bWJuYWlsIn0sInB1Ymxpc2hlZEF0IjdxNXp6Zmo0IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6enl6d2tvcnZ3ZDdhYWY0d2V4NWl0eDZtIiwib3BlcmF0aW9uIjoiY3JlYXRlIiwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiY3JlYXRlZEF0IjoiMjAyNi0wOC0xMVQxMjo1MTozOS4zMzBaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpaGd5aW9mamphZ3lwdTJ1ZmV3cmFjZXNxZDJrYTI1bnR4Ymw1czQ1ZGxxZm51YW5xaGxlNCIsInVyaSI6ImF0Oi8vZGlkOnBsYzp0d3B6aWZmczZnZnpxc2ZybWdscGg1YnEvYXBwLmJza3kuZmVlZC5wb3N0LzNtc2s2NTVweXFrMnIifX0sInJldiI6IjNtc3NucmFnYnZpMmwiLCJya2V5IjoiM21zc25yYWZ6NGEybCIsInNlcSI6MTA2MTc2LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MTozNy4xMDY0NjJaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWRoZmJjbGEybHJ3N2t2N3d5aGR1dmV0NTNwN2g2a2dvajZxdW5xZ3hyMjNrcDI3bTdvaHEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzphNDVrcHA2MnQ2bWFsdHdqdjNjNndsNXIiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjExLjgyM1oiLCJzdC8zbWM2NWx3aWN1MjJjIn19LCJsYW5ncyI6WyJlbiJdLCJ0ZXh0IjoiXCIgQXd3d3d3dy4uLiBcIlxuXG5BbmQgdGhlIHBhdHMgaGF2ZSB0dXJuZWQgaW50byBwZXRzLlxuXG5cIiBPaCBteSBnb2QgSSBmaW5hbGx5IGdldCB0byBwYXQgYSBkb2cgYW5kL29yIGNhdGdpcmwhIFwiIn0sInJldiI6IjNtc2d5aXBmamVhMngiLCJya2V5IjoiM21jNjV0NHNhcWsyeSIsInNlcSI6NzI5NDksInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjM0LjI4Mzg2MFoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpaGJubzZpbHVka2lrbXRwazR4aWFtanFxMm5yZDN1cTdqY2RvenhydTNjcXprMmtrZWJhaSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOnR5MjQ0c2lxN2NyNHA2dXUzNDd4bnhsNiIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTA6NTcuMjgyWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWhmdXo3YzZ1N3dqcWZ5NWt2Zmp0ZXIyZGlwemtnNGRvZ3BlNW16aHpkNWF5dnptd2lrd3UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dnBmYXZiaHd2NG9rd2g2eWRncDV1eGY2L2FwcC5ic2t5LmZlZWQucG9zdC8zbXNyc2J4cXRkczIzIn19LCJyZXYiOiIzbXNzbnEyeDM2czI3IiwicmtsYzpidGRnbmhvbWtvdWVqczZvaXR4YmxpbmUvYXBwLmJza3kuZmVlZC5wb3N0LzNtc2l5Mmk0MmRrMmsifX0sInJldiI6IjNtc3Nub3VhYjJ0MnEiLCJya2V5IjoiM21zc25vdWE0NmwycSIsInNlcSI6NjQyNDIsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjE3LjQ5OTMyOFoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpZDZuaXhhY2k1eXQ1Mm9mZW5pcmJ3d2pwbnhpNmN1NWV6d2RpN3Y2aXVpbjJ3cGRzeWZtcSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLnRocmVhZGdhdGUiLCJkaWQiOiJkaWQ6cGxjOmR4NHRodmtlaDJ5ank0emN5bmRoZWx0aSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQudGhyZWFkZ2F0ZSIsImFsbG93IjpbeyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQudGhyZWFkZ2F0ZSNmb2xsb3dlclJ1bGUifSx7IiR0eXBlIjoiYXBwLmJza3kuZmVlZC50aHJlYWRnYXRlI2ZvbGxvd2luZ1J1bGUifV0sImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTA6MjQuODE1WiIsImhpZGRlblJlcGxpZXMiOltdLCJwb3N0IjoiYXQ6Ly9kaWQ6cGxjOmR4NHRodmtlaDJ5ank0emN5bmRoZWx0aS9hcHAuYnNreS5mZWVkLnBvc3QvM21zc25wM3J0ZnMyMyJ9LCJyZXYiOiIzbXNzbnA0ZXI3azIzIiwicmtleSI6IjNtc3NucDNydGZzMjMiLCJzZXEiOjY3MTI4LCJ0aWRmZjZxY29yZnpub2pheXpkcnJrZGZtZmxiczNvcXcyM2VoaHBuY3huMml1cTV4eGl1aHkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6dmhjcGM2Ynk3YWViYXluYTZoYnFwMmtyL2FwcC5ic2t5LmZlZWQucmVwb3N0LzNtc3Nub3NxejNxMnQifX0sInJldiI6IjNtc3NucGxsNzJhMnQiLCJya2V5IjoiM21zc25wbGt3YXkydCIsInNlcSI6ODYwMDUsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUwOjQxLjYzNDEyOFoifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpY3hzMmJpM290d2Z1bXB5enNmamR1d2Z0cjZ1dmhybHB0M2R5aHBhMzQ1cnFnY3Rwa2d1dSIsImNvbGxlY3Rpb24iOiJkZXYuc2Vuc29ydGhpbmdzLm9ic2VydmF0aW9uQmF0Y2giLCJkaWQiOiJkaWQ6cGxjOnFmeGpyc2Z4N3N1YTNqNWY3aTU2cnd6aiIsIm9wZXJhdGlvbiI6InVwZGF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImRldi5zZW5zb3J0aGluZ3Mub2JzZXJ2YXRpb25CYXRjaCIsImRhdGFzdHJlYW0iOiJhdDovL2RpZDpwbGM6cWZ4anJzZng3c3VhM2o1ZjdpNTZyd3pqL2Rldi5zZW5zb3J0aGluZ3MuZGF0YXN0cmVhbS8xNDkyNi1sZXZlbCIsIm9ic2VydmF0aW9ucyI6W3sicmVzdWx0Ijp7IiR0eXBlIjoiZGV2LnNlbnNvcnRoaW5ncy5vYnNlcnZhdGlvbiNudW1lcmljUmVzdWx0IiwidmFsdWUiOjI1OH0sInQiOiIyMDI2LTA4LTEwVDAwOjAwOjAwWiJ9LHsicmVzczRvbnF1YmRsaSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpnb3oycmh0bTRydmVncmlrNzdrdzN6NjUvYXBwLmJza3kuZmVlZC5wb3N0LzNsYnNpaGJzZDZjMnkifX0sInJldiI6IjNtbnU1eXVscmllMnoiLCJya2V5IjoiM2xic2lsMmthcmEyNyIsInNlcSI6MTA3Njg1LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MTozOC43NzI5NTNaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWR3NGdoY2k2ZngzamxrdWZvNjJmaGxmbXJzNGhjNWV4MnhxemdoY2I2Y3BwNXEycGxmY3kiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzptN2ljN25iZGNocXptaHIydDdiY2l4bm8iLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTEwVDA4OjAxOjI2LjQ5NFoiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWlmdjJqYXl1aW5weGFpZmZsYXJ0aWNubmxpZTJncWxnMjZneHk2YWs1dWt1aGVweW5tNXBpIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOm95MmNwb2JuZmR2bGVmajVpcmNsdDYzYi9hcHAuYnNreS5mZWVkLnBvc3QvM21zcG1lYXQyYmsyaCJ9fSwicmV2IjoiM21zc212ZjJybW4yNSIsInJrZXkiOiIzbXNwbjNoZWpwbTJyIiwic2VxIjozMTEwMCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDg6NTAuNzIwMDQ3WiJ0IiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImRpZCI6ImRpZDpwbGM6ejQ3dTR1ZGM2cnF4dXFsYXU3bGhyMnA1Iiwib3BlcmF0aW9uIjoiZGVsZXRlIiwicmV2IjoiM21zc25udGZodHgyMiIsInJrZXkiOiIzbXM3YnE3d3FpeDJrIiwic2VxIjo1MTExMiwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDk6NDIuNTk3ODYxWiJ9fXsiJHR5cGUiOiJtZXNzYWdlIiwicGF5bG9hZCI6eyIkdHlwZSI6Im5ldHdvcmsuYnNreS5qZXRzdHJlYW0uc3Vic2NyaWJlRXZlbnRzI2NvbW1pdCIsImNpZCI6ImJhZnlyZWlkZXl2b3RlN2Jna2V6bjIyd2hqbXJmdG1nNHhxM3Y0d3N6aWloNmtoN2hjdXNzZG0ybWttIiwiY29sbGVjdGlvbiI6ImFwcC5ic2t5LmZlZWQucmVwb3N0IiwiZGlkIjoiZGlkOnBsYzoyM2QzbG40dnl5em5uYWFlM3F3bTQ2aXAiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnJlcG9zdCIsImNyZWF0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6NTE6MTIuMDExWiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWFvaDI3aWhldHZrYnhhbGlwbTNqdWtmNTVzejN5NmJlcW1wNWpiMnYycXZrYXQyc2d3a2UiLCJ1cmkiOiJhdDovL2RpZDpwbGM6b2xha215enYzb2tuNmRqaGJjcGtnMnJsL2FwcC5ic2t5LmZlZWQucG9zdC8zbXNzanFrdXFmazJkIn19LCJyZXYiOiIzbXNzbnFpemZ5cTJ2IiwicmtleSI6IjNtc3NucWl6NjZxMnYiLCJzZXEiOjk3NjE4LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MToxM29hdGRja211IiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnRsaGlyYmhtYXgyYnhiem11N25zdHFrMi9hcHAuYnNreS5mZWVkLnBvc3QvM21zcm1sdTNiYjIybiJ9fSwicmV2IjoiM21zc25xc2FybW4yNiIsInJrZXkiOiIzbXNzbnFzYWZ2bjI2Iiwic2VxIjoxMDA4NDEsInRpbWUiOiIyMDI2LTA4LTExVDEyOjUxOjIyLjA5NTY0M1oifX17IiR0eXBlIjoibWVzc2FnZSIsInBheWxvYWQiOnsiJHR5cGUiOiJuZXR3b3JrLmJza3kuamV0c3RyZWFtLnN1YnNjcmliZUV2ZW50cyNjb21taXQiLCJjaWQiOiJiYWZ5cmVpZXlub3llNndvZGRpN2pxeWRqYjRjcjRicjc2azJha3Z0Y29wbXhpaWJjbnNwYjZkNW5wZSIsImNvbGxlY3Rpb24iOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJkaWQiOiJkaWQ6cGxjOnBlYzJnZ3g3aHQ2aGZsaXB0aXFheW51eSIsIm9wZXJhdGlvbiI6ImNyZWF0ZSIsInJlY29yZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmZlZWQubGlrZSIsImNyZWF0ZWRBdCI6IjIwMjUtMDEtMjZUMjA6MDk6NTAuNTg4WiIsInN1YmplY3QiOnsiY2lkIjoiYmFmeXJlaWJlYTUyMnQ3enlvbWZ3eGdoZ2dlMm8yNnQyYzZsY2M2dmVwN2tkNjYyY2JoaXBjdnFuZGkiLCJ1cmkiOiJhdDovL2RpZDpwbGM6NnlmbXVhcnhsbGZzc2pkaGNkdXNmeXZkL2FwcC5ic2t5LmZlZWQucG9zdC8zbGdudnY2amV4czJ2In19LCJyZXYiOiIzbW51NXl1bHJpZTJ6IiwicmtleSI6IjNsZ29hN2h1djZiMnUiLCJzZXEiOjExMTE1OSwidGltZSI6IjIwMjYtMDgtMTFUMTI6NTE6MzguNzcyOTUzWiJ9dHlwZSI6ImFwcC5ic2t5LmVtYmVkLmV4dGVybmFsIiwiZXh0ZXJuYWwiOnsiZGVzY3JpcHRpb24iOiJZb3VUdWJlIHZpZGVvIGJ5IHdobyBpcyBzdWdhciIsInRodW1iIjp7IiR0eXBlIjoiYmxvYiIsIm1pbWVUeXBlIjoiaW1hZ2UvanBlZyIsInJlZiI6eyIkbGluayI6ImJhZmtyZWljYW03ano2enRvZ3VleWU3ZzdieDV0b2R2N2ZzM2tnNGlhdGN0b3BjMmd6YXo0NXZ4Zms0In0sInNpemUiOjYyNjkwfSwidGl0bGUiOiJoYWxsb3dlZW4gZmluZ2VyIiwidXJpIjoiaHR0cHM6Ly95b3V0dWJlLmNvbS9zaG9ydHMvZVpGVDdvZFMtMkk/c2k9YUNKZXgydm56RHlrcXVnNCJ9fSwicmVjb3JkIjp7IiR0eXBlIjoiYXBwLmJza3kuZW1iZWQucmVjb3JkIiwicmVjb3JkIjp7ImNpZCI6ImJhZnlyZWlhcGhubHFrZ3RnYXFlcHNodnk1Z21oY3ppNmRhcnFoMm5zdnlkaXVjejNpMnppNWhyNWRtIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmo1dmdkcGQ3N3V5eHBqN3Ayd2hucm5oZy9hcHAuYnNreS5mZWVkLnBvc3QvM21zNm02MmM1a2syeSJ9fX0sImZhY2V0cyI6W3siZmVhdHVyZXMiOlt7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFjZXQjbGluayIsInVyaSI6Imh0dHBzOi8veW91dHViZS5jb20vc2hvcnRzL2VaRlQ3b2RTLTJJP3NpPWFDSmV4MnZuekR5a3F1ZzQifV0sImluZGV4Ijp7ImJ5dGVFbmQiOjY1LCJieXRlU3RhcnQiOjM4fX1dLCJsYW5ncyI6WyJlbiJdLCJ0ZXh0IjoiXCIgSSd2ZSBzZWVuIGEgbWVtZSBsaWtlIHRoYXQgb25jZS4gXCJcblxueW91dHUyMm0ifSwicm9vdCI6eyJjaWQiOiJiYWZ5cmVpaHZwejdkZ3lucml1eWZhd3JxZjZzMjdsZXkzdW1xYjd3ZjM0d24zbm96aXk2aHVuNjNleSIsInVyaSI6ImF0Oi8vZGlkOnBsYzpzZWZyYmNzZnR6d2o3bHlyYWV3dWU2Ym0vYXBwLmJza3kuZmVlZC5wb3N0LzNtc3Nscmp4c2syMm0ifX0sInRleHQiOiJ0aGUgbG9vbnMgd2luIG9uZSBmb3IgdGhlIGdpcHBlciJ9LCJyZXYiOiIzbXNzbm83amtkcjI0IiwicmtleSI6IjNtc3NubzdkM3UyMm4iLCJzZXEiOjU2MDYzLCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0OTo1NS40MDIwMjBaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWdkZ2V0eWl6bHB1c3ZkdWdva3lienBlaml5ZHV6ZjVvbGw0ZDZtNTYzZ2x2dWE2Y3hqdG0iLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5wb3N0IiwiZGlkIjoiZGlkOnBsYzo1dmZ2Y2xhaHE2d3VzM3RidmYzcHZxdHQiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjI3Ljg4NFoiLCJsYW5ncyI6WyJrbyJdLCJyZXBseSI6eyJwYXJlbnQiOnsiY2lkIjoiYmFmeXJlaWZiaG9odGtwcmNxZ2ZlanZ2bHdndjR4YngzYXMzdzZyeXN1c3M3d212djQyNXVwb2NmdHEiLCJ1cmkiOiJhdDovL2RpZDpwbGM6N2V2M2x2enpzaG9mN3cya2RxajVaIiwic3ViamVjdCI6eyJjaWQiOiJiYWZ5cmVpYmhwemp5dm95NW8zeHhtam5jaG1zY3Nja3AzdzJzZXZoNGY0dGliYmxoM2VqNjJ0Ym13bSIsInVyaSI6ImF0Oi8vZGlkOnBsYzp3Nm9pZTZkZHB6cHY3dm5udmVyM2x1NWYvYXBwLmJza3kuZmVlZC5wb3N0LzNtc3NtbG5kM3ZzMjUifSwidmlhIjp7ImNpZCI6ImJhZnlyZWljdGx1NzNucHlndDVtcWcyN2Fvcnd4bTNnNjJtZG5hbDc0c2kzdmlpdTR5c2RiamVnaDJhIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOmUzY3l4ZXFib2lxc3liYzN1Nnd2enlzei9hcHAuYnNreS5mZWVkLnJlcG9zdC8zbXNzbW4zcmY1ZTIzIn19LCJyZXYiOiIzbXNzbm1kendocjJzIiwicmtleSI6IjNtc3NubWR6cG16MnMiLCJzZXEiOjMyNjk3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo0ODo1My4wMjc5ODZaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWVlbDZ1NjV5eXh6aTRkZ2Q2Y2p3am13M3pmaWNmZWFwaDdzNHA2bnA2aHQ3aWEyeGZ4b2EiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZ3JhcGguZm9sbG93IiwiZGlkIjoiZGlkOnBsYzp4ZDRmNnptbTdtMnRwNjQ0ZnB1eGkzcTciLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5ncmFwaC5mb2xsb3ciLCJjcmVhdGVkQXQiOiIyMDI2LTA3LTAyVDE1OjUxOjQ1LjYyNFoiLCJzdWJqZWN0IjoiZGlkOnBsYzp1a3kuZmVlZC5wb3N0IiwiZGlkIjoiZGlkOnBsYzpidjVpd2JibHFtNWE3eG54dmp3ZnN3ZXQiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLnBvc3QiLCJjcmVhdGVkQXQiOiIyMDI2LTA4LTExVDEyOjQ5OjM1LjI5MloiLCJlbWJlZCI6eyIkdHlwZSI6ImFwcC5ic2t5LmVtYmVkLmltYWdlcyIsImltYWdlcyI6W3siYWx0IjoiQmVsbHkiLCJhc3BlY3RSYXRpbyI6eyJoZWlnaHQiOjMwODgsIndpZHRoIjoyMzE2fSwiaW1hZ2UiOnsiJHR5cGUiOiJibG9iIiwibWltZVR5cGUiOiJpbWFnZS9qcGVnIiwicmVmIjp7IiRsaW5rIjoiYmFma3JlaWI2a2p5N2VwMmtzZnFtc25zdTR0cDZya29iZTVobzRjenZ6cGEza2dsbG11Y29jd2VubmEifSwic2l6ZSI6MTc2ODYzNX19XX0sImZhY2V0cyI6W3siZmVhdHVyZXMiOlt7IiR0eXBlIjoiYXBwLmJza3kucmljaHRleHQuZmFjZXQjdGFnIiwidGFnIjoidHVtbXl0dWVzZGF5In1dLCJpbmRleCI6eyJieXRlRW5kIjozNCwiYnl0ZVN0YXJ0IjoyMX19XSwibGFiZWxzIjp7IiR0eXBlIjoiY29tLmF0cHJvdG8ubGFiZWwuZGVmcyNzZWxmTGFiZWxzIiwidmFsdWVzIjpbeyJ2YWwiOiJwb3JuIn1dfSwibGFuZ3MiOlsiZW4iXSwidGV4dCI6IkhhcHB5IHR1bW15IHR1ZXNkYXkhICN0dW1teXR1ZXNkYXkifSwicmV2IjoiM21zc25ub3JncjUycSIsInJrZXkiOiIzbXNzbm5tbDZsazJmIiwic2VxIjo0OTI4NCwidGltZSI6IjIwMjYtMDgtMTFUMTI6NDk6MzguMDA3MjA5WiJ9fXs6cGxjOnhkNGY2em1tN20ydHA2NDRmcHV4aTNxNy9hcHAuYnNreS5mZWVkLnBvc3QvM21rZnY1cXo0djIydCJ9fSwidGV4dCI6InlvdSBrbm93IGhlIHdvdWxkLiJ9LCJyZXYiOiIzbXNneWlwZmplYTJ4IiwicmtleSI6IjNta2c2d2N1NmpzMm8iLCJzZXEiOjc2OTk3LCJ0aW1lIjoiMjAyNi0wOC0xMVQxMjo1MDozNC4yODM4NjBaIn19eyIkdHlwZSI6Im1lc3NhZ2UiLCJwYXlsb2FkIjp7IiR0eXBlIjoibmV0d29yay5ic2t5LmpldHN0cmVhbS5zdWJzY3JpYmVFdmVudHMjY29tbWl0IiwiY2lkIjoiYmFmeXJlaWM2cWx2cW1jd3M2cXdpam51bTNtY2hpZjJhejd3cWVmb3U1ZHZkbnpidXQ2eWptZGNrZmEiLCJjb2xsZWN0aW9uIjoiYXBwLmJza3kuZmVlZC5saWtlIiwiZGlkIjoiZGlkOnBsYzpwZWMyZ2d4N2h0NmhmbGlwdGlxYXludXkiLCJvcGVyYXRpb24iOiJjcmVhdGUiLCJyZWNvcmQiOnsiJHR5cGUiOiJhcHAuYnNreS5mZWVkLmxpa2UiLCJjcmVhdGVkQXQiOiIyMDI1LTA3LTEzVDE5OjUxOjE3Ljc1N1oiLCJzdWJqZWN0Ijp7ImNpZCI6ImJhZnlyZWljY2g2dXJwM2xxempxZXdlaXdyajNkcW9ucDV1Mnl5aGptbWM1dWhyZ2lkZzM3cnNudHVlIiwidXJpIjoiYXQ6Ly9kaWQ6cGxjOnk2YWxsaQ== \ No newline at end of file diff --git a/src/bench.zig b/src/bench.zig index 70c8c82..648bdd6 100644 --- a/src/bench.zig +++ b/src/bench.zig @@ -234,7 +234,7 @@ fn benchSealedReadBlock(alloc: Allocator, io: Io) !Result { }; } -/// Per-block DID bloom lookup, consulted once per block per planBackfill. +/// Per-block DID bloom lookup, consulted once per block per planSnapshot. fn benchBloom(alloc: Allocator, io: Io) !Result { var filter = try gloom.Filter.init(alloc, 10_000, 0.01); defer filter.deinit(alloc); diff --git a/src/internal/ingest/convert.zig b/src/internal/ingest/convert.zig index a28cb8f..0da5906 100644 --- a/src/internal/ingest/convert.zig +++ b/src/internal/ingest/convert.zig @@ -204,9 +204,11 @@ fn convertCommit( const row_index = out.items.len - out_start; const display_time = try rowTime(stamped_rows, row_index, time_us); + const row_seq = if (first_seq == 0) 0 else first_seq + out.items.len; const wire_op: wire.CommitOp = .{ .did = c.repo, .time_us = display_time, + .seq = row_seq, .rev = c.rev, .operation = @tagName(op.action), .collection = op.collection, @@ -214,7 +216,6 @@ fn convertCommit( .record = if (is_delete) null else op.record, .cid = if (is_delete) null else op.cid, }; - const row_seq = if (first_seq == 0) 0 else first_seq + out.items.len; // record_cbor = the byte-exact archived payload (round-trip encode // is byte-identical per zat's tests) const record_cbor: []const u8 = if (is_delete) "" else try zat.cbor.encodeAlloc(allocator, op.record.?); @@ -240,7 +241,7 @@ fn convertCommit( }; var buf2: std.Io.Writer.Allocating = .init(allocator); errdefer buf2.deinit(); - wire.encodeCommitV2(allocator, &buf2.writer, wire_op, row_seq, record_cbor) catch |err| switch (err) { + wire.encodeCommitV2(allocator, &buf2.writer, wire_op, row_seq) catch |err| switch (err) { error.OutOfMemory => return err, else => v2_failed = true, }; @@ -395,7 +396,7 @@ test "stamped archive rows drive immediate live display time" { try testing.expectEqual(@as(usize, 1), frames.items.len); try testing.expectEqual(@as(i64, 200), frames.items[0].time_us); try testing.expect(std.mem.indexOf(u8, frames.items[0].json, "\"time_us\":200") != null); - try testing.expect(std.mem.indexOf(u8, frames.items[0].json_v2, "\"time_us\":200") != null); + try testing.expect(std.mem.indexOf(u8, frames.items[0].json_v2, "\"time\":\"1970-01-01T00:00:00.000200Z\"") != null); } test "invalid rev drops whole commit" { @@ -428,7 +429,7 @@ test "sync produces a v2-only frame; info nothing" { try testing.expectEqual(@as(usize, 1), frames.items.len); try testing.expectEqual(wire.Kind.sync, frames.items[0].kind); try testing.expectEqual(@as(usize, 0), frames.items[0].json.len); - try testing.expect(std.mem.indexOf(u8, frames.items[0].json_v2, "\"kind\":\"sync\"") != null); + try testing.expect(std.mem.indexOf(u8, frames.items[0].json_v2, "subscribeEvents#sync") != null); try testing.expect(std.mem.indexOf(u8, frames.items[0].json_v2, "\"seq\":5") != null); } diff --git a/src/internal/runtime/metrics.zig b/src/internal/runtime/metrics.zig index 632aef5..b6106b5 100644 --- a/src/internal/runtime/metrics.zig +++ b/src/internal/runtime/metrics.zig @@ -410,12 +410,14 @@ fn httpCode(code: u16) HttpCode { /// wrapped. All XRPC methods share the stable `xrpc/` handler label because /// upstream registers one `/xrpc/` subtree handler. pub fn httpHandler(path: []const u8, method: []const u8) ?HttpHandler { + // the v2 subscription lives on an /xrpc/ path but keeps its own handler + // label (continuity with the /subscribe-v2 era dashboards) + if (std.mem.eql(u8, path, "/xrpc/network.bsky.jetstream.subscribeEvents")) return .subscribe_v2; if (std.mem.startsWith(u8, path, "/xrpc/")) return .xrpc; if (std.mem.eql(u8, method, "GET")) { if (std.mem.eql(u8, path, "/")) return .root; if (std.mem.eql(u8, path, "/status")) return .status; if (std.mem.eql(u8, path, "/subscribe")) return .subscribe; - if (std.mem.eql(u8, path, "/subscribe-v2")) return .subscribe_v2; } if (std.mem.eql(u8, method, "HEAD") and std.mem.eql(u8, path, "/status")) return .status; return null; @@ -1437,7 +1439,7 @@ test "http handler labels match upstream public middleware boundaries" { try std.testing.expectEqual(HttpHandler.status, httpHandler("/status", "GET").?); try std.testing.expectEqual(HttpHandler.status, httpHandler("/status", "HEAD").?); try std.testing.expectEqual(HttpHandler.subscribe, httpHandler("/subscribe", "GET").?); - try std.testing.expectEqual(HttpHandler.subscribe_v2, httpHandler("/subscribe-v2", "GET").?); + try std.testing.expectEqual(HttpHandler.subscribe_v2, httpHandler("/xrpc/network.bsky.jetstream.subscribeEvents", "GET").?); try std.testing.expectEqual(HttpHandler.xrpc, httpHandler("/xrpc/network.bsky.jetstream.getBlock", "GET").?); try std.testing.expectEqual(HttpHandler.xrpc, httpHandler("/xrpc/not-implemented", "POST").?); try std.testing.expectEqual(null, httpHandler("/metrics", "GET")); diff --git a/src/internal/serve/filter.zig b/src/internal/serve/filter.zig index fd792ac..7059a08 100644 --- a/src/internal/serve/filter.zig +++ b/src/internal/serve/filter.zig @@ -1,9 +1,14 @@ -//! /subscribe filter options — wantedCollections / wantedDids +//! subscribe filter options //! -//! parsing and matching per the v1 wire contract, quirks included +//! v1 (/subscribe): wantedCollections / wantedDids, quirks included //! (docs/upstream-subscribe-protocol.md): prefix patterns get no NSID //! validation of the head, caps fire post-dedupe, identity/account events //! bypass wantedCollections, empty-collection commits bypass the filter. +//! +//! v2 (network.bsky.jetstream.subscribeEvents): kinds / dids / collections — +//! three orthogonal AND-composed predicates, each match-all when omitted. +//! collections constrains only commit events; kinds is validated against the +//! lexicon enum; the legacy v1 names are rejected upstream of this parser. const std = @import("std"); const zat = @import("zat"); @@ -19,10 +24,14 @@ pub const ParseError = error{ TooManyCollections, InvalidDid, InvalidEncoding, + InvalidKind, + CollectionsWithoutCommits, TooManyDids, OutOfMemory, }; +pub const KindSet = std.enums.EnumSet(wire.Kind); + pub const Filter = struct { /// exact collection NSIDs; null means match-all (no collection filter) collections: ?std.StringHashMapUnmanaged(void) = null, @@ -30,6 +39,8 @@ pub const Filter = struct { prefixes: std.ArrayList([]const u8) = .empty, /// wanted DIDs; null means match-all dids: ?std.StringHashMapUnmanaged(void) = null, + /// v2 kinds predicate; full set means match-all (v1 always full) + kinds: KindSet = KindSet.initFull(), arena: std.heap.ArenaAllocator, pub fn init(allocator: Allocator) Filter { @@ -59,6 +70,40 @@ pub const Filter = struct { return f; } + /// parse a network.bsky.jetstream.subscribeEvents query: kinds / dids / + /// collections. an out-of-enum kind and a collections filter that can + /// never apply (kinds present but excluding commit) are both errors — + /// the caller maps them to pre-upgrade HTTP 400s. + pub fn parseQueryV2(allocator: Allocator, query: []const u8) ParseError!Filter { + var f = Filter.init(allocator); + errdefer f.deinit(); + var saw_kinds = false; + var saw_collections = false; + var kinds = KindSet.initEmpty(); + var it = std.mem.splitScalar(u8, query, '&'); + while (it.next()) |pair| { + if (pair.len == 0) continue; + const eq = std.mem.indexOfScalar(u8, pair, '=') orelse continue; + const key = pair[0..eq]; + const value = try percentDecodeAlloc(f.arena.allocator(), pair[eq + 1 ..]); + if (std.mem.eql(u8, key, "collections")) { + saw_collections = true; + try f.addCollection(value); + } else if (std.mem.eql(u8, key, "dids")) { + try f.addDid(value); + } else if (std.mem.eql(u8, key, "kinds")) { + saw_kinds = true; + const kind = std.meta.stringToEnum(wire.Kind, value) orelse return error.InvalidKind; + kinds.insert(kind); + } + } + if (saw_kinds) { + if (saw_collections and !kinds.contains(.commit)) return error.CollectionsWithoutCommits; + f.kinds = kinds; + } + return f; + } + pub fn addCollection(self: *Filter, raw: []const u8) ParseError!void { const alloc = self.arena.allocator(); if (std.mem.endsWith(u8, raw, ".*")) { @@ -91,6 +136,7 @@ pub const Filter = struct { /// does this filter want a frame? pub fn wants(self: *const Filter, kind: wire.Kind, did: []const u8, collection: []const u8) bool { + if (!self.kinds.contains(kind)) return false; if (self.dids) |dids| { if (!dids.contains(did)) return false; } @@ -145,6 +191,26 @@ fn percentDecodeAlloc(allocator: Allocator, input: []const u8) ParseError![]cons return out[0..write]; } +test "v2 query: kinds, dids, collections compose as AND predicates" { + var f = try Filter.parseQueryV2(testing.allocator, "kinds=commit&kinds=account&collections=app.bsky.feed.post&collections=sh.tangled.*"); + defer f.deinit(); + try testing.expect(f.wants(.commit, "did:plc:x", "app.bsky.feed.post")); + try testing.expect(f.wants(.commit, "did:plc:x", "sh.tangled.repo")); + try testing.expect(!f.wants(.commit, "did:plc:x", "app.bsky.graph.follow")); + // collections constrains only commits; account passes because kinds allows it + try testing.expect(f.wants(.account, "did:plc:x", "")); + // identity excluded by kinds even though collections would not apply + try testing.expect(!f.wants(.identity, "did:plc:x", "")); + + try testing.expectError(error.InvalidKind, Filter.parseQueryV2(testing.allocator, "kinds=bogus")); + try testing.expectError(error.CollectionsWithoutCommits, Filter.parseQueryV2(testing.allocator, "kinds=identity&collections=app.bsky.feed.post")); + + // omitted kinds = match-all, sync included (v2 emits sync) + var all = try Filter.parseQueryV2(testing.allocator, ""); + defer all.deinit(); + try testing.expect(all.wants(.sync, "did:plc:x", "")); +} + test "collection exact and prefix matching" { var f = try Filter.parseQuery(testing.allocator, "wantedCollections=app.bsky.feed.post&wantedCollections=sh.tangled.*"); defer f.deinit(); diff --git a/src/internal/serve/homepage.zig b/src/internal/serve/homepage.zig index 2430a69..b96e438 100644 --- a/src/internal/serve/homepage.zig +++ b/src/internal/serve/homepage.zig @@ -138,14 +138,14 @@ pub fn render(buf: []u8, args: Args) []const u8 { \\ \\ live \\ GET /subscribe jetstream-compatible json firehose - \\ GET /subscribe-v2 + seq cursors, record cbor, #sync + \\ GET /xrpc/network.bsky.jetstream.subscribeEvents \\ GET /xrpc/network.bsky.jetstream.getZstdDictionary \\ \\ archive \\ GET /xrpc/network.bsky.jetstream.listSegments \\ GET /xrpc/network.bsky.jetstream.getSegment \\ GET /xrpc/network.bsky.jetstream.getBlock - \\ POST /xrpc/network.bsky.jetstream.planBackfill + \\ POST /xrpc/network.bsky.jetstream.planSnapshot \\ \\ ops \\ /status @@ -204,12 +204,12 @@ pub fn renderHtml(buf: []u8, args: Args) []const u8 { \\

“No one ever steps in the same river twice.”

— Heraclitus
\\

Open the stream

\\
GET/subscribeJetstream-compatible JSON firehose
- \\
GET/subscribe-v2Sequence cursors, record CBOR, and sync events
+ \\
GET/xrpc/network.bsky.jetstream.subscribeEventsProposal-0015 lexicon frames: seq cursors, records, sync events
\\
GET/xrpc/network.bsky.jetstream.getZstdDictionaryFetch the current v2 compression dictionary
\\
GET/xrpc/network.bsky.jetstream.listSegmentsBrowse sealed archive segments
\\
GET/xrpc/network.bsky.jetstream.getSegmentDownload a sealed segment
\\
GET/xrpc/network.bsky.jetstream.getBlockRead one compressed block
- \\
POST/xrpc/network.bsky.jetstream.planBackfillPlan an archive range download
+ \\
POST/xrpc/network.bsky.jetstream.planSnapshotPlan an archive range download
\\
up ) catch {}; writeUptime(&w, args.uptime_s); @@ -479,7 +479,7 @@ test "render carries live numbers and the quote" { try testing.expect(std.mem.indexOf(u8, out, "182,401,554 live events this run") != null); try testing.expect(std.mem.indexOf(u8, out, "12 listening") != null); try testing.expect(std.mem.indexOf(u8, out, "up 4d 12h") != null); - try testing.expect(std.mem.indexOf(u8, out, "/subscribe-v2") != null); + try testing.expect(std.mem.indexOf(u8, out, "subscribeEvents") != null); } test "bootstrap variant explains subscription readiness" { diff --git a/src/internal/serve/server.zig b/src/internal/serve/server.zig index 21f2e8b..17e9d2d 100644 --- a/src/internal/serve/server.zig +++ b/src/internal/serve/server.zig @@ -83,6 +83,9 @@ const CursorPlan = struct { /// v1 skip rules, or message caps suppress every frame in a batch. start_seq: ?u64 = null, mode: metrics.CursorMode = .live, + /// v2 timestamp cursor clamped to the retention floor: the subscriber is + /// owed one #info OutdatedCursor frame before events (lexicon contract) + outdated_info: bool = false, }; pub const Hub = struct { @@ -181,7 +184,8 @@ const Subscriber = struct { /// the cap still compares the UNCOMPRESSED length (documented upstream /// divergence from original v1, kept deliberately). compressor: ?zstd.DictCompressor = null, - /// /subscribe-v2: superset wire (seq, record_cbor, #sync), strict cursors + /// network.bsky.jetstream.subscribeEvents: proposal-0015 wire (lexicon + /// message frames, #sync, strict seq cursors) v2: bool = false, thread: ?std.Thread = null, ping_thread: ?std.Thread = null, @@ -390,6 +394,16 @@ const Subscriber = struct { const lag = tip -| self.cursor_seq; if (!self.slow.observe(Io.Timestamp.now(self.hub.io, .real).toNanoseconds(), self.cursor_seq, lag)) return false; _ = self.hub.stats.subscribe_adversarial_drops_total.fetchAdd(1, .monotonic); + if (self.v2) { + // proposal-0015: an error frame is terminal — best-effort send, + // then the caller disconnects (upstream handler.go sendError) + var err_buf: [256]u8 = undefined; + var w: std.Io.Writer = .fixed(&err_buf); + var msg_buf: [160]u8 = undefined; + const msg = std.fmt.bufPrint(&msg_buf, "reading below the floor rate {d} events behind the tip; reconnect with cursor={d}", .{ lag, self.cursor_seq }) catch "reading below the floor rate"; + wire.encodeErrorV2(&w, "ConsumerTooSlow", msg) catch {}; + if (w.buffered().len > 0) _ = self.write(w.buffered()) catch {}; + } return true; } @@ -479,6 +493,11 @@ const HttpObservation = struct { } }; +pub const subscribe_events_path = "/xrpc/network.bsky.jetstream.subscribeEvents"; +/// the one subprotocol the v2 endpoint speaks (proposal 0015); also the +/// lexicon-declared default, so negotiation is a pure header echo +pub const v2_subprotocol = "xrpc.v1.json"; + pub const Handler = struct { hub: *Hub, conn: *websocket.Conn, @@ -512,7 +531,7 @@ pub const Handler = struct { } }.call; if (contextRole(context) == .debug or - (!std.mem.eql(u8, path, "/subscribe") and !std.mem.eql(u8, path, "/subscribe-v2"))) + (!std.mem.eql(u8, path, "/subscribe") and !std.mem.eql(u8, path, subscribe_events_path))) { respond(conn, "404 Not Found", "text/plain", "not found\n"); finishHttp(hub, http_started, http_handler, 404); @@ -527,7 +546,35 @@ pub const Handler = struct { finishHttp(hub, http_started, http_handler, 503); return error.Close; // response already written; Close suppresses the 400 } - const v2 = std.mem.eql(u8, path, "/subscribe-v2"); + const v2 = std.mem.eql(u8, path, subscribe_events_path); + if (v2) { + // proposal-0015 negotiation degenerates to a header echo: the + // lexicon-declared default IS xrpc.v1.json and it is the only + // token we speak, so an offer is echoed and a missing offer + // changes nothing (unnegotiated connections get identical + // framing). Unrecognized tokens are simply not echoed. + if (handshake.headers.get("sec-websocket-protocol")) |offered| { + var toks = std.mem.splitScalar(u8, offered, ','); + while (toks.next()) |tok| { + if (std.mem.eql(u8, std.mem.trim(u8, tok, " "), v2_subprotocol)) { + handshake.res_headers.add("Sec-WebSocket-Protocol", v2_subprotocol); + break; + } + } + } + // the legacy names are rejected with the replacement named, + // never silently ignored (upstream docs README §5.2) + if (queryParam(query, "wantedCollections") != null) { + respond(conn, "400 Bad Request", "application/json", "{\"error\":\"InvalidRequest\",\"message\":\"wantedCollections is the legacy v1 parameter; use collections\"}\n"); + finishHttp(hub, http_started, http_handler, 400); + return error.Close; + } + if (queryParam(query, "wantedDids") != null) { + respond(conn, "400 Bad Request", "application/json", "{\"error\":\"InvalidRequest\",\"message\":\"wantedDids is the legacy v1 parameter; use dids\"}\n"); + finishHttp(hub, http_started, http_handler, 400); + return error.Close; + } + } var compress = false; const legacy_compress = if (queryParam(query, "compress")) |v| std.mem.eql(u8, v, "true") else false; @@ -537,7 +584,7 @@ pub const Handler = struct { false; if (v2) { if (legacy_compress or header_zstd) { - respond(conn, "400 Bad Request", "text/plain", "compress=true / Socket-Encoding: zstd is the /subscribe (v1) opt-in; /subscribe-v2 uses zstdDictionary= with the dictionary from getZstdDictionary\n"); + respond(conn, "400 Bad Request", "text/plain", "compress=true / Socket-Encoding: zstd is the /subscribe (v1) opt-in; subscribeEvents uses zstdDictionary= with the dictionary from getZstdDictionary\n"); finishHttp(hub, http_started, http_handler, 400); return error.Close; } @@ -575,8 +622,21 @@ pub const Handler = struct { // V2 and either custom-zstd mode explicitly decline the extension. if (v2 or compress) conn.disableCompression(); - var filter = filter_mod.Filter.parseQuery(hub.allocator, query) catch |err| { + var filter = (if (v2) + filter_mod.Filter.parseQueryV2(hub.allocator, query) + else + filter_mod.Filter.parseQuery(hub.allocator, query)) catch |err| { log.debug("subscribe: invalid options: {s}", .{@errorName(err)}); + if (v2 and err != error.OutOfMemory) { + const msg = switch (err) { + error.InvalidKind => "{\"error\":\"InvalidRequest\",\"message\":\"kinds values must be commit, identity, account, or sync\"}\n", + error.CollectionsWithoutCommits => "{\"error\":\"InvalidRequest\",\"message\":\"collections can never apply when kinds excludes commit\"}\n", + else => "{\"error\":\"InvalidRequest\",\"message\":\"invalid filter parameters\"}\n", + }; + respond(conn, "400 Bad Request", "application/json", msg); + finishHttp(hub, http_started, http_handler, 400); + return error.Close; + } finishHttp(hub, http_started, http_handler, if (err == error.OutOfMemory) 500 else 400); return error.InvalidRequest; }; @@ -601,9 +661,12 @@ pub const Handler = struct { archive.manifest.lookbackFloor(Io.Timestamp.now(hub.io, .real).toMicroseconds(), hub.cursor_lookback_ns).seq else 0; - var body_buf: [192]u8 = undefined; - const body = std.fmt.bufPrint(&body_buf, "subscribe: cursor too old: cursor {d} below lookback floor {d}; re-backfill from your last seq\n", .{ requested, floor }) catch "subscribe: cursor too old\n"; - respond(conn, "400 Bad Request", "text/plain; charset=utf-8", body); + var body_buf: [256]u8 = undefined; + const body = if (v2) + std.fmt.bufPrint(&body_buf, "{{\"error\":\"CursorTooOld\",\"message\":\"cursor {d} is below the lookback floor {d}; re-backfill from your last seq via the archive\"}}\n", .{ requested, floor }) catch "{\"error\":\"CursorTooOld\"}\n" + else + std.fmt.bufPrint(&body_buf, "subscribe: cursor too old: cursor {d} below lookback floor {d}; re-backfill from your last seq\n", .{ requested, floor }) catch "subscribe: cursor too old\n"; + respond(conn, "400 Bad Request", if (v2) "application/json" else "text/plain; charset=utf-8", body); finishHttp(hub, http_started, http_handler, 400); return error.Close; } @@ -614,11 +677,12 @@ pub const Handler = struct { hub.stats.observeCursorResolve(@intCast(@max(resolve_finished - resolve_started, 0))); _ = hub.stats.subscribe_cursor_requests.getPtr(cursor_plan.mode).fetchAdd(1, .monotonic); - // quirk: requireHello is true iff the value is exactly "true" - const awaiting_hello = if (queryParam(query, "requireHello")) |v| + // quirk: requireHello is true iff the value is exactly "true". + // v2 is server-push only — the hello mechanism does not exist there. + const awaiting_hello = if (!v2) if (queryParam(query, "requireHello")) |v| std.mem.eql(u8, v, "true") else - false; + false else false; conn.writeTimeout(frame_write_timeout_ms) catch |err| { finishHttp(hub, http_started, http_handler, 500); @@ -689,6 +753,14 @@ pub const Handler = struct { }, }; self.pending_filter = null; // ownership moved to the subscriber + if (self.v2 and plan.outdated_info) { + // lexicon contract: a clamped timestamp cursor owes the client + // one seq-less #info OutdatedCursor frame before any event + var info_buf: [256]u8 = undefined; + var w: std.Io.Writer = .fixed(&info_buf); + wire.encodeInfoV2(&w, "OutdatedCursor", "requested timestamp was below retention; resumed at the floor") catch {}; + if (w.buffered().len > 0) _ = sub.write(w.buffered()) catch {}; + } const scheme = sub.compression(); sub.thread = std.Thread.spawn(.{ .stack_size = subscriber_stack_size }, Subscriber.run, .{sub}) catch |err| { sub.filter.deinit(); @@ -719,6 +791,12 @@ pub const Handler = struct { /// JSON closes 1007; a payload failing validation closes 1008. an /// invalid update while awaiting hello disconnects. pub fn clientMessage(self: *Handler, allocator: Allocator, data: []const u8, tpe: websocket.MessageTextType) !void { + if (self.v2) { + // server-push only: ANY client data frame closes the connection + // (control frames are handled below this layer), matching the + // atmos xrpcserver subscription contract + return self.closeWith(1008, "network.bsky.jetstream.subscribeEvents is server-push only"); + } if (tpe != .text) return; const parsed = std.json.parseFromSlice(std.json.Value, allocator, data, .{}) catch { @@ -1667,6 +1745,8 @@ fn addAll( error.InvalidEncoding => "invalid options: invalid encoding", error.TooManyCollections => "too many wanted collections", error.TooManyDids => "too many wanted DIDs", + // v2 query-only errors; unreachable through options_update + error.InvalidKind, error.CollectionsWithoutCommits => "invalid options", error.OutOfMemory => "internal error", }; return false; @@ -1776,18 +1856,20 @@ fn resolveCursor(hub: *Hub, v2: bool, raw_param: ?[]const u8) !CursorPlan { .start_idx = idx, .start_seq = resolved_seq, .mode = if (clamped) .clamped else .time_us, + .outdated_info = v2 and clamped, }; return .{ .start_idx = hub.tail.gauges().base, .start_seq = resolved_seq, .mode = if (clamped) .clamped else .time_us, + .outdated_info = v2 and clamped, }; } var mode: metrics.CursorMode = .time_us; if (hub.tail.oldestTime()) |floor| { if (parsed < floor) mode = .clamped; } - return .{ .start_idx = hub.tail.indexForCursor(parsed), .mode = mode }; + return .{ .start_idx = hub.tail.indexForCursor(parsed), .mode = mode, .outdated_info = v2 and mode == .clamped }; } // === tests === diff --git a/src/internal/serve/wire.zig b/src/internal/serve/wire.zig index d19e989..46841fd 100644 --- a/src/internal/serve/wire.zig +++ b/src/internal/serve/wire.zig @@ -1,9 +1,13 @@ -//! jetstream v1 wire format — JSON event encoding +//! jetstream wire formats — JSON event encoding //! -//! one JSON object per websocket text frame. schema and quirks documented in -//! docs/upstream-subscribe-protocol.md. record CBOR is rendered in the atproto -//! data model's JSON representation ({"$link": ...} for CIDs, {"$bytes": ...} -//! for byte strings). +//! v1: one bare JSON object per websocket text frame (legacy-compatible; the +//! envelope carries "cursor" when the local seq is known, matching atmos's +//! JetstreamEvent). v2: network.bsky.jetstream.subscribeEvents — one +//! xrpc.v1.json message frame per event (atproto proposal 0015), payload +//! shapes and key order pinned to upstream's lexgen output (alphabetical). +//! record CBOR is rendered in the atproto data model's JSON representation +//! ({"$link": ...} for CIDs, {"$bytes": ...} for byte strings); the v2 wire +//! carries no duplicate base64 CBOR (upstream #327). const std = @import("std"); const zat = @import("zat"); @@ -54,6 +58,9 @@ fn writeString(s: *std.json.Stringify, bytes: []const u8) !void { pub const CommitOp = struct { did: []const u8, time_us: i64, + /// local archive seq; 0 = unknown (the envelope omits "cursor", matching + /// atmos's omitempty so legacy frames never gain a misleading cursor:0) + seq: u64 = 0, rev: []const u8, operation: []const u8, // "create" | "update" | "delete" collection: []const u8, @@ -70,6 +77,10 @@ pub fn encodeCommit(allocator: Allocator, w: *std.Io.Writer, op: CommitOp) !void try writeString(&s, op.did); try s.objectField("time_us"); try s.write(op.time_us); + if (op.seq != 0) { + try s.objectField("cursor"); + try s.write(op.seq); + } try s.objectField("kind"); try s.write("commit"); try s.objectField("commit"); @@ -100,6 +111,7 @@ pub fn encodeCommit(allocator: Allocator, w: *std.Io.Writer, op: CommitOp) !void pub fn encodeIdentity(w: *std.Io.Writer, args: struct { did: []const u8, time_us: i64, + local_seq: u64 = 0, seq: i64, time: []const u8, handle: ?[]const u8, @@ -110,6 +122,10 @@ pub fn encodeIdentity(w: *std.Io.Writer, args: struct { try writeString(&s, args.did); try s.objectField("time_us"); try s.write(args.time_us); + if (args.local_seq != 0) { + try s.objectField("cursor"); + try s.write(args.local_seq); + } try s.objectField("kind"); try s.write("identity"); try s.objectField("identity"); @@ -132,6 +148,7 @@ pub fn encodeIdentity(w: *std.Io.Writer, args: struct { pub fn encodeAccount(w: *std.Io.Writer, args: struct { did: []const u8, time_us: i64, + local_seq: u64 = 0, seq: i64, time: []const u8, active: bool, @@ -143,6 +160,10 @@ pub fn encodeAccount(w: *std.Io.Writer, args: struct { try writeString(&s, args.did); try s.objectField("time_us"); try s.write(args.time_us); + if (args.local_seq != 0) { + try s.objectField("cursor"); + try s.write(args.local_seq); + } try s.objectField("kind"); try s.write("account"); try s.objectField("account"); @@ -334,47 +355,99 @@ test "record with cid link and bytes" { try testing.expect(std.mem.indexOf(u8, json, "\"blob\":{\"$bytes\":\"AQID\"}") != null); } -// === /subscribe-v2: strict superset wire (docs upstream §5.2) === -// envelope adds cursor+seq (the local archive seq); commits add -// record_cbor (base64 std, the byte-exact archived payload); #sync is -// emitted (blocks = base64 CAR). shapes mirror upstream's v2Event/v2Commit. +// === network.bsky.jetstream.subscribeEvents: proposal-0015 wire === +// One xrpc.v1.json message frame per event: +// {"$type":"message","payload":{"$type":"network.bsky.jetstream.subscribeEvents#", ...}} +// Payload key order is pinned to upstream's lexgen output (alphabetical, +// $type first); `time` is RFC 3339 UTC with exactly six fractional digits +// (upstream encoder.go wireTimeLayout). No record_cbor (upstream #327). + +const message_frame_prefix = "{\"$type\":\"message\",\"payload\":"; +const nsid = "network.bsky.jetstream.subscribeEvents"; + +/// render a unix-microseconds timestamp as upstream's wireTimeLayout: +/// "2006-01-02T15:04:05.000000Z" — one rendering per instant, byte-stable. +pub fn writeWireTime(w: *std.Io.Writer, us: i64) !void { + const secs: i64 = @divFloor(us, std.time.us_per_s); + const micros: u32 = @intCast(us - secs * std.time.us_per_s); + const epoch_secs: std.time.epoch.EpochSeconds = .{ .secs = @intCast(secs) }; + const day = epoch_secs.getEpochDay(); + const year_day = day.calculateYearDay(); + const month_day = year_day.calculateMonthDay(); + const day_secs = epoch_secs.getDaySeconds(); + try w.print("{d:0>4}-{d:0>2}-{d:0>2}T{d:0>2}:{d:0>2}:{d:0>2}.{d:0>6}Z", .{ + year_day.year, + month_day.month.numeric(), + @as(u32, month_day.day_index) + 1, + day_secs.getHoursIntoDay(), + day_secs.getMinutesIntoHour(), + day_secs.getSecondsIntoMinute(), + micros, + }); +} + +fn writePayloadType(s: *std.json.Stringify, fragment: []const u8) !void { + try s.objectField("$type"); + try s.beginWriteRaw(); + try s.writer.writeByte('"'); + try s.writer.writeAll(nsid); + try s.writer.writeByte('#'); + try s.writer.writeAll(fragment); + try s.writer.writeByte('"'); + s.endWriteRaw(); +} + +fn writeEnvelopeTail(s: *std.json.Stringify, seq: u64, time_us: i64) !void { + try s.objectField("seq"); + try s.write(seq); + try s.objectField("time"); + try s.beginWriteRaw(); + try s.writer.writeByte('"'); + try writeWireTime(s.writer, time_us); + try s.writer.writeByte('"'); + s.endWriteRaw(); +} -pub fn encodeCommitV2(allocator: Allocator, w: *std.Io.Writer, op: CommitOp, seq: u64, record_cbor: []const u8) !void { +/// {"$type":"message","payload":{"$type":"...#commit","cid"?,"collection", +/// "did","operation","record"?,"rev","rkey","seq","time"}} +pub fn encodeCommitV2(allocator: Allocator, w: *std.Io.Writer, op: CommitOp, seq: u64) !void { + try w.writeAll(message_frame_prefix); var s: std.json.Stringify = .{ .writer = w }; try s.beginObject(); - try writeV2Envelope(&s, op.did, op.time_us, seq, "commit"); - try s.objectField("commit"); - try s.beginObject(); - try s.objectField("rev"); - try writeString(&s, op.rev); - try s.objectField("operation"); - try s.write(op.operation); - try s.objectField("collection"); - try writeString(&s, op.collection); - try s.objectField("rkey"); - try writeString(&s, op.rkey); - if (op.record) |record| { - try s.objectField("record"); - try writeCborValue(&s, record); - } + try writePayloadType(&s, "commit"); if (op.cid) |cid| { try s.objectField("cid"); const cid_str = try cidString(allocator, cid); defer allocator.free(cid_str); try s.write(cid_str); } - if (record_cbor.len > 0) { - try s.objectField("record_cbor"); - try writeBase64String(&s, record_cbor); + try s.objectField("collection"); + try writeString(&s, op.collection); + try s.objectField("did"); + try writeString(&s, op.did); + try s.objectField("operation"); + try s.write(op.operation); + if (op.record) |record| { + try s.objectField("record"); + try writeCborValue(&s, record); } + try s.objectField("rev"); + try writeString(&s, op.rev); + try s.objectField("rkey"); + try writeString(&s, op.rkey); + try writeEnvelopeTail(&s, seq, op.time_us); try s.endObject(); - try s.endObject(); + try w.writeByte('}'); } +/// {"$type":"message","payload":{"$type":"...#identity","did","identity":{...upstream verbatim},"seq","time"}} pub fn encodeIdentityV2(w: *std.Io.Writer, args: anytype, seq: u64) !void { + try w.writeAll(message_frame_prefix); var s: std.json.Stringify = .{ .writer = w }; try s.beginObject(); - try writeV2Envelope(&s, args.did, args.time_us, seq, "identity"); + try writePayloadType(&s, "identity"); + try s.objectField("did"); + try writeString(&s, args.did); try s.objectField("identity"); try s.beginObject(); try s.objectField("did"); @@ -388,13 +461,17 @@ pub fn encodeIdentityV2(w: *std.Io.Writer, args: anytype, seq: u64) !void { try s.objectField("time"); try s.write(args.time); try s.endObject(); + try writeEnvelopeTail(&s, seq, args.time_us); try s.endObject(); + try w.writeByte('}'); } +/// {"$type":"message","payload":{"$type":"...#account","account":{...},"did","seq","time"}} pub fn encodeAccountV2(w: *std.Io.Writer, args: anytype, seq: u64) !void { + try w.writeAll(message_frame_prefix); var s: std.json.Stringify = .{ .writer = w }; try s.beginObject(); - try writeV2Envelope(&s, args.did, args.time_us, seq, "account"); + try writePayloadType(&s, "account"); try s.objectField("account"); try s.beginObject(); try s.objectField("active"); @@ -410,9 +487,14 @@ pub fn encodeAccountV2(w: *std.Io.Writer, args: anytype, seq: u64) !void { try s.objectField("time"); try s.write(args.time); try s.endObject(); + try s.objectField("did"); + try writeString(&s, args.did); + try writeEnvelopeTail(&s, seq, args.time_us); try s.endObject(); + try w.writeByte('}'); } +/// {"$type":"message","payload":{"$type":"...#sync","did","seq","sync":{...},"time"}} pub fn encodeSyncV2(w: *std.Io.Writer, args: struct { did: []const u8, time_us: i64, @@ -421,9 +503,14 @@ pub fn encodeSyncV2(w: *std.Io.Writer, args: struct { time: []const u8, blocks: []const u8, }, seq: u64) !void { + try w.writeAll(message_frame_prefix); var s: std.json.Stringify = .{ .writer = w }; try s.beginObject(); - try writeV2Envelope(&s, args.did, args.time_us, seq, "sync"); + try writePayloadType(&s, "sync"); + try s.objectField("did"); + try writeString(&s, args.did); + try s.objectField("seq"); + try s.write(seq); try s.objectField("sync"); try s.beginObject(); try s.objectField("blocks"); @@ -437,20 +524,14 @@ pub fn encodeSyncV2(w: *std.Io.Writer, args: struct { try s.objectField("time"); try s.write(args.time); try s.endObject(); + try s.objectField("time"); + try s.beginWriteRaw(); + try s.writer.writeByte('"'); + try writeWireTime(s.writer, args.time_us); + try s.writer.writeByte('"'); + s.endWriteRaw(); try s.endObject(); -} - -fn writeV2Envelope(s: *std.json.Stringify, did: []const u8, time_us: i64, seq: u64, kind: []const u8) !void { - try s.objectField("did"); - try writeString(s, did); - try s.objectField("time_us"); - try s.write(time_us); - try s.objectField("cursor"); - try s.write(seq); - try s.objectField("kind"); - try s.write(kind); - try s.objectField("seq"); - try s.write(seq); + try w.writeByte('}'); } /// base64 std WITH padding, matching Go's []byte JSON encoding @@ -469,7 +550,39 @@ fn writeBase64String(s: *std.json.Stringify, data: []const u8) !void { s.endWriteRaw(); } -test "encodeCommitV2 superset shape" { +/// #info advisory (seq-less): {"$type":"message","payload":{"$type":"...#info","message"?,"name"}} +pub fn encodeInfoV2(w: *std.Io.Writer, name: []const u8, message: ?[]const u8) !void { + try w.writeAll(message_frame_prefix); + var s: std.json.Stringify = .{ .writer = w }; + try s.beginObject(); + try writePayloadType(&s, "info"); + if (message) |m| { + try s.objectField("message"); + try s.write(m); + } + try s.objectField("name"); + try s.write(name); + try s.endObject(); + try w.writeByte('}'); +} + +/// terminal error frame: {"$type":"error","error":code,"message"?}. the +/// connection closes immediately after one is sent. +pub fn encodeErrorV2(w: *std.Io.Writer, code: []const u8, message: ?[]const u8) !void { + var s: std.json.Stringify = .{ .writer = w }; + try s.beginObject(); + try s.objectField("$type"); + try s.write("error"); + try s.objectField("error"); + try s.write(code); + if (message) |m| { + try s.objectField("message"); + try s.write(m); + } + try s.endObject(); +} + +test "encodeCommitV2 emits a proposal-0015 message frame in lexgen key order" { var out: std.Io.Writer.Allocating = .init(testing.allocator); defer out.deinit(); const record: cbor.Value = .{ .map = &.{ @@ -480,17 +593,81 @@ test "encodeCommitV2 superset shape" { defer testing.allocator.free(cid.raw); try encodeCommitV2(testing.allocator, &out.writer, .{ .did = "did:plc:abc", - .time_us = 7, + .time_us = 1725911162329308, .rev = "3l3qo2vutsw2b", .operation = "create", .collection = "app.bsky.feed.like", .rkey = "k", .record = record, .cid = cid, - }, 42, payload); + }, 42); const json = out.written(); - try testing.expect(std.mem.startsWith(u8, json, "{\"did\":\"did:plc:abc\",\"time_us\":7,\"cursor\":42,\"kind\":\"commit\",\"seq\":42,")); - try testing.expect(std.mem.indexOf(u8, json, "\"record_cbor\":\"") != null); + try testing.expect(std.mem.startsWith(u8, json, + "{\"$type\":\"message\",\"payload\":{\"$type\":\"network.bsky.jetstream.subscribeEvents#commit\",\"cid\":\"b")); + // lexgen order: cid, collection, did, operation, record, rev, rkey, seq, time + const c = std.mem.indexOf(u8, json, "\"collection\":").?; + const d = std.mem.indexOf(u8, json, "\"did\":").?; + const o = std.mem.indexOf(u8, json, "\"operation\":").?; + const r = std.mem.indexOf(u8, json, "\"record\":").?; + try testing.expect(c < d and d < o and o < r); + try testing.expect(std.mem.indexOf(u8, json, "\"seq\":42,\"time\":\"2024-09-09T19:46:02.329308Z\"}}") != null); + try testing.expect(std.mem.indexOf(u8, json, "record_cbor") == null); + try testing.expect(std.mem.indexOf(u8, json, "time_us") == null); +} + +test "encodeCommitV2 delete omits cid and record" { + var out: std.Io.Writer.Allocating = .init(testing.allocator); + defer out.deinit(); + try encodeCommitV2(testing.allocator, &out.writer, .{ + .did = "did:plc:abc", + .time_us = 0, + .rev = "r", + .operation = "delete", + .collection = "app.bsky.feed.like", + .rkey = "k", + }, 7); + const json = out.written(); + try testing.expect(std.mem.indexOf(u8, json, "cid") == null); + try testing.expect(std.mem.indexOf(u8, json, "record") == null); + try testing.expect(std.mem.indexOf(u8, json, "\"time\":\"1970-01-01T00:00:00.000000Z\"") != null); +} + +test "encodeInfoV2 and encodeErrorV2 frames" { + var out: std.Io.Writer.Allocating = .init(testing.allocator); + defer out.deinit(); + try encodeInfoV2(&out.writer, "OutdatedCursor", "requested cursor was below retention; clamped"); + try testing.expect(std.mem.startsWith(u8, out.written(), + "{\"$type\":\"message\",\"payload\":{\"$type\":\"network.bsky.jetstream.subscribeEvents#info\",\"message\":")); + try testing.expect(std.mem.endsWith(u8, out.written(), "\"name\":\"OutdatedCursor\"}}")); + + out.clearRetainingCapacity(); + try encodeErrorV2(&out.writer, "ConsumerTooSlow", null); + try testing.expectEqualStrings("{\"$type\":\"error\",\"error\":\"ConsumerTooSlow\"}", out.written()); +} + +test "v1 envelope carries cursor when the seq is known, never when zero" { + var out: std.Io.Writer.Allocating = .init(testing.allocator); + defer out.deinit(); + try encodeCommit(testing.allocator, &out.writer, .{ + .did = "did:plc:abc", + .time_us = 1, + .seq = 42, + .rev = "r", + .operation = "delete", + .collection = "app.bsky.feed.like", + .rkey = "k", + }); + try testing.expect(std.mem.startsWith(u8, out.written(), "{\"did\":\"did:plc:abc\",\"time_us\":1,\"cursor\":42,\"kind\":\"commit\",")); + out.clearRetainingCapacity(); + try encodeCommit(testing.allocator, &out.writer, .{ + .did = "did:plc:abc", + .time_us = 1, + .rev = "r", + .operation = "delete", + .collection = "app.bsky.feed.like", + .rkey = "k", + }); + try testing.expect(std.mem.indexOf(u8, out.written(), "cursor") == null); } test "invalid utf8 in a string field stays a JSON string (never an array)" { diff --git a/src/internal/serve/xrpcapi.zig b/src/internal/serve/xrpcapi.zig index 46e1ed7..a3b5d7f 100644 --- a/src/internal/serve/xrpcapi.zig +++ b/src/internal/serve/xrpcapi.zig @@ -85,12 +85,18 @@ pub const Api = struct { self.getImportStatus(respond, query); return true; } - if (std.mem.eql(u8, method, "planBackfill")) { + if (std.mem.eql(u8, method, "planSnapshot")) { if (!is_post) { - respond.err(405, "InvalidRequest", "planBackfill is a procedure (POST)"); + respond.err(405, "InvalidRequest", "planSnapshot is a procedure (POST)"); return true; } - planBackfill(self, respond, body); + planSnapshot(self, respond, body); + return true; + } + if (std.mem.eql(u8, method, "planBackfill")) { + // renamed upstream (655ecc5); a hard 400 naming the successor + // beats a silent 501 for the handful of pre-rename consumers + respond.err(400, "InvalidRequest", "planBackfill was renamed; call network.bsky.jetstream.planSnapshot"); return true; } if (!is_get) { @@ -870,7 +876,7 @@ test "checksumHex is 16 lowercase hex chars" { try std.testing.expectEqualStrings("0000000000000001", checksumHex(&buf, 1)); } -// === planBackfill (procedure: POST, JSON body) === +// === planSnapshot (procedure: POST, JSON body) === const gloom = @import("../storage/gloom.zig"); const zstd_mod = @import("../storage/zstd.zig"); @@ -941,7 +947,7 @@ fn renderSegments( try s.endObject(); } -pub fn planBackfill(self: *Api, respond: anytype, body: []const u8) void { +pub fn planSnapshot(self: *Api, respond: anytype, body: []const u8) void { var arena = std.heap.ArenaAllocator.init(self.allocator); defer arena.deinit(); const alloc = arena.allocator(); @@ -971,7 +977,7 @@ pub fn planBackfill(self: *Api, respond: anytype, body: []const u8) void { respond.json(200, out.written()); } -/// Render the planBackfill body. Every failure is propagated so the caller +/// Render the planSnapshot body. Every failure is propagated so the caller /// answers 500; returning without responding would leave the request dropped. fn renderPlan( plan: PlanConfig, @@ -1176,7 +1182,7 @@ fn countRanges(matched: []const bool) u64 { return ranges; } -/// Write the planBackfill blockRange lexicon exactly. These field names are +/// Write the planSnapshot blockRange lexicon exactly. These field names are /// wire contract: upstream clients decode `first`/`last`; using different /// names silently turns every range into block zero in permissive decoders. fn writeBlockRanges(s: *std.json.Stringify, matched: []const bool) !void { @@ -1428,7 +1434,7 @@ test "planBackfill never answers 200 with a short plan under allocation failure" var baseline_api: Api = .{ .allocator = testing.allocator, .io = io, .archive = &archive }; var baseline: PlanResponder = .{}; - planBackfill(&baseline_api, &baseline, request); + planSnapshot(&baseline_api, &baseline, request); try testing.expectEqual(@as(u16, 200), baseline.code); try testing.expect(std.mem.indexOf(u8, baseline.written(), "\"segmentsMatched\":2") != null); @@ -1437,7 +1443,7 @@ test "planBackfill never answers 200 with a short plan under allocation failure" var failing = testing.FailingAllocator.init(testing.allocator, .{ .fail_index = fail_index }); var api: Api = .{ .allocator = failing.allocator(), .io = io, .archive = &archive }; var response: PlanResponder = .{}; - planBackfill(&api, &response, request); + planSnapshot(&api, &response, request); if (response.code == 200) { try testing.expectEqualStrings(baseline.written(), response.written()); } else if (response.code == 0) { @@ -1451,7 +1457,7 @@ test "planBackfill never answers 200 with a short plan under allocation failure" try testing.expect(unanswered == 0); } -// Same contract as planBackfill: allocation failure must answer, and must +// Same contract as planSnapshot: allocation failure must answer, and must // never answer 200 with a truncated segment list. A client pages listSegments // to discover the archive, so a short list silently hides sealed segments. test "listSegments never answers 200 with a short list under allocation failure" { diff --git a/src/internal/storage/cold.zig b/src/internal/storage/cold.zig index 91b468f..63ba949 100644 --- a/src/internal/storage/cold.zig +++ b/src/internal/storage/cold.zig @@ -704,7 +704,7 @@ pub fn encodeEventV2(alloc: Allocator, ev: segment.Event) !?[]u8 { .rkey = ev.rkey, .record = record, .cid = cid, - }, ev.seq, if (is_delete) "" else ev.payload); + }, ev.seq); }, .identity, .account => { const env = try zat.cbor.decodeAll(alloc, ev.payload); @@ -816,7 +816,7 @@ test "indexed timestamp overrides wire display time without changing witness" { const v1 = (try encodeEvent(allocator, base)).?; const v2 = (try encodeEventV2(allocator, base)).?; try testing.expect(std.mem.indexOf(u8, v1, "\"time_us\":1600000000000000") != null); - try testing.expect(std.mem.indexOf(u8, v2, "\"time_us\":1600000000000000") != null); + try testing.expect(std.mem.indexOf(u8, v2, "\"time\":\"2020-09-13T12:26:40.000000Z\"") != null); try testing.expectEqual(@as(i64, 1_700_000_000_000_000), base.witnessed_at); var fallback = base; @@ -879,7 +879,8 @@ test "offline seq replay uses the selected endpoint wire" { defer v2.deinit(); try testing.expectEqual(@as(u64, 1), try replaySeq(testing.allocator, io, &archive, &v2, Sink.wants, &v2, Sink.write, Sink.observe, true, 1)); try testing.expect(std.mem.indexOf(u8, v2.frames.items[0], "\"seq\":1") != null); - try testing.expect(std.mem.indexOf(u8, v2.frames.items[0], "record_cbor") != null); + try testing.expect(std.mem.indexOf(u8, v2.frames.items[0], "subscribeEvents#commit") != null); + try testing.expect(std.mem.indexOf(u8, v2.frames.items[0], "record_cbor") == null); } test "cached cold batches bound raw scans before filtering and stop at hot floor" { diff --git a/src/internal/storage/gloom.zig b/src/internal/storage/gloom.zig index 37dd877..83e0754 100644 --- a/src/internal/storage/gloom.zig +++ b/src/internal/storage/gloom.zig @@ -280,7 +280,7 @@ fn dimensions(blob: []const u8) !Dimensions { } /// Test a key directly against a resident, load-validated gloom blob. -/// This avoids allocating/copying every filter on every planBackfill request. +/// This avoids allocating/copying every filter on every planSnapshot request. pub fn containsMarshaled(blob: []const u8, key: []const u8) !bool { const dims = try dimensions(blob); const k = dims.k; diff --git a/src/internal/storage/segment.zig b/src/internal/storage/segment.zig index 84a0d6f..c4759b8 100644 --- a/src/internal/storage/segment.zig +++ b/src/internal/storage/segment.zig @@ -291,7 +291,7 @@ pub fn checksumValid(bytes: []const u8, header: Header) bool { } /// Decode the collection footer from a standalone footer slice. The resident -/// manifest uses this at startup so planBackfill never has to reopen segment +/// manifest uses this at startup so planSnapshot never has to reopen segment /// data files on its request path. pub fn decodeCollectionIndex(allocator: Allocator, bytes: []const u8, expected_block_count: u32) Error!CollectionIndex { if (bytes.len < 16) return error.Truncated; diff --git a/src/internal/storage/zstd.zig b/src/internal/storage/zstd.zig index 35ccc0c..4263fd7 100644 --- a/src/internal/storage/zstd.zig +++ b/src/internal/storage/zstd.zig @@ -181,11 +181,11 @@ test "dictionary round-trip carries the v1 dict id" { test "v2 dictionary is the pinned upstream artifact" { try std.testing.expectEqual(@as(usize, 65_536), v2_dictionary.len); - try std.testing.expectEqual(@as(u32, 20_260_709), v2_dictionary_id); + try std.testing.expectEqual(@as(u32, 20_260_811), v2_dictionary_id); try std.testing.expectEqual(@as(u32, 0xEC30A437), std.mem.readInt(u32, v2_dictionary[0..4], .little)); var digest: [32]u8 = undefined; std.crypto.hash.sha2.Sha256.hash(&v2_dictionary, &digest, .{}); var expected: [32]u8 = undefined; - _ = try std.fmt.hexToBytes(&expected, "738b9917d6fbdf5eb51eb90c46adbdb2c127e4ae4df7ca78a81c2e1666205ca2"); + _ = try std.fmt.hexToBytes(&expected, "f631a689a829b84b042ba45bcd7a7c2f792467192c5832fcfc1fc48afbec96aa"); try std.testing.expectEqualSlices(u8, &expected, &digest); } diff --git a/tests/archive_client_e2e.py b/tests/archive_client_e2e.py index 84b0454..ae48bdc 100644 --- a/tests/archive_client_e2e.py +++ b/tests/archive_client_e2e.py @@ -19,7 +19,7 @@ import subprocess import urllib.request -UPSTREAM_PIN = "f29815c391fc2644f8a3dd36b899fb3697dd1ea6" +UPSTREAM_PIN = "d4dd2f0127e8934d125b2a26a90fe88239ca98a2" UPSTREAM = pathlib.Path( os.environ.get( "STREAM_UPSTREAM_REPO", diff --git a/tests/backfill_api.py b/tests/backfill_api.py index c30004b..b35064d 100644 --- a/tests/backfill_api.py +++ b/tests/backfill_api.py @@ -67,9 +67,9 @@ except urllib.error.HTTPError as e: print(f"backfill api: PASS ({len(segs)} segments, seg0 {s0['eventCount']} events, block0 {n} events)") -# --- planBackfill --- +# --- planSnapshot --- def post_plan(body): - req = urllib.request.Request(BASE + "planBackfill", data=json.dumps(body).encode(), + req = urllib.request.Request(BASE + "planSnapshot", data=json.dumps(body).encode(), headers={"Content-Type": "application/json"}, method="POST") return json.load(urllib.request.urlopen(req)) @@ -115,7 +115,7 @@ assert unknown["stats"]["blocksMatched"] == 0, "blooms should prune unknown DIDs done = post_plan({"afterSeq": plan["sealedTipSeq"]}) assert done["segments"] == [] -print(f"planBackfill: PASS (tip={plan['sealedTipSeq']}, {plan['stats']['segmentsMatched']} segs, unknown-did blocks={unknown['stats']['blocksMatched']})") +print(f"planSnapshot: PASS (tip={plan['sealedTipSeq']}, {plan['stats']['segmentsMatched']} segs, unknown-did blocks={unknown['stats']['blocksMatched']})") # --- Range on getSegment --- req = urllib.request.Request(BASE + f"getSegment?name={s0['name']}", headers={"Range": "bytes=0-255"}) diff --git a/tests/cursor_lookback_contract.py b/tests/cursor_lookback_contract.py index ee9bd0e..6b48450 100644 --- a/tests/cursor_lookback_contract.py +++ b/tests/cursor_lookback_contract.py @@ -72,7 +72,7 @@ def read_frame(connection, buffered): # and startup resumes it in place, as upstream's ingest.Open does, so the floor # is segment 1's min_seq (2001) -- not the active segment's first seq (4001). if MODE == "default": - connection, status, headers, buffered = handshake("/subscribe-v2?cursor=1") + connection, status, headers, buffered = handshake("/xrpc/network.bsky.jetstream.subscribeEvents?cursor=1") try: assert status.startswith("HTTP/1.1 400") length = int(headers["content-length"]) @@ -92,7 +92,7 @@ if MODE == "default": finally: connection.close() elif MODE == "wide": - connection, status, _, buffered = handshake("/subscribe-v2?cursor=1") + connection, status, _, buffered = handshake("/xrpc/network.bsky.jetstream.subscribeEvents?cursor=1") try: assert status.startswith("HTTP/1.1 101") payload, _ = read_frame(connection, buffered) @@ -101,7 +101,7 @@ elif MODE == "wide": finally: connection.close() elif MODE == "disabled": - connection, status, _, buffered = handshake("/subscribe-v2?cursor=1") + connection, status, _, buffered = handshake("/xrpc/network.bsky.jetstream.subscribeEvents?cursor=1") try: assert status.startswith("HTTP/1.1 101") connection.settimeout(0.2) diff --git a/tests/differential_oracle.py b/tests/differential_oracle.py index 90b9883..3323eb7 100644 --- a/tests/differential_oracle.py +++ b/tests/differential_oracle.py @@ -15,7 +15,7 @@ import subprocess import tempfile -PIN = "f29815c391fc2644f8a3dd36b899fb3697dd1ea6" +PIN = "d4dd2f0127e8934d125b2a26a90fe88239ca98a2" ROOT = Path(__file__).resolve().parents[1] UPSTREAM = Path( os.environ.get( diff --git a/tests/e2e.py b/tests/e2e.py index 9128af9..763c9e7 100644 --- a/tests/e2e.py +++ b/tests/e2e.py @@ -57,25 +57,33 @@ async def basics(): print("basics: PASS") async def check_v2(): - import base64 - # superset shape: seq/cursor present, record_cbor round-trips + # proposal-0015 message frames: one self-describing JSON object per frame seqs = [] - async with websockets.connect(replay_url("ws://localhost:6008/subscribe-v2")) as ws: + async with websockets.connect(replay_url("ws://localhost:6008/xrpc/network.bsky.jetstream.subscribeEvents"), subprotocols=["xrpc.v1.json"]) as ws: + assert ws.subprotocol == "xrpc.v1.json", f"negotiation echo missing: {ws.subprotocol}" for _ in range(10): - e = json.loads(await asyncio.wait_for(ws.recv(), 10)) - assert e["seq"] == e["cursor"] and e["seq"] > 0 - seqs.append(e["seq"]) - if e["kind"] == "commit" and e["commit"]["operation"] != "delete": - raw = base64.b64decode(e["commit"]["record_cbor"]) - assert raw[0] & 0xE0 == 0xA0, "record_cbor must be a CBOR map" - assert "record" in e["commit"] + frame = json.loads(await asyncio.wait_for(ws.recv(), 10)) + assert frame["$type"] == "message", frame + p = frame["payload"] + assert p["$type"].startswith("network.bsky.jetstream.subscribeEvents#"), p["$type"] + assert p["seq"] > 0 and p["time"].endswith("Z") and "." in p["time"] + seqs.append(p["seq"]) + if p["$type"].endswith("#commit") and p["operation"] != "delete": + assert "record" in p and "record_cbor" not in p assert seqs == sorted(seqs), "v2 seqs must be monotonic" - # seq-cursor resume: reconnect from an observed seq replays overlap - async with websockets.connect(f"ws://localhost:6008/subscribe-v2?cursor={seqs[0]}") as ws: - e = json.loads(await asyncio.wait_for(ws.recv(), 10)) - assert e["seq"] >= seqs[0] - print(f"subscribe-v2: PASS (seqs {seqs[0]}..{seqs[-1]})") + # inclusive seq-cursor resume: reconnect from an observed seq replays it + async with websockets.connect(f"ws://localhost:6008/xrpc/network.bsky.jetstream.subscribeEvents?cursor={seqs[0]}") as ws: + frame = json.loads(await asyncio.wait_for(ws.recv(), 10)) + assert frame["payload"]["seq"] >= seqs[0] + + # the legacy v1 parameter names are rejected with the replacement named + try: + async with websockets.connect(f"ws://localhost:6008/xrpc/network.bsky.jetstream.subscribeEvents?wantedDids=did%3Aplc%3Ax") as ws: + raise AssertionError("wantedDids must be rejected on subscribeEvents") + except websockets.InvalidStatus as e: + assert e.response.status_code == 400 + print(f"subscribeEvents: PASS (seqs {seqs[0]}..{seqs[-1]})") async def check_zstd(): import zstandard, urllib.request diff --git a/tests/environment_contract.py b/tests/environment_contract.py index 2a8469e..0f525c5 100644 --- a/tests/environment_contract.py +++ b/tests/environment_contract.py @@ -17,7 +17,7 @@ import urllib.request BIN = "./zig-out/bin/stream" -PIN = "f29815c391fc2644f8a3dd36b899fb3697dd1ea6" +PIN = "d4dd2f0127e8934d125b2a26a90fe88239ca98a2" ROOT = pathlib.Path(__file__).resolve().parents[1] # STREAM_UPSTREAM_REPO is the name the justfile, scripts/admit, and the other # oracles already use; this file was the only one reading JETSTREAM_UPSTREAM, diff --git a/tests/oracle.py b/tests/oracle.py index 190dee9..8c581dc 100644 --- a/tests/oracle.py +++ b/tests/oracle.py @@ -97,13 +97,16 @@ def metric(samples, name, **labels): async def replay_invariants(n): """seqs strictly increasing from a cold cursor; frames well-formed""" - url = f"ws://127.0.0.1:{PORT}/subscribe-v2?cursor=0" + url = f"ws://127.0.0.1:{PORT}/xrpc/network.bsky.jetstream.subscribeEvents?cursor=0" prev = 0 got = 0 async with websockets.connect(url) as ws: while got < n: raw = await asyncio.wait_for(ws.recv(), timeout=15) - e = json.loads(raw) + frame = json.loads(raw) + assert frame.get("$type") == "message", frame + e = frame["payload"] + assert e.get("$type", "").startswith("network.bsky.jetstream.subscribeEvents#"), e seq = e.get("seq") assert isinstance(seq, int) and seq > prev, (prev, e) # A non-string did means the server served a malformed frame — seen @@ -112,7 +115,7 @@ async def replay_invariants(n): # frame itself: an AttributeError here hides the evidence. did = e.get("did", "") assert isinstance(did, str) and did.startswith("did:"), ( - f"malformed did on /subscribe-v2: type={type(did).__name__} " + f"malformed did on subscribeEvents: type={type(did).__name__} " f"value={did!r}\nraw frame: {raw[:600]!r}" ) # The encoder substitutes U+FFFD for invalid UTF-8 so a bad byte diff --git a/tests/plan_config_contract.py b/tests/plan_config_contract.py index 648436c..554480a 100644 --- a/tests/plan_config_contract.py +++ b/tests/plan_config_contract.py @@ -1,4 +1,4 @@ -"""Real-process contract for Jetstream V2 planBackfill operator controls.""" +"""Real-process contract for Jetstream V2 planSnapshot operator controls.""" import json import os @@ -6,7 +6,7 @@ import urllib.error import urllib.request -BASE = os.environ["STREAM_BASE_URL"].rstrip("/") + "/xrpc/network.bsky.jetstream.planBackfill" +BASE = os.environ["STREAM_BASE_URL"].rstrip("/") + "/xrpc/network.bsky.jetstream.planSnapshot" MODE = os.environ["STREAM_PLAN_CONFIG_MODE"] diff --git a/tests/powerloss_oracle.py b/tests/powerloss_oracle.py index 5c6d5e7..a4a8e60 100644 --- a/tests/powerloss_oracle.py +++ b/tests/powerloss_oracle.py @@ -76,6 +76,7 @@ PATCH_CASES = [ FIXTURE_EVENTS = 2500 COMPACTED_EVENTS = 1507 IMPORTED_TIMESTAMP_US = 1_704_164_645_000_000 +IMPORTED_TIMESTAMP_RFC3339 = "2024-01-02T03:04:05.000000Z" def run(args, *, check=True, capture=True, timeout=60): @@ -237,10 +238,10 @@ def wait_serving(log_path, timeout=300): async def replay(count, *, require_unique=False): previous = 0 fingerprints = {} - url = f"ws://127.0.0.1:{PORT}/subscribe-v2?cursor=0" + url = f"ws://127.0.0.1:{PORT}/xrpc/network.bsky.jetstream.subscribeEvents?cursor=0" async with websockets.connect(url) as websocket: for _ in range(count): - event = json.loads(await asyncio.wait_for(websocket.recv(), timeout=15)) + event = json.loads(await asyncio.wait_for(websocket.recv(), timeout=15))["payload"] seq = event.get("seq") assert isinstance(seq, int) and seq > previous, (previous, event) assert event.get("did", "").startswith("did:"), event @@ -467,14 +468,14 @@ def run_compaction_powerloss_case(state, point): async def verify_timestamp_import(): targeted = 0 untouched = 0 - url = f"ws://127.0.0.1:{PORT}/subscribe-v2?cursor=0" + url = f"ws://127.0.0.1:{PORT}/xrpc/network.bsky.jetstream.subscribeEvents?cursor=0" async with websockets.connect(url) as websocket: for _ in range(FIXTURE_EVENTS): - event = json.loads(await asyncio.wait_for(websocket.recv(), timeout=15)) - commit = event.get("commit", {}) - materialization = event.get("kind") == "commit" and commit.get("operation") != "delete" - if materialization and event.get("did") == "did:plc:streamsampleaccount" and commit.get("collection") == "app.bsky.feed.post": - assert event.get("time_us") == IMPORTED_TIMESTAMP_US, event + event = json.loads(await asyncio.wait_for(websocket.recv(), timeout=15))["payload"] + materialization = event["$type"].endswith("#commit") and event.get("operation") != "delete" + if materialization and event.get("did") == "did:plc:streamsampleaccount" and event.get("collection") == "app.bsky.feed.post": + # the imported display timestamp surfaces as the RFC 3339 `time` + assert event.get("time") == IMPORTED_TIMESTAMP_RFC3339, event targeted += 1 elif materialization: expected = 1_700_000_000_000_000 + event["seq"] * 1000 diff --git a/tests/subscribe_read_batch_contract.py b/tests/subscribe_read_batch_contract.py index 4c6dcba..0804b08 100644 --- a/tests/subscribe_read_batch_contract.py +++ b/tests/subscribe_read_batch_contract.py @@ -23,7 +23,7 @@ def metric(name): connection = socket.create_connection((HOST, PORT), timeout=2) connection.settimeout(0.2) key = base64.b64encode(os.urandom(16)).decode() -path = "/subscribe-v2?cursor=1&wantedDids=did%3Aplc%3Aabsentbatchfixture" +path = "/xrpc/network.bsky.jetstream.subscribeEvents?cursor=1&dids=did%3Aplc%3Aabsentbatchfixture" connection.sendall( ( f"GET {path} HTTP/1.1\r\n" diff --git a/tests/upstream_oracle/stream_differential_test.go b/tests/upstream_oracle/stream_differential_test.go index 4b64663..27cf1c6 100644 --- a/tests/upstream_oracle/stream_differential_test.go +++ b/tests/upstream_oracle/stream_differential_test.go @@ -34,7 +34,7 @@ import ( "github.com/stretchr/testify/require" ) -const streamDifferentialPin = "f29815c391fc2644f8a3dd36b899fb3697dd1ea6" +const streamDifferentialPin = "d4dd2f0127e8934d125b2a26a90fe88239ca98a2" type synchronizedBuffer struct { mu sync.Mutex