@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,1265 +0,0 @@
|
|
|
1
|
-
//#region ../../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
|
|
2
|
-
let SOURCEMAPPING_URL = "sourceMa";
|
|
3
|
-
SOURCEMAPPING_URL += "ppingURL";
|
|
4
|
-
const isWindows = typeof process < "u" && process.platform === "win32";
|
|
5
|
-
/**
|
|
6
|
-
* Undo {@link wrapId}'s `/@id/` and null byte replacements.
|
|
7
|
-
*/
|
|
8
|
-
function unwrapId(id) {
|
|
9
|
-
return id.startsWith("/@id/") ? id.slice(5).replace("__x00__", "\0") : id;
|
|
10
|
-
}
|
|
11
|
-
const windowsSlashRE = /\\/g;
|
|
12
|
-
function slash(p) {
|
|
13
|
-
return p.replace(windowsSlashRE, "/");
|
|
14
|
-
}
|
|
15
|
-
const postfixRE = /[?#].*$/;
|
|
16
|
-
function cleanUrl(url) {
|
|
17
|
-
return url.replace(postfixRE, "");
|
|
18
|
-
}
|
|
19
|
-
function isPrimitive(value) {
|
|
20
|
-
return !value || typeof value != "object" && typeof value != "function";
|
|
21
|
-
}
|
|
22
|
-
const AsyncFunction = async function() {}.constructor;
|
|
23
|
-
let asyncFunctionDeclarationPaddingLineCount;
|
|
24
|
-
function getAsyncFunctionDeclarationPaddingLineCount() {
|
|
25
|
-
if (asyncFunctionDeclarationPaddingLineCount === void 0) {
|
|
26
|
-
let body = "/*code*/", source = new AsyncFunction("a", "b", body).toString();
|
|
27
|
-
asyncFunctionDeclarationPaddingLineCount = source.slice(0, source.indexOf(body)).split("\n").length - 1;
|
|
28
|
-
}
|
|
29
|
-
return asyncFunctionDeclarationPaddingLineCount;
|
|
30
|
-
}
|
|
31
|
-
function promiseWithResolvers() {
|
|
32
|
-
let resolve, reject;
|
|
33
|
-
return {
|
|
34
|
-
promise: new Promise((_resolve, _reject) => {
|
|
35
|
-
resolve = _resolve, reject = _reject;
|
|
36
|
-
}),
|
|
37
|
-
resolve,
|
|
38
|
-
reject
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
42
|
-
function normalizeWindowsPath(input = "") {
|
|
43
|
-
return input && input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
|
44
|
-
}
|
|
45
|
-
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/;
|
|
46
|
-
const _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
|
|
47
|
-
function cwd() {
|
|
48
|
-
return typeof process < "u" && typeof process.cwd == "function" ? process.cwd().replace(/\\/g, "/") : "/";
|
|
49
|
-
}
|
|
50
|
-
const resolve = function(...arguments_) {
|
|
51
|
-
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
|
52
|
-
let resolvedPath = "", resolvedAbsolute = !1;
|
|
53
|
-
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
|
54
|
-
let path = index >= 0 ? arguments_[index] : cwd();
|
|
55
|
-
!path || path.length === 0 || (resolvedPath = `${path}/${resolvedPath}`, resolvedAbsolute = isAbsolute(path));
|
|
56
|
-
}
|
|
57
|
-
return resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute), resolvedAbsolute && !isAbsolute(resolvedPath) ? `/${resolvedPath}` : resolvedPath.length > 0 ? resolvedPath : ".";
|
|
58
|
-
};
|
|
59
|
-
function normalizeString(path, allowAboveRoot) {
|
|
60
|
-
let res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, char = null;
|
|
61
|
-
for (let index = 0; index <= path.length; ++index) {
|
|
62
|
-
if (index < path.length) char = path[index];
|
|
63
|
-
else if (char === "/") break;
|
|
64
|
-
else char = "/";
|
|
65
|
-
if (char === "/") {
|
|
66
|
-
if (!(lastSlash === index - 1 || dots === 1)) if (dots === 2) {
|
|
67
|
-
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
|
68
|
-
if (res.length > 2) {
|
|
69
|
-
let lastSlashIndex = res.lastIndexOf("/");
|
|
70
|
-
lastSlashIndex === -1 ? (res = "", lastSegmentLength = 0) : (res = res.slice(0, lastSlashIndex), lastSegmentLength = res.length - 1 - res.lastIndexOf("/")), lastSlash = index, dots = 0;
|
|
71
|
-
continue;
|
|
72
|
-
} else if (res.length > 0) {
|
|
73
|
-
res = "", lastSegmentLength = 0, lastSlash = index, dots = 0;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
allowAboveRoot && (res += res.length > 0 ? "/.." : "..", lastSegmentLength = 2);
|
|
78
|
-
} else res.length > 0 ? res += `/${path.slice(lastSlash + 1, index)}` : res = path.slice(lastSlash + 1, index), lastSegmentLength = index - lastSlash - 1;
|
|
79
|
-
lastSlash = index, dots = 0;
|
|
80
|
-
} else char === "." && dots !== -1 ? ++dots : dots = -1;
|
|
81
|
-
}
|
|
82
|
-
return res;
|
|
83
|
-
}
|
|
84
|
-
const isAbsolute = function(p) {
|
|
85
|
-
return _IS_ABSOLUTE_RE.test(p);
|
|
86
|
-
};
|
|
87
|
-
const dirname = function(p) {
|
|
88
|
-
let segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
|
|
89
|
-
return segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0]) && (segments[0] += "/"), segments.join("/") || (isAbsolute(p) ? "/" : ".");
|
|
90
|
-
};
|
|
91
|
-
const textDecoder = new TextDecoder();
|
|
92
|
-
const decodeBase64 = typeof Buffer == "function" && typeof Buffer.from == "function" ? (base64) => Buffer.from(base64, "base64").toString("utf-8") : (base64) => textDecoder.decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
|
|
93
|
-
const percentRegEx = /%/g;
|
|
94
|
-
const backslashRegEx = /\\/g;
|
|
95
|
-
const newlineRegEx = /\n/g;
|
|
96
|
-
const carriageReturnRegEx = /\r/g;
|
|
97
|
-
const tabRegEx = /\t/g;
|
|
98
|
-
const questionRegex = /\?/g;
|
|
99
|
-
const hashRegex = /#/g;
|
|
100
|
-
function encodePathChars(filepath) {
|
|
101
|
-
return filepath.indexOf("%") !== -1 && (filepath = filepath.replace(percentRegEx, "%25")), !isWindows && filepath.indexOf("\\") !== -1 && (filepath = filepath.replace(backslashRegEx, "%5C")), filepath.indexOf("\n") !== -1 && (filepath = filepath.replace(newlineRegEx, "%0A")), filepath.indexOf("\r") !== -1 && (filepath = filepath.replace(carriageReturnRegEx, "%0D")), filepath.indexOf(" ") !== -1 && (filepath = filepath.replace(tabRegEx, "%09")), filepath;
|
|
102
|
-
}
|
|
103
|
-
const posixDirname = dirname;
|
|
104
|
-
const posixResolve = resolve;
|
|
105
|
-
function posixPathToFileHref(posixPath) {
|
|
106
|
-
let resolved = posixResolve(posixPath), filePathLast = posixPath.charCodeAt(posixPath.length - 1);
|
|
107
|
-
return (filePathLast === 47 || isWindows && filePathLast === 92) && resolved[resolved.length - 1] !== "/" && (resolved += "/"), resolved = encodePathChars(resolved), resolved.indexOf("?") !== -1 && (resolved = resolved.replace(questionRegex, "%3F")), resolved.indexOf("#") !== -1 && (resolved = resolved.replace(hashRegex, "%23")), new URL(`file://${resolved}`).href;
|
|
108
|
-
}
|
|
109
|
-
function toWindowsPath(path) {
|
|
110
|
-
return path.replace(/\//g, "\\");
|
|
111
|
-
}
|
|
112
|
-
var comma = 44;
|
|
113
|
-
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
114
|
-
var intToChar = /* @__PURE__ */ new Uint8Array(64);
|
|
115
|
-
var charToInt = /* @__PURE__ */ new Uint8Array(128);
|
|
116
|
-
for (let i = 0; i < chars.length; i++) {
|
|
117
|
-
let c = chars.charCodeAt(i);
|
|
118
|
-
intToChar[i] = c, charToInt[c] = i;
|
|
119
|
-
}
|
|
120
|
-
function decodeInteger(reader, relative) {
|
|
121
|
-
let value = 0, shift = 0, integer = 0;
|
|
122
|
-
do
|
|
123
|
-
integer = charToInt[reader.next()], value |= (integer & 31) << shift, shift += 5;
|
|
124
|
-
while (integer & 32);
|
|
125
|
-
let shouldNegate = value & 1;
|
|
126
|
-
return value >>>= 1, shouldNegate && (value = -2147483648 | -value), relative + value;
|
|
127
|
-
}
|
|
128
|
-
function hasMoreVlq(reader, max) {
|
|
129
|
-
return reader.pos >= max ? !1 : reader.peek() !== comma;
|
|
130
|
-
}
|
|
131
|
-
var StringReader = class {
|
|
132
|
-
constructor(buffer) {
|
|
133
|
-
this.pos = 0, this.buffer = buffer;
|
|
134
|
-
}
|
|
135
|
-
next() {
|
|
136
|
-
return this.buffer.charCodeAt(this.pos++);
|
|
137
|
-
}
|
|
138
|
-
peek() {
|
|
139
|
-
return this.buffer.charCodeAt(this.pos);
|
|
140
|
-
}
|
|
141
|
-
indexOf(char) {
|
|
142
|
-
let { buffer, pos } = this, idx = buffer.indexOf(char, pos);
|
|
143
|
-
return idx === -1 ? buffer.length : idx;
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
function decode(mappings) {
|
|
147
|
-
let { length } = mappings, reader = new StringReader(mappings), decoded = [], genColumn = 0, sourcesIndex = 0, sourceLine = 0, sourceColumn = 0, namesIndex = 0;
|
|
148
|
-
do {
|
|
149
|
-
let semi = reader.indexOf(";"), line = [], sorted = !0, lastCol = 0;
|
|
150
|
-
for (genColumn = 0; reader.pos < semi;) {
|
|
151
|
-
let seg;
|
|
152
|
-
genColumn = decodeInteger(reader, genColumn), genColumn < lastCol && (sorted = !1), lastCol = genColumn, hasMoreVlq(reader, semi) ? (sourcesIndex = decodeInteger(reader, sourcesIndex), sourceLine = decodeInteger(reader, sourceLine), sourceColumn = decodeInteger(reader, sourceColumn), hasMoreVlq(reader, semi) ? (namesIndex = decodeInteger(reader, namesIndex), seg = [
|
|
153
|
-
genColumn,
|
|
154
|
-
sourcesIndex,
|
|
155
|
-
sourceLine,
|
|
156
|
-
sourceColumn,
|
|
157
|
-
namesIndex
|
|
158
|
-
]) : seg = [
|
|
159
|
-
genColumn,
|
|
160
|
-
sourcesIndex,
|
|
161
|
-
sourceLine,
|
|
162
|
-
sourceColumn
|
|
163
|
-
]) : seg = [genColumn], line.push(seg), reader.pos++;
|
|
164
|
-
}
|
|
165
|
-
sorted || sort(line), decoded.push(line), reader.pos = semi + 1;
|
|
166
|
-
} while (reader.pos <= length);
|
|
167
|
-
return decoded;
|
|
168
|
-
}
|
|
169
|
-
function sort(line) {
|
|
170
|
-
line.sort(sortComparator);
|
|
171
|
-
}
|
|
172
|
-
function sortComparator(a, b) {
|
|
173
|
-
return a[0] - b[0];
|
|
174
|
-
}
|
|
175
|
-
var COLUMN = 0;
|
|
176
|
-
var SOURCES_INDEX = 1;
|
|
177
|
-
var SOURCE_LINE = 2;
|
|
178
|
-
var SOURCE_COLUMN = 3;
|
|
179
|
-
var NAMES_INDEX = 4;
|
|
180
|
-
var found = !1;
|
|
181
|
-
function binarySearch(haystack, needle, low, high) {
|
|
182
|
-
for (; low <= high;) {
|
|
183
|
-
let mid = low + (high - low >> 1), cmp = haystack[mid][COLUMN] - needle;
|
|
184
|
-
if (cmp === 0) return found = !0, mid;
|
|
185
|
-
cmp < 0 ? low = mid + 1 : high = mid - 1;
|
|
186
|
-
}
|
|
187
|
-
return found = !1, low - 1;
|
|
188
|
-
}
|
|
189
|
-
function upperBound(haystack, needle, index) {
|
|
190
|
-
for (let i = index + 1; i < haystack.length && haystack[i][COLUMN] === needle; index = i++);
|
|
191
|
-
return index;
|
|
192
|
-
}
|
|
193
|
-
function lowerBound(haystack, needle, index) {
|
|
194
|
-
for (let i = index - 1; i >= 0 && haystack[i][COLUMN] === needle; index = i--);
|
|
195
|
-
return index;
|
|
196
|
-
}
|
|
197
|
-
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
198
|
-
let { lastKey, lastNeedle, lastIndex } = state, low = 0, high = haystack.length - 1;
|
|
199
|
-
if (key === lastKey) {
|
|
200
|
-
if (needle === lastNeedle) return found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle, lastIndex;
|
|
201
|
-
needle >= lastNeedle ? low = lastIndex === -1 ? 0 : lastIndex : high = lastIndex;
|
|
202
|
-
}
|
|
203
|
-
return state.lastKey = key, state.lastNeedle = needle, state.lastIndex = binarySearch(haystack, needle, low, high);
|
|
204
|
-
}
|
|
205
|
-
var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)";
|
|
206
|
-
var COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)";
|
|
207
|
-
function cast(map) {
|
|
208
|
-
return map;
|
|
209
|
-
}
|
|
210
|
-
function decodedMappings(map) {
|
|
211
|
-
var _a;
|
|
212
|
-
return (_a = cast(map))._decoded || (_a._decoded = decode(cast(map)._encoded));
|
|
213
|
-
}
|
|
214
|
-
function originalPositionFor(map, needle) {
|
|
215
|
-
let { line, column, bias } = needle;
|
|
216
|
-
if (line--, line < 0) throw Error(LINE_GTR_ZERO);
|
|
217
|
-
if (column < 0) throw Error(COL_GTR_EQ_ZERO);
|
|
218
|
-
let decoded = decodedMappings(map);
|
|
219
|
-
if (line >= decoded.length) return OMapping(null, null, null, null);
|
|
220
|
-
let segments = decoded[line], index = traceSegmentInternal(segments, cast(map)._decodedMemo, line, column, bias || 1);
|
|
221
|
-
if (index === -1) return OMapping(null, null, null, null);
|
|
222
|
-
let segment = segments[index];
|
|
223
|
-
if (segment.length === 1) return OMapping(null, null, null, null);
|
|
224
|
-
let { names, resolvedSources } = map;
|
|
225
|
-
return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
|
|
226
|
-
}
|
|
227
|
-
function OMapping(source, line, column, name) {
|
|
228
|
-
return {
|
|
229
|
-
source,
|
|
230
|
-
line,
|
|
231
|
-
column,
|
|
232
|
-
name
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
236
|
-
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
237
|
-
return found ? index = (bias === -1 ? upperBound : lowerBound)(segments, column, index) : bias === -1 && index++, index === -1 || index === segments.length ? -1 : index;
|
|
238
|
-
}
|
|
239
|
-
var DecodedMap = class {
|
|
240
|
-
_encoded;
|
|
241
|
-
_decoded;
|
|
242
|
-
_decodedMemo;
|
|
243
|
-
url;
|
|
244
|
-
file;
|
|
245
|
-
version;
|
|
246
|
-
names = [];
|
|
247
|
-
resolvedSources;
|
|
248
|
-
constructor(map, from) {
|
|
249
|
-
this.map = map;
|
|
250
|
-
let { mappings, names, sources } = map;
|
|
251
|
-
this.version = map.version, this.names = names || [], this._encoded = mappings || "", this._decodedMemo = memoizedState(), this.url = from, this.file = from;
|
|
252
|
-
let originDir = posixDirname(from);
|
|
253
|
-
this.resolvedSources = (sources || []).map((s) => posixResolve(originDir, s || ""));
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
function memoizedState() {
|
|
257
|
-
return {
|
|
258
|
-
lastKey: -1,
|
|
259
|
-
lastNeedle: -1,
|
|
260
|
-
lastIndex: -1
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
function getOriginalPosition(map, needle) {
|
|
264
|
-
let result = originalPositionFor(map, needle);
|
|
265
|
-
return result.column == null ? null : result;
|
|
266
|
-
}
|
|
267
|
-
const MODULE_RUNNER_SOURCEMAPPING_REGEXP = RegExp(`//# ${SOURCEMAPPING_URL}=data:application/json;base64,(.+)`);
|
|
268
|
-
var EvaluatedModuleNode = class {
|
|
269
|
-
importers = /* @__PURE__ */ new Set();
|
|
270
|
-
imports = /* @__PURE__ */ new Set();
|
|
271
|
-
evaluated = !1;
|
|
272
|
-
meta;
|
|
273
|
-
promise;
|
|
274
|
-
exports;
|
|
275
|
-
file;
|
|
276
|
-
map;
|
|
277
|
-
constructor(id, url) {
|
|
278
|
-
this.id = id, this.url = url, this.file = cleanUrl(id);
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
var EvaluatedModules = class {
|
|
282
|
-
idToModuleMap = /* @__PURE__ */ new Map();
|
|
283
|
-
fileToModulesMap = /* @__PURE__ */ new Map();
|
|
284
|
-
urlToIdModuleMap = /* @__PURE__ */ new Map();
|
|
285
|
-
/**
|
|
286
|
-
* Returns the module node by the resolved module ID. Usually, module ID is
|
|
287
|
-
* the file system path with query and/or hash. It can also be a virtual module.
|
|
288
|
-
*
|
|
289
|
-
* Module runner graph will have 1 to 1 mapping with the server module graph.
|
|
290
|
-
* @param id Resolved module ID
|
|
291
|
-
*/
|
|
292
|
-
getModuleById(id) {
|
|
293
|
-
return this.idToModuleMap.get(id);
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Returns all modules related to the file system path. Different modules
|
|
297
|
-
* might have different query parameters or hash, so it's possible to have
|
|
298
|
-
* multiple modules for the same file.
|
|
299
|
-
* @param file The file system path of the module
|
|
300
|
-
*/
|
|
301
|
-
getModulesByFile(file) {
|
|
302
|
-
return this.fileToModulesMap.get(file);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Returns the module node by the URL that was used in the import statement.
|
|
306
|
-
* Unlike module graph on the server, the URL is not resolved and is used as is.
|
|
307
|
-
* @param url Server URL that was used in the import statement
|
|
308
|
-
*/
|
|
309
|
-
getModuleByUrl(url) {
|
|
310
|
-
return this.urlToIdModuleMap.get(unwrapId(url));
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Ensure that module is in the graph. If the module is already in the graph,
|
|
314
|
-
* it will return the existing module node. Otherwise, it will create a new
|
|
315
|
-
* module node and add it to the graph.
|
|
316
|
-
* @param id Resolved module ID
|
|
317
|
-
* @param url URL that was used in the import statement
|
|
318
|
-
*/
|
|
319
|
-
ensureModule(id, url) {
|
|
320
|
-
if (id = normalizeModuleId(id), this.idToModuleMap.has(id)) {
|
|
321
|
-
let moduleNode = this.idToModuleMap.get(id);
|
|
322
|
-
return this.urlToIdModuleMap.set(url, moduleNode), moduleNode;
|
|
323
|
-
}
|
|
324
|
-
let moduleNode = new EvaluatedModuleNode(id, url);
|
|
325
|
-
this.idToModuleMap.set(id, moduleNode), this.urlToIdModuleMap.set(url, moduleNode);
|
|
326
|
-
let fileModules = this.fileToModulesMap.get(moduleNode.file) || /* @__PURE__ */ new Set();
|
|
327
|
-
return fileModules.add(moduleNode), this.fileToModulesMap.set(moduleNode.file, fileModules), moduleNode;
|
|
328
|
-
}
|
|
329
|
-
invalidateModule(node) {
|
|
330
|
-
node.evaluated = !1, node.meta = void 0, node.map = void 0, node.promise = void 0, node.exports = void 0, node.imports.clear();
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Extracts the inlined source map from the module code and returns the decoded
|
|
334
|
-
* source map. If the source map is not inlined, it will return null.
|
|
335
|
-
* @param id Resolved module ID
|
|
336
|
-
*/
|
|
337
|
-
getModuleSourceMapById(id) {
|
|
338
|
-
let mod = this.getModuleById(id);
|
|
339
|
-
if (!mod) return null;
|
|
340
|
-
if (mod.map) return mod.map;
|
|
341
|
-
if (!mod.meta || !("code" in mod.meta)) return null;
|
|
342
|
-
let pattern = `//# ${SOURCEMAPPING_URL}=data:application/json;base64,`, lastIndex = mod.meta.code.lastIndexOf(pattern);
|
|
343
|
-
if (lastIndex === -1) return null;
|
|
344
|
-
let mapString = MODULE_RUNNER_SOURCEMAPPING_REGEXP.exec(mod.meta.code.slice(lastIndex))?.[1];
|
|
345
|
-
return mapString ? (mod.map = new DecodedMap(JSON.parse(decodeBase64(mapString)), mod.file), mod.map) : null;
|
|
346
|
-
}
|
|
347
|
-
clear() {
|
|
348
|
-
this.idToModuleMap.clear(), this.fileToModulesMap.clear(), this.urlToIdModuleMap.clear();
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
const prefixedBuiltins = /* @__PURE__ */ new Set([
|
|
352
|
-
"node:sea",
|
|
353
|
-
"node:sqlite",
|
|
354
|
-
"node:test",
|
|
355
|
-
"node:test/reporters"
|
|
356
|
-
]);
|
|
357
|
-
function normalizeModuleId(file) {
|
|
358
|
-
return prefixedBuiltins.has(file) ? file : slash(file).replace(/^\/@fs\//, isWindows ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/").replace(/^file:\/+/, isWindows ? "" : "/");
|
|
359
|
-
}
|
|
360
|
-
var HMRContext = class {
|
|
361
|
-
newListeners;
|
|
362
|
-
constructor(hmrClient, ownerPath) {
|
|
363
|
-
this.hmrClient = hmrClient, this.ownerPath = ownerPath, hmrClient.dataMap.has(ownerPath) || hmrClient.dataMap.set(ownerPath, {});
|
|
364
|
-
let mod = hmrClient.hotModulesMap.get(ownerPath);
|
|
365
|
-
mod && (mod.callbacks = []);
|
|
366
|
-
let staleListeners = hmrClient.ctxToListenersMap.get(ownerPath);
|
|
367
|
-
if (staleListeners) for (let [event, staleFns] of staleListeners) {
|
|
368
|
-
let listeners = hmrClient.customListenersMap.get(event);
|
|
369
|
-
listeners && hmrClient.customListenersMap.set(event, listeners.filter((l) => !staleFns.includes(l)));
|
|
370
|
-
}
|
|
371
|
-
this.newListeners = /* @__PURE__ */ new Map(), hmrClient.ctxToListenersMap.set(ownerPath, this.newListeners);
|
|
372
|
-
}
|
|
373
|
-
get data() {
|
|
374
|
-
return this.hmrClient.dataMap.get(this.ownerPath);
|
|
375
|
-
}
|
|
376
|
-
accept(deps, callback) {
|
|
377
|
-
if (typeof deps == "function" || !deps) this.acceptDeps([this.ownerPath], ([mod]) => deps?.(mod));
|
|
378
|
-
else if (typeof deps == "string") this.acceptDeps([deps], ([mod]) => callback?.(mod));
|
|
379
|
-
else if (Array.isArray(deps)) this.acceptDeps(deps, callback);
|
|
380
|
-
else throw Error("invalid hot.accept() usage.");
|
|
381
|
-
}
|
|
382
|
-
acceptExports(_, callback) {
|
|
383
|
-
this.acceptDeps([this.ownerPath], ([mod]) => callback?.(mod));
|
|
384
|
-
}
|
|
385
|
-
dispose(cb) {
|
|
386
|
-
this.hmrClient.disposeMap.set(this.ownerPath, cb);
|
|
387
|
-
}
|
|
388
|
-
prune(cb) {
|
|
389
|
-
this.hmrClient.pruneMap.set(this.ownerPath, cb);
|
|
390
|
-
}
|
|
391
|
-
decline() {}
|
|
392
|
-
invalidate(message) {
|
|
393
|
-
let firstInvalidatedBy = this.hmrClient.currentFirstInvalidatedBy ?? this.ownerPath;
|
|
394
|
-
this.hmrClient.notifyListeners("vite:invalidate", {
|
|
395
|
-
path: this.ownerPath,
|
|
396
|
-
message,
|
|
397
|
-
firstInvalidatedBy
|
|
398
|
-
}), this.send("vite:invalidate", {
|
|
399
|
-
path: this.ownerPath,
|
|
400
|
-
message,
|
|
401
|
-
firstInvalidatedBy
|
|
402
|
-
}), this.hmrClient.logger.debug(`invalidate ${this.ownerPath}${message ? `: ${message}` : ""}`);
|
|
403
|
-
}
|
|
404
|
-
on(event, cb) {
|
|
405
|
-
let addToMap = (map) => {
|
|
406
|
-
let existing = map.get(event) || [];
|
|
407
|
-
existing.push(cb), map.set(event, existing);
|
|
408
|
-
};
|
|
409
|
-
addToMap(this.hmrClient.customListenersMap), addToMap(this.newListeners);
|
|
410
|
-
}
|
|
411
|
-
off(event, cb) {
|
|
412
|
-
let removeFromMap = (map) => {
|
|
413
|
-
let existing = map.get(event);
|
|
414
|
-
if (existing === void 0) return;
|
|
415
|
-
let pruned = existing.filter((l) => l !== cb);
|
|
416
|
-
if (pruned.length === 0) {
|
|
417
|
-
map.delete(event);
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
map.set(event, pruned);
|
|
421
|
-
};
|
|
422
|
-
removeFromMap(this.hmrClient.customListenersMap), removeFromMap(this.newListeners);
|
|
423
|
-
}
|
|
424
|
-
send(event, data) {
|
|
425
|
-
this.hmrClient.send({
|
|
426
|
-
type: "custom",
|
|
427
|
-
event,
|
|
428
|
-
data
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
acceptDeps(deps, callback = () => {}) {
|
|
432
|
-
let mod = this.hmrClient.hotModulesMap.get(this.ownerPath) || {
|
|
433
|
-
id: this.ownerPath,
|
|
434
|
-
callbacks: []
|
|
435
|
-
};
|
|
436
|
-
mod.callbacks.push({
|
|
437
|
-
deps,
|
|
438
|
-
fn: callback
|
|
439
|
-
}), this.hmrClient.hotModulesMap.set(this.ownerPath, mod);
|
|
440
|
-
}
|
|
441
|
-
};
|
|
442
|
-
var HMRClient = class {
|
|
443
|
-
hotModulesMap = /* @__PURE__ */ new Map();
|
|
444
|
-
disposeMap = /* @__PURE__ */ new Map();
|
|
445
|
-
pruneMap = /* @__PURE__ */ new Map();
|
|
446
|
-
dataMap = /* @__PURE__ */ new Map();
|
|
447
|
-
customListenersMap = /* @__PURE__ */ new Map();
|
|
448
|
-
ctxToListenersMap = /* @__PURE__ */ new Map();
|
|
449
|
-
currentFirstInvalidatedBy;
|
|
450
|
-
constructor(logger, transport, importUpdatedModule) {
|
|
451
|
-
this.logger = logger, this.transport = transport, this.importUpdatedModule = importUpdatedModule;
|
|
452
|
-
}
|
|
453
|
-
async notifyListeners(event, data) {
|
|
454
|
-
let cbs = this.customListenersMap.get(event);
|
|
455
|
-
cbs && await Promise.allSettled(cbs.map((cb) => cb(data)));
|
|
456
|
-
}
|
|
457
|
-
send(payload) {
|
|
458
|
-
this.transport.send(payload).catch((err) => {
|
|
459
|
-
this.logger.error(err);
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
clear() {
|
|
463
|
-
this.hotModulesMap.clear(), this.disposeMap.clear(), this.pruneMap.clear(), this.dataMap.clear(), this.customListenersMap.clear(), this.ctxToListenersMap.clear();
|
|
464
|
-
}
|
|
465
|
-
async prunePaths(paths) {
|
|
466
|
-
await Promise.all(paths.map((path) => {
|
|
467
|
-
let disposer = this.disposeMap.get(path);
|
|
468
|
-
if (disposer) return disposer(this.dataMap.get(path));
|
|
469
|
-
})), await Promise.all(paths.map((path) => {
|
|
470
|
-
let fn = this.pruneMap.get(path);
|
|
471
|
-
if (fn) return fn(this.dataMap.get(path));
|
|
472
|
-
}));
|
|
473
|
-
}
|
|
474
|
-
warnFailedUpdate(err, path) {
|
|
475
|
-
(!(err instanceof Error) || !err.message.includes("fetch")) && this.logger.error(err), this.logger.error(`Failed to reload ${path}. This could be due to syntax errors or importing non-existent modules. (see errors above)`);
|
|
476
|
-
}
|
|
477
|
-
updateQueue = [];
|
|
478
|
-
pendingUpdateQueue = !1;
|
|
479
|
-
/**
|
|
480
|
-
* buffer multiple hot updates triggered by the same src change
|
|
481
|
-
* so that they are invoked in the same order they were sent.
|
|
482
|
-
* (otherwise the order may be inconsistent because of the http request round trip)
|
|
483
|
-
*/
|
|
484
|
-
async queueUpdate(payload) {
|
|
485
|
-
if (this.updateQueue.push(this.fetchUpdate(payload)), !this.pendingUpdateQueue) {
|
|
486
|
-
this.pendingUpdateQueue = !0, await Promise.resolve(), this.pendingUpdateQueue = !1;
|
|
487
|
-
let loading = [...this.updateQueue];
|
|
488
|
-
this.updateQueue = [], (await Promise.all(loading)).forEach((fn) => fn && fn());
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
async fetchUpdate(update) {
|
|
492
|
-
let { path, acceptedPath, firstInvalidatedBy } = update, mod = this.hotModulesMap.get(path);
|
|
493
|
-
if (!mod) return;
|
|
494
|
-
let fetchedModule, isSelfUpdate = path === acceptedPath, qualifiedCallbacks = mod.callbacks.filter(({ deps }) => deps.includes(acceptedPath));
|
|
495
|
-
if (isSelfUpdate || qualifiedCallbacks.length > 0) {
|
|
496
|
-
let disposer = this.disposeMap.get(acceptedPath);
|
|
497
|
-
disposer && await disposer(this.dataMap.get(acceptedPath));
|
|
498
|
-
try {
|
|
499
|
-
fetchedModule = await this.importUpdatedModule(update);
|
|
500
|
-
} catch (e) {
|
|
501
|
-
this.warnFailedUpdate(e, acceptedPath);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
return () => {
|
|
505
|
-
try {
|
|
506
|
-
this.currentFirstInvalidatedBy = firstInvalidatedBy;
|
|
507
|
-
for (let { deps, fn } of qualifiedCallbacks) fn(deps.map((dep) => dep === acceptedPath ? fetchedModule : void 0));
|
|
508
|
-
let loggedPath = isSelfUpdate ? path : `${acceptedPath} via ${path}`;
|
|
509
|
-
this.logger.debug(`hot updated: ${loggedPath}`);
|
|
510
|
-
} finally {
|
|
511
|
-
this.currentFirstInvalidatedBy = void 0;
|
|
512
|
-
}
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
};
|
|
516
|
-
/**
|
|
517
|
-
* Vite converts `import { } from 'foo'` to `const _ = __vite_ssr_import__('foo')`.
|
|
518
|
-
* Top-level imports and dynamic imports work slightly differently in Node.js.
|
|
519
|
-
* This function normalizes the differences so it matches prod behaviour.
|
|
520
|
-
*/
|
|
521
|
-
function analyzeImportedModDifference(mod, rawId, moduleType, metadata) {
|
|
522
|
-
if (!metadata?.isDynamicImport && metadata?.importedNames?.length) {
|
|
523
|
-
let missingBindings = metadata.importedNames.filter((s) => !(s in mod));
|
|
524
|
-
if (missingBindings.length) {
|
|
525
|
-
let lastBinding = missingBindings[missingBindings.length - 1];
|
|
526
|
-
throw SyntaxError(moduleType === "module" ? `[vite] The requested module '${rawId}' does not provide an export named '${lastBinding}'` : `\
|
|
527
|
-
[vite] Named export '${lastBinding}' not found. The requested module '${rawId}' is a CommonJS module, which may not support all module.exports as named exports.
|
|
528
|
-
CommonJS modules can always be imported via the default export, for example using:
|
|
529
|
-
|
|
530
|
-
import pkg from '${rawId}';
|
|
531
|
-
const {${missingBindings.join(", ")}} = pkg;
|
|
532
|
-
`);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
let nanoid = (size = 21) => {
|
|
537
|
-
let id = "", i = size | 0;
|
|
538
|
-
for (; i--;) id += "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[Math.random() * 64 | 0];
|
|
539
|
-
return id;
|
|
540
|
-
};
|
|
541
|
-
function reviveInvokeError(e) {
|
|
542
|
-
let error = Error(e.message || "Unknown invoke error");
|
|
543
|
-
return Object.assign(error, e, { runnerError: /* @__PURE__ */ Error("RunnerError") }), error;
|
|
544
|
-
}
|
|
545
|
-
const createInvokeableTransport = (transport) => {
|
|
546
|
-
if (transport.invoke) return {
|
|
547
|
-
...transport,
|
|
548
|
-
async invoke(name, data) {
|
|
549
|
-
let result = await transport.invoke({
|
|
550
|
-
type: "custom",
|
|
551
|
-
event: "vite:invoke",
|
|
552
|
-
data: {
|
|
553
|
-
id: "send",
|
|
554
|
-
name,
|
|
555
|
-
data
|
|
556
|
-
}
|
|
557
|
-
});
|
|
558
|
-
if ("error" in result) throw reviveInvokeError(result.error);
|
|
559
|
-
return result.result;
|
|
560
|
-
}
|
|
561
|
-
};
|
|
562
|
-
if (!transport.send || !transport.connect) throw Error("transport must implement send and connect when invoke is not implemented");
|
|
563
|
-
let rpcPromises = /* @__PURE__ */ new Map();
|
|
564
|
-
return {
|
|
565
|
-
...transport,
|
|
566
|
-
connect({ onMessage, onDisconnection }) {
|
|
567
|
-
return transport.connect({
|
|
568
|
-
onMessage(payload) {
|
|
569
|
-
if (payload.type === "custom" && payload.event === "vite:invoke") {
|
|
570
|
-
let data = payload.data;
|
|
571
|
-
if (data.id.startsWith("response:")) {
|
|
572
|
-
let invokeId = data.id.slice(9), promise = rpcPromises.get(invokeId);
|
|
573
|
-
if (!promise) return;
|
|
574
|
-
promise.timeoutId && clearTimeout(promise.timeoutId), rpcPromises.delete(invokeId);
|
|
575
|
-
let { error, result } = data.data;
|
|
576
|
-
error ? promise.reject(error) : promise.resolve(result);
|
|
577
|
-
return;
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
onMessage(payload);
|
|
581
|
-
},
|
|
582
|
-
onDisconnection
|
|
583
|
-
});
|
|
584
|
-
},
|
|
585
|
-
disconnect() {
|
|
586
|
-
return rpcPromises.forEach((promise) => {
|
|
587
|
-
promise.reject(/* @__PURE__ */ Error(`transport was disconnected, cannot call ${JSON.stringify(promise.name)}`));
|
|
588
|
-
}), rpcPromises.clear(), transport.disconnect?.();
|
|
589
|
-
},
|
|
590
|
-
send(data) {
|
|
591
|
-
return transport.send(data);
|
|
592
|
-
},
|
|
593
|
-
async invoke(name, data) {
|
|
594
|
-
let promiseId = nanoid(), wrappedData = {
|
|
595
|
-
type: "custom",
|
|
596
|
-
event: "vite:invoke",
|
|
597
|
-
data: {
|
|
598
|
-
name,
|
|
599
|
-
id: `send:${promiseId}`,
|
|
600
|
-
data
|
|
601
|
-
}
|
|
602
|
-
}, sendPromise = transport.send(wrappedData), { promise, resolve, reject } = promiseWithResolvers(), timeout = transport.timeout ?? 6e4, timeoutId;
|
|
603
|
-
timeout > 0 && (timeoutId = setTimeout(() => {
|
|
604
|
-
rpcPromises.delete(promiseId), reject(/* @__PURE__ */ Error(`transport invoke timed out after ${timeout}ms (data: ${JSON.stringify(wrappedData)})`));
|
|
605
|
-
}, timeout), timeoutId?.unref?.()), rpcPromises.set(promiseId, {
|
|
606
|
-
resolve,
|
|
607
|
-
reject,
|
|
608
|
-
name,
|
|
609
|
-
timeoutId
|
|
610
|
-
}), sendPromise && sendPromise.catch((err) => {
|
|
611
|
-
clearTimeout(timeoutId), rpcPromises.delete(promiseId), reject(err);
|
|
612
|
-
});
|
|
613
|
-
try {
|
|
614
|
-
return await promise;
|
|
615
|
-
} catch (err) {
|
|
616
|
-
throw reviveInvokeError(err);
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
};
|
|
620
|
-
};
|
|
621
|
-
const normalizeModuleRunnerTransport = (transport) => {
|
|
622
|
-
let invokeableTransport = createInvokeableTransport(transport), isConnected = !invokeableTransport.connect, connectingPromise;
|
|
623
|
-
return {
|
|
624
|
-
...transport,
|
|
625
|
-
...invokeableTransport.connect ? { async connect(onMessage) {
|
|
626
|
-
if (isConnected) return;
|
|
627
|
-
if (connectingPromise) {
|
|
628
|
-
await connectingPromise;
|
|
629
|
-
return;
|
|
630
|
-
}
|
|
631
|
-
let maybePromise = invokeableTransport.connect({
|
|
632
|
-
onMessage: onMessage ?? (() => {}),
|
|
633
|
-
onDisconnection() {
|
|
634
|
-
isConnected = !1;
|
|
635
|
-
}
|
|
636
|
-
});
|
|
637
|
-
maybePromise && (connectingPromise = maybePromise, await connectingPromise, connectingPromise = void 0), isConnected = !0;
|
|
638
|
-
} } : {},
|
|
639
|
-
...invokeableTransport.disconnect ? { async disconnect() {
|
|
640
|
-
isConnected && (connectingPromise && await connectingPromise, isConnected = !1, await invokeableTransport.disconnect());
|
|
641
|
-
} } : {},
|
|
642
|
-
async send(data) {
|
|
643
|
-
if (invokeableTransport.send) {
|
|
644
|
-
if (!isConnected) if (connectingPromise) await connectingPromise;
|
|
645
|
-
else throw Error("send was called before connect");
|
|
646
|
-
await invokeableTransport.send(data);
|
|
647
|
-
}
|
|
648
|
-
},
|
|
649
|
-
async invoke(name, data) {
|
|
650
|
-
if (!isConnected) if (connectingPromise) await connectingPromise;
|
|
651
|
-
else throw Error("invoke was called before connect");
|
|
652
|
-
return invokeableTransport.invoke(name, data);
|
|
653
|
-
}
|
|
654
|
-
};
|
|
655
|
-
};
|
|
656
|
-
const createWebSocketModuleRunnerTransport = (options) => {
|
|
657
|
-
let pingInterval = options.pingInterval ?? 3e4, ws, pingIntervalId;
|
|
658
|
-
return {
|
|
659
|
-
async connect({ onMessage, onDisconnection }) {
|
|
660
|
-
let socket = options.createConnection();
|
|
661
|
-
socket.addEventListener("message", async ({ data }) => {
|
|
662
|
-
onMessage(JSON.parse(data));
|
|
663
|
-
});
|
|
664
|
-
let isOpened = socket.readyState === socket.OPEN;
|
|
665
|
-
isOpened || await new Promise((resolve, reject) => {
|
|
666
|
-
socket.addEventListener("open", () => {
|
|
667
|
-
isOpened = !0, resolve();
|
|
668
|
-
}, { once: !0 }), socket.addEventListener("close", async () => {
|
|
669
|
-
if (!isOpened) {
|
|
670
|
-
reject(/* @__PURE__ */ Error("WebSocket closed without opened."));
|
|
671
|
-
return;
|
|
672
|
-
}
|
|
673
|
-
onMessage({
|
|
674
|
-
type: "custom",
|
|
675
|
-
event: "vite:ws:disconnect",
|
|
676
|
-
data: { webSocket: socket }
|
|
677
|
-
}), onDisconnection();
|
|
678
|
-
});
|
|
679
|
-
}), onMessage({
|
|
680
|
-
type: "custom",
|
|
681
|
-
event: "vite:ws:connect",
|
|
682
|
-
data: { webSocket: socket }
|
|
683
|
-
}), ws = socket, pingIntervalId = setInterval(() => {
|
|
684
|
-
socket.readyState === socket.OPEN && socket.send(JSON.stringify({ type: "ping" }));
|
|
685
|
-
}, pingInterval);
|
|
686
|
-
},
|
|
687
|
-
disconnect() {
|
|
688
|
-
clearInterval(pingIntervalId), ws?.close();
|
|
689
|
-
},
|
|
690
|
-
send(data) {
|
|
691
|
-
ws.send(JSON.stringify(data));
|
|
692
|
-
}
|
|
693
|
-
};
|
|
694
|
-
};
|
|
695
|
-
function createIsBuiltin(builtins) {
|
|
696
|
-
let plainBuiltinsSet = new Set(builtins.filter((builtin) => typeof builtin == "string")), regexBuiltins = builtins.filter((builtin) => typeof builtin != "string");
|
|
697
|
-
return (id) => plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id));
|
|
698
|
-
}
|
|
699
|
-
const ssrModuleExportsKey = "__vite_ssr_exports__";
|
|
700
|
-
const ssrImportKey = "__vite_ssr_import__";
|
|
701
|
-
const ssrDynamicImportKey = "__vite_ssr_dynamic_import__";
|
|
702
|
-
const ssrExportAllKey = "__vite_ssr_exportAll__";
|
|
703
|
-
const ssrExportNameKey = "__vite_ssr_exportName__";
|
|
704
|
-
const ssrImportMetaKey = "__vite_ssr_import_meta__";
|
|
705
|
-
const noop = () => {};
|
|
706
|
-
const silentConsole = {
|
|
707
|
-
debug: noop,
|
|
708
|
-
error: noop
|
|
709
|
-
};
|
|
710
|
-
const hmrLogger = {
|
|
711
|
-
debug: (...msg) => console.log("[vite]", ...msg),
|
|
712
|
-
error: (error) => console.log("[vite]", error)
|
|
713
|
-
};
|
|
714
|
-
function createHMRHandler(handler) {
|
|
715
|
-
let queue = new Queue();
|
|
716
|
-
return (payload) => queue.enqueue(() => handler(payload));
|
|
717
|
-
}
|
|
718
|
-
var Queue = class {
|
|
719
|
-
queue = [];
|
|
720
|
-
pending = !1;
|
|
721
|
-
enqueue(promise) {
|
|
722
|
-
return new Promise((resolve, reject) => {
|
|
723
|
-
this.queue.push({
|
|
724
|
-
promise,
|
|
725
|
-
resolve,
|
|
726
|
-
reject
|
|
727
|
-
}), this.dequeue();
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
dequeue() {
|
|
731
|
-
if (this.pending) return !1;
|
|
732
|
-
let item = this.queue.shift();
|
|
733
|
-
return item ? (this.pending = !0, item.promise().then(item.resolve).catch(item.reject).finally(() => {
|
|
734
|
-
this.pending = !1, this.dequeue();
|
|
735
|
-
}), !0) : !1;
|
|
736
|
-
}
|
|
737
|
-
};
|
|
738
|
-
function createHMRHandlerForRunner(runner) {
|
|
739
|
-
return createHMRHandler(async (payload) => {
|
|
740
|
-
let hmrClient = runner.hmrClient;
|
|
741
|
-
if (!(!hmrClient || runner.isClosed())) switch (payload.type) {
|
|
742
|
-
case "connected":
|
|
743
|
-
hmrClient.logger.debug("connected.");
|
|
744
|
-
break;
|
|
745
|
-
case "update":
|
|
746
|
-
await hmrClient.notifyListeners("vite:beforeUpdate", payload), await Promise.all(payload.updates.map(async (update) => {
|
|
747
|
-
if (update.type === "js-update") return update.acceptedPath = unwrapId(update.acceptedPath), update.path = unwrapId(update.path), hmrClient.queueUpdate(update);
|
|
748
|
-
hmrClient.logger.error("css hmr is not supported in runner mode.");
|
|
749
|
-
})), await hmrClient.notifyListeners("vite:afterUpdate", payload);
|
|
750
|
-
break;
|
|
751
|
-
case "custom":
|
|
752
|
-
await hmrClient.notifyListeners(payload.event, payload.data);
|
|
753
|
-
break;
|
|
754
|
-
case "full-reload": {
|
|
755
|
-
let { triggeredBy } = payload, clearEntrypointUrls = triggeredBy ? getModulesEntrypoints(runner, getModulesByFile(runner, slash(triggeredBy))) : findAllEntrypoints(runner);
|
|
756
|
-
if (!clearEntrypointUrls.size) break;
|
|
757
|
-
hmrClient.logger.debug("program reload"), await hmrClient.notifyListeners("vite:beforeFullReload", payload), runner.evaluatedModules.clear();
|
|
758
|
-
for (let url of clearEntrypointUrls) {
|
|
759
|
-
if (runner.isClosed()) break;
|
|
760
|
-
try {
|
|
761
|
-
await runner.import(url);
|
|
762
|
-
} catch (err) {
|
|
763
|
-
if (runner.isClosed()) break;
|
|
764
|
-
err.code !== "ERR_OUTDATED_OPTIMIZED_DEP" && hmrClient.logger.error(`An error happened during full reload\n${err.message}\n${err.stack}`);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
break;
|
|
768
|
-
}
|
|
769
|
-
case "prune":
|
|
770
|
-
await hmrClient.notifyListeners("vite:beforePrune", payload), await hmrClient.prunePaths(payload.paths);
|
|
771
|
-
break;
|
|
772
|
-
case "error": {
|
|
773
|
-
await hmrClient.notifyListeners("vite:error", payload);
|
|
774
|
-
let err = payload.err;
|
|
775
|
-
hmrClient.logger.error(`Internal Server Error\n${err.message}\n${err.stack}`);
|
|
776
|
-
break;
|
|
777
|
-
}
|
|
778
|
-
case "ping": break;
|
|
779
|
-
default: return payload;
|
|
780
|
-
}
|
|
781
|
-
});
|
|
782
|
-
}
|
|
783
|
-
function getModulesByFile(runner, file) {
|
|
784
|
-
let nodes = runner.evaluatedModules.getModulesByFile(file);
|
|
785
|
-
return nodes ? [...nodes].map((node) => node.id) : [];
|
|
786
|
-
}
|
|
787
|
-
function getModulesEntrypoints(runner, modules, visited = /* @__PURE__ */ new Set(), entrypoints = /* @__PURE__ */ new Set()) {
|
|
788
|
-
for (let moduleId of modules) {
|
|
789
|
-
if (visited.has(moduleId)) continue;
|
|
790
|
-
visited.add(moduleId);
|
|
791
|
-
let module = runner.evaluatedModules.getModuleById(moduleId);
|
|
792
|
-
if (module) {
|
|
793
|
-
if (!module.importers.size) {
|
|
794
|
-
entrypoints.add(module.url);
|
|
795
|
-
continue;
|
|
796
|
-
}
|
|
797
|
-
for (let importer of module.importers) getModulesEntrypoints(runner, [importer], visited, entrypoints);
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
return entrypoints;
|
|
801
|
-
}
|
|
802
|
-
function findAllEntrypoints(runner, entrypoints = /* @__PURE__ */ new Set()) {
|
|
803
|
-
for (let mod of runner.evaluatedModules.idToModuleMap.values()) mod.importers.size || entrypoints.add(mod.url);
|
|
804
|
-
return entrypoints;
|
|
805
|
-
}
|
|
806
|
-
const sourceMapCache = {};
|
|
807
|
-
const fileContentsCache = {};
|
|
808
|
-
const evaluatedModulesCache = /* @__PURE__ */ new Set();
|
|
809
|
-
const retrieveFileHandlers = /* @__PURE__ */ new Set();
|
|
810
|
-
const retrieveSourceMapHandlers = /* @__PURE__ */ new Set();
|
|
811
|
-
const createExecHandlers = (handlers) => ((...args) => {
|
|
812
|
-
for (let handler of handlers) {
|
|
813
|
-
let result = handler(...args);
|
|
814
|
-
if (result) return result;
|
|
815
|
-
}
|
|
816
|
-
return null;
|
|
817
|
-
});
|
|
818
|
-
const retrieveFileFromHandlers = createExecHandlers(retrieveFileHandlers);
|
|
819
|
-
const retrieveSourceMapFromHandlers = createExecHandlers(retrieveSourceMapHandlers);
|
|
820
|
-
let overridden = !1;
|
|
821
|
-
const originalPrepare = Error.prepareStackTrace;
|
|
822
|
-
function resetInterceptor(runner, options) {
|
|
823
|
-
evaluatedModulesCache.delete(runner.evaluatedModules), options.retrieveFile && retrieveFileHandlers.delete(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.delete(options.retrieveSourceMap), evaluatedModulesCache.size === 0 && (Error.prepareStackTrace = originalPrepare, overridden = !1);
|
|
824
|
-
}
|
|
825
|
-
function interceptStackTrace(runner, options = {}) {
|
|
826
|
-
return overridden ||= (Error.prepareStackTrace = prepareStackTrace, !0), evaluatedModulesCache.add(runner.evaluatedModules), options.retrieveFile && retrieveFileHandlers.add(options.retrieveFile), options.retrieveSourceMap && retrieveSourceMapHandlers.add(options.retrieveSourceMap), () => resetInterceptor(runner, options);
|
|
827
|
-
}
|
|
828
|
-
function supportRelativeURL(file, url) {
|
|
829
|
-
if (!file) return url;
|
|
830
|
-
let dir = posixDirname(slash(file)), match = /^\w+:\/\/[^/]*/.exec(dir), protocol = match ? match[0] : "", startPath = dir.slice(protocol.length);
|
|
831
|
-
return protocol && /^\/\w:/.test(startPath) ? (protocol += "/", protocol + slash(posixResolve(startPath, url))) : protocol + posixResolve(startPath, url);
|
|
832
|
-
}
|
|
833
|
-
function getRunnerSourceMap(position) {
|
|
834
|
-
for (let moduleGraph of evaluatedModulesCache) {
|
|
835
|
-
let sourceMap = moduleGraph.getModuleSourceMapById(position.source);
|
|
836
|
-
if (sourceMap) return {
|
|
837
|
-
url: position.source,
|
|
838
|
-
map: sourceMap,
|
|
839
|
-
vite: !0
|
|
840
|
-
};
|
|
841
|
-
}
|
|
842
|
-
return null;
|
|
843
|
-
}
|
|
844
|
-
function retrieveFile(path) {
|
|
845
|
-
if (path in fileContentsCache) return fileContentsCache[path];
|
|
846
|
-
let content = retrieveFileFromHandlers(path);
|
|
847
|
-
return typeof content == "string" ? (fileContentsCache[path] = content, content) : null;
|
|
848
|
-
}
|
|
849
|
-
function retrieveSourceMapURL(source) {
|
|
850
|
-
let fileData = retrieveFile(source);
|
|
851
|
-
if (!fileData) return null;
|
|
852
|
-
let re = /\/\/[@#]\s*sourceMappingURL=([^\s'"]+)\s*$|\/\*[@#]\s*sourceMappingURL=[^\s*'"]+\s*\*\/\s*$/gm, lastMatch, match;
|
|
853
|
-
for (; match = re.exec(fileData);) lastMatch = match;
|
|
854
|
-
return lastMatch ? lastMatch[1] : null;
|
|
855
|
-
}
|
|
856
|
-
const reSourceMap = /^data:application\/json[^,]+base64,/;
|
|
857
|
-
function retrieveSourceMap(source) {
|
|
858
|
-
let urlAndMap = retrieveSourceMapFromHandlers(source);
|
|
859
|
-
if (urlAndMap) return urlAndMap;
|
|
860
|
-
let sourceMappingURL = retrieveSourceMapURL(source);
|
|
861
|
-
if (!sourceMappingURL) return null;
|
|
862
|
-
let sourceMapData;
|
|
863
|
-
if (reSourceMap.test(sourceMappingURL)) {
|
|
864
|
-
let rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(",") + 1);
|
|
865
|
-
sourceMapData = Buffer.from(rawData, "base64").toString(), sourceMappingURL = source;
|
|
866
|
-
} else sourceMappingURL = supportRelativeURL(source, sourceMappingURL), sourceMapData = retrieveFile(sourceMappingURL);
|
|
867
|
-
return sourceMapData ? {
|
|
868
|
-
url: sourceMappingURL,
|
|
869
|
-
map: sourceMapData
|
|
870
|
-
} : null;
|
|
871
|
-
}
|
|
872
|
-
function mapSourcePosition(position) {
|
|
873
|
-
if (!position.source) return position;
|
|
874
|
-
let sourceMap = getRunnerSourceMap(position);
|
|
875
|
-
if (sourceMap ||= sourceMapCache[position.source], !sourceMap) {
|
|
876
|
-
let urlAndMap = retrieveSourceMap(position.source);
|
|
877
|
-
if (urlAndMap && urlAndMap.map) {
|
|
878
|
-
let url = urlAndMap.url;
|
|
879
|
-
sourceMap = sourceMapCache[position.source] = {
|
|
880
|
-
url,
|
|
881
|
-
map: new DecodedMap(typeof urlAndMap.map == "string" ? JSON.parse(urlAndMap.map) : urlAndMap.map, url)
|
|
882
|
-
};
|
|
883
|
-
let contents = sourceMap.map?.map.sourcesContent;
|
|
884
|
-
sourceMap.map && contents && sourceMap.map.resolvedSources.forEach((source, i) => {
|
|
885
|
-
let content = contents[i];
|
|
886
|
-
if (content && source && url) {
|
|
887
|
-
let contentUrl = supportRelativeURL(url, source);
|
|
888
|
-
fileContentsCache[contentUrl] = content;
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
} else sourceMap = sourceMapCache[position.source] = {
|
|
892
|
-
url: null,
|
|
893
|
-
map: null
|
|
894
|
-
};
|
|
895
|
-
}
|
|
896
|
-
if (sourceMap.map && sourceMap.url) {
|
|
897
|
-
let originalPosition = getOriginalPosition(sourceMap.map, position);
|
|
898
|
-
if (originalPosition && originalPosition.source != null) return originalPosition.source = supportRelativeURL(sourceMap.url, originalPosition.source), sourceMap.vite && (originalPosition._vite = !0), originalPosition;
|
|
899
|
-
}
|
|
900
|
-
return position;
|
|
901
|
-
}
|
|
902
|
-
function mapEvalOrigin(origin) {
|
|
903
|
-
let match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
|
|
904
|
-
if (match) {
|
|
905
|
-
let position = mapSourcePosition({
|
|
906
|
-
name: null,
|
|
907
|
-
source: match[2],
|
|
908
|
-
line: +match[3],
|
|
909
|
-
column: match[4] - 1
|
|
910
|
-
});
|
|
911
|
-
return `eval at ${match[1]} (${position.source}:${position.line}:${position.column + 1})`;
|
|
912
|
-
}
|
|
913
|
-
return match = /^eval at ([^(]+) \((.+)\)$/.exec(origin), match ? `eval at ${match[1]} (${mapEvalOrigin(match[2])})` : origin;
|
|
914
|
-
}
|
|
915
|
-
function CallSiteToString() {
|
|
916
|
-
let fileName, fileLocation = "";
|
|
917
|
-
if (this.isNative()) fileLocation = "native";
|
|
918
|
-
else {
|
|
919
|
-
fileName = this.getScriptNameOrSourceURL(), !fileName && this.isEval() && (fileLocation = this.getEvalOrigin(), fileLocation += ", "), fileName ? fileLocation += fileName : fileLocation += "<anonymous>";
|
|
920
|
-
let lineNumber = this.getLineNumber();
|
|
921
|
-
if (lineNumber != null) {
|
|
922
|
-
fileLocation += `:${lineNumber}`;
|
|
923
|
-
let columnNumber = this.getColumnNumber();
|
|
924
|
-
columnNumber && (fileLocation += `:${columnNumber}`);
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
let line = "", functionName = this.getFunctionName(), addSuffix = !0, isConstructor = this.isConstructor();
|
|
928
|
-
if (this.isToplevel() || isConstructor) isConstructor ? line += `new ${functionName || "<anonymous>"}` : functionName ? line += functionName : (line += fileLocation, addSuffix = !1);
|
|
929
|
-
else {
|
|
930
|
-
let typeName = this.getTypeName();
|
|
931
|
-
typeName === "[object Object]" && (typeName = "null");
|
|
932
|
-
let methodName = this.getMethodName();
|
|
933
|
-
functionName ? (typeName && functionName.indexOf(typeName) !== 0 && (line += `${typeName}.`), line += functionName, methodName && functionName.indexOf(`.${methodName}`) !== functionName.length - methodName.length - 1 && (line += ` [as ${methodName}]`)) : line += `${typeName}.${methodName || "<anonymous>"}`;
|
|
934
|
-
}
|
|
935
|
-
return addSuffix && (line += ` (${fileLocation})`), line;
|
|
936
|
-
}
|
|
937
|
-
function cloneCallSite(frame) {
|
|
938
|
-
let object = {};
|
|
939
|
-
return Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach((name) => {
|
|
940
|
-
let key = name;
|
|
941
|
-
object[key] = /^(?:is|get)/.test(name) ? function() {
|
|
942
|
-
return frame[key].call(frame);
|
|
943
|
-
} : frame[key];
|
|
944
|
-
}), object.toString = CallSiteToString, object;
|
|
945
|
-
}
|
|
946
|
-
function wrapCallSite(frame, state) {
|
|
947
|
-
if (state === void 0 && (state = {
|
|
948
|
-
nextPosition: null,
|
|
949
|
-
curPosition: null
|
|
950
|
-
}), frame.isNative()) return state.curPosition = null, frame;
|
|
951
|
-
let source = frame.getFileName() || frame.getScriptNameOrSourceURL();
|
|
952
|
-
if (source) {
|
|
953
|
-
let position = mapSourcePosition({
|
|
954
|
-
name: null,
|
|
955
|
-
source,
|
|
956
|
-
line: frame.getLineNumber() ?? 0,
|
|
957
|
-
column: (frame.getColumnNumber() ?? 1) - 1
|
|
958
|
-
});
|
|
959
|
-
state.curPosition = position, frame = cloneCallSite(frame);
|
|
960
|
-
let originalFunctionName = frame.getFunctionName;
|
|
961
|
-
return frame.getFunctionName = function() {
|
|
962
|
-
let name = state.nextPosition == null ? originalFunctionName() : state.nextPosition.name || originalFunctionName();
|
|
963
|
-
return name === "eval" && "_vite" in position ? null : name;
|
|
964
|
-
}, frame.getFileName = function() {
|
|
965
|
-
return position.source ?? null;
|
|
966
|
-
}, frame.getLineNumber = function() {
|
|
967
|
-
return position.line;
|
|
968
|
-
}, frame.getColumnNumber = function() {
|
|
969
|
-
return position.column + 1;
|
|
970
|
-
}, frame.getScriptNameOrSourceURL = function() {
|
|
971
|
-
return position.source;
|
|
972
|
-
}, frame;
|
|
973
|
-
}
|
|
974
|
-
let origin = frame.isEval() && frame.getEvalOrigin();
|
|
975
|
-
return origin ? (origin = mapEvalOrigin(origin), frame = cloneCallSite(frame), frame.getEvalOrigin = function() {
|
|
976
|
-
return origin || void 0;
|
|
977
|
-
}, frame) : frame;
|
|
978
|
-
}
|
|
979
|
-
function prepareStackTrace(error, stack) {
|
|
980
|
-
let errorString = `${error.name || "Error"}: ${error.message || ""}`, state = {
|
|
981
|
-
nextPosition: null,
|
|
982
|
-
curPosition: null
|
|
983
|
-
}, processedStack = [];
|
|
984
|
-
for (let i = stack.length - 1; i >= 0; i--) processedStack.push(`\n at ${wrapCallSite(stack[i], state)}`), state.nextPosition = state.curPosition;
|
|
985
|
-
return state.curPosition = state.nextPosition = null, errorString + processedStack.reverse().join("");
|
|
986
|
-
}
|
|
987
|
-
function enableSourceMapSupport(runner) {
|
|
988
|
-
if (runner.options.sourcemapInterceptor === "node") {
|
|
989
|
-
if (typeof process > "u") throw TypeError("Cannot use \"sourcemapInterceptor: 'node'\" because global \"process\" variable is not available.");
|
|
990
|
-
if (typeof process.setSourceMapsEnabled != "function") throw TypeError("Cannot use \"sourcemapInterceptor: 'node'\" because \"process.setSourceMapsEnabled\" function is not available. Please use Node >= 16.6.0.");
|
|
991
|
-
let isEnabledAlready = process.sourceMapsEnabled ?? !1;
|
|
992
|
-
return process.setSourceMapsEnabled(!0), () => !isEnabledAlready && process.setSourceMapsEnabled(!1);
|
|
993
|
-
}
|
|
994
|
-
return interceptStackTrace(runner, typeof runner.options.sourcemapInterceptor == "object" ? runner.options.sourcemapInterceptor : void 0);
|
|
995
|
-
}
|
|
996
|
-
var ESModulesEvaluator = class {
|
|
997
|
-
startOffset = getAsyncFunctionDeclarationPaddingLineCount();
|
|
998
|
-
async runInlinedModule(context, code) {
|
|
999
|
-
await new AsyncFunction(ssrModuleExportsKey, ssrImportMetaKey, ssrImportKey, ssrDynamicImportKey, ssrExportAllKey, ssrExportNameKey, "\"use strict\";" + code)(context[ssrModuleExportsKey], context[ssrImportMetaKey], context[ssrImportKey], context[ssrDynamicImportKey], context[ssrExportAllKey], context[ssrExportNameKey]), Object.seal(context[ssrModuleExportsKey]);
|
|
1000
|
-
}
|
|
1001
|
-
runExternalModule(filepath) {
|
|
1002
|
-
return import(filepath);
|
|
1003
|
-
}
|
|
1004
|
-
};
|
|
1005
|
-
const customizationHookNamespace = "vite-module-runner:import-meta-resolve/v1/";
|
|
1006
|
-
const customizationHooksModule = `
|
|
1007
|
-
|
|
1008
|
-
export async function resolve(specifier, context, nextResolve) {
|
|
1009
|
-
if (specifier.startsWith(${JSON.stringify(customizationHookNamespace)})) {
|
|
1010
|
-
const data = specifier.slice(${JSON.stringify(customizationHookNamespace)}.length)
|
|
1011
|
-
const [parsedSpecifier, parsedImporter] = JSON.parse(data)
|
|
1012
|
-
specifier = parsedSpecifier
|
|
1013
|
-
context.parentURL = parsedImporter
|
|
1014
|
-
}
|
|
1015
|
-
return nextResolve(specifier, context)
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
`;
|
|
1019
|
-
function customizationHookResolve(specifier, context, nextResolve) {
|
|
1020
|
-
if (specifier.startsWith(customizationHookNamespace)) {
|
|
1021
|
-
let data = specifier.slice(42), [parsedSpecifier, parsedImporter] = JSON.parse(data);
|
|
1022
|
-
specifier = parsedSpecifier, context.parentURL = parsedImporter;
|
|
1023
|
-
}
|
|
1024
|
-
return nextResolve(specifier, context);
|
|
1025
|
-
}
|
|
1026
|
-
let isHookRegistered = !1;
|
|
1027
|
-
function createImportMetaResolver() {
|
|
1028
|
-
if (isHookRegistered) return importMetaResolveWithCustomHook;
|
|
1029
|
-
let module;
|
|
1030
|
-
try {
|
|
1031
|
-
module = typeof process < "u" ? process.getBuiltinModule("node:module").Module : void 0;
|
|
1032
|
-
} catch {
|
|
1033
|
-
return;
|
|
1034
|
-
}
|
|
1035
|
-
if (module) {
|
|
1036
|
-
if (module.registerHooks) return module.registerHooks({ resolve: customizationHookResolve }), isHookRegistered = !0, importMetaResolveWithCustomHook;
|
|
1037
|
-
if (module.register) {
|
|
1038
|
-
try {
|
|
1039
|
-
let hookModuleContent = `data:text/javascript,${encodeURI(customizationHooksModule)}`;
|
|
1040
|
-
module.register(hookModuleContent);
|
|
1041
|
-
} catch (e) {
|
|
1042
|
-
if ("code" in e && e.code === "ERR_NETWORK_IMPORT_DISALLOWED") return;
|
|
1043
|
-
throw e;
|
|
1044
|
-
}
|
|
1045
|
-
return isHookRegistered = !0, importMetaResolveWithCustomHook;
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
function importMetaResolveWithCustomHook(specifier, importer) {
|
|
1050
|
-
return import.meta.resolve(`${customizationHookNamespace}${JSON.stringify([specifier, importer])}`);
|
|
1051
|
-
}
|
|
1052
|
-
const envProxy = new Proxy({}, { get(_, p) {
|
|
1053
|
-
throw Error(`[module runner] Dynamic access of "import.meta.env" is not supported. Please, use "import.meta.env.${String(p)}" instead.`);
|
|
1054
|
-
} });
|
|
1055
|
-
function createDefaultImportMeta(modulePath) {
|
|
1056
|
-
let href = posixPathToFileHref(modulePath), filename = modulePath, dirname = posixDirname(modulePath);
|
|
1057
|
-
return {
|
|
1058
|
-
filename: isWindows ? toWindowsPath(filename) : filename,
|
|
1059
|
-
dirname: isWindows ? toWindowsPath(dirname) : dirname,
|
|
1060
|
-
url: href,
|
|
1061
|
-
env: envProxy,
|
|
1062
|
-
resolve(_id, _parent) {
|
|
1063
|
-
throw Error("[module runner] \"import.meta.resolve\" is not supported.");
|
|
1064
|
-
},
|
|
1065
|
-
glob() {
|
|
1066
|
-
throw Error("[module runner] \"import.meta.glob\" is statically replaced during file transformation. Make sure to reference it by the full name.");
|
|
1067
|
-
}
|
|
1068
|
-
};
|
|
1069
|
-
}
|
|
1070
|
-
/**
|
|
1071
|
-
* Create import.meta object for Node.js.
|
|
1072
|
-
*/
|
|
1073
|
-
function createNodeImportMeta(modulePath) {
|
|
1074
|
-
let defaultMeta = createDefaultImportMeta(modulePath), href = defaultMeta.url, importMetaResolver = createImportMetaResolver();
|
|
1075
|
-
return {
|
|
1076
|
-
...defaultMeta,
|
|
1077
|
-
main: !1,
|
|
1078
|
-
resolve(id, parent) {
|
|
1079
|
-
return (importMetaResolver ?? defaultMeta.resolve)(id, parent ?? href);
|
|
1080
|
-
}
|
|
1081
|
-
};
|
|
1082
|
-
}
|
|
1083
|
-
var ModuleRunner = class {
|
|
1084
|
-
evaluatedModules;
|
|
1085
|
-
hmrClient;
|
|
1086
|
-
transport;
|
|
1087
|
-
resetSourceMapSupport;
|
|
1088
|
-
concurrentModuleNodePromises = /* @__PURE__ */ new Map();
|
|
1089
|
-
isBuiltin;
|
|
1090
|
-
builtinsPromise;
|
|
1091
|
-
closed = !1;
|
|
1092
|
-
constructor(options, evaluator = new ESModulesEvaluator(), debug) {
|
|
1093
|
-
if (this.options = options, this.evaluator = evaluator, this.debug = debug, this.evaluatedModules = options.evaluatedModules ?? new EvaluatedModules(), this.transport = normalizeModuleRunnerTransport(options.transport), options.hmr !== !1) {
|
|
1094
|
-
let optionsHmr = options.hmr ?? !0;
|
|
1095
|
-
if (this.hmrClient = new HMRClient(optionsHmr === !0 || optionsHmr.logger === void 0 ? hmrLogger : optionsHmr.logger === !1 ? silentConsole : optionsHmr.logger, this.transport, ({ acceptedPath }) => this.import(acceptedPath)), !this.transport.connect) throw Error("HMR is not supported by this runner transport, but `hmr` option was set to true");
|
|
1096
|
-
this.transport.connect(createHMRHandlerForRunner(this));
|
|
1097
|
-
} else this.transport.connect?.();
|
|
1098
|
-
options.sourcemapInterceptor !== !1 && (this.resetSourceMapSupport = enableSourceMapSupport(this));
|
|
1099
|
-
}
|
|
1100
|
-
/**
|
|
1101
|
-
* URL to execute. Accepts file path, server path or id relative to the root.
|
|
1102
|
-
*/
|
|
1103
|
-
async import(url) {
|
|
1104
|
-
let fetchedModule = await this.cachedModule(url);
|
|
1105
|
-
return await this.cachedRequest(url, fetchedModule);
|
|
1106
|
-
}
|
|
1107
|
-
/**
|
|
1108
|
-
* Clear all caches including HMR listeners.
|
|
1109
|
-
*/
|
|
1110
|
-
clearCache() {
|
|
1111
|
-
this.evaluatedModules.clear(), this.hmrClient?.clear();
|
|
1112
|
-
}
|
|
1113
|
-
/**
|
|
1114
|
-
* Clears all caches, removes all HMR listeners, and resets source map support.
|
|
1115
|
-
* This method doesn't stop the HMR connection.
|
|
1116
|
-
*/
|
|
1117
|
-
async close() {
|
|
1118
|
-
this.resetSourceMapSupport?.(), this.clearCache(), this.hmrClient = void 0, this.closed = !0, await this.transport.disconnect?.();
|
|
1119
|
-
}
|
|
1120
|
-
/**
|
|
1121
|
-
* Returns `true` if the runtime has been closed by calling `close()` method.
|
|
1122
|
-
*/
|
|
1123
|
-
isClosed() {
|
|
1124
|
-
return this.closed;
|
|
1125
|
-
}
|
|
1126
|
-
processImport(exports, fetchResult, metadata) {
|
|
1127
|
-
if (!("externalize" in fetchResult)) return exports;
|
|
1128
|
-
let { url, type } = fetchResult;
|
|
1129
|
-
return type !== "module" && type !== "commonjs" || analyzeImportedModDifference(exports, url, type, metadata), exports;
|
|
1130
|
-
}
|
|
1131
|
-
isCircularModule(mod) {
|
|
1132
|
-
for (let importedFile of mod.imports) if (mod.importers.has(importedFile)) return !0;
|
|
1133
|
-
return !1;
|
|
1134
|
-
}
|
|
1135
|
-
isCircularImport(importers, moduleUrl, visited = /* @__PURE__ */ new Set()) {
|
|
1136
|
-
for (let importer of importers) {
|
|
1137
|
-
if (visited.has(importer)) continue;
|
|
1138
|
-
if (visited.add(importer), importer === moduleUrl) return !0;
|
|
1139
|
-
let mod = this.evaluatedModules.getModuleById(importer);
|
|
1140
|
-
if (mod && mod.importers.size && this.isCircularImport(mod.importers, moduleUrl, visited)) return !0;
|
|
1141
|
-
}
|
|
1142
|
-
return !1;
|
|
1143
|
-
}
|
|
1144
|
-
async cachedRequest(url, mod, callstack = [], metadata) {
|
|
1145
|
-
let meta = mod.meta, moduleId = meta.id, { importers } = mod, importee = callstack[callstack.length - 1];
|
|
1146
|
-
if (importee && importers.add(importee), mod.evaluated && mod.promise) return this.processImport(await mod.promise, meta, metadata);
|
|
1147
|
-
if ((callstack.includes(moduleId) || this.isCircularModule(mod) || this.isCircularImport(importers, moduleId)) && mod.exports) return this.processImport(mod.exports, meta, metadata);
|
|
1148
|
-
let debugTimer;
|
|
1149
|
-
this.debug && (debugTimer = setTimeout(() => {
|
|
1150
|
-
this.debug(`[module runner] module ${moduleId} takes over 2s to load.\n${`stack:\n${[...callstack, moduleId].reverse().map((p) => ` - ${p}`).join("\n")}`}`);
|
|
1151
|
-
}, 2e3));
|
|
1152
|
-
try {
|
|
1153
|
-
if (mod.promise) return this.processImport(await mod.promise, meta, metadata);
|
|
1154
|
-
let promise = this.directRequest(url, mod, callstack);
|
|
1155
|
-
return mod.promise = promise, mod.evaluated = !1, this.processImport(await promise, meta, metadata);
|
|
1156
|
-
} finally {
|
|
1157
|
-
mod.evaluated = !0, debugTimer && clearTimeout(debugTimer);
|
|
1158
|
-
}
|
|
1159
|
-
}
|
|
1160
|
-
async cachedModule(url, importer) {
|
|
1161
|
-
let cached = this.concurrentModuleNodePromises.get(url);
|
|
1162
|
-
if (cached) this.debug?.("[module runner] using cached module info for", url);
|
|
1163
|
-
else {
|
|
1164
|
-
let cachedModule = this.evaluatedModules.getModuleByUrl(url);
|
|
1165
|
-
cached = this.getModuleInformation(url, importer, cachedModule).finally(() => {
|
|
1166
|
-
this.concurrentModuleNodePromises.delete(url);
|
|
1167
|
-
}), this.concurrentModuleNodePromises.set(url, cached);
|
|
1168
|
-
}
|
|
1169
|
-
return cached;
|
|
1170
|
-
}
|
|
1171
|
-
ensureBuiltins() {
|
|
1172
|
-
if (!this.isBuiltin) return this.builtinsPromise ??= (async () => {
|
|
1173
|
-
try {
|
|
1174
|
-
this.debug?.("[module runner] fetching builtins from server");
|
|
1175
|
-
let builtins = (await this.transport.invoke("getBuiltins", [])).map((builtin) => typeof builtin == "object" && builtin && "type" in builtin ? builtin.type === "string" ? builtin.value : new RegExp(builtin.source, builtin.flags) : builtin);
|
|
1176
|
-
this.isBuiltin = createIsBuiltin(builtins), this.debug?.("[module runner] builtins loaded:", builtins);
|
|
1177
|
-
} finally {
|
|
1178
|
-
this.builtinsPromise = void 0;
|
|
1179
|
-
}
|
|
1180
|
-
})(), this.builtinsPromise;
|
|
1181
|
-
}
|
|
1182
|
-
async getModuleInformation(url, importer, cachedModule) {
|
|
1183
|
-
if (this.closed) throw Error("Vite module runner has been closed.");
|
|
1184
|
-
await this.ensureBuiltins(), this.debug?.("[module runner] fetching", url);
|
|
1185
|
-
let isCached = !!(typeof cachedModule == "object" && cachedModule.meta), fetchedModule = url.startsWith("data:") || this.isBuiltin?.(url) ? {
|
|
1186
|
-
externalize: url,
|
|
1187
|
-
type: "builtin"
|
|
1188
|
-
} : await this.transport.invoke("fetchModule", [
|
|
1189
|
-
url,
|
|
1190
|
-
importer,
|
|
1191
|
-
{
|
|
1192
|
-
cached: isCached,
|
|
1193
|
-
startOffset: this.evaluator.startOffset
|
|
1194
|
-
}
|
|
1195
|
-
]);
|
|
1196
|
-
if ("cache" in fetchedModule) {
|
|
1197
|
-
if (!cachedModule || !cachedModule.meta) throw Error(`Module "${url}" was mistakenly invalidated during fetch phase.`);
|
|
1198
|
-
return cachedModule;
|
|
1199
|
-
}
|
|
1200
|
-
let moduleId = "externalize" in fetchedModule ? fetchedModule.externalize : fetchedModule.id, moduleUrl = "url" in fetchedModule ? fetchedModule.url : url, module = this.evaluatedModules.ensureModule(moduleId, moduleUrl);
|
|
1201
|
-
return "invalidate" in fetchedModule && fetchedModule.invalidate && this.evaluatedModules.invalidateModule(module), fetchedModule.url = moduleUrl, fetchedModule.id = moduleId, module.meta = fetchedModule, module;
|
|
1202
|
-
}
|
|
1203
|
-
async directRequest(url, mod, _callstack) {
|
|
1204
|
-
let fetchResult = mod.meta, moduleId = fetchResult.id, callstack = [..._callstack, moduleId], request = async (dep, metadata) => {
|
|
1205
|
-
let importer = "file" in fetchResult && fetchResult.file || moduleId, depMod = await this.cachedModule(dep, importer);
|
|
1206
|
-
return depMod.importers.add(moduleId), mod.imports.add(depMod.id), this.cachedRequest(dep, depMod, callstack, metadata);
|
|
1207
|
-
}, dynamicRequest = async (dep) => (dep = String(dep), dep[0] === "." && (dep = posixResolve(posixDirname(url), dep)), request(dep, { isDynamicImport: !0 }));
|
|
1208
|
-
if ("externalize" in fetchResult) {
|
|
1209
|
-
let { externalize } = fetchResult;
|
|
1210
|
-
this.debug?.("[module runner] externalizing", externalize);
|
|
1211
|
-
let exports = await this.evaluator.runExternalModule(externalize);
|
|
1212
|
-
return mod.exports = exports, exports;
|
|
1213
|
-
}
|
|
1214
|
-
let { code, file } = fetchResult;
|
|
1215
|
-
if (code == null) {
|
|
1216
|
-
let importer = callstack[callstack.length - 2];
|
|
1217
|
-
throw Error(`[module runner] Failed to load "${url}"${importer ? ` imported from ${importer}` : ""}`);
|
|
1218
|
-
}
|
|
1219
|
-
let createImportMeta = this.options.createImportMeta ?? createDefaultImportMeta, modulePath = cleanUrl(file || moduleId), href = posixPathToFileHref(modulePath), meta = await createImportMeta(modulePath), exports = Object.create(null);
|
|
1220
|
-
Object.defineProperty(exports, Symbol.toStringTag, {
|
|
1221
|
-
value: "Module",
|
|
1222
|
-
enumerable: !1,
|
|
1223
|
-
configurable: !1
|
|
1224
|
-
}), mod.exports = exports;
|
|
1225
|
-
let hotContext;
|
|
1226
|
-
this.hmrClient && Object.defineProperty(meta, "hot", {
|
|
1227
|
-
enumerable: !0,
|
|
1228
|
-
get: () => {
|
|
1229
|
-
if (!this.hmrClient) throw Error("[module runner] HMR client was closed.");
|
|
1230
|
-
return this.debug?.("[module runner] creating hmr context for", mod.url), hotContext ||= new HMRContext(this.hmrClient, mod.url), hotContext;
|
|
1231
|
-
},
|
|
1232
|
-
set: (value) => {
|
|
1233
|
-
hotContext = value;
|
|
1234
|
-
}
|
|
1235
|
-
});
|
|
1236
|
-
let context = {
|
|
1237
|
-
[ssrImportKey]: request,
|
|
1238
|
-
[ssrDynamicImportKey]: dynamicRequest,
|
|
1239
|
-
[ssrModuleExportsKey]: exports,
|
|
1240
|
-
[ssrExportAllKey]: (obj) => exportAll(exports, obj),
|
|
1241
|
-
[ssrExportNameKey]: (name, getter) => Object.defineProperty(exports, name, {
|
|
1242
|
-
enumerable: !0,
|
|
1243
|
-
configurable: !0,
|
|
1244
|
-
get: getter
|
|
1245
|
-
}),
|
|
1246
|
-
[ssrImportMetaKey]: meta
|
|
1247
|
-
};
|
|
1248
|
-
return this.debug?.("[module runner] executing", href), await this.evaluator.runInlinedModule(context, code, mod), exports;
|
|
1249
|
-
}
|
|
1250
|
-
};
|
|
1251
|
-
function exportAll(exports, sourceModule) {
|
|
1252
|
-
if (exports !== sourceModule && !(isPrimitive(sourceModule) || Array.isArray(sourceModule) || sourceModule instanceof Promise)) {
|
|
1253
|
-
for (let key in sourceModule) if (key !== "default" && key !== "__esModule" && !(key in exports)) try {
|
|
1254
|
-
Object.defineProperty(exports, key, {
|
|
1255
|
-
enumerable: !0,
|
|
1256
|
-
configurable: !0,
|
|
1257
|
-
get: () => sourceModule[key]
|
|
1258
|
-
});
|
|
1259
|
-
} catch {}
|
|
1260
|
-
}
|
|
1261
|
-
}
|
|
1262
|
-
//#endregion
|
|
1263
|
-
export { ESModulesEvaluator, EvaluatedModules, ModuleRunner, createDefaultImportMeta, createNodeImportMeta, createWebSocketModuleRunnerTransport, normalizeModuleId, ssrDynamicImportKey, ssrExportAllKey, ssrExportNameKey, ssrImportKey, ssrImportMetaKey, ssrModuleExportsKey };
|
|
1264
|
-
|
|
1265
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXJ1bm5lci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdml0ZUA4LjAuM19AZW1uYXBpK2NvcmVAMS4xMS4yX0BlbW5hcGkrcnVudGltZUAxLjExLjJfQHR5cGVzK25vZGVAMjUuMC43X2VzYnVpbGRAMC4yNy40XzViMzVmYzFmYjg1ZDJhZjRkMTA1ZTBkNzRmOTQwZjUwL25vZGVfbW9kdWxlcy92aXRlL2Rpc3Qvbm9kZS9tb2R1bGUtcnVubmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBTT1VSQ0VNQVBQSU5HX1VSTCA9IFwic291cmNlTWFcIjtcblNPVVJDRU1BUFBJTkdfVVJMICs9IFwicHBpbmdVUkxcIjtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvdXRpbHMudHNcbmNvbnN0IGlzV2luZG93cyA9IHR5cGVvZiBwcm9jZXNzIDwgXCJ1XCIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiO1xuLyoqXG4qIFVuZG8ge0BsaW5rIHdyYXBJZH0ncyBgL0BpZC9gIGFuZCBudWxsIGJ5dGUgcmVwbGFjZW1lbnRzLlxuKi9cbmZ1bmN0aW9uIHVud3JhcElkKGlkKSB7XG5cdHJldHVybiBpZC5zdGFydHNXaXRoKFwiL0BpZC9cIikgPyBpZC5zbGljZSg1KS5yZXBsYWNlKFwiX194MDBfX1wiLCBcIlxcMFwiKSA6IGlkO1xufVxuY29uc3Qgd2luZG93c1NsYXNoUkUgPSAvXFxcXC9nO1xuZnVuY3Rpb24gc2xhc2gocCkge1xuXHRyZXR1cm4gcC5yZXBsYWNlKHdpbmRvd3NTbGFzaFJFLCBcIi9cIik7XG59XG5jb25zdCBwb3N0Zml4UkUgPSAvWz8jXS4qJC87XG5mdW5jdGlvbiBjbGVhblVybCh1cmwpIHtcblx0cmV0dXJuIHVybC5yZXBsYWNlKHBvc3RmaXhSRSwgXCJcIik7XG59XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHRyZXR1cm4gIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPSBcImZ1bmN0aW9uXCI7XG59XG5jb25zdCBBc3luY0Z1bmN0aW9uID0gYXN5bmMgZnVuY3Rpb24oKSB7fS5jb25zdHJ1Y3RvcjtcbmxldCBhc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50O1xuZnVuY3Rpb24gZ2V0QXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCgpIHtcblx0aWYgKGFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvblBhZGRpbmdMaW5lQ291bnQgPT09IHZvaWQgMCkge1xuXHRcdGxldCBib2R5ID0gXCIvKmNvZGUqL1wiLCBzb3VyY2UgPSBuZXcgQXN5bmNGdW5jdGlvbihcImFcIiwgXCJiXCIsIGJvZHkpLnRvU3RyaW5nKCk7XG5cdFx0YXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCA9IHNvdXJjZS5zbGljZSgwLCBzb3VyY2UuaW5kZXhPZihib2R5KSkuc3BsaXQoXCJcXG5cIikubGVuZ3RoIC0gMTtcblx0fVxuXHRyZXR1cm4gYXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudDtcbn1cbmZ1bmN0aW9uIHByb21pc2VXaXRoUmVzb2x2ZXJzKCkge1xuXHRsZXQgcmVzb2x2ZSwgcmVqZWN0O1xuXHRyZXR1cm4ge1xuXHRcdHByb21pc2U6IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZSA9IF9yZXNvbHZlLCByZWplY3QgPSBfcmVqZWN0O1xuXHRcdH0pLFxuXHRcdHJlc29sdmUsXG5cdFx0cmVqZWN0XG5cdH07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcGF0aGVAMi4wLjMvbm9kZV9tb2R1bGVzL3BhdGhlL2Rpc3Qvc2hhcmVkL3BhdGhlLk0tZVRodE5aLm1qc1xuY29uc3QgX0RSSVZFX0xFVFRFUl9TVEFSVF9SRSA9IC9eW0EtWmEtel06XFwvLztcbmZ1bmN0aW9uIG5vcm1hbGl6ZVdpbmRvd3NQYXRoKGlucHV0ID0gXCJcIikge1xuXHRyZXR1cm4gaW5wdXQgJiYgaW5wdXQucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikucmVwbGFjZShfRFJJVkVfTEVUVEVSX1NUQVJUX1JFLCAocikgPT4gci50b1VwcGVyQ2FzZSgpKTtcbn1cbmNvbnN0IF9JU19BQlNPTFVURV9SRSA9IC9eWy9cXFxcXSg/IVsvXFxcXF0pfF5bL1xcXFxdezJ9KD8hXFwuKXxeW0EtWmEtel06Wy9cXFxcXS8sIF9EUklWRV9MRVRURVJfUkUgPSAvXltBLVphLXpdOiQvO1xuZnVuY3Rpb24gY3dkKCkge1xuXHRyZXR1cm4gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiAmJiB0eXBlb2YgcHJvY2Vzcy5jd2QgPT0gXCJmdW5jdGlvblwiID8gcHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKSA6IFwiL1wiO1xufVxuY29uc3QgcmVzb2x2ZSA9IGZ1bmN0aW9uKC4uLmFyZ3VtZW50c18pIHtcblx0YXJndW1lbnRzXyA9IGFyZ3VtZW50c18ubWFwKChhcmd1bWVudCkgPT4gbm9ybWFsaXplV2luZG93c1BhdGgoYXJndW1lbnQpKTtcblx0bGV0IHJlc29sdmVkUGF0aCA9IFwiXCIsIHJlc29sdmVkQWJzb2x1dGUgPSAhMTtcblx0Zm9yIChsZXQgaW5kZXggPSBhcmd1bWVudHNfLmxlbmd0aCAtIDE7IGluZGV4ID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpbmRleC0tKSB7XG5cdFx0bGV0IHBhdGggPSBpbmRleCA+PSAwID8gYXJndW1lbnRzX1tpbmRleF0gOiBjd2QoKTtcblx0XHQhcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCB8fCAocmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YCwgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCkpO1xuXHR9XG5cdHJldHVybiByZXNvbHZlZFBhdGggPSBub3JtYWxpemVTdHJpbmcocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSksIHJlc29sdmVkQWJzb2x1dGUgJiYgIWlzQWJzb2x1dGUocmVzb2x2ZWRQYXRoKSA/IGAvJHtyZXNvbHZlZFBhdGh9YCA6IHJlc29sdmVkUGF0aC5sZW5ndGggPiAwID8gcmVzb2x2ZWRQYXRoIDogXCIuXCI7XG59O1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgsIGFsbG93QWJvdmVSb290KSB7XG5cdGxldCByZXMgPSBcIlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDAsIGxhc3RTbGFzaCA9IC0xLCBkb3RzID0gMCwgY2hhciA9IG51bGw7XG5cdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPD0gcGF0aC5sZW5ndGg7ICsraW5kZXgpIHtcblx0XHRpZiAoaW5kZXggPCBwYXRoLmxlbmd0aCkgY2hhciA9IHBhdGhbaW5kZXhdO1xuXHRcdGVsc2UgaWYgKGNoYXIgPT09IFwiL1wiKSBicmVhaztcblx0XHRlbHNlIGNoYXIgPSBcIi9cIjtcblx0XHRpZiAoY2hhciA9PT0gXCIvXCIpIHtcblx0XHRcdGlmICghKGxhc3RTbGFzaCA9PT0gaW5kZXggLSAxIHx8IGRvdHMgPT09IDEpKSBpZiAoZG90cyA9PT0gMikge1xuXHRcdFx0XHRpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gXCIuXCIgfHwgcmVzW3Jlcy5sZW5ndGggLSAyXSAhPT0gXCIuXCIpIHtcblx0XHRcdFx0XHRpZiAocmVzLmxlbmd0aCA+IDIpIHtcblx0XHRcdFx0XHRcdGxldCBsYXN0U2xhc2hJbmRleCA9IHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRcdFx0XHRsYXN0U2xhc2hJbmRleCA9PT0gLTEgPyAocmVzID0gXCJcIiwgbGFzdFNlZ21lbnRMZW5ndGggPSAwKSA6IChyZXMgPSByZXMuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpLCBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKSksIGxhc3RTbGFzaCA9IGluZGV4LCBkb3RzID0gMDtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHJlcyA9IFwiXCIsIGxhc3RTZWdtZW50TGVuZ3RoID0gMCwgbGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFsbG93QWJvdmVSb290ICYmIChyZXMgKz0gcmVzLmxlbmd0aCA+IDAgPyBcIi8uLlwiIDogXCIuLlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDIpO1xuXHRcdFx0fSBlbHNlIHJlcy5sZW5ndGggPiAwID8gcmVzICs9IGAvJHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KX1gIDogcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCksIGxhc3RTZWdtZW50TGVuZ3RoID0gaW5kZXggLSBsYXN0U2xhc2ggLSAxO1xuXHRcdFx0bGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdH0gZWxzZSBjaGFyID09PSBcIi5cIiAmJiBkb3RzICE9PSAtMSA/ICsrZG90cyA6IGRvdHMgPSAtMTtcblx0fVxuXHRyZXR1cm4gcmVzO1xufVxuY29uc3QgaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHApIHtcblx0cmV0dXJuIF9JU19BQlNPTFVURV9SRS50ZXN0KHApO1xufSwgZGlybmFtZSA9IGZ1bmN0aW9uKHApIHtcblx0bGV0IHNlZ21lbnRzID0gbm9ybWFsaXplV2luZG93c1BhdGgocCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSk7XG5cdHJldHVybiBzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgX0RSSVZFX0xFVFRFUl9SRS50ZXN0KHNlZ21lbnRzWzBdKSAmJiAoc2VnbWVudHNbMF0gKz0gXCIvXCIpLCBzZWdtZW50cy5qb2luKFwiL1wiKSB8fCAoaXNBYnNvbHV0ZShwKSA/IFwiL1wiIDogXCIuXCIpO1xufSwgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKSwgZGVjb2RlQmFzZTY0ID0gdHlwZW9mIEJ1ZmZlciA9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIEJ1ZmZlci5mcm9tID09IFwiZnVuY3Rpb25cIiA/IChiYXNlNjQpID0+IEJ1ZmZlci5mcm9tKGJhc2U2NCwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGYtOFwiKSA6IChiYXNlNjQpID0+IHRleHREZWNvZGVyLmRlY29kZShVaW50OEFycmF5LmZyb20oYXRvYihiYXNlNjQpLCAoYykgPT4gYy5jaGFyQ29kZUF0KDApKSksIHBlcmNlbnRSZWdFeCA9IC8lL2csIGJhY2tzbGFzaFJlZ0V4ID0gL1xcXFwvZywgbmV3bGluZVJlZ0V4ID0gL1xcbi9nLCBjYXJyaWFnZVJldHVyblJlZ0V4ID0gL1xcci9nLCB0YWJSZWdFeCA9IC9cXHQvZywgcXVlc3Rpb25SZWdleCA9IC9cXD8vZywgaGFzaFJlZ2V4ID0gLyMvZztcbmZ1bmN0aW9uIGVuY29kZVBhdGhDaGFycyhmaWxlcGF0aCkge1xuXHRyZXR1cm4gZmlsZXBhdGguaW5kZXhPZihcIiVcIikgIT09IC0xICYmIChmaWxlcGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocGVyY2VudFJlZ0V4LCBcIiUyNVwiKSksICFpc1dpbmRvd3MgJiYgZmlsZXBhdGguaW5kZXhPZihcIlxcXFxcIikgIT09IC0xICYmIChmaWxlcGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UoYmFja3NsYXNoUmVnRXgsIFwiJTVDXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlxcblwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShuZXdsaW5lUmVnRXgsIFwiJTBBXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlxcclwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShjYXJyaWFnZVJldHVyblJlZ0V4LCBcIiUwRFwiKSksIGZpbGVwYXRoLmluZGV4T2YoXCJcdFwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZSh0YWJSZWdFeCwgXCIlMDlcIikpLCBmaWxlcGF0aDtcbn1cbmNvbnN0IHBvc2l4RGlybmFtZSA9IGRpcm5hbWUsIHBvc2l4UmVzb2x2ZSA9IHJlc29sdmU7XG5mdW5jdGlvbiBwb3NpeFBhdGhUb0ZpbGVIcmVmKHBvc2l4UGF0aCkge1xuXHRsZXQgcmVzb2x2ZWQgPSBwb3NpeFJlc29sdmUocG9zaXhQYXRoKSwgZmlsZVBhdGhMYXN0ID0gcG9zaXhQYXRoLmNoYXJDb2RlQXQocG9zaXhQYXRoLmxlbmd0aCAtIDEpO1xuXHRyZXR1cm4gKGZpbGVQYXRoTGFzdCA9PT0gNDcgfHwgaXNXaW5kb3dzICYmIGZpbGVQYXRoTGFzdCA9PT0gOTIpICYmIHJlc29sdmVkW3Jlc29sdmVkLmxlbmd0aCAtIDFdICE9PSBcIi9cIiAmJiAocmVzb2x2ZWQgKz0gXCIvXCIpLCByZXNvbHZlZCA9IGVuY29kZVBhdGhDaGFycyhyZXNvbHZlZCksIHJlc29sdmVkLmluZGV4T2YoXCI/XCIpICE9PSAtMSAmJiAocmVzb2x2ZWQgPSByZXNvbHZlZC5yZXBsYWNlKHF1ZXN0aW9uUmVnZXgsIFwiJTNGXCIpKSwgcmVzb2x2ZWQuaW5kZXhPZihcIiNcIikgIT09IC0xICYmIChyZXNvbHZlZCA9IHJlc29sdmVkLnJlcGxhY2UoaGFzaFJlZ2V4LCBcIiUyM1wiKSksIG5ldyBVUkwoYGZpbGU6Ly8ke3Jlc29sdmVkfWApLmhyZWY7XG59XG5mdW5jdGlvbiB0b1dpbmRvd3NQYXRoKHBhdGgpIHtcblx0cmV0dXJuIHBhdGgucmVwbGFjZSgvXFwvL2csIFwiXFxcXFwiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AanJpZGdld2VsbCtzb3VyY2VtYXAtY29kZWNAMS41LjUvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy9kaXN0L3NvdXJjZW1hcC1jb2RlYy5tanNcbnZhciBjb21tYSA9IDQ0LCBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLCBpbnRUb0NoYXIgPSBuZXcgVWludDhBcnJheSg2NCksIGNoYXJUb0ludCA9IG5ldyBVaW50OEFycmF5KDEyOCk7XG5mb3IgKGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG5cdGxldCBjID0gY2hhcnMuY2hhckNvZGVBdChpKTtcblx0aW50VG9DaGFyW2ldID0gYywgY2hhclRvSW50W2NdID0gaTtcbn1cbmZ1bmN0aW9uIGRlY29kZUludGVnZXIocmVhZGVyLCByZWxhdGl2ZSkge1xuXHRsZXQgdmFsdWUgPSAwLCBzaGlmdCA9IDAsIGludGVnZXIgPSAwO1xuXHRkb1xuXHRcdGludGVnZXIgPSBjaGFyVG9JbnRbcmVhZGVyLm5leHQoKV0sIHZhbHVlIHw9IChpbnRlZ2VyICYgMzEpIDw8IHNoaWZ0LCBzaGlmdCArPSA1O1xuXHR3aGlsZSAoaW50ZWdlciAmIDMyKTtcblx0bGV0IHNob3VsZE5lZ2F0ZSA9IHZhbHVlICYgMTtcblx0cmV0dXJuIHZhbHVlID4+Pj0gMSwgc2hvdWxkTmVnYXRlICYmICh2YWx1ZSA9IC0yMTQ3NDgzNjQ4IHwgLXZhbHVlKSwgcmVsYXRpdmUgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGhhc01vcmVWbHEocmVhZGVyLCBtYXgpIHtcblx0cmV0dXJuIHJlYWRlci5wb3MgPj0gbWF4ID8gITEgOiByZWFkZXIucGVlaygpICE9PSBjb21tYTtcbn1cbnZhciBTdHJpbmdSZWFkZXIgPSBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuXHRcdHRoaXMucG9zID0gMCwgdGhpcy5idWZmZXIgPSBidWZmZXI7XG5cdH1cblx0bmV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy5idWZmZXIuY2hhckNvZGVBdCh0aGlzLnBvcysrKTtcblx0fVxuXHRwZWVrKCkge1xuXHRcdHJldHVybiB0aGlzLmJ1ZmZlci5jaGFyQ29kZUF0KHRoaXMucG9zKTtcblx0fVxuXHRpbmRleE9mKGNoYXIpIHtcblx0XHRsZXQgeyBidWZmZXIsIHBvcyB9ID0gdGhpcywgaWR4ID0gYnVmZmVyLmluZGV4T2YoY2hhciwgcG9zKTtcblx0XHRyZXR1cm4gaWR4ID09PSAtMSA/IGJ1ZmZlci5sZW5ndGggOiBpZHg7XG5cdH1cbn07XG5mdW5jdGlvbiBkZWNvZGUobWFwcGluZ3MpIHtcblx0bGV0IHsgbGVuZ3RoIH0gPSBtYXBwaW5ncywgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihtYXBwaW5ncyksIGRlY29kZWQgPSBbXSwgZ2VuQ29sdW1uID0gMCwgc291cmNlc0luZGV4ID0gMCwgc291cmNlTGluZSA9IDAsIHNvdXJjZUNvbHVtbiA9IDAsIG5hbWVzSW5kZXggPSAwO1xuXHRkbyB7XG5cdFx0bGV0IHNlbWkgPSByZWFkZXIuaW5kZXhPZihcIjtcIiksIGxpbmUgPSBbXSwgc29ydGVkID0gITAsIGxhc3RDb2wgPSAwO1xuXHRcdGZvciAoZ2VuQ29sdW1uID0gMDsgcmVhZGVyLnBvcyA8IHNlbWk7KSB7XG5cdFx0XHRsZXQgc2VnO1xuXHRcdFx0Z2VuQ29sdW1uID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIGdlbkNvbHVtbiksIGdlbkNvbHVtbiA8IGxhc3RDb2wgJiYgKHNvcnRlZCA9ICExKSwgbGFzdENvbCA9IGdlbkNvbHVtbiwgaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpID8gKHNvdXJjZXNJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzb3VyY2VzSW5kZXgpLCBzb3VyY2VMaW5lID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNvdXJjZUxpbmUpLCBzb3VyY2VDb2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc291cmNlQ29sdW1uKSwgaGFzTW9yZVZscShyZWFkZXIsIHNlbWkpID8gKG5hbWVzSW5kZXggPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgbmFtZXNJbmRleCksIHNlZyA9IFtcblx0XHRcdFx0Z2VuQ29sdW1uLFxuXHRcdFx0XHRzb3VyY2VzSW5kZXgsXG5cdFx0XHRcdHNvdXJjZUxpbmUsXG5cdFx0XHRcdHNvdXJjZUNvbHVtbixcblx0XHRcdFx0bmFtZXNJbmRleFxuXHRcdFx0XSkgOiBzZWcgPSBbXG5cdFx0XHRcdGdlbkNvbHVtbixcblx0XHRcdFx0c291cmNlc0luZGV4LFxuXHRcdFx0XHRzb3VyY2VMaW5lLFxuXHRcdFx0XHRzb3VyY2VDb2x1bW5cblx0XHRcdF0pIDogc2VnID0gW2dlbkNvbHVtbl0sIGxpbmUucHVzaChzZWcpLCByZWFkZXIucG9zKys7XG5cdFx0fVxuXHRcdHNvcnRlZCB8fCBzb3J0KGxpbmUpLCBkZWNvZGVkLnB1c2gobGluZSksIHJlYWRlci5wb3MgPSBzZW1pICsgMTtcblx0fSB3aGlsZSAocmVhZGVyLnBvcyA8PSBsZW5ndGgpO1xuXHRyZXR1cm4gZGVjb2RlZDtcbn1cbmZ1bmN0aW9uIHNvcnQobGluZSkge1xuXHRsaW5lLnNvcnQoc29ydENvbXBhcmF0b3IpO1xufVxuZnVuY3Rpb24gc29ydENvbXBhcmF0b3IoYSwgYikge1xuXHRyZXR1cm4gYVswXSAtIGJbMF07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGpyaWRnZXdlbGwrdHJhY2UtbWFwcGluZ0AwLjMuMzEvbm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmcvZGlzdC90cmFjZS1tYXBwaW5nLm1qc1xudmFyIENPTFVNTiA9IDAsIFNPVVJDRVNfSU5ERVggPSAxLCBTT1VSQ0VfTElORSA9IDIsIFNPVVJDRV9DT0xVTU4gPSAzLCBOQU1FU19JTkRFWCA9IDQsIGZvdW5kID0gITE7XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKSB7XG5cdGZvciAoOyBsb3cgPD0gaGlnaDspIHtcblx0XHRsZXQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cgPj4gMSksIGNtcCA9IGhheXN0YWNrW21pZF1bQ09MVU1OXSAtIG5lZWRsZTtcblx0XHRpZiAoY21wID09PSAwKSByZXR1cm4gZm91bmQgPSAhMCwgbWlkO1xuXHRcdGNtcCA8IDAgPyBsb3cgPSBtaWQgKyAxIDogaGlnaCA9IG1pZCAtIDE7XG5cdH1cblx0cmV0dXJuIGZvdW5kID0gITEsIGxvdyAtIDE7XG59XG5mdW5jdGlvbiB1cHBlckJvdW5kKGhheXN0YWNrLCBuZWVkbGUsIGluZGV4KSB7XG5cdGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBoYXlzdGFjay5sZW5ndGggJiYgaGF5c3RhY2tbaV1bQ09MVU1OXSA9PT0gbmVlZGxlOyBpbmRleCA9IGkrKyk7XG5cdHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIGxvd2VyQm91bmQoaGF5c3RhY2ssIG5lZWRsZSwgaW5kZXgpIHtcblx0Zm9yIChsZXQgaSA9IGluZGV4IC0gMTsgaSA+PSAwICYmIGhheXN0YWNrW2ldW0NPTFVNTl0gPT09IG5lZWRsZTsgaW5kZXggPSBpLS0pO1xuXHRyZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBtZW1vaXplZEJpbmFyeVNlYXJjaChoYXlzdGFjaywgbmVlZGxlLCBzdGF0ZSwga2V5KSB7XG5cdGxldCB7IGxhc3RLZXksIGxhc3ROZWVkbGUsIGxhc3RJbmRleCB9ID0gc3RhdGUsIGxvdyA9IDAsIGhpZ2ggPSBoYXlzdGFjay5sZW5ndGggLSAxO1xuXHRpZiAoa2V5ID09PSBsYXN0S2V5KSB7XG5cdFx0aWYgKG5lZWRsZSA9PT0gbGFzdE5lZWRsZSkgcmV0dXJuIGZvdW5kID0gbGFzdEluZGV4ICE9PSAtMSAmJiBoYXlzdGFja1tsYXN0SW5kZXhdW0NPTFVNTl0gPT09IG5lZWRsZSwgbGFzdEluZGV4O1xuXHRcdG5lZWRsZSA+PSBsYXN0TmVlZGxlID8gbG93ID0gbGFzdEluZGV4ID09PSAtMSA/IDAgOiBsYXN0SW5kZXggOiBoaWdoID0gbGFzdEluZGV4O1xuXHR9XG5cdHJldHVybiBzdGF0ZS5sYXN0S2V5ID0ga2V5LCBzdGF0ZS5sYXN0TmVlZGxlID0gbmVlZGxlLCBzdGF0ZS5sYXN0SW5kZXggPSBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKTtcbn1cbnZhciBMSU5FX0dUUl9aRVJPID0gXCJgbGluZWAgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAobGluZXMgc3RhcnQgYXQgbGluZSAxKVwiLCBDT0xfR1RSX0VRX1pFUk8gPSBcImBjb2x1bW5gIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgKGNvbHVtbnMgc3RhcnQgYXQgY29sdW1uIDApXCI7XG5mdW5jdGlvbiBjYXN0KG1hcCkge1xuXHRyZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gZGVjb2RlZE1hcHBpbmdzKG1hcCkge1xuXHR2YXIgX2E7XG5cdHJldHVybiAoX2EgPSBjYXN0KG1hcCkpLl9kZWNvZGVkIHx8IChfYS5fZGVjb2RlZCA9IGRlY29kZShjYXN0KG1hcCkuX2VuY29kZWQpKTtcbn1cbmZ1bmN0aW9uIG9yaWdpbmFsUG9zaXRpb25Gb3IobWFwLCBuZWVkbGUpIHtcblx0bGV0IHsgbGluZSwgY29sdW1uLCBiaWFzIH0gPSBuZWVkbGU7XG5cdGlmIChsaW5lLS0sIGxpbmUgPCAwKSB0aHJvdyBFcnJvcihMSU5FX0dUUl9aRVJPKTtcblx0aWYgKGNvbHVtbiA8IDApIHRocm93IEVycm9yKENPTF9HVFJfRVFfWkVSTyk7XG5cdGxldCBkZWNvZGVkID0gZGVjb2RlZE1hcHBpbmdzKG1hcCk7XG5cdGlmIChsaW5lID49IGRlY29kZWQubGVuZ3RoKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCBzZWdtZW50cyA9IGRlY29kZWRbbGluZV0sIGluZGV4ID0gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIGNhc3QobWFwKS5fZGVjb2RlZE1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcyB8fCAxKTtcblx0aWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIE9NYXBwaW5nKG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuXHRsZXQgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKHNlZ21lbnQubGVuZ3RoID09PSAxKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCB7IG5hbWVzLCByZXNvbHZlZFNvdXJjZXMgfSA9IG1hcDtcblx0cmV0dXJuIE9NYXBwaW5nKHJlc29sdmVkU291cmNlc1tzZWdtZW50W1NPVVJDRVNfSU5ERVhdXSwgc2VnbWVudFtTT1VSQ0VfTElORV0gKyAxLCBzZWdtZW50W1NPVVJDRV9DT0xVTU5dLCBzZWdtZW50Lmxlbmd0aCA9PT0gNSA/IG5hbWVzW3NlZ21lbnRbTkFNRVNfSU5ERVhdXSA6IG51bGwpO1xufVxuZnVuY3Rpb24gT01hcHBpbmcoc291cmNlLCBsaW5lLCBjb2x1bW4sIG5hbWUpIHtcblx0cmV0dXJuIHtcblx0XHRzb3VyY2UsXG5cdFx0bGluZSxcblx0XHRjb2x1bW4sXG5cdFx0bmFtZVxuXHR9O1xufVxuZnVuY3Rpb24gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIG1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcykge1xuXHRsZXQgaW5kZXggPSBtZW1vaXplZEJpbmFyeVNlYXJjaChzZWdtZW50cywgY29sdW1uLCBtZW1vLCBsaW5lKTtcblx0cmV0dXJuIGZvdW5kID8gaW5kZXggPSAoYmlhcyA9PT0gLTEgPyB1cHBlckJvdW5kIDogbG93ZXJCb3VuZCkoc2VnbWVudHMsIGNvbHVtbiwgaW5kZXgpIDogYmlhcyA9PT0gLTEgJiYgaW5kZXgrKywgaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggPyAtMSA6IGluZGV4O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvc291cmNlbWFwL2RlY29kZXIudHNcbnZhciBEZWNvZGVkTWFwID0gY2xhc3Mge1xuXHRfZW5jb2RlZDtcblx0X2RlY29kZWQ7XG5cdF9kZWNvZGVkTWVtbztcblx0dXJsO1xuXHRmaWxlO1xuXHR2ZXJzaW9uO1xuXHRuYW1lcyA9IFtdO1xuXHRyZXNvbHZlZFNvdXJjZXM7XG5cdGNvbnN0cnVjdG9yKG1hcCwgZnJvbSkge1xuXHRcdHRoaXMubWFwID0gbWFwO1xuXHRcdGxldCB7IG1hcHBpbmdzLCBuYW1lcywgc291cmNlcyB9ID0gbWFwO1xuXHRcdHRoaXMudmVyc2lvbiA9IG1hcC52ZXJzaW9uLCB0aGlzLm5hbWVzID0gbmFtZXMgfHwgW10sIHRoaXMuX2VuY29kZWQgPSBtYXBwaW5ncyB8fCBcIlwiLCB0aGlzLl9kZWNvZGVkTWVtbyA9IG1lbW9pemVkU3RhdGUoKSwgdGhpcy51cmwgPSBmcm9tLCB0aGlzLmZpbGUgPSBmcm9tO1xuXHRcdGxldCBvcmlnaW5EaXIgPSBwb3NpeERpcm5hbWUoZnJvbSk7XG5cdFx0dGhpcy5yZXNvbHZlZFNvdXJjZXMgPSAoc291cmNlcyB8fCBbXSkubWFwKChzKSA9PiBwb3NpeFJlc29sdmUob3JpZ2luRGlyLCBzIHx8IFwiXCIpKTtcblx0fVxufTtcbmZ1bmN0aW9uIG1lbW9pemVkU3RhdGUoKSB7XG5cdHJldHVybiB7XG5cdFx0bGFzdEtleTogLTEsXG5cdFx0bGFzdE5lZWRsZTogLTEsXG5cdFx0bGFzdEluZGV4OiAtMVxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0T3JpZ2luYWxQb3NpdGlvbihtYXAsIG5lZWRsZSkge1xuXHRsZXQgcmVzdWx0ID0gb3JpZ2luYWxQb3NpdGlvbkZvcihtYXAsIG5lZWRsZSk7XG5cdHJldHVybiByZXN1bHQuY29sdW1uID09IG51bGwgPyBudWxsIDogcmVzdWx0O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvZXZhbHVhdGVkTW9kdWxlcy50c1xuY29uc3QgTU9EVUxFX1JVTk5FUl9TT1VSQ0VNQVBQSU5HX1JFR0VYUCA9IFJlZ0V4cChgLy8jICR7U09VUkNFTUFQUElOR19VUkx9PWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsKC4rKWApO1xudmFyIEV2YWx1YXRlZE1vZHVsZU5vZGUgPSBjbGFzcyB7XG5cdGltcG9ydGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGltcG9ydHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRldmFsdWF0ZWQgPSAhMTtcblx0bWV0YTtcblx0cHJvbWlzZTtcblx0ZXhwb3J0cztcblx0ZmlsZTtcblx0bWFwO1xuXHRjb25zdHJ1Y3RvcihpZCwgdXJsKSB7XG5cdFx0dGhpcy5pZCA9IGlkLCB0aGlzLnVybCA9IHVybCwgdGhpcy5maWxlID0gY2xlYW5VcmwoaWQpO1xuXHR9XG59LCBFdmFsdWF0ZWRNb2R1bGVzID0gY2xhc3Mge1xuXHRpZFRvTW9kdWxlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0ZmlsZVRvTW9kdWxlc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdHVybFRvSWRNb2R1bGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHQvKipcblx0KiBSZXR1cm5zIHRoZSBtb2R1bGUgbm9kZSBieSB0aGUgcmVzb2x2ZWQgbW9kdWxlIElELiBVc3VhbGx5LCBtb2R1bGUgSUQgaXNcblx0KiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB3aXRoIHF1ZXJ5IGFuZC9vciBoYXNoLiBJdCBjYW4gYWxzbyBiZSBhIHZpcnR1YWwgbW9kdWxlLlxuXHQqXG5cdCogTW9kdWxlIHJ1bm5lciBncmFwaCB3aWxsIGhhdmUgMSB0byAxIG1hcHBpbmcgd2l0aCB0aGUgc2VydmVyIG1vZHVsZSBncmFwaC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCovXG5cdGdldE1vZHVsZUJ5SWQoaWQpIHtcblx0XHRyZXR1cm4gdGhpcy5pZFRvTW9kdWxlTWFwLmdldChpZCk7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJucyBhbGwgbW9kdWxlcyByZWxhdGVkIHRvIHRoZSBmaWxlIHN5c3RlbSBwYXRoLiBEaWZmZXJlbnQgbW9kdWxlc1xuXHQqIG1pZ2h0IGhhdmUgZGlmZmVyZW50IHF1ZXJ5IHBhcmFtZXRlcnMgb3IgaGFzaCwgc28gaXQncyBwb3NzaWJsZSB0byBoYXZlXG5cdCogbXVsdGlwbGUgbW9kdWxlcyBmb3IgdGhlIHNhbWUgZmlsZS5cblx0KiBAcGFyYW0gZmlsZSBUaGUgZmlsZSBzeXN0ZW0gcGF0aCBvZiB0aGUgbW9kdWxlXG5cdCovXG5cdGdldE1vZHVsZXNCeUZpbGUoZmlsZSkge1xuXHRcdHJldHVybiB0aGlzLmZpbGVUb01vZHVsZXNNYXAuZ2V0KGZpbGUpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgdGhlIG1vZHVsZSBub2RlIGJ5IHRoZSBVUkwgdGhhdCB3YXMgdXNlZCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudC5cblx0KiBVbmxpa2UgbW9kdWxlIGdyYXBoIG9uIHRoZSBzZXJ2ZXIsIHRoZSBVUkwgaXMgbm90IHJlc29sdmVkIGFuZCBpcyB1c2VkIGFzIGlzLlxuXHQqIEBwYXJhbSB1cmwgU2VydmVyIFVSTCB0aGF0IHdhcyB1c2VkIGluIHRoZSBpbXBvcnQgc3RhdGVtZW50XG5cdCovXG5cdGdldE1vZHVsZUJ5VXJsKHVybCkge1xuXHRcdHJldHVybiB0aGlzLnVybFRvSWRNb2R1bGVNYXAuZ2V0KHVud3JhcElkKHVybCkpO1xuXHR9XG5cdC8qKlxuXHQqIEVuc3VyZSB0aGF0IG1vZHVsZSBpcyBpbiB0aGUgZ3JhcGguIElmIHRoZSBtb2R1bGUgaXMgYWxyZWFkeSBpbiB0aGUgZ3JhcGgsXG5cdCogaXQgd2lsbCByZXR1cm4gdGhlIGV4aXN0aW5nIG1vZHVsZSBub2RlLiBPdGhlcndpc2UsIGl0IHdpbGwgY3JlYXRlIGEgbmV3XG5cdCogbW9kdWxlIG5vZGUgYW5kIGFkZCBpdCB0byB0aGUgZ3JhcGguXG5cdCogQHBhcmFtIGlkIFJlc29sdmVkIG1vZHVsZSBJRFxuXHQqIEBwYXJhbSB1cmwgVVJMIHRoYXQgd2FzIHVzZWQgaW4gdGhlIGltcG9ydCBzdGF0ZW1lbnRcblx0Ki9cblx0ZW5zdXJlTW9kdWxlKGlkLCB1cmwpIHtcblx0XHRpZiAoaWQgPSBub3JtYWxpemVNb2R1bGVJZChpZCksIHRoaXMuaWRUb01vZHVsZU1hcC5oYXMoaWQpKSB7XG5cdFx0XHRsZXQgbW9kdWxlTm9kZSA9IHRoaXMuaWRUb01vZHVsZU1hcC5nZXQoaWQpO1xuXHRcdFx0cmV0dXJuIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5zZXQodXJsLCBtb2R1bGVOb2RlKSwgbW9kdWxlTm9kZTtcblx0XHR9XG5cdFx0bGV0IG1vZHVsZU5vZGUgPSBuZXcgRXZhbHVhdGVkTW9kdWxlTm9kZShpZCwgdXJsKTtcblx0XHR0aGlzLmlkVG9Nb2R1bGVNYXAuc2V0KGlkLCBtb2R1bGVOb2RlKSwgdGhpcy51cmxUb0lkTW9kdWxlTWFwLnNldCh1cmwsIG1vZHVsZU5vZGUpO1xuXHRcdGxldCBmaWxlTW9kdWxlcyA9IHRoaXMuZmlsZVRvTW9kdWxlc01hcC5nZXQobW9kdWxlTm9kZS5maWxlKSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdHJldHVybiBmaWxlTW9kdWxlcy5hZGQobW9kdWxlTm9kZSksIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5zZXQobW9kdWxlTm9kZS5maWxlLCBmaWxlTW9kdWxlcyksIG1vZHVsZU5vZGU7XG5cdH1cblx0aW52YWxpZGF0ZU1vZHVsZShub2RlKSB7XG5cdFx0bm9kZS5ldmFsdWF0ZWQgPSAhMSwgbm9kZS5tZXRhID0gdm9pZCAwLCBub2RlLm1hcCA9IHZvaWQgMCwgbm9kZS5wcm9taXNlID0gdm9pZCAwLCBub2RlLmV4cG9ydHMgPSB2b2lkIDAsIG5vZGUuaW1wb3J0cy5jbGVhcigpO1xuXHR9XG5cdC8qKlxuXHQqIEV4dHJhY3RzIHRoZSBpbmxpbmVkIHNvdXJjZSBtYXAgZnJvbSB0aGUgbW9kdWxlIGNvZGUgYW5kIHJldHVybnMgdGhlIGRlY29kZWRcblx0KiBzb3VyY2UgbWFwLiBJZiB0aGUgc291cmNlIG1hcCBpcyBub3QgaW5saW5lZCwgaXQgd2lsbCByZXR1cm4gbnVsbC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCovXG5cdGdldE1vZHVsZVNvdXJjZU1hcEJ5SWQoaWQpIHtcblx0XHRsZXQgbW9kID0gdGhpcy5nZXRNb2R1bGVCeUlkKGlkKTtcblx0XHRpZiAoIW1vZCkgcmV0dXJuIG51bGw7XG5cdFx0aWYgKG1vZC5tYXApIHJldHVybiBtb2QubWFwO1xuXHRcdGlmICghbW9kLm1ldGEgfHwgIShcImNvZGVcIiBpbiBtb2QubWV0YSkpIHJldHVybiBudWxsO1xuXHRcdGxldCBwYXR0ZXJuID0gYC8vIyAke1NPVVJDRU1BUFBJTkdfVVJMfT1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGAsIGxhc3RJbmRleCA9IG1vZC5tZXRhLmNvZGUubGFzdEluZGV4T2YocGF0dGVybik7XG5cdFx0aWYgKGxhc3RJbmRleCA9PT0gLTEpIHJldHVybiBudWxsO1xuXHRcdGxldCBtYXBTdHJpbmcgPSBNT0RVTEVfUlVOTkVSX1NPVVJDRU1BUFBJTkdfUkVHRVhQLmV4ZWMobW9kLm1ldGEuY29kZS5zbGljZShsYXN0SW5kZXgpKT8uWzFdO1xuXHRcdHJldHVybiBtYXBTdHJpbmcgPyAobW9kLm1hcCA9IG5ldyBEZWNvZGVkTWFwKEpTT04ucGFyc2UoZGVjb2RlQmFzZTY0KG1hcFN0cmluZykpLCBtb2QuZmlsZSksIG1vZC5tYXApIDogbnVsbDtcblx0fVxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmlkVG9Nb2R1bGVNYXAuY2xlYXIoKSwgdGhpcy5maWxlVG9Nb2R1bGVzTWFwLmNsZWFyKCksIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5jbGVhcigpO1xuXHR9XG59O1xuY29uc3QgcHJlZml4ZWRCdWlsdGlucyA9IG5ldyBTZXQoW1xuXHRcIm5vZGU6c2VhXCIsXG5cdFwibm9kZTpzcWxpdGVcIixcblx0XCJub2RlOnRlc3RcIixcblx0XCJub2RlOnRlc3QvcmVwb3J0ZXJzXCJcbl0pO1xuZnVuY3Rpb24gbm9ybWFsaXplTW9kdWxlSWQoZmlsZSkge1xuXHRyZXR1cm4gcHJlZml4ZWRCdWlsdGlucy5oYXMoZmlsZSkgPyBmaWxlIDogc2xhc2goZmlsZSkucmVwbGFjZSgvXlxcL0Bmc1xcLy8sIGlzV2luZG93cyA/IFwiXCIgOiBcIi9cIikucmVwbGFjZSgvXm5vZGU6LywgXCJcIikucmVwbGFjZSgvXlxcLysvLCBcIi9cIikucmVwbGFjZSgvXmZpbGU6XFwvKy8sIGlzV2luZG93cyA/IFwiXCIgOiBcIi9cIik7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvc2hhcmVkL2htci50c1xudmFyIEhNUkNvbnRleHQgPSBjbGFzcyB7XG5cdG5ld0xpc3RlbmVycztcblx0Y29uc3RydWN0b3IoaG1yQ2xpZW50LCBvd25lclBhdGgpIHtcblx0XHR0aGlzLmhtckNsaWVudCA9IGhtckNsaWVudCwgdGhpcy5vd25lclBhdGggPSBvd25lclBhdGgsIGhtckNsaWVudC5kYXRhTWFwLmhhcyhvd25lclBhdGgpIHx8IGhtckNsaWVudC5kYXRhTWFwLnNldChvd25lclBhdGgsIHt9KTtcblx0XHRsZXQgbW9kID0gaG1yQ2xpZW50LmhvdE1vZHVsZXNNYXAuZ2V0KG93bmVyUGF0aCk7XG5cdFx0bW9kICYmIChtb2QuY2FsbGJhY2tzID0gW10pO1xuXHRcdGxldCBzdGFsZUxpc3RlbmVycyA9IGhtckNsaWVudC5jdHhUb0xpc3RlbmVyc01hcC5nZXQob3duZXJQYXRoKTtcblx0XHRpZiAoc3RhbGVMaXN0ZW5lcnMpIGZvciAobGV0IFtldmVudCwgc3RhbGVGbnNdIG9mIHN0YWxlTGlzdGVuZXJzKSB7XG5cdFx0XHRsZXQgbGlzdGVuZXJzID0gaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcC5nZXQoZXZlbnQpO1xuXHRcdFx0bGlzdGVuZXJzICYmIGhtckNsaWVudC5jdXN0b21MaXN0ZW5lcnNNYXAuc2V0KGV2ZW50LCBsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiAhc3RhbGVGbnMuaW5jbHVkZXMobCkpKTtcblx0XHR9XG5cdFx0dGhpcy5uZXdMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBobXJDbGllbnQuY3R4VG9MaXN0ZW5lcnNNYXAuc2V0KG93bmVyUGF0aCwgdGhpcy5uZXdMaXN0ZW5lcnMpO1xuXHR9XG5cdGdldCBkYXRhKCkge1xuXHRcdHJldHVybiB0aGlzLmhtckNsaWVudC5kYXRhTWFwLmdldCh0aGlzLm93bmVyUGF0aCk7XG5cdH1cblx0YWNjZXB0KGRlcHMsIGNhbGxiYWNrKSB7XG5cdFx0aWYgKHR5cGVvZiBkZXBzID09IFwiZnVuY3Rpb25cIiB8fCAhZGVwcykgdGhpcy5hY2NlcHREZXBzKFt0aGlzLm93bmVyUGF0aF0sIChbbW9kXSkgPT4gZGVwcz8uKG1vZCkpO1xuXHRcdGVsc2UgaWYgKHR5cGVvZiBkZXBzID09IFwic3RyaW5nXCIpIHRoaXMuYWNjZXB0RGVwcyhbZGVwc10sIChbbW9kXSkgPT4gY2FsbGJhY2s/Lihtb2QpKTtcblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGRlcHMpKSB0aGlzLmFjY2VwdERlcHMoZGVwcywgY2FsbGJhY2spO1xuXHRcdGVsc2UgdGhyb3cgRXJyb3IoXCJpbnZhbGlkIGhvdC5hY2NlcHQoKSB1c2FnZS5cIik7XG5cdH1cblx0YWNjZXB0RXhwb3J0cyhfLCBjYWxsYmFjaykge1xuXHRcdHRoaXMuYWNjZXB0RGVwcyhbdGhpcy5vd25lclBhdGhdLCAoW21vZF0pID0+IGNhbGxiYWNrPy4obW9kKSk7XG5cdH1cblx0ZGlzcG9zZShjYikge1xuXHRcdHRoaXMuaG1yQ2xpZW50LmRpc3Bvc2VNYXAuc2V0KHRoaXMub3duZXJQYXRoLCBjYik7XG5cdH1cblx0cHJ1bmUoY2IpIHtcblx0XHR0aGlzLmhtckNsaWVudC5wcnVuZU1hcC5zZXQodGhpcy5vd25lclBhdGgsIGNiKTtcblx0fVxuXHRkZWNsaW5lKCkge31cblx0aW52YWxpZGF0ZShtZXNzYWdlKSB7XG5cdFx0bGV0IGZpcnN0SW52YWxpZGF0ZWRCeSA9IHRoaXMuaG1yQ2xpZW50LmN1cnJlbnRGaXJzdEludmFsaWRhdGVkQnkgPz8gdGhpcy5vd25lclBhdGg7XG5cdFx0dGhpcy5obXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTppbnZhbGlkYXRlXCIsIHtcblx0XHRcdHBhdGg6IHRoaXMub3duZXJQYXRoLFxuXHRcdFx0bWVzc2FnZSxcblx0XHRcdGZpcnN0SW52YWxpZGF0ZWRCeVxuXHRcdH0pLCB0aGlzLnNlbmQoXCJ2aXRlOmludmFsaWRhdGVcIiwge1xuXHRcdFx0cGF0aDogdGhpcy5vd25lclBhdGgsXG5cdFx0XHRtZXNzYWdlLFxuXHRcdFx0Zmlyc3RJbnZhbGlkYXRlZEJ5XG5cdFx0fSksIHRoaXMuaG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhgaW52YWxpZGF0ZSAke3RoaXMub3duZXJQYXRofSR7bWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIn1gKTtcblx0fVxuXHRvbihldmVudCwgY2IpIHtcblx0XHRsZXQgYWRkVG9NYXAgPSAobWFwKSA9PiB7XG5cdFx0XHRsZXQgZXhpc3RpbmcgPSBtYXAuZ2V0KGV2ZW50KSB8fCBbXTtcblx0XHRcdGV4aXN0aW5nLnB1c2goY2IpLCBtYXAuc2V0KGV2ZW50LCBleGlzdGluZyk7XG5cdFx0fTtcblx0XHRhZGRUb01hcCh0aGlzLmhtckNsaWVudC5jdXN0b21MaXN0ZW5lcnNNYXApLCBhZGRUb01hcCh0aGlzLm5ld0xpc3RlbmVycyk7XG5cdH1cblx0b2ZmKGV2ZW50LCBjYikge1xuXHRcdGxldCByZW1vdmVGcm9tTWFwID0gKG1hcCkgPT4ge1xuXHRcdFx0bGV0IGV4aXN0aW5nID0gbWFwLmdldChldmVudCk7XG5cdFx0XHRpZiAoZXhpc3RpbmcgPT09IHZvaWQgMCkgcmV0dXJuO1xuXHRcdFx0bGV0IHBydW5lZCA9IGV4aXN0aW5nLmZpbHRlcigobCkgPT4gbCAhPT0gY2IpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0bWFwLmRlbGV0ZShldmVudCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdG1hcC5zZXQoZXZlbnQsIHBydW5lZCk7XG5cdFx0fTtcblx0XHRyZW1vdmVGcm9tTWFwKHRoaXMuaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcCksIHJlbW92ZUZyb21NYXAodGhpcy5uZXdMaXN0ZW5lcnMpO1xuXHR9XG5cdHNlbmQoZXZlbnQsIGRhdGEpIHtcblx0XHR0aGlzLmhtckNsaWVudC5zZW5kKHtcblx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRldmVudCxcblx0XHRcdGRhdGFcblx0XHR9KTtcblx0fVxuXHRhY2NlcHREZXBzKGRlcHMsIGNhbGxiYWNrID0gKCkgPT4ge30pIHtcblx0XHRsZXQgbW9kID0gdGhpcy5obXJDbGllbnQuaG90TW9kdWxlc01hcC5nZXQodGhpcy5vd25lclBhdGgpIHx8IHtcblx0XHRcdGlkOiB0aGlzLm93bmVyUGF0aCxcblx0XHRcdGNhbGxiYWNrczogW11cblx0XHR9O1xuXHRcdG1vZC5jYWxsYmFja3MucHVzaCh7XG5cdFx0XHRkZXBzLFxuXHRcdFx0Zm46IGNhbGxiYWNrXG5cdFx0fSksIHRoaXMuaG1yQ2xpZW50LmhvdE1vZHVsZXNNYXAuc2V0KHRoaXMub3duZXJQYXRoLCBtb2QpO1xuXHR9XG59LCBITVJDbGllbnQgPSBjbGFzcyB7XG5cdGhvdE1vZHVsZXNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRkaXNwb3NlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0cHJ1bmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRkYXRhTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y3VzdG9tTGlzdGVuZXJzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0Y3R4VG9MaXN0ZW5lcnNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRjdXJyZW50Rmlyc3RJbnZhbGlkYXRlZEJ5O1xuXHRjb25zdHJ1Y3Rvcihsb2dnZXIsIHRyYW5zcG9ydCwgaW1wb3J0VXBkYXRlZE1vZHVsZSkge1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyLCB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydCwgdGhpcy5pbXBvcnRVcGRhdGVkTW9kdWxlID0gaW1wb3J0VXBkYXRlZE1vZHVsZTtcblx0fVxuXHRhc3luYyBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIGRhdGEpIHtcblx0XHRsZXQgY2JzID0gdGhpcy5jdXN0b21MaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcblx0XHRjYnMgJiYgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNicy5tYXAoKGNiKSA9PiBjYihkYXRhKSkpO1xuXHR9XG5cdHNlbmQocGF5bG9hZCkge1xuXHRcdHRoaXMudHJhbnNwb3J0LnNlbmQocGF5bG9hZCkuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoZXJyKTtcblx0XHR9KTtcblx0fVxuXHRjbGVhcigpIHtcblx0XHR0aGlzLmhvdE1vZHVsZXNNYXAuY2xlYXIoKSwgdGhpcy5kaXNwb3NlTWFwLmNsZWFyKCksIHRoaXMucHJ1bmVNYXAuY2xlYXIoKSwgdGhpcy5kYXRhTWFwLmNsZWFyKCksIHRoaXMuY3VzdG9tTGlzdGVuZXJzTWFwLmNsZWFyKCksIHRoaXMuY3R4VG9MaXN0ZW5lcnNNYXAuY2xlYXIoKTtcblx0fVxuXHRhc3luYyBwcnVuZVBhdGhzKHBhdGhzKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwocGF0aHMubWFwKChwYXRoKSA9PiB7XG5cdFx0XHRsZXQgZGlzcG9zZXIgPSB0aGlzLmRpc3Bvc2VNYXAuZ2V0KHBhdGgpO1xuXHRcdFx0aWYgKGRpc3Bvc2VyKSByZXR1cm4gZGlzcG9zZXIodGhpcy5kYXRhTWFwLmdldChwYXRoKSk7XG5cdFx0fSkpLCBhd2FpdCBQcm9taXNlLmFsbChwYXRocy5tYXAoKHBhdGgpID0+IHtcblx0XHRcdGxldCBmbiA9IHRoaXMucHJ1bmVNYXAuZ2V0KHBhdGgpO1xuXHRcdFx0aWYgKGZuKSByZXR1cm4gZm4odGhpcy5kYXRhTWFwLmdldChwYXRoKSk7XG5cdFx0fSkpO1xuXHR9XG5cdHdhcm5GYWlsZWRVcGRhdGUoZXJyLCBwYXRoKSB7XG5cdFx0KCEoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHx8ICFlcnIubWVzc2FnZS5pbmNsdWRlcyhcImZldGNoXCIpKSAmJiB0aGlzLmxvZ2dlci5lcnJvcihlcnIpLCB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3BhdGh9LiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBzeW50YXggZXJyb3JzIG9yIGltcG9ydGluZyBub24tZXhpc3RlbnQgbW9kdWxlcy4gKHNlZSBlcnJvcnMgYWJvdmUpYCk7XG5cdH1cblx0dXBkYXRlUXVldWUgPSBbXTtcblx0cGVuZGluZ1VwZGF0ZVF1ZXVlID0gITE7XG5cdC8qKlxuXHQqIGJ1ZmZlciBtdWx0aXBsZSBob3QgdXBkYXRlcyB0cmlnZ2VyZWQgYnkgdGhlIHNhbWUgc3JjIGNoYW5nZVxuXHQqIHNvIHRoYXQgdGhleSBhcmUgaW52b2tlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGV5IHdlcmUgc2VudC5cblx0KiAob3RoZXJ3aXNlIHRoZSBvcmRlciBtYXkgYmUgaW5jb25zaXN0ZW50IGJlY2F1c2Ugb2YgdGhlIGh0dHAgcmVxdWVzdCByb3VuZCB0cmlwKVxuXHQqL1xuXHRhc3luYyBxdWV1ZVVwZGF0ZShwYXlsb2FkKSB7XG5cdFx0aWYgKHRoaXMudXBkYXRlUXVldWUucHVzaCh0aGlzLmZldGNoVXBkYXRlKHBheWxvYWQpKSwgIXRoaXMucGVuZGluZ1VwZGF0ZVF1ZXVlKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdVcGRhdGVRdWV1ZSA9ICEwLCBhd2FpdCBQcm9taXNlLnJlc29sdmUoKSwgdGhpcy5wZW5kaW5nVXBkYXRlUXVldWUgPSAhMTtcblx0XHRcdGxldCBsb2FkaW5nID0gWy4uLnRoaXMudXBkYXRlUXVldWVdO1xuXHRcdFx0dGhpcy51cGRhdGVRdWV1ZSA9IFtdLCAoYXdhaXQgUHJvbWlzZS5hbGwobG9hZGluZykpLmZvckVhY2goKGZuKSA9PiBmbiAmJiBmbigpKTtcblx0XHR9XG5cdH1cblx0YXN5bmMgZmV0Y2hVcGRhdGUodXBkYXRlKSB7XG5cdFx0bGV0IHsgcGF0aCwgYWNjZXB0ZWRQYXRoLCBmaXJzdEludmFsaWRhdGVkQnkgfSA9IHVwZGF0ZSwgbW9kID0gdGhpcy5ob3RNb2R1bGVzTWFwLmdldChwYXRoKTtcblx0XHRpZiAoIW1vZCkgcmV0dXJuO1xuXHRcdGxldCBmZXRjaGVkTW9kdWxlLCBpc1NlbGZVcGRhdGUgPSBwYXRoID09PSBhY2NlcHRlZFBhdGgsIHF1YWxpZmllZENhbGxiYWNrcyA9IG1vZC5jYWxsYmFja3MuZmlsdGVyKCh7IGRlcHMgfSkgPT4gZGVwcy5pbmNsdWRlcyhhY2NlcHRlZFBhdGgpKTtcblx0XHRpZiAoaXNTZWxmVXBkYXRlIHx8IHF1YWxpZmllZENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRsZXQgZGlzcG9zZXIgPSB0aGlzLmRpc3Bvc2VNYXAuZ2V0KGFjY2VwdGVkUGF0aCk7XG5cdFx0XHRkaXNwb3NlciAmJiBhd2FpdCBkaXNwb3Nlcih0aGlzLmRhdGFNYXAuZ2V0KGFjY2VwdGVkUGF0aCkpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZmV0Y2hlZE1vZHVsZSA9IGF3YWl0IHRoaXMuaW1wb3J0VXBkYXRlZE1vZHVsZSh1cGRhdGUpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR0aGlzLndhcm5GYWlsZWRVcGRhdGUoZSwgYWNjZXB0ZWRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA9IGZpcnN0SW52YWxpZGF0ZWRCeTtcblx0XHRcdFx0Zm9yIChsZXQgeyBkZXBzLCBmbiB9IG9mIHF1YWxpZmllZENhbGxiYWNrcykgZm4oZGVwcy5tYXAoKGRlcCkgPT4gZGVwID09PSBhY2NlcHRlZFBhdGggPyBmZXRjaGVkTW9kdWxlIDogdm9pZCAwKSk7XG5cdFx0XHRcdGxldCBsb2dnZWRQYXRoID0gaXNTZWxmVXBkYXRlID8gcGF0aCA6IGAke2FjY2VwdGVkUGF0aH0gdmlhICR7cGF0aH1gO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci5kZWJ1ZyhgaG90IHVwZGF0ZWQ6ICR7bG9nZ2VkUGF0aH1gKTtcblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9zc3JUcmFuc2Zvcm0udHNcbi8qKlxuKiBWaXRlIGNvbnZlcnRzIGBpbXBvcnQgeyB9IGZyb20gJ2ZvbydgIHRvIGBjb25zdCBfID0gX192aXRlX3Nzcl9pbXBvcnRfXygnZm9vJylgLlxuKiBUb3AtbGV2ZWwgaW1wb3J0cyBhbmQgZHluYW1pYyBpbXBvcnRzIHdvcmsgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gTm9kZS5qcy5cbiogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIHRoZSBkaWZmZXJlbmNlcyBzbyBpdCBtYXRjaGVzIHByb2QgYmVoYXZpb3VyLlxuKi9cbmZ1bmN0aW9uIGFuYWx5emVJbXBvcnRlZE1vZERpZmZlcmVuY2UobW9kLCByYXdJZCwgbW9kdWxlVHlwZSwgbWV0YWRhdGEpIHtcblx0aWYgKCFtZXRhZGF0YT8uaXNEeW5hbWljSW1wb3J0ICYmIG1ldGFkYXRhPy5pbXBvcnRlZE5hbWVzPy5sZW5ndGgpIHtcblx0XHRsZXQgbWlzc2luZ0JpbmRpbmdzID0gbWV0YWRhdGEuaW1wb3J0ZWROYW1lcy5maWx0ZXIoKHMpID0+ICEocyBpbiBtb2QpKTtcblx0XHRpZiAobWlzc2luZ0JpbmRpbmdzLmxlbmd0aCkge1xuXHRcdFx0bGV0IGxhc3RCaW5kaW5nID0gbWlzc2luZ0JpbmRpbmdzW21pc3NpbmdCaW5kaW5ncy5sZW5ndGggLSAxXTtcblx0XHRcdHRocm93IFN5bnRheEVycm9yKG1vZHVsZVR5cGUgPT09IFwibW9kdWxlXCIgPyBgW3ZpdGVdIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICcke3Jhd0lkfScgZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJyR7bGFzdEJpbmRpbmd9J2AgOiBgXFxcblt2aXRlXSBOYW1lZCBleHBvcnQgJyR7bGFzdEJpbmRpbmd9JyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICcke3Jhd0lkfScgaXMgYSBDb21tb25KUyBtb2R1bGUsIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbkNvbW1vbkpTIG1vZHVsZXMgY2FuIGFsd2F5cyBiZSBpbXBvcnRlZCB2aWEgdGhlIGRlZmF1bHQgZXhwb3J0LCBmb3IgZXhhbXBsZSB1c2luZzpcblxuaW1wb3J0IHBrZyBmcm9tICcke3Jhd0lkfSc7XG5jb25zdCB7JHttaXNzaW5nQmluZGluZ3Muam9pbihcIiwgXCIpfX0gPSBwa2c7XG5gKTtcblx0XHR9XG5cdH1cbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9uYW5vaWRANS4xLjcvbm9kZV9tb2R1bGVzL25hbm9pZC9ub24tc2VjdXJlL2luZGV4LmpzXG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuXHRsZXQgaWQgPSBcIlwiLCBpID0gc2l6ZSB8IDA7XG5cdGZvciAoOyBpLS07KSBpZCArPSBcInVzZWFuZG9tLTI2VDE5ODM0MFBYNzVweEpBQ0tWRVJZTUlOREJVU0hXT0xGX0dRWmJmZ2hqa2xxdnd5enJpY3RcIltNYXRoLnJhbmRvbSgpICogNjQgfCAwXTtcblx0cmV0dXJuIGlkO1xufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvbW9kdWxlUnVubmVyVHJhbnNwb3J0LnRzXG5mdW5jdGlvbiByZXZpdmVJbnZva2VFcnJvcihlKSB7XG5cdGxldCBlcnJvciA9IEVycm9yKGUubWVzc2FnZSB8fCBcIlVua25vd24gaW52b2tlIGVycm9yXCIpO1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihlcnJvciwgZSwgeyBydW5uZXJFcnJvcjogLyogQF9fUFVSRV9fICovIEVycm9yKFwiUnVubmVyRXJyb3JcIikgfSksIGVycm9yO1xufVxuY29uc3QgY3JlYXRlSW52b2tlYWJsZVRyYW5zcG9ydCA9ICh0cmFuc3BvcnQpID0+IHtcblx0aWYgKHRyYW5zcG9ydC5pbnZva2UpIHJldHVybiB7XG5cdFx0Li4udHJhbnNwb3J0LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gYXdhaXQgdHJhbnNwb3J0Lmludm9rZSh7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6aW52b2tlXCIsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRpZDogXCJzZW5kXCIsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKFwiZXJyb3JcIiBpbiByZXN1bHQpIHRocm93IHJldml2ZUludm9rZUVycm9yKHJlc3VsdC5lcnJvcik7XG5cdFx0XHRyZXR1cm4gcmVzdWx0LnJlc3VsdDtcblx0XHR9XG5cdH07XG5cdGlmICghdHJhbnNwb3J0LnNlbmQgfHwgIXRyYW5zcG9ydC5jb25uZWN0KSB0aHJvdyBFcnJvcihcInRyYW5zcG9ydCBtdXN0IGltcGxlbWVudCBzZW5kIGFuZCBjb25uZWN0IHdoZW4gaW52b2tlIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTtcblx0bGV0IHJwY1Byb21pc2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0cmV0dXJuIHtcblx0XHQuLi50cmFuc3BvcnQsXG5cdFx0Y29ubmVjdCh7IG9uTWVzc2FnZSwgb25EaXNjb25uZWN0aW9uIH0pIHtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQuY29ubmVjdCh7XG5cdFx0XHRcdG9uTWVzc2FnZShwYXlsb2FkKSB7XG5cdFx0XHRcdFx0aWYgKHBheWxvYWQudHlwZSA9PT0gXCJjdXN0b21cIiAmJiBwYXlsb2FkLmV2ZW50ID09PSBcInZpdGU6aW52b2tlXCIpIHtcblx0XHRcdFx0XHRcdGxldCBkYXRhID0gcGF5bG9hZC5kYXRhO1xuXHRcdFx0XHRcdFx0aWYgKGRhdGEuaWQuc3RhcnRzV2l0aChcInJlc3BvbnNlOlwiKSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgaW52b2tlSWQgPSBkYXRhLmlkLnNsaWNlKDkpLCBwcm9taXNlID0gcnBjUHJvbWlzZXMuZ2V0KGludm9rZUlkKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFwcm9taXNlKSByZXR1cm47XG5cdFx0XHRcdFx0XHRcdHByb21pc2UudGltZW91dElkICYmIGNsZWFyVGltZW91dChwcm9taXNlLnRpbWVvdXRJZCksIHJwY1Byb21pc2VzLmRlbGV0ZShpbnZva2VJZCk7XG5cdFx0XHRcdFx0XHRcdGxldCB7IGVycm9yLCByZXN1bHQgfSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPyBwcm9taXNlLnJlamVjdChlcnJvcikgOiBwcm9taXNlLnJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvbk1lc3NhZ2UocGF5bG9hZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uRGlzY29ubmVjdGlvblxuXHRcdFx0fSk7XG5cdFx0fSxcblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0cmV0dXJuIHJwY1Byb21pc2VzLmZvckVhY2goKHByb21pc2UpID0+IHtcblx0XHRcdFx0cHJvbWlzZS5yZWplY3QoLyogQF9fUFVSRV9fICovIEVycm9yKGB0cmFuc3BvcnQgd2FzIGRpc2Nvbm5lY3RlZCwgY2Fubm90IGNhbGwgJHtKU09OLnN0cmluZ2lmeShwcm9taXNlLm5hbWUpfWApKTtcblx0XHRcdH0pLCBycGNQcm9taXNlcy5jbGVhcigpLCB0cmFuc3BvcnQuZGlzY29ubmVjdD8uKCk7XG5cdFx0fSxcblx0XHRzZW5kKGRhdGEpIHtcblx0XHRcdHJldHVybiB0cmFuc3BvcnQuc2VuZChkYXRhKTtcblx0XHR9LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRsZXQgcHJvbWlzZUlkID0gbmFub2lkKCksIHdyYXBwZWREYXRhID0ge1xuXHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRldmVudDogXCJ2aXRlOmludm9rZVwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRpZDogYHNlbmQ6JHtwcm9taXNlSWR9YCxcblx0XHRcdFx0XHRkYXRhXG5cdFx0XHRcdH1cblx0XHRcdH0sIHNlbmRQcm9taXNlID0gdHJhbnNwb3J0LnNlbmQod3JhcHBlZERhdGEpLCB7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9ID0gcHJvbWlzZVdpdGhSZXNvbHZlcnMoKSwgdGltZW91dCA9IHRyYW5zcG9ydC50aW1lb3V0ID8/IDZlNCwgdGltZW91dElkO1xuXHRcdFx0dGltZW91dCA+IDAgJiYgKHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRycGNQcm9taXNlcy5kZWxldGUocHJvbWlzZUlkKSwgcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBFcnJvcihgdHJhbnNwb3J0IGludm9rZSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zIChkYXRhOiAke0pTT04uc3RyaW5naWZ5KHdyYXBwZWREYXRhKX0pYCkpO1xuXHRcdFx0fSwgdGltZW91dCksIHRpbWVvdXRJZD8udW5yZWY/LigpKSwgcnBjUHJvbWlzZXMuc2V0KHByb21pc2VJZCwge1xuXHRcdFx0XHRyZXNvbHZlLFxuXHRcdFx0XHRyZWplY3QsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRpbWVvdXRJZFxuXHRcdFx0fSksIHNlbmRQcm9taXNlICYmIHNlbmRQcm9taXNlLmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXRJZCksIHJwY1Byb21pc2VzLmRlbGV0ZShwcm9taXNlSWQpLCByZWplY3QoZXJyKTtcblx0XHRcdH0pO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHByb21pc2U7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0dGhyb3cgcmV2aXZlSW52b2tlRXJyb3IoZXJyKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG59LCBub3JtYWxpemVNb2R1bGVSdW5uZXJUcmFuc3BvcnQgPSAodHJhbnNwb3J0KSA9PiB7XG5cdGxldCBpbnZva2VhYmxlVHJhbnNwb3J0ID0gY3JlYXRlSW52b2tlYWJsZVRyYW5zcG9ydCh0cmFuc3BvcnQpLCBpc0Nvbm5lY3RlZCA9ICFpbnZva2VhYmxlVHJhbnNwb3J0LmNvbm5lY3QsIGNvbm5lY3RpbmdQcm9taXNlO1xuXHRyZXR1cm4ge1xuXHRcdC4uLnRyYW5zcG9ydCxcblx0XHQuLi5pbnZva2VhYmxlVHJhbnNwb3J0LmNvbm5lY3QgPyB7IGFzeW5jIGNvbm5lY3Qob25NZXNzYWdlKSB7XG5cdFx0XHRpZiAoaXNDb25uZWN0ZWQpIHJldHVybjtcblx0XHRcdGlmIChjb25uZWN0aW5nUHJvbWlzZSkge1xuXHRcdFx0XHRhd2FpdCBjb25uZWN0aW5nUHJvbWlzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IG1heWJlUHJvbWlzZSA9IGludm9rZWFibGVUcmFuc3BvcnQuY29ubmVjdCh7XG5cdFx0XHRcdG9uTWVzc2FnZTogb25NZXNzYWdlID8/ICgoKSA9PiB7fSksXG5cdFx0XHRcdG9uRGlzY29ubmVjdGlvbigpIHtcblx0XHRcdFx0XHRpc0Nvbm5lY3RlZCA9ICExO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdG1heWJlUHJvbWlzZSAmJiAoY29ubmVjdGluZ1Byb21pc2UgPSBtYXliZVByb21pc2UsIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlLCBjb25uZWN0aW5nUHJvbWlzZSA9IHZvaWQgMCksIGlzQ29ubmVjdGVkID0gITA7XG5cdFx0fSB9IDoge30sXG5cdFx0Li4uaW52b2tlYWJsZVRyYW5zcG9ydC5kaXNjb25uZWN0ID8geyBhc3luYyBkaXNjb25uZWN0KCkge1xuXHRcdFx0aXNDb25uZWN0ZWQgJiYgKGNvbm5lY3RpbmdQcm9taXNlICYmIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlLCBpc0Nvbm5lY3RlZCA9ICExLCBhd2FpdCBpbnZva2VhYmxlVHJhbnNwb3J0LmRpc2Nvbm5lY3QoKSk7XG5cdFx0fSB9IDoge30sXG5cdFx0YXN5bmMgc2VuZChkYXRhKSB7XG5cdFx0XHRpZiAoaW52b2tlYWJsZVRyYW5zcG9ydC5zZW5kKSB7XG5cdFx0XHRcdGlmICghaXNDb25uZWN0ZWQpIGlmIChjb25uZWN0aW5nUHJvbWlzZSkgYXdhaXQgY29ubmVjdGluZ1Byb21pc2U7XG5cdFx0XHRcdGVsc2UgdGhyb3cgRXJyb3IoXCJzZW5kIHdhcyBjYWxsZWQgYmVmb3JlIGNvbm5lY3RcIik7XG5cdFx0XHRcdGF3YWl0IGludm9rZWFibGVUcmFuc3BvcnQuc2VuZChkYXRhKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFzeW5jIGludm9rZShuYW1lLCBkYXRhKSB7XG5cdFx0XHRpZiAoIWlzQ29ubmVjdGVkKSBpZiAoY29ubmVjdGluZ1Byb21pc2UpIGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlO1xuXHRcdFx0ZWxzZSB0aHJvdyBFcnJvcihcImludm9rZSB3YXMgY2FsbGVkIGJlZm9yZSBjb25uZWN0XCIpO1xuXHRcdFx0cmV0dXJuIGludm9rZWFibGVUcmFuc3BvcnQuaW52b2tlKG5hbWUsIGRhdGEpO1xuXHRcdH1cblx0fTtcbn0sIGNyZWF0ZVdlYlNvY2tldE1vZHVsZVJ1bm5lclRyYW5zcG9ydCA9IChvcHRpb25zKSA9PiB7XG5cdGxldCBwaW5nSW50ZXJ2YWwgPSBvcHRpb25zLnBpbmdJbnRlcnZhbCA/PyAzZTQsIHdzLCBwaW5nSW50ZXJ2YWxJZDtcblx0cmV0dXJuIHtcblx0XHRhc3luYyBjb25uZWN0KHsgb25NZXNzYWdlLCBvbkRpc2Nvbm5lY3Rpb24gfSkge1xuXHRcdFx0bGV0IHNvY2tldCA9IG9wdGlvbnMuY3JlYXRlQ29ubmVjdGlvbigpO1xuXHRcdFx0c29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jICh7IGRhdGEgfSkgPT4ge1xuXHRcdFx0XHRvbk1lc3NhZ2UoSlNPTi5wYXJzZShkYXRhKSk7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBpc09wZW5lZCA9IHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTjtcblx0XHRcdGlzT3BlbmVkIHx8IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0c29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsICgpID0+IHtcblx0XHRcdFx0XHRpc09wZW5lZCA9ICEwLCByZXNvbHZlKCk7XG5cdFx0XHRcdH0sIHsgb25jZTogITAgfSksIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGlmICghaXNPcGVuZWQpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgvKiBAX19QVVJFX18gKi8gRXJyb3IoXCJXZWJTb2NrZXQgY2xvc2VkIHdpdGhvdXQgb3BlbmVkLlwiKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9uTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRcdFx0ZXZlbnQ6IFwidml0ZTp3czpkaXNjb25uZWN0XCIsXG5cdFx0XHRcdFx0XHRkYXRhOiB7IHdlYlNvY2tldDogc29ja2V0IH1cblx0XHRcdFx0XHR9KSwgb25EaXNjb25uZWN0aW9uKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSksIG9uTWVzc2FnZSh7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6d3M6Y29ubmVjdFwiLFxuXHRcdFx0XHRkYXRhOiB7IHdlYlNvY2tldDogc29ja2V0IH1cblx0XHRcdH0pLCB3cyA9IHNvY2tldCwgcGluZ0ludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG5cdFx0XHRcdHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTiAmJiBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicGluZ1wiIH0pKTtcblx0XHRcdH0sIHBpbmdJbnRlcnZhbCk7XG5cdFx0fSxcblx0XHRkaXNjb25uZWN0KCkge1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChwaW5nSW50ZXJ2YWxJZCksIHdzPy5jbG9zZSgpO1xuXHRcdH0sXG5cdFx0c2VuZChkYXRhKSB7XG5cdFx0XHR3cy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblx0XHR9XG5cdH07XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9idWlsdGluLnRzXG5mdW5jdGlvbiBjcmVhdGVJc0J1aWx0aW4oYnVpbHRpbnMpIHtcblx0bGV0IHBsYWluQnVpbHRpbnNTZXQgPSBuZXcgU2V0KGJ1aWx0aW5zLmZpbHRlcigoYnVpbHRpbikgPT4gdHlwZW9mIGJ1aWx0aW4gPT0gXCJzdHJpbmdcIikpLCByZWdleEJ1aWx0aW5zID0gYnVpbHRpbnMuZmlsdGVyKChidWlsdGluKSA9PiB0eXBlb2YgYnVpbHRpbiAhPSBcInN0cmluZ1wiKTtcblx0cmV0dXJuIChpZCkgPT4gcGxhaW5CdWlsdGluc1NldC5oYXMoaWQpIHx8IHJlZ2V4QnVpbHRpbnMuc29tZSgocmVnZXhwKSA9PiByZWdleHAudGVzdChpZCkpO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvY29uc3RhbnRzLnRzXG5jb25zdCBzc3JNb2R1bGVFeHBvcnRzS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydHNfX1wiLCBzc3JJbXBvcnRLZXkgPSBcIl9fdml0ZV9zc3JfaW1wb3J0X19cIiwgc3NyRHluYW1pY0ltcG9ydEtleSA9IFwiX192aXRlX3Nzcl9keW5hbWljX2ltcG9ydF9fXCIsIHNzckV4cG9ydEFsbEtleSA9IFwiX192aXRlX3Nzcl9leHBvcnRBbGxfX1wiLCBzc3JFeHBvcnROYW1lS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydE5hbWVfX1wiLCBzc3JJbXBvcnRNZXRhS2V5ID0gXCJfX3ZpdGVfc3NyX2ltcG9ydF9tZXRhX19cIiwgbm9vcCA9ICgpID0+IHt9LCBzaWxlbnRDb25zb2xlID0ge1xuXHRkZWJ1Zzogbm9vcCxcblx0ZXJyb3I6IG5vb3Bcbn0sIGhtckxvZ2dlciA9IHtcblx0ZGVidWc6ICguLi5tc2cpID0+IGNvbnNvbGUubG9nKFwiW3ZpdGVdXCIsIC4uLm1zZyksXG5cdGVycm9yOiAoZXJyb3IpID0+IGNvbnNvbGUubG9nKFwiW3ZpdGVdXCIsIGVycm9yKVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvaG1ySGFuZGxlci50c1xuZnVuY3Rpb24gY3JlYXRlSE1SSGFuZGxlcihoYW5kbGVyKSB7XG5cdGxldCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRyZXR1cm4gKHBheWxvYWQpID0+IHF1ZXVlLmVucXVldWUoKCkgPT4gaGFuZGxlcihwYXlsb2FkKSk7XG59XG52YXIgUXVldWUgPSBjbGFzcyB7XG5cdHF1ZXVlID0gW107XG5cdHBlbmRpbmcgPSAhMTtcblx0ZW5xdWV1ZShwcm9taXNlKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMucXVldWUucHVzaCh7XG5cdFx0XHRcdHByb21pc2UsXG5cdFx0XHRcdHJlc29sdmUsXG5cdFx0XHRcdHJlamVjdFxuXHRcdFx0fSksIHRoaXMuZGVxdWV1ZSgpO1xuXHRcdH0pO1xuXHR9XG5cdGRlcXVldWUoKSB7XG5cdFx0aWYgKHRoaXMucGVuZGluZykgcmV0dXJuICExO1xuXHRcdGxldCBpdGVtID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXHRcdHJldHVybiBpdGVtID8gKHRoaXMucGVuZGluZyA9ICEwLCBpdGVtLnByb21pc2UoKS50aGVuKGl0ZW0ucmVzb2x2ZSkuY2F0Y2goaXRlbS5yZWplY3QpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0dGhpcy5wZW5kaW5nID0gITEsIHRoaXMuZGVxdWV1ZSgpO1xuXHRcdH0pLCAhMCkgOiAhMTtcblx0fVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2htckhhbmRsZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUhNUkhhbmRsZXJGb3JSdW5uZXIocnVubmVyKSB7XG5cdHJldHVybiBjcmVhdGVITVJIYW5kbGVyKGFzeW5jIChwYXlsb2FkKSA9PiB7XG5cdFx0bGV0IGhtckNsaWVudCA9IHJ1bm5lci5obXJDbGllbnQ7XG5cdFx0aWYgKCEoIWhtckNsaWVudCB8fCBydW5uZXIuaXNDbG9zZWQoKSkpIHN3aXRjaCAocGF5bG9hZC50eXBlKSB7XG5cdFx0XHRjYXNlIFwiY29ubmVjdGVkXCI6XG5cdFx0XHRcdGhtckNsaWVudC5sb2dnZXIuZGVidWcoXCJjb25uZWN0ZWQuXCIpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJ1cGRhdGVcIjpcblx0XHRcdFx0YXdhaXQgaG1yQ2xpZW50Lm5vdGlmeUxpc3RlbmVycyhcInZpdGU6YmVmb3JlVXBkYXRlXCIsIHBheWxvYWQpLCBhd2FpdCBQcm9taXNlLmFsbChwYXlsb2FkLnVwZGF0ZXMubWFwKGFzeW5jICh1cGRhdGUpID0+IHtcblx0XHRcdFx0XHRpZiAodXBkYXRlLnR5cGUgPT09IFwianMtdXBkYXRlXCIpIHJldHVybiB1cGRhdGUuYWNjZXB0ZWRQYXRoID0gdW53cmFwSWQodXBkYXRlLmFjY2VwdGVkUGF0aCksIHVwZGF0ZS5wYXRoID0gdW53cmFwSWQodXBkYXRlLnBhdGgpLCBobXJDbGllbnQucXVldWVVcGRhdGUodXBkYXRlKTtcblx0XHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmVycm9yKFwiY3NzIGhtciBpcyBub3Qgc3VwcG9ydGVkIGluIHJ1bm5lciBtb2RlLlwiKTtcblx0XHRcdFx0fSkpLCBhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTphZnRlclVwZGF0ZVwiLCBwYXlsb2FkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiY3VzdG9tXCI6XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMocGF5bG9hZC5ldmVudCwgcGF5bG9hZC5kYXRhKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZnVsbC1yZWxvYWRcIjoge1xuXHRcdFx0XHRsZXQgeyB0cmlnZ2VyZWRCeSB9ID0gcGF5bG9hZCwgY2xlYXJFbnRyeXBvaW50VXJscyA9IHRyaWdnZXJlZEJ5ID8gZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgZ2V0TW9kdWxlc0J5RmlsZShydW5uZXIsIHNsYXNoKHRyaWdnZXJlZEJ5KSkpIDogZmluZEFsbEVudHJ5cG9pbnRzKHJ1bm5lcik7XG5cdFx0XHRcdGlmICghY2xlYXJFbnRyeXBvaW50VXJscy5zaXplKSBicmVhaztcblx0XHRcdFx0aG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhcInByb2dyYW0gcmVsb2FkXCIpLCBhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTpiZWZvcmVGdWxsUmVsb2FkXCIsIHBheWxvYWQpLCBydW5uZXIuZXZhbHVhdGVkTW9kdWxlcy5jbGVhcigpO1xuXHRcdFx0XHRmb3IgKGxldCB1cmwgb2YgY2xlYXJFbnRyeXBvaW50VXJscykge1xuXHRcdFx0XHRcdGlmIChydW5uZXIuaXNDbG9zZWQoKSkgYnJlYWs7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHJ1bm5lci5pbXBvcnQodXJsKTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHRcdGlmIChydW5uZXIuaXNDbG9zZWQoKSkgYnJlYWs7XG5cdFx0XHRcdFx0XHRlcnIuY29kZSAhPT0gXCJFUlJfT1VUREFURURfT1BUSU1JWkVEX0RFUFwiICYmIGhtckNsaWVudC5sb2dnZXIuZXJyb3IoYEFuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBmdWxsIHJlbG9hZFxcbiR7ZXJyLm1lc3NhZ2V9XFxuJHtlcnIuc3RhY2t9YCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcInBydW5lXCI6XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmJlZm9yZVBydW5lXCIsIHBheWxvYWQpLCBhd2FpdCBobXJDbGllbnQucHJ1bmVQYXRocyhwYXlsb2FkLnBhdGhzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiZXJyb3JcIjoge1xuXHRcdFx0XHRhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTplcnJvclwiLCBwYXlsb2FkKTtcblx0XHRcdFx0bGV0IGVyciA9IHBheWxvYWQuZXJyO1xuXHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmVycm9yKGBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcXG4ke2Vyci5tZXNzYWdlfVxcbiR7ZXJyLnN0YWNrfWApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJwaW5nXCI6IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIHBheWxvYWQ7XG5cdFx0fVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldE1vZHVsZXNCeUZpbGUocnVubmVyLCBmaWxlKSB7XG5cdGxldCBub2RlcyA9IHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmdldE1vZHVsZXNCeUZpbGUoZmlsZSk7XG5cdHJldHVybiBub2RlcyA/IFsuLi5ub2Rlc10ubWFwKChub2RlKSA9PiBub2RlLmlkKSA6IFtdO1xufVxuZnVuY3Rpb24gZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgbW9kdWxlcywgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIGVudHJ5cG9pbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuXHRmb3IgKGxldCBtb2R1bGVJZCBvZiBtb2R1bGVzKSB7XG5cdFx0aWYgKHZpc2l0ZWQuaGFzKG1vZHVsZUlkKSkgY29udGludWU7XG5cdFx0dmlzaXRlZC5hZGQobW9kdWxlSWQpO1xuXHRcdGxldCBtb2R1bGUgPSBydW5uZXIuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeUlkKG1vZHVsZUlkKTtcblx0XHRpZiAobW9kdWxlKSB7XG5cdFx0XHRpZiAoIW1vZHVsZS5pbXBvcnRlcnMuc2l6ZSkge1xuXHRcdFx0XHRlbnRyeXBvaW50cy5hZGQobW9kdWxlLnVybCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZXQgaW1wb3J0ZXIgb2YgbW9kdWxlLmltcG9ydGVycykgZ2V0TW9kdWxlc0VudHJ5cG9pbnRzKHJ1bm5lciwgW2ltcG9ydGVyXSwgdmlzaXRlZCwgZW50cnlwb2ludHMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZW50cnlwb2ludHM7XG59XG5mdW5jdGlvbiBmaW5kQWxsRW50cnlwb2ludHMocnVubmVyLCBlbnRyeXBvaW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcblx0Zm9yIChsZXQgbW9kIG9mIHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmlkVG9Nb2R1bGVNYXAudmFsdWVzKCkpIG1vZC5pbXBvcnRlcnMuc2l6ZSB8fCBlbnRyeXBvaW50cy5hZGQobW9kLnVybCk7XG5cdHJldHVybiBlbnRyeXBvaW50cztcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3NvdXJjZW1hcC9pbnRlcmNlcHRvci50c1xuY29uc3Qgc291cmNlTWFwQ2FjaGUgPSB7fSwgZmlsZUNvbnRlbnRzQ2FjaGUgPSB7fSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgcmV0cmlldmVGaWxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgY3JlYXRlRXhlY0hhbmRsZXJzID0gKGhhbmRsZXJzKSA9PiAoKC4uLmFyZ3MpID0+IHtcblx0Zm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycykge1xuXHRcdGxldCByZXN1bHQgPSBoYW5kbGVyKC4uLmFyZ3MpO1xuXHRcdGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59KSwgcmV0cmlldmVGaWxlRnJvbUhhbmRsZXJzID0gY3JlYXRlRXhlY0hhbmRsZXJzKHJldHJpZXZlRmlsZUhhbmRsZXJzKSwgcmV0cmlldmVTb3VyY2VNYXBGcm9tSGFuZGxlcnMgPSBjcmVhdGVFeGVjSGFuZGxlcnMocmV0cmlldmVTb3VyY2VNYXBIYW5kbGVycyk7XG5sZXQgb3ZlcnJpZGRlbiA9ICExO1xuY29uc3Qgb3JpZ2luYWxQcmVwYXJlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG5mdW5jdGlvbiByZXNldEludGVyY2VwdG9yKHJ1bm5lciwgb3B0aW9ucykge1xuXHRldmFsdWF0ZWRNb2R1bGVzQ2FjaGUuZGVsZXRlKHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzKSwgb3B0aW9ucy5yZXRyaWV2ZUZpbGUgJiYgcmV0cmlldmVGaWxlSGFuZGxlcnMuZGVsZXRlKG9wdGlvbnMucmV0cmlldmVGaWxlKSwgb3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCAmJiByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzLmRlbGV0ZShvcHRpb25zLnJldHJpZXZlU291cmNlTWFwKSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlLnNpemUgPT09IDAgJiYgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb3JpZ2luYWxQcmVwYXJlLCBvdmVycmlkZGVuID0gITEpO1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0U3RhY2tUcmFjZShydW5uZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb3ZlcnJpZGRlbiB8fD0gKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcGFyZVN0YWNrVHJhY2UsICEwKSwgZXZhbHVhdGVkTW9kdWxlc0NhY2hlLmFkZChydW5uZXIuZXZhbHVhdGVkTW9kdWxlcyksIG9wdGlvbnMucmV0cmlldmVGaWxlICYmIHJldHJpZXZlRmlsZUhhbmRsZXJzLmFkZChvcHRpb25zLnJldHJpZXZlRmlsZSksIG9wdGlvbnMucmV0cmlldmVTb3VyY2VNYXAgJiYgcmV0cmlldmVTb3VyY2VNYXBIYW5kbGVycy5hZGQob3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCksICgpID0+IHJlc2V0SW50ZXJjZXB0b3IocnVubmVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHN1cHBvcnRSZWxhdGl2ZVVSTChmaWxlLCB1cmwpIHtcblx0aWYgKCFmaWxlKSByZXR1cm4gdXJsO1xuXHRsZXQgZGlyID0gcG9zaXhEaXJuYW1lKHNsYXNoKGZpbGUpKSwgbWF0Y2ggPSAvXlxcdys6XFwvXFwvW14vXSovLmV4ZWMoZGlyKSwgcHJvdG9jb2wgPSBtYXRjaCA/IG1hdGNoWzBdIDogXCJcIiwgc3RhcnRQYXRoID0gZGlyLnNsaWNlKHByb3RvY29sLmxlbmd0aCk7XG5cdHJldHVybiBwcm90b2NvbCAmJiAvXlxcL1xcdzovLnRlc3Qoc3RhcnRQYXRoKSA/IChwcm90b2NvbCArPSBcIi9cIiwgcHJvdG9jb2wgKyBzbGFzaChwb3NpeFJlc29sdmUoc3RhcnRQYXRoLCB1cmwpKSkgOiBwcm90b2NvbCArIHBvc2l4UmVzb2x2ZShzdGFydFBhdGgsIHVybCk7XG59XG5mdW5jdGlvbiBnZXRSdW5uZXJTb3VyY2VNYXAocG9zaXRpb24pIHtcblx0Zm9yIChsZXQgbW9kdWxlR3JhcGggb2YgZXZhbHVhdGVkTW9kdWxlc0NhY2hlKSB7XG5cdFx0bGV0IHNvdXJjZU1hcCA9IG1vZHVsZUdyYXBoLmdldE1vZHVsZVNvdXJjZU1hcEJ5SWQocG9zaXRpb24uc291cmNlKTtcblx0XHRpZiAoc291cmNlTWFwKSByZXR1cm4ge1xuXHRcdFx0dXJsOiBwb3NpdGlvbi5zb3VyY2UsXG5cdFx0XHRtYXA6IHNvdXJjZU1hcCxcblx0XHRcdHZpdGU6ICEwXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJldHJpZXZlRmlsZShwYXRoKSB7XG5cdGlmIChwYXRoIGluIGZpbGVDb250ZW50c0NhY2hlKSByZXR1cm4gZmlsZUNvbnRlbnRzQ2FjaGVbcGF0aF07XG5cdGxldCBjb250ZW50ID0gcmV0cmlldmVGaWxlRnJvbUhhbmRsZXJzKHBhdGgpO1xuXHRyZXR1cm4gdHlwZW9mIGNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IChmaWxlQ29udGVudHNDYWNoZVtwYXRoXSA9IGNvbnRlbnQsIGNvbnRlbnQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIHJldHJpZXZlU291cmNlTWFwVVJMKHNvdXJjZSkge1xuXHRsZXQgZmlsZURhdGEgPSByZXRyaWV2ZUZpbGUoc291cmNlKTtcblx0aWYgKCFmaWxlRGF0YSkgcmV0dXJuIG51bGw7XG5cdGxldCByZSA9IC9cXC9cXC9bQCNdXFxzKnNvdXJjZU1hcHBpbmdVUkw9KFteXFxzJ1wiXSspXFxzKiR8XFwvXFwqW0AjXVxccypzb3VyY2VNYXBwaW5nVVJMPVteXFxzKidcIl0rXFxzKlxcKlxcL1xccyokL2dtLCBsYXN0TWF0Y2gsIG1hdGNoO1xuXHRmb3IgKDsgbWF0Y2ggPSByZS5leGVjKGZpbGVEYXRhKTspIGxhc3RNYXRjaCA9IG1hdGNoO1xuXHRyZXR1cm4gbGFzdE1hdGNoID8gbGFzdE1hdGNoWzFdIDogbnVsbDtcbn1cbmNvbnN0IHJlU291cmNlTWFwID0gL15kYXRhOmFwcGxpY2F0aW9uXFwvanNvblteLF0rYmFzZTY0LC87XG5mdW5jdGlvbiByZXRyaWV2ZVNvdXJjZU1hcChzb3VyY2UpIHtcblx0bGV0IHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwRnJvbUhhbmRsZXJzKHNvdXJjZSk7XG5cdGlmICh1cmxBbmRNYXApIHJldHVybiB1cmxBbmRNYXA7XG5cdGxldCBzb3VyY2VNYXBwaW5nVVJMID0gcmV0cmlldmVTb3VyY2VNYXBVUkwoc291cmNlKTtcblx0aWYgKCFzb3VyY2VNYXBwaW5nVVJMKSByZXR1cm4gbnVsbDtcblx0bGV0IHNvdXJjZU1hcERhdGE7XG5cdGlmIChyZVNvdXJjZU1hcC50ZXN0KHNvdXJjZU1hcHBpbmdVUkwpKSB7XG5cdFx0bGV0IHJhd0RhdGEgPSBzb3VyY2VNYXBwaW5nVVJMLnNsaWNlKHNvdXJjZU1hcHBpbmdVUkwuaW5kZXhPZihcIixcIikgKyAxKTtcblx0XHRzb3VyY2VNYXBEYXRhID0gQnVmZmVyLmZyb20ocmF3RGF0YSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKSwgc291cmNlTWFwcGluZ1VSTCA9IHNvdXJjZTtcblx0fSBlbHNlIHNvdXJjZU1hcHBpbmdVUkwgPSBzdXBwb3J0UmVsYXRpdmVVUkwoc291cmNlLCBzb3VyY2VNYXBwaW5nVVJMKSwgc291cmNlTWFwRGF0YSA9IHJldHJpZXZlRmlsZShzb3VyY2VNYXBwaW5nVVJMKTtcblx0cmV0dXJuIHNvdXJjZU1hcERhdGEgPyB7XG5cdFx0dXJsOiBzb3VyY2VNYXBwaW5nVVJMLFxuXHRcdG1hcDogc291cmNlTWFwRGF0YVxuXHR9IDogbnVsbDtcbn1cbmZ1bmN0aW9uIG1hcFNvdXJjZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG5cdGlmICghcG9zaXRpb24uc291cmNlKSByZXR1cm4gcG9zaXRpb247XG5cdGxldCBzb3VyY2VNYXAgPSBnZXRSdW5uZXJTb3VyY2VNYXAocG9zaXRpb24pO1xuXHRpZiAoc291cmNlTWFwIHx8PSBzb3VyY2VNYXBDYWNoZVtwb3NpdGlvbi5zb3VyY2VdLCAhc291cmNlTWFwKSB7XG5cdFx0bGV0IHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwKHBvc2l0aW9uLnNvdXJjZSk7XG5cdFx0aWYgKHVybEFuZE1hcCAmJiB1cmxBbmRNYXAubWFwKSB7XG5cdFx0XHRsZXQgdXJsID0gdXJsQW5kTWFwLnVybDtcblx0XHRcdHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG5cdFx0XHRcdHVybCxcblx0XHRcdFx0bWFwOiBuZXcgRGVjb2RlZE1hcCh0eXBlb2YgdXJsQW5kTWFwLm1hcCA9PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh1cmxBbmRNYXAubWFwKSA6IHVybEFuZE1hcC5tYXAsIHVybClcblx0XHRcdH07XG5cdFx0XHRsZXQgY29udGVudHMgPSBzb3VyY2VNYXAubWFwPy5tYXAuc291cmNlc0NvbnRlbnQ7XG5cdFx0XHRzb3VyY2VNYXAubWFwICYmIGNvbnRlbnRzICYmIHNvdXJjZU1hcC5tYXAucmVzb2x2ZWRTb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuXHRcdFx0XHRsZXQgY29udGVudCA9IGNvbnRlbnRzW2ldO1xuXHRcdFx0XHRpZiAoY29udGVudCAmJiBzb3VyY2UgJiYgdXJsKSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRlbnRVcmwgPSBzdXBwb3J0UmVsYXRpdmVVUkwodXJsLCBzb3VyY2UpO1xuXHRcdFx0XHRcdGZpbGVDb250ZW50c0NhY2hlW2NvbnRlbnRVcmxdID0gY29udGVudDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG5cdFx0XHR1cmw6IG51bGwsXG5cdFx0XHRtYXA6IG51bGxcblx0XHR9O1xuXHR9XG5cdGlmIChzb3VyY2VNYXAubWFwICYmIHNvdXJjZU1hcC51cmwpIHtcblx0XHRsZXQgb3JpZ2luYWxQb3NpdGlvbiA9IGdldE9yaWdpbmFsUG9zaXRpb24oc291cmNlTWFwLm1hcCwgcG9zaXRpb24pO1xuXHRcdGlmIChvcmlnaW5hbFBvc2l0aW9uICYmIG9yaWdpbmFsUG9zaXRpb24uc291cmNlICE9IG51bGwpIHJldHVybiBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSA9IHN1cHBvcnRSZWxhdGl2ZVVSTChzb3VyY2VNYXAudXJsLCBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSksIHNvdXJjZU1hcC52aXRlICYmIChvcmlnaW5hbFBvc2l0aW9uLl92aXRlID0gITApLCBvcmlnaW5hbFBvc2l0aW9uO1xuXHR9XG5cdHJldHVybiBwb3NpdGlvbjtcbn1cbmZ1bmN0aW9uIG1hcEV2YWxPcmlnaW4ob3JpZ2luKSB7XG5cdGxldCBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKyk6KFxcZCspOihcXGQrKVxcKSQvLmV4ZWMob3JpZ2luKTtcblx0aWYgKG1hdGNoKSB7XG5cdFx0bGV0IHBvc2l0aW9uID0gbWFwU291cmNlUG9zaXRpb24oe1xuXHRcdFx0bmFtZTogbnVsbCxcblx0XHRcdHNvdXJjZTogbWF0Y2hbMl0sXG5cdFx0XHRsaW5lOiArbWF0Y2hbM10sXG5cdFx0XHRjb2x1bW46IG1hdGNoWzRdIC0gMVxuXHRcdH0pO1xuXHRcdHJldHVybiBgZXZhbCBhdCAke21hdGNoWzFdfSAoJHtwb3NpdGlvbi5zb3VyY2V9OiR7cG9zaXRpb24ubGluZX06JHtwb3NpdGlvbi5jb2x1bW4gKyAxfSlgO1xuXHR9XG5cdHJldHVybiBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKylcXCkkLy5leGVjKG9yaWdpbiksIG1hdGNoID8gYGV2YWwgYXQgJHttYXRjaFsxXX0gKCR7bWFwRXZhbE9yaWdpbihtYXRjaFsyXSl9KWAgOiBvcmlnaW47XG59XG5mdW5jdGlvbiBDYWxsU2l0ZVRvU3RyaW5nKCkge1xuXHRsZXQgZmlsZU5hbWUsIGZpbGVMb2NhdGlvbiA9IFwiXCI7XG5cdGlmICh0aGlzLmlzTmF0aXZlKCkpIGZpbGVMb2NhdGlvbiA9IFwibmF0aXZlXCI7XG5cdGVsc2Uge1xuXHRcdGZpbGVOYW1lID0gdGhpcy5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKSwgIWZpbGVOYW1lICYmIHRoaXMuaXNFdmFsKCkgJiYgKGZpbGVMb2NhdGlvbiA9IHRoaXMuZ2V0RXZhbE9yaWdpbigpLCBmaWxlTG9jYXRpb24gKz0gXCIsIFwiKSwgZmlsZU5hbWUgPyBmaWxlTG9jYXRpb24gKz0gZmlsZU5hbWUgOiBmaWxlTG9jYXRpb24gKz0gXCI8YW5vbnltb3VzPlwiO1xuXHRcdGxldCBsaW5lTnVtYmVyID0gdGhpcy5nZXRMaW5lTnVtYmVyKCk7XG5cdFx0aWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkge1xuXHRcdFx0ZmlsZUxvY2F0aW9uICs9IGA6JHtsaW5lTnVtYmVyfWA7XG5cdFx0XHRsZXQgY29sdW1uTnVtYmVyID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKTtcblx0XHRcdGNvbHVtbk51bWJlciAmJiAoZmlsZUxvY2F0aW9uICs9IGA6JHtjb2x1bW5OdW1iZXJ9YCk7XG5cdFx0fVxuXHR9XG5cdGxldCBsaW5lID0gXCJcIiwgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoKSwgYWRkU3VmZml4ID0gITAsIGlzQ29uc3RydWN0b3IgPSB0aGlzLmlzQ29uc3RydWN0b3IoKTtcblx0aWYgKHRoaXMuaXNUb3BsZXZlbCgpIHx8IGlzQ29uc3RydWN0b3IpIGlzQ29uc3RydWN0b3IgPyBsaW5lICs9IGBuZXcgJHtmdW5jdGlvbk5hbWUgfHwgXCI8YW5vbnltb3VzPlwifWAgOiBmdW5jdGlvbk5hbWUgPyBsaW5lICs9IGZ1bmN0aW9uTmFtZSA6IChsaW5lICs9IGZpbGVMb2NhdGlvbiwgYWRkU3VmZml4ID0gITEpO1xuXHRlbHNlIHtcblx0XHRsZXQgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7XG5cdFx0dHlwZU5hbWUgPT09IFwiW29iamVjdCBPYmplY3RdXCIgJiYgKHR5cGVOYW1lID0gXCJudWxsXCIpO1xuXHRcdGxldCBtZXRob2ROYW1lID0gdGhpcy5nZXRNZXRob2ROYW1lKCk7XG5cdFx0ZnVuY3Rpb25OYW1lID8gKHR5cGVOYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKHR5cGVOYW1lKSAhPT0gMCAmJiAobGluZSArPSBgJHt0eXBlTmFtZX0uYCksIGxpbmUgKz0gZnVuY3Rpb25OYW1lLCBtZXRob2ROYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKGAuJHttZXRob2ROYW1lfWApICE9PSBmdW5jdGlvbk5hbWUubGVuZ3RoIC0gbWV0aG9kTmFtZS5sZW5ndGggLSAxICYmIChsaW5lICs9IGAgW2FzICR7bWV0aG9kTmFtZX1dYCkpIDogbGluZSArPSBgJHt0eXBlTmFtZX0uJHttZXRob2ROYW1lIHx8IFwiPGFub255bW91cz5cIn1gO1xuXHR9XG5cdHJldHVybiBhZGRTdWZmaXggJiYgKGxpbmUgKz0gYCAoJHtmaWxlTG9jYXRpb259KWApLCBsaW5lO1xufVxuZnVuY3Rpb24gY2xvbmVDYWxsU2l0ZShmcmFtZSkge1xuXHRsZXQgb2JqZWN0ID0ge307XG5cdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnJhbWUpKS5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0bGV0IGtleSA9IG5hbWU7XG5cdFx0b2JqZWN0W2tleV0gPSAvXig/OmlzfGdldCkvLnRlc3QobmFtZSkgPyBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmcmFtZVtrZXldLmNhbGwoZnJhbWUpO1xuXHRcdH0gOiBmcmFtZVtrZXldO1xuXHR9KSwgb2JqZWN0LnRvU3RyaW5nID0gQ2FsbFNpdGVUb1N0cmluZywgb2JqZWN0O1xufVxuZnVuY3Rpb24gd3JhcENhbGxTaXRlKGZyYW1lLCBzdGF0ZSkge1xuXHRpZiAoc3RhdGUgPT09IHZvaWQgMCAmJiAoc3RhdGUgPSB7XG5cdFx0bmV4dFBvc2l0aW9uOiBudWxsLFxuXHRcdGN1clBvc2l0aW9uOiBudWxsXG5cdH0pLCBmcmFtZS5pc05hdGl2ZSgpKSByZXR1cm4gc3RhdGUuY3VyUG9zaXRpb24gPSBudWxsLCBmcmFtZTtcblx0bGV0IHNvdXJjZSA9IGZyYW1lLmdldEZpbGVOYW1lKCkgfHwgZnJhbWUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKCk7XG5cdGlmIChzb3VyY2UpIHtcblx0XHRsZXQgcG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbih7XG5cdFx0XHRuYW1lOiBudWxsLFxuXHRcdFx0c291cmNlLFxuXHRcdFx0bGluZTogZnJhbWUuZ2V0TGluZU51bWJlcigpID8/IDAsXG5cdFx0XHRjb2x1bW46IChmcmFtZS5nZXRDb2x1bW5OdW1iZXIoKSA/PyAxKSAtIDFcblx0XHR9KTtcblx0XHRzdGF0ZS5jdXJQb3NpdGlvbiA9IHBvc2l0aW9uLCBmcmFtZSA9IGNsb25lQ2FsbFNpdGUoZnJhbWUpO1xuXHRcdGxldCBvcmlnaW5hbEZ1bmN0aW9uTmFtZSA9IGZyYW1lLmdldEZ1bmN0aW9uTmFtZTtcblx0XHRyZXR1cm4gZnJhbWUuZ2V0RnVuY3Rpb25OYW1lID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgbmFtZSA9IHN0YXRlLm5leHRQb3NpdGlvbiA9PSBudWxsID8gb3JpZ2luYWxGdW5jdGlvbk5hbWUoKSA6IHN0YXRlLm5leHRQb3NpdGlvbi5uYW1lIHx8IG9yaWdpbmFsRnVuY3Rpb25OYW1lKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJldmFsXCIgJiYgXCJfdml0ZVwiIGluIHBvc2l0aW9uID8gbnVsbCA6IG5hbWU7XG5cdFx0fSwgZnJhbWUuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5zb3VyY2UgPz8gbnVsbDtcblx0XHR9LCBmcmFtZS5nZXRMaW5lTnVtYmVyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcG9zaXRpb24ubGluZTtcblx0XHR9LCBmcmFtZS5nZXRDb2x1bW5OdW1iZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5jb2x1bW4gKyAxO1xuXHRcdH0sIGZyYW1lLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHBvc2l0aW9uLnNvdXJjZTtcblx0XHR9LCBmcmFtZTtcblx0fVxuXHRsZXQgb3JpZ2luID0gZnJhbWUuaXNFdmFsKCkgJiYgZnJhbWUuZ2V0RXZhbE9yaWdpbigpO1xuXHRyZXR1cm4gb3JpZ2luID8gKG9yaWdpbiA9IG1hcEV2YWxPcmlnaW4ob3JpZ2luKSwgZnJhbWUgPSBjbG9uZUNhbGxTaXRlKGZyYW1lKSwgZnJhbWUuZ2V0RXZhbE9yaWdpbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBvcmlnaW4gfHwgdm9pZCAwO1xuXHR9LCBmcmFtZSkgOiBmcmFtZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTdGFja1RyYWNlKGVycm9yLCBzdGFjaykge1xuXHRsZXQgZXJyb3JTdHJpbmcgPSBgJHtlcnJvci5uYW1lIHx8IFwiRXJyb3JcIn06ICR7ZXJyb3IubWVzc2FnZSB8fCBcIlwifWAsIHN0YXRlID0ge1xuXHRcdG5leHRQb3NpdGlvbjogbnVsbCxcblx0XHRjdXJQb3NpdGlvbjogbnVsbFxuXHR9LCBwcm9jZXNzZWRTdGFjayA9IFtdO1xuXHRmb3IgKGxldCBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHByb2Nlc3NlZFN0YWNrLnB1c2goYFxcbiAgICBhdCAke3dyYXBDYWxsU2l0ZShzdGFja1tpXSwgc3RhdGUpfWApLCBzdGF0ZS5uZXh0UG9zaXRpb24gPSBzdGF0ZS5jdXJQb3NpdGlvbjtcblx0cmV0dXJuIHN0YXRlLmN1clBvc2l0aW9uID0gc3RhdGUubmV4dFBvc2l0aW9uID0gbnVsbCwgZXJyb3JTdHJpbmcgKyBwcm9jZXNzZWRTdGFjay5yZXZlcnNlKCkuam9pbihcIlwiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3NvdXJjZW1hcC9pbmRleC50c1xuZnVuY3Rpb24gZW5hYmxlU291cmNlTWFwU3VwcG9ydChydW5uZXIpIHtcblx0aWYgKHJ1bm5lci5vcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yID09PSBcIm5vZGVcIikge1xuXHRcdGlmICh0eXBlb2YgcHJvY2VzcyA+IFwidVwiKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlIFxcXCJzb3VyY2VtYXBJbnRlcmNlcHRvcjogJ25vZGUnXFxcIiBiZWNhdXNlIGdsb2JhbCBcXFwicHJvY2Vzc1xcXCIgdmFyaWFibGUgaXMgbm90IGF2YWlsYWJsZS5cIik7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkICE9IFwiZnVuY3Rpb25cIikgdGhyb3cgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSBcXFwic291cmNlbWFwSW50ZXJjZXB0b3I6ICdub2RlJ1xcXCIgYmVjYXVzZSBcXFwicHJvY2Vzcy5zZXRTb3VyY2VNYXBzRW5hYmxlZFxcXCIgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIHVzZSBOb2RlID49IDE2LjYuMC5cIik7XG5cdFx0bGV0IGlzRW5hYmxlZEFscmVhZHkgPSBwcm9jZXNzLnNvdXJjZU1hcHNFbmFibGVkID8/ICExO1xuXHRcdHJldHVybiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkKCEwKSwgKCkgPT4gIWlzRW5hYmxlZEFscmVhZHkgJiYgcHJvY2Vzcy5zZXRTb3VyY2VNYXBzRW5hYmxlZCghMSk7XG5cdH1cblx0cmV0dXJuIGludGVyY2VwdFN0YWNrVHJhY2UocnVubmVyLCB0eXBlb2YgcnVubmVyLm9wdGlvbnMuc291cmNlbWFwSW50ZXJjZXB0b3IgPT0gXCJvYmplY3RcIiA/IHJ1bm5lci5vcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yIDogdm9pZCAwKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2VzbUV2YWx1YXRvci50c1xudmFyIEVTTW9kdWxlc0V2YWx1YXRvciA9IGNsYXNzIHtcblx0c3RhcnRPZmZzZXQgPSBnZXRBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50KCk7XG5cdGFzeW5jIHJ1bklubGluZWRNb2R1bGUoY29udGV4dCwgY29kZSkge1xuXHRcdGF3YWl0IG5ldyBBc3luY0Z1bmN0aW9uKHNzck1vZHVsZUV4cG9ydHNLZXksIHNzckltcG9ydE1ldGFLZXksIHNzckltcG9ydEtleSwgc3NyRHluYW1pY0ltcG9ydEtleSwgc3NyRXhwb3J0QWxsS2V5LCBzc3JFeHBvcnROYW1lS2V5LCBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjtcIiArIGNvZGUpKGNvbnRleHRbc3NyTW9kdWxlRXhwb3J0c0tleV0sIGNvbnRleHRbc3NySW1wb3J0TWV0YUtleV0sIGNvbnRleHRbc3NySW1wb3J0S2V5XSwgY29udGV4dFtzc3JEeW5hbWljSW1wb3J0S2V5XSwgY29udGV4dFtzc3JFeHBvcnRBbGxLZXldLCBjb250ZXh0W3NzckV4cG9ydE5hbWVLZXldKSwgT2JqZWN0LnNlYWwoY29udGV4dFtzc3JNb2R1bGVFeHBvcnRzS2V5XSk7XG5cdH1cblx0cnVuRXh0ZXJuYWxNb2R1bGUoZmlsZXBhdGgpIHtcblx0XHRyZXR1cm4gaW1wb3J0KGZpbGVwYXRoKTtcblx0fVxufTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2ltcG9ydE1ldGFSZXNvbHZlci50c1xuY29uc3QgY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UgPSBcInZpdGUtbW9kdWxlLXJ1bm5lcjppbXBvcnQtbWV0YS1yZXNvbHZlL3YxL1wiLCBjdXN0b21pemF0aW9uSG9va3NNb2R1bGUgPSBgXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpIHtcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCR7SlNPTi5zdHJpbmdpZnkoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpfSkpIHtcbiAgICBjb25zdCBkYXRhID0gc3BlY2lmaWVyLnNsaWNlKCR7SlNPTi5zdHJpbmdpZnkoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpfS5sZW5ndGgpXG4gICAgY29uc3QgW3BhcnNlZFNwZWNpZmllciwgcGFyc2VkSW1wb3J0ZXJdID0gSlNPTi5wYXJzZShkYXRhKVxuICAgIHNwZWNpZmllciA9IHBhcnNlZFNwZWNpZmllclxuICAgIGNvbnRleHQucGFyZW50VVJMID0gcGFyc2VkSW1wb3J0ZXJcbiAgfVxuICByZXR1cm4gbmV4dFJlc29sdmUoc3BlY2lmaWVyLCBjb250ZXh0KVxufVxuXG5gO1xuZnVuY3Rpb24gY3VzdG9taXphdGlvbkhvb2tSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCwgbmV4dFJlc29sdmUpIHtcblx0aWYgKHNwZWNpZmllci5zdGFydHNXaXRoKGN1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlKSkge1xuXHRcdGxldCBkYXRhID0gc3BlY2lmaWVyLnNsaWNlKDQyKSwgW3BhcnNlZFNwZWNpZmllciwgcGFyc2VkSW1wb3J0ZXJdID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRzcGVjaWZpZXIgPSBwYXJzZWRTcGVjaWZpZXIsIGNvbnRleHQucGFyZW50VVJMID0gcGFyc2VkSW1wb3J0ZXI7XG5cdH1cblx0cmV0dXJuIG5leHRSZXNvbHZlKHNwZWNpZmllciwgY29udGV4dCk7XG59XG5sZXQgaXNIb29rUmVnaXN0ZXJlZCA9ICExO1xuZnVuY3Rpb24gY3JlYXRlSW1wb3J0TWV0YVJlc29sdmVyKCkge1xuXHRpZiAoaXNIb29rUmVnaXN0ZXJlZCkgcmV0dXJuIGltcG9ydE1ldGFSZXNvbHZlV2l0aEN1c3RvbUhvb2s7XG5cdGxldCBtb2R1bGU7XG5cdHRyeSB7XG5cdFx0bW9kdWxlID0gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiA/IHByb2Nlc3MuZ2V0QnVpbHRpbk1vZHVsZShcIm5vZGU6bW9kdWxlXCIpLk1vZHVsZSA6IHZvaWQgMDtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChtb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLnJlZ2lzdGVySG9va3MpIHJldHVybiBtb2R1bGUucmVnaXN0ZXJIb29rcyh7IHJlc29sdmU6IGN1c3RvbWl6YXRpb25Ib29rUmVzb2x2ZSB9KSwgaXNIb29rUmVnaXN0ZXJlZCA9ICEwLCBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rO1xuXHRcdGlmIChtb2R1bGUucmVnaXN0ZXIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGxldCBob29rTW9kdWxlQ29udGVudCA9IGBkYXRhOnRleHQvamF2YXNjcmlwdCwke2VuY29kZVVSSShjdXN0b21pemF0aW9uSG9va3NNb2R1bGUpfWA7XG5cdFx0XHRcdG1vZHVsZS5yZWdpc3Rlcihob29rTW9kdWxlQ29udGVudCk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGlmIChcImNvZGVcIiBpbiBlICYmIGUuY29kZSA9PT0gXCJFUlJfTkVUV09SS19JTVBPUlRfRElTQUxMT1dFRFwiKSByZXR1cm47XG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXNIb29rUmVnaXN0ZXJlZCA9ICEwLCBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rO1xuXHRcdH1cblx0fVxufVxuZnVuY3Rpb24gaW1wb3J0TWV0YVJlc29sdmVXaXRoQ3VzdG9tSG9vayhzcGVjaWZpZXIsIGltcG9ydGVyKSB7XG5cdHJldHVybiBpbXBvcnQubWV0YS5yZXNvbHZlKGAke2N1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlfSR7SlNPTi5zdHJpbmdpZnkoW3NwZWNpZmllciwgaW1wb3J0ZXJdKX1gKTtcbn1cbmAke2N1c3RvbWl6YXRpb25Ib29rTmFtZXNwYWNlfWA7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbW9kdWxlLXJ1bm5lci9jcmVhdGVJbXBvcnRNZXRhLnRzXG5jb25zdCBlbnZQcm94eSA9IG5ldyBQcm94eSh7fSwgeyBnZXQoXywgcCkge1xuXHR0aHJvdyBFcnJvcihgW21vZHVsZSBydW5uZXJdIER5bmFtaWMgYWNjZXNzIG9mIFwiaW1wb3J0Lm1ldGEuZW52XCIgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlLCB1c2UgXCJpbXBvcnQubWV0YS5lbnYuJHtTdHJpbmcocCl9XCIgaW5zdGVhZC5gKTtcbn0gfSk7XG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YShtb2R1bGVQYXRoKSB7XG5cdGxldCBocmVmID0gcG9zaXhQYXRoVG9GaWxlSHJlZihtb2R1bGVQYXRoKSwgZmlsZW5hbWUgPSBtb2R1bGVQYXRoLCBkaXJuYW1lID0gcG9zaXhEaXJuYW1lKG1vZHVsZVBhdGgpO1xuXHRyZXR1cm4ge1xuXHRcdGZpbGVuYW1lOiBpc1dpbmRvd3MgPyB0b1dpbmRvd3NQYXRoKGZpbGVuYW1lKSA6IGZpbGVuYW1lLFxuXHRcdGRpcm5hbWU6IGlzV2luZG93cyA/IHRvV2luZG93c1BhdGgoZGlybmFtZSkgOiBkaXJuYW1lLFxuXHRcdHVybDogaHJlZixcblx0XHRlbnY6IGVudlByb3h5LFxuXHRcdHJlc29sdmUoX2lkLCBfcGFyZW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBcXFwiaW1wb3J0Lm1ldGEucmVzb2x2ZVxcXCIgaXMgbm90IHN1cHBvcnRlZC5cIik7XG5cdFx0fSxcblx0XHRnbG9iKCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJbbW9kdWxlIHJ1bm5lcl0gXFxcImltcG9ydC5tZXRhLmdsb2JcXFwiIGlzIHN0YXRpY2FsbHkgcmVwbGFjZWQgZHVyaW5nIGZpbGUgdHJhbnNmb3JtYXRpb24uIE1ha2Ugc3VyZSB0byByZWZlcmVuY2UgaXQgYnkgdGhlIGZ1bGwgbmFtZS5cIik7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4qIENyZWF0ZSBpbXBvcnQubWV0YSBvYmplY3QgZm9yIE5vZGUuanMuXG4qL1xuZnVuY3Rpb24gY3JlYXRlTm9kZUltcG9ydE1ldGEobW9kdWxlUGF0aCkge1xuXHRsZXQgZGVmYXVsdE1ldGEgPSBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YShtb2R1bGVQYXRoKSwgaHJlZiA9IGRlZmF1bHRNZXRhLnVybCwgaW1wb3J0TWV0YVJlc29sdmVyID0gY3JlYXRlSW1wb3J0TWV0YVJlc29sdmVyKCk7XG5cdHJldHVybiB7XG5cdFx0Li4uZGVmYXVsdE1ldGEsXG5cdFx0bWFpbjogITEsXG5cdFx0cmVzb2x2ZShpZCwgcGFyZW50KSB7XG5cdFx0XHRyZXR1cm4gKGltcG9ydE1ldGFSZXNvbHZlciA/PyBkZWZhdWx0TWV0YS5yZXNvbHZlKShpZCwgcGFyZW50ID8/IGhyZWYpO1xuXHRcdH1cblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL3J1bm5lci50c1xudmFyIE1vZHVsZVJ1bm5lciA9IGNsYXNzIHtcblx0ZXZhbHVhdGVkTW9kdWxlcztcblx0aG1yQ2xpZW50O1xuXHR0cmFuc3BvcnQ7XG5cdHJlc2V0U291cmNlTWFwU3VwcG9ydDtcblx0Y29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdGlzQnVpbHRpbjtcblx0YnVpbHRpbnNQcm9taXNlO1xuXHRjbG9zZWQgPSAhMTtcblx0Y29uc3RydWN0b3Iob3B0aW9ucywgZXZhbHVhdG9yID0gbmV3IEVTTW9kdWxlc0V2YWx1YXRvcigpLCBkZWJ1Zykge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMgPSBvcHRpb25zLCB0aGlzLmV2YWx1YXRvciA9IGV2YWx1YXRvciwgdGhpcy5kZWJ1ZyA9IGRlYnVnLCB0aGlzLmV2YWx1YXRlZE1vZHVsZXMgPSBvcHRpb25zLmV2YWx1YXRlZE1vZHVsZXMgPz8gbmV3IEV2YWx1YXRlZE1vZHVsZXMoKSwgdGhpcy50cmFuc3BvcnQgPSBub3JtYWxpemVNb2R1bGVSdW5uZXJUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpLCBvcHRpb25zLmhtciAhPT0gITEpIHtcblx0XHRcdGxldCBvcHRpb25zSG1yID0gb3B0aW9ucy5obXIgPz8gITA7XG5cdFx0XHRpZiAodGhpcy5obXJDbGllbnQgPSBuZXcgSE1SQ2xpZW50KG9wdGlvbnNIbXIgPT09ICEwIHx8IG9wdGlvbnNIbXIubG9nZ2VyID09PSB2b2lkIDAgPyBobXJMb2dnZXIgOiBvcHRpb25zSG1yLmxvZ2dlciA9PT0gITEgPyBzaWxlbnRDb25zb2xlIDogb3B0aW9uc0htci5sb2dnZXIsIHRoaXMudHJhbnNwb3J0LCAoeyBhY2NlcHRlZFBhdGggfSkgPT4gdGhpcy5pbXBvcnQoYWNjZXB0ZWRQYXRoKSksICF0aGlzLnRyYW5zcG9ydC5jb25uZWN0KSB0aHJvdyBFcnJvcihcIkhNUiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcnVubmVyIHRyYW5zcG9ydCwgYnV0IGBobXJgIG9wdGlvbiB3YXMgc2V0IHRvIHRydWVcIik7XG5cdFx0XHR0aGlzLnRyYW5zcG9ydC5jb25uZWN0KGNyZWF0ZUhNUkhhbmRsZXJGb3JSdW5uZXIodGhpcykpO1xuXHRcdH0gZWxzZSB0aGlzLnRyYW5zcG9ydC5jb25uZWN0Py4oKTtcblx0XHRvcHRpb25zLnNvdXJjZW1hcEludGVyY2VwdG9yICE9PSAhMSAmJiAodGhpcy5yZXNldFNvdXJjZU1hcFN1cHBvcnQgPSBlbmFibGVTb3VyY2VNYXBTdXBwb3J0KHRoaXMpKTtcblx0fVxuXHQvKipcblx0KiBVUkwgdG8gZXhlY3V0ZS4gQWNjZXB0cyBmaWxlIHBhdGgsIHNlcnZlciBwYXRoIG9yIGlkIHJlbGF0aXZlIHRvIHRoZSByb290LlxuXHQqL1xuXHRhc3luYyBpbXBvcnQodXJsKSB7XG5cdFx0bGV0IGZldGNoZWRNb2R1bGUgPSBhd2FpdCB0aGlzLmNhY2hlZE1vZHVsZSh1cmwpO1xuXHRcdHJldHVybiBhd2FpdCB0aGlzLmNhY2hlZFJlcXVlc3QodXJsLCBmZXRjaGVkTW9kdWxlKTtcblx0fVxuXHQvKipcblx0KiBDbGVhciBhbGwgY2FjaGVzIGluY2x1ZGluZyBITVIgbGlzdGVuZXJzLlxuXHQqL1xuXHRjbGVhckNhY2hlKCkge1xuXHRcdHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5jbGVhcigpLCB0aGlzLmhtckNsaWVudD8uY2xlYXIoKTtcblx0fVxuXHQvKipcblx0KiBDbGVhcnMgYWxsIGNhY2hlcywgcmVtb3ZlcyBhbGwgSE1SIGxpc3RlbmVycywgYW5kIHJlc2V0cyBzb3VyY2UgbWFwIHN1cHBvcnQuXG5cdCogVGhpcyBtZXRob2QgZG9lc24ndCBzdG9wIHRoZSBITVIgY29ubmVjdGlvbi5cblx0Ki9cblx0YXN5bmMgY2xvc2UoKSB7XG5cdFx0dGhpcy5yZXNldFNvdXJjZU1hcFN1cHBvcnQ/LigpLCB0aGlzLmNsZWFyQ2FjaGUoKSwgdGhpcy5obXJDbGllbnQgPSB2b2lkIDAsIHRoaXMuY2xvc2VkID0gITAsIGF3YWl0IHRoaXMudHJhbnNwb3J0LmRpc2Nvbm5lY3Q/LigpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgYHRydWVgIGlmIHRoZSBydW50aW1lIGhhcyBiZWVuIGNsb3NlZCBieSBjYWxsaW5nIGBjbG9zZSgpYCBtZXRob2QuXG5cdCovXG5cdGlzQ2xvc2VkKCkge1xuXHRcdHJldHVybiB0aGlzLmNsb3NlZDtcblx0fVxuXHRwcm9jZXNzSW1wb3J0KGV4cG9ydHMsIGZldGNoUmVzdWx0LCBtZXRhZGF0YSkge1xuXHRcdGlmICghKFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaFJlc3VsdCkpIHJldHVybiBleHBvcnRzO1xuXHRcdGxldCB7IHVybCwgdHlwZSB9ID0gZmV0Y2hSZXN1bHQ7XG5cdFx0cmV0dXJuIHR5cGUgIT09IFwibW9kdWxlXCIgJiYgdHlwZSAhPT0gXCJjb21tb25qc1wiIHx8IGFuYWx5emVJbXBvcnRlZE1vZERpZmZlcmVuY2UoZXhwb3J0cywgdXJsLCB0eXBlLCBtZXRhZGF0YSksIGV4cG9ydHM7XG5cdH1cblx0aXNDaXJjdWxhck1vZHVsZShtb2QpIHtcblx0XHRmb3IgKGxldCBpbXBvcnRlZEZpbGUgb2YgbW9kLmltcG9ydHMpIGlmIChtb2QuaW1wb3J0ZXJzLmhhcyhpbXBvcnRlZEZpbGUpKSByZXR1cm4gITA7XG5cdFx0cmV0dXJuICExO1xuXHR9XG5cdGlzQ2lyY3VsYXJJbXBvcnQoaW1wb3J0ZXJzLCBtb2R1bGVVcmwsIHZpc2l0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG5cdFx0Zm9yIChsZXQgaW1wb3J0ZXIgb2YgaW1wb3J0ZXJzKSB7XG5cdFx0XHRpZiAodmlzaXRlZC5oYXMoaW1wb3J0ZXIpKSBjb250aW51ZTtcblx0XHRcdGlmICh2aXNpdGVkLmFkZChpbXBvcnRlciksIGltcG9ydGVyID09PSBtb2R1bGVVcmwpIHJldHVybiAhMDtcblx0XHRcdGxldCBtb2QgPSB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuZ2V0TW9kdWxlQnlJZChpbXBvcnRlcik7XG5cdFx0XHRpZiAobW9kICYmIG1vZC5pbXBvcnRlcnMuc2l6ZSAmJiB0aGlzLmlzQ2lyY3VsYXJJbXBvcnQobW9kLmltcG9ydGVycywgbW9kdWxlVXJsLCB2aXNpdGVkKSkgcmV0dXJuICEwO1xuXHRcdH1cblx0XHRyZXR1cm4gITE7XG5cdH1cblx0YXN5bmMgY2FjaGVkUmVxdWVzdCh1cmwsIG1vZCwgY2FsbHN0YWNrID0gW10sIG1ldGFkYXRhKSB7XG5cdFx0bGV0IG1ldGEgPSBtb2QubWV0YSwgbW9kdWxlSWQgPSBtZXRhLmlkLCB7IGltcG9ydGVycyB9ID0gbW9kLCBpbXBvcnRlZSA9IGNhbGxzdGFja1tjYWxsc3RhY2subGVuZ3RoIC0gMV07XG5cdFx0aWYgKGltcG9ydGVlICYmIGltcG9ydGVycy5hZGQoaW1wb3J0ZWUpLCBtb2QuZXZhbHVhdGVkICYmIG1vZC5wcm9taXNlKSByZXR1cm4gdGhpcy5wcm9jZXNzSW1wb3J0KGF3YWl0IG1vZC5wcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0aWYgKChjYWxsc3RhY2suaW5jbHVkZXMobW9kdWxlSWQpIHx8IHRoaXMuaXNDaXJjdWxhck1vZHVsZShtb2QpIHx8IHRoaXMuaXNDaXJjdWxhckltcG9ydChpbXBvcnRlcnMsIG1vZHVsZUlkKSkgJiYgbW9kLmV4cG9ydHMpIHJldHVybiB0aGlzLnByb2Nlc3NJbXBvcnQobW9kLmV4cG9ydHMsIG1ldGEsIG1ldGFkYXRhKTtcblx0XHRsZXQgZGVidWdUaW1lcjtcblx0XHR0aGlzLmRlYnVnICYmIChkZWJ1Z1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR0aGlzLmRlYnVnKGBbbW9kdWxlIHJ1bm5lcl0gbW9kdWxlICR7bW9kdWxlSWR9IHRha2VzIG92ZXIgMnMgdG8gbG9hZC5cXG4ke2BzdGFjazpcXG4ke1suLi5jYWxsc3RhY2ssIG1vZHVsZUlkXS5yZXZlcnNlKCkubWFwKChwKSA9PiBgICAtICR7cH1gKS5qb2luKFwiXFxuXCIpfWB9YCk7XG5cdFx0fSwgMmUzKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChtb2QucHJvbWlzZSkgcmV0dXJuIHRoaXMucHJvY2Vzc0ltcG9ydChhd2FpdCBtb2QucHJvbWlzZSwgbWV0YSwgbWV0YWRhdGEpO1xuXHRcdFx0bGV0IHByb21pc2UgPSB0aGlzLmRpcmVjdFJlcXVlc3QodXJsLCBtb2QsIGNhbGxzdGFjayk7XG5cdFx0XHRyZXR1cm4gbW9kLnByb21pc2UgPSBwcm9taXNlLCBtb2QuZXZhbHVhdGVkID0gITEsIHRoaXMucHJvY2Vzc0ltcG9ydChhd2FpdCBwcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdG1vZC5ldmFsdWF0ZWQgPSAhMCwgZGVidWdUaW1lciAmJiBjbGVhclRpbWVvdXQoZGVidWdUaW1lcik7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGNhY2hlZE1vZHVsZSh1cmwsIGltcG9ydGVyKSB7XG5cdFx0bGV0IGNhY2hlZCA9IHRoaXMuY29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcy5nZXQodXJsKTtcblx0XHRpZiAoY2FjaGVkKSB0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gdXNpbmcgY2FjaGVkIG1vZHVsZSBpbmZvIGZvclwiLCB1cmwpO1xuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IGNhY2hlZE1vZHVsZSA9IHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeVVybCh1cmwpO1xuXHRcdFx0Y2FjaGVkID0gdGhpcy5nZXRNb2R1bGVJbmZvcm1hdGlvbih1cmwsIGltcG9ydGVyLCBjYWNoZWRNb2R1bGUpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbmN1cnJlbnRNb2R1bGVOb2RlUHJvbWlzZXMuZGVsZXRlKHVybCk7XG5cdFx0XHR9KSwgdGhpcy5jb25jdXJyZW50TW9kdWxlTm9kZVByb21pc2VzLnNldCh1cmwsIGNhY2hlZCk7XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZWQ7XG5cdH1cblx0ZW5zdXJlQnVpbHRpbnMoKSB7XG5cdFx0aWYgKCF0aGlzLmlzQnVpbHRpbikgcmV0dXJuIHRoaXMuYnVpbHRpbnNQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGZldGNoaW5nIGJ1aWx0aW5zIGZyb20gc2VydmVyXCIpO1xuXHRcdFx0XHRsZXQgYnVpbHRpbnMgPSAoYXdhaXQgdGhpcy50cmFuc3BvcnQuaW52b2tlKFwiZ2V0QnVpbHRpbnNcIiwgW10pKS5tYXAoKGJ1aWx0aW4pID0+IHR5cGVvZiBidWlsdGluID09IFwib2JqZWN0XCIgJiYgYnVpbHRpbiAmJiBcInR5cGVcIiBpbiBidWlsdGluID8gYnVpbHRpbi50eXBlID09PSBcInN0cmluZ1wiID8gYnVpbHRpbi52YWx1ZSA6IG5ldyBSZWdFeHAoYnVpbHRpbi5zb3VyY2UsIGJ1aWx0aW4uZmxhZ3MpIDogYnVpbHRpbik7XG5cdFx0XHRcdHRoaXMuaXNCdWlsdGluID0gY3JlYXRlSXNCdWlsdGluKGJ1aWx0aW5zKSwgdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGJ1aWx0aW5zIGxvYWRlZDpcIiwgYnVpbHRpbnMpO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0dGhpcy5idWlsdGluc1Byb21pc2UgPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0fSkoKSwgdGhpcy5idWlsdGluc1Byb21pc2U7XG5cdH1cblx0YXN5bmMgZ2V0TW9kdWxlSW5mb3JtYXRpb24odXJsLCBpbXBvcnRlciwgY2FjaGVkTW9kdWxlKSB7XG5cdFx0aWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBFcnJvcihcIlZpdGUgbW9kdWxlIHJ1bm5lciBoYXMgYmVlbiBjbG9zZWQuXCIpO1xuXHRcdGF3YWl0IHRoaXMuZW5zdXJlQnVpbHRpbnMoKSwgdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGZldGNoaW5nXCIsIHVybCk7XG5cdFx0bGV0IGlzQ2FjaGVkID0gISEodHlwZW9mIGNhY2hlZE1vZHVsZSA9PSBcIm9iamVjdFwiICYmIGNhY2hlZE1vZHVsZS5tZXRhKSwgZmV0Y2hlZE1vZHVsZSA9IHVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgfHwgdGhpcy5pc0J1aWx0aW4/Lih1cmwpID8ge1xuXHRcdFx0ZXh0ZXJuYWxpemU6IHVybCxcblx0XHRcdHR5cGU6IFwiYnVpbHRpblwiXG5cdFx0fSA6IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmludm9rZShcImZldGNoTW9kdWxlXCIsIFtcblx0XHRcdHVybCxcblx0XHRcdGltcG9ydGVyLFxuXHRcdFx0e1xuXHRcdFx0XHRjYWNoZWQ6IGlzQ2FjaGVkLFxuXHRcdFx0XHRzdGFydE9mZnNldDogdGhpcy5ldmFsdWF0b3Iuc3RhcnRPZmZzZXRcblx0XHRcdH1cblx0XHRdKTtcblx0XHRpZiAoXCJjYWNoZVwiIGluIGZldGNoZWRNb2R1bGUpIHtcblx0XHRcdGlmICghY2FjaGVkTW9kdWxlIHx8ICFjYWNoZWRNb2R1bGUubWV0YSkgdGhyb3cgRXJyb3IoYE1vZHVsZSBcIiR7dXJsfVwiIHdhcyBtaXN0YWtlbmx5IGludmFsaWRhdGVkIGR1cmluZyBmZXRjaCBwaGFzZS5gKTtcblx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGU7XG5cdFx0fVxuXHRcdGxldCBtb2R1bGVJZCA9IFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaGVkTW9kdWxlID8gZmV0Y2hlZE1vZHVsZS5leHRlcm5hbGl6ZSA6IGZldGNoZWRNb2R1bGUuaWQsIG1vZHVsZVVybCA9IFwidXJsXCIgaW4gZmV0Y2hlZE1vZHVsZSA/IGZldGNoZWRNb2R1bGUudXJsIDogdXJsLCBtb2R1bGUgPSB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuZW5zdXJlTW9kdWxlKG1vZHVsZUlkLCBtb2R1bGVVcmwpO1xuXHRcdHJldHVybiBcImludmFsaWRhdGVcIiBpbiBmZXRjaGVkTW9kdWxlICYmIGZldGNoZWRNb2R1bGUuaW52YWxpZGF0ZSAmJiB0aGlzLmV2YWx1YXRlZE1vZHVsZXMuaW52YWxpZGF0ZU1vZHVsZShtb2R1bGUpLCBmZXRjaGVkTW9kdWxlLnVybCA9IG1vZHVsZVVybCwgZmV0Y2hlZE1vZHVsZS5pZCA9IG1vZHVsZUlkLCBtb2R1bGUubWV0YSA9IGZldGNoZWRNb2R1bGUsIG1vZHVsZTtcblx0fVxuXHRhc3luYyBkaXJlY3RSZXF1ZXN0KHVybCwgbW9kLCBfY2FsbHN0YWNrKSB7XG5cdFx0bGV0IGZldGNoUmVzdWx0ID0gbW9kLm1ldGEsIG1vZHVsZUlkID0gZmV0Y2hSZXN1bHQuaWQsIGNhbGxzdGFjayA9IFsuLi5fY2FsbHN0YWNrLCBtb2R1bGVJZF0sIHJlcXVlc3QgPSBhc3luYyAoZGVwLCBtZXRhZGF0YSkgPT4ge1xuXHRcdFx0bGV0IGltcG9ydGVyID0gXCJmaWxlXCIgaW4gZmV0Y2hSZXN1bHQgJiYgZmV0Y2hSZXN1bHQuZmlsZSB8fCBtb2R1bGVJZCwgZGVwTW9kID0gYXdhaXQgdGhpcy5jYWNoZWRNb2R1bGUoZGVwLCBpbXBvcnRlcik7XG5cdFx0XHRyZXR1cm4gZGVwTW9kLmltcG9ydGVycy5hZGQobW9kdWxlSWQpLCBtb2QuaW1wb3J0cy5hZGQoZGVwTW9kLmlkKSwgdGhpcy5jYWNoZWRSZXF1ZXN0KGRlcCwgZGVwTW9kLCBjYWxsc3RhY2ssIG1ldGFkYXRhKTtcblx0XHR9LCBkeW5hbWljUmVxdWVzdCA9IGFzeW5jIChkZXApID0+IChkZXAgPSBTdHJpbmcoZGVwKSwgZGVwWzBdID09PSBcIi5cIiAmJiAoZGVwID0gcG9zaXhSZXNvbHZlKHBvc2l4RGlybmFtZSh1cmwpLCBkZXApKSwgcmVxdWVzdChkZXAsIHsgaXNEeW5hbWljSW1wb3J0OiAhMCB9KSk7XG5cdFx0aWYgKFwiZXh0ZXJuYWxpemVcIiBpbiBmZXRjaFJlc3VsdCkge1xuXHRcdFx0bGV0IHsgZXh0ZXJuYWxpemUgfSA9IGZldGNoUmVzdWx0O1xuXHRcdFx0dGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGV4dGVybmFsaXppbmdcIiwgZXh0ZXJuYWxpemUpO1xuXHRcdFx0bGV0IGV4cG9ydHMgPSBhd2FpdCB0aGlzLmV2YWx1YXRvci5ydW5FeHRlcm5hbE1vZHVsZShleHRlcm5hbGl6ZSk7XG5cdFx0XHRyZXR1cm4gbW9kLmV4cG9ydHMgPSBleHBvcnRzLCBleHBvcnRzO1xuXHRcdH1cblx0XHRsZXQgeyBjb2RlLCBmaWxlIH0gPSBmZXRjaFJlc3VsdDtcblx0XHRpZiAoY29kZSA9PSBudWxsKSB7XG5cdFx0XHRsZXQgaW1wb3J0ZXIgPSBjYWxsc3RhY2tbY2FsbHN0YWNrLmxlbmd0aCAtIDJdO1xuXHRcdFx0dGhyb3cgRXJyb3IoYFttb2R1bGUgcnVubmVyXSBGYWlsZWQgdG8gbG9hZCBcIiR7dXJsfVwiJHtpbXBvcnRlciA/IGAgaW1wb3J0ZWQgZnJvbSAke2ltcG9ydGVyfWAgOiBcIlwifWApO1xuXHRcdH1cblx0XHRsZXQgY3JlYXRlSW1wb3J0TWV0YSA9IHRoaXMub3B0aW9ucy5jcmVhdGVJbXBvcnRNZXRhID8/IGNyZWF0ZURlZmF1bHRJbXBvcnRNZXRhLCBtb2R1bGVQYXRoID0gY2xlYW5VcmwoZmlsZSB8fCBtb2R1bGVJZCksIGhyZWYgPSBwb3NpeFBhdGhUb0ZpbGVIcmVmKG1vZHVsZVBhdGgpLCBtZXRhID0gYXdhaXQgY3JlYXRlSW1wb3J0TWV0YShtb2R1bGVQYXRoKSwgZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuXHRcdFx0dmFsdWU6IFwiTW9kdWxlXCIsXG5cdFx0XHRlbnVtZXJhYmxlOiAhMSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogITFcblx0XHR9KSwgbW9kLmV4cG9ydHMgPSBleHBvcnRzO1xuXHRcdGxldCBob3RDb250ZXh0O1xuXHRcdHRoaXMuaG1yQ2xpZW50ICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXRhLCBcImhvdFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuaG1yQ2xpZW50KSB0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBITVIgY2xpZW50IHdhcyBjbG9zZWQuXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGNyZWF0aW5nIGhtciBjb250ZXh0IGZvclwiLCBtb2QudXJsKSwgaG90Q29udGV4dCB8fD0gbmV3IEhNUkNvbnRleHQodGhpcy5obXJDbGllbnQsIG1vZC51cmwpLCBob3RDb250ZXh0O1xuXHRcdFx0fSxcblx0XHRcdHNldDogKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGhvdENvbnRleHQgPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRsZXQgY29udGV4dCA9IHtcblx0XHRcdFtzc3JJbXBvcnRLZXldOiByZXF1ZXN0LFxuXHRcdFx0W3NzckR5bmFtaWNJbXBvcnRLZXldOiBkeW5hbWljUmVxdWVzdCxcblx0XHRcdFtzc3JNb2R1bGVFeHBvcnRzS2V5XTogZXhwb3J0cyxcblx0XHRcdFtzc3JFeHBvcnRBbGxLZXldOiAob2JqKSA9PiBleHBvcnRBbGwoZXhwb3J0cywgb2JqKSxcblx0XHRcdFtzc3JFeHBvcnROYW1lS2V5XTogKG5hbWUsIGdldHRlcikgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdGdldDogZ2V0dGVyXG5cdFx0XHR9KSxcblx0XHRcdFtzc3JJbXBvcnRNZXRhS2V5XTogbWV0YVxuXHRcdH07XG5cdFx0cmV0dXJuIHRoaXMuZGVidWc/LihcIlttb2R1bGUgcnVubmVyXSBleGVjdXRpbmdcIiwgaHJlZiksIGF3YWl0IHRoaXMuZXZhbHVhdG9yLnJ1bklubGluZWRNb2R1bGUoY29udGV4dCwgY29kZSwgbW9kKSwgZXhwb3J0cztcblx0fVxufTtcbmZ1bmN0aW9uIGV4cG9ydEFsbChleHBvcnRzLCBzb3VyY2VNb2R1bGUpIHtcblx0aWYgKGV4cG9ydHMgIT09IHNvdXJjZU1vZHVsZSAmJiAhKGlzUHJpbWl0aXZlKHNvdXJjZU1vZHVsZSkgfHwgQXJyYXkuaXNBcnJheShzb3VyY2VNb2R1bGUpIHx8IHNvdXJjZU1vZHVsZSBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG5cdFx0Zm9yIChsZXQga2V5IGluIHNvdXJjZU1vZHVsZSkgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiAmJiAhKGtleSBpbiBleHBvcnRzKSkgdHJ5IHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0XHRcdGdldDogKCkgPT4gc291cmNlTW9kdWxlW2tleV1cblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2gge31cblx0fVxufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBFU01vZHVsZXNFdmFsdWF0b3IsIEV2YWx1YXRlZE1vZHVsZXMsIE1vZHVsZVJ1bm5lciwgY3JlYXRlRGVmYXVsdEltcG9ydE1ldGEsIGNyZWF0ZU5vZGVJbXBvcnRNZXRhLCBjcmVhdGVXZWJTb2NrZXRNb2R1bGVSdW5uZXJUcmFuc3BvcnQsIG5vcm1hbGl6ZU1vZHVsZUlkLCBzc3JEeW5hbWljSW1wb3J0S2V5LCBzc3JFeHBvcnRBbGxLZXksIHNzckV4cG9ydE5hbWVLZXksIHNzckltcG9ydEtleSwgc3NySW1wb3J0TWV0YUtleSwgc3NyTW9kdWxlRXhwb3J0c0tleSB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJLG9CQUFvQjtBQUN4QixxQkFBcUI7QUFHckIsTUFBTSxZQUFZLE9BQU8sVUFBVSxPQUFPLFFBQVEsYUFB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
|