@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,2986 +0,0 @@
|
|
|
1
|
-
import { __exportAll } from "../../../../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
//#region ../../node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js
|
|
3
|
-
var chai_exports = /* @__PURE__ */ __exportAll({
|
|
4
|
-
Assertion: () => Assertion,
|
|
5
|
-
AssertionError: () => AssertionError,
|
|
6
|
-
Should: () => Should,
|
|
7
|
-
assert: () => assert,
|
|
8
|
-
config: () => config,
|
|
9
|
-
expect: () => expect,
|
|
10
|
-
should: () => should,
|
|
11
|
-
use: () => use,
|
|
12
|
-
util: () => utils_exports
|
|
13
|
-
});
|
|
14
|
-
var __defProp = Object.defineProperty;
|
|
15
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
configurable: true,
|
|
18
|
-
writable: true,
|
|
19
|
-
value
|
|
20
|
-
}) : obj[key] = value;
|
|
21
|
-
var __name = (target, value) => __defProp(target, "name", {
|
|
22
|
-
value,
|
|
23
|
-
configurable: true
|
|
24
|
-
});
|
|
25
|
-
var __export = (target, all) => {
|
|
26
|
-
for (var name in all) __defProp(target, name, {
|
|
27
|
-
get: all[name],
|
|
28
|
-
enumerable: true
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
32
|
-
var utils_exports = {};
|
|
33
|
-
__export(utils_exports, {
|
|
34
|
-
addChainableMethod: () => addChainableMethod,
|
|
35
|
-
addLengthGuard: () => addLengthGuard,
|
|
36
|
-
addMethod: () => addMethod,
|
|
37
|
-
addProperty: () => addProperty,
|
|
38
|
-
checkError: () => check_error_exports,
|
|
39
|
-
compareByInspect: () => compareByInspect,
|
|
40
|
-
eql: () => deep_eql_default,
|
|
41
|
-
events: () => events,
|
|
42
|
-
expectTypes: () => expectTypes,
|
|
43
|
-
flag: () => flag,
|
|
44
|
-
getActual: () => getActual,
|
|
45
|
-
getMessage: () => getMessage2,
|
|
46
|
-
getName: () => getName,
|
|
47
|
-
getOperator: () => getOperator,
|
|
48
|
-
getOwnEnumerableProperties: () => getOwnEnumerableProperties,
|
|
49
|
-
getOwnEnumerablePropertySymbols: () => getOwnEnumerablePropertySymbols,
|
|
50
|
-
getPathInfo: () => getPathInfo,
|
|
51
|
-
hasProperty: () => hasProperty,
|
|
52
|
-
inspect: () => inspect2,
|
|
53
|
-
isNaN: () => isNaN2,
|
|
54
|
-
isNumeric: () => isNumeric,
|
|
55
|
-
isProxyEnabled: () => isProxyEnabled,
|
|
56
|
-
isRegExp: () => isRegExp2,
|
|
57
|
-
objDisplay: () => objDisplay,
|
|
58
|
-
overwriteChainableMethod: () => overwriteChainableMethod,
|
|
59
|
-
overwriteMethod: () => overwriteMethod,
|
|
60
|
-
overwriteProperty: () => overwriteProperty,
|
|
61
|
-
proxify: () => proxify,
|
|
62
|
-
test: () => test,
|
|
63
|
-
transferFlags: () => transferFlags,
|
|
64
|
-
type: () => type
|
|
65
|
-
});
|
|
66
|
-
var check_error_exports = {};
|
|
67
|
-
__export(check_error_exports, {
|
|
68
|
-
compatibleConstructor: () => compatibleConstructor,
|
|
69
|
-
compatibleInstance: () => compatibleInstance,
|
|
70
|
-
compatibleMessage: () => compatibleMessage,
|
|
71
|
-
getConstructorName: () => getConstructorName,
|
|
72
|
-
getMessage: () => getMessage
|
|
73
|
-
});
|
|
74
|
-
function isErrorInstance(obj) {
|
|
75
|
-
return obj instanceof Error || Object.prototype.toString.call(obj) === "[object Error]";
|
|
76
|
-
}
|
|
77
|
-
__name(isErrorInstance, "isErrorInstance");
|
|
78
|
-
function isRegExp(obj) {
|
|
79
|
-
return Object.prototype.toString.call(obj) === "[object RegExp]";
|
|
80
|
-
}
|
|
81
|
-
__name(isRegExp, "isRegExp");
|
|
82
|
-
function compatibleInstance(thrown, errorLike) {
|
|
83
|
-
return isErrorInstance(errorLike) && thrown === errorLike;
|
|
84
|
-
}
|
|
85
|
-
__name(compatibleInstance, "compatibleInstance");
|
|
86
|
-
function compatibleConstructor(thrown, errorLike) {
|
|
87
|
-
if (isErrorInstance(errorLike)) return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
|
|
88
|
-
else if ((typeof errorLike === "object" || typeof errorLike === "function") && errorLike.prototype) return thrown.constructor === errorLike || thrown instanceof errorLike;
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
__name(compatibleConstructor, "compatibleConstructor");
|
|
92
|
-
function compatibleMessage(thrown, errMatcher) {
|
|
93
|
-
const comparisonString = typeof thrown === "string" ? thrown : thrown.message;
|
|
94
|
-
if (isRegExp(errMatcher)) return errMatcher.test(comparisonString);
|
|
95
|
-
else if (typeof errMatcher === "string") return comparisonString.indexOf(errMatcher) !== -1;
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
__name(compatibleMessage, "compatibleMessage");
|
|
99
|
-
function getConstructorName(errorLike) {
|
|
100
|
-
let constructorName = errorLike;
|
|
101
|
-
if (isErrorInstance(errorLike)) constructorName = errorLike.constructor.name;
|
|
102
|
-
else if (typeof errorLike === "function") {
|
|
103
|
-
constructorName = errorLike.name;
|
|
104
|
-
if (constructorName === "") constructorName = new errorLike().name || constructorName;
|
|
105
|
-
}
|
|
106
|
-
return constructorName;
|
|
107
|
-
}
|
|
108
|
-
__name(getConstructorName, "getConstructorName");
|
|
109
|
-
function getMessage(errorLike) {
|
|
110
|
-
let msg = "";
|
|
111
|
-
if (errorLike && errorLike.message) msg = errorLike.message;
|
|
112
|
-
else if (typeof errorLike === "string") msg = errorLike;
|
|
113
|
-
return msg;
|
|
114
|
-
}
|
|
115
|
-
__name(getMessage, "getMessage");
|
|
116
|
-
function flag(obj, key, value) {
|
|
117
|
-
let flags = obj.__flags || (obj.__flags = /* @__PURE__ */ Object.create(null));
|
|
118
|
-
if (arguments.length === 3) flags[key] = value;
|
|
119
|
-
else return flags[key];
|
|
120
|
-
}
|
|
121
|
-
__name(flag, "flag");
|
|
122
|
-
function test(obj, args) {
|
|
123
|
-
let negate = flag(obj, "negate"), expr = args[0];
|
|
124
|
-
return negate ? !expr : expr;
|
|
125
|
-
}
|
|
126
|
-
__name(test, "test");
|
|
127
|
-
function type(obj) {
|
|
128
|
-
if (typeof obj === "undefined") return "undefined";
|
|
129
|
-
if (obj === null) return "null";
|
|
130
|
-
const stringTag = obj[Symbol.toStringTag];
|
|
131
|
-
if (typeof stringTag === "string") return stringTag;
|
|
132
|
-
return Object.prototype.toString.call(obj).slice(8, -1);
|
|
133
|
-
}
|
|
134
|
-
__name(type, "type");
|
|
135
|
-
var canElideFrames = "captureStackTrace" in Error;
|
|
136
|
-
var _AssertionError = class _AssertionError extends Error {
|
|
137
|
-
constructor(message = "Unspecified AssertionError", props, ssf) {
|
|
138
|
-
super(message);
|
|
139
|
-
__publicField(this, "message");
|
|
140
|
-
this.message = message;
|
|
141
|
-
if (canElideFrames) Error.captureStackTrace(this, ssf || _AssertionError);
|
|
142
|
-
for (const key in props) if (!(key in this)) this[key] = props[key];
|
|
143
|
-
}
|
|
144
|
-
get name() {
|
|
145
|
-
return "AssertionError";
|
|
146
|
-
}
|
|
147
|
-
get ok() {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
toJSON(stack) {
|
|
151
|
-
return {
|
|
152
|
-
...this,
|
|
153
|
-
name: this.name,
|
|
154
|
-
message: this.message,
|
|
155
|
-
ok: false,
|
|
156
|
-
stack: stack !== false ? this.stack : void 0
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
__name(_AssertionError, "AssertionError");
|
|
161
|
-
var AssertionError = _AssertionError;
|
|
162
|
-
function expectTypes(obj, types) {
|
|
163
|
-
let flagMsg = flag(obj, "message");
|
|
164
|
-
let ssfi = flag(obj, "ssfi");
|
|
165
|
-
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
166
|
-
obj = flag(obj, "object");
|
|
167
|
-
types = types.map(function(t) {
|
|
168
|
-
return t.toLowerCase();
|
|
169
|
-
});
|
|
170
|
-
types.sort();
|
|
171
|
-
let str = types.map(function(t, index) {
|
|
172
|
-
let art = ~[
|
|
173
|
-
"a",
|
|
174
|
-
"e",
|
|
175
|
-
"i",
|
|
176
|
-
"o",
|
|
177
|
-
"u"
|
|
178
|
-
].indexOf(t.charAt(0)) ? "an" : "a";
|
|
179
|
-
return (types.length > 1 && index === types.length - 1 ? "or " : "") + art + " " + t;
|
|
180
|
-
}).join(", ");
|
|
181
|
-
let objType = type(obj).toLowerCase();
|
|
182
|
-
if (!types.some(function(expected) {
|
|
183
|
-
return objType === expected;
|
|
184
|
-
})) throw new AssertionError(flagMsg + "object tested must be " + str + ", but " + objType + " given", void 0, ssfi);
|
|
185
|
-
}
|
|
186
|
-
__name(expectTypes, "expectTypes");
|
|
187
|
-
function getActual(obj, args) {
|
|
188
|
-
return args.length > 4 ? args[4] : obj._obj;
|
|
189
|
-
}
|
|
190
|
-
__name(getActual, "getActual");
|
|
191
|
-
var ansiColors = {
|
|
192
|
-
bold: ["1", "22"],
|
|
193
|
-
dim: ["2", "22"],
|
|
194
|
-
italic: ["3", "23"],
|
|
195
|
-
underline: ["4", "24"],
|
|
196
|
-
inverse: ["7", "27"],
|
|
197
|
-
hidden: ["8", "28"],
|
|
198
|
-
strike: ["9", "29"],
|
|
199
|
-
black: ["30", "39"],
|
|
200
|
-
red: ["31", "39"],
|
|
201
|
-
green: ["32", "39"],
|
|
202
|
-
yellow: ["33", "39"],
|
|
203
|
-
blue: ["34", "39"],
|
|
204
|
-
magenta: ["35", "39"],
|
|
205
|
-
cyan: ["36", "39"],
|
|
206
|
-
white: ["37", "39"],
|
|
207
|
-
brightblack: ["30;1", "39"],
|
|
208
|
-
brightred: ["31;1", "39"],
|
|
209
|
-
brightgreen: ["32;1", "39"],
|
|
210
|
-
brightyellow: ["33;1", "39"],
|
|
211
|
-
brightblue: ["34;1", "39"],
|
|
212
|
-
brightmagenta: ["35;1", "39"],
|
|
213
|
-
brightcyan: ["36;1", "39"],
|
|
214
|
-
brightwhite: ["37;1", "39"],
|
|
215
|
-
grey: ["90", "39"]
|
|
216
|
-
};
|
|
217
|
-
var styles = {
|
|
218
|
-
special: "cyan",
|
|
219
|
-
number: "yellow",
|
|
220
|
-
bigint: "yellow",
|
|
221
|
-
boolean: "yellow",
|
|
222
|
-
undefined: "grey",
|
|
223
|
-
null: "bold",
|
|
224
|
-
string: "green",
|
|
225
|
-
symbol: "green",
|
|
226
|
-
date: "magenta",
|
|
227
|
-
regexp: "red"
|
|
228
|
-
};
|
|
229
|
-
var truncator = "…";
|
|
230
|
-
function colorise(value, styleType) {
|
|
231
|
-
const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
|
|
232
|
-
if (!color) return String(value);
|
|
233
|
-
return `\x1B[${color[0]}m${String(value)}\x1B[${color[1]}m`;
|
|
234
|
-
}
|
|
235
|
-
__name(colorise, "colorise");
|
|
236
|
-
function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate: truncate2 = Infinity, stylize = String } = {}, inspect3) {
|
|
237
|
-
const options = {
|
|
238
|
-
showHidden: Boolean(showHidden),
|
|
239
|
-
depth: Number(depth),
|
|
240
|
-
colors: Boolean(colors),
|
|
241
|
-
customInspect: Boolean(customInspect),
|
|
242
|
-
showProxy: Boolean(showProxy),
|
|
243
|
-
maxArrayLength: Number(maxArrayLength),
|
|
244
|
-
breakLength: Number(breakLength),
|
|
245
|
-
truncate: Number(truncate2),
|
|
246
|
-
seen,
|
|
247
|
-
inspect: inspect3,
|
|
248
|
-
stylize
|
|
249
|
-
};
|
|
250
|
-
if (options.colors) options.stylize = colorise;
|
|
251
|
-
return options;
|
|
252
|
-
}
|
|
253
|
-
__name(normaliseOptions, "normaliseOptions");
|
|
254
|
-
function isHighSurrogate(char) {
|
|
255
|
-
return char >= "\ud800" && char <= "\udbff";
|
|
256
|
-
}
|
|
257
|
-
__name(isHighSurrogate, "isHighSurrogate");
|
|
258
|
-
function truncate(string, length, tail = truncator) {
|
|
259
|
-
string = String(string);
|
|
260
|
-
const tailLength = tail.length;
|
|
261
|
-
const stringLength = string.length;
|
|
262
|
-
if (tailLength > length && stringLength > tailLength) return tail;
|
|
263
|
-
if (stringLength > length && stringLength > tailLength) {
|
|
264
|
-
let end = length - tailLength;
|
|
265
|
-
if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
|
|
266
|
-
return `${string.slice(0, end)}${tail}`;
|
|
267
|
-
}
|
|
268
|
-
return string;
|
|
269
|
-
}
|
|
270
|
-
__name(truncate, "truncate");
|
|
271
|
-
function inspectList(list, options, inspectItem, separator = ", ") {
|
|
272
|
-
inspectItem = inspectItem || options.inspect;
|
|
273
|
-
const size = list.length;
|
|
274
|
-
if (size === 0) return "";
|
|
275
|
-
const originalLength = options.truncate;
|
|
276
|
-
let output = "";
|
|
277
|
-
let peek = "";
|
|
278
|
-
let truncated = "";
|
|
279
|
-
for (let i = 0; i < size; i += 1) {
|
|
280
|
-
const last = i + 1 === list.length;
|
|
281
|
-
const secondToLast = i + 2 === list.length;
|
|
282
|
-
truncated = `${truncator}(${list.length - i})`;
|
|
283
|
-
const value = list[i];
|
|
284
|
-
options.truncate = originalLength - output.length - (last ? 0 : separator.length);
|
|
285
|
-
const string = peek || inspectItem(value, options) + (last ? "" : separator);
|
|
286
|
-
const nextLength = output.length + string.length;
|
|
287
|
-
const truncatedLength = nextLength + truncated.length;
|
|
288
|
-
if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
|
|
289
|
-
if (!last && !secondToLast && truncatedLength > originalLength) break;
|
|
290
|
-
peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
|
|
291
|
-
if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
|
|
292
|
-
output += string;
|
|
293
|
-
if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
|
|
294
|
-
truncated = `${truncator}(${list.length - i - 1})`;
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
truncated = "";
|
|
298
|
-
}
|
|
299
|
-
return `${output}${truncated}`;
|
|
300
|
-
}
|
|
301
|
-
__name(inspectList, "inspectList");
|
|
302
|
-
function quoteComplexKey(key) {
|
|
303
|
-
if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
|
|
304
|
-
return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
|
|
305
|
-
}
|
|
306
|
-
__name(quoteComplexKey, "quoteComplexKey");
|
|
307
|
-
function inspectProperty([key, value], options) {
|
|
308
|
-
options.truncate -= 2;
|
|
309
|
-
if (typeof key === "string") key = quoteComplexKey(key);
|
|
310
|
-
else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
|
|
311
|
-
options.truncate -= key.length;
|
|
312
|
-
value = options.inspect(value, options);
|
|
313
|
-
return `${key}: ${value}`;
|
|
314
|
-
}
|
|
315
|
-
__name(inspectProperty, "inspectProperty");
|
|
316
|
-
function inspectArray(array, options) {
|
|
317
|
-
const nonIndexProperties = Object.keys(array).slice(array.length);
|
|
318
|
-
if (!array.length && !nonIndexProperties.length) return "[]";
|
|
319
|
-
options.truncate -= 4;
|
|
320
|
-
const listContents = inspectList(array, options);
|
|
321
|
-
options.truncate -= listContents.length;
|
|
322
|
-
let propertyContents = "";
|
|
323
|
-
if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
|
|
324
|
-
return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
|
|
325
|
-
}
|
|
326
|
-
__name(inspectArray, "inspectArray");
|
|
327
|
-
var getArrayName = /* @__PURE__ */ __name((array) => {
|
|
328
|
-
if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
|
|
329
|
-
if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
|
|
330
|
-
return array.constructor.name;
|
|
331
|
-
}, "getArrayName");
|
|
332
|
-
function inspectTypedArray(array, options) {
|
|
333
|
-
const name = getArrayName(array);
|
|
334
|
-
options.truncate -= name.length + 4;
|
|
335
|
-
const nonIndexProperties = Object.keys(array).slice(array.length);
|
|
336
|
-
if (!array.length && !nonIndexProperties.length) return `${name}[]`;
|
|
337
|
-
let output = "";
|
|
338
|
-
for (let i = 0; i < array.length; i++) {
|
|
339
|
-
const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
|
|
340
|
-
options.truncate -= string.length;
|
|
341
|
-
if (array[i] !== array.length && options.truncate <= 3) {
|
|
342
|
-
output += `${truncator}(${array.length - array[i] + 1})`;
|
|
343
|
-
break;
|
|
344
|
-
}
|
|
345
|
-
output += string;
|
|
346
|
-
}
|
|
347
|
-
let propertyContents = "";
|
|
348
|
-
if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
|
|
349
|
-
return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
|
|
350
|
-
}
|
|
351
|
-
__name(inspectTypedArray, "inspectTypedArray");
|
|
352
|
-
function inspectDate(dateObject, options) {
|
|
353
|
-
const stringRepresentation = dateObject.toJSON();
|
|
354
|
-
if (stringRepresentation === null) return "Invalid Date";
|
|
355
|
-
const split = stringRepresentation.split("T");
|
|
356
|
-
const date = split[0];
|
|
357
|
-
return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
|
|
358
|
-
}
|
|
359
|
-
__name(inspectDate, "inspectDate");
|
|
360
|
-
function inspectFunction(func, options) {
|
|
361
|
-
const functionType = func[Symbol.toStringTag] || "Function";
|
|
362
|
-
const name = func.name;
|
|
363
|
-
if (!name) return options.stylize(`[${functionType}]`, "special");
|
|
364
|
-
return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
|
|
365
|
-
}
|
|
366
|
-
__name(inspectFunction, "inspectFunction");
|
|
367
|
-
function inspectMapEntry([key, value], options) {
|
|
368
|
-
options.truncate -= 4;
|
|
369
|
-
key = options.inspect(key, options);
|
|
370
|
-
options.truncate -= key.length;
|
|
371
|
-
value = options.inspect(value, options);
|
|
372
|
-
return `${key} => ${value}`;
|
|
373
|
-
}
|
|
374
|
-
__name(inspectMapEntry, "inspectMapEntry");
|
|
375
|
-
function mapToEntries(map) {
|
|
376
|
-
const entries = [];
|
|
377
|
-
map.forEach((value, key) => {
|
|
378
|
-
entries.push([key, value]);
|
|
379
|
-
});
|
|
380
|
-
return entries;
|
|
381
|
-
}
|
|
382
|
-
__name(mapToEntries, "mapToEntries");
|
|
383
|
-
function inspectMap(map, options) {
|
|
384
|
-
if (map.size === 0) return "Map{}";
|
|
385
|
-
options.truncate -= 7;
|
|
386
|
-
return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
|
|
387
|
-
}
|
|
388
|
-
__name(inspectMap, "inspectMap");
|
|
389
|
-
var isNaN = Number.isNaN || ((i) => i !== i);
|
|
390
|
-
function inspectNumber(number, options) {
|
|
391
|
-
if (isNaN(number)) return options.stylize("NaN", "number");
|
|
392
|
-
if (number === Infinity) return options.stylize("Infinity", "number");
|
|
393
|
-
if (number === -Infinity) return options.stylize("-Infinity", "number");
|
|
394
|
-
if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
|
|
395
|
-
return options.stylize(truncate(String(number), options.truncate), "number");
|
|
396
|
-
}
|
|
397
|
-
__name(inspectNumber, "inspectNumber");
|
|
398
|
-
function inspectBigInt(number, options) {
|
|
399
|
-
let nums = truncate(number.toString(), options.truncate - 1);
|
|
400
|
-
if (nums !== truncator) nums += "n";
|
|
401
|
-
return options.stylize(nums, "bigint");
|
|
402
|
-
}
|
|
403
|
-
__name(inspectBigInt, "inspectBigInt");
|
|
404
|
-
function inspectRegExp(value, options) {
|
|
405
|
-
const flags = value.toString().split("/")[2];
|
|
406
|
-
const sourceLength = options.truncate - (2 + flags.length);
|
|
407
|
-
const source = value.source;
|
|
408
|
-
return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
|
|
409
|
-
}
|
|
410
|
-
__name(inspectRegExp, "inspectRegExp");
|
|
411
|
-
function arrayFromSet(set2) {
|
|
412
|
-
const values = [];
|
|
413
|
-
set2.forEach((value) => {
|
|
414
|
-
values.push(value);
|
|
415
|
-
});
|
|
416
|
-
return values;
|
|
417
|
-
}
|
|
418
|
-
__name(arrayFromSet, "arrayFromSet");
|
|
419
|
-
function inspectSet(set2, options) {
|
|
420
|
-
if (set2.size === 0) return "Set{}";
|
|
421
|
-
options.truncate -= 7;
|
|
422
|
-
return `Set{ ${inspectList(arrayFromSet(set2), options)} }`;
|
|
423
|
-
}
|
|
424
|
-
__name(inspectSet, "inspectSet");
|
|
425
|
-
var stringEscapeChars = /* @__PURE__ */ new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
|
|
426
|
-
var escapeCharacters = {
|
|
427
|
-
"\b": "\\b",
|
|
428
|
-
" ": "\\t",
|
|
429
|
-
"\n": "\\n",
|
|
430
|
-
"\f": "\\f",
|
|
431
|
-
"\r": "\\r",
|
|
432
|
-
"'": "\\'",
|
|
433
|
-
"\\": "\\\\"
|
|
434
|
-
};
|
|
435
|
-
var hex = 16;
|
|
436
|
-
var unicodeLength = 4;
|
|
437
|
-
function escape(char) {
|
|
438
|
-
return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-unicodeLength)}`;
|
|
439
|
-
}
|
|
440
|
-
__name(escape, "escape");
|
|
441
|
-
function inspectString(string, options) {
|
|
442
|
-
if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
|
|
443
|
-
return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
|
|
444
|
-
}
|
|
445
|
-
__name(inspectString, "inspectString");
|
|
446
|
-
function inspectSymbol(value) {
|
|
447
|
-
if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
|
|
448
|
-
return value.toString();
|
|
449
|
-
}
|
|
450
|
-
__name(inspectSymbol, "inspectSymbol");
|
|
451
|
-
var promise_default = /* @__PURE__ */ __name(() => "Promise{…}", "getPromiseValue");
|
|
452
|
-
function inspectObject(object, options) {
|
|
453
|
-
const properties = Object.getOwnPropertyNames(object);
|
|
454
|
-
const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
|
|
455
|
-
if (properties.length === 0 && symbols.length === 0) return "{}";
|
|
456
|
-
options.truncate -= 4;
|
|
457
|
-
options.seen = options.seen || [];
|
|
458
|
-
if (options.seen.includes(object)) return "[Circular]";
|
|
459
|
-
options.seen.push(object);
|
|
460
|
-
const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
|
|
461
|
-
const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
|
|
462
|
-
options.seen.pop();
|
|
463
|
-
let sep = "";
|
|
464
|
-
if (propertyContents && symbolContents) sep = ", ";
|
|
465
|
-
return `{ ${propertyContents}${sep}${symbolContents} }`;
|
|
466
|
-
}
|
|
467
|
-
__name(inspectObject, "inspectObject");
|
|
468
|
-
var toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
|
|
469
|
-
function inspectClass(value, options) {
|
|
470
|
-
let name = "";
|
|
471
|
-
if (toStringTag && toStringTag in value) name = value[toStringTag];
|
|
472
|
-
name = name || value.constructor.name;
|
|
473
|
-
if (!name || name === "_class") name = "<Anonymous Class>";
|
|
474
|
-
options.truncate -= name.length;
|
|
475
|
-
return `${name}${inspectObject(value, options)}`;
|
|
476
|
-
}
|
|
477
|
-
__name(inspectClass, "inspectClass");
|
|
478
|
-
function inspectArguments(args, options) {
|
|
479
|
-
if (args.length === 0) return "Arguments[]";
|
|
480
|
-
options.truncate -= 13;
|
|
481
|
-
return `Arguments[ ${inspectList(args, options)} ]`;
|
|
482
|
-
}
|
|
483
|
-
__name(inspectArguments, "inspectArguments");
|
|
484
|
-
var errorKeys = [
|
|
485
|
-
"stack",
|
|
486
|
-
"line",
|
|
487
|
-
"column",
|
|
488
|
-
"name",
|
|
489
|
-
"message",
|
|
490
|
-
"fileName",
|
|
491
|
-
"lineNumber",
|
|
492
|
-
"columnNumber",
|
|
493
|
-
"number",
|
|
494
|
-
"description",
|
|
495
|
-
"cause"
|
|
496
|
-
];
|
|
497
|
-
function inspectObject2(error, options) {
|
|
498
|
-
const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
|
|
499
|
-
const name = error.name;
|
|
500
|
-
options.truncate -= name.length;
|
|
501
|
-
let message = "";
|
|
502
|
-
if (typeof error.message === "string") message = truncate(error.message, options.truncate);
|
|
503
|
-
else properties.unshift("message");
|
|
504
|
-
message = message ? `: ${message}` : "";
|
|
505
|
-
options.truncate -= message.length + 5;
|
|
506
|
-
options.seen = options.seen || [];
|
|
507
|
-
if (options.seen.includes(error)) return "[Circular]";
|
|
508
|
-
options.seen.push(error);
|
|
509
|
-
const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
|
|
510
|
-
return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
|
|
511
|
-
}
|
|
512
|
-
__name(inspectObject2, "inspectObject");
|
|
513
|
-
function inspectAttribute([key, value], options) {
|
|
514
|
-
options.truncate -= 3;
|
|
515
|
-
if (!value) return `${options.stylize(String(key), "yellow")}`;
|
|
516
|
-
return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
|
|
517
|
-
}
|
|
518
|
-
__name(inspectAttribute, "inspectAttribute");
|
|
519
|
-
function inspectNodeCollection(collection, options) {
|
|
520
|
-
return inspectList(collection, options, inspectNode, "\n");
|
|
521
|
-
}
|
|
522
|
-
__name(inspectNodeCollection, "inspectNodeCollection");
|
|
523
|
-
function inspectNode(node, options) {
|
|
524
|
-
switch (node.nodeType) {
|
|
525
|
-
case 1: return inspectHTML(node, options);
|
|
526
|
-
case 3: return options.inspect(node.data, options);
|
|
527
|
-
default: return options.inspect(node, options);
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
__name(inspectNode, "inspectNode");
|
|
531
|
-
function inspectHTML(element, options) {
|
|
532
|
-
const properties = element.getAttributeNames();
|
|
533
|
-
const name = element.tagName.toLowerCase();
|
|
534
|
-
const head = options.stylize(`<${name}`, "special");
|
|
535
|
-
const headClose = options.stylize(`>`, "special");
|
|
536
|
-
const tail = options.stylize(`</${name}>`, "special");
|
|
537
|
-
options.truncate -= name.length * 2 + 5;
|
|
538
|
-
let propertyContents = "";
|
|
539
|
-
if (properties.length > 0) {
|
|
540
|
-
propertyContents += " ";
|
|
541
|
-
propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
|
|
542
|
-
}
|
|
543
|
-
options.truncate -= propertyContents.length;
|
|
544
|
-
const truncate2 = options.truncate;
|
|
545
|
-
let children = inspectNodeCollection(element.children, options);
|
|
546
|
-
if (children && children.length > truncate2) children = `${truncator}(${element.children.length})`;
|
|
547
|
-
return `${head}${propertyContents}${headClose}${children}${tail}`;
|
|
548
|
-
}
|
|
549
|
-
__name(inspectHTML, "inspectHTML");
|
|
550
|
-
var chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? /* @__PURE__ */ Symbol.for("chai/inspect") : "@@chai/inspect";
|
|
551
|
-
var nodeInspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
|
|
552
|
-
var constructorMap = /* @__PURE__ */ new WeakMap();
|
|
553
|
-
var stringTagMap = {};
|
|
554
|
-
var baseTypesMap = {
|
|
555
|
-
undefined: /* @__PURE__ */ __name((value, options) => options.stylize("undefined", "undefined"), "undefined"),
|
|
556
|
-
null: /* @__PURE__ */ __name((value, options) => options.stylize("null", "null"), "null"),
|
|
557
|
-
boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "boolean"),
|
|
558
|
-
Boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "Boolean"),
|
|
559
|
-
number: inspectNumber,
|
|
560
|
-
Number: inspectNumber,
|
|
561
|
-
bigint: inspectBigInt,
|
|
562
|
-
BigInt: inspectBigInt,
|
|
563
|
-
string: inspectString,
|
|
564
|
-
String: inspectString,
|
|
565
|
-
function: inspectFunction,
|
|
566
|
-
Function: inspectFunction,
|
|
567
|
-
symbol: inspectSymbol,
|
|
568
|
-
Symbol: inspectSymbol,
|
|
569
|
-
Array: inspectArray,
|
|
570
|
-
Date: inspectDate,
|
|
571
|
-
Map: inspectMap,
|
|
572
|
-
Set: inspectSet,
|
|
573
|
-
RegExp: inspectRegExp,
|
|
574
|
-
Promise: promise_default,
|
|
575
|
-
WeakSet: /* @__PURE__ */ __name((value, options) => options.stylize("WeakSet{…}", "special"), "WeakSet"),
|
|
576
|
-
WeakMap: /* @__PURE__ */ __name((value, options) => options.stylize("WeakMap{…}", "special"), "WeakMap"),
|
|
577
|
-
Arguments: inspectArguments,
|
|
578
|
-
Int8Array: inspectTypedArray,
|
|
579
|
-
Uint8Array: inspectTypedArray,
|
|
580
|
-
Uint8ClampedArray: inspectTypedArray,
|
|
581
|
-
Int16Array: inspectTypedArray,
|
|
582
|
-
Uint16Array: inspectTypedArray,
|
|
583
|
-
Int32Array: inspectTypedArray,
|
|
584
|
-
Uint32Array: inspectTypedArray,
|
|
585
|
-
Float32Array: inspectTypedArray,
|
|
586
|
-
Float64Array: inspectTypedArray,
|
|
587
|
-
Generator: /* @__PURE__ */ __name(() => "", "Generator"),
|
|
588
|
-
DataView: /* @__PURE__ */ __name(() => "", "DataView"),
|
|
589
|
-
ArrayBuffer: /* @__PURE__ */ __name(() => "", "ArrayBuffer"),
|
|
590
|
-
Error: inspectObject2,
|
|
591
|
-
HTMLCollection: inspectNodeCollection,
|
|
592
|
-
NodeList: inspectNodeCollection
|
|
593
|
-
};
|
|
594
|
-
var inspectCustom = /* @__PURE__ */ __name((value, options, type3, inspectFn) => {
|
|
595
|
-
if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
|
|
596
|
-
if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
|
|
597
|
-
if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
|
|
598
|
-
if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
|
|
599
|
-
if (stringTagMap[type3]) return stringTagMap[type3](value, options);
|
|
600
|
-
return "";
|
|
601
|
-
}, "inspectCustom");
|
|
602
|
-
var toString = Object.prototype.toString;
|
|
603
|
-
function inspect(value, opts = {}) {
|
|
604
|
-
const options = normaliseOptions(opts, inspect);
|
|
605
|
-
const { customInspect } = options;
|
|
606
|
-
let type3 = value === null ? "null" : typeof value;
|
|
607
|
-
if (type3 === "object") type3 = toString.call(value).slice(8, -1);
|
|
608
|
-
if (type3 in baseTypesMap) return baseTypesMap[type3](value, options);
|
|
609
|
-
if (customInspect && value) {
|
|
610
|
-
const output = inspectCustom(value, options, type3, inspect);
|
|
611
|
-
if (output) {
|
|
612
|
-
if (typeof output === "string") return output;
|
|
613
|
-
return inspect(output, options);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
const proto = value ? Object.getPrototypeOf(value) : false;
|
|
617
|
-
if (proto === Object.prototype || proto === null) return inspectObject(value, options);
|
|
618
|
-
if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
|
|
619
|
-
if ("constructor" in value) {
|
|
620
|
-
if (value.constructor !== Object) return inspectClass(value, options);
|
|
621
|
-
return inspectObject(value, options);
|
|
622
|
-
}
|
|
623
|
-
if (value === Object(value)) return inspectObject(value, options);
|
|
624
|
-
return options.stylize(String(value), type3);
|
|
625
|
-
}
|
|
626
|
-
__name(inspect, "inspect");
|
|
627
|
-
var config = {
|
|
628
|
-
/**
|
|
629
|
-
* ### config.includeStack
|
|
630
|
-
*
|
|
631
|
-
* User configurable property, influences whether stack trace
|
|
632
|
-
* is included in Assertion error message. Default of false
|
|
633
|
-
* suppresses stack trace in the error message.
|
|
634
|
-
*
|
|
635
|
-
* chai.config.includeStack = true; // enable stack on error
|
|
636
|
-
*
|
|
637
|
-
* @param {boolean}
|
|
638
|
-
* @public
|
|
639
|
-
*/
|
|
640
|
-
includeStack: false,
|
|
641
|
-
/**
|
|
642
|
-
* ### config.showDiff
|
|
643
|
-
*
|
|
644
|
-
* User configurable property, influences whether or not
|
|
645
|
-
* the `showDiff` flag should be included in the thrown
|
|
646
|
-
* AssertionErrors. `false` will always be `false`; `true`
|
|
647
|
-
* will be true when the assertion has requested a diff
|
|
648
|
-
* be shown.
|
|
649
|
-
*
|
|
650
|
-
* @param {boolean}
|
|
651
|
-
* @public
|
|
652
|
-
*/
|
|
653
|
-
showDiff: true,
|
|
654
|
-
/**
|
|
655
|
-
* ### config.truncateThreshold
|
|
656
|
-
*
|
|
657
|
-
* User configurable property, sets length threshold for actual and
|
|
658
|
-
* expected values in assertion errors. If this threshold is exceeded, for
|
|
659
|
-
* example for large data structures, the value is replaced with something
|
|
660
|
-
* like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.
|
|
661
|
-
*
|
|
662
|
-
* Set it to zero if you want to disable truncating altogether.
|
|
663
|
-
*
|
|
664
|
-
* This is especially userful when doing assertions on arrays: having this
|
|
665
|
-
* set to a reasonable large value makes the failure messages readily
|
|
666
|
-
* inspectable.
|
|
667
|
-
*
|
|
668
|
-
* chai.config.truncateThreshold = 0; // disable truncating
|
|
669
|
-
*
|
|
670
|
-
* @param {number}
|
|
671
|
-
* @public
|
|
672
|
-
*/
|
|
673
|
-
truncateThreshold: 40,
|
|
674
|
-
/**
|
|
675
|
-
* ### config.useProxy
|
|
676
|
-
*
|
|
677
|
-
* User configurable property, defines if chai will use a Proxy to throw
|
|
678
|
-
* an error when a non-existent property is read, which protects users
|
|
679
|
-
* from typos when using property-based assertions.
|
|
680
|
-
*
|
|
681
|
-
* Set it to false if you want to disable this feature.
|
|
682
|
-
*
|
|
683
|
-
* chai.config.useProxy = false; // disable use of Proxy
|
|
684
|
-
*
|
|
685
|
-
* This feature is automatically disabled regardless of this config value
|
|
686
|
-
* in environments that don't support proxies.
|
|
687
|
-
*
|
|
688
|
-
* @param {boolean}
|
|
689
|
-
* @public
|
|
690
|
-
*/
|
|
691
|
-
useProxy: true,
|
|
692
|
-
/**
|
|
693
|
-
* ### config.proxyExcludedKeys
|
|
694
|
-
*
|
|
695
|
-
* User configurable property, defines which properties should be ignored
|
|
696
|
-
* instead of throwing an error if they do not exist on the assertion.
|
|
697
|
-
* This is only applied if the environment Chai is running in supports proxies and
|
|
698
|
-
* if the `useProxy` configuration setting is enabled.
|
|
699
|
-
* By default, `then` and `inspect` will not throw an error if they do not exist on the
|
|
700
|
-
* assertion object because the `.inspect` property is read by `util.inspect` (for example, when
|
|
701
|
-
* using `console.log` on the assertion object) and `.then` is necessary for promise type-checking.
|
|
702
|
-
*
|
|
703
|
-
* // By default these keys will not throw an error if they do not exist on the assertion object
|
|
704
|
-
* chai.config.proxyExcludedKeys = ['then', 'inspect'];
|
|
705
|
-
*
|
|
706
|
-
* @param {Array}
|
|
707
|
-
* @public
|
|
708
|
-
*/
|
|
709
|
-
proxyExcludedKeys: [
|
|
710
|
-
"then",
|
|
711
|
-
"catch",
|
|
712
|
-
"inspect",
|
|
713
|
-
"toJSON"
|
|
714
|
-
],
|
|
715
|
-
/**
|
|
716
|
-
* ### config.deepEqual
|
|
717
|
-
*
|
|
718
|
-
* User configurable property, defines which a custom function to use for deepEqual
|
|
719
|
-
* comparisons.
|
|
720
|
-
* By default, the function used is the one from the `deep-eql` package without custom comparator.
|
|
721
|
-
*
|
|
722
|
-
* // use a custom comparator
|
|
723
|
-
* chai.config.deepEqual = (expected, actual) => {
|
|
724
|
-
* return chai.util.eql(expected, actual, {
|
|
725
|
-
* comparator: (expected, actual) => {
|
|
726
|
-
* // for non number comparison, use the default behavior
|
|
727
|
-
* if(typeof expected !== 'number') return null;
|
|
728
|
-
* // allow a difference of 10 between compared numbers
|
|
729
|
-
* return typeof actual === 'number' && Math.abs(actual - expected) < 10
|
|
730
|
-
* }
|
|
731
|
-
* })
|
|
732
|
-
* };
|
|
733
|
-
*
|
|
734
|
-
* @param {Function}
|
|
735
|
-
* @public
|
|
736
|
-
*/
|
|
737
|
-
deepEqual: null
|
|
738
|
-
};
|
|
739
|
-
function inspect2(obj, showHidden, depth, colors) {
|
|
740
|
-
return inspect(obj, {
|
|
741
|
-
colors,
|
|
742
|
-
depth: typeof depth === "undefined" ? 2 : depth,
|
|
743
|
-
showHidden,
|
|
744
|
-
truncate: config.truncateThreshold ? config.truncateThreshold : Infinity
|
|
745
|
-
});
|
|
746
|
-
}
|
|
747
|
-
__name(inspect2, "inspect");
|
|
748
|
-
function objDisplay(obj) {
|
|
749
|
-
let str = inspect2(obj), type3 = Object.prototype.toString.call(obj);
|
|
750
|
-
if (config.truncateThreshold && str.length >= config.truncateThreshold) if (type3 === "[object Function]") return !obj.name || obj.name === "" ? "[Function]" : "[Function: " + obj.name + "]";
|
|
751
|
-
else if (type3 === "[object Array]") return "[ Array(" + obj.length + ") ]";
|
|
752
|
-
else if (type3 === "[object Object]") {
|
|
753
|
-
let keys = Object.keys(obj);
|
|
754
|
-
return "{ Object (" + (keys.length > 2 ? keys.splice(0, 2).join(", ") + ", ..." : keys.join(", ")) + ") }";
|
|
755
|
-
} else return str;
|
|
756
|
-
else return str;
|
|
757
|
-
}
|
|
758
|
-
__name(objDisplay, "objDisplay");
|
|
759
|
-
function getMessage2(obj, args) {
|
|
760
|
-
let negate = flag(obj, "negate");
|
|
761
|
-
let val = flag(obj, "object");
|
|
762
|
-
let expected = args[3];
|
|
763
|
-
let actual = getActual(obj, args);
|
|
764
|
-
let msg = negate ? args[2] : args[1];
|
|
765
|
-
let flagMsg = flag(obj, "message");
|
|
766
|
-
if (typeof msg === "function") msg = msg();
|
|
767
|
-
msg = msg || "";
|
|
768
|
-
msg = msg.replace(/#\{this\}/g, function() {
|
|
769
|
-
return objDisplay(val);
|
|
770
|
-
}).replace(/#\{act\}/g, function() {
|
|
771
|
-
return objDisplay(actual);
|
|
772
|
-
}).replace(/#\{exp\}/g, function() {
|
|
773
|
-
return objDisplay(expected);
|
|
774
|
-
});
|
|
775
|
-
return flagMsg ? flagMsg + ": " + msg : msg;
|
|
776
|
-
}
|
|
777
|
-
__name(getMessage2, "getMessage");
|
|
778
|
-
function transferFlags(assertion, object, includeAll) {
|
|
779
|
-
let flags = assertion.__flags || (assertion.__flags = /* @__PURE__ */ Object.create(null));
|
|
780
|
-
if (!object.__flags) object.__flags = /* @__PURE__ */ Object.create(null);
|
|
781
|
-
includeAll = arguments.length === 3 ? includeAll : true;
|
|
782
|
-
for (let flag3 in flags) if (includeAll || flag3 !== "object" && flag3 !== "ssfi" && flag3 !== "lockSsfi" && flag3 != "message") object.__flags[flag3] = flags[flag3];
|
|
783
|
-
}
|
|
784
|
-
__name(transferFlags, "transferFlags");
|
|
785
|
-
function type2(obj) {
|
|
786
|
-
if (typeof obj === "undefined") return "undefined";
|
|
787
|
-
if (obj === null) return "null";
|
|
788
|
-
const stringTag = obj[Symbol.toStringTag];
|
|
789
|
-
if (typeof stringTag === "string") return stringTag;
|
|
790
|
-
return Object.prototype.toString.call(obj).slice(8, -1);
|
|
791
|
-
}
|
|
792
|
-
__name(type2, "type");
|
|
793
|
-
function FakeMap() {
|
|
794
|
-
this._key = "chai/deep-eql__" + Math.random() + Date.now();
|
|
795
|
-
}
|
|
796
|
-
__name(FakeMap, "FakeMap");
|
|
797
|
-
FakeMap.prototype = {
|
|
798
|
-
get: /* @__PURE__ */ __name(function get(key) {
|
|
799
|
-
return key[this._key];
|
|
800
|
-
}, "get"),
|
|
801
|
-
set: /* @__PURE__ */ __name(function set(key, value) {
|
|
802
|
-
if (Object.isExtensible(key)) Object.defineProperty(key, this._key, {
|
|
803
|
-
value,
|
|
804
|
-
configurable: true
|
|
805
|
-
});
|
|
806
|
-
}, "set")
|
|
807
|
-
};
|
|
808
|
-
var MemoizeMap = typeof WeakMap === "function" ? WeakMap : FakeMap;
|
|
809
|
-
function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
|
|
810
|
-
if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return null;
|
|
811
|
-
var leftHandMap = memoizeMap.get(leftHandOperand);
|
|
812
|
-
if (leftHandMap) {
|
|
813
|
-
var result = leftHandMap.get(rightHandOperand);
|
|
814
|
-
if (typeof result === "boolean") return result;
|
|
815
|
-
}
|
|
816
|
-
return null;
|
|
817
|
-
}
|
|
818
|
-
__name(memoizeCompare, "memoizeCompare");
|
|
819
|
-
function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
|
|
820
|
-
if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return;
|
|
821
|
-
var leftHandMap = memoizeMap.get(leftHandOperand);
|
|
822
|
-
if (leftHandMap) leftHandMap.set(rightHandOperand, result);
|
|
823
|
-
else {
|
|
824
|
-
leftHandMap = new MemoizeMap();
|
|
825
|
-
leftHandMap.set(rightHandOperand, result);
|
|
826
|
-
memoizeMap.set(leftHandOperand, leftHandMap);
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
__name(memoizeSet, "memoizeSet");
|
|
830
|
-
var deep_eql_default = deepEqual;
|
|
831
|
-
function deepEqual(leftHandOperand, rightHandOperand, options) {
|
|
832
|
-
if (options && options.comparator) return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
|
|
833
|
-
var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
|
|
834
|
-
if (simpleResult !== null) return simpleResult;
|
|
835
|
-
return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
|
|
836
|
-
}
|
|
837
|
-
__name(deepEqual, "deepEqual");
|
|
838
|
-
function simpleEqual(leftHandOperand, rightHandOperand) {
|
|
839
|
-
if (leftHandOperand === rightHandOperand) return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
|
|
840
|
-
if (leftHandOperand !== leftHandOperand && rightHandOperand !== rightHandOperand) return true;
|
|
841
|
-
if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return false;
|
|
842
|
-
return null;
|
|
843
|
-
}
|
|
844
|
-
__name(simpleEqual, "simpleEqual");
|
|
845
|
-
function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
|
|
846
|
-
options = options || {};
|
|
847
|
-
options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
|
|
848
|
-
var comparator = options && options.comparator;
|
|
849
|
-
var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
|
|
850
|
-
if (memoizeResultLeft !== null) return memoizeResultLeft;
|
|
851
|
-
var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
|
|
852
|
-
if (memoizeResultRight !== null) return memoizeResultRight;
|
|
853
|
-
if (comparator) {
|
|
854
|
-
var comparatorResult = comparator(leftHandOperand, rightHandOperand);
|
|
855
|
-
if (comparatorResult === false || comparatorResult === true) {
|
|
856
|
-
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
|
|
857
|
-
return comparatorResult;
|
|
858
|
-
}
|
|
859
|
-
var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
|
|
860
|
-
if (simpleResult !== null) return simpleResult;
|
|
861
|
-
}
|
|
862
|
-
var leftHandType = type2(leftHandOperand);
|
|
863
|
-
if (leftHandType !== type2(rightHandOperand)) {
|
|
864
|
-
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
|
|
865
|
-
return false;
|
|
866
|
-
}
|
|
867
|
-
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
|
|
868
|
-
var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
|
|
869
|
-
memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
|
|
870
|
-
return result;
|
|
871
|
-
}
|
|
872
|
-
__name(extensiveDeepEqual, "extensiveDeepEqual");
|
|
873
|
-
function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
|
|
874
|
-
switch (leftHandType) {
|
|
875
|
-
case "String":
|
|
876
|
-
case "Number":
|
|
877
|
-
case "Boolean":
|
|
878
|
-
case "Date": return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
|
|
879
|
-
case "Promise":
|
|
880
|
-
case "Symbol":
|
|
881
|
-
case "function":
|
|
882
|
-
case "WeakMap":
|
|
883
|
-
case "WeakSet": return leftHandOperand === rightHandOperand;
|
|
884
|
-
case "Error": return keysEqual(leftHandOperand, rightHandOperand, [
|
|
885
|
-
"name",
|
|
886
|
-
"message",
|
|
887
|
-
"code"
|
|
888
|
-
], options);
|
|
889
|
-
case "Arguments":
|
|
890
|
-
case "Int8Array":
|
|
891
|
-
case "Uint8Array":
|
|
892
|
-
case "Uint8ClampedArray":
|
|
893
|
-
case "Int16Array":
|
|
894
|
-
case "Uint16Array":
|
|
895
|
-
case "Int32Array":
|
|
896
|
-
case "Uint32Array":
|
|
897
|
-
case "Float32Array":
|
|
898
|
-
case "Float64Array":
|
|
899
|
-
case "Array": return iterableEqual(leftHandOperand, rightHandOperand, options);
|
|
900
|
-
case "RegExp": return regexpEqual(leftHandOperand, rightHandOperand);
|
|
901
|
-
case "Generator": return generatorEqual(leftHandOperand, rightHandOperand, options);
|
|
902
|
-
case "DataView": return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
|
|
903
|
-
case "ArrayBuffer": return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
|
|
904
|
-
case "Set": return entriesEqual(leftHandOperand, rightHandOperand, options);
|
|
905
|
-
case "Map": return entriesEqual(leftHandOperand, rightHandOperand, options);
|
|
906
|
-
case "Temporal.PlainDate":
|
|
907
|
-
case "Temporal.PlainTime":
|
|
908
|
-
case "Temporal.PlainDateTime":
|
|
909
|
-
case "Temporal.Instant":
|
|
910
|
-
case "Temporal.ZonedDateTime":
|
|
911
|
-
case "Temporal.PlainYearMonth":
|
|
912
|
-
case "Temporal.PlainMonthDay": return leftHandOperand.equals(rightHandOperand);
|
|
913
|
-
case "Temporal.Duration": return leftHandOperand.total("nanoseconds") === rightHandOperand.total("nanoseconds");
|
|
914
|
-
case "Temporal.TimeZone":
|
|
915
|
-
case "Temporal.Calendar": return leftHandOperand.toString() === rightHandOperand.toString();
|
|
916
|
-
default: return objectEqual(leftHandOperand, rightHandOperand, options);
|
|
917
|
-
}
|
|
918
|
-
}
|
|
919
|
-
__name(extensiveDeepEqualByType, "extensiveDeepEqualByType");
|
|
920
|
-
function regexpEqual(leftHandOperand, rightHandOperand) {
|
|
921
|
-
return leftHandOperand.toString() === rightHandOperand.toString();
|
|
922
|
-
}
|
|
923
|
-
__name(regexpEqual, "regexpEqual");
|
|
924
|
-
function entriesEqual(leftHandOperand, rightHandOperand, options) {
|
|
925
|
-
try {
|
|
926
|
-
if (leftHandOperand.size !== rightHandOperand.size) return false;
|
|
927
|
-
if (leftHandOperand.size === 0) return true;
|
|
928
|
-
} catch (sizeError) {
|
|
929
|
-
return false;
|
|
930
|
-
}
|
|
931
|
-
var leftHandItems = [];
|
|
932
|
-
var rightHandItems = [];
|
|
933
|
-
leftHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
|
|
934
|
-
leftHandItems.push([key, value]);
|
|
935
|
-
}, "gatherEntries"));
|
|
936
|
-
rightHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
|
|
937
|
-
rightHandItems.push([key, value]);
|
|
938
|
-
}, "gatherEntries"));
|
|
939
|
-
return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
|
|
940
|
-
}
|
|
941
|
-
__name(entriesEqual, "entriesEqual");
|
|
942
|
-
function iterableEqual(leftHandOperand, rightHandOperand, options) {
|
|
943
|
-
var length = leftHandOperand.length;
|
|
944
|
-
if (length !== rightHandOperand.length) return false;
|
|
945
|
-
if (length === 0) return true;
|
|
946
|
-
var index = -1;
|
|
947
|
-
while (++index < length) if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) return false;
|
|
948
|
-
return true;
|
|
949
|
-
}
|
|
950
|
-
__name(iterableEqual, "iterableEqual");
|
|
951
|
-
function generatorEqual(leftHandOperand, rightHandOperand, options) {
|
|
952
|
-
return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
|
|
953
|
-
}
|
|
954
|
-
__name(generatorEqual, "generatorEqual");
|
|
955
|
-
function hasIteratorFunction(target) {
|
|
956
|
-
return typeof Symbol !== "undefined" && typeof target === "object" && typeof Symbol.iterator !== "undefined" && typeof target[Symbol.iterator] === "function";
|
|
957
|
-
}
|
|
958
|
-
__name(hasIteratorFunction, "hasIteratorFunction");
|
|
959
|
-
function getIteratorEntries(target) {
|
|
960
|
-
if (hasIteratorFunction(target)) try {
|
|
961
|
-
return getGeneratorEntries(target[Symbol.iterator]());
|
|
962
|
-
} catch (iteratorError) {
|
|
963
|
-
return [];
|
|
964
|
-
}
|
|
965
|
-
return [];
|
|
966
|
-
}
|
|
967
|
-
__name(getIteratorEntries, "getIteratorEntries");
|
|
968
|
-
function getGeneratorEntries(generator) {
|
|
969
|
-
var generatorResult = generator.next();
|
|
970
|
-
var accumulator = [generatorResult.value];
|
|
971
|
-
while (generatorResult.done === false) {
|
|
972
|
-
generatorResult = generator.next();
|
|
973
|
-
accumulator.push(generatorResult.value);
|
|
974
|
-
}
|
|
975
|
-
return accumulator;
|
|
976
|
-
}
|
|
977
|
-
__name(getGeneratorEntries, "getGeneratorEntries");
|
|
978
|
-
function getEnumerableKeys(target) {
|
|
979
|
-
var keys = [];
|
|
980
|
-
for (var key in target) keys.push(key);
|
|
981
|
-
return keys;
|
|
982
|
-
}
|
|
983
|
-
__name(getEnumerableKeys, "getEnumerableKeys");
|
|
984
|
-
function getEnumerableSymbols(target) {
|
|
985
|
-
var keys = [];
|
|
986
|
-
var allKeys = Object.getOwnPropertySymbols(target);
|
|
987
|
-
for (var i = 0; i < allKeys.length; i += 1) {
|
|
988
|
-
var key = allKeys[i];
|
|
989
|
-
if (Object.getOwnPropertyDescriptor(target, key).enumerable) keys.push(key);
|
|
990
|
-
}
|
|
991
|
-
return keys;
|
|
992
|
-
}
|
|
993
|
-
__name(getEnumerableSymbols, "getEnumerableSymbols");
|
|
994
|
-
function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
|
|
995
|
-
var length = keys.length;
|
|
996
|
-
if (length === 0) return true;
|
|
997
|
-
for (var i = 0; i < length; i += 1) if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) return false;
|
|
998
|
-
return true;
|
|
999
|
-
}
|
|
1000
|
-
__name(keysEqual, "keysEqual");
|
|
1001
|
-
function objectEqual(leftHandOperand, rightHandOperand, options) {
|
|
1002
|
-
var leftHandKeys = getEnumerableKeys(leftHandOperand);
|
|
1003
|
-
var rightHandKeys = getEnumerableKeys(rightHandOperand);
|
|
1004
|
-
var leftHandSymbols = getEnumerableSymbols(leftHandOperand);
|
|
1005
|
-
var rightHandSymbols = getEnumerableSymbols(rightHandOperand);
|
|
1006
|
-
leftHandKeys = leftHandKeys.concat(leftHandSymbols);
|
|
1007
|
-
rightHandKeys = rightHandKeys.concat(rightHandSymbols);
|
|
1008
|
-
if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
|
|
1009
|
-
if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) return false;
|
|
1010
|
-
return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
|
|
1011
|
-
}
|
|
1012
|
-
var leftHandEntries = getIteratorEntries(leftHandOperand);
|
|
1013
|
-
var rightHandEntries = getIteratorEntries(rightHandOperand);
|
|
1014
|
-
if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
|
|
1015
|
-
leftHandEntries.sort();
|
|
1016
|
-
rightHandEntries.sort();
|
|
1017
|
-
return iterableEqual(leftHandEntries, rightHandEntries, options);
|
|
1018
|
-
}
|
|
1019
|
-
if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) return true;
|
|
1020
|
-
return false;
|
|
1021
|
-
}
|
|
1022
|
-
__name(objectEqual, "objectEqual");
|
|
1023
|
-
function isPrimitive(value) {
|
|
1024
|
-
return value === null || typeof value !== "object";
|
|
1025
|
-
}
|
|
1026
|
-
__name(isPrimitive, "isPrimitive");
|
|
1027
|
-
function mapSymbols(arr) {
|
|
1028
|
-
return arr.map(/* @__PURE__ */ __name(function mapSymbol(entry) {
|
|
1029
|
-
if (typeof entry === "symbol") return entry.toString();
|
|
1030
|
-
return entry;
|
|
1031
|
-
}, "mapSymbol"));
|
|
1032
|
-
}
|
|
1033
|
-
__name(mapSymbols, "mapSymbols");
|
|
1034
|
-
function hasProperty(obj, name) {
|
|
1035
|
-
if (typeof obj === "undefined" || obj === null) return false;
|
|
1036
|
-
return name in Object(obj);
|
|
1037
|
-
}
|
|
1038
|
-
__name(hasProperty, "hasProperty");
|
|
1039
|
-
function parsePath(path) {
|
|
1040
|
-
return path.replace(/([^\\])\[/g, "$1.[").match(/(\\\.|[^.]+?)+/g).map((value) => {
|
|
1041
|
-
if (value === "constructor" || value === "__proto__" || value === "prototype") return {};
|
|
1042
|
-
const mArr = /^\[(\d+)\]$/.exec(value);
|
|
1043
|
-
let parsed = null;
|
|
1044
|
-
if (mArr) parsed = { i: parseFloat(mArr[1]) };
|
|
1045
|
-
else parsed = { p: value.replace(/\\([.[\]])/g, "$1") };
|
|
1046
|
-
return parsed;
|
|
1047
|
-
});
|
|
1048
|
-
}
|
|
1049
|
-
__name(parsePath, "parsePath");
|
|
1050
|
-
function internalGetPathValue(obj, parsed, pathDepth) {
|
|
1051
|
-
let temporaryValue = obj;
|
|
1052
|
-
let res = null;
|
|
1053
|
-
pathDepth = typeof pathDepth === "undefined" ? parsed.length : pathDepth;
|
|
1054
|
-
for (let i = 0; i < pathDepth; i++) {
|
|
1055
|
-
const part = parsed[i];
|
|
1056
|
-
if (temporaryValue) {
|
|
1057
|
-
if (typeof part.p === "undefined") temporaryValue = temporaryValue[part.i];
|
|
1058
|
-
else temporaryValue = temporaryValue[part.p];
|
|
1059
|
-
if (i === pathDepth - 1) res = temporaryValue;
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
return res;
|
|
1063
|
-
}
|
|
1064
|
-
__name(internalGetPathValue, "internalGetPathValue");
|
|
1065
|
-
function getPathInfo(obj, path) {
|
|
1066
|
-
const parsed = parsePath(path);
|
|
1067
|
-
const last = parsed[parsed.length - 1];
|
|
1068
|
-
const info = {
|
|
1069
|
-
parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj,
|
|
1070
|
-
name: last.p || last.i,
|
|
1071
|
-
value: internalGetPathValue(obj, parsed)
|
|
1072
|
-
};
|
|
1073
|
-
info.exists = hasProperty(info.parent, info.name);
|
|
1074
|
-
return info;
|
|
1075
|
-
}
|
|
1076
|
-
__name(getPathInfo, "getPathInfo");
|
|
1077
|
-
var _Assertion = class _Assertion {
|
|
1078
|
-
/**
|
|
1079
|
-
* Creates object for chaining.
|
|
1080
|
-
* `Assertion` objects contain metadata in the form of flags. Three flags can
|
|
1081
|
-
* be assigned during instantiation by passing arguments to this constructor:
|
|
1082
|
-
*
|
|
1083
|
-
* - `object`: This flag contains the target of the assertion. For example, in
|
|
1084
|
-
* the assertion `expect(numKittens).to.equal(7);`, the `object` flag will
|
|
1085
|
-
* contain `numKittens` so that the `equal` assertion can reference it when
|
|
1086
|
-
* needed.
|
|
1087
|
-
*
|
|
1088
|
-
* - `message`: This flag contains an optional custom error message to be
|
|
1089
|
-
* prepended to the error message that's generated by the assertion when it
|
|
1090
|
-
* fails.
|
|
1091
|
-
*
|
|
1092
|
-
* - `ssfi`: This flag stands for "start stack function indicator". It
|
|
1093
|
-
* contains a function reference that serves as the starting point for
|
|
1094
|
-
* removing frames from the stack trace of the error that's created by the
|
|
1095
|
-
* assertion when it fails. The goal is to provide a cleaner stack trace to
|
|
1096
|
-
* end users by removing Chai's internal functions. Note that it only works
|
|
1097
|
-
* in environments that support `Error.captureStackTrace`, and only when
|
|
1098
|
-
* `Chai.config.includeStack` hasn't been set to `false`.
|
|
1099
|
-
*
|
|
1100
|
-
* - `lockSsfi`: This flag controls whether or not the given `ssfi` flag
|
|
1101
|
-
* should retain its current value, even as assertions are chained off of
|
|
1102
|
-
* this object. This is usually set to `true` when creating a new assertion
|
|
1103
|
-
* from within another assertion. It's also temporarily set to `true` before
|
|
1104
|
-
* an overwritten assertion gets called by the overwriting assertion.
|
|
1105
|
-
*
|
|
1106
|
-
* - `eql`: This flag contains the deepEqual function to be used by the assertion.
|
|
1107
|
-
*
|
|
1108
|
-
* @param {unknown} obj target of the assertion
|
|
1109
|
-
* @param {string} [msg] (optional) custom error message
|
|
1110
|
-
* @param {Function} [ssfi] (optional) starting point for removing stack frames
|
|
1111
|
-
* @param {boolean} [lockSsfi] (optional) whether or not the ssfi flag is locked
|
|
1112
|
-
*/
|
|
1113
|
-
constructor(obj, msg, ssfi, lockSsfi) {
|
|
1114
|
-
/** @type {{}} */
|
|
1115
|
-
__publicField(this, "__flags", {});
|
|
1116
|
-
flag(this, "ssfi", ssfi || _Assertion);
|
|
1117
|
-
flag(this, "lockSsfi", lockSsfi);
|
|
1118
|
-
flag(this, "object", obj);
|
|
1119
|
-
flag(this, "message", msg);
|
|
1120
|
-
flag(this, "eql", config.deepEqual || deep_eql_default);
|
|
1121
|
-
return proxify(this);
|
|
1122
|
-
}
|
|
1123
|
-
/** @returns {boolean} */
|
|
1124
|
-
static get includeStack() {
|
|
1125
|
-
console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
|
|
1126
|
-
return config.includeStack;
|
|
1127
|
-
}
|
|
1128
|
-
/** @param {boolean} value */
|
|
1129
|
-
static set includeStack(value) {
|
|
1130
|
-
console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
|
|
1131
|
-
config.includeStack = value;
|
|
1132
|
-
}
|
|
1133
|
-
/** @returns {boolean} */
|
|
1134
|
-
static get showDiff() {
|
|
1135
|
-
console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
|
|
1136
|
-
return config.showDiff;
|
|
1137
|
-
}
|
|
1138
|
-
/** @param {boolean} value */
|
|
1139
|
-
static set showDiff(value) {
|
|
1140
|
-
console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
|
|
1141
|
-
config.showDiff = value;
|
|
1142
|
-
}
|
|
1143
|
-
/**
|
|
1144
|
-
* @param {string} name
|
|
1145
|
-
* @param {Function} fn
|
|
1146
|
-
*/
|
|
1147
|
-
static addProperty(name, fn) {
|
|
1148
|
-
addProperty(this.prototype, name, fn);
|
|
1149
|
-
}
|
|
1150
|
-
/**
|
|
1151
|
-
* @param {string} name
|
|
1152
|
-
* @param {Function} fn
|
|
1153
|
-
*/
|
|
1154
|
-
static addMethod(name, fn) {
|
|
1155
|
-
addMethod(this.prototype, name, fn);
|
|
1156
|
-
}
|
|
1157
|
-
/**
|
|
1158
|
-
* @param {string} name
|
|
1159
|
-
* @param {Function} fn
|
|
1160
|
-
* @param {Function} chainingBehavior
|
|
1161
|
-
*/
|
|
1162
|
-
static addChainableMethod(name, fn, chainingBehavior) {
|
|
1163
|
-
addChainableMethod(this.prototype, name, fn, chainingBehavior);
|
|
1164
|
-
}
|
|
1165
|
-
/**
|
|
1166
|
-
* @param {string} name
|
|
1167
|
-
* @param {Function} fn
|
|
1168
|
-
*/
|
|
1169
|
-
static overwriteProperty(name, fn) {
|
|
1170
|
-
overwriteProperty(this.prototype, name, fn);
|
|
1171
|
-
}
|
|
1172
|
-
/**
|
|
1173
|
-
* @param {string} name
|
|
1174
|
-
* @param {Function} fn
|
|
1175
|
-
*/
|
|
1176
|
-
static overwriteMethod(name, fn) {
|
|
1177
|
-
overwriteMethod(this.prototype, name, fn);
|
|
1178
|
-
}
|
|
1179
|
-
/**
|
|
1180
|
-
* @param {string} name
|
|
1181
|
-
* @param {Function} fn
|
|
1182
|
-
* @param {Function} chainingBehavior
|
|
1183
|
-
*/
|
|
1184
|
-
static overwriteChainableMethod(name, fn, chainingBehavior) {
|
|
1185
|
-
overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
|
|
1186
|
-
}
|
|
1187
|
-
/**
|
|
1188
|
-
* ### .assert(expression, message, negateMessage, expected, actual, showDiff)
|
|
1189
|
-
*
|
|
1190
|
-
* Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
|
|
1191
|
-
*
|
|
1192
|
-
* @name assert
|
|
1193
|
-
* @param {unknown} _expr to be tested
|
|
1194
|
-
* @param {string | Function} msg or function that returns message to display if expression fails
|
|
1195
|
-
* @param {string | Function} _negateMsg or function that returns negatedMessage to display if negated expression fails
|
|
1196
|
-
* @param {unknown} expected value (remember to check for negation)
|
|
1197
|
-
* @param {unknown} _actual (optional) will default to `this.obj`
|
|
1198
|
-
* @param {boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
|
|
1199
|
-
* @returns {void}
|
|
1200
|
-
*/
|
|
1201
|
-
assert(_expr, msg, _negateMsg, expected, _actual, showDiff) {
|
|
1202
|
-
const ok = test(this, arguments);
|
|
1203
|
-
if (false !== showDiff) showDiff = true;
|
|
1204
|
-
if (void 0 === expected && void 0 === _actual) showDiff = false;
|
|
1205
|
-
if (true !== config.showDiff) showDiff = false;
|
|
1206
|
-
if (!ok) {
|
|
1207
|
-
msg = getMessage2(this, arguments);
|
|
1208
|
-
const assertionErrorObjectProperties = {
|
|
1209
|
-
actual: getActual(this, arguments),
|
|
1210
|
-
expected,
|
|
1211
|
-
showDiff
|
|
1212
|
-
};
|
|
1213
|
-
const operator = getOperator(this, arguments);
|
|
1214
|
-
if (operator) assertionErrorObjectProperties.operator = operator;
|
|
1215
|
-
throw new AssertionError(msg, assertionErrorObjectProperties, config.includeStack ? this.assert : flag(this, "ssfi"));
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
/**
|
|
1219
|
-
* Quick reference to stored `actual` value for plugin developers.
|
|
1220
|
-
*
|
|
1221
|
-
* @returns {unknown}
|
|
1222
|
-
*/
|
|
1223
|
-
get _obj() {
|
|
1224
|
-
return flag(this, "object");
|
|
1225
|
-
}
|
|
1226
|
-
/**
|
|
1227
|
-
* Quick reference to stored `actual` value for plugin developers.
|
|
1228
|
-
*
|
|
1229
|
-
* @param {unknown} val
|
|
1230
|
-
*/
|
|
1231
|
-
set _obj(val) {
|
|
1232
|
-
flag(this, "object", val);
|
|
1233
|
-
}
|
|
1234
|
-
};
|
|
1235
|
-
__name(_Assertion, "Assertion");
|
|
1236
|
-
var Assertion = _Assertion;
|
|
1237
|
-
var events = new EventTarget();
|
|
1238
|
-
var _PluginEvent = class _PluginEvent extends Event {
|
|
1239
|
-
constructor(type3, name, fn) {
|
|
1240
|
-
super(type3);
|
|
1241
|
-
this.name = String(name);
|
|
1242
|
-
this.fn = fn;
|
|
1243
|
-
}
|
|
1244
|
-
};
|
|
1245
|
-
__name(_PluginEvent, "PluginEvent");
|
|
1246
|
-
var PluginEvent = _PluginEvent;
|
|
1247
|
-
function isProxyEnabled() {
|
|
1248
|
-
return config.useProxy && typeof Proxy !== "undefined" && typeof Reflect !== "undefined";
|
|
1249
|
-
}
|
|
1250
|
-
__name(isProxyEnabled, "isProxyEnabled");
|
|
1251
|
-
function addProperty(ctx, name, getter) {
|
|
1252
|
-
getter = getter === void 0 ? function() {} : getter;
|
|
1253
|
-
Object.defineProperty(ctx, name, {
|
|
1254
|
-
get: /* @__PURE__ */ __name(function propertyGetter() {
|
|
1255
|
-
if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", propertyGetter);
|
|
1256
|
-
let result = getter.call(this);
|
|
1257
|
-
if (result !== void 0) return result;
|
|
1258
|
-
let newAssertion = new Assertion();
|
|
1259
|
-
transferFlags(this, newAssertion);
|
|
1260
|
-
return newAssertion;
|
|
1261
|
-
}, "propertyGetter"),
|
|
1262
|
-
configurable: true
|
|
1263
|
-
});
|
|
1264
|
-
events.dispatchEvent(new PluginEvent("addProperty", name, getter));
|
|
1265
|
-
}
|
|
1266
|
-
__name(addProperty, "addProperty");
|
|
1267
|
-
var fnLengthDesc = Object.getOwnPropertyDescriptor(function() {}, "length");
|
|
1268
|
-
function addLengthGuard(fn, assertionName, isChainable) {
|
|
1269
|
-
if (!fnLengthDesc.configurable) return fn;
|
|
1270
|
-
Object.defineProperty(fn, "length", { get: /* @__PURE__ */ __name(function() {
|
|
1271
|
-
if (isChainable) throw Error("Invalid Chai property: " + assertionName + ".length. Due to a compatibility issue, \"length\" cannot directly follow \"" + assertionName + "\". Use \"" + assertionName + ".lengthOf\" instead.");
|
|
1272
|
-
throw Error("Invalid Chai property: " + assertionName + ".length. See docs for proper usage of \"" + assertionName + "\".");
|
|
1273
|
-
}, "get") });
|
|
1274
|
-
return fn;
|
|
1275
|
-
}
|
|
1276
|
-
__name(addLengthGuard, "addLengthGuard");
|
|
1277
|
-
function getProperties(object) {
|
|
1278
|
-
let result = Object.getOwnPropertyNames(object);
|
|
1279
|
-
function addProperty2(property) {
|
|
1280
|
-
if (result.indexOf(property) === -1) result.push(property);
|
|
1281
|
-
}
|
|
1282
|
-
__name(addProperty2, "addProperty");
|
|
1283
|
-
let proto = Object.getPrototypeOf(object);
|
|
1284
|
-
while (proto !== null) {
|
|
1285
|
-
Object.getOwnPropertyNames(proto).forEach(addProperty2);
|
|
1286
|
-
proto = Object.getPrototypeOf(proto);
|
|
1287
|
-
}
|
|
1288
|
-
return result;
|
|
1289
|
-
}
|
|
1290
|
-
__name(getProperties, "getProperties");
|
|
1291
|
-
var builtins = [
|
|
1292
|
-
"__flags",
|
|
1293
|
-
"__methods",
|
|
1294
|
-
"_obj",
|
|
1295
|
-
"assert"
|
|
1296
|
-
];
|
|
1297
|
-
function proxify(obj, nonChainableMethodName) {
|
|
1298
|
-
if (!isProxyEnabled()) return obj;
|
|
1299
|
-
return new Proxy(obj, { get: /* @__PURE__ */ __name(function proxyGetter(target, property) {
|
|
1300
|
-
if (typeof property === "string" && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) {
|
|
1301
|
-
if (nonChainableMethodName) throw Error("Invalid Chai property: " + nonChainableMethodName + "." + property + ". See docs for proper usage of \"" + nonChainableMethodName + "\".");
|
|
1302
|
-
let suggestion = null;
|
|
1303
|
-
let suggestionDistance = 4;
|
|
1304
|
-
getProperties(target).forEach(function(prop) {
|
|
1305
|
-
if (!Object.prototype.hasOwnProperty(prop) && builtins.indexOf(prop) === -1) {
|
|
1306
|
-
let dist = stringDistanceCapped(property, prop, suggestionDistance);
|
|
1307
|
-
if (dist < suggestionDistance) {
|
|
1308
|
-
suggestion = prop;
|
|
1309
|
-
suggestionDistance = dist;
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
});
|
|
1313
|
-
if (suggestion !== null) throw Error("Invalid Chai property: " + property + ". Did you mean \"" + suggestion + "\"?");
|
|
1314
|
-
else throw Error("Invalid Chai property: " + property);
|
|
1315
|
-
}
|
|
1316
|
-
if (builtins.indexOf(property) === -1 && !flag(target, "lockSsfi")) flag(target, "ssfi", proxyGetter);
|
|
1317
|
-
return Reflect.get(target, property);
|
|
1318
|
-
}, "proxyGetter") });
|
|
1319
|
-
}
|
|
1320
|
-
__name(proxify, "proxify");
|
|
1321
|
-
function stringDistanceCapped(strA, strB, cap) {
|
|
1322
|
-
if (Math.abs(strA.length - strB.length) >= cap) return cap;
|
|
1323
|
-
let memo = [];
|
|
1324
|
-
for (let i = 0; i <= strA.length; i++) {
|
|
1325
|
-
memo[i] = Array(strB.length + 1).fill(0);
|
|
1326
|
-
memo[i][0] = i;
|
|
1327
|
-
}
|
|
1328
|
-
for (let j = 0; j < strB.length; j++) memo[0][j] = j;
|
|
1329
|
-
for (let i = 1; i <= strA.length; i++) {
|
|
1330
|
-
let ch = strA.charCodeAt(i - 1);
|
|
1331
|
-
for (let j = 1; j <= strB.length; j++) {
|
|
1332
|
-
if (Math.abs(i - j) >= cap) {
|
|
1333
|
-
memo[i][j] = cap;
|
|
1334
|
-
continue;
|
|
1335
|
-
}
|
|
1336
|
-
memo[i][j] = Math.min(memo[i - 1][j] + 1, memo[i][j - 1] + 1, memo[i - 1][j - 1] + (ch === strB.charCodeAt(j - 1) ? 0 : 1));
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
return memo[strA.length][strB.length];
|
|
1340
|
-
}
|
|
1341
|
-
__name(stringDistanceCapped, "stringDistanceCapped");
|
|
1342
|
-
function addMethod(ctx, name, method) {
|
|
1343
|
-
let methodWrapper = /* @__PURE__ */ __name(function() {
|
|
1344
|
-
if (!flag(this, "lockSsfi")) flag(this, "ssfi", methodWrapper);
|
|
1345
|
-
let result = method.apply(this, arguments);
|
|
1346
|
-
if (result !== void 0) return result;
|
|
1347
|
-
let newAssertion = new Assertion();
|
|
1348
|
-
transferFlags(this, newAssertion);
|
|
1349
|
-
return newAssertion;
|
|
1350
|
-
}, "methodWrapper");
|
|
1351
|
-
addLengthGuard(methodWrapper, name, false);
|
|
1352
|
-
ctx[name] = proxify(methodWrapper, name);
|
|
1353
|
-
events.dispatchEvent(new PluginEvent("addMethod", name, method));
|
|
1354
|
-
}
|
|
1355
|
-
__name(addMethod, "addMethod");
|
|
1356
|
-
function overwriteProperty(ctx, name, getter) {
|
|
1357
|
-
let _get = Object.getOwnPropertyDescriptor(ctx, name), _super = /* @__PURE__ */ __name(function() {}, "_super");
|
|
1358
|
-
if (_get && "function" === typeof _get.get) _super = _get.get;
|
|
1359
|
-
Object.defineProperty(ctx, name, {
|
|
1360
|
-
get: /* @__PURE__ */ __name(function overwritingPropertyGetter() {
|
|
1361
|
-
if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", overwritingPropertyGetter);
|
|
1362
|
-
let origLockSsfi = flag(this, "lockSsfi");
|
|
1363
|
-
flag(this, "lockSsfi", true);
|
|
1364
|
-
let result = getter(_super).call(this);
|
|
1365
|
-
flag(this, "lockSsfi", origLockSsfi);
|
|
1366
|
-
if (result !== void 0) return result;
|
|
1367
|
-
let newAssertion = new Assertion();
|
|
1368
|
-
transferFlags(this, newAssertion);
|
|
1369
|
-
return newAssertion;
|
|
1370
|
-
}, "overwritingPropertyGetter"),
|
|
1371
|
-
configurable: true
|
|
1372
|
-
});
|
|
1373
|
-
}
|
|
1374
|
-
__name(overwriteProperty, "overwriteProperty");
|
|
1375
|
-
function overwriteMethod(ctx, name, method) {
|
|
1376
|
-
let _method = ctx[name], _super = /* @__PURE__ */ __name(function() {
|
|
1377
|
-
throw new Error(name + " is not a function");
|
|
1378
|
-
}, "_super");
|
|
1379
|
-
if (_method && "function" === typeof _method) _super = _method;
|
|
1380
|
-
let overwritingMethodWrapper = /* @__PURE__ */ __name(function() {
|
|
1381
|
-
if (!flag(this, "lockSsfi")) flag(this, "ssfi", overwritingMethodWrapper);
|
|
1382
|
-
let origLockSsfi = flag(this, "lockSsfi");
|
|
1383
|
-
flag(this, "lockSsfi", true);
|
|
1384
|
-
let result = method(_super).apply(this, arguments);
|
|
1385
|
-
flag(this, "lockSsfi", origLockSsfi);
|
|
1386
|
-
if (result !== void 0) return result;
|
|
1387
|
-
let newAssertion = new Assertion();
|
|
1388
|
-
transferFlags(this, newAssertion);
|
|
1389
|
-
return newAssertion;
|
|
1390
|
-
}, "overwritingMethodWrapper");
|
|
1391
|
-
addLengthGuard(overwritingMethodWrapper, name, false);
|
|
1392
|
-
ctx[name] = proxify(overwritingMethodWrapper, name);
|
|
1393
|
-
}
|
|
1394
|
-
__name(overwriteMethod, "overwriteMethod");
|
|
1395
|
-
var canSetPrototype = typeof Object.setPrototypeOf === "function";
|
|
1396
|
-
var testFn = /* @__PURE__ */ __name(function() {}, "testFn");
|
|
1397
|
-
var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) {
|
|
1398
|
-
let propDesc = Object.getOwnPropertyDescriptor(testFn, name);
|
|
1399
|
-
if (typeof propDesc !== "object") return true;
|
|
1400
|
-
return !propDesc.configurable;
|
|
1401
|
-
});
|
|
1402
|
-
var call = Function.prototype.call;
|
|
1403
|
-
var apply = Function.prototype.apply;
|
|
1404
|
-
var _PluginAddChainableMethodEvent = class _PluginAddChainableMethodEvent extends PluginEvent {
|
|
1405
|
-
constructor(type3, name, fn, chainingBehavior) {
|
|
1406
|
-
super(type3, name, fn);
|
|
1407
|
-
this.chainingBehavior = chainingBehavior;
|
|
1408
|
-
}
|
|
1409
|
-
};
|
|
1410
|
-
__name(_PluginAddChainableMethodEvent, "PluginAddChainableMethodEvent");
|
|
1411
|
-
var PluginAddChainableMethodEvent = _PluginAddChainableMethodEvent;
|
|
1412
|
-
function addChainableMethod(ctx, name, method, chainingBehavior) {
|
|
1413
|
-
if (typeof chainingBehavior !== "function") chainingBehavior = /* @__PURE__ */ __name(function() {}, "chainingBehavior");
|
|
1414
|
-
let chainableBehavior = {
|
|
1415
|
-
method,
|
|
1416
|
-
chainingBehavior
|
|
1417
|
-
};
|
|
1418
|
-
if (!ctx.__methods) ctx.__methods = {};
|
|
1419
|
-
ctx.__methods[name] = chainableBehavior;
|
|
1420
|
-
Object.defineProperty(ctx, name, {
|
|
1421
|
-
get: /* @__PURE__ */ __name(function chainableMethodGetter() {
|
|
1422
|
-
chainableBehavior.chainingBehavior.call(this);
|
|
1423
|
-
let chainableMethodWrapper = /* @__PURE__ */ __name(function() {
|
|
1424
|
-
if (!flag(this, "lockSsfi")) flag(this, "ssfi", chainableMethodWrapper);
|
|
1425
|
-
let result = chainableBehavior.method.apply(this, arguments);
|
|
1426
|
-
if (result !== void 0) return result;
|
|
1427
|
-
let newAssertion = new Assertion();
|
|
1428
|
-
transferFlags(this, newAssertion);
|
|
1429
|
-
return newAssertion;
|
|
1430
|
-
}, "chainableMethodWrapper");
|
|
1431
|
-
addLengthGuard(chainableMethodWrapper, name, true);
|
|
1432
|
-
if (canSetPrototype) {
|
|
1433
|
-
let prototype = Object.create(this);
|
|
1434
|
-
prototype.call = call;
|
|
1435
|
-
prototype.apply = apply;
|
|
1436
|
-
Object.setPrototypeOf(chainableMethodWrapper, prototype);
|
|
1437
|
-
} else Object.getOwnPropertyNames(ctx).forEach(function(asserterName) {
|
|
1438
|
-
if (excludeNames.indexOf(asserterName) !== -1) return;
|
|
1439
|
-
let pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
|
|
1440
|
-
Object.defineProperty(chainableMethodWrapper, asserterName, pd);
|
|
1441
|
-
});
|
|
1442
|
-
transferFlags(this, chainableMethodWrapper);
|
|
1443
|
-
return proxify(chainableMethodWrapper);
|
|
1444
|
-
}, "chainableMethodGetter"),
|
|
1445
|
-
configurable: true
|
|
1446
|
-
});
|
|
1447
|
-
events.dispatchEvent(new PluginAddChainableMethodEvent("addChainableMethod", name, method, chainingBehavior));
|
|
1448
|
-
}
|
|
1449
|
-
__name(addChainableMethod, "addChainableMethod");
|
|
1450
|
-
function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
|
|
1451
|
-
let chainableBehavior = ctx.__methods[name];
|
|
1452
|
-
let _chainingBehavior = chainableBehavior.chainingBehavior;
|
|
1453
|
-
chainableBehavior.chainingBehavior = /* @__PURE__ */ __name(function overwritingChainableMethodGetter() {
|
|
1454
|
-
let result = chainingBehavior(_chainingBehavior).call(this);
|
|
1455
|
-
if (result !== void 0) return result;
|
|
1456
|
-
let newAssertion = new Assertion();
|
|
1457
|
-
transferFlags(this, newAssertion);
|
|
1458
|
-
return newAssertion;
|
|
1459
|
-
}, "overwritingChainableMethodGetter");
|
|
1460
|
-
let _method = chainableBehavior.method;
|
|
1461
|
-
chainableBehavior.method = /* @__PURE__ */ __name(function overwritingChainableMethodWrapper() {
|
|
1462
|
-
let result = method(_method).apply(this, arguments);
|
|
1463
|
-
if (result !== void 0) return result;
|
|
1464
|
-
let newAssertion = new Assertion();
|
|
1465
|
-
transferFlags(this, newAssertion);
|
|
1466
|
-
return newAssertion;
|
|
1467
|
-
}, "overwritingChainableMethodWrapper");
|
|
1468
|
-
}
|
|
1469
|
-
__name(overwriteChainableMethod, "overwriteChainableMethod");
|
|
1470
|
-
function compareByInspect(a, b) {
|
|
1471
|
-
return inspect2(a) < inspect2(b) ? -1 : 1;
|
|
1472
|
-
}
|
|
1473
|
-
__name(compareByInspect, "compareByInspect");
|
|
1474
|
-
function getOwnEnumerablePropertySymbols(obj) {
|
|
1475
|
-
if (typeof Object.getOwnPropertySymbols !== "function") return [];
|
|
1476
|
-
return Object.getOwnPropertySymbols(obj).filter(function(sym) {
|
|
1477
|
-
return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
|
|
1478
|
-
});
|
|
1479
|
-
}
|
|
1480
|
-
__name(getOwnEnumerablePropertySymbols, "getOwnEnumerablePropertySymbols");
|
|
1481
|
-
function getOwnEnumerableProperties(obj) {
|
|
1482
|
-
return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
|
|
1483
|
-
}
|
|
1484
|
-
__name(getOwnEnumerableProperties, "getOwnEnumerableProperties");
|
|
1485
|
-
var isNaN2 = Number.isNaN;
|
|
1486
|
-
function isObjectType(obj) {
|
|
1487
|
-
let objectType = type(obj);
|
|
1488
|
-
return [
|
|
1489
|
-
"Array",
|
|
1490
|
-
"Object",
|
|
1491
|
-
"Function"
|
|
1492
|
-
].indexOf(objectType) !== -1;
|
|
1493
|
-
}
|
|
1494
|
-
__name(isObjectType, "isObjectType");
|
|
1495
|
-
function getOperator(obj, args) {
|
|
1496
|
-
let operator = flag(obj, "operator");
|
|
1497
|
-
let negate = flag(obj, "negate");
|
|
1498
|
-
let expected = args[3];
|
|
1499
|
-
let msg = negate ? args[2] : args[1];
|
|
1500
|
-
if (operator) return operator;
|
|
1501
|
-
if (typeof msg === "function") msg = msg();
|
|
1502
|
-
msg = msg || "";
|
|
1503
|
-
if (!msg) return;
|
|
1504
|
-
if (/\shave\s/.test(msg)) return;
|
|
1505
|
-
let isObject = isObjectType(expected);
|
|
1506
|
-
if (/\snot\s/.test(msg)) return isObject ? "notDeepStrictEqual" : "notStrictEqual";
|
|
1507
|
-
return isObject ? "deepStrictEqual" : "strictEqual";
|
|
1508
|
-
}
|
|
1509
|
-
__name(getOperator, "getOperator");
|
|
1510
|
-
function getName(fn) {
|
|
1511
|
-
return fn.name;
|
|
1512
|
-
}
|
|
1513
|
-
__name(getName, "getName");
|
|
1514
|
-
function isRegExp2(obj) {
|
|
1515
|
-
return Object.prototype.toString.call(obj) === "[object RegExp]";
|
|
1516
|
-
}
|
|
1517
|
-
__name(isRegExp2, "isRegExp");
|
|
1518
|
-
function isNumeric(obj) {
|
|
1519
|
-
return ["Number", "BigInt"].includes(type(obj));
|
|
1520
|
-
}
|
|
1521
|
-
__name(isNumeric, "isNumeric");
|
|
1522
|
-
var { flag: flag2 } = utils_exports;
|
|
1523
|
-
[
|
|
1524
|
-
"to",
|
|
1525
|
-
"be",
|
|
1526
|
-
"been",
|
|
1527
|
-
"is",
|
|
1528
|
-
"and",
|
|
1529
|
-
"has",
|
|
1530
|
-
"have",
|
|
1531
|
-
"with",
|
|
1532
|
-
"that",
|
|
1533
|
-
"which",
|
|
1534
|
-
"at",
|
|
1535
|
-
"of",
|
|
1536
|
-
"same",
|
|
1537
|
-
"but",
|
|
1538
|
-
"does",
|
|
1539
|
-
"still",
|
|
1540
|
-
"also"
|
|
1541
|
-
].forEach(function(chain) {
|
|
1542
|
-
Assertion.addProperty(chain);
|
|
1543
|
-
});
|
|
1544
|
-
Assertion.addProperty("not", function() {
|
|
1545
|
-
flag2(this, "negate", true);
|
|
1546
|
-
});
|
|
1547
|
-
Assertion.addProperty("deep", function() {
|
|
1548
|
-
flag2(this, "deep", true);
|
|
1549
|
-
});
|
|
1550
|
-
Assertion.addProperty("nested", function() {
|
|
1551
|
-
flag2(this, "nested", true);
|
|
1552
|
-
});
|
|
1553
|
-
Assertion.addProperty("own", function() {
|
|
1554
|
-
flag2(this, "own", true);
|
|
1555
|
-
});
|
|
1556
|
-
Assertion.addProperty("ordered", function() {
|
|
1557
|
-
flag2(this, "ordered", true);
|
|
1558
|
-
});
|
|
1559
|
-
Assertion.addProperty("any", function() {
|
|
1560
|
-
flag2(this, "any", true);
|
|
1561
|
-
flag2(this, "all", false);
|
|
1562
|
-
});
|
|
1563
|
-
Assertion.addProperty("all", function() {
|
|
1564
|
-
flag2(this, "all", true);
|
|
1565
|
-
flag2(this, "any", false);
|
|
1566
|
-
});
|
|
1567
|
-
var functionTypes = {
|
|
1568
|
-
function: [
|
|
1569
|
-
"function",
|
|
1570
|
-
"asyncfunction",
|
|
1571
|
-
"generatorfunction",
|
|
1572
|
-
"asyncgeneratorfunction"
|
|
1573
|
-
],
|
|
1574
|
-
asyncfunction: ["asyncfunction", "asyncgeneratorfunction"],
|
|
1575
|
-
generatorfunction: ["generatorfunction", "asyncgeneratorfunction"],
|
|
1576
|
-
asyncgeneratorfunction: ["asyncgeneratorfunction"]
|
|
1577
|
-
};
|
|
1578
|
-
function an(type3, msg) {
|
|
1579
|
-
if (msg) flag2(this, "message", msg);
|
|
1580
|
-
type3 = type3.toLowerCase();
|
|
1581
|
-
let obj = flag2(this, "object"), article = ~[
|
|
1582
|
-
"a",
|
|
1583
|
-
"e",
|
|
1584
|
-
"i",
|
|
1585
|
-
"o",
|
|
1586
|
-
"u"
|
|
1587
|
-
].indexOf(type3.charAt(0)) ? "an " : "a ";
|
|
1588
|
-
const detectedType = type(obj).toLowerCase();
|
|
1589
|
-
if (functionTypes["function"].includes(type3)) this.assert(functionTypes[type3].includes(detectedType), "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
|
|
1590
|
-
else this.assert(type3 === detectedType, "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
|
|
1591
|
-
}
|
|
1592
|
-
__name(an, "an");
|
|
1593
|
-
Assertion.addChainableMethod("an", an);
|
|
1594
|
-
Assertion.addChainableMethod("a", an);
|
|
1595
|
-
function SameValueZero(a, b) {
|
|
1596
|
-
return isNaN2(a) && isNaN2(b) || a === b;
|
|
1597
|
-
}
|
|
1598
|
-
__name(SameValueZero, "SameValueZero");
|
|
1599
|
-
function includeChainingBehavior() {
|
|
1600
|
-
flag2(this, "contains", true);
|
|
1601
|
-
}
|
|
1602
|
-
__name(includeChainingBehavior, "includeChainingBehavior");
|
|
1603
|
-
function include(val, msg) {
|
|
1604
|
-
if (msg) flag2(this, "message", msg);
|
|
1605
|
-
let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), negate = flag2(this, "negate"), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), descriptor = isDeep ? "deep " : "", isEql = isDeep ? flag2(this, "eql") : SameValueZero;
|
|
1606
|
-
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1607
|
-
let included = false;
|
|
1608
|
-
switch (objType) {
|
|
1609
|
-
case "string":
|
|
1610
|
-
included = obj.indexOf(val) !== -1;
|
|
1611
|
-
break;
|
|
1612
|
-
case "weakset":
|
|
1613
|
-
if (isDeep) throw new AssertionError(flagMsg + "unable to use .deep.include with WeakSet", void 0, ssfi);
|
|
1614
|
-
included = obj.has(val);
|
|
1615
|
-
break;
|
|
1616
|
-
case "map":
|
|
1617
|
-
obj.forEach(function(item) {
|
|
1618
|
-
included = included || isEql(item, val);
|
|
1619
|
-
});
|
|
1620
|
-
break;
|
|
1621
|
-
case "set":
|
|
1622
|
-
if (isDeep) obj.forEach(function(item) {
|
|
1623
|
-
included = included || isEql(item, val);
|
|
1624
|
-
});
|
|
1625
|
-
else included = obj.has(val);
|
|
1626
|
-
break;
|
|
1627
|
-
case "array":
|
|
1628
|
-
if (isDeep) included = obj.some(function(item) {
|
|
1629
|
-
return isEql(item, val);
|
|
1630
|
-
});
|
|
1631
|
-
else included = obj.indexOf(val) !== -1;
|
|
1632
|
-
break;
|
|
1633
|
-
default: {
|
|
1634
|
-
if (val !== Object(val)) throw new AssertionError(flagMsg + "the given combination of arguments (" + objType + " and " + type(val).toLowerCase() + ") is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a " + type(val).toLowerCase(), void 0, ssfi);
|
|
1635
|
-
let props = Object.keys(val);
|
|
1636
|
-
let firstErr = null;
|
|
1637
|
-
let numErrs = 0;
|
|
1638
|
-
props.forEach(function(prop) {
|
|
1639
|
-
let propAssertion = new Assertion(obj);
|
|
1640
|
-
transferFlags(this, propAssertion, true);
|
|
1641
|
-
flag2(propAssertion, "lockSsfi", true);
|
|
1642
|
-
if (!negate || props.length === 1) {
|
|
1643
|
-
propAssertion.property(prop, val[prop]);
|
|
1644
|
-
return;
|
|
1645
|
-
}
|
|
1646
|
-
try {
|
|
1647
|
-
propAssertion.property(prop, val[prop]);
|
|
1648
|
-
} catch (err) {
|
|
1649
|
-
if (!check_error_exports.compatibleConstructor(err, AssertionError)) throw err;
|
|
1650
|
-
if (firstErr === null) firstErr = err;
|
|
1651
|
-
numErrs++;
|
|
1652
|
-
}
|
|
1653
|
-
}, this);
|
|
1654
|
-
if (negate && props.length > 1 && numErrs === props.length) throw firstErr;
|
|
1655
|
-
return;
|
|
1656
|
-
}
|
|
1657
|
-
}
|
|
1658
|
-
this.assert(included, "expected #{this} to " + descriptor + "include " + inspect2(val), "expected #{this} to not " + descriptor + "include " + inspect2(val));
|
|
1659
|
-
}
|
|
1660
|
-
__name(include, "include");
|
|
1661
|
-
Assertion.addChainableMethod("include", include, includeChainingBehavior);
|
|
1662
|
-
Assertion.addChainableMethod("contain", include, includeChainingBehavior);
|
|
1663
|
-
Assertion.addChainableMethod("contains", include, includeChainingBehavior);
|
|
1664
|
-
Assertion.addChainableMethod("includes", include, includeChainingBehavior);
|
|
1665
|
-
Assertion.addProperty("ok", function() {
|
|
1666
|
-
this.assert(flag2(this, "object"), "expected #{this} to be truthy", "expected #{this} to be falsy");
|
|
1667
|
-
});
|
|
1668
|
-
Assertion.addProperty("true", function() {
|
|
1669
|
-
this.assert(true === flag2(this, "object"), "expected #{this} to be true", "expected #{this} to be false", flag2(this, "negate") ? false : true);
|
|
1670
|
-
});
|
|
1671
|
-
Assertion.addProperty("numeric", function() {
|
|
1672
|
-
const object = flag2(this, "object");
|
|
1673
|
-
this.assert(["Number", "BigInt"].includes(type(object)), "expected #{this} to be numeric", "expected #{this} to not be numeric", flag2(this, "negate") ? false : true);
|
|
1674
|
-
});
|
|
1675
|
-
Assertion.addProperty("callable", function() {
|
|
1676
|
-
const val = flag2(this, "object");
|
|
1677
|
-
const ssfi = flag2(this, "ssfi");
|
|
1678
|
-
const message = flag2(this, "message");
|
|
1679
|
-
const msg = message ? `${message}: ` : "";
|
|
1680
|
-
const negate = flag2(this, "negate");
|
|
1681
|
-
const assertionMessage = negate ? `${msg}expected ${inspect2(val)} not to be a callable function` : `${msg}expected ${inspect2(val)} to be a callable function`;
|
|
1682
|
-
const isCallable = [
|
|
1683
|
-
"Function",
|
|
1684
|
-
"AsyncFunction",
|
|
1685
|
-
"GeneratorFunction",
|
|
1686
|
-
"AsyncGeneratorFunction"
|
|
1687
|
-
].includes(type(val));
|
|
1688
|
-
if (isCallable && negate || !isCallable && !negate) throw new AssertionError(assertionMessage, void 0, ssfi);
|
|
1689
|
-
});
|
|
1690
|
-
Assertion.addProperty("false", function() {
|
|
1691
|
-
this.assert(false === flag2(this, "object"), "expected #{this} to be false", "expected #{this} to be true", flag2(this, "negate") ? true : false);
|
|
1692
|
-
});
|
|
1693
|
-
Assertion.addProperty("null", function() {
|
|
1694
|
-
this.assert(null === flag2(this, "object"), "expected #{this} to be null", "expected #{this} not to be null");
|
|
1695
|
-
});
|
|
1696
|
-
Assertion.addProperty("undefined", function() {
|
|
1697
|
-
this.assert(void 0 === flag2(this, "object"), "expected #{this} to be undefined", "expected #{this} not to be undefined");
|
|
1698
|
-
});
|
|
1699
|
-
Assertion.addProperty("NaN", function() {
|
|
1700
|
-
this.assert(isNaN2(flag2(this, "object")), "expected #{this} to be NaN", "expected #{this} not to be NaN");
|
|
1701
|
-
});
|
|
1702
|
-
function assertExist() {
|
|
1703
|
-
let val = flag2(this, "object");
|
|
1704
|
-
this.assert(val !== null && val !== void 0, "expected #{this} to exist", "expected #{this} to not exist");
|
|
1705
|
-
}
|
|
1706
|
-
__name(assertExist, "assertExist");
|
|
1707
|
-
Assertion.addProperty("exist", assertExist);
|
|
1708
|
-
Assertion.addProperty("exists", assertExist);
|
|
1709
|
-
Assertion.addProperty("empty", function() {
|
|
1710
|
-
let val = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), itemsCount;
|
|
1711
|
-
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1712
|
-
switch (type(val).toLowerCase()) {
|
|
1713
|
-
case "array":
|
|
1714
|
-
case "string":
|
|
1715
|
-
itemsCount = val.length;
|
|
1716
|
-
break;
|
|
1717
|
-
case "map":
|
|
1718
|
-
case "set":
|
|
1719
|
-
itemsCount = val.size;
|
|
1720
|
-
break;
|
|
1721
|
-
case "weakmap":
|
|
1722
|
-
case "weakset": throw new AssertionError(flagMsg + ".empty was passed a weak collection", void 0, ssfi);
|
|
1723
|
-
case "function": throw new AssertionError((flagMsg + ".empty was passed a function " + getName(val)).trim(), void 0, ssfi);
|
|
1724
|
-
default:
|
|
1725
|
-
if (val !== Object(val)) throw new AssertionError(flagMsg + ".empty was passed non-string primitive " + inspect2(val), void 0, ssfi);
|
|
1726
|
-
itemsCount = Object.keys(val).length;
|
|
1727
|
-
}
|
|
1728
|
-
this.assert(0 === itemsCount, "expected #{this} to be empty", "expected #{this} not to be empty");
|
|
1729
|
-
});
|
|
1730
|
-
function checkArguments() {
|
|
1731
|
-
let type3 = type(flag2(this, "object"));
|
|
1732
|
-
this.assert("Arguments" === type3, "expected #{this} to be arguments but got " + type3, "expected #{this} to not be arguments");
|
|
1733
|
-
}
|
|
1734
|
-
__name(checkArguments, "checkArguments");
|
|
1735
|
-
Assertion.addProperty("arguments", checkArguments);
|
|
1736
|
-
Assertion.addProperty("Arguments", checkArguments);
|
|
1737
|
-
function assertEqual(val, msg) {
|
|
1738
|
-
if (msg) flag2(this, "message", msg);
|
|
1739
|
-
let obj = flag2(this, "object");
|
|
1740
|
-
if (flag2(this, "deep")) {
|
|
1741
|
-
let prevLockSsfi = flag2(this, "lockSsfi");
|
|
1742
|
-
flag2(this, "lockSsfi", true);
|
|
1743
|
-
this.eql(val);
|
|
1744
|
-
flag2(this, "lockSsfi", prevLockSsfi);
|
|
1745
|
-
} else this.assert(val === obj, "expected #{this} to equal #{exp}", "expected #{this} to not equal #{exp}", val, this._obj, true);
|
|
1746
|
-
}
|
|
1747
|
-
__name(assertEqual, "assertEqual");
|
|
1748
|
-
Assertion.addMethod("equal", assertEqual);
|
|
1749
|
-
Assertion.addMethod("equals", assertEqual);
|
|
1750
|
-
Assertion.addMethod("eq", assertEqual);
|
|
1751
|
-
function assertEql(obj, msg) {
|
|
1752
|
-
if (msg) flag2(this, "message", msg);
|
|
1753
|
-
let eql = flag2(this, "eql");
|
|
1754
|
-
this.assert(eql(obj, flag2(this, "object")), "expected #{this} to deeply equal #{exp}", "expected #{this} to not deeply equal #{exp}", obj, this._obj, true);
|
|
1755
|
-
}
|
|
1756
|
-
__name(assertEql, "assertEql");
|
|
1757
|
-
Assertion.addMethod("eql", assertEql);
|
|
1758
|
-
Assertion.addMethod("eqls", assertEql);
|
|
1759
|
-
function assertAbove(n, msg) {
|
|
1760
|
-
if (msg) flag2(this, "message", msg);
|
|
1761
|
-
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase();
|
|
1762
|
-
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1763
|
-
if (!doLength && objType === "date" && nType !== "date") throw new AssertionError(msgPrefix + "the argument to above must be a date", void 0, ssfi);
|
|
1764
|
-
else if (!isNumeric(n) && (doLength || isNumeric(obj))) throw new AssertionError(msgPrefix + "the argument to above must be a number", void 0, ssfi);
|
|
1765
|
-
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1766
|
-
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1767
|
-
throw new AssertionError(msgPrefix + "expected " + printObj + " to be a number or a date", void 0, ssfi);
|
|
1768
|
-
}
|
|
1769
|
-
if (doLength) {
|
|
1770
|
-
let descriptor = "length", itemsCount;
|
|
1771
|
-
if (objType === "map" || objType === "set") {
|
|
1772
|
-
descriptor = "size";
|
|
1773
|
-
itemsCount = obj.size;
|
|
1774
|
-
} else itemsCount = obj.length;
|
|
1775
|
-
this.assert(itemsCount > n, "expected #{this} to have a " + descriptor + " above #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " above #{exp}", n, itemsCount);
|
|
1776
|
-
} else this.assert(obj > n, "expected #{this} to be above #{exp}", "expected #{this} to be at most #{exp}", n);
|
|
1777
|
-
}
|
|
1778
|
-
__name(assertAbove, "assertAbove");
|
|
1779
|
-
Assertion.addMethod("above", assertAbove);
|
|
1780
|
-
Assertion.addMethod("gt", assertAbove);
|
|
1781
|
-
Assertion.addMethod("greaterThan", assertAbove);
|
|
1782
|
-
function assertLeast(n, msg) {
|
|
1783
|
-
if (msg) flag2(this, "message", msg);
|
|
1784
|
-
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
|
|
1785
|
-
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1786
|
-
if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to least must be a date";
|
|
1787
|
-
else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to least must be a number";
|
|
1788
|
-
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1789
|
-
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1790
|
-
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1791
|
-
} else shouldThrow = false;
|
|
1792
|
-
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1793
|
-
if (doLength) {
|
|
1794
|
-
let descriptor = "length", itemsCount;
|
|
1795
|
-
if (objType === "map" || objType === "set") {
|
|
1796
|
-
descriptor = "size";
|
|
1797
|
-
itemsCount = obj.size;
|
|
1798
|
-
} else itemsCount = obj.length;
|
|
1799
|
-
this.assert(itemsCount >= n, "expected #{this} to have a " + descriptor + " at least #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " below #{exp}", n, itemsCount);
|
|
1800
|
-
} else this.assert(obj >= n, "expected #{this} to be at least #{exp}", "expected #{this} to be below #{exp}", n);
|
|
1801
|
-
}
|
|
1802
|
-
__name(assertLeast, "assertLeast");
|
|
1803
|
-
Assertion.addMethod("least", assertLeast);
|
|
1804
|
-
Assertion.addMethod("gte", assertLeast);
|
|
1805
|
-
Assertion.addMethod("greaterThanOrEqual", assertLeast);
|
|
1806
|
-
function assertBelow(n, msg) {
|
|
1807
|
-
if (msg) flag2(this, "message", msg);
|
|
1808
|
-
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
|
|
1809
|
-
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1810
|
-
if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to below must be a date";
|
|
1811
|
-
else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to below must be a number";
|
|
1812
|
-
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1813
|
-
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1814
|
-
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1815
|
-
} else shouldThrow = false;
|
|
1816
|
-
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1817
|
-
if (doLength) {
|
|
1818
|
-
let descriptor = "length", itemsCount;
|
|
1819
|
-
if (objType === "map" || objType === "set") {
|
|
1820
|
-
descriptor = "size";
|
|
1821
|
-
itemsCount = obj.size;
|
|
1822
|
-
} else itemsCount = obj.length;
|
|
1823
|
-
this.assert(itemsCount < n, "expected #{this} to have a " + descriptor + " below #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " below #{exp}", n, itemsCount);
|
|
1824
|
-
} else this.assert(obj < n, "expected #{this} to be below #{exp}", "expected #{this} to be at least #{exp}", n);
|
|
1825
|
-
}
|
|
1826
|
-
__name(assertBelow, "assertBelow");
|
|
1827
|
-
Assertion.addMethod("below", assertBelow);
|
|
1828
|
-
Assertion.addMethod("lt", assertBelow);
|
|
1829
|
-
Assertion.addMethod("lessThan", assertBelow);
|
|
1830
|
-
function assertMost(n, msg) {
|
|
1831
|
-
if (msg) flag2(this, "message", msg);
|
|
1832
|
-
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
|
|
1833
|
-
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1834
|
-
if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to most must be a date";
|
|
1835
|
-
else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to most must be a number";
|
|
1836
|
-
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1837
|
-
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1838
|
-
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1839
|
-
} else shouldThrow = false;
|
|
1840
|
-
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1841
|
-
if (doLength) {
|
|
1842
|
-
let descriptor = "length", itemsCount;
|
|
1843
|
-
if (objType === "map" || objType === "set") {
|
|
1844
|
-
descriptor = "size";
|
|
1845
|
-
itemsCount = obj.size;
|
|
1846
|
-
} else itemsCount = obj.length;
|
|
1847
|
-
this.assert(itemsCount <= n, "expected #{this} to have a " + descriptor + " at most #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " above #{exp}", n, itemsCount);
|
|
1848
|
-
} else this.assert(obj <= n, "expected #{this} to be at most #{exp}", "expected #{this} to be above #{exp}", n);
|
|
1849
|
-
}
|
|
1850
|
-
__name(assertMost, "assertMost");
|
|
1851
|
-
Assertion.addMethod("most", assertMost);
|
|
1852
|
-
Assertion.addMethod("lte", assertMost);
|
|
1853
|
-
Assertion.addMethod("lessThanOrEqual", assertMost);
|
|
1854
|
-
Assertion.addMethod("within", function(start, finish, msg) {
|
|
1855
|
-
if (msg) flag2(this, "message", msg);
|
|
1856
|
-
let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), startType = type(start).toLowerCase(), finishType = type(finish).toLowerCase(), errorMessage, shouldThrow = true, range = startType === "date" && finishType === "date" ? start.toISOString() + ".." + finish.toISOString() : start + ".." + finish;
|
|
1857
|
-
if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1858
|
-
if (!doLength && objType === "date" && (startType !== "date" || finishType !== "date")) errorMessage = msgPrefix + "the arguments to within must be dates";
|
|
1859
|
-
else if ((!isNumeric(start) || !isNumeric(finish)) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the arguments to within must be numbers";
|
|
1860
|
-
else if (!doLength && objType !== "date" && !isNumeric(obj)) {
|
|
1861
|
-
let printObj = objType === "string" ? "'" + obj + "'" : obj;
|
|
1862
|
-
errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
|
|
1863
|
-
} else shouldThrow = false;
|
|
1864
|
-
if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
|
|
1865
|
-
if (doLength) {
|
|
1866
|
-
let descriptor = "length", itemsCount;
|
|
1867
|
-
if (objType === "map" || objType === "set") {
|
|
1868
|
-
descriptor = "size";
|
|
1869
|
-
itemsCount = obj.size;
|
|
1870
|
-
} else itemsCount = obj.length;
|
|
1871
|
-
this.assert(itemsCount >= start && itemsCount <= finish, "expected #{this} to have a " + descriptor + " within " + range, "expected #{this} to not have a " + descriptor + " within " + range);
|
|
1872
|
-
} else this.assert(obj >= start && obj <= finish, "expected #{this} to be within " + range, "expected #{this} to not be within " + range);
|
|
1873
|
-
});
|
|
1874
|
-
function assertInstanceOf(constructor, msg) {
|
|
1875
|
-
if (msg) flag2(this, "message", msg);
|
|
1876
|
-
let target = flag2(this, "object");
|
|
1877
|
-
let ssfi = flag2(this, "ssfi");
|
|
1878
|
-
let flagMsg = flag2(this, "message");
|
|
1879
|
-
let isInstanceOf;
|
|
1880
|
-
try {
|
|
1881
|
-
isInstanceOf = target instanceof constructor;
|
|
1882
|
-
} catch (err) {
|
|
1883
|
-
if (err instanceof TypeError) {
|
|
1884
|
-
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1885
|
-
throw new AssertionError(flagMsg + "The instanceof assertion needs a constructor but " + type(constructor) + " was given.", void 0, ssfi);
|
|
1886
|
-
}
|
|
1887
|
-
throw err;
|
|
1888
|
-
}
|
|
1889
|
-
let name = getName(constructor);
|
|
1890
|
-
if (name == null) name = "an unnamed constructor";
|
|
1891
|
-
this.assert(isInstanceOf, "expected #{this} to be an instance of " + name, "expected #{this} to not be an instance of " + name);
|
|
1892
|
-
}
|
|
1893
|
-
__name(assertInstanceOf, "assertInstanceOf");
|
|
1894
|
-
Assertion.addMethod("instanceof", assertInstanceOf);
|
|
1895
|
-
Assertion.addMethod("instanceOf", assertInstanceOf);
|
|
1896
|
-
function assertProperty(name, val, msg) {
|
|
1897
|
-
if (msg) flag2(this, "message", msg);
|
|
1898
|
-
let isNested = flag2(this, "nested"), isOwn = flag2(this, "own"), flagMsg = flag2(this, "message"), obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), nameType = typeof name;
|
|
1899
|
-
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1900
|
-
if (isNested) {
|
|
1901
|
-
if (nameType !== "string") throw new AssertionError(flagMsg + "the argument to property must be a string when using nested syntax", void 0, ssfi);
|
|
1902
|
-
} else if (nameType !== "string" && nameType !== "number" && nameType !== "symbol") throw new AssertionError(flagMsg + "the argument to property must be a string, number, or symbol", void 0, ssfi);
|
|
1903
|
-
if (isNested && isOwn) throw new AssertionError(flagMsg + "The \"nested\" and \"own\" flags cannot be combined.", void 0, ssfi);
|
|
1904
|
-
if (obj === null || obj === void 0) throw new AssertionError(flagMsg + "Target cannot be null or undefined.", void 0, ssfi);
|
|
1905
|
-
let isDeep = flag2(this, "deep"), negate = flag2(this, "negate"), pathInfo = isNested ? getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name], isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
|
|
1906
|
-
let descriptor = "";
|
|
1907
|
-
if (isDeep) descriptor += "deep ";
|
|
1908
|
-
if (isOwn) descriptor += "own ";
|
|
1909
|
-
if (isNested) descriptor += "nested ";
|
|
1910
|
-
descriptor += "property ";
|
|
1911
|
-
let hasProperty2;
|
|
1912
|
-
if (isOwn) hasProperty2 = Object.prototype.hasOwnProperty.call(obj, name);
|
|
1913
|
-
else if (isNested) hasProperty2 = pathInfo.exists;
|
|
1914
|
-
else hasProperty2 = hasProperty(obj, name);
|
|
1915
|
-
if (!negate || arguments.length === 1) this.assert(hasProperty2, "expected #{this} to have " + descriptor + inspect2(name), "expected #{this} to not have " + descriptor + inspect2(name));
|
|
1916
|
-
if (arguments.length > 1) this.assert(hasProperty2 && isEql(val, value), "expected #{this} to have " + descriptor + inspect2(name) + " of #{exp}, but got #{act}", "expected #{this} to not have " + descriptor + inspect2(name) + " of #{act}", val, value);
|
|
1917
|
-
flag2(this, "object", value);
|
|
1918
|
-
}
|
|
1919
|
-
__name(assertProperty, "assertProperty");
|
|
1920
|
-
Assertion.addMethod("property", assertProperty);
|
|
1921
|
-
function assertOwnProperty(_name, _value, _msg) {
|
|
1922
|
-
flag2(this, "own", true);
|
|
1923
|
-
assertProperty.apply(this, arguments);
|
|
1924
|
-
}
|
|
1925
|
-
__name(assertOwnProperty, "assertOwnProperty");
|
|
1926
|
-
Assertion.addMethod("ownProperty", assertOwnProperty);
|
|
1927
|
-
Assertion.addMethod("haveOwnProperty", assertOwnProperty);
|
|
1928
|
-
function assertOwnPropertyDescriptor(name, descriptor, msg) {
|
|
1929
|
-
if (typeof descriptor === "string") {
|
|
1930
|
-
msg = descriptor;
|
|
1931
|
-
descriptor = null;
|
|
1932
|
-
}
|
|
1933
|
-
if (msg) flag2(this, "message", msg);
|
|
1934
|
-
let obj = flag2(this, "object");
|
|
1935
|
-
let actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
|
|
1936
|
-
let eql = flag2(this, "eql");
|
|
1937
|
-
if (actualDescriptor && descriptor) this.assert(eql(descriptor, actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to match " + inspect2(descriptor) + ", got " + inspect2(actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to not match " + inspect2(descriptor), descriptor, actualDescriptor, true);
|
|
1938
|
-
else this.assert(actualDescriptor, "expected #{this} to have an own property descriptor for " + inspect2(name), "expected #{this} to not have an own property descriptor for " + inspect2(name));
|
|
1939
|
-
flag2(this, "object", actualDescriptor);
|
|
1940
|
-
}
|
|
1941
|
-
__name(assertOwnPropertyDescriptor, "assertOwnPropertyDescriptor");
|
|
1942
|
-
Assertion.addMethod("ownPropertyDescriptor", assertOwnPropertyDescriptor);
|
|
1943
|
-
Assertion.addMethod("haveOwnPropertyDescriptor", assertOwnPropertyDescriptor);
|
|
1944
|
-
function assertLengthChain() {
|
|
1945
|
-
flag2(this, "doLength", true);
|
|
1946
|
-
}
|
|
1947
|
-
__name(assertLengthChain, "assertLengthChain");
|
|
1948
|
-
function assertLength(n, msg) {
|
|
1949
|
-
if (msg) flag2(this, "message", msg);
|
|
1950
|
-
let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), descriptor = "length", itemsCount;
|
|
1951
|
-
switch (objType) {
|
|
1952
|
-
case "map":
|
|
1953
|
-
case "set":
|
|
1954
|
-
descriptor = "size";
|
|
1955
|
-
itemsCount = obj.size;
|
|
1956
|
-
break;
|
|
1957
|
-
default:
|
|
1958
|
-
new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
|
|
1959
|
-
itemsCount = obj.length;
|
|
1960
|
-
}
|
|
1961
|
-
this.assert(itemsCount == n, "expected #{this} to have a " + descriptor + " of #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " of #{act}", n, itemsCount);
|
|
1962
|
-
}
|
|
1963
|
-
__name(assertLength, "assertLength");
|
|
1964
|
-
Assertion.addChainableMethod("length", assertLength, assertLengthChain);
|
|
1965
|
-
Assertion.addChainableMethod("lengthOf", assertLength, assertLengthChain);
|
|
1966
|
-
function assertMatch(re, msg) {
|
|
1967
|
-
if (msg) flag2(this, "message", msg);
|
|
1968
|
-
let obj = flag2(this, "object");
|
|
1969
|
-
this.assert(re.exec(obj), "expected #{this} to match " + re, "expected #{this} not to match " + re);
|
|
1970
|
-
}
|
|
1971
|
-
__name(assertMatch, "assertMatch");
|
|
1972
|
-
Assertion.addMethod("match", assertMatch);
|
|
1973
|
-
Assertion.addMethod("matches", assertMatch);
|
|
1974
|
-
Assertion.addMethod("string", function(str, msg) {
|
|
1975
|
-
if (msg) flag2(this, "message", msg);
|
|
1976
|
-
let obj = flag2(this, "object");
|
|
1977
|
-
new Assertion(obj, flag2(this, "message"), flag2(this, "ssfi"), true).is.a("string");
|
|
1978
|
-
this.assert(~obj.indexOf(str), "expected #{this} to contain " + inspect2(str), "expected #{this} to not contain " + inspect2(str));
|
|
1979
|
-
});
|
|
1980
|
-
function assertKeys(keys) {
|
|
1981
|
-
let obj = flag2(this, "object"), objType = type(obj), keysType = type(keys), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), str, deepStr = "", actual, ok = true, flagMsg = flag2(this, "message");
|
|
1982
|
-
flagMsg = flagMsg ? flagMsg + ": " : "";
|
|
1983
|
-
let mixedArgsMsg = flagMsg + "when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments";
|
|
1984
|
-
if (objType === "Map" || objType === "Set") {
|
|
1985
|
-
deepStr = isDeep ? "deeply " : "";
|
|
1986
|
-
actual = [];
|
|
1987
|
-
obj.forEach(function(val, key) {
|
|
1988
|
-
actual.push(key);
|
|
1989
|
-
});
|
|
1990
|
-
if (keysType !== "Array") keys = Array.prototype.slice.call(arguments);
|
|
1991
|
-
} else {
|
|
1992
|
-
actual = getOwnEnumerableProperties(obj);
|
|
1993
|
-
switch (keysType) {
|
|
1994
|
-
case "Array":
|
|
1995
|
-
if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
|
|
1996
|
-
break;
|
|
1997
|
-
case "Object":
|
|
1998
|
-
if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
|
|
1999
|
-
keys = Object.keys(keys);
|
|
2000
|
-
break;
|
|
2001
|
-
default: keys = Array.prototype.slice.call(arguments);
|
|
2002
|
-
}
|
|
2003
|
-
keys = keys.map(function(val) {
|
|
2004
|
-
return typeof val === "symbol" ? val : String(val);
|
|
2005
|
-
});
|
|
2006
|
-
}
|
|
2007
|
-
if (!keys.length) throw new AssertionError(flagMsg + "keys required", void 0, ssfi);
|
|
2008
|
-
let len = keys.length, any = flag2(this, "any"), all = flag2(this, "all"), expected = keys, isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
|
|
2009
|
-
if (!any && !all) all = true;
|
|
2010
|
-
if (any) ok = expected.some(function(expectedKey) {
|
|
2011
|
-
return actual.some(function(actualKey) {
|
|
2012
|
-
return isEql(expectedKey, actualKey);
|
|
2013
|
-
});
|
|
2014
|
-
});
|
|
2015
|
-
if (all) {
|
|
2016
|
-
ok = expected.every(function(expectedKey) {
|
|
2017
|
-
return actual.some(function(actualKey) {
|
|
2018
|
-
return isEql(expectedKey, actualKey);
|
|
2019
|
-
});
|
|
2020
|
-
});
|
|
2021
|
-
if (!flag2(this, "contains")) ok = ok && keys.length == actual.length;
|
|
2022
|
-
}
|
|
2023
|
-
if (len > 1) {
|
|
2024
|
-
keys = keys.map(function(key) {
|
|
2025
|
-
return inspect2(key);
|
|
2026
|
-
});
|
|
2027
|
-
let last = keys.pop();
|
|
2028
|
-
if (all) str = keys.join(", ") + ", and " + last;
|
|
2029
|
-
if (any) str = keys.join(", ") + ", or " + last;
|
|
2030
|
-
} else str = inspect2(keys[0]);
|
|
2031
|
-
str = (len > 1 ? "keys " : "key ") + str;
|
|
2032
|
-
str = (flag2(this, "contains") ? "contain " : "have ") + str;
|
|
2033
|
-
this.assert(ok, "expected #{this} to " + deepStr + str, "expected #{this} to not " + deepStr + str, expected.slice(0).sort(compareByInspect), actual.sort(compareByInspect), true);
|
|
2034
|
-
}
|
|
2035
|
-
__name(assertKeys, "assertKeys");
|
|
2036
|
-
Assertion.addMethod("keys", assertKeys);
|
|
2037
|
-
Assertion.addMethod("key", assertKeys);
|
|
2038
|
-
function assertThrows(errorLike, errMsgMatcher, msg) {
|
|
2039
|
-
if (msg) flag2(this, "message", msg);
|
|
2040
|
-
let obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), negate = flag2(this, "negate") || false;
|
|
2041
|
-
new Assertion(obj, flagMsg, ssfi, true).is.a("function");
|
|
2042
|
-
if (isRegExp2(errorLike) || typeof errorLike === "string") {
|
|
2043
|
-
errMsgMatcher = errorLike;
|
|
2044
|
-
errorLike = null;
|
|
2045
|
-
}
|
|
2046
|
-
let caughtErr;
|
|
2047
|
-
let errorWasThrown = false;
|
|
2048
|
-
try {
|
|
2049
|
-
obj();
|
|
2050
|
-
} catch (err) {
|
|
2051
|
-
errorWasThrown = true;
|
|
2052
|
-
caughtErr = err;
|
|
2053
|
-
}
|
|
2054
|
-
let everyArgIsUndefined = errorLike === void 0 && errMsgMatcher === void 0;
|
|
2055
|
-
let everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
|
|
2056
|
-
let errorLikeFail = false;
|
|
2057
|
-
let errMsgMatcherFail = false;
|
|
2058
|
-
if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
|
|
2059
|
-
let errorLikeString = "an error";
|
|
2060
|
-
if (errorLike instanceof Error) errorLikeString = "#{exp}";
|
|
2061
|
-
else if (errorLike) errorLikeString = check_error_exports.getConstructorName(errorLike);
|
|
2062
|
-
let actual = caughtErr;
|
|
2063
|
-
if (caughtErr instanceof Error) actual = caughtErr.toString();
|
|
2064
|
-
else if (typeof caughtErr === "string") actual = caughtErr;
|
|
2065
|
-
else if (caughtErr && (typeof caughtErr === "object" || typeof caughtErr === "function")) try {
|
|
2066
|
-
actual = check_error_exports.getConstructorName(caughtErr);
|
|
2067
|
-
} catch (_err) {}
|
|
2068
|
-
this.assert(errorWasThrown, "expected #{this} to throw " + errorLikeString, "expected #{this} to not throw an error but #{act} was thrown", errorLike && errorLike.toString(), actual);
|
|
2069
|
-
}
|
|
2070
|
-
if (errorLike && caughtErr) {
|
|
2071
|
-
if (errorLike instanceof Error) {
|
|
2072
|
-
if (check_error_exports.compatibleInstance(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
|
|
2073
|
-
else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr && !negate ? " but #{act} was thrown" : ""), errorLike.toString(), caughtErr.toString());
|
|
2074
|
-
}
|
|
2075
|
-
if (check_error_exports.compatibleConstructor(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
|
|
2076
|
-
else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
|
|
2077
|
-
}
|
|
2078
|
-
if (caughtErr && errMsgMatcher !== void 0 && errMsgMatcher !== null) {
|
|
2079
|
-
let placeholder = "including";
|
|
2080
|
-
if (isRegExp2(errMsgMatcher)) placeholder = "matching";
|
|
2081
|
-
if (check_error_exports.compatibleMessage(caughtErr, errMsgMatcher) === negate) if (everyArgIsDefined && negate) errMsgMatcherFail = true;
|
|
2082
|
-
else this.assert(negate, "expected #{this} to throw error " + placeholder + " #{exp} but got #{act}", "expected #{this} to throw error not " + placeholder + " #{exp}", errMsgMatcher, check_error_exports.getMessage(caughtErr));
|
|
2083
|
-
}
|
|
2084
|
-
if (errorLikeFail && errMsgMatcherFail) this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
|
|
2085
|
-
flag2(this, "object", caughtErr);
|
|
2086
|
-
}
|
|
2087
|
-
__name(assertThrows, "assertThrows");
|
|
2088
|
-
Assertion.addMethod("throw", assertThrows);
|
|
2089
|
-
Assertion.addMethod("throws", assertThrows);
|
|
2090
|
-
Assertion.addMethod("Throw", assertThrows);
|
|
2091
|
-
function respondTo(method, msg) {
|
|
2092
|
-
if (msg) flag2(this, "message", msg);
|
|
2093
|
-
let obj = flag2(this, "object"), itself = flag2(this, "itself"), context = "function" === typeof obj && !itself ? obj.prototype[method] : obj[method];
|
|
2094
|
-
this.assert("function" === typeof context, "expected #{this} to respond to " + inspect2(method), "expected #{this} to not respond to " + inspect2(method));
|
|
2095
|
-
}
|
|
2096
|
-
__name(respondTo, "respondTo");
|
|
2097
|
-
Assertion.addMethod("respondTo", respondTo);
|
|
2098
|
-
Assertion.addMethod("respondsTo", respondTo);
|
|
2099
|
-
Assertion.addProperty("itself", function() {
|
|
2100
|
-
flag2(this, "itself", true);
|
|
2101
|
-
});
|
|
2102
|
-
function satisfy(matcher, msg) {
|
|
2103
|
-
if (msg) flag2(this, "message", msg);
|
|
2104
|
-
let result = matcher(flag2(this, "object"));
|
|
2105
|
-
this.assert(result, "expected #{this} to satisfy " + objDisplay(matcher), "expected #{this} to not satisfy" + objDisplay(matcher), flag2(this, "negate") ? false : true, result);
|
|
2106
|
-
}
|
|
2107
|
-
__name(satisfy, "satisfy");
|
|
2108
|
-
Assertion.addMethod("satisfy", satisfy);
|
|
2109
|
-
Assertion.addMethod("satisfies", satisfy);
|
|
2110
|
-
function closeTo(expected, delta, msg) {
|
|
2111
|
-
if (msg) flag2(this, "message", msg);
|
|
2112
|
-
let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2113
|
-
new Assertion(obj, flagMsg, ssfi, true).is.numeric;
|
|
2114
|
-
let message = "A `delta` value is required for `closeTo`";
|
|
2115
|
-
if (delta == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
|
|
2116
|
-
new Assertion(delta, flagMsg, ssfi, true).is.numeric;
|
|
2117
|
-
message = "A `expected` value is required for `closeTo`";
|
|
2118
|
-
if (expected == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
|
|
2119
|
-
new Assertion(expected, flagMsg, ssfi, true).is.numeric;
|
|
2120
|
-
const abs = /* @__PURE__ */ __name((x) => x < 0 ? -x : x, "abs");
|
|
2121
|
-
const strip = /* @__PURE__ */ __name((number) => parseFloat(parseFloat(number).toPrecision(12)), "strip");
|
|
2122
|
-
this.assert(strip(abs(obj - expected)) <= delta, "expected #{this} to be close to " + expected + " +/- " + delta, "expected #{this} not to be close to " + expected + " +/- " + delta);
|
|
2123
|
-
}
|
|
2124
|
-
__name(closeTo, "closeTo");
|
|
2125
|
-
Assertion.addMethod("closeTo", closeTo);
|
|
2126
|
-
Assertion.addMethod("approximately", closeTo);
|
|
2127
|
-
function isSubsetOf(_subset, _superset, cmp, contains, ordered) {
|
|
2128
|
-
let superset = Array.from(_superset);
|
|
2129
|
-
let subset = Array.from(_subset);
|
|
2130
|
-
if (!contains) {
|
|
2131
|
-
if (subset.length !== superset.length) return false;
|
|
2132
|
-
superset = superset.slice();
|
|
2133
|
-
}
|
|
2134
|
-
return subset.every(function(elem, idx) {
|
|
2135
|
-
if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
|
|
2136
|
-
if (!cmp) {
|
|
2137
|
-
let matchIdx = superset.indexOf(elem);
|
|
2138
|
-
if (matchIdx === -1) return false;
|
|
2139
|
-
if (!contains) superset.splice(matchIdx, 1);
|
|
2140
|
-
return true;
|
|
2141
|
-
}
|
|
2142
|
-
return superset.some(function(elem2, matchIdx) {
|
|
2143
|
-
if (!cmp(elem, elem2)) return false;
|
|
2144
|
-
if (!contains) superset.splice(matchIdx, 1);
|
|
2145
|
-
return true;
|
|
2146
|
-
});
|
|
2147
|
-
});
|
|
2148
|
-
}
|
|
2149
|
-
__name(isSubsetOf, "isSubsetOf");
|
|
2150
|
-
Assertion.addMethod("members", function(subset, msg) {
|
|
2151
|
-
if (msg) flag2(this, "message", msg);
|
|
2152
|
-
let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2153
|
-
new Assertion(obj, flagMsg, ssfi, true).to.be.iterable;
|
|
2154
|
-
new Assertion(subset, flagMsg, ssfi, true).to.be.iterable;
|
|
2155
|
-
let contains = flag2(this, "contains");
|
|
2156
|
-
let ordered = flag2(this, "ordered");
|
|
2157
|
-
let subject, failMsg, failNegateMsg;
|
|
2158
|
-
if (contains) {
|
|
2159
|
-
subject = ordered ? "an ordered superset" : "a superset";
|
|
2160
|
-
failMsg = "expected #{this} to be " + subject + " of #{exp}";
|
|
2161
|
-
failNegateMsg = "expected #{this} to not be " + subject + " of #{exp}";
|
|
2162
|
-
} else {
|
|
2163
|
-
subject = ordered ? "ordered members" : "members";
|
|
2164
|
-
failMsg = "expected #{this} to have the same " + subject + " as #{exp}";
|
|
2165
|
-
failNegateMsg = "expected #{this} to not have the same " + subject + " as #{exp}";
|
|
2166
|
-
}
|
|
2167
|
-
let cmp = flag2(this, "deep") ? flag2(this, "eql") : void 0;
|
|
2168
|
-
this.assert(isSubsetOf(subset, obj, cmp, contains, ordered), failMsg, failNegateMsg, subset, obj, true);
|
|
2169
|
-
});
|
|
2170
|
-
Assertion.addProperty("iterable", function(msg) {
|
|
2171
|
-
if (msg) flag2(this, "message", msg);
|
|
2172
|
-
let obj = flag2(this, "object");
|
|
2173
|
-
this.assert(obj != void 0 && obj[Symbol.iterator], "expected #{this} to be an iterable", "expected #{this} to not be an iterable", obj);
|
|
2174
|
-
});
|
|
2175
|
-
function oneOf(list, msg) {
|
|
2176
|
-
if (msg) flag2(this, "message", msg);
|
|
2177
|
-
let expected = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), contains = flag2(this, "contains"), isDeep = flag2(this, "deep"), eql = flag2(this, "eql");
|
|
2178
|
-
new Assertion(list, flagMsg, ssfi, true).to.be.an("array");
|
|
2179
|
-
if (contains) this.assert(list.some(function(possibility) {
|
|
2180
|
-
return expected.indexOf(possibility) > -1;
|
|
2181
|
-
}), "expected #{this} to contain one of #{exp}", "expected #{this} to not contain one of #{exp}", list, expected);
|
|
2182
|
-
else if (isDeep) this.assert(list.some(function(possibility) {
|
|
2183
|
-
return eql(expected, possibility);
|
|
2184
|
-
}), "expected #{this} to deeply equal one of #{exp}", "expected #{this} to deeply equal one of #{exp}", list, expected);
|
|
2185
|
-
else this.assert(list.indexOf(expected) > -1, "expected #{this} to be one of #{exp}", "expected #{this} to not be one of #{exp}", list, expected);
|
|
2186
|
-
}
|
|
2187
|
-
__name(oneOf, "oneOf");
|
|
2188
|
-
Assertion.addMethod("oneOf", oneOf);
|
|
2189
|
-
function assertChanges(subject, prop, msg) {
|
|
2190
|
-
if (msg) flag2(this, "message", msg);
|
|
2191
|
-
let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2192
|
-
new Assertion(fn, flagMsg, ssfi, true).is.a("function");
|
|
2193
|
-
let initial;
|
|
2194
|
-
if (!prop) {
|
|
2195
|
-
new Assertion(subject, flagMsg, ssfi, true).is.a("function");
|
|
2196
|
-
initial = subject();
|
|
2197
|
-
} else {
|
|
2198
|
-
new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
|
2199
|
-
initial = subject[prop];
|
|
2200
|
-
}
|
|
2201
|
-
fn();
|
|
2202
|
-
let final = prop === void 0 || prop === null ? subject() : subject[prop];
|
|
2203
|
-
let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
|
|
2204
|
-
flag2(this, "deltaMsgObj", msgObj);
|
|
2205
|
-
flag2(this, "initialDeltaValue", initial);
|
|
2206
|
-
flag2(this, "finalDeltaValue", final);
|
|
2207
|
-
flag2(this, "deltaBehavior", "change");
|
|
2208
|
-
flag2(this, "realDelta", final !== initial);
|
|
2209
|
-
this.assert(initial !== final, "expected " + msgObj + " to change", "expected " + msgObj + " to not change");
|
|
2210
|
-
}
|
|
2211
|
-
__name(assertChanges, "assertChanges");
|
|
2212
|
-
Assertion.addMethod("change", assertChanges);
|
|
2213
|
-
Assertion.addMethod("changes", assertChanges);
|
|
2214
|
-
function assertIncreases(subject, prop, msg) {
|
|
2215
|
-
if (msg) flag2(this, "message", msg);
|
|
2216
|
-
let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2217
|
-
new Assertion(fn, flagMsg, ssfi, true).is.a("function");
|
|
2218
|
-
let initial;
|
|
2219
|
-
if (!prop) {
|
|
2220
|
-
new Assertion(subject, flagMsg, ssfi, true).is.a("function");
|
|
2221
|
-
initial = subject();
|
|
2222
|
-
} else {
|
|
2223
|
-
new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
|
2224
|
-
initial = subject[prop];
|
|
2225
|
-
}
|
|
2226
|
-
new Assertion(initial, flagMsg, ssfi, true).is.a("number");
|
|
2227
|
-
fn();
|
|
2228
|
-
let final = prop === void 0 || prop === null ? subject() : subject[prop];
|
|
2229
|
-
let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
|
|
2230
|
-
flag2(this, "deltaMsgObj", msgObj);
|
|
2231
|
-
flag2(this, "initialDeltaValue", initial);
|
|
2232
|
-
flag2(this, "finalDeltaValue", final);
|
|
2233
|
-
flag2(this, "deltaBehavior", "increase");
|
|
2234
|
-
flag2(this, "realDelta", final - initial);
|
|
2235
|
-
this.assert(final - initial > 0, "expected " + msgObj + " to increase", "expected " + msgObj + " to not increase");
|
|
2236
|
-
}
|
|
2237
|
-
__name(assertIncreases, "assertIncreases");
|
|
2238
|
-
Assertion.addMethod("increase", assertIncreases);
|
|
2239
|
-
Assertion.addMethod("increases", assertIncreases);
|
|
2240
|
-
function assertDecreases(subject, prop, msg) {
|
|
2241
|
-
if (msg) flag2(this, "message", msg);
|
|
2242
|
-
let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
|
|
2243
|
-
new Assertion(fn, flagMsg, ssfi, true).is.a("function");
|
|
2244
|
-
let initial;
|
|
2245
|
-
if (!prop) {
|
|
2246
|
-
new Assertion(subject, flagMsg, ssfi, true).is.a("function");
|
|
2247
|
-
initial = subject();
|
|
2248
|
-
} else {
|
|
2249
|
-
new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
|
2250
|
-
initial = subject[prop];
|
|
2251
|
-
}
|
|
2252
|
-
new Assertion(initial, flagMsg, ssfi, true).is.a("number");
|
|
2253
|
-
fn();
|
|
2254
|
-
let final = prop === void 0 || prop === null ? subject() : subject[prop];
|
|
2255
|
-
let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
|
|
2256
|
-
flag2(this, "deltaMsgObj", msgObj);
|
|
2257
|
-
flag2(this, "initialDeltaValue", initial);
|
|
2258
|
-
flag2(this, "finalDeltaValue", final);
|
|
2259
|
-
flag2(this, "deltaBehavior", "decrease");
|
|
2260
|
-
flag2(this, "realDelta", initial - final);
|
|
2261
|
-
this.assert(final - initial < 0, "expected " + msgObj + " to decrease", "expected " + msgObj + " to not decrease");
|
|
2262
|
-
}
|
|
2263
|
-
__name(assertDecreases, "assertDecreases");
|
|
2264
|
-
Assertion.addMethod("decrease", assertDecreases);
|
|
2265
|
-
Assertion.addMethod("decreases", assertDecreases);
|
|
2266
|
-
function assertDelta(delta, msg) {
|
|
2267
|
-
if (msg) flag2(this, "message", msg);
|
|
2268
|
-
let msgObj = flag2(this, "deltaMsgObj");
|
|
2269
|
-
let initial = flag2(this, "initialDeltaValue");
|
|
2270
|
-
let final = flag2(this, "finalDeltaValue");
|
|
2271
|
-
let behavior = flag2(this, "deltaBehavior");
|
|
2272
|
-
let realDelta = flag2(this, "realDelta");
|
|
2273
|
-
let expression;
|
|
2274
|
-
if (behavior === "change") expression = Math.abs(final - initial) === Math.abs(delta);
|
|
2275
|
-
else expression = realDelta === Math.abs(delta);
|
|
2276
|
-
this.assert(expression, "expected " + msgObj + " to " + behavior + " by " + delta, "expected " + msgObj + " to not " + behavior + " by " + delta);
|
|
2277
|
-
}
|
|
2278
|
-
__name(assertDelta, "assertDelta");
|
|
2279
|
-
Assertion.addMethod("by", assertDelta);
|
|
2280
|
-
Assertion.addProperty("extensible", function() {
|
|
2281
|
-
let obj = flag2(this, "object");
|
|
2282
|
-
let isExtensible = obj === Object(obj) && Object.isExtensible(obj);
|
|
2283
|
-
this.assert(isExtensible, "expected #{this} to be extensible", "expected #{this} to not be extensible");
|
|
2284
|
-
});
|
|
2285
|
-
Assertion.addProperty("sealed", function() {
|
|
2286
|
-
let obj = flag2(this, "object");
|
|
2287
|
-
let isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
|
|
2288
|
-
this.assert(isSealed, "expected #{this} to be sealed", "expected #{this} to not be sealed");
|
|
2289
|
-
});
|
|
2290
|
-
Assertion.addProperty("frozen", function() {
|
|
2291
|
-
let obj = flag2(this, "object");
|
|
2292
|
-
let isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
|
|
2293
|
-
this.assert(isFrozen, "expected #{this} to be frozen", "expected #{this} to not be frozen");
|
|
2294
|
-
});
|
|
2295
|
-
Assertion.addProperty("finite", function(_msg) {
|
|
2296
|
-
let obj = flag2(this, "object");
|
|
2297
|
-
this.assert(typeof obj === "number" && isFinite(obj), "expected #{this} to be a finite number", "expected #{this} to not be a finite number");
|
|
2298
|
-
});
|
|
2299
|
-
function compareSubset(expected, actual) {
|
|
2300
|
-
if (expected === actual) return true;
|
|
2301
|
-
if (typeof actual !== typeof expected) return false;
|
|
2302
|
-
if (typeof expected !== "object" || expected === null) return expected === actual;
|
|
2303
|
-
if (!actual) return false;
|
|
2304
|
-
if (Array.isArray(expected)) {
|
|
2305
|
-
if (!Array.isArray(actual)) return false;
|
|
2306
|
-
return expected.every(function(exp) {
|
|
2307
|
-
return actual.some(function(act) {
|
|
2308
|
-
return compareSubset(exp, act);
|
|
2309
|
-
});
|
|
2310
|
-
});
|
|
2311
|
-
}
|
|
2312
|
-
if (expected instanceof Date) if (actual instanceof Date) return expected.getTime() === actual.getTime();
|
|
2313
|
-
else return false;
|
|
2314
|
-
return Object.keys(expected).every(function(key) {
|
|
2315
|
-
let expectedValue = expected[key];
|
|
2316
|
-
let actualValue = actual[key];
|
|
2317
|
-
if (typeof expectedValue === "object" && expectedValue !== null && actualValue !== null) return compareSubset(expectedValue, actualValue);
|
|
2318
|
-
if (typeof expectedValue === "function") return expectedValue(actualValue);
|
|
2319
|
-
return actualValue === expectedValue;
|
|
2320
|
-
});
|
|
2321
|
-
}
|
|
2322
|
-
__name(compareSubset, "compareSubset");
|
|
2323
|
-
Assertion.addMethod("containSubset", function(expected) {
|
|
2324
|
-
const actual = flag(this, "object");
|
|
2325
|
-
const showDiff = config.showDiff;
|
|
2326
|
-
this.assert(compareSubset(expected, actual), "expected #{act} to contain subset #{exp}", "expected #{act} to not contain subset #{exp}", expected, actual, showDiff);
|
|
2327
|
-
});
|
|
2328
|
-
function expect(val, message) {
|
|
2329
|
-
return new Assertion(val, message);
|
|
2330
|
-
}
|
|
2331
|
-
__name(expect, "expect");
|
|
2332
|
-
expect.fail = function(actual, expected, message, operator) {
|
|
2333
|
-
if (arguments.length < 2) {
|
|
2334
|
-
message = actual;
|
|
2335
|
-
actual = void 0;
|
|
2336
|
-
}
|
|
2337
|
-
message = message || "expect.fail()";
|
|
2338
|
-
throw new AssertionError(message, {
|
|
2339
|
-
actual,
|
|
2340
|
-
expected,
|
|
2341
|
-
operator
|
|
2342
|
-
}, expect.fail);
|
|
2343
|
-
};
|
|
2344
|
-
var should_exports = {};
|
|
2345
|
-
__export(should_exports, {
|
|
2346
|
-
Should: () => Should,
|
|
2347
|
-
should: () => should
|
|
2348
|
-
});
|
|
2349
|
-
function loadShould() {
|
|
2350
|
-
function shouldGetter() {
|
|
2351
|
-
if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === "function" && this instanceof Symbol || typeof BigInt === "function" && this instanceof BigInt) return new Assertion(this.valueOf(), null, shouldGetter);
|
|
2352
|
-
return new Assertion(this, null, shouldGetter);
|
|
2353
|
-
}
|
|
2354
|
-
__name(shouldGetter, "shouldGetter");
|
|
2355
|
-
function shouldSetter(value) {
|
|
2356
|
-
Object.defineProperty(this, "should", {
|
|
2357
|
-
value,
|
|
2358
|
-
enumerable: true,
|
|
2359
|
-
configurable: true,
|
|
2360
|
-
writable: true
|
|
2361
|
-
});
|
|
2362
|
-
}
|
|
2363
|
-
__name(shouldSetter, "shouldSetter");
|
|
2364
|
-
Object.defineProperty(Object.prototype, "should", {
|
|
2365
|
-
set: shouldSetter,
|
|
2366
|
-
get: shouldGetter,
|
|
2367
|
-
configurable: true
|
|
2368
|
-
});
|
|
2369
|
-
let should2 = {};
|
|
2370
|
-
should2.fail = function(actual, expected, message, operator) {
|
|
2371
|
-
if (arguments.length < 2) {
|
|
2372
|
-
message = actual;
|
|
2373
|
-
actual = void 0;
|
|
2374
|
-
}
|
|
2375
|
-
message = message || "should.fail()";
|
|
2376
|
-
throw new AssertionError(message, {
|
|
2377
|
-
actual,
|
|
2378
|
-
expected,
|
|
2379
|
-
operator
|
|
2380
|
-
}, should2.fail);
|
|
2381
|
-
};
|
|
2382
|
-
should2.equal = function(actual, expected, message) {
|
|
2383
|
-
new Assertion(actual, message).to.equal(expected);
|
|
2384
|
-
};
|
|
2385
|
-
should2.Throw = function(fn, errt, errs, msg) {
|
|
2386
|
-
new Assertion(fn, msg).to.Throw(errt, errs);
|
|
2387
|
-
};
|
|
2388
|
-
should2.exist = function(val, msg) {
|
|
2389
|
-
new Assertion(val, msg).to.exist;
|
|
2390
|
-
};
|
|
2391
|
-
should2.not = {};
|
|
2392
|
-
should2.not.equal = function(actual, expected, msg) {
|
|
2393
|
-
new Assertion(actual, msg).to.not.equal(expected);
|
|
2394
|
-
};
|
|
2395
|
-
should2.not.Throw = function(fn, errt, errs, msg) {
|
|
2396
|
-
new Assertion(fn, msg).to.not.Throw(errt, errs);
|
|
2397
|
-
};
|
|
2398
|
-
should2.not.exist = function(val, msg) {
|
|
2399
|
-
new Assertion(val, msg).to.not.exist;
|
|
2400
|
-
};
|
|
2401
|
-
should2["throw"] = should2["Throw"];
|
|
2402
|
-
should2.not["throw"] = should2.not["Throw"];
|
|
2403
|
-
return should2;
|
|
2404
|
-
}
|
|
2405
|
-
__name(loadShould, "loadShould");
|
|
2406
|
-
var should = loadShould;
|
|
2407
|
-
var Should = loadShould;
|
|
2408
|
-
function assert(express, errmsg) {
|
|
2409
|
-
new Assertion(null, null, assert, true).assert(express, errmsg, "[ negation message unavailable ]");
|
|
2410
|
-
}
|
|
2411
|
-
__name(assert, "assert");
|
|
2412
|
-
assert.fail = function(actual, expected, message, operator) {
|
|
2413
|
-
if (arguments.length < 2) {
|
|
2414
|
-
message = actual;
|
|
2415
|
-
actual = void 0;
|
|
2416
|
-
}
|
|
2417
|
-
message = message || "assert.fail()";
|
|
2418
|
-
throw new AssertionError(message, {
|
|
2419
|
-
actual,
|
|
2420
|
-
expected,
|
|
2421
|
-
operator
|
|
2422
|
-
}, assert.fail);
|
|
2423
|
-
};
|
|
2424
|
-
assert.isOk = function(val, msg) {
|
|
2425
|
-
new Assertion(val, msg, assert.isOk, true).is.ok;
|
|
2426
|
-
};
|
|
2427
|
-
assert.isNotOk = function(val, msg) {
|
|
2428
|
-
new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
|
|
2429
|
-
};
|
|
2430
|
-
assert.equal = function(act, exp, msg) {
|
|
2431
|
-
let test2 = new Assertion(act, msg, assert.equal, true);
|
|
2432
|
-
test2.assert(exp == flag(test2, "object"), "expected #{this} to equal #{exp}", "expected #{this} to not equal #{act}", exp, act, true);
|
|
2433
|
-
};
|
|
2434
|
-
assert.notEqual = function(act, exp, msg) {
|
|
2435
|
-
let test2 = new Assertion(act, msg, assert.notEqual, true);
|
|
2436
|
-
test2.assert(exp != flag(test2, "object"), "expected #{this} to not equal #{exp}", "expected #{this} to equal #{act}", exp, act, true);
|
|
2437
|
-
};
|
|
2438
|
-
assert.strictEqual = function(act, exp, msg) {
|
|
2439
|
-
new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
|
|
2440
|
-
};
|
|
2441
|
-
assert.notStrictEqual = function(act, exp, msg) {
|
|
2442
|
-
new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
|
|
2443
|
-
};
|
|
2444
|
-
assert.deepEqual = assert.deepStrictEqual = function(act, exp, msg) {
|
|
2445
|
-
new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
|
|
2446
|
-
};
|
|
2447
|
-
assert.notDeepEqual = function(act, exp, msg) {
|
|
2448
|
-
new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
|
|
2449
|
-
};
|
|
2450
|
-
assert.isAbove = function(val, abv, msg) {
|
|
2451
|
-
new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
|
|
2452
|
-
};
|
|
2453
|
-
assert.isAtLeast = function(val, atlst, msg) {
|
|
2454
|
-
new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
|
|
2455
|
-
};
|
|
2456
|
-
assert.isBelow = function(val, blw, msg) {
|
|
2457
|
-
new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
|
|
2458
|
-
};
|
|
2459
|
-
assert.isAtMost = function(val, atmst, msg) {
|
|
2460
|
-
new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
|
|
2461
|
-
};
|
|
2462
|
-
assert.isTrue = function(val, msg) {
|
|
2463
|
-
new Assertion(val, msg, assert.isTrue, true).is["true"];
|
|
2464
|
-
};
|
|
2465
|
-
assert.isNotTrue = function(val, msg) {
|
|
2466
|
-
new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
|
|
2467
|
-
};
|
|
2468
|
-
assert.isFalse = function(val, msg) {
|
|
2469
|
-
new Assertion(val, msg, assert.isFalse, true).is["false"];
|
|
2470
|
-
};
|
|
2471
|
-
assert.isNotFalse = function(val, msg) {
|
|
2472
|
-
new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
|
|
2473
|
-
};
|
|
2474
|
-
assert.isNull = function(val, msg) {
|
|
2475
|
-
new Assertion(val, msg, assert.isNull, true).to.equal(null);
|
|
2476
|
-
};
|
|
2477
|
-
assert.isNotNull = function(val, msg) {
|
|
2478
|
-
new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
|
|
2479
|
-
};
|
|
2480
|
-
assert.isNaN = function(val, msg) {
|
|
2481
|
-
new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
|
|
2482
|
-
};
|
|
2483
|
-
assert.isNotNaN = function(value, message) {
|
|
2484
|
-
new Assertion(value, message, assert.isNotNaN, true).not.to.be.NaN;
|
|
2485
|
-
};
|
|
2486
|
-
assert.exists = function(val, msg) {
|
|
2487
|
-
new Assertion(val, msg, assert.exists, true).to.exist;
|
|
2488
|
-
};
|
|
2489
|
-
assert.notExists = function(val, msg) {
|
|
2490
|
-
new Assertion(val, msg, assert.notExists, true).to.not.exist;
|
|
2491
|
-
};
|
|
2492
|
-
assert.isUndefined = function(val, msg) {
|
|
2493
|
-
new Assertion(val, msg, assert.isUndefined, true).to.equal(void 0);
|
|
2494
|
-
};
|
|
2495
|
-
assert.isDefined = function(val, msg) {
|
|
2496
|
-
new Assertion(val, msg, assert.isDefined, true).to.not.equal(void 0);
|
|
2497
|
-
};
|
|
2498
|
-
assert.isCallable = function(value, message) {
|
|
2499
|
-
new Assertion(value, message, assert.isCallable, true).is.callable;
|
|
2500
|
-
};
|
|
2501
|
-
assert.isNotCallable = function(value, message) {
|
|
2502
|
-
new Assertion(value, message, assert.isNotCallable, true).is.not.callable;
|
|
2503
|
-
};
|
|
2504
|
-
assert.isObject = function(val, msg) {
|
|
2505
|
-
new Assertion(val, msg, assert.isObject, true).to.be.a("object");
|
|
2506
|
-
};
|
|
2507
|
-
assert.isNotObject = function(val, msg) {
|
|
2508
|
-
new Assertion(val, msg, assert.isNotObject, true).to.not.be.a("object");
|
|
2509
|
-
};
|
|
2510
|
-
assert.isArray = function(val, msg) {
|
|
2511
|
-
new Assertion(val, msg, assert.isArray, true).to.be.an("array");
|
|
2512
|
-
};
|
|
2513
|
-
assert.isNotArray = function(val, msg) {
|
|
2514
|
-
new Assertion(val, msg, assert.isNotArray, true).to.not.be.an("array");
|
|
2515
|
-
};
|
|
2516
|
-
assert.isString = function(val, msg) {
|
|
2517
|
-
new Assertion(val, msg, assert.isString, true).to.be.a("string");
|
|
2518
|
-
};
|
|
2519
|
-
assert.isNotString = function(val, msg) {
|
|
2520
|
-
new Assertion(val, msg, assert.isNotString, true).to.not.be.a("string");
|
|
2521
|
-
};
|
|
2522
|
-
assert.isNumber = function(val, msg) {
|
|
2523
|
-
new Assertion(val, msg, assert.isNumber, true).to.be.a("number");
|
|
2524
|
-
};
|
|
2525
|
-
assert.isNotNumber = function(val, msg) {
|
|
2526
|
-
new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a("number");
|
|
2527
|
-
};
|
|
2528
|
-
assert.isNumeric = function(val, msg) {
|
|
2529
|
-
new Assertion(val, msg, assert.isNumeric, true).is.numeric;
|
|
2530
|
-
};
|
|
2531
|
-
assert.isNotNumeric = function(val, msg) {
|
|
2532
|
-
new Assertion(val, msg, assert.isNotNumeric, true).is.not.numeric;
|
|
2533
|
-
};
|
|
2534
|
-
assert.isFinite = function(val, msg) {
|
|
2535
|
-
new Assertion(val, msg, assert.isFinite, true).to.be.finite;
|
|
2536
|
-
};
|
|
2537
|
-
assert.isBoolean = function(val, msg) {
|
|
2538
|
-
new Assertion(val, msg, assert.isBoolean, true).to.be.a("boolean");
|
|
2539
|
-
};
|
|
2540
|
-
assert.isNotBoolean = function(val, msg) {
|
|
2541
|
-
new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a("boolean");
|
|
2542
|
-
};
|
|
2543
|
-
assert.typeOf = function(val, type3, msg) {
|
|
2544
|
-
new Assertion(val, msg, assert.typeOf, true).to.be.a(type3);
|
|
2545
|
-
};
|
|
2546
|
-
assert.notTypeOf = function(value, type3, message) {
|
|
2547
|
-
new Assertion(value, message, assert.notTypeOf, true).to.not.be.a(type3);
|
|
2548
|
-
};
|
|
2549
|
-
assert.instanceOf = function(val, type3, msg) {
|
|
2550
|
-
new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type3);
|
|
2551
|
-
};
|
|
2552
|
-
assert.notInstanceOf = function(val, type3, msg) {
|
|
2553
|
-
new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type3);
|
|
2554
|
-
};
|
|
2555
|
-
assert.include = function(exp, inc, msg) {
|
|
2556
|
-
new Assertion(exp, msg, assert.include, true).include(inc);
|
|
2557
|
-
};
|
|
2558
|
-
assert.notInclude = function(exp, inc, msg) {
|
|
2559
|
-
new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
|
|
2560
|
-
};
|
|
2561
|
-
assert.deepInclude = function(exp, inc, msg) {
|
|
2562
|
-
new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
|
|
2563
|
-
};
|
|
2564
|
-
assert.notDeepInclude = function(exp, inc, msg) {
|
|
2565
|
-
new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
|
|
2566
|
-
};
|
|
2567
|
-
assert.nestedInclude = function(exp, inc, msg) {
|
|
2568
|
-
new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
|
|
2569
|
-
};
|
|
2570
|
-
assert.notNestedInclude = function(exp, inc, msg) {
|
|
2571
|
-
new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc);
|
|
2572
|
-
};
|
|
2573
|
-
assert.deepNestedInclude = function(exp, inc, msg) {
|
|
2574
|
-
new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc);
|
|
2575
|
-
};
|
|
2576
|
-
assert.notDeepNestedInclude = function(exp, inc, msg) {
|
|
2577
|
-
new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc);
|
|
2578
|
-
};
|
|
2579
|
-
assert.ownInclude = function(exp, inc, msg) {
|
|
2580
|
-
new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
|
|
2581
|
-
};
|
|
2582
|
-
assert.notOwnInclude = function(exp, inc, msg) {
|
|
2583
|
-
new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
|
|
2584
|
-
};
|
|
2585
|
-
assert.deepOwnInclude = function(exp, inc, msg) {
|
|
2586
|
-
new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc);
|
|
2587
|
-
};
|
|
2588
|
-
assert.notDeepOwnInclude = function(exp, inc, msg) {
|
|
2589
|
-
new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc);
|
|
2590
|
-
};
|
|
2591
|
-
assert.match = function(exp, re, msg) {
|
|
2592
|
-
new Assertion(exp, msg, assert.match, true).to.match(re);
|
|
2593
|
-
};
|
|
2594
|
-
assert.notMatch = function(exp, re, msg) {
|
|
2595
|
-
new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
|
|
2596
|
-
};
|
|
2597
|
-
assert.property = function(obj, prop, msg) {
|
|
2598
|
-
new Assertion(obj, msg, assert.property, true).to.have.property(prop);
|
|
2599
|
-
};
|
|
2600
|
-
assert.notProperty = function(obj, prop, msg) {
|
|
2601
|
-
new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop);
|
|
2602
|
-
};
|
|
2603
|
-
assert.propertyVal = function(obj, prop, val, msg) {
|
|
2604
|
-
new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val);
|
|
2605
|
-
};
|
|
2606
|
-
assert.notPropertyVal = function(obj, prop, val, msg) {
|
|
2607
|
-
new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val);
|
|
2608
|
-
};
|
|
2609
|
-
assert.deepPropertyVal = function(obj, prop, val, msg) {
|
|
2610
|
-
new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val);
|
|
2611
|
-
};
|
|
2612
|
-
assert.notDeepPropertyVal = function(obj, prop, val, msg) {
|
|
2613
|
-
new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val);
|
|
2614
|
-
};
|
|
2615
|
-
assert.ownProperty = function(obj, prop, msg) {
|
|
2616
|
-
new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop);
|
|
2617
|
-
};
|
|
2618
|
-
assert.notOwnProperty = function(obj, prop, msg) {
|
|
2619
|
-
new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop);
|
|
2620
|
-
};
|
|
2621
|
-
assert.ownPropertyVal = function(obj, prop, value, msg) {
|
|
2622
|
-
new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value);
|
|
2623
|
-
};
|
|
2624
|
-
assert.notOwnPropertyVal = function(obj, prop, value, msg) {
|
|
2625
|
-
new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value);
|
|
2626
|
-
};
|
|
2627
|
-
assert.deepOwnPropertyVal = function(obj, prop, value, msg) {
|
|
2628
|
-
new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value);
|
|
2629
|
-
};
|
|
2630
|
-
assert.notDeepOwnPropertyVal = function(obj, prop, value, msg) {
|
|
2631
|
-
new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value);
|
|
2632
|
-
};
|
|
2633
|
-
assert.nestedProperty = function(obj, prop, msg) {
|
|
2634
|
-
new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop);
|
|
2635
|
-
};
|
|
2636
|
-
assert.notNestedProperty = function(obj, prop, msg) {
|
|
2637
|
-
new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop);
|
|
2638
|
-
};
|
|
2639
|
-
assert.nestedPropertyVal = function(obj, prop, val, msg) {
|
|
2640
|
-
new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val);
|
|
2641
|
-
};
|
|
2642
|
-
assert.notNestedPropertyVal = function(obj, prop, val, msg) {
|
|
2643
|
-
new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val);
|
|
2644
|
-
};
|
|
2645
|
-
assert.deepNestedPropertyVal = function(obj, prop, val, msg) {
|
|
2646
|
-
new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val);
|
|
2647
|
-
};
|
|
2648
|
-
assert.notDeepNestedPropertyVal = function(obj, prop, val, msg) {
|
|
2649
|
-
new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val);
|
|
2650
|
-
};
|
|
2651
|
-
assert.lengthOf = function(exp, len, msg) {
|
|
2652
|
-
new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
|
|
2653
|
-
};
|
|
2654
|
-
assert.hasAnyKeys = function(obj, keys, msg) {
|
|
2655
|
-
new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
|
|
2656
|
-
};
|
|
2657
|
-
assert.hasAllKeys = function(obj, keys, msg) {
|
|
2658
|
-
new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
|
|
2659
|
-
};
|
|
2660
|
-
assert.containsAllKeys = function(obj, keys, msg) {
|
|
2661
|
-
new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys);
|
|
2662
|
-
};
|
|
2663
|
-
assert.doesNotHaveAnyKeys = function(obj, keys, msg) {
|
|
2664
|
-
new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys);
|
|
2665
|
-
};
|
|
2666
|
-
assert.doesNotHaveAllKeys = function(obj, keys, msg) {
|
|
2667
|
-
new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys);
|
|
2668
|
-
};
|
|
2669
|
-
assert.hasAnyDeepKeys = function(obj, keys, msg) {
|
|
2670
|
-
new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys);
|
|
2671
|
-
};
|
|
2672
|
-
assert.hasAllDeepKeys = function(obj, keys, msg) {
|
|
2673
|
-
new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys);
|
|
2674
|
-
};
|
|
2675
|
-
assert.containsAllDeepKeys = function(obj, keys, msg) {
|
|
2676
|
-
new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys);
|
|
2677
|
-
};
|
|
2678
|
-
assert.doesNotHaveAnyDeepKeys = function(obj, keys, msg) {
|
|
2679
|
-
new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys);
|
|
2680
|
-
};
|
|
2681
|
-
assert.doesNotHaveAllDeepKeys = function(obj, keys, msg) {
|
|
2682
|
-
new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys);
|
|
2683
|
-
};
|
|
2684
|
-
assert.throws = function(fn, errorLike, errMsgMatcher, msg) {
|
|
2685
|
-
if ("string" === typeof errorLike || errorLike instanceof RegExp) {
|
|
2686
|
-
errMsgMatcher = errorLike;
|
|
2687
|
-
errorLike = null;
|
|
2688
|
-
}
|
|
2689
|
-
return flag(new Assertion(fn, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher), "object");
|
|
2690
|
-
};
|
|
2691
|
-
assert.doesNotThrow = function(fn, errorLike, errMsgMatcher, message) {
|
|
2692
|
-
if ("string" === typeof errorLike || errorLike instanceof RegExp) {
|
|
2693
|
-
errMsgMatcher = errorLike;
|
|
2694
|
-
errorLike = null;
|
|
2695
|
-
}
|
|
2696
|
-
new Assertion(fn, message, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher);
|
|
2697
|
-
};
|
|
2698
|
-
assert.operator = function(val, operator, val2, msg) {
|
|
2699
|
-
let ok;
|
|
2700
|
-
switch (operator) {
|
|
2701
|
-
case "==":
|
|
2702
|
-
ok = val == val2;
|
|
2703
|
-
break;
|
|
2704
|
-
case "===":
|
|
2705
|
-
ok = val === val2;
|
|
2706
|
-
break;
|
|
2707
|
-
case ">":
|
|
2708
|
-
ok = val > val2;
|
|
2709
|
-
break;
|
|
2710
|
-
case ">=":
|
|
2711
|
-
ok = val >= val2;
|
|
2712
|
-
break;
|
|
2713
|
-
case "<":
|
|
2714
|
-
ok = val < val2;
|
|
2715
|
-
break;
|
|
2716
|
-
case "<=":
|
|
2717
|
-
ok = val <= val2;
|
|
2718
|
-
break;
|
|
2719
|
-
case "!=":
|
|
2720
|
-
ok = val != val2;
|
|
2721
|
-
break;
|
|
2722
|
-
case "!==":
|
|
2723
|
-
ok = val !== val2;
|
|
2724
|
-
break;
|
|
2725
|
-
default:
|
|
2726
|
-
msg = msg ? msg + ": " : msg;
|
|
2727
|
-
throw new AssertionError(msg + "Invalid operator \"" + operator + "\"", void 0, assert.operator);
|
|
2728
|
-
}
|
|
2729
|
-
let test2 = new Assertion(ok, msg, assert.operator, true);
|
|
2730
|
-
test2.assert(true === flag(test2, "object"), "expected " + inspect2(val) + " to be " + operator + " " + inspect2(val2), "expected " + inspect2(val) + " to not be " + operator + " " + inspect2(val2));
|
|
2731
|
-
};
|
|
2732
|
-
assert.closeTo = function(act, exp, delta, msg) {
|
|
2733
|
-
new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
|
|
2734
|
-
};
|
|
2735
|
-
assert.approximately = function(act, exp, delta, msg) {
|
|
2736
|
-
new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta);
|
|
2737
|
-
};
|
|
2738
|
-
assert.sameMembers = function(set1, set2, msg) {
|
|
2739
|
-
new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2);
|
|
2740
|
-
};
|
|
2741
|
-
assert.notSameMembers = function(set1, set2, msg) {
|
|
2742
|
-
new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2);
|
|
2743
|
-
};
|
|
2744
|
-
assert.sameDeepMembers = function(set1, set2, msg) {
|
|
2745
|
-
new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2);
|
|
2746
|
-
};
|
|
2747
|
-
assert.notSameDeepMembers = function(set1, set2, msg) {
|
|
2748
|
-
new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2);
|
|
2749
|
-
};
|
|
2750
|
-
assert.sameOrderedMembers = function(set1, set2, msg) {
|
|
2751
|
-
new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2);
|
|
2752
|
-
};
|
|
2753
|
-
assert.notSameOrderedMembers = function(set1, set2, msg) {
|
|
2754
|
-
new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2);
|
|
2755
|
-
};
|
|
2756
|
-
assert.sameDeepOrderedMembers = function(set1, set2, msg) {
|
|
2757
|
-
new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2);
|
|
2758
|
-
};
|
|
2759
|
-
assert.notSameDeepOrderedMembers = function(set1, set2, msg) {
|
|
2760
|
-
new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2);
|
|
2761
|
-
};
|
|
2762
|
-
assert.includeMembers = function(superset, subset, msg) {
|
|
2763
|
-
new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset);
|
|
2764
|
-
};
|
|
2765
|
-
assert.notIncludeMembers = function(superset, subset, msg) {
|
|
2766
|
-
new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset);
|
|
2767
|
-
};
|
|
2768
|
-
assert.includeDeepMembers = function(superset, subset, msg) {
|
|
2769
|
-
new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset);
|
|
2770
|
-
};
|
|
2771
|
-
assert.notIncludeDeepMembers = function(superset, subset, msg) {
|
|
2772
|
-
new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset);
|
|
2773
|
-
};
|
|
2774
|
-
assert.includeOrderedMembers = function(superset, subset, msg) {
|
|
2775
|
-
new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset);
|
|
2776
|
-
};
|
|
2777
|
-
assert.notIncludeOrderedMembers = function(superset, subset, msg) {
|
|
2778
|
-
new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset);
|
|
2779
|
-
};
|
|
2780
|
-
assert.includeDeepOrderedMembers = function(superset, subset, msg) {
|
|
2781
|
-
new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset);
|
|
2782
|
-
};
|
|
2783
|
-
assert.notIncludeDeepOrderedMembers = function(superset, subset, msg) {
|
|
2784
|
-
new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset);
|
|
2785
|
-
};
|
|
2786
|
-
assert.oneOf = function(inList, list, msg) {
|
|
2787
|
-
new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
|
|
2788
|
-
};
|
|
2789
|
-
assert.isIterable = function(obj, msg) {
|
|
2790
|
-
if (obj == void 0 || !obj[Symbol.iterator]) {
|
|
2791
|
-
msg = msg ? `${msg} expected ${inspect2(obj)} to be an iterable` : `expected ${inspect2(obj)} to be an iterable`;
|
|
2792
|
-
throw new AssertionError(msg, void 0, assert.isIterable);
|
|
2793
|
-
}
|
|
2794
|
-
};
|
|
2795
|
-
assert.changes = function(fn, obj, prop, msg) {
|
|
2796
|
-
if (arguments.length === 3 && typeof obj === "function") {
|
|
2797
|
-
msg = prop;
|
|
2798
|
-
prop = null;
|
|
2799
|
-
}
|
|
2800
|
-
new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
|
|
2801
|
-
};
|
|
2802
|
-
assert.changesBy = function(fn, obj, prop, delta, msg) {
|
|
2803
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2804
|
-
let tmpMsg = delta;
|
|
2805
|
-
delta = prop;
|
|
2806
|
-
msg = tmpMsg;
|
|
2807
|
-
} else if (arguments.length === 3) {
|
|
2808
|
-
delta = prop;
|
|
2809
|
-
prop = null;
|
|
2810
|
-
}
|
|
2811
|
-
new Assertion(fn, msg, assert.changesBy, true).to.change(obj, prop).by(delta);
|
|
2812
|
-
};
|
|
2813
|
-
assert.doesNotChange = function(fn, obj, prop, msg) {
|
|
2814
|
-
if (arguments.length === 3 && typeof obj === "function") {
|
|
2815
|
-
msg = prop;
|
|
2816
|
-
prop = null;
|
|
2817
|
-
}
|
|
2818
|
-
return new Assertion(fn, msg, assert.doesNotChange, true).to.not.change(obj, prop);
|
|
2819
|
-
};
|
|
2820
|
-
assert.changesButNotBy = function(fn, obj, prop, delta, msg) {
|
|
2821
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2822
|
-
let tmpMsg = delta;
|
|
2823
|
-
delta = prop;
|
|
2824
|
-
msg = tmpMsg;
|
|
2825
|
-
} else if (arguments.length === 3) {
|
|
2826
|
-
delta = prop;
|
|
2827
|
-
prop = null;
|
|
2828
|
-
}
|
|
2829
|
-
new Assertion(fn, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta);
|
|
2830
|
-
};
|
|
2831
|
-
assert.increases = function(fn, obj, prop, msg) {
|
|
2832
|
-
if (arguments.length === 3 && typeof obj === "function") {
|
|
2833
|
-
msg = prop;
|
|
2834
|
-
prop = null;
|
|
2835
|
-
}
|
|
2836
|
-
return new Assertion(fn, msg, assert.increases, true).to.increase(obj, prop);
|
|
2837
|
-
};
|
|
2838
|
-
assert.increasesBy = function(fn, obj, prop, delta, msg) {
|
|
2839
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2840
|
-
let tmpMsg = delta;
|
|
2841
|
-
delta = prop;
|
|
2842
|
-
msg = tmpMsg;
|
|
2843
|
-
} else if (arguments.length === 3) {
|
|
2844
|
-
delta = prop;
|
|
2845
|
-
prop = null;
|
|
2846
|
-
}
|
|
2847
|
-
new Assertion(fn, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta);
|
|
2848
|
-
};
|
|
2849
|
-
assert.doesNotIncrease = function(fn, obj, prop, msg) {
|
|
2850
|
-
if (arguments.length === 3 && typeof obj === "function") {
|
|
2851
|
-
msg = prop;
|
|
2852
|
-
prop = null;
|
|
2853
|
-
}
|
|
2854
|
-
return new Assertion(fn, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop);
|
|
2855
|
-
};
|
|
2856
|
-
assert.increasesButNotBy = function(fn, obj, prop, delta, msg) {
|
|
2857
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2858
|
-
let tmpMsg = delta;
|
|
2859
|
-
delta = prop;
|
|
2860
|
-
msg = tmpMsg;
|
|
2861
|
-
} else if (arguments.length === 3) {
|
|
2862
|
-
delta = prop;
|
|
2863
|
-
prop = null;
|
|
2864
|
-
}
|
|
2865
|
-
new Assertion(fn, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta);
|
|
2866
|
-
};
|
|
2867
|
-
assert.decreases = function(fn, obj, prop, msg) {
|
|
2868
|
-
if (arguments.length === 3 && typeof obj === "function") {
|
|
2869
|
-
msg = prop;
|
|
2870
|
-
prop = null;
|
|
2871
|
-
}
|
|
2872
|
-
return new Assertion(fn, msg, assert.decreases, true).to.decrease(obj, prop);
|
|
2873
|
-
};
|
|
2874
|
-
assert.decreasesBy = function(fn, obj, prop, delta, msg) {
|
|
2875
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2876
|
-
let tmpMsg = delta;
|
|
2877
|
-
delta = prop;
|
|
2878
|
-
msg = tmpMsg;
|
|
2879
|
-
} else if (arguments.length === 3) {
|
|
2880
|
-
delta = prop;
|
|
2881
|
-
prop = null;
|
|
2882
|
-
}
|
|
2883
|
-
new Assertion(fn, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta);
|
|
2884
|
-
};
|
|
2885
|
-
assert.doesNotDecrease = function(fn, obj, prop, msg) {
|
|
2886
|
-
if (arguments.length === 3 && typeof obj === "function") {
|
|
2887
|
-
msg = prop;
|
|
2888
|
-
prop = null;
|
|
2889
|
-
}
|
|
2890
|
-
return new Assertion(fn, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop);
|
|
2891
|
-
};
|
|
2892
|
-
assert.doesNotDecreaseBy = function(fn, obj, prop, delta, msg) {
|
|
2893
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2894
|
-
let tmpMsg = delta;
|
|
2895
|
-
delta = prop;
|
|
2896
|
-
msg = tmpMsg;
|
|
2897
|
-
} else if (arguments.length === 3) {
|
|
2898
|
-
delta = prop;
|
|
2899
|
-
prop = null;
|
|
2900
|
-
}
|
|
2901
|
-
return new Assertion(fn, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta);
|
|
2902
|
-
};
|
|
2903
|
-
assert.decreasesButNotBy = function(fn, obj, prop, delta, msg) {
|
|
2904
|
-
if (arguments.length === 4 && typeof obj === "function") {
|
|
2905
|
-
let tmpMsg = delta;
|
|
2906
|
-
delta = prop;
|
|
2907
|
-
msg = tmpMsg;
|
|
2908
|
-
} else if (arguments.length === 3) {
|
|
2909
|
-
delta = prop;
|
|
2910
|
-
prop = null;
|
|
2911
|
-
}
|
|
2912
|
-
new Assertion(fn, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta);
|
|
2913
|
-
};
|
|
2914
|
-
assert.ifError = function(val) {
|
|
2915
|
-
if (val) throw val;
|
|
2916
|
-
};
|
|
2917
|
-
assert.isExtensible = function(obj, msg) {
|
|
2918
|
-
new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
|
|
2919
|
-
};
|
|
2920
|
-
assert.isNotExtensible = function(obj, msg) {
|
|
2921
|
-
new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
|
|
2922
|
-
};
|
|
2923
|
-
assert.isSealed = function(obj, msg) {
|
|
2924
|
-
new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
|
|
2925
|
-
};
|
|
2926
|
-
assert.isNotSealed = function(obj, msg) {
|
|
2927
|
-
new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
|
|
2928
|
-
};
|
|
2929
|
-
assert.isFrozen = function(obj, msg) {
|
|
2930
|
-
new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
|
|
2931
|
-
};
|
|
2932
|
-
assert.isNotFrozen = function(obj, msg) {
|
|
2933
|
-
new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
|
|
2934
|
-
};
|
|
2935
|
-
assert.isEmpty = function(val, msg) {
|
|
2936
|
-
new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
|
|
2937
|
-
};
|
|
2938
|
-
assert.isNotEmpty = function(val, msg) {
|
|
2939
|
-
new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
|
|
2940
|
-
};
|
|
2941
|
-
assert.containsSubset = function(val, exp, msg) {
|
|
2942
|
-
new Assertion(val, msg).to.containSubset(exp);
|
|
2943
|
-
};
|
|
2944
|
-
assert.doesNotContainSubset = function(val, exp, msg) {
|
|
2945
|
-
new Assertion(val, msg).to.not.containSubset(exp);
|
|
2946
|
-
};
|
|
2947
|
-
for (const [name, as] of [
|
|
2948
|
-
["isOk", "ok"],
|
|
2949
|
-
["isNotOk", "notOk"],
|
|
2950
|
-
["throws", "throw"],
|
|
2951
|
-
["throws", "Throw"],
|
|
2952
|
-
["isExtensible", "extensible"],
|
|
2953
|
-
["isNotExtensible", "notExtensible"],
|
|
2954
|
-
["isSealed", "sealed"],
|
|
2955
|
-
["isNotSealed", "notSealed"],
|
|
2956
|
-
["isFrozen", "frozen"],
|
|
2957
|
-
["isNotFrozen", "notFrozen"],
|
|
2958
|
-
["isEmpty", "empty"],
|
|
2959
|
-
["isNotEmpty", "notEmpty"],
|
|
2960
|
-
["isCallable", "isFunction"],
|
|
2961
|
-
["isNotCallable", "isNotFunction"],
|
|
2962
|
-
["containsSubset", "containSubset"]
|
|
2963
|
-
]) assert[as] = assert[name];
|
|
2964
|
-
var used = [];
|
|
2965
|
-
function use(fn) {
|
|
2966
|
-
const exports = {
|
|
2967
|
-
use,
|
|
2968
|
-
AssertionError,
|
|
2969
|
-
util: utils_exports,
|
|
2970
|
-
config,
|
|
2971
|
-
expect,
|
|
2972
|
-
assert,
|
|
2973
|
-
Assertion,
|
|
2974
|
-
...should_exports
|
|
2975
|
-
};
|
|
2976
|
-
if (!~used.indexOf(fn)) {
|
|
2977
|
-
fn(exports, utils_exports);
|
|
2978
|
-
used.push(fn);
|
|
2979
|
-
}
|
|
2980
|
-
return exports;
|
|
2981
|
-
}
|
|
2982
|
-
__name(use, "use");
|
|
2983
|
-
//#endregion
|
|
2984
|
-
export { Assertion, AssertionError, Should, assert, chai_exports, config, expect, should, use, utils_exports as util };
|
|
2985
|
-
|
|
2986
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANi4yLjIvbm9kZV9tb2R1bGVzL2NoYWkvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX25hbWUgPSAodGFyZ2V0LCB2YWx1ZSkgPT4gX19kZWZQcm9wKHRhcmdldCwgXCJuYW1lXCIsIHsgdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIiA/IGtleSArIFwiXCIgOiBrZXksIHZhbHVlKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaW5kZXguanNcbnZhciB1dGlsc19leHBvcnRzID0ge307XG5fX2V4cG9ydCh1dGlsc19leHBvcnRzLCB7XG4gIGFkZENoYWluYWJsZU1ldGhvZDogKCkgPT4gYWRkQ2hhaW5hYmxlTWV0aG9kLFxuICBhZGRMZW5ndGhHdWFyZDogKCkgPT4gYWRkTGVuZ3RoR3VhcmQsXG4gIGFkZE1ldGhvZDogKCkgPT4gYWRkTWV0aG9kLFxuICBhZGRQcm9wZXJ0eTogKCkgPT4gYWRkUHJvcGVydHksXG4gIGNoZWNrRXJyb3I6ICgpID0+IGNoZWNrX2Vycm9yX2V4cG9ydHMsXG4gIGNvbXBhcmVCeUluc3BlY3Q6ICgpID0+IGNvbXBhcmVCeUluc3BlY3QsXG4gIGVxbDogKCkgPT4gZGVlcF9lcWxfZGVmYXVsdCxcbiAgZXZlbnRzOiAoKSA9PiBldmVudHMsXG4gIGV4cGVjdFR5cGVzOiAoKSA9PiBleHBlY3RUeXBlcyxcbiAgZmxhZzogKCkgPT4gZmxhZyxcbiAgZ2V0QWN0dWFsOiAoKSA9PiBnZXRBY3R1YWwsXG4gIGdldE1lc3NhZ2U6ICgpID0+IGdldE1lc3NhZ2UyLFxuICBnZXROYW1lOiAoKSA9PiBnZXROYW1lLFxuICBnZXRPcGVyYXRvcjogKCkgPT4gZ2V0T3BlcmF0b3IsXG4gIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzOiAoKSA9PiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyxcbiAgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sczogKCkgPT4gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyxcbiAgZ2V0UGF0aEluZm86ICgpID0+IGdldFBhdGhJbmZvLFxuICBoYXNQcm9wZXJ0eTogKCkgPT4gaGFzUHJvcGVydHksXG4gIGluc3BlY3Q6ICgpID0+IGluc3BlY3QyLFxuICBpc05hTjogKCkgPT4gaXNOYU4yLFxuICBpc051bWVyaWM6ICgpID0+IGlzTnVtZXJpYyxcbiAgaXNQcm94eUVuYWJsZWQ6ICgpID0+IGlzUHJveHlFbmFibGVkLFxuICBpc1JlZ0V4cDogKCkgPT4gaXNSZWdFeHAyLFxuICBvYmpEaXNwbGF5OiAoKSA9PiBvYmpEaXNwbGF5LFxuICBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2Q6ICgpID0+IG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCxcbiAgb3ZlcndyaXRlTWV0aG9kOiAoKSA9PiBvdmVyd3JpdGVNZXRob2QsXG4gIG92ZXJ3cml0ZVByb3BlcnR5OiAoKSA9PiBvdmVyd3JpdGVQcm9wZXJ0eSxcbiAgcHJveGlmeTogKCkgPT4gcHJveGlmeSxcbiAgdGVzdDogKCkgPT4gdGVzdCxcbiAgdHJhbnNmZXJGbGFnczogKCkgPT4gdHJhbnNmZXJGbGFncyxcbiAgdHlwZTogKCkgPT4gdHlwZVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qc1xudmFyIGNoZWNrX2Vycm9yX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoZWNrX2Vycm9yX2V4cG9ydHMsIHtcbiAgY29tcGF0aWJsZUNvbnN0cnVjdG9yOiAoKSA9PiBjb21wYXRpYmxlQ29uc3RydWN0b3IsXG4gIGNvbXBhdGlibGVJbnN0YW5jZTogKCkgPT4gY29tcGF0aWJsZUluc3RhbmNlLFxuICBjb21wYXRpYmxlTWVzc2FnZTogKCkgPT4gY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogKCkgPT4gZ2V0Q29uc3RydWN0b3JOYW1lLFxuICBnZXRNZXNzYWdlOiAoKSA9PiBnZXRNZXNzYWdlXG59KTtcbmZ1bmN0aW9uIGlzRXJyb3JJbnN0YW5jZShvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRXJyb3JdXCI7XG59XG5fX25hbWUoaXNFcnJvckluc3RhbmNlLCBcImlzRXJyb3JJbnN0YW5jZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5fX25hbWUoaXNSZWdFeHAsIFwiaXNSZWdFeHBcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuX19uYW1lKGNvbXBhdGlibGVJbnN0YW5jZSwgXCJjb21wYXRpYmxlSW5zdGFuY2VcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpKSB7XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVycm9yTGlrZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZXJyb3JMaWtlID09PSBcImZ1bmN0aW9uXCIpICYmIGVycm9yTGlrZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gdGhyb3duLmNvbnN0cnVjdG9yID09PSBlcnJvckxpa2UgfHwgdGhyb3duIGluc3RhbmNlb2YgZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShjb21wYXRpYmxlQ29uc3RydWN0b3IsIFwiY29tcGF0aWJsZUNvbnN0cnVjdG9yXCIpO1xuZnVuY3Rpb24gY29tcGF0aWJsZU1lc3NhZ2UodGhyb3duLCBlcnJNYXRjaGVyKSB7XG4gIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0eXBlb2YgdGhyb3duID09PSBcInN0cmluZ1wiID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChpc1JlZ0V4cChlcnJNYXRjaGVyKSkge1xuICAgIHJldHVybiBlcnJNYXRjaGVyLnRlc3QoY29tcGFyaXNvblN0cmluZyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyck1hdGNoZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5fX25hbWUoY29tcGF0aWJsZU1lc3NhZ2UsIFwiY29tcGF0aWJsZU1lc3NhZ2VcIik7XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUoZXJyb3JMaWtlKSB7XG4gIGxldCBjb25zdHJ1Y3Rvck5hbWUgPSBlcnJvckxpa2U7XG4gIGlmIChpc0Vycm9ySW5zdGFuY2UoZXJyb3JMaWtlKSkge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvckxpa2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5uYW1lO1xuICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgPT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yTmFtZSA9IG5ldyBlcnJvckxpa2UoKS5uYW1lO1xuICAgICAgY29uc3RydWN0b3JOYW1lID0gbmV3Q29uc3RydWN0b3JOYW1lIHx8IGNvbnN0cnVjdG9yTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cbl9fbmFtZShnZXRDb25zdHJ1Y3Rvck5hbWUsIFwiZ2V0Q29uc3RydWN0b3JOYW1lXCIpO1xuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgbGV0IG1zZyA9IFwiXCI7XG4gIGlmIChlcnJvckxpa2UgJiYgZXJyb3JMaWtlLm1lc3NhZ2UpIHtcbiAgICBtc2cgPSBlcnJvckxpa2UubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSBcInN0cmluZ1wiKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZSwgXCJnZXRNZXNzYWdlXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9mbGFnLmpzXG5mdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICBsZXQgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZmxhZ3Nba2V5XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmbGFnc1trZXldO1xuICB9XG59XG5fX25hbWUoZmxhZywgXCJmbGFnXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy90ZXN0LmpzXG5mdW5jdGlvbiB0ZXN0KG9iaiwgYXJncykge1xuICBsZXQgbmVnYXRlID0gZmxhZyhvYmosIFwibmVnYXRlXCIpLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn1cbl9fbmFtZSh0ZXN0LCBcInRlc3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL3R5cGUtZGV0ZWN0LmpzXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgY29uc3Qgc3RyaW5nVGFnID0gb2JqW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuICBjb25zdCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcbiAgcmV0dXJuIHR5cGUzO1xufVxuX19uYW1lKHR5cGUsIFwidHlwZVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2Fzc2VydGlvbi1lcnJvci9pbmRleC5qc1xudmFyIGNhbkVsaWRlRnJhbWVzID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yO1xudmFyIF9Bc3NlcnRpb25FcnJvciA9IGNsYXNzIF9Bc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiVW5zcGVjaWZpZWQgQXNzZXJ0aW9uRXJyb3JcIiwgcHJvcHMsIHNzZikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJtZXNzYWdlXCIpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgaWYgKGNhbkVsaWRlRnJhbWVzKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzc2YgfHwgX0Fzc2VydGlvbkVycm9yKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gXCJBc3NlcnRpb25FcnJvclwiO1xuICB9XG4gIGdldCBvaygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdG9KU09OKHN0YWNrKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGFjazogc3RhY2sgIT09IGZhbHNlID8gdGhpcy5zdGFjayA6IHZvaWQgMFxuICAgIH07XG4gIH1cbn07XG5fX25hbWUoX0Fzc2VydGlvbkVycm9yLCBcIkFzc2VydGlvbkVycm9yXCIpO1xudmFyIEFzc2VydGlvbkVycm9yID0gX0Fzc2VydGlvbkVycm9yO1xuXG4vLyBsaWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qc1xuZnVuY3Rpb24gZXhwZWN0VHlwZXMob2JqLCB0eXBlcykge1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGxldCBzc2ZpID0gZmxhZyhvYmosIFwic3NmaVwiKTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgb2JqID0gZmxhZyhvYmosIFwib2JqZWN0XCIpO1xuICB0eXBlcyA9IHR5cGVzLm1hcChmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG4gIHR5cGVzLnNvcnQoKTtcbiAgbGV0IHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbih0LCBpbmRleCkge1xuICAgIGxldCBhcnQgPSB+W1wiYVwiLCBcImVcIiwgXCJpXCIsIFwib1wiLCBcInVcIl0uaW5kZXhPZih0LmNoYXJBdCgwKSkgPyBcImFuXCIgOiBcImFcIjtcbiAgICBsZXQgb3IgPSB0eXBlcy5sZW5ndGggPiAxICYmIGluZGV4ID09PSB0eXBlcy5sZW5ndGggLSAxID8gXCJvciBcIiA6IFwiXCI7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgXCIgXCIgKyB0O1xuICB9KS5qb2luKFwiLCBcIik7XG4gIGxldCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiBvYmpUeXBlID09PSBleHBlY3RlZDtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgXCJvYmplY3QgdGVzdGVkIG11c3QgYmUgXCIgKyBzdHIgKyBcIiwgYnV0IFwiICsgb2JqVHlwZSArIFwiIGdpdmVuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGV4cGVjdFR5cGVzLCBcImV4cGVjdFR5cGVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanNcbmZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn1cbl9fbmFtZShnZXRBY3R1YWwsIFwiZ2V0QWN0dWFsXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2hlbHBlcnMuanNcbnZhciBhbnNpQ29sb3JzID0ge1xuICBib2xkOiBbXCIxXCIsIFwiMjJcIl0sXG4gIGRpbTogW1wiMlwiLCBcIjIyXCJdLFxuICBpdGFsaWM6IFtcIjNcIiwgXCIyM1wiXSxcbiAgdW5kZXJsaW5lOiBbXCI0XCIsIFwiMjRcIl0sXG4gIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICBpbnZlcnNlOiBbXCI3XCIsIFwiMjdcIl0sXG4gIGhpZGRlbjogW1wiOFwiLCBcIjI4XCJdLFxuICBzdHJpa2U6IFtcIjlcIiwgXCIyOVwiXSxcbiAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gIC8vIDIxLTI5IGFyZSByZXNldHMgZm9yIDEtOVxuICBibGFjazogW1wiMzBcIiwgXCIzOVwiXSxcbiAgcmVkOiBbXCIzMVwiLCBcIjM5XCJdLFxuICBncmVlbjogW1wiMzJcIiwgXCIzOVwiXSxcbiAgeWVsbG93OiBbXCIzM1wiLCBcIjM5XCJdLFxuICBibHVlOiBbXCIzNFwiLCBcIjM5XCJdLFxuICBtYWdlbnRhOiBbXCIzNVwiLCBcIjM5XCJdLFxuICBjeWFuOiBbXCIzNlwiLCBcIjM5XCJdLFxuICB3aGl0ZTogW1wiMzdcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0YmxhY2s6IFtcIjMwOzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0cmVkOiBbXCIzMTsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodGdyZWVuOiBbXCIzMjsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodHllbGxvdzogW1wiMzM7MVwiLCBcIjM5XCJdLFxuICBicmlnaHRibHVlOiBbXCIzNDsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodG1hZ2VudGE6IFtcIjM1OzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0Y3lhbjogW1wiMzY7MVwiLCBcIjM5XCJdLFxuICBicmlnaHR3aGl0ZTogW1wiMzc7MVwiLCBcIjM5XCJdLFxuICBncmV5OiBbXCI5MFwiLCBcIjM5XCJdXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgc3BlY2lhbDogXCJjeWFuXCIsXG4gIG51bWJlcjogXCJ5ZWxsb3dcIixcbiAgYmlnaW50OiBcInllbGxvd1wiLFxuICBib29sZWFuOiBcInllbGxvd1wiLFxuICB1bmRlZmluZWQ6IFwiZ3JleVwiLFxuICBudWxsOiBcImJvbGRcIixcbiAgc3RyaW5nOiBcImdyZWVuXCIsXG4gIHN5bWJvbDogXCJncmVlblwiLFxuICBkYXRlOiBcIm1hZ2VudGFcIixcbiAgcmVnZXhwOiBcInJlZFwiXG59O1xudmFyIHRydW5jYXRvciA9IFwiXFx1MjAyNlwiO1xuZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCBcIlwiO1xuICBpZiAoIWNvbG9yKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGBcXHgxQlske2NvbG9yWzBdfW0ke1N0cmluZyh2YWx1ZSl9XFx4MUJbJHtjb2xvclsxXX1tYDtcbn1cbl9fbmFtZShjb2xvcmlzZSwgXCJjb2xvcmlzZVwiKTtcbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoe1xuICBzaG93SGlkZGVuID0gZmFsc2UsXG4gIGRlcHRoID0gMixcbiAgY29sb3JzID0gZmFsc2UsXG4gIGN1c3RvbUluc3BlY3QgPSB0cnVlLFxuICBzaG93UHJveHkgPSBmYWxzZSxcbiAgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSxcbiAgYnJlYWtMZW5ndGggPSBJbmZpbml0eSxcbiAgc2VlbiA9IFtdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRydW5jYXRlOiB0cnVuY2F0ZTIgPSBJbmZpbml0eSxcbiAgc3R5bGl6ZSA9IFN0cmluZ1xufSA9IHt9LCBpbnNwZWN0Mykge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgY29sb3JzOiBCb29sZWFuKGNvbG9ycyksXG4gICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICBtYXhBcnJheUxlbmd0aDogTnVtYmVyKG1heEFycmF5TGVuZ3RoKSxcbiAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlMiksXG4gICAgc2VlbixcbiAgICBpbnNwZWN0OiBpbnNwZWN0MyxcbiAgICBzdHlsaXplXG4gIH07XG4gIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgIG9wdGlvbnMuc3R5bGl6ZSA9IGNvbG9yaXNlO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuX19uYW1lKG5vcm1hbGlzZU9wdGlvbnMsIFwibm9ybWFsaXNlT3B0aW9uc1wiKTtcbmZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyKSB7XG4gIHJldHVybiBjaGFyID49IFwiXFx1RDgwMFwiICYmIGNoYXIgPD0gXCJcXHVEQkZGXCI7XG59XG5fX25hbWUoaXNIaWdoU3Vycm9nYXRlLCBcImlzSGlnaFN1cnJvZ2F0ZVwiKTtcbmZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCB0YWlsID0gdHJ1bmNhdG9yKSB7XG4gIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICBjb25zdCB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICBpZiAoZW5kID4gMCAmJiBpc0hpZ2hTdXJyb2dhdGUoc3RyaW5nW2VuZCAtIDFdKSkge1xuICAgICAgZW5kID0gZW5kIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5fX25hbWUodHJ1bmNhdGUsIFwidHJ1bmNhdGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0TGlzdChsaXN0LCBvcHRpb25zLCBpbnNwZWN0SXRlbSwgc2VwYXJhdG9yID0gXCIsIFwiKSB7XG4gIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICBjb25zdCBzaXplID0gbGlzdC5sZW5ndGg7XG4gIGlmIChzaXplID09PSAwKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGU7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBsZXQgcGVlayA9IFwiXCI7XG4gIGxldCB0cnVuY2F0ZWQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgIGNvbnN0IGxhc3QgPSBpICsgMSA9PT0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3Qgc2Vjb25kVG9MYXN0ID0gaSArIDIgPT09IGxpc3QubGVuZ3RoO1xuICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgY29uc3QgdmFsdWUgPSBsaXN0W2ldO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpbmcgPSBwZWVrIHx8IGluc3BlY3RJdGVtKHZhbHVlLCBvcHRpb25zKSArIChsYXN0ID8gXCJcIiA6IHNlcGFyYXRvcik7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoO1xuICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGVlayA9IGxhc3QgPyBcIlwiIDogaW5zcGVjdEl0ZW0obGlzdFtpICsgMV0sIG9wdGlvbnMpICsgKHNlY29uZFRvTGFzdCA/IFwiXCIgOiBzZXBhcmF0b3IpO1xuICAgIGlmICghbGFzdCAmJiBzZWNvbmRUb0xhc3QgJiYgdHJ1bmNhdGVkTGVuZ3RoID4gb3JpZ2luYWxMZW5ndGggJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID4gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgdHJ1bmNhdGVkID0gYCR7dHJ1bmNhdG9yfSgke2xpc3QubGVuZ3RoIC0gaSAtIDF9KWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdHJ1bmNhdGVkID0gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5fX25hbWUoaW5zcGVjdExpc3QsIFwiaW5zcGVjdExpc3RcIik7XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG59XG5fX25hbWUocXVvdGVDb21wbGV4S2V5LCBcInF1b3RlQ29tcGxleEtleVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShba2V5LCB2YWx1ZV0sIG9wdGlvbnMpIHtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSAyO1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIpIHtcbiAgICBrZXkgPSBgWyR7b3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyl9XWA7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIHJldHVybiBgJHtrZXl9OiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdFByb3BlcnR5LCBcImluc3BlY3RQcm9wZXJ0eVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9hcnJheS5qc1xuZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gXCJbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gIGNvbnN0IGxpc3RDb250ZW50cyA9IGluc3BlY3RMaXN0KGFycmF5LCBvcHRpb25zKTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBsaXN0Q29udGVudHMubGVuZ3RoO1xuICBsZXQgcHJvcGVydHlDb250ZW50cyA9IFwiXCI7XG4gIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KG5vbkluZGV4UHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICB9XG4gIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6IFwiXCJ9IF1gO1xufVxuX19uYW1lKGluc3BlY3RBcnJheSwgXCJpbnNwZWN0QXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvdHlwZWRhcnJheS5qc1xudmFyIGdldEFycmF5TmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGFycmF5KSA9PiB7XG4gIGlmICh0eXBlb2YgQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gXCJCdWZmZXJcIjtcbiAgfVxuICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgIHJldHVybiBhcnJheVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBhcnJheS5jb25zdHJ1Y3Rvci5uYW1lO1xufSwgXCJnZXRBcnJheU5hbWVcIik7XG5mdW5jdGlvbiBpbnNwZWN0VHlwZWRBcnJheShhcnJheSwgb3B0aW9ucykge1xuICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCArIDQ7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyaW5nID0gYCR7b3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKGFycmF5W2ldLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIil9JHtpID09PSBhcnJheS5sZW5ndGggLSAxID8gXCJcIiA6IFwiLCBcIn1gO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG91dHB1dCArPSBzdHJpbmc7XG4gIH1cbiAgbGV0IHByb3BlcnR5Q29udGVudHMgPSBcIlwiO1xuICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKChrZXkpID0+IFtrZXksIGFycmF5W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgfVxuICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogXCJcIn0gXWA7XG59XG5fX25hbWUoaW5zcGVjdFR5cGVkQXJyYXksIFwiaW5zcGVjdFR5cGVkQXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvZGF0ZS5qc1xuZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICBjb25zdCBzdHJpbmdSZXByZXNlbnRhdGlvbiA9IGRhdGVPYmplY3QudG9KU09OKCk7XG4gIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIkludmFsaWQgRGF0ZVwiO1xuICB9XG4gIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoXCJUXCIpO1xuICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgXCJkYXRlXCIpO1xufVxuX19uYW1lKGluc3BlY3REYXRlLCBcImluc3BlY3REYXRlXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Z1bmN0aW9uLmpzXG5mdW5jdGlvbiBpbnNwZWN0RnVuY3Rpb24oZnVuYywgb3B0aW9ucykge1xuICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgXCJGdW5jdGlvblwiO1xuICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsIFwic3BlY2lhbFwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9ICR7dHJ1bmNhdGUobmFtZSwgb3B0aW9ucy50cnVuY2F0ZSAtIDExKX1dYCwgXCJzcGVjaWFsXCIpO1xufVxuX19uYW1lKGluc3BlY3RGdW5jdGlvbiwgXCJpbnNwZWN0RnVuY3Rpb25cIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbWFwLmpzXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAga2V5ID0gb3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyk7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICByZXR1cm4gYCR7a2V5fSA9PiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdE1hcEVudHJ5LCBcImluc3BlY3RNYXBFbnRyeVwiKTtcbmZ1bmN0aW9uIG1hcFRvRW50cmllcyhtYXApIHtcbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG5fX25hbWUobWFwVG9FbnRyaWVzLCBcIm1hcFRvRW50cmllc1wiKTtcbmZ1bmN0aW9uIGluc3BlY3RNYXAobWFwLCBvcHRpb25zKSB7XG4gIGlmIChtYXAuc2l6ZSA9PT0gMClcbiAgICByZXR1cm4gXCJNYXB7fVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gIHJldHVybiBgTWFweyAke2luc3BlY3RMaXN0KG1hcFRvRW50cmllcyhtYXApLCBvcHRpb25zLCBpbnNwZWN0TWFwRW50cnkpfSB9YDtcbn1cbl9fbmFtZShpbnNwZWN0TWFwLCBcImluc3BlY3RNYXBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbnVtYmVyLmpzXG52YXIgaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgKChpKSA9PiBpICE9PSBpKTtcbmZ1bmN0aW9uIGluc3BlY3ROdW1iZXIobnVtYmVyLCBvcHRpb25zKSB7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShcIk5hTlwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCJJbmZpbml0eVwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiLUluZmluaXR5XCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gXCIrMFwiIDogXCItMFwiLCBcIm51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKFN0cmluZyhudW1iZXIpLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIik7XG59XG5fX25hbWUoaW5zcGVjdE51bWJlciwgXCJpbnNwZWN0TnVtYmVyXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2JpZ2ludC5qc1xuZnVuY3Rpb24gaW5zcGVjdEJpZ0ludChudW1iZXIsIG9wdGlvbnMpIHtcbiAgbGV0IG51bXMgPSB0cnVuY2F0ZShudW1iZXIudG9TdHJpbmcoKSwgb3B0aW9ucy50cnVuY2F0ZSAtIDEpO1xuICBpZiAobnVtcyAhPT0gdHJ1bmNhdG9yKVxuICAgIG51bXMgKz0gXCJuXCI7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUobnVtcywgXCJiaWdpbnRcIik7XG59XG5fX25hbWUoaW5zcGVjdEJpZ0ludCwgXCJpbnNwZWN0QmlnSW50XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3JlZ2V4cC5qc1xuZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoXCIvXCIpWzJdO1xuICBjb25zdCBzb3VyY2VMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlIC0gKDIgKyBmbGFncy5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZS5zb3VyY2U7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYC8ke3RydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKX0vJHtmbGFnc31gLCBcInJlZ2V4cFwiKTtcbn1cbl9fbmFtZShpbnNwZWN0UmVnRXhwLCBcImluc3BlY3RSZWdFeHBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvc2V0LmpzXG5mdW5jdGlvbiBhcnJheUZyb21TZXQoc2V0Mikge1xuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgc2V0Mi5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiB2YWx1ZXM7XG59XG5fX25hbWUoYXJyYXlGcm9tU2V0LCBcImFycmF5RnJvbVNldFwiKTtcbmZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0Miwgb3B0aW9ucykge1xuICBpZiAoc2V0Mi5zaXplID09PSAwKVxuICAgIHJldHVybiBcIlNldHt9XCI7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgcmV0dXJuIGBTZXR7ICR7aW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldDIpLCBvcHRpb25zKX0gfWA7XG59XG5fX25hbWUoaW5zcGVjdFNldCwgXCJpbnNwZWN0U2V0XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3N0cmluZy5qc1xudmFyIHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl1cIiwgXCJnXCIpO1xudmFyIGVzY2FwZUNoYXJhY3RlcnMgPSB7XG4gIFwiXFxiXCI6IFwiXFxcXGJcIixcbiAgXCJcdFwiOiBcIlxcXFx0XCIsXG4gIFwiXFxuXCI6IFwiXFxcXG5cIixcbiAgXCJcXGZcIjogXCJcXFxcZlwiLFxuICBcIlxcclwiOiBcIlxcXFxyXCIsXG4gIFwiJ1wiOiBcIlxcXFwnXCIsXG4gIFwiXFxcXFwiOiBcIlxcXFxcXFxcXCJcbn07XG52YXIgaGV4ID0gMTY7XG52YXIgdW5pY29kZUxlbmd0aCA9IDQ7XG5mdW5jdGlvbiBlc2NhcGUoY2hhcikge1xuICByZXR1cm4gZXNjYXBlQ2hhcmFjdGVyc1tjaGFyXSB8fCBgXFxcXHUke2AwMDAwJHtjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoaGV4KX1gLnNsaWNlKC11bmljb2RlTGVuZ3RoKX1gO1xufVxuX19uYW1lKGVzY2FwZSwgXCJlc2NhcGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICBpZiAoc3RyaW5nRXNjYXBlQ2hhcnMudGVzdChzdHJpbmcpKSB7XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nRXNjYXBlQ2hhcnMsIGVzY2FwZSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgJyR7dHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zLnRydW5jYXRlIC0gMil9J2AsIFwic3RyaW5nXCIpO1xufVxuX19uYW1lKGluc3BlY3RTdHJpbmcsIFwiaW5zcGVjdFN0cmluZ1wiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9zeW1ib2wuanNcbmZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgaWYgKFwiZGVzY3JpcHRpb25cIiBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8gYFN5bWJvbCgke3ZhbHVlLmRlc2NyaXB0aW9ufSlgIDogXCJTeW1ib2woKVwiO1xuICB9XG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuX19uYW1lKGluc3BlY3RTeW1ib2wsIFwiaW5zcGVjdFN5bWJvbFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9wcm9taXNlLmpzXG52YXIgZ2V0UHJvbWlzZVZhbHVlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlByb21pc2V7XFx1MjAyNn1cIiwgXCJnZXRQcm9taXNlVmFsdWVcIik7XG52YXIgcHJvbWlzZV9kZWZhdWx0ID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL29iamVjdC5qc1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChvYmplY3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpIDogW107XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCAmJiBzeW1ib2xzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcInt9XCI7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMob2JqZWN0KSkge1xuICAgIHJldHVybiBcIltDaXJjdWxhcl1cIjtcbiAgfVxuICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgb2JqZWN0W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgY29uc3Qgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcCgoa2V5KSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICBvcHRpb25zLnNlZW4ucG9wKCk7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgIHNlcCA9IFwiLCBcIjtcbiAgfVxuICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuX19uYW1lKGluc3BlY3RPYmplY3QsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9jbGFzcy5qc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbmZ1bmN0aW9uIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucykge1xuICBsZXQgbmFtZSA9IFwiXCI7XG4gIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIG5hbWUgPSB2YWx1ZVt0b1N0cmluZ1RhZ107XG4gIH1cbiAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKCFuYW1lIHx8IG5hbWUgPT09IFwiX2NsYXNzXCIpIHtcbiAgICBuYW1lID0gXCI8QW5vbnltb3VzIENsYXNzPlwiO1xuICB9XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGg7XG4gIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyl9YDtcbn1cbl9fbmFtZShpbnNwZWN0Q2xhc3MsIFwiaW5zcGVjdENsYXNzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2FyZ3VtZW50cy5qc1xuZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gXCJBcmd1bWVudHNbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICByZXR1cm4gYEFyZ3VtZW50c1sgJHtpbnNwZWN0TGlzdChhcmdzLCBvcHRpb25zKX0gXWA7XG59XG5fX25hbWUoaW5zcGVjdEFyZ3VtZW50cywgXCJpbnNwZWN0QXJndW1lbnRzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Vycm9yLmpzXG52YXIgZXJyb3JLZXlzID0gW1xuICBcInN0YWNrXCIsXG4gIFwibGluZVwiLFxuICBcImNvbHVtblwiLFxuICBcIm5hbWVcIixcbiAgXCJtZXNzYWdlXCIsXG4gIFwiZmlsZU5hbWVcIixcbiAgXCJsaW5lTnVtYmVyXCIsXG4gIFwiY29sdW1uTnVtYmVyXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJjYXVzZVwiXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdDIoZXJyb3IsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoKGtleSkgPT4gZXJyb3JLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xuICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvcGVydGllcy51bnNoaWZ0KFwibWVzc2FnZVwiKTtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIjtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBtZXNzYWdlLmxlbmd0aCArIDU7XG4gIG9wdGlvbnMuc2VlbiA9IG9wdGlvbnMuc2VlbiB8fCBbXTtcbiAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG4gIH1cbiAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICByZXR1cm4gYCR7bmFtZX0ke21lc3NhZ2V9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCB7ICR7cHJvcGVydHlDb250ZW50c30gfWAgOiBcIlwifWA7XG59XG5fX25hbWUoaW5zcGVjdE9iamVjdDIsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9odG1sLmpzXG5mdW5jdGlvbiBpbnNwZWN0QXR0cmlidXRlKFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICBvcHRpb25zLnRydW5jYXRlIC09IDM7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7b3B0aW9ucy5zdHlsaXplKFN0cmluZyhrZXkpLCBcInllbGxvd1wiKX1gO1xuICB9XG4gIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksIFwieWVsbG93XCIpfT0ke29wdGlvbnMuc3R5bGl6ZShgXCIke3ZhbHVlfVwiYCwgXCJzdHJpbmdcIil9YDtcbn1cbl9fbmFtZShpbnNwZWN0QXR0cmlidXRlLCBcImluc3BlY3RBdHRyaWJ1dGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdE5vZGUsIFwiXFxuXCIpO1xufVxuX19uYW1lKGluc3BlY3ROb2RlQ29sbGVjdGlvbiwgXCJpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZShub2RlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBpbnNwZWN0SFRNTChub2RlLCBvcHRpb25zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUuZGF0YSwgb3B0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25zLmluc3BlY3Qobm9kZSwgb3B0aW9ucyk7XG4gIH1cbn1cbl9fbmFtZShpbnNwZWN0Tm9kZSwgXCJpbnNwZWN0Tm9kZVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RIVE1MKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoZWFkID0gb3B0aW9ucy5zdHlsaXplKGA8JHtuYW1lfWAsIFwic3BlY2lhbFwiKTtcbiAgY29uc3QgaGVhZENsb3NlID0gb3B0aW9ucy5zdHlsaXplKGA+YCwgXCJzcGVjaWFsXCIpO1xuICBjb25zdCB0YWlsID0gb3B0aW9ucy5zdHlsaXplKGA8LyR7bmFtZX0+YCwgXCJzcGVjaWFsXCIpO1xuICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICogMiArIDU7XG4gIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gXCJcIjtcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgKz0gXCIgXCI7XG4gICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcCgoa2V5KSA9PiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXSksIG9wdGlvbnMsIGluc3BlY3RBdHRyaWJ1dGUsIFwiIFwiKTtcbiAgfVxuICBvcHRpb25zLnRydW5jYXRlIC09IHByb3BlcnR5Q29udGVudHMubGVuZ3RoO1xuICBjb25zdCB0cnVuY2F0ZTIgPSBvcHRpb25zLnRydW5jYXRlO1xuICBsZXQgY2hpbGRyZW4gPSBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG4gIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiB0cnVuY2F0ZTIpIHtcbiAgICBjaGlsZHJlbiA9IGAke3RydW5jYXRvcn0oJHtlbGVtZW50LmNoaWxkcmVuLmxlbmd0aH0pYDtcbiAgfVxuICByZXR1cm4gYCR7aGVhZH0ke3Byb3BlcnR5Q29udGVudHN9JHtoZWFkQ2xvc2V9JHtjaGlsZHJlbn0ke3RhaWx9YDtcbn1cbl9fbmFtZShpbnNwZWN0SFRNTCwgXCJpbnNwZWN0SFRNTFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9pbmRleC5qc1xudmFyIHN5bWJvbHNTdXBwb3J0ZWQgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09IFwiZnVuY3Rpb25cIjtcbnZhciBjaGFpSW5zcGVjdCA9IHN5bWJvbHNTdXBwb3J0ZWQgPyAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcImNoYWkvaW5zcGVjdFwiKSA6IFwiQEBjaGFpL2luc3BlY3RcIjtcbnZhciBub2RlSW5zcGVjdCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIik7XG52YXIgY29uc3RydWN0b3JNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBzdHJpbmdUYWdNYXAgPSB7fTtcbnZhciBiYXNlVHlwZXNNYXAgPSB7XG4gIHVuZGVmaW5lZDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcInVuZGVmaW5lZFwiLCBcInVuZGVmaW5lZFwiKSwgXCJ1bmRlZmluZWRcIiksXG4gIG51bGw6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoXCJudWxsXCIsIFwibnVsbFwiKSwgXCJudWxsXCIpLFxuICBib29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJib29sZWFuXCIpLFxuICBCb29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJCb29sZWFuXCIpLFxuICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gIE51bWJlcjogaW5zcGVjdE51bWJlcixcbiAgYmlnaW50OiBpbnNwZWN0QmlnSW50LFxuICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gIHN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgU3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBGdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBzeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgU3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICBBcnJheTogaW5zcGVjdEFycmF5LFxuICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgTWFwOiBpbnNwZWN0TWFwLFxuICBTZXQ6IGluc3BlY3RTZXQsXG4gIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgUHJvbWlzZTogcHJvbWlzZV9kZWZhdWx0LFxuICAvLyBXZWFrU2V0LCBXZWFrTWFwIGFyZSB0b3RhbGx5IG9wYXF1ZSB0byB1c1xuICBXZWFrU2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFwiV2Vha1NldHtcXHUyMDI2fVwiLCBcInNwZWNpYWxcIiksIFwiV2Vha1NldFwiKSxcbiAgV2Vha01hcDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcIldlYWtNYXB7XFx1MjAyNn1cIiwgXCJzcGVjaWFsXCIpLCBcIldlYWtNYXBcIiksXG4gIEFyZ3VtZW50czogaW5zcGVjdEFyZ3VtZW50cyxcbiAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQ2NEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgR2VuZXJhdG9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IFwiXCIsIFwiR2VuZXJhdG9yXCIpLFxuICBEYXRhVmlldzogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkRhdGFWaWV3XCIpLFxuICBBcnJheUJ1ZmZlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkFycmF5QnVmZmVyXCIpLFxuICBFcnJvcjogaW5zcGVjdE9iamVjdDIsXG4gIEhUTUxDb2xsZWN0aW9uOiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG4gIE5vZGVMaXN0OiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cbn07XG52YXIgaW5zcGVjdEN1c3RvbSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdEZuKSA9PiB7XG4gIGlmIChjaGFpSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbY2hhaUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbY2hhaUluc3BlY3RdKG9wdGlvbnMpO1xuICB9XG4gIGlmIChub2RlSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbbm9kZUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbbm9kZUluc3BlY3RdKG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMsIGluc3BlY3RGbik7XG4gIH1cbiAgaWYgKFwiaW5zcGVjdFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgfVxuICBpZiAoXCJjb25zdHJ1Y3RvclwiIGluIHZhbHVlICYmIGNvbnN0cnVjdG9yTWFwLmhhcyh2YWx1ZS5jb25zdHJ1Y3RvcikpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlM10pIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59LCBcImluc3BlY3RDdXN0b21cIik7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpc2VPcHRpb25zKG9wdHMsIGluc3BlY3QpO1xuICBjb25zdCB7IGN1c3RvbUluc3BlY3QgfSA9IG9wdGlvbnM7XG4gIGxldCB0eXBlMyA9IHZhbHVlID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlMyA9PT0gXCJvYmplY3RcIikge1xuICAgIHR5cGUzID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xuICB9XG4gIGlmICh0eXBlMyBpbiBiYXNlVHlwZXNNYXApIHtcbiAgICByZXR1cm4gYmFzZVR5cGVzTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGN1c3RvbUluc3BlY3QgJiYgdmFsdWUpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICByZXR1cm4gaW5zcGVjdChvdXRwdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjb25zdCBwcm90byA9IHZhbHVlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA6IGZhbHNlO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gaW5zcGVjdEhUTUwodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChcImNvbnN0cnVjdG9yXCIgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBpbnNwZWN0T2JqZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuICBpZiAodmFsdWUgPT09IE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCB0eXBlMyk7XG59XG5fX25hbWUoaW5zcGVjdCwgXCJpbnNwZWN0XCIpO1xuXG4vLyBsaWIvY2hhaS9jb25maWcuanNcbnZhciBjb25maWcgPSB7XG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmluY2x1ZGVTdGFja1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIHN0YWNrIHRyYWNlXG4gICAqIGlzIGluY2x1ZGVkIGluIEFzc2VydGlvbiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IG9mIGZhbHNlXG4gICAqIHN1cHByZXNzZXMgc3RhY2sgdHJhY2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgPSB0cnVlOyAgLy8gZW5hYmxlIHN0YWNrIG9uIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgaW5jbHVkZVN0YWNrOiBmYWxzZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcuc2hvd0RpZmZcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBvciBub3RcbiAgICogdGhlIGBzaG93RGlmZmAgZmxhZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93blxuICAgKiBBc3NlcnRpb25FcnJvcnMuIGBmYWxzZWAgd2lsbCBhbHdheXMgYmUgYGZhbHNlYDsgYHRydWVgXG4gICAqIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gaGFzIHJlcXVlc3RlZCBhIGRpZmZcbiAgICogYmUgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvd0RpZmY6IHRydWUsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnRydW5jYXRlVGhyZXNob2xkXG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBzZXRzIGxlbmd0aCB0aHJlc2hvbGQgZm9yIGFjdHVhbCBhbmRcbiAgICogZXhwZWN0ZWQgdmFsdWVzIGluIGFzc2VydGlvbiBlcnJvcnMuIElmIHRoaXMgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLCBmb3JcbiAgICogZXhhbXBsZSBmb3IgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzLCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmdcbiAgICogbGlrZSBgWyBBcnJheSgzKSBdYCBvciBgeyBPYmplY3QgKHByb3AxLCBwcm9wMikgfWAuXG4gICAqXG4gICAqIFNldCBpdCB0byB6ZXJvIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdHJ1bmNhdGluZyBhbHRvZ2V0aGVyLlxuICAgKlxuICAgKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlcmZ1bCB3aGVuIGRvaW5nIGFzc2VydGlvbnMgb24gYXJyYXlzOiBoYXZpbmcgdGhpc1xuICAgKiBzZXQgdG8gYSByZWFzb25hYmxlIGxhcmdlIHZhbHVlIG1ha2VzIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIHJlYWRpbHlcbiAgICogaW5zcGVjdGFibGUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA9IDA7ICAvLyBkaXNhYmxlIHRydW5jYXRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHRydW5jYXRlVGhyZXNob2xkOiA0MCxcbiAgLyoqXG4gICAqICMjIyBjb25maWcudXNlUHJveHlcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgaWYgY2hhaSB3aWxsIHVzZSBhIFByb3h5IHRvIHRocm93XG4gICAqIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgaXMgcmVhZCwgd2hpY2ggcHJvdGVjdHMgdXNlcnNcbiAgICogZnJvbSB0eXBvcyB3aGVuIHVzaW5nIHByb3BlcnR5LWJhc2VkIGFzc2VydGlvbnMuXG4gICAqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnVzZVByb3h5ID0gZmFsc2U7ICAvLyBkaXNhYmxlIHVzZSBvZiBQcm94eVxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlnIHZhbHVlXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgcHJveGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufVxuICAgKiBAcHVibGljXG4gICAqL1xuICB1c2VQcm94eTogdHJ1ZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcucHJveHlFeGNsdWRlZEtleXNcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24uXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBlbnZpcm9ubWVudCBDaGFpIGlzIHJ1bm5pbmcgaW4gc3VwcG9ydHMgcHJveGllcyBhbmRcbiAgICogaWYgdGhlIGB1c2VQcm94eWAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGVuYWJsZWQuXG4gICAqIEJ5IGRlZmF1bHQsIGB0aGVuYCBhbmQgYGluc3BlY3RgIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZVxuICAgKiBhc3NlcnRpb24gb2JqZWN0IGJlY2F1c2UgdGhlIGAuaW5zcGVjdGAgcHJvcGVydHkgaXMgcmVhZCBieSBgdXRpbC5pbnNwZWN0YCAoZm9yIGV4YW1wbGUsIHdoZW5cbiAgICogdXNpbmcgYGNvbnNvbGUubG9nYCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdCkgYW5kIGAudGhlbmAgaXMgbmVjZXNzYXJ5IGZvciBwcm9taXNlIHR5cGUtY2hlY2tpbmcuXG4gICAqXG4gICAqICAgICAvLyBCeSBkZWZhdWx0IHRoZXNlIGtleXMgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbiBvYmplY3RcbiAgICogICAgIGNoYWkuY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzID0gWyd0aGVuJywgJ2luc3BlY3QnXTtcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHJveHlFeGNsdWRlZEtleXM6IFtcInRoZW5cIiwgXCJjYXRjaFwiLCBcImluc3BlY3RcIiwgXCJ0b0pTT05cIl0sXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmRlZXBFcXVhbFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgZGVmaW5lcyB3aGljaCBhIGN1c3RvbSBmdW5jdGlvbiB0byB1c2UgZm9yIGRlZXBFcXVhbFxuICAgKiBjb21wYXJpc29ucy5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHVzZWQgaXMgdGhlIG9uZSBmcm9tIHRoZSBgZGVlcC1lcWxgIHBhY2thZ2Ugd2l0aG91dCBjdXN0b20gY29tcGFyYXRvci5cbiAgICpcbiAgICogICAgIC8vIHVzZSBhIGN1c3RvbSBjb21wYXJhdG9yXG4gICAqICAgICBjaGFpLmNvbmZpZy5kZWVwRXF1YWwgPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiBjaGFpLnV0aWwuZXFsKGV4cGVjdGVkLCBhY3R1YWwsIHtcbiAgICogICAgICAgICAgICAgY29tcGFyYXRvcjogKGV4cGVjdGVkLCBhY3R1YWwpID0+IHtcbiAgICogICAgICAgICAgICAgICAgIC8vIGZvciBub24gbnVtYmVyIGNvbXBhcmlzb24sIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgKiAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGV4cGVjdGVkICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gICAqICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhIGRpZmZlcmVuY2Ugb2YgMTAgYmV0d2VlbiBjb21wYXJlZCBudW1iZXJzXG4gICAqICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgMTBcbiAgICogICAgICAgICAgICAgfVxuICAgKiAgICAgICAgIH0pXG4gICAqICAgICB9O1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWVwRXF1YWw6IG51bGxcbn07XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luc3BlY3QuanNcbmZ1bmN0aW9uIGluc3BlY3QyKG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycykge1xuICBsZXQgb3B0aW9ucyA9IHtcbiAgICBjb2xvcnMsXG4gICAgZGVwdGg6IHR5cGVvZiBkZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IDIgOiBkZXB0aCxcbiAgICBzaG93SGlkZGVuLFxuICAgIHRydW5jYXRlOiBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPyBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgOiBJbmZpbml0eVxuICB9O1xuICByZXR1cm4gaW5zcGVjdChvYmosIG9wdGlvbnMpO1xufVxuX19uYW1lKGluc3BlY3QyLCBcImluc3BlY3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL29iakRpc3BsYXkuanNcbmZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIGxldCBzdHIgPSBpbnNwZWN0MihvYmopLCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUzID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09IFwiXCIgPyBcIltGdW5jdGlvbl1cIiA6IFwiW0Z1bmN0aW9uOiBcIiArIG9iai5uYW1lICsgXCJdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICByZXR1cm4gXCJbIEFycmF5KFwiICsgb2JqLmxlbmd0aCArIFwiKSBdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLCBrc3RyID0ga2V5cy5sZW5ndGggPiAyID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbihcIiwgXCIpICsgXCIsIC4uLlwiIDoga2V5cy5qb2luKFwiLCBcIik7XG4gICAgICByZXR1cm4gXCJ7IE9iamVjdCAoXCIgKyBrc3RyICsgXCIpIH1cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuX19uYW1lKG9iakRpc3BsYXksIFwib2JqRGlzcGxheVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0TWVzc2FnZS5qc1xuZnVuY3Rpb24gZ2V0TWVzc2FnZTIob2JqLCBhcmdzKSB7XG4gIGxldCBuZWdhdGUgPSBmbGFnKG9iaiwgXCJuZWdhdGVcIik7XG4gIGxldCB2YWwgPSBmbGFnKG9iaiwgXCJvYmplY3RcIik7XG4gIGxldCBleHBlY3RlZCA9IGFyZ3NbM107XG4gIGxldCBhY3R1YWwgPSBnZXRBY3R1YWwob2JqLCBhcmdzKTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGlmICh0eXBlb2YgbXNnID09PSBcImZ1bmN0aW9uXCIpIG1zZyA9IG1zZygpO1xuICBtc2cgPSBtc2cgfHwgXCJcIjtcbiAgbXNnID0gbXNnLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvYmpEaXNwbGF5KHZhbCk7XG4gIH0pLnJlcGxhY2UoLyNcXHthY3RcXH0vZywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9iakRpc3BsYXkoYWN0dWFsKTtcbiAgfSkucmVwbGFjZSgvI1xce2V4cFxcfS9nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7XG4gIH0pO1xuICByZXR1cm4gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgKyBtc2cgOiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZTIsIFwiZ2V0TWVzc2FnZVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvdHJhbnNmZXJGbGFncy5qc1xuZnVuY3Rpb24gdHJhbnNmZXJGbGFncyhhc3NlcnRpb24sIG9iamVjdCwgaW5jbHVkZUFsbCkge1xuICBsZXQgZmxhZ3MgPSBhc3NlcnRpb24uX19mbGFncyB8fCAoYXNzZXJ0aW9uLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmICghb2JqZWN0Ll9fZmxhZ3MpIHtcbiAgICBvYmplY3QuX19mbGFncyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG4gIGZvciAobGV0IGZsYWczIGluIGZsYWdzKSB7XG4gICAgaWYgKGluY2x1ZGVBbGwgfHwgZmxhZzMgIT09IFwib2JqZWN0XCIgJiYgZmxhZzMgIT09IFwic3NmaVwiICYmIGZsYWczICE9PSBcImxvY2tTc2ZpXCIgJiYgZmxhZzMgIT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWczXSA9IGZsYWdzW2ZsYWczXTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZSh0cmFuc2ZlckZsYWdzLCBcInRyYW5zZmVyRmxhZ3NcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9kZWVwLWVxbC9pbmRleC5qc1xuZnVuY3Rpb24gdHlwZTIob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBjb25zdCBzdHJpbmdUYWcgPSBvYmpbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgaWYgKHR5cGVvZiBzdHJpbmdUYWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG4gIGNvbnN0IHNsaWNlU3RhcnQgPSA4O1xuICBjb25zdCBzbGljZUVuZCA9IC0xO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2Uoc2xpY2VTdGFydCwgc2xpY2VFbmQpO1xufVxuX19uYW1lKHR5cGUyLCBcInR5cGVcIik7XG5mdW5jdGlvbiBGYWtlTWFwKCkge1xuICB0aGlzLl9rZXkgPSBcImNoYWkvZGVlcC1lcWxfX1wiICsgTWF0aC5yYW5kb20oKSArIERhdGUubm93KCk7XG59XG5fX25hbWUoRmFrZU1hcCwgXCJGYWtlTWFwXCIpO1xuRmFrZU1hcC5wcm90b3R5cGUgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIGtleVt0aGlzLl9rZXldO1xuICB9LCBcImdldFwiKSxcbiAgc2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5pc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtleSwgdGhpcy5fa2V5LCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgXCJzZXRcIilcbn07XG52YXIgTWVtb2l6ZU1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcImZ1bmN0aW9uXCIgPyBXZWFrTWFwIDogRmFrZU1hcDtcbmZ1bmN0aW9uIG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCkge1xuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIHZhciByZXN1bHQgPSBsZWZ0SGFuZE1hcC5nZXQocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShtZW1vaXplQ29tcGFyZSwgXCJtZW1vaXplQ29tcGFyZVwiKTtcbmZ1bmN0aW9uIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBtZW1vaXplTWFwLCByZXN1bHQpIHtcbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgbGVmdEhhbmRNYXAgPSBuZXcgTWVtb2l6ZU1hcCgpO1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICAgIG1lbW9pemVNYXAuc2V0KGxlZnRIYW5kT3BlcmFuZCwgbGVmdEhhbmRNYXApO1xuICB9XG59XG5fX25hbWUobWVtb2l6ZVNldCwgXCJtZW1vaXplU2V0XCIpO1xudmFyIGRlZXBfZXFsX2RlZmF1bHQgPSBkZWVwRXF1YWw7XG5mdW5jdGlvbiBkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxuICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBzaW1wbGVSZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xufVxuX19uYW1lKGRlZXBFcXVhbCwgXCJkZWVwRXF1YWxcIik7XG5mdW5jdGlvbiBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZCkge1xuICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQgIT09IDAgfHwgMSAvIGxlZnRIYW5kT3BlcmFuZCA9PT0gMSAvIHJpZ2h0SGFuZE9wZXJhbmQ7XG4gIH1cbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCAhPT0gbGVmdEhhbmRPcGVyYW5kICYmIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJpZ2h0SGFuZE9wZXJhbmQgIT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShzaW1wbGVFcXVhbCwgXCJzaW1wbGVFcXVhbFwiKTtcbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMubWVtb2l6ZSA9IG9wdGlvbnMubWVtb2l6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IG9wdGlvbnMubWVtb2l6ZSB8fCBuZXcgTWVtb2l6ZU1hcCgpO1xuICB2YXIgY29tcGFyYXRvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yO1xuICB2YXIgbWVtb2l6ZVJlc3VsdExlZnQgPSBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSk7XG4gIGlmIChtZW1vaXplUmVzdWx0TGVmdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0TGVmdDtcbiAgfVxuICB2YXIgbWVtb2l6ZVJlc3VsdFJpZ2h0ID0gbWVtb2l6ZUNvbXBhcmUocmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdFJpZ2h0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lbW9pemVSZXN1bHRSaWdodDtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIGlmIChjb21wYXJhdG9yUmVzdWx0ID09PSBmYWxzZSB8fCBjb21wYXJhdG9yUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBjb21wYXJhdG9yUmVzdWx0KTtcbiAgICAgIHJldHVybiBjb21wYXJhdG9yUmVzdWx0O1xuICAgIH1cbiAgICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICAgIH1cbiAgfVxuICB2YXIgbGVmdEhhbmRUeXBlID0gdHlwZTIobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kVHlwZSAhPT0gdHlwZTIocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHRydWUpO1xuICB2YXIgcmVzdWx0ID0gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKTtcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbl9fbmFtZShleHRlbnNpdmVEZWVwRXF1YWwsIFwiZXh0ZW5zaXZlRGVlcEVxdWFsXCIpO1xuZnVuY3Rpb24gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobGVmdEhhbmRUeXBlKSB7XG4gICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICByZXR1cm4gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZC52YWx1ZU9mKCksIHJpZ2h0SGFuZE9wZXJhbmQudmFsdWVPZigpKTtcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kID09PSByaWdodEhhbmRPcGVyYW5kO1xuICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwiY29kZVwiXSwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIkFyZ3VtZW50c1wiOlxuICAgIGNhc2UgXCJJbnQ4QXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgIGNhc2UgXCJJbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIkludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiUmVnRXhwXCI6XG4gICAgICByZXR1cm4gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBjYXNlIFwiR2VuZXJhdG9yXCI6XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZC5idWZmZXIpLCBuZXcgVWludDhBcnJheShyaWdodEhhbmRPcGVyYW5kLmJ1ZmZlciksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluRGF0ZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5QbGFpblRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5EYXRlVGltZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5JbnN0YW50XCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5ZZWFyTW9udGhcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5Nb250aERheVwiOlxuICAgICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC5lcXVhbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLkR1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvdGFsKFwibmFub3NlY29uZHNcIikgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG90YWwoXCJuYW5vc2Vjb25kc1wiKTtcbiAgICBjYXNlIFwiVGVtcG9yYWwuVGltZVpvbmVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuQ2FsZW5kYXJcIjpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0RXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxufVxuX19uYW1lKGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZSwgXCJleHRlbnNpdmVEZWVwRXF1YWxCeVR5cGVcIik7XG5mdW5jdGlvbiByZWdleHBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC50b1N0cmluZygpID09PSByaWdodEhhbmRPcGVyYW5kLnRvU3RyaW5nKCk7XG59XG5fX25hbWUocmVnZXhwRXF1YWwsIFwicmVnZXhwRXF1YWxcIik7XG5mdW5jdGlvbiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplICE9PSByaWdodEhhbmRPcGVyYW5kLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNpemVFcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVmdEhhbmRJdGVtcyA9IFtdO1xuICB2YXIgcmlnaHRIYW5kSXRlbXMgPSBbXTtcbiAgbGVmdEhhbmRPcGVyYW5kLmZvckVhY2goLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICBsZWZ0SGFuZEl0ZW1zLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSwgXCJnYXRoZXJFbnRyaWVzXCIpKTtcbiAgcmlnaHRIYW5kT3BlcmFuZC5mb3JFYWNoKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgcmlnaHRIYW5kSXRlbXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LCBcImdhdGhlckVudHJpZXNcIikpO1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEl0ZW1zLnNvcnQoKSwgcmlnaHRIYW5kSXRlbXMuc29ydCgpLCBvcHRpb25zKTtcbn1cbl9fbmFtZShlbnRyaWVzRXF1YWwsIFwiZW50cmllc0VxdWFsXCIpO1xuZnVuY3Rpb24gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGxlZnRIYW5kT3BlcmFuZC5sZW5ndGg7XG4gIGlmIChsZW5ndGggIT09IHJpZ2h0SGFuZE9wZXJhbmQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtpbmRleF0sIHJpZ2h0SGFuZE9wZXJhbmRbaW5kZXhdLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoaXRlcmFibGVFcXVhbCwgXCJpdGVyYWJsZUVxdWFsXCIpO1xuZnVuY3Rpb24gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHJldHVybiBpdGVyYWJsZUVxdWFsKGdldEdlbmVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKSwgZ2V0R2VuZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKSwgb3B0aW9ucyk7XG59XG5fX25hbWUoZ2VuZXJhdG9yRXF1YWwsIFwiZ2VuZXJhdG9yRXF1YWxcIik7XG5mdW5jdGlvbiBoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5fX25hbWUoaGFzSXRlcmF0b3JGdW5jdGlvbiwgXCJoYXNJdGVyYXRvckZ1bmN0aW9uXCIpO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JFbnRyaWVzKHRhcmdldCkge1xuICBpZiAoaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBnZXRHZW5lcmF0b3JFbnRyaWVzKHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICAgIH0gY2F0Y2ggKGl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuX19uYW1lKGdldEl0ZXJhdG9yRW50cmllcywgXCJnZXRJdGVyYXRvckVudHJpZXNcIik7XG5mdW5jdGlvbiBnZXRHZW5lcmF0b3JFbnRyaWVzKGdlbmVyYXRvcikge1xuICB2YXIgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgdmFyIGFjY3VtdWxhdG9yID0gW2dlbmVyYXRvclJlc3VsdC52YWx1ZV07XG4gIHdoaWxlIChnZW5lcmF0b3JSZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBnZW5lcmF0b3JSZXN1bHQgPSBnZW5lcmF0b3IubmV4dCgpO1xuICAgIGFjY3VtdWxhdG9yLnB1c2goZ2VuZXJhdG9yUmVzdWx0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5fX25hbWUoZ2V0R2VuZXJhdG9yRW50cmllcywgXCJnZXRHZW5lcmF0b3JFbnRyaWVzXCIpO1xuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZUtleXModGFyZ2V0KSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlS2V5cywgXCJnZXRFbnVtZXJhYmxlS2V5c1wiKTtcbmZ1bmN0aW9uIGdldEVudW1lcmFibGVTeW1ib2xzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgYWxsS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGtleSA9IGFsbEtleXNbaV07XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpLmVudW1lcmFibGUpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlU3ltYm9scywgXCJnZXRFbnVtZXJhYmxlU3ltYm9sc1wiKTtcbmZ1bmN0aW9uIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kW2tleXNbaV1dLCByaWdodEhhbmRPcGVyYW5kW2tleXNbaV1dLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoa2V5c0VxdWFsLCBcImtleXNFcXVhbFwiKTtcbmZ1bmN0aW9uIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB2YXIgbGVmdEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEtleXMgPSBnZXRFbnVtZXJhYmxlS2V5cyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgdmFyIGxlZnRIYW5kU3ltYm9scyA9IGdldEVudW1lcmFibGVTeW1ib2xzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRTeW1ib2xzID0gZ2V0RW51bWVyYWJsZVN5bWJvbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGxlZnRIYW5kS2V5cyA9IGxlZnRIYW5kS2V5cy5jb25jYXQobGVmdEhhbmRTeW1ib2xzKTtcbiAgcmlnaHRIYW5kS2V5cyA9IHJpZ2h0SGFuZEtleXMuY29uY2F0KHJpZ2h0SGFuZFN5bWJvbHMpO1xuICBpZiAobGVmdEhhbmRLZXlzLmxlbmd0aCAmJiBsZWZ0SGFuZEtleXMubGVuZ3RoID09PSByaWdodEhhbmRLZXlzLmxlbmd0aCkge1xuICAgIGlmIChpdGVyYWJsZUVxdWFsKG1hcFN5bWJvbHMobGVmdEhhbmRLZXlzKS5zb3J0KCksIG1hcFN5bWJvbHMocmlnaHRIYW5kS2V5cykuc29ydCgpKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kS2V5cywgb3B0aW9ucyk7XG4gIH1cbiAgdmFyIGxlZnRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kRW50cmllcy5sZW5ndGggJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gcmlnaHRIYW5kRW50cmllcy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kRW50cmllcywgcmlnaHRIYW5kRW50cmllcywgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRLZXlzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShvYmplY3RFcXVhbCwgXCJvYmplY3RFcXVhbFwiKTtcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCI7XG59XG5fX25hbWUoaXNQcmltaXRpdmUsIFwiaXNQcmltaXRpdmVcIik7XG5mdW5jdGlvbiBtYXBTeW1ib2xzKGFycikge1xuICByZXR1cm4gYXJyLm1hcCgvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG1hcFN5bWJvbChlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHJldHVybiBlbnRyeS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sIFwibWFwU3ltYm9sXCIpKTtcbn1cbl9fbmFtZShtYXBTeW1ib2xzLCBcIm1hcFN5bWJvbHNcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9wYXRodmFsL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuYW1lIGluIE9iamVjdChvYmopO1xufVxuX19uYW1lKGhhc1Byb3BlcnR5LCBcImhhc1Byb3BlcnR5XCIpO1xuZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgY29uc3Qgc3RyID0gcGF0aC5yZXBsYWNlKC8oW15cXFxcXSlcXFsvZywgXCIkMS5bXCIpO1xuICBjb25zdCBwYXJ0cyA9IHN0ci5tYXRjaCgvKFxcXFxcXC58W14uXSs/KSsvZyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBcImNvbnN0cnVjdG9yXCIgfHwgdmFsdWUgPT09IFwiX19wcm90b19fXCIgfHwgdmFsdWUgPT09IFwicHJvdG90eXBlXCIpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcmVnZXhwID0gL15cXFsoXFxkKylcXF0kLztcbiAgICBjb25zdCBtQXJyID0gcmVnZXhwLmV4ZWModmFsdWUpO1xuICAgIGxldCBwYXJzZWQgPSBudWxsO1xuICAgIGlmIChtQXJyKSB7XG4gICAgICBwYXJzZWQgPSB7IGk6IHBhcnNlRmxvYXQobUFyclsxXSkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkID0geyBwOiB2YWx1ZS5yZXBsYWNlKC9cXFxcKFsuW1xcXV0pL2csIFwiJDFcIikgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59XG5fX25hbWUocGFyc2VQYXRoLCBcInBhcnNlUGF0aFwiKTtcbmZ1bmN0aW9uIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXRoRGVwdGgpIHtcbiAgbGV0IHRlbXBvcmFyeVZhbHVlID0gb2JqO1xuICBsZXQgcmVzID0gbnVsbDtcbiAgcGF0aERlcHRoID0gdHlwZW9mIHBhdGhEZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IHBhcnNlZC5sZW5ndGggOiBwYXRoRGVwdGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFyc2VkW2ldO1xuICAgIGlmICh0ZW1wb3JhcnlWYWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0LnAgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LmldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LnBdO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IHBhdGhEZXB0aCAtIDEpIHtcbiAgICAgICAgcmVzID0gdGVtcG9yYXJ5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5fX25hbWUoaW50ZXJuYWxHZXRQYXRoVmFsdWUsIFwiaW50ZXJuYWxHZXRQYXRoVmFsdWVcIik7XG5mdW5jdGlvbiBnZXRQYXRoSW5mbyhvYmosIHBhdGgpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXRoKHBhdGgpO1xuICBjb25zdCBsYXN0ID0gcGFyc2VkW3BhcnNlZC5sZW5ndGggLSAxXTtcbiAgY29uc3QgaW5mbyA9IHtcbiAgICBwYXJlbnQ6IHBhcnNlZC5sZW5ndGggPiAxID8gaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6IG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZClcbiAgfTtcbiAgaW5mby5leGlzdHMgPSBoYXNQcm9wZXJ0eShpbmZvLnBhcmVudCwgaW5mby5uYW1lKTtcbiAgcmV0dXJuIGluZm87XG59XG5fX25hbWUoZ2V0UGF0aEluZm8sIFwiZ2V0UGF0aEluZm9cIik7XG5cbi8vIGxpYi9jaGFpL2Fzc2VydGlvbi5qc1xudmFyIF9Bc3NlcnRpb24gPSBjbGFzcyBfQXNzZXJ0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgb2JqZWN0IGZvciBjaGFpbmluZy5cbiAgICogYEFzc2VydGlvbmAgb2JqZWN0cyBjb250YWluIG1ldGFkYXRhIGluIHRoZSBmb3JtIG9mIGZsYWdzLiBUaHJlZSBmbGFncyBjYW5cbiAgICogYmUgYXNzaWduZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYnkgcGFzc2luZyBhcmd1bWVudHMgdG8gdGhpcyBjb25zdHJ1Y3RvcjpcbiAgICpcbiAgICogLSBgb2JqZWN0YDogVGhpcyBmbGFnIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgdGhlIGFzc2VydGlvbi4gRm9yIGV4YW1wbGUsIGluXG4gICAqIHRoZSBhc3NlcnRpb24gYGV4cGVjdChudW1LaXR0ZW5zKS50by5lcXVhbCg3KTtgLCB0aGUgYG9iamVjdGAgZmxhZyB3aWxsXG4gICAqIGNvbnRhaW4gYG51bUtpdHRlbnNgIHNvIHRoYXQgdGhlIGBlcXVhbGAgYXNzZXJ0aW9uIGNhbiByZWZlcmVuY2UgaXQgd2hlblxuICAgKiBuZWVkZWQuXG4gICAqXG4gICAqIC0gYG1lc3NhZ2VgOiBUaGlzIGZsYWcgY29udGFpbnMgYW4gb3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmVcbiAgICogcHJlcGVuZGVkIHRvIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQncyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VydGlvbiB3aGVuIGl0XG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiAtIGBzc2ZpYDogVGhpcyBmbGFnIHN0YW5kcyBmb3IgXCJzdGFydCBzdGFjayBmdW5jdGlvbiBpbmRpY2F0b3JcIi4gSXRcbiAgICogY29udGFpbnMgYSBmdW5jdGlvbiByZWZlcmVuY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgKiByZW1vdmluZyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGVycm9yIHRoYXQncyBjcmVhdGVkIGJ5IHRoZVxuICAgKiBhc3NlcnRpb24gd2hlbiBpdCBmYWlscy4gVGhlIGdvYWwgaXMgdG8gcHJvdmlkZSBhIGNsZWFuZXIgc3RhY2sgdHJhY2UgdG9cbiAgICogZW5kIHVzZXJzIGJ5IHJlbW92aW5nIENoYWkncyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdGUgdGhhdCBpdCBvbmx5IHdvcmtzXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgYEVycm9yLmNhcHR1cmVTdGFja1RyYWNlYCwgYW5kIG9ubHkgd2hlblxuICAgKiBgQ2hhaS5jb25maWcuaW5jbHVkZVN0YWNrYCBoYXNuJ3QgYmVlbiBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogLSBgbG9ja1NzZmlgOiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGBzc2ZpYCBmbGFnXG4gICAqIHNob3VsZCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUsIGV2ZW4gYXMgYXNzZXJ0aW9ucyBhcmUgY2hhaW5lZCBvZmYgb2ZcbiAgICogdGhpcyBvYmplY3QuIFRoaXMgaXMgdXN1YWxseSBzZXQgdG8gYHRydWVgIHdoZW4gY3JlYXRpbmcgYSBuZXcgYXNzZXJ0aW9uXG4gICAqIGZyb20gd2l0aGluIGFub3RoZXIgYXNzZXJ0aW9uLiBJdCdzIGFsc28gdGVtcG9yYXJpbHkgc2V0IHRvIGB0cnVlYCBiZWZvcmVcbiAgICogYW4gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uXG4gICAqXG4gICAqIC0gYGVxbGA6IFRoaXMgZmxhZyBjb250YWlucyB0aGUgZGVlcEVxdWFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VydGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSBvYmogdGFyZ2V0IG9mIHRoZSBhc3NlcnRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIChvcHRpb25hbCkgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NzZmldIChvcHRpb25hbCkgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIHN0YWNrIGZyYW1lc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2NrU3NmaV0gKG9wdGlvbmFsKSB3aGV0aGVyIG9yIG5vdCB0aGUgc3NmaSBmbGFnIGlzIGxvY2tlZFxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqLCBtc2csIHNzZmksIGxvY2tTc2ZpKSB7XG4gICAgLyoqIEB0eXBlIHt7fX0gKi9cbiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsIFwiX19mbGFnc1wiLCB7fSk7XG4gICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgc3NmaSB8fCBfQXNzZXJ0aW9uKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgbG9ja1NzZmkpO1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgb2JqKTtcbiAgICBmbGFnKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICAgIGZsYWcodGhpcywgXCJlcWxcIiwgY29uZmlnLmRlZXBFcXVhbCB8fCBkZWVwX2VxbF9kZWZhdWx0KTtcbiAgICByZXR1cm4gcHJveGlmeSh0aGlzKTtcbiAgfVxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIHN0YXRpYyBnZXQgaW5jbHVkZVN0YWNrKCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuXCJcbiAgICApO1xuICAgIHJldHVybiBjb25maWcuaW5jbHVkZVN0YWNrO1xuICB9XG4gIC8qKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlICovXG4gIHN0YXRpYyBzZXQgaW5jbHVkZVN0YWNrKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uaW5jbHVkZVN0YWNrIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICB9XG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgc3RhdGljIGdldCBzaG93RGlmZigpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkFzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgfVxuICAvKiogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAqL1xuICBzdGF0aWMgc2V0IHNob3dEaWZmKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uc2hvd0RpZmYgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLnNob3dEaWZmIGluc3RlYWQuXCJcbiAgICApO1xuICAgIGNvbmZpZy5zaG93RGlmZiA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIGFkZFByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgYWRkUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBhZGRNZXRob2QobmFtZSwgZm4pIHtcbiAgICBhZGRNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIGFkZENoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIGFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZVByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgb3ZlcndyaXRlUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBvdmVyd3JpdGVNZXRob2QobmFtZSwgZm4pIHtcbiAgICBvdmVyd3JpdGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiAjIyMgLmFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlLCBuZWdhdGVNZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBzaG93RGlmZilcbiAgICpcbiAgICogRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiBhbmQgY2hlY2sgZXhwZWN0YXRpb25zLiBUaHJvd3MgQXNzZXJ0aW9uRXJyb3IgZm9yIHJlcG9ydGluZyBpZiB0ZXN0IGRvZXNuJ3QgcGFzcy5cbiAgICpcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gX2V4cHIgdG8gYmUgdGVzdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBGdW5jdGlvbn0gX25lZ2F0ZU1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbmVnYXRlZE1lc3NhZ2UgdG8gZGlzcGxheSBpZiBuZWdhdGVkIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZCB2YWx1ZSAocmVtZW1iZXIgdG8gY2hlY2sgZm9yIG5lZ2F0aW9uKVxuICAgKiBAcGFyYW0ge3Vua25vd259IF9hY3R1YWwgKG9wdGlvbmFsKSB3aWxsIGRlZmF1bHQgdG8gYHRoaXMub2JqYFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dEaWZmIChvcHRpb25hbCkgd2hlbiBzZXQgdG8gYHRydWVgLCBhc3NlcnQgd2lsbCBkaXNwbGF5IGEgZGlmZiBpbiBhZGRpdGlvbiB0byB0aGUgbWVzc2FnZSBpZiBleHByZXNzaW9uIGZhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0KF9leHByLCBtc2csIF9uZWdhdGVNc2csIGV4cGVjdGVkLCBfYWN0dWFsLCBzaG93RGlmZikge1xuICAgIGNvbnN0IG9rID0gdGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChmYWxzZSAhPT0gc2hvd0RpZmYpIHNob3dEaWZmID0gdHJ1ZTtcbiAgICBpZiAodm9pZCAwID09PSBleHBlY3RlZCAmJiB2b2lkIDAgPT09IF9hY3R1YWwpIHNob3dEaWZmID0gZmFsc2U7XG4gICAgaWYgKHRydWUgIT09IGNvbmZpZy5zaG93RGlmZikgc2hvd0RpZmYgPSBmYWxzZTtcbiAgICBpZiAoIW9rKSB7XG4gICAgICBtc2cgPSBnZXRNZXNzYWdlMih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgY29uc3QgYWN0dWFsID0gZ2V0QWN0dWFsKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBjb25zdCBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMgPSB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIHNob3dEaWZmXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3BlcmF0b3IgPSBnZXRPcGVyYXRvcih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKG9wZXJhdG9yKSB7XG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2csXG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcyxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aGF0IHRvIGRvIGFib3V0IHRoZXNlIHR5cGVzIHlldFxuICAgICAgICBjb25maWcuaW5jbHVkZVN0YWNrID8gdGhpcy5hc3NlcnQgOiBmbGFnKHRoaXMsIFwic3NmaVwiKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFF1aWNrIHJlZmVyZW5jZSB0byBzdG9yZWQgYGFjdHVhbGAgdmFsdWUgZm9yIHBsdWdpbiBkZXZlbG9wZXJzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn1cbiAgICovXG4gIGdldCBfb2JqKCkge1xuICAgIHJldHVybiBmbGFnKHRoaXMsIFwib2JqZWN0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBRdWljayByZWZlcmVuY2UgdG8gc3RvcmVkIGBhY3R1YWxgIHZhbHVlIGZvciBwbHVnaW4gZGV2ZWxvcGVycy5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWxcbiAgICovXG4gIHNldCBfb2JqKHZhbCkge1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgdmFsKTtcbiAgfVxufTtcbl9fbmFtZShfQXNzZXJ0aW9uLCBcIkFzc2VydGlvblwiKTtcbnZhciBBc3NlcnRpb24gPSBfQXNzZXJ0aW9uO1xuXG4vLyBsaWIvY2hhaS91dGlscy9ldmVudHMuanNcbnZhciBldmVudHMgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbnZhciBfUGx1Z2luRXZlbnQgPSBjbGFzcyBfUGx1Z2luRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbikge1xuICAgIHN1cGVyKHR5cGUzKTtcbiAgICB0aGlzLm5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgdGhpcy5mbiA9IGZuO1xuICB9XG59O1xuX19uYW1lKF9QbHVnaW5FdmVudCwgXCJQbHVnaW5FdmVudFwiKTtcbnZhciBQbHVnaW5FdmVudCA9IF9QbHVnaW5FdmVudDtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanNcbmZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIHR5cGVvZiBQcm94eSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cbl9fbmFtZShpc1Byb3h5RW5hYmxlZCwgXCJpc1Byb3h5RW5hYmxlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanNcbmZ1bmN0aW9uIGFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKSB7XG4gIGdldHRlciA9IGdldHRlciA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7XG4gIH0gOiBnZXR0ZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICBpZiAoIWlzUHJveHlFbmFibGVkKCkgJiYgIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBwcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwodGhpcyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHJldHVybiByZXN1bHQ7XG4gICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgICB9LCBcInByb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkUHJvcGVydHlcIiwgbmFtZSwgZ2V0dGVyKSk7XG59XG5fX25hbWUoYWRkUHJvcGVydHksIFwiYWRkUHJvcGVydHlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZExlbmd0aEd1YXJkLmpzXG52YXIgZm5MZW5ndGhEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jdGlvbigpIHtcbn0sIFwibGVuZ3RoXCIpO1xuZnVuY3Rpb24gYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSkgcmV0dXJuIGZuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibGVuZ3RoXCIsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaXNDaGFpbmFibGUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnXCIuJ1xuICAgICAgKTtcbiAgICB9LCBcImdldFwiKVxuICB9KTtcbiAgcmV0dXJuIGZuO1xufVxuX19uYW1lKGFkZExlbmd0aEd1YXJkLCBcImFkZExlbmd0aEd1YXJkXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRQcm9wZXJ0aWVzLmpzXG5mdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcbiAgZnVuY3Rpb24gYWRkUHJvcGVydHkyKHByb3BlcnR5KSB7XG4gICAgaWYgKHJlc3VsdC5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgX19uYW1lKGFkZFByb3BlcnR5MiwgXCJhZGRQcm9wZXJ0eVwiKTtcbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5Mik7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5fX25hbWUoZ2V0UHJvcGVydGllcywgXCJnZXRQcm9wZXJ0aWVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9wcm94aWZ5LmpzXG52YXIgYnVpbHRpbnMgPSBbXCJfX2ZsYWdzXCIsIFwiX19tZXRob2RzXCIsIFwiX29ialwiLCBcImFzc2VydFwiXTtcbmZ1bmN0aW9uIHByb3hpZnkob2JqLCBub25DaGFpbmFibGVNZXRob2ROYW1lKSB7XG4gIGlmICghaXNQcm94eUVuYWJsZWQoKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJveHlHZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiAmJiBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5KSkge1xuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArIFwiLlwiICsgcHJvcGVydHkgKyAnLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgKyAnXCIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1Z2dlc3Rpb24gPSBudWxsO1xuICAgICAgICBsZXQgc3VnZ2VzdGlvbkRpc3RhbmNlID0gNDtcbiAgICAgICAgZ2V0UHJvcGVydGllcyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHdlIGFjdHVhbGx5IG1lYW4gdG8gY2hlY2sgYE9iamVjdC5wcm90b3R5cGVgIGhlcmVcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGJ1aWx0aW5zLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZGlzdCA9IHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHByb3BlcnR5LCBwcm9wLCBzdWdnZXN0aW9uRGlzdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGRpc3QgPCBzdWdnZXN0aW9uRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHByb3A7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIHByb3BlcnR5ICsgJy4gRGlkIHlvdSBtZWFuIFwiJyArIHN1Z2dlc3Rpb24gKyAnXCI/J1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYnVpbHRpbnMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFmbGFnKHRhcmdldCwgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgXCJzc2ZpXCIsIHByb3h5R2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9LCBcInByb3h5R2V0dGVyXCIpXG4gIH0pO1xufVxuX19uYW1lKHByb3hpZnksIFwicHJveGlmeVwiKTtcbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuICBsZXQgbWVtbyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKGxldCBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoID0gc3RyQS5jaGFyQ29kZUF0KGkgLSAxKTtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBzdHJCLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoaSAtIGopID49IGNhcCkge1xuICAgICAgICBtZW1vW2ldW2pdID0gY2FwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgbWVtb1tpIC0gMV1bal0gKyAxLFxuICAgICAgICBtZW1vW2ldW2ogLSAxXSArIDEsXG4gICAgICAgIG1lbW9baSAtIDFdW2ogLSAxXSArIChjaCA9PT0gc3RyQi5jaGFyQ29kZUF0KGogLSAxKSA/IDAgOiAxKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbl9fbmFtZShzdHJpbmdEaXN0YW5jZUNhcHBlZCwgXCJzdHJpbmdEaXN0YW5jZUNhcHBlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkTWV0aG9kLmpzXG5mdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IG1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm1ldGhvZFdyYXBwZXJcIik7XG4gIGFkZExlbmd0aEd1YXJkKG1ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShtZXRob2RXcmFwcGVyLCBuYW1lKTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkTWV0aG9kXCIsIG5hbWUsIG1ldGhvZCkpO1xufVxuX19uYW1lKGFkZE1ldGhvZCwgXCJhZGRNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZVByb3BlcnR5LmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBsZXQgX2dldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBuYW1lKSwgX3N1cGVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfZ2V0ICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9nZXQuZ2V0KSBfc3VwZXIgPSBfZ2V0LmdldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSwge1xuICAgIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKCkge1xuICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsIFwibG9ja1NzZmlcIikpIHtcbiAgICAgICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgICAgZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIsIHRydWUpO1xuICAgICAgbGV0IHJlc3VsdCA9IGdldHRlcihfc3VwZXIpLmNhbGwodGhpcyk7XG4gICAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgfSwgXCJvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cbl9fbmFtZShvdmVyd3JpdGVQcm9wZXJ0eSwgXCJvdmVyd3JpdGVQcm9wZXJ0eVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IF9tZXRob2QgPSBjdHhbbmFtZV0sIF9zdXBlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfbWV0aG9kICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9tZXRob2QpIF9zdXBlciA9IF9tZXRob2Q7XG4gIGxldCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cbiAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcodGhpcywgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICBsZXQgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH0sIFwib3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyXCIpO1xuICBhZGRMZW5ndGhHdWFyZChvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUpO1xufVxuX19uYW1lKG92ZXJ3cml0ZU1ldGhvZCwgXCJvdmVyd3JpdGVNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZENoYWluYWJsZU1ldGhvZC5qc1xudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09IFwiZnVuY3Rpb25cIjtcbnZhciB0ZXN0Rm4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xufSwgXCJ0ZXN0Rm5cIik7XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICBsZXQgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG4gIGlmICh0eXBlb2YgcHJvcERlc2MgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIXByb3BEZXNjLmNvbmZpZ3VyYWJsZTtcbn0pO1xudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBjbGFzcyBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgZXh0ZW5kcyBQbHVnaW5FdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIHN1cGVyKHR5cGUzLCBuYW1lLCBmbik7XG4gICAgdGhpcy5jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5pbmdCZWhhdmlvcjtcbiAgfVxufTtcbl9fbmFtZShfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQsIFwiUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnRcIik7XG52YXIgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQ7XG5mdW5jdGlvbiBhZGRDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgaWYgKHR5cGVvZiBjaGFpbmluZ0JlaGF2aW9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjaGFpbmluZ0JlaGF2aW9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgICB9LCBcImNoYWluaW5nQmVoYXZpb3JcIik7XG4gIH1cbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0ge1xuICAgIG1ldGhvZCxcbiAgICBjaGFpbmluZ0JlaGF2aW9yXG4gIH07XG4gIGlmICghY3R4Ll9fbWV0aG9kcykge1xuICAgIGN0eC5fX21ldGhvZHMgPSB7fTtcbiAgfVxuICBjdHguX19tZXRob2RzW25hbWVdID0gY2hhaW5hYmxlQmVoYXZpb3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gY2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuICAgICAgbGV0IGNoYWluYWJsZU1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICAgIGZsYWcodGhpcywgXCJzc2ZpXCIsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9LCBcImNoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG4gICAgICBhZGRMZW5ndGhHdWFyZChjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBuYW1lLCB0cnVlKTtcbiAgICAgIGlmIChjYW5TZXRQcm90b3R5cGUpIHtcbiAgICAgICAgbGV0IHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIHByb3RvdHlwZS5jYWxsID0gY2FsbDtcbiAgICAgICAgcHJvdG90eXBlLmFwcGx5ID0gYXBwbHk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBwcm90b3R5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGFzc2VydGVyTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdHgpO1xuICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24oYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgaWYgKGV4Y2x1ZGVOYW1lcy5pbmRleE9mKGFzc2VydGVyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBhc3NlcnRlck5hbWUpO1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBhc3NlcnRlck5hbWUsIHBkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHByb3hpZnkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgfSwgXCJjaGFpbmFibGVNZXRob2RHZXR0ZXJcIiksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBldmVudHMuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQoXG4gICAgICBcImFkZENoYWluYWJsZU1ldGhvZFwiLFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGNoYWluaW5nQmVoYXZpb3JcbiAgICApXG4gICk7XG59XG5fX25hbWUoYWRkQ2hhaW5hYmxlTWV0aG9kLCBcImFkZENoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0gY3R4Ll9fbWV0aG9kc1tuYW1lXTtcbiAgbGV0IF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gb3ZlcndyaXRpbmdDaGFpbmFibGVNZXRob2RHZXR0ZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNoYWluaW5nQmVoYXZpb3IoX2NoYWluaW5nQmVoYXZpb3IpLmNhbGwodGhpcyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyXCIpO1xuICBsZXQgX21ldGhvZCA9IGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZDtcbiAgY2hhaW5hYmxlQmVoYXZpb3IubWV0aG9kID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZChfbWV0aG9kKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfSwgXCJvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG59XG5fX25hbWUob3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLCBcIm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvY29tcGFyZUJ5SW5zcGVjdC5qc1xuZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0MihhKSA8IGluc3BlY3QyKGIpID8gLTEgOiAxO1xufVxuX19uYW1lKGNvbXBhcmVCeUluc3BlY3QsIFwiY29tcGFyZUJ5SW5zcGVjdFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scy5qc1xuZnVuY3Rpb24gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pLmVudW1lcmFibGU7XG4gIH0pO1xufVxuX19uYW1lKGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMsIFwiZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMuanNcbmZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5jb25jYXQoZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopKTtcbn1cbl9fbmFtZShnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcywgXCJnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNOYU4uanNcbnZhciBpc05hTjIgPSBOdW1iZXIuaXNOYU47XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE9wZXJhdG9yLmpzXG5mdW5jdGlvbiBpc09iamVjdFR5cGUob2JqKSB7XG4gIGxldCBvYmplY3RUeXBlID0gdHlwZShvYmopO1xuICBsZXQgb2JqZWN0VHlwZXMgPSBbXCJBcnJheVwiLCBcIk9iamVjdFwiLCBcIkZ1bmN0aW9uXCJdO1xuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5fX25hbWUoaXNPYmplY3RUeXBlLCBcImlzT2JqZWN0VHlwZVwiKTtcbmZ1bmN0aW9uIGdldE9wZXJhdG9yKG9iaiwgYXJncykge1xuICBsZXQgb3BlcmF0b3IgPSBmbGFnKG9iaiwgXCJvcGVyYXRvclwiKTtcbiAgbGV0IG5lZ2F0ZSA9IGZsYWcob2JqLCBcIm5lZ2F0ZVwiKTtcbiAgbGV0IGV4cGVjdGVkID0gYXJnc1szXTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cbiAgaWYgKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCBcIlwiO1xuICBpZiAoIW1zZykge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKC9cXHNoYXZlXFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGxldCBpc09iamVjdCA9IGlzT2JqZWN0VHlwZShleHBlY3RlZCk7XG4gIGlmICgvXFxzbm90XFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gaXNPYmplY3QgPyBcIm5vdERlZXBTdHJpY3RFcXVhbFwiIDogXCJub3RTdHJpY3RFcXVhbFwiO1xuICB9XG4gIHJldHVybiBpc09iamVjdCA/IFwiZGVlcFN0cmljdEVxdWFsXCIgOiBcInN0cmljdEVxdWFsXCI7XG59XG5fX25hbWUoZ2V0T3BlcmF0b3IsIFwiZ2V0T3BlcmF0b3JcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luZGV4LmpzXG5mdW5jdGlvbiBnZXROYW1lKGZuKSB7XG4gIHJldHVybiBmbi5uYW1lO1xufVxuX19uYW1lKGdldE5hbWUsIFwiZ2V0TmFtZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwMihvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuX19uYW1lKGlzUmVnRXhwMiwgXCJpc1JlZ0V4cFwiKTtcbmZ1bmN0aW9uIGlzTnVtZXJpYyhvYmopIHtcbiAgcmV0dXJuIFtcIk51bWJlclwiLCBcIkJpZ0ludFwiXS5pbmNsdWRlcyh0eXBlKG9iaikpO1xufVxuX19uYW1lKGlzTnVtZXJpYywgXCJpc051bWVyaWNcIik7XG5cbi8vIGxpYi9jaGFpL2NvcmUvYXNzZXJ0aW9ucy5qc1xudmFyIHsgZmxhZzogZmxhZzIgfSA9IHV0aWxzX2V4cG9ydHM7XG5bXG4gIFwidG9cIixcbiAgXCJiZVwiLFxuICBcImJlZW5cIixcbiAgXCJpc1wiLFxuICBcImFuZFwiLFxuICBcImhhc1wiLFxuICBcImhhdmVcIixcbiAgXCJ3aXRoXCIsXG4gIFwidGhhdFwiLFxuICBcIndoaWNoXCIsXG4gIFwiYXRcIixcbiAgXCJvZlwiLFxuICBcInNhbWVcIixcbiAgXCJidXRcIixcbiAgXCJkb2VzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJhbHNvXCJcbl0uZm9yRWFjaChmdW5jdGlvbihjaGFpbikge1xuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoY2hhaW4pO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJub3RcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIsIHRydWUpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJkZWVwXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImRlZXBcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm5lc3RlZFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJuZXN0ZWRcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm93blwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJvd25cIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9yZGVyZWRcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiYW55XCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImFueVwiLCB0cnVlKTtcbiAgZmxhZzIodGhpcywgXCJhbGxcIiwgZmFsc2UpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJhbGxcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwiYWxsXCIsIHRydWUpO1xuICBmbGFnMih0aGlzLCBcImFueVwiLCBmYWxzZSk7XG59KTtcbnZhciBmdW5jdGlvblR5cGVzID0ge1xuICBmdW5jdGlvbjogW1xuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcImFzeW5jZnVuY3Rpb25cIixcbiAgICBcImdlbmVyYXRvcmZ1bmN0aW9uXCIsXG4gICAgXCJhc3luY2dlbmVyYXRvcmZ1bmN0aW9uXCJcbiAgXSxcbiAgYXN5bmNmdW5jdGlvbjogW1wiYXN5bmNmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGdlbmVyYXRvcmZ1bmN0aW9uOiBbXCJnZW5lcmF0b3JmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGFzeW5jZ2VuZXJhdG9yZnVuY3Rpb246IFtcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl1cbn07XG5mdW5jdGlvbiBhbih0eXBlMywgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB0eXBlMyA9IHR5cGUzLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgYXJ0aWNsZSA9IH5bXCJhXCIsIFwiZVwiLCBcImlcIiwgXCJvXCIsIFwidVwiXS5pbmRleE9mKHR5cGUzLmNoYXJBdCgwKSkgPyBcImFuIFwiIDogXCJhIFwiO1xuICBjb25zdCBkZXRlY3RlZFR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGZ1bmN0aW9uVHlwZXNbXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlMykpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGZ1bmN0aW9uVHlwZXNbdHlwZTNdLmluY2x1ZGVzKGRldGVjdGVkVHlwZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIHR5cGUzID09PSBkZXRlY3RlZFR5cGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFuLCBcImFuXCIpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImFuXCIsIGFuKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJhXCIsIGFuKTtcbmZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oYSwgYikge1xuICByZXR1cm4gaXNOYU4yKGEpICYmIGlzTmFOMihiKSB8fCBhID09PSBiO1xufVxuX19uYW1lKFNhbWVWYWx1ZVplcm8sIFwiU2FtZVZhbHVlWmVyb1wiKTtcbmZ1bmN0aW9uIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKCkge1xuICBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIsIHRydWUpO1xufVxuX19uYW1lKGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yLCBcImluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yXCIpO1xuZnVuY3Rpb24gaW5jbHVkZSh2YWwsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBpc0RlZXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIiksIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyBcImRlZXAgXCIgOiBcIlwiLCBpc0VxbCA9IGlzRGVlcCA/IGZsYWcyKHRoaXMsIFwiZXFsXCIpIDogU2FtZVZhbHVlWmVybztcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgbGV0IGluY2x1ZGVkID0gZmFsc2U7XG4gIHN3aXRjaCAob2JqVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwid2Vha3NldFwiOlxuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwidW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldFwiLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic2V0XCI6XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IGluY2x1ZGVkIHx8IGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmICh2YWwgIT09IE9iamVjdCh2YWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBmbGFnTXNnICsgXCJ0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2YgYXJndW1lbnRzIChcIiArIG9ialR5cGUgKyBcIiBhbmQgXCIgKyB0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSArIFwiKSBpcyBpbnZhbGlkIGZvciB0aGlzIGFzc2VydGlvbi4gWW91IGNhbiB1c2UgYW4gYXJyYXksIGEgbWFwLCBhbiBvYmplY3QsIGEgc2V0LCBhIHN0cmluZywgb3IgYSB3ZWFrc2V0IGluc3RlYWQgb2YgYSBcIiArIHR5cGUodmFsKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgbGV0IGZpcnN0RXJyID0gbnVsbDtcbiAgICAgIGxldCBudW1FcnJzID0gMDtcbiAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBsZXQgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBwcm9wQXNzZXJ0aW9uLCB0cnVlKTtcbiAgICAgICAgZmxhZzIocHJvcEFzc2VydGlvbiwgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihlcnIsIEFzc2VydGlvbkVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlyc3RFcnIgPT09IG51bGwpIGZpcnN0RXJyID0gZXJyO1xuICAgICAgICAgIG51bUVycnMrKztcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgICBpZiAobmVnYXRlICYmIHByb3BzLmxlbmd0aCA+IDEgJiYgbnVtRXJycyA9PT0gcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IGZpcnN0RXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpbmNsdWRlZCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZXNjcmlwdG9yICsgXCJpbmNsdWRlIFwiICsgaW5zcGVjdDIodmFsKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IFwiICsgZGVzY3JpcHRvciArIFwiaW5jbHVkZSBcIiArIGluc3BlY3QyKHZhbClcbiAgKTtcbn1cbl9fbmFtZShpbmNsdWRlLCBcImluY2x1ZGVcIik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiaW5jbHVkZVwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpblwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpbnNcIiwgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImluY2x1ZGVzXCIsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9rXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1dGh5XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5XCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidHJ1ZVwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgdHJ1ZSA9PT0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydWVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJudW1lcmljXCIsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBvYmplY3QgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgW1wiTnVtYmVyXCIsIFwiQmlnSW50XCJdLmluY2x1ZGVzKHR5cGUob2JqZWN0KSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIG51bWVyaWNcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIG51bWVyaWNcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJjYWxsYWJsZVwiLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgdmFsID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIGNvbnN0IG1lc3NhZ2UgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UgPyBgJHttZXNzYWdlfTogYCA6IFwiXCI7XG4gIGNvbnN0IG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpO1xuICBjb25zdCBhc3NlcnRpb25NZXNzYWdlID0gbmVnYXRlID8gYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gbm90IHRvIGJlIGEgY2FsbGFibGUgZnVuY3Rpb25gIDogYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbmA7XG4gIGNvbnN0IGlzQ2FsbGFibGUgPSBbXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQXN5bmNGdW5jdGlvblwiLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIixcbiAgICBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIlxuICBdLmluY2x1ZGVzKHR5cGUodmFsKSk7XG4gIGlmIChpc0NhbGxhYmxlICYmIG5lZ2F0ZSB8fCAhaXNDYWxsYWJsZSAmJiAhbmVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGFzc2VydGlvbk1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZmFsc2VcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGZhbHNlID09PSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZVwiLFxuICAgIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpID8gdHJ1ZSA6IGZhbHNlXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm51bGxcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIG51bGwgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBudWxsXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBudWxsXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidW5kZWZpbmVkXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICB2b2lkIDAgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIHVuZGVmaW5lZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIk5hTlwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNOYU4yKGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgTmFOXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBOYU5cIlxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRFeGlzdCgpIHtcbiAgbGV0IHZhbCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdFwiXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0RXhpc3QsIFwiYXNzZXJ0RXhpc3RcIik7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdFwiLCBhc3NlcnRFeGlzdCk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdHNcIiwgYXNzZXJ0RXhpc3QpO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZW1wdHlcIiwgZnVuY3Rpb24oKSB7XG4gIGxldCB2YWwgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgaXRlbXNDb3VudDtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgc3dpdGNoICh0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1hcFwiOlxuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ3ZWFrbWFwXCI6XG4gICAgY2FzZSBcIndlYWtzZXRcIjpcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb25cIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBtc2cgPSBmbGFnTXNnICsgXCIuZW1wdHkgd2FzIHBhc3NlZCBhIGZ1bmN0aW9uIFwiICsgZ2V0TmFtZSh2YWwpO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZy50cmltKCksIHZvaWQgMCwgc3NmaSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgbm9uLXN0cmluZyBwcmltaXRpdmUgXCIgKyBpbnNwZWN0Mih2YWwpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpdGVtc0NvdW50ID0gT2JqZWN0LmtleXModmFsKS5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgMCA9PT0gaXRlbXNDb3VudCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZW1wdHlcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGVtcHR5XCJcbiAgKTtcbn0pO1xuZnVuY3Rpb24gY2hlY2tBcmd1bWVudHMoKSB7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgdHlwZTMgPSB0eXBlKG9iaik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIFwiQXJndW1lbnRzXCIgPT09IHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhcmd1bWVudHMgYnV0IGdvdCBcIiArIHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYXJndW1lbnRzXCJcbiAgKTtcbn1cbl9fbmFtZShjaGVja0FyZ3VtZW50cywgXCJjaGVja0FyZ3VtZW50c1wiKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImFyZ3VtZW50c1wiLCBjaGVja0FyZ3VtZW50cyk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJBcmd1bWVudHNcIiwgY2hlY2tBcmd1bWVudHMpO1xuZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgaWYgKGZsYWcyKHRoaXMsIFwiZGVlcFwiKSkge1xuICAgIGxldCBwcmV2TG9ja1NzZmkgPSBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcyKHRoaXMsIFwibG9ja1NzZmlcIiwgdHJ1ZSk7XG4gICAgdGhpcy5lcWwodmFsKTtcbiAgICBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIsIHByZXZMb2NrU3NmaSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICB2YWwgPT09IG9iaixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXF1YWwgI3tleHB9XCIsXG4gICAgICB2YWwsXG4gICAgICB0aGlzLl9vYmosXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEVxdWFsLCBcImFzc2VydEVxdWFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxdWFsXCIsIGFzc2VydEVxdWFsKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJlcXVhbHNcIiwgYXNzZXJ0RXF1YWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxXCIsIGFzc2VydEVxdWFsKTtcbmZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGVxbCA9IGZsYWcyKHRoaXMsIFwiZXFsXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICBlcWwob2JqLCBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBvYmosXG4gICAgdGhpcy5fb2JqLFxuICAgIHRydWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRFcWwsIFwiYXNzZXJ0RXFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbFwiLCBhc3NlcnRFcWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbHNcIiwgYXNzZXJ0RXFsKTtcbmZ1bmN0aW9uIGFzc2VydEFib3ZlKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYWJvdmUgbXVzdCBiZSBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGFib3ZlIG11c3QgYmUgYSBudW1iZXJcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIGlmIChkb0xlbmd0aCkge1xuICAgIGxldCBkZXNjcmlwdG9yID0gXCJsZW5ndGhcIiwgaXRlbXNDb3VudDtcbiAgICBpZiAob2JqVHlwZSA9PT0gXCJtYXBcIiB8fCBvYmpUeXBlID09PSBcInNldFwiKSB7XG4gICAgICBkZXNjcmlwdG9yID0gXCJzaXplXCI7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGl0ZW1zQ291bnQgPiBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGFib3ZlICN7ZXhwfVwiLFxuICAgICAgbixcbiAgICAgIGl0ZW1zQ291bnRcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgb2JqID4gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBtb3N0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRBYm92ZSwgXCJhc3NlcnRBYm92ZVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhYm92ZVwiLCBhc3NlcnRBYm92ZSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3RcIiwgYXNzZXJ0QWJvdmUpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImdyZWF0ZXJUaGFuXCIsIGFzc2VydEFib3ZlKTtcbmZ1bmN0aW9uIGFzc2VydExlYXN0KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbGVhc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA+PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBsZWFzdCAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPj0gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBsZWFzdCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBiZWxvdyAje2V4cH1cIixcbiAgICAgIG5cbiAgICApO1xuICB9XG59XG5fX25hbWUoYXNzZXJ0TGVhc3QsIFwiYXNzZXJ0TGVhc3RcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibGVhc3RcIiwgYXNzZXJ0TGVhc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImd0ZVwiLCBhc3NlcnRMZWFzdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsIGFzc2VydExlYXN0KTtcbmZ1bmN0aW9uIGFzc2VydEJlbG93KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGJlbG93ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPCBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRCZWxvdywgXCJhc3NlcnRCZWxvd1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJiZWxvd1wiLCBhc3NlcnRCZWxvdyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibHRcIiwgYXNzZXJ0QmVsb3cpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImxlc3NUaGFuXCIsIGFzc2VydEJlbG93KTtcbmZ1bmN0aW9uIGFzc2VydE1vc3QobiwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGRvTGVuZ3RoID0gZmxhZzIodGhpcywgXCJkb0xlbmd0aFwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgbXNnUHJlZml4ID0gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgOiBcIlwiLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIG5UeXBlID0gdHlwZShuKS50b0xvd2VyQ2FzZSgpLCBlcnJvck1lc3NhZ2UsIHNob3VsZFRocm93ID0gdHJ1ZTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgZGF0ZVwiO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBtb3N0ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH1cIixcbiAgICAgIG4sXG4gICAgICBpdGVtc0NvdW50XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9XCIsXG4gICAgICBuXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydE1vc3QsIFwiYXNzZXJ0TW9zdFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtb3N0XCIsIGFzc2VydE1vc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImx0ZVwiLCBhc3NlcnRNb3N0KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJsZXNzVGhhbk9yRXF1YWxcIiwgYXNzZXJ0TW9zdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwid2l0aGluXCIsIGZ1bmN0aW9uKHN0YXJ0LCBmaW5pc2gsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBzdGFydFR5cGUgPSB0eXBlKHN0YXJ0KS50b0xvd2VyQ2FzZSgpLCBmaW5pc2hUeXBlID0gdHlwZShmaW5pc2gpLnRvTG93ZXJDYXNlKCksIGVycm9yTWVzc2FnZSwgc2hvdWxkVGhyb3cgPSB0cnVlLCByYW5nZSA9IHN0YXJ0VHlwZSA9PT0gXCJkYXRlXCIgJiYgZmluaXNoVHlwZSA9PT0gXCJkYXRlXCIgPyBzdGFydC50b0lTT1N0cmluZygpICsgXCIuLlwiICsgZmluaXNoLnRvSVNPU3RyaW5nKCkgOiBzdGFydCArIFwiLi5cIiArIGZpbmlzaDtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgKHN0YXJ0VHlwZSAhPT0gXCJkYXRlXCIgfHwgZmluaXNoVHlwZSAhPT0gXCJkYXRlXCIpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIGRhdGVzXCI7XG4gIH0gZWxzZSBpZiAoKCFpc051bWVyaWMoc3RhcnQpIHx8ICFpc051bWVyaWMoZmluaXNoKSkgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBudW1iZXJzXCI7XG4gIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwiZGF0ZVwiICYmICFpc051bWVyaWMob2JqKSkge1xuICAgIGxldCBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICBsZXQgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50ID49IHN0YXJ0ICYmIGl0ZW1zQ291bnQgPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiB3aXRoaW4gXCIgKyByYW5nZSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIHdpdGhpbiBcIiArIHJhbmdlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA+PSBzdGFydCAmJiBvYmogPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHdpdGhpbiBcIiArIHJhbmdlLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSB3aXRoaW4gXCIgKyByYW5nZVxuICAgICk7XG4gIH1cbn0pO1xuZnVuY3Rpb24gYXNzZXJ0SW5zdGFuY2VPZihjb25zdHJ1Y3RvciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgdGFyZ2V0ID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKTtcbiAgbGV0IGlzSW5zdGFuY2VPZjtcbiAgdHJ5IHtcbiAgICBpc0luc3RhbmNlT2YgPSB0YXJnZXQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiVGhlIGluc3RhbmNlb2YgYXNzZXJ0aW9uIG5lZWRzIGEgY29uc3RydWN0b3IgYnV0IFwiICsgdHlwZShjb25zdHJ1Y3RvcikgKyBcIiB3YXMgZ2l2ZW4uXCIsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGxldCBuYW1lID0gZ2V0TmFtZShjb25zdHJ1Y3Rvcik7XG4gIGlmIChuYW1lID09IG51bGwpIHtcbiAgICBuYW1lID0gXCJhbiB1bm5hbWVkIGNvbnN0cnVjdG9yXCI7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNJbnN0YW5jZU9mLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWUsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRJbnN0YW5jZU9mLCBcImFzc2VydEluc3RhbmNlT2ZcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5zdGFuY2VvZlwiLCBhc3NlcnRJbnN0YW5jZU9mKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbnN0YW5jZU9mXCIsIGFzc2VydEluc3RhbmNlT2YpO1xuZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHkobmFtZSwgdmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBpc05lc3RlZCA9IGZsYWcyKHRoaXMsIFwibmVzdGVkXCIpLCBpc093biA9IGZsYWcyKHRoaXMsIFwib3duXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgbmFtZVR5cGUgPSB0eXBlb2YgbmFtZTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgaWYgKGlzTmVzdGVkKSB7XG4gICAgaWYgKG5hbWVUeXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyBcInRoZSBhcmd1bWVudCB0byBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nIHdoZW4gdXNpbmcgbmVzdGVkIHN5bnRheFwiLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYW1lVHlwZSAhPT0gXCJzdHJpbmdcIiAmJiBuYW1lVHlwZSAhPT0gXCJudW1iZXJcIiAmJiBuYW1lVHlwZSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgXCJ0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBzeW1ib2xcIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOZXN0ZWQgJiYgaXNPd24pIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgJ1RoZSBcIm5lc3RlZFwiIGFuZCBcIm93blwiIGZsYWdzIGNhbm5vdCBiZSBjb21iaW5lZC4nLFxuICAgICAgdm9pZCAwLFxuICAgICAgc3NmaVxuICAgICk7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyBcIlRhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxuICBsZXQgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSwgcGF0aEluZm8gPSBpc05lc3RlZCA/IGdldFBhdGhJbmZvKG9iaiwgbmFtZSkgOiBudWxsLCB2YWx1ZSA9IGlzTmVzdGVkID8gcGF0aEluZm8udmFsdWUgOiBvYmpbbmFtZV0sIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgbGV0IGRlc2NyaXB0b3IgPSBcIlwiO1xuICBpZiAoaXNEZWVwKSBkZXNjcmlwdG9yICs9IFwiZGVlcCBcIjtcbiAgaWYgKGlzT3duKSBkZXNjcmlwdG9yICs9IFwib3duIFwiO1xuICBpZiAoaXNOZXN0ZWQpIGRlc2NyaXB0b3IgKz0gXCJuZXN0ZWQgXCI7XG4gIGRlc2NyaXB0b3IgKz0gXCJwcm9wZXJ0eSBcIjtcbiAgbGV0IGhhc1Byb3BlcnR5MjtcbiAgaWYgKGlzT3duKSBoYXNQcm9wZXJ0eTIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKTtcbiAgZWxzZSBpZiAoaXNOZXN0ZWQpIGhhc1Byb3BlcnR5MiA9IHBhdGhJbmZvLmV4aXN0cztcbiAgZWxzZSBoYXNQcm9wZXJ0eTIgPSBoYXNQcm9wZXJ0eShvYmosIG5hbWUpO1xuICBpZiAoIW5lZ2F0ZSB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKVxuICAgICk7XG4gIH1cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIgJiYgaXNFcWwodmFsLCB2YWx1ZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7ZXhwfSwgYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7YWN0fVwiLFxuICAgICAgdmFsLFxuICAgICAgdmFsdWVcbiAgICApO1xuICB9XG4gIGZsYWcyKHRoaXMsIFwib2JqZWN0XCIsIHZhbHVlKTtcbn1cbl9fbmFtZShhc3NlcnRQcm9wZXJ0eSwgXCJhc3NlcnRQcm9wZXJ0eVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJwcm9wZXJ0eVwiLCBhc3NlcnRQcm9wZXJ0eSk7XG5mdW5jdGlvbiBhc3NlcnRPd25Qcm9wZXJ0eShfbmFtZSwgX3ZhbHVlLCBfbXNnKSB7XG4gIGZsYWcyKHRoaXMsIFwib3duXCIsIHRydWUpO1xuICBhc3NlcnRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuX19uYW1lKGFzc2VydE93blByb3BlcnR5LCBcImFzc2VydE93blByb3BlcnR5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5XCIsIGFzc2VydE93blByb3BlcnR5KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJoYXZlT3duUHJvcGVydHlcIiwgYXNzZXJ0T3duUHJvcGVydHkpO1xuZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGRlc2NyaXB0b3IsIG1zZykge1xuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtc2cgPSBkZXNjcmlwdG9yO1xuICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICB9XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBhY3R1YWxEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qob2JqKSwgbmFtZSk7XG4gIGxldCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgaWYgKGFjdHVhbERlc2NyaXB0b3IgJiYgZGVzY3JpcHRvcikge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXFsKGRlc2NyaXB0b3IsIGFjdHVhbERlc2NyaXB0b3IpLFxuICAgICAgXCJleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIFwiICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvbiAje3RoaXN9IHRvIG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvcikgKyBcIiwgZ290IFwiICsgaW5zcGVjdDIoYWN0dWFsRGVzY3JpcHRvciksXG4gICAgICBcImV4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgXCIgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9uICN7dGhpc30gdG8gbm90IG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvciksXG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIHRydWVcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBhY3R1YWxEZXNjcmlwdG9yKTtcbn1cbl9fbmFtZShhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIFwiYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5RGVzY3JpcHRvclwiLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcbmZ1bmN0aW9uIGFzc2VydExlbmd0aENoYWluKCkge1xuICBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIsIHRydWUpO1xufVxuX19uYW1lKGFzc2VydExlbmd0aENoYWluLCBcImFzc2VydExlbmd0aENoYWluXCIpO1xuZnVuY3Rpb24gYXNzZXJ0TGVuZ3RoKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICBzd2l0Y2ggKG9ialR5cGUpIHtcbiAgICBjYXNlIFwibWFwXCI6XG4gICAgY2FzZSBcInNldFwiOlxuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXRlbXNDb3VudCA9PSBuLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3tleHB9IGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3thY3R9XCIsXG4gICAgbixcbiAgICBpdGVtc0NvdW50XG4gICk7XG59XG5fX25hbWUoYXNzZXJ0TGVuZ3RoLCBcImFzc2VydExlbmd0aFwiKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJsZW5ndGhcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwibGVuZ3RoT2ZcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5mdW5jdGlvbiBhc3NlcnRNYXRjaChyZSwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHJlLmV4ZWMob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbWF0Y2ggXCIgKyByZSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIG1hdGNoIFwiICsgcmVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRNYXRjaCwgXCJhc3NlcnRNYXRjaFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtYXRjaFwiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibWF0Y2hlc1wiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic3RyaW5nXCIsIGZ1bmN0aW9uKHN0ciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwic3RyaW5nXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB+b2JqLmluZGV4T2Yoc3RyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBcIiArIGluc3BlY3QyKHN0ciksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIFwiICsgaW5zcGVjdDIoc3RyKVxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRLZXlzKGtleXMpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLCBrZXlzVHlwZSA9IHR5cGUoa2V5cyksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgc3RyLCBkZWVwU3RyID0gXCJcIiwgYWN0dWFsLCBvayA9IHRydWUsIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCI7XG4gIGxldCBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgXCJ3aGVuIHRlc3Rpbmcga2V5cyBhZ2FpbnN0IGFuIG9iamVjdCBvciBhbiBhcnJheSB5b3UgbXVzdCBnaXZlIGEgc2luZ2xlIEFycmF5fE9iamVjdHxTdHJpbmcgYXJndW1lbnQgb3IgbXVsdGlwbGUgU3RyaW5nIGFyZ3VtZW50c1wiO1xuICBpZiAob2JqVHlwZSA9PT0gXCJNYXBcIiB8fCBvYmpUeXBlID09PSBcIlNldFwiKSB7XG4gICAgZGVlcFN0ciA9IGlzRGVlcCA/IFwiZGVlcGx5IFwiIDogXCJcIjtcbiAgICBhY3R1YWwgPSBbXTtcbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgYWN0dWFsLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBpZiAoa2V5c1R5cGUgIT09IFwiQXJyYXlcIikge1xuICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFjdHVhbCA9IGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG4gICAgc3dpdGNoIChrZXlzVHlwZSkge1xuICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIH1cbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzeW1ib2xcIiA/IHZhbCA6IFN0cmluZyh2YWwpO1xuICAgIH0pO1xuICB9XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArIFwia2V5cyByZXF1aXJlZFwiLCB2b2lkIDAsIHNzZmkpO1xuICB9XG4gIGxldCBsZW4gPSBrZXlzLmxlbmd0aCwgYW55ID0gZmxhZzIodGhpcywgXCJhbnlcIiksIGFsbCA9IGZsYWcyKHRoaXMsIFwiYWxsXCIpLCBleHBlY3RlZCA9IGtleXMsIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgaWYgKCFhbnkgJiYgIWFsbCkge1xuICAgIGFsbCA9IHRydWU7XG4gIH1cbiAgaWYgKGFueSkge1xuICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBpZiAoYWxsKSB7XG4gICAgb2sgPSBleHBlY3RlZC5ldmVyeShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIWZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikpIHtcbiAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGxlbiA+IDEpIHtcbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gaW5zcGVjdDIoa2V5KTtcbiAgICB9KTtcbiAgICBsZXQgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgYW5kIFwiICsgbGFzdDtcbiAgICB9XG4gICAgaWYgKGFueSkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgb3IgXCIgKyBsYXN0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHIgPSBpbnNwZWN0MihrZXlzWzBdKTtcbiAgfVxuICBzdHIgPSAobGVuID4gMSA/IFwia2V5cyBcIiA6IFwia2V5IFwiKSArIHN0cjtcbiAgc3RyID0gKGZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikgPyBcImNvbnRhaW4gXCIgOiBcImhhdmUgXCIpICsgc3RyO1xuICB0aGlzLmFzc2VydChcbiAgICBvayxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgYWN0dWFsLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgdHJ1ZVxuICApO1xufVxuX19uYW1lKGFzc2VydEtleXMsIFwiYXNzZXJ0S2V5c1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJrZXlzXCIsIGFzc2VydEtleXMpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImtleVwiLCBhc3NlcnRLZXlzKTtcbmZ1bmN0aW9uIGFzc2VydFRocm93cyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSB8fCBmYWxzZTtcbiAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgaWYgKGlzUmVnRXhwMihlcnJvckxpa2UpIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgIGVycm9yTGlrZSA9IG51bGw7XG4gIH1cbiAgbGV0IGNhdWdodEVycjtcbiAgbGV0IGVycm9yV2FzVGhyb3duID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgb2JqKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yV2FzVGhyb3duID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnIgPSBlcnI7XG4gIH1cbiAgbGV0IGV2ZXJ5QXJnSXNVbmRlZmluZWQgPSBlcnJvckxpa2UgPT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyID09PSB2b2lkIDA7XG4gIGxldCBldmVyeUFyZ0lzRGVmaW5lZCA9IEJvb2xlYW4oZXJyb3JMaWtlICYmIGVyck1zZ01hdGNoZXIpO1xuICBsZXQgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICBsZXQgZXJyTXNnTWF0Y2hlckZhaWwgPSBmYWxzZTtcbiAgaWYgKGV2ZXJ5QXJnSXNVbmRlZmluZWQgfHwgIWV2ZXJ5QXJnSXNVbmRlZmluZWQgJiYgIW5lZ2F0ZSkge1xuICAgIGxldCBlcnJvckxpa2VTdHJpbmcgPSBcImFuIGVycm9yXCI7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBcIiN7ZXhwfVwiO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JMaWtlKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpO1xuICAgIH1cbiAgICBsZXQgYWN0dWFsID0gY2F1Z2h0RXJyO1xuICAgIGlmIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgYWN0dWFsID0gY2F1Z2h0RXJyLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2F1Z2h0RXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBhY3R1YWwgPSBjYXVnaHRFcnI7XG4gICAgfSBlbHNlIGlmIChjYXVnaHRFcnIgJiYgKHR5cGVvZiBjYXVnaHRFcnIgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhdWdodEVyciA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsID0gY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBlcnJvcldhc1Rocm93bixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyBcIiArIGVycm9yTGlrZVN0cmluZyxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIsXG4gICAgICBlcnJvckxpa2UgJiYgZXJyb3JMaWtlLnRvU3RyaW5nKCksXG4gICAgICBhY3R1YWxcbiAgICApO1xuICB9XG4gIGlmIChlcnJvckxpa2UgJiYgY2F1Z2h0RXJyKSB7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBsZXQgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVJbnN0YW5jZShcbiAgICAgICAgY2F1Z2h0RXJyLFxuICAgICAgICBlcnJvckxpa2VcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgJiYgIW5lZ2F0ZSA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgICBlcnJvckxpa2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNhdWdodEVyci50b1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihcbiAgICAgIGNhdWdodEVycixcbiAgICAgIGVycm9yTGlrZVxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID09PSBuZWdhdGUpIHtcbiAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd25cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHRocm93ICN7ZXhwfVwiICsgKGNhdWdodEVyciA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgICAgIGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2F1Z2h0RXJyICYmIGVyck1zZ01hdGNoZXIgIT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyICE9PSBudWxsKSB7XG4gICAgbGV0IHBsYWNlaG9sZGVyID0gXCJpbmNsdWRpbmdcIjtcbiAgICBpZiAoaXNSZWdFeHAyKGVyck1zZ01hdGNoZXIpKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IFwibWF0Y2hpbmdcIjtcbiAgICB9XG4gICAgbGV0IGlzQ29tcGF0aWJsZU1lc3NhZ2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVNZXNzYWdlKFxuICAgICAgY2F1Z2h0RXJyLFxuICAgICAgZXJyTXNnTWF0Y2hlclxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgaWYgKGV2ZXJ5QXJnSXNEZWZpbmVkICYmIG5lZ2F0ZSkge1xuICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3Igbm90IFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH1cIixcbiAgICAgICAgICBlcnJNc2dNYXRjaGVyLFxuICAgICAgICAgIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0TWVzc2FnZShjYXVnaHRFcnIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBuZWdhdGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgPyBcIiBidXQgI3thY3R9IHdhcyB0aHJvd25cIiA6IFwiXCIpLFxuICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgY2F1Z2h0RXJyIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnIudG9TdHJpbmcoKSA6IGNhdWdodEVyciAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBjYXVnaHRFcnIpO1xufVxuX19uYW1lKGFzc2VydFRocm93cywgXCJhc3NlcnRUaHJvd3NcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwidGhyb3dcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJ0aHJvd3NcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJUaHJvd1wiLCBhc3NlcnRUaHJvd3MpO1xuZnVuY3Rpb24gcmVzcG9uZFRvKG1ldGhvZCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGl0c2VsZiA9IGZsYWcyKHRoaXMsIFwiaXRzZWxmXCIpLCBjb250ZXh0ID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb2JqICYmICFpdHNlbGYgPyBvYmoucHJvdG90eXBlW21ldGhvZF0gOiBvYmpbbWV0aG9kXTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gcmVzcG9uZCB0byBcIiArIGluc3BlY3QyKG1ldGhvZCksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvIFwiICsgaW5zcGVjdDIobWV0aG9kKVxuICApO1xufVxuX19uYW1lKHJlc3BvbmRUbywgXCJyZXNwb25kVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZFRvXCIsIHJlc3BvbmRUbyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZHNUb1wiLCByZXNwb25kVG8pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiaXRzZWxmXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcIml0c2VsZlwiLCB0cnVlKTtcbn0pO1xuZnVuY3Rpb24gc2F0aXNmeShtYXRjaGVyLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgbGV0IHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgcmVzdWx0LFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5IFwiICsgb2JqRGlzcGxheShtYXRjaGVyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnlcIiArIG9iakRpc3BsYXkobWF0Y2hlciksXG4gICAgZmxhZzIodGhpcywgXCJuZWdhdGVcIikgPyBmYWxzZSA6IHRydWUsXG4gICAgcmVzdWx0XG4gICk7XG59XG5fX25hbWUoc2F0aXNmeSwgXCJzYXRpc2Z5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInNhdGlzZnlcIiwgc2F0aXNmeSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic2F0aXNmaWVzXCIsIHNhdGlzZnkpO1xuZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMubnVtZXJpYztcbiAgbGV0IG1lc3NhZ2UgPSBcIkEgYGRlbHRhYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChkZWx0YSA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZGVsdGEsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIG1lc3NhZ2UgPSBcIkEgYGV4cGVjdGVkYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChleHBlY3RlZCA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZXhwZWN0ZWQsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIGNvbnN0IGFicyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHgpID0+IHggPCAwID8gLXggOiB4LCBcImFic1wiKTtcbiAgY29uc3Qgc3RyaXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChudW1iZXIpID0+IHBhcnNlRmxvYXQocGFyc2VGbG9hdChudW1iZXIpLnRvUHJlY2lzaW9uKDEyKSksIFwic3RyaXBcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHN0cmlwKGFicyhvYmogLSBleHBlY3RlZCkpIDw9IGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGEsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShjbG9zZVRvLCBcImNsb3NlVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2xvc2VUb1wiLCBjbG9zZVRvKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhcHByb3hpbWF0ZWx5XCIsIGNsb3NlVG8pO1xuZnVuY3Rpb24gaXNTdWJzZXRPZihfc3Vic2V0LCBfc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgbGV0IHN1cGVyc2V0ID0gQXJyYXkuZnJvbShfc3VwZXJzZXQpO1xuICBsZXQgc3Vic2V0ID0gQXJyYXkuZnJvbShfc3Vic2V0KTtcbiAgaWYgKCFjb250YWlucykge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBzdXBlcnNldCA9IHN1cGVyc2V0LnNsaWNlKCk7XG4gIH1cbiAgcmV0dXJuIHN1YnNldC5ldmVyeShmdW5jdGlvbihlbGVtLCBpZHgpIHtcbiAgICBpZiAob3JkZXJlZCkgcmV0dXJuIGNtcCA/IGNtcChlbGVtLCBzdXBlcnNldFtpZHhdKSA6IGVsZW0gPT09IHN1cGVyc2V0W2lkeF07XG4gICAgaWYgKCFjbXApIHtcbiAgICAgIGxldCBtYXRjaElkeCA9IHN1cGVyc2V0LmluZGV4T2YoZWxlbSk7XG4gICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlcnNldC5zb21lKGZ1bmN0aW9uKGVsZW0yLCBtYXRjaElkeCkge1xuICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pO1xufVxuX19uYW1lKGlzU3Vic2V0T2YsIFwiaXNTdWJzZXRPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtZW1iZXJzXCIsIGZ1bmN0aW9uKHN1YnNldCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5pdGVyYWJsZTtcbiAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLml0ZXJhYmxlO1xuICBsZXQgY29udGFpbnMgPSBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIpO1xuICBsZXQgb3JkZXJlZCA9IGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiKTtcbiAgbGV0IHN1YmplY3QsIGZhaWxNc2csIGZhaWxOZWdhdGVNc2c7XG4gIGlmIChjb250YWlucykge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJhbiBvcmRlcmVkIHN1cGVyc2V0XCIgOiBcImEgc3VwZXJzZXRcIjtcbiAgICBmYWlsTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICAgIGZhaWxOZWdhdGVNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICB9IGVsc2Uge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJvcmRlcmVkIG1lbWJlcnNcIiA6IFwibWVtYmVyc1wiO1xuICAgIGZhaWxNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSB0aGUgc2FtZSBcIiArIHN1YmplY3QgKyBcIiBhcyAje2V4cH1cIjtcbiAgICBmYWlsTmVnYXRlTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIHRoZSBzYW1lIFwiICsgc3ViamVjdCArIFwiIGFzICN7ZXhwfVwiO1xuICB9XG4gIGxldCBjbXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIikgPyBmbGFnMih0aGlzLCBcImVxbFwiKSA6IHZvaWQgMDtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNTdWJzZXRPZihzdWJzZXQsIG9iaiwgY21wLCBjb250YWlucywgb3JkZXJlZCksXG4gICAgZmFpbE1zZyxcbiAgICBmYWlsTmVnYXRlTXNnLFxuICAgIHN1YnNldCxcbiAgICBvYmosXG4gICAgdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJpdGVyYWJsZVwiLCBmdW5jdGlvbihtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgb2JqICE9IHZvaWQgMCAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYW4gaXRlcmFibGVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGFuIGl0ZXJhYmxlXCIsXG4gICAgb2JqXG4gICk7XG59KTtcbmZ1bmN0aW9uIG9uZU9mKGxpc3QsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGV4cGVjdGVkID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGNvbnRhaW5zID0gZmxhZzIodGhpcywgXCJjb250YWluc1wiKSwgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgbmV3IEFzc2VydGlvbihsaXN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5hbihcImFycmF5XCIpO1xuICBpZiAoY29udGFpbnMpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQuaW5kZXhPZihwb3NzaWJpbGl0eSkgPiAtMTtcbiAgICAgIH0pLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGNvbnRhaW4gb25lIG9mICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIG9uZSBvZiAje2V4cH1cIixcbiAgICAgIGxpc3QsXG4gICAgICBleHBlY3RlZFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVlcCkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICAgIHJldHVybiBlcWwoZXhwZWN0ZWQsIHBvc3NpYmlsaXR5KTtcbiAgICAgICAgfSksXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH1cIixcbiAgICAgICAgbGlzdCxcbiAgICAgICAgZXhwZWN0ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBsaXN0LmluZGV4T2YoZXhwZWN0ZWQpID4gLTEsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBvbmUgb2YgI3tleHB9XCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBsaXN0LFxuICAgICAgICBleHBlY3RlZFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZShvbmVPZiwgXCJvbmVPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJvbmVPZlwiLCBvbmVPZik7XG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2VzKHN1YmplY3QsIHByb3AsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGZuID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgbGV0IGluaXRpYWw7XG4gIGlmICghcHJvcCkge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICB9XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImNoYW5nZVwiKTtcbiAgZmxhZzIodGhpcywgXCJyZWFsRGVsdGFcIiwgZmluYWwgIT09IGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBpbml0aWFsICE9PSBmaW5hbCxcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gY2hhbmdlXCIsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIG5vdCBjaGFuZ2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydENoYW5nZXMsIFwiYXNzZXJ0Q2hhbmdlc1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjaGFuZ2VcIiwgYXNzZXJ0Q2hhbmdlcyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2hhbmdlc1wiLCBhc3NlcnRDaGFuZ2VzKTtcbmZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImluY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBmaW5hbCAtIGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPiAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBpbmNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgaW5jcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydEluY3JlYXNlcywgXCJhc3NlcnRJbmNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5jcmVhc2VcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbmNyZWFzZXNcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImRlY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBpbml0aWFsIC0gZmluYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPCAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBkZWNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgZGVjcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydERlY3JlYXNlcywgXCJhc3NlcnREZWNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZGVjcmVhc2VcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJkZWNyZWFzZXNcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlbHRhKGRlbHRhLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBtc2dPYmogPSBmbGFnMih0aGlzLCBcImRlbHRhTXNnT2JqXCIpO1xuICBsZXQgaW5pdGlhbCA9IGZsYWcyKHRoaXMsIFwiaW5pdGlhbERlbHRhVmFsdWVcIik7XG4gIGxldCBmaW5hbCA9IGZsYWcyKHRoaXMsIFwiZmluYWxEZWx0YVZhbHVlXCIpO1xuICBsZXQgYmVoYXZpb3IgPSBmbGFnMih0aGlzLCBcImRlbHRhQmVoYXZpb3JcIik7XG4gIGxldCByZWFsRGVsdGEgPSBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiKTtcbiAgbGV0IGV4cHJlc3Npb247XG4gIGlmIChiZWhhdmlvciA9PT0gXCJjaGFuZ2VcIikge1xuICAgIGV4cHJlc3Npb24gPSBNYXRoLmFicyhmaW5hbCAtIGluaXRpYWwpID09PSBNYXRoLmFicyhkZWx0YSk7XG4gIH0gZWxzZSB7XG4gICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICB9XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGV4cHJlc3Npb24sXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIFwiICsgYmVoYXZpb3IgKyBcIiBieSBcIiArIGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgXCIgKyBiZWhhdmlvciArIFwiIGJ5IFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnREZWx0YSwgXCJhc3NlcnREZWx0YVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJieVwiLCBhc3NlcnREZWx0YSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleHRlbnNpYmxlXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc0V4dGVuc2libGUgPSBvYmogPT09IE9iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNFeHRlbnNpYmxlLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBleHRlbnNpYmxlXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwic2VhbGVkXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGlzU2VhbGVkLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBzZWFsZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImZyb3plblwiLCBmdW5jdGlvbigpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICBsZXQgaXNGcm96ZW4gPSBvYmogPT09IE9iamVjdChvYmopID8gT2JqZWN0LmlzRnJvemVuKG9iaikgOiB0cnVlO1xuICB0aGlzLmFzc2VydChcbiAgICBpc0Zyb3plbixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBmcm96ZW5cIlxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJmaW5pdGVcIiwgZnVuY3Rpb24oX21zZykge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHR5cGVvZiBvYmogPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYSBmaW5pdGUgbnVtYmVyXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhIGZpbml0ZSBudW1iZXJcIlxuICApO1xufSk7XG5mdW5jdGlvbiBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgaWYgKGV4cGVjdGVkID09PSBhY3R1YWwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdHVhbCAhPT0gdHlwZW9mIGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgIT09IFwib2JqZWN0XCIgfHwgZXhwZWN0ZWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQgPT09IGFjdHVhbDtcbiAgfVxuICBpZiAoIWFjdHVhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0dWFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoZnVuY3Rpb24oZXhwKSB7XG4gICAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oYWN0KSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlU3Vic2V0KGV4cCwgYWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkLmdldFRpbWUoKSA9PT0gYWN0dWFsLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoZXhwZWN0ZWQpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkge1xuICAgIGxldCBleHBlY3RlZFZhbHVlID0gZXhwZWN0ZWRba2V5XTtcbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBhY3R1YWxba2V5XTtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgZXhwZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBhY3R1YWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdWJzZXQoZXhwZWN0ZWRWYWx1ZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkVmFsdWUoYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWU7XG4gIH0pO1xufVxuX19uYW1lKGNvbXBhcmVTdWJzZXQsIFwiY29tcGFyZVN1YnNldFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjb250YWluU3Vic2V0XCIsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gIGNvbnN0IGFjdHVhbCA9IGZsYWcodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNob3dEaWZmID0gY29uZmlnLnNob3dEaWZmO1xuICB0aGlzLmFzc2VydChcbiAgICBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIGNvbnRhaW4gc3Vic2V0ICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIG5vdCBjb250YWluIHN1YnNldCAje2V4cH1cIixcbiAgICBleHBlY3RlZCxcbiAgICBhY3R1YWwsXG4gICAgc2hvd0RpZmZcbiAgKTtcbn0pO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvZXhwZWN0LmpzXG5mdW5jdGlvbiBleHBlY3QodmFsLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKHZhbCwgbWVzc2FnZSk7XG59XG5fX25hbWUoZXhwZWN0LCBcImV4cGVjdFwiKTtcbmV4cGVjdC5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICBhY3R1YWwgPSB2b2lkIDA7XG4gIH1cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJleHBlY3QuZmFpbCgpXCI7XG4gIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICBtZXNzYWdlLFxuICAgIHtcbiAgICAgIGFjdHVhbCxcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgb3BlcmF0b3JcbiAgICB9LFxuICAgIGV4cGVjdC5mYWlsXG4gICk7XG59O1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2Uvc2hvdWxkLmpzXG52YXIgc2hvdWxkX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNob3VsZF9leHBvcnRzLCB7XG4gIFNob3VsZDogKCkgPT4gU2hvdWxkLFxuICBzaG91bGQ6ICgpID0+IHNob3VsZFxufSk7XG5mdW5jdGlvbiBsb2FkU2hvdWxkKCkge1xuICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlciB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbCB8fCB0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcy52YWx1ZU9mKCksIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gIH1cbiAgX19uYW1lKHNob3VsZEdldHRlciwgXCJzaG91bGRHZXR0ZXJcIik7XG4gIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3VsZFwiLCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIF9fbmFtZShzaG91bGRTZXR0ZXIsIFwic2hvdWxkU2V0dGVyXCIpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgXCJzaG91bGRcIiwge1xuICAgIHNldDogc2hvdWxkU2V0dGVyLFxuICAgIGdldDogc2hvdWxkR2V0dGVyLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgbGV0IHNob3VsZDIgPSB7fTtcbiAgc2hvdWxkMi5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICBhY3R1YWwgPSB2b2lkIDA7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwic2hvdWxkLmZhaWwoKVwiO1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICB9LFxuICAgICAgc2hvdWxkMi5mYWlsXG4gICAgKTtcbiAgfTtcbiAgc2hvdWxkMi5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdHVhbCwgbWVzc2FnZSkudG8uZXF1YWwoZXhwZWN0ZWQpO1xuICB9O1xuICBzaG91bGQyLlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8uVGhyb3coZXJydCwgZXJycyk7XG4gIH07XG4gIHNob3VsZDIuZXhpc3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLmV4aXN0O1xuICB9O1xuICBzaG91bGQyLm5vdCA9IHt9O1xuICBzaG91bGQyLm5vdC5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0dWFsLCBtc2cpLnRvLm5vdC5lcXVhbChleHBlY3RlZCk7XG4gIH07XG4gIHNob3VsZDIubm90LlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICB9O1xuICBzaG91bGQyLm5vdC5leGlzdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmV4aXN0O1xuICB9O1xuICBzaG91bGQyW1widGhyb3dcIl0gPSBzaG91bGQyW1wiVGhyb3dcIl07XG4gIHNob3VsZDIubm90W1widGhyb3dcIl0gPSBzaG91bGQyLm5vdFtcIlRocm93XCJdO1xuICByZXR1cm4gc2hvdWxkMjtcbn1cbl9fbmFtZShsb2FkU2hvdWxkLCBcImxvYWRTaG91bGRcIik7XG52YXIgc2hvdWxkID0gbG9hZFNob3VsZDtcbnZhciBTaG91bGQgPSBsb2FkU2hvdWxkO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzXG5mdW5jdGlvbiBhc3NlcnQoZXhwcmVzcywgZXJybXNnKSB7XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgYXNzZXJ0LCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KGV4cHJlc3MsIGVycm1zZywgXCJbIG5lZ2F0aW9uIG1lc3NhZ2UgdW5hdmFpbGFibGUgXVwiKTtcbn1cbl9fbmFtZShhc3NlcnQsIFwiYXNzZXJ0XCIpO1xuYXNzZXJ0LmZhaWwgPSBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICBtZXNzYWdlID0gYWN0dWFsO1xuICAgIGFjdHVhbCA9IHZvaWQgMDtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSB8fCBcImFzc2VydC5mYWlsKClcIjtcbiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgIG1lc3NhZ2UsXG4gICAge1xuICAgICAgYWN0dWFsLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvcGVyYXRvclxuICAgIH0sXG4gICAgYXNzZXJ0LmZhaWxcbiAgKTtcbn07XG5hc3NlcnQuaXNPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09rLCB0cnVlKS5pcy5vaztcbn07XG5hc3NlcnQuaXNOb3RPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9rLCB0cnVlKS5pcy5ub3Qub2s7XG59O1xuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBsZXQgdGVzdDIgPSBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZXF1YWwsIHRydWUpO1xuICB0ZXN0Mi5hc3NlcnQoXG4gICAgZXhwID09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fVwiLFxuICAgIGV4cCxcbiAgICBhY3QsXG4gICAgdHJ1ZVxuICApO1xufTtcbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBtc2cpIHtcbiAgbGV0IHRlc3QyID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIGV4cCAhPSBmbGFnKHRlc3QyLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2FjdH1cIixcbiAgICBleHAsXG4gICAgYWN0LFxuICAgIHRydWVcbiAgKTtcbn07XG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbn07XG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG59O1xuYXNzZXJ0LmRlZXBFcXVhbCA9IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5kZWVwRXF1YWwsIHRydWUpLnRvLmVxbChleHApO1xufTtcbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3REZWVwRXF1YWwsIHRydWUpLnRvLm5vdC5lcWwoZXhwKTtcbn07XG5hc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uKHZhbCwgYWJ2LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG59O1xuYXNzZXJ0LmlzQXRMZWFzdCA9IGZ1bmN0aW9uKHZhbCwgYXRsc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdExlYXN0LCB0cnVlKS50by5iZS5sZWFzdChhdGxzdCk7XG59O1xuYXNzZXJ0LmlzQmVsb3cgPSBmdW5jdGlvbih2YWwsIGJsdywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0JlbG93LCB0cnVlKS50by5iZS5iZWxvdyhibHcpO1xufTtcbmFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uKHZhbCwgYXRtc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xufTtcbmFzc2VydC5pc1RydWUgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNUcnVlLCB0cnVlKS5pc1tcInRydWVcIl07XG59O1xuYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbn07XG5hc3NlcnQuaXNGYWxzZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0ZhbHNlLCB0cnVlKS5pc1tcImZhbHNlXCJdO1xufTtcbmFzc2VydC5pc05vdEZhbHNlID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90RmFsc2UsIHRydWUpLnRvLm5vdC5lcXVhbChmYWxzZSk7XG59O1xuYXNzZXJ0LmlzTnVsbCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bGwsIHRydWUpLnRvLmVxdWFsKG51bGwpO1xufTtcbmFzc2VydC5pc05vdE51bGwgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdWxsLCB0cnVlKS50by5ub3QuZXF1YWwobnVsbCk7XG59O1xuYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG59O1xuYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xufTtcbmFzc2VydC5leGlzdHMgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuZXhpc3RzLCB0cnVlKS50by5leGlzdDtcbn07XG5hc3NlcnQubm90RXhpc3RzID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEV4aXN0cywgdHJ1ZSkudG8ubm90LmV4aXN0O1xufTtcbmFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodm9pZCAwKTtcbn07XG5hc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHZvaWQgMCk7XG59O1xuYXNzZXJ0LmlzQ2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNDYWxsYWJsZSwgdHJ1ZSkuaXMuY2FsbGFibGU7XG59O1xuYXNzZXJ0LmlzTm90Q2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNOb3RDYWxsYWJsZSwgdHJ1ZSkuaXMubm90LmNhbGxhYmxlO1xufTtcbmFzc2VydC5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09iamVjdCwgdHJ1ZSkudG8uYmUuYShcIm9iamVjdFwiKTtcbn07XG5hc3NlcnQuaXNOb3RPYmplY3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RPYmplY3QsIHRydWUpLnRvLm5vdC5iZS5hKFwib2JqZWN0XCIpO1xufTtcbmFzc2VydC5pc0FycmF5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXJyYXksIHRydWUpLnRvLmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzTm90QXJyYXkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RBcnJheSwgdHJ1ZSkudG8ubm90LmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKFwic3RyaW5nXCIpO1xufTtcbmFzc2VydC5pc05vdFN0cmluZyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFN0cmluZywgdHJ1ZSkudG8ubm90LmJlLmEoXCJzdHJpbmdcIik7XG59O1xuYXNzZXJ0LmlzTnVtYmVyID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTnVtYmVyLCB0cnVlKS50by5iZS5hKFwibnVtYmVyXCIpO1xufTtcbmFzc2VydC5pc05vdE51bWJlciA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWJlciwgdHJ1ZSkudG8ubm90LmJlLmEoXCJudW1iZXJcIik7XG59O1xuYXNzZXJ0LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWVyaWMsIHRydWUpLmlzLm51bWVyaWM7XG59O1xuYXNzZXJ0LmlzTm90TnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWVyaWMsIHRydWUpLmlzLm5vdC5udW1lcmljO1xufTtcbmFzc2VydC5pc0Zpbml0ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0Zpbml0ZSwgdHJ1ZSkudG8uYmUuZmluaXRlO1xufTtcbmFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKFwiYm9vbGVhblwiKTtcbn07XG5hc3NlcnQuaXNOb3RCb29sZWFuID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90Qm9vbGVhbiwgdHJ1ZSkudG8ubm90LmJlLmEoXCJib29sZWFuXCIpO1xufTtcbmFzc2VydC50eXBlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LnR5cGVPZiwgdHJ1ZSkudG8uYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lm5vdFR5cGVPZiA9IGZ1bmN0aW9uKHZhbHVlLCB0eXBlMywgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lmluc3RhbmNlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lmluc3RhbmNlT2YsIHRydWUpLnRvLmJlLmluc3RhbmNlT2YodHlwZTMpO1xufTtcbmFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24odmFsLCB0eXBlMywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5ub3RJbnN0YW5jZU9mLCB0cnVlKS50by5ub3QuYmUuaW5zdGFuY2VPZihcbiAgICB0eXBlM1xuICApO1xufTtcbmFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5ub3RJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZSwgdHJ1ZSkubm90LmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQuZGVlcEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwSW5jbHVkZSwgdHJ1ZSkuZGVlcC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcEluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubmVzdGVkSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUsIHRydWUpLm5lc3RlZC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlLCB0cnVlKS5ub3QubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUsIHRydWUpLmRlZXAubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIGV4cCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlLFxuICAgIHRydWVcbiAgKS5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubm90T3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5kZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBPd25JbmNsdWRlLCB0cnVlKS5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLm93bi5pbmNsdWRlKFxuICAgIGluY1xuICApO1xufTtcbmFzc2VydC5tYXRjaCA9IGZ1bmN0aW9uKGV4cCwgcmUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubWF0Y2gsIHRydWUpLnRvLm1hdGNoKHJlKTtcbn07XG5hc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbihleHAsIHJlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xufTtcbmFzc2VydC5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5wcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LnByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHlWYWwsIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCwgdHJ1ZSkudG8uaGF2ZS5kZWVwLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQub3duUHJvcGVydHksIHRydWUpLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5ub3RPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RPd25Qcm9wZXJ0eSwgdHJ1ZSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLm93bi5wcm9wZXJ0eShcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gICk7XG59O1xuYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuZGVlcC5vd24ucHJvcGVydHkocHJvcCwgdmFsdWUpO1xufTtcbmFzc2VydC5uZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90TmVzdGVkUHJvcGVydHksXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubmVzdGVkUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBOZXN0ZWRQcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uKGV4cCwgbGVuLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG59O1xuYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQuaGFzQWxsS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxLZXlzLCB0cnVlKS50by5oYXZlLmFsbC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5jb250YWluc0FsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuY29udGFpbnNBbGxLZXlzLCB0cnVlKS50by5jb250YWluLmFsbC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cywgdHJ1ZSkudG8ubm90LmhhdmUuYW55LmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzLCB0cnVlKS50by5ub3QuaGF2ZS5hbGwua2V5cyhcbiAgICBrZXlzXG4gICk7XG59O1xuYXNzZXJ0Lmhhc0FueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FueURlZXBLZXlzLCB0cnVlKS50by5oYXZlLmFueS5kZWVwLmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5oYXNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxEZWVwS2V5cywgdHJ1ZSkudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyxcbiAgICB0cnVlXG4gICkudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtc2cpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIGxldCBhc3NlcnRFcnIgPSBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC50aHJvd3MsIHRydWUpLnRvLnRocm93KFxuICAgIGVycm9yTGlrZSxcbiAgICBlcnJNc2dNYXRjaGVyXG4gICk7XG4gIHJldHVybiBmbGFnKGFzc2VydEVyciwgXCJvYmplY3RcIik7XG59O1xuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGZuLCBlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1lc3NhZ2UpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1lc3NhZ2UsIGFzc2VydC5kb2VzTm90VGhyb3csIHRydWUpLnRvLm5vdC50aHJvdyhcbiAgICBlcnJvckxpa2UsXG4gICAgZXJyTXNnTWF0Y2hlclxuICApO1xufTtcbmFzc2VydC5vcGVyYXRvciA9IGZ1bmN0aW9uKHZhbCwgb3BlcmF0b3IsIHZhbDIsIG1zZykge1xuICBsZXQgb2s7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlIFwiPT1cIjpcbiAgICAgIG9rID0gdmFsID09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPT09XCI6XG4gICAgICBvayA9IHZhbCA9PT0gdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCI+XCI6XG4gICAgICBvayA9IHZhbCA+IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPj1cIjpcbiAgICAgIG9rID0gdmFsID49IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPFwiOlxuICAgICAgb2sgPSB2YWwgPCB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIjw9XCI6XG4gICAgICBvayA9IHZhbCA8PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9XCI6XG4gICAgICBvayA9IHZhbCAhPSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9PVwiOlxuICAgICAgb2sgPSB2YWwgIT09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbXNnID0gbXNnID8gbXNnICsgXCI6IFwiIDogbXNnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2cgKyAnSW52YWxpZCBvcGVyYXRvciBcIicgKyBvcGVyYXRvciArICdcIicsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgYXNzZXJ0Lm9wZXJhdG9yXG4gICAgICApO1xuICB9XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24ob2ssIG1zZywgYXNzZXJ0Lm9wZXJhdG9yLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIHRydWUgPT09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBpbnNwZWN0Mih2YWwpICsgXCIgdG8gYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMiksXG4gICAgXCJleHBlY3RlZCBcIiArIGluc3BlY3QyKHZhbCkgKyBcIiB0byBub3QgYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMilcbiAgKTtcbn07XG5hc3NlcnQuY2xvc2VUbyA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5jbG9zZVRvLCB0cnVlKS50by5iZS5jbG9zZVRvKGV4cCwgZGVsdGEpO1xufTtcbmFzc2VydC5hcHByb3hpbWF0ZWx5ID0gZnVuY3Rpb24oYWN0LCBleHAsIGRlbHRhLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmFwcHJveGltYXRlbHksIHRydWUpLnRvLmJlLmFwcHJveGltYXRlbHkoXG4gICAgZXhwLFxuICAgIGRlbHRhXG4gICk7XG59O1xuYXNzZXJ0LnNhbWVNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU1lbWJlcnMsIHRydWUpLnRvLmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIHNldDEsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RTYW1lTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5zYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5zYW1lLmRlZXAubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKS50by5pbmNsdWRlLm1lbWJlcnMoXG4gICAgc3Vic2V0XG4gICk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm9uZU9mID0gZnVuY3Rpb24oaW5MaXN0LCBsaXN0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihpbkxpc3QsIG1zZywgYXNzZXJ0Lm9uZU9mLCB0cnVlKS50by5iZS5vbmVPZihsaXN0KTtcbn07XG5hc3NlcnQuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIGlmIChvYmogPT0gdm9pZCAwIHx8ICFvYmpbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgIG1zZyA9IG1zZyA/IGAke21zZ30gZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWAgOiBgZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWA7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZywgdm9pZCAwLCBhc3NlcnQuaXNJdGVyYWJsZSk7XG4gIH1cbn07XG5hc3NlcnQuY2hhbmdlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXMsIHRydWUpLnRvLmNoYW5nZShvYmosIHByb3ApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRvZXNOb3RDaGFuZ2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdENoYW5nZSwgdHJ1ZSkudG8ubm90LmNoYW5nZShcbiAgICBvYmosXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlcywgdHJ1ZSkudG8uaW5jcmVhc2Uob2JqLCBwcm9wKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kb2VzTm90SW5jcmVhc2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdEluY3JlYXNlLCB0cnVlKS50by5ub3QuaW5jcmVhc2UoXG4gICAgb2JqLFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnV0Lm5vdC5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXMsIHRydWUpLnRvLmRlY3JlYXNlKG9iaiwgcHJvcCk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlc0J5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlc0J5LCB0cnVlKS50by5kZWNyZWFzZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKFxuICAgIG9iaixcbiAgICBwcm9wXG4gICk7XG59O1xuYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90RGVjcmVhc2VCeSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbGV0IHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSwgdHJ1ZSkudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodmFsKSB7XG4gICAgdGhyb3cgdmFsO1xuICB9XG59O1xuYXNzZXJ0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0V4dGVuc2libGUsIHRydWUpLnRvLmJlLmV4dGVuc2libGU7XG59O1xuYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdEV4dGVuc2libGUsIHRydWUpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xufTtcbmFzc2VydC5pc1NlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc1NlYWxlZCwgdHJ1ZSkudG8uYmUuc2VhbGVkO1xufTtcbmFzc2VydC5pc05vdFNlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdFNlYWxlZCwgdHJ1ZSkudG8ubm90LmJlLnNlYWxlZDtcbn07XG5hc3NlcnQuaXNGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNGcm96ZW4sIHRydWUpLnRvLmJlLmZyb3plbjtcbn07XG5hc3NlcnQuaXNOb3RGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RGcm96ZW4sIHRydWUpLnRvLm5vdC5iZS5mcm96ZW47XG59O1xuYXNzZXJ0LmlzRW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNFbXB0eSwgdHJ1ZSkudG8uYmUuZW1wdHk7XG59O1xuYXNzZXJ0LmlzTm90RW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RFbXB0eSwgdHJ1ZSkudG8ubm90LmJlLmVtcHR5O1xufTtcbmFzc2VydC5jb250YWluc1N1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8uY29udGFpblN1YnNldChleHApO1xufTtcbmFzc2VydC5kb2VzTm90Q29udGFpblN1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmNvbnRhaW5TdWJzZXQoZXhwKTtcbn07XG52YXIgYWxpYXNlcyA9IFtcbiAgW1wiaXNPa1wiLCBcIm9rXCJdLFxuICBbXCJpc05vdE9rXCIsIFwibm90T2tcIl0sXG4gIFtcInRocm93c1wiLCBcInRocm93XCJdLFxuICBbXCJ0aHJvd3NcIiwgXCJUaHJvd1wiXSxcbiAgW1wiaXNFeHRlbnNpYmxlXCIsIFwiZXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNOb3RFeHRlbnNpYmxlXCIsIFwibm90RXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNTZWFsZWRcIiwgXCJzZWFsZWRcIl0sXG4gIFtcImlzTm90U2VhbGVkXCIsIFwibm90U2VhbGVkXCJdLFxuICBbXCJpc0Zyb3plblwiLCBcImZyb3plblwiXSxcbiAgW1wiaXNOb3RGcm96ZW5cIiwgXCJub3RGcm96ZW5cIl0sXG4gIFtcImlzRW1wdHlcIiwgXCJlbXB0eVwiXSxcbiAgW1wiaXNOb3RFbXB0eVwiLCBcIm5vdEVtcHR5XCJdLFxuICBbXCJpc0NhbGxhYmxlXCIsIFwiaXNGdW5jdGlvblwiXSxcbiAgW1wiaXNOb3RDYWxsYWJsZVwiLCBcImlzTm90RnVuY3Rpb25cIl0sXG4gIFtcImNvbnRhaW5zU3Vic2V0XCIsIFwiY29udGFpblN1YnNldFwiXVxuXTtcbmZvciAoY29uc3QgW25hbWUsIGFzXSBvZiBhbGlhc2VzKSB7XG4gIGFzc2VydFthc10gPSBhc3NlcnRbbmFtZV07XG59XG5cbi8vIGxpYi9jaGFpLmpzXG52YXIgdXNlZCA9IFtdO1xuZnVuY3Rpb24gdXNlKGZuKSB7XG4gIGNvbnN0IGV4cG9ydHMgPSB7XG4gICAgdXNlLFxuICAgIEFzc2VydGlvbkVycm9yLFxuICAgIHV0aWw6IHV0aWxzX2V4cG9ydHMsXG4gICAgY29uZmlnLFxuICAgIGV4cGVjdCxcbiAgICBhc3NlcnQsXG4gICAgQXNzZXJ0aW9uLFxuICAgIC4uLnNob3VsZF9leHBvcnRzXG4gIH07XG4gIGlmICghfnVzZWQuaW5kZXhPZihmbikpIHtcbiAgICBmbihleHBvcnRzLCB1dGlsc19leHBvcnRzKTtcbiAgICB1c2VkLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBleHBvcnRzO1xufVxuX19uYW1lKHVzZSwgXCJ1c2VcIik7XG5leHBvcnQge1xuICBBc3NlcnRpb24sXG4gIEFzc2VydGlvbkVycm9yLFxuICBTaG91bGQsXG4gIGFzc2VydCxcbiAgY29uZmlnLFxuICBleHBlY3QsXG4gIHNob3VsZCxcbiAgdXNlLFxuICB1dGlsc19leHBvcnRzIGFzIHV0aWxcbn07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLElBQUksWUFBWSxPQUFPO0FBQ3ZCLElBQUksbUJBQW1CLEtBQUssS0FBSyxVQUFVLE9BQU8sTUFBTSxVQUFVLEtBQUssS0FBSztDQUFFLFlBQVk7Q0FBTSxjQUFjO0NBQU0sVUFBVTtDQUFNO0FBQU0sQ0FBQyxJQUFJLElBQUksT0FBTztBQUMxSixJQUFJLFVBQVUsUUFBUSxVQUFVLFVBQVUsUUFBUSxRQUFRO0NBQUU7Q0FBTyxjQUFjO0FBQUssQ0FBQztBQUN2RixJQUFJLFlBQVksUUFBUSxRQUFRO0NBQzlCLEtBQUssSUFBSSxRQUFRLEtBQ2YsVUFBVSxRQUFRLE1BQU07RUFBRSxLQUFLLElBQUk7RUFBTyxZQUFZO0NBQUssQ0FBQztBQUNoRTtBQUNBLElBQUksaUJBQWlCLEtBQUssS0FBSyxVQUFVLGdCQUFnQixLQUFLLE9BQU8sUUFBUSxXQUFXLE1BQU0sS0FBSyxLQUFLLEtBQUs7QUFHN0csSUFBSSxnQkFBZ0IsQ0FBQztBQUNyQixTQUFTLGVBQWU7Q0FDdEIsMEJBQTBCO0NBQzFCLHNCQUFzQjtDQUN0QixpQkFBaUI7Q0FDakIsbUJBQW1CO0NBQ25CLGtCQUFrQjtDQUNsQix3QkFBd0I7Q0FDeEIsV0FBVztDQUNYLGNBQWM7Q0FDZCxtQkFBbUI7Q0FDbkIsWUFBWTtDQUNaLGlCQUFpQjtDQUNqQixrQkFBa0I7Q0FDbEIsZUFBZTtDQUNmLG1CQUFtQjtDQUNuQixrQ0FBa0M7Q0FDbEMsdUNBQXVDO0NBQ3ZDLG1CQUFtQjtDQUNuQixtQkFBbUI7Q0FDbkIsZUFBZTtDQUNmLGFBQWE7Q0FDYixpQkFBaUI7Q0FDakIsc0JBQXNCO0NBQ3RCLGdCQUFnQjtDQUNoQixrQkFBa0I7Q0FDbEIsZ0NBQWdDO0NBQ2hDLHVCQUF1QjtDQUN2Qix5QkFBeUI7Q0FDekIsZUFBZTtDQUNmLFlBQVk7Q0FDWixxQkFBcUI7Q0FDckIsWUFBWTtBQUNkLENBQUM7QUFHRCxJQUFJLHNCQUFzQixDQUFDO0FBQzNCLFNBQVMscUJBQXFCO0NBQzVCLDZCQUE2QjtDQUM3QiwwQkFBMEI7Q0FDMUIseUJBQXlCO0NBQ3pCLDBCQUEwQjtDQUMxQixrQkFBa0I7QUFDcEIsQ0FBQztBQUNELFNBQVMsZ0JBQWdCLEtBQUs7Q0FDNUIsT0FBTyxlQUFlLFNBQVMsT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUFHLE1BQU07QUFDekU7QUFDQSxPQUFPLGlCQUFpQixpQkFBaUI7QUFDekMsU0FBUyxTQUFTLEtBQUs7Q0FDckIsT0FBTyxPQUFPLFVBQVUsU0FBUyxLQUFLLEdBQUcsTUFBTTtBQUNqRDtBQUNBLE9BQU8sVUFBVSxVQUFVO0FBQzNCLFNBQVMsbUJBQW1CLFFBQVEsV0FBVztDQUM3QyxPQUFPLGdCQUFnQixTQUFTLEtBQUssV0FBVztBQUNsRDtBQUNBLE9BQU8sb0JBQW9CLG9CQUFvQjtBQUMvQyxTQUFTLHNCQUFzQixRQUFRLFdBQVc7Q0FDaEQsSUFBSSxnQkFBZ0IsU0FBUyxHQUMzQixPQUFPLE9BQU8sZ0JBQWdCLFVBQVUsZUFBZSxrQkFBa0IsVUFBVTtNQUM5RSxLQUFLLE9BQU8sY0FBYyxZQUFZLE9BQU8sY0FBYyxlQUFlLFVBQVUsV0FDekYsT0FBTyxPQUFPLGdCQUFnQixhQUFhLGtCQUFrQjtDQUUvRCxPQUFPO0FBQ1Q7QUFDQSxPQUFPLHVCQUF1Qix1QkFBdUI7QUFDckQsU0FBUyxrQkFBa0IsUUFBUSxZQUFZO0NBQzdDLE1BQU0sbUJBQW1CLE9BQU8sV0FBVyxXQUFXLFNBQVMsT0FBTztDQUN0RSxJQUFJLFNBQVMsVUFBVSxHQUNyQixPQUFPLFdBQVcsS0FBSyxnQkFBZ0I7TUFDbEMsSUFBSSxPQUFPLGVBQWUsVUFDL0IsT0FBTyxpQkFBaUIsUUFBUSxVQUFVLE1BQU07Q0FFbEQsT0FBTztBQUNUO0FBQ0EsT0FBTyxtQkFBbUIsbUJBQW1CO0FBQzdDLFNBQVMsbUJBQW1CLFdBQVc7Q0FDckMsSUFBSSxrQkFBa0I7Q0FDdEIsSUFBSSxnQkFBZ0IsU0FBUyxHQUMzQixrQkFBa0IsVUFBVSxZQUFZO01BQ25DLElBQUksT0FBTyxjQUFjLFlBQVk7RUFDMUMsa0JBQWtCLFVBQVU7RUFDNUIsSUFBSSxvQkFBb0IsSUFFdEIsa0JBRDJCLElBQUksVUFBVSxDQUFDLENBQUMsUUFDSDtDQUU1QztDQUNBLE9BQU87QUFDVDtBQUNBLE9BQU8sb0JBQW9CLG9CQUFvQjtBQUMvQyxTQUFTLFdBQVcsV0FBVztDQUM3QixJQUFJLE1BQU07Q0FDVixJQUFJLGFBQWEsVUFBVSxTQUN6QixNQUFNLFVBQVU7TUFDWCxJQUFJLE9BQU8sY0FBYyxVQUM5QixNQUFNO0NBRVIsT0FBTztBQUNUO0FBQ0EsT0FBTyxZQUFZLFlBQVk7QUFHL0IsU0FBUyxLQUFLLEtBQUssS0FBSyxPQUFPO0NBQzdCLElBQUksUUFBUSxJQUFJLFlBQVksSUFBSSxVQUEwQix1QkFBTyxPQUFPLElBQUk7Q0FDNUUsSUFBSSxVQUFVLFdBQVcsR0FDdkIsTUFBTSxPQUFPO01BRWIsT0FBTyxNQUFNO0FBRWpCO0FBQ0EsT0FBTyxNQUFNLE1BQU07QUFHbkIsU0FBUyxLQUFLLEtBQUssTUFBTTtDQUN2QixJQUFJLFNBQVMsS0FBSyxLQUFLLFFBQVEsR0FBRyxPQUFPLEtBQUs7Q0FDOUMsT0FBTyxTQUFTLENBQUMsT0FBTztBQUMxQjtBQUNBLE9BQU8sTUFBTSxNQUFNO0FBR25CLFNBQVMsS0FBSyxLQUFLO0NBQ2pCLElBQUksT0FBTyxRQUFRLGFBQ2pCLE9BQU87Q0FFVCxJQUFJLFFBQVEsTUFDVixPQUFPO0NBRVQsTUFBTSxZQUFZLElBQUksT0FBTztDQUM3QixJQUFJLE9BQU8sY0FBYyxVQUN2QixPQUFPO0NBR1QsT0FEYyxPQUFPLFVBQVUsU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUNwRDtBQUNUO0FBQ0EsT0FBTyxNQUFNLE1BQU07QUFHbkIsSUFBSSxpQkFBaUIsdUJBQXVCO0FBQzVDLElBQUksa0JBQWtCLE1BQU0sd0JBQXdCLE1BQU07Q0FDeEQsWUFBWSxVQUFVLDhCQUE4QixPQUFPLEtBQUs7RUFDOUQsTUFBTSxPQUFPO0VBQ2IsY0FBYyxNQUFNLFNBQVM7RUFDN0IsS0FBSyxVQUFVO0VBQ2YsSUFBSSxnQkFDRixNQUFNLGtCQUFrQixNQUFNLE9BQU8sZUFBZTtFQUV0RCxLQUFLLE1BQU0sT0FBTyxPQUNoQixJQUFJLEVBQUUsT0FBTyxPQUNYLEtBQUssT0FBTyxNQUFNO0NBR3hCO0NBQ0EsSUFBSSxPQUFPO0VBQ1QsT0FBTztDQUNUO0NBQ0EsSUFBSSxLQUFLO0VBQ1AsT0FBTztDQUNUO0NBQ0EsT0FBTyxPQUFPO0VBQ1osT0FBTztHQUNMLEdBQUc7R0FDSCxNQUFNLEtBQUs7R0FDWCxTQUFTLEtBQUs7R0FDZCxJQUFJO0dBQ0osT0FBTyxVQUFVLFFBQVEsS0FBSyxRQUFRLEtBQUs7RUFDN0M7Q0FDRjtBQUNGO0FBQ0EsT0FBTyxpQkFBaUIsZ0JBQWdCO0FBQ3hDLElBQUksaUJBQWlCO0FBR3JCLFNBQVMsWUFBWSxLQUFLLE9BQU87Q0FDL0IsSUFBSSxVQUFVLEtBQUssS0FBSyxTQUFTO0NBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssTUFBTTtDQUMzQixVQUFVLFVBQVUsVUFBVSxPQUFPO0NBQ3JDLE1BQU0sS0FBSyxLQUFLLFFBQVE7Q0FDeEIsUUFBUSxNQUFNLElBQUksU0FBUyxHQUFHO0VBQzVCLE9BQU8sRUFBRSxZQUFZO0NBQ3ZCLENBQUM7Q0FDRCxNQUFNLEtBQUs7Q0FDWCxJQUFJLE1BQU0sTUFBTSxJQUFJLFNBQVMsR0FBRyxPQUFPO0VBQ3JDLElBQUksTUFBTSxDQUFDO0dBQUM7R0FBSztHQUFLO0dBQUs7R0FBSztFQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxPQUFPO0VBRW5FLFFBRFMsTUFBTSxTQUFTLEtBQUssVUFBVSxNQUFNLFNBQVMsSUFBSSxRQUFRLE1BQ3RELE1BQU0sTUFBTTtDQUMxQixDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7Q0FDWixJQUFJLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZO0NBQ3BDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxVQUFVO0VBQ2pDLE9BQU8sWUFBWTtDQUNyQixDQUFDLEdBQ0MsTUFBTSxJQUFJLGVBQ1IsVUFBVSwyQkFBMkIsTUFBTSxXQUFXLFVBQVUsVUFDaEUsS0FBSyxHQUNMLElBQ0Y7QUFFSjtBQUNBLE9BQU8sYUFBYSxhQUFhO0FBR2pDLFNBQVMsVUFBVSxLQUFLLE1BQU07Q0FDNUIsT0FBTyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtBQUN6QztBQUNBLE9BQU8sV0FBVyxXQUFXO0FBRzdCLElBQUksYUFBYTtDQUNmLE1BQU0sQ0FBQyxLQUFLLElBQUk7Q0FDaEIsS0FBSyxDQUFDLEtBQUssSUFBSTtDQUNmLFFBQVEsQ0FBQyxLQUFLLElBQUk7Q0FDbEIsV0FBVyxDQUFDLEtBQUssSUFBSTtDQUVyQixTQUFTLENBQUMsS0FBSyxJQUFJO0NBQ25CLFFBQVEsQ0FBQyxLQUFLLElBQUk7Q0FDbEIsUUFBUSxDQUFDLEtBQUssSUFBSTtDQUdsQixPQUFPLENBQUMsTUFBTSxJQUFJO0NBQ2xCLEtBQUssQ0FBQyxNQUFNLElBQUk7Q0FDaEIsT0FBTyxDQUFDLE1BQU0sSUFBSTtDQUNsQixRQUFRLENBQUMsTUFBTSxJQUFJO0NBQ25CLE1BQU0sQ0FBQyxNQUFNLElBQUk7Q0FDakIsU0FBUyxDQUFDLE1BQU0sSUFBSTtDQUNwQixNQUFNLENBQUMsTUFBTSxJQUFJO0NBQ2pCLE9BQU8sQ0FBQyxNQUFNLElBQUk7Q0FDbEIsYUFBYSxDQUFDLFFBQVEsSUFBSTtDQUMxQixXQUFXLENBQUMsUUFBUSxJQUFJO0NBQ3hCLGFBQWEsQ0FBQyxRQUFRLElBQUk7Q0FDMUIsY0FBYyxDQUFDLFFBQVEsSUFBSTtDQUMzQixZQUFZLENBQUMsUUFBUSxJQUFJO0NBQ3pCLGVBQWUsQ0FBQyxRQUFRLElBQUk7Q0FDNUIsWUFBWSxDQUFDLFFBQVEsSUFBSTtDQUN6QixhQUFhLENBQUMsUUFBUSxJQUFJO0NBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUk7QUFDbkI7QUFDQSxJQUFJLFNBQVM7Q0FDWCxTQUFTO0NBQ1QsUUFBUTtDQUNSLFFBQVE7Q0FDUixTQUFTO0NBQ1QsV0FBVztDQUNYLE1BQU07Q0FDTixRQUFRO0NBQ1IsUUFBUTtDQUNSLE1BQU07Q0FDTixRQUFRO0FBQ1Y7QUFDQSxJQUFJLFlBQVk7QUFDaEIsU0FBUyxTQUFTLE9BQU8sV0FBVztDQUNsQyxNQUFNLFFBQVEsV0FBVyxPQUFPLGVBQWUsV0FBVyxjQUFjO0NBQ3hFLElBQUksQ0FBQyxPQUNILE9BQU8sT0FBTyxLQUFLO0NBRXJCLE9BQU8sUUFBUSxNQUFNLEdBQUcsR0FBRyxPQUFPLEtBQUssRUFBRSxPQUFPLE1BQU0sR0FBRztBQUMzRDtBQUNBLE9BQU8sVUFBVSxVQUFVO0FBQzNCLFNBQVMsaUJBQWlCLEVBQ3hCLGFBQWEsT0FDYixRQUFRLEdBQ1IsU0FBUyxPQUNULGdCQUFnQixNQUNoQixZQUFZLE9BQ1osaUJBQWlCLFVBQ2pCLGNBQWMsVUFDZCxPQUFPLENBQUMsR0FFUixVQUFVLFlBQVksVUFDdEIsVUFBVSxXQUNSLENBQUMsR0FBRyxVQUFVO0NBQ2hCLE1BQU0sVUFBVTtFQUNkLFlBQVksUUFBUSxVQUFVO0VBQzlCLE9BQU8sT0FBTyxLQUFLO0VBQ25CLFFBQVEsUUFBUSxNQUFNO0VBQ3RCLGVBQWUsUUFBUSxhQUFhO0VBQ3BDLFdBQVcsUUFBUSxTQUFTO0VBQzVCLGdCQUFnQixPQUFPLGNBQWM7RUFDckMsYUFBYSxPQUFPLFdBQVc7RUFDL0IsVUFBVSxPQUFPLFNBQVM7RUFDMUI7RUFDQSxTQUFTO0VBQ1Q7Q0FDRjtDQUNBLElBQUksUUFBUSxRQUNWLFFBQVEsVUFBVTtDQUVwQixPQUFPO0FBQ1Q7QUFDQSxPQUFPLGtCQUFrQixrQkFBa0I7QUFDM0MsU0FBUyxnQkFBZ0IsTUFBTTtDQUM3QixPQUFPLFFBQVEsWUFBWSxRQUFRO0FBQ3JDO0FBQ0EsT0FBTyxpQkFBaUIsaUJBQWlCO0FBQ3pDLFNBQVMsU0FBUyxRQUFRLFFBQVEsT0FBTyxXQUFXO0NBQ2xELFNBQVMsT0FBTyxNQUFNO0NBQ3RCLE1BQU0sYUFBYSxLQUFLO0NBQ3hCLE1BQU0sZUFBZSxPQUFPO0NBQzVCLElBQUksYUFBYSxVQUFVLGVBQWUsWUFDeEMsT0FBTztDQUVULElBQUksZUFBZSxVQUFVLGVBQWUsWUFBWTtFQUN0RCxJQUFJLE1BQU0sU0FBUztFQUNuQixJQUFJLE1BQU0sS0FBSyxnQkFBZ0IsT0FBTyxNQUFNLEVBQUUsR0FDNUMsTUFBTSxNQUFNO0VBRWQsT0FBTyxHQUFHLE9BQU8sTUFBTSxHQUFHLEdBQUcsSUFBSTtDQUNuQztDQUNBLE9BQU87QUFDVDtBQUNBLE9BQU8sVUFBVSxVQUFVO0FBQzNCLFNBQVMsWUFBWSxNQUFNLFNBQVMsYUFBYSxZQUFZLE1BQU07Q0FDakUsY0FBYyxlQUFlLFFBQVE7Q0FDckMsTUFBTSxPQUFPLEtBQUs7Q0FDbEIsSUFBSSxTQUFTLEdBQ1gsT0FBTztDQUNULE1BQU0saUJBQWlCLFFBQVE7Q0FDL0IsSUFBSSxTQUFTO0NBQ2IsSUFBSSxPQUFPO0NBQ1gsSUFBSSxZQUFZO0NBQ2hCLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRztFQUNoQyxNQUFNLE9BQU8sSUFBSSxNQUFNLEtBQUs7RUFDNUIsTUFBTSxlQUFlLElBQUksTUFBTSxLQUFLO0VBQ3BDLFlBQVksR0FBRyxVQUFVLEdBQUcsS0FBSyxTQUFTLEVBQUU7RUFDNUMsTUFBTSxRQUFRLEtBQUs7RUFDbkIsUUFBUSxXQUFXLGlCQUFpQixPQUFPLFVBQVUsT0FBTyxJQUFJLFVBQVU7RUFDMUUsTUFBTSxTQUFTLFFBQVEsWUFBWSxPQUFPLE9BQU8sS0FBSyxPQUFPLEtBQUs7RUFDbEUsTUFBTSxhQUFhLE9BQU8sU0FBUyxPQUFPO0VBQzFDLE1BQU0sa0JBQWtCLGFBQWEsVUFBVTtFQUMvQyxJQUFJLFFBQVEsYUFBYSxrQkFBa0IsT0FBTyxTQUFTLFVBQVUsVUFBVSxnQkFDN0U7RUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixrQkFBa0IsZ0JBQzlDO0VBRUYsT0FBTyxPQUFPLEtBQUssWUFBWSxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssZUFBZSxLQUFLO0VBQzVFLElBQUksQ0FBQyxRQUFRLGdCQUFnQixrQkFBa0Isa0JBQWtCLGFBQWEsS0FBSyxTQUFTLGdCQUMxRjtFQUVGLFVBQVU7RUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixhQUFhLEtBQUssVUFBVSxnQkFBZ0I7R0FDeEUsWUFBWSxHQUFHLFVBQVUsR0FBRyxLQUFLLFNBQVMsSUFBSSxFQUFFO0dBQ2hEO0VBQ0Y7RUFDQSxZQUFZO0NBQ2Q7Q0FDQSxPQUFPLEdBQUcsU0FBUztBQUNyQjtBQUNBLE9BQU8sYUFBYSxhQUFhO0FBQ2pDLFNBQVMsZ0JBQWdCLEtBQUs7Q0FDNUIsSUFBSSxJQUFJLE1BQU0sMEJBQTBCLEdBQ3RDLE9BQU87Q0FFVCxPQUFPLEtBQUssVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLE1BQU0sS0FBSyxDQUFDLENBQUMsUUFBUSxRQUFRLElBQUcsQ0FBQyxDQUFDLFFBQVEsWUFBWSxHQUFHO0FBQzlGO0FBQ0EsT0FBTyxpQkFBaUIsaUJBQWlCO0FBQ3pDLFNBQVMsZ0JBQWdCLENBQUMsS0FBSyxRQUFRLFNBQVM7Q0FDOUMsUUFBUSxZQUFZO0NBQ3BCLElBQUksT0FBTyxRQUFRLFVBQ2pCLE1BQU0sZ0JBQWdCLEdBQUc7TUFDcEIsSUFBSSxPQUFPLFFBQVEsVUFDeEIsTUFBTSxJQUFJLFFBQVEsUUFBUSxLQUFLLE9BQU8sRUFBRTtDQUUxQyxRQUFRLFlBQVksSUFBSTtDQUN4QixRQUFRLFFBQVEsUUFBUSxPQUFPLE9BQU87Q0FDdEMsT0FBTyxHQUFHLElBQUksSUFBSTtBQUNwQjtBQUNBLE9BQU8saUJBQWlCLGlCQUFpQjtBQUd6QyxTQUFTLGFBQWEsT0FBTyxTQUFTO0NBQ3BDLE1BQU0scUJBQXFCLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxNQUFNLE1BQU0sTUFBTTtDQUNoRSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsbUJBQW1CLFFBQ3ZDLE9BQU87Q0FDVCxRQUFRLFlBQVk7Q0FDcEIsTUFBTSxlQUFlLFlBQVksT0FBTyxPQUFPO0NBQy9DLFFBQVEsWUFBWSxhQUFhO0NBQ2pDLElBQUksbUJBQW1CO0NBQ3ZCLElBQUksbUJBQW1CLFFBQ3JCLG1CQUFtQixZQUFZLG1CQUFtQixLQUFLLFFBQVEsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsU0FBUyxlQUFlO0NBRTdHLE9BQU8sS0FBSyxlQUFlLG1CQUFtQixLQUFLLHFCQUFxQixHQUFHO0FBQzdFO0FBQ0EsT0FBTyxjQUFjLGNBQWM7QUFHbkMsSUFBSSxlQUErQix3QkFBUSxVQUFVO0NBQ25ELElBQUksT0FBTyxXQUFXLGNBQWMsaUJBQWlCLFFBQ25ELE9BQU87Q0FFVCxJQUFJLE1BQU0sT0FBTyxjQUNmLE9BQU8sTUFBTSxPQUFPO0NBRXRCLE9BQU8sTUFBTSxZQUFZO0FBQzNCLEdBQUcsY0FBYztBQUNqQixTQUFTLGtCQUFrQixPQUFPLFNBQVM7Q0FDekMsTUFBTSxPQUFPLGFBQWEsS0FBSztDQUMvQixRQUFRLFlBQVksS0FBSyxTQUFTO0NBQ2xDLE1BQU0scUJBQXFCLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxNQUFNLE1BQU0sTUFBTTtDQUNoRSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsbUJBQW1CLFFBQ3ZDLE9BQU8sR0FBRyxLQUFLO0NBQ2pCLElBQUksU0FBUztDQUNiLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztFQUNyQyxNQUFNLFNBQVMsR0FBRyxRQUFRLFFBQVEsU0FBUyxNQUFNLElBQUksUUFBUSxRQUFRLEdBQUcsUUFBUSxJQUFJLE1BQU0sTUFBTSxTQUFTLElBQUksS0FBSztFQUNsSCxRQUFRLFlBQVksT0FBTztFQUMzQixJQUFJLE1BQU0sT0FBTyxNQUFNLFVBQVUsUUFBUSxZQUFZLEdBQUc7R0FDdEQsVUFBVSxHQUFHLFVBQVUsR0FBRyxNQUFNLFNBQVMsTUFBTSxLQUFLLEVBQUU7R0FDdEQ7RUFDRjtFQUNBLFVBQVU7Q0FDWjtDQUNBLElBQUksbUJBQW1CO0NBQ3ZCLElBQUksbUJBQW1CLFFBQ3JCLG1CQUFtQixZQUFZLG1CQUFtQixLQUFLLFFBQVEsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsU0FBUyxlQUFlO0NBRTdHLE9BQU8sR0FBRyxLQUFLLElBQUksU0FBUyxtQkFBbUIsS0FBSyxxQkFBcUIsR0FBRztBQUM5RTtBQUNBLE9BQU8sbUJBQW1CLG1CQUFtQjtBQUc3QyxTQUFTLFlBQVksWUFBWSxTQUFTO0NBQ3hDLE1BQU0sdUJBQXVCLFdBQVcsT0FBTztDQUMvQyxJQUFJLHlCQUF5QixNQUMzQixPQUFPO0NBRVQsTUFBTSxRQUFRLHFCQUFxQixNQUFNLEdBQUc7Q0FDNUMsTUFBTSxPQUFPLE1BQU07Q0FDbkIsT0FBTyxRQUFRLFFBQVEsR0FBRyxLQUFLLEdBQUcsU0FBUyxNQUFNLElBQUksUUFBUSxXQUFXLEtBQUssU0FBUyxDQUFDLEtBQUssTUFBTTtBQUNwRztBQUNBLE9BQU8sYUFBYSxhQUFhO0FBR2pDLFNBQVMsZ0JBQWdCLE1BQU0sU0FBUztDQUN0QyxNQUFNLGVBQWUsS0FBSyxPQUFPLGdCQUFnQjtDQUNqRCxNQUFNLE9BQU8sS0FBSztDQUNsQixJQUFJLENBQUMsTUFDSCxPQUFPLFFBQVEsUUFBUSxJQUFJLGFBQWEsSUFBSSxTQUFTO0NBRXZELE9BQU8sUUFBUSxRQUFRLElBQUksYUFBYSxHQUFHLFNBQVMsTUFBTSxRQUFRLFdBQVcsRUFBRSxFQUFFLElBQUksU0FBUztBQUNoRztBQUNBLE9BQU8saUJBQWlCLGlCQUFpQjtBQUd6QyxTQUFTLGdCQUFnQixDQUFDLEtBQUssUUFBUSxTQUFTO0NBQzlDLFFBQVEsWUFBWTtDQUNwQixNQUFNLFFBQVEsUUFBUSxLQUFLLE9BQU87Q0FDbEMsUUFBUSxZQUFZLElBQUk7Q0FDeEIsUUFBUSxRQUFRLFFBQVEsT0FBTyxPQUFPO0NBQ3RDLE9BQU8sR0FBRyxJQUFJLE1BQU07QUFDdEI7QUFDQSxPQUFPLGlCQUFpQixpQkFBaUI7QUFDekMsU0FBUyxhQUFhLEtBQUs7Q0FDekIsTUFBTSxVQUFVLENBQUM7Q0FDakIsSUFBSSxTQUFTLE9BQU8sUUFBUTtFQUMxQixRQUFRLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztDQUMzQixDQUFDO0NBQ0QsT0FBTztBQUNUO0FBQ0EsT0FBTyxjQUFjLGNBQWM7QUFDbkMsU0FBUyxXQUFXLEtBQUssU0FBUztDQUNoQyxJQUFJLElBQUksU0FBUyxHQUNmLE9BQU87Q0FDVCxRQUFRLFlBQVk7Q0FDcEIsT0FBTyxRQUFRLFlBQVksYUFBYSxHQUFHLEdBQUcsU0FBUyxlQUFlLEVBQUU7QUFDMUU7QUFDQSxPQUFPLFlBQVksWUFBWTtBQUcvQixJQUFJLFFBQVEsT0FBTyxXQUFXLE1BQU0sTUFBTTtBQUMxQyxTQUFTLGNBQWMsUUFBUSxTQUFTO0NBQ3RDLElBQUksTUFBTSxNQUFNLEdBQ2QsT0FBTyxRQUFRLFFBQVEsT0FBTyxRQUFRO0NBRXhDLElBQUksV0FBVyxVQUNiLE9BQU8sUUFBUSxRQUFRLFlBQVksUUFBUTtDQUU3QyxJQUFJLFdBQVcsV0FDYixPQUFPLFFBQVEsUUFBUSxhQUFhLFFBQVE7Q0FFOUMsSUFBSSxXQUFXLEdBQ2IsT0FBTyxRQUFRLFFBQVEsSUFBSSxXQUFXLFdBQVcsT0FBTyxNQUFNLFFBQVE7Q0FFeEUsT0FBTyxRQUFRLFFBQVEsU0FBUyxPQUFPLE1BQU0sR0FBRyxRQUFRLFFBQVEsR0FBRyxRQUFRO0FBQzdFO0FBQ0EsT0FBTyxlQUFlLGVBQWU7QUFHckMsU0FBUyxjQUFjLFFBQVEsU0FBUztDQUN0QyxJQUFJLE9BQU8sU0FBUyxPQUFPLFNBQVMsR0FBRyxRQUFRLFdBQVcsQ0FBQztDQUMzRCxJQUFJLFNBQVMsV0FDWCxRQUFRO0NBQ1YsT0FBTyxRQUFRLFFBQVEsTUFBTSxRQUFRO0FBQ3ZDO0FBQ0EsT0FBTyxlQUFlLGVBQWU7QUFHckMsU0FBUyxjQUFjLE9BQU8sU0FBUztDQUNyQyxNQUFNLFFBQVEsTUFBTSxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0NBQzFDLE1BQU0sZUFBZSxRQUFRLFlBQVksSUFBSSxNQUFNO0NBQ25ELE1BQU0sU0FBUyxNQUFNO0NBQ3JCLE9BQU8sUUFBUSxRQUFRLElBQUksU0FBUyxRQUFRLFlBQVksRUFBRSxHQUFHLFNBQVMsUUFBUTtBQUNoRjtBQUNBLE9BQU8sZUFBZSxlQUFlO0FBR3JDLFNBQVMsYUFBYSxNQUFNO0NBQzFCLE1BQU0sU0FBUyxDQUFDO0NBQ2hCLEtBQUssU0FBUyxVQUFVO0VBQ3RCLE9BQU8sS0FBSyxLQUFLO0NBQ25CLENBQUM7Q0FDRCxPQUFPO0FBQ1Q7QUFDQSxPQUFPLGNBQWMsY0FBYztBQUNuQyxTQUFTLFdBQVcsTUFBTSxTQUFTO0NBQ2pDLElBQUksS0FBSyxTQUFTLEdBQ2hCLE9BQU87Q0FDVCxRQUFRLFlBQVk7Q0FDcEIsT0FBTyxRQUFRLFlBQVksYUFBYSxJQUFJLEdBQUcsT0FBTyxFQUFFO0FBQzFEO0FBQ0EsT0FBTyxZQUFZLFlBQVk7QUFHL0IsSUFBSSxvQ0FBb0IsSUFBSSxPQUFPLG1KQUFtSixHQUFHO0FBQ3pMLElBQUksbUJBQW1CO0NBQ3JCLE1BQU07Q0FDTixLQUFLO0NBQ0wsTUFBTTtDQUNOLE1BQU07Q0FDTixNQUFNO0NBQ04sS0FBSztDQUNMLE1BQU07QUFDUjtBQUNBLElBQUksTUFBTTtBQUNWLElBQUksZ0JBQWdCO0FBQ3BCLFNBQVMsT0FBTyxNQUFNO0NBQ3BCLE9BQU8saUJBQWlCLFNBQVMsTUFBTSxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYTtBQUN2RztBQUNBLE9BQU8sUUFBUSxRQUFRO0FBQ3ZCLFNBQVMsY0FBYyxRQUFRLFNBQVM7Q0FDdEMsSUFBSSxrQkFBa0IsS0FBSyxNQUFNLEdBQy9CLFNBQVMsT0FBTyxRQUFRLG1CQUFtQixNQUFNO0NBRW5ELE9BQU8sUUFBUSxRQUFRLElBQUksU0FBUyxRQUFRLFFBQVEsV0FBVyxDQUFDLEVBQUUsSUFBSSxRQUFRO0FBQ2hGO0FBQ0EsT0FBTyxlQUFlLGVBQWU7QUFHckMsU0FBUyxjQUFjLE9BQU87Q0FDNUIsSUFBSSxpQkFBaUIsT0FBTyxXQUMxQixPQUFPLE1BQU0sY0FBYyxVQUFVLE1BQU0sWUFBWSxLQUFLO0NBRTlELE9BQU8sTUFBTSxTQUFTO0FBQ3hCO0FBQ0EsT0FBTyxlQUFlLGVBQWU7QUFJckMsSUFBSSxrQkFBa0IsZ0JBRGdCLGFBQWEsY0FBbUIsaUJBQ2hEO0FBR3RCLFNBQVMsY0FBYyxRQUFRLFNBQVM7Q0FDdEMsTUFBTSxhQUFhLE9BQU8sb0JBQW9CLE1BQU07Q0FDcEQsTUFBTSxVQUFVLE9BQU8sd0JBQXdCLE9BQU8sc0JBQXNCLE1BQU0sSUFBSSxDQUFDO0NBQ3ZGLElBQUksV0FBVyxXQUFXLEtBQUssUUFBUSxXQUFXLEdBQ2hELE9BQU87Q0FFVCxRQUFRLFlBQVk7Q0FDcEIsUUFBUSxPQUFPLFFBQVEsUUFBUSxDQUFDO0NBQ2hDLElBQUksUUFBUSxLQUFLLFNBQVMsTUFBTSxHQUM5QixPQUFPO0NBRVQsUUFBUSxLQUFLLEtBQUssTUFBTTtDQUN4QixNQUFNLG1CQUFtQixZQUFZLFdBQVcsS0FBSyxRQUFRLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxHQUFHLFNBQVMsZUFBZTtDQUMxRyxNQUFNLGlCQUFpQixZQUFZLFFBQVEsS0FBSyxRQUFRLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxHQUFHLFNBQVMsZUFBZTtDQUNyRyxRQUFRLEtBQUssSUFBSTtDQUNqQixJQUFJLE1BQU07Q0FDVixJQUFJLG9CQUFvQixnQkFDdEIsTUFBTTtDQUVSLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxlQUFlO0FBQ3REO0FBQ0EsT0FBTyxlQUFlLGVBQWU7QUFHckMsSUFBSSxjQUFjLE9BQU8sV0FBVyxlQUFlLE9BQU8sY0FBYyxPQUFPLGNBQWM7QUFDN0YsU0FBUyxhQUFhLE9BQU8sU0FBUztDQUNwQyxJQUFJLE9BQU87Q0FDWCxJQUFJLGVBQWUsZUFBZSxPQUNoQyxPQUFPLE1BQU07Q0FFZixPQUFPLFFBQVEsTUFBTSxZQUFZO0NBQ2pDLElBQUksQ0FBQyxRQUFRLFNBQVMsVUFDcEIsT0FBTztDQUVULFFBQVEsWUFBWSxLQUFLO0NBQ3pCLE9BQU8sR0FBRyxPQUFPLGNBQWMsT0FBTyxPQUFPO0FBQy9DO0FBQ0EsT0FBTyxjQUFjLGNBQWM7QUFHbkMsU0FBUyxpQkFBaUIsTUFBTSxTQUFTO0NBQ3ZDLElBQUksS0FBSyxXQUFXLEdBQ2xCLE9BQU87Q0FDVCxRQUFRLFlBQVk7Q0FDcEIsT0FBTyxjQUFjLFlBQVksTUFBTSxPQUFPLEVBQUU7QUFDbEQ7QUFDQSxPQUFPLGtCQUFrQixrQkFBa0I7QUFHM0MsSUFBSSxZQUFZO0NBQ2Q7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGO0FBQ0EsU0FBUyxlQUFlLE9BQU8sU0FBUztDQUN0QyxNQUFNLGFBQWEsT0FBTyxvQkFBb0IsS0FBSyxDQUFDLENBQUMsUUFBUSxRQUFRLFVBQVUsUUFBUSxHQUFHLE1BQU0sRUFBRTtDQUNsRyxNQUFNLE9BQU8sTUFBTTtDQUNuQixRQUFRLFlBQVksS0FBSztDQUN6QixJQUFJLFVBQVU7Q0FDZCxJQUFJLE9BQU8sTUFBTSxZQUFZLFVBQzNCLFVBQVUsU0FBUyxNQUFNLFNBQVMsUUFBUSxRQUFRO01BRWxELFdBQVcsUUFBUSxTQUFTO0NBRTlCLFVBQVUsVUFBVSxLQUFLLFlBQVk7Q0FDckMsUUFBUSxZQUFZLFFBQVEsU0FBUztDQUNyQyxRQUFRLE9BQU8sUUFBUSxRQUFRLENBQUM7Q0FDaEMsSUFBSSxRQUFRLEtBQUssU0FBUyxLQUFLLEdBQzdCLE9BQU87Q0FFVCxRQUFRLEtBQUssS0FBSyxLQUFLO0NBQ3ZCLE1BQU0sbUJBQW1CLFlBQVksV0FBVyxLQUFLLFFBQVEsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsU0FBUyxlQUFlO0NBQ3pHLE9BQU8sR0FBRyxPQUFPLFVBQVUsbUJBQW1CLE1BQU0saUJBQWlCLE1BQU07QUFDN0U7QUFDQSxPQUFPLGdCQUFnQixlQUFlO0FBR3RDLFNBQVMsaUJBQWlCLENBQUMsS0FBSyxRQUFRLFNBQVM7Q0FDL0MsUUFBUSxZQUFZO0NBQ3BCLElBQUksQ0FBQyxPQUNILE9BQU8sR0FBRyxRQUFRLFFBQVEsT0FBTyxHQUFHLEdBQUcsUUFBUTtDQUVqRCxPQUFPLEdBQUcsUUFBUSxRQUFRLE9BQU8sR0FBRyxHQUFHLFFBQVEsRUFBRSxHQUFHLFFBQVEsUUFBUSxJQUFJLE1BQU0sSUFBSSxRQUFRO0FBQzVGO0FBQ0EsT0FBTyxrQkFBa0Isa0JBQWtCO0FBQzNDLFNBQVMsc0JBQXNCLFlBQVksU0FBUztDQUNsRCxPQUFPLFlBQVksWUFBWSxTQUFTLGFBQWEsSUFBSTtBQUMzRDtBQUNBLE9BQU8sdUJBQXVCLHVCQUF1QjtBQUNyRCxTQUFTLFlBQVksTUFBTSxTQUFTO0NBQ2xDLFFBQVEsS0FBSyxVQUFiO0VBQ0UsS0FBSyxHQUNILE9BQU8sWUFBWSxNQUFNLE9BQU87RUFDbEMsS0FBSyxHQUNILE9BQU8sUUFBUSxRQUFRLEtBQUssTUFBTSxPQUFPO0VBQzNDLFNBQ0UsT0FBTyxRQUFRLFFBQVEsTUFBTSxPQUFPO0NBQ3hDO0FBQ0Y7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUNqQyxTQUFTLFlBQVksU0FBUyxTQUFTO0NBQ3JDLE1BQU0sYUFBYSxRQUFRLGtCQUFrQjtDQUM3QyxNQUFNLE9BQU8sUUFBUSxRQUFRLFlBQVk7Q0FDekMsTUFBTSxPQUFPLFFBQVEsUUFBUSxJQUFJLFFBQVEsU0FBUztDQUNsRCxNQUFNLFlBQVksUUFBUSxRQUFRLEtBQUssU0FBUztDQUNoRCxNQUFNLE9BQU8sUUFBUSxRQUFRLEtBQUssS0FBSyxJQUFJLFNBQVM7Q0FDcEQsUUFBUSxZQUFZLEtBQUssU0FBUyxJQUFJO0NBQ3RDLElBQUksbUJBQW1CO0NBQ3ZCLElBQUksV0FBVyxTQUFTLEdBQUc7RUFDekIsb0JBQW9CO0VBQ3BCLG9CQUFvQixZQUFZLFdBQVcsS0FBSyxRQUFRLENBQUMsS0FBSyxRQUFRLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLGtCQUFrQixHQUFHO0NBQzNIO0NBQ0EsUUFBUSxZQUFZLGlCQUFpQjtDQUNyQyxNQUFNLFlBQVksUUFBUTtDQUMxQixJQUFJLFdBQVcsc0JBQXNCLFFBQVEsVUFBVSxPQUFPO0NBQzlELElBQUksWUFBWSxTQUFTLFNBQVMsV0FDaEMsV0FBVyxHQUFHLFVBQVUsR0FBRyxRQUFRLFNBQVMsT0FBTztDQUVyRCxPQUFPLEdBQUcsT0FBTyxtQkFBbUIsWUFBWSxXQUFXO0FBQzdEO0FBQ0EsT0FBTyxhQUFhLGFBQWE7QUFJakMsSUFBSSxjQURtQixPQUFPLFdBQVcsY0FBYyxPQUFPLE9BQU8sUUFBUSxhQUN4Qix1QkFBTyxJQUFJLGNBQWMsSUFBSTtBQUNsRixJQUFJLGNBQThCLHVCQUFPLElBQUksNEJBQTRCO0FBQ3pFLElBQUksaUNBQWlDLElBQUksUUFBUTtBQUNqRCxJQUFJLGVBQWUsQ0FBQztBQUNwQixJQUFJLGVBQWU7Q0FDakIsV0FBMkIsd0JBQVEsT0FBTyxZQUFZLFFBQVEsUUFBUSxhQUFhLFdBQVcsR0FBRyxXQUFXO0NBQzVHLE1BQXNCLHdCQUFRLE9BQU8sWUFBWSxRQUFRLFFBQVEsUUFBUSxNQUFNLEdBQUcsTUFBTTtDQUN4RixTQUF5Qix3QkFBUSxPQUFPLFlBQVksUUFBUSxRQUFRLE9BQU8sS0FBSyxHQUFHLFNBQVMsR0FBRyxTQUFTO0NBQ3hHLFNBQXlCLHdCQUFRLE9BQU8sWUFBWSxRQUFRLFFBQVEsT0FBTyxLQUFLLEdBQUcsU0FBUyxHQUFHLFNBQVM7Q0FDeEcsUUFBUTtDQUNSLFFBQVE7Q0FDUixRQUFRO0NBQ1IsUUFBUTtDQUNSLFFBQVE7Q0FDUixRQUFRO0NBQ1IsVUFBVTtDQUNWLFVBQVU7Q0FDVixRQUFRO0NBRVIsUUFBUTtDQUNSLE9BQU87Q0FDUCxNQUFNO0NBQ04sS0FBSztDQUNMLEtBQUs7Q0FDTCxRQUFRO0NBQ1IsU0FBUztDQUVULFNBQXlCLHdCQUFRLE9BQU8sWUFBWSxRQUFRLFFBQVEsY0FBbUIsU0FBUyxHQUFHLFNBQVM7Q0FDNUcsU0FBeUIsd0JBQVEsT0FBTyxZQUFZLFFBQVEsUUFBUSxjQUFtQixTQUFTLEdBQUcsU0FBUztDQUM1RyxXQUFXO0NBQ1gsV0FBVztDQUNYLFlBQVk7Q0FDWixtQkFBbUI7Q0FDbkIsWUFBWTtDQUNaLGFBQWE7Q0FDYixZQUFZO0NBQ1osYUFBYTtDQUNiLGNBQWM7Q0FDZCxjQUFjO0NBQ2QsV0FBMkIsNkJBQWEsSUFBSSxXQUFXO0NBQ3ZELFVBQTBCLDZCQUFhLElBQUksVUFBVTtDQUNyRCxhQUE2Qiw2QkFBYSxJQUFJLGFBQWE7Q0FDM0QsT0FBTztDQUNQLGdCQUFnQjtDQUNoQixVQUFVO0FBQ1o7QUFDQSxJQUFJLGdCQUFnQyx3QkFBUSxPQUFPLFNBQVMsT0FBTyxjQUFjO0NBQy9FLElBQUksZUFBZSxTQUFTLE9BQU8sTUFBTSxpQkFBaUIsWUFDeEQsT0FBTyxNQUFNLFlBQVksQ0FBQyxPQUFPO0NBRW5DLElBQUksZUFBZSxTQUFTLE9BQU8sTUFBTSxpQkFBaUIsWUFDeEQsT0FBTyxNQUFNLFlBQVksQ0FBQyxRQUFRLE9BQU8sU0FBUyxTQUFTO0NBRTdELElBQUksYUFBYSxTQUFTLE9BQU8sTUFBTSxZQUFZLFlBQ2pELE9BQU8sTUFBTSxRQUFRLFFBQVEsT0FBTyxPQUFPO0NBRTdDLElBQUksaUJBQWlCLFNBQVMsZUFBZSxJQUFJLE1BQU0sV0FBVyxHQUNoRSxPQUFPLGVBQWUsSUFBSSxNQUFNLFdBQVcsQ0FBQyxDQUFDLE9BQU8sT0FBTztDQUU3RCxJQUFJLGFBQWEsUUFDZixPQUFPLGFBQWEsTUFBTSxDQUFDLE9BQU8sT0FBTztDQUUzQyxPQUFPO0FBQ1QsR0FBRyxlQUFlO0FBQ2xCLElBQUksV0FBVyxPQUFPLFVBQVU7QUFDaEMsU0FBUyxRQUFRLE9BQU8sT0FBTyxDQUFDLEdBQUc7Q0FDakMsTUFBTSxVQUFVLGlCQUFpQixNQUFNLE9BQU87Q0FDOUMsTUFBTSxFQUFFLGtCQUFrQjtDQUMxQixJQUFJLFFBQVEsVUFBVSxPQUFPLFNBQVMsT0FBTztDQUM3QyxJQUFJLFVBQVUsVUFDWixRQUFRLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsRUFBRTtDQUUxQyxJQUFJLFNBQVMsY0FDWCxPQUFPLGFBQWEsTUFBTSxDQUFDLE9BQU8sT0FBTztDQUUzQyxJQUFJLGlCQUFpQixPQUFPO0VBQzFCLE1BQU0sU0FBUyxjQUFjLE9BQU8sU0FBUyxPQUFPLE9BQU87RUFDM0QsSUFBSSxRQUFRO0dBQ1YsSUFBSSxPQUFPLFdBQVcsVUFDcEIsT0FBTztHQUNULE9BQU8sUUFBUSxRQUFRLE9BQU87RUFDaEM7Q0FDRjtDQUNBLE1BQU0sUUFBUSxRQUFRLE9BQU8sZUFBZSxLQUFLLElBQUk7Q0FDckQsSUFBSSxVQUFVLE9BQU8sYUFBYSxVQUFVLE1BQzFDLE9BQU8sY0FBYyxPQUFPLE9BQU87Q0FFckMsSUFBSSxTQUFTLE9BQU8sZ0JBQWdCLGNBQWMsaUJBQWlCLGFBQ2pFLE9BQU8sWUFBWSxPQUFPLE9BQU87Q0FFbkMsSUFBSSxpQkFBaUIsT0FBTztFQUMxQixJQUFJLE1BQU0sZ0JBQWdCLFFBQ3hCLE9BQU8sYUFBYSxPQUFPLE9BQU87RUFFcEMsT0FBTyxjQUFjLE9BQU8sT0FBTztDQUNyQztDQUNBLElBQUksVUFBVSxPQUFPLEtBQUssR0FDeEIsT0FBTyxjQUFjLE9BQU8sT0FBTztDQUVyQyxPQUFPLFFBQVEsUUFBUSxPQUFPLEtBQUssR0FBRyxLQUFLO0FBQzdDO0FBQ0EsT0FBTyxTQUFTLFNBQVM7QUFHekIsSUFBSSxTQUFTOzs7Ozs7Ozs7Ozs7O0NBYVgsY0FBYzs7Ozs7Ozs7Ozs7OztDQWFkLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0JWLG1CQUFtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JuQixVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQlYsbUJBQW1CO0VBQUM7RUFBUTtFQUFTO0VBQVc7Q0FBUTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F1QnhELFdBQVc7QUFDYjtBQUdBLFNBQVMsU0FBUyxLQUFLLFlBQVksT0FBTyxRQUFRO0NBT2hELE9BQU8sUUFBUSxLQUFLO0VBTGxCO0VBQ0EsT0FBTyxPQUFPLFVBQVUsY0FBYyxJQUFJO0VBQzFDO0VBQ0EsVUFBVSxPQUFPLG9CQUFvQixPQUFPLG9CQUFvQjtDQUU5QyxDQUFPO0FBQzdCO0FBQ0EsT0FBTyxVQUFVLFNBQVM7QUFHMUIsU0FBUyxXQUFXLEtBQUs7Q0FDdkIsSUFBSSxNQUFNLFNBQVMsR0FBRyxHQUFHLFFBQVEsT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUFHO0NBQ25FLElBQUksT0FBTyxxQkFBcUIsSUFBSSxVQUFVLE9BQU8sbUJBQ25ELElBQUksVUFBVSxxQkFDWixPQUFPLENBQUMsSUFBSSxRQUFRLElBQUksU0FBUyxLQUFLLGVBQWUsZ0JBQWdCLElBQUksT0FBTztNQUMzRSxJQUFJLFVBQVUsa0JBQ25CLE9BQU8sYUFBYSxJQUFJLFNBQVM7TUFDNUIsSUFBSSxVQUFVLG1CQUFtQjtFQUN0QyxJQUFJLE9BQU8sT0FBTyxLQUFLLEdBQUc7RUFDMUIsT0FBTyxnQkFENkIsS0FBSyxTQUFTLElBQUksS0FBSyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLEtBQUssSUFBSSxLQUNoRjtDQUMvQixPQUNFLE9BQU87TUFHVCxPQUFPO0FBRVg7QUFDQSxPQUFPLFlBQVksWUFBWTtBQUcvQixTQUFTLFlBQVksS0FBSyxNQUFNO0NBQzlCLElBQUksU0FBUyxLQUFLLEtBQUssUUFBUTtDQUMvQixJQUFJLE1BQU0sS0FBSyxLQUFLLFFBQVE7Q0FDNUIsSUFBSSxXQUFXLEtBQUs7Q0FDcEIsSUFBSSxTQUFTLFVBQVUsS0FBSyxJQUFJO0NBQ2hDLElBQUksTUFBTSxTQUFTLEtBQUssS0FBSyxLQUFLO0NBQ2xDLElBQUksVUFBVSxLQUFLLEtBQUssU0FBUztDQUNqQyxJQUFJLE9BQU8sUUFBUSxZQUFZLE1BQU0sSUFBSTtDQUN6QyxNQUFNLE9BQU87Q0FDYixNQUFNLElBQUksUUFBUSxjQUFjLFdBQVc7RUFDekMsT0FBTyxXQUFXLEdBQUc7Q0FDdkIsQ0FBQyxDQUFDLENBQUMsUUFBUSxhQUFhLFdBQVc7RUFDakMsT0FBTyxXQUFXLE1BQU07Q0FDMUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxhQUFhLFdBQVc7RUFDakMsT0FBTyxXQUFXLFFBQVE7Q0FDNUIsQ0FBQztDQUNELE9BQU8sVUFBVSxVQUFVLE9BQU8sTUFBTTtBQUMxQztBQUNBLE9BQU8sYUFBYSxZQUFZO0FBR2hDLFNBQVMsY0FBYyxXQUFXLFFBQVEsWUFBWTtDQUNwRCxJQUFJLFFBQVEsVUFBVSxZQUFZLFVBQVUsVUFBMEIsdUJBQU8sT0FBTyxJQUFJO0NBQ3hGLElBQUksQ0FBQyxPQUFPLFNBQ1YsT0FBTyxVQUEwQix1QkFBTyxPQUFPLElBQUk7Q0FFckQsYUFBYSxVQUFVLFdBQVcsSUFBSSxhQUFhO0NBQ25ELEtBQUssSUFBSSxTQUFTLE9BQ2hCLElBQUksY0FBYyxVQUFVLFlBQVksVUFBVSxVQUFVLFVBQVUsY0FBYyxTQUFTLFdBQzNGLE9BQU8sUUFBUSxTQUFTLE1BQU07QUFHcEM7QUFDQSxPQUFPLGVBQWUsZUFBZTtBQUdyQyxTQUFTLE1BQU0sS0FBSztDQUNsQixJQUFJLE9BQU8sUUFBUSxhQUNqQixPQUFPO0NBRVQsSUFBSSxRQUFRLE1BQ1YsT0FBTztDQUVULE1BQU0sWUFBWSxJQUFJLE9BQU87Q0FDN0IsSUFBSSxPQUFPLGNBQWMsVUFDdkIsT0FBTztDQUlULE9BQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQVksRUFBUTtBQUN2RTtBQUNBLE9BQU8sT0FBTyxNQUFNO0FBQ3BCLFNBQVMsVUFBVTtDQUNqQixLQUFLLE9BQU8sb0JBQW9CLEtBQUssT0FBTyxJQUFJLEtBQUssSUFBSTtBQUMzRDtBQUNBLE9BQU8sU0FBUyxTQUFTO0FBQ3pCLFFBQVEsWUFBWTtDQUNsQixLQUFxQix1QkFBTyxTQUFTLElBQUksS0FBSztFQUM1QyxPQUFPLElBQUksS0FBSztDQUNsQixHQUFHLEtBQUs7Q0FDUixLQUFxQix1QkFBTyxTQUFTLElBQUksS0FBSyxPQUFPO0VBQ25ELElBQUksT0FBTyxhQUFhLEdBQUcsR0FDekIsT0FBTyxlQUFlLEtBQUssS0FBSyxNQUFNO0dBQ3BDO0dBQ0EsY0FBYztFQUNoQixDQUFDO0NBRUwsR0FBRyxLQUFLO0FBQ1Y7QUFDQSxJQUFJLGFBQWEsT0FBTyxZQUFZLGFBQWEsVUFBVTtBQUMzRCxTQUFTLGVBQWUsaUJBQWlCLGtCQUFrQixZQUFZO0NBQ3JFLElBQUksQ0FBQyxjQUFjLFlBQVksZUFBZSxLQUFLLFlBQVksZ0JBQWdCLEdBQzdFLE9BQU87Q0FFVCxJQUFJLGNBQWMsV0FBVyxJQUFJLGVBQWU7Q0FDaEQsSUFBSSxhQUFhO0VBQ2YsSUFBSSxTQUFTLFlBQVksSUFBSSxnQkFBZ0I7RUFDN0MsSUFBSSxPQUFPLFdBQVcsV0FDcEIsT0FBTztDQUVYO0NBQ0EsT0FBTztBQUNUO0FBQ0EsT0FBTyxnQkFBZ0IsZ0JBQWdCO0FBQ3ZDLFNBQVMsV0FBVyxpQkFBaUIsa0JBQWtCLFlBQVksUUFBUTtDQUN6RSxJQUFJLENBQUMsY0FBYyxZQUFZLGVBQWUsS0FBSyxZQUFZLGdCQUFnQixHQUM3RTtDQUVGLElBQUksY0FBYyxXQUFXLElBQUksZUFBZTtDQUNoRCxJQUFJLGFBQ0YsWUFBWSxJQUFJLGtCQUFrQixNQUFNO01BQ25DO0VBQ0wsY0FBYyxJQUFJLFdBQVc7RUFDN0IsWUFBWSxJQUFJLGtCQUFrQixNQUFNO0VBQ3hDLFdBQVcsSUFBSSxpQkFBaUIsV0FBVztDQUM3QztBQUNGO0FBQ0EsT0FBTyxZQUFZLFlBQVk7QUFDL0IsSUFBSSxtQkFBbUI7QUFDdkIsU0FBUyxVQUFVLGlCQUFpQixrQkFBa0IsU0FBUztDQUM3RCxJQUFJLFdBQVcsUUFBUSxZQUNyQixPQUFPLG1CQUFtQixpQkFBaUIsa0JBQWtCLE9BQU87Q0FFdEUsSUFBSSxlQUFlLFlBQVksaUJBQWlCLGdCQUFnQjtDQUNoRSxJQUFJLGlCQUFpQixNQUNuQixPQUFPO0NBRVQsT0FBTyxtQkFBbUIsaUJBQWlCLGtCQUFrQixPQUFPO0FBQ3RFO0FBQ0EsT0FBTyxXQUFXLFdBQVc7QUFDN0IsU0FBUyxZQUFZLGlCQUFpQixrQkFBa0I7Q0FDdEQsSUFBSSxvQkFBb0Isa0JBQ3RCLE9BQU8sb0JBQW9CLEtBQUssSUFBSSxvQkFBb0IsSUFBSTtDQUU5RCxJQUFJLG9CQUFvQixtQkFDeEIscUJBQXFCLGtCQUNuQixPQUFPO0NBRVQsSUFBSSxZQUFZLGVBQWUsS0FBSyxZQUFZLGdCQUFnQixHQUM5RCxPQUFPO0NBRVQsT0FBTztBQUNUO0FBQ0EsT0FBTyxhQUFhLGFBQWE7QUFDakMsU0FBUyxtQkFBbUIsaUJBQWlCLGtCQUFrQixTQUFTO0NBQ3RFLFVBQVUsV0FBVyxDQUFDO0NBQ3RCLFFBQVEsVUFBVSxRQUFRLFlBQVksUUFBUSxRQUFRLFFBQVEsV0FBVyxJQUFJLFdBQVc7Q0FDeEYsSUFBSSxhQUFhLFdBQVcsUUFBUTtDQUNwQyxJQUFJLG9CQUFvQixlQUFlLGlCQUFpQixrQkFBa0IsUUFBUSxPQUFPO0NBQ3pGLElBQUksc0JBQXNCLE1BQ3hCLE9BQU87Q0FFVCxJQUFJLHFCQUFxQixlQUFlLGtCQUFrQixpQkFBaUIsUUFBUSxPQUFPO0NBQzFGLElBQUksdUJBQXVCLE1BQ3pCLE9BQU87Q0FFVCxJQUFJLFlBQVk7RUFDZCxJQUFJLG1CQUFtQixXQUFXLGlCQUFpQixnQkFBZ0I7RUFDbkUsSUFBSSxxQkFBcUIsU0FBUyxxQkFBcUIsTUFBTTtHQUMzRCxXQUFXLGlCQUFpQixrQkFBa0IsUUFBUSxTQUFTLGdCQUFnQjtHQUMvRSxPQUFPO0VBQ1Q7RUFDQSxJQUFJLGVBQWUsWUFBWSxpQkFBaUIsZ0JBQWdCO0VBQ2hFLElBQUksaUJBQWlCLE1BQ25CLE9BQU87Q0FFWDtDQUNBLElBQUksZUFBZSxNQUFNLGVBQWU7Q0FDeEMsSUFBSSxpQkFBaUIsTUFBTSxnQkFBZ0IsR0FBRztFQUM1QyxXQUFXLGlCQUFpQixrQkFBa0IsUUFBUSxTQUFTLEtBQUs7RUFDcEUsT0FBTztDQUNUO0NBQ0EsV0FBVyxpQkFBaUIsa0JBQWtCLFFBQVEsU0FBUyxJQUFJO0NBQ25FLElBQUksU0FBUyx5QkFBeUIsaUJBQWlCLGtCQUFrQixjQUFjLE9BQU87Q0FDOUYsV0FBVyxpQkFBaUIsa0JBQWtCLFFBQVEsU0FBUyxNQUFNO0NBQ3JFLE9BQU87QUFDVDtBQUNBLE9BQU8sb0JBQW9CLG9CQUFvQjtBQUMvQyxTQUFTLHlCQUF5QixpQkFBaUIsa0JBQWtCLGNBQWMsU0FBUztDQUMxRixRQUFRLGNBQVI7RUFDRSxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLLFFBQ0gsT0FBTyxVQUFVLGdCQUFnQixRQUFRLEdBQUcsaUJBQWlCLFFBQVEsQ0FBQztFQUN4RSxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSyxXQUNILE9BQU8sb0JBQW9CO0VBQzdCLEtBQUssU0FDSCxPQUFPLFVBQVUsaUJBQWlCLGtCQUFrQjtHQUFDO0dBQVE7R0FBVztFQUFNLEdBQUcsT0FBTztFQUMxRixLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSyxTQUNILE9BQU8sY0FBYyxpQkFBaUIsa0JBQWtCLE9BQU87RUFDakUsS0FBSyxVQUNILE9BQU8sWUFBWSxpQkFBaUIsZ0JBQWdCO0VBQ3RELEtBQUssYUFDSCxPQUFPLGVBQWUsaUJBQWlCLGtCQUFrQixPQUFPO0VBQ2xFLEtBQUssWUFDSCxPQUFPLGNBQWMsSUFBSSxXQUFXLGdCQUFnQixNQUFNLEdBQUcsSUFBSSxXQUFXLGlCQUFpQixNQUFNLEdBQUcsT0FBTztFQUMvRyxLQUFLLGVBQ0gsT0FBTyxjQUFjLElBQUksV0FBVyxlQUFlLEdBQUcsSUFBSSxXQUFXLGdCQUFnQixHQUFHLE9BQU87RUFDakcsS0FBSyxPQUNILE9BQU8sYUFBYSxpQkFBaUIsa0JBQWtCLE9BQU87RUFDaEUsS0FBSyxPQUNILE9BQU8sYUFBYSxpQkFBaUIsa0JBQWtCLE9BQU87RUFDaEUsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSywwQkFDSCxPQUFPLGdCQUFnQixPQUFPLGdCQUFnQjtFQUNoRCxLQUFLLHFCQUNILE9BQU8sZ0JBQWdCLE1BQU0sYUFBYSxNQUFNLGlCQUFpQixNQUFNLGFBQWE7RUFDdEYsS0FBSztFQUNMLEtBQUsscUJBQ0gsT0FBTyxnQkFBZ0IsU0FBUyxNQUFNLGlCQUFpQixTQUFTO0VBQ2xFLFNBQ0UsT0FBTyxZQUFZLGlCQUFpQixrQkFBa0IsT0FBTztDQUNqRTtBQUNGO0FBQ0EsT0FBTywwQkFBMEIsMEJBQTBCO0FBQzNELFNBQVMsWUFBWSxpQkFBaUIsa0JBQWtCO0NBQ3RELE9BQU8sZ0JBQWdCLFNBQVMsTUFBTSxpQkFBaUIsU0FBUztBQUNsRTtBQUNBLE9BQU8sYUFBYSxhQUFhO0FBQ2pDLFNBQVMsYUFBYSxpQkFBaUIsa0JBQWtCLFNBQVM7Q0FDaEUsSUFBSTtFQUNGLElBQUksZ0JBQWdCLFNBQVMsaUJBQWlCLE1BQzVDLE9BQU87RUFFVCxJQUFJLGdCQUFnQixTQUFTLEdBQzNCLE9BQU87Q0FFWCxTQUFTLFdBQVc7RUFDbEIsT0FBTztDQUNUO0NBQ0EsSUFBSSxnQkFBZ0IsQ0FBQztDQUNyQixJQUFJLGlCQUFpQixDQUFDO0NBQ3RCLGdCQUFnQixRQUF3Qix1QkFBTyxTQUFTLGNBQWMsS0FBSyxPQUFPO0VBQ2hGLGNBQWMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDO0NBQ2pDLEdBQUcsZUFBZSxDQUFDO0NBQ25CLGlCQUFpQixRQUF3Qix1QkFBTyxTQUFTLGNBQWMsS0FBSyxPQUFPO0VBQ2pGLGVBQWUsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDO0NBQ2xDLEdBQUcsZUFBZSxDQUFDO0NBQ25CLE9BQU8sY0FBYyxjQUFjLEtBQUssR0FBRyxlQUFlLEtBQUssR0FBRyxPQUFPO0FBQzNFO0FBQ0EsT0FBTyxjQUFjLGNBQWM7QUFDbkMsU0FBUyxjQUFjLGlCQUFpQixrQkFBa0IsU0FBUztDQUNqRSxJQUFJLFNBQVMsZ0JBQWdCO0NBQzdCLElBQUksV0FBVyxpQkFBaUIsUUFDOUIsT0FBTztDQUVULElBQUksV0FBVyxHQUNiLE9BQU87Q0FFVCxJQUFJLFFBQVE7Q0FDWixPQUFPLEVBQUUsUUFBUSxRQUNmLElBQUksVUFBVSxnQkFBZ0IsUUFBUSxpQkFBaUIsUUFBUSxPQUFPLE1BQU0sT0FDMUUsT0FBTztDQUdYLE9BQU87QUFDVDtBQUNBLE9BQU8sZUFBZSxlQUFlO0FBQ3JDLFNBQVMsZUFBZSxpQkFBaUIsa0JBQWtCLFNBQVM7Q0FDbEUsT0FBTyxjQUFjLG9CQUFvQixlQUFlLEdBQUcsb0JBQW9CLGdCQUFnQixHQUFHLE9BQU87QUFDM0c7QUFDQSxPQUFPLGdCQUFnQixnQkFBZ0I7QUFDdkMsU0FBUyxvQkFBb0IsUUFBUTtDQUNuQyxPQUFPLE9BQU8sV0FBVyxlQUFlLE9BQU8sV0FBVyxZQUFZLE9BQU8sT0FBTyxhQUFhLGVBQWUsT0FBTyxPQUFPLE9BQU8sY0FBYztBQUNySjtBQUNBLE9BQU8scUJBQXFCLHFCQUFxQjtBQUNqRCxTQUFTLG1CQUFtQixRQUFRO0NBQ2xDLElBQUksb0JBQW9CLE1BQU0sR0FDNUIsSUFBSTtFQUNGLE9BQU8sb0JBQW9CLE9BQU8sT0FBTyxTQUFTLENBQUMsQ0FBQztDQUN0RCxTQUFTLGVBQWU7RUFDdEIsT0FBTyxDQUFDO0NBQ1Y7Q0FFRixPQUFPLENBQUM7QUFDVjtBQUNBLE9BQU8sb0JBQW9CLG9CQUFvQjtBQUMvQyxTQUFTLG9CQUFvQixXQUFXO0NBQ3RDLElBQUksa0JBQWtCLFVBQVUsS0FBSztDQUNyQyxJQUFJLGNBQWMsQ0FBQyxnQkFBZ0IsS0FBSztDQUN4QyxPQUFPLGdCQUFnQixTQUFTLE9BQU87RUFDckMsa0JBQWtCLFVBQVUsS0FBSztFQUNqQyxZQUFZLEtBQUssZ0JBQWdCLEtBQUs7Q0FDeEM7Q0FDQSxPQUFPO0FBQ1Q7QUFDQSxPQUFPLHFCQUFxQixxQkFBcUI7QUFDakQsU0FBUyxrQkFBa0IsUUFBUTtDQUNqQyxJQUFJLE9BQU8sQ0FBQztDQUNaLEtBQUssSUFBSSxPQUFPLFFBQ2QsS0FBSyxLQUFLLEdBQUc7Q0FFZixPQUFPO0FBQ1Q7QUFDQSxPQUFPLG1CQUFtQixtQkFBbUI7QUFDN0MsU0FBUyxxQkFBcUIsUUFBUTtDQUNwQyxJQUFJLE9BQU8sQ0FBQztDQUNaLElBQUksVUFBVSxPQUFPLHNCQUFzQixNQUFNO0NBQ2pELEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSyxHQUFHO0VBQzFDLElBQUksTUFBTSxRQUFRO0VBQ2xCLElBQUksT0FBTyx5QkFBeUIsUUFBUSxHQUFHLENBQUMsQ0FBQyxZQUMvQyxLQUFLLEtBQUssR0FBRztDQUVqQjtDQUNBLE9BQU87QUFDVDtBQUNBLE9BQU8sc0JBQXNCLHNCQUFzQjtBQUNuRCxTQUFTLFVBQVUsaUJBQWlCLGtCQUFrQixNQUFNLFNBQVM7Q0FDbkUsSUFBSSxTQUFTLEtBQUs7Q0FDbEIsSUFBSSxXQUFXLEdBQ2IsT0FBTztDQUVULEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUssR0FDL0IsSUFBSSxVQUFVLGdCQUFnQixLQUFLLEtBQUssaUJBQWlCLEtBQUssS0FBSyxPQUFPLE1BQU0sT0FDOUUsT0FBTztDQUdYLE9BQU87QUFDVDtBQUNBLE9BQU8sV0FBVyxXQUFXO0FBQzdCLFNBQVMsWUFBWSxpQkFBaUIsa0JBQWtCLFNBQVM7Q0FDL0QsSUFBSSxlQUFlLGtCQUFrQixlQUFlO0NBQ3BELElBQUksZ0JBQWdCLGtCQUFrQixnQkFBZ0I7Q0FDdEQsSUFBSSxrQkFBa0IscUJBQXFCLGVBQWU7Q0FDMUQsSUFBSSxtQkFBbUIscUJBQXFCLGdCQUFnQjtDQUM1RCxlQUFlLGFBQWEsT0FBTyxlQUFlO0NBQ2xELGdCQUFnQixjQUFjLE9BQU8sZ0JBQWdCO0NBQ3JELElBQUksYUFBYSxVQUFVLGFBQWEsV0FBVyxjQUFjLFFBQVE7RUFDdkUsSUFBSSxjQUFjLFdBQVcsWUFBWSxDQUFDLENBQUMsS0FBSyxHQUFHLFdBQVcsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sT0FDdkYsT0FBTztFQUVULE9BQU8sVUFBVSxpQkFBaUIsa0JBQWtCLGNBQWMsT0FBTztDQUMzRTtDQUNBLElBQUksa0JBQWtCLG1CQUFtQixlQUFlO0NBQ3hELElBQUksbUJBQW1CLG1CQUFtQixnQkFBZ0I7Q0FDMUQsSUFBSSxnQkFBZ0IsVUFBVSxnQkFBZ0IsV0FBVyxpQkFBaUIsUUFBUTtFQUNoRixnQkFBZ0IsS0FBSztFQUNyQixpQkFBaUIsS0FBSztFQUN0QixPQUFPLGNBQWMsaUJBQWlCLGtCQUFrQixPQUFPO0NBQ2pFO0NBQ0EsSUFBSSxhQUFhLFdBQVcsS0FBSyxnQkFBZ0IsV0FBVyxLQUFLLGNBQWMsV0FBVyxLQUFLLGlCQUFpQixXQUFXLEdBQ3pILE9BQU87Q0FFVCxPQUFPO0FBQ1Q7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUNqQyxTQUFTLFlBQVksT0FBTztDQUMxQixPQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFDNUM7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUNqQyxTQUFTLFdBQVcsS0FBSztDQUN2QixPQUFPLElBQUksSUFBb0IsdUJBQU8sU0FBUyxVQUFVLE9BQU87RUFDOUQsSUFBSSxPQUFPLFVBQVUsVUFDbkIsT0FBTyxNQUFNLFNBQVM7RUFFeEIsT0FBTztDQUNULEdBQUcsV0FBVyxDQUFDO0FBQ2pCO0FBQ0EsT0FBTyxZQUFZLFlBQVk7QUFHL0IsU0FBUyxZQUFZLEtBQUssTUFBTTtDQUM5QixJQUFJLE9BQU8sUUFBUSxlQUFlLFFBQVEsTUFDeEMsT0FBTztDQUVULE9BQU8sUUFBUSxPQUFPLEdBQUc7QUFDM0I7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUNqQyxTQUFTLFVBQVUsTUFBTTtDQUd2QixPQUZZLEtBQUssUUFBUSxjQUFjLE1BQ3pCLENBQUEsQ0FBSSxNQUFNLGlCQUNqQixDQUFBLENBQU0sS0FBSyxVQUFVO0VBQzFCLElBQUksVUFBVSxpQkFBaUIsVUFBVSxlQUFlLFVBQVUsYUFDaEUsT0FBTyxDQUFDO0VBR1YsTUFBTSxPQUFPLGNBQU8sS0FBSyxLQUFLO0VBQzlCLElBQUksU0FBUztFQUNiLElBQUksTUFDRixTQUFTLEVBQUUsR0FBRyxXQUFXLEtBQUssRUFBRSxFQUFFO09BRWxDLFNBQVMsRUFBRSxHQUFHLE1BQU0sUUFBUSxlQUFlLElBQUksRUFBRTtFQUVuRCxPQUFPO0NBQ1QsQ0FBQztBQUNIO0FBQ0EsT0FBTyxXQUFXLFdBQVc7QUFDN0IsU0FBUyxxQkFBcUIsS0FBSyxRQUFRLFdBQVc7Q0FDcEQsSUFBSSxpQkFBaUI7Q0FDckIsSUFBSSxNQUFNO0NBQ1YsWUFBWSxPQUFPLGNBQWMsY0FBYyxPQUFPLFNBQVM7Q0FDL0QsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFdBQVcsS0FBSztFQUNsQyxNQUFNLE9BQU8sT0FBTztFQUNwQixJQUFJLGdCQUFnQjtHQUNsQixJQUFJLE9BQU8sS0FBSyxNQUFNLGFBQ3BCLGlCQUFpQixlQUFlLEtBQUs7UUFFckMsaUJBQWlCLGVBQWUsS0FBSztHQUV2QyxJQUFJLE1BQU0sWUFBWSxHQUNwQixNQUFNO0VBRVY7Q0FDRjtDQUNBLE9BQU87QUFDVDtBQUNBLE9BQU8sc0JBQXNCLHNCQUFzQjtBQUNuRCxTQUFTLFlBQVksS0FBSyxNQUFNO0NBQzlCLE1BQU0sU0FBUyxVQUFVLElBQUk7Q0FDN0IsTUFBTSxPQUFPLE9BQU8sT0FBTyxTQUFTO0NBQ3BDLE1BQU0sT0FBTztFQUNYLFFBQVEsT0FBTyxTQUFTLElBQUkscUJBQXFCLEtBQUssUUFBUSxPQUFPLFNBQVMsQ0FBQyxJQUFJO0VBQ25GLE1BQU0sS0FBSyxLQUFLLEtBQUs7RUFDckIsT0FBTyxxQkFBcUIsS0FBSyxNQUFNO0NBQ3pDO0NBQ0EsS0FBSyxTQUFTLFlBQVksS0FBSyxRQUFRLEtBQUssSUFBSTtDQUNoRCxPQUFPO0FBQ1Q7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUdqQyxJQUFJLGFBQWEsTUFBTSxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQ2hDLFlBQVksS0FBSyxLQUFLLE1BQU0sVUFBVTs7RUFFcEMsY0FBYyxNQUFNLFdBQVcsQ0FBQyxDQUFDO0VBQ2pDLEtBQUssTUFBTSxRQUFRLFFBQVEsVUFBVTtFQUNyQyxLQUFLLE1BQU0sWUFBWSxRQUFRO0VBQy9CLEtBQUssTUFBTSxVQUFVLEdBQUc7RUFDeEIsS0FBSyxNQUFNLFdBQVcsR0FBRztFQUN6QixLQUFLLE1BQU0sT0FBTyxPQUFPLGFBQWEsZ0JBQWdCO0VBQ3RELE9BQU8sUUFBUSxJQUFJO0NBQ3JCOztDQUVBLFdBQVcsZUFBZTtFQUN4QixRQUFRLEtBQ04sNkVBQ0Y7RUFDQSxPQUFPLE9BQU87Q0FDaEI7O0NBRUEsV0FBVyxhQUFhLE9BQU87RUFDN0IsUUFBUSxLQUNOLDZFQUNGO0VBQ0EsT0FBTyxlQUFlO0NBQ3hCOztDQUVBLFdBQVcsV0FBVztFQUNwQixRQUFRLEtBQ04scUVBQ0Y7RUFDQSxPQUFPLE9BQU87Q0FDaEI7O0NBRUEsV0FBVyxTQUFTLE9BQU87RUFDekIsUUFBUSxLQUNOLHFFQUNGO0VBQ0EsT0FBTyxXQUFXO0NBQ3BCOzs7OztDQUtBLE9BQU8sWUFBWSxNQUFNLElBQUk7RUFDM0IsWUFBWSxLQUFLLFdBQVcsTUFBTSxFQUFFO0NBQ3RDOzs7OztDQUtBLE9BQU8sVUFBVSxNQUFNLElBQUk7RUFDekIsVUFBVSxLQUFLLFdBQVcsTUFBTSxFQUFFO0NBQ3BDOzs7Ozs7Q0FNQSxPQUFPLG1CQUFtQixNQUFNLElBQUksa0JBQWtCO0VBQ3BELG1CQUFtQixLQUFLLFdBQVcsTUFBTSxJQUFJLGdCQUFnQjtDQUMvRDs7Ozs7Q0FLQSxPQUFPLGtCQUFrQixNQUFNLElBQUk7RUFDakMsa0JBQWtCLEtBQUssV0FBVyxNQUFNLEVBQUU7Q0FDNUM7Ozs7O0NBS0EsT0FBTyxnQkFBZ0IsTUFBTSxJQUFJO0VBQy9CLGdCQUFnQixLQUFLLFdBQVcsTUFBTSxFQUFFO0NBQzFDOzs7Ozs7Q0FNQSxPQUFPLHlCQUF5QixNQUFNLElBQUksa0JBQWtCO0VBQzFELHlCQUF5QixLQUFLLFdBQVcsTUFBTSxJQUFJLGdCQUFnQjtDQUNyRTs7Ozs7Ozs7Ozs7Ozs7O0NBZUEsT0FBTyxPQUFPLEtBQUssWUFBWSxVQUFVLFNBQVMsVUFBVTtFQUMxRCxNQUFNLEtBQUssS0FBSyxNQUFNLFNBQVM7RUFDL0IsSUFBSSxVQUFVLFVBQVUsV0FBVztFQUNuQyxJQUFJLEtBQUssTUFBTSxZQUFZLEtBQUssTUFBTSxTQUFTLFdBQVc7RUFDMUQsSUFBSSxTQUFTLE9BQU8sVUFBVSxXQUFXO0VBQ3pDLElBQUksQ0FBQyxJQUFJO0dBQ1AsTUFBTSxZQUFZLE1BQU0sU0FBUztHQUVqQyxNQUFNLGlDQUFpQztJQUNyQyxRQUZhLFVBQVUsTUFBTSxTQUU3QjtJQUNBO0lBQ0E7R0FDRjtHQUNBLE1BQU0sV0FBVyxZQUFZLE1BQU0sU0FBUztHQUM1QyxJQUFJLFVBQ0YsK0JBQStCLFdBQVc7R0FFNUMsTUFBTSxJQUFJLGVBQ1IsS0FDQSxnQ0FFQSxPQUFPLGVBQWUsS0FBSyxTQUFTLEtBQUssTUFBTSxNQUFNLENBQ3ZEO0VBQ0Y7Q0FDRjs7Ozs7O0NBTUEsSUFBSSxPQUFPO0VBQ1QsT0FBTyxLQUFLLE1BQU0sUUFBUTtDQUM1Qjs7Ozs7O0NBTUEsSUFBSSxLQUFLLEtBQUs7RUFDWixLQUFLLE1BQU0sVUFBVSxHQUFHO0NBQzFCO0FBQ0Y7QUFDQSxPQUFPLFlBQVksV0FBVztBQUM5QixJQUFJLFlBQVk7QUFHaEIsSUFBSSxTQUFTLElBQUksWUFBWTtBQUM3QixJQUFJLGVBQWUsTUFBTSxxQkFBcUIsTUFBTTtDQUNsRCxZQUFZLE9BQU8sTUFBTSxJQUFJO0VBQzNCLE1BQU0sS0FBSztFQUNYLEtBQUssT0FBTyxPQUFPLElBQUk7RUFDdkIsS0FBSyxLQUFLO0NBQ1o7QUFDRjtBQUNBLE9BQU8sY0FBYyxhQUFhO0FBQ2xDLElBQUksY0FBYztBQUdsQixTQUFTLGlCQUFpQjtDQUN4QixPQUFPLE9BQU8sWUFBWSxPQUFPLFVBQVUsZUFBZSxPQUFPLFlBQVk7QUFDL0U7QUFDQSxPQUFPLGdCQUFnQixnQkFBZ0I7QUFHdkMsU0FBUyxZQUFZLEtBQUssTUFBTSxRQUFRO0NBQ3RDLFNBQVMsV0FBVyxLQUFLLElBQUksV0FBVyxDQUN4QyxJQUFJO0NBQ0osT0FBTyxlQUFlLEtBQUssTUFBTTtFQUMvQixLQUFxQix1QkFBTyxTQUFTLGlCQUFpQjtHQUNwRCxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsS0FBSyxNQUFNLFVBQVUsR0FDN0MsS0FBSyxNQUFNLFFBQVEsY0FBYztHQUVuQyxJQUFJLFNBQVMsT0FBTyxLQUFLLElBQUk7R0FDN0IsSUFBSSxXQUFXLEtBQUssR0FBRyxPQUFPO0dBQzlCLElBQUksZUFBZSxJQUFJLFVBQVU7R0FDakMsY0FBYyxNQUFNLFlBQVk7R0FDaEMsT0FBTztFQUNULEdBQUcsZ0JBQWdCO0VBQ25CLGNBQWM7Q0FDaEIsQ0FBQztDQUNELE9BQU8sY0FBYyxJQUFJLFlBQVksZUFBZSxNQUFNLE1BQU0sQ0FBQztBQUNuRTtBQUNBLE9BQU8sYUFBYSxhQUFhO0FBR2pDLElBQUksZUFBZSxPQUFPLHlCQUF5QixXQUFXLENBQzlELEdBQUcsUUFBUTtBQUNYLFNBQVMsZUFBZSxJQUFJLGVBQWUsYUFBYTtDQUN0RCxJQUFJLENBQUMsYUFBYSxjQUFjLE9BQU87Q0FDdkMsT0FBTyxlQUFlLElBQUksVUFBVSxFQUNsQyxLQUFxQix1QkFBTyxXQUFXO0VBQ3JDLElBQUksYUFDRixNQUFNLE1BQ0osNEJBQTRCLGdCQUFnQixnRkFBNkUsZ0JBQWdCLGVBQWEsZ0JBQWdCLHNCQUN4SztFQUVGLE1BQU0sTUFDSiw0QkFBNEIsZ0JBQWdCLDZDQUE0QyxnQkFBZ0IsS0FDMUc7Q0FDRixHQUFHLEtBQUssRUFDVixDQUFDO0NBQ0QsT0FBTztBQUNUO0FBQ0EsT0FBTyxnQkFBZ0IsZ0JBQWdCO0FBR3ZDLFNBQVMsY0FBYyxRQUFRO0NBQzdCLElBQUksU0FBUyxPQUFPLG9CQUFvQixNQUFNO0NBQzlDLFNBQVMsYUFBYSxVQUFVO0VBQzlCLElBQUksT0FBTyxRQUFRLFFBQVEsTUFBTSxJQUMvQixPQUFPLEtBQUssUUFBUTtDQUV4QjtDQUNBLE9BQU8sY0FBYyxhQUFhO0NBQ2xDLElBQUksUUFBUSxPQUFPLGVBQWUsTUFBTTtDQUN4QyxPQUFPLFVBQVUsTUFBTTtFQUNyQixPQUFPLG9CQUFvQixLQUFLLENBQUMsQ0FBQyxRQUFRLFlBQVk7RUFDdEQsUUFBUSxPQUFPLGVBQWUsS0FBSztDQUNyQztDQUNBLE9BQU87QUFDVDtBQUNBLE9BQU8sZUFBZSxlQUFlO0FBR3JDLElBQUksV0FBVztDQUFDO0NBQVc7Q0FBYTtDQUFRO0FBQVE7QUFDeEQsU0FBUyxRQUFRLEtBQUssd0JBQXdCO0NBQzVDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTztDQUM5QixPQUFPLElBQUksTUFBTSxLQUFLLEVBQ3BCLEtBQXFCLHVCQUFPLFNBQVMsWUFBWSxRQUFRLFVBQVU7RUFDakUsSUFBSSxPQUFPLGFBQWEsWUFBWSxPQUFPLGtCQUFrQixRQUFRLFFBQVEsTUFBTSxNQUFNLENBQUMsUUFBUSxJQUFJLFFBQVEsUUFBUSxHQUFHO0dBQ3ZILElBQUksd0JBQ0YsTUFBTSxNQUNKLDRCQUE0Qix5QkFBeUIsTUFBTSxXQUFXLHNDQUFxQyx5QkFBeUIsS0FDdEk7R0FFRixJQUFJLGFBQWE7R0FDakIsSUFBSSxxQkFBcUI7R0FDekIsY0FBYyxNQUFNLENBQUMsQ0FBQyxRQUFRLFNBQVMsTUFBTTtJQUMzQyxJQUdFLENBQUMsT0FBTyxVQUFVLGVBQWUsSUFBSSxLQUFLLFNBQVMsUUFBUSxJQUFJLE1BQU0sSUFDckU7S0FDQSxJQUFJLE9BQU8scUJBQXFCLFVBQVUsTUFBTSxrQkFBa0I7S0FDbEUsSUFBSSxPQUFPLG9CQUFvQjtNQUM3QixhQUFhO01BQ2IscUJBQXFCO0tBQ3ZCO0lBQ0Y7R0FDRixDQUFDO0dBQ0QsSUFBSSxlQUFlLE1BQ2pCLE1BQU0sTUFDSiw0QkFBNEIsV0FBVyxzQkFBcUIsYUFBYSxLQUMzRTtRQUVBLE1BQU0sTUFBTSw0QkFBNEIsUUFBUTtFQUVwRDtFQUNBLElBQUksU0FBUyxRQUFRLFFBQVEsTUFBTSxNQUFNLENBQUMsS0FBSyxRQUFRLFVBQVUsR0FDL0QsS0FBSyxRQUFRLFFBQVEsV0FBVztFQUVsQyxPQUFPLFFBQVEsSUFBSSxRQUFRLFFBQVE7Q0FDckMsR0FBRyxhQUFhLEVBQ2xCLENBQUM7QUFDSDtBQUNBLE9BQU8sU0FBUyxTQUFTO0FBQ3pCLFNBQVMscUJBQXFCLE1BQU0sTUFBTSxLQUFLO0NBQzdDLElBQUksS0FBSyxJQUFJLEtBQUssU0FBUyxLQUFLLE1BQU0sS0FBSyxLQUN6QyxPQUFPO0NBRVQsSUFBSSxPQUFPLENBQUM7Q0FDWixLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssS0FBSyxRQUFRLEtBQUs7RUFDckMsS0FBSyxLQUFLLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztFQUN2QyxLQUFLLEVBQUUsQ0FBQyxLQUFLO0NBQ2Y7Q0FDQSxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQy9CLEtBQUssRUFBRSxDQUFDLEtBQUs7Q0FFZixLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssS0FBSyxRQUFRLEtBQUs7RUFDckMsSUFBSSxLQUFLLEtBQUssV0FBVyxJQUFJLENBQUM7RUFDOUIsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEtBQUssUUFBUSxLQUFLO0dBQ3JDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUs7SUFDMUIsS0FBSyxFQUFFLENBQUMsS0FBSztJQUNiO0dBQ0Y7R0FDQSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFDaEIsS0FBSyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQ2pCLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxHQUNqQixLQUFLLElBQUksRUFBRSxDQUFDLElBQUksTUFBTSxPQUFPLEtBQUssV0FBVyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQzVEO0VBQ0Y7Q0FDRjtDQUNBLE9BQU8sS0FBSyxLQUFLLE9BQU8sQ0FBQyxLQUFLO0FBQ2hDO0FBQ0EsT0FBTyxzQkFBc0Isc0JBQXNCO0FBR25ELFNBQVMsVUFBVSxLQUFLLE1BQU0sUUFBUTtDQUNwQyxJQUFJLGdCQUFnQyx1QkFBTyxXQUFXO0VBQ3BELElBQUksQ0FBQyxLQUFLLE1BQU0sVUFBVSxHQUN4QixLQUFLLE1BQU0sUUFBUSxhQUFhO0VBRWxDLElBQUksU0FBUyxPQUFPLE1BQU0sTUFBTSxTQUFTO0VBQ3pDLElBQUksV0FBVyxLQUFLLEdBQUcsT0FBTztFQUM5QixJQUFJLGVBQWUsSUFBSSxVQUFVO0VBQ2pDLGNBQWMsTUFBTSxZQUFZO0VBQ2hDLE9BQU87Q0FDVCxHQUFHLGVBQWU7Q0FDbEIsZUFBZSxlQUFlLE1BQU0sS0FBSztDQUN6QyxJQUFJLFFBQVEsUUFBUSxlQUFlLElBQUk7Q0FDdkMsT0FBTyxjQUFjLElBQUksWUFBWSxhQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pFO0FBQ0EsT0FBTyxXQUFXLFdBQVc7QUFHN0IsU0FBUyxrQkFBa0IsS0FBSyxNQUFNLFFBQVE7Q0FDNUMsSUFBSSxPQUFPLE9BQU8seUJBQXlCLEtBQUssSUFBSSxHQUFHLFNBQXlCLHVCQUFPLFdBQVcsQ0FDbEcsR0FBRyxRQUFRO0NBQ1gsSUFBSSxRQUFRLGVBQWUsT0FBTyxLQUFLLEtBQUssU0FBUyxLQUFLO0NBQzFELE9BQU8sZUFBZSxLQUFLLE1BQU07RUFDL0IsS0FBcUIsdUJBQU8sU0FBUyw0QkFBNEI7R0FDL0QsSUFBSSxDQUFDLGVBQWUsS0FBSyxDQUFDLEtBQUssTUFBTSxVQUFVLEdBQzdDLEtBQUssTUFBTSxRQUFRLHlCQUF5QjtHQUU5QyxJQUFJLGVBQWUsS0FBSyxNQUFNLFVBQVU7R0FDeEMsS0FBSyxNQUFNLFlBQVksSUFBSTtHQUMzQixJQUFJLFNBQVMsT0FBTyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUk7R0FDckMsS0FBSyxNQUFNLFlBQVksWUFBWTtHQUNuQyxJQUFJLFdBQVcsS0FBSyxHQUNsQixPQUFPO0dBRVQsSUFBSSxlQUFlLElBQUksVUFBVTtHQUNqQyxjQUFjLE1BQU0sWUFBWTtHQUNoQyxPQUFPO0VBQ1QsR0FBRywyQkFBMkI7RUFDOUIsY0FBYztDQUNoQixDQUFDO0FBQ0g7QUFDQSxPQUFPLG1CQUFtQixtQkFBbUI7QUFHN0MsU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLFFBQVE7Q0FDMUMsSUFBSSxVQUFVLElBQUksT0FBTyxTQUF5Qix1QkFBTyxXQUFXO0VBQ2xFLE1BQU0sSUFBSSxNQUFNLE9BQU8sb0JBQW9CO0NBQzdDLEdBQUcsUUFBUTtDQUNYLElBQUksV0FBVyxlQUFlLE9BQU8sU0FBUyxTQUFTO0NBQ3ZELElBQUksMkJBQTJDLHVCQUFPLFdBQVc7RUFDL0QsSUFBSSxDQUFDLEtBQUssTUFBTSxVQUFVLEdBQ3hCLEtBQUssTUFBTSxRQUFRLHdCQUF3QjtFQUU3QyxJQUFJLGVBQWUsS0FBSyxNQUFNLFVBQVU7RUFDeEMsS0FBSyxNQUFNLFlBQVksSUFBSTtFQUMzQixJQUFJLFNBQVMsT0FBTyxNQUFNLENBQUMsQ0FBQyxNQUFNLE1BQU0sU0FBUztFQUNqRCxLQUFLLE1BQU0sWUFBWSxZQUFZO0VBQ25DLElBQUksV0FBVyxLQUFLLEdBQ2xCLE9BQU87RUFFVCxJQUFJLGVBQWUsSUFBSSxVQUFVO0VBQ2pDLGNBQWMsTUFBTSxZQUFZO0VBQ2hDLE9BQU87Q0FDVCxHQUFHLDBCQUEwQjtDQUM3QixlQUFlLDBCQUEwQixNQUFNLEtBQUs7Q0FDcEQsSUFBSSxRQUFRLFFBQVEsMEJBQTBCLElBQUk7QUFDcEQ7QUFDQSxPQUFPLGlCQUFpQixpQkFBaUI7QUFHekMsSUFBSSxrQkFBa0IsT0FBTyxPQUFPLG1CQUFtQjtBQUN2RCxJQUFJLFNBQXlCLHVCQUFPLFdBQVcsQ0FDL0MsR0FBRyxRQUFRO0FBQ1gsSUFBSSxlQUFlLE9BQU8sb0JBQW9CLE1BQU0sQ0FBQyxDQUFDLE9BQU8sU0FBUyxNQUFNO0NBQzFFLElBQUksV0FBVyxPQUFPLHlCQUF5QixRQUFRLElBQUk7Q0FDM0QsSUFBSSxPQUFPLGFBQWEsVUFBVSxPQUFPO0NBQ3pDLE9BQU8sQ0FBQyxTQUFTO0FBQ25CLENBQUM7QUFDRCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzlCLElBQUksUUFBUSxTQUFTLFVBQVU7QUFDL0IsSUFBSSxpQ0FBaUMsTUFBTSx1Q0FBdUMsWUFBWTtDQUM1RixZQUFZLE9BQU8sTUFBTSxJQUFJLGtCQUFrQjtFQUM3QyxNQUFNLE9BQU8sTUFBTSxFQUFFO0VBQ3JCLEtBQUssbUJBQW1CO0NBQzFCO0FBQ0Y7QUFDQSxPQUFPLGdDQUFnQywrQkFBK0I7QUFDdEUsSUFBSSxnQ0FBZ0M7QUFDcEMsU0FBUyxtQkFBbUIsS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0NBQy9ELElBQUksT0FBTyxxQkFBcUIsWUFDOUIsbUJBQW1DLHVCQUFPLFdBQVcsQ0FDckQsR0FBRyxrQkFBa0I7Q0FFdkIsSUFBSSxvQkFBb0I7RUFDdEI7RUFDQTtDQUNGO0NBQ0EsSUFBSSxDQUFDLElBQUksV0FDUCxJQUFJLFlBQVksQ0FBQztDQUVuQixJQUFJLFVBQVUsUUFBUTtDQUN0QixPQUFPLGVBQWUsS0FBSyxNQUFNO0VBQy9CLEtBQXFCLHVCQUFPLFNBQVMsd0JBQXdCO0dBQzNELGtCQUFrQixpQkFBaUIsS0FBSyxJQUFJO0dBQzVDLElBQUkseUJBQXlDLHVCQUFPLFdBQVc7SUFDN0QsSUFBSSxDQUFDLEtBQUssTUFBTSxVQUFVLEdBQ3hCLEtBQUssTUFBTSxRQUFRLHNCQUFzQjtJQUUzQyxJQUFJLFNBQVMsa0JBQWtCLE9BQU8sTUFBTSxNQUFNLFNBQVM7SUFDM0QsSUFBSSxXQUFXLEtBQUssR0FDbEIsT0FBTztJQUVULElBQUksZUFBZSxJQUFJLFVBQVU7SUFDakMsY0FBYyxNQUFNLFlBQVk7SUFDaEMsT0FBTztHQUNULEdBQUcsd0JBQXdCO0dBQzNCLGVBQWUsd0JBQXdCLE1BQU0sSUFBSTtHQUNqRCxJQUFJLGlCQUFpQjtJQUNuQixJQUFJLFlBQVksT0FBTyxPQUFPLElBQUk7SUFDbEMsVUFBVSxPQUFPO0lBQ2pCLFVBQVUsUUFBUTtJQUNsQixPQUFPLGVBQWUsd0JBQXdCLFNBQVM7R0FDekQsT0FFRSxBQURvQixPQUFPLG9CQUFvQixHQUMvQyxDQUFBLENBQWMsUUFBUSxTQUFTLGNBQWM7SUFDM0MsSUFBSSxhQUFhLFFBQVEsWUFBWSxNQUFNLElBQ3pDO0lBRUYsSUFBSSxLQUFLLE9BQU8seUJBQXlCLEtBQUssWUFBWTtJQUMxRCxPQUFPLGVBQWUsd0JBQXdCLGNBQWMsRUFBRTtHQUNoRSxDQUFDO0dBRUgsY0FBYyxNQUFNLHNCQUFzQjtHQUMxQyxPQUFPLFFBQVEsc0JBQXNCO0VBQ3ZDLEdBQUcsdUJBQXVCO0VBQzFCLGNBQWM7Q0FDaEIsQ0FBQztDQUNELE9BQU8sY0FDTCxJQUFJLDhCQUNGLHNCQUNBLE1BQ0EsUUFDQSxnQkFDRixDQUNGO0FBQ0Y7QUFDQSxPQUFPLG9CQUFvQixvQkFBb0I7QUFHL0MsU0FBUyx5QkFBeUIsS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0NBQ3JFLElBQUksb0JBQW9CLElBQUksVUFBVTtDQUN0QyxJQUFJLG9CQUFvQixrQkFBa0I7Q0FDMUMsa0JBQWtCLG1CQUFtQyx1QkFBTyxTQUFTLG1DQUFtQztFQUN0RyxJQUFJLFNBQVMsaUJBQWlCLGlCQUFpQixDQUFDLENBQUMsS0FBSyxJQUFJO0VBQzFELElBQUksV0FBVyxLQUFLLEdBQ2xCLE9BQU87RUFFVCxJQUFJLGVBQWUsSUFBSSxVQUFVO0VBQ2pDLGNBQWMsTUFBTSxZQUFZO0VBQ2hDLE9BQU87Q0FDVCxHQUFHLGtDQUFrQztDQUNyQyxJQUFJLFVBQVUsa0JBQWtCO0NBQ2hDLGtCQUFrQixTQUF5Qix1QkFBTyxTQUFTLG9DQUFvQztFQUM3RixJQUFJLFNBQVMsT0FBTyxPQUFPLENBQUMsQ0FBQyxNQUFNLE1BQU0sU0FBUztFQUNsRCxJQUFJLFdBQVcsS0FBSyxHQUNsQixPQUFPO0VBRVQsSUFBSSxlQUFlLElBQUksVUFBVTtFQUNqQyxjQUFjLE1BQU0sWUFBWTtFQUNoQyxPQUFPO0NBQ1QsR0FBRyxtQ0FBbUM7QUFDeEM7QUFDQSxPQUFPLDBCQUEwQiwwQkFBMEI7QUFHM0QsU0FBUyxpQkFBaUIsR0FBRyxHQUFHO0NBQzlCLE9BQU8sU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksS0FBSztBQUMxQztBQUNBLE9BQU8sa0JBQWtCLGtCQUFrQjtBQUczQyxTQUFTLGdDQUFnQyxLQUFLO0NBQzVDLElBQUksT0FBTyxPQUFPLDBCQUEwQixZQUFZLE9BQU8sQ0FBQztDQUNoRSxPQUFPLE9BQU8sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sU0FBUyxLQUFLO0VBQzVELE9BQU8sT0FBTyx5QkFBeUIsS0FBSyxHQUFHLENBQUMsQ0FBQztDQUNuRCxDQUFDO0FBQ0g7QUFDQSxPQUFPLGlDQUFpQyxpQ0FBaUM7QUFHekUsU0FBUywyQkFBMkIsS0FBSztDQUN2QyxPQUFPLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLGdDQUFnQyxHQUFHLENBQUM7QUFDckU7QUFDQSxPQUFPLDRCQUE0Qiw0QkFBNEI7QUFHL0QsSUFBSSxTQUFTLE9BQU87QUFHcEIsU0FBUyxhQUFhLEtBQUs7Q0FDekIsSUFBSSxhQUFhLEtBQUssR0FBRztDQUV6QixPQUFPO0VBRFk7RUFBUztFQUFVO0NBQy9CLENBQUEsQ0FBWSxRQUFRLFVBQVUsTUFBTTtBQUM3QztBQUNBLE9BQU8sY0FBYyxjQUFjO0FBQ25DLFNBQVMsWUFBWSxLQUFLLE1BQU07Q0FDOUIsSUFBSSxXQUFXLEtBQUssS0FBSyxVQUFVO0NBQ25DLElBQUksU0FBUyxLQUFLLEtBQUssUUFBUTtDQUMvQixJQUFJLFdBQVcsS0FBSztDQUNwQixJQUFJLE1BQU0sU0FBUyxLQUFLLEtBQUssS0FBSztDQUNsQyxJQUFJLFVBQ0YsT0FBTztDQUVULElBQUksT0FBTyxRQUFRLFlBQVksTUFBTSxJQUFJO0NBQ3pDLE1BQU0sT0FBTztDQUNiLElBQUksQ0FBQyxLQUNIO0NBRUYsSUFBSSxXQUFXLEtBQUssR0FBRyxHQUNyQjtDQUVGLElBQUksV0FBVyxhQUFhLFFBQVE7Q0FDcEMsSUFBSSxVQUFVLEtBQUssR0FBRyxHQUNwQixPQUFPLFdBQVcsdUJBQXVCO0NBRTNDLE9BQU8sV0FBVyxvQkFBb0I7QUFDeEM7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUdqQyxTQUFTLFFBQVEsSUFBSTtDQUNuQixPQUFPLEdBQUc7QUFDWjtBQUNBLE9BQU8sU0FBUyxTQUFTO0FBQ3pCLFNBQVMsVUFBVSxLQUFLO0NBQ3RCLE9BQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUFHLE1BQU07QUFDakQ7QUFDQSxPQUFPLFdBQVcsVUFBVTtBQUM1QixTQUFTLFVBQVUsS0FBSztDQUN0QixPQUFPLENBQUMsVUFBVSxRQUFRLENBQUMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDO0FBQ2hEO0FBQ0EsT0FBTyxXQUFXLFdBQVc7QUFHN0IsSUFBSSxFQUFFLE1BQU0sVUFBVTtBQUN0QjtDQUNFO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDLENBQUMsUUFBUSxTQUFTLE9BQU87Q0FDeEIsVUFBVSxZQUFZLEtBQUs7QUFDN0IsQ0FBQztBQUNELFVBQVUsWUFBWSxPQUFPLFdBQVc7Q0FDdEMsTUFBTSxNQUFNLFVBQVUsSUFBSTtBQUM1QixDQUFDO0FBQ0QsVUFBVSxZQUFZLFFBQVEsV0FBVztDQUN2QyxNQUFNLE1BQU0sUUFBUSxJQUFJO0FBQzFCLENBQUM7QUFDRCxVQUFVLFlBQVksVUFBVSxXQUFXO0NBQ3pDLE1BQU0sTUFBTSxVQUFVLElBQUk7QUFDNUIsQ0FBQztBQUNELFVBQVUsWUFBWSxPQUFPLFdBQVc7Q0FDdEMsTUFBTSxNQUFNLE9BQU8sSUFBSTtBQUN6QixDQUFDO0FBQ0QsVUFBVSxZQUFZLFdBQVcsV0FBVztDQUMxQyxNQUFNLE1BQU0sV0FBVyxJQUFJO0FBQzdCLENBQUM7QUFDRCxVQUFVLFlBQVksT0FBTyxXQUFXO0NBQ3RDLE1BQU0sTUFBTSxPQUFPLElBQUk7Q0FDdkIsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUMxQixDQUFDO0FBQ0QsVUFBVSxZQUFZLE9BQU8sV0FBVztDQUN0QyxNQUFNLE1BQU0sT0FBTyxJQUFJO0NBQ3ZCLE1BQU0sTUFBTSxPQUFPLEtBQUs7QUFDMUIsQ0FBQztBQUNELElBQUksZ0JBQWdCO0NBQ2xCLFVBQVU7RUFDUjtFQUNBO0VBQ0E7RUFDQTtDQUNGO0NBQ0EsZUFBZSxDQUFDLGlCQUFpQix3QkFBd0I7Q0FDekQsbUJBQW1CLENBQUMscUJBQXFCLHdCQUF3QjtDQUNqRSx3QkFBd0IsQ0FBQyx3QkFBd0I7QUFDbkQ7QUFDQSxTQUFTLEdBQUcsT0FBTyxLQUFLO0NBQ3RCLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLFFBQVEsTUFBTSxZQUFZO0NBQzFCLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztFQUFDO0VBQUs7RUFBSztFQUFLO0VBQUs7Q0FBRyxDQUFDLENBQUMsUUFBUSxNQUFNLE9BQU8sQ0FBQyxDQUFDLElBQUksUUFBUTtDQUN6RyxNQUFNLGVBQWUsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZO0NBQzNDLElBQUksY0FBYyxXQUFXLENBQUMsU0FBUyxLQUFLLEdBQzFDLEtBQUssT0FDSCxjQUFjLE1BQU0sQ0FBQyxTQUFTLFlBQVksR0FDMUMsNEJBQTRCLFVBQVUsT0FDdEMsZ0NBQWdDLFVBQVUsS0FDNUM7TUFFQSxLQUFLLE9BQ0gsVUFBVSxjQUNWLDRCQUE0QixVQUFVLE9BQ3RDLGdDQUFnQyxVQUFVLEtBQzVDO0FBRUo7QUFDQSxPQUFPLElBQUksSUFBSTtBQUNmLFVBQVUsbUJBQW1CLE1BQU0sRUFBRTtBQUNyQyxVQUFVLG1CQUFtQixLQUFLLEVBQUU7QUFDcEMsU0FBUyxjQUFjLEdBQUcsR0FBRztDQUMzQixPQUFPLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLE1BQU07QUFDekM7QUFDQSxPQUFPLGVBQWUsZUFBZTtBQUNyQyxTQUFTLDBCQUEwQjtDQUNqQyxNQUFNLE1BQU0sWUFBWSxJQUFJO0FBQzlCO0FBQ0EsT0FBTyx5QkFBeUIseUJBQXlCO0FBQ3pELFNBQVMsUUFBUSxLQUFLLEtBQUs7Q0FDekIsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxNQUFNLE1BQU0sTUFBTSxRQUFRLEdBQUcsVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFlBQVksR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUcsU0FBUyxNQUFNLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxTQUFTLE1BQU0sTUFBTSxNQUFNLEdBQUcsYUFBYSxTQUFTLFVBQVUsSUFBSSxRQUFRLFNBQVMsTUFBTSxNQUFNLEtBQUssSUFBSTtDQUMxUSxVQUFVLFVBQVUsVUFBVSxPQUFPO0NBQ3JDLElBQUksV0FBVztDQUNmLFFBQVEsU0FBUjtFQUNFLEtBQUs7R0FDSCxXQUFXLElBQUksUUFBUSxHQUFHLE1BQU07R0FDaEM7RUFDRixLQUFLO0dBQ0gsSUFBSSxRQUNGLE1BQU0sSUFBSSxlQUNSLFVBQVUsNENBQ1YsS0FBSyxHQUNMLElBQ0Y7R0FFRixXQUFXLElBQUksSUFBSSxHQUFHO0dBQ3RCO0VBQ0YsS0FBSztHQUNILElBQUksUUFBUSxTQUFTLE1BQU07SUFDekIsV0FBVyxZQUFZLE1BQU0sTUFBTSxHQUFHO0dBQ3hDLENBQUM7R0FDRDtFQUNGLEtBQUs7R0FDSCxJQUFJLFFBQ0YsSUFBSSxRQUFRLFNBQVMsTUFBTTtJQUN6QixXQUFXLFlBQVksTUFBTSxNQUFNLEdBQUc7R0FDeEMsQ0FBQztRQUVELFdBQVcsSUFBSSxJQUFJLEdBQUc7R0FFeEI7RUFDRixLQUFLO0dBQ0gsSUFBSSxRQUNGLFdBQVcsSUFBSSxLQUFLLFNBQVMsTUFBTTtJQUNqQyxPQUFPLE1BQU0sTUFBTSxHQUFHO0dBQ3hCLENBQUM7UUFFRCxXQUFXLElBQUksUUFBUSxHQUFHLE1BQU07R0FFbEM7RUFDRixTQUFTO0dBQ1AsSUFBSSxRQUFRLE9BQU8sR0FBRyxHQUNwQixNQUFNLElBQUksZUFDUixVQUFVLHlDQUF5QyxVQUFVLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUkseUhBQXlILEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUNoUCxLQUFLLEdBQ0wsSUFDRjtHQUVGLElBQUksUUFBUSxPQUFPLEtBQUssR0FBRztHQUMzQixJQUFJLFdBQVc7R0FDZixJQUFJLFVBQVU7R0FDZCxNQUFNLFFBQVEsU0FBUyxNQUFNO0lBQzNCLElBQUksZ0JBQWdCLElBQUksVUFBVSxHQUFHO0lBQ3JDLGNBQWMsTUFBTSxlQUFlLElBQUk7SUFDdkMsTUFBTSxlQUFlLFlBQVksSUFBSTtJQUNyQyxJQUFJLENBQUMsVUFBVSxNQUFNLFdBQVcsR0FBRztLQUNqQyxjQUFjLFNBQVMsTUFBTSxJQUFJLEtBQUs7S0FDdEM7SUFDRjtJQUNBLElBQUk7S0FDRixjQUFjLFNBQVMsTUFBTSxJQUFJLEtBQUs7SUFDeEMsU0FBUyxLQUFLO0tBQ1osSUFBSSxDQUFDLG9CQUFvQixzQkFBc0IsS0FBSyxjQUFjLEdBQ2hFLE1BQU07S0FFUixJQUFJLGFBQWEsTUFBTSxXQUFXO0tBQ2xDO0lBQ0Y7R0FDRixHQUFHLElBQUk7R0FDUCxJQUFJLFVBQVUsTUFBTSxTQUFTLEtBQUssWUFBWSxNQUFNLFFBQ2xELE1BQU07R0FFUjtFQUNGO0NBQ0Y7Q0FDQSxLQUFLLE9BQ0gsVUFDQSx5QkFBeUIsYUFBYSxhQUFhLFNBQVMsR0FBRyxHQUMvRCw2QkFBNkIsYUFBYSxhQUFhLFNBQVMsR0FBRyxDQUNyRTtBQUNGO0FBQ0EsT0FBTyxTQUFTLFNBQVM7QUFDekIsVUFBVSxtQkFBbUIsV0FBVyxTQUFTLHVCQUF1QjtBQUN4RSxVQUFVLG1CQUFtQixXQUFXLFNBQVMsdUJBQXVCO0FBQ3hFLFVBQVUsbUJBQW1CLFlBQVksU0FBUyx1QkFBdUI7QUFDekUsVUFBVSxtQkFBbUIsWUFBWSxTQUFTLHVCQUF1QjtBQUN6RSxVQUFVLFlBQVksTUFBTSxXQUFXO0NBQ3JDLEtBQUssT0FDSCxNQUFNLE1BQU0sUUFBUSxHQUNwQixpQ0FDQSw4QkFDRjtBQUNGLENBQUM7QUFDRCxVQUFVLFlBQVksUUFBUSxXQUFXO0NBQ3ZDLEtBQUssT0FDSCxTQUFTLE1BQU0sTUFBTSxRQUFRLEdBQzdCLCtCQUNBLGdDQUNBLE1BQU0sTUFBTSxRQUFRLElBQUksUUFBUSxJQUNsQztBQUNGLENBQUM7QUFDRCxVQUFVLFlBQVksV0FBVyxXQUFXO0NBQzFDLE1BQU0sU0FBUyxNQUFNLE1BQU0sUUFBUTtDQUNuQyxLQUFLLE9BQ0gsQ0FBQyxVQUFVLFFBQVEsQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsR0FDMUMsa0NBQ0Esc0NBQ0EsTUFBTSxNQUFNLFFBQVEsSUFBSSxRQUFRLElBQ2xDO0FBQ0YsQ0FBQztBQUNELFVBQVUsWUFBWSxZQUFZLFdBQVc7Q0FDM0MsTUFBTSxNQUFNLE1BQU0sTUFBTSxRQUFRO0NBQ2hDLE1BQU0sT0FBTyxNQUFNLE1BQU0sTUFBTTtDQUMvQixNQUFNLFVBQVUsTUFBTSxNQUFNLFNBQVM7Q0FDckMsTUFBTSxNQUFNLFVBQVUsR0FBRyxRQUFRLE1BQU07Q0FDdkMsTUFBTSxTQUFTLE1BQU0sTUFBTSxRQUFRO0NBQ25DLE1BQU0sbUJBQW1CLFNBQVMsR0FBRyxJQUFJLFdBQVcsU0FBUyxHQUFHLEVBQUUsa0NBQWtDLEdBQUcsSUFBSSxXQUFXLFNBQVMsR0FBRyxFQUFFO0NBQ3BJLE1BQU0sYUFBYTtFQUNqQjtFQUNBO0VBQ0E7RUFDQTtDQUNGLENBQUMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDO0NBQ3BCLElBQUksY0FBYyxVQUFVLENBQUMsY0FBYyxDQUFDLFFBQzFDLE1BQU0sSUFBSSxlQUFlLGtCQUFrQixLQUFLLEdBQUcsSUFBSTtBQUUzRCxDQUFDO0FBQ0QsVUFBVSxZQUFZLFNBQVMsV0FBVztDQUN4QyxLQUFLLE9BQ0gsVUFBVSxNQUFNLE1BQU0sUUFBUSxHQUM5QixnQ0FDQSwrQkFDQSxNQUFNLE1BQU0sUUFBUSxJQUFJLE9BQU8sS0FDakM7QUFDRixDQUFDO0FBQ0QsVUFBVSxZQUFZLFFBQVEsV0FBVztDQUN2QyxLQUFLLE9BQ0gsU0FBUyxNQUFNLE1BQU0sUUFBUSxHQUM3QiwrQkFDQSxpQ0FDRjtBQUNGLENBQUM7QUFDRCxVQUFVLFlBQVksYUFBYSxXQUFXO0NBQzVDLEtBQUssT0FDSCxLQUFLLE1BQU0sTUFBTSxNQUFNLFFBQVEsR0FDL0Isb0NBQ0Esc0NBQ0Y7QUFDRixDQUFDO0FBQ0QsVUFBVSxZQUFZLE9BQU8sV0FBVztDQUN0QyxLQUFLLE9BQ0gsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDLEdBQzVCLDhCQUNBLGdDQUNGO0FBQ0YsQ0FBQztBQUNELFNBQVMsY0FBYztDQUNyQixJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsS0FBSyxPQUNILFFBQVEsUUFBUSxRQUFRLEtBQUssR0FDN0IsNkJBQ0EsK0JBQ0Y7QUFDRjtBQUNBLE9BQU8sYUFBYSxhQUFhO0FBQ2pDLFVBQVUsWUFBWSxTQUFTLFdBQVc7QUFDMUMsVUFBVSxZQUFZLFVBQVUsV0FBVztBQUMzQyxVQUFVLFlBQVksU0FBUyxXQUFXO0NBQ3hDLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUc7Q0FDL0YsVUFBVSxVQUFVLFVBQVUsT0FBTztDQUNyQyxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUE5QjtFQUNFLEtBQUs7RUFDTCxLQUFLO0dBQ0gsYUFBYSxJQUFJO0dBQ2pCO0VBQ0YsS0FBSztFQUNMLEtBQUs7R0FDSCxhQUFhLElBQUk7R0FDakI7RUFDRixLQUFLO0VBQ0wsS0FBSyxXQUNILE1BQU0sSUFBSSxlQUNSLFVBQVUsdUNBQ1YsS0FBSyxHQUNMLElBQ0Y7RUFDRixLQUFLLFlBRUgsTUFBTSxJQUFJLGdCQURFLFVBQVUsa0NBQWtDLFFBQVEsR0FBRyxFQUMxQyxDQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSTtFQUVuRDtHQUNFLElBQUksUUFBUSxPQUFPLEdBQUcsR0FDcEIsTUFBTSxJQUFJLGVBQ1IsVUFBVSw0Q0FBNEMsU0FBUyxHQUFHLEdBQ2xFLEtBQUssR0FDTCxJQUNGO0dBRUYsYUFBYSxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbEM7Q0FDQSxLQUFLLE9BQ0gsTUFBTSxZQUNOLGdDQUNBLGtDQUNGO0FBQ0YsQ0FBQztBQUNELFNBQVMsaUJBQWlCO0NBQ3hCLElBQWlDLFFBQVEsS0FBL0IsTUFBTSxNQUFNLFFBQXdCLENBQUc7Q0FDakQsS0FBSyxPQUNILGdCQUFnQixPQUNoQiw4Q0FBOEMsT0FDOUMsc0NBQ0Y7QUFDRjtBQUNBLE9BQU8sZ0JBQWdCLGdCQUFnQjtBQUN2QyxVQUFVLFlBQVksYUFBYSxjQUFjO0FBQ2pELFVBQVUsWUFBWSxhQUFhLGNBQWM7QUFDakQsU0FBUyxZQUFZLEtBQUssS0FBSztDQUM3QixJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsSUFBSSxNQUFNLE1BQU0sTUFBTSxHQUFHO0VBQ3ZCLElBQUksZUFBZSxNQUFNLE1BQU0sVUFBVTtFQUN6QyxNQUFNLE1BQU0sWUFBWSxJQUFJO0VBQzVCLEtBQUssSUFBSSxHQUFHO0VBQ1osTUFBTSxNQUFNLFlBQVksWUFBWTtDQUN0QyxPQUNFLEtBQUssT0FDSCxRQUFRLEtBQ1Isb0NBQ0Esd0NBQ0EsS0FDQSxLQUFLLE1BQ0wsSUFDRjtBQUVKO0FBQ0EsT0FBTyxhQUFhLGFBQWE7QUFDakMsVUFBVSxVQUFVLFNBQVMsV0FBVztBQUN4QyxVQUFVLFVBQVUsVUFBVSxXQUFXO0FBQ3pDLFVBQVUsVUFBVSxNQUFNLFdBQVc7QUFDckMsU0FBUyxVQUFVLEtBQUssS0FBSztDQUMzQixJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLE1BQU0sTUFBTSxNQUFNLEtBQUs7Q0FDM0IsS0FBSyxPQUNILElBQUksS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDLEdBQzlCLDJDQUNBLCtDQUNBLEtBQ0EsS0FBSyxNQUNMLElBQ0Y7QUFDRjtBQUNBLE9BQU8sV0FBVyxXQUFXO0FBQzdCLFVBQVUsVUFBVSxPQUFPLFNBQVM7QUFDcEMsVUFBVSxVQUFVLFFBQVEsU0FBUztBQUNyQyxTQUFTLFlBQVksR0FBRyxLQUFLO0NBQzNCLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLFdBQVcsTUFBTSxNQUFNLFVBQVUsR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUcsWUFBWSxVQUFVLFVBQVUsT0FBTyxJQUFJLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZO0NBQzdPLElBQUksWUFBWSxZQUFZLFNBQVMsWUFBWSxPQUMvQyxJQUFJLFVBQVUsS0FBSyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsUUFBUTtDQUVuRSxJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsVUFBVSxRQUMvQyxNQUFNLElBQUksZUFDUixZQUFZLHdDQUNaLEtBQUssR0FDTCxJQUNGO01BQ0ssSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxHQUFHLElBQ3BELE1BQU0sSUFBSSxlQUNSLFlBQVksMENBQ1osS0FBSyxHQUNMLElBQ0Y7TUFDSyxJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRztFQUM3RCxJQUFJLFdBQVcsWUFBWSxXQUFXLE1BQU0sTUFBTSxNQUFNO0VBQ3hELE1BQU0sSUFBSSxlQUNSLFlBQVksY0FBYyxXQUFXLDZCQUNyQyxLQUFLLEdBQ0wsSUFDRjtDQUNGO0NBQ0EsSUFBSSxVQUFVO0VBQ1osSUFBSSxhQUFhLFVBQVU7RUFDM0IsSUFBSSxZQUFZLFNBQVMsWUFBWSxPQUFPO0dBQzFDLGFBQWE7R0FDYixhQUFhLElBQUk7RUFDbkIsT0FDRSxhQUFhLElBQUk7RUFFbkIsS0FBSyxPQUNILGFBQWEsR0FDYixnQ0FBZ0MsYUFBYSxnQ0FDN0Msb0NBQW9DLGFBQWEsaUJBQ2pELEdBQ0EsVUFDRjtDQUNGLE9BQ0UsS0FBSyxPQUNILE1BQU0sR0FDTix1Q0FDQSx5Q0FDQSxDQUNGO0FBRUo7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUNqQyxVQUFVLFVBQVUsU0FBUyxXQUFXO0FBQ3hDLFVBQVUsVUFBVSxNQUFNLFdBQVc7QUFDckMsVUFBVSxVQUFVLGVBQWUsV0FBVztBQUM5QyxTQUFTLFlBQVksR0FBRyxLQUFLO0NBQzNCLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLFdBQVcsTUFBTSxNQUFNLFVBQVUsR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUcsWUFBWSxVQUFVLFVBQVUsT0FBTyxJQUFJLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsY0FBYyxjQUFjO0NBQzVRLElBQUksWUFBWSxZQUFZLFNBQVMsWUFBWSxPQUMvQyxJQUFJLFVBQVUsS0FBSyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsUUFBUTtDQUVuRSxJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsVUFBVSxRQUMvQyxlQUFlLFlBQVk7TUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxHQUFHLElBQ3BELGVBQWUsWUFBWTtNQUN0QixJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRztFQUM3RCxJQUFJLFdBQVcsWUFBWSxXQUFXLE1BQU0sTUFBTSxNQUFNO0VBQ3hELGVBQWUsWUFBWSxjQUFjLFdBQVc7Q0FDdEQsT0FDRSxjQUFjO0NBRWhCLElBQUksYUFDRixNQUFNLElBQUksZUFBZSxjQUFjLEtBQUssR0FBRyxJQUFJO0NBRXJELElBQUksVUFBVTtFQUNaLElBQUksYUFBYSxVQUFVO0VBQzNCLElBQUksWUFBWSxTQUFTLFlBQVksT0FBTztHQUMxQyxhQUFhO0dBQ2IsYUFBYSxJQUFJO0VBQ25CLE9BQ0UsYUFBYSxJQUFJO0VBRW5CLEtBQUssT0FDSCxjQUFjLEdBQ2QsZ0NBQWdDLGFBQWEsbUNBQzdDLGdDQUFnQyxhQUFhLGlCQUM3QyxHQUNBLFVBQ0Y7Q0FDRixPQUNFLEtBQUssT0FDSCxPQUFPLEdBQ1AsMENBQ0EsdUNBQ0EsQ0FDRjtBQUVKO0FBQ0EsT0FBTyxhQUFhLGFBQWE7QUFDakMsVUFBVSxVQUFVLFNBQVMsV0FBVztBQUN4QyxVQUFVLFVBQVUsT0FBTyxXQUFXO0FBQ3RDLFVBQVUsVUFBVSxzQkFBc0IsV0FBVztBQUNyRCxTQUFTLFlBQVksR0FBRyxLQUFLO0NBQzNCLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLFdBQVcsTUFBTSxNQUFNLFVBQVUsR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUcsWUFBWSxVQUFVLFVBQVUsT0FBTyxJQUFJLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsY0FBYyxjQUFjO0NBQzVRLElBQUksWUFBWSxZQUFZLFNBQVMsWUFBWSxPQUMvQyxJQUFJLFVBQVUsS0FBSyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsUUFBUTtDQUVuRSxJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsVUFBVSxRQUMvQyxlQUFlLFlBQVk7TUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFlBQVksVUFBVSxHQUFHLElBQ3BELGVBQWUsWUFBWTtNQUN0QixJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRztFQUM3RCxJQUFJLFdBQVcsWUFBWSxXQUFXLE1BQU0sTUFBTSxNQUFNO0VBQ3hELGVBQWUsWUFBWSxjQUFjLFdBQVc7Q0FDdEQsT0FDRSxjQUFjO0NBRWhCLElBQUksYUFDRixNQUFNLElBQUksZUFBZSxjQUFjLEtBQUssR0FBRyxJQUFJO0NBRXJELElBQUksVUFBVTtFQUNaLElBQUksYUFBYSxVQUFVO0VBQzNCLElBQUksWUFBWSxTQUFTLFlBQVksT0FBTztHQUMxQyxhQUFhO0dBQ2IsYUFBYSxJQUFJO0VBQ25CLE9BQ0UsYUFBYSxJQUFJO0VBRW5CLEtBQUssT0FDSCxhQUFhLEdBQ2IsZ0NBQWdDLGFBQWEsZ0NBQzdDLG9DQUFvQyxhQUFhLGlCQUNqRCxHQUNBLFVBQ0Y7Q0FDRixPQUNFLEtBQUssT0FDSCxNQUFNLEdBQ04sdUNBQ0EsMENBQ0EsQ0FDRjtBQUVKO0FBQ0EsT0FBTyxhQUFhLGFBQWE7QUFDakMsVUFBVSxVQUFVLFNBQVMsV0FBVztBQUN4QyxVQUFVLFVBQVUsTUFBTSxXQUFXO0FBQ3JDLFVBQVUsVUFBVSxZQUFZLFdBQVc7QUFDM0MsU0FBUyxXQUFXLEdBQUcsS0FBSztDQUMxQixJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVEsR0FBRyxXQUFXLE1BQU0sTUFBTSxVQUFVLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLFlBQVksVUFBVSxVQUFVLE9BQU8sSUFBSSxPQUFPLE1BQU0sTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFlBQVksR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLGNBQWMsY0FBYztDQUM1USxJQUFJLFlBQVksWUFBWSxTQUFTLFlBQVksT0FDL0MsSUFBSSxVQUFVLEtBQUssU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLFFBQVE7Q0FFbkUsSUFBSSxDQUFDLFlBQVksWUFBWSxVQUFVLFVBQVUsUUFDL0MsZUFBZSxZQUFZO01BQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxZQUFZLFVBQVUsR0FBRyxJQUNwRCxlQUFlLFlBQVk7TUFDdEIsSUFBSSxDQUFDLFlBQVksWUFBWSxVQUFVLENBQUMsVUFBVSxHQUFHLEdBQUc7RUFDN0QsSUFBSSxXQUFXLFlBQVksV0FBVyxNQUFNLE1BQU0sTUFBTTtFQUN4RCxlQUFlLFlBQVksY0FBYyxXQUFXO0NBQ3RELE9BQ0UsY0FBYztDQUVoQixJQUFJLGFBQ0YsTUFBTSxJQUFJLGVBQWUsY0FBYyxLQUFLLEdBQUcsSUFBSTtDQUVyRCxJQUFJLFVBQVU7RUFDWixJQUFJLGFBQWEsVUFBVTtFQUMzQixJQUFJLFlBQVksU0FBUyxZQUFZLE9BQU87R0FDMUMsYUFBYTtHQUNiLGFBQWEsSUFBSTtFQUNuQixPQUNFLGFBQWEsSUFBSTtFQUVuQixLQUFLLE9BQ0gsY0FBYyxHQUNkLGdDQUFnQyxhQUFhLGtDQUM3QyxnQ0FBZ0MsYUFBYSxpQkFDN0MsR0FDQSxVQUNGO0NBQ0YsT0FDRSxLQUFLLE9BQ0gsT0FBTyxHQUNQLHlDQUNBLHVDQUNBLENBQ0Y7QUFFSjtBQUNBLE9BQU8sWUFBWSxZQUFZO0FBQy9CLFVBQVUsVUFBVSxRQUFRLFVBQVU7QUFDdEMsVUFBVSxVQUFVLE9BQU8sVUFBVTtBQUNyQyxVQUFVLFVBQVUsbUJBQW1CLFVBQVU7QUFDakQsVUFBVSxVQUFVLFVBQVUsU0FBUyxPQUFPLFFBQVEsS0FBSztDQUN6RCxJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVEsR0FBRyxXQUFXLE1BQU0sTUFBTSxVQUFVLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLFlBQVksVUFBVSxVQUFVLE9BQU8sSUFBSSxPQUFPLE1BQU0sTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFlBQVksR0FBRyxZQUFZLEtBQUssS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLGFBQWEsS0FBSyxNQUFNLENBQUMsQ0FBQyxZQUFZLEdBQUcsY0FBYyxjQUFjLE1BQU0sUUFBUSxjQUFjLFVBQVUsZUFBZSxTQUFTLE1BQU0sWUFBWSxJQUFJLE9BQU8sT0FBTyxZQUFZLElBQUksUUFBUSxPQUFPO0NBQzliLElBQUksWUFBWSxZQUFZLFNBQVMsWUFBWSxPQUMvQyxJQUFJLFVBQVUsS0FBSyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsUUFBUTtDQUVuRSxJQUFJLENBQUMsWUFBWSxZQUFZLFdBQVcsY0FBYyxVQUFVLGVBQWUsU0FDN0UsZUFBZSxZQUFZO01BQ3RCLEtBQUssQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLFVBQVUsTUFBTSxPQUFPLFlBQVksVUFBVSxHQUFHLElBQ2hGLGVBQWUsWUFBWTtNQUN0QixJQUFJLENBQUMsWUFBWSxZQUFZLFVBQVUsQ0FBQyxVQUFVLEdBQUcsR0FBRztFQUM3RCxJQUFJLFdBQVcsWUFBWSxXQUFXLE1BQU0sTUFBTSxNQUFNO0VBQ3hELGVBQWUsWUFBWSxjQUFjLFdBQVc7Q0FDdEQsT0FDRSxjQUFjO0NBRWhCLElBQUksYUFDRixNQUFNLElBQUksZUFBZSxjQUFjLEtBQUssR0FBRyxJQUFJO0NBRXJELElBQUksVUFBVTtFQUNaLElBQUksYUFBYSxVQUFVO0VBQzNCLElBQUksWUFBWSxTQUFTLFlBQVksT0FBTztHQUMxQyxhQUFhO0dBQ2IsYUFBYSxJQUFJO0VBQ25CLE9BQ0UsYUFBYSxJQUFJO0VBRW5CLEtBQUssT0FDSCxjQUFjLFNBQVMsY0FBYyxRQUNyQyxnQ0FBZ0MsYUFBYSxhQUFhLE9BQzFELG9DQUFvQyxhQUFhLGFBQWEsS0FDaEU7Q0FDRixPQUNFLEtBQUssT0FDSCxPQUFPLFNBQVMsT0FBTyxRQUN2QixtQ0FBbUMsT0FDbkMsdUNBQXVDLEtBQ3pDO0FBRUosQ0FBQztBQUNELFNBQVMsaUJBQWlCLGFBQWEsS0FBSztDQUMxQyxJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLFNBQVMsTUFBTSxNQUFNLFFBQVE7Q0FDakMsSUFBSSxPQUFPLE1BQU0sTUFBTSxNQUFNO0NBQzdCLElBQUksVUFBVSxNQUFNLE1BQU0sU0FBUztDQUNuQyxJQUFJO0NBQ0osSUFBSTtFQUNGLGVBQWUsa0JBQWtCO0NBQ25DLFNBQVMsS0FBSztFQUNaLElBQUksZUFBZSxXQUFXO0dBQzVCLFVBQVUsVUFBVSxVQUFVLE9BQU87R0FDckMsTUFBTSxJQUFJLGVBQ1IsVUFBVSxzREFBc0QsS0FBSyxXQUFXLElBQUksZUFDcEYsS0FBSyxHQUNMLElBQ0Y7RUFDRjtFQUNBLE1BQU07Q0FDUjtDQUNBLElBQUksT0FBTyxRQUFRLFdBQVc7Q0FDOUIsSUFBSSxRQUFRLE1BQ1YsT0FBTztDQUVULEtBQUssT0FDSCxjQUNBLDJDQUEyQyxNQUMzQywrQ0FBK0MsSUFDakQ7QUFDRjtBQUNBLE9BQU8sa0JBQWtCLGtCQUFrQjtBQUMzQyxVQUFVLFVBQVUsY0FBYyxnQkFBZ0I7QUFDbEQsVUFBVSxVQUFVLGNBQWMsZ0JBQWdCO0FBQ2xELFNBQVMsZUFBZSxNQUFNLEtBQUssS0FBSztDQUN0QyxJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLFdBQVcsTUFBTSxNQUFNLFFBQVEsR0FBRyxRQUFRLE1BQU0sTUFBTSxLQUFLLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxNQUFNLFFBQVEsR0FBRyxPQUFPLE1BQU0sTUFBTSxNQUFNLEdBQUcsV0FBVyxPQUFPO0NBQy9LLFVBQVUsVUFBVSxVQUFVLE9BQU87Q0FDckMsSUFBSSxVQUNGO01BQUksYUFBYSxVQUNmLE1BQU0sSUFBSSxlQUNSLFVBQVUsc0VBQ1YsS0FBSyxHQUNMLElBQ0Y7Q0FDRixPQUVBLElBQUksYUFBYSxZQUFZLGFBQWEsWUFBWSxhQUFhLFVBQ2pFLE1BQU0sSUFBSSxlQUNSLFVBQVUsZ0VBQ1YsS0FBSyxHQUNMLElBQ0Y7Q0FHSixJQUFJLFlBQVksT0FDZCxNQUFNLElBQUksZUFDUixVQUFVLHdEQUNWLEtBQUssR0FDTCxJQUNGO0NBRUYsSUFBSSxRQUFRLFFBQVEsUUFBUSxLQUFLLEdBQy9CLE1BQU0sSUFBSSxlQUNSLFVBQVUsdUNBQ1YsS0FBSyxHQUNMLElBQ0Y7Q0FFRixJQUFJLFNBQVMsTUFBTSxNQUFNLE1BQU0sR0FBRyxTQUFTLE1BQU0sTUFBTSxRQUFRLEdBQUcsV0FBVyxXQUFXLFlBQVksS0FBSyxJQUFJLElBQUksTUFBTSxRQUFRLFdBQVcsU0FBUyxRQUFRLElBQUksT0FBTyxRQUFRLFNBQVMsTUFBTSxNQUFNLEtBQUssS0FBSyxNQUFNLFNBQVMsU0FBUztDQUNyTyxJQUFJLGFBQWE7Q0FDakIsSUFBSSxRQUFRLGNBQWM7Q0FDMUIsSUFBSSxPQUFPLGNBQWM7Q0FDekIsSUFBSSxVQUFVLGNBQWM7Q0FDNUIsY0FBYztDQUNkLElBQUk7Q0FDSixJQUFJLE9BQU8sZUFBZSxPQUFPLFVBQVUsZUFBZSxLQUFLLEtBQUssSUFBSTtNQUNuRSxJQUFJLFVBQVUsZUFBZSxTQUFTO01BQ3RDLGVBQWUsWUFBWSxLQUFLLElBQUk7Q0FDekMsSUFBSSxDQUFDLFVBQVUsVUFBVSxXQUFXLEdBQ2xDLEtBQUssT0FDSCxjQUNBLDhCQUE4QixhQUFhLFNBQVMsSUFBSSxHQUN4RCxrQ0FBa0MsYUFBYSxTQUFTLElBQUksQ0FDOUQ7Q0FFRixJQUFJLFVBQVUsU0FBUyxHQUNyQixLQUFLLE9BQ0gsZ0JBQWdCLE1BQU0sS0FBSyxLQUFLLEdBQ2hDLDhCQUE4QixhQUFhLFNBQVMsSUFBSSxJQUFJLDhCQUM1RCxrQ0FBa0MsYUFBYSxTQUFTLElBQUksSUFBSSxjQUNoRSxLQUNBLEtBQ0Y7Q0FFRixNQUFNLE1BQU0sVUFBVSxLQUFLO0FBQzdCO0FBQ0EsT0FBTyxnQkFBZ0IsZ0JBQWdCO0FBQ3ZDLFVBQVUsVUFBVSxZQUFZLGNBQWM7QUFDOUMsU0FBUyxrQkFBa0IsT0FBTyxRQUFRLE1BQU07Q0FDOUMsTUFBTSxNQUFNLE9BQU8sSUFBSTtDQUN2QixlQUFlLE1BQU0sTUFBTSxTQUFTO0FBQ3RDO0FBQ0EsT0FBTyxtQkFBbUIsbUJBQW1CO0FBQzdDLFVBQVUsVUFBVSxlQUFlLGlCQUFpQjtBQUNwRCxVQUFVLFVBQVUsbUJBQW1CLGlCQUFpQjtBQUN4RCxTQUFTLDRCQUE0QixNQUFNLFlBQVksS0FBSztDQUMxRCxJQUFJLE9BQU8sZUFBZSxVQUFVO0VBQ2xDLE1BQU07RUFDTixhQUFhO0NBQ2Y7Q0FDQSxJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsSUFBSSxtQkFBbUIsT0FBTyx5QkFBeUIsT0FBTyxHQUFHLEdBQUcsSUFBSTtDQUN4RSxJQUFJLE1BQU0sTUFBTSxNQUFNLEtBQUs7Q0FDM0IsSUFBSSxvQkFBb0IsWUFDdEIsS0FBSyxPQUNILElBQUksWUFBWSxnQkFBZ0IsR0FDaEMsOENBQThDLFNBQVMsSUFBSSxJQUFJLDBCQUEwQixTQUFTLFVBQVUsSUFBSSxXQUFXLFNBQVMsZ0JBQWdCLEdBQ3BKLDhDQUE4QyxTQUFTLElBQUksSUFBSSw4QkFBOEIsU0FBUyxVQUFVLEdBQ2hILFlBQ0Esa0JBQ0EsSUFDRjtNQUVBLEtBQUssT0FDSCxrQkFDQSw2REFBNkQsU0FBUyxJQUFJLEdBQzFFLGlFQUFpRSxTQUFTLElBQUksQ0FDaEY7Q0FFRixNQUFNLE1BQU0sVUFBVSxnQkFBZ0I7QUFDeEM7QUFDQSxPQUFPLDZCQUE2Qiw2QkFBNkI7QUFDakUsVUFBVSxVQUFVLHlCQUF5QiwyQkFBMkI7QUFDeEUsVUFBVSxVQUFVLDZCQUE2QiwyQkFBMkI7QUFDNUUsU0FBUyxvQkFBb0I7Q0FDM0IsTUFBTSxNQUFNLFlBQVksSUFBSTtBQUM5QjtBQUNBLE9BQU8sbUJBQW1CLG1CQUFtQjtBQUM3QyxTQUFTLGFBQWEsR0FBRyxLQUFLO0NBQzVCLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxhQUFhLFVBQVU7Q0FDekosUUFBUSxTQUFSO0VBQ0UsS0FBSztFQUNMLEtBQUs7R0FDSCxhQUFhO0dBQ2IsYUFBYSxJQUFJO0dBQ2pCO0VBQ0Y7R0FDRSxJQUFJLFVBQVUsS0FBSyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsUUFBUTtHQUNqRSxhQUFhLElBQUk7Q0FDckI7Q0FDQSxLQUFLLE9BQ0gsY0FBYyxHQUNkLGdDQUFnQyxhQUFhLDZCQUM3QyxvQ0FBb0MsYUFBYSxjQUNqRCxHQUNBLFVBQ0Y7QUFDRjtBQUNBLE9BQU8sY0FBYyxjQUFjO0FBQ25DLFVBQVUsbUJBQW1CLFVBQVUsY0FBYyxpQkFBaUI7QUFDdEUsVUFBVSxtQkFBbUIsWUFBWSxjQUFjLGlCQUFpQjtBQUN4RSxTQUFTLFlBQVksSUFBSSxLQUFLO0NBQzVCLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUTtDQUM5QixLQUFLLE9BQ0gsR0FBRyxLQUFLLEdBQUcsR0FDWCwrQkFBK0IsSUFDL0IsbUNBQW1DLEVBQ3JDO0FBQ0Y7QUFDQSxPQUFPLGFBQWEsYUFBYTtBQUNqQyxVQUFVLFVBQVUsU0FBUyxXQUFXO0FBQ3hDLFVBQVUsVUFBVSxXQUFXLFdBQVc7QUFDMUMsVUFBVSxVQUFVLFVBQVUsU0FBUyxLQUFLLEtBQUs7Q0FDL0MsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxNQUFNLE1BQU0sTUFBTSxRQUFRO0NBQzlCLElBQUksVUFBVSxLQUQ2QixNQUFNLE1BQU0sU0FDcEMsR0FEdUQsTUFBTSxNQUFNLE1BQzFELEdBQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVE7Q0FDckQsS0FBSyxPQUNILENBQUMsSUFBSSxRQUFRLEdBQUcsR0FDaEIsaUNBQWlDLFNBQVMsR0FBRyxHQUM3QyxxQ0FBcUMsU0FBUyxHQUFHLENBQ25EO0FBQ0YsQ0FBQztBQUNELFNBQVMsV0FBVyxNQUFNO0NBQ3hCLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLFVBQVUsS0FBSyxHQUFHLEdBQUcsV0FBVyxLQUFLLElBQUksR0FBRyxPQUFPLE1BQU0sTUFBTSxNQUFNLEdBQUcsU0FBUyxNQUFNLE1BQU0sTUFBTSxHQUFHLEtBQUssVUFBVSxJQUFJLFFBQVEsS0FBSyxNQUFNLFVBQVUsTUFBTSxNQUFNLFNBQVM7Q0FDNU0sVUFBVSxVQUFVLFVBQVUsT0FBTztDQUNyQyxJQUFJLGVBQWUsVUFBVTtDQUM3QixJQUFJLFlBQVksU0FBUyxZQUFZLE9BQU87RUFDMUMsVUFBVSxTQUFTLFlBQVk7RUFDL0IsU0FBUyxDQUFDO0VBQ1YsSUFBSSxRQUFRLFNBQVMsS0FBSyxLQUFLO0dBQzdCLE9BQU8sS0FBSyxHQUFHO0VBQ2pCLENBQUM7RUFDRCxJQUFJLGFBQWEsU0FDZixPQUFPLE1BQU0sVUFBVSxNQUFNLEtBQUssU0FBUztDQUUvQyxPQUFPO0VBQ0wsU0FBUywyQkFBMkIsR0FBRztFQUN2QyxRQUFRLFVBQVI7R0FDRSxLQUFLO0lBQ0gsSUFBSSxVQUFVLFNBQVMsR0FDckIsTUFBTSxJQUFJLGVBQWUsY0FBYyxLQUFLLEdBQUcsSUFBSTtJQUVyRDtHQUNGLEtBQUs7SUFDSCxJQUFJLFVBQVUsU0FBUyxHQUNyQixNQUFNLElBQUksZUFBZSxjQUFjLEtBQUssR0FBRyxJQUFJO0lBRXJELE9BQU8sT0FBTyxLQUFLLElBQUk7SUFDdkI7R0FDRixTQUNFLE9BQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxTQUFTO0VBQy9DO0VBQ0EsT0FBTyxLQUFLLElBQUksU0FBUyxLQUFLO0dBQzVCLE9BQU8sT0FBTyxRQUFRLFdBQVcsTUFBTSxPQUFPLEdBQUc7RUFDbkQsQ0FBQztDQUNIO0NBQ0EsSUFBSSxDQUFDLEtBQUssUUFDUixNQUFNLElBQUksZUFBZSxVQUFVLGlCQUFpQixLQUFLLEdBQUcsSUFBSTtDQUVsRSxJQUFJLE1BQU0sS0FBSyxRQUFRLE1BQU0sTUFBTSxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sTUFBTSxLQUFLLEdBQUcsV0FBVyxNQUFNLFFBQVEsU0FBUyxNQUFNLE1BQU0sS0FBSyxLQUFLLE1BQU0sU0FBUyxTQUFTO0NBQzNKLElBQUksQ0FBQyxPQUFPLENBQUMsS0FDWCxNQUFNO0NBRVIsSUFBSSxLQUNGLEtBQUssU0FBUyxLQUFLLFNBQVMsYUFBYTtFQUN2QyxPQUFPLE9BQU8sS0FBSyxTQUFTLFdBQVc7R0FDckMsT0FBTyxNQUFNLGFBQWEsU0FBUztFQUNyQyxDQUFDO0NBQ0gsQ0FBQztDQUVILElBQUksS0FBSztFQUNQLEtBQUssU0FBUyxNQUFNLFNBQVMsYUFBYTtHQUN4QyxPQUFPLE9BQU8sS0FBSyxTQUFTLFdBQVc7SUFDckMsT0FBTyxNQUFNLGFBQWEsU0FBUztHQUNyQyxDQUFDO0VBQ0gsQ0FBQztFQUNELElBQUksQ0FBQyxNQUFNLE1BQU0sVUFBVSxHQUN6QixLQUFLLE1BQU0sS0FBSyxVQUFVLE9BQU87Q0FFckM7Q0FDQSxJQUFJLE1BQU0sR0FBRztFQUNYLE9BQU8sS0FBSyxJQUFJLFNBQVMsS0FBSztHQUM1QixPQUFPLFNBQVMsR0FBRztFQUNyQixDQUFDO0VBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSTtFQUNwQixJQUFJLEtBQ0YsTUFBTSxLQUFLLEtBQUssSUFBSSxJQUFJLFdBQVc7RUFFckMsSUFBSSxLQUNGLE1BQU0sS0FBSyxLQUFLLElBQUksSUFBSSxVQUFVO0NBRXRDLE9BQ0UsTUFBTSxTQUFTLEtBQUssRUFBRTtDQUV4QixPQUFPLE1BQU0sSUFBSSxVQUFVLFVBQVU7Q0FDckMsT0FBTyxNQUFNLE1BQU0sVUFBVSxJQUFJLGFBQWEsV0FBVztDQUN6RCxLQUFLLE9BQ0gsSUFDQSx5QkFBeUIsVUFBVSxLQUNuQyw2QkFBNkIsVUFBVSxLQUN2QyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsR0FDdkMsT0FBTyxLQUFLLGdCQUFnQixHQUM1QixJQUNGO0FBQ0Y7QUFDQSxPQUFPLFlBQVksWUFBWTtBQUMvQixVQUFVLFVBQVUsUUFBUSxVQUFVO0FBQ3RDLFVBQVUsVUFBVSxPQUFPLFVBQVU7QUFDckMsU0FBUyxhQUFhLFdBQVcsZUFBZSxLQUFLO0NBQ25ELElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUcsU0FBUyxNQUFNLE1BQU0sUUFBUSxLQUFLO0NBQ2pJLElBQUksVUFBVSxLQUFLLFNBQVMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVTtDQUN2RCxJQUFJLFVBQVUsU0FBUyxLQUFLLE9BQU8sY0FBYyxVQUFVO0VBQ3pELGdCQUFnQjtFQUNoQixZQUFZO0NBQ2Q7Q0FDQSxJQUFJO0NBQ0osSUFBSSxpQkFBaUI7Q0FDckIsSUFBSTtFQUNGLElBQUk7Q0FDTixTQUFTLEtBQUs7RUFDWixpQkFBaUI7RUFDakIsWUFBWTtDQUNkO0NBQ0EsSUFBSSxzQkFBc0IsY0FBYyxLQUFLLEtBQUssa0JBQWtCLEtBQUs7Q0FDekUsSUFBSSxvQkFBb0IsUUFBUSxhQUFhLGFBQWE7Q0FDMUQsSUFBSSxnQkFBZ0I7Q0FDcEIsSUFBSSxvQkFBb0I7Q0FDeEIsSUFBSSx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRO0VBQzFELElBQUksa0JBQWtCO0VBQ3RCLElBQUkscUJBQXFCLE9BQ3ZCLGtCQUFrQjtPQUNiLElBQUksV0FDVCxrQkFBa0Isb0JBQW9CLG1CQUFtQixTQUFTO0VBRXBFLElBQUksU0FBUztFQUNiLElBQUkscUJBQXFCLE9BQ3ZCLFNBQVMsVUFBVSxTQUFTO09BQ3ZCLElBQUksT0FBTyxjQUFjLFVBQzlCLFNBQVM7T0FDSixJQUFJLGNBQWMsT0FBTyxjQUFjLFlBQVksT0FBTyxjQUFjLGFBQzdFLElBQUk7R0FDRixTQUFTLG9CQUFvQixtQkFBbUIsU0FBUztFQUMzRCxTQUFTLE1BQU0sQ0FDZjtFQUVGLEtBQUssT0FDSCxnQkFDQSwrQkFBK0IsaUJBQy9CLGdFQUNBLGFBQWEsVUFBVSxTQUFTLEdBQ2hDLE1BQ0Y7Q0FDRjtDQUNBLElBQUksYUFBYSxXQUFXO0VBQzFCLElBQUkscUJBQXFCLE9BS3ZCO09BSjJCLG9CQUFvQixtQkFDN0MsV0FDQSxTQUVFLE1BQXlCLFFBQzNCLElBQUkscUJBQXFCLFFBQ3ZCLGdCQUFnQjtRQUVoQixLQUFLLE9BQ0gsUUFDQSwwREFDQSwwQ0FBMEMsYUFBYSxDQUFDLFNBQVMsMkJBQTJCLEtBQzVGLFVBQVUsU0FBUyxHQUNuQixVQUFVLFNBQVMsQ0FDckI7RUFFSjtFQU1GLElBSjhCLG9CQUFvQixzQkFDaEQsV0FDQSxTQUVFLE1BQTRCLFFBQzlCLElBQUkscUJBQXFCLFFBQ3ZCLGdCQUFnQjtPQUVoQixLQUFLLE9BQ0gsUUFDQSwwREFDQSwwQ0FBMEMsWUFBWSwyQkFBMkIsS0FDakYscUJBQXFCLFFBQVEsVUFBVSxTQUFTLElBQUksYUFBYSxvQkFBb0IsbUJBQW1CLFNBQVMsR0FDakgscUJBQXFCLFFBQVEsVUFBVSxTQUFTLElBQUksYUFBYSxvQkFBb0IsbUJBQW1CLFNBQVMsQ0FDbkg7Q0FHTjtDQUNBLElBQUksYUFBYSxrQkFBa0IsS0FBSyxLQUFLLGtCQUFrQixNQUFNO0VBQ25FLElBQUksY0FBYztFQUNsQixJQUFJLFVBQVUsYUFBYSxHQUN6QixjQUFjO0VBTWhCLElBSjBCLG9CQUFvQixrQkFDNUMsV0FDQSxhQUVFLE1BQXdCLFFBQzFCLElBQUkscUJBQXFCLFFBQ3ZCLG9CQUFvQjtPQUVwQixLQUFLLE9BQ0gsUUFDQSxxQ0FBcUMsY0FBYywwQkFDbkQseUNBQXlDLGNBQWMsV0FDdkQsZUFDQSxvQkFBb0IsV0FBVyxTQUFTLENBQzFDO0NBR047Q0FDQSxJQUFJLGlCQUFpQixtQkFDbkIsS0FBSyxPQUNILFFBQ0EsMERBQ0EsMENBQTBDLFlBQVksMkJBQTJCLEtBQ2pGLHFCQUFxQixRQUFRLFVBQVUsU0FBUyxJQUFJLGFBQWEsb0JBQW9CLG1CQUFtQixTQUFTLEdBQ2pILHFCQUFxQixRQUFRLFVBQVUsU0FBUyxJQUFJLGFBQWEsb0JBQW9CLG1CQUFtQixTQUFTLENBQ25IO0NBRUYsTUFBTSxNQUFNLFVBQVUsU0FBUztBQUNqQztBQUNBLE9BQU8sY0FBYyxjQUFjO0FBQ25DLFVBQVUsVUFBVSxTQUFTLFlBQVk7QUFDekMsVUFBVSxVQUFVLFVBQVUsWUFBWTtBQUMxQyxVQUFVLFVBQVUsU0FBUyxZQUFZO0FBQ3pDLFNBQVMsVUFBVSxRQUFRLEtBQUs7Q0FDOUIsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxNQUFNLE1BQU0sTUFBTSxRQUFRLEdBQUcsU0FBUyxNQUFNLE1BQU0sUUFBUSxHQUFHLFVBQVUsZUFBZSxPQUFPLE9BQU8sQ0FBQyxTQUFTLElBQUksVUFBVSxVQUFVLElBQUk7Q0FDOUksS0FBSyxPQUNILGVBQWUsT0FBTyxTQUN0QixvQ0FBb0MsU0FBUyxNQUFNLEdBQ25ELHdDQUF3QyxTQUFTLE1BQU0sQ0FDekQ7QUFDRjtBQUNBLE9BQU8sV0FBVyxXQUFXO0FBQzdCLFVBQVUsVUFBVSxhQUFhLFNBQVM7QUFDMUMsVUFBVSxVQUFVLGNBQWMsU0FBUztBQUMzQyxVQUFVLFlBQVksVUFBVSxXQUFXO0NBQ3pDLE1BQU0sTUFBTSxVQUFVLElBQUk7QUFDNUIsQ0FBQztBQUNELFNBQVMsUUFBUSxTQUFTLEtBQUs7Q0FDN0IsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FFbkMsSUFBSSxTQUFTLFFBREgsTUFBTSxNQUFNLFFBQ0QsQ0FBRztDQUN4QixLQUFLLE9BQ0gsUUFDQSxpQ0FBaUMsV0FBVyxPQUFPLEdBQ25ELG9DQUFvQyxXQUFXLE9BQU8sR0FDdEQsTUFBTSxNQUFNLFFBQVEsSUFBSSxRQUFRLE1BQ2hDLE1BQ0Y7QUFDRjtBQUNBLE9BQU8sU0FBUyxTQUFTO0FBQ3pCLFVBQVUsVUFBVSxXQUFXLE9BQU87QUFDdEMsVUFBVSxVQUFVLGFBQWEsT0FBTztBQUN4QyxTQUFTLFFBQVEsVUFBVSxPQUFPLEtBQUs7Q0FDckMsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxNQUFNLE1BQU0sTUFBTSxRQUFRLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU07Q0FDNUYsSUFBSSxVQUFVLEtBQUssU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUc7Q0FDM0MsSUFBSSxVQUFVO0NBQ2QsSUFBSSxTQUFTLEtBQUssR0FDaEIsTUFBTSxJQUFJLGVBQ1IsVUFBVSxHQUFHLFFBQVEsSUFBSSxZQUFZLFNBQ3JDLEtBQUssR0FDTCxJQUNGO0NBRUYsSUFBSSxVQUFVLE9BQU8sU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUc7Q0FDN0MsVUFBVTtDQUNWLElBQUksWUFBWSxLQUFLLEdBQ25CLE1BQU0sSUFBSSxlQUNSLFVBQVUsR0FBRyxRQUFRLElBQUksWUFBWSxTQUNyQyxLQUFLLEdBQ0wsSUFDRjtDQUVGLElBQUksVUFBVSxVQUFVLFNBQVMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHO0NBQ2hELE1BQU0sTUFBc0Isd0JBQVEsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSztDQUMvRCxNQUFNLFFBQXdCLHdCQUFRLFdBQVcsV0FBVyxXQUFXLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsT0FBTztDQUN4RyxLQUFLLE9BQ0gsTUFBTSxJQUFJLE1BQU0sUUFBUSxDQUFDLEtBQUssT0FDOUIscUNBQXFDLFdBQVcsVUFBVSxPQUMxRCx5Q0FBeUMsV0FBVyxVQUFVLEtBQ2hFO0FBQ0Y7QUFDQSxPQUFPLFNBQVMsU0FBUztBQUN6QixVQUFVLFVBQVUsV0FBVyxPQUFPO0FBQ3RDLFVBQVUsVUFBVSxpQkFBaUIsT0FBTztBQUM1QyxTQUFTLFdBQVcsU0FBUyxXQUFXLEtBQUssVUFBVSxTQUFTO0NBQzlELElBQUksV0FBVyxNQUFNLEtBQUssU0FBUztDQUNuQyxJQUFJLFNBQVMsTUFBTSxLQUFLLE9BQU87Q0FDL0IsSUFBSSxDQUFDLFVBQVU7RUFDYixJQUFJLE9BQU8sV0FBVyxTQUFTLFFBQVEsT0FBTztFQUM5QyxXQUFXLFNBQVMsTUFBTTtDQUM1QjtDQUNBLE9BQU8sT0FBTyxNQUFNLFNBQVMsTUFBTSxLQUFLO0VBQ3RDLElBQUksU0FBUyxPQUFPLE1BQU0sSUFBSSxNQUFNLFNBQVMsSUFBSSxJQUFJLFNBQVMsU0FBUztFQUN2RSxJQUFJLENBQUMsS0FBSztHQUNSLElBQUksV0FBVyxTQUFTLFFBQVEsSUFBSTtHQUNwQyxJQUFJLGFBQWEsSUFBSSxPQUFPO0dBQzVCLElBQUksQ0FBQyxVQUFVLFNBQVMsT0FBTyxVQUFVLENBQUM7R0FDMUMsT0FBTztFQUNUO0VBQ0EsT0FBTyxTQUFTLEtBQUssU0FBUyxPQUFPLFVBQVU7R0FDN0MsSUFBSSxDQUFDLElBQUksTUFBTSxLQUFLLEdBQUcsT0FBTztHQUM5QixJQUFJLENBQUMsVUFBVSxTQUFTLE9BQU8sVUFBVSxDQUFDO0dBQzFDLE9BQU87RUFDVCxDQUFDO0NBQ0gsQ0FBQztBQUNIO0FBQ0EsT0FBTyxZQUFZLFlBQVk7QUFDL0IsVUFBVSxVQUFVLFdBQVcsU0FBUyxRQUFRLEtBQUs7Q0FDbkQsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxNQUFNLE1BQU0sTUFBTSxRQUFRLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU07Q0FDNUYsSUFBSSxVQUFVLEtBQUssU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRztDQUM5QyxJQUFJLFVBQVUsUUFBUSxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHO0NBQ2pELElBQUksV0FBVyxNQUFNLE1BQU0sVUFBVTtDQUNyQyxJQUFJLFVBQVUsTUFBTSxNQUFNLFNBQVM7Q0FDbkMsSUFBSSxTQUFTLFNBQVM7Q0FDdEIsSUFBSSxVQUFVO0VBQ1osVUFBVSxVQUFVLHdCQUF3QjtFQUM1QyxVQUFVLDRCQUE0QixVQUFVO0VBQ2hELGdCQUFnQixnQ0FBZ0MsVUFBVTtDQUM1RCxPQUFPO0VBQ0wsVUFBVSxVQUFVLG9CQUFvQjtFQUN4QyxVQUFVLHVDQUF1QyxVQUFVO0VBQzNELGdCQUFnQiwyQ0FBMkMsVUFBVTtDQUN2RTtDQUNBLElBQUksTUFBTSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxLQUFLLElBQUksS0FBSztDQUMxRCxLQUFLLE9BQ0gsV0FBVyxRQUFRLEtBQUssS0FBSyxVQUFVLE9BQU8sR0FDOUMsU0FDQSxlQUNBLFFBQ0EsS0FDQSxJQUNGO0FBQ0YsQ0FBQztBQUNELFVBQVUsWUFBWSxZQUFZLFNBQVMsS0FBSztDQUM5QyxJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsS0FBSyxPQUNILE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxXQUM1QixzQ0FDQSwwQ0FDQSxHQUNGO0FBQ0YsQ0FBQztBQUNELFNBQVMsTUFBTSxNQUFNLEtBQUs7Q0FDeEIsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxXQUFXLE1BQU0sTUFBTSxRQUFRLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU0sR0FBRyxXQUFXLE1BQU0sTUFBTSxVQUFVLEdBQUcsU0FBUyxNQUFNLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxNQUFNLEtBQUs7Q0FDN0wsSUFBSSxVQUFVLE1BQU0sU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLE9BQU87Q0FDekQsSUFBSSxVQUNGLEtBQUssT0FDSCxLQUFLLEtBQUssU0FBUyxhQUFhO0VBQzlCLE9BQU8sU0FBUyxRQUFRLFdBQVcsSUFBSTtDQUN6QyxDQUFDLEdBQ0QsNkNBQ0EsaURBQ0EsTUFDQSxRQUNGO01BRUEsSUFBSSxRQUNGLEtBQUssT0FDSCxLQUFLLEtBQUssU0FBUyxhQUFhO0VBQzlCLE9BQU8sSUFBSSxVQUFVLFdBQVc7Q0FDbEMsQ0FBQyxHQUNELGtEQUNBLGtEQUNBLE1BQ0EsUUFDRjtNQUVBLEtBQUssT0FDSCxLQUFLLFFBQVEsUUFBUSxJQUFJLElBQ3pCLHdDQUNBLDRDQUNBLE1BQ0EsUUFDRjtBQUdOO0FBQ0EsT0FBTyxPQUFPLE9BQU87QUFDckIsVUFBVSxVQUFVLFNBQVMsS0FBSztBQUNsQyxTQUFTLGNBQWMsU0FBUyxNQUFNLEtBQUs7Q0FDekMsSUFBSSxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQUc7Q0FDbkMsSUFBSSxLQUFLLE1BQU0sTUFBTSxRQUFRLEdBQUcsVUFBVSxNQUFNLE1BQU0sU0FBUyxHQUFHLE9BQU8sTUFBTSxNQUFNLE1BQU07Q0FDM0YsSUFBSSxVQUFVLElBQUksU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVO0NBQ3RELElBQUk7Q0FDSixJQUFJLENBQUMsTUFBTTtFQUNULElBQUksVUFBVSxTQUFTLFNBQVMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVTtFQUMzRCxVQUFVLFFBQVE7Q0FDcEIsT0FBTztFQUNMLElBQUksVUFBVSxTQUFTLFNBQVMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJO0VBQ2pFLFVBQVUsUUFBUTtDQUNwQjtDQUNBLEdBQUc7Q0FDSCxJQUFJLFFBQVEsU0FBUyxLQUFLLEtBQUssU0FBUyxPQUFPLFFBQVEsSUFBSSxRQUFRO0NBQ25FLElBQUksU0FBUyxTQUFTLEtBQUssS0FBSyxTQUFTLE9BQU8sVUFBVSxNQUFNO0NBQ2hFLE1BQU0sTUFBTSxlQUFlLE1BQU07Q0FDakMsTUFBTSxNQUFNLHFCQUFxQixPQUFPO0NBQ3hDLE1BQU0sTUFBTSxtQkFBbUIsS0FBSztDQUNwQyxNQUFNLE1BQU0saUJBQWlCLFFBQVE7Q0FDckMsTUFBTSxNQUFNLGFBQWEsVUFBVSxPQUFPO0NBQzFDLEtBQUssT0FDSCxZQUFZLE9BQ1osY0FBYyxTQUFTLGNBQ3ZCLGNBQWMsU0FBUyxnQkFDekI7QUFDRjtBQUNBLE9BQU8sZUFBZSxlQUFlO0FBQ3JDLFVBQVUsVUFBVSxVQUFVLGFBQWE7QUFDM0MsVUFBVSxVQUFVLFdBQVcsYUFBYTtBQUM1QyxTQUFTLGdCQUFnQixTQUFTLE1BQU0sS0FBSztDQUMzQyxJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLEtBQUssTUFBTSxNQUFNLFFBQVEsR0FBRyxVQUFVLE1BQU0sTUFBTSxTQUFTLEdBQUcsT0FBTyxNQUFNLE1BQU0sTUFBTTtDQUMzRixJQUFJLFVBQVUsSUFBSSxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVU7Q0FDdEQsSUFBSTtDQUNKLElBQUksQ0FBQyxNQUFNO0VBQ1QsSUFBSSxVQUFVLFNBQVMsU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVO0VBQzNELFVBQVUsUUFBUTtDQUNwQixPQUFPO0VBQ0wsSUFBSSxVQUFVLFNBQVMsU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUk7RUFDakUsVUFBVSxRQUFRO0NBQ3BCO0NBQ0EsSUFBSSxVQUFVLFNBQVMsU0FBUyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRO0NBQ3pELEdBQUc7Q0FDSCxJQUFJLFFBQVEsU0FBUyxLQUFLLEtBQUssU0FBUyxPQUFPLFFBQVEsSUFBSSxRQUFRO0NBQ25FLElBQUksU0FBUyxTQUFTLEtBQUssS0FBSyxTQUFTLE9BQU8sVUFBVSxNQUFNO0NBQ2hFLE1BQU0sTUFBTSxlQUFlLE1BQU07Q0FDakMsTUFBTSxNQUFNLHFCQUFxQixPQUFPO0NBQ3hDLE1BQU0sTUFBTSxtQkFBbUIsS0FBSztDQUNwQyxNQUFNLE1BQU0saUJBQWlCLFVBQVU7Q0FDdkMsTUFBTSxNQUFNLGFBQWEsUUFBUSxPQUFPO0NBQ3hDLEtBQUssT0FDSCxRQUFRLFVBQVUsR0FDbEIsY0FBYyxTQUFTLGdCQUN2QixjQUFjLFNBQVMsa0JBQ3pCO0FBQ0Y7QUFDQSxPQUFPLGlCQUFpQixpQkFBaUI7QUFDekMsVUFBVSxVQUFVLFlBQVksZUFBZTtBQUMvQyxVQUFVLFVBQVUsYUFBYSxlQUFlO0FBQ2hELFNBQVMsZ0JBQWdCLFNBQVMsTUFBTSxLQUFLO0NBQzNDLElBQUksS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUFHO0NBQ25DLElBQUksS0FBSyxNQUFNLE1BQU0sUUFBUSxHQUFHLFVBQVUsTUFBTSxNQUFNLFNBQVMsR0FBRyxPQUFPLE1BQU0sTUFBTSxNQUFNO0NBQzNGLElBQUksVUFBVSxJQUFJLFNBQVMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVTtDQUN0RCxJQUFJO0NBQ0osSUFBSSxDQUFDLE1BQU07RUFDVCxJQUFJLFVBQVUsU0FBUyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVU7RUFDM0QsVUFBVSxRQUFRO0NBQ3BCLE9BQU87RUFDTCxJQUFJLFVBQVUsU0FBUyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSTtFQUNqRSxVQUFVLFFBQVE7Q0FDcEI7Q0FDQSxJQUFJLFVBQVUsU0FBUyxTQUFTLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVE7Q0FDekQsR0FBRztDQUNILElBQUksUUFBUSxTQUFTLEtBQUssS0FBSyxTQUFTLE9BQU8sUUFBUSxJQUFJLFFBQVE7Q0FDbkUsSUFBSSxTQUFTLFNBQVMsS0FBSyxLQUFLLFNBQVMsT0FBTyxVQUFVLE1BQU07Q0FDaEUsTUFBTSxNQUFNLGVBQWUsTUFBTTtDQUNqQyxNQUFNLE1BQU0scUJBQXFCLE9BQU87Q0FDeEMsTUFBTSxNQUFNLG1CQUFtQixLQUFLO0NBQ3BDLE1BQU0sTUFBTSxpQkFBaUIsVUFBVTtDQUN2QyxNQUFNLE1BQU0sYUFBYSxVQUFVLEtBQUs7Q0FDeEMsS0FBSyxPQUNILFFBQVEsVUFBVSxHQUNsQixjQUFjLFNBQVMsZ0JBQ3ZCLGNBQWMsU0FBUyxrQkFDekI7QUFDRjtBQUNBLE9BQU8saUJBQWlCLGlCQUFpQjtBQUN6QyxVQUFVLFVBQVUsWUFBWSxlQUFlO0FBQy9DLFVBQVUsVUFBVSxhQUFhLGVBQWU7QUFDaEQsU0FBUyxZQUFZLE9BQU8sS0FBSztDQUMvQixJQUFJLEtBQUssTUFBTSxNQUFNLFdBQVcsR0FBRztDQUNuQyxJQUFJLFNBQVMsTUFBTSxNQUFNLGFBQWE7Q0FDdEMsSUFBSSxVQUFVLE1BQU0sTUFBTSxtQkFBbUI7Q0FDN0MsSUFBSSxRQUFRLE1BQU0sTUFBTSxpQkFBaUI7Q0FDekMsSUFBSSxXQUFXLE1BQU0sTUFBTSxlQUFlO0NBQzFDLElBQUksWUFBWSxNQUFNLE1BQU0sV0FBVztDQUN2QyxJQUFJO0NBQ0osSUFBSSxhQUFhLFVBQ2YsYUFBYSxLQUFLLElBQUksUUFBUSxPQUFPLE1BQU0sS0FBSyxJQUFJLEtBQUs7TUFFekQsYUFBYSxjQUFjLEtBQUssSUFBSSxLQUFLO0NBRTNDLEtBQUssT0FDSCxZQUNBLGNBQWMsU0FBUyxTQUFTLFdBQVcsU0FBUyxPQUNwRCxjQUFjLFNBQVMsYUFBYSxXQUFXLFNBQVMsS0FDMUQ7QUFDRjtBQUNBLE9BQU8sYUFBYSxhQUFhO0FBQ2pDLFVBQVUsVUFBVSxNQUFNLFdBQVc7QUFDckMsVUFBVSxZQUFZLGNBQWMsV0FBVztDQUM3QyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsSUFBSSxlQUFlLFFBQVEsT0FBTyxHQUFHLEtBQUssT0FBTyxhQUFhLEdBQUc7Q0FDakUsS0FBSyxPQUNILGNBQ0EscUNBQ0EsdUNBQ0Y7QUFDRixDQUFDO0FBQ0QsVUFBVSxZQUFZLFVBQVUsV0FBVztDQUN6QyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsSUFBSSxXQUFXLFFBQVEsT0FBTyxHQUFHLElBQUksT0FBTyxTQUFTLEdBQUcsSUFBSTtDQUM1RCxLQUFLLE9BQ0gsVUFDQSxpQ0FDQSxtQ0FDRjtBQUNGLENBQUM7QUFDRCxVQUFVLFlBQVksVUFBVSxXQUFXO0NBQ3pDLElBQUksTUFBTSxNQUFNLE1BQU0sUUFBUTtDQUM5QixJQUFJLFdBQVcsUUFBUSxPQUFPLEdBQUcsSUFBSSxPQUFPLFNBQVMsR0FBRyxJQUFJO0NBQzVELEtBQUssT0FDSCxVQUNBLGlDQUNBLG1DQUNGO0FBQ0YsQ0FBQztBQUNELFVBQVUsWUFBWSxVQUFVLFNBQVMsTUFBTTtDQUM3QyxJQUFJLE1BQU0sTUFBTSxNQUFNLFFBQVE7Q0FDOUIsS0FBSyxPQUNILE9BQU8sUUFBUSxZQUFZLFNBQVMsR0FBRyxHQUN2QywwQ0FDQSw0Q0FDRjtBQUNGLENBQUM7QUFDRCxTQUFTLGNBQWMsVUFBVSxRQUFRO0NBQ3ZDLElBQUksYUFBYSxRQUNmLE9BQU87Q0FFVCxJQUFJLE9BQU8sV0FBVyxPQUFPLFVBQzNCLE9BQU87Q0FFVCxJQUFJLE9BQU8sYUFBYSxZQUFZLGFBQWEsTUFDL0MsT0FBTyxhQUFhO0NBRXRCLElBQUksQ0FBQyxRQUNILE9BQU87Q0FFVCxJQUFJLE1BQU0sUUFBUSxRQUFRLEdBQUc7RUFDM0IsSUFBSSxDQUFDLE1BQU0sUUFBUSxNQUFNLEdBQ3ZCLE9BQU87RUFFVCxPQUFPLFNBQVMsTUFBTSxTQUFTLEtBQUs7R0FDbEMsT0FBTyxPQUFPLEtBQUssU0FBUyxLQUFLO0lBQy9CLE9BQU8sY0FBYyxLQUFLLEdBQUc7R0FDL0IsQ0FBQztFQUNILENBQUM7Q0FDSDtDQUNBLElBQUksb0JBQW9CLE1BQ3RCLElBQUksa0JBQWtCLE1BQ3BCLE9BQU8sU0FBUyxRQUFRLE1BQU0sT0FBTyxRQUFRO01BRTdDLE9BQU87Q0FHWCxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxNQUFNLFNBQVMsS0FBSztFQUMvQyxJQUFJLGdCQUFnQixTQUFTO0VBQzdCLElBQUksY0FBYyxPQUFPO0VBQ3pCLElBQUksT0FBTyxrQkFBa0IsWUFBWSxrQkFBa0IsUUFBUSxnQkFBZ0IsTUFDakYsT0FBTyxjQUFjLGVBQWUsV0FBVztFQUVqRCxJQUFJLE9BQU8sa0JBQWtCLFlBQzNCLE9BQU8sY0FBYyxXQUFXO0VBRWxDLE9BQU8sZ0JBQWdCO0NBQ3pCLENBQUM7QUFDSDtBQUNBLE9BQU8sZUFBZSxlQUFlO0FBQ3JDLFVBQVUsVUFBVSxpQkFBaUIsU0FBUyxVQUFVO0NBQ3RELE1BQU0sU0FBUyxLQUFLLE1BQU0sUUFBUTtDQUNsQyxNQUFNLFdBQVcsT0FBTztDQUN4QixLQUFLLE9BQ0gsY0FBYyxVQUFVLE1BQU0sR0FDOUIsNENBQ0EsZ0RBQ0EsVUFDQSxRQUNBLFFBQ0Y7QUFDRixDQUFDO0FBR0QsU0FBUyxPQUFPLEtBQUssU0FBUztDQUM1QixPQUFPLElBQUksVUFBVSxLQUFLLE9BQU87QUFDbkM7QUFDQSxPQUFPLFFBQVEsUUFBUTtBQUN2QixPQUFPLE9BQU8sU0FBUyxRQUFRLFVBQVUsU0FBUyxVQUFVO0NBQzFELElBQUksVUFBVSxTQUFTLEdBQUc7RUFDeEIsVUFBVTtFQUNWLFNBQVMsS0FBSztDQUNoQjtDQUNBLFVBQVUsV0FBVztDQUNyQixNQUFNLElBQUksZUFDUixTQUNBO0VBQ0U7RUFDQTtFQUNBO0NBQ0YsR0FDQSxPQUFPLElBQ1Q7QUFDRjtBQUdBLElBQUksaUJBQWlCLENBQUM7QUFDdEIsU0FBUyxnQkFBZ0I7Q0FDdkIsY0FBYztDQUNkLGNBQWM7QUFDaEIsQ0FBQztBQUNELFNBQVMsYUFBYTtDQUNwQixTQUFTLGVBQWU7RUFDdEIsSUFBSSxnQkFBZ0IsVUFBVSxnQkFBZ0IsVUFBVSxnQkFBZ0IsV0FBVyxPQUFPLFdBQVcsY0FBYyxnQkFBZ0IsVUFBVSxPQUFPLFdBQVcsY0FBYyxnQkFBZ0IsUUFDM0wsT0FBTyxJQUFJLFVBQVUsS0FBSyxRQUFRLEdBQUcsTUFBTSxZQUFZO0VBRXpELE9BQU8sSUFBSSxVQUFVLE1BQU0sTUFBTSxZQUFZO0NBQy9DO0NBQ0EsT0FBTyxjQUFjLGNBQWM7Q0FDbkMsU0FBUyxhQUFhLE9BQU87RUFDM0IsT0FBTyxlQUFlLE1BQU0sVUFBVTtHQUNwQztHQUNBLFlBQVk7R0FDWixjQUFjO0dBQ2QsVUFBVTtFQUNaLENBQUM7Q0FDSDtDQUNBLE9BQU8sY0FBYyxjQUFjO0NBQ25DLE9BQU8sZUFBZSxPQUFPLFdBQVcsVUFBVTtFQUNoRCxLQUFLO0VBQ0wsS0FBSztFQUNMLGNBQWM7Q0FDaEIsQ0FBQztDQUNELElBQUksVUFBVSxDQUFDO0NBQ2YsUUFBUSxPQUFPLFNBQVMsUUFBUSxVQUFVLFNBQVMsVUFBVTtFQUMzRCxJQUFJLFVBQVUsU0FBUyxHQUFHO0dBQ3hCLFVBQVU7R0FDVixTQUFTLEtBQUs7RUFDaEI7RUFDQSxVQUFVLFdBQVc7RUFDckIsTUFBTSxJQUFJLGVBQ1IsU0FDQTtHQUNFO0dBQ0E7R0FDQTtFQUNGLEdBQ0EsUUFBUSxJQUNWO0NBQ0Y7Q0FDQSxRQUFRLFFBQVEsU0FBUyxRQUFRLFVBQVUsU0FBUztFQUNsRCxJQUFJLFVBQVUsUUFBUSxPQUFPLENBQUMsQ0FBQyxHQUFHLE1BQU0sUUFBUTtDQUNsRDtDQUNBLFFBQVEsUUFBUSxTQUFTLElBQUksTUFBTSxNQUFNLEtBQUs7RUFDNUMsSUFBSSxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLE1BQU0sSUFBSTtDQUM1QztDQUNBLFFBQVEsUUFBUSxTQUFTLEtBQUssS0FBSztFQUNqQyxJQUFJLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHO0NBQzdCO0NBQ0EsUUFBUSxNQUFNLENBQUM7Q0FDZixRQUFRLElBQUksUUFBUSxTQUFTLFFBQVEsVUFBVSxLQUFLO0VBQ2xELElBQUksVUFBVSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLFFBQVE7Q0FDbEQ7Q0FDQSxRQUFRLElBQUksUUFBUSxTQUFTLElBQUksTUFBTSxNQUFNLEtBQUs7RUFDaEQsSUFBSSxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sTUFBTSxJQUFJO0NBQ2hEO0NBQ0EsUUFBUSxJQUFJLFFBQVEsU0FBUyxLQUFLLEtBQUs7RUFDckMsSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJO0NBQ2pDO0NBQ0EsUUFBUSxXQUFXLFFBQVE7Q0FDM0IsUUFBUSxJQUFJLFdBQVcsUUFBUSxJQUFJO0NBQ25DLE9BQU87QUFDVDtBQUNBLE9BQU8sWUFBWSxZQUFZO0FBQy9CLElBQUksU0FBUztBQUNiLElBQUksU0FBUztBQUdiLFNBQVMsT0FBTyxTQUFTLFFBQVE7Q0FFL0IsSUFEZ0IsVUFBVSxNQUFNLE1BQU0sUUFBUSxJQUM5QyxDQUFBLENBQU0sT0FBTyxTQUFTLFFBQVEsa0NBQWtDO0FBQ2xFO0FBQ0EsT0FBTyxRQUFRLFFBQVE7QUFDdkIsT0FBTyxPQUFPLFNBQVMsUUFBUSxVQUFVLFNBQVMsVUFBVTtDQUMxRCxJQUFJLFVBQVUsU0FBUyxHQUFHO0VBQ3hCLFVBQVU7RUFDVixTQUFTLEtBQUs7Q0FDaEI7Q0FDQSxVQUFVLFdBQVc7Q0FDckIsTUFBTSxJQUFJLGVBQ1IsU0FDQTtFQUNFO0VBQ0E7RUFDQTtDQUNGLEdBQ0EsT0FBTyxJQUNUO0FBQ0Y7QUFDQSxPQUFPLE9BQU8sU0FBUyxLQUFLLEtBQUs7Q0FDL0IsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRztBQUNoRDtBQUNBLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSztDQUNsQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUk7QUFDdkQ7QUFDQSxPQUFPLFFBQVEsU0FBUyxLQUFLLEtBQUssS0FBSztDQUNyQyxJQUFJLFFBQVEsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLE9BQU8sSUFBSTtDQUN0RCxNQUFNLE9BQ0osT0FBTyxLQUFLLE9BQU8sUUFBUSxHQUMzQixvQ0FDQSx3Q0FDQSxLQUNBLEtBQ0EsSUFDRjtBQUNGO0FBQ0EsT0FBTyxXQUFXLFNBQVMsS0FBSyxLQUFLLEtBQUs7Q0FDeEMsSUFBSSxRQUFRLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxVQUFVLElBQUk7Q0FDekQsTUFBTSxPQUNKLE9BQU8sS0FBSyxPQUFPLFFBQVEsR0FDM0Isd0NBQ0Esb0NBQ0EsS0FDQSxLQUNBLElBQ0Y7QUFDRjtBQUNBLE9BQU8sY0FBYyxTQUFTLEtBQUssS0FBSyxLQUFLO0NBQzNDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHO0FBQ2hFO0FBQ0EsT0FBTyxpQkFBaUIsU0FBUyxLQUFLLEtBQUssS0FBSztDQUM5QyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sZ0JBQWdCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLEdBQUc7QUFDdkU7QUFDQSxPQUFPLFlBQVksT0FBTyxrQkFBa0IsU0FBUyxLQUFLLEtBQUssS0FBSztDQUNsRSxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRztBQUM1RDtBQUNBLE9BQU8sZUFBZSxTQUFTLEtBQUssS0FBSyxLQUFLO0NBQzVDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxjQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLEdBQUc7QUFDbkU7QUFDQSxPQUFPLFVBQVUsU0FBUyxLQUFLLEtBQUssS0FBSztDQUN2QyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxHQUFHO0FBQy9EO0FBQ0EsT0FBTyxZQUFZLFNBQVMsS0FBSyxPQUFPLEtBQUs7Q0FDM0MsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sS0FBSztBQUNuRTtBQUNBLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSyxLQUFLO0NBQ3ZDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLEdBQUc7QUFDL0Q7QUFDQSxPQUFPLFdBQVcsU0FBUyxLQUFLLE9BQU8sS0FBSztDQUMxQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLO0FBQ2pFO0FBQ0EsT0FBTyxTQUFTLFNBQVMsS0FBSyxLQUFLO0NBQ2pDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUc7QUFDbEQ7QUFDQSxPQUFPLFlBQVksU0FBUyxLQUFLLEtBQUs7Q0FDcEMsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sSUFBSTtBQUNuRTtBQUNBLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSztDQUNsQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHO0FBQ25EO0FBQ0EsT0FBTyxhQUFhLFNBQVMsS0FBSyxLQUFLO0NBQ3JDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxZQUFZLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLEtBQUs7QUFDckU7QUFDQSxPQUFPLFNBQVMsU0FBUyxLQUFLLEtBQUs7Q0FDakMsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUk7QUFDNUQ7QUFDQSxPQUFPLFlBQVksU0FBUyxLQUFLLEtBQUs7Q0FDcEMsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sSUFBSTtBQUNuRTtBQUNBLE9BQU8sUUFBUSxTQUFTLEtBQUssS0FBSztDQUNoQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDcEQ7QUFDQSxPQUFPLFdBQVcsU0FBUyxPQUFPLFNBQVM7Q0FDekMsSUFBSSxVQUFVLE9BQU8sU0FBUyxPQUFPLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUc7QUFDakU7QUFDQSxPQUFPLFNBQVMsU0FBUyxLQUFLLEtBQUs7Q0FDakMsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRztBQUNsRDtBQUNBLE9BQU8sWUFBWSxTQUFTLEtBQUssS0FBSztDQUNwQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUk7QUFDekQ7QUFDQSxPQUFPLGNBQWMsU0FBUyxLQUFLLEtBQUs7Q0FDdEMsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLGFBQWEsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQztBQUNuRTtBQUNBLE9BQU8sWUFBWSxTQUFTLEtBQUssS0FBSztDQUNwQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxLQUFLLENBQUM7QUFDckU7QUFDQSxPQUFPLGFBQWEsU0FBUyxPQUFPLFNBQVM7Q0FDM0MsSUFBSSxVQUFVLE9BQU8sU0FBUyxPQUFPLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRztBQUM1RDtBQUNBLE9BQU8sZ0JBQWdCLFNBQVMsT0FBTyxTQUFTO0NBQzlDLElBQUksVUFBVSxPQUFPLFNBQVMsT0FBTyxlQUFlLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUNuRTtBQUNBLE9BQU8sV0FBVyxTQUFTLEtBQUssS0FBSztDQUNuQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRO0FBQ2pFO0FBQ0EsT0FBTyxjQUFjLFNBQVMsS0FBSyxLQUFLO0NBQ3RDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUN4RTtBQUNBLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSztDQUNsQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPO0FBQ2hFO0FBQ0EsT0FBTyxhQUFhLFNBQVMsS0FBSyxLQUFLO0NBQ3JDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxZQUFZLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTztBQUN2RTtBQUNBLE9BQU8sV0FBVyxTQUFTLEtBQUssS0FBSztDQUNuQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRO0FBQ2pFO0FBQ0EsT0FBTyxjQUFjLFNBQVMsS0FBSyxLQUFLO0NBQ3RDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUN4RTtBQUNBLE9BQU8sV0FBVyxTQUFTLEtBQUssS0FBSztDQUNuQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRO0FBQ2pFO0FBQ0EsT0FBTyxjQUFjLFNBQVMsS0FBSyxLQUFLO0NBQ3RDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUN4RTtBQUNBLE9BQU8sWUFBWSxTQUFTLEtBQUssS0FBSztDQUNwQyxJQUFJLFVB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
|