obsidian-dev-utils 97.0.0 → 99.0.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 +26 -0
- package/LICENSE +1 -1
- package/dist/integration-test-plugin/main.js +686 -439
- package/dist/lib/cjs/__merged.cjs +22 -9
- package/dist/lib/cjs/__merged.d.cts +4 -3
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +36 -1
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +21 -0
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +20 -6
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +26 -4
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
- package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
- package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
- package/dist/lib/cjs/obsidian/file-change.cjs +6 -6
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/link.cjs +33 -6
- package/dist/lib/cjs/obsidian/link.d.cts +35 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
- package/dist/lib/cjs/obsidian/reference.cjs +9 -1
- package/dist/lib/cjs/obsidian/reference.d.cts +33 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
- package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
- package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
- package/dist/lib/cjs/obsidian/validation.cjs +22 -3
- package/dist/lib/cjs/obsidian/validation.d.cts +37 -0
- package/dist/lib/cjs/obsidian/vault.cjs +4 -1
- package/dist/lib/cjs/obsidian/vault.d.cts +8 -1
- package/dist/lib/cjs/script-utils/build.cjs +30 -6
- package/dist/lib/cjs/script-utils/build.d.cts +5 -0
- package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
- package/dist/lib/cjs/script-utils/exec.cjs +1 -1
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +7 -5
- package/dist/lib/cjs/script-utils/nano-staged-config.d.cts +5 -2
- package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
- package/dist/lib/cjs/script-utils/package-manager.cjs +370 -0
- package/dist/lib/cjs/script-utils/package-manager.d.cts +93 -0
- package/dist/lib/cjs/script-utils/version.cjs +21 -9
- package/dist/lib/esm/__merged.d.mts +4 -3
- package/dist/lib/esm/__merged.mjs +24 -10
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +21 -0
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +36 -1
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +26 -4
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +20 -6
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
- package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
- package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
- package/dist/lib/esm/obsidian/file-change.mjs +6 -6
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/link.d.mts +35 -0
- package/dist/lib/esm/obsidian/link.mjs +38 -7
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
- package/dist/lib/esm/obsidian/reference.d.mts +33 -0
- package/dist/lib/esm/obsidian/reference.mjs +8 -1
- package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
- package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
- package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
- package/dist/lib/esm/obsidian/validation.d.mts +37 -0
- package/dist/lib/esm/obsidian/validation.mjs +21 -2
- package/dist/lib/esm/obsidian/vault.d.mts +8 -1
- package/dist/lib/esm/obsidian/vault.mjs +4 -1
- package/dist/lib/esm/script-utils/build.d.mts +5 -0
- package/dist/lib/esm/script-utils/build.mjs +30 -6
- package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
- package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
- package/dist/lib/esm/script-utils/exec.mjs +1 -1
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
- package/dist/lib/esm/script-utils/nano-staged-config.d.mts +5 -2
- package/dist/lib/esm/script-utils/nano-staged-config.mjs +7 -5
- package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
- package/dist/lib/esm/script-utils/package-manager.d.mts +93 -0
- package/dist/lib/esm/script-utils/package-manager.mjs +256 -0
- package/dist/lib/esm/script-utils/version.mjs +21 -9
- package/obsidian/demo-vault-naming/package.json +6 -0
- package/obsidian/mobile-trusted-input/package.json +6 -0
- package/obsidian/trusted-input/package.json +6 -0
- package/package.json +19 -17
- package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/script-utils/package-manager/package.json +6 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/// <reference path="../library.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Trusted input helpers that work on **either platform** — the documented entry point for keystrokes,
|
|
6
|
+
* pointer moves and clicks that Obsidian actually believes.
|
|
7
|
+
*
|
|
8
|
+
* Untrusted input (`element.dispatchEvent(new MouseEvent('click'))`) is silently ignored by CodeMirror,
|
|
9
|
+
* by the CSS `:hover` engine and by every `e.isTrusted` guard in Obsidian, so a test driving it exercises
|
|
10
|
+
* nothing while still passing. A trusted event has to come from outside the renderer, and how it gets
|
|
11
|
+
* there is platform-specific: Electron's `webContents.sendInputEvent` on desktop, a CDP injection
|
|
12
|
+
* round-tripped through the harness's host channel on mobile.
|
|
13
|
+
*
|
|
14
|
+
* This module **internalizes that split** (see the project `AGENTS.md` **L6**): it stays
|
|
15
|
+
* cross-platform-loadable — no platform-only module is on its import graph — and each helper defers to a
|
|
16
|
+
* `Platform`-gated call-time dynamic `import()` of the arm that fits. So a consumer writes
|
|
17
|
+
* `await clickElement({ element })` once and never a platform check.
|
|
18
|
+
*
|
|
19
|
+
* The arms remain importable directly, for a caller making a deliberate platform commitment:
|
|
20
|
+
* {@link ./desktop-trusted-input.ts | desktop-trusted-input} and
|
|
21
|
+
* {@link ./mobile-trusted-input.ts | mobile-trusted-input}. Prefer this facade otherwise.
|
|
22
|
+
*
|
|
23
|
+
* **Every helper must be awaited.** The desktop arm has nothing to wait for, but the mobile arm's
|
|
24
|
+
* injection is a round-trip to the host, so a missing `await` lets the assertion run before the input has
|
|
25
|
+
* landed. The signature is the same on both platforms precisely so that a suite growing a mobile lane
|
|
26
|
+
* does not have to be rewritten.
|
|
27
|
+
*
|
|
28
|
+
* **Not every helper survives the port.** `moveMouse`, `hoverElement` and `unhoverElement` **throw** on
|
|
29
|
+
* mobile: a touch screen has no persistent pointer and `:hover` has no touch equivalent. They throw
|
|
30
|
+
* rather than no-op, because a silent no-op is exactly the false confidence trusted input exists to end.
|
|
31
|
+
* Gate those on `Platform.isDesktopApp`, or drive the element with {@link clickElement} instead.
|
|
32
|
+
*/
|
|
33
|
+
import type { ClickElementParams, ClickMouseParams, HoverElementParams, MoveMouseParams, PressKeyParams, TypeIntoEditorParams, UnhoverElementParams } from './desktop-trusted-input.mjs';
|
|
34
|
+
export type { ClickElementParams, ClickMouseParams, HoverElementParams, MouseButton, MoveMouseParams, PressKeyParams, TypeIntoEditorParams, UnhoverElementParams } from './desktop-trusted-input.mjs';
|
|
35
|
+
/**
|
|
36
|
+
* Clicks the center of an element using **trusted** input — Electron's `sendInputEvent` on desktop, a CDP
|
|
37
|
+
* touch tap in the WebView on mobile.
|
|
38
|
+
*
|
|
39
|
+
* The element-relative counterpart of {@link clickMouse}, mirroring the {@link moveMouse} /
|
|
40
|
+
* {@link hoverElement} split. Use {@link clickMouse} directly when the point to click is **not** the
|
|
41
|
+
* element's center — the markdown editor's margin, for instance, lies inside `cm.scrollDOM` but outside
|
|
42
|
+
* `.cm-sizer`, so no element's center lands on it.
|
|
43
|
+
*
|
|
44
|
+
* @param params - The element to click, the button to press and any modifiers to hold.
|
|
45
|
+
* @returns A {@link Promise} that resolves once the click has been injected.
|
|
46
|
+
*/
|
|
47
|
+
export declare function clickElement(params: ClickElementParams): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Clicks at the given viewport coordinates using **trusted** input, so the renderer synthesizes a real
|
|
50
|
+
* `click` (or `contextmenu`, for the right button) with `isTrusted === true`.
|
|
51
|
+
*
|
|
52
|
+
* The low-level primitive: one click at one point, with no waiting for any effect — callers poll their own
|
|
53
|
+
* readiness signal. Prefer {@link clickElement} for element-relative clicks.
|
|
54
|
+
*
|
|
55
|
+
* A real context menu actually opens, so a suite driving a right click must close it (or remove the
|
|
56
|
+
* leftover `.menu` element) before the next test.
|
|
57
|
+
*
|
|
58
|
+
* **On mobile the button model does not survive the port**: touch has no buttons, so `'left'` (the
|
|
59
|
+
* default) is a **tap**, `'right'` is the **long-press** that opens Obsidian Mobile's context menu, and
|
|
60
|
+
* `'middle'` throws.
|
|
61
|
+
*
|
|
62
|
+
* @param params - The viewport coordinates to click at, the button to press and any modifiers to hold.
|
|
63
|
+
* @returns A {@link Promise} that resolves once the click has been injected.
|
|
64
|
+
*/
|
|
65
|
+
export declare function clickMouse(params: ClickMouseParams): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Moves the pointer to the center of an element using **trusted** pointer input, then polls until the
|
|
68
|
+
* element actually matches `:hover`.
|
|
69
|
+
*
|
|
70
|
+
* **Desktop only** — it throws on mobile, where `:hover` has no touch equivalent.
|
|
71
|
+
*
|
|
72
|
+
* @param params - The element to hover.
|
|
73
|
+
* @returns A {@link Promise} that resolves once the element matches `:hover`.
|
|
74
|
+
*/
|
|
75
|
+
export declare function hoverElement(params: HoverElementParams): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Moves the pointer to the given viewport coordinates using a **trusted** pointer move, so `:hover` rules
|
|
78
|
+
* genuinely apply.
|
|
79
|
+
*
|
|
80
|
+
* The low-level primitive: a single move that does **not** wait for any state to settle. Prefer
|
|
81
|
+
* {@link hoverElement} / {@link unhoverElement} for element-relative moves.
|
|
82
|
+
*
|
|
83
|
+
* **Desktop only** — it throws on mobile, which has no persistent pointer to move.
|
|
84
|
+
*
|
|
85
|
+
* @param params - The viewport coordinates to move to.
|
|
86
|
+
* @returns A {@link Promise} that resolves once the move has been injected.
|
|
87
|
+
*/
|
|
88
|
+
export declare function moveMouse(params: MoveMouseParams): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Presses a single key (optionally with modifiers) using **trusted** keyboard input, firing the full real
|
|
91
|
+
* key pipeline — `keydown` → `keypress` → `beforeinput` → `input` → `keyup`.
|
|
92
|
+
*
|
|
93
|
+
* It is delivered to the window's DOM-focused element, so the caller focuses the target first and then
|
|
94
|
+
* awaits the expected effect; the press itself polls for nothing. On mobile the accepted keys are the
|
|
95
|
+
* named ones (`'Enter'`, `'Escape'`, `'Tab'`, `'Backspace'`, `'Delete'`, the arrows) plus single printable
|
|
96
|
+
* characters — anything else throws rather than pressing nothing.
|
|
97
|
+
*
|
|
98
|
+
* @param params - The key to press and any modifiers to hold.
|
|
99
|
+
* @returns A {@link Promise} that resolves once the key press has been injected.
|
|
100
|
+
*/
|
|
101
|
+
export declare function pressKey(params: PressKeyParams): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Types text into a CodeMirror editor using **trusted** keyboard input.
|
|
104
|
+
*
|
|
105
|
+
* Focuses the editor (caret to the end) and presses every code point of the text — the same trusted
|
|
106
|
+
* sequence a real user produces — so the text reaches the document **only if the editor genuinely holds
|
|
107
|
+
* focus**. Then it polls until the document reflects the input, or a bounded timeout elapses (the expected
|
|
108
|
+
* outcome when the editor is read-only or focus was stolen).
|
|
109
|
+
*
|
|
110
|
+
* @param params - The editor to type into and the text to type.
|
|
111
|
+
* @returns A {@link Promise} that resolves once the keystrokes have settled.
|
|
112
|
+
*/
|
|
113
|
+
export declare function typeIntoEditor(params: TypeIntoEditorParams): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Moves the pointer to a point just outside an element's bounding box using a **trusted** pointer move,
|
|
116
|
+
* then polls until the element no longer matches `:hover`.
|
|
117
|
+
*
|
|
118
|
+
* The inverse of {@link hoverElement}. When an element spans the full viewport (no point outside its box
|
|
119
|
+
* is reachable), use {@link moveMouse} directly to move the pointer to a known empty coordinate instead.
|
|
120
|
+
*
|
|
121
|
+
* **Desktop only** — it throws on mobile, for the same reason {@link hoverElement} does.
|
|
122
|
+
*
|
|
123
|
+
* @param params - The element to move the pointer away from.
|
|
124
|
+
* @returns A {@link Promise} that resolves once the element no longer matches `:hover`.
|
|
125
|
+
*/
|
|
126
|
+
export declare function unhoverElement(params: UnhoverElementParams): Promise<void>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureBrowserProcess() {
|
|
8
|
+
const browserProcess = {
|
|
9
|
+
browser: true,
|
|
10
|
+
cwd() {
|
|
11
|
+
return '/';
|
|
12
|
+
},
|
|
13
|
+
env: {},
|
|
14
|
+
platform: 'android'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
18
|
+
const existingProcess = globalThis.process;
|
|
19
|
+
|
|
20
|
+
if (!existingProcess) {
|
|
21
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingProcessRecord = existingProcess;
|
|
31
|
+
|
|
32
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
33
|
+
existingProcessRecord[key] ??= value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
existingProcessRecord['browser'] = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
(function initEsm() {
|
|
40
|
+
ensureBrowserProcess();
|
|
41
|
+
})();
|
|
42
|
+
})();
|
|
43
|
+
|
|
44
|
+
import { Platform } from "obsidian";
|
|
45
|
+
async function clickElement(params) {
|
|
46
|
+
const arm = await loadArm();
|
|
47
|
+
await arm.clickElement(params);
|
|
48
|
+
}
|
|
49
|
+
async function clickMouse(params) {
|
|
50
|
+
const arm = await loadArm();
|
|
51
|
+
await arm.clickMouse(params);
|
|
52
|
+
}
|
|
53
|
+
async function hoverElement(params) {
|
|
54
|
+
const arm = await loadArm();
|
|
55
|
+
await arm.hoverElement(params);
|
|
56
|
+
}
|
|
57
|
+
async function moveMouse(params) {
|
|
58
|
+
const arm = await loadArm();
|
|
59
|
+
await arm.moveMouse(params);
|
|
60
|
+
}
|
|
61
|
+
async function pressKey(params) {
|
|
62
|
+
const arm = await loadArm();
|
|
63
|
+
await arm.pressKey(params);
|
|
64
|
+
}
|
|
65
|
+
async function typeIntoEditor(params) {
|
|
66
|
+
const arm = await loadArm();
|
|
67
|
+
await arm.typeIntoEditor(params);
|
|
68
|
+
}
|
|
69
|
+
async function unhoverElement(params) {
|
|
70
|
+
const arm = await loadArm();
|
|
71
|
+
await arm.unhoverElement(params);
|
|
72
|
+
}
|
|
73
|
+
async function loadArm() {
|
|
74
|
+
return Platform.isDesktopApp ? await import("./desktop-trusted-input.mjs") : await import("./mobile-trusted-input.mjs");
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
clickElement,
|
|
78
|
+
clickMouse,
|
|
79
|
+
hoverElement,
|
|
80
|
+
moveMouse,
|
|
81
|
+
pressKey,
|
|
82
|
+
typeIntoEditor,
|
|
83
|
+
unhoverElement
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3RydXN0ZWQtaW5wdXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUcnVzdGVkIGlucHV0IGhlbHBlcnMgdGhhdCB3b3JrIG9uICoqZWl0aGVyIHBsYXRmb3JtKiogXHUyMDE0IHRoZSBkb2N1bWVudGVkIGVudHJ5IHBvaW50IGZvciBrZXlzdHJva2VzLFxuICogcG9pbnRlciBtb3ZlcyBhbmQgY2xpY2tzIHRoYXQgT2JzaWRpYW4gYWN0dWFsbHkgYmVsaWV2ZXMuXG4gKlxuICogVW50cnVzdGVkIGlucHV0IChgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKWApIGlzIHNpbGVudGx5IGlnbm9yZWQgYnkgQ29kZU1pcnJvcixcbiAqIGJ5IHRoZSBDU1MgYDpob3ZlcmAgZW5naW5lIGFuZCBieSBldmVyeSBgZS5pc1RydXN0ZWRgIGd1YXJkIGluIE9ic2lkaWFuLCBzbyBhIHRlc3QgZHJpdmluZyBpdCBleGVyY2lzZXNcbiAqIG5vdGhpbmcgd2hpbGUgc3RpbGwgcGFzc2luZy4gQSB0cnVzdGVkIGV2ZW50IGhhcyB0byBjb21lIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyZXIsIGFuZCBob3cgaXQgZ2V0c1xuICogdGhlcmUgaXMgcGxhdGZvcm0tc3BlY2lmaWM6IEVsZWN0cm9uJ3MgYHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50YCBvbiBkZXNrdG9wLCBhIENEUCBpbmplY3Rpb25cbiAqIHJvdW5kLXRyaXBwZWQgdGhyb3VnaCB0aGUgaGFybmVzcydzIGhvc3QgY2hhbm5lbCBvbiBtb2JpbGUuXG4gKlxuICogVGhpcyBtb2R1bGUgKippbnRlcm5hbGl6ZXMgdGhhdCBzcGxpdCoqIChzZWUgdGhlIHByb2plY3QgYEFHRU5UUy5tZGAgKipMNioqKTogaXQgc3RheXNcbiAqIGNyb3NzLXBsYXRmb3JtLWxvYWRhYmxlIFx1MjAxNCBubyBwbGF0Zm9ybS1vbmx5IG1vZHVsZSBpcyBvbiBpdHMgaW1wb3J0IGdyYXBoIFx1MjAxNCBhbmQgZWFjaCBoZWxwZXIgZGVmZXJzIHRvIGFcbiAqIGBQbGF0Zm9ybWAtZ2F0ZWQgY2FsbC10aW1lIGR5bmFtaWMgYGltcG9ydCgpYCBvZiB0aGUgYXJtIHRoYXQgZml0cy4gU28gYSBjb25zdW1lciB3cml0ZXNcbiAqIGBhd2FpdCBjbGlja0VsZW1lbnQoeyBlbGVtZW50IH0pYCBvbmNlIGFuZCBuZXZlciBhIHBsYXRmb3JtIGNoZWNrLlxuICpcbiAqIFRoZSBhcm1zIHJlbWFpbiBpbXBvcnRhYmxlIGRpcmVjdGx5LCBmb3IgYSBjYWxsZXIgbWFraW5nIGEgZGVsaWJlcmF0ZSBwbGF0Zm9ybSBjb21taXRtZW50OlxuICoge0BsaW5rIC4vZGVza3RvcC10cnVzdGVkLWlucHV0LnRzIHwgZGVza3RvcC10cnVzdGVkLWlucHV0fSBhbmRcbiAqIHtAbGluayAuL21vYmlsZS10cnVzdGVkLWlucHV0LnRzIHwgbW9iaWxlLXRydXN0ZWQtaW5wdXR9LiBQcmVmZXIgdGhpcyBmYWNhZGUgb3RoZXJ3aXNlLlxuICpcbiAqICoqRXZlcnkgaGVscGVyIG11c3QgYmUgYXdhaXRlZC4qKiBUaGUgZGVza3RvcCBhcm0gaGFzIG5vdGhpbmcgdG8gd2FpdCBmb3IsIGJ1dCB0aGUgbW9iaWxlIGFybSdzXG4gKiBpbmplY3Rpb24gaXMgYSByb3VuZC10cmlwIHRvIHRoZSBob3N0LCBzbyBhIG1pc3NpbmcgYGF3YWl0YCBsZXRzIHRoZSBhc3NlcnRpb24gcnVuIGJlZm9yZSB0aGUgaW5wdXQgaGFzXG4gKiBsYW5kZWQuIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgb24gYm90aCBwbGF0Zm9ybXMgcHJlY2lzZWx5IHNvIHRoYXQgYSBzdWl0ZSBncm93aW5nIGEgbW9iaWxlIGxhbmVcbiAqIGRvZXMgbm90IGhhdmUgdG8gYmUgcmV3cml0dGVuLlxuICpcbiAqICoqTm90IGV2ZXJ5IGhlbHBlciBzdXJ2aXZlcyB0aGUgcG9ydC4qKiBgbW92ZU1vdXNlYCwgYGhvdmVyRWxlbWVudGAgYW5kIGB1bmhvdmVyRWxlbWVudGAgKip0aHJvdyoqIG9uXG4gKiBtb2JpbGU6IGEgdG91Y2ggc2NyZWVuIGhhcyBubyBwZXJzaXN0ZW50IHBvaW50ZXIgYW5kIGA6aG92ZXJgIGhhcyBubyB0b3VjaCBlcXVpdmFsZW50LiBUaGV5IHRocm93XG4gKiByYXRoZXIgdGhhbiBuby1vcCwgYmVjYXVzZSBhIHNpbGVudCBuby1vcCBpcyBleGFjdGx5IHRoZSBmYWxzZSBjb25maWRlbmNlIHRydXN0ZWQgaW5wdXQgZXhpc3RzIHRvIGVuZC5cbiAqIEdhdGUgdGhvc2Ugb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGgge0BsaW5rIGNsaWNrRWxlbWVudH0gaW5zdGVhZC5cbiAqL1xuXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zXG59IGZyb20gJy4vZGVza3RvcC10cnVzdGVkLWlucHV0LnRzJztcblxuZXhwb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW91c2VCdXR0b24sXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtc1xufSBmcm9tICcuL2Rlc2t0b3AtdHJ1c3RlZC1pbnB1dC50cyc7XG5cbi8vIFRoZSBzZXZlbiBoZWxwZXJzIGJvdGggYXJtcyBleHBvcnQsIHdpdGggaWRlbnRpY2FsIHNpZ25hdHVyZXMuIFR5cGVkIG9mZiB0aGUgbW9iaWxlIGFybSBiZWNhdXNlIGl0XG4vLyBFeHBvcnRzIG5vdGhpbmcgZWxzZTsgdGhlIGRlc2t0b3AgYXJtIGFkZGl0aW9uYWxseSBleHBvcnRzIHRoZSBwYXJhbWV0ZXIgY29udHJhY3RzIGJvdGggc2hhcmUuXG50eXBlIFRydXN0ZWRJbnB1dEFybSA9IHR5cGVvZiBpbXBvcnQoJy4vbW9iaWxlLXRydXN0ZWQtaW5wdXQudHMnKTtcblxuLyoqXG4gKiBDbGlja3MgdGhlIGNlbnRlciBvZiBhbiBlbGVtZW50IHVzaW5nICoqdHJ1c3RlZCoqIGlucHV0IFx1MjAxNCBFbGVjdHJvbidzIGBzZW5kSW5wdXRFdmVudGAgb24gZGVza3RvcCwgYSBDRFBcbiAqIHRvdWNoIHRhcCBpbiB0aGUgV2ViVmlldyBvbiBtb2JpbGUuXG4gKlxuICogVGhlIGVsZW1lbnQtcmVsYXRpdmUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGNsaWNrTW91c2V9LCBtaXJyb3JpbmcgdGhlIHtAbGluayBtb3ZlTW91c2V9IC9cbiAqIHtAbGluayBob3ZlckVsZW1lbnR9IHNwbGl0LiBVc2Uge0BsaW5rIGNsaWNrTW91c2V9IGRpcmVjdGx5IHdoZW4gdGhlIHBvaW50IHRvIGNsaWNrIGlzICoqbm90KiogdGhlXG4gKiBlbGVtZW50J3MgY2VudGVyIFx1MjAxNCB0aGUgbWFya2Rvd24gZWRpdG9yJ3MgbWFyZ2luLCBmb3IgaW5zdGFuY2UsIGxpZXMgaW5zaWRlIGBjbS5zY3JvbGxET01gIGJ1dCBvdXRzaWRlXG4gKiBgLmNtLXNpemVyYCwgc28gbm8gZWxlbWVudCdzIGNlbnRlciBsYW5kcyBvbiBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVsZW1lbnQgdG8gY2xpY2ssIHRoZSBidXR0b24gdG8gcHJlc3MgYW5kIGFueSBtb2RpZmllcnMgdG8gaG9sZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2xpY2sgaGFzIGJlZW4gaW5qZWN0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGlja0VsZW1lbnQocGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJtID0gYXdhaXQgbG9hZEFybSgpO1xuICBhd2FpdCBhcm0uY2xpY2tFbGVtZW50KHBhcmFtcyk7XG59XG5cbi8qKlxuICogQ2xpY2tzIGF0IHRoZSBnaXZlbiB2aWV3cG9ydCBjb29yZGluYXRlcyB1c2luZyAqKnRydXN0ZWQqKiBpbnB1dCwgc28gdGhlIHJlbmRlcmVyIHN5bnRoZXNpemVzIGEgcmVhbFxuICogYGNsaWNrYCAob3IgYGNvbnRleHRtZW51YCwgZm9yIHRoZSByaWdodCBidXR0b24pIHdpdGggYGlzVHJ1c3RlZCA9PT0gdHJ1ZWAuXG4gKlxuICogVGhlIGxvdy1sZXZlbCBwcmltaXRpdmU6IG9uZSBjbGljayBhdCBvbmUgcG9pbnQsIHdpdGggbm8gd2FpdGluZyBmb3IgYW55IGVmZmVjdCBcdTIwMTQgY2FsbGVycyBwb2xsIHRoZWlyIG93blxuICogcmVhZGluZXNzIHNpZ25hbC4gUHJlZmVyIHtAbGluayBjbGlja0VsZW1lbnR9IGZvciBlbGVtZW50LXJlbGF0aXZlIGNsaWNrcy5cbiAqXG4gKiBBIHJlYWwgY29udGV4dCBtZW51IGFjdHVhbGx5IG9wZW5zLCBzbyBhIHN1aXRlIGRyaXZpbmcgYSByaWdodCBjbGljayBtdXN0IGNsb3NlIGl0IChvciByZW1vdmUgdGhlXG4gKiBsZWZ0b3ZlciBgLm1lbnVgIGVsZW1lbnQpIGJlZm9yZSB0aGUgbmV4dCB0ZXN0LlxuICpcbiAqICoqT24gbW9iaWxlIHRoZSBidXR0b24gbW9kZWwgZG9lcyBub3Qgc3Vydml2ZSB0aGUgcG9ydCoqOiB0b3VjaCBoYXMgbm8gYnV0dG9ucywgc28gYCdsZWZ0J2AgKHRoZVxuICogZGVmYXVsdCkgaXMgYSAqKnRhcCoqLCBgJ3JpZ2h0J2AgaXMgdGhlICoqbG9uZy1wcmVzcyoqIHRoYXQgb3BlbnMgT2JzaWRpYW4gTW9iaWxlJ3MgY29udGV4dCBtZW51LCBhbmRcbiAqIGAnbWlkZGxlJ2AgdGhyb3dzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMgdG8gY2xpY2sgYXQsIHRoZSBidXR0b24gdG8gcHJlc3MgYW5kIGFueSBtb2RpZmllcnMgdG8gaG9sZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2xpY2sgaGFzIGJlZW4gaW5qZWN0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGlja01vdXNlKHBhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcm0gPSBhd2FpdCBsb2FkQXJtKCk7XG4gIGF3YWl0IGFybS5jbGlja01vdXNlKHBhcmFtcyk7XG59XG5cbi8qKlxuICogTW92ZXMgdGhlIHBvaW50ZXIgdG8gdGhlIGNlbnRlciBvZiBhbiBlbGVtZW50IHVzaW5nICoqdHJ1c3RlZCoqIHBvaW50ZXIgaW5wdXQsIHRoZW4gcG9sbHMgdW50aWwgdGhlXG4gKiBlbGVtZW50IGFjdHVhbGx5IG1hdGNoZXMgYDpob3ZlcmAuXG4gKlxuICogKipEZXNrdG9wIG9ubHkqKiBcdTIwMTQgaXQgdGhyb3dzIG9uIG1vYmlsZSwgd2hlcmUgYDpob3ZlcmAgaGFzIG5vIHRvdWNoIGVxdWl2YWxlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIGhvdmVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBlbGVtZW50IG1hdGNoZXMgYDpob3ZlcmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQocGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJtID0gYXdhaXQgbG9hZEFybSgpO1xuICBhd2FpdCBhcm0uaG92ZXJFbGVtZW50KHBhcmFtcyk7XG59XG5cbi8qKlxuICogTW92ZXMgdGhlIHBvaW50ZXIgdG8gdGhlIGdpdmVuIHZpZXdwb3J0IGNvb3JkaW5hdGVzIHVzaW5nIGEgKip0cnVzdGVkKiogcG9pbnRlciBtb3ZlLCBzbyBgOmhvdmVyYCBydWxlc1xuICogZ2VudWluZWx5IGFwcGx5LlxuICpcbiAqIFRoZSBsb3ctbGV2ZWwgcHJpbWl0aXZlOiBhIHNpbmdsZSBtb3ZlIHRoYXQgZG9lcyAqKm5vdCoqIHdhaXQgZm9yIGFueSBzdGF0ZSB0byBzZXR0bGUuIFByZWZlclxuICoge0BsaW5rIGhvdmVyRWxlbWVudH0gLyB7QGxpbmsgdW5ob3ZlckVsZW1lbnR9IGZvciBlbGVtZW50LXJlbGF0aXZlIG1vdmVzLlxuICpcbiAqICoqRGVza3RvcCBvbmx5KiogXHUyMDE0IGl0IHRocm93cyBvbiBtb2JpbGUsIHdoaWNoIGhhcyBubyBwZXJzaXN0ZW50IHBvaW50ZXIgdG8gbW92ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIG1vdmUgdG8uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIG1vdmUgaGFzIGJlZW4gaW5qZWN0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtb3ZlTW91c2UocGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJtID0gYXdhaXQgbG9hZEFybSgpO1xuICBhd2FpdCBhcm0ubW92ZU1vdXNlKHBhcmFtcyk7XG59XG5cbi8qKlxuICogUHJlc3NlcyBhIHNpbmdsZSBrZXkgKG9wdGlvbmFsbHkgd2l0aCBtb2RpZmllcnMpIHVzaW5nICoqdHJ1c3RlZCoqIGtleWJvYXJkIGlucHV0LCBmaXJpbmcgdGhlIGZ1bGwgcmVhbFxuICoga2V5IHBpcGVsaW5lIFx1MjAxNCBga2V5ZG93bmAgXHUyMTkyIGBrZXlwcmVzc2AgXHUyMTkyIGBiZWZvcmVpbnB1dGAgXHUyMTkyIGBpbnB1dGAgXHUyMTkyIGBrZXl1cGAuXG4gKlxuICogSXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB3aW5kb3cncyBET00tZm9jdXNlZCBlbGVtZW50LCBzbyB0aGUgY2FsbGVyIGZvY3VzZXMgdGhlIHRhcmdldCBmaXJzdCBhbmQgdGhlblxuICogYXdhaXRzIHRoZSBleHBlY3RlZCBlZmZlY3Q7IHRoZSBwcmVzcyBpdHNlbGYgcG9sbHMgZm9yIG5vdGhpbmcuIE9uIG1vYmlsZSB0aGUgYWNjZXB0ZWQga2V5cyBhcmUgdGhlXG4gKiBuYW1lZCBvbmVzIChgJ0VudGVyJ2AsIGAnRXNjYXBlJ2AsIGAnVGFiJ2AsIGAnQmFja3NwYWNlJ2AsIGAnRGVsZXRlJ2AsIHRoZSBhcnJvd3MpIHBsdXMgc2luZ2xlIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBcdTIwMTQgYW55dGhpbmcgZWxzZSB0aHJvd3MgcmF0aGVyIHRoYW4gcHJlc3Npbmcgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSB0byBwcmVzcyBhbmQgYW55IG1vZGlmaWVycyB0byBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBrZXkgcHJlc3MgaGFzIGJlZW4gaW5qZWN0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVzc0tleShwYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFybSA9IGF3YWl0IGxvYWRBcm0oKTtcbiAgYXdhaXQgYXJtLnByZXNzS2V5KHBhcmFtcyk7XG59XG5cbi8qKlxuICogVHlwZXMgdGV4dCBpbnRvIGEgQ29kZU1pcnJvciBlZGl0b3IgdXNpbmcgKip0cnVzdGVkKioga2V5Ym9hcmQgaW5wdXQuXG4gKlxuICogRm9jdXNlcyB0aGUgZWRpdG9yIChjYXJldCB0byB0aGUgZW5kKSBhbmQgcHJlc3NlcyBldmVyeSBjb2RlIHBvaW50IG9mIHRoZSB0ZXh0IFx1MjAxNCB0aGUgc2FtZSB0cnVzdGVkXG4gKiBzZXF1ZW5jZSBhIHJlYWwgdXNlciBwcm9kdWNlcyBcdTIwMTQgc28gdGhlIHRleHQgcmVhY2hlcyB0aGUgZG9jdW1lbnQgKipvbmx5IGlmIHRoZSBlZGl0b3IgZ2VudWluZWx5IGhvbGRzXG4gKiBmb2N1cyoqLiBUaGVuIGl0IHBvbGxzIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGUgaW5wdXQsIG9yIGEgYm91bmRlZCB0aW1lb3V0IGVsYXBzZXMgKHRoZSBleHBlY3RlZFxuICogb3V0Y29tZSB3aGVuIHRoZSBlZGl0b3IgaXMgcmVhZC1vbmx5IG9yIGZvY3VzIHdhcyBzdG9sZW4pLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWRpdG9yIHRvIHR5cGUgaW50byBhbmQgdGhlIHRleHQgdG8gdHlwZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUga2V5c3Ryb2tlcyBoYXZlIHNldHRsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlSW50b0VkaXRvcihwYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFybSA9IGF3YWl0IGxvYWRBcm0oKTtcbiAgYXdhaXQgYXJtLnR5cGVJbnRvRWRpdG9yKHBhcmFtcyk7XG59XG5cbi8qKlxuICogTW92ZXMgdGhlIHBvaW50ZXIgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgYW4gZWxlbWVudCdzIGJvdW5kaW5nIGJveCB1c2luZyBhICoqdHJ1c3RlZCoqIHBvaW50ZXIgbW92ZSxcbiAqIHRoZW4gcG9sbHMgdW50aWwgdGhlIGVsZW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXMgYDpob3ZlcmAuXG4gKlxuICogVGhlIGludmVyc2Ugb2Yge0BsaW5rIGhvdmVyRWxlbWVudH0uIFdoZW4gYW4gZWxlbWVudCBzcGFucyB0aGUgZnVsbCB2aWV3cG9ydCAobm8gcG9pbnQgb3V0c2lkZSBpdHMgYm94XG4gKiBpcyByZWFjaGFibGUpLCB1c2Uge0BsaW5rIG1vdmVNb3VzZX0gZGlyZWN0bHkgdG8gbW92ZSB0aGUgcG9pbnRlciB0byBhIGtub3duIGVtcHR5IGNvb3JkaW5hdGUgaW5zdGVhZC5cbiAqXG4gKiAqKkRlc2t0b3Agb25seSoqIFx1MjAxNCBpdCB0aHJvd3Mgb24gbW9iaWxlLCBmb3IgdGhlIHNhbWUgcmVhc29uIHtAbGluayBob3ZlckVsZW1lbnR9IGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYXdheSBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBlbGVtZW50IG5vIGxvbmdlciBtYXRjaGVzIGA6aG92ZXJgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5ob3ZlckVsZW1lbnQocGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcm0gPSBhd2FpdCBsb2FkQXJtKCk7XG4gIGF3YWl0IGFybS51bmhvdmVyRWxlbWVudChwYXJhbXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQXJtKCk6IFByb21pc2U8VHJ1c3RlZElucHV0QXJtPiB7XG4gIC8vIENvbmRpdGlvbmFsIGltcG9ydCBvZiB0aGUgcGxhdGZvcm0tb25seSBhcm0sIGF0IGNhbGwgdGltZTogbmVpdGhlciBhcm0gaXMgb24gdGhlIG90aGVyIHBsYXRmb3JtJ3NcbiAgLy8gTG9hZCBwYXRoLCBhbmQgdGhlIHNwZWNpZmllcnMgc3RheSBsaXRlcmFsIHNvIGVzYnVpbGQgYnVuZGxlcyBib3RoLlxuICByZXR1cm4gUGxhdGZvcm0uaXNEZXNrdG9wQXBwID8gYXdhaXQgaW1wb3J0KCcuL2Rlc2t0b3AtdHJ1c3RlZC1pbnB1dC50cycpIDogYXdhaXQgaW1wb3J0KCcuL21vYmlsZS10cnVzdGVkLWlucHV0LnRzJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLFNBQVMsZ0JBQWdCO0FBdUN6QixlQUFzQixhQUFhLFFBQTJDO0FBQzVFLFFBQU0sTUFBTSxNQUFNLFFBQVE7QUFDMUIsUUFBTSxJQUFJLGFBQWEsTUFBTTtBQUMvQjtBQW1CQSxlQUFzQixXQUFXLFFBQXlDO0FBQ3hFLFFBQU0sTUFBTSxNQUFNLFFBQVE7QUFDMUIsUUFBTSxJQUFJLFdBQVcsTUFBTTtBQUM3QjtBQVdBLGVBQXNCLGFBQWEsUUFBMkM7QUFDNUUsUUFBTSxNQUFNLE1BQU0sUUFBUTtBQUMxQixRQUFNLElBQUksYUFBYSxNQUFNO0FBQy9CO0FBY0EsZUFBc0IsVUFBVSxRQUF3QztBQUN0RSxRQUFNLE1BQU0sTUFBTSxRQUFRO0FBQzFCLFFBQU0sSUFBSSxVQUFVLE1BQU07QUFDNUI7QUFjQSxlQUFzQixTQUFTLFFBQXVDO0FBQ3BFLFFBQU0sTUFBTSxNQUFNLFFBQVE7QUFDMUIsUUFBTSxJQUFJLFNBQVMsTUFBTTtBQUMzQjtBQWFBLGVBQXNCLGVBQWUsUUFBNkM7QUFDaEYsUUFBTSxNQUFNLE1BQU0sUUFBUTtBQUMxQixRQUFNLElBQUksZUFBZSxNQUFNO0FBQ2pDO0FBY0EsZUFBc0IsZUFBZSxRQUE2QztBQUNoRixRQUFNLE1BQU0sTUFBTSxRQUFRO0FBQzFCLFFBQU0sSUFBSSxlQUFlLE1BQU07QUFDakM7QUFFQSxlQUFlLFVBQW9DO0FBR2pELFNBQU8sU0FBUyxlQUFlLE1BQU0sT0FBTyw0QkFBNEIsSUFBSSxNQUFNLE9BQU8sMkJBQTJCO0FBQ3RIOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -48,3 +48,40 @@ export declare function getOsAndObsidianUnsafePathCharsRegExp(isWindows?: boolea
|
|
|
48
48
|
* @returns A regexp matching characters that are not safe to use in file names/paths at the OS level.
|
|
49
49
|
*/
|
|
50
50
|
export declare function getOsUnsafePathCharsRegExp(isWindows?: boolean): RegExp;
|
|
51
|
+
/**
|
|
52
|
+
* Checks whether a name ends with the dots or spaces Windows refuses.
|
|
53
|
+
*
|
|
54
|
+
* Answers for Windows regardless of the platform in use: a vault is synced, so the rules that matter are
|
|
55
|
+
* not necessarily those of the machine asking.
|
|
56
|
+
*
|
|
57
|
+
* @param name - The name to check. A single path segment, not a path.
|
|
58
|
+
* @returns `true` if the name ends with a dot or a space, `false` otherwise.
|
|
59
|
+
*/
|
|
60
|
+
export declare function hasWindowsTrailingChars(name: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Checks whether a name is one of the MS-DOS device names Windows refuses.
|
|
63
|
+
*
|
|
64
|
+
* Two steps the caller would otherwise have to know about happen here: trailing dots and spaces are
|
|
65
|
+
* trimmed BEFORE the test, because Windows strips them before deciding and `CON ` is therefore as
|
|
66
|
+
* reserved as `CON`; and the extension is dropped, because `CON.md` is reserved too.
|
|
67
|
+
*
|
|
68
|
+
* `CONIN$` / `CONOUT$` and the superscript `COM²` forms are deliberately NOT reserved: they are accepted
|
|
69
|
+
* by every Windows version that runs Obsidian, and matching them would rename files that work.
|
|
70
|
+
*
|
|
71
|
+
* Answers for Windows regardless of the platform in use: a vault is synced, so the rules that matter are
|
|
72
|
+
* not necessarily those of the machine asking.
|
|
73
|
+
*
|
|
74
|
+
* @param name - The name to check. A single path segment, with or without its extension.
|
|
75
|
+
* @returns `true` if the name is reserved, `false` otherwise.
|
|
76
|
+
*/
|
|
77
|
+
export declare function isWindowsReservedName(name: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Removes the trailing dots and spaces Windows refuses from the end of a name.
|
|
80
|
+
*
|
|
81
|
+
* Trim before testing for a reserved name, never after: trimming afterwards turns an accepted `CON ` into
|
|
82
|
+
* a rejected `CON`. {@link isWindowsReservedName} already does this internally.
|
|
83
|
+
*
|
|
84
|
+
* @param name - The name to trim. A single path segment, not a path.
|
|
85
|
+
* @returns The name without its trailing dots and spaces, which may be empty.
|
|
86
|
+
*/
|
|
87
|
+
export declare function trimWindowsTrailingChars(name: string): string;
|
|
@@ -42,6 +42,10 @@ function ensureBrowserProcess() {
|
|
|
42
42
|
})();
|
|
43
43
|
|
|
44
44
|
import { Platform } from "obsidian";
|
|
45
|
+
import {
|
|
46
|
+
basename,
|
|
47
|
+
extname
|
|
48
|
+
} from "../path.mjs";
|
|
45
49
|
import { oneOf } from "../reg-exp.mjs";
|
|
46
50
|
function isValidationMessageHolder(value) {
|
|
47
51
|
return value.validationMessage !== void 0;
|
|
@@ -49,6 +53,8 @@ function isValidationMessageHolder(value) {
|
|
|
49
53
|
const OBSIDIAN_UNSAFE_FILENAME_CHARS = /[#^[\]|]/g;
|
|
50
54
|
const WINDOWS_UNSAFE_PATH_CHARS = /[*\\/<>:|?"]/g;
|
|
51
55
|
const UNIX_UNSAFE_PATH_CHARS = /[\0/]/g;
|
|
56
|
+
const WINDOWS_RESERVED_NAME_REG_EXP = /^(?:AUX|COM[1-9]|CON|LPT[1-9]|NUL|PRN)$/i;
|
|
57
|
+
const WINDOWS_TRAILING_CHARS_REG_EXP = /[ .]+$/;
|
|
52
58
|
function getOsAndObsidianUnsafePathCharsRegExp(isWindows) {
|
|
53
59
|
return oneOf([
|
|
54
60
|
getOsUnsafePathCharsRegExp(isWindows),
|
|
@@ -59,12 +65,25 @@ function getOsUnsafePathCharsRegExp(isWindows) {
|
|
|
59
65
|
isWindows ??= Platform.isWin;
|
|
60
66
|
return isWindows ? WINDOWS_UNSAFE_PATH_CHARS : UNIX_UNSAFE_PATH_CHARS;
|
|
61
67
|
}
|
|
68
|
+
function hasWindowsTrailingChars(name) {
|
|
69
|
+
return WINDOWS_TRAILING_CHARS_REG_EXP.test(name);
|
|
70
|
+
}
|
|
71
|
+
function isWindowsReservedName(name) {
|
|
72
|
+
const trimmedName = trimWindowsTrailingChars(name);
|
|
73
|
+
return WINDOWS_RESERVED_NAME_REG_EXP.test(basename(trimmedName, extname(trimmedName)));
|
|
74
|
+
}
|
|
75
|
+
function trimWindowsTrailingChars(name) {
|
|
76
|
+
return name.replace(WINDOWS_TRAILING_CHARS_REG_EXP, "");
|
|
77
|
+
}
|
|
62
78
|
export {
|
|
63
79
|
OBSIDIAN_UNSAFE_FILENAME_CHARS,
|
|
64
80
|
UNIX_UNSAFE_PATH_CHARS,
|
|
65
81
|
WINDOWS_UNSAFE_PATH_CHARS,
|
|
66
82
|
getOsAndObsidianUnsafePathCharsRegExp,
|
|
67
83
|
getOsUnsafePathCharsRegExp,
|
|
68
|
-
|
|
84
|
+
hasWindowsTrailingChars,
|
|
85
|
+
isValidationMessageHolder,
|
|
86
|
+
isWindowsReservedName,
|
|
87
|
+
trimWindowsTrailingChars
|
|
69
88
|
};
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhbGlkYXRpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWYWxpZGF0aW9uIHV0aWxpdGllcy5cbiAqL1xuXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGV4dG5hbWVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBvbmVPZiB9IGZyb20gJy4uL3JlZy1leHAudHMnO1xuXG4vKipcbiAqIEhvbGRzIGEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgLyoqXG4gICAqIEEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZGF0aW9uIG1lc3NhZ2UgaG9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB7XG4gIHJldHVybiAodmFsdWUgYXMgUGFydGlhbDxWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcj4pLnZhbGlkYXRpb25NZXNzYWdlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzIHdpdGhpbiBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX1VOU0FGRV9GSUxFTkFNRV9DSEFSUyA9IC9bI15bXFxdfF0vZztcblxuLyoqXG4gKiBXaW5kb3dzLXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgV0lORE9XU19VTlNBRkVfUEFUSF9DSEFSUyA9IC9bKlxcXFwvPD46fD9cIl0vZztcblxuLyoqXG4gKiBVbml4LXNwZWNpZmljIHVuc2FmZSBmaWxlIG5hbWUgcGF0aCBjaGFyYWN0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgVU5JWF9VTlNBRkVfUEFUSF9DSEFSUyA9IC9bXFwwL10vZztcblxuLyoqXG4gKiBUaGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHN0aWxsIHJlZnVzZXMgYXMgYSBmaWxlIG5hbWUsIHdpdGggb3Igd2l0aG91dCBhbiBleHRlbnNpb24uXG4gKlxuICogYENPTklOJGAgLyBgQ09OT1VUJGAgYW5kIHRoZSBzdXBlcnNjcmlwdCBgQ09NXHUwMEIyYCBmb3JtcyBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudDogdGhleSBhcmUgYWNjZXB0ZWQgYnlcbiAqIGV2ZXJ5IFdpbmRvd3MgdmVyc2lvbiB0aGF0IHJ1bnMgT2JzaWRpYW4sIGFuZCBtYXRjaGluZyB0aGVtIHdvdWxkIHJlbmFtZSBmaWxlcyB0aGF0IHdvcmsuXG4gKlxuICogVW5saWtlIHRoZSBleHBvcnRlZCBjaGFyYWN0ZXIgc2V0cyBhYm92ZSwgdGhpcyBjYXJyaWVzIG5vIGBnYCBmbGFnLCBzbyBgdGVzdGAgbWF5IGJlIGNhbGxlZCBvbiBpdFxuICogcmVwZWF0ZWRseSBcdTIwMTQgYSBgZ2AtZmxhZ2dlZCByZWdleHAgYWR2YW5jZXMgYGxhc3RJbmRleGAgYW5kIGFuc3dlcnMgZGlmZmVyZW50bHkgb24gY29uc2VjdXRpdmUgY2FsbHMuXG4gKi9cbmNvbnN0IFdJTkRPV1NfUkVTRVJWRURfTkFNRV9SRUdfRVhQID0gL14oPzpBVVh8Q09NWzEtOV18Q09OfExQVFsxLTldfE5VTHxQUk4pJC9pO1xuXG4vKipcbiAqIFRoZSB0cmFpbGluZyBkb3RzIGFuZCBzcGFjZXMgV2luZG93cyBzdHJpcHMgZnJvbSBhIG5hbWUgYmVmb3JlIGl0IGRvZXMgYW55dGhpbmcgZWxzZSB3aXRoIGl0LlxuICovXG5jb25zdCBXSU5ET1dTX1RSQUlMSU5HX0NIQVJTX1JFR19FWFAgPSAvWyAuXSskLztcblxuLyoqXG4gKiBSZXR1cm5zIGEgcmVnZXhwIG1hdGNoaW5nIGFsbCB1bnNhZmUgY2hhcmFjdGVycyBpbiBmaWxlIG5hbWVzL3BhdGhzLlxuICpcbiAqIEluY2x1ZGVzIGJvdGggT1Mtc3BlY2lmaWMgcmVzdHJpY3Rpb25zIGFuZCBPYnNpZGlhbi1zcGVjaWZpYyBvbmVzLlxuICpcbiAqIEBwYXJhbSBpc1dpbmRvd3MgLSBXaGV0aGVyIHRvIGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyByZXN0cmljdGlvbnMuIERlZmF1bHRzIHRvIGBQbGF0Zm9ybS5pc1dpbmAuXG4gKiBAcmV0dXJucyBBIHJlZ2V4cCBtYXRjaGluZyBhbGwgdW5zYWZlIGNoYXJhY3RlcnMgaW4gZmlsZSBuYW1lcy9wYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9zQW5kT2JzaWRpYW5VbnNhZmVQYXRoQ2hhcnNSZWdFeHAoaXNXaW5kb3dzPzogYm9vbGVhbik6IFJlZ0V4cCB7XG4gIHJldHVybiBvbmVPZihbXG4gICAgZ2V0T3NVbnNhZmVQYXRoQ2hhcnNSZWdFeHAoaXNXaW5kb3dzKSxcbiAgICBPQlNJRElBTl9VTlNBRkVfRklMRU5BTUVfQ0hBUlNcbiAgXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJlZ2V4cCBtYXRjaGluZyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBzYWZlIHRvIHVzZSBpbiBmaWxlIG5hbWVzL3BhdGhzIGF0IHRoZSBPUyBsZXZlbC5cbiAqXG4gKiBAcGFyYW0gaXNXaW5kb3dzIC0gV2hldGhlciB0byBpbmNsdWRlIFdpbmRvd3Mtc3BlY2lmaWMgcmVzdHJpY3Rpb25zLiBEZWZhdWx0cyB0byBgUGxhdGZvcm0uaXNXaW5gLlxuICogQHJldHVybnMgQSByZWdleHAgbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IGFyZSBub3Qgc2FmZSB0byB1c2UgaW4gZmlsZSBuYW1lcy9wYXRocyBhdCB0aGUgT1MgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPc1Vuc2FmZVBhdGhDaGFyc1JlZ0V4cChpc1dpbmRvd3M/OiBib29sZWFuKTogUmVnRXhwIHtcbiAgaXNXaW5kb3dzID8/PSBQbGF0Zm9ybS5pc1dpbjtcbiAgcmV0dXJuIGlzV2luZG93cyA/IFdJTkRPV1NfVU5TQUZFX1BBVEhfQ0hBUlMgOiBVTklYX1VOU0FGRV9QQVRIX0NIQVJTO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbmFtZSBlbmRzIHdpdGggdGhlIGRvdHMgb3Igc3BhY2VzIFdpbmRvd3MgcmVmdXNlcy5cbiAqXG4gKiBBbnN3ZXJzIGZvciBXaW5kb3dzIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtIGluIHVzZTogYSB2YXVsdCBpcyBzeW5jZWQsIHNvIHRoZSBydWxlcyB0aGF0IG1hdHRlciBhcmVcbiAqIG5vdCBuZWNlc3NhcmlseSB0aG9zZSBvZiB0aGUgbWFjaGluZSBhc2tpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byBjaGVjay4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCBub3QgYSBwYXRoLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIGRvdCBvciBhIHNwYWNlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpbmRvd3NUcmFpbGluZ0NoYXJzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gV0lORE9XU19UUkFJTElOR19DSEFSU19SRUdfRVhQLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBuYW1lIGlzIG9uZSBvZiB0aGUgTVMtRE9TIGRldmljZSBuYW1lcyBXaW5kb3dzIHJlZnVzZXMuXG4gKlxuICogVHdvIHN0ZXBzIHRoZSBjYWxsZXIgd291bGQgb3RoZXJ3aXNlIGhhdmUgdG8ga25vdyBhYm91dCBoYXBwZW4gaGVyZTogdHJhaWxpbmcgZG90cyBhbmQgc3BhY2VzIGFyZVxuICogdHJpbW1lZCBCRUZPUkUgdGhlIHRlc3QsIGJlY2F1c2UgV2luZG93cyBzdHJpcHMgdGhlbSBiZWZvcmUgZGVjaWRpbmcgYW5kIGBDT04gYCBpcyB0aGVyZWZvcmUgYXNcbiAqIHJlc2VydmVkIGFzIGBDT05gOyBhbmQgdGhlIGV4dGVuc2lvbiBpcyBkcm9wcGVkLCBiZWNhdXNlIGBDT04ubWRgIGlzIHJlc2VydmVkIHRvby5cbiAqXG4gKiBgQ09OSU4kYCAvIGBDT05PVVQkYCBhbmQgdGhlIHN1cGVyc2NyaXB0IGBDT01cdTAwQjJgIGZvcm1zIGFyZSBkZWxpYmVyYXRlbHkgTk9UIHJlc2VydmVkOiB0aGV5IGFyZSBhY2NlcHRlZFxuICogYnkgZXZlcnkgV2luZG93cyB2ZXJzaW9uIHRoYXQgcnVucyBPYnNpZGlhbiwgYW5kIG1hdGNoaW5nIHRoZW0gd291bGQgcmVuYW1lIGZpbGVzIHRoYXQgd29yay5cbiAqXG4gKiBBbnN3ZXJzIGZvciBXaW5kb3dzIHJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtIGluIHVzZTogYSB2YXVsdCBpcyBzeW5jZWQsIHNvIHRoZSBydWxlcyB0aGF0IG1hdHRlciBhcmVcbiAqIG5vdCBuZWNlc3NhcmlseSB0aG9zZSBvZiB0aGUgbWFjaGluZSBhc2tpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSB0byBjaGVjay4gQSBzaW5nbGUgcGF0aCBzZWdtZW50LCB3aXRoIG9yIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbmFtZSBpcyByZXNlcnZlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvd3NSZXNlcnZlZE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRyaW1tZWROYW1lID0gdHJpbVdpbmRvd3NUcmFpbGluZ0NoYXJzKG5hbWUpO1xuICByZXR1cm4gV0lORE9XU19SRVNFUlZFRF9OQU1FX1JFR19FWFAudGVzdChiYXNlbmFtZSh0cmltbWVkTmFtZSwgZXh0bmFtZSh0cmltbWVkTmFtZSkpKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSB0cmFpbGluZyBkb3RzIGFuZCBzcGFjZXMgV2luZG93cyByZWZ1c2VzIGZyb20gdGhlIGVuZCBvZiBhIG5hbWUuXG4gKlxuICogVHJpbSBiZWZvcmUgdGVzdGluZyBmb3IgYSByZXNlcnZlZCBuYW1lLCBuZXZlciBhZnRlcjogdHJpbW1pbmcgYWZ0ZXJ3YXJkcyB0dXJucyBhbiBhY2NlcHRlZCBgQ09OIGAgaW50b1xuICogYSByZWplY3RlZCBgQ09OYC4ge0BsaW5rIGlzV2luZG93c1Jlc2VydmVkTmFtZX0gYWxyZWFkeSBkb2VzIHRoaXMgaW50ZXJuYWxseS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIHRvIHRyaW0uIEEgc2luZ2xlIHBhdGggc2VnbWVudCwgbm90IGEgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lIHdpdGhvdXQgaXRzIHRyYWlsaW5nIGRvdHMgYW5kIHNwYWNlcywgd2hpY2ggbWF5IGJlIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVdpbmRvd3NUcmFpbGluZ0NoYXJzKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoV0lORE9XU19UUkFJTElOR19DSEFSU19SRUdfRVhQLCAnJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsU0FBUyxnQkFBZ0I7QUFFekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGFBQWE7QUFrQmYsU0FBUywwQkFBMEIsT0FBa0Q7QUFDMUYsU0FBUSxNQUEyQyxzQkFBc0I7QUFDM0U7QUFLTyxNQUFNLGlDQUFpQztBQUt2QyxNQUFNLDRCQUE0QjtBQUtsQyxNQUFNLHlCQUF5QjtBQVd0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlDQUFpQztBQVVoQyxTQUFTLHNDQUFzQyxXQUE2QjtBQUNqRixTQUFPLE1BQU07QUFBQSxJQUNYLDJCQUEyQixTQUFTO0FBQUEsSUFDcEM7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVFPLFNBQVMsMkJBQTJCLFdBQTZCO0FBQ3RFLGdCQUFjLFNBQVM7QUFDdkIsU0FBTyxZQUFZLDRCQUE0QjtBQUNqRDtBQVdPLFNBQVMsd0JBQXdCLE1BQXVCO0FBQzdELFNBQU8sK0JBQStCLEtBQUssSUFBSTtBQUNqRDtBQWtCTyxTQUFTLHNCQUFzQixNQUF1QjtBQUMzRCxRQUFNLGNBQWMseUJBQXlCLElBQUk7QUFDakQsU0FBTyw4QkFBOEIsS0FBSyxTQUFTLGFBQWEsUUFBUSxXQUFXLENBQUMsQ0FBQztBQUN2RjtBQVdPLFNBQVMseUJBQXlCLE1BQXNCO0FBQzdELFNBQU8sS0FBSyxRQUFRLGdDQUFnQyxFQUFFO0FBQ3hEOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -235,7 +235,14 @@ export interface ProcessParams extends ProcessOptions {
|
|
|
235
235
|
/**
|
|
236
236
|
* A value provider that returns the new content based on the old content of the file.
|
|
237
237
|
* It can be a string or a function that takes the old content as an argument and returns the new content.
|
|
238
|
-
*
|
|
238
|
+
*
|
|
239
|
+
* A function has three outcomes:
|
|
240
|
+
*
|
|
241
|
+
* - `null` — the new content cannot be produced YET; the process is retried.
|
|
242
|
+
* - the old content, returned unchanged — there is nothing to write; the process completes without
|
|
243
|
+
* touching the file. Use this for a refusal that is permanent, as returning `null` for one retries
|
|
244
|
+
* forever and holds the operation open.
|
|
245
|
+
* - any other string — the content to write.
|
|
239
246
|
*/
|
|
240
247
|
readonly newContentProvider: ValueProvider<null | string, ContentArguments>;
|
|
241
248
|
/**
|
|
@@ -434,6 +434,9 @@ async function process(params) {
|
|
|
434
434
|
if (newContent === null) {
|
|
435
435
|
return false;
|
|
436
436
|
}
|
|
437
|
+
if (newContent === oldContent) {
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
437
440
|
let isSuccess = true;
|
|
438
441
|
const result = await invokeFileActionSafe({
|
|
439
442
|
app,
|
|
@@ -594,4 +597,4 @@ export {
|
|
|
594
597
|
saveNote,
|
|
595
598
|
trashSafe
|
|
596
599
|
};
|
|
597
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIExpc3RlZEZpbGVzXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aCxcbiAgVmlld1R5cGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXRoT3JBYnN0cmFjdEZpbGUsXG4gIFBhdGhPckZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGFzRmlsZSxcbiAgYXNGb2xkZXIsXG4gIEZpbGVTeXN0ZW1UeXBlLFxuICBnZXRBYnN0cmFjdEZpbGUsXG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZVN5c3RlbVR5cGUsXG4gIGdldEZvbGRlcixcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBnZXRQYXRoLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2Yge0BsaW5rIGNyZWF0ZUZvbGRlclNhZmV9LlxuICovXG5leHBvcnQgZW51bSBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBDcmVhdGVkID0gJ2NyZWF0ZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHdhcyBub3QgY3JlYXRlZCBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKi9cbiAgTm90Q3JlYXRlZCA9ICdub3QtY3JlYXRlZCdcbn1cblxuLyoqXG4gKiBBIGJlaGF2aW9yIGZvciBoYW5kbGluZyBlbXB0eSBmb2xkZXJzIGR1cmluZyBjbGVhbnVwLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUZvbGRlckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBLZWVwID0gJ0tlZXAnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgaW52b2tlRmlsZUFjdGlvblNhZmV9LlxuICovXG5leHBvcnQgZW51bSBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdCB7XG4gIEludm9rZWQgPSAnaW52b2tlZCcsXG4gIE5vdEludm9rZWQgPSAnbm90LWludm9rZWQnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsZWFudXBFbXB0eUZvbGRlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsZWFudXBFbXB0eUZvbGRlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWhhdmlvciBkZXRlcm1pbmluZyBob3cgZW1wdHkgZm9sZGVycyBhcmUgY2xlYW5lZCB1cC5cbiAgICovXG4gIHJlYWRvbmx5IGVtcHR5Rm9sZGVyQmVoYXZpb3I6IEVtcHR5Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgZm9sZGVycyB0byBjbGVhbiB1cCB3aGVuIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyUGF0aHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBmb3Ige0BsaW5rIHByb2Nlc3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRBcmd1bWVudHMge1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcHlTYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gY29weSB0aGUgZmlsZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gY29weS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBYnN0cmFjdEZpbGVQYXRoU2FmZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0U2FmZVJlbmFtZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFNhZmVSZW5hbWVQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBhYnN0cmFjdCBmaWxlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gICAqL1xuICByZWFkb25seSBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZva2VXaXRoRmlsZVN5c3RlbUxvY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gICAqL1xuICAkZnVuY3Rpb24odGhpczogdm9pZCwgY29udGVudDogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jayBvZi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzQ2hpbGRPclNlbGZ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ2hpbGRPclNlbGZQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIGNoaWxkIG9yIHNlbGYuXG4gICAqL1xuICByZWFkb25seSBjaGlsZFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjayB3aGV0aGVyIGl0IGlzIGEgcGFyZW50IG9yIHNlbGYuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzQ2hpbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ2hpbGRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIGNoaWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hpbGRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIHBhcmVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogUGx1Z2luIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byBzaG93IHRoZSB0aW1lb3V0IG5vdGljZS4gV2hlbiBgbnVsbGAsIG5vIHRpbWVvdXQgbm90aWNlIGlzIHNob3duXG4gICAqIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIFByb2Nlc3NPcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlfTsgdGhlIHRpbWVvdXQgaXMgb25seSBsb2dnZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFuIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgZmlsZSdzIGVkaXRvciByZWFkLW9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZlxuICAgKiBwcm9jZXNzaW5nLiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCwgc28gaXQgY29tcG9zZXMgd2l0aCBhbnkgb3V0ZXIgb3BlcmF0aW9uLWxldmVsIGxvY2tcbiAgICogb24gdGhlIHNhbWUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1BhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSwgdHlwaWNhbGx5IHVzZWQgZm9yIGFjY2Vzc2luZyB0aGUgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB2YWx1ZSBwcm92aWRlciB0aGF0IHJldHVybnMgdGhlIG5ldyBjb250ZW50IGJhc2VkIG9uIHRoZSBvbGQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb2xkIGNvbnRlbnQgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyBjb250ZW50LlxuICAgKiBJZiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgc2hvdWxkIHJldHVybiBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgc2hvdWxkIGJlIHJldHJpZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdDb250ZW50UHJvdmlkZXI6IFZhbHVlUHJvdmlkZXI8bnVsbCB8IHN0cmluZywgQ29udGVudEFyZ3VtZW50cz47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLiBJdCBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIG9yIGEgZmlsZSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZW5hbWVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVTYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBmaWxlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gICAqL1xuICByZWFkb25seSBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuaW50ZXJmYWNlIEludm9rZUZpbGVBY3Rpb25TYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFjdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGZpbGVBY3Rpb24odGhpczogdm9pZCwgZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIGVtcHR5IGZvbGRlcnMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgRW1wdHlGb2xkZXJCZWhhdmlvcn0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjbGVhbmluZyB1cCBlbXB0eSBmb2xkZXJzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGVhbnVwIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEVtcHR5Rm9sZGVycyhwYXJhbXM6IENsZWFudXBFbXB0eUZvbGRlcnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBlbXB0eUZvbGRlckJlaGF2aW9yLFxuICAgIGZvbGRlclBhdGhzXG4gIH0gPSBwYXJhbXM7XG4gIGZvciAoY29uc3QgZm9sZGVyUGF0aCBvZiBmb2xkZXJQYXRocykge1xuICAgIHN3aXRjaCAoZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLkRlbGV0ZToge1xuICAgICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIGZvbGRlclBhdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRW1wdHlGb2xkZXJCZWhhdmlvci5EZWxldGVXaXRoRW1wdHlQYXJlbnRzOiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcCwgZm9sZGVyUGF0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXA6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGFzc2VydE5ldmVyKGVtcHR5Rm9sZGVyQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyBhIGZpbGUgc2FmZWx5IGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNvcHlpbmcgdGhlIGZpbGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGF0aCBvZiB0aGUgY29waWVkIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5U2FmZShwYXJhbXM6IENvcHlTYWZlUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBuZXdQYXRoLFxuICAgIG9sZFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IG9sZFBhdGhPckZpbGUgfSk7XG5cbiAgaWYgKGZpbGUucGF0aCA9PT0gbmV3UGF0aCkge1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG5cbiAgY29uc3QgbmV3Rm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgobmV3UGF0aCk7XG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBuZXdGb2xkZXJQYXRoKTtcblxuICBjb25zdCBuZXdBdmFpbGFibGVQYXRoID0gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIG5ld1BhdGgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNvcHkoZmlsZSwgbmV3QXZhaWxhYmxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHtAbGluayBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0LkNyZWF0ZWR9IGlmIHRoZSBmb2xkZXIgd2FzXG4gKiBjcmVhdGVkLCBvciB7QGxpbmsgQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5Ob3RDcmVhdGVkfSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gKiBAdGhyb3dzIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgZm9sZGVyIGFuZCBpdCBzdGlsbCBkb2Vzbid0IGV4aXN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRm9sZGVyU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxDcmVhdGVGb2xkZXJTYWZlUmVzdWx0PiB7XG4gIGlmIChhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICByZXR1cm4gQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5Ob3RDcmVhdGVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKHBhdGgpO1xuICAgIHJldHVybiBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0LkNyZWF0ZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuQ3JlYXRlZDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgdmF1bHQgd2l0aCBwYXJlbnQgZm9sZGVycyBpZiBuZWVkZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlIGFuZCBhbGwgaXRzIGNyZWF0ZWQgcGFyZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRlbXBvcmFyeUZpbGUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIG5vb3BBc3luYztcbiAgfVxuXG4gIGNvbnN0IGZvbGRlckNsZWFudXAgPSBhd2FpdCBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgICAgYXdhaXQgdHJhc2hTYWZlKGFwcCwgZmlsZSk7XG4gICAgfVxuICAgIGF3YWl0IGZvbGRlckNsZWFudXAoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZvbGRlciBpbiB0aGUgdmF1bHQgd2l0aCBwYXJlbnQgZm9sZGVycyBpZiBuZWVkZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZvbGRlciBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBsZXQgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwLCBwYXRoT3JGb2xkZXI6IHBhdGggfSk7XG4gIGlmIChmb2xkZXIpIHtcbiAgICByZXR1cm4gbm9vcEFzeW5jO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgocGF0aCk7XG4gIGF3YWl0IGNyZWF0ZVRlbXBvcmFyeUZvbGRlcihhcHAsIGZvbGRlclBhdGgpO1xuXG4gIGNvbnN0IGZvbGRlckNsZWFudXAgPSBhd2FpdCBjcmVhdGVUZW1wb3JhcnlGb2xkZXIoYXBwLCBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpKTtcblxuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgcGF0aCk7XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmb2xkZXIgPSBnZXRGb2xkZXIoeyBhcHAsIHBhdGhPckZvbGRlcjogcGF0aCB9KTtcbiAgICBpZiAoIWZvbGRlci5kZWxldGVkKSB7XG4gICAgICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmb2xkZXIpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogRGVsZXRlcyBhbiBlbXB0eSBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgZm9sZGVyIHRvIGRlbGV0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZm9sZGVyIGlzIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVFbXB0eUZvbGRlcihhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBudWxsIHwgUGF0aE9yRm9sZGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgcGF0aE9yRm9sZGVyIH0pO1xuICBpZiAoIWZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWF3YWl0IGlzRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IHRyYXNoU2FmZShhcHAsIGZvbGRlcik7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBlbXB0eSBmb2xkZXIgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBmb2xkZXIgdG8gc3RhcnQgcmVtb3ZpbmcgZW1wdHkgaGllcmFyY2h5IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVtcHR5IGhpZXJhcmNoeSBpcyBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogbnVsbCB8IFBhdGhPckZvbGRlcik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwLCBwYXRoT3JGb2xkZXIgfSk7XG5cbiAgd2hpbGUgKGZvbGRlcikge1xuICAgIGlmICghYXdhaXQgaXNFbXB0eUZvbGRlcihhcHAsIGZvbGRlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZm9sZGVyLnBhcmVudDtcbiAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlcihhcHAsIGZvbGRlcik7XG4gICAgZm9sZGVyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcGF0aCBmb3IgYSBmaWxlIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdldHRpbmcgYSBzYWZlIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZShwYXJhbXM6IEdldEFic3RyYWN0RmlsZVBhdGhTYWZlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoLFxuICAgIHR5cGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuXG4gIGlmIChhYnN0cmFjdEZpbGUgJiYgZ2V0RmlsZVN5c3RlbVR5cGUoYWJzdHJhY3RGaWxlKSA9PT0gdHlwZSkge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgcmV0dXJuIGdldEF2YWlsYWJsZVBhdGgoYXBwLCBwYXRoKTtcbn1cblxuLyoqXG4gKiBHZXRzIGFuIGF2YWlsYWJsZSBwYXRoIGZvciBhIGZpbGUgaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGdldCBhbiBhdmFpbGFibGUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgYXZhaWxhYmxlIHBhdGggZm9yIHRoZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShwYXRoKTtcbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlybmFtZShwYXRoKSwgYmFzZW5hbWUocGF0aCwgZXh0ZW5zaW9uKSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgZmlsZSBwYXRoIGZvciBhIGZpbGUgb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGZvbGRlciB0byBnZXQgYSBzYWZlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIHNhZmUgcGF0aCBmb3IgdGhlIGZpbGUgb3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZVBhdGhTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0QWJzdHJhY3RGaWxlUGF0aFNhZmUoeyBhcHAsIHBhdGgsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlLkZpbGUgfSk7XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgZm9sZGVyIHBhdGggZm9yIGEgZmlsZSBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJQYXRoU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKHsgYXBwLCBwYXRoLCB0eXBlOiBGaWxlU3lzdGVtVHlwZS5Gb2xkZXIgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIGZyb20gdGhlIGFwcCdzIHZhdWx0IGFuZCBzb3J0cyB0aGVtIGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyIGZpbGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIE1hcmtkb3duIGZpbGVzIHNvcnRlZCBieSBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrZG93bkZpbGVzU29ydGVkKGFwcDogQXBwKTogVEZpbGVbXSB7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBpbiB0aGUgdmF1bHQgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdGVGaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCkuZmlsdGVyKChmaWxlKSA9PiBpc0ZpbGUoZmlsZSkgJiYgaXNOb3RlKGZpbGUpKS5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKSBhcyBURmlsZVtdO1xufVxuXG4vKipcbiAqIEdldHMgb3IgY3JlYXRlcyBhbiBhYnN0cmFjdCBmaWxlIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdldHRpbmcgb3IgY3JlYXRpbmcgdGhlIGFic3RyYWN0IGZpbGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlKHBhcmFtczogR2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlUGFyYW1zKTogUHJvbWlzZTxUQWJzdHJhY3RGaWxlPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgdHlwZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBwYXRoIH0gPSBwYXJhbXM7XG4gIHBhdGggPSBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZSh7IGFwcCwgcGF0aCwgdHlwZSB9KTtcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICBpZiAoYWJzdHJhY3RGaWxlKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0RmlsZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRmlsZVN5c3RlbVR5cGUuRmlsZToge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICAgIH1cbiAgICBjYXNlIEZpbGVTeXN0ZW1UeXBlLkZvbGRlcjoge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIocGF0aCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldHMgb3IgY3JlYXRlcyBhIGZpbGUgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGaWxlU2FmZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICByZXR1cm4gYXNGaWxlKGF3YWl0IGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZSh7IGFwcCwgcGF0aCwgdHlwZTogRmlsZVN5c3RlbVR5cGUuRmlsZSB9KSk7XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGEgZm9sZGVyIHNhZmVseSBpbiB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogSWYgdGhlIGZvbGRlciBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBnZXQgb3IgY3JlYXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGb2xkZXI+IHtcbiAgcmV0dXJuIGFzRm9sZGVyKGF3YWl0IGdldE9yQ3JlYXRlQWJzdHJhY3RGaWxlU2FmZSh7IGFwcCwgcGF0aCwgdHlwZTogRmlsZVN5c3RlbVR5cGUuRm9sZGVyIH0pKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSByZW5hbWUgcGF0aCBmb3IgYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2V0dGluZyBhIHNhZmUgcmVuYW1lIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgc2FmZSByZW5hbWUgcGF0aCBmb3IgdGhlIGFic3RyYWN0IGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlUmVuYW1lUGF0aChwYXJhbXM6IEdldFNhZmVSZW5hbWVQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIG9sZFBhdGhPckFic3RyYWN0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBuZXdQYXRoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9sZFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlKTtcblxuICBpZiAoZ2V0RGF0YUFkYXB0ZXJFeChhcHApLmluc2Vuc2l0aXZlKSB7XG4gICAgbGV0IGZvbGRlclBhdGggPSBkaXJuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBub25FeGlzdGluZ1BhdGggPSBiYXNlbmFtZShuZXdQYXRoKTtcbiAgICBsZXQgZm9sZGVyOiBudWxsIHwgVEZvbGRlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBUaGVyZSBpcyBubyBlbGVnYW50IHdheSB0byBwZXJmb3JtIGluZmluaXRlIGxvb3BzLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHAsIGlzQ2FzZUluc2Vuc2l0aXZlOiB0cnVlLCBwYXRoT3JGb2xkZXI6IGZvbGRlclBhdGggfSk7XG4gICAgICBpZiAoZm9sZGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbm9uRXhpc3RpbmdQYXRoID0gam9pbihiYXNlbmFtZShmb2xkZXJQYXRoKSwgbm9uRXhpc3RpbmdQYXRoKTtcbiAgICAgIGZvbGRlclBhdGggPSBkaXJuYW1lKGZvbGRlclBhdGgpO1xuICAgIH1cbiAgICBuZXdQYXRoID0gam9pbihmb2xkZXIuZ2V0UGFyZW50UHJlZml4KCksIG5vbkV4aXN0aW5nUGF0aCk7XG4gIH1cblxuICBpZiAob2xkUGF0aC50b0xvd2VyQ2FzZSgpID09PSBuZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuXG4gIHJldHVybiBnZXRBdmFpbGFibGVQYXRoKGFwcCwgbmV3UGF0aCk7XG59XG5cbi8qKlxuICogSW52b2tlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIGZpbGUgc3lzdGVtIGxvY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBpbnZva2luZyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludm9rZVdpdGhGaWxlU3lzdGVtTG9jayhwYXJhbXM6IEludm9rZVdpdGhGaWxlU3lzdGVtTG9ja1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgJGZ1bmN0aW9uLFxuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhmaWxlLCAoY29udGVudCkgPT4ge1xuICAgICRmdW5jdGlvbihjb250ZW50KTtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb2YgYW5vdGhlciBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBjaGlsZCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IHBhdGggb3IgZmlsZS5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNoaWxkIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgcGF0aCBvciBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaGlsZChwYXJhbXM6IElzQ2hpbGRQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjaGlsZFBhdGhPckZpbGUsXG4gICAgcGFyZW50UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBjaGlsZFBhdGggPSBnZXRQYXRoKGFwcCwgY2hpbGRQYXRoT3JGaWxlKTtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhdGgoYXBwLCBwYXJlbnRQYXRoT3JGaWxlKTtcblxuICBpZiAoY2hpbGRQYXRoID09PSBwYXJlbnRQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhcmVudFBhdGggPT09ICcvJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkUGF0aC5zdGFydHNXaXRoKGAke3BhcmVudFBhdGh9L2ApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9yIHNlbGYgb2YgYW5vdGhlciBwYXRoIG9yIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBjaGlsZCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvciBzZWxmIG9mIHRoZSBwYXJlbnQgcGF0aCBvciBmaWxlLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2hpbGQgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb3Igc2VsZiBvZiB0aGUgcGFyZW50IHBhdGggb3IgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRPclNlbGYocGFyYW1zOiBJc0NoaWxkT3JTZWxmUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY2hpbGRQYXRoT3JGaWxlLFxuICAgIHBhcmVudFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgY2hpbGRQYXRoID0gZ2V0UGF0aChhcHAsIGNoaWxkUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHBhcmVudFBhdGggPSBnZXRQYXRoKGFwcCwgcGFyZW50UGF0aE9yRmlsZSk7XG4gIHJldHVybiBjaGlsZFBhdGggPT09IHBhcmVudFBhdGggfHwgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlLCBwYXJlbnRQYXRoT3JGaWxlIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZvbGRlciBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBwYXRoIG9yIGZvbGRlciB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9sZGVyIGlzIGVtcHR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNFbXB0eUZvbGRlcihhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbGlzdGVkRmlsZXMgPSBhd2FpdCBsaXN0U2FmZShhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGb2xkZXIpKTtcbiAgcmV0dXJuIGxpc3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMCAmJiBsaXN0ZWRGaWxlcy5mb2xkZXJzLmxlbmd0aCA9PT0gMDtcbn1cblxuLyoqXG4gKiBTYWZlbHkgbGlzdHMgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gbGlzdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgTGlzdGVkRmlsZXN9IG9iamVjdCBjb250YWluaW5nIHRoZSBsaXN0ZWQgZmlsZXMgYW5kIGZvbGRlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2FmZShhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPExpc3RlZEZpbGVzPiB7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRm9sZGVyKTtcbiAgY29uc3QgRU1QVFkgPSB7IGZpbGVzOiBbXSwgZm9sZGVyczogW10gfTtcblxuICBjb25zdCBwYXRoU3RhdHMgPSBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpO1xuICBpZiAocGF0aFN0YXRzPy50eXBlICE9PSAnZm9sZGVyJykge1xuICAgIHJldHVybiBFTVBUWTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmxpc3QocGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBmaWxlIHdpdGggcmV0cnkgbG9naWMsIHVwZGF0aW5nIGl0cyBjb250ZW50IGJhc2VkIG9uIGEgcHJvdmlkZWQgdmFsdWUgb3IgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwcm9jZXNzaW5nIHRoZSBmaWxlLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHByb2Nlc3MgZmFpbHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmV0cmllcyBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2VzcyhwYXJhbXM6IFByb2Nlc3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBuZXdDb250ZW50UHJvdmlkZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogdHJ1ZSxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBEZWZhdWx0IHZhbHVlLlxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNTAwXG4gIH07XG4gIGNvbnN0IGZ1bGxPcHRpb25zID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLnBhcmFtcyB9O1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIC8vIFJlZmVyZW5jZS1jb3VudGVkIGxvY2s7IGNvbXBvc2VzIHdpdGggYW55IG91dGVyIGxvY2suIFJlbGVhc2VkIGF0IGZ1bmN0aW9uIHNjb3BlIGV4aXQuXG4gIHVzaW5nIF9sb2NrID0gcmVzb3VyY2VMb2NrQ29tcG9uZW50Py5sb2NrRm9yUGF0aCh7IG9wZXJhdGlvbk5hbWU6ICdQcm9jZXNzIG5vdGUnLCBwYXRoT3JGaWxlIH0pO1xuXG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXROb3RpY2Uoe1xuICAgIGFzeW5jIG9wZXJhdGlvbkZ1bmN0aW9uKGFib3J0U2lnbmFsKSB7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgcmVhZFNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzaG91bGRUcmVhdE1pc3NpbmdGaWxlQXNTdWNjZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUobmV3Q29udGVudFByb3ZpZGVyLCB7IGFib3J0U2lnbmFsLCBjb250ZW50OiBvbGRDb250ZW50IH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgaWYgKG5ld0NvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTdWNjZXNzID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGludm9rZUZpbGVBY3Rpb25TYWZlKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBhc3luYyBmaWxlQWN0aW9uKGZpbGUpIHtcbiAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIGF3YWl0IGFwcC52YXVsdC5wcm9jZXNzKGZpbGUsIChjb250ZW50KSA9PiB7XG4gICAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1ZhdWx0OnByb2Nlc3MnKSgnQ29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgcmVhZC4gUmV0cnlpbmcuLi4nLCB7XG4gICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudDogY29udGVudCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZENvbnRlbnQ6IG9sZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcGF0aDogZmlsZS5wYXRoXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcGF0aE9yRmlsZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0Lk5vdEludm9rZWQpIHtcbiAgICAgICAgcmV0dXJuIHNob3VsZFRyZWF0TWlzc2luZ0ZpbGVBc1N1Y2Nlc3MoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzU3VjY2VzcztcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIENsb3NlcyBvdmVyIGBmdWxsT3B0aW9uc2AgYW5kIGBwYXRoYCBmcm9tIHRoZSBlbmNsb3Npbmcgc2NvcGUsIHNvIGl0IGNhbm5vdCBiZSBob2lzdGVkLlxuICAgICAgZnVuY3Rpb24gc2hvdWxkVHJlYXRNaXNzaW5nRmlsZUFzU3VjY2VzcygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGZ1bGxPcHRpb25zLnNob3VsZEZhaWxPbk1pc3NpbmdGaWxlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICcke3BhdGh9JyBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy52YXVsdC5wcm9jZXNzRmlsZSwgeyBmaWxlUGF0aDogcGF0aCB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcmV0cnlPcHRpb25zOiBmdWxsT3B0aW9ucyxcbiAgICBzaG91bGRTaG93VGltZW91dE5vdGljZTogZnVsbE9wdGlvbnMuc2hvdWxkU2hvd1RpbWVvdXROb3RpY2VcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIHNhZmVseSBmcm9tIHRoZSB2YXVsdC5cbiAqXG4gKiBJdCBjb3ZlcnMgdGhlIGNhc2Ugd2hlbiB0aGUgZmlsZSB3YXMgcmVtb3ZlZCBkdXJpbmcgdGhlIHJlYWRpbmcuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZWFkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBvciBgbnVsbGAgaWYgdGhlIGZpbGUgaXMgbWlzc2luZyBvciBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgbGV0IGNvbnRlbnQ6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBhd2FpdCBpbnZva2VGaWxlQWN0aW9uU2FmZSh7XG4gICAgYXBwLFxuICAgIGFzeW5jIGZpbGVBY3Rpb24oZmlsZSkge1xuICAgICAgYXdhaXQgc2F2ZU5vdGUoYXBwLCBmaWxlKTtcbiAgICAgIGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGVcbiAgfSk7XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFJlbmFtZXMgYSBmaWxlIHNhZmVseSBpbiB0aGUgdmF1bHQuXG4gKiBJZiB0aGUgbmV3IHBhdGggYWxyZWFkeSBleGlzdHMsIHRoZSBmaWxlIHdpbGwgYmUgcmVuYW1lZCB0byBhbiBhdmFpbGFibGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmFtaW5nIHRoZSBmaWxlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHBhdGggb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVTYWZlKHBhcmFtczogUmVuYW1lU2FmZVBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbmV3UGF0aCxcbiAgICBvbGRQYXRoT3JBYnN0cmFjdEZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3Qgb2xkQWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgfSk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKHsgYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGUgfSk7XG5cbiAgaWYgKG9sZEFic3RyYWN0RmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkgPT09IG5ld0F2YWlsYWJsZVBhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIGlmIChvbGRBYnN0cmFjdEZpbGUucGF0aCAhPT0gbmV3UGF0aCkge1xuICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUob2xkQWJzdHJhY3RGaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0F2YWlsYWJsZVBhdGg7XG4gIH1cblxuICBjb25zdCBuZXdGb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChuZXdBdmFpbGFibGVQYXRoKTtcbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIG5ld0ZvbGRlclBhdGgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUob2xkQWJzdHJhY3RGaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMobmV3QXZhaWxhYmxlUGF0aCkgfHwgYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhvbGRBYnN0cmFjdEZpbGUucGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xufVxuXG4vKipcbiAqIFNhdmVzIHRoZSBzcGVjaWZpZWQgbm90ZSBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgbm90ZSB0byBiZSBzYXZlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbm90ZSBpcyBzYXZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuXG4gIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICBpZiAobGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYudmlldy5maWxlPy5wYXRoID09PSBwYXRoICYmIGxlYWYudmlldy5kaXJ0eSkge1xuICAgICAgYXdhaXQgbGVhZi52aWV3LnNhdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFzaGVzIGFuIGFic3RyYWN0IGZpbGUgc2FmZWx5IGZyb20gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gdHJhc2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgaXMgdHJhc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYXNoU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gIGlmICghZmlsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShmaWxlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhmaWxlLnBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignVmF1bHQ6dHJhc2hTYWZlJykoYEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyYXNoaW5nICR7ZmlsZS5wYXRofSwgYnV0IHRoZSBmaWxlIG5vIGxvbmdlciBleGlzdHMuYCwgeyBlcnJvciwgcGF0aDogZmlsZS5wYXRoIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGludm9rZUZpbGVBY3Rpb25TYWZlKHBhcmFtczogSW52b2tlRmlsZUFjdGlvblNhZmVQYXJhbXMpOiBQcm9taXNlPEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZmlsZUFjdGlvbixcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgIHJldHVybiBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdC5Ob3RJbnZva2VkO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZmlsZUFjdGlvbihmaWxlKTtcbiAgICByZXR1cm4gSW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQuSW52b2tlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgICBpZiAoIWZpbGUgfHwgZmlsZS5kZWxldGVkKSB7XG4gICAgICByZXR1cm4gSW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQuTm90SW52b2tlZDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBWVAsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsOEJBQThCO0FBQ3ZDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBS1gsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFJTCxFQUFBQSx3QkFBQSxhQUFVO0FBS1YsRUFBQUEsd0JBQUEsZ0JBQWE7QUFUSCxTQUFBQTtBQUFBLEdBQUE7QUFlTCxJQUFLLHNCQUFMLGtCQUFLQyx5QkFBTDtBQUlMLEVBQUFBLHFCQUFBLFlBQVM7QUFLVCxFQUFBQSxxQkFBQSw0QkFBeUI7QUFLekIsRUFBQUEscUJBQUEsVUFBTztBQWRHLFNBQUFBO0FBQUEsR0FBQTtBQW9CTCxJQUFLLDZCQUFMLGtCQUFLQyxnQ0FBTDtBQUNMLEVBQUFBLDRCQUFBLGFBQVU7QUFDVixFQUFBQSw0QkFBQSxnQkFBYTtBQUZILFNBQUFBO0FBQUEsR0FBQTtBQXFSWixlQUFzQixvQkFBb0IsUUFBa0Q7QUFDMUYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLGFBQVcsY0FBYyxhQUFhO0FBQ3BDLFlBQVEscUJBQXFCO0FBQUEsTUFDM0IsS0FBSyx1QkFBNEI7QUFDL0IsY0FBTSxrQkFBa0IsS0FBSyxVQUFVO0FBQ3ZDO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyx1REFBNEM7QUFDL0MsY0FBTSwyQkFBMkIsS0FBSyxVQUFVO0FBQ2hEO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxtQkFBMEI7QUFDN0I7QUFBQSxNQUNGO0FBQUEsTUFDQSxTQUFTO0FBQ1Asb0JBQVksbUJBQW1CO0FBQUEsTUFDakM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBUUEsZUFBc0IsU0FBUyxRQUF5QztBQUN0RSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxPQUFPLFFBQVEsRUFBRSxLQUFLLFlBQVksY0FBYyxDQUFDO0FBRXZELE1BQUksS0FBSyxTQUFTLFNBQVM7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGdCQUFnQixpQkFBaUIsT0FBTztBQUM5QyxRQUFNLGlCQUFpQixLQUFLLGFBQWE7QUFFekMsUUFBTSxtQkFBbUIsaUJBQWlCLEtBQUssT0FBTztBQUV0RCxNQUFJO0FBQ0YsVUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLGdCQUFnQjtBQUFBLEVBQzdDLFNBQVMsT0FBTztBQUNkLFFBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxPQUFPLGdCQUFnQixHQUFHO0FBQzdDLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVdBLGVBQXNCLGlCQUFpQixLQUFVLE1BQStDO0FBQzlGLE1BQUksTUFBTSxJQUFJLE1BQU0sUUFBUSxPQUFPLElBQUksR0FBRztBQUN4QyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDRixVQUFNLElBQUksTUFBTSxhQUFhLElBQUk7QUFDakMsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBQ2QsUUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLE9BQU8sSUFBSSxHQUFHO0FBQ2pDLFlBQU07QUFBQSxJQUNSO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVNBLGVBQXNCLG9CQUFvQixLQUFVLE1BQTRDO0FBQzlGLE1BQUksT0FBTyxjQUFjLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQztBQUNsRCxNQUFJLE1BQU07QUFDUixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sZ0JBQWdCLE1BQU0sc0JBQXNCLEtBQUssaUJBQWlCLElBQUksQ0FBQztBQUU3RSxNQUFJO0FBQ0YsVUFBTSxJQUFJLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFBQSxFQUNqQyxTQUFTLE9BQU87QUFDZCxRQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sT0FBTyxJQUFJLEdBQUc7QUFDakMsWUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBRUEsU0FBTyxZQUFZO0FBQ2pCLFdBQU8sUUFBUSxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUM7QUFDeEMsUUFBSSxDQUFDLEtBQUssU0FBUztBQUNqQixZQUFNLFVBQVUsS0FBSyxJQUFJO0FBQUEsSUFDM0I7QUFDQSxVQUFNLGNBQWM7QUFBQSxFQUN0QjtBQUNGO0FBU0EsZUFBc0Isc0JBQXNCLEtBQVUsTUFBNEM7QUFDaEcsTUFBSSxTQUFTLGdCQUFnQixFQUFFLEtBQUssY0FBYyxLQUFLLENBQUM7QUFDeEQsTUFBSSxRQUFRO0FBQ1YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGFBQWEsaUJBQWlCLElBQUk7QUFDeEMsUUFBTSxzQkFBc0IsS0FBSyxVQUFVO0FBRTNDLFFBQU0sZ0JBQWdCLE1BQU0sc0JBQXNCLEtBQUssaUJBQWlCLElBQUksQ0FBQztBQUU3RSxRQUFNLGlCQUFpQixLQUFLLElBQUk7QUFFaEMsU0FBTyxZQUFZO0FBQ2pCLGFBQVMsVUFBVSxFQUFFLEtBQUssY0FBYyxLQUFLLENBQUM7QUFDOUMsUUFBSSxDQUFDLE9BQU8sU0FBUztBQUNuQixZQUFNLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFDN0I7QUFDQSxVQUFNLGNBQWM7QUFBQSxFQUN0QjtBQUNGO0FBU0EsZUFBc0Isa0JBQWtCLEtBQVUsY0FBa0Q7QUFDbEcsUUFBTSxTQUFTLGdCQUFnQixFQUFFLEtBQUssYUFBYSxDQUFDO0FBQ3BELE1BQUksQ0FBQyxRQUFRO0FBQ1g7QUFBQSxFQUNGO0FBQ0EsTUFBSSxDQUFDLE1BQU0sY0FBYyxLQUFLLE1BQU0sR0FBRztBQUNyQztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFVBQVUsS0FBSyxNQUFNO0FBQzdCO0FBU0EsZUFBc0IsMkJBQTJCLEtBQVUsY0FBa0Q7QUFDM0csTUFBSSxTQUFTLGdCQUFnQixFQUFFLEtBQUssYUFBYSxDQUFDO0FBRWxELFNBQU8sUUFBUTtBQUNiLFFBQUksQ0FBQyxNQUFNLGNBQWMsS0FBSyxNQUFNLEdBQUc7QUFDckM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxTQUFTLE9BQU87QUFDdEIsVUFBTSxrQkFBa0IsS0FBSyxNQUFNO0FBQ25DLGFBQVM7QUFBQSxFQUNYO0FBQ0Y7QUFRTyxTQUFTLHdCQUF3QixRQUErQztBQUNyRixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxlQUFlLHNCQUFzQixFQUFFLEtBQUssWUFBWSxLQUFLLENBQUM7QUFFcEUsTUFBSSxnQkFBZ0Isa0JBQWtCLFlBQVksTUFBTSxNQUFNO0FBQzVELFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxpQkFBaUIsS0FBSyxJQUFJO0FBQ25DO0FBU08sU0FBUyxpQkFBaUIsS0FBVSxNQUFzQjtBQUMvRCxRQUFNLFlBQVksUUFBUSxJQUFJO0FBQzlCLFNBQU8sSUFBSSxNQUFNLGlCQUFpQixLQUFLLFFBQVEsSUFBSSxHQUFHLFNBQVMsTUFBTSxTQUFTLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxDQUFDO0FBQ3RHO0FBU08sU0FBUyxnQkFBZ0IsS0FBVSxNQUFzQjtBQUM5RCxTQUFPLHdCQUF3QixFQUFFLEtBQUssTUFBTSxNQUFNLGVBQWUsS0FBSyxDQUFDO0FBQ3pFO0FBU08sU0FBUyxrQkFBa0IsS0FBVSxNQUFzQjtBQUNoRSxTQUFPLHdCQUF3QixFQUFFLEtBQUssTUFBTSxNQUFNLGVBQWUsT0FBTyxDQUFDO0FBQzNFO0FBUU8sU0FBUyx1QkFBdUIsS0FBbUI7QUFDeEQsU0FBTyxJQUFJLE1BQU0saUJBQWlCLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLElBQUksQ0FBQztBQUNqRjtBQVFPLFNBQVMsbUJBQW1CLEtBQW1CO0FBQ3BELFNBQU8sSUFBSSxNQUFNLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxTQUFTLE9BQU8sSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLElBQUksQ0FBQztBQUNqSTtBQVdBLGVBQXNCLDRCQUE0QixRQUFtRTtBQUNuSCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLEVBQUUsS0FBSyxJQUFJO0FBQ2YsU0FBTyx3QkFBd0IsRUFBRSxLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQ2xELFFBQU0sZUFBZSxzQkFBc0IsRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDO0FBQ3BFLE1BQUksY0FBYztBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUVBLFVBQVEsTUFBTTtBQUFBLElBQ1osS0FBSyxlQUFlLE1BQU07QUFDeEIsYUFBTyxNQUFNLElBQUksTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUFBLElBQ3hDO0FBQUEsSUFDQSxLQUFLLGVBQWUsUUFBUTtBQUMxQixhQUFPLE1BQU0sSUFBSSxNQUFNLGFBQWEsSUFBSTtBQUFBLElBQzFDO0FBQUEsSUFDQSxTQUFTO0FBQ1Asa0JBQVksSUFBSTtBQUFBLElBQ2xCO0FBQUEsRUFDRjtBQUNGO0FBWUEsZUFBc0Isb0JBQW9CLEtBQVUsTUFBOEI7QUFDaEYsU0FBTyxPQUFPLE1BQU0sNEJBQTRCLEVBQUUsS0FBSyxNQUFNLE1BQU0sZUFBZSxLQUFLLENBQUMsQ0FBQztBQUMzRjtBQVlBLGVBQXNCLHNCQUFzQixLQUFVLE1BQWdDO0FBQ3BGLFNBQU8sU0FBUyxNQUFNLDRCQUE0QixFQUFFLEtBQUssTUFBTSxNQUFNLGVBQWUsT0FBTyxDQUFDLENBQUM7QUFDL0Y7QUFRTyxTQUFTLGtCQUFrQixRQUF5QztBQUN6RSxRQUFNLEVBQUUsS0FBSyxzQkFBc0IsSUFBSTtBQUN2QyxNQUFJLEVBQUUsUUFBUSxJQUFJO0FBQ2xCLFFBQU0sVUFBVSxRQUFRLEtBQUsscUJBQXFCO0FBRWxELE1BQUksaUJBQWlCLEdBQUcsRUFBRSxhQUFhO0FBQ3JDLFFBQUksYUFBYSxRQUFRLE9BQU87QUFDaEMsUUFBSSxrQkFBa0IsU0FBUyxPQUFPO0FBQ3RDLFFBQUk7QUFFSixXQUFPLE1BQU07QUFDWCxlQUFTLGdCQUFnQixFQUFFLEtBQUssbUJBQW1CLE1BQU0sY0FBYyxXQUFXLENBQUM7QUFDbkYsVUFBSSxRQUFRO0FBQ1Y7QUFBQSxNQUNGO0FBQ0Esd0JBQWtCLEtBQUssU0FBUyxVQUFVLEdBQUcsZUFBZTtBQUM1RCxtQkFBYSxRQUFRLFVBQVU7QUFBQSxJQUNqQztBQUNBLGNBQVUsS0FBSyxPQUFPLGdCQUFnQixHQUFHLGVBQWU7QUFBQSxFQUMxRDtBQUVBLE1BQUksUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLEdBQUc7QUFDbkQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGlCQUFpQixLQUFLLE9BQU87QUFDdEM7QUFRQSxlQUFzQix5QkFBeUIsUUFBdUQ7QUFDcEcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sT0FBTyxRQUFRLEVBQUUsS0FBSyxXQUFXLENBQUM7QUFDeEMsUUFBTSxJQUFJLE1BQU0sUUFBUSxNQUFNLENBQUMsWUFBWTtBQUN6QyxjQUFVLE9BQU87QUFDakIsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIO0FBUU8sU0FBUyxRQUFRLFFBQWdDO0FBQ3RELFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLFlBQVksUUFBUSxLQUFLLGVBQWU7QUFDOUMsUUFBTSxhQUFhLFFBQVEsS0FBSyxnQkFBZ0I7QUFFaEQsTUFBSSxjQUFjLFlBQVk7QUFDNUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGVBQWUsS0FBSztBQUN0QixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sVUFBVSxXQUFXLEdBQUcsVUFBVSxHQUFHO0FBQzlDO0FBUU8sU0FBUyxjQUFjLFFBQXNDO0FBQ2xFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLFlBQVksUUFBUSxLQUFLLGVBQWU7QUFDOUMsUUFBTSxhQUFhLFFBQVEsS0FBSyxnQkFBZ0I7QUFDaEQsU0FBTyxjQUFjLGNBQWMsUUFBUSxFQUFFLEtBQUssaUJBQWlCLGlCQUFpQixDQUFDO0FBQ3ZGO0FBU0EsZUFBc0IsY0FBYyxLQUFVLGNBQThDO0FBQzFGLFFBQU0sY0FBYyxNQUFNLFNBQVMsS0FBSyxRQUFRLEtBQUssWUFBWSxDQUFDO0FBQ2xFLFNBQU8sWUFBWSxNQUFNLFdBQVcsS0FBSyxZQUFZLFFBQVEsV0FBVztBQUMxRTtBQVNBLGVBQXNCLFNBQVMsS0FBVSxjQUFrRDtBQUN6RixRQUFNLE9BQU8sUUFBUSxLQUFLLFlBQVk7QUFDdEMsUUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUU7QUFFdkMsUUFBTSxZQUFZLE1BQU0sSUFBSSxNQUFNLFFBQVEsS0FBSyxJQUFJO0FBQ25ELE1BQUksV0FBVyxTQUFTLFVBQVU7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0YsV0FBTyxNQUFNLElBQUksTUFBTSxRQUFRLEtBQUssSUFBSTtBQUFBLEVBQzFDLFNBQVMsT0FBTztBQUNkLFFBQUksTUFBTSxJQUFJLE1BQU0sT0FBTyxJQUFJLEdBQUc7QUFDaEMsWUFBTTtBQUFBLElBQ1I7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBV0EsZUFBc0IsUUFBUSxRQUFzQztBQW9CbEU7QUFBQTtBQW5CQSxVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUk7QUFDSixVQUFNLHdCQUF3QjtBQUFBLE1BQzVCLHlCQUF5QjtBQUFBLE1BQ3pCLHlCQUF5QjtBQUFBO0FBQUEsTUFFekIsdUJBQXVCO0FBQUEsSUFDekI7QUFDQSxVQUFNLGNBQWMsRUFBRSxHQUFHLHVCQUF1QixHQUFHLE9BQU87QUFDMUQsVUFBTSxrQkFBa0IsSUFBSSxnQkFBZ0I7QUFDNUMsZ0JBQVksY0FBYyxlQUFlLFlBQVksYUFBYSxnQkFBZ0IsTUFBTTtBQUN4RixVQUFNLE9BQU8sUUFBUSxLQUFLLFVBQVU7QUFHcEMsVUFBTSxRQUFRLHVDQUF1QixZQUFZLEVBQUUsZUFBZSxnQkFBZ0IsV0FBVyxDQUFDO0FBRTlGLFVBQU0sdUJBQXVCO0FBQUEsTUFDM0IsTUFBTSxrQkFBa0IsYUFBYTtBQUNuQyxvQkFBWSxlQUFlO0FBRTNCLGNBQU0sYUFBYSxNQUFNLFNBQVMsS0FBSyxVQUFVO0FBQ2pELG9CQUFZLGVBQWU7QUFFM0IsWUFBSSxlQUFlLE1BQU07QUFDdkIsaUJBQU8sZ0NBQWdDO0FBQUEsUUFDekM7QUFFQSxjQUFNLGFBQWEsTUFBTSxhQUFhLG9CQUFvQixFQUFFLGFBQWEsU0FBUyxXQUFXLENBQUM7QUFDOUYsb0JBQVksZUFBZTtBQUUzQixZQUFJLGVBQWUsTUFBTTtBQUN2QixpQkFBTztBQUFBLFFBQ1Q7QUFFQSxZQUFJLFlBQVk7QUFDaEIsY0FBTSxTQUFTLE1BQU0scUJBQXFCO0FBQUEsVUFDeEM7QUFBQSxVQUNBLE1BQU0sV0FBVyxNQUFNO0FBQ3JCLHdCQUFZLGVBQWU7QUFDM0Isa0JBQU0sSUFBSSxNQUFNLFFBQVEsTUFBTSxDQUFDLFlBQVk7QUFDekMsMEJBQVksZUFBZTtBQUMzQixrQkFBSSxZQUFZLFlBQVk7QUFDMUIsK0JBQWUsZUFBZSxFQUFFLHNEQUFzRDtBQUFBLGtCQUNwRixlQUFlO0FBQUEsa0JBQ2YsaUJBQWlCO0FBQUEsa0JBQ2pCLE1BQU0sS0FBSztBQUFBLGdCQUNiLENBQUM7QUFDRCw0QkFBWTtBQUNaLHVCQUFPO0FBQUEsY0FDVDtBQUVBLHFCQUFPO0FBQUEsWUFDVCxDQUFDO0FBRUQsd0JBQVksZUFBZTtBQUFBLFVBQzdCO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUVELFlBQUksV0FBVyxnQ0FBdUM7QUFDcEQsaUJBQU8sZ0NBQWdDO0FBQUEsUUFDekM7QUFFQSxlQUFPO0FBR1AsaUJBQVMsa0NBQTJDO0FBQ2xELGNBQUksWUFBWSx5QkFBeUI7QUFDdkMsa0JBQU0sSUFBSSxNQUFNLFNBQVMsSUFBSSxhQUFhO0FBQUEsVUFDNUM7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBQUEsTUFDQSxlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sYUFBYSxFQUFFLFVBQVUsS0FBSyxDQUFDO0FBQUEsTUFDaEY7QUFBQSxNQUNBLGNBQWM7QUFBQSxNQUNkLHlCQUF5QixZQUFZO0FBQUEsSUFDdkMsQ0FBQztBQUFBLFdBL0REO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnRUY7QUFXQSxlQUFzQixTQUFTLEtBQVUsWUFBZ0Q7QUFDdkYsTUFBSSxVQUF5QjtBQUM3QixRQUFNLHFCQUFxQjtBQUFBLElBQ3pCO0FBQUEsSUFDQSxNQUFNLFdBQVcsTUFBTTtBQUNyQixZQUFNLFNBQVMsS0FBSyxJQUFJO0FBQ3hCLGdCQUFVLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSTtBQUFBLElBQ3JDO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNELFNBQU87QUFDVDtBQVNBLGVBQXNCLFdBQVcsUUFBMkM7QUFDMUUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sa0JBQWtCLGdCQUFnQixFQUFFLEtBQUssWUFBWSxzQkFBc0IsQ0FBQztBQUVsRixRQUFNLG1CQUFtQixrQkFBa0IsRUFBRSxLQUFLLFNBQVMsc0JBQXNCLENBQUM7QUFFbEYsTUFBSSxnQkFBZ0IsS0FBSyxZQUFZLE1BQU0saUJBQWlCLFlBQVksR0FBRztBQUN6RSxRQUFJLGdCQUFnQixTQUFTLFNBQVM7QUFDcEMsWUFBTSxJQUFJLFlBQVksV0FBVyxpQkFBaUIsZ0JBQWdCO0FBQUEsSUFDcEU7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sZ0JBQWdCLGlCQUFpQixnQkFBZ0I7QUFDdkQsUUFBTSxpQkFBaUIsS0FBSyxhQUFhO0FBRXpDLE1BQUk7QUFDRixVQUFNLElBQUksWUFBWSxXQUFXLGlCQUFpQixnQkFBZ0I7QUFBQSxFQUNwRSxTQUFTLE9BQU87QUFDZCxRQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sT0FBTyxnQkFBZ0IsS0FBSyxNQUFNLElBQUksTUFBTSxPQUFPLGdCQUFnQixJQUFJLEdBQUc7QUFDN0YsWUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBU0EsZUFBc0IsU0FBUyxLQUFVLFlBQXVDO0FBQzlFLE1BQUksQ0FBQyxlQUFlLFVBQVUsR0FBRztBQUMvQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLE9BQU8sUUFBUSxLQUFLLFVBQVU7QUFFcEMsYUFBVyxRQUFRLElBQUksVUFBVSxnQkFBZ0IsU0FBUyxRQUFRLEdBQUc7QUFDbkUsUUFBSSxLQUFLLGdCQUFnQixnQkFBZ0IsS0FBSyxLQUFLLE1BQU0sU0FBUyxRQUFRLEtBQUssS0FBSyxPQUFPO0FBQ3pGLFlBQU0sS0FBSyxLQUFLLEtBQUs7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFDRjtBQVNBLGVBQXNCLFVBQVUsS0FBVSxZQUErQztBQUN2RixRQUFNLE9BQU8sc0JBQXNCLEVBQUUsS0FBSyxXQUFXLENBQUM7QUFDdEQsTUFBSSxDQUFDLE1BQU07QUFDVDtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsVUFBTSxJQUFJLFlBQVksVUFBVSxJQUFJO0FBQUEsRUFDdEMsU0FBUyxPQUFPO0FBQ2QsUUFBSSxNQUFNLElBQUksTUFBTSxPQUFPLEtBQUssSUFBSSxHQUFHO0FBQ3JDLFlBQU07QUFBQSxJQUNSO0FBRUEsbUJBQWUsaUJBQWlCLEVBQUUsb0NBQW9DLEtBQUssSUFBSSxvQ0FBb0MsRUFBRSxPQUFPLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFBQSxFQUMvSTtBQUNGO0FBRUEsZUFBZSxxQkFBcUIsUUFBeUU7QUFDM0csUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sT0FBTyxRQUFRLEtBQUssVUFBVTtBQUNwQyxNQUFJLE9BQU8sY0FBYyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUM7QUFDbEQsTUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSTtBQUNGLFVBQU0sV0FBVyxJQUFJO0FBQ3JCLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUNkLFdBQU8sY0FBYyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUM7QUFDOUMsUUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTO0FBQ3pCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTTtBQUFBLEVBQ1I7QUFDRjsiLAogICJuYW1lcyI6IFsiQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdCIsICJFbXB0eUZvbGRlckJlaGF2aW9yIiwgIkludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0Il0KfQo=
|
|
600
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIExpc3RlZEZpbGVzXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aCxcbiAgVmlld1R5cGVcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBUQWJzdHJhY3RGaWxlLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vdmFsdWUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXRoT3JBYnN0cmFjdEZpbGUsXG4gIFBhdGhPckZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VMb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvdXJjZS1sb2NrLnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxBbnkgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7XG4gIGFzRmlsZSxcbiAgYXNGb2xkZXIsXG4gIEZpbGVTeXN0ZW1UeXBlLFxuICBnZXRBYnN0cmFjdEZpbGUsXG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0RmlsZVN5c3RlbVR5cGUsXG4gIGdldEZvbGRlcixcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBnZXRQYXRoLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2Yge0BsaW5rIGNyZWF0ZUZvbGRlclNhZmV9LlxuICovXG5leHBvcnQgZW51bSBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBDcmVhdGVkID0gJ2NyZWF0ZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHdhcyBub3QgY3JlYXRlZCBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKi9cbiAgTm90Q3JlYXRlZCA9ICdub3QtY3JlYXRlZCdcbn1cblxuLyoqXG4gKiBBIGJlaGF2aW9yIGZvciBoYW5kbGluZyBlbXB0eSBmb2xkZXJzIGR1cmluZyBjbGVhbnVwLlxuICovXG5leHBvcnQgZW51bSBFbXB0eUZvbGRlckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyLlxuICAgKi9cbiAgRGVsZXRlID0gJ0RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgZW1wdHkgZm9sZGVyIGFuZCBhbGwgaXRzIGVtcHR5IHBhcmVudHMuXG4gICAqL1xuICBEZWxldGVXaXRoRW1wdHlQYXJlbnRzID0gJ0RlbGV0ZVdpdGhFbXB0eVBhcmVudHMnLFxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBlbXB0eSBmb2xkZXIuXG4gICAqL1xuICBLZWVwID0gJ0tlZXAnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgaW52b2tlRmlsZUFjdGlvblNhZmV9LlxuICovXG5leHBvcnQgZW51bSBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdCB7XG4gIEludm9rZWQgPSAnaW52b2tlZCcsXG4gIE5vdEludm9rZWQgPSAnbm90LWludm9rZWQnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsZWFudXBFbXB0eUZvbGRlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsZWFudXBFbXB0eUZvbGRlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBiZWhhdmlvciBkZXRlcm1pbmluZyBob3cgZW1wdHkgZm9sZGVycyBhcmUgY2xlYW5lZCB1cC5cbiAgICovXG4gIHJlYWRvbmx5IGVtcHR5Rm9sZGVyQmVoYXZpb3I6IEVtcHR5Rm9sZGVyQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgZm9sZGVycyB0byBjbGVhbiB1cCB3aGVuIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyUGF0aHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBmb3Ige0BsaW5rIHByb2Nlc3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRBcmd1bWVudHMge1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcHlTYWZlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gY29weSB0aGUgZmlsZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gY29weS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBYnN0cmFjdEZpbGVQYXRoU2FmZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCBvciBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0U2FmZVJlbmFtZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFNhZmVSZW5hbWVQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBhYnN0cmFjdCBmaWxlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZW5hbWUuXG4gICAqL1xuICByZWFkb25seSBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZva2VXaXRoRmlsZVN5c3RlbUxvY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gICAqL1xuICAkZnVuY3Rpb24odGhpczogdm9pZCwgY29udGVudDogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jayBvZi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzQ2hpbGRPclNlbGZ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ2hpbGRPclNlbGZQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIGNoaWxkIG9yIHNlbGYuXG4gICAqL1xuICByZWFkb25seSBjaGlsZFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjayB3aGV0aGVyIGl0IGlzIGEgcGFyZW50IG9yIHNlbGYuXG4gICAqL1xuICByZWFkb25seSBwYXJlbnRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzQ2hpbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ2hpbGRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIGNoaWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hpbGRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBhIHBhcmVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogUGx1Z2luIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byBzaG93IHRoZSB0aW1lb3V0IG5vdGljZS4gV2hlbiBgbnVsbGAsIG5vIHRpbWVvdXQgbm90aWNlIGlzIHNob3duXG4gICAqIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIFByb2Nlc3NPcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlfTsgdGhlIHRpbWVvdXQgaXMgb25seSBsb2dnZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwgfCBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFuIHJlc291cmNlLWxvY2sgY29tcG9uZW50IHVzZWQgdG8gbG9jayB0aGUgZmlsZSdzIGVkaXRvciByZWFkLW9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZlxuICAgKiBwcm9jZXNzaW5nLiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCwgc28gaXQgY29tcG9zZXMgd2l0aCBhbnkgb3V0ZXIgb3BlcmF0aW9uLWxldmVsIGxvY2tcbiAgICogb24gdGhlIHNhbWUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmYWlsIGlmIHRoZSBmaWxlIGlzIG1pc3Npbmcgb3IgZGVsZXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyBhIHRpbWVvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dUaW1lb3V0Tm90aWNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHJvY2Vzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1BhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSwgdHlwaWNhbGx5IHVzZWQgZm9yIGFjY2Vzc2luZyB0aGUgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSB2YWx1ZSBwcm92aWRlciB0aGF0IHJldHVybnMgdGhlIG5ldyBjb250ZW50IGJhc2VkIG9uIHRoZSBvbGQgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb2xkIGNvbnRlbnQgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyBjb250ZW50LlxuICAgKlxuICAgKiBBIGZ1bmN0aW9uIGhhcyB0aHJlZSBvdXRjb21lczpcbiAgICpcbiAgICogLSBgbnVsbGAgXHUyMDE0IHRoZSBuZXcgY29udGVudCBjYW5ub3QgYmUgcHJvZHVjZWQgWUVUOyB0aGUgcHJvY2VzcyBpcyByZXRyaWVkLlxuICAgKiAtIHRoZSBvbGQgY29udGVudCwgcmV0dXJuZWQgdW5jaGFuZ2VkIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlOyB0aGUgcHJvY2VzcyBjb21wbGV0ZXMgd2l0aG91dFxuICAgKiAgIHRvdWNoaW5nIHRoZSBmaWxlLiBVc2UgdGhpcyBmb3IgYSByZWZ1c2FsIHRoYXQgaXMgcGVybWFuZW50LCBhcyByZXR1cm5pbmcgYG51bGxgIGZvciBvbmUgcmV0cmllc1xuICAgKiAgIGZvcmV2ZXIgYW5kIGhvbGRzIHRoZSBvcGVyYXRpb24gb3Blbi5cbiAgICogLSBhbnkgb3RoZXIgc3RyaW5nIFx1MjAxNCB0aGUgY29udGVudCB0byB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ld0NvbnRlbnRQcm92aWRlcjogVmFsdWVQcm92aWRlcjxudWxsIHwgc3RyaW5nLCBDb250ZW50QXJndW1lbnRzPjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBiZSBwcm9jZXNzZWQuIEl0IGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb3IgYSBmaWxlIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlbmFtZVNhZmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZVNhZmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgcGF0aCB0byByZW5hbWUgdGhlIGZpbGUgdG8uXG4gICAqL1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIHJlbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFBhdGhPckFic3RyYWN0RmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xufVxuXG5pbnRlcmZhY2UgSW52b2tlRmlsZUFjdGlvblNhZmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byBwZXJmb3JtIHRoZSBhY3Rpb24gb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYWN0aW9uIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgZmlsZUFjdGlvbih0aGlzOiB2b2lkLCBmaWxlOiBURmlsZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBDbGVhbnMgdXAgZW1wdHkgZm9sZGVycyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBFbXB0eUZvbGRlckJlaGF2aW9yfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNsZWFuaW5nIHVwIGVtcHR5IGZvbGRlcnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFudXAgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwRW1wdHlGb2xkZXJzKHBhcmFtczogQ2xlYW51cEVtcHR5Rm9sZGVyc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3IsXG4gICAgZm9sZGVyUGF0aHNcbiAgfSA9IHBhcmFtcztcbiAgZm9yIChjb25zdCBmb2xkZXJQYXRoIG9mIGZvbGRlclBhdGhzKSB7XG4gICAgc3dpdGNoIChlbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuRGVsZXRlOiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyUGF0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBFbXB0eUZvbGRlckJlaGF2aW9yLkRlbGV0ZVdpdGhFbXB0eVBhcmVudHM6IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBmb2xkZXJQYXRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoZW1wdHlGb2xkZXJCZWhhdmlvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29waWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29weWluZyB0aGUgZmlsZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYXRoIG9mIHRoZSBjb3BpZWQgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlTYWZlKHBhcmFtczogQ29weVNhZmVQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5ld1BhdGgsXG4gICAgb2xkUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogb2xkUGF0aE9yRmlsZSB9KTtcblxuICBpZiAoZmlsZS5wYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICBjb25zdCBuZXdGb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChuZXdQYXRoKTtcbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIG5ld0ZvbGRlclBhdGgpO1xuXG4gIGNvbnN0IG5ld0F2YWlsYWJsZVBhdGggPSBnZXRBdmFpbGFibGVQYXRoKGFwcCwgbmV3UGF0aCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY29weShmaWxlLCBuZXdBdmFpbGFibGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMobmV3QXZhaWxhYmxlUGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmb2xkZXIgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuQ3JlYXRlZH0gaWYgdGhlIGZvbGRlciB3YXNcbiAqIGNyZWF0ZWQsIG9yIHtAbGluayBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0Lk5vdENyZWF0ZWR9IGlmIGl0IGFscmVhZHkgZXhpc3RlZC5cbiAqIEB0aHJvd3MgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBmb2xkZXIgYW5kIGl0IHN0aWxsIGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPENyZWF0ZUZvbGRlclNhZmVSZXN1bHQ+IHtcbiAgaWYgKGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIHJldHVybiBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0Lk5vdENyZWF0ZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIocGF0aCk7XG4gICAgcmV0dXJuIENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuQ3JlYXRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdC5DcmVhdGVkO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSB2YXVsdCB3aXRoIHBhcmVudCBmb2xkZXJzIGlmIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGUgYW5kIGFsbCBpdHMgY3JlYXRlZCBwYXJlbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVtcG9yYXJ5RmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCB9KTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gbm9vcEFzeW5jO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyQ2xlYW51cCA9IGF3YWl0IGNyZWF0ZVRlbXBvcmFyeUZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgIGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICAgIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgICBhd2FpdCB0cmFzaFNhZmUoYXBwLCBmaWxlKTtcbiAgICB9XG4gICAgYXdhaXQgZm9sZGVyQ2xlYW51cCgpO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZm9sZGVyIGluIHRoZSB2YXVsdCB3aXRoIHBhcmVudCBmb2xkZXJzIGlmIG5lZWRlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZm9sZGVyIGFuZCBhbGwgaXRzIGNyZWF0ZWQgcGFyZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRlbXBvcmFyeUZvbGRlcihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHAsIHBhdGhPckZvbGRlcjogcGF0aCB9KTtcbiAgaWYgKGZvbGRlcikge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBmb2xkZXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChwYXRoKTtcbiAgYXdhaXQgY3JlYXRlVGVtcG9yYXJ5Rm9sZGVyKGFwcCwgZm9sZGVyUGF0aCk7XG5cbiAgY29uc3QgZm9sZGVyQ2xlYW51cCA9IGF3YWl0IGNyZWF0ZVRlbXBvcmFyeUZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUoYXBwLCBwYXRoKTtcblxuICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgIGZvbGRlciA9IGdldEZvbGRlcih7IGFwcCwgcGF0aE9yRm9sZGVyOiBwYXRoIH0pO1xuICAgIGlmICghZm9sZGVyLmRlbGV0ZWQpIHtcbiAgICAgIGF3YWl0IHRyYXNoU2FmZShhcHAsIGZvbGRlcik7XG4gICAgfVxuICAgIGF3YWl0IGZvbGRlckNsZWFudXAoKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIGFuIGVtcHR5IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBmb2xkZXIgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb2xkZXIgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwLCBwYXRoT3JGb2xkZXIgfSk7XG4gIGlmICghZm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghYXdhaXQgaXNFbXB0eUZvbGRlcihhcHAsIGZvbGRlcikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgdHJhc2hTYWZlKGFwcCwgZm9sZGVyKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGVtcHR5IGZvbGRlciBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIGZvbGRlciB0byBzdGFydCByZW1vdmluZyBlbXB0eSBoaWVyYXJjaHkgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZW1wdHkgaGllcmFyY2h5IGlzIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBudWxsIHwgUGF0aE9yRm9sZGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHAsIHBhdGhPckZvbGRlciB9KTtcblxuICB3aGlsZSAoZm9sZGVyKSB7XG4gICAgaWYgKCFhd2FpdCBpc0VtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBmb2xkZXIucGFyZW50O1xuICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyKTtcbiAgICBmb2xkZXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSBwYXRoIGZvciBhIGZpbGUgb3IgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2V0dGluZyBhIHNhZmUgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBzYWZlIHBhdGggZm9yIHRoZSBmaWxlIG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKHBhcmFtczogR2V0QWJzdHJhY3RGaWxlUGF0aFNhZmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBhdGgsXG4gICAgdHlwZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG5cbiAgaWYgKGFic3RyYWN0RmlsZSAmJiBnZXRGaWxlU3lzdGVtVHlwZShhYnN0cmFjdEZpbGUpID09PSB0eXBlKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIHBhdGgpO1xufVxuXG4vKipcbiAqIEdldHMgYW4gYXZhaWxhYmxlIHBhdGggZm9yIGEgZmlsZSBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gZ2V0IGFuIGF2YWlsYWJsZSBwYXRoIGZvci5cbiAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgcGF0aCBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKHBhdGgpO1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJuYW1lKHBhdGgpLCBiYXNlbmFtZShwYXRoLCBleHRlbnNpb24pKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSBmaWxlIHBhdGggZm9yIGEgZmlsZSBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgb3IgZm9sZGVyIHRvIGdldCBhIHNhZmUgcGF0aCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgc2FmZSBwYXRoIGZvciB0aGUgZmlsZSBvciBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlUGF0aFNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRBYnN0cmFjdEZpbGVQYXRoU2FmZSh7IGFwcCwgcGF0aCwgdHlwZTogRmlsZVN5c3RlbVR5cGUuRmlsZSB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc2FmZSBmb2xkZXIgcGF0aCBmb3IgYSBmaWxlIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBvciBmb2xkZXIgdG8gZ2V0IGEgc2FmZSBwYXRoIGZvci5cbiAqIEByZXR1cm5zIFRoZSBzYWZlIHBhdGggZm9yIHRoZSBmaWxlIG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbGRlclBhdGhTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0QWJzdHJhY3RGaWxlUGF0aFNhZmUoeyBhcHAsIHBhdGgsIHR5cGU6IEZpbGVTeXN0ZW1UeXBlLkZvbGRlciB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgTWFya2Rvd24gZmlsZXMgZnJvbSB0aGUgYXBwJ3MgdmF1bHQgYW5kIHNvcnRzIHRoZW0gYWxwaGFiZXRpY2FsbHkgYnkgdGhlaXIgZmlsZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgTWFya2Rvd24gZmlsZXMgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtkb3duRmlsZXNTb3J0ZWQoYXBwOiBBcHApOiBURmlsZVtdIHtcbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCkuc29ydCgoYSwgYikgPT4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFuIGFycmF5IG9mIGFsbCBub3RlIGZpbGVzIGZyb20gdGhlIGFwcCdzIHZhdWx0IGFuZCBzb3J0cyB0aGVtIGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyIGZpbGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBub3RlIGZpbGVzIGluIHRoZSB2YXVsdCBzb3J0ZWQgYnkgZmlsZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm90ZUZpbGVzU29ydGVkKGFwcDogQXBwKTogVEZpbGVbXSB7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0QWxsTG9hZGVkRmlsZXMoKS5maWx0ZXIoKGZpbGUpID0+IGlzRmlsZShmaWxlKSAmJiBpc05vdGUoZmlsZSkpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpIGFzIFRGaWxlW107XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGFuIGFic3RyYWN0IGZpbGUgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2V0dGluZyBvciBjcmVhdGluZyB0aGUgYWJzdHJhY3QgZmlsZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFic3RyYWN0IGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmUocGFyYW1zOiBHZXRPckNyZWF0ZUFic3RyYWN0RmlsZVNhZmVQYXJhbXMpOiBQcm9taXNlPFRBYnN0cmFjdEZpbGU+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICB0eXBlXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IHBhdGggfSA9IHBhcmFtcztcbiAgcGF0aCA9IGdldEFic3RyYWN0RmlsZVBhdGhTYWZlKHsgYXBwLCBwYXRoLCB0eXBlIH0pO1xuICBjb25zdCBhYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGggfSk7XG4gIGlmIChhYnN0cmFjdEZpbGUpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBGaWxlU3lzdGVtVHlwZS5GaWxlOiB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gICAgfVxuICAgIGNhc2UgRmlsZVN5c3RlbVR5cGUuRm9sZGVyOiB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIodHlwZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2V0cyBvciBjcmVhdGVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldHVybmVkLlxuICogSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gZ2V0IG9yIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZUZpbGVTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGaWxlPiB7XG4gIHJldHVybiBhc0ZpbGUoYXdhaXQgZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlKHsgYXBwLCBwYXRoLCB0eXBlOiBGaWxlU3lzdGVtVHlwZS5GaWxlIH0pKTtcbn1cblxuLyoqXG4gKiBHZXRzIG9yIGNyZWF0ZXMgYSBmb2xkZXIgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBJZiB0aGUgZm9sZGVyIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldHVybmVkLlxuICogSWYgdGhlIGZvbGRlciBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGdldCBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZUZvbGRlclNhZmUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZvbGRlcj4ge1xuICByZXR1cm4gYXNGb2xkZXIoYXdhaXQgZ2V0T3JDcmVhdGVBYnN0cmFjdEZpbGVTYWZlKHsgYXBwLCBwYXRoLCB0eXBlOiBGaWxlU3lzdGVtVHlwZS5Gb2xkZXIgfSkpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzYWZlIHJlbmFtZSBwYXRoIGZvciBhIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZXR0aW5nIGEgc2FmZSByZW5hbWUgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBzYWZlIHJlbmFtZSBwYXRoIGZvciB0aGUgYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNhZmVSZW5hbWVQYXRoKHBhcmFtczogR2V0U2FmZVJlbmFtZVBhdGhQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IG5ld1BhdGggfSA9IHBhcmFtcztcbiAgY29uc3Qgb2xkUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGUpO1xuXG4gIGlmIChnZXREYXRhQWRhcHRlckV4KGFwcCkuaW5zZW5zaXRpdmUpIHtcbiAgICBsZXQgZm9sZGVyUGF0aCA9IGRpcm5hbWUobmV3UGF0aCk7XG4gICAgbGV0IG5vbkV4aXN0aW5nUGF0aCA9IGJhc2VuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBmb2xkZXI6IG51bGwgfCBURm9sZGVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIFRoZXJlIGlzIG5vIGVsZWdhbnQgd2F5IHRvIHBlcmZvcm0gaW5maW5pdGUgbG9vcHMuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgaXNDYXNlSW5zZW5zaXRpdmU6IHRydWUsIHBhdGhPckZvbGRlcjogZm9sZGVyUGF0aCB9KTtcbiAgICAgIGlmIChmb2xkZXIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBub25FeGlzdGluZ1BhdGggPSBqb2luKGJhc2VuYW1lKGZvbGRlclBhdGgpLCBub25FeGlzdGluZ1BhdGgpO1xuICAgICAgZm9sZGVyUGF0aCA9IGRpcm5hbWUoZm9sZGVyUGF0aCk7XG4gICAgfVxuICAgIG5ld1BhdGggPSBqb2luKGZvbGRlci5nZXRQYXJlbnRQcmVmaXgoKSwgbm9uRXhpc3RpbmdQYXRoKTtcbiAgfVxuXG4gIGlmIChvbGRQYXRoLnRvTG93ZXJDYXNlKCkgPT09IG5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG5cbiAgcmV0dXJuIGdldEF2YWlsYWJsZVBhdGgoYXBwLCBuZXdQYXRoKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgZmlsZSBzeXN0ZW0gbG9jay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGludm9raW5nIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBmaWxlIHN5c3RlbSBsb2NrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrKHBhcmFtczogSW52b2tlV2l0aEZpbGVTeXN0ZW1Mb2NrUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICAkZnVuY3Rpb24sXG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gIGF3YWl0IGFwcC52YXVsdC5wcm9jZXNzKGZpbGUsIChjb250ZW50KSA9PiB7XG4gICAgJGZ1bmN0aW9uKGNvbnRlbnQpO1xuICAgIHJldHVybiBjb250ZW50O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvZiBhbm90aGVyIHBhdGggb3IgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhlIGNoaWxkIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgcGF0aCBvciBmaWxlLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY2hpbGQgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb2YgdGhlIHBhcmVudCBwYXRoIG9yIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkKHBhcmFtczogSXNDaGlsZFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNoaWxkUGF0aE9yRmlsZSxcbiAgICBwYXJlbnRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNoaWxkUGF0aCA9IGdldFBhdGgoYXBwLCBjaGlsZFBhdGhPckZpbGUpO1xuICBjb25zdCBwYXJlbnRQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmVudFBhdGhPckZpbGUpO1xuXG4gIGlmIChjaGlsZFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocGFyZW50UGF0aCA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gY2hpbGRQYXRoLnN0YXJ0c1dpdGgoYCR7cGFyZW50UGF0aH0vYCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcGF0aCBvciBmaWxlIGlzIGEgY2hpbGQgb3Igc2VsZiBvZiBhbm90aGVyIHBhdGggb3IgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhlIGNoaWxkIHBhdGggb3IgZmlsZSBpcyBhIGNoaWxkIG9yIHNlbGYgb2YgdGhlIHBhcmVudCBwYXRoIG9yIGZpbGUuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjaGlsZCBwYXRoIG9yIGZpbGUgaXMgYSBjaGlsZCBvciBzZWxmIG9mIHRoZSBwYXJlbnQgcGF0aCBvciBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaGlsZE9yU2VsZihwYXJhbXM6IElzQ2hpbGRPclNlbGZQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjaGlsZFBhdGhPckZpbGUsXG4gICAgcGFyZW50UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBjaGlsZFBhdGggPSBnZXRQYXRoKGFwcCwgY2hpbGRQYXRoT3JGaWxlKTtcbiAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhdGgoYXBwLCBwYXJlbnRQYXRoT3JGaWxlKTtcbiAgcmV0dXJuIGNoaWxkUGF0aCA9PT0gcGFyZW50UGF0aCB8fCBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGUsIHBhcmVudFBhdGhPckZpbGUgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZm9sZGVyIGlzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIHBhdGggb3IgZm9sZGVyIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmb2xkZXIgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VtcHR5Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IFBhdGhPckZvbGRlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBsaXN0ZWRGaWxlcyA9IGF3YWl0IGxpc3RTYWZlKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZvbGRlcikpO1xuICByZXR1cm4gbGlzdGVkRmlsZXMuZmlsZXMubGVuZ3RoID09PSAwICYmIGxpc3RlZEZpbGVzLmZvbGRlcnMubGVuZ3RoID09PSAwO1xufVxuXG4vKipcbiAqIFNhZmVseSBsaXN0cyB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBwYXRoIG9yIGZvbGRlciB0byBsaXN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBMaXN0ZWRGaWxlc30gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpc3RlZCBmaWxlcyBhbmQgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTYWZlKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IFBhdGhPckZvbGRlcik6IFByb21pc2U8TGlzdGVkRmlsZXM+IHtcbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGb2xkZXIpO1xuICBjb25zdCBFTVBUWSA9IHsgZmlsZXM6IFtdLCBmb2xkZXJzOiBbXSB9O1xuXG4gIGNvbnN0IHBhdGhTdGF0cyA9IGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLnN0YXQocGF0aCk7XG4gIGlmIChwYXRoU3RhdHM/LnR5cGUgIT09ICdmb2xkZXInKSB7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIubGlzdChwYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGZpbGUgd2l0aCByZXRyeSBsb2dpYywgdXBkYXRpbmcgaXRzIGNvbnRlbnQgYmFzZWQgb24gYSBwcm92aWRlZCB2YWx1ZSBvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHByb2Nlc3NpbmcgdGhlIGZpbGUuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlLlxuICpcbiAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgcHJvY2VzcyBmYWlscyBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiByZXRyaWVzIG9yIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzKHBhcmFtczogUHJvY2Vzc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5ld0NvbnRlbnRQcm92aWRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICByZXNvdXJjZUxvY2tDb21wb25lbnRcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TID0ge1xuICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiB0cnVlLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiB0cnVlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzIC0tIERlZmF1bHQgdmFsdWUuXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiA1MDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucGFyYW1zIH07XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbEFueShmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbCwgYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG5cbiAgLy8gUmVmZXJlbmNlLWNvdW50ZWQgbG9jazsgY29tcG9zZXMgd2l0aCBhbnkgb3V0ZXIgbG9jay4gUmVsZWFzZWQgYXQgZnVuY3Rpb24gc2NvcGUgZXhpdC5cbiAgdXNpbmcgX2xvY2sgPSByZXNvdXJjZUxvY2tDb21wb25lbnQ/LmxvY2tGb3JQYXRoKHsgb3BlcmF0aW9uTmFtZTogJ1Byb2Nlc3Mgbm90ZScsIHBhdGhPckZpbGUgfSk7XG5cbiAgYXdhaXQgcmV0cnlXaXRoVGltZW91dE5vdGljZSh7XG4gICAgYXN5bmMgb3BlcmF0aW9uRnVuY3Rpb24oYWJvcnRTaWduYWwpIHtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHNob3VsZFRyZWF0TWlzc2luZ0ZpbGVBc1N1Y2Nlc3MoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShuZXdDb250ZW50UHJvdmlkZXIsIHsgYWJvcnRTaWduYWwsIGNvbnRlbnQ6IG9sZENvbnRlbnQgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBpZiAobmV3Q29udGVudCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwcm92aWRlciBoYW5kZWQgYmFjayBleGFjdGx5IHdoYXQgaXQgd2FzIGdpdmVuOiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlLCBhbmQgdGhlIG9wZXJhdGlvblxuICAgICAgLy8gSXMgY29tcGxldGUuIERpc3RpbmN0IGZyb20gYG51bGxgLCB3aGljaCBhc2tzIGZvciBhIHJldHJ5IFx1MjAxNCBhIHByb3ZpZGVyIHdob3NlIHJlZnVzYWwgdG8gcmV3cml0ZSBpc1xuICAgICAgLy8gUGVybWFuZW50IChzZWUgYGFwcGx5Q2FudmFzQ2hhbmdlc2ApIHdvdWxkIG90aGVyd2lzZSBzcGluIGZvcmV2ZXIgYW5kIGhvbGQgdGhlIHNoYXJlZCBvcGVyYXRpb25cbiAgICAgIC8vIFF1ZXVlIG9wZW4gYmVoaW5kIGl0LlxuICAgICAgaWYgKG5ld0NvbnRlbnQgPT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBpc1N1Y2Nlc3MgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW52b2tlRmlsZUFjdGlvblNhZmUoe1xuICAgICAgICBhcHAsXG4gICAgICAgIGFzeW5jIGZpbGVBY3Rpb24oZmlsZSkge1xuICAgICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgYXdhaXQgYXBwLnZhdWx0LnByb2Nlc3MoZmlsZSwgKGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgICBpZiAoY29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignVmF1bHQ6cHJvY2VzcycpKCdDb250ZW50IGhhcyBjaGFuZ2VkIHNpbmNlIGl0IHdhcyByZWFkLiBSZXRyeWluZy4uLicsIHtcbiAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkQ29udGVudDogb2xkQ29udGVudCxcbiAgICAgICAgICAgICAgICBwYXRoOiBmaWxlLnBhdGhcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlzU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbnRlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBwYXRoT3JGaWxlXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gSW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQuTm90SW52b2tlZCkge1xuICAgICAgICByZXR1cm4gc2hvdWxkVHJlYXRNaXNzaW5nRmlsZUFzU3VjY2VzcygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNTdWNjZXNzO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gQ2xvc2VzIG92ZXIgYGZ1bGxPcHRpb25zYCBhbmQgYHBhdGhgIGZyb20gdGhlIGVuY2xvc2luZyBzY29wZSwgc28gaXQgY2Fubm90IGJlIGhvaXN0ZWQuXG4gICAgICBmdW5jdGlvbiBzaG91bGRUcmVhdE1pc3NpbmdGaWxlQXNTdWNjZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZnVsbE9wdGlvbnMuc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJyR7cGF0aH0nIG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnZhdWx0LnByb2Nlc3NGaWxlLCB7IGZpbGVQYXRoOiBwYXRoIH0pLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICByZXRyeU9wdGlvbnM6IGZ1bGxPcHRpb25zLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBmdWxsT3B0aW9ucy5zaG91bGRTaG93VGltZW91dE5vdGljZVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgY29udGVudCBvZiBhIGZpbGUgc2FmZWx5IGZyb20gdGhlIHZhdWx0LlxuICpcbiAqIEl0IGNvdmVycyB0aGUgY2FzZSB3aGVuIHRoZSBmaWxlIHdhcyByZW1vdmVkIGR1cmluZyB0aGUgcmVhZGluZy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIG9yIGBudWxsYCBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBsZXQgY29udGVudDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGF3YWl0IGludm9rZUZpbGVBY3Rpb25TYWZlKHtcbiAgICBhcHAsXG4gICAgYXN5bmMgZmlsZUFjdGlvbihmaWxlKSB7XG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuICAgICAgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogUmVuYW1lcyBhIGZpbGUgc2FmZWx5IGluIHRoZSB2YXVsdC5cbiAqIElmIHRoZSBuZXcgcGF0aCBhbHJlYWR5IGV4aXN0cywgdGhlIGZpbGUgd2lsbCBiZSByZW5hbWVkIHRvIGFuIGF2YWlsYWJsZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVuYW1pbmcgdGhlIGZpbGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGF0aCBvZiB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZVNhZmUocGFyYW1zOiBSZW5hbWVTYWZlUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBuZXdQYXRoLFxuICAgIG9sZFBhdGhPckFic3RyYWN0RmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBvbGRBYnN0cmFjdEZpbGUgPSBnZXRBYnN0cmFjdEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IG9sZFBhdGhPckFic3RyYWN0RmlsZSB9KTtcblxuICBjb25zdCBuZXdBdmFpbGFibGVQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZSB9KTtcblxuICBpZiAob2xkQWJzdHJhY3RGaWxlLnBhdGgudG9Mb3dlckNhc2UoKSA9PT0gbmV3QXZhaWxhYmxlUGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgaWYgKG9sZEFic3RyYWN0RmlsZS5wYXRoICE9PSBuZXdQYXRoKSB7XG4gICAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShvbGRBYnN0cmFjdEZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IG5ld0ZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKG5ld0F2YWlsYWJsZVBhdGgpO1xuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgbmV3Rm9sZGVyUGF0aCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShvbGRBYnN0cmFjdEZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhuZXdBdmFpbGFibGVQYXRoKSB8fCBhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG9sZEFic3RyYWN0RmlsZS5wYXRoKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0F2YWlsYWJsZVBhdGg7XG59XG5cbi8qKlxuICogU2F2ZXMgdGhlIHNwZWNpZmllZCBub3RlIGluIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBub3RlIHRvIGJlIHNhdmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RlIGlzIHNhdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZU5vdGUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc01hcmtkb3duRmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG5cbiAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcgJiYgbGVhZi52aWV3LmZpbGU/LnBhdGggPT09IHBhdGggJiYgbGVhZi52aWV3LmRpcnR5KSB7XG4gICAgICBhd2FpdCBsZWFmLnZpZXcuc2F2ZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyYXNoZXMgYW4gYWJzdHJhY3QgZmlsZSBzYWZlbHkgZnJvbSB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byB0cmFzaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBpcyB0cmFzaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhc2hTYWZlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgaWYgKCFmaWxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGZpbGUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChhd2FpdCBhcHAudmF1bHQuZXhpc3RzKGZpbGUucGF0aCkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGdldExpYkRlYnVnZ2VyKCdWYXVsdDp0cmFzaFNhZmUnKShgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJhc2hpbmcgJHtmaWxlLnBhdGh9LCBidXQgdGhlIGZpbGUgbm8gbG9uZ2VyIGV4aXN0cy5gLCB7IGVycm9yLCBwYXRoOiBmaWxlLnBhdGggfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW52b2tlRmlsZUFjdGlvblNhZmUocGFyYW1zOiBJbnZva2VGaWxlQWN0aW9uU2FmZVBhcmFtcyk6IFByb21pc2U8SW52b2tlRmlsZUFjdGlvblNhZmVSZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBmaWxlQWN0aW9uLFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgbGV0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICBpZiAoIWZpbGUgfHwgZmlsZS5kZWxldGVkKSB7XG4gICAgcmV0dXJuIEludm9rZUZpbGVBY3Rpb25TYWZlUmVzdWx0Lk5vdEludm9rZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmaWxlQWN0aW9uKGZpbGUpO1xuICAgIHJldHVybiBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdC5JbnZva2VkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGZpbGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBJbnZva2VGaWxlQWN0aW9uU2FmZVJlc3VsdC5Ob3RJbnZva2VkO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFZUCxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyw4QkFBOEI7QUFDdkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFNBQVM7QUFLWCxJQUFLLHlCQUFMLGtCQUFLQSw0QkFBTDtBQUlMLEVBQUFBLHdCQUFBLGFBQVU7QUFLVixFQUFBQSx3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
|