@cartanova/qgrid-cli 2.10.10 → 2.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
- package/bundle/dist/application/monit/log-buffer.js +12 -6
- package/bundle/dist/application/monit/monit.frame.js +11 -3
- package/bundle/dist/application/monit/monit.types.js +1 -1
- package/bundle/dist/application/qgrid/conv-routing.js +9 -6
- package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
- package/bundle/dist/application/qgrid/oauth.js +31 -4
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
- package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
- package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
- package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
- package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
- package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
- package/bundle/dist/application/qgrid/token-death.js +1 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
- package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
- package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
- package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
- package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
- package/bundle/dist/application/request-log/request-log.model.js +83 -70
- package/bundle/dist/application/request-log/request-log.types.js +1 -1
- package/bundle/dist/application/request-log/zod-code-format.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
- package/bundle/dist/application/setting/setting.constant.js +1 -1
- package/bundle/dist/application/setting/setting.model.js +2 -2
- package/bundle/dist/application/setting/setting.store.js +2 -2
- package/bundle/dist/application/setting/setting.types.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +32 -16
- package/bundle/dist/application/sonamu.generated.sso.js +1 -1
- package/bundle/dist/application/token/token.model.js +26 -9
- package/bundle/dist/application/token/token.types.js +20 -3
- package/bundle/dist/i18n/en.js +15 -1
- package/bundle/dist/i18n/ko.js +15 -1
- package/bundle/dist/i18n/sd.generated.js +1 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
- package/bundle/dist/server-bootstrap.js +4 -2
- package/bundle/dist/server-error-handler.js +1 -1
- package/bundle/dist/sonamu.config.js +37 -8
- package/bundle/dist/startup-migrations.js +17 -7
- package/bundle/dist/testing/global.js +1 -1
- package/bundle/dist/testing/schema-bench.js +0 -0
- package/bundle/dist/testing/test-database-name.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
- package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
- package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
- package/bundle/dist/utils/providers/common/credentials.js +5 -1
- package/bundle/dist/utils/providers/common/effort.js +3 -3
- package/bundle/dist/utils/providers/common/model-cost.js +69 -14
- package/bundle/dist/utils/providers/common/provider-types.js +29 -1
- package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
- package/bundle/dist/utils/providers/common/strictifier.js +62 -43
- package/bundle/dist/utils/providers/common/thinking.js +3 -2
- package/bundle/dist/utils/providers/common/ttft.js +1 -1
- package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
- package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
- package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
- package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
- package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
- package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
- package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
- package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
- package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
- package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
- package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
- package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
- package/bundle/dist/utils/providers/grok/index.js +11 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
- package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
- package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
- package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
- package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
- package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
- package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
- package/bundle/dist/utils/quiet-hours.js +1 -1
- package/bundle/dist/utils/slack-notify.js +14 -8
- package/bundle/dist/utils/subset-loaders.js +4 -5
- package/bundle/src/application/monit/log-buffer.ts +23 -9
- package/bundle/src/application/monit/monit.frame.ts +22 -5
- package/bundle/src/application/monit/monit.types.ts +6 -0
- package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
- package/bundle/src/application/qgrid/conv-routing.ts +35 -9
- package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
- package/bundle/src/application/qgrid/oauth.ts +51 -15
- package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
- package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
- package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
- package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
- package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
- package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
- package/bundle/src/application/qgrid/token-death.ts +4 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
- package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
- package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
- package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
- package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
- package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
- package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
- package/bundle/src/application/request-log/request-log.model.ts +277 -146
- package/bundle/src/application/request-log/request-log.types.ts +6 -0
- package/bundle/src/application/request-log/zod-code-format.ts +11 -0
- package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
- package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
- package/bundle/src/application/setting/setting.constant.ts +9 -0
- package/bundle/src/application/setting/setting.model.ts +12 -2
- package/bundle/src/application/setting/setting.store.ts +5 -1
- package/bundle/src/application/setting/setting.types.ts +8 -0
- package/bundle/src/application/sonamu.generated.http +133 -0
- package/bundle/src/application/sonamu.generated.sso.ts +2 -0
- package/bundle/src/application/sonamu.generated.ts +15 -0
- package/bundle/src/application/token/token.identity.test.ts +20 -0
- package/bundle/src/application/token/token.model.ts +66 -7
- package/bundle/src/application/token/token.types.ts +24 -1
- package/bundle/src/i18n/en.ts +19 -0
- package/bundle/src/i18n/ko.ts +21 -0
- package/bundle/src/i18n/sd.generated.ts +23 -2
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
- package/bundle/src/server-bootstrap.ts +4 -2
- package/bundle/src/server-error-handler.ts +1 -0
- package/bundle/src/sonamu.config.ts +69 -7
- package/bundle/src/startup-migrations.ts +27 -9
- package/bundle/src/testing/global.ts +20 -0
- package/bundle/src/testing/schema-bench.ts +105 -30
- package/bundle/src/testing/test-database-name.ts +2 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
- package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
- package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
- package/bundle/src/utils/providers/common/credentials.ts +8 -0
- package/bundle/src/utils/providers/common/effort.ts +9 -2
- package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
- package/bundle/src/utils/providers/common/model-cost.ts +259 -158
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
- package/bundle/src/utils/providers/common/provider-types.ts +46 -3
- package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
- package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
- package/bundle/src/utils/providers/common/strictifier.ts +185 -59
- package/bundle/src/utils/providers/common/thinking.ts +2 -2
- package/bundle/src/utils/providers/common/ttft.ts +4 -2
- package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
- package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
- package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
- package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
- package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
- package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
- package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
- package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
- package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
- package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
- package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
- package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
- package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
- package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
- package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
- package/bundle/src/utils/providers/grok/index.ts +20 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
- package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
- package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
- package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
- package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
- package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
- package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
- package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
- package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
- package/bundle/src/utils/quiet-hours.ts +12 -1
- package/bundle/src/utils/slack-notify.ts +44 -13
- package/bundle/src/utils/subset-loaders.ts +7 -7
- package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
- package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
- package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
- package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
- package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
- package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
- package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
- package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
- package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
- package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
- package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
- package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
- package/bundle/web-dist/client/index.html +5 -5
- package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
- package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
- package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
- package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
- package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
- package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
- package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
- package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
- package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
- package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
- package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
- package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
- package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
- package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
- package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
- package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
- package/dist/cli.js +9 -9
- package/package.json +4 -11
- package/postinstall.mjs +12 -0
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
- package/skills/qgrid/references/decision-rationale.md +23 -0
- package/skills/qgrid/references/grok-runtime.md +89 -0
- package/skills/qgrid/references/provider-runtime-differences.md +30 -29
- package/skills/qgrid/references/repo-map.md +10 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
- package/bundle/dist/testing/setup-mocks.js +0 -16
- package/bundle/src/testing/setup-mocks.ts +0 -44
- package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
- package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
- package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
- package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
- package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
- package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
- package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
- package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
- package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
- package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
- package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
- package/dist/cli.d.ts +0 -10
- /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
- /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
- /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
- /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
- /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { TokenModel } from "../token/token.model.js";
|
|
2
|
+
import { AnthropicCredentials, OpenAICredentials } from "../token/token.types.js";
|
|
3
|
+
import { z } from "zod";
|
|
2
4
|
import { getLogger } from "@logtape/logtape";
|
|
3
5
|
import { Client } from "pg";
|
|
4
6
|
//#region src/application/qgrid/token-subscriber.ts
|
|
@@ -9,6 +11,24 @@ const RECONCILE_INTERVAL_MS = 600 * 1e3;
|
|
|
9
11
|
const CONNECTION_TIMEOUT_MS = 5e3;
|
|
10
12
|
const BACKOFF_BASE_MS = 500;
|
|
11
13
|
const BACKOFF_CAP_MS = 3e4;
|
|
14
|
+
const NotifyPayload = z.object({
|
|
15
|
+
op: z.enum([
|
|
16
|
+
"INSERT",
|
|
17
|
+
"UPDATE",
|
|
18
|
+
"DELETE"
|
|
19
|
+
]),
|
|
20
|
+
id: z.number()
|
|
21
|
+
});
|
|
22
|
+
function openAICredentialsOf(row) {
|
|
23
|
+
const parsed = OpenAICredentials.safeParse(row.credentials);
|
|
24
|
+
if (!parsed.success) logger.warn(`skipping token ${row.name}: credentials are not OpenAI`);
|
|
25
|
+
return parsed.data;
|
|
26
|
+
}
|
|
27
|
+
function anthropicCredentialsOf(row) {
|
|
28
|
+
const parsed = AnthropicCredentials.safeParse(row.credentials);
|
|
29
|
+
if (!parsed.success) logger.warn(`skipping token ${row.name}: credentials are not Anthropic`);
|
|
30
|
+
return parsed.data;
|
|
31
|
+
}
|
|
12
32
|
var TokenSubscriber = class {
|
|
13
33
|
connConfig;
|
|
14
34
|
dispatcher;
|
|
@@ -29,7 +49,7 @@ var TokenSubscriber = class {
|
|
|
29
49
|
try {
|
|
30
50
|
this.tokenChangeHandler?.();
|
|
31
51
|
} catch (error) {
|
|
32
|
-
logger.warn(`token change handler failed: ${error.message}`);
|
|
52
|
+
logger.warn(`token change handler failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
33
53
|
}
|
|
34
54
|
}
|
|
35
55
|
async start() {
|
|
@@ -39,7 +59,7 @@ var TokenSubscriber = class {
|
|
|
39
59
|
await this.connectAndReconcile();
|
|
40
60
|
return true;
|
|
41
61
|
} catch (e) {
|
|
42
|
-
logger.warn(`subscriber start failed: ${e.message}, scheduling retry`);
|
|
62
|
+
logger.warn(`subscriber start failed: ${e instanceof Error ? e.message : String(e)}, scheduling retry`);
|
|
43
63
|
this.retryLater();
|
|
44
64
|
return false;
|
|
45
65
|
}
|
|
@@ -67,7 +87,7 @@ var TokenSubscriber = class {
|
|
|
67
87
|
ensureReconcileTimer() {
|
|
68
88
|
if (this.reconcileTimer) return;
|
|
69
89
|
this.reconcileTimer = setInterval(() => {
|
|
70
|
-
this.reconcile().catch((e) => logger.warn(`periodic reconcile failed: ${e.message}`));
|
|
90
|
+
this.reconcile().catch((e) => logger.warn(`periodic reconcile failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
71
91
|
}, RECONCILE_INTERVAL_MS);
|
|
72
92
|
}
|
|
73
93
|
async connectAndReconcile() {
|
|
@@ -92,7 +112,7 @@ var TokenSubscriber = class {
|
|
|
92
112
|
});
|
|
93
113
|
client.on("notification", (msg) => {
|
|
94
114
|
if (msg.channel !== TOKENS_CHANGED || !msg.payload) return;
|
|
95
|
-
this.handleNotification(msg.payload).catch((e) => logger.warn(`handle NOTIFY failed: ${e.message}`));
|
|
115
|
+
this.handleNotification(msg.payload).catch((e) => logger.warn(`handle NOTIFY failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
96
116
|
});
|
|
97
117
|
try {
|
|
98
118
|
await client.connect();
|
|
@@ -119,7 +139,7 @@ var TokenSubscriber = class {
|
|
|
119
139
|
this.reconnectTimer = setTimeout(() => {
|
|
120
140
|
this.reconnectTimer = null;
|
|
121
141
|
this.connectAndReconcile().catch((e) => {
|
|
122
|
-
logger.warn(`subscriber reconnect failed: ${e.message}`);
|
|
142
|
+
logger.warn(`subscriber reconnect failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
123
143
|
this.retryLater();
|
|
124
144
|
});
|
|
125
145
|
}, delay);
|
|
@@ -135,13 +155,14 @@ var TokenSubscriber = class {
|
|
|
135
155
|
return this.enqueueOperation(() => this.handleNotificationNow(payloadJson));
|
|
136
156
|
}
|
|
137
157
|
async handleNotificationNow(payloadJson) {
|
|
138
|
-
const payload = JSON.parse(payloadJson);
|
|
158
|
+
const payload = NotifyPayload.parse(JSON.parse(payloadJson));
|
|
139
159
|
const previousRow = this.tokenChangeHandler ? this.dispatcher.tokens.get(payload.id) : void 0;
|
|
140
160
|
const wasKeepaliveTarget = previousRow?.active === true && previousRow.provider === "anthropic";
|
|
141
161
|
if (payload.op === "DELETE") {
|
|
142
162
|
this.dispatcher.tokens.delete(payload.id);
|
|
143
|
-
await this.dispatcher.openaiDispatcher?.onTokenRemoved(payload.id).catch((e) => logger.warn(`openai token remove failed: ${e.message}`));
|
|
163
|
+
await this.dispatcher.openaiDispatcher?.onTokenRemoved(payload.id).catch((e) => logger.warn(`openai token remove failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
144
164
|
this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
|
|
165
|
+
await this.removeGrokToken(payload.id);
|
|
145
166
|
logger.info(`NOTIFY ${payload.op} id=${payload.id} → removed from cache`);
|
|
146
167
|
if (previousRow === void 0 || wasKeepaliveTarget) this.notifyTokensChanged();
|
|
147
168
|
return;
|
|
@@ -149,25 +170,35 @@ var TokenSubscriber = class {
|
|
|
149
170
|
const row = await TokenModel.findOne("A", { id: payload.id });
|
|
150
171
|
if (!row) {
|
|
151
172
|
this.dispatcher.tokens.delete(payload.id);
|
|
152
|
-
await this.dispatcher.openaiDispatcher?.onTokenRemoved(payload.id).catch((e) => logger.warn(`openai token remove failed: ${e.message}`));
|
|
173
|
+
await this.dispatcher.openaiDispatcher?.onTokenRemoved(payload.id).catch((e) => logger.warn(`openai token remove failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
153
174
|
this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
|
|
175
|
+
await this.removeGrokToken(payload.id);
|
|
154
176
|
logger.info(`NOTIFY ${payload.op} id=${payload.id} → missing, removed from cache`);
|
|
155
177
|
if (previousRow === void 0 || wasKeepaliveTarget) this.notifyTokensChanged();
|
|
156
178
|
return;
|
|
157
179
|
}
|
|
158
180
|
this.dispatcher.tokens.set(payload.id, row);
|
|
159
181
|
if (row.provider === "openai") {
|
|
160
|
-
const creds = row
|
|
182
|
+
const creds = openAICredentialsOf(row);
|
|
161
183
|
const openaiDispatcher = this.dispatcher.openaiDispatcher;
|
|
162
|
-
if (
|
|
184
|
+
if (creds === void 0) openaiDispatcher?.onTokenDeactivated(payload.id);
|
|
185
|
+
else if (payload.op === "INSERT" && row.active) await openaiDispatcher?.onTokenAdded(payload.id, row.name, creds, row.quota_threshold, row.weight).catch((e) => logger.warn(`openai token add failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
163
186
|
else if (row.active) {
|
|
164
|
-
if (openaiDispatcher) await openaiDispatcher.onTokenUpdated(payload.id, row.name, creds, row.quota_threshold, row.weight).then(() => openaiDispatcher.onTokenActivated(payload.id)).catch((e) => logger.warn(`openai token update failed: ${e.message}`));
|
|
187
|
+
if (openaiDispatcher) await openaiDispatcher.onTokenUpdated(payload.id, row.name, creds, row.quota_threshold, row.weight).then(() => openaiDispatcher.onTokenActivated(payload.id)).catch((e) => logger.warn(`openai token update failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
165
188
|
} else openaiDispatcher?.onTokenDeactivated(payload.id);
|
|
166
189
|
} else if (row.provider === "anthropic") {
|
|
167
|
-
const creds = row
|
|
168
|
-
if (
|
|
190
|
+
const creds = anthropicCredentialsOf(row);
|
|
191
|
+
if (creds === void 0) this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
|
|
192
|
+
else if (payload.op === "INSERT" && row.active) this.dispatcher.anthropicDispatcher?.onTokenAdded(payload.id, row.name, creds, row.quota_threshold, row.weight);
|
|
169
193
|
else if (row.active) this.dispatcher.anthropicDispatcher?.onTokenUpdated(payload.id, row.name, creds, row.quota_threshold, row.weight);
|
|
170
194
|
else this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
|
|
195
|
+
} else if (row.provider === "grok") {
|
|
196
|
+
const grokDispatcher = this.dispatcher.grokDispatcher;
|
|
197
|
+
if (grokDispatcher) await Promise.resolve().then(() => {
|
|
198
|
+
if (payload.op === "INSERT" && row.active) return grokDispatcher.onTokenAdded(payload.id, row.name, row.credentials, row.quota_threshold, row.weight);
|
|
199
|
+
if (row.active) return grokDispatcher.onTokenUpdated(payload.id, row.name, row.credentials, row.quota_threshold, row.weight);
|
|
200
|
+
return grokDispatcher.onTokenRemoved(payload.id);
|
|
201
|
+
}).catch((e) => logger.warn(`grok token sync failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
171
202
|
}
|
|
172
203
|
logger.info(`NOTIFY ${payload.op} id=${payload.id} (${row.name}) active=${row.active}`);
|
|
173
204
|
if (wasKeepaliveTarget !== (row.active && row.provider === "anthropic")) this.notifyTokensChanged();
|
|
@@ -176,29 +207,51 @@ var TokenSubscriber = class {
|
|
|
176
207
|
return this.enqueueOperation(() => this.reconcileNow());
|
|
177
208
|
}
|
|
178
209
|
async reconcileNow() {
|
|
179
|
-
const previousAnthropicIds = this.tokenChangeHandler ? new Set([...this.dispatcher.tokens.values()].
|
|
210
|
+
const previousAnthropicIds = this.tokenChangeHandler ? new Set([...this.dispatcher.tokens.values()].flatMap((row) => row.active && row.provider === "anthropic" ? [row.id] : [])) : null;
|
|
180
211
|
await TokenModel.deactivateExpiredTokens();
|
|
181
212
|
const rows = await TokenModel.findActive("A");
|
|
182
213
|
this.dispatcher.replaceCache(rows);
|
|
183
|
-
const anthropicRows = rows.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
214
|
+
const anthropicRows = rows.flatMap((r) => {
|
|
215
|
+
const credentials = r.provider === "anthropic" ? anthropicCredentialsOf(r) : void 0;
|
|
216
|
+
return credentials === void 0 ? [] : [{
|
|
217
|
+
id: r.id,
|
|
218
|
+
name: r.name,
|
|
219
|
+
credentials,
|
|
220
|
+
quotaThreshold: r.quota_threshold,
|
|
221
|
+
weight: r.weight
|
|
222
|
+
}];
|
|
223
|
+
});
|
|
190
224
|
this.dispatcher.anthropicDispatcher?.replaceTokens(anthropicRows);
|
|
191
|
-
const openaiRows = rows.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
225
|
+
const openaiRows = rows.flatMap((r) => {
|
|
226
|
+
const credentials = r.provider === "openai" ? openAICredentialsOf(r) : void 0;
|
|
227
|
+
return credentials === void 0 ? [] : [{
|
|
228
|
+
id: r.id,
|
|
229
|
+
name: r.name,
|
|
230
|
+
credentials,
|
|
231
|
+
quotaThreshold: r.quota_threshold,
|
|
232
|
+
weight: r.weight
|
|
233
|
+
}];
|
|
234
|
+
});
|
|
235
|
+
await this.dispatcher.openaiDispatcher?.replaceTokens(openaiRows).catch((e) => logger.warn(`openai reconcile failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
236
|
+
const grokDispatcher = this.dispatcher.grokDispatcher;
|
|
237
|
+
if (grokDispatcher) {
|
|
238
|
+
const grokRows = rows.filter((r) => r.provider === "grok").map((r) => ({
|
|
239
|
+
id: r.id,
|
|
240
|
+
name: r.name,
|
|
241
|
+
credentials: r.credentials,
|
|
242
|
+
quotaThreshold: r.quota_threshold,
|
|
243
|
+
weight: r.weight
|
|
244
|
+
}));
|
|
245
|
+
await Promise.resolve().then(() => grokDispatcher.replaceTokens(grokRows)).catch((e) => logger.warn(`grok reconcile failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
246
|
+
}
|
|
199
247
|
this.lastReconcileAt = /* @__PURE__ */ new Date();
|
|
200
248
|
if (previousAnthropicIds && (previousAnthropicIds.size !== anthropicRows.length || anthropicRows.some((row) => !previousAnthropicIds.has(row.id)))) this.notifyTokensChanged();
|
|
201
249
|
}
|
|
250
|
+
async removeGrokToken(id) {
|
|
251
|
+
const grokDispatcher = this.dispatcher.grokDispatcher;
|
|
252
|
+
if (!grokDispatcher) return;
|
|
253
|
+
await Promise.resolve().then(() => grokDispatcher.onTokenRemoved(id)).catch((e) => logger.warn(`grok token remove failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
254
|
+
}
|
|
202
255
|
enqueueOperation(operation) {
|
|
203
256
|
const next = this.operationChain.then(operation, operation);
|
|
204
257
|
this.operationChain = next.catch(() => {});
|
|
@@ -208,4 +261,4 @@ var TokenSubscriber = class {
|
|
|
208
261
|
//#endregion
|
|
209
262
|
export { TokenSubscriber };
|
|
210
263
|
|
|
211
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBvcGVyYXRpb25DaGFpbjogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICB0b2tlbkNoYW5nZUhhbmRsZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb25uQ29uZmlnOiBDbGllbnRDb25maWcsXG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFFncmlkRGlzcGF0Y2hlckNsYXNzLFxuICApIHt9XG5cbiAgbm90aWZ5VG9rZW5zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy50b2tlbkNoYW5nZUhhbmRsZXI/LigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihgdG9rZW4gY2hhbmdlIGhhbmRsZXIgZmFpbGVkOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLnNodXRkb3duUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgdGhpcy5lbnN1cmVSZWNvbmNpbGVUaW1lcigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdEFuZFJlY29uY2lsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgc3RhcnQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSwgc2NoZWR1bGluZyByZXRyeWApO1xuICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNodXRkb3duUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5yZWNvbmNpbGVUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnJlY29uY2lsZVRpbWVyKTtcbiAgICAgIHRoaXMucmVjb25jaWxlVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpO1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xvc2VDbGllbnQoKTtcbiAgfVxuXG4gIHN0YXR1cygpOiBTdWJzY3JpYmVyU3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ubmVjdGVkOiB0aGlzLmNsaWVudCAhPT0gbnVsbCAmJiB0aGlzLnJlY29ubmVjdFRpbWVyID09PSBudWxsLFxuICAgICAgY29ubmVjdGVkQXQ6IHRoaXMuY29ubmVjdGVkQXQsXG4gICAgICBsYXN0UmVjb25jaWxlQXQ6IHRoaXMubGFzdFJlY29uY2lsZUF0LFxuICAgICAgYXR0ZW1wdDogdGhpcy5hdHRlbXB0LFxuICAgIH07XG4gIH1cblxuICBlbnN1cmVSZWNvbmNpbGVUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvbmNpbGVUaW1lcikgcmV0dXJuO1xuXG4gICAgLy8gTElTVEVOL05PVElGWSDripQg64GK6ri0IOuPmeyViCDsnKDsi6TrkKAg7IiYIOyeiOyWtCDso7zquLDsoIHsnLzroZwgREIg6riw7KSA7Jy866GcIOunnuy2mOuLpC5cbiAgICB0aGlzLnJlY29uY2lsZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbmNpbGUoKS5jYXRjaCgoZSkgPT5cbiAgICAgICAgbG9nZ2VyLndhcm4oYHBlcmlvZGljIHJlY29uY2lsZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgICApO1xuICAgIH0sIFJFQ09OQ0lMRV9JTlRFUlZBTF9NUyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0QW5kUmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdEFuZExpc3RlbigpO1xuICAgIGF3YWl0IHRoaXMucmVjb25jaWxlKCk7XG4gICAgdGhpcy5hdHRlbXB0ID0gMDtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3RBbmRMaXN0ZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudCh7XG4gICAgICAuLi50aGlzLmNvbm5Db25maWcsXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogQ09OTkVDVElPTl9USU1FT1VUX01TLFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMF8wMDAsXG4gICAgICBhcHBsaWNhdGlvbl9uYW1lOiBcInFncmlkLWxpc3RlbmVyXCIsXG4gICAgfSk7XG5cbiAgICBjbGllbnQub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgfSk7XG4gICAgY2xpZW50Lm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zaHV0ZG93blJlcXVlc3RlZCkgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgfSk7XG4gICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuY2hhbm5lbCAhPT0gVE9LRU5TX0NIQU5HRUQgfHwgIW1zZy5wYXlsb2FkKSByZXR1cm47XG4gICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cucGF5bG9hZCkuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBoYW5kbGUgTk9USUZZIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFVCBzdGF0ZW1lbnRfdGltZW91dCA9IDBcIik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgaWRsZV9pbl90cmFuc2FjdGlvbl9zZXNzaW9uX3RpbWVvdXQgPSAwXCIpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBMSVNURU4gJHtjbGllbnQuZXNjYXBlSWRlbnRpZmllcihUT0tFTlNfQ0hBTkdFRCl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgYXdhaXQgY2xpZW50LmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5jb25uZWN0ZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgbG9nZ2VyLmluZm8oYHN1YnNjcmliZWQgdG8gJHtUT0tFTlNfQ0hBTkdFRH1gKTtcbiAgfVxuXG4gIHJldHJ5TGF0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lcikgcmV0dXJuO1xuXG4gICAgdm9pZCB0aGlzLmNsb3NlQ2xpZW50KCk7XG4gICAgdGhpcy5hdHRlbXB0ICs9IDE7XG4gICAgY29uc3QgY2FwID0gTWF0aC5taW4oQkFDS09GRl9CQVNFX01TICogMiAqKiB0aGlzLmF0dGVtcHQsIEJBQ0tPRkZfQ0FQX01TKTtcbiAgICBjb25zdCBkZWxheSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhcCk7XG4gICAgbG9nZ2VyLmluZm8oYHJlY29ubmVjdGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5hdHRlbXB0fSlgKTtcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuY29ubmVjdEFuZFJlY29uY2lsZSgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIHJlY29ubmVjdCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgICAgfSk7XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2VDbGllbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnQ7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcblxuICAgIHRoaXMuY2xpZW50ID0gbnVsbDtcbiAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgYXdhaXQgY2xpZW50LmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU5vdGlmaWNhdGlvbihwYXlsb2FkSnNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbk5vdyhwYXlsb2FkSnNvbikpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTm90aWZpY2F0aW9uTm93KHBheWxvYWRKc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShwYXlsb2FkSnNvbikgYXMgUGF5bG9hZDtcbiAgICBjb25zdCBwcmV2aW91c1JvdyA9IHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyXG4gICAgICA/IHRoaXMuZGlzcGF0Y2hlci50b2tlbnMuZ2V0KHBheWxvYWQuaWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3YXNLZWVwYWxpdmVUYXJnZXQgPSBwcmV2aW91c1Jvdz8uYWN0aXZlID09PSB0cnVlICYmIHByZXZpb3VzUm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiO1xuICAgIGlmIChwYXlsb2FkLm9wID09PSBcIkRFTEVURVwiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIudG9rZW5zLmRlbGV0ZShwYXlsb2FkLmlkKTtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgID8ub25Ub2tlblJlbW92ZWQocGF5bG9hZC5pZClcbiAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHRva2VuIHJlbW92ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgLy8g7IKt7KCc65CcIO2GoO2BsOydmCBwcm92aWRlcuulvCDrqqjrpbwg7IiYIOyeiOycvOuvgOuhnCDslpHsqr0g7ZKA7JeQ7IScIOygnOqxsO2VnOuLpC5cbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIGlmIChwcmV2aW91c1JvdyA9PT0gdW5kZWZpbmVkIHx8IHdhc0tlZXBhbGl2ZVRhcmdldCkgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZDogcGF5bG9hZC5pZCB9KTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnRva2Vucy5kZWxldGUocGF5bG9hZC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIGlmIChwcmV2aW91c1JvdyA9PT0gdW5kZWZpbmVkIHx8IHdhc0tlZXBhbGl2ZVRhcmdldCkgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnRva2Vucy5zZXQocGF5bG9hZC5pZCwgcm93KTtcblxuICAgIGlmIChyb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgICAgPy5vblRva2VuQWRkZWQoXG4gICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgICBjcmVkcyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICAgIClcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gYWRkIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICB9IGVsc2UgaWYgKHJvdy5hY3RpdmUpIHtcbiAgICAgICAgaWYgKG9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgICAgICAub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgICBjcmVkcyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IG9wZW5haURpc3BhdGNoZXIub25Ub2tlbkFjdGl2YXRlZChwYXlsb2FkLmlkKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiB1cGRhdGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlbmFpRGlzcGF0Y2hlcj8ub25Ub2tlbkRlYWN0aXZhdGVkKHBheWxvYWQuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBjb25zdCBjcmVkcyA9IHJvdy5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscztcbiAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5BZGRlZChcbiAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIGNyZWRzLFxuICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcGF5bG9hZC5pZCxcbiAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICBjcmVkcyxcbiAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlblJlbW92ZWQocGF5bG9hZC5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9ICgke3Jvdy5uYW1lfSkgYWN0aXZlPSR7cm93LmFjdGl2ZX1gKTtcbiAgICBjb25zdCBpc0tlZXBhbGl2ZVRhcmdldCA9IHJvdy5hY3RpdmUgJiYgcm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiO1xuICAgIGlmICh3YXNLZWVwYWxpdmVUYXJnZXQgIT09IGlzS2VlcGFsaXZlVGFyZ2V0KSB0aGlzLm5vdGlmeVRva2Vuc0NoYW5nZWQoKTtcbiAgfVxuXG4gIGFzeW5jIHJlY29uY2lsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMucmVjb25jaWxlTm93KCkpO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlTm93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXZpb3VzQW50aHJvcGljSWRzID0gdGhpcy50b2tlbkNoYW5nZUhhbmRsZXJcbiAgICAgID8gbmV3IFNldChcbiAgICAgICAgICBbLi4udGhpcy5kaXNwYXRjaGVyLnRva2Vucy52YWx1ZXMoKV1cbiAgICAgICAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LmFjdGl2ZSAmJiByb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpXG4gICAgICAgICAgICAubWFwKChyb3cpID0+IHJvdy5pZCksXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLmRlYWN0aXZhdGVFeHBpcmVkVG9rZW5zKCk7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZShcIkFcIik7XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlcGxhY2VDYWNoZShyb3dzKTtcbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogci53ZWlnaHQsXG4gICAgICB9KSk7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnJlcGxhY2VUb2tlbnMoYW50aHJvcGljUm93cyk7XG4gICAgY29uc3Qgb3BlbmFpUm93cyA9IHJvd3NcbiAgICAgIC5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpXG4gICAgICAubWFwKChyKSA9PiAoe1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogci5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHIucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHIud2VpZ2h0LFxuICAgICAgfSkpO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICA/LnJlcGxhY2VUb2tlbnMob3BlbmFpUm93cylcbiAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICB0aGlzLmxhc3RSZWNvbmNpbGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKFxuICAgICAgcHJldmlvdXNBbnRocm9waWNJZHMgJiZcbiAgICAgIChwcmV2aW91c0FudGhyb3BpY0lkcy5zaXplICE9PSBhbnRocm9waWNSb3dzLmxlbmd0aCB8fFxuICAgICAgICBhbnRocm9waWNSb3dzLnNvbWUoKHJvdykgPT4gIXByZXZpb3VzQW50aHJvcGljSWRzLmhhcyhyb3cuaWQpKSlcbiAgICApIHtcbiAgICAgIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGVucXVldWVPcGVyYXRpb24ob3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3BlcmF0aW9uQ2hhaW4udGhlbihvcGVyYXRpb24sIG9wZXJhdGlvbik7XG4gICAgdGhpcy5vcGVyYXRpb25DaGFpbiA9IG5leHQuY2F0Y2goKCkgPT4ge30pO1xuICAg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
|
|
264
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgQW50aHJvcGljQ3JlZGVudGlhbHMsIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG5jb25zdCBOb3RpZnlQYXlsb2FkID0gei5vYmplY3QoeyBvcDogei5lbnVtKFtcIklOU0VSVFwiLCBcIlVQREFURVwiLCBcIkRFTEVURVwiXSksIGlkOiB6Lm51bWJlcigpIH0pO1xuXG50eXBlIENyZWRlbnRpYWxSb3cgPSBQaWNrPFRva2VuU3Vic2V0QSwgXCJuYW1lXCIgfCBcImNyZWRlbnRpYWxzXCI+O1xuXG5mdW5jdGlvbiBvcGVuQUlDcmVkZW50aWFsc09mKHJvdzogQ3JlZGVudGlhbFJvdyk6IE9wZW5BSUNyZWRlbnRpYWxzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gT3BlbkFJQ3JlZGVudGlhbHMuc2FmZVBhcnNlKHJvdy5jcmVkZW50aWFscyk7XG5cbiAgaWYgKCFwYXJzZWQuc3VjY2VzcykgbG9nZ2VyLndhcm4oYHNraXBwaW5nIHRva2VuICR7cm93Lm5hbWV9OiBjcmVkZW50aWFscyBhcmUgbm90IE9wZW5BSWApO1xuXG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn1cblxuZnVuY3Rpb24gYW50aHJvcGljQ3JlZGVudGlhbHNPZihyb3c6IENyZWRlbnRpYWxSb3cpOiBBbnRocm9waWNDcmVkZW50aWFscyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZCA9IEFudGhyb3BpY0NyZWRlbnRpYWxzLnNhZmVQYXJzZShyb3cuY3JlZGVudGlhbHMpO1xuXG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIGxvZ2dlci53YXJuKGBza2lwcGluZyB0b2tlbiAke3Jvdy5uYW1lfTogY3JlZGVudGlhbHMgYXJlIG5vdCBBbnRocm9waWNgKTtcblxuICByZXR1cm4gcGFyc2VkLmRhdGE7XG59XG5cbmV4cG9ydCBjbGFzcyBUb2tlblN1YnNjcmliZXIge1xuICBjbGllbnQ6IENsaWVudCB8IG51bGwgPSBudWxsO1xuICByZWNvbmNpbGVUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgcmVjb25uZWN0VGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gIHNodXRkb3duUmVxdWVzdGVkID0gZmFsc2U7XG4gIGF0dGVtcHQgPSAwO1xuICBjb25uZWN0ZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBsYXN0UmVjb25jaWxlQXQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgb3BlcmF0aW9uQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgdG9rZW5DaGFuZ2VIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29ubkNvbmZpZzogQ2xpZW50Q29uZmlnLFxuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBRZ3JpZERpc3BhdGNoZXJDbGFzcyxcbiAgKSB7fVxuXG4gIG5vdGlmeVRva2Vuc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyPy4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGB0b2tlbiBjaGFuZ2UgaGFuZGxlciBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVuc3VyZVJlY29uY2lsZVRpbWVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgc3Vic2NyaWJlciBzdGFydCBmYWlsZWQ6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfSwgc2NoZWR1bGluZyByZXRyeWAsXG4gICAgICApO1xuICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWNvbmNpbGVUaW1lcik7XG4gICAgICB0aGlzLnJlY29uY2lsZVRpbWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpO1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IFN1YnNjcmliZXJTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IHRoaXMuY2xpZW50ICE9PSBudWxsICYmIHRoaXMucmVjb25uZWN0VGltZXIgPT09IG51bGwsXG4gICAgICBjb25uZWN0ZWRBdDogdGhpcy5jb25uZWN0ZWRBdCxcbiAgICAgIGxhc3RSZWNvbmNpbGVBdDogdGhpcy5sYXN0UmVjb25jaWxlQXQsXG4gICAgICBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsXG4gICAgfTtcbiAgfVxuXG4gIGVuc3VyZVJlY29uY2lsZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSByZXR1cm47XG5cbiAgICAvLyBMSVNURU4vTk9USUZZIOuKlCDrgYrquLQg64+Z7JWIIOycoOyLpOuQoCDsiJgg7J6I7Ja0IOyjvOq4sOyggeycvOuhnCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICAgIHRoaXMucmVjb25jaWxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZSgpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgcGVyaW9kaWMgcmVjb25jaWxlIGZhaWxlZDogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCksXG4gICAgICApO1xuICAgIH0sIFJFQ09OQ0lMRV9JTlRFUlZBTF9NUyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0QW5kUmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdEFuZExpc3RlbigpO1xuICAgIGF3YWl0IHRoaXMucmVjb25jaWxlKCk7XG4gICAgdGhpcy5hdHRlbXB0ID0gMDtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3RBbmRMaXN0ZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudCh7XG4gICAgICAuLi50aGlzLmNvbm5Db25maWcsXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogQ09OTkVDVElPTl9USU1FT1VUX01TLFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMF8wMDAsXG4gICAgICBhcHBsaWNhdGlvbl9uYW1lOiBcInFncmlkLWxpc3RlbmVyXCIsXG4gICAgfSk7XG5cbiAgICBjbGllbnQub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgfSk7XG4gICAgY2xpZW50Lm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zaHV0ZG93blJlcXVlc3RlZCkgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgfSk7XG4gICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuY2hhbm5lbCAhPT0gVE9LRU5TX0NIQU5HRUQgfHwgIW1zZy5wYXlsb2FkKSByZXR1cm47XG4gICAgICB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cucGF5bG9hZCkuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBoYW5kbGUgTk9USUZZIGZhaWxlZDogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgc3RhdGVtZW50X3RpbWVvdXQgPSAwXCIpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIGlkbGVfaW5fdHJhbnNhY3Rpb25fc2Vzc2lvbl90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgTElTVEVOICR7Y2xpZW50LmVzY2FwZUlkZW50aWZpZXIoVE9LRU5TX0NIQU5HRUQpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuY29ubmVjdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGxvZ2dlci5pbmZvKGBzdWJzY3JpYmVkIHRvICR7VE9LRU5TX0NIQU5HRUR9YCk7XG4gIH1cblxuICByZXRyeUxhdGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duUmVxdWVzdGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lcikgcmV0dXJuO1xuXG4gICAgdm9pZCB0aGlzLmNsb3NlQ2xpZW50KCk7XG4gICAgdGhpcy5hdHRlbXB0ICs9IDE7XG4gICAgY29uc3QgY2FwID0gTWF0aC5taW4oQkFDS09GRl9CQVNFX01TICogMiAqKiB0aGlzLmF0dGVtcHQsIEJBQ0tPRkZfQ0FQX01TKTtcbiAgICBjb25zdCBkZWxheSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhcCk7XG4gICAgbG9nZ2VyLmluZm8oYHJlY29ubmVjdGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5hdHRlbXB0fSlgKTtcbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuY29ubmVjdEFuZFJlY29uY2lsZSgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIHJlY29ubmVjdCBmYWlsZWQ6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWApO1xuICAgICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2xpZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuXG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcblxuICAgIHRoaXMuY2xpZW50ID0gbnVsbDtcbiAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgYXdhaXQgY2xpZW50LmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU5vdGlmaWNhdGlvbihwYXlsb2FkSnNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbk5vdyhwYXlsb2FkSnNvbikpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTm90aWZpY2F0aW9uTm93KHBheWxvYWRKc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gTm90aWZ5UGF5bG9hZC5wYXJzZShKU09OLnBhcnNlKHBheWxvYWRKc29uKSk7XG5cbiAgICBjb25zdCBwcmV2aW91c1JvdyA9IHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyXG4gICAgICA/IHRoaXMuZGlzcGF0Y2hlci50b2tlbnMuZ2V0KHBheWxvYWQuaWQpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHdhc0tlZXBhbGl2ZVRhcmdldCA9IHByZXZpb3VzUm93Py5hY3RpdmUgPT09IHRydWUgJiYgcHJldmlvdXNSb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCI7XG5cbiAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnRva2Vucy5kZWxldGUocGF5bG9hZC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT5cbiAgICAgICAgICBsb2dnZXIud2Fybihgb3BlbmFpIHRva2VuIHJlbW92ZSBmYWlsZWQ6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWApLFxuICAgICAgICApO1xuICAgICAgLy8g7IKt7KCc65CcIO2GoO2BsOydmCBwcm92aWRlcuulvCDrqqjrpbwg7IiYIOyeiOycvOuvgOuhnCDrqqjrk6Ag7ZKA7JeQ7IScIOygnOqxsO2VnOuLpC5cbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlR3Jva1Rva2VuKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuXG4gICAgICBpZiAocHJldmlvdXNSb3cgPT09IHVuZGVmaW5lZCB8fCB3YXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiBwYXlsb2FkLmlkIH0pO1xuXG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci50b2tlbnMuZGVsZXRlKHBheWxvYWQuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKVxuICAgICAgICAuY2F0Y2goKGUpID0+XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiByZW1vdmUgZmFpbGVkOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlR3Jva1Rva2VuKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIG1pc3NpbmcsIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuXG4gICAgICBpZiAocHJldmlvdXNSb3cgPT09IHVuZGVmaW5lZCB8fCB3YXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnRva2Vucy5zZXQocGF5bG9hZC5pZCwgcm93KTtcblxuICAgIGlmIChyb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGNvbnN0IGNyZWRzID0gb3BlbkFJQ3JlZGVudGlhbHNPZihyb3cpO1xuICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyO1xuXG4gICAgICBpZiAoY3JlZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcGVuYWlEaXNwYXRjaGVyPy5vblRva2VuRGVhY3RpdmF0ZWQocGF5bG9hZC5pZCk7XG4gICAgICB9IGVsc2UgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgICAgPy5vblRva2VuQWRkZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzLCByb3cucXVvdGFfdGhyZXNob2xkLCByb3cud2VpZ2h0KVxuICAgICAgICAgIC5jYXRjaCgoZSkgPT5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gYWRkIGZhaWxlZDogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCksXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocm93LmFjdGl2ZSkge1xuICAgICAgICBpZiAob3BlbmFpRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IG9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgICAgIC5vblRva2VuVXBkYXRlZChwYXlsb2FkLmlkLCByb3cubmFtZSwgY3JlZHMsIHJvdy5xdW90YV90aHJlc2hvbGQsIHJvdy53ZWlnaHQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBvcGVuYWlEaXNwYXRjaGVyLm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCkpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgIGBvcGVuYWkgdG9rZW4gdXBkYXRlIGZhaWxlZDogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5haURpc3BhdGNoZXI/Lm9uVG9rZW5EZWFjdGl2YXRlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgY29uc3QgY3JlZHMgPSBhbnRocm9waWNDcmVkZW50aWFsc09mKHJvdyk7XG5cbiAgICAgIGlmIChjcmVkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5vcCA9PT0gXCJJTlNFUlRcIiAmJiByb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuQWRkZWQoXG4gICAgICAgICAgcGF5bG9hZC5pZCxcbiAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICBjcmVkcyxcbiAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHJvdy5hY3RpdmUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5VcGRhdGVkKFxuICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgY3JlZHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm93LnByb3ZpZGVyID09PSBcImdyb2tcIikge1xuICAgICAgY29uc3QgZ3Jva0Rpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXIuZ3Jva0Rpc3BhdGNoZXI7XG5cbiAgICAgIGlmIChncm9rRGlzcGF0Y2hlcikge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdyb2tEaXNwYXRjaGVyLm9uVG9rZW5BZGRlZChcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBncm9rRGlzcGF0Y2hlci5vblRva2VuVXBkYXRlZChcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBncm9rRGlzcGF0Y2hlci5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZSkgPT5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBncm9rIHRva2VuIHN5bmMgZmFpbGVkOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9ICgke3Jvdy5uYW1lfSkgYWN0aXZlPSR7cm93LmFjdGl2ZX1gKTtcbiAgICBjb25zdCBpc0tlZXBhbGl2ZVRhcmdldCA9IHJvdy5hY3RpdmUgJiYgcm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiO1xuXG4gICAgaWYgKHdhc0tlZXBhbGl2ZVRhcmdldCAhPT0gaXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZWNvbmNpbGVOb3coKSk7XG4gIH1cblxuICBhc3luYyByZWNvbmNpbGVOb3coKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJldmlvdXNBbnRocm9waWNJZHMgPSB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlclxuICAgICAgPyBuZXcgU2V0KFxuICAgICAgICAgIFsuLi50aGlzLmRpc3BhdGNoZXIudG9rZW5zLnZhbHVlcygpXS5mbGF0TWFwKChyb3cpID0+XG4gICAgICAgICAgICByb3cuYWN0aXZlICYmIHJvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFtyb3cuaWRdIDogW10sXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWFjdGl2YXRlRXhwaXJlZFRva2VucygpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmUoXCJBXCIpO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZXBsYWNlQ2FjaGUocm93cyk7XG5cbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93cy5mbGF0TWFwKChyKSA9PiB7XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IHIucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgPyBhbnRocm9waWNDcmVkZW50aWFsc09mKHIpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gY3JlZGVudGlhbHMgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHIucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgICB3ZWlnaHQ6IHIud2VpZ2h0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnJlcGxhY2VUb2tlbnMoYW50aHJvcGljUm93cyk7XG5cbiAgICBjb25zdCBvcGVuYWlSb3dzID0gcm93cy5mbGF0TWFwKChyKSA9PiB7XG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IHIucHJvdmlkZXIgPT09IFwib3BlbmFpXCIgPyBvcGVuQUlDcmVkZW50aWFsc09mKHIpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gY3JlZGVudGlhbHMgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHIucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgICB3ZWlnaHQ6IHIud2VpZ2h0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgID8ucmVwbGFjZVRva2VucyhvcGVuYWlSb3dzKVxuICAgICAgLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2Fybihgb3BlbmFpIHJlY29uY2lsZSBmYWlsZWQ6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWApLFxuICAgICAgKTtcbiAgICBjb25zdCBncm9rRGlzcGF0Y2hlciA9IHRoaXMuZGlzcGF0Y2hlci5ncm9rRGlzcGF0Y2hlcjtcblxuICAgIGlmIChncm9rRGlzcGF0Y2hlcikge1xuICAgICAgY29uc3QgZ3Jva1Jvd3MgPSByb3dzXG4gICAgICAgIC5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IFwiZ3Jva1wiKVxuICAgICAgICAubWFwKChyKSA9PiAoe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgICAgICBjcmVkZW50aWFsczogci5jcmVkZW50aWFscyxcbiAgICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgd2VpZ2h0OiByLndlaWdodCxcbiAgICAgICAgfSkpO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbigoKSA9PiBncm9rRGlzcGF0Y2hlci5yZXBsYWNlVG9rZW5zKGdyb2tSb3dzKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PlxuICAgICAgICAgIGxvZ2dlci53YXJuKGBncm9rIHJlY29uY2lsZSBmYWlsZWQ6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWApLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGFzdFJlY29uY2lsZUF0ID0gbmV3IERhdGUoKTtcblxuICAgIGlmIChcbiAgICAgIHByZXZpb3VzQW50aHJvcGljSWRzICYmXG4gICAgICAocHJldmlvdXNBbnRocm9waWNJZHMuc2l6ZSAhPT0gYW50aHJvcGljUm93cy5sZW5ndGggfHxcbiAgICAgICAgYW50aHJvcGljUm93cy5zb21lKChyb3cpID0+ICFwcmV2aW91c0FudGhyb3BpY0lkcy5oYXMocm93LmlkKSkpXG4gICAgKSB7XG4gICAgICB0aGlzLm5vdGlmeVRva2Vuc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcm9rIGRpc3BhdGNoZXIg64qUIOyEoO2DneyggeycvOuhnCDso7zsnoXrkJzri6QuIOuPmeq4sC/ruYTrj5nquLAg6rWs7ZiEIOuqqOuRkOydmCDsi6TtjKjrpbwg6rKp66as7ZWc64ukLlxuICBhc3luYyByZW1vdmVHcm9rVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGdyb2tEaXNwYXRjaGVyID0gdGhpcy5kaXNwYXRjaGVyLmdyb2tEaXNwYXRjaGVyO1xuXG4gICAgaWYgKCFncm9rRGlzcGF0Y2hlcikgcmV0dXJuO1xuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAudGhlbigoKSA9PiBncm9rRGlzcGF0Y2hlci5vblRva2VuUmVtb3ZlZChpZCkpXG4gICAgICAuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBncm9rIHRva2VuIHJlbW92ZSBmYWlsZWQ6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWApLFxuICAgICAgKTtcbiAgfVxuXG4gIGVucXVldWVPcGVyYXRpb24ob3BlcmF0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3BlcmF0aW9uQ2hhaW4udGhlbihvcGVyYXRpb24sIG9wZXJhdGlvbik7XG4gICAgdGhpcy5vcGVyYXRpb25DaGFpbiA9IG5leHQuY2F0Y2goKCkgPT4ge30pO1xuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVdBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxZQUFZLENBQUM7QUFFaEQsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSx3QkFBd0IsTUFBVTtBQUN4QyxNQUFNLHdCQUF3QjtBQUM5QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGlCQUFpQjtBQUV2QixNQUFNLGdCQUFnQixFQUFFLE9BQU87Q0FBRSxJQUFJLEVBQUUsS0FBSztFQUFDO0VBQVU7RUFBVTtDQUFRLENBQUM7Q0FBRyxJQUFJLEVBQUUsT0FBTztBQUFFLENBQUM7QUFJN0YsU0FBUyxvQkFBb0IsS0FBbUQ7Q0FDOUUsTUFBTSxTQUFTLGtCQUFrQixVQUFVLElBQUksV0FBVztDQUUxRCxJQUFJLENBQUMsT0FBTyxTQUFTLE9BQU8sS0FBSyxrQkFBa0IsSUFBSSxLQUFLLDZCQUE2QjtDQUV6RixPQUFPLE9BQU87QUFDaEI7QUFFQSxTQUFTLHVCQUF1QixLQUFzRDtDQUNwRixNQUFNLFNBQVMscUJBQXFCLFVBQVUsSUFBSSxXQUFXO0NBRTdELElBQUksQ0FBQyxPQUFPLFNBQVMsT0FBTyxLQUFLLGtCQUFrQixJQUFJLEtBQUssZ0NBQWdDO0NBRTVGLE9BQU8sT0FBTztBQUNoQjtBQUVBLElBQWEsa0JBQWIsTUFBNkI7Q0FZbEI7Q0FDQTtDQVpULFNBQXdCO0NBQ3hCLGlCQUF3QztDQUN4QyxpQkFBd0M7Q0FDeEMsb0JBQW9CO0NBQ3BCLFVBQVU7Q0FDVixjQUEyQjtDQUMzQixrQkFBK0I7Q0FDL0IsaUJBQWdDLFFBQVEsUUFBUTtDQUNoRCxxQkFBMEM7Q0FFMUMsWUFDRSxZQUNBLFlBQ0E7RUFGTyxLQUFBLGFBQUE7RUFDQSxLQUFBLGFBQUE7Q0FDTjtDQUVILHNCQUE0QjtFQUMxQixJQUFJO0dBQ0YsS0FBSyxxQkFBcUI7RUFDNUIsU0FBUyxPQUFPO0dBQ2QsT0FBTyxLQUNMLGdD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
|
|
@@ -67,4 +67,4 @@ async function ensureTokensTrigger(connConfig) {
|
|
|
67
67
|
//#endregion
|
|
68
68
|
export { TOKENS_TRIGGER_SETUP_SQL, ensureTokensTrigger };
|
|
69
69
|
|
|
70
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tdHJpZ2dlci1zZXR1cC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tdHJpZ2dlci1zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogT25lLXRpbWUgc2V0dXAgZm9yIHB1YmxpYy50b2tlbnMgLT4gdG9rZW5zX2NoYW5nZWQgTk9USUZZIHRyaWdnZXJzLiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IENsaWVudCwgdHlwZSBDbGllbnRDb25maWcgfSBmcm9tIFwicGdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidHJpZ2dlci1zZXR1cFwiXSk7XG5cbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVF9NUyA9IDVfMDAwO1xuY29uc3QgU0VUVVBfTE9DS19USU1FT1VUX01TID0gM18wMDA7XG5jb25zdCBTRVRVUF9TVEFURU1FTlRfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuY29uc3QgQURWSVNPUllfTE9DS19DTEFTU19JRCA9IDcxNztcbmNvbnN0IEFEVklTT1JZX0xPQ0tfT0JKRUNUX0lEID0gNDQ5MDA7XG5cbmV4cG9ydCBjb25zdCBUT0tFTlNfVFJJR0dFUl9TRVRVUF9TUUwgPSBgXG4gIENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHB1YmxpYy50b2tlbnNfbm90aWZ5KCkgUkVUVVJOUyB0cmlnZ2VyXG4gIExBTkdVQUdFIHBscGdzcWxcbiAgU0VUIHNlYXJjaF9wYXRoID0gcGdfY2F0YWxvZywgcHVibGljXG4gIEFTICRmdW5jJFxuICBCRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KCd0b2tlbnNfY2hhbmdlZCcsIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgJ29wJywgVEdfT1AsXG4gICAgICAnaWQnLCBDT0FMRVNDRShORVcuaWQsIE9MRC5pZClcbiAgICApOjp0ZXh0KTtcbiAgICBSRVRVUk4gQ09BTEVTQ0UoTkVXLCBPTEQpO1xuICBFTkQ7XG4gICRmdW5jJDtcblxuICBEUk9QIFRSSUdHRVIgSUYgRVhJU1RTIHRva2Vuc19jaGFuZ2VkX3RyaWdnZXIgT04gcHVibGljLnRva2VucztcbiAgRFJPUCBUUklHR0VSIElGIEVYSVNUUyB0b2tlbnNfY2hhbmdlZCBPTiBwdWJsaWMudG9rZW5zO1xuXG4gIENSRUFURSBPUiBSRVBMQUNFIFRSSUdHRVIgdG9rZW5zX2NoYW5nZWRfaW5zX2RlbFxuICBBRlRFUiBJTlNFUlQgT1IgREVMRVRFIE9OIHB1YmxpYy50b2tlbnNcbiAgRk9SIEVBQ0ggUk9XIEVYRUNVVEUgRlVOQ1RJT04gcHVibGljLnRva2Vuc19ub3RpZnkoKTtcblxuICBDUkVBVEUgT1IgUkVQTEFDRSBUUklHR0VSIHRva2Vuc19jaGFuZ2VkX3VwZFxuICBBRlRFUiBVUERBVEUgT04gcHVibGljLnRva2Vuc1xuICBGT1IgRUFDSCBST1dcbiAgV0hFTiAoXG4gICAgT0xELmFjdGl2ZSBJUyBESVNUSU5DVCBGUk9NIE5FVy5hY3RpdmUgT1JcbiAgICBPTEQucmVhdXRoX3JlcXVpcmVkIElTIERJU1RJTkNUIEZST00gTkVXLnJlYXV0aF9yZXF1aXJlZCBPUlxuICAgIE9MRC5jcmVkZW50aWFscyBJUyBESVNUSU5DVCBGUk9NIE5FVy5jcmVkZW50aWFscyBPUlxuICAgIE9MRC5wcm92aWRlciBJUyBESVNUSU5DVCBGUk9NIE5FVy5wcm92aWRlciBPUlxuICAgIE9MRC5uYW1lIElTIERJU1RJTkNUIEZST00gTkVXLm5hbWUgT1JcbiAgICBPTEQucXVvdGFfdGhyZXNob2xkIElTIERJU1RJTkNUIEZST00gTkVXLnF1b3RhX3RocmVzaG9sZCBPUlxuICAgIE9MRC5rZWVwYWxpdmVfZW5hYmxlZCBJUyBESVNUSU5DVCBGUk9NIE5FVy5rZWVwYWxpdmVfZW5hYmxlZFxuICApXG4gIEVYRUNVVEUgRlVOQ1RJT04gcHVibGljLnRva2Vuc19ub3RpZnkoKTtcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWc6IENsaWVudENvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAuLi5jb25uQ29uZmlnLFxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUSU9OX1RJTUVPVVRfTVMsXG4gICAgYXBwbGljYXRpb25fbmFtZTogXCJxZ3JpZC10cmlnZ2VyLXNldHVwXCIsXG4gIH0pO1xuXG4gIGxldCBsb2NrQWNxdWlyZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIHNlYXJjaF9wYXRoIFRPIHB1YmxpY1wiKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYFNFVCBsb2NrX3RpbWVvdXQgPSAnJHtTRVRVUF9MT0NLX1RJTUVPVVRfTVN9bXMnYCk7XG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBTRVQgc3RhdGVtZW50X3RpbWVvdXQgPSAnJHtTRVRVUF9TVEFURU1FTlRfVElNRU9VVF9NU31tcydgKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRUxFQ1QgcGdfYWR2aXNvcnlfbG9jaygkMSwgJDIpXCIsIFtcbiAgICAgIEFEVklTT1JZX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICBBRFZJU09SWV9MT0NLX09CSkVDVF9JRCxcbiAgICBdKTtcbiAgICBsb2NrQWNxdWlyZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFRPS0VOU19UUklHR0VSX1NFVFVQX1NRTCk7XG4gICAgbG9nZ2VyLmluZm8oXCJ0cmlnZ2VyIGVuc3VyZWQgKHB1YmxpYy50b2tlbnNfbm90aWZ5ICsgdG9rZW5zX2NoYW5nZWRfKiB0cmlnZ2VycylcIik7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGxvY2tBY3F1aXJlZCkge1xuICAgICAgYXdhaXQgY2xpZW50XG4gICAgICAgIC5xdWVyeShcIlNFTEVDVCBwZ19hZHZpc29yeV91bmxvY2soJDEsICQyKVwiLCBbXG4gICAgICAgICAgQURWSVNPUllfTE9DS19DTEFTU19JRCxcbiAgICAgICAgICBBRFZJU09SWV9MT0NLX09CSkVDVF9JRCxcbiAgICAgICAgXSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFJQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBRW5ELE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sNkJBQTZCO0FBRW5DLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sMEJBQTBCO0FBRWhDLE1BQWEsMkJBQTJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DeEMsZUFBc0Isb0JBQW9CLFlBQXlDO0NBQ2pGLE1BQU0sU0FBUyxJQUFJLE9BQU87RUFDeEIsR0FBRztFQUNILHlCQUF5QjtFQUN6QixrQkFBa0I7Q0FDcEIsQ0FBQztDQUVELElBQUksZUFBZTtDQUVuQixJQUFJO0VBQ0YsTUFBTSxPQUFPLFFBQVE7RUFDckIsTUFBTSxPQUFPLE1BQU0sMkJBQTJCO0VBQzlDLE1BQU0sT0FBTyxNQUFNLHVCQUF1QixzQkFBc0IsSUFBSTtFQUNwRSxNQUFNLE9BQU8sTUFBTSw0QkFBNEIsMkJBQTJCLElBQUk7RUFDOUUsTUFBTSxPQUFPLE1BQU0sbUNBQW1DLENBQ3BELHdCQUNBLHVCQUNGLENBQUM7RUFDRCxlQUFlO0VBRWYsTUFBTSxPQUFPLE1BQU0sd0JBQXdCO0VBQzNDLE9BQU8sS0FBSyxvRUFBb0U7Q0FDbEYsVUFBVTtFQUNSLElBQUksY0FDRixNQUFNLE9BQ0gsTUFBTSxxQ0FBcUMsQ0FDMUMsd0JBQ0EsdUJBQ0YsQ0FBQyxDQUFDLENBQ0QsWUFBWSxDQUFDLENBQUM7RUFHbkIsTUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQ25DO0FBQ0YifQ==
|
|
@@ -15,7 +15,9 @@ const KEEPALIVE_ENV_KEY = TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY;
|
|
|
15
15
|
const defaultDeps = {
|
|
16
16
|
findTokens: () => TokenModel.findActiveByProvider("A", "anthropic"),
|
|
17
17
|
readUsage: (tokenId) => QgridFrame.usage(tokenId),
|
|
18
|
-
dispatch: (input) =>
|
|
18
|
+
dispatch: async (input) => {
|
|
19
|
+
await QgridFrame.query(input);
|
|
20
|
+
},
|
|
19
21
|
readSetting: getSetting,
|
|
20
22
|
isRunnerEnabled: () => process.env[KEEPALIVE_ENV_KEY] === "true",
|
|
21
23
|
now: () => Date.now(),
|
|
@@ -38,7 +40,7 @@ function scheduleToken(token, deps, expectedGeneration, delayMs, allowFire) {
|
|
|
38
40
|
timers.delete(token.id);
|
|
39
41
|
if (generation !== expectedGeneration) return;
|
|
40
42
|
inspectToken(token, deps, expectedGeneration, allowFire).catch((error) => {
|
|
41
|
-
logger.warn(`keepalive cycle failed for ${token.name}: ${error.message}`);
|
|
43
|
+
logger.warn(`keepalive cycle failed for ${token.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
42
44
|
scheduleFallback(token, deps, expectedGeneration);
|
|
43
45
|
});
|
|
44
46
|
}, Math.max(0, delayMs));
|
|
@@ -70,7 +72,7 @@ async function inspectToken(token, deps, expectedGeneration, allowFire) {
|
|
|
70
72
|
try {
|
|
71
73
|
usage = await deps.readUsage(token.id);
|
|
72
74
|
} catch (error) {
|
|
73
|
-
logger.warn(`usage lookup failed for ${token.name}: ${error.message}`);
|
|
75
|
+
logger.warn(`usage lookup failed for ${token.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
74
76
|
scheduleFallback(token, deps, expectedGeneration);
|
|
75
77
|
return;
|
|
76
78
|
}
|
|
@@ -111,7 +113,7 @@ async function inspectToken(token, deps, expectedGeneration, allowFire) {
|
|
|
111
113
|
});
|
|
112
114
|
logger.info(`keepalive sent for ${token.name}`);
|
|
113
115
|
} catch (error) {
|
|
114
|
-
logger.warn(`keepalive failed for ${token.name}: ${error.message}`);
|
|
116
|
+
logger.warn(`keepalive failed for ${token.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
117
|
scheduleFallback(token, deps, expectedGeneration);
|
|
116
118
|
return;
|
|
117
119
|
}
|
|
@@ -137,7 +139,7 @@ async function startTokenWindowKeepalive(deps = defaultDeps) {
|
|
|
137
139
|
try {
|
|
138
140
|
tokens = await deps.findTokens();
|
|
139
141
|
} catch (error) {
|
|
140
|
-
logger.warn(`token discovery failed: ${error.message}`);
|
|
142
|
+
logger.warn(`token discovery failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
141
143
|
return;
|
|
142
144
|
}
|
|
143
145
|
if (generation !== expectedGeneration) return;
|
|
@@ -157,4 +159,4 @@ function stopTokenWindowKeepalive() {
|
|
|
157
159
|
//#endregion
|
|
158
160
|
export { KEEPALIVE_ENV_KEY, KEEPALIVE_MODEL, KEEPALIVE_PROJECT_NAME, KEEPALIVE_SETTING_KEY, POST_KEEPALIVE_USAGE_DELAY_MS, rescheduleTokenWindowKeepalive, startTokenWindowKeepalive, stopTokenWindowKeepalive };
|
|
159
161
|
|
|
160
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4td2luZG93LWtlZXBhbGl2ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4td2luZG93LWtlZXBhbGl2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUT0tFTl9XSU5ET1dfS0VFUEFMSVZFX1JVTk5FUl9FTlZfS0VZIH0gZnJvbSBcIi4uL3NldHRpbmcvc2V0dGluZy5jb25zdGFudFwiO1xuaW1wb3J0IHsgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0IH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyB0eXBlIFVzYWdlUmVzcG9uc2UgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJ0b2tlbi13aW5kb3cta2VlcGFsaXZlXCJdKTtcblxuY29uc3QgRklWRV9IT1VSU19NUyA9IDUgKiA2MCAqIDYwICogMV8wMDA7XG5jb25zdCBSRVNFVF9HUkFDRV9NUyA9IDFfMDAwO1xuXG4vLyB1c2FnZSBBUEkg7ISx6rO1IOydkeuLteydgCAx67aEIOy6kOyLnOuQnOuLpC4ga2VlcGFsaXZlIOynge2bhCDsponsi5wg7J6s7KGw7ZqM7ZWY66m0IOydtOyghCDsnIjrj4TsmrDrpbxcbi8vIOuLpOyLnCDrs7Trr4DroZwg7LqQ7Iuc6rCAIOyngOuCnCDrkqQg7ZWcIOuyiCDtmZXsnbjtlZjqs6AsIOq3uOuVjOuPhCDsg4gg7JyI64+E7Jqw6rCAIOyXhuycvOuptCDri6TsnYwgNWjquYzsp4Ag6riw64uk66aw64ukLlxuZXhwb3J0IGNvbnN0IFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TID0gNjFfMDAwO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9NT0RFTCA9IFwiYW50aHJvcGljL2NsYXVkZS1oYWlrdS01LTVcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfUFJPSkVDVF9OQU1FID0gXCJxZ3JpZC10b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5leHBvcnQgY29uc3QgS0VFUEFMSVZFX1NFVFRJTkdfS0VZID0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfRU5WX0tFWSA9IFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVk7XG5cbnR5cGUgS2VlcGFsaXZlVG9rZW4gPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJvdmlkZXI6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICBrZWVwYWxpdmVfZW5hYmxlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgVGltZXJIYW5kbGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuZXhwb3J0IHR5cGUgVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0ge1xuICBmaW5kVG9rZW5zOiAoKSA9PiBQcm9taXNlPEtlZXBhbGl2ZVRva2VuW10+O1xuICByZWFkVXNhZ2U6ICh0b2tlbklkOiBudW1iZXIpID0+IFByb21pc2U8VXNhZ2VSZXNwb25zZT47XG4gIGRpc3BhdGNoOiAoaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZFNldHRpbmc6IHR5cGVvZiBnZXRTZXR0aW5nO1xuICBpc1J1bm5lckVuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG4gIG5vdzogKCkgPT4gbnVtYmVyO1xuICBzZXRUaW1lcjogKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFRpbWVySGFuZGxlO1xuICBjbGVhclRpbWVyOiAoaGFuZGxlOiBUaW1lckhhbmRsZSkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IGRlZmF1bHREZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSB7XG4gIGZpbmRUb2tlbnM6ICgpID0+IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpLFxuICByZWFkVXNhZ2U6ICh0b2tlbklkKSA9PiBRZ3JpZEZyYW1lLnVzYWdlKHRva2VuSWQpLFxuICBkaXNwYXRjaDogKGlucHV0KSA9PiBRZ3JpZEZyYW1lLnF1ZXJ5KGlucHV0KSxcbiAgcmVhZFNldHRpbmc6IGdldFNldHRpbmcsXG4gIGlzUnVubmVyRW5hYmxlZDogKCkgPT4gcHJvY2Vzcy5lbnZbS0VFUEFMSVZFX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgbm93OiAoKSA9PiBEYXRlLm5vdygpLFxuICBzZXRUaW1lcjogKGNhbGxiYWNrLCBkZWxheU1zKSA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheU1zKSxcbiAgY2xlYXJUaW1lcjogKGhhbmRsZSkgPT4gY2xlYXJUaW1lb3V0KGhhbmRsZSksXG59O1xuXG5jb25zdCB0aW1lcnMgPSBuZXcgTWFwPG51bWJlciwgeyBoYW5kbGU6IFRpbWVySGFuZGxlOyBjbGVhcjogKGhhbmRsZTogVGltZXJIYW5kbGUpID0+IHZvaWQgfT4oKTtcbmNvbnN0IGZpcmVHdWFyZHMgPSBuZXcgTWFwPG51bWJlciwgeyB1bnRpbE1zOiBudW1iZXI7IGFsbG93RmlyZUF0RXhwaXJ5OiBib29sZWFuIH0+KCk7XG5sZXQgZ2VuZXJhdGlvbiA9IDA7XG5cbmZ1bmN0aW9uIGNsZWFyVG9rZW5UaW1lcih0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgdGltZXIgPSB0aW1lcnMuZ2V0KHRva2VuSWQpO1xuICBpZiAoIXRpbWVyKSByZXR1cm47XG4gIHRpbWVyLmNsZWFyKHRpbWVyLmhhbmRsZSk7XG4gIHRpbWVycy5kZWxldGUodG9rZW5JZCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiB2b2lkIHtcbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICBjbGVhclRva2VuVGltZXIodG9rZW4uaWQpO1xuICBjb25zdCBoYW5kbGUgPSBkZXBzLnNldFRpbWVyKFxuICAgICgpID0+IHtcbiAgICAgIHRpbWVycy5kZWxldGUodG9rZW4uaWQpO1xuICAgICAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgdm9pZCBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgYWxsb3dGaXJlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGtlZXBhbGl2ZSBjeWNsZSBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNYXRoLm1heCgwLCBkZWxheU1zKSxcbiAgKTtcbiAgdGltZXJzLnNldCh0b2tlbi5pZCwgeyBoYW5kbGUsIGNsZWFyOiBkZXBzLmNsZWFyVGltZXIgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmVyVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmVBdEV4cGlyeTogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCB1bnRpbE1zID0gZGVwcy5ub3coKSArIGRlbGF5TXM7XG4gIGZpcmVHdWFyZHMuc2V0KHRva2VuLmlkLCB7IHVudGlsTXMsIGFsbG93RmlyZUF0RXhwaXJ5IH0pO1xuICBzY2hlZHVsZVRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIGRlbGF5TXMsIGFsbG93RmlyZUF0RXhwaXJ5KTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVGYWxsYmFjayhcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGRlZmVyVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgRklWRV9IT1VSU19NUywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RUb2tlbihcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gZGVwcy5ub3coKTtcbiAgY29uc3QgZ3VhcmQgPSBmaXJlR3VhcmRzLmdldCh0b2tlbi5pZCk7XG4gIGlmIChndWFyZCAmJiBndWFyZC51bnRpbE1zID4gbm93KSB7XG4gICAgc2NoZWR1bGVUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCBndWFyZC51bnRpbE1zIC0gbm93LCBndWFyZC5hbGxvd0ZpcmVBdEV4cGlyeSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChndWFyZCkgZmlyZUd1YXJkcy5kZWxldGUodG9rZW4uaWQpO1xuXG4gIGxldCB1c2FnZTogVXNhZ2VSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1c2FnZSA9IGF3YWl0IGRlcHMucmVhZFVzYWdlKHRva2VuLmlkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihgdXNhZ2UgbG9va3VwIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuXG4gIGlmICh1c2FnZS5lcnJvcikge1xuICAgIGxvZ2dlci53YXJuKGB1c2FnZSBsb29rdXAgZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAke3VzYWdlLmVycm9yfWApO1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzZXRzQXQgPSB1c2FnZS5maXZlSG91cj8ucmVzZXRzQXQ7XG4gIGlmIChyZXNldHNBdCkge1xuICAgIGNvbnN0IHJlc2V0TXMgPSBEYXRlLnBhcnNlKHJlc2V0c0F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNldE1zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGludmFsaWQgZml2ZS1ob3VyIHJlc2V0IGZvciAke3Rva2VuLm5hbWV9OiAke3Jlc2V0c0F0fWApO1xuICAgICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zcGVjdGVkQXQgPSBkZXBzLm5vdygpO1xuICAgIGlmIChyZXNldE1zID4gaW5zcGVjdGVkQXQpIHtcbiAgICAgIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuLmlkKTtcbiAgICAgIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgcmVzZXRNcyAtIGluc3BlY3RlZEF0ICsgUkVTRVRfR1JBQ0VfTVMsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIOuwnOyCrCDsp4Htm4Qg7ZmV7J247JeQ7ISc64qUIOy6kOyLnOuQnCBudWxsL+qzvOqxsCByZXNldOydhCDrtJDrj4Qg64uk7IucIOuwnOyCrO2VmOyngCDslYrripTri6QuXG4gIGlmICghYWxsb3dGaXJlKSB7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkZWZlclRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TLCBmYWxzZSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZGVwcy5kaXNwYXRjaCh7XG4gICAgICBwcm9tcHQ6IFwiUmVwbHkgT0suXCIsXG4gICAgICBtb2RlbDogS0VFUEFMSVZFX01PREVMLFxuICAgICAgdGhpbmtpbmc6IGZhbHNlLFxuICAgICAgZWZmb3J0OiBcImxvd1wiLFxuICAgICAgcHJvamVjdE5hbWU6IEtFRVBBTElWRV9QUk9KRUNUX05BTUUsXG4gICAgICBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhga2VlcGFsaXZlIHNlbnQgZm9yICR7dG9rZW4ubmFtZX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2Fybihga2VlcGFsaXZlIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0RmlyZUd1YXJkID0gZmlyZUd1YXJkcy5nZXQodG9rZW4uaWQpO1xuICBpZiAocG9zdEZpcmVHdWFyZCkge1xuICAgIHNjaGVkdWxlVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIGRlcHMsXG4gICAgICBleHBlY3RlZEdlbmVyYXRpb24sXG4gICAgICBNYXRoLm1heCgwLCBwb3N0RmlyZUd1YXJkLnVudGlsTXMgLSBkZXBzLm5vdygpKSxcbiAgICAgIHBvc3RGaXJlR3VhcmQuYWxsb3dGaXJlQXRFeHBpcnksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNjaGVkdWxlZFRpbWVycygpOiB2b2lkIHtcbiAgZ2VuZXJhdGlvbisrO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGltZXJzLmtleXMoKSkgY2xlYXJUb2tlblRpbWVyKHRva2VuSWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY2xlYXJTY2hlZHVsZWRUaW1lcnMoKTtcbiAgaWYgKCFkZXBzLmlzUnVubmVyRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHJ1bm5lciBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGRlcHMucmVhZFNldHRpbmcoS0VFUEFMSVZFX1NFVFRJTkdfS0VZKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIGRpc2FibGVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBleHBlY3RlZEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuXG4gIGxldCB0b2tlbnM6IEtlZXBhbGl2ZVRva2VuW107XG4gIHRyeSB7XG4gICAgdG9rZW5zID0gYXdhaXQgZGVwcy5maW5kVG9rZW5zKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oYHRva2VuIGRpc2NvdmVyeSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZ2VuZXJhdGlvbiAhPT0gZXhwZWN0ZWRHZW5lcmF0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdGFyZ2V0cyA9IHRva2Vucy5maWx0ZXIoXG4gICAgKHRva2VuKSA9PiB0b2tlbi5hY3RpdmUgJiYgdG9rZW4ucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgJiYgdG9rZW4ua2VlcGFsaXZlX2VuYWJsZWQsXG4gICk7XG4gIGNvbnN0IHRhcmdldElkcyA9IG5ldyBTZXQodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgZmlyZUd1YXJkcy5rZXlzKCkpIHtcbiAgICBpZiAoIXRhcmdldElkcy5oYXModG9rZW5JZCkpIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuSWQpO1xuICB9XG4gIGxvZ2dlci5pbmZvKGB0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHNjaGVkdWxpbmcgJHt0YXJnZXRzLmxlbmd0aH0gdG9rZW4ocylgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgdHJ1ZSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHN0YXJ0VG9rZW5XaW5kb3dLZWVwYWxpdmUoZGVwcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTogdm9pZCB7XG4gIGNsZWFyU2NoZWR1bGVkVGltZXJzKCk7XG4gIGZpcmVHdWFyZHMuY2xlYXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sZ0JBQWdCLE1BQVMsS0FBSztBQUNwQyxNQUFNLGlCQUFpQjtBQUl2QixNQUFhLGdDQUFnQztBQUM3QyxNQUFhLGtCQUFrQjtBQUMvQixNQUFhLHlCQUF5QjtBQUN0QyxNQUFhLHdCQUF3QjtBQUNyQyxNQUFhLG9CQUFvQjtBQXVCakMsTUFBTSxjQUF3QztDQUM1QyxrQkFBa0IsV0FBVyxxQkFBcUIsS0FBSyxXQUFXO0NBQ2xFLFlBQVksWUFBWSxXQUFXLE1BQU0sT0FBTztDQUNoRCxXQUFXLFVBQVUsV0FBVyxNQUFNLEtBQUs7Q0FDM0MsYUFBYTtDQUNiLHVCQUF1QixRQUFRLElBQUksdUJBQXVCO0NBQzFELFdBQVcsS0FBSyxJQUFJO0NBQ3BCLFdBQVcsVUFBVSxZQUFZLFdBQVcsVUFBVSxPQUFPO0NBQzdELGFBQWEsV0FBVyxhQUFhLE1BQU07QUFDN0M7QUFFQSxNQUFNLHlCQUFTLElBQUksSUFBMkU7QUFDOUYsTUFBTSw2QkFBYSxJQUFJLElBQTZEO0FBQ3BGLElBQUksYUFBYTtBQUVqQixTQUFTLGdCQUFnQixTQUF1QjtDQUM5QyxNQUFNLFFBQVEsT0FBTyxJQUFJLE9BQU87Q0FDaEMsSUFBSSxDQUFDLE9BQU87Q0FDWixNQUFNLE1BQU0sTUFBTSxNQUFNO0NBQ3hCLE9BQU8sT0FBTyxPQUFPO0FBQ3ZCO0FBRUEsU0FBUyxjQUNQLE9BQ0EsTUFDQSxvQkFDQSxTQUNBLFdBQ007Q0FDTixJQUFJLGVBQWUsb0JBQW9CO0NBQ3ZDLGdCQUFnQixNQUFNLEVBQUU7Q0FDeEIsTUFBTSxTQUFTLEtBQUssZUFDWjtFQUNKLE9BQU8sT0FBTyxNQUFNLEVBQUU7RUFDdEIsSUFBSSxlQUFlLG9CQUFvQjtFQUN2QyxBQUFLLGFBQWEsT0FBTyxNQUFNLG9CQUFvQixTQUFTLENBQUMsQ0FBQyxPQUFPLFVBQVU7R0FDN0UsT0FBTyxLQUFLLDhCQUE4QixNQUFNLEtBQUssSUFBSyxNQUFnQixTQUFTO0dBQ25GLGlCQUFpQixPQUFPLE1BQU0sa0JBQWtCO0VBQ2xELENBQUM7Q0FDSCxHQUNBLEtBQUssSUFBSSxHQUFHLE9BQU8sQ0FDckI7Q0FDQSxPQUFPLElBQUksTUFBTSxJQUFJO0VBQUU7RUFBUSxPQUFPLEtBQUs7Q0FBVyxDQUFDO0FBQ3pEO0FBRUEsU0FBUyxXQUNQLE9BQ0EsTUFDQSxvQkFDQSxTQUNBLG1CQUNNO0NBQ04sTUFBTSxVQUFVLEtBQUssSUFBSSxJQUFJO0NBQzdCLFdBQVcsSUFBSSxNQUFNLElBQUk7RUFBRTtFQUFTO0NBQWtCLENBQUM7Q0FDdkQsY0FBYyxPQUFPLE1BQU0sb0JBQW9CLFNBQVMsaUJBQWlCO0FBQzNFO0FBRUEsU0FBUyxpQkFDUCxPQUNBLE1BQ0Esb0JBQ007Q0FDTixXQUFXLE9BQU8sTUFBTSxvQkFBb0IsZUFBZSxJQUFJO0FBQ2pFO0FBRUEsZUFBZSxhQUNiLE9BQ0EsTUFDQSxvQkFDQSxXQUNlO0NBQ2YsTUFBTSxNQUFNLEtBQUssSUFBSTtDQUNyQixNQUFNLFFBQVEsV0FBVyxJQUFJLE1BQU0sRUFBRTtDQUNyQyxJQUFJLFNBQVMsTUFBTSxVQUFVLEtBQUs7RUFDaEMsY0FBYyxPQUFPLE1BQU0sb0JBQW9CLE1BQU0sVUFBVSxLQUFLLE1BQU0saUJBQWlCO0VBQzNGO0NBQ0Y7Q0FDQSxJQUFJLE9BQU8sV0FBVyxPQUFPLE1BQU0sRUFBRTtDQUVyQyxJQUFJO0NBQ0osSUFBSTtFQUNGLFFBQVEsTUFBTSxLQUFLLFVBQVUsTUFBTSxFQUFFO0NBQ3ZDLFNBQVMsT0FBTztFQUNkLE9BQU8sS0FBSywyQkFBMkIsTUFBTSxLQUFLLElBQUssTUFBZ0IsU0FBUztFQUNoRixpQkFBaUIsT0FBTyxNQUFNLGtCQUFrQjtFQUNoRDtDQUNGO0NBQ0EsSUFBSSxlQUFlLG9CQUFvQjtDQUV2QyxJQUFJLE1BQU0sT0FBTztFQUNmLE9BQU8sS0FBSywyQkFBMkIsTUFBTSxLQUFLLElBQUksTUFBTSxPQUFPO0VBQ25FLGlCQUFpQixPQUFPLE1BQU0sa0JBQWtCO0VBQ2hEO0NBQ0Y7Q0FFQSxNQUFNLFdBQVcsTUFBTSxVQUFVO0NBQ2pDLElBQUksVUFBVTtFQUNaLE1BQU0sVUFBVSxLQUFLLE1BQU0sUUFBUTtFQUNuQyxJQUFJLENBQUMsT0FBTyxTQUFTLE9BQU8sR0FBRztHQUM3QixPQUFPLEtBQUssK0JBQStCLE1BQU0sS0FBSyxJQUFJLFVBQVU7R0FDcEUsaUJBQWlCLE9BQU8sTUFBTSxrQkFBa0I7R0FDaEQ7RUFDRjtFQUNBLE1BQU0sY0FBYyxLQUFLLElBQUk7RUFDN0IsSUFBSSxVQUFVLGFBQWE7R0FDekIsV0FBVyxPQUFPLE1BQU0sRUFBRTtHQUMxQixjQUFjLE9BQU8sTUFBTSxvQkFBb0IsVUFBVSxjQUFjLGdCQUFnQixJQUFJO0dBQzNGO0VBQ0Y7Q0FDRjtDQUdBLElBQUksQ0FBQyxXQUFXO0VBQ2QsaUJBQWlCLE9BQU8sTUFBTSxrQkFBa0I7RUFDaEQ7Q0FDRjtDQUVBLFdBQVcsT0FBTyxNQUFNLG9CQUFvQiwrQkFBK0IsS0FBSztDQUNoRixJQUFJO0VBQ0YsTUFBTSxLQUFLLFNBQVM7R0FDbEIsUUFBUTtHQUNSLE9BQU87R0FDUCxVQUFVO0dBQ1YsUUFBUTtHQUNSLGFBQWE7R0FDYixrQkFBa0IsTUFBTTtFQUMxQixDQUFDO0VBQ0QsT0FBTyxLQUFLLHNCQUFzQixNQUFNLE1BQU07Q0FDaEQsU0FBUyxPQUFPO0VBQ2QsT0FBTyxLQUFLLHdCQUF3QixNQUFNLEtBQUssSUFBSyxNQUFnQixTQUFTO0VBQzdFLGlCQUFpQixPQUFPLE1BQU0sa0JBQWtCO0VBQ2hEO0NBQ0Y7Q0FFQSxNQUFNLGdCQUFnQixXQUFXLElBQUksTUFBTSxFQUFFO0NBQzdDLElBQUksZUFDRixjQUNFLE9BQ0EsTUFDQSxvQkFDQSxLQUFLLElBQUksR0FBRyxjQUFjLFVBQVUsS0FBSyxJQUFJLENBQUMsR0FDOUMsY0FBYyxpQkFDaEI7QUFFSjtBQUVBLFNBQVMsdUJBQTZCO0NBQ3BDO0NBQ0EsS0FBSyxNQUFNLFdBQVcsT0FBTyxLQUFLLEdBQUcsZ0JBQWdCLE9BQU87QUFDOUQ7QUFFQSxlQUFzQiwwQkFDcEIsT0FBaUMsYUFDbEI7Q0FDZixxQkFBcUI7Q0FDckIsSUFBSSxDQUFDLEtBQUssZ0JBQWdCLEdBQUc7RUFDM0IsT0FBTyxLQUFLLDBEQUEwRDtFQUN0RTtDQUNGO0NBQ0EsSUFBSSxLQUFLLFlBQUEsbUNBQWlDLE1BQU0sU0FBUztFQUN2RCxPQUFPLEtBQUssaUNBQWlDO0VBQzdDO0NBQ0Y7Q0FDQSxNQUFNLHFCQUFxQjtDQUUzQixJQUFJO0NBQ0osSUFBSTtFQUNGLFNBQVMsTUFBTSxLQUFLLFdBQVc7Q0FDakMsU0FBUyxPQUFPO0VBQ2QsT0FBTyxLQUFLLDJCQUE0QixNQUFnQixTQUFTO0VBQ2pFO0NBQ0Y7Q0FDQSxJQUFJLGVBQWUsb0JBQW9CO0NBRXZDLE1BQU0sVUFBVSxPQUFPLFFBQ3BCLFVBQVUsTUFBTSxVQUFVLE1BQU0sYUFBYSxlQUFlLE1BQU0saUJBQ3JFO0NBQ0EsTUFBTSxZQUFZLElBQUksSUFBSSxRQUFRLEtBQUssVUFBVSxNQUFNLEVBQUUsQ0FBQztDQUMxRCxLQUFLLE1BQU0sV0FBVyxXQUFXLEtBQUssR0FDcEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLEdBQUcsV0FBVyxPQUFPLE9BQU87Q0FFeEQsT0FBTyxLQUFLLHFDQUFxQyxRQUFRLE9BQU8sVUFBVTtDQUMxRSxNQUFNLFFBQVEsSUFBSSxRQUFRLEtBQUssVUFBVSxhQUFhLE9BQU8sTUFBTSxvQkFBb0IsSUFBSSxDQUFDLENBQUM7QUFDL0Y7QUFFQSxTQUFnQiwrQkFDZCxPQUFpQyxhQUNsQjtDQUNmLE9BQU8sMEJBQTBCLElBQUk7QUFDdkM7QUFFQSxTQUFnQiwyQkFBaUM7Q0FDL0MscUJBQXFCO0NBQ3JCLFdBQVcsTUFBTTtBQUNuQiJ9
|
|
162
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4td2luZG93LWtlZXBhbGl2ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4td2luZG93LWtlZXBhbGl2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUT0tFTl9XSU5ET1dfS0VFUEFMSVZFX1JVTk5FUl9FTlZfS0VZIH0gZnJvbSBcIi4uL3NldHRpbmcvc2V0dGluZy5jb25zdGFudFwiO1xuaW1wb3J0IHsgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0IH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyB0eXBlIFVzYWdlUmVzcG9uc2UgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJ0b2tlbi13aW5kb3cta2VlcGFsaXZlXCJdKTtcblxuY29uc3QgRklWRV9IT1VSU19NUyA9IDUgKiA2MCAqIDYwICogMV8wMDA7XG5jb25zdCBSRVNFVF9HUkFDRV9NUyA9IDFfMDAwO1xuXG4vLyB1c2FnZSBBUEkg7ISx6rO1IOydkeuLteydgCAx67aEIOy6kOyLnOuQnOuLpC4ga2VlcGFsaXZlIOynge2bhCDsponsi5wg7J6s7KGw7ZqM7ZWY66m0IOydtOyghCDsnIjrj4TsmrDrpbxcbi8vIOuLpOyLnCDrs7Trr4DroZwg7LqQ7Iuc6rCAIOyngOuCnCDrkqQg7ZWcIOuyiCDtmZXsnbjtlZjqs6AsIOq3uOuVjOuPhCDsg4gg7JyI64+E7Jqw6rCAIOyXhuycvOuptCDri6TsnYwgNWjquYzsp4Ag6riw64uk66aw64ukLlxuZXhwb3J0IGNvbnN0IFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TID0gNjFfMDAwO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9NT0RFTCA9IFwiYW50aHJvcGljL2NsYXVkZS1oYWlrdS01LTVcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfUFJPSkVDVF9OQU1FID0gXCJxZ3JpZC10b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5leHBvcnQgY29uc3QgS0VFUEFMSVZFX1NFVFRJTkdfS0VZID0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfRU5WX0tFWSA9IFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVk7XG5cbnR5cGUgS2VlcGFsaXZlVG9rZW4gPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJvdmlkZXI6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICBrZWVwYWxpdmVfZW5hYmxlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgVGltZXJIYW5kbGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuZXhwb3J0IHR5cGUgVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0ge1xuICBmaW5kVG9rZW5zOiAoKSA9PiBQcm9taXNlPEtlZXBhbGl2ZVRva2VuW10+O1xuICByZWFkVXNhZ2U6ICh0b2tlbklkOiBudW1iZXIpID0+IFByb21pc2U8VXNhZ2VSZXNwb25zZT47XG4gIGRpc3BhdGNoOiAoaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVhZFNldHRpbmc6IHR5cGVvZiBnZXRTZXR0aW5nO1xuICBpc1J1bm5lckVuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG4gIG5vdzogKCkgPT4gbnVtYmVyO1xuICBzZXRUaW1lcjogKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFRpbWVySGFuZGxlO1xuICBjbGVhclRpbWVyOiAoaGFuZGxlOiBUaW1lckhhbmRsZSkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IGRlZmF1bHREZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSB7XG4gIGZpbmRUb2tlbnM6ICgpID0+IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpLFxuICByZWFkVXNhZ2U6ICh0b2tlbklkKSA9PiBRZ3JpZEZyYW1lLnVzYWdlKHRva2VuSWQpLFxuICBkaXNwYXRjaDogYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgYXdhaXQgUWdyaWRGcmFtZS5xdWVyeShpbnB1dCk7XG4gIH0sXG4gIHJlYWRTZXR0aW5nOiBnZXRTZXR0aW5nLFxuICBpc1J1bm5lckVuYWJsZWQ6ICgpID0+IHByb2Nlc3MuZW52W0tFRVBBTElWRV9FTlZfS0VZXSA9PT0gXCJ0cnVlXCIsXG4gIG5vdzogKCkgPT4gRGF0ZS5ub3coKSxcbiAgc2V0VGltZXI6IChjYWxsYmFjaywgZGVsYXlNcykgPT4gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXlNcyksXG4gIGNsZWFyVGltZXI6IChoYW5kbGUpID0+IGNsZWFyVGltZW91dChoYW5kbGUpLFxufTtcblxuY29uc3QgdGltZXJzID0gbmV3IE1hcDxudW1iZXIsIHsgaGFuZGxlOiBUaW1lckhhbmRsZTsgY2xlYXI6IChoYW5kbGU6IFRpbWVySGFuZGxlKSA9PiB2b2lkIH0+KCk7XG5jb25zdCBmaXJlR3VhcmRzID0gbmV3IE1hcDxudW1iZXIsIHsgdW50aWxNczogbnVtYmVyOyBhbGxvd0ZpcmVBdEV4cGlyeTogYm9vbGVhbiB9PigpO1xubGV0IGdlbmVyYXRpb24gPSAwO1xuXG5mdW5jdGlvbiBjbGVhclRva2VuVGltZXIodG9rZW5JZDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHRpbWVyID0gdGltZXJzLmdldCh0b2tlbklkKTtcblxuICBpZiAoIXRpbWVyKSByZXR1cm47XG4gIHRpbWVyLmNsZWFyKHRpbWVyLmhhbmRsZSk7XG4gIHRpbWVycy5kZWxldGUodG9rZW5JZCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiB2b2lkIHtcbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICBjbGVhclRva2VuVGltZXIodG9rZW4uaWQpO1xuXG4gIGNvbnN0IGhhbmRsZSA9IGRlcHMuc2V0VGltZXIoXG4gICAgKCkgPT4ge1xuICAgICAgdGltZXJzLmRlbGV0ZSh0b2tlbi5pZCk7XG5cbiAgICAgIGlmIChnZW5lcmF0aW9uICE9PSBleHBlY3RlZEdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgIHZvaWQgaW5zcGVjdFRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIGFsbG93RmlyZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBrZWVwYWxpdmUgY3ljbGUgZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICApO1xuICAgICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNYXRoLm1heCgwLCBkZWxheU1zKSxcbiAgKTtcblxuICB0aW1lcnMuc2V0KHRva2VuLmlkLCB7IGhhbmRsZSwgY2xlYXI6IGRlcHMuY2xlYXJUaW1lciB9KTtcbn1cblxuZnVuY3Rpb24gZGVmZXJUb2tlbihcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuICBkZWxheU1zOiBudW1iZXIsXG4gIGFsbG93RmlyZUF0RXhwaXJ5OiBib29sZWFuLFxuKTogdm9pZCB7XG4gIGNvbnN0IHVudGlsTXMgPSBkZXBzLm5vdygpICsgZGVsYXlNcztcbiAgZmlyZUd1YXJkcy5zZXQodG9rZW4uaWQsIHsgdW50aWxNcywgYWxsb3dGaXJlQXRFeHBpcnkgfSk7XG4gIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgZGVsYXlNcywgYWxsb3dGaXJlQXRFeHBpcnkpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUZhbGxiYWNrKFxuICB0b2tlbjogS2VlcGFsaXZlVG9rZW4sXG4gIGRlcHM6IFRva2VuV2luZG93S2VlcGFsaXZlRGVwcyxcbiAgZXhwZWN0ZWRHZW5lcmF0aW9uOiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgZGVmZXJUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCBGSVZFX0hPVVJTX01TLCB0cnVlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5zcGVjdFRva2VuKFxuICB0b2tlbjogS2VlcGFsaXZlVG9rZW4sXG4gIGRlcHM6IFRva2VuV2luZG93S2VlcGFsaXZlRGVwcyxcbiAgZXhwZWN0ZWRHZW5lcmF0aW9uOiBudW1iZXIsXG4gIGFsbG93RmlyZTogYm9vbGVhbixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub3cgPSBkZXBzLm5vdygpO1xuICBjb25zdCBndWFyZCA9IGZpcmVHdWFyZHMuZ2V0KHRva2VuLmlkKTtcblxuICBpZiAoZ3VhcmQgJiYgZ3VhcmQudW50aWxNcyA+IG5vdykge1xuICAgIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgZ3VhcmQudW50aWxNcyAtIG5vdywgZ3VhcmQuYWxsb3dGaXJlQXRFeHBpcnkpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGd1YXJkKSBmaXJlR3VhcmRzLmRlbGV0ZSh0b2tlbi5pZCk7XG5cbiAgbGV0IHVzYWdlOiBVc2FnZVJlc3BvbnNlO1xuXG4gIHRyeSB7XG4gICAgdXNhZ2UgPSBhd2FpdCBkZXBzLnJlYWRVc2FnZSh0b2tlbi5pZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgdXNhZ2UgbG9va3VwIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICApO1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2VuZXJhdGlvbiAhPT0gZXhwZWN0ZWRHZW5lcmF0aW9uKSByZXR1cm47XG5cbiAgaWYgKHVzYWdlLmVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oYHVzYWdlIGxvb2t1cCBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7dXNhZ2UuZXJyb3J9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc2V0c0F0ID0gdXNhZ2UuZml2ZUhvdXI/LnJlc2V0c0F0O1xuXG4gIGlmIChyZXNldHNBdCkge1xuICAgIGNvbnN0IHJlc2V0TXMgPSBEYXRlLnBhcnNlKHJlc2V0c0F0KTtcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJlc2V0TXMpKSB7XG4gICAgICBsb2dnZXIud2FybihgaW52YWxpZCBmaXZlLWhvdXIgcmVzZXQgZm9yICR7dG9rZW4ubmFtZX06ICR7cmVzZXRzQXR9YCk7XG4gICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5zcGVjdGVkQXQgPSBkZXBzLm5vdygpO1xuXG4gICAgaWYgKHJlc2V0TXMgPiBpbnNwZWN0ZWRBdCkge1xuICAgICAgZmlyZUd1YXJkcy5kZWxldGUodG9rZW4uaWQpO1xuICAgICAgc2NoZWR1bGVUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCByZXNldE1zIC0gaW5zcGVjdGVkQXQgKyBSRVNFVF9HUkFDRV9NUywgdHJ1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyDrsJzsgqwg7KeB7ZuEIO2ZleyduOyXkOyEnOuKlCDsupDsi5zrkJwgbnVsbC/qs7zqsbAgcmVzZXTsnYQg67SQ64+EIOuLpOyLnCDrsJzsgqztlZjsp4Ag7JWK64qU64ukLlxuICBpZiAoIWFsbG93RmlyZSkge1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBkZWZlclRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TLCBmYWxzZSk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBkZXBzLmRpc3BhdGNoKHtcbiAgICAgIHByb21wdDogXCJSZXBseSBPSy5cIixcbiAgICAgIG1vZGVsOiBLRUVQQUxJVkVfTU9ERUwsXG4gICAgICB0aGlua2luZzogZmFsc2UsXG4gICAgICBlZmZvcnQ6IFwibG93XCIsXG4gICAgICBwcm9qZWN0TmFtZTogS0VFUEFMSVZFX1BST0pFQ1RfTkFNRSxcbiAgICAgIHByZWZlcnJlZFRva2VuSWQ6IHRva2VuLmlkLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGBrZWVwYWxpdmUgc2VudCBmb3IgJHt0b2tlbi5uYW1lfWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYGtlZXBhbGl2ZSBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgKTtcbiAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9zdEZpcmVHdWFyZCA9IGZpcmVHdWFyZHMuZ2V0KHRva2VuLmlkKTtcblxuICBpZiAocG9zdEZpcmVHdWFyZCkge1xuICAgIHNjaGVkdWxlVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIGRlcHMsXG4gICAgICBleHBlY3RlZEdlbmVyYXRpb24sXG4gICAgICBNYXRoLm1heCgwLCBwb3N0RmlyZUd1YXJkLnVudGlsTXMgLSBkZXBzLm5vdygpKSxcbiAgICAgIHBvc3RGaXJlR3VhcmQuYWxsb3dGaXJlQXRFeHBpcnksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNjaGVkdWxlZFRpbWVycygpOiB2b2lkIHtcbiAgZ2VuZXJhdGlvbisrO1xuXG4gIGZvciAoY29uc3QgdG9rZW5JZCBvZiB0aW1lcnMua2V5cygpKSBjbGVhclRva2VuVGltZXIodG9rZW5JZCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFRva2VuV2luZG93S2VlcGFsaXZlKFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSBkZWZhdWx0RGVwcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjbGVhclNjaGVkdWxlZFRpbWVycygpO1xuXG4gIGlmICghZGVwcy5pc1J1bm5lckVuYWJsZWQoKSkge1xuICAgIGxvZ2dlci5pbmZvKFwidG9rZW4gd2luZG93IGtlZXBhbGl2ZSBydW5uZXIgZGlzYWJsZWQgZm9yIHRoaXMgaW5zdGFuY2VcIik7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGVwcy5yZWFkU2V0dGluZyhLRUVQQUxJVkVfU0VUVElOR19LRVkpID09PSBcImZhbHNlXCIpIHtcbiAgICBsb2dnZXIuaW5mbyhcInRva2VuIHdpbmRvdyBrZWVwYWxpdmUgZGlzYWJsZWRcIik7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBleHBlY3RlZEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuXG4gIGxldCB0b2tlbnM6IEtlZXBhbGl2ZVRva2VuW107XG5cbiAgdHJ5IHtcbiAgICB0b2tlbnMgPSBhd2FpdCBkZXBzLmZpbmRUb2tlbnMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGB0b2tlbiBkaXNjb3ZlcnkgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZ2VuZXJhdGlvbiAhPT0gZXhwZWN0ZWRHZW5lcmF0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdGFyZ2V0cyA9IHRva2Vucy5maWx0ZXIoXG4gICAgKHRva2VuKSA9PiB0b2tlbi5hY3RpdmUgJiYgdG9rZW4ucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgJiYgdG9rZW4ua2VlcGFsaXZlX2VuYWJsZWQsXG4gICk7XG5cbiAgY29uc3QgdGFyZ2V0SWRzID0gbmV3IFNldCh0YXJnZXRzLm1hcCgodG9rZW4pID0+IHRva2VuLmlkKSk7XG5cbiAgZm9yIChjb25zdCB0b2tlbklkIG9mIGZpcmVHdWFyZHMua2V5cygpKSB7XG4gICAgaWYgKCF0YXJnZXRJZHMuaGFzKHRva2VuSWQpKSBmaXJlR3VhcmRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGB0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHNjaGVkdWxpbmcgJHt0YXJnZXRzLmxlbmd0aH0gdG9rZW4ocylgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgdHJ1ZSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHN0YXJ0VG9rZW5XaW5kb3dLZWVwYWxpdmUoZGVwcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTogdm9pZCB7XG4gIGNsZWFyU2NoZWR1bGVkVGltZXJzKCk7XG4gIGZpcmVHdWFyZHMuY2xlYXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sZ0JBQWdCLE1BQVMsS0FBSztBQUNwQyxNQUFNLGlCQUFpQjtBQUl2QixNQUFhLGdDQUFnQztBQUM3QyxNQUFhLGtCQUFrQjtBQUMvQixNQUFhLHlCQUF5QjtBQUN0QyxNQUFhLHdCQUF3QjtBQUNyQyxNQUFhLG9CQUFvQjtBQXVCakMsTUFBTSxjQUF3QztDQUM1QyxrQkFBa0IsV0FBVyxxQkFBcUIsS0FBSyxXQUFXO0NBQ2xFLFlBQVksWUFBWSxXQUFXLE1BQU0sT0FBTztDQUNoRCxVQUFVLE9BQU8sVUFBVTtFQUN6QixNQUFNLFdBQVcsTUFBTSxLQUFLO0NBQzlCO0NBQ0EsYUFBYTtDQUNiLHVCQUF1QixRQUFRLElBQUksdUJBQXVCO0NBQzFELFdBQVcsS0FBSyxJQUFJO0NBQ3BCLFdBQVcsVUFBVSxZQUFZLFdBQVcsVUFBVSxPQUFPO0NBQzdELGFBQWEsV0FBVyxhQUFhLE1BQU07QUFDN0M7QUFFQSxNQUFNLHlCQUFTLElBQUksSUFBMkU7QUFDOUYsTUFBTSw2QkFBYSxJQUFJLElBQTZEO0FBQ3BGLElBQUksYUFBYTtBQUVqQixTQUFTLGdCQUFnQixTQUF1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
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { isJsonObject } from "../../utils/providers/common/provider-types.js";
|
|
1
2
|
import { SCHEMA_ARRAY_KEYWORDS, SCHEMA_MAP_KEYWORDS, SCHEMA_SINGLE_KEYWORDS, UNSUPPORTED_REFERENCE_KEYWORDS } from "../../utils/providers/common/json-schema-keywords.js";
|
|
3
|
+
import { z } from "zod";
|
|
2
4
|
//#region src/application/qgrid/tool-emulation-schema.ts
|
|
3
5
|
/**
|
|
4
6
|
* tool envelope + 사용자 output 스키마 합성 (요청 방향). 응답 해석은 tool-emulation.ts.
|
|
@@ -28,7 +30,7 @@ function buildToolCallSchema(tools, answerSchema) {
|
|
|
28
30
|
return `- ${tool.name}: ${tool.description ?? ""}\n inputSchema: ${schema}`;
|
|
29
31
|
}).join("\n");
|
|
30
32
|
const normalizedAnswerSchema = answerSchema === void 0 ? void 0 : rebaseUserOutputSchema(answerSchema);
|
|
31
|
-
|
|
33
|
+
const envelope = {
|
|
32
34
|
type: "object",
|
|
33
35
|
description: "Return exactly one JSON object matching this schema as your final response, including when requesting a tool. This object is the response body, not a call to a built-in tool. To request client-side tools, set result.action to tool_call and include result.toolCalls, then end your turn. The client executes those tools and supplies their results in a later request. Do not invent tool results or emit an answer before receiving the required results.",
|
|
34
36
|
properties: { result: { anyOf: [{
|
|
@@ -86,40 +88,38 @@ function buildToolCallSchema(tools, answerSchema) {
|
|
|
86
88
|
additionalProperties: false
|
|
87
89
|
}] } },
|
|
88
90
|
required: ["result"],
|
|
89
|
-
additionalProperties: false
|
|
90
|
-
...normalizedAnswerSchema === void 0 ? {} : { $defs: { [USER_OUTPUT_DEFINITION]: normalizedAnswerSchema } }
|
|
91
|
+
additionalProperties: false
|
|
91
92
|
};
|
|
93
|
+
if (normalizedAnswerSchema !== void 0) envelope.$defs = { [USER_OUTPUT_DEFINITION]: normalizedAnswerSchema };
|
|
94
|
+
return envelope;
|
|
92
95
|
}
|
|
93
96
|
function rebaseUserOutputSchema(schema) {
|
|
94
|
-
return rewriteSchemaNode(schema, "$");
|
|
97
|
+
return rewriteSchemaNode(schema, "$") ?? schema;
|
|
95
98
|
}
|
|
96
99
|
const MAP_KEYWORDS = new Set(SCHEMA_MAP_KEYWORDS);
|
|
97
100
|
const ARRAY_KEYWORDS = new Set(SCHEMA_ARRAY_KEYWORDS);
|
|
98
101
|
const SINGLE_KEYWORDS = new Set(SCHEMA_SINGLE_KEYWORDS);
|
|
99
102
|
function rewriteSchemaNode(value, path) {
|
|
100
|
-
if (
|
|
103
|
+
if (!isJsonObject(value)) return value;
|
|
101
104
|
const source = value;
|
|
102
105
|
const result = { ...source };
|
|
103
106
|
for (const unsupportedKeyword of UNSUPPORTED_REFERENCE_KEYWORDS) if (Object.hasOwn(source, unsupportedKeyword)) throw new ToolSchemaCompositionError(`${unsupportedKeyword} is not supported`, `${path}.${unsupportedKeyword}`);
|
|
104
107
|
if ("$ref" in source) {
|
|
105
|
-
const ref = source.$ref;
|
|
106
|
-
if (
|
|
108
|
+
const ref = z.string().safeParse(source.$ref).data;
|
|
109
|
+
if (ref === void 0 || ref !== "#" && !ref.startsWith("#/")) throw new ToolSchemaCompositionError("only root-relative JSON Pointer $ref values are supported", `${path}.$ref`);
|
|
107
110
|
result.$ref = `${USER_OUTPUT_REF}${ref.slice(1)}`;
|
|
108
111
|
}
|
|
109
112
|
for (const [keyword, child] of Object.entries(source)) {
|
|
110
113
|
const keywordPath = `${path}.${keyword}`;
|
|
111
114
|
if (MAP_KEYWORDS.has(keyword) && isJsonObject(child)) result[keyword] = Object.fromEntries(Object.entries(child).map(([name, schema]) => [name, rewriteSchemaNode(schema, `${keywordPath}.${name}`)]));
|
|
112
115
|
else if (keyword === "dependencies" && isJsonObject(child)) result[keyword] = Object.fromEntries(Object.entries(child).map(([name, dependency]) => [name, Array.isArray(dependency) ? dependency : rewriteSchemaNode(dependency, `${keywordPath}.${name}`)]));
|
|
113
|
-
else if (ARRAY_KEYWORDS.has(keyword) && Array.isArray(child)) result[keyword] = child.map((schema, index) => rewriteSchemaNode(schema, `${keywordPath}[${index}]`));
|
|
114
|
-
else if (SINGLE_KEYWORDS.has(keyword)) if (keyword === "items" && Array.isArray(child)) result[keyword] = child.map((schema, index) => rewriteSchemaNode(schema, `${keywordPath}[${index}]`));
|
|
116
|
+
else if (ARRAY_KEYWORDS.has(keyword) && Array.isArray(child)) result[keyword] = child.map((schema, index) => rewriteSchemaNode(schema, `${keywordPath}[${index}]`) ?? schema);
|
|
117
|
+
else if (SINGLE_KEYWORDS.has(keyword)) if (keyword === "items" && Array.isArray(child)) result[keyword] = child.map((schema, index) => rewriteSchemaNode(schema, `${keywordPath}[${index}]`) ?? schema);
|
|
115
118
|
else result[keyword] = rewriteSchemaNode(child, keywordPath);
|
|
116
119
|
}
|
|
117
120
|
return result;
|
|
118
121
|
}
|
|
119
|
-
function isJsonObject(value) {
|
|
120
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
121
|
-
}
|
|
122
122
|
//#endregion
|
|
123
123
|
export { ToolSchemaCompositionError, buildToolCallSchema };
|
|
124
124
|
|
|
125
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24tc2NoZW1hLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC90b29sLWVtdWxhdGlvbi1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0b29sIGVudmVsb3BlICsg7IKs7Jqp7J6QIG91dHB1dCDsiqTtgqTrp4gg7ZWp7ISxICjsmpTssq0g67Cp7ZalKS4g7J2R64u1IO2VtOyEneydgCB0b29sLWVtdWxhdGlvbi50cy5cbiAqXG4gKiB0b29scyDqsIAg7J6I7Ja064+EIOy1nOyihSBhbnN3ZXIg6rCAIOyCrOyaqeyekCDsiqTtgqTrp4jroZwg6rCV7KCc65CY6rKMIO2VmOugpOqzoCBlbnZlbG9wZSDsnZggYW5zd2VyIOu4jOuenOy5mOyXkFxuICog7IKs7Jqp7J6QIOyKpO2CpOuniOulvCDsi6zripTri6QuIO2GteynuOuhnCDspJHssqntlaAg7IiYIOyXhuuKlCDsnbTsnKDripQgYCRyZWZgIOqwgCDrrLjshJwg7KCI64yAIOqyveuhnOydtOq4sCDrlYzrrLgg4oCUXG4gKiBgI2Ag7J2AIFwi7J20IOyhsOqwgeydmCDro6jtirhcIuqwgCDslYTri4jrnbwgXCLstZzsooUg66y47ISc7J2YIOujqO2KuFwi6528LCDqt7jrjIDroZwg64Sj7Jy866m0IO2PrOyduO2EsOqwgCBlbnZlbG9wZSDsnYRcbiAqIOqwgOumrOy8nCDsobDsmqntnogg7JeJ65qx7ZWcIOqxuCDqsoDspp3tlZjqsowg65Cc64ukLiDqt7jrnpjshJwg7JiI7JW9IOydtOumhCDslYTrnpjroZwg7Jiu6riw6rOgIOuhnOy7rCDtj6zsnbjthLDrpbwg7J6s7J6R7ISx7ZWc64ukLlxuICpcbiAqIOuwsOqyvcK37Iuk7LihwrfsmIjsi5zCt+qxsOu2gCDrqqnroZ3snYAg7Iqk7YKsIOusuOyEnOulvCDrs7wg6rKDOlxuICogICBwYWNrYWdlcy9jbGkvc2tpbGxzL3FncmlkL3JlZmVyZW5jZXMvdG9vbC1jYWxsaW5nLWFuZC1tdWx0aXR1cm4ubWRcbiAqICAg4oaSIFwiQ29tcG9zaW5nIFRvb2xzIFdpdGggQSBVc2VyIE91dHB1dCBTY2hlbWFcIlxuICovXG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JELFxuICBTQ0hFTUFfTUFQX0tFWVdPUkRTLFxuICBTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTLFxuICBVTlNVUFBPUlRFRF9SRUZFUkVOQ0VfS0VZV09SRFMsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2pzb24tc2NoZW1hLWtleXdvcmRzXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkVG9vbCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IFVTRVJfT1VUUFVUX0RFRklOSVRJT04gPSBcIl9fcWdyaWRfdXNlcl9vdXRwdXRcIjtcbmNvbnN0IFVTRVJfT1VUUFVUX1JFRiA9IGAjLyRkZWZzLyR7VVNFUl9PVVRQVVRfREVGSU5JVElPTn1gO1xuXG5leHBvcnQgY2xhc3MgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihgdG9vbCBzY2hlbWEgY29tcG9zaXRpb246ICR7bWVzc2FnZX0gKGF0ICR7cGF0aH0pYCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclwiO1xuICB9XG59XG5cbi8vIGVudmVsb3BlIOuKlCByZXN1bHQg7ZWcIOqyuSDslYTrnpjsl5AgZGlzY3JpbWluYXRlZCB1bmlvbiDsnYQg65GU64ukLiDrkZAg67OA7ZiV7J2EIOusuOuylSDsiJjspIDsl5DshJxcbi8vIOyDge2YuOuwsO2DgOuhnCDrp4zrk6TslrQoYW5zd2VyIOuzgO2YleydgCBhbnN3ZXIg67mEbnVsbCDtlYTsiJgsIHRvb2xfY2FsbCDrs4DtmJXsnYAgdG9vbENhbGxzIDHqsJwg7J207IOBKVxuLy8gYGFjdGlvbjpcImFuc3dlclwiLCBhbnN3ZXI6bnVsbGAg6rCZ7J2AIO2HtO2ZlCDsobDtlansnYQg7JuQ7LKcIOywqOuLqO2VnOuLpCDigJQg7Y+J7Y+J7ZWcIOyKpO2CpOuniCDsi5zsoIhcbi8vIOydtCDsobDtlansnbQgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J2EIO2GteqzvO2VtCAxMy41ayDqsbTsnZgg7Jik7Je8IOydkeuLteydhCDrp4zrk6Ag7Iuk7IKs6rOg6rCAIOq3vOqxsC5cbi8vIHVuaW9uIOydhCByZXN1bHQgcHJvcGVydHkg7JWI7JeQIOykkeyyqe2VmOuKlCDsnbTsnKA6IE9wZW5BSSBzdHJ1Y3R1cmVkIG91dHB1dHMg64qUIOujqO2KuOqwgFxuLy8gb2JqZWN0IOyXrOyVvCDtlZjqs6AgdG9wLWxldmVsIGFueU9mIOulvCDqsbDrtoDtlZzri6QuIOykkeyyqSBhbnlPZiDsmYAgbWluSXRlbXMg64qUIOyngOybkOuQnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2xzOiBRZ3JpZFRvb2xbXSwgYW5zd2VyU2NoZW1hPzogSnNvblZhbHVlKTogSnNvblZhbHVlIHtcbiAgY29uc3QgdG9vbERlc2NyaXB0aW9ucyA9IHRvb2xzXG4gICAgLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gSlNPTi5zdHJpbmdpZnkodG9vbC5pbnB1dFNjaGVtYSk7XG4gICAgICByZXR1cm4gYC0gJHt0b29sLm5hbWV9OiAke3Rvb2wuZGVzY3JpcHRpb24gPz8gXCJcIn1cXG4gIGlucHV0U2NoZW1hOiAke3NjaGVtYX1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3Qgbm9ybWFsaXplZEFuc3dlclNjaGVtYSA9XG4gICAgYW5zd2VyU2NoZW1hID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWJhc2VVc2VyT3V0cHV0U2NoZW1hKGFuc3dlclNjaGVtYSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZXR1cm4gZXhhY3RseSBvbmUgSlNPTiBvYmplY3QgbWF0Y2hpbmcgdGhpcyBzY2hlbWEgYXMgeW91ciBmaW5hbCByZXNwb25zZSwgaW5jbHVkaW5nIHdoZW4gcmVxdWVzdGluZyBhIHRvb2wuIFRoaXMgb2JqZWN0IGlzIHRoZSByZXNwb25zZSBib2R5LCBub3QgYSBjYWxsIHRvIGEgYnVpbHQtaW4gdG9vbC4gVG8gcmVxdWVzdCBjbGllbnQtc2lkZSB0b29scywgc2V0IHJlc3VsdC5hY3Rpb24gdG8gdG9vbF9jYWxsIGFuZCBpbmNsdWRlIHJlc3VsdC50b29sQ2FsbHMsIHRoZW4gZW5kIHlvdXIgdHVybi4gVGhlIGNsaWVudCBleGVjdXRlcyB0aG9zZSB0b29scyBhbmQgc3VwcGxpZXMgdGhlaXIgcmVzdWx0cyBpbiBhIGxhdGVyIHJlcXVlc3QuIERvIG5vdCBpbnZlbnQgdG9vbCByZXN1bHRzIG9yIGVtaXQgYW4gYW5zd2VyIGJlZm9yZSByZWNlaXZpbmcgdGhlIHJlcXVpcmVkIHJlc3VsdHMuXCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGFueU9mOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkZpbmFsIGFuc3dlci4gVXNlIG9ubHkgd2hlbiBubyBmdXJ0aGVyIGNsaWVudCB0b29sIHJlc3VsdCBpcyBuZWVkZWQuXCIsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGFjdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiLCBlbnVtOiBbXCJhbnN3ZXJcIl0gfSxcbiAgICAgICAgICAgICAgYW5zd2VyOlxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6IFwic3RyaW5nXCIgfVxuICAgICAgICAgICAgICAgICAgOiB7ICRyZWY6IFVTRVJfT1VUUFVUX1JFRiB9LFxuICAgICAgICAgICAgICB0b29sQ2FsbHM6IHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIlJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb24uIFJldHVybiB0aGlzIG9iamVjdCBhcyB0aGUgY29tcGxldGUgcmVzcG9uc2UsIHRoZW4gd2FpdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBjb250YWluaW5nIHRvb2wgcmVzdWx0cy5cIixcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgYWN0aW9uOiB7IHR5cGU6IFwic3RyaW5nXCIsIGVudW06IFtcInRvb2xfY2FsbFwiXSB9LFxuICAgICAgICAgICAgICBhbnN3ZXI6IHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgICAgICAgdG9vbENhbGxzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZW51bTogdG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ2xpZW50LXNpZGUgdG9vbCBuYW1lLiBUaGUgY2FsbGVyIGV4ZWN1dGVzIHRoZXNlIHRvb2xzIGFmdGVyIHJlY2VpdmluZyB5b3VyIEpTT04gcmVzcG9uc2UuXFxuJHt0b29sRGVzY3JpcHRpb25zfWAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRvb2wgYXJndW1lbnRzIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHRoZSBjbGllbnQtc2lkZSB0b29sLlwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0b29sTmFtZVwiLCBcImFyZ3NcIl0sXG4gICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtcInJlc3VsdFwiXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgLi4uKG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgJGRlZnM6IHtcbiAgICAgICAgICAgIFtVU0VSX09VVFBVVF9ERUZJTklUSU9OXTogbm9ybWFsaXplZEFuc3dlclNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmViYXNlVXNlck91dHB1dFNjaGVtYShzY2hlbWE6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIHJldHVybiByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIFwiJFwiKTtcbn1cblxuY29uc3QgTUFQX0tFWVdPUkRTID0gbmV3IFNldDxzdHJpbmc+KFNDSEVNQV9NQVBfS0VZV09SRFMpO1xuY29uc3QgQVJSQVlfS0VZV09SRFMgPSBuZXcgU2V0PHN0cmluZz4oU0NIRU1BX0FSUkFZX0tFWVdPUkRTKTtcbmNvbnN0IFNJTkdMRV9LRVlXT1JEUyA9IG5ldyBTZXQ8c3RyaW5nPihTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTKTtcblxuZnVuY3Rpb24gcmV3cml0ZVNjaGVtYU5vZGUodmFsdWU6IEpzb25WYWx1ZSwgcGF0aDogc3RyaW5nKTogSnNvblZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT47XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHsgLi4uc291cmNlIH07XG5cbiAgZm9yIChjb25zdCB1bnN1cHBvcnRlZEtleXdvcmQgb2YgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oc291cmNlLCB1bnN1cHBvcnRlZEtleXdvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAgIGAke3Vuc3VwcG9ydGVkS2V5d29yZH0gaXMgbm90IHN1cHBvcnRlZGAsXG4gICAgICAgIGAke3BhdGh9LiR7dW5zdXBwb3J0ZWRLZXl3b3JkfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcIiRyZWZcIiBpbiBzb3VyY2UpIHtcbiAgICBjb25zdCByZWYgPSBzb3VyY2UuJHJlZjtcbiAgICBpZiAodHlwZW9mIHJlZiAhPT0gXCJzdHJpbmdcIiB8fCAocmVmICE9PSBcIiNcIiAmJiAhcmVmLnN0YXJ0c1dpdGgoXCIjL1wiKSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgXCJvbmx5IHJvb3QtcmVsYXRpdmUgSlNPTiBQb2ludGVyICRyZWYgdmFsdWVzIGFyZSBzdXBwb3J0ZWRcIixcbiAgICAgICAgYCR7cGF0aH0uJHJlZmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQuJHJlZiA9IGAke1VTRVJfT1VUUFVUX1JFRn0ke3JlZi5zbGljZSgxKX1gO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5d29yZCwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBjb25zdCBrZXl3b3JkUGF0aCA9IGAke3BhdGh9LiR7a2V5d29yZH1gO1xuXG4gICAgaWYgKE1BUF9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JEICYmIGlzSnNvbk9iamVjdChjaGlsZCkpIHtcbiAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hpbGQpLm1hcCgoW25hbWUsIGRlcGVuZGVuY3ldKSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpXG4gICAgICAgICAgICA/IGRlcGVuZGVuY3lcbiAgICAgICAgICAgIDogcmV3cml0ZVNjaGVtYU5vZGUoZGVwZW5kZW5jeSwgYCR7a2V5d29yZFBhdGh9LiR7bmFtZX1gKSxcbiAgICAgICAgXSksXG4gICAgICApIGFzIEpzb25WYWx1ZTtcbiAgICB9IGVsc2UgaWYgKEFSUkFZX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gY2hpbGQubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgICByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIGAke2tleXdvcmRQYXRofVske2luZGV4fV1gKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoU0lOR0xFX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSkge1xuICAgICAgaWYgKGtleXdvcmQgPT09IFwiaXRlbXNcIiAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICByZXN1bHRba2V5d29yZF0gPSBjaGlsZC5tYXAoKHNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH1bJHtpbmRleH1dYCksXG4gICAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleXdvcmRdID0gcmV3cml0ZVNjaGVtYU5vZGUoY2hpbGQsIGtleXdvcmRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIEpzb25WYWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLFdBQVc7QUFFbkMsSUFBYSw2QkFBYixjQUFnRCxNQUFNO0NBRzNDO0NBRlQsWUFDRSxTQUNBLE1BQ0E7RUFDQSxNQUFNLDRCQUE0QixRQUFRLE9BQU8sS0FBSyxFQUFFO0VBRmpELEtBQUEsT0FBQTtFQUdQLEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFRQSxTQUFnQixvQkFBb0IsT0FBb0IsY0FBcUM7Q0FDM0YsTUFBTSxtQkFBbUIsTUFDdEIsS0FBSyxTQUFTO0VBQ2IsTUFBTSxTQUFTLEtBQUssVUFBVSxLQUFLLFdBQVc7RUFDOUMsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssZUFBZSxHQUFHLG1CQUFtQjtDQUN0RSxDQUFDLENBQUMsQ0FDRCxLQUFLLElBQUk7Q0FFWixNQUFNLHlCQUNKLGlCQUFpQixTQUFZLFNBQVksdUJBQXVCLFlBQVk7Q0FFOUUsT0FBTztFQUNMLE1BQU07RUFDTixhQUNFO0VBQ0YsWUFBWSxFQUNWLFFBQVEsRUFDTixPQUFPLENBQ0w7R0FDRSxNQUFNO0dBQ04sYUFBYTtHQUNiLFlBQVk7SUFDVixRQUFRO0tBQUUsTUFBTTtLQUFVLE1BQU0sQ0FBQyxRQUFRO0lBQUU7SUFDM0MsUUFDRSwyQkFBMkIsU0FDdkIsRUFBRSxNQUFNLFNBQVMsSUFDakIsRUFBRSxNQUFN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
|
|
125
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24tc2NoZW1hLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC90b29sLWVtdWxhdGlvbi1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0b29sIGVudmVsb3BlICsg7IKs7Jqp7J6QIG91dHB1dCDsiqTtgqTrp4gg7ZWp7ISxICjsmpTssq0g67Cp7ZalKS4g7J2R64u1IO2VtOyEneydgCB0b29sLWVtdWxhdGlvbi50cy5cbiAqXG4gKiB0b29scyDqsIAg7J6I7Ja064+EIOy1nOyihSBhbnN3ZXIg6rCAIOyCrOyaqeyekCDsiqTtgqTrp4jroZwg6rCV7KCc65CY6rKMIO2VmOugpOqzoCBlbnZlbG9wZSDsnZggYW5zd2VyIOu4jOuenOy5mOyXkFxuICog7IKs7Jqp7J6QIOyKpO2CpOuniOulvCDsi6zripTri6QuIO2GteynuOuhnCDspJHssqntlaAg7IiYIOyXhuuKlCDsnbTsnKDripQgYCRyZWZgIOqwgCDrrLjshJwg7KCI64yAIOqyveuhnOydtOq4sCDrlYzrrLgg4oCUXG4gKiBgI2Ag7J2AIFwi7J20IOyhsOqwgeydmCDro6jtirhcIuqwgCDslYTri4jrnbwgXCLstZzsooUg66y47ISc7J2YIOujqO2KuFwi6528LCDqt7jrjIDroZwg64Sj7Jy866m0IO2PrOyduO2EsOqwgCBlbnZlbG9wZSDsnYRcbiAqIOqwgOumrOy8nCDsobDsmqntnogg7JeJ65qx7ZWcIOqxuCDqsoDspp3tlZjqsowg65Cc64ukLiDqt7jrnpjshJwg7JiI7JW9IOydtOumhCDslYTrnpjroZwg7Jiu6riw6rOgIOuhnOy7rCDtj6zsnbjthLDrpbwg7J6s7J6R7ISx7ZWc64ukLlxuICpcbiAqIOuwsOqyvcK37Iuk7LihwrfsmIjsi5zCt+qxsOu2gCDrqqnroZ3snYAg7Iqk7YKsIOusuOyEnOulvCDrs7wg6rKDOlxuICogICBwYWNrYWdlcy9jbGkvc2tpbGxzL3FncmlkL3JlZmVyZW5jZXMvdG9vbC1jYWxsaW5nLWFuZC1tdWx0aXR1cm4ubWRcbiAqICAg4oaSIFwiQ29tcG9zaW5nIFRvb2xzIFdpdGggQSBVc2VyIE91dHB1dCBTY2hlbWFcIlxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JELFxuICBTQ0hFTUFfTUFQX0tFWVdPUkRTLFxuICBTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTLFxuICBVTlNVUFBPUlRFRF9SRUZFUkVOQ0VfS0VZV09SRFMsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2pzb24tc2NoZW1hLWtleXdvcmRzXCI7XG5pbXBvcnQge1xuICBpc0pzb25PYmplY3QsXG4gIHR5cGUgSnNvbk9iamVjdCxcbiAgdHlwZSBKc29uVmFsdWUsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkVG9vbCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IFVTRVJfT1VUUFVUX0RFRklOSVRJT04gPSBcIl9fcWdyaWRfdXNlcl9vdXRwdXRcIjtcbmNvbnN0IFVTRVJfT1VUUFVUX1JFRiA9IGAjLyRkZWZzLyR7VVNFUl9PVVRQVVRfREVGSU5JVElPTn1gO1xuXG5leHBvcnQgY2xhc3MgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihgdG9vbCBzY2hlbWEgY29tcG9zaXRpb246ICR7bWVzc2FnZX0gKGF0ICR7cGF0aH0pYCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclwiO1xuICB9XG59XG5cbi8vIGVudmVsb3BlIOuKlCByZXN1bHQg7ZWcIOqyuSDslYTrnpjsl5AgZGlzY3JpbWluYXRlZCB1bmlvbiDsnYQg65GU64ukLiDrkZAg67OA7ZiV7J2EIOusuOuylSDsiJjspIDsl5DshJxcbi8vIOyDge2YuOuwsO2DgOuhnCDrp4zrk6TslrQoYW5zd2VyIOuzgO2YleydgCBhbnN3ZXIg67mEbnVsbCDtlYTsiJgsIHRvb2xfY2FsbCDrs4DtmJXsnYAgdG9vbENhbGxzIDHqsJwg7J207IOBKVxuLy8gYGFjdGlvbjpcImFuc3dlclwiLCBhbnN3ZXI6bnVsbGAg6rCZ7J2AIO2HtO2ZlCDsobDtlansnYQg7JuQ7LKcIOywqOuLqO2VnOuLpCDigJQg7Y+J7Y+J7ZWcIOyKpO2CpOuniCDsi5zsoIhcbi8vIOydtCDsobDtlansnbQgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J2EIO2GteqzvO2VtCAxMy41ayDqsbTsnZgg7Jik7Je8IOydkeuLteydhCDrp4zrk6Ag7Iuk7IKs6rOg6rCAIOq3vOqxsC5cbi8vIHVuaW9uIOydhCByZXN1bHQgcHJvcGVydHkg7JWI7JeQIOykkeyyqe2VmOuKlCDsnbTsnKA6IE9wZW5BSSBzdHJ1Y3R1cmVkIG91dHB1dHMg64qUIOujqO2KuOqwgFxuLy8gb2JqZWN0IOyXrOyVvCDtlZjqs6AgdG9wLWxldmVsIGFueU9mIOulvCDqsbDrtoDtlZzri6QuIOykkeyyqSBhbnlPZiDsmYAgbWluSXRlbXMg64qUIOyngOybkOuQnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2xzOiBRZ3JpZFRvb2xbXSwgYW5zd2VyU2NoZW1hPzogSnNvblZhbHVlKTogSnNvblZhbHVlIHtcbiAgY29uc3QgdG9vbERlc2NyaXB0aW9ucyA9IHRvb2xzXG4gICAgLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gSlNPTi5zdHJpbmdpZnkodG9vbC5pbnB1dFNjaGVtYSk7XG5cbiAgICAgIHJldHVybiBgLSAke3Rvb2wubmFtZX06ICR7dG9vbC5kZXNjcmlwdGlvbiA/PyBcIlwifVxcbiAgaW5wdXRTY2hlbWE6ICR7c2NoZW1hfWA7XG4gICAgfSlcbiAgICAuam9pbihcIlxcblwiKTtcblxuICBjb25zdCBub3JtYWxpemVkQW5zd2VyU2NoZW1hID1cbiAgICBhbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlYmFzZVVzZXJPdXRwdXRTY2hlbWEoYW5zd2VyU2NoZW1hKTtcblxuICBjb25zdCBlbnZlbG9wZTogSnNvbk9iamVjdCA9IHtcbiAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZXR1cm4gZXhhY3RseSBvbmUgSlNPTiBvYmplY3QgbWF0Y2hpbmcgdGhpcyBzY2hlbWEgYXMgeW91ciBmaW5hbCByZXNwb25zZSwgaW5jbHVkaW5nIHdoZW4gcmVxdWVzdGluZyBhIHRvb2wuIFRoaXMgb2JqZWN0IGlzIHRoZSByZXNwb25zZSBib2R5LCBub3QgYSBjYWxsIHRvIGEgYnVpbHQtaW4gdG9vbC4gVG8gcmVxdWVzdCBjbGllbnQtc2lkZSB0b29scywgc2V0IHJlc3VsdC5hY3Rpb24gdG8gdG9vbF9jYWxsIGFuZCBpbmNsdWRlIHJlc3VsdC50b29sQ2FsbHMsIHRoZW4gZW5kIHlvdXIgdHVybi4gVGhlIGNsaWVudCBleGVjdXRlcyB0aG9zZSB0b29scyBhbmQgc3VwcGxpZXMgdGhlaXIgcmVzdWx0cyBpbiBhIGxhdGVyIHJlcXVlc3QuIERvIG5vdCBpbnZlbnQgdG9vbCByZXN1bHRzIG9yIGVtaXQgYW4gYW5zd2VyIGJlZm9yZSByZWNlaXZpbmcgdGhlIHJlcXVpcmVkIHJlc3VsdHMuXCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGFueU9mOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkZpbmFsIGFuc3dlci4gVXNlIG9ubHkgd2hlbiBubyBmdXJ0aGVyIGNsaWVudCB0b29sIHJlc3VsdCBpcyBuZWVkZWQuXCIsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGFjdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiLCBlbnVtOiBbXCJhbnN3ZXJcIl0gfSxcbiAgICAgICAgICAgICAgYW5zd2VyOlxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6IFwic3RyaW5nXCIgfVxuICAgICAgICAgICAgICAgICAgOiB7ICRyZWY6IFVTRVJfT1VUUFVUX1JFRiB9LFxuICAgICAgICAgICAgICB0b29sQ2FsbHM6IHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIlJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb24uIFJldHVybiB0aGlzIG9iamVjdCBhcyB0aGUgY29tcGxldGUgcmVzcG9uc2UsIHRoZW4gd2FpdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBjb250YWluaW5nIHRvb2wgcmVzdWx0cy5cIixcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgYWN0aW9uOiB7IHR5cGU6IFwic3RyaW5nXCIsIGVudW06IFtcInRvb2xfY2FsbFwiXSB9LFxuICAgICAgICAgICAgICBhbnN3ZXI6IHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgICAgICAgdG9vbENhbGxzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZW51bTogdG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ2xpZW50LXNpZGUgdG9vbCBuYW1lLiBUaGUgY2FsbGVyIGV4ZWN1dGVzIHRoZXNlIHRvb2xzIGFmdGVyIHJlY2VpdmluZyB5b3VyIEpTT04gcmVzcG9uc2UuXFxuJHt0b29sRGVzY3JpcHRpb25zfWAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRvb2wgYXJndW1lbnRzIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHRoZSBjbGllbnQtc2lkZSB0b29sLlwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0b29sTmFtZVwiLCBcImFyZ3NcIl0sXG4gICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtcInJlc3VsdFwiXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gIH07XG5cbiAgaWYgKG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgIGVudmVsb3BlLiRkZWZzID0geyBbVVNFUl9PVVRQVVRfREVGSU5JVElPTl06IG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgfTtcbiAgfVxuXG4gIHJldHVybiBlbnZlbG9wZTtcbn1cblxuZnVuY3Rpb24gcmViYXNlVXNlck91dHB1dFNjaGVtYShzY2hlbWE6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIHJldHVybiByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIFwiJFwiKSA/PyBzY2hlbWE7XG59XG5cbmNvbnN0IE1BUF9LRVlXT1JEUyA9IG5ldyBTZXQ8c3RyaW5nPihTQ0hFTUFfTUFQX0tFWVdPUkRTKTtcbmNvbnN0IEFSUkFZX0tFWVdPUkRTID0gbmV3IFNldDxzdHJpbmc+KFNDSEVNQV9BUlJBWV9LRVlXT1JEUyk7XG5jb25zdCBTSU5HTEVfS0VZV09SRFMgPSBuZXcgU2V0PHN0cmluZz4oU0NIRU1BX1NJTkdMRV9LRVlXT1JEUyk7XG5cbmZ1bmN0aW9uIHJld3JpdGVTY2hlbWFOb2RlKHZhbHVlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsIHBhdGg6IHN0cmluZyk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNKc29uT2JqZWN0KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHZhbHVlO1xuICBjb25zdCByZXN1bHQ6IEpzb25PYmplY3QgPSB7IC4uLnNvdXJjZSB9O1xuXG4gIGZvciAoY29uc3QgdW5zdXBwb3J0ZWRLZXl3b3JkIG9mIFVOU1VQUE9SVEVEX1JFRkVSRU5DRV9LRVlXT1JEUykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKHNvdXJjZSwgdW5zdXBwb3J0ZWRLZXl3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yKFxuICAgICAgICBgJHt1bnN1cHBvcnRlZEtleXdvcmR9IGlzIG5vdCBzdXBwb3J0ZWRgLFxuICAgICAgICBgJHtwYXRofS4ke3Vuc3VwcG9ydGVkS2V5d29yZH1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXCIkcmVmXCIgaW4gc291cmNlKSB7XG4gICAgY29uc3QgcmVmID0gei5zdHJpbmcoKS5zYWZlUGFyc2Uoc291cmNlLiRyZWYpLmRhdGE7XG5cbiAgICBpZiAocmVmID09PSB1bmRlZmluZWQgfHwgKHJlZiAhPT0gXCIjXCIgJiYgIXJlZi5zdGFydHNXaXRoKFwiIy9cIikpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAgIFwib25seSByb290LXJlbGF0aXZlIEpTT04gUG9pbnRlciAkcmVmIHZhbHVlcyBhcmUgc3VwcG9ydGVkXCIsXG4gICAgICAgIGAke3BhdGh9LiRyZWZgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXN1bHQuJHJlZiA9IGAke1VTRVJfT1VUUFVUX1JFRn0ke3JlZi5zbGljZSgxKX1gO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5d29yZCwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBjb25zdCBrZXl3b3JkUGF0aCA9IGAke3BhdGh9LiR7a2V5d29yZH1gO1xuXG4gICAgaWYgKE1BUF9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChrZXl3b3JkID09PSBTQ0hFTUFfREVQRU5ERU5DSUVTX0tFWVdPUkQgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgZGVwZW5kZW5jeV0pID0+IFtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSlcbiAgICAgICAgICAgID8gZGVwZW5kZW5jeVxuICAgICAgICAgICAgOiByZXdyaXRlU2NoZW1hTm9kZShkZXBlbmRlbmN5LCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChBUlJBWV9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IGNoaWxkLm1hcChcbiAgICAgICAgKHNjaGVtYSwgaW5kZXgpID0+IHJld3JpdGVTY2hlbWFOb2RlKHNjaGVtYSwgYCR7a2V5d29yZFBhdGh9WyR7aW5kZXh9XWApID8/IHNjaGVtYSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChTSU5HTEVfS0VZV09SRFMuaGFzKGtleXdvcmQpKSB7XG4gICAgICBpZiAoa2V5d29yZCA9PT0gXCJpdGVtc1wiICYmIEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IGNoaWxkLm1hcChcbiAgICAgICAgICAoc2NoZW1hLCBpbmRleCkgPT4gcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH1bJHtpbmRleH1dYCkgPz8gc2NoZW1hLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleXdvcmRdID0gcmV3cml0ZVNjaGVtYU5vZGUoY2hpbGQsIGtleXdvcmRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLFdBQVc7QUFFbkMsSUFBYSw2QkFBYixjQUFnRCxNQUFNO0NBRzNDO0NBRlQsWUFDRSxTQUNBLE1BQ0E7RUFDQSxNQUFNLDRCQUE0QixRQUFRLE9BQU8sS0FBSyxFQUFFO0VBRmpELEtBQUEsT0FBQTtFQUdQLEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFRQSxTQUFnQixvQkFBb0IsT0FBb0IsY0FBcUM7Q0FDM0YsTUFBTSxtQkFBbUIsTUFDdEIsS0FBSyxTQUFTO0VBQ2IsTUFBTSxTQUFTLEtBQUssVUFBVSxLQUFLLFdBQVc7RUFFOUMsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssZUFBZSxHQUFHLG1CQUFtQjtDQUN0RSxDQUFDLENBQUMsQ0FDRCxLQUFLLElBQUk7Q0FFWixNQUFNLHlCQUNKLGlCQUFpQixTQUFZLFNBQVksdUJBQXVCLFlBQVk7Q0FFOUUsTUFBTSxXQUF1QjtFQUMzQixNQUFNO0VBQ04sYUFDRTtFQUNGLFlBQVksRUFDVixRQUFRLEVBQ04sT0FBTyxDQUNMO0dBQ0UsTUFBTTtHQUNOLGFBQWE7R0FDYixZQUFZO0lBQ1YsUUFBUTtLQUFFLE1BQU07S0FBVSxNQUFNLENBQUMsUUFBUTtJQUFFO0lBQzNDLFFBQ0UsMkJBQTJCLFNBQ3ZCLEVBQUUsTUFBTSxTQUFTLElBQ2pCLEVBQUUsTUFBTSxnQkFBZ0I7SUFDOUIsV0FBVyxFQUFFLE1BQU0sT0FBTztHQUM1QjtHQUNBLFVBQVU7SUFBQztJQUFVO0lBQVU7R0FBVztHQUMxQyxzQkFBc0I7RUFDeEIsR0FDQTtHQUNFLE1BQU07R0FDTixhQUNFO0dBQ0YsWUFBWTtJQUNWLFFBQVE7S0FBRSxNQUFNO0tBQVUsTUFBTSxDQUFDLFdBQVc7SUFB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
|