sonamu 0.12.0 → 0.13.0
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/dist/_virtual/_rolldown/runtime.js +1 -2
- package/dist/ai/agents/agent.js +2 -3
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +1 -2
- package/dist/ai/providers/rtzr/error.js +2 -3
- package/dist/ai/providers/rtzr/model.js +1 -2
- package/dist/ai/providers/rtzr/options.js +1 -2
- package/dist/ai/providers/rtzr/provider.js +1 -2
- package/dist/ai/providers/rtzr/utils.js +1 -2
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +9 -9
- package/dist/api/code-converters.js +6 -5
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -3
- package/dist/api/context.d.ts +2 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +2 -3
- package/dist/api/http-validator.js +2 -3
- package/dist/api/index.js +8 -3
- package/dist/api/secret.js +1 -2
- package/dist/api/sonamu.d.ts +3 -5
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +19 -18
- package/dist/api/validator.js +1 -2
- package/dist/api/websocket-helpers.js +2 -3
- package/dist/auth/audit-log/builders.js +1 -2
- package/dist/auth/audit-log/client-ip.js +2 -3
- package/dist/auth/audit-log/events.js +1 -2
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +2 -3
- package/dist/auth/audit-log-ingestor.js +2 -3
- package/dist/auth/auth-generator.js +2 -3
- package/dist/auth/better-auth-entities.js +1 -2
- package/dist/auth/better-auth-request.js +2 -3
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +2 -3
- package/dist/auth/plugins/entity-definitions/admin.js +1 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
- package/dist/auth/plugins/entity-definitions/index.js +1 -2
- package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
- package/dist/auth/plugins/entity-definitions/organization.js +1 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
- package/dist/auth/plugins/entity-definitions/sso.js +1 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
- package/dist/auth/plugins/entity-definitions/username.js +1 -2
- package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +1 -2
- package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.d.ts +39 -5
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +5 -5
- package/dist/bin/compiler-policy.js +2 -3
- package/dist/bin/fixture.js +7 -5
- package/dist/bin/hmr-hook-register.js +1 -2
- package/dist/bin/migrate-targets.js +2 -3
- package/dist/bin/test-command.js +2 -3
- package/dist/bin/ts-loader-register.js +2 -3
- package/dist/bin/ts-loader-registration.js +2 -3
- package/dist/bin/typecheck-web.js +2 -3
- package/dist/cache/cache-manager.js +1 -2
- package/dist/cache/decorator.js +2 -3
- package/dist/cache/drivers.js +1 -2
- package/dist/cache/index.js +2 -3
- package/dist/cache-control/cache-control.js +1 -2
- package/dist/code-formatting/index.js +2 -3
- package/dist/code-formatting/oxfmt.js +2 -3
- package/dist/code-formatting/oxlint.js +2 -3
- package/dist/compress/compress.js +1 -2
- package/dist/compress/index.js +2 -2
- package/dist/compress/types.d.ts +1 -1
- package/dist/compress/types.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +2 -3
- package/dist/database/_batch_update.js +1 -2
- package/dist/database/base-model.js +4 -4
- package/dist/database/db.js +4 -4
- package/dist/database/knex.js +2 -3
- package/dist/database/puri-wrapper.js +2 -3
- package/dist/database/puri.js +23 -22
- package/dist/database/puri.types.js +1 -2
- package/dist/database/transaction-context.js +1 -2
- package/dist/database/upsert-builder.js +2 -3
- package/dist/dict/en.js +2 -3
- package/dist/dict/index.js +3 -3
- package/dist/dict/ko.js +2 -3
- package/dist/dict/rc-keys.js +1 -2
- package/dist/dict/sd.js +2 -3
- package/dist/dict/sonamu-dictionary.js +7 -6
- package/dist/dict/utils.js +2 -3
- package/dist/entity/entity-manager.d.ts +66 -66
- package/dist/entity/entity-manager.js +4 -4
- package/dist/entity/entity-template-cone.js +2 -3
- package/dist/entity/entity.js +21 -18
- package/dist/env.js +1 -2
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +2 -3
- package/dist/filter/index.js +3 -2
- package/dist/filter/types.js +1 -2
- package/dist/filter/utils.js +7 -6
- package/dist/index.js +39 -5
- package/dist/logger/category.js +2 -3
- package/dist/logger/configure.js +5 -5
- package/dist/migration/code-generation.js +23 -16
- package/dist/migration/index-where-predicate.js +2 -3
- package/dist/migration/migration-set.js +2 -3
- package/dist/migration/migrator.js +2 -3
- package/dist/migration/postgresql-schema-reader.js +6 -9
- package/dist/migration/slack-confirm.js +2 -3
- package/dist/naite/naite-reporter.js +2 -3
- package/dist/naite/naite.js +10 -8
- package/dist/runtime-type.js +2 -3
- package/dist/ssr/hmr-opt-out.js +1 -2
- package/dist/ssr/index.js +7 -4
- package/dist/ssr/registry.js +1 -2
- package/dist/ssr/renderer.js +2 -3
- package/dist/storage/base-file.js +1 -2
- package/dist/storage/buffered-file.js +2 -3
- package/dist/storage/drivers.js +1 -2
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +1 -2
- package/dist/storage/storage-manager.js +2 -3
- package/dist/storage/uploaded-file.js +2 -3
- package/dist/stream/__tests__/ws-test-helpers.js +2 -3
- package/dist/stream/index.js +11 -2
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.js +2 -3
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.js +1 -2
- package/dist/stream/ws-delivery.js +2 -3
- package/dist/stream/ws-frame.js +1 -2
- package/dist/stream/ws-local-connection-store.js +2 -3
- package/dist/stream/ws-presence-index.js +1 -2
- package/dist/stream/ws-presence-store.js +2 -3
- package/dist/stream/ws-registry.js +2 -3
- package/dist/stream/ws-session-id.js +1 -2
- package/dist/stream/ws-telemetry-memory.js +3 -4
- package/dist/stream/ws-telemetry-trace.js +1 -2
- package/dist/stream/ws-telemetry.js +2 -3
- package/dist/stream/ws.js +2 -3
- package/dist/syncer/api-parser.js +2 -3
- package/dist/syncer/checksum.js +4 -4
- package/dist/syncer/code-generator.js +4 -4
- package/dist/syncer/entity-operations.js +2 -3
- package/dist/syncer/event-batcher.js +1 -2
- package/dist/syncer/file-copy.js +2 -3
- package/dist/syncer/file-patterns.js +2 -3
- package/dist/syncer/file-tracking.js +2 -3
- package/dist/syncer/filesystem-dependencies.js +1 -2
- package/dist/syncer/index.js +8 -2
- package/dist/syncer/module-loader.js +8 -6
- package/dist/syncer/syncer-actions.js +8 -7
- package/dist/syncer/syncer.js +13 -8
- package/dist/syncer/watcher.js +2 -3
- package/dist/tasks/decorator.js +1 -2
- package/dist/tasks/step-wrapper.js +2 -3
- package/dist/tasks/workflow-manager.js +2 -3
- package/dist/template/entity-converter.js +17 -16
- package/dist/template/helpers.js +2 -3
- package/dist/template/implementations/entity.template.js +2 -3
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +2 -3
- package/dist/template/implementations/generated_http.template.js +6 -6
- package/dist/template/implementations/generated_sso.template.js +2 -3
- package/dist/template/implementations/http_validators.template.js +2 -3
- package/dist/template/implementations/init_types.template.js +2 -3
- package/dist/template/implementations/model.template.js +4 -4
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +2 -3
- package/dist/template/implementations/sd.template.js +2 -3
- package/dist/template/implementations/services.template.js +2 -3
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +19 -17
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +9 -3
- package/dist/template/template-manager.js +2 -3
- package/dist/template/template-types.js +1 -2
- package/dist/template/template.js +2 -3
- package/dist/template/zod-converter.js +54 -47
- package/dist/testing/_relation-graph.js +2 -3
- package/dist/testing/bootstrap.js +2 -3
- package/dist/testing/data-explorer.js +2 -3
- package/dist/testing/dev-test-routes.js +2 -3
- package/dist/testing/dev-vitest-manager.js +15 -12
- package/dist/testing/faker-mappings.js +1 -2
- package/dist/testing/filesystem.js +2 -3
- package/dist/testing/fixture-generator.js +2 -3
- package/dist/testing/fixture-loader.js +1 -2
- package/dist/testing/fixture-manager.js +12 -9
- package/dist/testing/global-setup.js +5 -5
- package/dist/testing/index.js +6 -3
- package/dist/testing/naite-vitest-reporter.js +1 -2
- package/dist/testing/parallel-db-manager.js +2 -3
- package/dist/testing/vitest-helpers.js +2 -3
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
- package/dist/tooling/cdd-service.js +1 -2
- package/dist/tooling/cli-tooling.js +1 -2
- package/dist/tooling/fixture-service.js +1 -2
- package/dist/tooling/index.js +1 -2
- package/dist/tooling/test-run-client.js +2 -3
- package/dist/tsdown.api.config.js +1 -2
- package/dist/types/types.js +2 -3
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +4 -5
- package/dist/ui/ai-client.d.ts +2 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -8
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -8
- package/dist/ui/async-route.js +1 -2
- package/dist/ui/cdd-service.js +22 -21
- package/dist/ui/migrations-api.js +6 -5
- package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
- package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +1 -2
- package/dist/utils/class-name.js +1 -2
- package/dist/utils/console-util.js +1 -2
- package/dist/utils/controller.js +2 -3
- package/dist/utils/esm-utils.js +1 -2
- package/dist/utils/fs-utils.js +2 -3
- package/dist/utils/lodash-able.js +1 -2
- package/dist/utils/model.js +1 -2
- package/dist/utils/object-utils.js +2 -3
- package/dist/utils/path-utils.js +2 -3
- package/dist/utils/process-utils.js +2 -3
- package/dist/utils/runtime-value.js +1 -2
- package/dist/utils/sql-parser.js +2 -3
- package/dist/utils/type-utils.js +8 -8
- package/dist/utils/utils.js +2 -3
- package/dist/utils/zod-error.js +2 -3
- package/dist/vector/chunking.js +1 -2
- package/dist/vector/config.js +1 -2
- package/dist/vector/embedding.js +4 -4
- package/package.json +63 -63
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +26 -21
- package/src/auth/audit-log/plugin.ts +2 -0
- package/src/compress/types.ts +1 -1
- package/src/exceptions/error-handler.ts +3 -2
- package/src/template/implementations/model.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +12 -13
- package/src/ui/ai-api.ts +4 -2
- package/src/ui/ai-client.ts +2 -2
- package/src/ui/api.ts +58 -62
- package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
- package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
package/dist/ui/ai-client.js
CHANGED
|
@@ -7,7 +7,7 @@ import { z } from "zod";
|
|
|
7
7
|
import assert from "assert";
|
|
8
8
|
import fs from "fs";
|
|
9
9
|
import path from "path";
|
|
10
|
-
|
|
10
|
+
// src/ui/ai-client.ts
|
|
11
11
|
/**
|
|
12
12
|
* Entity JSON이 entity.instructions.md의 규칙을 따르는지 검증합니다.
|
|
13
13
|
*/
|
|
@@ -340,11 +340,13 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
|
|
|
340
340
|
if (updates.title !== void 0) entity.title = updates.title;
|
|
341
341
|
if (updates.table !== void 0) entity.table = updates.table;
|
|
342
342
|
if (updates.cone !== void 0) entity.cone = updates.cone;
|
|
343
|
-
if (updates.props !== void 0)
|
|
344
|
-
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
|
|
343
|
+
if (updates.props !== void 0) {
|
|
344
|
+
if (mode === "replace") entity.props = updates.props;
|
|
345
|
+
else for (const newProp of updates.props) {
|
|
346
|
+
const existingIndex = entity.props.findIndex((p) => p.name === newProp.name);
|
|
347
|
+
if (existingIndex >= 0) entity.props[existingIndex] = newProp;
|
|
348
|
+
else entity.props.push(newProp);
|
|
349
|
+
}
|
|
348
350
|
}
|
|
349
351
|
if (updates.indexes !== void 0) entity.indexes = mode === "replace" ? updates.indexes : [...entity.indexes, ...updates.indexes];
|
|
350
352
|
if (updates.subsets !== void 0) {
|
|
@@ -402,8 +404,7 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
|
|
|
402
404
|
};
|
|
403
405
|
aiClient = new AIClient();
|
|
404
406
|
}));
|
|
405
|
-
//#endregion
|
|
406
407
|
init_ai_client();
|
|
407
408
|
export { aiClient, init_ai_client };
|
|
408
409
|
|
|
409
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2xpZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG4vKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIEFJIFNES+ydmCDtg4DsnoXsnbQg66qF7ZmV7ZWY7KeAIOyViuyVhCBhbnnrpbwg7ZeI7Jqp7ZWoXG5pbXBvcnQgeyB0eXBlIExhbmd1YWdlTW9kZWwsIHR5cGUgTW9kZWxNZXNzYWdlLCB0eXBlIFN0cmVhbVRleHRSZXN1bHQgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgVGVtcGxhdGVPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5UHJvcCwgdHlwZSBGaXh0dXJlUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG50eXBlIFZhbGlkYXRpb25FcnJvciA9IHtcbiAgZmllbGQ6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuY29uc3QgZml4dHVyZVNjYWxhclNjaGVtYSA9IHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCksIHouYm9vbGVhbigpLCB6Lm51bGwoKV0pO1xuY29uc3QgZml4dHVyZUNvbHVtblZhbHVlU2NoZW1hID0gei51bmlvbihbZml4dHVyZVNjYWxhclNjaGVtYSwgei5hcnJheShmaXh0dXJlU2NhbGFyU2NoZW1hKV0pO1xuY29uc3QgZml4dHVyZUNvbHVtbnNTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBmaXh0dXJlQ29sdW1uVmFsdWVTY2hlbWEpO1xudHlwZSBGaXh0dXJlVG9vbENvbHVtbnMgPSB6LmluZmVyPHR5cGVvZiBmaXh0dXJlQ29sdW1uc1NjaGVtYT47XG5cbmNsYXNzIEFJQ2xpZW50IHtcbiAgcHJpdmF0ZSBtb2RlbDogTGFuZ3VhZ2VNb2RlbCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFpU2RrOlxuICAgIHwgKHR5cGVvZiBpbXBvcnQoXCJhaVwiKSAmIHtcbiAgICAgICAgYW50aHJvcGljPzogdHlwZW9mIGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpLmFudGhyb3BpYztcbiAgICAgIH0pXG4gICAgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgICBjb25zdCBhaU1vZHVsZSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuICAgICAgdGhpcy5haVNkayA9IHsgLi4uYWlNb2R1bGUsIGFudGhyb3BpYyB9O1xuICAgICAgdGhpcy5tb2RlbCA9IGFudGhyb3BpYyhcImNsYXVkZS1zb25uZXQtNC02XCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQUkgU0RLIHBhY2thZ2VzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGwgQGFpLXNkay9hbnRocm9waWMgYW5kIGFpIHRvIHVzZSBBSSBmZWF0dXJlcy5cIixcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGaXh0dXJlKFxuICAgIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSxcbiAgICBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdLFxuICApOiBTdHJlYW1UZXh0UmVzdWx0PGFueSwgYW55PiB7XG4gICAgaWYgKCF0aGlzLmFpU2RrIHx8ICF0aGlzLm1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBSSBTREsgbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXQoKSBmaXJzdC5cIik7XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbDtcblxuICAgIC8vIO2YhOyerCBmaXh0dXJlUmVjb3Jkc+yXkOyEnCDsgqzsmqnrkJwg7JeU7Yuw7Yuw65Ok7J2YIOq1rOyhsCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgdXNlZEVudGl0eUlkcyA9IFsuLi5uZXcgU2V0KGZpeHR1cmVSZWNvcmRzLm1hcCgocikgPT4gci5lbnRpdHlJZCkpXTtcbiAgICBjb25zdCBlbnRpdHlTdHJ1Y3R1cmVzID0gdXNlZEVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICAgIHByb3BzOiBlbnRpdHkucHJvcHMsXG4gICAgICAgIHJlbGF0aW9uczogZW50aXR5LnJlbGF0aW9ucyxcbiAgICAgICAgZW51bUxhYmVsczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3lzdGVtTWVzc2FnZSA9IGBcbiAgICAgICAg64u57Iug7J2AIO2UveyKpOyzkCDroIjsvZTrk5zrpbwg7IiY7KCV7ZWY6rOgIOyDneyEse2VoCDsiJgg7J6I64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuICAgICAgICDtmITsnqwg7ZS97Iqk7LOQIOugiOy9lOuTnDpcbiAgICAgICAgJHtKU09OLnN0cmluZ2lmeShmaXh0dXJlUmVjb3JkcywgbnVsbCwgMil9XG5cbiAgICAgICAg7JeU7Yuw7YuwIOq1rOyhsCDsoJXrs7Q6XG4gICAgICAgICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5U3RydWN0dXJlcywgbnVsbCwgMil9XG5cbiAgICAgICAgIyMg7ZS97Iqk7LOQIOyImOyglVxuICAgICAgICDsgqzsmqnsnpDqsIAg7ZS97Iqk7LOQIOqwkiDsiJjsoJXsnYQg7JqU7LKt7ZWY66m0IHVwZGF0ZUZpeHR1cmVzIOuPhOq1rOulvCDsgqzsmqntlZjsl6wg67OA6rK97IKs7ZWt7J2EIOyggeyaqe2VmOyEuOyalC5cbiAgICAgICAgLSBmaXh0dXJlSWQ6IOyImOygle2VoCDtlL3siqTss5AgSUQgKO2YleyLnTogXCJFbnRpdHlJZCNpZFwiKVxuICAgICAgICAtIHVwZGF0ZXM6IOy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcblxuICAgICAgICDsmIjsi5w6IFwiVXNlciMxXCIg7ZS97Iqk7LOQ7J2YIFwibmFtZVwiIOy7rOufvOydhCBcIu2Zjeq4uOuPmVwi7Jy866GcIOuzgOqyve2VmOugpOuptDpcbiAgICAgICAgdXBkYXRlRml4dHVyZXMoeyB1cGRhdGVzOiBbeyBmaXh0dXJlSWQ6IFwiVXNlciMxXCIsIHVwZGF0ZXM6IHsgbmFtZTogXCLtmY3quLjrj5lcIiB9IH1dIH0pXG5cbiAgICAgICAg67OA6rK965CgIOy7rOufvOydmCB0eXBl7J20IHJlbGF0aW9u7J24IOqyveyasCwg6rSA66CoIOyXlO2LsO2LsOyXkOuPhCDrsJjsmIHrkJjslrTslbwg7ZWgIOy7rOufvOydtCDsnojripTsp4Ag7ZmV7J247ZWY7IS47JqULlxuXG4gICAgICAgICMjIO2UveyKpOyzkCDsg53shLFcbiAgICAgICAg7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDtlL3siqTss5Ag7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVGaXh0dXJlcyDrj4Tqtazrpbwg7IKs7Jqp7ZWY7IS47JqULlxuICAgICAgICAtIGVudGl0eUlkOiDsg53shLHtlaAg7JeU7Yuw7YuwIElEXG4gICAgICAgIC0gaWQ6IOyDiCDroIjsvZTrk5zsnZggSUQgKOq4sOyhtCDtlL3siqTss5DsmYAg7KSR67O165CY7KeAIOyViuuKlCDsnYzsiJgg7IKs7JqpIOq2jOyepSwg7JiIOiAtMSwgLTIpXG4gICAgICAgIC0gY29sdW1uczog7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0ICjsl5Tti7Dti7Ag6rWs7KGwIOywuOqzoClcblxuICAgICAgICDsmIjsi5w6IOyDiOuhnOyatCBVc2VyIO2UveyKpOyzkOulvCDsg53shLHtlZjroKTrqbQ6XG4gICAgICAgIGNyZWF0ZUZpeHR1cmVzKHsgZml4dHVyZXM6IFt7IGVudGl0eUlkOiBcIlVzZXJcIiwgaWQ6IC0xLCBjb2x1bW5zOiB7IG5hbWU6IFwi7ZmN6ri464+ZXCIsIGVtYWlsOiBcImhvbmdAZXhhbXBsZS5jb21cIiB9IH1dIH0pXG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sIH0gPSB0aGlzLmFpU2RrO1xuXG4gICAgcmV0dXJuIHN0cmVhbVRleHQoe1xuICAgICAgbW9kZWwsXG4gICAgICBzeXN0ZW06IHN5c3RlbU1lc3NhZ2UsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzOiB7XG4gICAgICAgIHVwZGF0ZUZpeHR1cmVzOiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7ZS97Iqk7LOQIOugiOy9lOuTnOydmCDqsJLsnYQg7IiY7KCV7ZWp64uI64ukLiDsgqzsmqnsnpDqsIAg7Yq57KCVIOy7rOufvOydtOuCmCDqsJLsnYQg67OA6rK97ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICB1cGRhdGVzOiB6LmFycmF5KFxuICAgICAgICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgZml4dHVyZUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2UveyKpOyzkCBJRCAo7ZiV7IudOiBFbnRpdHlJZCNpZClcIiksXG4gICAgICAgICAgICAgICAgdXBkYXRlczogZml4dHVyZUNvbHVtbnNTY2hlbWEuZGVzY3JpYmUoXCLsu6zrn7zrqoXsnYQg7YKk66GcLCDsg4gg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0XCIpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgICAgIHVwZGF0ZXMsXG4gICAgICAgICAgfToge1xuICAgICAgICAgICAgdXBkYXRlczogQXJyYXk8eyBmaXh0dXJlSWQ6IHN0cmluZzsgdXBkYXRlczogRml4dHVyZVRvb2xDb2x1bW5zIH0+O1xuICAgICAgICAgIH0pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgdXBkYXRlZFJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSB9PiA9PiB7XG4gICAgICAgICAgICAvLyBmaXh0dXJlUmVjb3Jkc+ulvCDrs7XsgqztlZjqs6Ag7JeF642w7J207Yq4IOyggeyaqVxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IGZpeHR1cmVSZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IHVwZGF0ZXMuZmluZChcbiAgICAgICAgICAgICAgICAodTogeyBmaXh0dXJlSWQ6IHN0cmluZyB9KSA9PiB1LmZpeHR1cmVJZCA9PT0gcmVjb3JkLmZpeHR1cmVJZCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbHVtbnPsnZggdmFsdWXrpbwg7JeF642w7J207Yq4XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZS51cGRhdGVzKSkge1xuICAgICAgICAgICAgICAgICAgcmVjb3JkLmNvbHVtbnNbY29sdW1uTmFtZV0udmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdXBkYXRlZFJlY29yZHMgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgY3JlYXRlRml4dHVyZXM6IHRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCLsg4jroZzsmrQg7ZS97Iqk7LOQIOugiOy9lOuTnOulvCDsg53shLHtlanri4jri6QuIOyCrOyaqeyekOqwgCDsg4jroZzsmrQg642w7J207YSw66W8IOy2lOqwgO2VtOuLrOudvOqzoCDsmpTssq3tlaAg65WMIOyCrOyaqe2VmOyEuOyalC5cIixcbiAgICAgICAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgICAgICAgZml4dHVyZXM6IHouYXJyYXkoXG4gICAgICAgICAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogei5zdHJpbmcoKS5kZXNjcmliZShcIuyDneyEse2VoCDsl5Tti7Dti7AgSURcIiksXG4gICAgICAgICAgICAgICAgaWQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCLsg4gg66CI7L2U65Oc7J2YIElEICjsnYzsiJgg6raM7J6lLCDsmIg6IC0xLCAtMilcIiksXG4gICAgICAgICAgICAgICAgY29sdW1uczogZml4dHVyZUNvbHVtbnNTY2hlbWEuZGVzY3JpYmUoXCLsu6zrn7zrqoXsnYQg7YKk66GcLCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgZml4dHVyZXMsXG4gICAgICAgICAgfToge1xuICAgICAgICAgICAgZml4dHVyZXM6IEFycmF5PHsgZW50aXR5SWQ6IHN0cmluZzsgaWQ6IG51bWJlcjsgY29sdW1uczogRml4dHVyZVRvb2xDb2x1bW5zIH0+O1xuICAgICAgICAgIH0pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgdXBkYXRlZFJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSB9PiA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlcy5tYXAoKGZpeHR1cmUpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgICAgICAgLy8g7JeU7Yuw7YuwIHByb3Bz66W8IOq4sOuwmOycvOuhnCBjb2x1bW5zIOq1rOyEsVxuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXSA9IHt9O1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJ2aXJ0dWFsXCIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW3Byb3AubmFtZV0gPz8gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChwcm9wLm5hbWUgPT09IFwiY3JlYXRlZF9hdFwiKSB7XG4gICAgICAgICAgICAgICAgICAvLyDtmITsnqwg7Iuc6rCE7Jy866GcIOyEpOyglVxuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmXG4gICAgICAgICAgICAgICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8IHByb3AucmVsYXRpb25UeXBlID09PSBcIk1hbnlUb01hbnlcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIOuwsOyXtOuhnCDrs4DtmZhcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0uZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZml4dHVyZUlkOiBgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9YCxcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgICBpZDogZml4dHVyZS5pZCxcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIGZldGNoZWRSZWNvcmRzOiBbXSxcbiAgICAgICAgICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGU6IGZhbHNlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIOyDiCDroIjsvZTrk5zrk6TsnZggcmVsYXRpb24g7Lus65+87J2EIO2ZleyduO2VmOyXrCDquLDsobQg66CI7L2U65Oc65Ok7J2YIOyXreuwqe2WpSByZWxhdGlvbiDsl4XrjbDsnbTtirhcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmV3UmVjb3JkIG9mIG5ld1JlY29yZHMpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2NvbE5hbWUsIGNvbF0gb2YgT2JqZWN0LmVudHJpZXMobmV3UmVjb3JkLmNvbHVtbnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5wcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIiB8fCBjb2wudmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eUlkID0gY29sLnByb3Aud2l0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gQXJyYXkuaXNBcnJheShjb2wudmFsdWUpID8gY29sLnZhbHVlIDogW2NvbC52YWx1ZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cmVsYXRlZEVudGl0eUlkfSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlY29yZCA9IG5ld1JlY29yZHMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAocmVsYXRlZFJlY29yZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb24g7LC+6riwXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VDb2wgPSBPYmplY3QuZW50cmllcyhyZWxhdGVkUmVjb3JkLmNvbHVtbnMpLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKFssIGNdKSA9PiBjLnByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmIGMucHJvcC53aXRoID09PSBuZXdSZWNvcmQuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2VDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbcmV2ZXJzZUNvbE5hbWUsIHJldmVyc2VDb2xWYWx1ZV0gPSByZXZlcnNlQ29sO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJldmVyc2VDb2xWYWx1ZS52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIOyXreuwqe2WpeydtCDrsLDsl7Tsnbgg6rK97JqwIChIYXNNYW55LCBNYW55VG9NYW55KVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VDb2xWYWx1ZS5wcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHJldmVyc2VDb2xWYWx1ZS5wcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJIYXNNYW55XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZUNvbFZhbHVlLnByb3AucmVsYXRpb25UeXBlID09PSBcIk1hbnlUb01hbnlcIilcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSksIFwiY3VycmVudFZhbHVlIG11c3QgYmUgYW4gYXJyYXlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRWYWx1ZS5pbmNsdWRlcyhuZXdSZWNvcmQuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRSZWNvcmQuY29sdW1uc1tyZXZlcnNlQ29sTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmV2ZXJzZUNvbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbLi4uY3VycmVudFZhbHVlLCBuZXdSZWNvcmQuaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDsl63rsKntlqXsnbQg64uo7J28IOqwkuyduCDqsr3smrAgKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkUmVjb3JkLmNvbHVtbnNbcmV2ZXJzZUNvbE5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXZlcnNlQ29sVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdSZWNvcmQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB1cGRhdGVkUmVjb3JkczogbmV3UmVjb3JkcyB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUVudGl0eShtZXNzYWdlczogTW9kZWxNZXNzYWdlW10pOiBTdHJlYW1UZXh0UmVzdWx0PGFueSwgYW55PiB7XG4gICAgaWYgKCF0aGlzLmFpU2RrIHx8ICF0aGlzLm1vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBSSBTREsgbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXQoKSBmaXJzdC5cIik7XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbDtcblxuICAgIC8vIGVudGl0eS5pbnN0cnVjdGlvbnMubWQg7YyM7J28IOydveq4sCAoZGlzdC91aSDrmJDripQgc3JjL3Vp7JeQ7IScIOyLpO2WieuQmOuvgOuhnCDtjKjtgqTsp4Ag66Oo7Yq4IOq4sOykgOycvOuhnCDsoJHqt7wpXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgICBcIi4uXCIsXG4gICAgICBcIi4uXCIsXG4gICAgICBcInNyY1wiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1kXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIO2YhOyerCDrk7HroZ3rkJwg7JeU7Yuw7YuwIOygleuztCDsiJjsp5FcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgdGl0bGU6IGVudGl0eS50aXRsZSxcbiAgICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgICAgcHJvcHM6IGVudGl0eS5wcm9wcy5tYXAoKHApID0+ICh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgICBkZXNjOiBwLmRlc2MsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzeXN0ZW1NZXNzYWdlID0gYFxu64u57Iug7J2AIFNvbmFtdSDtlITroIjsnoTsm4ztgazsl5DshJwgRW50aXR57JmAIEVudW3snYQg7IOd7ISx7ZWY64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuJHtpbnN0cnVjdGlvbnN9XG5cbiMjIO2YhOyerCDrk7HroZ3rkJwgRW50aXR5IOuqqeuhnVxu64uk66W4IOyXlO2LsO2LsOyZgCDqtIDqs4QocmVsYXRpb24p66W8IOunuuqxsOuCmCBzdWJzZXTsl5DshJwg7LC47KGw7ZWgIOuVjCDrsJjrk5zsi5wg7JWE656YIOygleuztOulvCDtmZXsnbjtlZjshLjsmpQuXG5cbiR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdFbnRpdGllcywgbnVsbCwgMil9XG5cbiMjIFRvb2wg7IKs7JqpIOqwgOydtOuTnFxuXG4jIyMgRW50aXR5IOyDneyEsSAoY3JlYXRlRW50aXR5KVxu7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCBFbnRpdHkg7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC5cbi0gZW50aXR5SWQ6IFBhc2NhbENhc2XroZwg65CcIEVudGl0eSBJRCAo7JiIOiBcIlVzZXJcIiwgXCJQcm9kdWN0Q2F0ZWdvcnlcIilcbi0gdGl0bGU6IO2VnOq4gCDsoJzrqqkgKOyYiDogXCLsgqzsmqnsnpBcIiwgXCLsg4Htkogg7Lm07YWM6rOg66asXCIpXG4tIHRhYmxlOiBzbmFrZV9jYXNl66GcIOuQnCDthYzsnbTruJTrqoUgKOyYiDogXCJ1c2Vyc1wiLCBcInByb2R1Y3RfY2F0ZWdvcmllc1wiKVxuLSBwYXJlbnRJZDog67aA66qoIEVudGl0eSBJRCAo7ISg7YOd7IKs7ZWtKVxuLSBwcm9wczogRW50aXR57J2YIO2UhOuhnO2NvO2LsCDrsLDsl7QgKOychCDrrLjshJzsnZggUHJvcGVydHkgVHlwZXMg7LC46rOgKVxuLSBpbmRleGVzOiDsnbjrjbHsiqQg67Cw7Je0XG4tIHN1YnNldHM6IOyEnOu4jOyFiyDsoJXsnZggKOq4sOuzuOqwkjogeyBBOiBbXCJpZFwiXSB9KVxuLSBlbnVtczogRW51bSDsoJXsnZhcblxuIyMjIEVudGl0eSDsiJjsoJUgKHVwZGF0ZUVudGl0eSlcbuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWgIOuVjCB1cGRhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC4gRW51bSDstpTqsIAsIHByb3BzIOy2lOqwgC/siJjsoJUsIGluZGV4ZXMg7IiY7KCVIOuTsSDrqqjrk6Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlanri4jri6QuXG4tIGVudGl0eUlkOiDsiJjsoJXtlaAgRW50aXR5IElEXG4tIHVwZGF0ZXM6IOyImOygle2VoCDtlYTrk5zrk6QgKOu2gOu2hCDsl4XrjbDsnbTtirgpXG4gIC0gdGl0bGU6IOyXlO2LsO2LsCDtlZzquIAg7KCc66qpXG4gIC0gdGFibGU6IO2FjOydtOu4lOuqhVxuICAtIHByb3BzOiDstpTqsIDtlaAg7ZSE66Gc7Y287YuwIOuwsOyXtCAo6riw7KG0IHByb3Bz7JeQIOy2lOqwgCwg6rCZ7J2AIOydtOumhOydtOuptCDqtZDssrQpXG4gIC0gaW5kZXhlczog7LaU6rCA7ZWgIOyduOuNseyKpCDrsLDsl7QgKOq4sOyhtCBpbmRleGVz7JeQIOy2lOqwgClcbiAgLSBzdWJzZXRzOiDshJzruIzshYsg7KCV7J2YICjquLDsobQgc3Vic2V0c+yXkCDrs5HtlakpXG4gIC0gZW51bUxhYmVsczogRW51bSDsoJXsnZggKOq4sOyhtCBlbnVtTGFiZWxz7JeQIOuzke2VqSlcbi0gbW9kZTogXCJtZXJnZVwiKOq4sOuzuOqwkikg65iQ64qUIFwicmVwbGFjZVwiXG4gIC0gbWVyZ2U6IOq4sOyhtCDqsJLsl5Ag67OR7ZWpXG4gIC0gcmVwbGFjZTog7ZW064u5IO2VhOuTnCDsoITssrQg6rWQ7LK0XG5cbuyYiOyLnDogRW1wbG95ZWXsl5Ag7IOIIEVudW0g7LaU6rCAXG51cGRhdGVFbnRpdHkoeyBlbnRpdHlJZDogXCJFbXBsb3llZVwiLCB1cGRhdGVzOiB7IGVudW1MYWJlbHM6IHsgXCJFbXBsb3llZVJvbGVcIjogeyBcImFkbWluXCI6IFwi6rSA66as7J6QXCIsIFwidXNlclwiOiBcIuydvOuwmFwiIH0gfSB9IH0pXG5cbuyYiOyLnDogUHJvamVjdOyXkCDsg4gg7ZSE66Gc7Y287YuwIOy2lOqwgFxudXBkYXRlRW50aXR5KHsgZW50aXR5SWQ6IFwiUHJvamVjdFwiLCB1cGRhdGVzOiB7IHByb3BzOiBbeyBuYW1lOiBcInByaW9yaXR5XCIsIHR5cGU6IFwiaW50ZWdlclwiLCBkZXNjOiBcIuyasOyEoOyInOychFwiIH1dIH0gfSlcblxuIyMg7ZWE7IiYIOyCrO2VrVxuLSBFbnRpdHnsnZggcHJvcHPsl5DripQg7LWc7IaM7ZWcIGlkKGludGVnZXIsIHVuc2lnbmVkKSwgY3JlYXRlZF9hdCh0aW1lc3RhbXAp6rCAIO2PrO2VqOuQmOyWtOyVvCDtlanri4jri6QuXG4tIHJlbGF0aW9uIO2VhOuTnOuKlCBvblVwZGF0ZSwgb25EZWxldGXqsIAg7ZWE7IiY7J6F64uI64ukLiAo7JiI7Jm4OiBPbmVUb09uZeyXkOyEnCBoYXNKb2luQ29sdW1u7J20IGZhbHNl7J24IOqyveyasClcbi0gRW51bSBJROuKlCDrs7TthrUgRW50aXR5SWQgKyDsho3shLHrqoUg7ZiV7YOc7J6F64uI64ukICjsmIg6IFVzZXJTdGF0dXMsIFByb2R1Y3RUeXBlKVxuLSBzdWJzZXTsl5DshJwg64uk66W4IOyXlO2LsO2LsOydmCDtlITroZztjbzti7Drpbwg7LC47KGw7ZWgIOuVjOuKlCDrsJjrk5zsi5wg7ZW064u5IOyXlO2LsO2LsOydmCDsi6TsoJwg7ZSE66Gc7Y287Yuw66qF7J2EIOyCrOyaqe2VmOyEuOyalC5cblxuIyMg6rKA7KadIOyYpOulmCDsspjrpqxcbuuPhOq1rCDtmLjstpwg6rKw6rO866GcIOqygOymnSDsmKTrpZgodmFsaWRhdGlvbkVycm9ycynqsIAg67CY7ZmY65CY66m0OlxuMS4g7Jik66WYIOuplOyLnOyngOulvCDrtoTshJ3tlZjsl6wg66y47KCc7KCQ7J2EIO2MjOyVhe2VmOyEuOyalC5cbjIuIOyYpOulmOulvCDsiJjsoJXtlZwg642w7J207YSw66GcIGNyZWF0ZUVudGl0eeulvCDri6Tsi5wg7Zi47Lac7ZWY7IS47JqULlxuMy4g7IKs7Jqp7J6Q7JeQ6rKMIOyYpOulmOulvCDqt7jrjIDroZwg7KCE64us7ZWY7KeAIOunkOqzoCwg7IiY7KCVIO2bhCDsnqzsi5zrj4TtlZjshLjsmpQuXG5cbiMjIyDsnbzrsJjsoIHsnbgg6rKA7KadIOyYpOulmOyZgCDsiJjsoJUg67Cp67KVXG58IOyYpOulmCDrqZTsi5zsp4AgfCDsiJjsoJUg67Cp67KVIHxcbnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXxcbnwgXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiYXCIgfCBwcm9wc+yXkCB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIHVuc2lnbmVkOiB0cnVlIH0g7LaU6rCAIHxcbnwgXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJhcIiB8IHByb3Bz7JeQIHsgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHR5cGU6IFwidGltZXN0YW1wXCIsIGRiRGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiIH0g7LaU6rCAIHxcbnwgXCJYeHhPcmRlckJ5IGVudW3snbQg7ZWE7IiYXCIgfCBlbnVtc+yXkCB7IFwiWHh4T3JkZXJCeVwiOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSB9IOy2lOqwgCB8XG58IFwiWHh4U2VhcmNoRmllbGQgZW51beydtCDtlYTsiJhcIiB8IGVudW1z7JeQIHsgXCJYeHhTZWFyY2hGaWVsZFwiOiB7IFwiaWRcIjogXCJJRFwiIH0gfSDstpTqsIAgfFxufCBcInN0cmluZyDtg4DsnoXsnYAgbGVuZ3Ro6rCAIO2VhOyImFwiIHwg7ZW064u5IHByb3Dsl5AgbGVuZ3RoIOy2lOqwgCAo7JiIOiAyNTUpIHxcbnwgXCJ0ZXh0IO2DgOyeheydgCB0ZXh0VHlwZeydtCDtlYTsiJhcIiB8IO2VtOuLuSBwcm9w7JeQIHRleHRUeXBlIOy2lOqwgCAoXCJ0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcImxvbmd0ZXh0XCIpIHxcbnwgXCJvblVwZGF0ZeqwgCDtlYTsiJhcIiB8IO2VtOuLuSByZWxhdGlvbiBwcm9w7JeQIG9uVXBkYXRlLCBvbkRlbGV0ZSDstpTqsIAgKFwiQ0FTQ0FERVwiKSB8XG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sLCBzdGVwQ291bnRJcyB9ID0gdGhpcy5haVNkaztcblxuICAgIHJldHVybiBzdHJlYW1UZXh0KHtcbiAgICAgIG1vZGVsLFxuICAgICAgc3lzdGVtOiBzeXN0ZW1NZXNzYWdlLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBzdG9wV2hlbjogc3RlcENvdW50SXMoMiksXG4gICAgICB0b29sczoge1xuICAgICAgICBjcmVhdGVFbnRpdHk6IHRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCLsg4jroZzsmrQgRW50aXR566W8IOyDneyEse2VqeuLiOuLpC4g7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDsl5Tti7Dti7Drgpgg7YWM7J2067iUIOyDneyEseydhCDsmpTssq3tlaAg65WMIOyCrOyaqe2VmOyEuOyalC5cIixcbiAgICAgICAgICBpbnB1dFNjaGVtYTogVGVtcGxhdGVPcHRpb25zW1wic2hhcGVcIl0uZW50aXR5LFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChcbiAgICAgICAgICAgIGVudGl0eTogei5pbmZlcjwodHlwZW9mIFRlbXBsYXRlT3B0aW9ucylbXCJzaGFwZVwiXVtcImVudGl0eVwiXT4sXG4gICAgICAgICAgKTogUHJvbWlzZTx7XG4gICAgICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycz86IFZhbGlkYXRpb25FcnJvcltdO1xuICAgICAgICAgIH0+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpSDqsoDspp1cbiAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRW50aXR5SnNvbihlbnRpdHkpO1xuXG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGDqsoDspp0g7Jik66WYOiAke3ZhbGlkYXRpb25FcnJvcnMubWFwKChlKSA9PiBgWyR7ZS5maWVsZH1dICR7ZS5tZXNzYWdlfWApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoe1xuICAgICAgICAgICAgICAgIHN1YnNldHM6IHsgQTogW1wiaWRcIl0gfSxcbiAgICAgICAgICAgICAgICBlbnVtczoge30sXG4gICAgICAgICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBFbnRpdHlNYW5hZ2VyIOumrOuhnOuTnFxuICAgICAgICAgICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIHVwZGF0ZUVudGl0eTogdG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWp64uI64ukLiBFbnVtIOy2lOqwgCwgcHJvcHMg7LaU6rCAL+yImOyglSwgaW5kZXhlcyDsiJjsoJUsIHN1YnNldHMg7IiY7KCVIOuTsSDrqqjrk6Ag7JeU7Yuw7YuwIOyImOyglSDsnpHsl4Xsl5Ag7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICBlbnRpdHlJZDogei5zdHJpbmcoKS5kZXNjcmliZShcIuyImOygle2VoCBFbnRpdHkgSURcIiksXG4gICAgICAgICAgICB1cGRhdGVzOiBUZW1wbGF0ZU9wdGlvbnNbXCJzaGFwZVwiXS5lbnRpdHkucGFydGlhbCgpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2VhOuTnOuTpFwiKSxcbiAgICAgICAgICAgIG1vZGU6IHpcbiAgICAgICAgICAgICAgLmVudW0oW1wibWVyZ2VcIiwgXCJyZXBsYWNlXCJdKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCLsiJjsoJUg66qo65OcOiBtZXJnZSjquLDrs7jqsJIsIOq4sOyhtCDqsJLsl5Ag67OR7ZWpKSDrmJDripQgcmVwbGFjZSjsoITssrQg6rWQ7LK0KVwiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICB1cGRhdGVzLFxuICAgICAgICAgICAgbW9kZSA9IFwibWVyZ2VcIixcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBkYXRlczogUGFydGlhbDx6LmluZmVyPCh0eXBlb2YgVGVtcGxhdGVPcHRpb25zKVtcInNoYXBlXCJdW1wiZW50aXR5XCJdPj47XG4gICAgICAgICAgICBtb2RlPzogXCJtZXJnZVwiIHwgXCJyZXBsYWNlXCI7XG4gICAgICAgICAgfSk6IFByb21pc2U8e1xuICAgICAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGJhc2ljIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LmlkID0gdXBkYXRlcy5lbnRpdHlJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucGFyZW50SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LnBhcmVudElkID0gdXBkYXRlcy5wYXJlbnRJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGl0bGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRpdGxlID0gdXBkYXRlcy50aXRsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGFibGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRhYmxlID0gdXBkYXRlcy50YWJsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuY29uZSAhPT0gdW5kZWZpbmVkKSBlbnRpdHkuY29uZSA9IHVwZGF0ZXMuY29uZTtcblxuICAgICAgICAgICAgICAvLyBwcm9wczogbWVyZ2Ug7IucIOydtOumhCDquLDspIAg67OR7ZWpLCByZXBsYWNlIOyLnCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzID1cbiAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB1cGRhdGVzLnByb3BzIGFzIEVudGl0eVByb3BbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZXdQcm9wIG9mIHVwZGF0ZXMucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGVudGl0eS5wcm9wcy5maW5kSW5kZXgoKHApID0+IHAubmFtZSA9PT0gbmV3UHJvcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS5wcm9wc1tleGlzdGluZ0luZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBTQUZFVFk6IFVJIOuPhOq1rOydmCBab2Qg7J6F66ClIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG5ld1Byb3AgYXMgRW50aXR5UHJvcDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkucHJvcHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbmV3UHJvcCBhcyBFbnRpdHlQcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBpbmRleGVzOiBtZXJnZSDsi5wg7LaU6rCALCByZXBsYWNlIOyLnCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuaW5kZXhlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZW50aXR5LmluZGV4ZXMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCIgPyB1cGRhdGVzLmluZGV4ZXMgOiBbLi4uZW50aXR5LmluZGV4ZXMsIC4uLnVwZGF0ZXMuaW5kZXhlc107XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBzdWJzZXRzLCBzdWJzZXRzSW50ZXJuYWw6IGFzc2lnbuycvOuhnCDrs5Htlakg65iQ64qUIOq1kOyytFxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5zdWJzZXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgc3Vic2V0IGZpZWxkczogc2VwYXJhdGUgaW50byBzdWJzZXRzIChub3JtYWwpIGFuZCBzdWJzZXRzSW50ZXJuYWwgKGludGVybmFsKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkU3Vic2V0c0ludGVybmFsOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGVzLnN1YnNldHMpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEFycmF5ID1cbiAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBmaWVsZHMgYXMgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3Vic2V0c1trZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChmOiBzdHJpbmcpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVkU3Vic2V0c1xuICAgICAgICAgICAgICAgICAgICA6IHsgLi4uZW50aXR5LnN1YnNldHMsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzIH07XG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHNJbnRlcm5hbCA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIlxuICAgICAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmVudGl0eS5zdWJzZXRzSW50ZXJuYWwsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWwgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmVudW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRFbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHVwZGF0ZXMuZW51bXMpLm1hcCgoW2tleSwgZW51bURlZl0pID0+IFtcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBnZXRFbnVtRGVmVmFsdWVzKGVudW1EZWYpLFxuICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IGNvbnZlcnRlZEVudW1zIDogeyAuLi5lbnRpdHkuZW51bUxhYmVscywgLi4uY29udmVydGVkRW51bXMgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIOyggOyepSDsoIQg6rKA7KadXG4gICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0ZUVudGl0eUpzb24oe1xuICAgICAgICAgICAgICAgIC4uLmVudGl0eSxcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgICAgIGVudW1zOiBlbnRpdHkuZW51bUxhYmVscyxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGDqsoDspp0g7Jik66WYOiAke3ZhbGlkYXRpb25FcnJvcnMubWFwKChlKSA9PiBgWyR7ZS5maWVsZH1dICR7ZS5tZXNzYWdlfWApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbnRpdHlJZCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZW50aXR5SWQsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW50aXR5IEpTT07snbQgZW50aXR5Lmluc3RydWN0aW9ucy5tZOydmCDqt5zsuZnsnYQg65Sw66W064qU7KeAIOqygOymne2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFbnRpdHlKc29uKGlucHV0OiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pOiBWYWxpZGF0aW9uRXJyb3JbXSB7XG4gIGNvbnN0IGVycm9yczogVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgY29uc3QgeyBlbnRpdHlJZCwgcHJvcHMsIGVudW1zIH0gPSBpbnB1dDtcblxuICAvLyAxLiBpZCwgY3JlYXRlZF9hdCBwcm9wIO2VhOyImFxuICBjb25zdCBoYXNJZFByb3AgPSBwcm9wcz8uc29tZSgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICBpZiAoIWhhc0lkUHJvcCkge1xuICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6IFwicHJvcHNcIiwgbWVzc2FnZTogXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiY7J6F64uI64ukLlwiIH0pO1xuICB9XG4gIGNvbnN0IGhhc0NyZWF0ZWRBdFByb3AgPSBwcm9wcz8uc29tZSgocCkgPT4gcC5uYW1lID09PSBcImNyZWF0ZWRfYXRcIik7XG4gIGlmICghaGFzQ3JlYXRlZEF0UHJvcCkge1xuICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6IFwicHJvcHNcIiwgbWVzc2FnZTogXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJjsnoXri4jri6QuXCIgfSk7XG4gIH1cblxuICAvLyAyLiDtlYTsiJggZW51bSDqsoDspp06IEVudGl0eU5hbWVPcmRlckJ5LCBFbnRpdHlOYW1lU2VhcmNoRmllbGRcbiAgY29uc3Qgb3JkZXJCeUVudW1JZCA9IGAke2VudGl0eUlkfU9yZGVyQnlgO1xuICBjb25zdCBzZWFyY2hGaWVsZEVudW1JZCA9IGAke2VudGl0eUlkfVNlYXJjaEZpZWxkYDtcblxuICBpZiAoIWVudW1zPy5bb3JkZXJCeUVudW1JZF0pIHtcbiAgICBlcnJvcnMucHVzaCh7XG4gICAgICBmaWVsZDogXCJlbnVtc1wiLFxuICAgICAgbWVzc2FnZTogYCR7b3JkZXJCeUVudW1JZH0gZW51beydtCDtlYTsiJjsnoXri4jri6QuICjsmIg6IHsgXCJpZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIiB9KWAsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFlbnVtcz8uW3NlYXJjaEZpZWxkRW51bUlkXSkge1xuICAgIGVycm9ycy5wdXNoKHtcbiAgICAgIGZpZWxkOiBcImVudW1zXCIsXG4gICAgICBtZXNzYWdlOiBgJHtzZWFyY2hGaWVsZEVudW1JZH0gZW51beydtCDtlYTsiJjsnoXri4jri6QuICjsmIg6IHsgXCJpZFwiOiBcIklEXCIgfSlgLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gMy4gZW51bSBwcm9w7J2YIGlk6rCAIGVudW1z7JeQIOygleydmOuQmOyWtCDsnojripTsp4Ag7ZmV7J24IChjcm9zcy1maWVsZCDqsoDspp0pXG4gIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcyA/PyBbXSkge1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmICFlbnVtcz8uW3Byb3AuaWRdKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiBgcHJvcHMuJHtwcm9wLm5hbWV9YCxcbiAgICAgICAgbWVzc2FnZTogYGVudW0gaWQgXCIke3Byb3AuaWR9XCLqsIAgZW51bXPsl5Ag7KCV7J2Y65CY7Ja0IOyeiOyngCDslYrsirXri4jri6QuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCBjb25zdCBhaUNsaWVudCA9IG5ldyBBSUNsaWVudCgpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBd2hCQSxTQUFTLG1CQUFtQixPQUFxRDtDQUMvRSxNQUFNLFNBQTRCLENBQUM7Q0FDbkMsTUFBTSxFQUFFLFVBQVUsT0FBTyxVQUFVO0NBSW5DLElBQUksQ0FEYyxPQUFPLE1BQU0sTUFBTSxFQUFFLFNBQVMsSUFBSSxHQUVsRCxPQUFPLEtBQUs7RUFBRSxPQUFPO0VBQVMsU0FBUztDQUFrQixDQUFDO0NBRzVELElBQUksQ0FEcUIsT0FBTyxNQUFNLE1BQU0sRUFBRSxTQUFTLFlBQVksR0FFakUsT0FBTyxLQUFLO0VBQUUsT0FBTztFQUFTLFNBQVM7Q0FBMEIsQ0FBQztDQUlwRSxNQUFNLGdCQUFnQixHQUFHLFNBQVM7Q0FDbEMsTUFBTSxvQkFBb0IsR0FBRyxTQUFTO0NBRXRDLElBQUksQ0FBQyxRQUFRLGdCQUNYLE9BQU8sS0FBSztFQUNWLE9BQU87RUFDUCxTQUFTLEdBQUcsY0FBYztDQUM1QixDQUFDO0NBRUgsSUFBSSxDQUFDLFFBQVEsb0JBQ1gsT0FBTyxLQUFLO0VBQ1YsT0FBTztFQUNQLFNBQVMsR0FBRyxrQkFBa0I7Q0FDaEMsQ0FBQztDQUlILEtBQUssTUFBTSxRQUFRLFNBQVMsQ0FBQyxHQUMzQixJQUFJLEtBQUssU0FBUyxVQUFVLENBQUMsUUFBUSxLQUFLLEtBQ3hDLE9BQU8sS0FBSztFQUNWLE9BQU8sU0FBUyxLQUFLO0VBQ3JCLFNBQVMsWUFBWSxLQUFLLEdBQUc7Q0FDL0IsQ0FBQztDQUlMLE9BQU87QUFDVDs7O2FBMWpCc0M7cUJBQ2tCO1lBTWpDO1lBRXFCO0NBT3RDLHNCQUFzQixFQUFFLE1BQU07RUFBQyxFQUFFLE9BQU87RUFBRyxFQUFFLE9BQU87RUFBRyxFQUFFLFFBQVE7RUFBRyxFQUFFLEtBQUs7Q0FBQyxDQUFDO0NBQzdFLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDLENBQUM7Q0FDdEYsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyx3QkFBd0I7Q0FHcEUsV0FBTixNQUFlO0VBQ2IsUUFBc0M7RUFDdEMsUUFJVztFQUVYLE1BQU0sT0FBTztHQUNYLElBQUk7SUFDRixNQUFNLEVBQUUsY0FBYyxNQUFNLE9BQU87SUFDbkMsTUFBTSxXQUFXLE1BQU0sT0FBTztJQUM5QixLQUFLLFFBQVE7S0FBRSxHQUFHO0tBQVU7SUFBVTtJQUN0QyxLQUFLLFFBQVEsVUFBVSxtQkFBbUI7R0FDNUMsU0FBUyxPQUFPO0lBQ2QsUUFBUSxLQUNOLHFGQUNGO0lBQ0EsTUFBTTtHQUNSO0VBQ0Y7RUFFQSxjQUNFLFVBQ0EsZ0JBQzRCO0dBQzVCLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLE9BQ3ZCLE1BQU0sSUFBSSxNQUFNLDRDQUE0QztHQUU5RCxNQUFNLFFBQVEsS0FBSztHQUluQixNQUFNLG1CQUFtQixDQURGLEdBQUcsSUFBSSxJQUFJLGVBQWUsS0FBSyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQzlDLENBQUEsQ0FBYyxLQUFLLGFBQWE7SUFDdkQsTUFBTSxTQUFTLGNBQWMsSUFBSSxRQUFRO0lBRXpDLE9BQU87S0FDTCxVQUFVLE9BQU87S0FDakIsT0FBTyxPQUFPO0tBQ2QsT0FBTyxPQUFPO0tBQ2QsV0FBVyxPQUFPO0tBQ2xCLFlBQVksT0FBTztJQUNyQjtHQUNGLENBQUM7R0FFRCxNQUFNLGdCQUFnQjs7OztVQUloQixLQUFLLFVBQVUsZ0JBQWdCLE1BQU0sQ0FBQyxFQUFFOzs7VUFHeEMsS0FBSyxVQUFVLGtCQUFrQixNQUFNLENBQUMsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JoRCxNQUFNLEVBQUUsWUFBWSxTQUFTLEtBQUs7R0FFbEMsT0FBTyxXQUFXO0lBQ2hCO0lBQ0EsUUFBUTtJQUNSO0lBQ0EsT0FBTztLQUNMLGdCQUFnQixLQUFLO01BQ25CLGFBQ0U7TUFDRixhQUFhLEVBQUUsT0FBTyxFQUNwQixTQUFTLEVBQUUsTUFDVCxFQUFFLE9BQU87T0FDUCxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyw4QkFBOEI7T0FDN0QsU0FBUyxxQkFBcUIsU0FBUyx5QkFBeUI7TUFDbEUsQ0FBQyxDQUNILEVBQ0YsQ0FBQztNQUNELFNBQVMsT0FBTyxFQUNkLGNBR29FO09BaUJwRSxPQUFPO1FBQUUsU0FBUztRQUFNLGdCQWZnQixlQUFlLEtBQUssV0FBVztTQUNyRSxNQUFNLFNBQVMsUUFBUSxNQUNwQixNQUE2QixFQUFFLGNBQWMsT0FBTyxTQUN2RDtTQUNBLElBQUksUUFBUTtVQUVWLEtBQUssTUFBTSxDQUFDLFlBQVksYUFBYSxPQUFPLFFBQVEsT0FBTyxPQUFPLEdBQ2hFLE9BQU8sUUFBUSxXQUFXLENBQUMsUUFBUTtVQUVyQyxPQUFPO1NBQ1Q7U0FFQSxPQUFPO1FBQ1QsQ0FFd0I7T0FBZTtNQUN6QztLQUNGLENBQUM7S0FDRCxnQkFBZ0IsS0FBSztNQUNuQixhQUNFO01BQ0YsYUFBYSxFQUFFLE9BQU8sRUFDcEIsVUFBVSxFQUFFLE1BQ1YsRUFBRSxPQUFPO09BQ1AsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsWUFBWTtPQUMxQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyw4QkFBOEI7T0FDdEQsU0FBUyxxQkFBcUIsU0FBUyx1QkFBdUI7TUFDaEUsQ0FBQyxDQUNILEVBQ0YsQ0FBQztNQUNELFNBQVMsT0FBTyxFQUNkLGVBR29FO09BQ3BFLE1BQU0sYUFBOEIsU0FBUyxLQUFLLFlBQVk7UUFDNUQsTUFBTSxTQUFTLGNBQWMsSUFBSSxRQUFRLFFBQVE7UUFHakQsTUFBTSxVQUFvQyxDQUFDO1FBQzNDLEtBQUssTUFBTSxRQUFRLE9BQU8sT0FBTztTQUMvQixJQUFJLEtBQUssU0FBUyxXQUFXO1NBRTdCLElBQUksUUFBUSxRQUFRLFFBQVEsS0FBSyxTQUFTO1NBRTFDLElBQUksS0FBSyxTQUFTLGNBRWhCLHlCQUFRLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtjQUMxQixJQUNMLEtBQUssU0FBUyxlQUNiLEtBQUssaUJBQWlCLGFBQWEsS0FBSyxpQkFBaUIsZUFHMUQsUUFBUSxNQUFNLFFBQVEsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFdBQVc7U0FHbkUsUUFBUSxLQUFLLFFBQVE7VUFDbkI7VUFDQTtTQUNGO1FBQ0Y7UUFFQSxPQUFPO1NBQ0wsV0FBVyxHQUFHLFFBQVEsU0FBUyxHQUFHLFFBQVE7U0FDMUMsVUFBVSxRQUFRO1NBQ2xCLElBQUksUUFBUTtTQUNaO1NBQ0EsZ0JBQWdCLENBQUM7U0FDakIsZ0JBQWdCLENBQUM7U0FDakIsVUFBVTtRQUNaO09BQ0YsQ0FBQztPQUdELEtBQUssTUFBTSxhQUFhLFlBQ3RCLEtBQUssTUFBTSxDQUFDLFVBQVUsUUFBUSxPQUFPLFFBQVEsVUFBVSxPQUFPLEdBQUc7UUFDL0QsSUFBSSxJQUFJLEtBQUssU0FBUyxjQUFjLElBQUksVUFBVSxNQUFNO1FBRXhELE1BQU0sa0JBQWtCLElBQUksS0FBSztRQUNqQyxNQUFNLGFBQWEsTUFBTSxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSztRQUVwRSxLQUFLLE1BQU0sYUFBYSxZQUFZO1NBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLEdBQUc7U0FDL0MsTUFBTSxnQkFBZ0IsV0FBVyxNQUFNLE1BQU0sRUFBRSxjQUFjLGdCQUFnQjtTQUU3RSxJQUFJLGVBQWU7VUFFakIsTUFBTSxhQUFhLE9BQU8sUUFBUSxjQUFjLE9BQU8sQ0FBQyxDQUFDLE1BQ3RELEdBQUcsT0FBTyxFQUFFLEtBQUssU0FBUyxjQUFjLEVBQUUsS0FBSyxTQUFTLFVBQVUsUUFDckU7VUFFQSxJQUFJLFlBQVk7V0FDZCxNQUFNLENBQUMsZ0JBQWdCLG1CQUFtQjtXQUMxQyxNQUFNLGVBQWUsZ0JBQWdCO1dBR3JDLElBQ0UsZ0JBQWdCLEtBQUssU0FBUyxlQUM3QixnQkFBZ0IsS0FBSyxpQkFBaUIsYUFDckMsZ0JBQWdCLEtBQUssaUJBQWlCLGVBQ3hDO1lBQ0EsT0FBTyxNQUFNLFFBQVEsWUFBWSxHQUFHLCtCQUErQjtZQUNuRSxJQUFJLENBQUMsYUFBYSxTQUFTLFVBQVUsRUFBRSxHQUNyQyxjQUFjLFFBQVEsa0JBQWtCO2FBQ3RDLEdBQUc7YUFDSCxPQUFPLENBQUMsR0FBRyxjQUFjLFVBQVUsRUFBRTtZQUN2QztXQUVKLE9BRUUsY0FBYyxRQUFRLGtCQUFrQjtZQUN0QyxHQUFHO1lBQ0gsT0FBTyxVQUFVO1dBQ25CO1VBRUo7U0FDRjtRQUNGO09BQ0Y7T0FHRixPQUFPO1FBQUUsU0FBUztRQUFNLGdCQUFnQjtPQUFXO01BQ3JEO0tBQ0YsQ0FBQztJQUNIO0dBQ0YsQ0FBQztFQUNIO0VBRUEsYUFBYSxVQUFzRDtHQUNqRSxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsS0FBSyxPQUN2QixNQUFNLElBQUksTUFBTSw0Q0FBNEM7R0FFOUQsTUFBTSxRQUFRLEtBQUs7R0FHbkIsTUFBTSxtQkFBbUIsS0FBSyxLQUM1QixPQUFPLEtBQUssU0FDWixNQUNBLE1BQ0EsT0FDQSxNQUNBLHdCQUNGO0dBQ0EsTUFBTSxlQUFlLEdBQUcsYUFBYSxrQkFBa0IsT0FBTztHQUk5RCxNQUFNLG1CQURZLGNBQWMsVUFDUCxDQUFBLENBQVUsS0FBSyxhQUFhO0lBQ25ELE1BQU0sU0FBUyxjQUFjLElBQUksUUFBUTtJQUN6QyxPQUFPO0tBQ0wsSUFBSSxPQUFPO0tBQ1gsT0FBTyxPQUFPO0tBQ2QsT0FBTyxPQUFPO0tBQ2QsT0FBTyxPQUFPLE1BQU0sS0FBSyxPQUFPO01BQzlCLE1BQU0sRUFBRTtNQUNSLE1BQU0sRUFBRTtNQUNSLE1BQU0sRUFBRTtLQUNWLEVBQUU7SUFDSjtHQUNGLENBQUM7R0FFRCxNQUFNLGdCQUFnQjs7O0VBR3hCLGFBQWE7Ozs7O0VBS2IsS0FBSyxVQUFVLGtCQUFrQixNQUFNLENBQUMsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJEeEMsTUFBTSxFQUFFLFlBQVksTUFBTSxnQkFBZ0IsS0FBSztHQUUvQyxPQUFPLFdBQVc7SUFDaEI7SUFDQSxRQUFRO0lBQ1I7SUFDQSxVQUFVLFlBQVksQ0FBQztJQUN2QixPQUFPO0tBQ0wsY0FBYyxLQUFLO01BQ2pCLGFBQ0U7TUFDRixhQUFhLGdCQUFnQixRQUFRLENBQUM7TUFDdEMsU0FBUyxPQUNQLFdBTUk7T0FDSixJQUFJO1FBRUYsTUFBTSxtQkFBbUIsbUJBQW1CLE1BQU07UUFFbEQsSUFBSSxpQkFBaUIsU0FBUyxHQUM1QixPQUFPO1NBQ0wsU0FBUztTQUNULFVBQVUsT0FBTztTQUNqQixPQUFPLFVBQVUsaUJBQWlCLEtBQUssTUFBTSxJQUFJLEVBQUUsTUFBTSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxJQUFJO1NBQ25GO1FBQ0Y7UUFHRixNQUFNLE9BQU8sT0FBTyxhQUFhO1NBQy9CLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFO1NBQ3JCLE9BQU8sQ0FBQztTQUNSLEdBQUc7UUFDTCxDQUFDO1FBR0QsTUFBTSxjQUFjLE9BQU87UUFFM0IsT0FBTztTQUFFLFNBQVM7U0FBTSxVQUFVLE9BQU87UUFBUztPQUNwRCxTQUFTLEdBQUc7UUFDVixNQUFNLFFBQVEsYUFBYSxRQUFRLEVBQUUsVUFBVTtRQUMvQyxPQUFPO1NBQUUsU0FBUztTQUFPLFVBQVUsT0FBTztTQUFVO1FBQU07T0FDNUQ7TUFDRjtLQUNGLENBQUM7S0FDRCxjQUFjLEtBQUs7TUFDakIsYUFDRTtNQUNGLGFBQWEsRUFBRSxPQUFPO09BQ3BCLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLGVBQWU7T0FDN0MsU0FBUyxnQkFBZ0IsUUFBUSxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsU0FBUyxTQUFTO09BQ3JFLE1BQU0sRUFDSCxLQUFLLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUMxQixTQUFTLENBQUMsQ0FDVixTQUFTLCtDQUErQztNQUM3RCxDQUFDO01BQ0QsU0FBUyxPQUFPLEVBQ2QsVUFDQSxTQUNBLE9BQU8sY0FVSDtPQUNKLElBQUk7UUFDRixNQUFNLFNBQVMsY0FBYyxJQUFJLFFBQVE7UUFHekMsSUFBSSxRQUFRLGFBQWEsUUFBVyxPQUFPLEtBQUssUUFBUTtRQUN4RCxJQUFJLFFBQVEsYUFBYSxRQUFXLE9BQU8sV0FBVyxRQUFRO1FBQzlELElBQUksUUFBUSxVQUFVLFFBQVcsT0FBTyxRQUFRLFFBQVE7UUFDeEQsSUFBSSxRQUFRLFVBQVUsUUFBVyxPQUFPLFFBQVEsUUFBUTtRQUN4RCxJQUFJLFFBQVEsU0FBUyxRQUFXLE9BQU8sT0FBTyxRQUFRO1FBR3RELElBQUksUUFBUSxVQUFVLFFBQ3BCLElBQUksU0FBUyxXQUNYLE9BQU8sUUFDMkMsUUFBUTthQUUxRCxLQUFLLE1BQU0sV0FBVyxRQUFRLE9BQU87U0FDbkMsTUFBTSxnQkFBZ0IsT0FBTyxNQUFNLFdBQVcsTUFBTSxFQUFFLFNBQVMsUUFBUSxJQUFJO1NBQzNFLElBQUksaUJBQWlCLEdBQ25CLE9BQU8sTUFBTSxpQkFDcUM7Y0FFbEQsT0FBTyxNQUFNLEtBQ3FDLE9BQ2xEO1FBRUo7UUFLSixJQUFJLFFBQVEsWUFBWSxRQUN0QixPQUFPLFVBQ0wsU0FBUyxZQUFZLFFBQVEsVUFBVSxDQUFDLEdBQUcsT0FBTyxTQUFTLEdBQUcsUUFBUSxPQUFPO1FBSWpGLElBQUksUUFBUSxZQUFZLFFBQVc7U0FFakMsTUFBTSxvQkFBaUQsQ0FBQztTQUN4RCxNQUFNLDRCQUF5RCxDQUFDO1NBRWhFLEtBQUssTUFBTSxDQUFDLEtBQUssV0FBVyxPQUFPLFFBQVEsUUFBUSxPQUFPLEdBQUc7VUFDM0QsTUFBTSxhQUM0QztVQUNsRCxrQkFBa0IsT0FBTyxXQUN0QixRQUFRLE1BQWMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FDaEQsSUFBSSxvQkFBb0I7VUFDM0IsMEJBQTBCLE9BQU8sV0FDOUIsT0FBTyxxQkFBcUIsQ0FBQyxDQUM3QixJQUFJLG9CQUFvQjtTQUM3QjtTQUVBLE9BQU8sVUFDTCxTQUFTLFlBQ0wsb0JBQ0E7VUFBRSxHQUFHLE9BQU87VUFBUyxHQUFHO1NBQWtCO1NBQ2hELE9BQU8sa0JBQ0wsU0FBUyxZQUNMLDRCQUNBO1VBQUUsR0FBRyxPQUFPO1VBQWlCLEdBQUc7U0FBMEI7UUFDbEU7UUFFQSxJQUFJLFFBQVEsVUFBVSxRQUFXO1NBQy9CLE1BQU0saUJBQWlCLE9BQU8sWUFDNUIsT0FBTyxRQUFRLFFBQVEsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssYUFBYSxDQUNwRCxLQUNBLGlCQUFpQixPQUFPLENBQzFCLENBQUMsQ0FDSDtTQUNBLE9BQU8sYUFDTCxTQUFTLFlBQVksaUJBQWlCO1VBQUUsR0FBRyxPQUFPO1VBQVksR0FBRztTQUFlO1FBQ3BGO1FBR0EsTUFBTSxtQkFBbUIsbUJBQW1CO1NBQzFDLEdBQUc7U0FDSCxVQUFVLE9BQU87U0FDakIsT0FBTyxPQUFPO1FBQ2hCLENBQUM7UUFFRCxJQUFJLGlCQUFpQixTQUFTLEdBQzVCLE9BQU87U0FDTCxTQUFTO1NBQ1Q7U0FDQSxPQUFPLFVBQVUsaUJBQWlCLEtBQUssTUFBTSxJQUFJLEVBQUUsTUFBTSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxJQUFJO1NBQ25GO1FBQ0Y7UUFHRixNQUFNLE9BQU8sS0FBSztRQUVsQixPQUFPO1NBQUUsU0FBUztTQUFNO1FBQVM7T0FDbkMsU0FBUyxHQUFHO1FBRVYsT0FBTztTQUFFLFNBQVM7U0FBTztTQUFVLE9BRHJCLGFBQWEsUUFBUSxFQUFFLFVBQVU7UUFDTjtPQUMzQztNQUNGO0tBQ0YsQ0FBQztJQUNIO0dBQ0YsQ0FBQztFQUNIO0NBQ0Y7Q0FpRGEsV0FBVyxJQUFJLFNBQVMifQ==
|
|
410
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2xpZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG4vKiBveGxpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovIC8vIEFJIFNES+ydmCDtg4DsnoXsnbQg66qF7ZmV7ZWY7KeAIOyViuyVhCBhbnnrpbwg7ZeI7Jqp7ZWoXG5pbXBvcnQgeyB0eXBlIExhbmd1YWdlTW9kZWwsIHR5cGUgTW9kZWxNZXNzYWdlLCB0eXBlIFN0cmVhbVRleHRSZXN1bHQgfSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgVGVtcGxhdGVPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5UHJvcCwgdHlwZSBGaXh0dXJlUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG50eXBlIFZhbGlkYXRpb25FcnJvciA9IHtcbiAgZmllbGQ6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuY29uc3QgZml4dHVyZVNjYWxhclNjaGVtYSA9IHoudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCksIHouYm9vbGVhbigpLCB6Lm51bGwoKV0pO1xuY29uc3QgZml4dHVyZUNvbHVtblZhbHVlU2NoZW1hID0gei51bmlvbihbZml4dHVyZVNjYWxhclNjaGVtYSwgei5hcnJheShmaXh0dXJlU2NhbGFyU2NoZW1hKV0pO1xuY29uc3QgZml4dHVyZUNvbHVtbnNTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBmaXh0dXJlQ29sdW1uVmFsdWVTY2hlbWEpO1xudHlwZSBGaXh0dXJlVG9vbENvbHVtbnMgPSB6LmluZmVyPHR5cGVvZiBmaXh0dXJlQ29sdW1uc1NjaGVtYT47XG5cbmNsYXNzIEFJQ2xpZW50IHtcbiAgcHJpdmF0ZSBtb2RlbDogTGFuZ3VhZ2VNb2RlbCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFpU2RrOlxuICAgIHwgKHR5cGVvZiBpbXBvcnQoXCJhaVwiKSAmIHtcbiAgICAgICAgYW50aHJvcGljPzogdHlwZW9mIGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpLmFudGhyb3BpYztcbiAgICAgIH0pXG4gICAgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgICBjb25zdCBhaU1vZHVsZSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuICAgICAgdGhpcy5haVNkayA9IHsgLi4uYWlNb2R1bGUsIGFudGhyb3BpYyB9O1xuICAgICAgdGhpcy5tb2RlbCA9IGFudGhyb3BpYyhcImNsYXVkZS1zb25uZXQtNC02XCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQUkgU0RLIHBhY2thZ2VzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGwgQGFpLXNkay9hbnRocm9waWMgYW5kIGFpIHRvIHVzZSBBSSBmZWF0dXJlcy5cIixcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGaXh0dXJlKFxuICAgIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSxcbiAgICBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdLFxuICApOiBTdHJlYW1UZXh0UmVzdWx0PGFueSwgYW55LCBhbnk+IHtcbiAgICBpZiAoIXRoaXMuYWlTZGsgfHwgIXRoaXMubW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFJIFNESyBub3QgaW5pdGlhbGl6ZWQuIENhbGwgaW5pdCgpIGZpcnN0LlwiKTtcbiAgICB9XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsO1xuXG4gICAgLy8g7ZiE7J6sIGZpeHR1cmVSZWNvcmRz7JeQ7IScIOyCrOyaqeuQnCDsl5Tti7Dti7Drk6TsnZgg6rWs7KGwIOygleuztCDsiJjsp5FcbiAgICBjb25zdCB1c2VkRW50aXR5SWRzID0gWy4uLm5ldyBTZXQoZml4dHVyZVJlY29yZHMubWFwKChyKSA9PiByLmVudGl0eUlkKSldO1xuICAgIGNvbnN0IGVudGl0eVN0cnVjdHVyZXMgPSB1c2VkRW50aXR5SWRzLm1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgICAgcHJvcHM6IGVudGl0eS5wcm9wcyxcbiAgICAgICAgcmVsYXRpb25zOiBlbnRpdHkucmVsYXRpb25zLFxuICAgICAgICBlbnVtTGFiZWxzOiBlbnRpdHkuZW51bUxhYmVscyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzeXN0ZW1NZXNzYWdlID0gYFxuICAgICAgICDri7nsi6DsnYAg7ZS97Iqk7LOQIOugiOy9lOuTnOulvCDsiJjsoJXtlZjqs6Ag7IOd7ISx7ZWgIOyImCDsnojripQg64+E7Jqw66+47J6F64uI64ukLlxuXG4gICAgICAgIO2YhOyerCDtlL3siqTss5Ag66CI7L2U65OcOlxuICAgICAgICAke0pTT04uc3RyaW5naWZ5KGZpeHR1cmVSZWNvcmRzLCBudWxsLCAyKX1cblxuICAgICAgICDsl5Tti7Dti7Ag6rWs7KGwIOygleuztDpcbiAgICAgICAgJHtKU09OLnN0cmluZ2lmeShlbnRpdHlTdHJ1Y3R1cmVzLCBudWxsLCAyKX1cblxuICAgICAgICAjIyDtlL3siqTss5Ag7IiY7KCVXG4gICAgICAgIOyCrOyaqeyekOqwgCDtlL3siqTss5Ag6rCSIOyImOygleydhCDsmpTssq3tlZjrqbQgdXBkYXRlRml4dHVyZXMg64+E6rWs66W8IOyCrOyaqe2VmOyXrCDrs4Dqsr3sgqztla3snYQg7KCB7Jqp7ZWY7IS47JqULlxuICAgICAgICAtIGZpeHR1cmVJZDog7IiY7KCV7ZWgIO2UveyKpOyzkCBJRCAo7ZiV7IudOiBcIkVudGl0eUlkI2lkXCIpXG4gICAgICAgIC0gdXBkYXRlczog7Lus65+866qF7J2EIO2CpOuhnCwg7IOIIOqwkuydhCDqsJLsnLzroZwg7ZWY64qUIOqwneyytFxuXG4gICAgICAgIOyYiOyLnDogXCJVc2VyIzFcIiDtlL3siqTss5DsnZggXCJuYW1lXCIg7Lus65+87J2EIFwi7ZmN6ri464+ZXCLsnLzroZwg67OA6rK97ZWY66Ck66m0OlxuICAgICAgICB1cGRhdGVGaXh0dXJlcyh7IHVwZGF0ZXM6IFt7IGZpeHR1cmVJZDogXCJVc2VyIzFcIiwgdXBkYXRlczogeyBuYW1lOiBcIu2Zjeq4uOuPmVwiIH0gfV0gfSlcblxuICAgICAgICDrs4Dqsr3rkKAg7Lus65+87J2YIHR5cGXsnbQgcmVsYXRpb27snbgg6rK97JqwLCDqtIDroKgg7JeU7Yuw7Yuw7JeQ64+EIOuwmOyYgeuQmOyWtOyVvCDtlaAg7Lus65+87J20IOyeiOuKlOyngCDtmZXsnbjtlZjshLjsmpQuXG5cbiAgICAgICAgIyMg7ZS97Iqk7LOQIOyDneyEsVxuICAgICAgICDsgqzsmqnsnpDqsIAg7IOI66Gc7Jq0IO2UveyKpOyzkCDsg53shLHsnYQg7JqU7LKt7ZWY66m0IGNyZWF0ZUZpeHR1cmVzIOuPhOq1rOulvCDsgqzsmqntlZjshLjsmpQuXG4gICAgICAgIC0gZW50aXR5SWQ6IOyDneyEse2VoCDsl5Tti7Dti7AgSURcbiAgICAgICAgLSBpZDog7IOIIOugiOy9lOuTnOydmCBJRCAo6riw7KG0IO2UveyKpOyzkOyZgCDspJHrs7XrkJjsp4Ag7JWK64qUIOydjOyImCDsgqzsmqkg6raM7J6lLCDsmIg6IC0xLCAtMilcbiAgICAgICAgLSBjb2x1bW5zOiDsu6zrn7zrqoXsnYQg7YKk66GcLCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrQgKOyXlO2LsO2LsCDqtazsobAg7LC46rOgKVxuXG4gICAgICAgIOyYiOyLnDog7IOI66Gc7Jq0IFVzZXIg7ZS97Iqk7LOQ66W8IOyDneyEse2VmOugpOuptDpcbiAgICAgICAgY3JlYXRlRml4dHVyZXMoeyBmaXh0dXJlczogW3sgZW50aXR5SWQ6IFwiVXNlclwiLCBpZDogLTEsIGNvbHVtbnM6IHsgbmFtZTogXCLtmY3quLjrj5lcIiwgZW1haWw6IFwiaG9uZ0BleGFtcGxlLmNvbVwiIH0gfV0gfSlcbiAgICAgIGA7XG5cbiAgICBjb25zdCB7IHN0cmVhbVRleHQsIHRvb2wgfSA9IHRoaXMuYWlTZGs7XG5cbiAgICByZXR1cm4gc3RyZWFtVGV4dCh7XG4gICAgICBtb2RlbCxcbiAgICAgIHN5c3RlbTogc3lzdGVtTWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgdG9vbHM6IHtcbiAgICAgICAgdXBkYXRlRml4dHVyZXM6IHRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCLtlL3siqTss5Ag66CI7L2U65Oc7J2YIOqwkuydhCDsiJjsoJXtlanri4jri6QuIOyCrOyaqeyekOqwgCDtirnsoJUg7Lus65+87J2064KYIOqwkuydhCDrs4Dqsr3tlbTri6zrnbzqs6Ag7JqU7LKt7ZWgIOuVjCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgICAgIHVwZGF0ZXM6IHouYXJyYXkoXG4gICAgICAgICAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBmaXh0dXJlSWQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCLsiJjsoJXtlaAg7ZS97Iqk7LOQIElEICjtmJXsi506IEVudGl0eUlkI2lkKVwiKSxcbiAgICAgICAgICAgICAgICB1cGRhdGVzOiBmaXh0dXJlQ29sdW1uc1NjaGVtYS5kZXNjcmliZShcIuy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICB1cGRhdGVzOiBBcnJheTx7IGZpeHR1cmVJZDogc3RyaW5nOyB1cGRhdGVzOiBGaXh0dXJlVG9vbENvbHVtbnMgfT47XG4gICAgICAgICAgfSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyB1cGRhdGVkUmVjb3JkczogRml4dHVyZVJlY29yZFtdIH0+ID0+IHtcbiAgICAgICAgICAgIC8vIGZpeHR1cmVSZWNvcmRz66W8IOuzteyCrO2VmOqzoCDsl4XrjbDsnbTtirgg7KCB7JqpXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gZml4dHVyZVJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gdXBkYXRlcy5maW5kKFxuICAgICAgICAgICAgICAgICh1OiB7IGZpeHR1cmVJZDogc3RyaW5nIH0pID0+IHUuZml4dHVyZUlkID09PSByZWNvcmQuZml4dHVyZUlkLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gY29sdW1uc+ydmCB2YWx1ZeulvCDsl4XrjbDsnbTtirhcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtjb2x1bW5OYW1lLCBuZXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlLnVwZGF0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICByZWNvcmQuY29sdW1uc1tjb2x1bW5OYW1lXS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB1cGRhdGVkUmVjb3JkcyB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVGaXh0dXJlczogdG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIuyDiOuhnOyatCDtlL3siqTss5Ag66CI7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC4g7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDrjbDsnbTthLDrpbwg7LaU6rCA7ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICBmaXh0dXJlczogei5hcnJheShcbiAgICAgICAgICAgICAgei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IOd7ISx7ZWgIOyXlO2LsO2LsCBJRFwiKSxcbiAgICAgICAgICAgICAgICBpZDogei5udW1iZXIoKS5kZXNjcmliZShcIuyDiCDroIjsvZTrk5zsnZggSUQgKOydjOyImCDqtozsnqUsIOyYiDogLTEsIC0yKVwiKSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBmaXh0dXJlQ29sdW1uc1NjaGVtYS5kZXNjcmliZShcIuy7rOufvOuqheydhCDtgqTroZwsIOqwkuydhCDqsJLsnLzroZwg7ZWY64qUIOqwneyytFwiKSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7XG4gICAgICAgICAgICBmaXh0dXJlcyxcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICBmaXh0dXJlczogQXJyYXk8eyBlbnRpdHlJZDogc3RyaW5nOyBpZDogbnVtYmVyOyBjb2x1bW5zOiBGaXh0dXJlVG9vbENvbHVtbnMgfT47XG4gICAgICAgICAgfSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyB1cGRhdGVkUmVjb3JkczogRml4dHVyZVJlY29yZFtdIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IGZpeHR1cmVzLm1hcCgoZml4dHVyZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgICAgICAvLyDsl5Tti7Dti7AgcHJvcHPrpbwg6riw67CY7Jy866GcIGNvbHVtbnMg6rWs7ISxXG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnM6IEZpeHR1cmVSZWNvcmRbXCJjb2x1bW5zXCJdID0ge307XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInZpcnR1YWxcIikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmaXh0dXJlLmNvbHVtbnNbcHJvcC5uYW1lXSA/PyBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIO2YhOyerCDsi5zqsITsnLzroZwg7ISk7KCVXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgIChwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJIYXNNYW55XCIgfHwgcHJvcC5yZWxhdGlvblR5cGUgPT09IFwiTWFueVRvTWFueVwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8g67Cw7Je066GcIOuzgO2ZmFxuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbHVtbnNbcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaXh0dXJlSWQ6IGAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH1gLFxuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGlkOiBmaXh0dXJlLmlkLFxuICAgICAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8g7IOIIOugiOy9lOuTnOuTpOydmCByZWxhdGlvbiDsu6zrn7zsnYQg7ZmV7J247ZWY7JesIOq4sOyhtCDroIjsvZTrk5zrk6TsnZgg7Jet67Cp7ZalIHJlbGF0aW9uIOyXheuNsOydtO2KuFxuICAgICAgICAgICAgZm9yIChjb25zdCBuZXdSZWNvcmQgb2YgbmV3UmVjb3Jkcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfY29sTmFtZSwgY29sXSBvZiBPYmplY3QuZW50cmllcyhuZXdSZWNvcmQuY29sdW1ucykpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLnByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiIHx8IGNvbC52YWx1ZSA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5SWQgPSBjb2wucHJvcC53aXRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBBcnJheS5pc0FycmF5KGNvbC52YWx1ZSkgPyBjb2wudmFsdWUgOiBbY29sLnZhbHVlXTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtyZWxhdGVkRW50aXR5SWR9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVjb3JkID0gbmV3UmVjb3Jkcy5maW5kKChyKSA9PiByLmZpeHR1cmVJZCA9PT0gcmVsYXRlZEZpeHR1cmVJZCk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGVkUmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbiDssL7quLBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZUNvbCA9IE9iamVjdC5lbnRyaWVzKHJlbGF0ZWRSZWNvcmQuY29sdW1ucykuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAoWywgY10pID0+IGMucHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiYgYy5wcm9wLndpdGggPT09IG5ld1JlY29yZC5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZUNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtyZXZlcnNlQ29sTmFtZSwgcmV2ZXJzZUNvbFZhbHVlXSA9IHJldmVyc2VDb2w7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gcmV2ZXJzZUNvbFZhbHVlLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7Zal7J20IOuwsOyXtOyduCDqsr3smrAgKEhhc01hbnksIE1hbnlUb01hbnkpXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZUNvbFZhbHVlLnByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAocmV2ZXJzZUNvbFZhbHVlLnByb3AucmVsYXRpb25UeXBlID09PSBcIkhhc01hbnlcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlQ29sVmFsdWUucHJvcC5yZWxhdGlvblR5cGUgPT09IFwiTWFueVRvTWFueVwiKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSwgXCJjdXJyZW50VmFsdWUgbXVzdCBiZSBhbiBhcnJheVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudFZhbHVlLmluY2x1ZGVzKG5ld1JlY29yZC5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFJlY29yZC5jb2x1bW5zW3JldmVyc2VDb2xOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXZlcnNlQ29sVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFsuLi5jdXJyZW50VmFsdWUsIG5ld1JlY29yZC5pZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOyXreuwqe2WpeydtCDri6jsnbwg6rCS7J24IOqyveyasCAoQmVsb25nc1RvT25lLCBPbmVUb09uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRSZWNvcmQuY29sdW1uc1tyZXZlcnNlQ29sTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJldmVyc2VDb2xWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ld1JlY29yZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHVwZGF0ZWRSZWNvcmRzOiBuZXdSZWNvcmRzIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlRW50aXR5KG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSk6IFN0cmVhbVRleHRSZXN1bHQ8YW55LCBhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWw7XG5cbiAgICAvLyBlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1kIO2MjOydvCDsnb3quLAgKGRpc3QvdWkg65iQ64qUIHNyYy91aeyXkOyEnCDsi6TtlonrkJjrr4DroZwg7Yyo7YKk7KeAIOujqO2KuCDquLDspIDsnLzroZwg7KCR6re8KVxuICAgIGNvbnN0IGluc3RydWN0aW9uc1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLFxuICAgICAgXCIuLlwiLFxuICAgICAgXCIuLlwiLFxuICAgICAgXCJzcmNcIixcbiAgICAgIFwidWlcIixcbiAgICAgIFwiZW50aXR5Lmluc3RydWN0aW9ucy5tZFwiLFxuICAgICk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZnMucmVhZEZpbGVTeW5jKGluc3RydWN0aW9uc1BhdGgsIFwidXRmLThcIik7XG5cbiAgICAvLyDtmITsnqwg65Ox66Gd65CcIOyXlO2LsO2LsCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBjb25zdCBleGlzdGluZ0VudGl0aWVzID0gZW50aXR5SWRzLm1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBlbnRpdHkuaWQsXG4gICAgICAgIHRpdGxlOiBlbnRpdHkudGl0bGUsXG4gICAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICAgIHByb3BzOiBlbnRpdHkucHJvcHMubWFwKChwKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICB0eXBlOiBwLnR5cGUsXG4gICAgICAgICAgZGVzYzogcC5kZXNjLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3lzdGVtTWVzc2FnZSA9IGBcbuuLueyLoOydgCBTb25hbXUg7ZSE66CI7J6E7JuM7YGs7JeQ7IScIEVudGl0eeyZgCBFbnVt7J2EIOyDneyEse2VmOuKlCDrj4TsmrDrr7jsnoXri4jri6QuXG5cbiR7aW5zdHJ1Y3Rpb25zfVxuXG4jIyDtmITsnqwg65Ox66Gd65CcIEVudGl0eSDrqqnroZ1cbuuLpOuluCDsl5Tti7Dti7DsmYAg6rSA6rOEKHJlbGF0aW9uKeulvCDrp7rqsbDrgpggc3Vic2V07JeQ7IScIOywuOyhsO2VoCDrlYwg67CY65Oc7IucIOyVhOuemCDsoJXrs7Trpbwg7ZmV7J247ZWY7IS47JqULlxuXG4ke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nRW50aXRpZXMsIG51bGwsIDIpfVxuXG4jIyBUb29sIOyCrOyaqSDqsIDsnbTrk5xcblxuIyMjIEVudGl0eSDsg53shLEgKGNyZWF0ZUVudGl0eSlcbuyCrOyaqeyekOqwgCDsg4jroZzsmrQgRW50aXR5IOyDneyEseydhCDsmpTssq3tlZjrqbQgY3JlYXRlRW50aXR5IOuPhOq1rOulvCDsgqzsmqntlZjshLjsmpQuXG4tIGVudGl0eUlkOiBQYXNjYWxDYXNl66GcIOuQnCBFbnRpdHkgSUQgKOyYiDogXCJVc2VyXCIsIFwiUHJvZHVjdENhdGVnb3J5XCIpXG4tIHRpdGxlOiDtlZzquIAg7KCc66qpICjsmIg6IFwi7IKs7Jqp7J6QXCIsIFwi7IOB7ZKIIOy5tO2FjOqzoOumrFwiKVxuLSB0YWJsZTogc25ha2VfY2FzZeuhnCDrkJwg7YWM7J2067iU66qFICjsmIg6IFwidXNlcnNcIiwgXCJwcm9kdWN0X2NhdGVnb3JpZXNcIilcbi0gcGFyZW50SWQ6IOu2gOuqqCBFbnRpdHkgSUQgKOyEoO2DneyCrO2VrSlcbi0gcHJvcHM6IEVudGl0eeydmCDtlITroZztjbzti7Ag67Cw7Je0ICjsnIQg66y47ISc7J2YIFByb3BlcnR5IFR5cGVzIOywuOqzoClcbi0gaW5kZXhlczog7J24642x7IqkIOuwsOyXtFxuLSBzdWJzZXRzOiDshJzruIzshYsg7KCV7J2YICjquLDrs7jqsJI6IHsgQTogW1wiaWRcIl0gfSlcbi0gZW51bXM6IEVudW0g7KCV7J2YXG5cbiMjIyBFbnRpdHkg7IiY7KCVICh1cGRhdGVFbnRpdHkpXG7quLDsobQgRW50aXR566W8IOyImOygle2VoCDrlYwgdXBkYXRlRW50aXR5IOuPhOq1rOulvCDsgqzsmqntlZjshLjsmpQuIEVudW0g7LaU6rCALCBwcm9wcyDstpTqsIAv7IiY7KCVLCBpbmRleGVzIOyImOyglSDrk7Eg66qo65OgIOyImOyglSDsnpHsl4Xsl5Ag7IKs7Jqp7ZWp64uI64ukLlxuLSBlbnRpdHlJZDog7IiY7KCV7ZWgIEVudGl0eSBJRFxuLSB1cGRhdGVzOiDsiJjsoJXtlaAg7ZWE65Oc65OkICjrtoDrtoQg7JeF642w7J207Yq4KVxuICAtIHRpdGxlOiDsl5Tti7Dti7Ag7ZWc6riAIOygnOuqqVxuICAtIHRhYmxlOiDthYzsnbTruJTrqoVcbiAgLSBwcm9wczog7LaU6rCA7ZWgIO2UhOuhnO2NvO2LsCDrsLDsl7QgKOq4sOyhtCBwcm9wc+yXkCDstpTqsIAsIOqwmeydgCDsnbTrpoTsnbTrqbQg6rWQ7LK0KVxuICAtIGluZGV4ZXM6IOy2lOqwgO2VoCDsnbjrjbHsiqQg67Cw7Je0ICjquLDsobQgaW5kZXhlc+yXkCDstpTqsIApXG4gIC0gc3Vic2V0czog7ISc67iM7IWLIOygleydmCAo6riw7KG0IHN1YnNldHPsl5Ag67OR7ZWpKVxuICAtIGVudW1MYWJlbHM6IEVudW0g7KCV7J2YICjquLDsobQgZW51bUxhYmVsc+yXkCDrs5HtlakpXG4tIG1vZGU6IFwibWVyZ2VcIijquLDrs7jqsJIpIOuYkOuKlCBcInJlcGxhY2VcIlxuICAtIG1lcmdlOiDquLDsobQg6rCS7JeQIOuzke2VqVxuICAtIHJlcGxhY2U6IO2VtOuLuSDtlYTrk5wg7KCE7LK0IOq1kOyytFxuXG7smIjsi5w6IEVtcGxveWVl7JeQIOyDiCBFbnVtIOy2lOqwgFxudXBkYXRlRW50aXR5KHsgZW50aXR5SWQ6IFwiRW1wbG95ZWVcIiwgdXBkYXRlczogeyBlbnVtTGFiZWxzOiB7IFwiRW1wbG95ZWVSb2xlXCI6IHsgXCJhZG1pblwiOiBcIuq0gOumrOyekFwiLCBcInVzZXJcIjogXCLsnbzrsJhcIiB9IH0gfSB9KVxuXG7smIjsi5w6IFByb2plY3Tsl5Ag7IOIIO2UhOuhnO2NvO2LsCDstpTqsIBcbnVwZGF0ZUVudGl0eSh7IGVudGl0eUlkOiBcIlByb2plY3RcIiwgdXBkYXRlczogeyBwcm9wczogW3sgbmFtZTogXCJwcmlvcml0eVwiLCB0eXBlOiBcImludGVnZXJcIiwgZGVzYzogXCLsmrDshKDsiJzsnIRcIiB9XSB9IH0pXG5cbiMjIO2VhOyImCDsgqztla1cbi0gRW50aXR57J2YIHByb3Bz7JeQ64qUIOy1nOyGjO2VnCBpZChpbnRlZ2VyLCB1bnNpZ25lZCksIGNyZWF0ZWRfYXQodGltZXN0YW1wKeqwgCDtj6ztlajrkJjslrTslbwg7ZWp64uI64ukLlxuLSByZWxhdGlvbiDtlYTrk5zripQgb25VcGRhdGUsIG9uRGVsZXRl6rCAIO2VhOyImOyeheuLiOuLpC4gKOyYiOyZuDogT25lVG9PbmXsl5DshJwgaGFzSm9pbkNvbHVtbuydtCBmYWxzZeyduCDqsr3smrApXG4tIEVudW0gSUTripQg67O07Ya1IEVudGl0eUlkICsg7IaN7ISx66qFIO2Yle2DnOyeheuLiOuLpCAo7JiIOiBVc2VyU3RhdHVzLCBQcm9kdWN0VHlwZSlcbi0gc3Vic2V07JeQ7IScIOuLpOuluCDsl5Tti7Dti7DsnZgg7ZSE66Gc7Y287Yuw66W8IOywuOyhsO2VoCDrlYzripQg67CY65Oc7IucIO2VtOuLuSDsl5Tti7Dti7DsnZgg7Iuk7KCcIO2UhOuhnO2NvO2LsOuqheydhCDsgqzsmqntlZjshLjsmpQuXG5cbiMjIOqygOymnSDsmKTrpZgg7LKY66asXG7rj4Tqtawg7Zi47LacIOqysOqzvOuhnCDqsoDspp0g7Jik66WYKHZhbGlkYXRpb25FcnJvcnMp6rCAIOuwmO2ZmOuQmOuptDpcbjEuIOyYpOulmCDrqZTsi5zsp4Drpbwg67aE7ISd7ZWY7JesIOusuOygnOygkOydhCDtjIzslYXtlZjshLjsmpQuXG4yLiDsmKTrpZjrpbwg7IiY7KCV7ZWcIOuNsOydtO2EsOuhnCBjcmVhdGVFbnRpdHnrpbwg64uk7IucIO2YuOy2nO2VmOyEuOyalC5cbjMuIOyCrOyaqeyekOyXkOqyjCDsmKTrpZjrpbwg6re464yA66GcIOyghOuLrO2VmOyngCDrp5Dqs6AsIOyImOyglSDtm4Qg7J6s7Iuc64+E7ZWY7IS47JqULlxuXG4jIyMg7J2867CY7KCB7J24IOqygOymnSDsmKTrpZjsmYAg7IiY7KCVIOuwqeuylVxufCDsmKTrpZgg66mU7Iuc7KeAIHwg7IiY7KCVIOuwqeuylSB8XG58LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18XG58IFwiaWQg7ZSE66Gc7Y287Yuw6rCAIO2VhOyImFwiIHwgcHJvcHPsl5AgeyBuYW1lOiBcImlkXCIsIHR5cGU6IFwiaW50ZWdlclwiLCB1bnNpZ25lZDogdHJ1ZSB9IOy2lOqwgCB8XG58IFwiY3JlYXRlZF9hdCDtlITroZztjbzti7DqsIAg7ZWE7IiYXCIgfCBwcm9wc+yXkCB7IG5hbWU6IFwiY3JlYXRlZF9hdFwiLCB0eXBlOiBcInRpbWVzdGFtcFwiLCBkYkRlZmF1bHQ6IFwiQ1VSUkVOVF9USU1FU1RBTVBcIiB9IOy2lOqwgCB8XG58IFwiWHh4T3JkZXJCeSBlbnVt7J20IO2VhOyImFwiIHwgZW51bXPsl5AgeyBcIlh4eE9yZGVyQnlcIjogeyBcImlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiIH0gfSDstpTqsIAgfFxufCBcIlh4eFNlYXJjaEZpZWxkIGVudW3snbQg7ZWE7IiYXCIgfCBlbnVtc+yXkCB7IFwiWHh4U2VhcmNoRmllbGRcIjogeyBcImlkXCI6IFwiSURcIiB9IH0g7LaU6rCAIHxcbnwgXCJzdHJpbmcg7YOA7J6F7J2AIGxlbmd0aOqwgCDtlYTsiJhcIiB8IO2VtOuLuSBwcm9w7JeQIGxlbmd0aCDstpTqsIAgKOyYiDogMjU1KSB8XG58IFwidGV4dCDtg4DsnoXsnYAgdGV4dFR5cGXsnbQg7ZWE7IiYXCIgfCDtlbTri7kgcHJvcOyXkCB0ZXh0VHlwZSDstpTqsIAgKFwidGV4dFwiLCBcIm1lZGl1bXRleHRcIiwgXCJsb25ndGV4dFwiKSB8XG58IFwib25VcGRhdGXqsIAg7ZWE7IiYXCIgfCDtlbTri7kgcmVsYXRpb24gcHJvcOyXkCBvblVwZGF0ZSwgb25EZWxldGUg7LaU6rCAIChcIkNBU0NBREVcIikgfFxuICAgICAgYDtcblxuICAgIGNvbnN0IHsgc3RyZWFtVGV4dCwgdG9vbCwgc3RlcENvdW50SXMgfSA9IHRoaXMuYWlTZGs7XG5cbiAgICByZXR1cm4gc3RyZWFtVGV4dCh7XG4gICAgICBtb2RlbCxcbiAgICAgIHN5c3RlbTogc3lzdGVtTWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDIpLFxuICAgICAgdG9vbHM6IHtcbiAgICAgICAgY3JlYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7IOI66Gc7Jq0IEVudGl0eeulvCDsg53shLHtlanri4jri6QuIOyCrOyaqeyekOqwgCDsg4jroZzsmrQg7JeU7Yuw7Yuw64KYIO2FjOydtOu4lCDsg53shLHsnYQg7JqU7LKt7ZWgIOuVjCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IFRlbXBsYXRlT3B0aW9uc1tcInNoYXBlXCJdLmVudGl0eSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoXG4gICAgICAgICAgICBlbnRpdHk6IHouaW5mZXI8KHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMpW1wic2hhcGVcIl1bXCJlbnRpdHlcIl0+LFxuICAgICAgICAgICk6IFByb21pc2U8e1xuICAgICAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDsnoXroKUg6rKA7KadXG4gICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0ZUVudGl0eUpzb24oZW50aXR5KTtcblxuICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBg6rKA7KadIOyYpOulmDogJHt2YWxpZGF0aW9uRXJyb3JzLm1hcCgoZSkgPT4gYFske2UuZmllbGR9XSAke2UubWVzc2FnZX1gKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHtcbiAgICAgICAgICAgICAgICBzdWJzZXRzOiB7IEE6IFtcImlkXCJdIH0sXG4gICAgICAgICAgICAgICAgZW51bXM6IHt9LFxuICAgICAgICAgICAgICAgIC4uLmVudGl0eSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gRW50aXR5TWFuYWdlciDrpqzroZzrk5xcbiAgICAgICAgICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbnRpdHlJZDogZW50aXR5LmVudGl0eUlkIH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlbnRpdHlJZDogZW50aXR5LmVudGl0eUlkLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICB1cGRhdGVFbnRpdHk6IHRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgXCLquLDsobQgRW50aXR566W8IOyImOygle2VqeuLiOuLpC4gRW51bSDstpTqsIAsIHByb3BzIOy2lOqwgC/siJjsoJUsIGluZGV4ZXMg7IiY7KCVLCBzdWJzZXRzIOyImOyglSDrk7Eg66qo65OgIOyXlO2LsO2LsCDsiJjsoJUg7J6R7JeF7JeQIOyCrOyaqe2VmOyEuOyalC5cIixcbiAgICAgICAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgICAgICAgZW50aXR5SWQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCLsiJjsoJXtlaAgRW50aXR5IElEXCIpLFxuICAgICAgICAgICAgdXBkYXRlczogVGVtcGxhdGVPcHRpb25zW1wic2hhcGVcIl0uZW50aXR5LnBhcnRpYWwoKS5kZXNjcmliZShcIuyImOygle2VoCDtlYTrk5zrk6RcIiksXG4gICAgICAgICAgICBtb2RlOiB6XG4gICAgICAgICAgICAgIC5lbnVtKFtcIm1lcmdlXCIsIFwicmVwbGFjZVwiXSlcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwi7IiY7KCVIOuqqOuTnDogbWVyZ2Uo6riw67O46rCSLCDquLDsobQg6rCS7JeQIOuzke2VqSkg65iQ64qUIHJlcGxhY2Uo7KCE7LK0IOq1kOyytClcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICAgIG1vZGUgPSBcIm1lcmdlXCIsXG4gICAgICAgICAgfToge1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHVwZGF0ZXM6IFBhcnRpYWw8ei5pbmZlcjwodHlwZW9mIFRlbXBsYXRlT3B0aW9ucylbXCJzaGFwZVwiXVtcImVudGl0eVwiXT4+O1xuICAgICAgICAgICAgbW9kZT86IFwibWVyZ2VcIiB8IFwicmVwbGFjZVwiO1xuICAgICAgICAgIH0pOiBQcm9taXNlPHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzPzogVmFsaWRhdGlvbkVycm9yW107XG4gICAgICAgICAgfT4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBiYXNpYyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmVudGl0eUlkICE9PSB1bmRlZmluZWQpIGVudGl0eS5pZCA9IHVwZGF0ZXMuZW50aXR5SWQ7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnBhcmVudElkICE9PSB1bmRlZmluZWQpIGVudGl0eS5wYXJlbnRJZCA9IHVwZGF0ZXMucGFyZW50SWQ7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnRpdGxlICE9PSB1bmRlZmluZWQpIGVudGl0eS50aXRsZSA9IHVwZGF0ZXMudGl0bGU7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnRhYmxlICE9PSB1bmRlZmluZWQpIGVudGl0eS50YWJsZSA9IHVwZGF0ZXMudGFibGU7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmNvbmUgIT09IHVuZGVmaW5lZCkgZW50aXR5LmNvbmUgPSB1cGRhdGVzLmNvbmU7XG5cbiAgICAgICAgICAgICAgLy8gcHJvcHM6IG1lcmdlIOyLnCDsnbTrpoQg6riw7KSAIOuzke2VqSwgcmVwbGFjZSDsi5wg6rWQ7LK0XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGVudGl0eS5wcm9wcyA9XG4gICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gdXBkYXRlcy5wcm9wcyBhcyBFbnRpdHlQcm9wW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmV3UHJvcCBvZiB1cGRhdGVzLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IG5ld1Byb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkucHJvcHNbZXhpc3RpbmdJbmRleF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBuZXdQcm9wIGFzIEVudGl0eVByb3A7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBTQUZFVFk6IFVJIOuPhOq1rOydmCBab2Qg7J6F66ClIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG5ld1Byb3AgYXMgRW50aXR5UHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gaW5kZXhlczogbWVyZ2Ug7IucIOy2lOqwgCwgcmVwbGFjZSDsi5wg6rWQ7LK0XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmluZGV4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGVudGl0eS5pbmRleGVzID1cbiAgICAgICAgICAgICAgICAgIG1vZGUgPT09IFwicmVwbGFjZVwiID8gdXBkYXRlcy5pbmRleGVzIDogWy4uLmVudGl0eS5pbmRleGVzLCAuLi51cGRhdGVzLmluZGV4ZXNdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gc3Vic2V0cywgc3Vic2V0c0ludGVybmFsOiBhc3NpZ27snLzroZwg67OR7ZWpIOuYkOuKlCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuc3Vic2V0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHN1YnNldCBmaWVsZHM6IHNlcGFyYXRlIGludG8gc3Vic2V0cyAobm9ybWFsKSBhbmQgc3Vic2V0c0ludGVybmFsIChpbnRlcm5hbClcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkU3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN1YnNldHNJbnRlcm5hbDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgT2JqZWN0LmVudHJpZXModXBkYXRlcy5zdWJzZXRzKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRBcnJheSA9XG4gICAgICAgICAgICAgICAgICAgIC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZmllbGRzIGFzIHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN1YnNldHNba2V5XSA9IGZpZWxkQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZjogc3RyaW5nKSA9PiAhaXNJbnRlcm5hbFN1YnNldEZpZWxkKGYpKVxuICAgICAgICAgICAgICAgICAgICAubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWxba2V5XSA9IGZpZWxkQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzID1cbiAgICAgICAgICAgICAgICAgIG1vZGUgPT09IFwicmVwbGFjZVwiXG4gICAgICAgICAgICAgICAgICAgID8gbm9ybWFsaXplZFN1YnNldHNcbiAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmVudGl0eS5zdWJzZXRzLCAuLi5ub3JtYWxpemVkU3Vic2V0cyB9O1xuICAgICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzSW50ZXJuYWwgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVkU3Vic2V0c0ludGVybmFsXG4gICAgICAgICAgICAgICAgICAgIDogeyAuLi5lbnRpdHkuc3Vic2V0c0ludGVybmFsLCAuLi5ub3JtYWxpemVkU3Vic2V0c0ludGVybmFsIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5lbnVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVkRW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh1cGRhdGVzLmVudW1zKS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKSxcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZW50aXR5LmVudW1MYWJlbHMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCIgPyBjb252ZXJ0ZWRFbnVtcyA6IHsgLi4uZW50aXR5LmVudW1MYWJlbHMsIC4uLmNvbnZlcnRlZEVudW1zIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyDsoIDsnqUg7KCEIOqygOymnVxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVFbnRpdHlKc29uKHtcbiAgICAgICAgICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgICAgICBlbnVtczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBg6rKA7KadIOyYpOulmDogJHt2YWxpZGF0aW9uRXJyb3JzLm1hcCgoZSkgPT4gYFske2UuZmllbGR9XSAke2UubWVzc2FnZX1gKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50aXR5SWQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVudGl0eUlkLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVudGl0eSBKU09O7J20IGVudGl0eS5pbnN0cnVjdGlvbnMubWTsnZgg6rec7LmZ7J2EIOuUsOultOuKlOyngCDqsoDspp3tlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW50aXR5SnNvbihpbnB1dDogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKTogVmFsaWRhdGlvbkVycm9yW10ge1xuICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gIGNvbnN0IHsgZW50aXR5SWQsIHByb3BzLCBlbnVtcyB9ID0gaW5wdXQ7XG5cbiAgLy8gMS4gaWQsIGNyZWF0ZWRfYXQgcHJvcCDtlYTsiJhcbiAgY29uc3QgaGFzSWRQcm9wID0gcHJvcHM/LnNvbWUoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgaWYgKCFoYXNJZFByb3ApIHtcbiAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiBcInByb3BzXCIsIG1lc3NhZ2U6IFwiaWQg7ZSE66Gc7Y287Yuw6rCAIO2VhOyImOyeheuLiOuLpC5cIiB9KTtcbiAgfVxuICBjb25zdCBoYXNDcmVhdGVkQXRQcm9wID0gcHJvcHM/LnNvbWUoKHApID0+IHAubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpO1xuICBpZiAoIWhhc0NyZWF0ZWRBdFByb3ApIHtcbiAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiBcInByb3BzXCIsIG1lc3NhZ2U6IFwiY3JlYXRlZF9hdCDtlITroZztjbzti7DqsIAg7ZWE7IiY7J6F64uI64ukLlwiIH0pO1xuICB9XG5cbiAgLy8gMi4g7ZWE7IiYIGVudW0g6rKA7KadOiBFbnRpdHlOYW1lT3JkZXJCeSwgRW50aXR5TmFtZVNlYXJjaEZpZWxkXG4gIGNvbnN0IG9yZGVyQnlFbnVtSWQgPSBgJHtlbnRpdHlJZH1PcmRlckJ5YDtcbiAgY29uc3Qgc2VhcmNoRmllbGRFbnVtSWQgPSBgJHtlbnRpdHlJZH1TZWFyY2hGaWVsZGA7XG5cbiAgaWYgKCFlbnVtcz8uW29yZGVyQnlFbnVtSWRdKSB7XG4gICAgZXJyb3JzLnB1c2goe1xuICAgICAgZmllbGQ6IFwiZW51bXNcIixcbiAgICAgIG1lc3NhZ2U6IGAke29yZGVyQnlFbnVtSWR9IGVudW3snbQg7ZWE7IiY7J6F64uI64ukLiAo7JiIOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSlgLFxuICAgIH0pO1xuICB9XG4gIGlmICghZW51bXM/LltzZWFyY2hGaWVsZEVudW1JZF0pIHtcbiAgICBlcnJvcnMucHVzaCh7XG4gICAgICBmaWVsZDogXCJlbnVtc1wiLFxuICAgICAgbWVzc2FnZTogYCR7c2VhcmNoRmllbGRFbnVtSWR9IGVudW3snbQg7ZWE7IiY7J6F64uI64ukLiAo7JiIOiB7IFwiaWRcIjogXCJJRFwiIH0pYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDMuIGVudW0gcHJvcOydmCBpZOqwgCBlbnVtc+yXkCDsoJXsnZjrkJjslrQg7J6I64qU7KeAIO2ZleyduCAoY3Jvc3MtZmllbGQg6rKA7KadKVxuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMgPz8gW10pIHtcbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiAmJiAhZW51bXM/Lltwcm9wLmlkXSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogYHByb3BzLiR7cHJvcC5uYW1lfWAsXG4gICAgICAgIG1lc3NhZ2U6IGBlbnVtIGlkIFwiJHtwcm9wLmlkfVwi6rCAIGVudW1z7JeQIOygleydmOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLmAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgY29uc3QgYWlDbGllbnQgPSBuZXcgQUlDbGllbnQoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQXdoQkEsU0FBUyxtQkFBbUIsT0FBcUQ7Q0FDL0UsTUFBTSxTQUE0QixDQUFDO0NBQ25DLE1BQU0sRUFBRSxVQUFVLE9BQU8sVUFBVTtDQUluQyxJQUFJLENBRGMsT0FBTyxNQUFNLE1BQU0sRUFBRSxTQUFTLElBQUksR0FFbEQsT0FBTyxLQUFLO0VBQUUsT0FBTztFQUFTLFNBQVM7Q0FBa0IsQ0FBQztDQUc1RCxJQUFJLENBRHFCLE9BQU8sTUFBTSxNQUFNLEVBQUUsU0FBUyxZQUFZLEdBRWpFLE9BQU8sS0FBSztFQUFFLE9BQU87RUFBUyxTQUFTO0NBQTBCLENBQUM7Q0FJcEUsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTO0NBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUztDQUV0QyxJQUFJLENBQUMsUUFBUSxnQkFDWCxPQUFPLEtBQUs7RUFDVixPQUFPO0VBQ1AsU0FBUyxHQUFHLGNBQWM7Q0FDNUIsQ0FBQztDQUVILElBQUksQ0FBQyxRQUFRLG9CQUNYLE9BQU8sS0FBSztFQUNWLE9BQU87RUFDUCxTQUFTLEdBQUcsa0JBQWtCO0NBQ2hDLENBQUM7Q0FJ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
|
package/dist/ui/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAkF/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAkF/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAk0C/D"}
|