obsidian-dev-utils 80.1.0 → 82.0.0-beta.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/CHANGELOG.md +34 -0
- package/dist/lib/cjs/abort-controller.cjs +12 -9
- package/dist/lib/cjs/abort-controller.d.cts +2 -2
- package/dist/lib/cjs/async-events.cjs +9 -1
- package/dist/lib/cjs/async-events.d.cts +9 -1
- package/dist/lib/cjs/async.cjs +93 -34
- package/dist/lib/cjs/async.d.cts +87 -17
- package/dist/lib/cjs/codemirror/state-field-spec.d.cts +1 -1
- package/dist/lib/cjs/css-class.cjs +6 -1
- package/dist/lib/cjs/css-class.d.cts +20 -0
- package/dist/lib/cjs/debug.cjs +26 -9
- package/dist/lib/cjs/debug.d.cts +24 -6
- package/dist/lib/cjs/disposable.cjs +234 -0
- package/dist/lib/cjs/disposable.d.cts +124 -0
- package/dist/lib/cjs/error.cjs +29 -18
- package/dist/lib/cjs/error.d.cts +23 -7
- package/dist/lib/cjs/function.d.cts +1 -1
- package/dist/lib/cjs/html-element.cjs +9 -6
- package/dist/lib/cjs/html-element.d.cts +5 -3
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library.cjs +2 -2
- package/dist/lib/cjs/object-utils.cjs +233 -128
- package/dist/lib/cjs/object-utils.d.cts +38 -13
- package/dist/lib/cjs/obsidian/@types/dataview/api/plugin-api.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/data-index/index.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/data-model/markdown.d.cts +2 -2
- package/dist/lib/cjs/obsidian/@types/dataview/data-model/serialized/markdown.d.cts +2 -2
- package/dist/lib/cjs/obsidian/@types/dataview/index.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/query/engine.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/typings/obsidian-ex.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/ui/lp-render.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/ui/markdown.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/ui/views/calendar-view.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/ui/views/inline-view.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/ui/views/list-view.d.cts +2 -2
- package/dist/lib/cjs/obsidian/@types/dataview/ui/views/table-view.d.cts +2 -2
- package/dist/lib/cjs/obsidian/@types/dataview/ui/views/task-view.d.cts +1 -1
- package/dist/lib/cjs/obsidian/active-file-provider.d.cts +1 -1
- package/dist/lib/cjs/obsidian/app.d.cts +1 -1
- package/dist/lib/cjs/obsidian/async-with-notice.cjs +9 -6
- package/dist/lib/cjs/obsidian/async-with-notice.d.cts +16 -3
- package/dist/lib/cjs/obsidian/attachment-path.cjs +45 -13
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +47 -9
- package/dist/lib/cjs/obsidian/backlink.cjs +6 -6
- package/dist/lib/cjs/obsidian/backlink.d.cts +6 -2
- package/dist/lib/cjs/obsidian/bases-view-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/callout.cjs +1 -1
- package/dist/lib/cjs/obsidian/callout.d.cts +8 -0
- package/dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts +1 -1
- package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +1 -1
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +53 -16
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +84 -10
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +1 -1
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +25 -5
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +38 -2
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +33 -19
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.d.cts +45 -19
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +33 -19
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.d.cts +45 -19
- package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.d.cts +2 -2
- package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.d.cts +1 -1
- package/dist/lib/cjs/obsidian/command-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +17 -9
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +49 -9
- package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +5 -2
- package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/disposable-component.cjs +5 -10
- package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +0 -7
- package/dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -2
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +24 -8
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +26 -5
- package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/registry-component.d.cts +1 -1
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +195 -72
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +4 -1
- package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.d.cts +2 -2
- package/dist/lib/cjs/obsidian/data-handler.d.cts +1 -1
- package/dist/lib/cjs/obsidian/dataview-link.cjs +7 -2
- package/dist/lib/cjs/obsidian/dataview-link.d.cts +22 -5
- package/dist/lib/cjs/obsidian/dataview.cjs +27 -10
- package/dist/lib/cjs/obsidian/dataview.d.cts +32 -7
- package/dist/lib/cjs/obsidian/editor-extension-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/editor-lock.cjs +245 -0
- package/dist/lib/cjs/obsidian/editor-lock.d.cts +57 -0
- package/dist/lib/cjs/obsidian/editor.cjs +7 -1
- package/dist/lib/cjs/obsidian/editor.d.cts +3 -2
- package/dist/lib/cjs/obsidian/file-change.cjs +103 -27
- package/dist/lib/cjs/obsidian/file-change.d.cts +55 -14
- package/dist/lib/cjs/obsidian/file-manager.cjs +61 -32
- package/dist/lib/cjs/obsidian/file-manager.d.cts +65 -15
- package/dist/lib/cjs/obsidian/file-system.cjs +122 -23
- package/dist/lib/cjs/obsidian/file-system.d.cts +189 -40
- package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.d.cts +1 -1
- package/dist/lib/cjs/obsidian/frontmatter.cjs +7 -2
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +1 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +4 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
- package/dist/lib/cjs/obsidian/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/link.cjs +326 -129
- package/dist/lib/cjs/obsidian/link.d.cts +133 -36
- package/dist/lib/cjs/obsidian/logger.cjs +48 -22
- package/dist/lib/cjs/obsidian/logger.d.cts +27 -6
- package/dist/lib/cjs/obsidian/loop.cjs +14 -4
- package/dist/lib/cjs/obsidian/loop.d.cts +27 -8
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +2 -2
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +155 -107
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +16 -6
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +5 -3
- package/dist/lib/cjs/obsidian/markdown-view.d.cts +1 -1
- package/dist/lib/cjs/obsidian/markdown.cjs +40 -11
- package/dist/lib/cjs/obsidian/markdown.d.cts +85 -17
- package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/metadata-cache.cjs +88 -32
- package/dist/lib/cjs/obsidian/metadata-cache.d.cts +42 -32
- package/dist/lib/cjs/obsidian/modals/alert.cjs +1 -1
- package/dist/lib/cjs/obsidian/modals/alert.d.cts +2 -0
- package/dist/lib/cjs/obsidian/modals/confirm.cjs +1 -1
- package/dist/lib/cjs/obsidian/modals/confirm.d.cts +2 -0
- package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +234 -0
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +74 -0
- package/dist/lib/cjs/obsidian/modals/modal.d.cts +1 -1
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +1 -1
- package/dist/lib/cjs/obsidian/modals/prompt.d.cts +7 -1
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +1 -1
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +2 -0
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.d.cts +2 -2
- package/dist/lib/cjs/obsidian/obsidian-settings.d.cts +1 -1
- package/dist/lib/cjs/obsidian/path-settings.cjs +5 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +1 -1
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +5 -1
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +5 -1
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +15 -7
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +51 -14
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +22 -16
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +6 -6
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.d.cts +2 -2
- package/dist/lib/cjs/obsidian/queue.cjs +9 -7
- package/dist/lib/cjs/obsidian/queue.d.cts +15 -3
- package/dist/lib/cjs/obsidian/react/app-context.d.cts +1 -1
- package/dist/lib/cjs/obsidian/reference.d.cts +1 -1
- package/dist/lib/cjs/obsidian/resource-url.cjs +7 -2
- package/dist/lib/cjs/obsidian/resource-url.d.cts +20 -5
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.d.cts +1 -1
- package/dist/lib/cjs/obsidian/setting-ex.d.cts +1 -1
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +4 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +6 -2
- package/dist/lib/cjs/obsidian/vault-delete.cjs +19 -15
- package/dist/lib/cjs/obsidian/vault-delete.d.cts +12 -7
- package/dist/lib/cjs/obsidian/vault.cjs +116 -59
- package/dist/lib/cjs/obsidian/vault.d.cts +188 -45
- package/dist/lib/cjs/obsidian/view-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/workspace.d.cts +1 -1
- package/dist/lib/cjs/path.cjs +12 -5
- package/dist/lib/cjs/path.d.cts +15 -3
- package/dist/lib/cjs/reg-exp.cjs +101 -78
- package/dist/lib/cjs/script-utils/build.cjs +9 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +34 -14
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +20 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +24 -6
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +11 -4
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +6 -2
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +31 -12
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +20 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -7
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +12 -3
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/check-project-types.cjs +5 -1
- package/dist/lib/cjs/script-utils/check-project-types.d.cts +10 -2
- package/dist/lib/cjs/script-utils/cli-utils.cjs +6 -2
- package/dist/lib/cjs/script-utils/cli-utils.d.cts +1 -1
- package/dist/lib/cjs/script-utils/commitlint-config.d.cts +1 -1
- package/dist/lib/cjs/script-utils/exec.cjs +47 -12
- package/dist/lib/cjs/script-utils/exec.d.cts +12 -0
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -3
- package/dist/lib/cjs/script-utils/formatters/dprint.d.cts +2 -0
- package/dist/lib/cjs/script-utils/fs.d.cts +1 -1
- package/dist/lib/cjs/script-utils/json.cjs +9 -5
- package/dist/lib/cjs/script-utils/json.d.cts +41 -9
- package/dist/lib/cjs/script-utils/linters/eslint-config.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +8 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +27 -7
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +7 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +8 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint.d.cts +2 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1 -1
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/markdownlint.d.cts +2 -0
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +72 -30
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +9 -1
- package/dist/lib/cjs/script-utils/npm-publish.cjs +2 -2
- package/dist/lib/cjs/script-utils/npm.cjs +18 -9
- package/dist/lib/cjs/script-utils/npm.d.cts +3 -1
- package/dist/lib/cjs/script-utils/root.cjs +20 -5
- package/dist/lib/cjs/script-utils/root.d.cts +45 -9
- package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +1 -1
- package/dist/lib/cjs/script-utils/test-runners/vitest.d.cts +2 -0
- package/dist/lib/cjs/script-utils/validate-declarations.cjs +8 -44
- package/dist/lib/cjs/script-utils/validate-declarations.d.cts +22 -9
- package/dist/lib/cjs/script-utils/version.cjs +36 -19
- package/dist/lib/cjs/script-utils/version.d.cts +20 -7
- package/dist/lib/cjs/strict-proxy.cjs +10 -1
- package/dist/lib/cjs/string.cjs +63 -22
- package/dist/lib/cjs/string.d.cts +194 -40
- package/dist/lib/cjs/value-provider.d.cts +1 -1
- package/dist/lib/esm/abort-controller.d.mts +2 -2
- package/dist/lib/esm/abort-controller.mjs +12 -9
- package/dist/lib/esm/async-events.d.mts +8 -0
- package/dist/lib/esm/async-events.mjs +9 -1
- package/dist/lib/esm/async.d.mts +86 -16
- package/dist/lib/esm/async.mjs +93 -34
- package/dist/lib/esm/css-class.d.mts +20 -0
- package/dist/lib/esm/css-class.mjs +6 -1
- package/dist/lib/esm/debug.d.mts +23 -5
- package/dist/lib/esm/debug.mjs +26 -9
- package/dist/lib/esm/disposable.d.mts +124 -0
- package/dist/lib/esm/disposable.mjs +122 -0
- package/dist/lib/esm/error.d.mts +23 -7
- package/dist/lib/esm/error.mjs +29 -18
- package/dist/lib/esm/html-element.d.mts +4 -2
- package/dist/lib/esm/html-element.mjs +9 -6
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library.mjs +2 -2
- package/dist/lib/esm/object-utils.d.mts +37 -12
- package/dist/lib/esm/object-utils.mjs +233 -128
- package/dist/lib/esm/obsidian/async-with-notice.d.mts +15 -2
- package/dist/lib/esm/obsidian/async-with-notice.mjs +9 -6
- package/dist/lib/esm/obsidian/attachment-path.d.mts +46 -8
- package/dist/lib/esm/obsidian/attachment-path.mjs +45 -13
- package/dist/lib/esm/obsidian/backlink.d.mts +6 -2
- package/dist/lib/esm/obsidian/backlink.mjs +6 -6
- package/dist/lib/esm/obsidian/callout.d.mts +8 -0
- package/dist/lib/esm/obsidian/callout.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +83 -9
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +53 -16
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +37 -1
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +25 -5
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.d.mts +43 -17
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +33 -19
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.d.mts +43 -17
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +33 -19
- package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +48 -8
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +17 -9
- package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +5 -2
- package/dist/lib/esm/obsidian/components/disposable-component.d.mts +0 -7
- package/dist/lib/esm/obsidian/components/disposable-component.mjs +3 -7
- package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -2
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +25 -4
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +24 -8
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -0
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +197 -79
- package/dist/lib/esm/obsidian/dataview-link.d.mts +22 -5
- package/dist/lib/esm/obsidian/dataview-link.mjs +7 -2
- package/dist/lib/esm/obsidian/dataview.d.mts +31 -6
- package/dist/lib/esm/obsidian/dataview.mjs +27 -10
- package/dist/lib/esm/obsidian/editor-lock.d.mts +57 -0
- package/dist/lib/esm/obsidian/editor-lock.mjs +141 -0
- package/dist/lib/esm/obsidian/editor.d.mts +2 -1
- package/dist/lib/esm/obsidian/editor.mjs +7 -1
- package/dist/lib/esm/obsidian/file-change.d.mts +54 -13
- package/dist/lib/esm/obsidian/file-change.mjs +104 -27
- package/dist/lib/esm/obsidian/file-manager.d.mts +63 -13
- package/dist/lib/esm/obsidian/file-manager.mjs +65 -33
- package/dist/lib/esm/obsidian/file-system.d.mts +188 -39
- package/dist/lib/esm/obsidian/file-system.mjs +122 -23
- package/dist/lib/esm/obsidian/frontmatter.mjs +7 -2
- package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.mjs +4 -1
- package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/link.d.mts +131 -34
- package/dist/lib/esm/obsidian/link.mjs +327 -130
- package/dist/lib/esm/obsidian/logger.d.mts +26 -5
- package/dist/lib/esm/obsidian/logger.mjs +48 -22
- package/dist/lib/esm/obsidian/loop.d.mts +26 -7
- package/dist/lib/esm/obsidian/loop.mjs +14 -4
- package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +15 -5
- package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +155 -107
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -1
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/markdown.d.mts +84 -16
- package/dist/lib/esm/obsidian/markdown.mjs +40 -11
- package/dist/lib/esm/obsidian/metadata-cache.d.mts +40 -30
- package/dist/lib/esm/obsidian/metadata-cache.mjs +88 -30
- package/dist/lib/esm/obsidian/modals/alert.d.mts +2 -0
- package/dist/lib/esm/obsidian/modals/alert.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/confirm.d.mts +2 -0
- package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
- package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +74 -0
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +126 -0
- package/dist/lib/esm/obsidian/modals/prompt.d.mts +6 -0
- package/dist/lib/esm/obsidian/modals/prompt.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +2 -0
- package/dist/lib/esm/obsidian/modals/select-item.mjs +1 -1
- package/dist/lib/esm/obsidian/path-settings.mjs +5 -2
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +5 -1
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +48 -11
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +15 -7
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +4 -4
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +24 -21
- package/dist/lib/esm/obsidian/queue.d.mts +14 -2
- package/dist/lib/esm/obsidian/queue.mjs +9 -7
- package/dist/lib/esm/obsidian/resource-url.d.mts +19 -4
- package/dist/lib/esm/obsidian/resource-url.mjs +7 -2
- package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +6 -2
- package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +4 -2
- package/dist/lib/esm/obsidian/vault-delete.d.mts +11 -6
- package/dist/lib/esm/obsidian/vault-delete.mjs +19 -15
- package/dist/lib/esm/obsidian/vault.d.mts +187 -44
- package/dist/lib/esm/obsidian/vault.mjs +116 -59
- package/dist/lib/esm/path.d.mts +15 -3
- package/dist/lib/esm/path.mjs +12 -5
- package/dist/lib/esm/reg-exp.mjs +101 -78
- package/dist/lib/esm/script-utils/build.mjs +9 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +34 -14
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +23 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +20 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +11 -4
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +6 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +19 -4
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +31 -12
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +7 -7
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +12 -3
- package/dist/lib/esm/script-utils/check-project-types.d.mts +9 -1
- package/dist/lib/esm/script-utils/check-project-types.mjs +5 -1
- package/dist/lib/esm/script-utils/cli-utils.mjs +6 -2
- package/dist/lib/esm/script-utils/exec.d.mts +12 -0
- package/dist/lib/esm/script-utils/exec.mjs +47 -12
- package/dist/lib/esm/script-utils/formatters/dprint.d.mts +2 -0
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -3
- package/dist/lib/esm/script-utils/json.d.mts +40 -8
- package/dist/lib/esm/script-utils/json.mjs +9 -5
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +27 -7
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +7 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/eslint.d.mts +2 -0
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1 -1
- package/dist/lib/esm/script-utils/linters/markdownlint.d.mts +2 -0
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +8 -0
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +72 -30
- package/dist/lib/esm/script-utils/npm-publish.mjs +2 -2
- package/dist/lib/esm/script-utils/npm.d.mts +2 -0
- package/dist/lib/esm/script-utils/npm.mjs +18 -9
- package/dist/lib/esm/script-utils/root.d.mts +45 -9
- package/dist/lib/esm/script-utils/root.mjs +20 -5
- package/dist/lib/esm/script-utils/test-runners/vitest.d.mts +2 -0
- package/dist/lib/esm/script-utils/test-runners/vitest.mjs +1 -1
- package/dist/lib/esm/script-utils/validate-declarations.d.mts +22 -9
- package/dist/lib/esm/script-utils/validate-declarations.mjs +8 -51
- package/dist/lib/esm/script-utils/version.d.mts +20 -7
- package/dist/lib/esm/script-utils/version.mjs +36 -19
- package/dist/lib/esm/strict-proxy.mjs +10 -1
- package/dist/lib/esm/string.d.mts +194 -40
- package/dist/lib/esm/string.mjs +63 -22
- package/dist/styles.css +5 -1
- package/obsidian/Modals/minimizable-modal/package.json +6 -0
- package/obsidian/editor-lock/package.json +6 -0
- package/package.json +9 -9
|
@@ -21,15 +21,57 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
25
|
+
var __typeError = (msg) => {
|
|
26
|
+
throw TypeError(msg);
|
|
27
|
+
};
|
|
28
|
+
var __using = (stack, value, async) => {
|
|
29
|
+
if (value != null) {
|
|
30
|
+
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
31
|
+
var dispose, inner;
|
|
32
|
+
if (async) dispose = value[__knownSymbol("asyncDispose")];
|
|
33
|
+
if (dispose === void 0) {
|
|
34
|
+
dispose = value[__knownSymbol("dispose")];
|
|
35
|
+
if (async) inner = dispose;
|
|
36
|
+
}
|
|
37
|
+
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
38
|
+
if (inner) dispose = function() {
|
|
39
|
+
try {
|
|
40
|
+
inner.call(this);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
return Promise.reject(e);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
stack.push([async, dispose, value]);
|
|
46
|
+
} else if (async) {
|
|
47
|
+
stack.push([async]);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
};
|
|
51
|
+
var __callDispose = (stack, error, hasError) => {
|
|
52
|
+
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
53
|
+
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
54
|
+
};
|
|
55
|
+
var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
|
|
56
|
+
var next = (it) => {
|
|
57
|
+
while (it = stack.pop()) {
|
|
58
|
+
try {
|
|
59
|
+
var result = it[1] && it[1].call(it[2]);
|
|
60
|
+
if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
61
|
+
} catch (e) {
|
|
62
|
+
fail(e);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (hasError) throw error;
|
|
66
|
+
};
|
|
67
|
+
return next();
|
|
68
|
+
};
|
|
24
69
|
import {
|
|
25
70
|
getDataAdapterEx,
|
|
26
71
|
InternalPluginName
|
|
27
72
|
} from "@obsidian-typings/obsidian-public-latest/implementations";
|
|
28
73
|
import { t } from "i18next";
|
|
29
|
-
import {
|
|
30
|
-
Notice,
|
|
31
|
-
Vault
|
|
32
|
-
} from "obsidian";
|
|
74
|
+
import { Vault } from "obsidian";
|
|
33
75
|
import { filterInPlace } from "../../array.mjs";
|
|
34
76
|
import { getLibDebugger } from "../../debug.mjs";
|
|
35
77
|
import {
|
|
@@ -70,9 +112,7 @@ import {
|
|
|
70
112
|
getBacklinksForFileOrPath,
|
|
71
113
|
getBacklinksForFileSafe,
|
|
72
114
|
registerFileCacheForNonExistingFile,
|
|
73
|
-
|
|
74
|
-
tempRegisterFilesAndRunAsync,
|
|
75
|
-
unregisterFileCacheForNonExistingFile
|
|
115
|
+
registerFiles
|
|
76
116
|
} from "../metadata-cache.mjs";
|
|
77
117
|
import { addToQueue } from "../queue.mjs";
|
|
78
118
|
import { deleteIfNotUsed } from "../vault-delete.mjs";
|
|
@@ -166,7 +206,7 @@ class DeleteHandler {
|
|
|
166
206
|
if (cache) {
|
|
167
207
|
const links = getAllLinks(cache);
|
|
168
208
|
for (const link of links) {
|
|
169
|
-
const attachmentFile = extractLinkFile(this.app, link, this.file.path);
|
|
209
|
+
const attachmentFile = extractLinkFile({ app: this.app, link, sourcePathOrFile: this.file.path });
|
|
170
210
|
if (!attachmentFile) {
|
|
171
211
|
continue;
|
|
172
212
|
}
|
|
@@ -174,27 +214,49 @@ class DeleteHandler {
|
|
|
174
214
|
continue;
|
|
175
215
|
}
|
|
176
216
|
parentFolderPaths.add(attachmentFile.parent?.path ?? "");
|
|
177
|
-
await deleteIfNotUsed(
|
|
217
|
+
await deleteIfNotUsed({
|
|
218
|
+
app: this.app,
|
|
219
|
+
deletedNotePath: this.file.path,
|
|
220
|
+
pathOrFile: attachmentFile,
|
|
221
|
+
shouldDeleteEmptyFolders: settings.emptyFolderBehavior !== "Keep" /* Keep */
|
|
222
|
+
});
|
|
178
223
|
this.abortSignal.throwIfAborted();
|
|
179
224
|
}
|
|
180
225
|
}
|
|
181
226
|
}
|
|
182
227
|
parentFolderPaths.delete("");
|
|
183
|
-
await cleanupParentFolders(
|
|
228
|
+
await cleanupParentFolders({
|
|
229
|
+
app: this.app,
|
|
230
|
+
parentFolderPaths: Array.from(parentFolderPaths),
|
|
231
|
+
settings: this.settingsManager.getSettings()
|
|
232
|
+
});
|
|
184
233
|
this.abortSignal.throwIfAborted();
|
|
185
234
|
if (!settings.shouldHandleDeletions) {
|
|
186
235
|
return;
|
|
187
236
|
}
|
|
188
|
-
const attachmentFolderPath = await getAttachmentFolderPath(
|
|
189
|
-
|
|
237
|
+
const attachmentFolderPath = await getAttachmentFolderPath({
|
|
238
|
+
app: this.app,
|
|
239
|
+
context: AttachmentPathContext.DeleteNote,
|
|
240
|
+
notePathOrFile: this.file.path
|
|
241
|
+
});
|
|
242
|
+
const attachmentFolder = getFolderOrNull({ app: this.app, pathOrFolder: attachmentFolderPath });
|
|
190
243
|
if (!attachmentFolder) {
|
|
191
244
|
return;
|
|
192
245
|
}
|
|
193
|
-
if (!await hasOwnAttachmentFolder(
|
|
246
|
+
if (!await hasOwnAttachmentFolder({
|
|
247
|
+
app: this.app,
|
|
248
|
+
context: AttachmentPathContext.DeleteNote,
|
|
249
|
+
path: this.file.path
|
|
250
|
+
})) {
|
|
194
251
|
return;
|
|
195
252
|
}
|
|
196
253
|
this.abortSignal.throwIfAborted();
|
|
197
|
-
await deleteIfNotUsed(
|
|
254
|
+
await deleteIfNotUsed({
|
|
255
|
+
app: this.app,
|
|
256
|
+
deletedNotePath: this.file.path,
|
|
257
|
+
pathOrFile: attachmentFolder,
|
|
258
|
+
shouldDeleteEmptyFolders: settings.emptyFolderBehavior !== "Keep" /* Keep */
|
|
259
|
+
});
|
|
198
260
|
this.abortSignal.throwIfAborted();
|
|
199
261
|
}
|
|
200
262
|
}
|
|
@@ -326,19 +388,21 @@ class RenameHandler {
|
|
|
326
388
|
oldPath;
|
|
327
389
|
oldPathBacklinksMap;
|
|
328
390
|
oldPathLinks;
|
|
391
|
+
pluginNoticeComponent;
|
|
329
392
|
settingsManager;
|
|
330
393
|
constructor(params) {
|
|
394
|
+
this.abortSignal = params.abortSignal;
|
|
331
395
|
this.app = params.app;
|
|
332
|
-
this.
|
|
396
|
+
this.handledRenames = params.handledRenames;
|
|
397
|
+
this.interruptedCombinedBacklinksMap = params.interruptedCombinedBacklinksMap ?? /* @__PURE__ */ new Map();
|
|
398
|
+
this.interruptedRenamesMap = params.interruptedRenamesMap;
|
|
333
399
|
this.newPath = params.newPath;
|
|
334
|
-
this.oldPathBacklinksMap = params.oldPathBacklinksMap;
|
|
335
400
|
this.oldCache = params.oldCache;
|
|
336
|
-
this.
|
|
337
|
-
this.
|
|
338
|
-
this.interruptedRenamesMap = params.interruptedRenamesMap;
|
|
401
|
+
this.oldPath = params.oldPath;
|
|
402
|
+
this.oldPathBacklinksMap = params.oldPathBacklinksMap;
|
|
339
403
|
this.oldPathLinks = this.oldCache ? getAllLinks(this.oldCache) : [];
|
|
340
|
-
this.
|
|
341
|
-
this.
|
|
404
|
+
this.pluginNoticeComponent = params.pluginNoticeComponent;
|
|
405
|
+
this.settingsManager = params.settingsManager;
|
|
342
406
|
}
|
|
343
407
|
async handle() {
|
|
344
408
|
if (this.oldPath === this.newPath) {
|
|
@@ -353,6 +417,7 @@ class RenameHandler {
|
|
|
353
417
|
return;
|
|
354
418
|
}
|
|
355
419
|
this.abortSignal.throwIfAborted();
|
|
420
|
+
const pluginNoticeComponent = this.pluginNoticeComponent;
|
|
356
421
|
const renamedFilePaths = getObsidianDevUtilsState("renamedFilePaths", /* @__PURE__ */ new Set()).value;
|
|
357
422
|
const renamedLinks = getObsidianDevUtilsState("renamedLinkPaths", /* @__PURE__ */ new Set()).value;
|
|
358
423
|
try {
|
|
@@ -368,14 +433,22 @@ class RenameHandler {
|
|
|
368
433
|
this.abortSignal.throwIfAborted();
|
|
369
434
|
const combinedBacklinksMap = /* @__PURE__ */ new Map();
|
|
370
435
|
renameMap.initOriginalLinksMap(combinedBacklinksMap);
|
|
371
|
-
renameMap.initBacklinksMap(
|
|
436
|
+
renameMap.initBacklinksMap({
|
|
437
|
+
combinedBacklinksMap,
|
|
438
|
+
path: this.oldPath,
|
|
439
|
+
singleBacklinksMap: this.oldPathBacklinksMap
|
|
440
|
+
});
|
|
372
441
|
for (const attachmentOldPath of renameMap.keys()) {
|
|
373
442
|
if (attachmentOldPath === this.oldPath) {
|
|
374
443
|
continue;
|
|
375
444
|
}
|
|
376
|
-
const attachmentOldPathBacklinksMap = (await getBacklinksForFileSafe(this.app, attachmentOldPath)).data;
|
|
445
|
+
const attachmentOldPathBacklinksMap = (await getBacklinksForFileSafe({ app: this.app, pathOrFile: attachmentOldPath })).data;
|
|
377
446
|
this.abortSignal.throwIfAborted();
|
|
378
|
-
renameMap.initBacklinksMap(
|
|
447
|
+
renameMap.initBacklinksMap({
|
|
448
|
+
combinedBacklinksMap,
|
|
449
|
+
path: attachmentOldPath,
|
|
450
|
+
singleBacklinksMap: attachmentOldPathBacklinksMap
|
|
451
|
+
});
|
|
379
452
|
}
|
|
380
453
|
const parentFolderPaths = /* @__PURE__ */ new Set();
|
|
381
454
|
for (const [oldAttachmentPath, newAttachmentPath] of renameMap.entries()) {
|
|
@@ -388,31 +461,38 @@ class RenameHandler {
|
|
|
388
461
|
parentFolderPaths.add(dirname(oldAttachmentPath));
|
|
389
462
|
}
|
|
390
463
|
}
|
|
391
|
-
await cleanupParentFolders(
|
|
464
|
+
await cleanupParentFolders({
|
|
465
|
+
app: this.app,
|
|
466
|
+
parentFolderPaths: Array.from(parentFolderPaths),
|
|
467
|
+
settings: this.settingsManager.getSettings()
|
|
468
|
+
});
|
|
392
469
|
this.abortSignal.throwIfAborted();
|
|
393
470
|
const settings = this.settingsManager.getSettings();
|
|
394
471
|
for (const [newBacklinkPath, linkJsonToPathMap] of Array.from(combinedBacklinksMap.entries()).concat(
|
|
395
472
|
Array.from(this.interruptedCombinedBacklinksMap.entries())
|
|
396
473
|
)) {
|
|
397
474
|
let linkIndex = 0;
|
|
398
|
-
await editLinks(
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
475
|
+
await editLinks({
|
|
476
|
+
app: this.app,
|
|
477
|
+
linkConverter: (link) => {
|
|
478
|
+
linkIndex++;
|
|
479
|
+
const oldAttachmentPath = linkJsonToPathMap.get(toJson(link));
|
|
480
|
+
if (!oldAttachmentPath) {
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const newAttachmentPath = renameMap.get(oldAttachmentPath) ?? oldAttachmentPath;
|
|
484
|
+
renamedFilePaths.add(newBacklinkPath);
|
|
485
|
+
renamedLinks.add(`${newBacklinkPath}//${String(linkIndex)}`);
|
|
486
|
+
return updateLink(normalizeOptionalProperties({
|
|
487
|
+
app: this.app,
|
|
488
|
+
link,
|
|
489
|
+
newSourcePathOrFile: newBacklinkPath,
|
|
490
|
+
newTargetPathOrFile: newAttachmentPath,
|
|
491
|
+
oldTargetPathOrFile: oldAttachmentPath,
|
|
492
|
+
shouldUpdateFileNameAlias: settings.shouldUpdateFileNameAliases
|
|
493
|
+
}));
|
|
494
|
+
},
|
|
495
|
+
pathOrFile: newBacklinkPath,
|
|
416
496
|
shouldFailOnMissingFile: false
|
|
417
497
|
});
|
|
418
498
|
this.abortSignal.throwIfAborted();
|
|
@@ -427,7 +507,7 @@ class RenameHandler {
|
|
|
427
507
|
}));
|
|
428
508
|
this.abortSignal.throwIfAborted();
|
|
429
509
|
}
|
|
430
|
-
if (!getFileOrNull(this.app, this.newPath)) {
|
|
510
|
+
if (!getFileOrNull({ app: this.app, pathOrFile: this.newPath })) {
|
|
431
511
|
let interruptedRenames = this.interruptedRenamesMap.get(this.newPath);
|
|
432
512
|
if (!interruptedRenames) {
|
|
433
513
|
interruptedRenames = [];
|
|
@@ -449,7 +529,7 @@ class RenameHandler {
|
|
|
449
529
|
if (renamedLinks.size === 0) {
|
|
450
530
|
return;
|
|
451
531
|
}
|
|
452
|
-
|
|
532
|
+
pluginNoticeComponent.showNotice(t(($) => $.obsidianDevUtils.renameDeleteHandler.updatedLinks, { filesCount: renamedFilePaths.size, linksCount: renamedLinks.size }));
|
|
453
533
|
renamedFilePaths.clear();
|
|
454
534
|
renamedLinks.clear();
|
|
455
535
|
},
|
|
@@ -472,6 +552,7 @@ class RenameHandler {
|
|
|
472
552
|
oldCache: this.oldCache,
|
|
473
553
|
oldPath: interruptedRename.oldPath,
|
|
474
554
|
oldPathBacklinksMap: this.oldPathBacklinksMap,
|
|
555
|
+
pluginNoticeComponent: this.pluginNoticeComponent,
|
|
475
556
|
settingsManager: this.settingsManager
|
|
476
557
|
}).handle();
|
|
477
558
|
}
|
|
@@ -492,19 +573,28 @@ class RenameHandler {
|
|
|
492
573
|
oldCache: this.oldCache,
|
|
493
574
|
oldPath: this.oldPath,
|
|
494
575
|
oldPathBacklinksMap: this.oldPathBacklinksMap,
|
|
576
|
+
pluginNoticeComponent: this.pluginNoticeComponent,
|
|
495
577
|
settingsManager: this.settingsManager
|
|
496
578
|
}).handle();
|
|
497
|
-
await this.app.fileManager.renameFile(getFile(this.app, tempPath), this.newPath);
|
|
579
|
+
await this.app.fileManager.renameFile(getFile({ app: this.app, pathOrFile: tempPath }), this.newPath);
|
|
498
580
|
return true;
|
|
499
581
|
}
|
|
500
582
|
async refreshLinks() {
|
|
501
583
|
const cache = this.app.metadataCache.getCache(this.oldPath) ?? this.app.metadataCache.getCache(this.newPath);
|
|
502
584
|
const oldPathLinksRefreshed = cache ? getAllLinks(cache) : [];
|
|
503
|
-
const fakeOldFile = getFile(this.app, this.oldPath, true);
|
|
504
|
-
let oldPathBacklinksMapRefreshed
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
585
|
+
const fakeOldFile = getFile({ app: this.app, pathOrFile: this.oldPath, shouldIncludeNonExisting: true });
|
|
586
|
+
let oldPathBacklinksMapRefreshed;
|
|
587
|
+
{
|
|
588
|
+
var _stack = [];
|
|
589
|
+
try {
|
|
590
|
+
const _registration = __using(_stack, registerFiles(this.app, [fakeOldFile]));
|
|
591
|
+
oldPathBacklinksMapRefreshed = (await getBacklinksForFileSafe({ app: this.app, pathOrFile: fakeOldFile })).data;
|
|
592
|
+
} catch (_) {
|
|
593
|
+
var _error = _, _hasError = true;
|
|
594
|
+
} finally {
|
|
595
|
+
__callDispose(_stack, _error, _hasError);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
508
598
|
for (const link of oldPathLinksRefreshed) {
|
|
509
599
|
if (this.oldPathLinks.includes(link)) {
|
|
510
600
|
continue;
|
|
@@ -526,12 +616,12 @@ class RenameHandler {
|
|
|
526
616
|
}
|
|
527
617
|
}
|
|
528
618
|
async renameHandled(oldPath, newPath) {
|
|
529
|
-
newPath = getSafeRenamePath(this.app,
|
|
619
|
+
newPath = getSafeRenamePath({ app: this.app, newPath, oldPathOrAbstractFile: oldPath });
|
|
530
620
|
if (oldPath === newPath) {
|
|
531
621
|
return newPath;
|
|
532
622
|
}
|
|
533
623
|
this.handledRenames.add(oldPath, newPath);
|
|
534
|
-
newPath = await renameSafe(this.app,
|
|
624
|
+
newPath = await renameSafe({ app: this.app, newPath, oldPathOrAbstractFile: oldPath });
|
|
535
625
|
return newPath;
|
|
536
626
|
}
|
|
537
627
|
}
|
|
@@ -563,24 +653,15 @@ class RenameMap {
|
|
|
563
653
|
return;
|
|
564
654
|
}
|
|
565
655
|
const settings = this.settingsManager.getSettings();
|
|
566
|
-
const oldFile = getFile(this.app, this.oldPath, true);
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
try {
|
|
574
|
-
oldAttachmentFolderPath = await getAttachmentFolderPath(this.app, this.oldPath, AttachmentPathContext.RenameNote);
|
|
575
|
-
} finally {
|
|
576
|
-
if (shouldFakeOldPathCache) {
|
|
577
|
-
unregisterFileCacheForNonExistingFile(this.app, oldFile);
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
});
|
|
581
|
-
const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await getAttachmentFolderPath(this.app, this.newPath, AttachmentPathContext.RenameNote) : oldAttachmentFolderPath;
|
|
656
|
+
const oldFile = getFile({ app: this.app, pathOrFile: this.oldPath, shouldIncludeNonExisting: true });
|
|
657
|
+
const oldAttachmentFolderPath = await this.getOldAttachmentFolderPath(oldFile);
|
|
658
|
+
const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await getAttachmentFolderPath({
|
|
659
|
+
app: this.app,
|
|
660
|
+
context: AttachmentPathContext.RenameNote,
|
|
661
|
+
notePathOrFile: this.newPath
|
|
662
|
+
}) : oldAttachmentFolderPath;
|
|
582
663
|
const isOldAttachmentFolderAtRoot = oldAttachmentFolderPath === "/";
|
|
583
|
-
const oldAttachmentFolder = getFolderOrNull(this.app, oldAttachmentFolderPath);
|
|
664
|
+
const oldAttachmentFolder = getFolderOrNull({ app: this.app, pathOrFolder: oldAttachmentFolderPath });
|
|
584
665
|
if (!oldAttachmentFolder) {
|
|
585
666
|
return;
|
|
586
667
|
}
|
|
@@ -588,7 +669,11 @@ class RenameMap {
|
|
|
588
669
|
return;
|
|
589
670
|
}
|
|
590
671
|
const oldAttachmentFiles = [];
|
|
591
|
-
if (await hasOwnAttachmentFolder(
|
|
672
|
+
if (await hasOwnAttachmentFolder({
|
|
673
|
+
app: this.app,
|
|
674
|
+
context: AttachmentPathContext.RenameNote,
|
|
675
|
+
path: this.oldPath
|
|
676
|
+
})) {
|
|
592
677
|
Vault.recurseChildren(oldAttachmentFolder, (oldAttachmentFile) => {
|
|
593
678
|
this.abortSignal.throwIfAborted();
|
|
594
679
|
if (isFile(oldAttachmentFile)) {
|
|
@@ -598,12 +683,12 @@ class RenameMap {
|
|
|
598
683
|
} else {
|
|
599
684
|
for (const oldPathLink of this.oldPathLinks) {
|
|
600
685
|
this.abortSignal.throwIfAborted();
|
|
601
|
-
const oldAttachmentFile = extractLinkFile(this.app, oldPathLink, this.oldPath);
|
|
686
|
+
const oldAttachmentFile = extractLinkFile({ app: this.app, link: oldPathLink, sourcePathOrFile: this.oldPath });
|
|
602
687
|
if (!oldAttachmentFile) {
|
|
603
688
|
continue;
|
|
604
689
|
}
|
|
605
690
|
if (isOldAttachmentFolderAtRoot || oldAttachmentFile.path.startsWith(oldAttachmentFolderPath)) {
|
|
606
|
-
const oldAttachmentBacklinks = await getBacklinksForFileSafe(this.app, oldAttachmentFile);
|
|
691
|
+
const oldAttachmentBacklinks = await getBacklinksForFileSafe({ app: this.app, pathOrFile: oldAttachmentFile });
|
|
607
692
|
this.abortSignal.throwIfAborted();
|
|
608
693
|
const keys = new Set(oldAttachmentBacklinks.keys());
|
|
609
694
|
keys.delete(this.oldPath);
|
|
@@ -639,7 +724,7 @@ class RenameMap {
|
|
|
639
724
|
continue;
|
|
640
725
|
}
|
|
641
726
|
if (settings.shouldDeleteConflictingAttachments) {
|
|
642
|
-
const newAttachmentFile = getFileOrNull(this.app, newAttachmentFilePath);
|
|
727
|
+
const newAttachmentFile = getFileOrNull({ app: this.app, pathOrFile: newAttachmentFilePath });
|
|
643
728
|
if (newAttachmentFile) {
|
|
644
729
|
getLibDebugger("RenameDeleteHandler:fillRenameMap")(`Removing conflicting attachment ${newAttachmentFile.path}.`);
|
|
645
730
|
await trashSafe(this.app, newAttachmentFile);
|
|
@@ -657,7 +742,12 @@ class RenameMap {
|
|
|
657
742
|
get(oldPath) {
|
|
658
743
|
return this.map.get(oldPath);
|
|
659
744
|
}
|
|
660
|
-
initBacklinksMap(
|
|
745
|
+
initBacklinksMap(params) {
|
|
746
|
+
const {
|
|
747
|
+
combinedBacklinksMap,
|
|
748
|
+
path,
|
|
749
|
+
singleBacklinksMap
|
|
750
|
+
} = params;
|
|
661
751
|
for (const [backlinkPath, links] of singleBacklinksMap.entries()) {
|
|
662
752
|
const newBacklinkPath = this.map.get(backlinkPath) ?? backlinkPath;
|
|
663
753
|
const linkJsonToPathMap = combinedBacklinksMap.get(newBacklinkPath) ?? /* @__PURE__ */ new Map();
|
|
@@ -669,13 +759,17 @@ class RenameMap {
|
|
|
669
759
|
}
|
|
670
760
|
initOriginalLinksMap(combinedBacklinksMap) {
|
|
671
761
|
for (const oldPathLink of this.oldPathLinks) {
|
|
672
|
-
const oldAttachmentFile = extractLinkFile(this.app, oldPathLink, this.oldPath);
|
|
762
|
+
const oldAttachmentFile = extractLinkFile({ app: this.app, link: oldPathLink, sourcePathOrFile: this.oldPath });
|
|
673
763
|
if (!oldAttachmentFile) {
|
|
674
764
|
continue;
|
|
675
765
|
}
|
|
676
766
|
const backlinksMap = /* @__PURE__ */ new Map();
|
|
677
767
|
backlinksMap.set(this.newPath, [oldPathLink]);
|
|
678
|
-
this.initBacklinksMap(
|
|
768
|
+
this.initBacklinksMap({
|
|
769
|
+
combinedBacklinksMap,
|
|
770
|
+
path: oldAttachmentFile.path,
|
|
771
|
+
singleBacklinksMap: backlinksMap
|
|
772
|
+
});
|
|
679
773
|
}
|
|
680
774
|
}
|
|
681
775
|
keys() {
|
|
@@ -684,6 +778,22 @@ class RenameMap {
|
|
|
684
778
|
set(oldPath, newPath) {
|
|
685
779
|
this.map.set(oldPath, newPath);
|
|
686
780
|
}
|
|
781
|
+
async getOldAttachmentFolderPath(oldFile) {
|
|
782
|
+
var _stack = [];
|
|
783
|
+
try {
|
|
784
|
+
const _registration = __using(_stack, registerFiles(this.app, [oldFile]));
|
|
785
|
+
const _cacheRegistration = __using(_stack, this.oldCache && oldFile.deleted ? registerFileCacheForNonExistingFile({ app: this.app, cache: this.oldCache, pathOrFile: oldFile }) : void 0);
|
|
786
|
+
return await getAttachmentFolderPath({
|
|
787
|
+
app: this.app,
|
|
788
|
+
context: AttachmentPathContext.RenameNote,
|
|
789
|
+
notePathOrFile: this.oldPath
|
|
790
|
+
});
|
|
791
|
+
} catch (_) {
|
|
792
|
+
var _error = _, _hasError = true;
|
|
793
|
+
} finally {
|
|
794
|
+
__callDispose(_stack, _error, _hasError);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
687
797
|
}
|
|
688
798
|
class RenameDeleteHandlerComponent extends ComponentEx {
|
|
689
799
|
abortSignalComponent;
|
|
@@ -692,6 +802,7 @@ class RenameDeleteHandlerComponent extends ComponentEx {
|
|
|
692
802
|
handledRenames = new HandledRenames();
|
|
693
803
|
interruptedRenamesMap = /* @__PURE__ */ new Map();
|
|
694
804
|
pluginId;
|
|
805
|
+
pluginNoticeComponent;
|
|
695
806
|
settingsBuilder;
|
|
696
807
|
settingsManager;
|
|
697
808
|
/**
|
|
@@ -704,6 +815,7 @@ class RenameDeleteHandlerComponent extends ComponentEx {
|
|
|
704
815
|
this.abortSignalComponent = params.abortSignalComponent;
|
|
705
816
|
this.app = params.app;
|
|
706
817
|
this.pluginId = params.pluginId;
|
|
818
|
+
this.pluginNoticeComponent = params.pluginNoticeComponent;
|
|
707
819
|
this.settingsBuilder = params.settingsBuilder;
|
|
708
820
|
this.settingsManager = new SettingsManager();
|
|
709
821
|
}
|
|
@@ -793,6 +905,7 @@ class RenameDeleteHandlerComponent extends ComponentEx {
|
|
|
793
905
|
oldCache,
|
|
794
906
|
oldPath,
|
|
795
907
|
oldPathBacklinksMap,
|
|
908
|
+
pluginNoticeComponent: this.pluginNoticeComponent,
|
|
796
909
|
settingsManager: this.settingsManager
|
|
797
910
|
}).handle(),
|
|
798
911
|
operationName: t(($) => $.obsidianDevUtils.renameDeleteHandler.handleRename, { newPath, oldPath })
|
|
@@ -810,7 +923,12 @@ class RenameDeleteHandlerComponent extends ComponentEx {
|
|
|
810
923
|
return mainPluginId === this.pluginId;
|
|
811
924
|
}
|
|
812
925
|
}
|
|
813
|
-
async function cleanupParentFolders(
|
|
926
|
+
async function cleanupParentFolders(params) {
|
|
927
|
+
const {
|
|
928
|
+
app,
|
|
929
|
+
parentFolderPaths,
|
|
930
|
+
settings
|
|
931
|
+
} = params;
|
|
814
932
|
if (settings.emptyFolderBehavior === "Keep" /* Keep */) {
|
|
815
933
|
return;
|
|
816
934
|
}
|
|
@@ -831,4 +949,4 @@ export {
|
|
|
831
949
|
EmptyFolderBehavior,
|
|
832
950
|
RenameDeleteHandlerComponent
|
|
833
951
|
};
|
|
834
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBOb3RpY2UsXG4gIFZhdWx0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVMaW5rUGFyYW1zLFxuICBVcGRhdGVMaW5rc0luRmlsZVBhcmFtc1xufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB0eXBlIHsgQWJvcnRTaWduYWxDb21wb25lbnQgfSBmcm9tICcuL2Fib3J0LXNpZ25hbC1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vLi4vYXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi8uLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHtcbiAgQ0FOVkFTX0ZJTEVfRVhURU5TSU9OLFxuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXJPck51bGwsXG4gIGlzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIGlzTm90ZVxufSBmcm9tICcuLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBlZGl0TGlua3MsXG4gIGV4dHJhY3RMaW5rRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlTGlua3NJbkZpbGVcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bixcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5Bc3luYyxcbiAgdW5yZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVxufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgZGVsZXRlSWZOb3RVc2VkIH0gZnJvbSAnLi4vdmF1bHQtZGVsZXRlLnRzJztcbmltcG9ydCB7XG4gIGRlbGV0ZUVtcHR5Rm9sZGVyLFxuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUZvbGRlckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBLZWVwID0gJ0tlZXAnXG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5jb25zdCBQQVRDSF9UT0tFTiA9IFN5bWJvbC5mb3IoJ3JlbmFtZURlbGV0ZUhhbmRsZXInKTtcblxuaW50ZXJmYWNlIERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICBzZXR0aW5nc0J1aWxkZXIodGhpczogdm9pZCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcbn1cblxuY2xhc3MgU2V0dGluZ3NNYW5hZ2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwOiBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20odGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzTm90ZShwYXRoKTtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNldHRpbmdzQnVpbGRlciBvZiBzZXR0aW5nc0J1aWxkZXJzKSB7XG4gICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3I7XG4gICAgICB9XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgRGVsZXRlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldEFsbExpbmtzKGNhY2hlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh0aGlzLmFwcCwgbGluaywgdGhpcy5maWxlLnBhdGgpO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChhdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGF0dGFjaG1lbnRGaWxlLnBhcmVudD8ucGF0aCA/PyAnJyk7XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHRoaXMuYXBwLCBhdHRhY2htZW50RmlsZSwgdGhpcy5maWxlLnBhdGgsIGZhbHNlLCBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnModGhpcy5hcHAsIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCksIEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgodGhpcy5hcHAsIHRoaXMuZmlsZS5wYXRoLCBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSk7XG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh0aGlzLmFwcCwgYXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gICAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHRoaXMuYXBwLCB0aGlzLmZpbGUucGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHRoaXMuYXBwLCBhdHRhY2htZW50Rm9sZGVyLCB0aGlzLmZpbGUucGF0aCwgZmFsc2UsIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG59XG5cbmNsYXNzIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgb2JqOiB0aGlzLmZpbGVNYW5hZ2VyLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmdzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZEJvdW5kKG5ld0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbiBgcmVuYW1lYCBldmVudCBoYW5kbGVyLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgaWYgKCFpc1JlbmFtZUNhbGxlZCB8fCAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbHRlckluUGxhY2UoXG4gICAgICBsaW5rVXBkYXRlcyxcbiAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2Ygc291cmNlIGZpbGUgJHtsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiByZXNvbHZlZCBmaWxlICR7bGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKCdiYWNrbGluay1jYWNoZScpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBIYW5kbGVkUmVuYW1lcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZWRSZW5hbWVLZXk+KCk7XG5cbiAgcHVibGljIGFkZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldCh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpLCB7IG5ld1BhdGgsIG9sZFBhdGggfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXModGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEhhbmRsZWRSZW5hbWVLZXk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvU3RyaW5nKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG4gIH1cbn1cblxuY2xhc3MgTWV0YWRhdGFEZWxldGVkSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5wcmV2Q2FjaGUgPSBwYXJhbXMucHJldkNhY2hlO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlTWV0YWRhdGFEZWxldGVkJykoYFNraXBwaW5nIG1ldGFkYXRhIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTWFya2Rvd25GaWxlKHRoaXMuZmlsZSkgJiYgdGhpcy5wcmV2Q2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZDYWNoZSk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJlbmFtZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldEFsbExpbmtzKHRoaXMub2xkQ2FjaGUpIDogW107XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2xkUGF0aCA9PT0gdGhpcy5uZXdQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaExpbmtzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUNhc2VDb2xsaXNpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAodGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgdGhpcy5vbGRQYXRoKTtcblxuICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSAoYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUodGhpcy5hcHAsIGF0dGFjaG1lbnRPbGRQYXRoKSkuZGF0YTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgY29tYmluZWRCYWNrbGlua3NNYXAsIGF0dGFjaG1lbnRPbGRQYXRoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cFBhcmVudEZvbGRlcnModGhpcy5hcHAsIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCksIEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgZm9yIChcbiAgICAgICAgY29uc3QgW25ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXBdIG9mIEFycmF5LmZyb20oY29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKS5jb25jYXQoXG4gICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgIGF3YWl0IGVkaXRMaW5rcyh0aGlzLmFwcCwgbmV3QmFja2xpbmtQYXRoLCAobGluaykgPT4ge1xuICAgICAgICAgIGxpbmtJbmRleCsrO1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZVBhcmFtcz4oe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldEZpbGVPck51bGwodGhpcy5hcHAsIHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldCh0aGlzLm5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IEFycmF5LmZyb20odGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCkpO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBvcGVyYXRpb25GbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDYXNlQ29sbGlzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZ2V0RGF0YUFkYXB0ZXJFeCh0aGlzLmFwcCkuaW5zZW5zaXRpdmUgfHwgdGhpcy5vbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIG5ld1BhdGg6IHRlbXBQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUodGhpcy5hcHAsIHRlbXBQYXRoKSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLm9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUodGhpcy5uZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoTGlua3NSZWZyZXNoZWQgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh0aGlzLmFwcCwgdGhpcy5vbGRQYXRoLCB0cnVlKTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgICBhd2FpdCB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1bih0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSwgYXN5bmMgKCkgPT4ge1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh0aGlzLmFwcCwgZmFrZU9sZEZpbGUpKS5kYXRhO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIG9sZFBhdGhMaW5rc1JlZnJlc2hlZCkge1xuICAgICAgaWYgKHRoaXMub2xkUGF0aExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkLmVudHJpZXMoKSkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh0aGlzLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldEFsbExpbmtzKHRoaXMub2xkQ2FjaGUpIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUodGhpcy5hcHAsIHRoaXMub2xkUGF0aCwgdHJ1ZSk7XG4gICAgbGV0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gJyc7XG4gICAgYXdhaXQgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5Bc3luYyh0aGlzLmFwcCwgW29sZEZpbGVdLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRGYWtlT2xkUGF0aENhY2hlID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWQ7XG4gICAgICBpZiAoc2hvdWxkRmFrZU9sZFBhdGhDYWNoZSkge1xuICAgICAgICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSh0aGlzLmFwcCwgb2xkRmlsZSwgdGhpcy5vbGRDYWNoZSk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgodGhpcy5hcHAsIHRoaXMub2xkUGF0aCwgQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHNob3VsZEZha2VPbGRQYXRoQ2FjaGUpIHtcbiAgICAgICAgICB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHRoaXMuYXBwLCBvbGRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgsIEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlKVxuICAgICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICAgIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHRoaXMuYXBwLCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICAgIGlmIChhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHRoaXMuYXBwLCB0aGlzLm9sZFBhdGgsIEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlKSkge1xuICAgICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHRoaXMuYXBwLCBvbGRQYXRoTGluaywgdGhpcy5vbGRQYXRoKTtcbiAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHRoaXMuYXBwLCBvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4ob2xkQXR0YWNobWVudEJhY2tsaW5rcy5rZXlzKCkpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgICBpZiAoa2V5cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0F0dGFjaG1lbnRGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgb2xkTm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld0ZvbGRlciA9IGpvaW4obmV3QXR0YWNobWVudEZvbGRlclBhdGgsIGRpcm5hbWUocmVsYXRpdmVQYXRoKSk7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGpvaW4obmV3Rm9sZGVyLCBvbGRBdHRhY2htZW50RmlsZS5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggPT09IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG5ld0F0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dCk7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXIsIGJhc2VOYW1lKSwgZXh0LnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAoXG4gICAgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gICAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+LFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChuZXdCYWNrbGlua1BhdGgpID8/IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQobmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcCk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgICAgbGlua0pzb25Ub1BhdGhNYXAuc2V0KHRvSnNvbihsaW5rKSwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHRoaXMuYXBwLCBvbGRQYXRoTGluaywgdGhpcy5vbGRQYXRoKTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KCk7XG4gICAgICBiYWNrbGlua3NNYXAuc2V0KHRoaXMubmV3UGF0aCwgW29sZFBhdGhMaW5rXSk7XG4gICAgICB0aGlzLmluaXRCYWNrbGlua3NNYXAoYmFja2xpbmtzTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAua2V5cygpO1xuICB9XG5cbiAgcHVibGljIHNldChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IGhhbmRsZXMgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICogSXQgbGlzdGVucyB0byByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgYW5kIHVwZGF0ZXMgbGlua3MgYWNjb3JkaW5nbHkuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGNhc2Utb25seSByZW5hbWVzIGFuZCBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnNldHRpbmdzQnVpbGRlciA9IHBhcmFtcy5zZXR0aW5nc0J1aWxkZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBuZXcgU2V0dGluZ3NNYW5hZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwO1xuXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHRoaXMucGx1Z2luSWQsIHRoaXMuc2V0dGluZ3NCdWlsZGVyKTtcbiAgICB0aGlzLmxvZ1JlZ2lzdGVyZWRIYW5kbGVycygpO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUodGhpcy5wbHVnaW5JZCk7XG4gICAgICB0aGlzLmxvZ1JlZ2lzdGVyZWRIYW5kbGVycygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCB0aGlzLmhhbmRsZURlbGV0ZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCB0aGlzLmhhbmRsZVJlbmFtZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCB0aGlzLmhhbmRsZU1ldGFkYXRhRGVsZXRlZC5iaW5kKHRoaXMpKSk7XG5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBmaWxlTWFuYWdlcjogdGhpcy5hcHAuZmlsZU1hbmFnZXIsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFkZFRvUXVldWUoe1xuICAgICAgb3BlcmF0aW9uRm46IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IERlbGV0ZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlRGVsZXRlLCB7IGZpbGVQYXRoOiBmaWxlLnBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXcgTWV0YWRhdGFEZWxldGVkSGFuZGxlcih7XG4gICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgIGZpbGUsXG4gICAgICBwcmV2Q2FjaGUsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpsb2dSZWdpc3RlcmVkSGFuZGxlcnMnKShcbiAgICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEludm9rZUhhbmRsZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSlbMF07XG4gICAgcmV0dXJuIG1haW5QbHVnaW5JZCA9PT0gdGhpcy5wbHVnaW5JZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwUGFyZW50Rm9sZGVycyhhcHA6IEFwcCwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgcGFyZW50Rm9sZGVyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID09PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBwYXJlbnRGb2xkZXJQYXRoIG9mIHBhcmVudEZvbGRlclBhdGhzKSB7XG4gICAgc3dpdGNoIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuRGVsZXRlOlxuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRW1wdHlGb2xkZXJCZWhhdmlvci5EZWxldGVXaXRoRW1wdHlQYXJlbnRzOlxuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHAsIHBhcmVudEZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFNBQVM7QUFDbEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFRUCxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsdUJB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
|
|
952
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgeyBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVMaW5rUGFyYW1zLFxuICBVcGRhdGVMaW5rc0luRmlsZVBhcmFtc1xufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB0eXBlIHsgQWJvcnRTaWduYWxDb21wb25lbnQgfSBmcm9tICcuL2Fib3J0LXNpZ25hbC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZmlsdGVySW5QbGFjZSB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vLi4vcGF0aC50cyc7XG5pbXBvcnQge1xuICBBdHRhY2htZW50UGF0aENvbnRleHQsXG4gIGdldEF0dGFjaG1lbnRGaWxlUGF0aCxcbiAgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgsXG4gIGhhc093bkF0dGFjaG1lbnRGb2xkZXJcbn0gZnJvbSAnLi4vYXR0YWNobWVudC1wYXRoLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgZGVsZXRlSWZOb3RVc2VkIH0gZnJvbSAnLi4vdmF1bHQtZGVsZXRlLnRzJztcbmltcG9ydCB7XG4gIGRlbGV0ZUVtcHR5Rm9sZGVyLFxuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUZvbGRlckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBLZWVwID0gJ0tlZXAnXG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbWJpbmVkIGJhY2tsaW5rcyBtYXAsIGtleWVkIGJ5IG5ldyBiYWNrbGluayBwYXRoLCBhY2N1bXVsYXRpbmcgbGluay1KU09OIHRvIHNvdXJjZS1wYXRoIG1hcHBpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aG9zZSBiYWNrbGlua3MgYXJlIGJlaW5nIHJlY29yZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFja2xpbmtzIG1hcCBmb3IgYSBzaW5nbGUgZmlsZSwga2V5ZWQgYnkgYmFja2xpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHNpbmdsZUJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xufVxuXG5jb25zdCBQQVRDSF9UT0tFTiA9IFN5bWJvbC5mb3IoJ3JlbmFtZURlbGV0ZUhhbmRsZXInKTtcblxuaW50ZXJmYWNlIENsZWFudXBQYXJlbnRGb2xkZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBwYXJlbnQgZm9sZGVycyB0byBjbGVhbiB1cC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudEZvbGRlclBhdGhzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyB0aGF0IGRldGVybWluZSB0aGUgZW1wdHktZm9sZGVyIGJlaGF2aW9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcbn1cblxuaW50ZXJmYWNlIERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgc2V0dGluZ3NCdWlsZGVyKHRoaXM6IHZvaWQpOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIFNldHRpbmdzTWFuYWdlciB7XG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVEZWxldGVIYW5kbGVyc01hcDogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXR0aW5ncygpOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4ge1xuICAgIGNvbnN0IHNldHRpbmdzQnVpbGRlcnMgPSBBcnJheS5mcm9tKHRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCkpLnJldmVyc2UoKTtcblxuICAgIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc05vdGUocGF0aCk7XG4gICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9ICgpOiBib29sZWFuID0+IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSBzZXR0aW5nc0J1aWxkZXIoKTtcbiAgICAgIHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgPz8gZmFsc2U7XG4gICAgICBpZiAobmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgICBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/PSBuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yO1xuICAgICAgfVxuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgPz8gZmFsc2U7XG4gICAgICBjb25zdCBpc1BhdGhJZ25vcmVkID0gc2V0dGluZ3MuaXNQYXRoSWdub3JlZDtcbiAgICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc1BhdGhJZ25vcmVkKHBhdGgpIHx8IChuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2UpO1xuICAgICAgY29uc3QgY3VycmVudElzTm90ZSA9IHNldHRpbmdzLmlzTm90ZTtcbiAgICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1cnJlbnRJc05vdGUocGF0aCkgJiYgKG5ld1NldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IHRydWUpO1xuICAgIH1cblxuICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgaXNOb3RlRXgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIHNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGZhbHNlO1xuICB9XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShcbiAgICAgICAgYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBmaWxlIHN0aWxsIGV4aXN0cyBvbiBkaXNrIChpbmRleC1vbmx5IHJlbW92YWwsIG5vdCBhIHJlYWwgZGVsZXRpb24pLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtkaXJuYW1lKHRoaXMuZmlsZS5wYXRoKV0pO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldCh0aGlzLmZpbGUucGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZSh0aGlzLmZpbGUucGF0aCk7XG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY29uc3QgbGlua3MgPSBnZXRBbGxMaW5rcyhjYWNoZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJlbnRGb2xkZXJQYXRocy5kZWxldGUoJycpO1xuICAgIGF3YWl0IGNsZWFudXBQYXJlbnRGb2xkZXJzKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwYXJlbnRGb2xkZXJQYXRoczogQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocyksXG4gICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG5jbGFzcyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlTWFuYWdlciA9IHBhcmFtcy5maWxlTWFuYWdlcjtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICBtZXRob2ROYW1lOiAncnVuQXN5bmNMaW5rVXBkYXRlJyxcbiAgICAgIG9iajogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJnczogW2xpbmtVcGRhdGVzSGFuZGxlcl0sXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZEJvdW5kXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmIChoYXNQYXRjaFRva2VuKG9yaWdpbmFsTWV0aG9kLCBQQVRDSF9UT0tFTikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlciA9IChsaW5rVXBkYXRlcykgPT4gdGhpcy53cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzLCBsaW5rVXBkYXRlc0hhbmRsZXIpO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2RCb3VuZChuZXdIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsICgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKFxuICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAobGlua1VwZGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFwcC5wbHVnaW5zLmdldFBsdWdpbignYmFja2xpbmstY2FjaGUnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMucHJldkNhY2hlID0gcGFyYW1zLnByZXZDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZU1ldGFkYXRhRGVsZXRlZCcpKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc01hcmtkb3duRmlsZSh0aGlzLmZpbGUpICYmIHRoaXMucHJldkNhY2hlKSB7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLnNldCh0aGlzLmZpbGUucGF0aCwgdGhpcy5wcmV2Q2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMgPSBwYXJhbXMuaGFuZGxlZFJlbmFtZXM7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID0gcGFyYW1zLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwID0gcGFyYW1zLm9sZFBhdGhCYWNrbGlua3NNYXA7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0QWxsTGlua3ModGhpcy5vbGRDYWNoZSkgOiBbXTtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vbGRQYXRoID09PSB0aGlzLm5ld1BhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ2FzZUNvbGxpc2lvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZExpbmtQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgUmVuYW1lTWFwKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZW5hbWVNYXAuZmlsbCgpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgICAgcmVuYW1lTWFwLmluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRPbGRQYXRoIH0pKS5kYXRhO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwUGFyZW50Rm9sZGVycyh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBhcmVudEZvbGRlclBhdGhzOiBBcnJheS5mcm9tKHBhcmVudEZvbGRlclBhdGhzKSxcbiAgICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKClcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBsZXQgbGlua0luZGV4ID0gMDtcbiAgICAgICAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICAgICAgICBsaW5rSW5kZXgrKztcbiAgICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5hZGQobmV3QmFja2xpbmtQYXRoKTtcbiAgICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbSh0aGlzLmhhbmRsZWRSZW5hbWVzLmtleXMoKSk7XG4gICAgICBhZGRUb1F1ZXVlKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIG9wZXJhdGlvbkZuOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBvcnBoYW5LZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob3JwaGFuS2V5Lm9sZFBhdGgsIG9ycGhhbktleS5uZXdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuYW1lZExpbmtzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wUGF0aCA9IGpvaW4oZGlybmFtZSh0aGlzLm5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKHRoaXMubmV3UGF0aCl9YCk7XG4gICAgYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKHRoaXMubmV3UGF0aCwgdGVtcFBhdGgpO1xuXG4gICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgbmV3UGF0aDogdGVtcFBhdGgsXG4gICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wUGF0aCB9KSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLm9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUodGhpcy5uZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoTGlua3NSZWZyZXNoZWQgPSBjYWNoZSA/IGdldEFsbExpbmtzKGNhY2hlKSA6IFtdO1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gICAge1xuICAgICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtmYWtlT2xkRmlsZV0pO1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGZha2VPbGRGaWxlIH0pKS5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluayBvZiBvbGRQYXRoTGlua3NSZWZyZXNoZWQpIHtcbiAgICAgIGlmICh0aGlzLm9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0QWxsTGlua3ModGhpcy5vbGRDYWNoZSkgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5lbnRyaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmlsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMub2xkUGF0aCwgdGhpcy5uZXdQYXRoKTtcblxuICAgIGlmICghaXNOb3RlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgdGhpcy5nZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlKTtcblxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoXG4gICAgICB9KVxuICAgICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICAgIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290IHx8IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihvbGRBdHRhY2htZW50QmFja2xpbmtzLmtleXMoKSk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm5ld1BhdGgpO1xuICAgICAgICAgIGlmIChrZXlzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlIG9mIG9sZEF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3QXR0YWNobWVudEZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGaWxlUGF0aCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSxcbiAgICAgICAgICBvbGROb3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID8gb2xkQXR0YWNobWVudEZpbGUucGF0aCA6IHJlbGF0aXZlKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoLCBvbGRBdHRhY2htZW50RmlsZS5wYXRoKTtcbiAgICAgICAgY29uc3QgbmV3Rm9sZGVyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gam9pbihuZXdGb2xkZXIsIG9sZEF0dGFjaG1lbnRGaWxlLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkQXR0YWNobWVudEZpbGUucGF0aCA9PT0gbmV3QXR0YWNobWVudEZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudEZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogbmV3QXR0YWNobWVudEZpbGVQYXRoIH0pO1xuICAgICAgICBpZiAobmV3QXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpmaWxsUmVuYW1lTWFwJykoYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgICBhd2FpdCB0cmFzaFNhZmUodGhpcy5hcHAsIG5ld0F0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gZXh0bmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCwgZXh0KTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gdGhpcy5hcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpciwgYmFzZU5hbWUpLCBleHQuc2xpY2UoMSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChvbGRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQob2xkUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEJhY2tsaW5rc01hcChwYXJhbXM6IFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgIHBhdGgsXG4gICAgICBzaW5nbGVCYWNrbGlua3NNYXBcbiAgICB9ID0gcGFyYW1zO1xuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgbGlua3NdIG9mIHNpbmdsZUJhY2tsaW5rc01hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHRoaXMubWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICAgIGNvbnN0IGxpbmtKc29uVG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oKTtcbiAgICAgIGJhY2tsaW5rc01hcC5zZXQodGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdKTtcbiAgICAgIHRoaXMuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBwYXRoOiBvbGRBdHRhY2htZW50RmlsZS5wYXRoLFxuICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGJhY2tsaW5rc01hcFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAua2V5cygpO1xuICB9XG5cbiAgcHVibGljIHNldChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZTogVEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKHRoaXMuYXBwLCBbb2xkRmlsZV0pO1xuICAgIHVzaW5nIF9jYWNoZVJlZ2lzdHJhdGlvbiA9IHRoaXMub2xkQ2FjaGUgJiYgb2xkRmlsZS5kZWxldGVkXG4gICAgICA/IHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHsgYXBwOiB0aGlzLmFwcCwgY2FjaGU6IHRoaXMub2xkQ2FjaGUsIHBhdGhPckZpbGU6IG9sZEZpbGUgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXMgPSBuZXcgSGFuZGxlZFJlbmFtZXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQgPSBwYXJhbXMuYWJvcnRTaWduYWxDb21wb25lbnQ7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gcGFyYW1zLnNldHRpbmdzQnVpbGRlcjtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IG5ldyBTZXR0aW5nc01hbmFnZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG5cbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5zZXQodGhpcy5wbHVnaW5JZCwgdGhpcy5zZXR0aW5nc0J1aWxkZXIpO1xuICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZSh0aGlzLnBsdWdpbklkKTtcbiAgICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVEZWxldGUsIHsgZmlsZVBhdGg6IGZpbGUucGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHtcbiAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgZmlsZSxcbiAgICAgIHByZXZDYWNoZSxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzRmlsZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBpZiAodGhpcy5oYW5kbGVkUmVuYW1lcy5oYXMob2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBuZXcgcGF0aCAke25ld1BhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gICAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgodGhpcy5hcHAsIG9sZFBhdGgpLmRhdGE7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudC5hYm9ydFNpZ25hbCxcbiAgICAgIG9wZXJhdGlvbkZuOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRJbnZva2VIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgY29uc3QgbWFpblBsdWdpbklkID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpWzBdO1xuICAgIHJldHVybiBtYWluUGx1Z2luSWQgPT09IHRoaXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFBhcmVudEZvbGRlcnMocGFyYW1zOiBDbGVhbnVwUGFyZW50Rm9sZGVyc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBhcmVudEZvbGRlclBhdGhzLFxuICAgIHNldHRpbmdzXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID09PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBwYXJlbnRGb2xkZXJQYXRoIG9mIHBhcmVudEZvbGRlclBhdGhzKSB7XG4gICAgc3dpdGNoIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuRGVsZXRlOlxuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRW1wdHlGb2xkZXJCZWhhdmlvci5EZWxldGVXaXRoRW1wdHlQYXJlbnRzOlxuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHAsIHBhcmVudEZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFNBQVM7QUFDbEIsU0FBUyxhQUFhO0FBU3RCLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsc0JBQXNCO0FBQy9CO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxnQ0FBZ0M7QUFDekM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFB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QUMzSDtBQUFBLElBQ0Y7QUFFQSxRQUFJLFNBQVMsZ0JBQWdCLE9BQU8sR0FBRztBQUNyQyxxQkFBZSxrQ0FBa0MsRUFBRSx1Q0FBdUMsT0FBTywwQkFBMEI7QUFDM0g7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLEtBQUssSUFBSSxjQUFjLFNBQVMsT0FBTyxLQUFLLEtBQUssSUFBSSxjQUFjLFNBQVMsT0FBTztBQUNwRyxVQUFNLHNCQUFzQiwwQkFBMEIsS0FBSyxLQUFLLE9BQU8sRUFBRTtBQUN6RSxlQUFXO0FBQUEsTUFDVCxhQUFhLEtBQUsscUJBQXFCO0FBQUEsTUFDdkMsYUFBYSxDQUFDLGdCQUNaLElBQUksY0FBYztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxLQUFLLEtBQUs7QUFBQSxRQUNWLGdCQUFnQixLQUFLO0FBQUEsUUFDckIsdUJBQXVCLEtBQUs7QUFBQSxRQUM1QjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsdUJBQXVCLEtBQUs7QUFBQSxRQUM1QixpQkFBaUIsS0FBSztBQUFBLE1BQ3hCLENBQUMsRUFBRSxPQUFPO0FBQUEsTUFDWixlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLG9CQUFvQixjQUFjLEVBQUUsU0FBUyxRQUFRLENBQUM7QUFBQSxJQUNuRyxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEsd0JBQThCO0FBQ3BDLFVBQU0sMEJBQTBCLEtBQUssZ0JBQWdCO0FBQ3JELG1CQUFlLDJDQUEyQztBQUFBLE1BQ3hELG1EQUFtRCxLQUFLLFVBQVUsTUFBTSxLQUFLLHdCQUF3QixLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQUEsSUFDL0c7QUFBQSxFQUNGO0FBQUEsRUFFUSxzQkFBK0I7QUFDckMsVUFBTSwwQkFBMEIsS0FBSyxnQkFBZ0I7QUFDckQsVUFBTSxlQUFlLE1BQU0sS0FBSyx3QkFBd0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUNqRSxXQUFPLGlCQUFpQixLQUFLO0FBQUEsRUFDL0I7QUFDRjtBQUVBLGVBQWUscUJBQXFCLFFBQW1EO0FBQ3JGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLFNBQVMsd0JBQXdCLG1CQUEwQjtBQUM3RDtBQUFBLEVBQ0Y7QUFDQSxhQUFXLG9CQUFvQixtQkFBbUI7QUFDaEQsWUFBUSxTQUFTLHFCQUFxQjtBQUFBLE1BQ3BDLEtBQUs7QUFDSCxjQUFNLGtCQUFrQixLQUFLLGdCQUFnQjtBQUM3QztBQUFBLE1BQ0YsS0FBSztBQUNILGNBQU0sMkJBQTJCLEtBQUssZ0JBQWdCO0FBQ3REO0FBQUEsTUFDRjtBQUNFO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsiRW1wdHlGb2xkZXJCZWhhdmlvciJdCn0K
|