obsidian-integration-testing 12.1.2 → 12.3.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/README.md +1 -5
- package/dist/lib/cjs/app-config.cjs +137 -0
- package/dist/lib/cjs/app-config.d.cts +190 -0
- package/dist/lib/cjs/appium-session-config.cjs +7 -1
- package/dist/lib/cjs/appium-session-config.d.cts +20 -0
- package/dist/lib/cjs/cdp-command-timeout-error.cjs +50 -0
- package/dist/lib/cjs/cdp-command-timeout-error.d.cts +48 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
- package/dist/lib/cjs/emulator-arguments.cjs +19 -3
- package/dist/lib/cjs/emulator-arguments.d.cts +44 -0
- package/dist/lib/cjs/emulator-device-id.cjs +1 -1
- package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
- package/dist/lib/cjs/emulator-marker.cjs +169 -0
- package/dist/lib/cjs/emulator-marker.d.cts +224 -0
- package/dist/lib/cjs/emulator-reaper.cjs +248 -0
- package/dist/lib/cjs/emulator-reaper.d.cts +225 -0
- package/dist/lib/cjs/emulator-reclaim.cjs +312 -0
- package/dist/lib/cjs/emulator-reclaim.d.cts +179 -0
- package/dist/lib/cjs/eval-cap-exceeded-error.cjs +61 -0
- package/dist/lib/cjs/eval-cap-exceeded-error.d.cts +92 -0
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/global-setup-core.cjs +2 -3
- package/dist/lib/cjs/index.cjs +21 -1
- package/dist/lib/cjs/index.d.cts +7 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +7 -2
- package/dist/lib/cjs/setup-lock.cjs +56 -8
- package/dist/lib/cjs/setup-lock.d.cts +53 -0
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
- package/dist/lib/cjs/soft-keyboard.cjs +7 -4
- package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
- package/dist/lib/cjs/transport-appium.cjs +70 -5
- package/dist/lib/cjs/transport-appium.d.cts +35 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +98 -19
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-factory.cjs +297 -190
- package/dist/lib/cjs/transport-factory.d.cts +15 -0
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +38 -1
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/app-config.d.mts +190 -0
- package/dist/lib/esm/app-config.mjs +110 -0
- package/dist/lib/esm/appium-session-config.d.mts +20 -0
- package/dist/lib/esm/appium-session-config.mjs +6 -1
- package/dist/lib/esm/cdp-command-timeout-error.d.mts +48 -0
- package/dist/lib/esm/cdp-command-timeout-error.mjs +26 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/emulator-arguments.d.mts +44 -0
- package/dist/lib/esm/emulator-arguments.mjs +16 -2
- package/dist/lib/esm/emulator-device-id.d.mts +7 -6
- package/dist/lib/esm/emulator-device-id.mjs +1 -1
- package/dist/lib/esm/emulator-marker.d.mts +224 -0
- package/dist/lib/esm/emulator-marker.mjs +134 -0
- package/dist/lib/esm/emulator-reaper.d.mts +225 -0
- package/dist/lib/esm/emulator-reaper.mjs +211 -0
- package/dist/lib/esm/emulator-reclaim.d.mts +179 -0
- package/dist/lib/esm/emulator-reclaim.mjs +291 -0
- package/dist/lib/esm/eval-cap-exceeded-error.d.mts +92 -0
- package/dist/lib/esm/eval-cap-exceeded-error.mjs +36 -0
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/global-setup-core.mjs +6 -4
- package/dist/lib/esm/index.d.mts +7 -0
- package/dist/lib/esm/index.mjs +21 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +7 -2
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/setup-lock.d.mts +53 -0
- package/dist/lib/esm/setup-lock.mjs +52 -7
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
- package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
- package/dist/lib/esm/soft-keyboard.d.mts +16 -2
- package/dist/lib/esm/soft-keyboard.mjs +7 -4
- package/dist/lib/esm/transport-appium.d.mts +35 -0
- package/dist/lib/esm/transport-appium.mjs +73 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +98 -19
- package/dist/lib/esm/transport-factory.d.mts +15 -0
- package/dist/lib/esm/transport-factory.mjs +305 -184
- package/dist/lib/esm/transport-options.d.mts +38 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +17 -0
- package/dist/lib/esm/webview-cdp.mjs +45 -14
- package/package.json +4 -4
|
@@ -12,10 +12,13 @@ import {
|
|
|
12
12
|
decodeBase64Png,
|
|
13
13
|
isPng
|
|
14
14
|
} from "./capture-screenshot.mjs";
|
|
15
|
+
import { CdpCommandTimeoutError } from "./cdp-command-timeout-error.mjs";
|
|
15
16
|
import { resolveAsarFallbackAction } from "./compatibility-options.mjs";
|
|
16
17
|
import { ConfigDirectoryFallbackError } from "./config-directory-fallback-error.mjs";
|
|
17
18
|
import { DISMISS_TRUST_DIALOG_EXPR } from "./dismiss-trust-dialog.mjs";
|
|
18
19
|
import { resolveElectronCompatibility } from "./electron-compatibility.mjs";
|
|
20
|
+
import { EvalCapExceededError } from "./eval-cap-exceeded-error.mjs";
|
|
21
|
+
import { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from "./eval-cap.mjs";
|
|
19
22
|
import { exec } from "./exec.mjs";
|
|
20
23
|
import { log } from "./log.mjs";
|
|
21
24
|
import { ensureNamespaceBootstrapped } from "./namespace-bootstrap.mjs";
|
|
@@ -52,7 +55,6 @@ import {
|
|
|
52
55
|
resolveSandboxLaunchArguments,
|
|
53
56
|
shouldHideObsidianApp
|
|
54
57
|
} from "./visibility.mjs";
|
|
55
|
-
const COMMAND_TIMEOUT_IN_MILLISECONDS = 3e4;
|
|
56
58
|
const VAULT_ID_BYTE_LENGTH = 8;
|
|
57
59
|
const USER_DATA_RM_TIMEOUT_IN_MILLISECONDS = 1e4;
|
|
58
60
|
const USER_DATA_RM_RETRY_INTERVAL_IN_MILLISECONDS = 500;
|
|
@@ -89,6 +91,17 @@ class DesktopCdpTransport {
|
|
|
89
91
|
messageId = 0;
|
|
90
92
|
ownedConfig;
|
|
91
93
|
ownedInstance;
|
|
94
|
+
/**
|
|
95
|
+
* The in-flight commands of every socket this transport has opened, keyed by
|
|
96
|
+
* the CDP message id each is waiting for. One entry per command, added by
|
|
97
|
+
* {@link sendCommand} and removed by whichever of the reply and the timeout
|
|
98
|
+
* comes first — see {@link getPendingCommands} for why this exists at all.
|
|
99
|
+
*
|
|
100
|
+
* Weak by socket so a closed temporary connection is collectable with its
|
|
101
|
+
* pending map; the dispatcher listener is the socket's own, so nothing here
|
|
102
|
+
* keeps it alive.
|
|
103
|
+
*/
|
|
104
|
+
pendingCommandsBySocket = /* @__PURE__ */ new WeakMap();
|
|
92
105
|
/**
|
|
93
106
|
* Vault paths THIS transport opened via {@link registerVault}, normalized by
|
|
94
107
|
* {@link normalizeVaultPathForComparison}. A worker attached to a
|
|
@@ -110,7 +123,10 @@ class DesktopCdpTransport {
|
|
|
110
123
|
const {
|
|
111
124
|
cdpHost = "localhost",
|
|
112
125
|
cdpPort,
|
|
113
|
-
|
|
126
|
+
// A test's closure travels as one `Runtime.evaluate` CDP command, so the
|
|
127
|
+
// Command budget IS the per-eval cap on this transport — hence the shared
|
|
128
|
+
// Constant rather than a desktop-specific number that happens to match.
|
|
129
|
+
commandTimeoutInMilliseconds = DEFAULT_EVAL_CAP_IN_MILLISECONDS,
|
|
114
130
|
configDirectory,
|
|
115
131
|
deadBootGraceInMilliseconds = DEFAULT_DEAD_BOOT_GRACE_IN_MILLISECONDS,
|
|
116
132
|
isHarnessOwnedInstance = false,
|
|
@@ -224,11 +240,24 @@ class DesktopCdpTransport {
|
|
|
224
240
|
*/
|
|
225
241
|
async evaluate(expression, options) {
|
|
226
242
|
const ws = await this.ensureConnection(options.cwd);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
243
|
+
let response;
|
|
244
|
+
try {
|
|
245
|
+
response = await this.sendCommand(ws, "Runtime.evaluate", {
|
|
246
|
+
awaitPromise: true,
|
|
247
|
+
expression,
|
|
248
|
+
returnByValue: true
|
|
249
|
+
});
|
|
250
|
+
} catch (error) {
|
|
251
|
+
if (error instanceof CdpCommandTimeoutError) {
|
|
252
|
+
throw new EvalCapExceededError({
|
|
253
|
+
capInMilliseconds: this.commandTimeoutInMilliseconds,
|
|
254
|
+
cause: error,
|
|
255
|
+
optionName: "commandTimeoutInMilliseconds",
|
|
256
|
+
transportName: "desktop (CDP)"
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
232
261
|
if (response.result?.exceptionDetails) {
|
|
233
262
|
const desc = response.result.exceptionDetails.exception?.description ?? response.result.exceptionDetails.text;
|
|
234
263
|
throw new Error(`CDP evaluation error: ${desc}`);
|
|
@@ -730,6 +759,54 @@ class DesktopCdpTransport {
|
|
|
730
759
|
const targets = await response.json();
|
|
731
760
|
return targets.filter((t) => t.type === "page");
|
|
732
761
|
}
|
|
762
|
+
/**
|
|
763
|
+
* Returns a socket's in-flight command map, installing its reply dispatcher on
|
|
764
|
+
* first use.
|
|
765
|
+
*
|
|
766
|
+
* ONE `message` listener per socket, for the socket's whole life — not one per
|
|
767
|
+
* command. A listener per in-flight command makes the count scale with how many
|
|
768
|
+
* evaluations a suite has in flight at once, so a consumer that fires eleven
|
|
769
|
+
* concurrent `evalInObsidian` calls crosses Node's default `maxListeners` of 10
|
|
770
|
+
* and is told its transport is leaking memory, which it is not: measured
|
|
771
|
+
* 2026-09-15, fifteen concurrent evaluations registered fifteen listeners on the
|
|
772
|
+
* one long-lived socket and the count fell back to zero the moment they settled.
|
|
773
|
+
* A warning that fires on correct use is worse than no warning, because the real
|
|
774
|
+
* signal — an entry that is added and never removed — is then indistinguishable
|
|
775
|
+
* from it. With one dispatcher the listener count is a constant, and a genuine
|
|
776
|
+
* leak shows instead as a pending map that never empties.
|
|
777
|
+
*
|
|
778
|
+
* The dispatcher is deliberately forgiving about what arrives: a CDP **event**
|
|
779
|
+
* carries no `id` and belongs to no command, and a frame that is not JSON at all
|
|
780
|
+
* belongs to nothing this transport sent. Both are ignored. The old per-command
|
|
781
|
+
* handler parsed unguarded, so one frame that is not JSON threw once per
|
|
782
|
+
* in-flight command, out of the event dispatch, where nothing could catch it.
|
|
783
|
+
*
|
|
784
|
+
* @param ws - The socket whose replies are being awaited.
|
|
785
|
+
* @returns The socket's map of in-flight commands, keyed by CDP message id.
|
|
786
|
+
*/
|
|
787
|
+
getPendingCommands(ws) {
|
|
788
|
+
const existingPendingCommands = this.pendingCommandsBySocket.get(ws);
|
|
789
|
+
if (existingPendingCommands) {
|
|
790
|
+
return existingPendingCommands;
|
|
791
|
+
}
|
|
792
|
+
const pendingCommands = /* @__PURE__ */ new Map();
|
|
793
|
+
this.pendingCommandsBySocket.set(ws, pendingCommands);
|
|
794
|
+
ws.addEventListener("message", (event) => {
|
|
795
|
+
let message;
|
|
796
|
+
try {
|
|
797
|
+
message = JSON.parse(String(event.data));
|
|
798
|
+
} catch {
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
const pendingCommand = pendingCommands.get(message.id);
|
|
802
|
+
if (!pendingCommand) {
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
pendingCommands.delete(message.id);
|
|
806
|
+
pendingCommand(message);
|
|
807
|
+
});
|
|
808
|
+
return pendingCommands;
|
|
809
|
+
}
|
|
733
810
|
/**
|
|
734
811
|
* Kills the currently-running owned instance (if any) and waits for it to exit,
|
|
735
812
|
* so the next launch gets a pristine single-window instance.
|
|
@@ -1029,21 +1106,23 @@ class DesktopCdpTransport {
|
|
|
1029
1106
|
*/
|
|
1030
1107
|
async sendCommand(ws, method, params) {
|
|
1031
1108
|
const id = ++this.messageId;
|
|
1109
|
+
const pendingCommands = this.getPendingCommands(ws);
|
|
1032
1110
|
return new Promise((resolve, reject) => {
|
|
1033
1111
|
const timeout = setTimeout(() => {
|
|
1034
|
-
|
|
1035
|
-
reject(new
|
|
1112
|
+
pendingCommands.delete(id);
|
|
1113
|
+
reject(new CdpCommandTimeoutError({ method, timeoutInMilliseconds: this.commandTimeoutInMilliseconds }));
|
|
1036
1114
|
}, this.commandTimeoutInMilliseconds);
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1115
|
+
pendingCommands.set(id, (response) => {
|
|
1116
|
+
clearTimeout(timeout);
|
|
1117
|
+
resolve(response);
|
|
1118
|
+
});
|
|
1119
|
+
try {
|
|
1120
|
+
ws.send(JSON.stringify({ id, method, params }));
|
|
1121
|
+
} catch (error) {
|
|
1122
|
+
clearTimeout(timeout);
|
|
1123
|
+
pendingCommands.delete(id);
|
|
1124
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
1044
1125
|
}
|
|
1045
|
-
ws.addEventListener("message", handler);
|
|
1046
|
-
ws.send(JSON.stringify({ id, method, params }));
|
|
1047
1126
|
});
|
|
1048
1127
|
}
|
|
1049
1128
|
/**
|
|
@@ -1198,4 +1277,4 @@ async function getObsidianLaunchCommand(port) {
|
|
|
1198
1277
|
export {
|
|
1199
1278
|
DesktopCdpTransport
|
|
1200
1279
|
};
|
|
1201
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnktZmFsbGJhY2stZXJyb3IubWpzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLm1qcyc7XG5pbXBvcnQge1xuICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcsXG4gIGdldFZhdWx0SWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQgeyBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBjb3B5QXNhckludG9Vc2VyRGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2gubWpzJztcbmltcG9ydCB7IHJlYWRPd25lZEluc3RhbmNlRXhpdE1hcmtlciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcixcbiAgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yXG59IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBidWlsZE93bmVkT2JzaWRpYW5Kc29uIH0gZnJvbSAnLi9vd25lZC12YXVsdC1zZWVkLm1qcyc7XG5pbXBvcnQgeyBidWlsZFBhcmVudExpdmVuZXNzV2F0Y2hkb2dFeHByZXNzaW9uIH0gZnJvbSAnLi9wYXJlbnQtbGl2ZW5lc3MubWpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfREVBRF9CT09UX0dSQUNFX0lOX01JTExJU0VDT05EUyxcbiAgcmVzb2x2ZVJlbmRlcmVyQm9vdFN0YXRlXG59IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfSBmcm9tICcuL3JlbmRlcmVyLWZhaWxlZC10by1pbml0aWFsaXplLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciB9IGZyb20gJy4vc2lsZW50LWFzYXItZmFsbGJhY2stZXJyb3IubWpzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5tanMnO1xuaW1wb3J0IHtcbiAgYXJlVmF1bHRQYXRoc01hdGNoaW5nLFxuICBub3JtYWxpemVWYXVsdFBhdGhGb3JDb21wYXJpc29uXG59IGZyb20gJy4vdmF1bHQtcGF0aC1tYXRjaC5tanMnO1xuaW1wb3J0IHsgc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvdyB9IGZyb20gJy4vdmF1bHQtdGVhcmRvd24tdmVyZGljdC5tanMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZU93bmVkSGlkZGVuTGF1bmNoQXJndW1lbnRzLFxuICByZXNvbHZlU2FuZGJveExhdW5jaEFyZ3VtZW50cyxcbiAgc2hvdWxkSGlkZU9ic2lkaWFuQXBwXG59IGZyb20gJy4vdmlzaWJpbGl0eS5tanMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBDRFAgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcge1xuICAvKipcbiAgICogQ0RQIGhvc3QuIERlZmF1bHRzIHRvIGAnbG9jYWxob3N0J2AuXG4gICAqL1xuICBjZHBIb3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBmb3IgKiphdHRhY2gqKiBtb2RlICh0aGUgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCB0aGUgcnVubmluZ1xuICAgKiBPYnNpZGlhbiB3YXMgbGF1bmNoZWQgd2l0aCkuIEluIG93bmVkLWluc3RhbmNlIG1vZGUgdGhpcyBpcyBpZ25vcmVkIFx1MjAxNCBhXG4gICAqIGZyZWUgcG9ydCBpcyBjaG9zZW4gYXQgbGF1bmNoLlxuICAgKi9cbiAgY2RwUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byBgMzAwMDBgLlxuICAgKi9cbiAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0J3MgY29uZmlnIGZvbGRlciBvdmVycmlkZSAoT2JzaWRpYW4ncyAqT3ZlcnJpZGUgY29uZmlnIGZvbGRlciopLFxuICAgKiBlLmcuIGAnLm9ic2lkaWFuLWRlc2t0b3AnYC4gV2hlbiBzZXQsIHRoZSBvd25lZCBpbnN0YW5jZSBib290cyB0byB0aGVcbiAgICogc3RhcnRlciBzY3JlZW4sIHdyaXRlcyBgPHZhdWx0SWQ+LWNvbmZpZ2AgaW50byB0aGF0IHJlbmRlcmVyJ3NcbiAgICogYGxvY2FsU3RvcmFnZWAsIGFuZCBvbmx5IHRoZW4gb3BlbnMgdGhlIHZhdWx0IG92ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgXHUyMDE0XG4gICAqIHRoZSBvdmVycmlkZSBpcyByZWFkIG9uY2UsIGR1cmluZyB0aGUgdmF1bHQgcmVuZGVyZXIncyBvd24gc2V0dXAsIHNvIGl0IGhhc1xuICAgKiB0byBleGlzdCBiZWZvcmUgdGhhdCB3aW5kb3cgaXMgY3JlYXRlZC4gVGhlIG9wZW5lZCB2YXVsdCdzIGFjdHVhbFxuICAgKiBgYXBwLnZhdWx0LmNvbmZpZ0RpcmAgaXMgdGhlbiByZWFkIGJhY2ssIGFuZCBhIG1pc21hdGNoIHRocm93c1xuICAgKiB7QGxpbmsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcn0uIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYCAoT2JzaWRpYW4ncyBvd24gZGVmYXVsdCwgYC5vYnNpZGlhbmApXG4gICAqL1xuICBjb25maWdEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhIGRlYWQgYm9vdCBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UgKGVtcHR5IGA8Ym9keT5gIHdpdGggbm8gYHdpbmRvdy5hcHBgIGFmdGVyIHRoZSByZW5kZXJlciByZWFjaGVkXG4gICAqIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTfS4gYDBgIGRpc2FibGVzIGZhc3QtZmFpbC5cbiAgICovXG4gIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBhdHRhY2hpbmcgKGkuZS4ge0BsaW5rIGNkcFBvcnR9IGlzIHNldCksIG1hcmtzIHRoZSB0YXJnZXQgYXMgYVxuICAgKiAqKmhhcm5lc3Mtb3duZWQsIGFscmVhZHktcHJlcGFyZWQqKiBpbnN0YW5jZS4gU3VwcHJlc3NlcyB0aGUgdXNlci1zY29wZVxuICAgKiB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0LCBzaW5jZSB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhblxuICAgKiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIHJhdGhlciB0aGFuIHRoZSB1c2VyLXNjb3BlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIFdoZW4gYGZhbHNlYCAodGhlXG4gICAqIGRlZmF1bHQpLCB0aGUgb3duZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgd2l0aCBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZFxuICAgKiBpdHMgd2luZG93IGlzIG1vdmVkIG9mZi1zY3JlZW4gYWZ0ZXIgbGF1bmNoLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTtcbiAgICogYXR0YWNoIG1vZGUgbmV2ZXIgdG91Y2hlcyB0aGUgKHVzZXIncykgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2VcbiAgICogaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIG1vZGUuXG4gICAqL1xuICBvd25lZEluc3RhbmNlPzogT3duZWRJbnN0YW5jZUNvbmZpZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZFxuICAgKiBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSSBhcyBhXG4gICAqIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcG9zdC1ib290ICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiAodGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZGlmZmVyc1xuICAgKiBmcm9tIHRoZSBzd2FwcGVkLWluIHBpbikgZmFpbHMgZmFzdCB3aXRoIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0uIFRoZVxuICAgKiB2ZXJkaWN0IGlzIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhXG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEFzYXJGYWxsYmFja307IHRoaXMgZ2F0ZXMgb25seSB0aGUgdGhyb3cuIE9ubHlcbiAgICogbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlIHJ1bm5pbmcgYSBzd2FwcGVkLWluIGFzYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QtYm9vdCBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgbmFnIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBUaGUgdmVyZGljdCBpc1xuICAgKiBhbHdheXMgY29tcHV0ZWQgYW5kIHN1cmZhY2VkIHZpYSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9O1xuICAgKiB0aGlzIG9ubHkgZ2F0ZXMgdGhlIGxvZy4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gYXNhciB0byBwcm92aXNpb24gaW50byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UncyB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkL3NvdXJjZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBhc2FyJ3MgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKlxuICogV2hlbiBwcmVzZW50LCB0aGUgdHJhbnNwb3J0IGxhdW5jaGVzIGFuZCBvd25zIGl0cyBvd24gT2JzaWRpYW4gcHJvY2Vzc1xuICogYWdhaW5zdCBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYXR0YWNoaW5nIHRvIGEgcnVubmluZyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQ29uZmlnIHtcbiAgLyoqXG4gIE9wdGlvbmFsIGFzYXIgdG8gcHJvdmlzaW9uIGludG8ge0BsaW5rIHVzZXJEYXRhRGlyZWN0b3J5fSBiZWZvcmUgbGF1bmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VBc2FyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgd2hlbiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIChhbiBhc2FyLXN3YXAgb250byBhIGtub3duIHNoZWxsIHZlcnNpb24pLiBTdXJmYWNlZCBieVxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5fS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzXG4gICAqIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoYHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZSBjb25maWcgaXMgYnVpbHQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuIENyZWF0ZWQgYW5kIG93bmVkIGJ5IHRoZVxuICAgKiB0cmFuc3BvcnQsIGFuZCBkZWxldGVkIG9uIGRpc3Bvc2UuXG4gICAqL1xuXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIENEUCBlbmRwb2ludCBvZiBhIGxhdW5jaGVkLCBoYXJuZXNzLW93bmVkIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VFbmRwb2ludCB7XG4gIC8qKlxuICBDRFAgaG9zdCAoZS5nLiBgJ2xvY2FsaG9zdCdgKS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGZyZWUgQ0RQIHBvcnQgdGhlIG93bmVkIGluc3RhbmNlIHdhcyBsYXVuY2hlZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENkcEV4Y2VwdGlvbkRldGFpbHMge1xuICBleGNlcHRpb24/OiBDZHBFeGNlcHRpb25PYmplY3Q7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcEV4Y2VwdGlvbk9iamVjdCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwUmVzcG9uc2Uge1xuICBpZDogbnVtYmVyO1xuICByZXN1bHQ/OiBDZHBSZXNwb25zZVJlc3VsdDtcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSByZXR1cm5lZCBieSBgUGFnZS5jYXB0dXJlU2NyZWVuc2hvdGAuXG4gICAqL1xuICByZWFkb25seSBkYXRhPzogc3RyaW5nO1xuICByZWFkb25seSBleGNlcHRpb25EZXRhaWxzPzogQ2RwRXhjZXB0aW9uRGV0YWlscztcbiAgcmVhZG9ubHkgcmVzdWx0PzogQ2RwVmFsdWU7XG59XG5cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICB3ZWJTb2NrZXREZWJ1Z2dlclVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwVmFsdWUge1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlPzogdW5rbm93bjtcbn1cblxuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbmNvbnN0IFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbmNvbnN0IFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLy8gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIG9jY2FzaW9uYWxseSBib290cyB3aXRob3V0IHRoZSB3b3Jrc3BhY2UgZXZlclxuLy8gSW5pdGlhbGl6aW5nLCBzbyB0aGUgdmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhblxuLy8gSW5kZXBlbmRlbnQgY2hhbmNlOyByZWxhdW5jaCB1cCB0byB0aGlzIG1hbnkgdGltZXMgYmVmb3JlIGdpdmluZyB1cC5cbmNvbnN0IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMgPSAzO1xuLy8gQnJpZWYgc2V0dGxlIGJlZm9yZSBhIHJlbGF1bmNoIHNvIHRoZSBraWxsZWQgaW5zdGFuY2UncyBtZW1vcnkvaGFuZGxlcyBhcmVcbi8vIFJlY2xhaW1lZCBiZWZvcmUgdGhlIG5leHQgYm9vdCBcdTIwMTQgaW1wcm92ZXMgdGhlIG9kZHMgb24gYSBsb2FkZWQgbWFjaGluZS5cbmNvbnN0IE9XTkVEX1JFTEFVTkNIX1NFVFRMRV9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBzdGFydGVyIHNjcmVlbidzIHJlbmRlcmVyIHRvIGV4cG9zZSBgbG9jYWxTdG9yYWdlYFxuLy8gQW5kIGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXJgIFx1MjAxNCB0aGUgdHdvIHRoaW5ncyB0aGUgY29uZmlnLWZvbGRlciBvdmVycmlkZVxuLy8gTmVlZHMuIENEUCBhbHJlYWR5IHNlcnZlcyBhIHBhZ2UgdGFyZ2V0IGJ5IHRoZSB0aW1lIHRoZSBsYXVuY2ggcmVzb2x2ZXMsIHNvXG4vLyBUaGlzIG9ubHkgY292ZXJzIHRoZSByZW5kZXJlciBmaW5pc2hpbmcgaXRzIG93biBzY3JpcHQgZXZhbHVhdGlvbi5cbmNvbnN0IFNUQVJURVJfU0NSRUVOX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuY29uc3QgU1RBUlRFUl9TQ1JFRU5fUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyNTA7XG5jb25zdCBPV05FRF9XSU5ET1dfT0ZGU0NSRUVOX01BUkdJTl9JTl9QSVhFTFMgPSAyMDA7XG5jb25zdCBPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDIwXzAwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjUwO1xuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIERlc2t0b3AgT2JzaWRpYW4gdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbC5cbiAqXG4gKiBDb25uZWN0cyB0byBPYnNpZGlhbidzIENEUCBXZWJTb2NrZXQgZW5kcG9pbnQsIHNlbmRzIGBSdW50aW1lLmV2YWx1YXRlYFxuICogY29tbWFuZHMsIGFuZCByb3V0ZXMgZXhwcmVzc2lvbnMgdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0LlxuICovXG5leHBvcnQgY2xhc3MgRGVza3RvcENkcFRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGBmYWxzZWAgZm9yIHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTW9iaWxlID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aXZlVmF1bHRQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBhc2FyRmFsbGJhY2s6IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHBIb3N0OiBzdHJpbmc7XG4gIHByaXZhdGUgY2RwUG9ydDogbnVtYmVyO1xuICBwcml2YXRlIGNkcFVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdEaXJlY3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbGVjdHJvbkNvbXBhdGliaWxpdHk6IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBib29sZWFuO1xuICBwcml2YXRlIG1lc3NhZ2VJZCA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3duZWRDb25maWc6IE93bmVkSW5zdGFuY2VDb25maWcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb3duZWRJbnN0YW5jZTogT3duZWRPYnNpZGlhbkluc3RhbmNlIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVmF1bHQgcGF0aHMgVEhJUyB0cmFuc3BvcnQgb3BlbmVkIHZpYSB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0sIG5vcm1hbGl6ZWQgYnlcbiAgICoge0BsaW5rIG5vcm1hbGl6ZVZhdWx0UGF0aEZvckNvbXBhcmlzb259LiBBIHdvcmtlciBhdHRhY2hlZCB0byBhXG4gICAqIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgbWF5IHRlYXIgZG93biBvbmx5IHRoZXNlIFx1MjAxNCBldmVyeSBvdGhlciB2YXVsdCBpbiB0aGF0XG4gICAqIGluc3RhbmNlIGJlbG9uZ3MgdG8gdGhlIGdsb2JhbCBzZXR1cCB0aGF0IGxhdW5jaGVkIGl0IChzZWVcbiAgICoge0BsaW5rIHNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3d9KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZlJlZ2lzdGVyZWRWYXVsdFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xuICBwcml2YXRlIHdzOiBudWxsIHwgV2ViU29ja2V0ID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDRFAgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ0RQIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgLy8gRGVzdHJ1Y3R1cmUgd2l0aCBwZXItZmllbGQgZGVmYXVsdHMgKGVhY2ggYXBwbGllcyB3aGVuIHRoZSBmaWVsZCBpcyBvbWl0dGVkLFxuICAgIC8vIEV4YWN0bHkgbGlrZSB0aGUgZm9ybWVyIGBjb25maWc/LnggPz8gZGVmYXVsdGApIHNvIHRoZSBjb25zdHJ1Y3RvciBzdGF5c1xuICAgIC8vIFVuZGVyIHRoZSBjeWNsb21hdGljLWNvbXBsZXhpdHkgbGltaXQgYXMgZmllbGRzIGFyZSBhZGRlZC5cbiAgICBjb25zdCB7XG4gICAgICBjZHBIb3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgICBjZHBQb3J0LFxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBjb25maWdEaXJlY3RvcnksXG4gICAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPSBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlID0gZmFsc2UsXG4gICAgICBpc09ic2lkaWFuQXBwVmlzaWJsZSA9IHRydWUsXG4gICAgICBvd25lZEluc3RhbmNlLFxuICAgICAgc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBmYWxzZSxcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sgPSB0cnVlLFxuICAgICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyA9IHRydWVcbiAgICB9ID0gY29uZmlnID8/IHt9O1xuICAgIHRoaXMuY2RwSG9zdCA9IGNkcEhvc3Q7XG4gICAgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzID0gY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmNvbmZpZ0RpcmVjdG9yeSA9IGNvbmZpZ0RpcmVjdG9yeTtcbiAgICB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBpc0hhcm5lc3NPd25lZEluc3RhbmNlO1xuICAgIHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUgPSBpc09ic2lkaWFuQXBwVmlzaWJsZTtcbiAgICB0aGlzLm93bmVkQ29uZmlnID0gb3duZWRJbnN0YW5jZTtcbiAgICB0aGlzLnNob3VsZERpc2FibGVTYW5kYm94ID0gc2hvdWxkRGlzYWJsZVNhbmRib3g7XG4gICAgdGhpcy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrID0gc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaztcbiAgICB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgPSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzO1xuICAgIC8vIE93bmVkIG1vZGUgcGlja3MgYSBmcmVlIHBvcnQgYXQgbGF1bmNoIChhc3NpZ25lZCBpbiByZWdpc3RlclZhdWx0KS5cbiAgICAvLyBBdHRhY2ggbW9kZSBjb25uZWN0cyB0byB0aGUgY29uZmlndXJlZCBwb3J0OyBubyBwb3J0IGlzIGhhcmRjb2RlZC5cbiAgICB0aGlzLmNkcFBvcnQgPSBjZHBQb3J0ID8/IDA7XG4gICAgdGhpcy5jZHBVcmwgPSBjZHBQb3J0ID09PSB1bmRlZmluZWQgPyAnJyA6IGBodHRwOi8vJHtjZHBIb3N0fToke1N0cmluZyhjZHBQb3J0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIE9ic2lkaWFuIHdpbmRvdyBzaG93aW5nIHRoZSBnaXZlbiB2YXVsdC5cbiAgICpcbiAgICogV2hlbiBhIHNpemUgaXMgcmVxdWVzdGVkIHRoZSB2aWV3cG9ydCBpcyBwaW5uZWQgdG8gaXQgd2l0aFxuICAgKiBgRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZWAgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FwdHVyZSwgc28gdGhlXG4gICAqIGVtaXR0ZWQgUE5HIGlzIGV4YWN0bHkgdGhhdCBzaXplIHdoYXRldmVyIHNpemUgdGhlIHdpbmRvdyBoYXBwZW5zIHRvIGJlIFx1MjAxNFxuICAgKiBhbmQgdGhlIG92ZXJyaWRlIGlzIGFsd2F5cyBjbGVhcmVkIGFmdGVyd2FyZHMsIGluY2x1ZGluZyB3aGVuIHRoZSBjYXB0dXJlXG4gICAqIHRocm93cywgc28gYSBmYWlsZWQgY2FwdHVyZSBjYW5ub3QgbGVhdmUgdGhlIHdpbmRvdyBzdHVjayBhdCB0aGUgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXaGljaCB2YXVsdCB3aW5kb3cgdG8gY2FwdHVyZSwgYW5kIHRoZSBleGFjdCBzaXplIHRvIGNhcHR1cmUgaXQgYXQuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIENEUCByZXR1cm5zIG5vIGltYWdlIGRhdGEsIG9yIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKHBhcmFtcy5jd2QpO1xuICAgIGNvbnN0IGRldmljZU1ldHJpY3NPdmVycmlkZSA9IGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlKHBhcmFtcyk7XG4gICAgaWYgKGRldmljZU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ0VtdWxhdGlvbi5zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUnLCBkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAvLyBUaGUgb3ZlcnJpZGUgYWxyZWFkeSBzaXplcyB0aGUgdmlld3BvcnQsIHNvIGNhcHR1cmluZyBiZXlvbmQgaXQgd291bGRcbiAgICAgICAgLy8gUmUtaW50cm9kdWNlIHRoZSBzY3JvbGwgaGVpZ2h0IHRoZSBvdmVycmlkZSBleGlzdHMgdG8gcGluIGRvd24uXG4gICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogJ3BuZydcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UucmVzdWx0Py5kYXRhO1xuICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUCBzY3JlZW5zaG90IGVycm9yOiBQYWdlLmNhcHR1cmVTY3JlZW5zaG90IHJldHVybmVkIG5vIGltYWdlIGRhdGEuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGRhdGEpO1xuICAgICAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDRFAgc2NyZWVuc2hvdCBlcnJvcjogUGFnZS5jYXB0dXJlU2NyZWVuc2hvdCByZXR1cm5lZCBkYXRhIHRoYXQgaXMgbm90IGEgUE5HLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ0VtdWxhdGlvbi5jbGVhckRldmljZU1ldHJpY3NPdmVycmlkZScsIHt9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBhbmQsIGluIG93bmVkLWluc3RhbmNlIG1vZGUsXG4gICAqIGtpbGxzIHRoZSBvd25lZCBPYnNpZGlhbiBwcm9jZXNzIGFuZCByZW1vdmVzIGl0cyBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbCBpcyByZXRyaWVkIGJlY2F1c2UgV2luZG93cyBicmllZmx5IGhvbGRzIHRoZSBqdXN0LWtpbGxlZFxuICAgKiBwcm9jZXNzJ3MgZmlsZSBoYW5kbGVzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgZmFpbCBgcm1TeW5jYCB3aXRoIGBFUEVSTWAuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAoIXRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm93bmVkSW5zdGFuY2U/LmtpbGwoKTtcbiAgICBjb25zdCB7IHVzZXJEYXRhRGlyZWN0b3J5IH0gPSB0aGlzLm93bmVkQ29uZmlnO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBpZiAoZGlkUmVtb3ZlRGlyZWN0b3J5KHVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShVU0VSX0RBVEFfUk1fUkVUUllfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgaWYgKCFkaWRSZW1vdmVEaXJlY3RvcnkodXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgcmVtb3ZlIG93bmVkIHVzZXItZGF0YSBkaXJlY3Rvcnkgd2l0aGluICR7U3RyaW5nKFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMgKG5vbi1mYXRhbCk6ICR7dXNlckRhdGFEaXJlY3Rvcnl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIGRpc3Bvc2FsIFx1MjAxNCBraWxscyB0aGUgb3duZWQgaW5zdGFuY2UgYW5kIG1ha2VzIGEgYmVzdC1lZmZvcnRcbiAgICogcmVtb3ZhbCBvZiBpdHMgdXNlci1kYXRhIGRpcmVjdG9yeS4gU2FmZSB0byBjYWxsIGZyb20gYSBwcm9jZXNzIGBleGl0YCBoYW5kbGVyXG4gICAqICh3aGVyZSBhc3luYyByZXRyaWVzIGFyZSBpbXBvc3NpYmxlOyBhIGxlZnRvdmVyIHRlbXAgZGlyZWN0b3J5IGlzIGFjY2VwdGFibGUpLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2U/LmtpbGwoKTtcbiAgICAgIGlmICghZGlkUmVtb3ZlRGlyZWN0b3J5KHRoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE93bmVkIHVzZXItZGF0YSBkaXJlY3Rvcnkgbm90IHJlbW92ZWQgc3luY2hyb25vdXNseSAocHJvY2VzcyBtYXkgc3RpbGwgaG9sZCBoYW5kbGVzKTogJHt0aGlzLm93bmVkQ29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIHZpYSBDRFAgYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICAgKlxuICAgKiBSb3V0ZXMgdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0IGJhc2VkIG9uIGBvcHRpb25zLmN3ZGAuXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHJlc3VsdCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ob3B0aW9ucy5jd2QpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICBleHByZXNzaW9uLFxuICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8uZXhjZXB0aW9uRGV0YWlscykge1xuICAgICAgY29uc3QgZGVzYyA9IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb25cbiAgICAgICAgPz8gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMudGV4dDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ0RQIGV2YWx1YXRpb24gZXJyb3I6ICR7ZGVzY31gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRPYmplY3QgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdE9iamVjdCB8fCByZXN1bHRPYmplY3QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHRPYmplY3QudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbGVudC1hc2FyLWZhbGxiYWNrIHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0IHdoZXRoZXIgdGhlXG4gICAqIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yIHRoZSBpbnN0YWxsZXJcbiAgICogc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIgKHJlYWQgbGl2ZSBwb3N0LWJvb3QpLiBSZXR1cm5zXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90IGJvb3RlZFxuICAgKiB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChubyBhc2FyIHdhcyBzd2FwcGVkLCBvciB0aGUgbGl2ZVxuICAgKiB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlKS4gQSBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW5cbiAgICogdGhlIHRocm93IGlzIGRpc2FibGVkICh7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrfVxuICAgKiBgZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0QXNhckZhbGxiYWNrKCk6IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXNhckZhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWRcbiAgICogaW5zdGFuY2UsIHNvIGNhbGxlcnMgY2FuIGFzc2VydCBvbiBpdC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90XG4gICAqIGFuIG93bmVkIGluc3RhbmNlLCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBhblxuICAgKiB1bmRldGVjdGFibGUgc2hlbGwgdmVyc2lvbiwgb3IgdGhlIGFwcCB2ZXJzaW9uIGlzIGFic2VudCBmcm9tIHRoZSB0YWJsZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBhdGliaWxpdHkoKTogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3duZWRDb25maWc/LmNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0XG4gICAqIHdoZXRoZXIgdGhlIEVsZWN0cm9uIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBpcyBuZXcgZW5vdWdoIGZvciB0aGVcbiAgICogcnVubmluZyBhcHAgdmVyc2lvbiAocmVhZCBsaXZlIHBvc3QtYm9vdDsgc2VlIHtAbGluayBPYnNpZGlhblZlcnNpb25NZXRhZGF0YS5taW5SZWNvbW1lbmRlZEVsZWN0cm9uVmVyc2lvbn0pLlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90XG4gICAqIGJvb3RlZCB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICh0aGUgbGl2ZSB2ZXJzaW9uIHdhc1xuICAgKiB1bnJlYWRhYmxlLCBvciB0aGUgYXBwIHZlcnNpb24gY2FycmllcyBubyByZWNvbW1lbmRlZCBFbGVjdHJvbiB2ZXJzaW9uKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHkoKTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQ0RQIGVuZHBvaW50IG9mIHRoZSBvd25lZCwgbGF1bmNoZWQgaW5zdGFuY2Ugc28gdGhlIGdsb2JhbCBzZXR1cFxuICAgKiBjYW4gaGFuZCBpdCB0byB0ZXN0IHdvcmtlcnMgKHdoaWNoIHRoZW4gKiphdHRhY2gqKiB0byBpdCBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyB0aGVpciBvd24pLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyB0cmFuc3BvcnQgaXMgbm90IGFuXG4gICAqIG93bmVkIGluc3RhbmNlLCBvciBpdHMgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG93bmVkIGluc3RhbmNlJ3MgQ0RQIGhvc3QgYW5kIHBvcnQsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpOiBPd25lZEluc3RhbmNlRW5kcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZyB8fCAhdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBob3N0OiB0aGlzLmNkcEhvc3QsIHBvcnQ6IHRoaXMuY2RwUG9ydCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIENEUCBlbmRwb2ludCBpcyByZWFjaGFibGUgYW5kIGhhcyBPYnNpZGlhbiB0YXJnZXRzLlxuICAgKlxuICAgKiBJZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgYXR0ZW1wdHMgdG8gYXV0by1zdGFydCBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCBwb2xscyB1bnRpbCBDRFAgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCAodXNlZCBmb3IgdmF1bHQgcmVnaXN0cmF0aW9uIGNoZWNrKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVmbGlnaHRDaGVjayh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnIHx8IHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgICAgLy8gT3duZWQgaW5zdGFuY2UgKGxhdW5jaGVkIGhlcmUpIG9yIGEgd29ya2VyIGF0dGFjaGVkIHRvIG9uZTogcmVhZGluZXNzIGlzXG4gICAgICAvLyBHdWFyYW50ZWVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAncyByZWdpc3RlclZhdWx0LCBhbmQgdGhlIHZhdWx0IGxpdmVzIGluXG4gICAgICAvLyBUaGUgaXNvbGF0ZWQgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSB1c2VyLXNjb3BlXG4gICAgICAvLyBSZWdpc3RyeS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyKCkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhZ2UgdGFyZ2V0cycpO1xuICAgICAgfVxuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ0RQIHJlYWNoYWJsZSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCB2aWEgRWxlY3Ryb24gSVBDIGV2YWx1YXRlZCB0aHJvdWdoIENEUC5cbiAgICpcbiAgICogVXNlcyBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQgdG8gc2VuZCB0aGUgYHZhdWx0LW9wZW5gIElQQyBjb21tYW5kLFxuICAgKiB0aGVuIHBvbGxzIHVudGlsIHRoZSBuZXcgdmF1bHQncyB0YXJnZXQgYXBwZWFycy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aCk7XG4gICAgLy8gUmVjb3JkZWQgb25seSBvbiBzdWNjZXNzLCBhbmQgb25seSBoZXJlOiB0aGlzIGlzIHRoZSBvbmUgYnJhbmNoIHRoYXQgb3BlbnNcbiAgICAvLyBBIHdpbmRvdyBpbiBhbiBpbnN0YW5jZSB0aGlzIHRyYW5zcG9ydCBkaWQgbm90IGxhdW5jaCwgc28gaXQgaXMgdGhlIG9uZVxuICAgIC8vIEJyYW5jaCB0aGF0IGVhcm5zIHRoZSByaWdodCB0byBjbG9zZSBvbmUgKHNlZSBgdW5yZWdpc3RlclZhdWx0YCkuXG4gICAgdGhpcy5zZWxmUmVnaXN0ZXJlZFZhdWx0UGF0aHMuYWRkKG5vcm1hbGl6ZVZhdWx0UGF0aEZvckNvbXBhcmlzb24odmF1bHRQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBieSBkZXN0cm95aW5nIGl0cyB3aW5kb3cgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBSZWZ1c2VzIHdoZW4gdGhpcyB0cmFuc3BvcnQgZG9lcyBub3Qgb3duIHdoYXQgaXQgd291bGQgYmUgdGVhcmluZyBkb3duIFx1MjAxNFxuICAgKiBzZWUge0BsaW5rIHNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3d9IGZvciB3aGljaCBvZiB0aGUgdHdvIG93bmVyc2hpcCBmbGFnc1xuICAgKiBtZWFucyB3aGF0LCBhbmQgd2h5IHRoZXkgYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYXVsdFBhdGggPSBub3JtYWxpemVWYXVsdFBhdGhGb3JDb21wYXJpc29uKHZhdWx0UGF0aCk7XG4gICAgaWYgKFxuICAgICAgIXNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3coe1xuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UsXG4gICAgICAgIGlzT3duZWRJbnN0YW5jZTogQm9vbGVhbih0aGlzLm93bmVkQ29uZmlnKSxcbiAgICAgICAgaXNTZWxmUmVnaXN0ZXJlZDogdGhpcy5zZWxmUmVnaXN0ZXJlZFZhdWx0UGF0aHMuaGFzKG5vcm1hbGl6ZWRWYXVsdFBhdGgpXG4gICAgICB9KVxuICAgICkge1xuICAgICAgbG9nKFxuICAgICAgICB0aGlzLm93bmVkQ29uZmlnXG4gICAgICAgICAgPyBgW2NkcC10cmFuc3BvcnRdIFNraXBwaW5nIHBlci12YXVsdCB0ZWFyZG93bjsgdGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZTogJHt2YXVsdFBhdGh9YFxuICAgICAgICAgIDogYFtjZHAtdHJhbnNwb3J0XSBTa2lwcGluZyBwZXItdmF1bHQgdGVhcmRvd247IHRoaXMgd29ya2VyIGRpZCBub3QgcmVnaXN0ZXIgdGhlIHZhdWx0IGl0IHdhcyBhc2tlZCB0byB1bnJlZ2lzdGVyOiAke3ZhdWx0UGF0aH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZlJlZ2lzdGVyZWRWYXVsdFBhdGhzLmRlbGV0ZShub3JtYWxpemVkVmF1bHRQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB3aW5kb3dEZXN0cm95RXhwcmVzc2lvbiA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5kZXN0cm95Q3VycmVudFdpbmRvdygpJztcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHdpbmRvd0Rlc3Ryb3lFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2luZG93IG1heSBhbHJlYWR5IGJlIGNsb3NlZC5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGB2YXVsdC1yZW1vdmVgIElQQyBpcyBzZW50IHRocm91Z2ggYSBzdGlsbC1vcGVuIHdpbmRvdyAoYHRhcmdldHNbMF1gKSBcdTIwMTRcbiAgICAgIC8vIGB2YXVsdFBhdGhgJ3Mgb3duIHdpbmRvdyB3YXMganVzdCBkZXN0cm95ZWQgYWJvdmUsIHNvIGJvb3RzdHJhcCB0aGUgbmFtZXNwYWNlXG4gICAgICAvLyBPbiB0aGUgZXhpc3Rpbmcgd2luZG93J3MgT1dOIGJhc2UgcGF0aCwgbm90IG9uIGB2YXVsdFBhdGhgICh3aGljaCBubyBsb25nZXIgaGFzXG4gICAgICAvLyBBIGxpdmUgdGFyZ2V0IHRvIG1hdGNoKS5cbiAgICAgIGNvbnN0IHJlbW92YWxUYXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKTtcbiAgICAgIGNvbnN0IHJlbW92YWxCYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgocmVtb3ZhbFRhcmdldCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHJlbW92YWxUYXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHJlbW92YWxCYXNlUGF0aCk7XG4gICAgICAgIGNvbnN0IHZhdWx0UmVtb3ZlRXhwcmVzc2lvbiA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbDogJ3ZhdWx0LXJlbW92ZScsIGNoYW5uZWxBcmd1bWVudHM6IFt2YXVsdFBhdGhdIH0pfSlgO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogdmF1bHRSZW1vdmVFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBObyBDRFAgdGFyZ2V0cyBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgIGRpZFJlbW92ZVZhdWx0RnJvbUNvbmZpZyh2YXVsdFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhbmQgc3RvcmVzIHRoZSBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCAob25cbiAgICoge0BsaW5rIGdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eX0pIGZyb20gYW4gYWxyZWFkeS1yZWFkIHZlcnNpb24gcGFpciwgd2FybmluZ1xuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBOZXZlciB0aHJvd3M7IGFcbiAgICogYm9vdCB3aG9zZSBydW5uaW5nIGFwcCB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlIGlzIHNraXBwZWQgKG5vdGhpbmcgdG8ganVkZ2UpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICogQHBhcmFtIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiAtIFRoZSBsaXZlIEVsZWN0cm9uIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlFbGVjdHJvbkNvbXBhdGliaWxpdHkoYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBhY3R1YWxFbGVjdHJvblZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSh7XG4gICAgICBhY3R1YWxFbGVjdHJvblZlcnNpb24sXG4gICAgICBhcHBWZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICAgIH0pO1xuICAgIHRoaXMuZWxlY3Ryb25Db21wYXRpYmlsaXR5ID0gdmVyZGljdDtcbiAgICBpZiAodmVyZGljdC50aWVyID09PSAnbmFnZ2VkJyAmJiB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdICR7ZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9pbnRzIHRoZSBvd25lZCBpbnN0YW5jZSdzIHJlbmRlcmVyIGF0IHRoaXMgcHJvY2VzcydzIGxpdmVuZXNzIHNvY2tldCBzbyBpdFxuICAgKiBkZXN0cm95cyBpdHNlbGYgaWYgd2UgZGllIHdpdGhvdXQgcnVubmluZyB0ZWFyZG93biAoc2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgKS5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQgYnkgZGVzaWduLiBBIHJlbmRlcmVyIHdpdGhvdXQgTm9kZSBhY2Nlc3MgcmVwb3J0cyBgJ3VuYXZhaWxhYmxlJ2BcbiAgICogYW5kIGFuIGV2YWx1YXRpb24gZmFpbHVyZSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZDogdGhlIHdhdGNoZG9nIGlzIGEgYmFja3N0b3BcbiAgICogZm9yIGFuIGFscmVhZHktYWJub3JtYWwgZXhpdCwgbmV2ZXIgYSByZWFzb24gdG8gZmFpbCBhbiBvdGhlcndpc2UgZ29vZCBsYXVuY2guXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICogQHBhcmFtIHBhcmVudExpdmVuZXNzUG9ydCAtIFRoZSBsb29wYmFjayBwb3J0IHRoZSByZW5kZXJlciBzaG91bGQgY29ubmVjdCBiYWNrIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcm1QYXJlbnRMaXZlbmVzc1dhdGNoZG9nKHZhdWx0UGF0aDogc3RyaW5nLCBwYXJlbnRMaXZlbmVzc1BvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24ocGFyZW50TGl2ZW5lc3NQb3J0KSwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBhcmVudC1saXZlbmVzcyB3YXRjaGRvZyBvbiBwb3J0ICR7U3RyaW5nKHBhcmVudExpdmVuZXNzUG9ydCl9OiAke3Jlc3VsdH0uYCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBhcm0gdGhlIHBhcmVudC1saXZlbmVzcyB3YXRjaGRvZyAoaW5zdGFuY2UgbWF5IG91dGxpdmUgYSBraWxsZWQgaGFybmVzcyk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHJlYWR5IHZhdWx0IGlzIGFjdHVhbGx5IHVzaW5nIHRoZSByZXF1ZXN0ZWQgY29uZmlnIGZvbGRlcixcbiAgICogdGhyb3dpbmcge0BsaW5rIENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3J9IHdoZW4gaXQgaXMgbm90LlxuICAgKlxuICAgKiBPYnNpZGlhbiBhcHBsaWVzIHRoZSBvdmVycmlkZSB3aXRoIGBzZXRDb25maWdEaXJgLCB3aGljaCBzdWJzdGl0dXRlc1xuICAgKiBgLm9ic2lkaWFuYCBmb3IgYW55IHZhbHVlIGl0cyBvd24gYHZhbGlkYXRlQ29uZmlnRGlyYCByZWplY3RzIFx1MjAxNCB3aXRob3V0IGFcbiAgICogd29yZCwgYW5kIHdpdGhvdXQgZmFpbGluZyB0aGUgYm9vdC4gVGhlIHJlc3VsdGluZyB2YXVsdCBvcGVucywgcmVhY2hlc1xuICAgKiBsYXlvdXQtcmVhZHksIGFuZCByZXBvcnRzIHN1Y2Nlc3M7IHdoYXQgaXQgbGFja3MgaXMgdGhlIHNldHRpbmdzIGFuZCBlbmFibGVkXG4gICAqIHBsdWdpbnMgb2YgdGhlIGZvbGRlciB0aGF0IHdhcyBhc2tlZCBmb3IuIFJlYWRpbmcgdGhlIGxpdmVcbiAgICogYGFwcC52YXVsdC5jb25maWdEaXJgIGJhY2sgaXMgdGhlIG9ubHkgd2F5IHRvIHRlbGwgdGhlIHR3byBhcGFydCwgYW5kIGl0XG4gICAqIGNvdmVycyBldmVyeSBjYXVzZSBhdCBvbmNlOiBhIG5hbWUgT2JzaWRpYW4gcmVqZWN0ZWQgKGluY2x1ZGluZyBpdHNcbiAgICogdW5yZWNvdmVyYWJsZSBjaGFyYWN0ZXIgYmxhY2tsaXN0LCB3aGljaCBgYXNzZXJ0VmFsaWRDb25maWdEaXJlY3RvcnlgIGRlbGliZXJhdGVseVxuICAgKiBkb2VzIG5vdCBndWVzcyBhdCksIGFuZCBhIHdyaXRlIHRoYXQgbmV2ZXIgcmVhY2hlZCB0aGUgdmF1bHQncyByZW5kZXJlci5cbiAgICpcbiAgICogQSBuby1vcCB3aGVuIG5vIG92ZXJyaWRlIHdhcyByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRSZXF1ZXN0ZWRDb25maWdEaXJlY3RvcnkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb25maWdEaXJlY3RvcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdHVhbENvbmZpZ0RpcmVjdG9yeSA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ2FwcC52YXVsdC5jb25maWdEaXInLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIGlmIChhY3R1YWxDb25maWdEaXJlY3RvcnkgPT09IHRoaXMuY29uZmlnRGlyZWN0b3J5KSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBWYXVsdCBvcGVuZWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbmZpZyBmb2xkZXIgJHt0aGlzLmNvbmZpZ0RpcmVjdG9yeX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3Ioe1xuICAgICAgYWN0dWFsQ29uZmlnRGlyZWN0b3J5LFxuICAgICAgcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5OiB0aGlzLmNvbmZpZ0RpcmVjdG9yeSxcbiAgICAgIHZhdWx0UGF0aFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZm9yIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSB0aGF0IGlzIG5vIGxvbmdlciBzZXJ2aW5nIENEUCxcbiAgICogZnJvbSB0aGUgYmVzdCBldmlkZW5jZSB0aGlzIHByb2Nlc3MgaGFzLlxuICAgKlxuICAgKiBUd28gcHJvY2Vzc2VzIHNlZSB0d28gZGlmZmVyZW50IGhhbHZlcyBvZiB0aGUgZGVhdGguIFRoZSBvbmUgdGhhdCBsYXVuY2hlZFxuICAgKiB0aGUgaW5zdGFuY2UgaG9sZHMgdGhlIGNoaWxkIGFuZCBjYW4gcmVhZCB0aGUgZXhpdCBjb2RlIHN0cmFpZ2h0IG9mZiBpdDsgYVxuICAgKiB0ZXN0IHdvcmtlciBob2xkcyBub3RoaW5nIGJ1dCB0aGUgcG9ydCwgYW5kIHJlYWRzIHRoZSBzYW1lIGZhY3RzIGZyb20gdGhlXG4gICAqIGV4aXQgbWFya2VyIHRoZSBvd25lciB3cm90ZSAoYG93bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLnRzYCkuIFdpdGggbmVpdGhlclxuICAgKiBcdTIwMTQgdGhlIG1hcmtlciBsb3N0LCBvciBhIGtpbGwgc28gYWJydXB0IG5vdGhpbmcgcmVjb3JkZWQgaXQgXHUyMDE0IHRoZSBlcnJvciBzdGlsbFxuICAgKiBuYW1lcyB0aGUgaW5zdGFuY2UgYXMgdGhlIGNhdXNlLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdyBpbiBwbGFjZSBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoKTogT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yIHtcbiAgICBjb25zdCBleGl0SW5mbyA9IHRoaXMub3duZWRJbnN0YW5jZT8ucmVhZEV4aXRJbmZvKCk7XG4gICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcih7XG4gICAgICAgIGNkcFVybDogdGhpcy5jZHBVcmwsXG4gICAgICAgIGNvZGU6IGV4aXRJbmZvLmNvZGUsXG4gICAgICAgIG91dHB1dFRhaWw6IHRoaXMub3duZWRJbnN0YW5jZT8ucmVhZE91dHB1dCgpLFxuICAgICAgICBzaWduYWw6IGV4aXRJbmZvLnNpZ25hbCxcbiAgICAgICAgc3Bhd25FcnJvcjogZXhpdEluZm8uc3Bhd25FcnJvclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcih0aGlzLmNkcFVybCwgcmVhZE93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHRoaXMuY2RwUG9ydCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCAoYXNhcikgdmVyc2lvbiBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiwgc3RvcmluZyB0aGVcbiAgICogdmVyZGljdCBvbiB7QGxpbmsgZ2V0QXNhckZhbGxiYWNrfS4gT24gYSAqKnNpbGVudCBmYWxsYmFjayoqICh0aGUgaW5zdGFsbGVyIHJhblxuICAgKiBpdHMgb3duIGJ1bmRsZWQgYXNhciBpbnN0ZWFkIG9mIHRoZSBwaW4pIGl0IHRocm93cyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9XG4gICAqIHdoZW4gdGhlIHRocm93IGlzIGVuYWJsZWQsIG90aGVyd2lzZSB3YXJucyAod2hlbiB3YXJuaW5ncyBhcmUgb24pIGFuZCBsZXRzIHRoZVxuICAgKiBib290IHByb2NlZWQuIEEgYm9vdCB3aXRoIG5vIHN3YXBwZWQtaW4gYXNhciwgb3IgYW4gdW5yZWFkYWJsZSBydW5uaW5nIHZlcnNpb24sXG4gICAqIGlzIGAndW5rbm93bidgIFx1MjAxNCBub3RoaW5nIGlzIHRocm93biBvciB3YXJuZWQuIFRoaXMgaXMgdGhlIGhlYWx0aHktVUkgY29tcGFuaW9uIHRvXG4gICAqIHRoZSBibGFjay1zY3JlZW4ge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9IGRlYWQtYm9vdCBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBwYXJhbSBydW5uaW5nQXBpVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tSdW50aW1lQXNhckZhbGxiYWNrKHJ1bm5pbmdBcGlWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUFzYXJGYWxsYmFjayh7XG4gICAgICByZXF1ZXN0ZWRWZXJzaW9uOiB0aGlzLm93bmVkQ29uZmlnPy5hc2FyPy52ZXJzaW9uLFxuICAgICAgcnVubmluZ0FwaVZlcnNpb25cbiAgICB9KTtcbiAgICB0aGlzLmFzYXJGYWxsYmFjayA9IHZlcmRpY3Q7XG5cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uKHtcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IHRoaXMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICAgIHRpZXI6IHZlcmRpY3QudGllclxuICAgIH0pO1xuICAgIGlmIChhY3Rpb24gPT09ICd0aHJvdycpIHtcbiAgICAgIHRocm93IG5ldyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcih7XG4gICAgICAgIHJlcXVlc3RlZFZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QucmVxdWVzdGVkVmVyc2lvbiksXG4gICAgICAgIHJ1bm5pbmdBcGlWZXJzaW9uOiBlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0LnJ1bm5pbmdBcGlWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICd3YXJuJykge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gJHtlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0Lm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBwb3N0LWJvb3QgcnVudGltZSBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIG9uY2UgdGhlXG4gICAqIHZhdWx0IGlzIHJlYWR5LiBSZWFkcyB0aGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFuZCBFbGVjdHJvbiB2ZXJzaW9uICoqb25jZSoqXG4gICAqIGZyb20gdGhlIGJvb3RlZCByZW5kZXJlcidzIG1haW4gcHJvY2VzcywgdGhlbjogKDEpIHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcFxuICAgKiB2ZXJzaW9uIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluIFx1MjAxNCB0aHJvd2luZyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9IG9uXG4gICAqIGEgc2lsZW50IGZhbGxiYWNrICh3aGVuIGVuYWJsZWQpOyBhbmQgKDIpIHJ1bnMgdGhlIGJlc3QtZWZmb3J0IHJ1bnRpbWUtRWxlY3Ryb25cbiAgICogbmFnLiBPbmx5IHRoZSBhc2FyLWZhbGxiYWNrIGNoZWNrIGNhbiB0aHJvdywgc28gdGhpcyBtdXN0IHJ1biBvdXRzaWRlIHRoZVxuICAgKiByZWFkaW5lc3MgcG9sbCdzIHRyeS9jYXRjaCAoYSBzd2FsbG93ZWQgdGhyb3cgd291bGQgbG9vcCB1bnRpbCB0aW1lb3V0KS5cbiAgICpcbiAgICogQm90aCBhcmUgcmVhZCBhdCB0aGUgcmVuZGVyZXIgdG9wIGxldmVsOiBgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZlcnNpb24nKWAgKHRoZVxuICAgKiBydW5uaW5nIGFwcCB2ZXJzaW9uLCB0cnV0aGZ1bCBldmVuIHVuZGVyIGEgc2lsZW50IGFzYXIgZmFsbGJhY2spIGFuZFxuICAgKiBgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbmAgKHRoZSBsaXZlIHNoZWxsIEVsZWN0cm9uKTsgbmVpdGhlciB1c2VzXG4gICAqIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggcmVzb2x2ZXMgb25seSBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBBIHJlYWRcbiAgICogZmFpbHVyZSBsZWF2ZXMgYm90aCB1bmtub3duIChsb2dnZWQsIG5vbi1mYXRhbCkgXHUyMDE0IGFuIHVucmVhZGFibGUgcnVubmluZyB2ZXJzaW9uXG4gICAqIGNhbm5vdCBiZSBqdWRnZWQgYSBmYWxsYmFjaywgc28gdGhlIGJvb3QgaXMgbm90IGJyb2tlbiBieSBhIGZsYWt5IHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjdHVhbEVsZWN0cm9uVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdBcHBWZXJzaW9uID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnU3RyaW5nKHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhcXCd2ZXJzaW9uXFwnKSknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgYXBwVmVyc2lvbiA9IHJhd0FwcFZlcnNpb24gPT09ICcnIHx8IHJhd0FwcFZlcnNpb24gPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogcmF3QXBwVmVyc2lvbjtcbiAgICAgIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyhwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZWFkIHJ1bnRpbWUgdmVyc2lvbnMgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGYWlscyBmYXN0ICh3aGVuIGVuYWJsZWQpIG9uIGEgc2lsZW50IGFzYXIgZmFsbGJhY2sgXHUyMDE0IE1VU1QgcnVuIGJlZm9yZSB0aGVcbiAgICAvLyBCZXN0LWVmZm9ydCBuYWcgYW5kIG91dHNpZGUgYW55IHRyeS9jYXRjaCBzbyB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgcG9sbC5cbiAgICB0aGlzLmNoZWNrUnVudGltZUFzYXJGYWxsYmFjayhhcHBWZXJzaW9uKTtcbiAgICB0aGlzLmFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb24sIGFjdHVhbEVsZWN0cm9uVmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYSBDRFAgdGFyZ2V0J3MgV2ViU29ja2V0IGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gY29ubmVjdCB0by5cbiAgICogQHJldHVybnMgVGhlIG9wZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb1RhcmdldCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHRhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgdG8gQ0RQIHRhcmdldDogJHt0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmx9YCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHdzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMud3MgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQWN0cyBhcyBhIHNhZmV0eSBuZXQgd2hlbiBgZW5hYmxlLXBsdWdpbi08aWQ+YCBpcyB3cml0dGVuIGluIG9uZSByZW5kZXJlclxuICAgKiBidXQgbm90IHlldCB2aXNpYmxlIHRvIHRoZSBuZXdseS1vcGVuZWQgdmF1bHQncyByZW5kZXJlciAocmFjZSBvYnNlcnZlZFxuICAgKiBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gQW4gb3BlbiBXZWJTb2NrZXQgdG8gYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0LlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHdzOiBXZWJTb2NrZXQsIHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZXJlIGlzIGFuIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gICAqXG4gICAqIFJldXNlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBpdCB0YXJnZXRzIHRoZSByZXF1ZXN0ZWQgdmF1bHQuXG4gICAqIE90aGVyd2lzZSwgZmluZHMgdGhlIGNvcnJlY3QgdGFyZ2V0IGFuZCByZWNvbm5lY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdGFyZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4gJiYgdGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMud3M7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgIHRoaXMud3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICAgIHJldHVybiB0aGlzLndzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIE9ic2lkaWFuIHdpdGggYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIG5vdCByZWFjaGFibGUuIFN0YXJ0aW5nIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZy4uLicpO1xuXG4gICAgY29uc3QgbGF1bmNoQ29tbWFuZCA9IGF3YWl0IGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCh0aGlzLmNkcFBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGxhdW5jaENvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBsYXVuY2ggY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIENEUCBlbmRwb2ludCBhdCAke3RoaXMuY2RwVXJsfSAodGltZW91dD0ke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IGRlbGF5KEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCByZWFkeSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ0RQIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nLi4uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgYWNjZXNzaWJsZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ0RQIHRhcmdldCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdmF1bHQgb3Blbi5cbiAgICpcbiAgICogUHJvYmVzIGV2ZXJ5IHRhcmdldCBieSBldmFsdWF0aW5nIGBnZXRCYXNlUGF0aCgpYCBhbmQgcmV0dXJucyB0aGUgb25lIHdob3NlXG4gICAqIGJhc2UgcGF0aCBtYXRjaGVzIGB2YXVsdFBhdGhgICh2aWEge0BsaW5rIGFyZVZhdWx0UGF0aHNNYXRjaGluZ30sIHRvbGVyYW50IG9mXG4gICAqIHNlcGFyYXRvci9jYXNlIGRpZmZlcmVuY2VzKS4gQSBzaW5nbGUgdGFyZ2V0IGlzICoqbm90KiogcmV0dXJuZWQgYmxpbmRseTogd2l0aFxuICAgKiBtb3JlIHRoYW4gb25lIHZhdWx0IG9wZW4gKGF0dGFjaCBtb2RlJ3Mgc2hhcmVkIGluc3RhbmNlKSwgdGhlIHNvbGUtdGFyZ2V0XG4gICAqIHNob3J0Y3V0IHdvdWxkIHJldHVybiB3aGljaGV2ZXIgd2luZG93IGhhcHBlbnMgdG8gYmUgb3BlbiByZWdhcmRsZXNzIG9mIHdoaWNoXG4gICAqIHZhdWx0IHdhcyByZXF1ZXN0ZWQgXHUyMDE0IHRoZSBleGFjdCBtaXMtcm91dGluZyB0aGlzIG1ldGhvZCBtdXN0IGF2b2lkLiBBIHRhcmdldFxuICAgKiB3aG9zZSBwcm9iZSB0aHJvd3MgaXMgdHJlYXRlZCBhcyBub3QtcmVhZHkgYW5kIHNraXBwZWQgKHRoZSBjYWxsZXIncyByZWFkaW5lc3NcbiAgICogcG9sbCByZXRyaWVzKTsgYSB0YXJnZXQgd2hvc2UgcHJvYmUgc3VjY2VlZHMgYnV0IGRvZXMgbm90IG1hdGNoIGlzIG5ldmVyXG4gICAqIHJldHVybmVkLiBXaGVuIG5vdGhpbmcgbWF0Y2hlcywgdGhyb3cgc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gbWF0Y2guXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBDRFAgdGFyZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENkcFRhcmdldD4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG5cbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgZm91bmQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgodGFyZ2V0KTtcbiAgICAgICAgaWYgKGFyZVZhdWx0UGF0aHNNYXRjaGluZyhiYXNlUGF0aCwgdmF1bHRQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBOb3QgYSB2YXVsdCB0YXJnZXQgb3Igbm90IHJlYWR5LlxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ0RQIHRhcmdldCBmb3VuZCBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgcGFnZS10eXBlIHRhcmdldHMgZnJvbSB0aGUgQ0RQIGAvanNvbmAgZW5kcG9pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHBhZ2UgdGFyZ2V0cy5cbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbm8gQ0RQIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlVGFyZ2V0cygpOiBQcm9taXNlPENkcFRhcmdldFtdPiB7XG4gICAgaWYgKCF0aGlzLmNkcFVybCkge1xuICAgICAgLy8gQW4gb3duZWQgaW5zdGFuY2UgcGlja3MgaXRzIHBvcnQgYXQgbGF1bmNoLCBzbyBiZWZvcmUgYHJlZ2lzdGVyVmF1bHRgIHRoZXJlIGlzIG5vIGVuZHBvaW50IGFuZFxuICAgICAgLy8gYHRoaXMuY2RwVXJsYCBpcyBzdGlsbCBlbXB0eSAtLSB3aGljaCB1c2VkIHRvIG1ha2UgdGhpcyBhIGBmZXRjaCgnL2pzb24nKWAgYW5kIGZhaWwgd2l0aFxuICAgICAgLy8gYEZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAvanNvbmAsIGFuIGVycm9yIG5hbWluZyBuZWl0aGVyIHRoZSB0cmFuc3BvcnQgbm9yIHdoYXQgd2VudCB3cm9uZy5cbiAgICAgIC8vIEEgdHJhbnNwb3J0IGluIHRoaXMgc3RhdGUgaXMgYWx3YXlzIGEgc3ltcHRvbSBvZiBzb21ldGhpbmcgdXBzdHJlYW0gKGEgZmFpbGVkIGdsb2JhbCBzZXR1cCwgYVxuICAgICAgLy8gV29ya2VyIHdpdGggbm8gcmVnaXN0ZXJlZCByZXNvbHZlcnMgLS0gTDkpLCBzbyBzYXkgc28gcmF0aGVyIHRoYW4gcmVwb3J0IGEgbWFsZm9ybWVkIFVSTC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIENEUCBlbmRwb2ludCBjb25maWd1cmVkOiB0aGUgb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldCwgYW5kIG5vIGBwb3J0YCAnXG4gICAgICAgICAgKyAnd2FzIGdpdmVuIHRvIGF0dGFjaCB0byBhIHJ1bm5pbmcgb25lLiBBIHRlc3Qgd29ya2VyIGluIHRoaXMgc3RhdGUgdXN1YWxseSBtZWFucyBpdHMgZ2xvYmFsIHNldHVwICdcbiAgICAgICAgICArICdmYWlsZWQsIG9yIHRoZSBwcm9qZWN0IGlzIG1pc3NpbmcgdGhlIHBlci13b3JrZXIgc2V0dXAgZmlsZSBpbiBgc2V0dXBGaWxlc2AuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY2RwVXJsfS9qc29uYCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBBbiB1bnJlYWNoYWJsZSBlbmRwb2ludCBtZWFucyBkaWZmZXJlbnQgdGhpbmdzIGluIHRoZSB0d28gbW9kZXMsIGFuZFxuICAgICAgICogY29uZmxhdGluZyB0aGVtIGlzIHdoYXQgcHJvZHVjZWQgdGhlIGBFQ09OTlJFRlVTRURgIGNhc2NhZGVzLiBUaGVcbiAgICAgICAqIGhhcm5lc3Mgb3ducyB0aGlzIHBvcnQgYW5kIG5vdGhpbmcgZWxzZSBtYXkgaG9sZCBpdCwgc28gbm90aGluZ1xuICAgICAgICogYW5zd2VyaW5nIG1lYW5zIE9VUiBpbnN0YW5jZSBpcyBnb25lIFx1MjAxNCBzYXkgdGhhdCwgd2l0aCBpdHMgZXhpdCBjb2RlXG4gICAgICAgKiB3aGVuIGl0IGlzIGtub3duLiBJbiBwbGFpbiBhdHRhY2ggbW9kZSB0aGUgZW5kcG9pbnQgYmVsb25ncyB0byBhXG4gICAgICAgKiBmb3JlaWduIE9ic2lkaWFuIHRoYXQgaXMgc2ltcGx5IG5vdCBydW5uaW5nLCB3aGljaCBgZW5zdXJlT2JzaWRpYW5SdW5uaW5nYFxuICAgICAgICogaGFuZGxlcyBieSBzdGFydGluZyBvbmU7IHRoYXQgcGF0aCBtdXN0IGtlZXAgc2VlaW5nIHRoZSByYXcgZmFpbHVyZS5cbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMub3duZWRDb25maWcgfHwgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IHRoaXMuYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgIHJldHVybiB0YXJnZXRzLmZpbHRlcigodCkgPT4gdC50eXBlID09PSAncGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBjdXJyZW50bHktcnVubmluZyBvd25lZCBpbnN0YW5jZSAoaWYgYW55KSBhbmQgd2FpdHMgZm9yIGl0IHRvIGV4aXQsXG4gICAqIHNvIHRoZSBuZXh0IGxhdW5jaCBnZXRzIGEgcHJpc3RpbmUgc2luZ2xlLXdpbmRvdyBpbnN0YW5jZS5cbiAgICpcbiAgICogUmVsYXVuY2hpbmcgb3ZlciBhIGxpdmUgaW5zdGFuY2UgaXMgZm9yd2FyZGVkIGJ5IEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlXG4gICAqIGxvY2sgb24gdGhlIHNoYXJlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGFuZCBzdXJmYWNlcyB0aGUgdmF1bHQgcGlja2VyLCBhbmQgb3BlbmluZyBhXG4gICAqIHNlY29uZCB3aW5kb3cgdmlhIElQQyBsZWF2ZXMgc3RhbGUgd2luZG93cyB0aGF0IGJyZWFrIHZhdWx0LXRhcmdldCByb3V0aW5nIFx1MjAxNFxuICAgKiBoZW5jZSBhIGZ1bGwga2lsbCArIHdhaXQtZm9yLWV4aXQgKHJlbGVhc2luZyB0aGUgbG9jaykgYmV0d2VlbiBsYXVuY2hlcy4gQVxuICAgKiBuby1vcCBvbiB0aGUgZmlyc3QgYXR0ZW1wdCwgd2hlbiBubyBpbnN0YW5jZSBpcyBydW5uaW5nIHlldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMga2lsbFJ1bm5pbmdPd25lZEluc3RhbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIEtpbGxpbmcgcnVubmluZyBvd25lZCBpbnN0YW5jZSBiZWZvcmUgKHJlKWxhdW5jaC4nKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBjb25zdCBwcmV2aW91c0NkcFVybCA9IHRoaXMuY2RwVXJsO1xuICAgIHRoaXMub3duZWRJbnN0YW5jZS5raWxsKCk7XG4gICAgdGhpcy5vd25lZEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckluc3RhbmNlRXhpdChwcmV2aW91c0NkcFVybCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIG93bmVkIGluc3RhbmNlJ3Mgd2luZG93IG9mZi1zY3JlZW4gc28gYSBoaWRkZW4gcnVuIG5ldmVyIHN0ZWFsc1xuICAgKiBmb2N1cy4gVXNlcyBFbGVjdHJvbidzIHJlbW90ZSBicmlkZ2UgKGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYCkgXHUyMDE0IHRoZSBvbmx5XG4gICAqIGNyb3NzLXBsYXRmb3JtIHdheSB0byByZXBvc2l0aW9uIHRoZSB3aW5kb3cgXHUyMDE0IHBsYWNpbmcgaXQganVzdCBiZXlvbmQgdGhlXG4gICAqIHJpZ2h0IGVkZ2Ugb2YgYWxsIGRpc3BsYXlzLiBUaGUgd2luZG93IHN0YXlzIFwidmlzaWJsZVwiIHRvIENocm9taXVtIChzb1xuICAgKiB0aW1lcnMsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQga2VlcCB3b3JraW5nKSxcbiAgICogdW5saWtlIG1pbmltaXppbmcsIHdoaWNoIHdvdWxkIGZyZWV6ZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAgICpcbiAgICogVGhlIHJlbW90ZSBicmlkZ2UgaXMgbm90IGF2YWlsYWJsZSB0aGUgaW5zdGFudCBDRFAgc3RhcnRzIHNlcnZpbmcsIHNvIHRoaXNcbiAgICogcG9sbHMgdW50aWwgdGhlIG1vdmUgc3VjY2VlZHMuIEJlc3QtZWZmb3J0OiBpZiB0aGUgd2luZG93IGNhbm5vdCBiZSBtb3ZlZFxuICAgKiB3aXRoaW4gdGhlIHRpbWVvdXQsIHRoZSBrZWVwLWFsaXZlIGxhdW5jaCBmbGFncyBzdGlsbCBhcHBseSBhbmQgdGhlIHJ1blxuICAgKiBwcm9jZWVkcyAod29yc3QgY2FzZSB0aGUgd2luZG93IGlzIGJyaWVmbHkgdmlzaWJsZSkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdmVPd25lZFdpbmRvd09mZnNjcmVlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBFbGVjdHJvbiByZW1vdGUgYnJpZGdlIHR3byB3YXlzIHNvIEJPVEggbW9kZXJuIGFuZCBvbGQgT2JzaWRpYW5cbiAgICAvLyBDYW4gYmUgbW92ZWQgb2ZmLXNjcmVlbjogbW9kZXJuIGluamVjdHMgYHdpbmRvdy5lbGVjdHJvbi5yZW1vdGVgOyBvbGRcbiAgICAvLyBWZXJzaW9ucyAobm8gYHdpbmRvdy5lbGVjdHJvbmApIHN0aWxsIGV4cG9zZSB0aGUgYnVpbHQtaW4gYHJlbW90ZWAgbW9kdWxlIHZpYVxuICAgIC8vIGByZXF1aXJlKCdlbGVjdHJvbicpYCBpbiB0aGUgbm9kZS1pbnRlZ3JhdGVkIHJlbmRlcmVyIChyZW1vdmVkIGZyb20gRWxlY3Ryb25cbiAgICAvLyAxNCssIGJ1dCBwcmVzZW50IG9uIHRoZSBFbGVjdHJvbiA4LTEzIHNoZWxscyBvbGQgT2JzaWRpYW4gc2hpcHMpLiBSZXR1cm5pbmdcbiAgICAvLyBgbW92ZWRgIG9uIHRoZSBmaXJzdCBzdWNjZXNzIGlzIGltcG9ydGFudCBvbiBFbGVjdHJvbiAxMC1lcmEgYnVpbGRzOiBwb2xsaW5nXG4gICAgLy8gT24gd2l0aG91dCBhIHJlc29sdmFibGUgYnJpZGdlIGhhbW1lcnMgdGhlIHJlbmRlcmVyIHdpdGggQ0RQIHJvdW5kLXRyaXBzXG4gICAgLy8gRHVyaW5nIGJvb3QgYW5kIGludGVybWl0dGVudGx5IHByZXZlbnRzIHRoZSB3b3Jrc3BhY2UgZnJvbSBpbml0aWFsaXppbmcuXG4gICAgY29uc3QgbW92ZUV4cHJlc3Npb24gPSBgKCgpID0+IHtcbiAgICAgIGxldCByZW1vdGUgPSAod2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUpIHx8IG51bGw7XG4gICAgICBpZiAoIXJlbW90ZSkge1xuICAgICAgICB0cnkgeyByZW1vdGUgPSByZXF1aXJlKCdlbGVjdHJvbicpLnJlbW90ZSB8fCBudWxsOyB9IGNhdGNoIChyZXF1aXJlRXJyb3IpIHsgcmVtb3RlID0gbnVsbDsgfVxuICAgICAgfVxuICAgICAgaWYgKCFyZW1vdGUgfHwgdHlwZW9mIHJlbW90ZS5nZXRDdXJyZW50V2luZG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHdpbmRvdy5hcHAgPT09ICd1bmRlZmluZWQnKSA/ICdub3QtcmVhZHknIDogJ25vLWJyaWRnZSc7XG4gICAgICB9XG4gICAgICBjb25zdCB3aW4gPSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpO1xuICAgICAgY29uc3QgZGlzcGxheXMgPSByZW1vdGUuc2NyZWVuLmdldEFsbERpc3BsYXlzKCk7XG4gICAgICBjb25zdCBtYXhSaWdodCA9IE1hdGgubWF4KC4uLmRpc3BsYXlzLm1hcCgoZGlzcGxheSkgPT4gZGlzcGxheS5ib3VuZHMueCArIGRpc3BsYXkuYm91bmRzLndpZHRoKSk7XG4gICAgICB3aW4uc2V0UG9zaXRpb24obWF4UmlnaHQgKyAke1N0cmluZyhPV05FRF9XSU5ET1dfT0ZGU0NSRUVOX01BUkdJTl9JTl9QSVhFTFMpfSwgMCk7XG4gICAgICByZXR1cm4gJ21vdmVkJztcbiAgICB9KSgpYDtcblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFt0YXJnZXRdID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiBtb3ZlRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE1vdmVkIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBvZmYtc2NyZWVuIChoaWRkZW4gbW9kZSkuJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDRFAgZW5kcG9pbnQgLyB0YXJnZXQgLyByZW1vdGUgYnJpZGdlIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGtlZXAgcG9sbGluZy5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KE9XTkVEX1dJTkRPV19ISURFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IG1vdmUgb3duZWQgd2luZG93IG9mZi1zY3JlZW4gd2l0aGluICR7U3RyaW5nKE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsOyBrZWVwLWFsaXZlIGZsYWdzIHN0aWxsIGFwcGxpZWQpLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgY29uZmlnLWZvbGRlciBvdmVycmlkZSBpbnRvIHRoZSBzdGFydGVyIHNjcmVlbidzIGBsb2NhbFN0b3JhZ2VgXG4gICAqIGFuZCB0aGVuIG9wZW5zIHRoZSB2YXVsdCBmcm9tIHRoZXJlIG92ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMuXG4gICAqXG4gICAqIE9ic2lkaWFuIHJlYWRzIHRoZSBvdmVycmlkZSBleGFjdGx5IG9uY2UsIGluIHRoZSB2YXVsdCdzIG93biByZW5kZXJlciwgZHVyaW5nXG4gICAqIGBWYXVsdC5zZXR1cGAgXHUyMDE0IGBnZXRPdmVycmlkZUNvbmZpZ0RpcihhcHBJZClgIGlzIGBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShhcHBJZCArXG4gICAqICctY29uZmlnJylgLiBTbyB0aGVyZSBpcyBubyB3cml0aW5nIGl0IGludG8gdGhlIHZhdWx0J3Mgd2luZG93OiBieSB0aGUgdGltZVxuICAgKiB0aGF0IHdpbmRvdyBleGlzdHMgdGhlIHJlYWQgaGFzIGhhcHBlbmVkLiBUaGUgc3RhcnRlciBzY3JlZW4gaXMgdGhlIGVhcmxpZXJcbiAgICogcmVuZGVyZXIgdGhlIHdyaXRlIG5lZWRzLCBhbmQgaXQgcXVhbGlmaWVzIGJlY2F1c2UgaXQgaGFzIGBsb2NhbFN0b3JhZ2VgIGFuZFxuICAgKiBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyYCBidXQgbm8gYGFwcGAgKHZlcmlmaWVkIG9uIDEuMTMuNykuXG4gICAqXG4gICAqIFRoYXQgbWlzc2luZyBgYXBwYCBpcyBhbHNvIHdoeSB0aGlzIHRhbGtzIHJhdyBDRFAgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICAgKiB7QGxpbmsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkfSAvIHRoZSBgaXBjU2VuZFN5bmNgIGhlbHBlciBhc1xuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5vcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZX0gZG9lczogZXZlcnkgb25lIG9mXG4gICAqIHRob3NlIHBhdGhzIHByb2JlcyBgYXBwLnZhdWx0LmFkYXB0ZXJgIHRvIGlkZW50aWZ5IGl0cyB0YXJnZXQsIGFuZCB3b3VsZCBmYWlsXG4gICAqIG9uIHRoZSB2ZXJ5IHJlbmRlcmVyIHRoaXMgbmVlZHMuXG4gICAqXG4gICAqIFRoZSBrZXkgbmFtZSBpcyBrbm93biBhaGVhZCBvZiB0aGUgd3JpdGUgYmVjYXVzZSB0aGUgaGFybmVzcyByZWdpc3RlcmVkIHRoZVxuICAgKiB2YXVsdCB1bmRlciBhbiBpZCBpdCBnZW5lcmF0ZWQgaXRzZWxmLCBhbmQgYHZhdWx0LW9wZW5gIHJldXNlcyB0aGF0IGVudHJ5XG4gICAqIHJhdGhlciB0aGFuIG1pbnRpbmcgYSBuZXcgb25lLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIHZhdWx0SWQgLSBUaGUgaGFybmVzcy1nZW5lcmF0ZWQgdmF1bHQgaWQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQgdW5kZXIuXG4gICAqIEBwYXJhbSBjb25maWdEaXJlY3RvcnkgLSBUaGUgY29uZmlnIGZvbGRlciB0byBvdmVycmlkZSB0by5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3BlblZhdWx0RnJvbVN0YXJ0ZXJTY3JlZW4odmF1bHRQYXRoOiBzdHJpbmcsIHZhdWx0SWQ6IHN0cmluZywgY29uZmlnRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZWVkaW5nIGNvbmZpZyBmb2xkZXIgb3ZlcnJpZGUgJHtjb25maWdEaXJlY3Rvcnl9IG9uIHRoZSBzdGFydGVyIHNjcmVlbi4uLmApO1xuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0ZXJTY3JlZW5UYXJnZXQoKTtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBleHByZXNzaW9uOiBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgJHt2YXVsdElkfS1jb25maWdgKX0sICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnRGlyZWN0b3J5KX0pO2AsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgJHt2YXVsdElkfS1jb25maWcgYW5kIGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBleHByZXNzaW9uOiBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgJHtKU09OLnN0cmluZ2lmeSh2YXVsdFBhdGgpfSwgZmFsc2UpYCxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZW50IHZhdWx0LW9wZW4gZm9yICR7dmF1bHRQYXRofSBmcm9tIHRoZSBzdGFydGVyIHNjcmVlbi5gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd3MuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSB2YXVsdCBpbiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIHRoZSBgdmF1bHQtb3BlbmBcbiAgICogRWxlY3Ryb24gSVBDIChldmFsdWF0ZWQgdGhyb3VnaCBDRFAgb24gYW4gZXhpc3RpbmcgdGFyZ2V0KSwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgbmV3IHZhdWx0J3Mgd2luZG93IHRhcmdldCBhcHBlYXJzLCBpcyBsYXlvdXQtcmVhZHksIGFuZCBpdHMgdHJ1c3QgZGlhbG9nXG4gICAqIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogU2hhcmVkIGJ5IHRoZSBhdHRhY2gtbW9kZSB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0gYW5kIHRoZSBvd25lZC1tb2RlXG4gICAqIFwiaW5zdGFuY2UgYWxyZWFkeSBsYXVuY2hlZFwiIHBhdGgsIHNvIG9wZW5pbmcgYW4gYWRkaXRpb25hbCB2YXVsdCBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSBwcm9jZXNzICh3aGljaCB3b3VsZCBzdXJmYWNlIHRoZSB2YXVsdCBwaWNrZXIpLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgYXZhaWxhYmxlLiBJcyBPYnNpZGlhbiBydW5uaW5nPycpO1xuICAgIH1cblxuICAgIC8vIFRoZSBgdmF1bHQtb3BlbmAgSVBDIGlzIHNlbnQgdGhyb3VnaCBhbiBFWElTVElORyB3aW5kb3cgKGB0YXJnZXRzWzBdYCksIHNvIHRoZVxuICAgIC8vIEhlbHBlciBuYW1lc3BhY2UgbXVzdCBiZSBib290c3RyYXBwZWQgb24gVEhBVCB3aW5kb3cgXHUyMDE0IG5vdCBvbiBgdmF1bHRQYXRoYCwgd2hvc2VcbiAgICAvLyBXaW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LiBCb290c3RyYXBwaW5nIGFnYWluc3QgYHZhdWx0UGF0aGAgaGVyZSB3b3VsZCByb3V0ZVxuICAgIC8vIFRocm91Z2ggYGZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpYCB3aXRoIG9ubHkgdGhlIGV4aXN0aW5nIHdpbmRvdyBwcmVzZW50IGFuZFxuICAgIC8vIFBvaXNvbiB0aGUgY29ubmVjdGlvbiBjYWNoZSAobGFiZWwgYHZhdWx0UGF0aGAsIHNvY2tldCBcdTIxOTIgdGhlIGV4aXN0aW5nIHdpbmRvdyksIHNvXG4gICAgLy8gRXZlcnkgbGF0ZXIgZXZhbCBmb3IgYHZhdWx0UGF0aGAgd291bGQgbWlzLXJvdXRlIHRvIHRoZSBleGlzdGluZyB3aW5kb3cuIFByb2JlIHRoZVxuICAgIC8vIEV4aXN0aW5nIHdpbmRvdydzIG93biBiYXNlIHBhdGggYW5kIGJvb3RzdHJhcCBhZ2FpbnN0IHRoYXQgaW5zdGVhZC5cbiAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHRhcmdldHNbMF0pO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aChleGlzdGluZ1RhcmdldCk7XG4gICAgY29uc3QgaXBjV3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChleGlzdGluZ1RhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG4gICAgICBjb25zdCBpcGNFeHByZXNzaW9uID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsOiAndmF1bHQtb3BlbicsIGNoYW5uZWxBcmd1bWVudHM6IFt2YXVsdFBhdGgsIGZhbHNlXSB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoaXBjV3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgIGV4cHJlc3Npb246IGlwY0V4cHJlc3Npb24sXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZShpcGNXcywgdmF1bHRQYXRoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXBjV3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCB0YXJnZXQgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBWYXVsdCB0YXJnZXQgZm91bmQuJyk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCB0YXJnZXQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlcyB0aGUgdmF1bHQgcmVuZGVyZXIncyBib290c3RyYXAgc3RhdGUgXHUyMDE0IHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzXG4gICAqIGBjb21wbGV0ZWAsIHdoZXRoZXIgYHdpbmRvdy5hcHBgIGV4aXN0cywgYW5kIHRoZSBgPGJvZHk+YCBjaGlsZCBjb3VudCBcdTIwMTQgZnJvbVxuICAgKiB0aGUgZmlyc3QgcGFnZSB0YXJnZXQsIGZvciBkZWFkLWJvb3QgZGV0ZWN0aW9uLiBUaGlzIHdvcmtzIGV2ZW4gd2hlbiB0aGUgYXBwXG4gICAqIG5ldmVyIGJvb3RzdHJhcHBlZCAodGhlIHJlbmRlcmVyIHBhZ2UgdGFyZ2V0IHN0aWxsIGV4aXN0cyksIHdoaWNoIGlzIGV4YWN0bHlcbiAgICogdGhlIHN0YXRlIGl0IG11c3Qgb2JzZXJ2ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNhbXBsZWQgb2JzZXJ2YXRpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdGFyZ2V0IGlzIHJlYWNoYWJsZVxuICAgKiAgIG9yIHRoZSBwcm9iZSBmYWlsZWQgKHNvIHRoZSBjYWxsZXIga2VlcHMgcG9sbGluZyByYXRoZXIgdGhhbiBmYXN0LWZhaWxpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk6IFByb21pc2U8UmVuZGVyZXJCb290T2JzZXJ2YXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW3RhcmdldF0gPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9iZUV4cHJlc3Npb24gPSBgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGJvZHlDaGlsZEVsZW1lbnRDb3VudDogZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuY2hpbGRFbGVtZW50Q291bnQgOiAwLFxuICAgICAgICAgIGhhc1dpbmRvd0FwcDogdHlwZW9mIHdpbmRvdy5hcHAgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgIGlzRG9jdW1lbnRDb21wbGV0ZTogZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJ1xuICAgICAgICB9KWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogcHJvYmVFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2JlcyBhIHRhcmdldCB0byBkaXNjb3ZlciB3aGljaCB2YXVsdCBwYXRoIGl0IGhhcyBvcGVuLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IFdlYlNvY2tldCBjb25uZWN0aW9uLCBldmFsdWF0ZXMgYGdldEJhc2VQYXRoKClgLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gcHJvYmUuXG4gICAqIEByZXR1cm5zIFRoZSB2YXVsdCdzIGJhc2UgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVWYXVsdFBhdGgodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgLy8gT2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBwcmVkYXRlIHRoZSBgZ2V0QmFzZVBhdGgoKWAgbWV0aG9kIGJ1dFxuICAgICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICAgIGV4cHJlc3Npb246ICdhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCkgOiBhcHAudmF1bHQuYWRhcHRlci5iYXNlUGF0aCcsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFN0cmluZyhyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBhbmQgY29ubmVjdHMgdG8gYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZSBmb3IgYVxuICAgKiB2YXVsdDogcHJvdmlzaW9ucyB0aGUgYXNhciAoaWYgYW55KSwgcHJlLXNlZWRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmBcbiAgICogc28gdGhlIHZhdWx0IG9wZW5zIGRpcmVjdGx5LCBsYXVuY2hlcyB0aGUgaW5zdGFuY2Ugb24gYSBmcmVlIENEUCBwb3J0LCB0aGVuXG4gICAqIHdhaXRzIHVudGlsIHRoZSB2YXVsdCB3aW5kb3cgaXMgcmVhZHkgYW5kIGRpc21pc3NlcyB0aGUgdHJ1c3QgZGlhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGVuc3VyZU5vbk51bGxhYmxlKHRoaXMub3duZWRDb25maWcpO1xuXG4gICAgbWtkaXJTeW5jKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgaWYgKGNvbmZpZy5hc2FyKSB7XG4gICAgICBjb3B5QXNhckludG9Vc2VyRGF0YShjb25maWcuYXNhci5wYXRoLCBjb25maWcuYXNhci52ZXJzaW9uLCBjb25maWcudXNlckRhdGFEaXJlY3RvcnkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhdWx0SWQgPSByYW5kb21CeXRlcyhWQVVMVF9JRF9CWVRFX0xFTkdUSCkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gQSBjb25maWctZm9sZGVyIG92ZXJyaWRlIGlzIGEgYGxvY2FsU3RvcmFnZWAgZW50cnksIGFuZCBgbG9jYWxTdG9yYWdlYCBuZWVkcyBhXG4gICAgLy8gUmVuZGVyZXIsIHNvIHRoZSB2YXVsdCBtdXN0IE5PVCBhdXRvLW9wZW46IHRoZSBpbnN0YW5jZSBib290cyB0byB0aGUgc3RhcnRlclxuICAgIC8vIFNjcmVlbiwgdGhlIG92ZXJyaWRlIGlzIHdyaXR0ZW4gdGhlcmUsIGFuZCB0aGUgdmF1bHQgaXMgb3BlbmVkIGZyb20gaXQgb3ZlclxuICAgIC8vIElQQy4gT2JzaWRpYW4gcmV1c2VzIHRoZSBwcmUtcmVnaXN0ZXJlZCBpZCBmb3IgdGhhdCBvcGVuICh2ZXJpZmllZCBvbiAxLjEzLjcpLFxuICAgIC8vIFdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGA8dmF1bHRJZD4tY29uZmlnYCBrZXkgbmFtZSBrbm93YWJsZSBiZWZvcmUgbGF1bmNoLlxuICAgIGNvbnN0IHNob3VsZEF1dG9PcGVuVmF1bHQgPSB0aGlzLmNvbmZpZ0RpcmVjdG9yeSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gUmVsYXVuY2gtcmV0cnk6IHNvbWUgb2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIGJ1aWxkcyBpbnRlcm1pdHRlbnRseVxuICAgIC8vIEJvb3Qgd2l0aCBgd2luZG93LmFwcGAgcHJlc2VudCBidXQgdGhlIHdvcmtzcGFjZSBuZXZlciBpbml0aWFsaXppbmcsIHNvIHRoZVxuICAgIC8vIFZhdWx0IG5ldmVyIGJlY29tZXMgcmVhZHkuIEEgZnJlc2ggaW5zdGFuY2UgaXMgYW4gaW5kZXBlbmRlbnQgY2hhbmNlLiBBXG4gICAgLy8gRGV0ZXJtaW5pc3RpYyBmYWlsdXJlIChkZWFkIGJvb3QsIHNpbGVudCBhc2FyIGZhbGxiYWNrKSBpcyByZS10aHJvd24gYXQgb25jZSBcdTIwMTRcbiAgICAvLyBSZXRyeWluZyBpdCBvbmx5IHdhc3RlcyB0aGUgcmVhZGluZXNzIHRpbWVvdXQuXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93bjtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICAgIGF3YWl0IHRoaXMua2lsbFJ1bm5pbmdPd25lZEluc3RhbmNlKCk7XG4gICAgICBpZiAoYXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgYXdhaXQgZGVsYXkoT1dORURfUkVMQVVOQ0hfU0VUVExFX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLXNlZWRlZCBldmVyeSBhdHRlbXB0IHJhdGhlciB0aGFuIG9uY2UgYmVmb3JlIHRoZSBsb29wOiBPYnNpZGlhbiByZXdyaXRlc1xuICAgICAgLy8gYG9ic2lkaWFuLmpzb25gIGFzIGl0IG9wZW5zIGEgdmF1bHQgKGl0IHN0YW1wcyB0aGUgZW50cnkgYG9wZW46IHRydWVgKSwgc28gYVxuICAgICAgLy8gUmVsYXVuY2ggdGhhdCBpbmhlcml0ZWQgdGhlIHByZXZpb3VzIGF0dGVtcHQncyBmaWxlIHdvdWxkIHNhaWwgcGFzdCB0aGVcbiAgICAgIC8vIFN0YXJ0ZXIgc2NyZWVuIHRoZSBvdmVycmlkZSBuZWVkcy5cbiAgICAgIGNvbnN0IG9ic2lkaWFuSnNvbiA9IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24oeyBzaG91bGRBdXRvT3BlblZhdWx0LCB0czogRGF0ZS5ub3coKSwgdmF1bHRJZCwgdmF1bHRQYXRoIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgJ29ic2lkaWFuLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkob2JzaWRpYW5Kc29uKSk7XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKHtcbiAgICAgICAgY2RwSG9zdDogdGhpcy5jZHBIb3N0LFxuICAgICAgICBleGVQYXRoOiBjb25maWcuZXhlUGF0aCxcbiAgICAgICAgZXh0cmFBcmd1bWVudHM6IFtcbiAgICAgICAgICAuLi5yZXNvbHZlT3duZWRIaWRkZW5MYXVuY2hBcmd1bWVudHModGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSksXG4gICAgICAgICAgLi4ucmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHModGhpcy5zaG91bGREaXNhYmxlU2FuZGJveClcbiAgICAgICAgXSxcblxuICAgICAgICB1c2VyRGF0YURpcmVjdG9yeTogY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5XG4gICAgICB9KTtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgdGhpcy5jZHBQb3J0ID0gaW5zdGFuY2UucG9ydDtcbiAgICAgIHRoaXMuY2RwVXJsID0gaW5zdGFuY2UuY2RwVXJsO1xuXG4gICAgICBpZiAoc2hvdWxkSGlkZU9ic2lkaWFuQXBwKHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghc2hvdWxkQXV0b09wZW5WYXVsdCkge1xuICAgICAgICAgIC8vIGBzaG91bGRBdXRvT3BlblZhdWx0YCBpcyBhIGBjb25zdGAgZGVyaXZlZCBmcm9tIGB0aGlzLmNvbmZpZ0RpcmVjdG9yeSA9PT0gdW5kZWZpbmVkYCxcbiAgICAgICAgICAvLyBTbyBUeXBlU2NyaXB0IG5hcnJvd3MgdGhlIGZpZWxkIHRvIGBzdHJpbmdgIGluIHRoaXMgYnJhbmNoIG9uIGl0cyBvd24uXG4gICAgICAgICAgYXdhaXQgdGhpcy5vcGVuVmF1bHRGcm9tU3RhcnRlclNjcmVlbih2YXVsdFBhdGgsIHZhdWx0SWQsIHRoaXMuY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JPd25lZFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRSZXF1ZXN0ZWRDb25maWdEaXJlY3RvcnkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcm1QYXJlbnRMaXZlbmVzc1dhdGNoZG9nKHZhdWx0UGF0aCwgaW5zdGFuY2UucGFyZW50TGl2ZW5lc3NQb3J0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgLy8gQSBjb25maWctZm9sZGVyIGZhbGxiYWNrIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IHRoZSBuYW1lIGlzIGVpdGhlciBvbmUgT2JzaWRpYW5cbiAgICAgICAgLy8gQWNjZXB0cyBvciBpdCBpcyBub3QgXHUyMDE0IHNvIHJlbGF1bmNoaW5nIG9ubHkgYnVybnMgYW5vdGhlciBib290LlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yXG4gICAgICAgICAgfHwgZXJyb3IgaW5zdGFuY2VvZiBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvclxuICAgICAgICAgIHx8IGVycm9yIGluc3RhbmNlb2YgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdmF1bHQgbm90IHJlYWR5IChhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTKX0pOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbGFzdEVycm9yIDogbmV3IEVycm9yKGBPd25lZCB2YXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIENEUCBjb21tYW5kIG92ZXIgV2ViU29ja2V0IGFuZCB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBUaGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgQ0RQIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIENEUCBtZXRob2QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIENEUCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZENvbW1hbmQod3M6IFdlYlNvY2tldCwgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPENkcFJlc3BvbnNlPiB7XG4gICAgY29uc3QgaWQgPSArK3RoaXMubWVzc2FnZUlkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPENkcFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM6ICR7bWV0aG9kfWApKTtcbiAgICAgIH0sIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcFJlc3BvbnNlO1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgYSBraWxsZWQgb3duZWQgaW5zdGFuY2UncyBDRFAgZW5kcG9pbnQgdW50aWwgaXQgc3RvcHMgcmVzcG9uZGluZyxcbiAgICogY29uZmlybWluZyB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBiZWZvcmUgYSBmcmVzaCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBpbnRvIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY2RwVXJsIC0gVGhlIENEUCBVUkwgb2YgdGhlIGluc3RhbmNlIHRoYXQgd2FzIGp1c3Qga2lsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9ySW5zdGFuY2VFeGl0KGNkcFVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgcHJldmlvdXMgb3duZWQgaW5zdGFuY2UgYXQgJHtjZHBVcmx9IHRvIGV4aXQuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBlbmRwb2ludCBpcyBnb25lOiB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCB0aGUgbG9jay5cbiAgICAgICAgYXdhaXQgZGVsYXkoSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBQcmV2aW91cyBpbnN0YW5jZSBzdGlsbCByZXNwb25kZWQgYmVmb3JlIHRpbWVvdXQ7IHJlbGF1bmNoaW5nIGFueXdheS4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHZhdWx0J3MgYGFwcC53b3Jrc3BhY2VgIHRvIHJlYWNoIGxheW91dC1yZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogYGZpbmRUYXJnZXRGb3JWYXVsdGAgcmV0dXJucyBhcyBzb29uIGFzIGBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpYFxuICAgKiBtYXRjaGVzIFx1MjAxNCB3aGljaCBpcyB0cnVlIHNob3J0bHkgYWZ0ZXIgdGhlIGBBcHBgIGNvbnN0cnVjdG9yIHJ1bnMsIGJlZm9yZVxuICAgKiBgcGx1Z2lucy5pbml0aWFsaXplKClgIChhbmQgYW55IHRydXN0IGRpYWxvZykgaGFzIGV4ZWN1dGVkLiBCb290c3RyYXBwaW5nXG4gICAqIHRoZSBuYW1lc3BhY2UgYW5kIGNhbGxpbmcgYHBvbGxWYXVsdEJhc2VQYXRoKClgIGF3YWl0cyBgbGF5b3V0UmVhZHlgLCBzb1xuICAgKiBieSB0aGUgdGltZSB0aGlzIHJldHVybnMgdGhlIGRpYWxvZyBoYXMgZWl0aGVyIHJlbmRlcmVkIG9yIGlzIG5vdCBnb2luZ1xuICAgKiB0byByZW5kZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZSgnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcucG9sbFZhdWx0QmFzZVBhdGgoKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIG93bmVkIGluc3RhbmNlIHVudGlsIHRoZSB2YXVsdCB0YXJnZXQgZXhpc3RzLCBsYXlvdXQgaXMgcmVhZHksIGFuZFxuICAgKiB0aGUgdHJ1c3QgZGlhbG9nIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogQmV0d2VlbiByZWFkaW5lc3MgYXR0ZW1wdHMgaXQgYWxzbyBjaGVja3MgZm9yIGEgKipkZWFkIGJvb3QqKiBcdTIwMTQgdGhlIHJlbmRlcmVyXG4gICAqIGxvYWRlZCAoYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkgYnV0IHRoZSBhcHAgbmV2ZXIgYm9vdHN0cmFwcGVkXG4gICAqIChlbXB0eSBgPGJvZHk+YCwgbm8gYHdpbmRvdy5hcHBgKSwgdGhlIHRlcm1pbmFsIHN0YXRlIHdoZW4gdGhlIGFzYXIgY2Fubm90XG4gICAqIHJ1biBvbiB0aGUgbGF1bmNoZWQgRWxlY3Ryb24gc2hlbGwuIE9uY2UgdGhhdCBzdGF0ZSBoYXMgaGVsZCBmb3IgdGhlXG4gICAqIGNvbmZpZ3VyZWQgZ3JhY2Ugd2luZG93IGl0IHRocm93cyBhIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzcyB0aW1lb3V0LiBBIGdyYWNlIG9mXG4gICAqIGAwYCBkaXNhYmxlcyB0aGUgZmFzdC1mYWlsLiBUaGUgZ3JhY2UgY2xvY2sgc3RhcnRzIHdoZW4gdGhlIHJlbmRlcmVyIGZpcnN0XG4gICAqIHJlcG9ydHMgYGNvbXBsZXRlYCwgc28gYSBzbG93IGxvYWQgYmVmb3JlIHRoZW4gaXMgbmV2ZXIgY291bnRlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIG93bmVkIHZhdWx0IHRvIGJlY29tZSByZWFkeSAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBkb2N1bWVudENvbXBsZXRlU2luY2U6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICAgIGxldCBpc1JlYWR5ID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgaXNSZWFkeSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSB2YXVsdCBpcyBub3QgcmVhZHkgeWV0IFx1MjAxNCBhbHNvIGRyb3AgdGhlIGNhY2hlZCBDRFAgY29ubmVjdGlvbiBiZWZvcmVcbiAgICAgICAgLy8gUmV0cnlpbmcuIE9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiByZWxvYWRzIHRoZSBvd25lZCB3aW5kb3cgZHVyaW5nXG4gICAgICAgIC8vIEJvb3QsIHdoaWNoIGNhbiBsZWF2ZSB0aGUgY2FjaGVkIFdlYlNvY2tldCBwaW5uZWQgdG8gYSBzdGFsZSBleGVjdXRpb25cbiAgICAgICAgLy8gQ29udGV4dDsgcmVjb25uZWN0aW5nIGVhY2ggYXR0ZW1wdCByZS1iaW5kcyB0byB0aGUgbGl2ZSBjb250ZXh0LlxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBjb25zdCBvYnNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucHJvYmVSZW5kZXJlckJvb3RTdGF0ZSgpO1xuICAgICAgICBpZiAob2JzZXJ2YXRpb24pIHtcbiAgICAgICAgICBpZiAob2JzZXJ2YXRpb24uaXNEb2N1bWVudENvbXBsZXRlICYmIGRvY3VtZW50Q29tcGxldGVTaW5jZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaGFzR3JhY2VFbGFwc2VkID0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlICE9PSBudWxsXG4gICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlID49IHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgIGlmIChyZXNvbHZlUmVuZGVyZXJCb290U3RhdGUoeyAuLi5vYnNlcnZhdGlvbiwgaGFzR3JhY2VFbGFwc2VkIH0pID09PSAnZGVhZCcpIHtcbiAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHJlbmRlcmVyIGZhaWxlZCB0byBpbml0aWFsaXplIChkZWFkIGJvb3QpOyBmYWlsaW5nIGZhc3QuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcih2YXVsdFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmF1bHQgaXMgcmVhZHkuIFJ1biB0aGUgcG9zdC1ib290IGNvbXBhdGliaWxpdHkgY2hlY2tzIGhlcmUgXHUyMDE0IE9VVFNJREUgdGhlXG4gICAgLy8gUG9sbCdzIHRyeS9jYXRjaCBcdTIwMTQgc28gYSBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciBmYWlscyBmYXN0IGluc3RlYWQgb2YgYmVpbmdcbiAgICAvLyBTd2FsbG93ZWQgYXMgXCJub3QgcmVhZHkgeWV0XCIgYW5kIGxvb3BpbmcgdW50aWwgdGhlIHJlYWRpbmVzcyB0aW1lb3V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGgpO1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IGlzIHJlYWR5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBzdGFydGVyIHNjcmVlbidzIHJlbmRlcmVyIGNhbiBhY2NlcHQgdGhlIGNvbmZpZy1mb2xkZXJcbiAgICogb3ZlcnJpZGUgXHUyMDE0IHRoYXQgaXMsIHVudGlsIGl0IGV4cG9zZXMgYm90aCBgbG9jYWxTdG9yYWdlYCBhbmRcbiAgICogYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luY2AuXG4gICAqXG4gICAqIEEgcGFnZSB0YXJnZXQgZXhpc3RzIGFzIHNvb24gYXMgdGhlIGxhdW5jaCByZXNvbHZlcywgc28gdGhpcyBpcyBub3Qgd2FpdGluZ1xuICAgKiBmb3IgYSB3aW5kb3c7IGl0IGlzIHdhaXRpbmcgZm9yIHRoYXQgd2luZG93J3Mgb3duIHNjcmlwdHMgdG8gZmluaXNoLiBXcml0aW5nXG4gICAqIGJlZm9yZSB0aGVuIHdvdWxkIGVpdGhlciB0aHJvdyBvciwgd29yc2UsIGxhbmQgaW4gYSByZW5kZXJlciB0aGF0IGlzIGFib3V0IHRvXG4gICAqIGJlIHJlcGxhY2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc3RhcnRlciBzY3JlZW4ncyBDRFAgdGFyZ2V0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyByZW5kZXJlciBiZWNvbWVzIHdyaXRhYmxlIHdpdGhpbiB0aGUgdGltZW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXJ0ZXJTY3JlZW5UYXJnZXQoKTogUHJvbWlzZTxDZHBUYXJnZXQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBTVEFSVEVSX1NDUkVFTl9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAndHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhISh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyICYmIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyknLFxuICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBUaGUgcmVuZGVyZXIgaXMgbm90IGV2YWx1YXRpbmcgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoU1RBUlRFUl9TQ1JFRU5fUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgc3RhcnRlciBzY3JlZW4gZGlkIG5vdCBleHBvc2UgbG9jYWxTdG9yYWdlIGFuZCB0aGUgRWxlY3Ryb24gSVBDIGJyaWRnZSB3aXRoaW4gJHtTdHJpbmcoU1RBUlRFUl9TQ1JFRU5fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBgXG4gICAgICAgICsgJ3NvIHRoZSBjb25maWcgZm9sZGVyIG92ZXJyaWRlIGNvdWxkIG5vdCBiZSB3cml0dGVuLidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgdGhlIHJlbW92YWwgdGhyZXcgKGUuZy4gaGFuZGxlcyBoZWxkKS5cbiAqL1xuZnVuY3Rpb24gZGlkUmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcm1TeW5jKGRpcmVjdG9yeSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcgZW5hYmxlZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gIGNvbnN0IGZsYWcgPSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnQ9JHtTdHJpbmcocG9ydCl9YDtcblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9YDtcbiAgfVxuXG4gIHJldHVybiBgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfSAmYDtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXFCQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBYXBCLFNBQVMsMkJBQTJCO0FBQ3BDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsWUFBWTtBQUNyQixTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDZDQUE2QztBQUN0RDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsdUNBQXVDO0FBQ2hELFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxP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
|
|
1280
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyBDZHBDb21tYW5kVGltZW91dEVycm9yIH0gZnJvbSAnLi9jZHAtY29tbWFuZC10aW1lb3V0LWVycm9yLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnktZmFsbGJhY2stZXJyb3IubWpzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgeyBFdmFsQ2FwRXhjZWVkZWRFcnJvciB9IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCB9IGZyb20gJy4vbmFtZXNwYWNlLWJvb3RzdHJhcC5tanMnO1xuaW1wb3J0IHtcbiAgZGlkUmVtb3ZlVmF1bHRGcm9tQ29uZmlnLFxuICBnZXRWYXVsdElkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5tanMnO1xuaW1wb3J0IHsgbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlIH0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YW5jZS5tanMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuaW1wb3J0IHsgY29weUFzYXJJbnRvVXNlckRhdGEgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQgeyByZWFkT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIgfSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckZyb21NYXJrZXIsXG4gIE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvclxufSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci5tanMnO1xuaW1wb3J0IHsgYnVpbGRPd25lZE9ic2lkaWFuSnNvbiB9IGZyb20gJy4vb3duZWQtdmF1bHQtc2VlZC5tanMnO1xuaW1wb3J0IHsgYnVpbGRQYXJlbnRMaXZlbmVzc1dhdGNoZG9nRXhwcmVzc2lvbiB9IGZyb20gJy4vcGFyZW50LWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFMsXG4gIHJlc29sdmVSZW5kZXJlckJvb3RTdGF0ZVxufSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLm1qcyc7XG5pbXBvcnQgeyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yIH0gZnJvbSAnLi9yZW5kZXJlci1mYWlsZWQtdG8taW5pdGlhbGl6ZS1lcnJvci5tanMnO1xuaW1wb3J0IHsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcbmltcG9ydCB7XG4gIGFyZVZhdWx0UGF0aHNNYXRjaGluZyxcbiAgbm9ybWFsaXplVmF1bHRQYXRoRm9yQ29tcGFyaXNvblxufSBmcm9tICcuL3ZhdWx0LXBhdGgtbWF0Y2gubWpzJztcbmltcG9ydCB7IHNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3cgfSBmcm9tICcuL3ZhdWx0LXRlYXJkb3duLXZlcmRpY3QubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyxcbiAgcmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHMsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICpcbiAgICogQSB0ZXN0J3MgY2xvc3VyZSB0cmF2ZWxzIGFzIG9uZSBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZCwgc28gdGhpcyBpcyBhbHNvXG4gICAqIHRoZSBkZXNrdG9wIHBlci1ldmFsIGNhcC4gVGhlIGRlZmF1bHQgaXMgYERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTYCxcbiAgICogZXhwb3J0ZWQgZnJvbSB0aGUgcGFja2FnZSByb290IFx1MjAxNCBpbXBvcnQgaXQgcmF0aGVyIHRoYW4gcmVzdGF0aW5nIHRoZSBudW1iZXIsXG4gICAqIHNvIGEgY2xvc3VyZSBzaXplZCBhZ2FpbnN0IHRoZSBjYXAgZm9sbG93cyBpdCBpZiBpdCBldmVyIG1vdmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMzAwMDBgXG4gICAqL1xuICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyBjb25maWcgZm9sZGVyIG92ZXJyaWRlIChPYnNpZGlhbidzICpPdmVycmlkZSBjb25maWcgZm9sZGVyKiksXG4gICAqIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLiBXaGVuIHNldCwgdGhlIG93bmVkIGluc3RhbmNlIGJvb3RzIHRvIHRoZVxuICAgKiBzdGFydGVyIHNjcmVlbiwgd3JpdGVzIGA8dmF1bHRJZD4tY29uZmlnYCBpbnRvIHRoYXQgcmVuZGVyZXInc1xuICAgKiBgbG9jYWxTdG9yYWdlYCwgYW5kIG9ubHkgdGhlbiBvcGVucyB0aGUgdmF1bHQgb3ZlciB0aGUgYHZhdWx0LW9wZW5gIElQQyBcdTIwMTRcbiAgICogdGhlIG92ZXJyaWRlIGlzIHJlYWQgb25jZSwgZHVyaW5nIHRoZSB2YXVsdCByZW5kZXJlcidzIG93biBzZXR1cCwgc28gaXQgaGFzXG4gICAqIHRvIGV4aXN0IGJlZm9yZSB0aGF0IHdpbmRvdyBpcyBjcmVhdGVkLiBUaGUgb3BlbmVkIHZhdWx0J3MgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyB0aGVuIHJlYWQgYmFjaywgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIHtAbGluayBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yfS4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSAoZW1wdHkgYDxib2R5PmAgd2l0aCBubyBgd2luZG93LmFwcGAgYWZ0ZXIgdGhlIHJlbmRlcmVyIHJlYWNoZWRcbiAgICogYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFN9LiBgMGAgZGlzYWJsZXMgZmFzdC1mYWlsLlxuICAgKi9cbiAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGF0dGFjaGluZyAoaS5lLiB7QGxpbmsgY2RwUG9ydH0gaXMgc2V0KSwgbWFya3MgdGhlIHRhcmdldCBhcyBhXG4gICAqICoqaGFybmVzcy1vd25lZCwgYWxyZWFkeS1wcmVwYXJlZCoqIGluc3RhbmNlLiBTdXBwcmVzc2VzIHRoZSB1c2VyLXNjb3BlXG4gICAqIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQsIHNpbmNlIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuXG4gICAqIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcgcmF0aGVyIHRoYW4gdGhlIHVzZXItc2NvcGUgcmVnaXN0cnkuXG4gICAqL1xuICBpc0hhcm5lc3NPd25lZEluc3RhbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3duZWQgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi4gV2hlbiBgZmFsc2VgICh0aGVcbiAgICogZGVmYXVsdCksIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCB3aXRoIGtlZXAtYWxpdmUgQ2hyb21pdW0gZmxhZ3MgYW5kXG4gICAqIGl0cyB3aW5kb3cgaXMgbW92ZWQgb2ZmLXNjcmVlbiBhZnRlciBsYXVuY2guIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlO1xuICAgKiBhdHRhY2ggbW9kZSBuZXZlciB0b3VjaGVzIHRoZSAodXNlcidzKSB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNPYnNpZGlhbkFwcFZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICAgKiBpbnN0ZWFkIG9mIGF0dGFjaGluZyB0byBhIHJ1bm5pbmcgb25lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgbW9kZS5cbiAgICovXG4gIG93bmVkSW5zdGFuY2U/OiBPd25lZEluc3RhbmNlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS4gTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkXG4gICAqIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBleHRyYWN0ZWQgcG9ydGFibGUgc2hlbGwsIG9yIENJIGFzIGFcbiAgICogbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwb3N0LWJvb3QgKipzaWxlbnQgYXNhciBmYWxsYmFjayoqICh0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBkaWZmZXJzXG4gICAqIGZyb20gdGhlIHN3YXBwZWQtaW4gcGluKSBmYWlscyBmYXN0IHdpdGgge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfS4gVGhlXG4gICAqIHZlcmRpY3QgaXMgYWx3YXlzIGNvbXB1dGVkIGFuZCBzdXJmYWNlZCB2aWFcbiAgICoge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnQuZ2V0QXNhckZhbGxiYWNrfTsgdGhpcyBnYXRlcyBvbmx5IHRoZSB0aHJvdy4gT25seVxuICAgKiBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUgcnVubmluZyBhIHN3YXBwZWQtaW4gYXNhci5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdC1ib290IHJ1bnRpbWUtRWxlY3Ryb24gY29tcGF0aWJpbGl0eSBuYWcgd2FybmluZyBpcyBlbWl0dGVkXG4gICAqIHdoZW4gdGhlIGxpdmUgRWxlY3Ryb24gaXMgYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkIG1pbmltdW0uIFRoZSB2ZXJkaWN0IGlzXG4gICAqIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eX07XG4gICAqIHRoaXMgb25seSBnYXRlcyB0aGUgbG9nLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBhc2FyIHRvIHByb3Zpc2lvbiBpbnRvIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSdzIHVzZXItZGF0YSBkaXJlY3RvcnkgYmVmb3JlIGxhdW5jaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQvc291cmNlIGFzYXIgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGFzYXIncyBgeC55LnpgIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZS5cbiAqXG4gKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgaXRzIG93biBPYnNpZGlhbiBwcm9jZXNzXG4gKiBhZ2FpbnN0IGFuIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VDb25maWcge1xuICAvKipcbiAgT3B0aW9uYWwgYXNhciB0byBwcm92aXNpb24gaW50byB7QGxpbmsgdXNlckRhdGFEaXJlY3Rvcnl9IGJlZm9yZSBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUFzYXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCB3aGVuIGl0IGNvdWxkIGJlIGRldGVybWluZWRcbiAgICogKGFuIGFzYXItc3dhcCBvbnRvIGEga25vd24gc2hlbGwgdmVyc2lvbikuIFN1cmZhY2VkIGJ5XG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldENvbXBhdGliaWxpdHl9LiBBbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHJlYWNoZXNcbiAgICogdGhpcyBzdXJmYWNlIG9ubHkgd2hlbiB0aGUgcHJvYWN0aXZlIHRocm93IGlzIGRpc2FibGVkXG4gICAqIChgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBiZWZvcmUgdGhlIGNvbmZpZyBpcyBidWlsdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhdGliaWxpdHk/OiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBzaGVsbCBleGVjdXRhYmxlIHRvIGxhdW5jaC5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeS4gQ3JlYXRlZCBhbmQgb3duZWQgYnkgdGhlXG4gICAqIHRyYW5zcG9ydCwgYW5kIGRlbGV0ZWQgb24gZGlzcG9zZS5cbiAgICovXG5cbiAgcmVhZG9ubHkgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgQ0RQIGVuZHBvaW50IG9mIGEgbGF1bmNoZWQsIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUVuZHBvaW50IHtcbiAgLyoqXG4gIENEUCBob3N0IChlLmcuIGAnbG9jYWxob3N0J2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZnJlZSBDRFAgcG9ydCB0aGUgb3duZWQgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ2RwRXhjZXB0aW9uRGV0YWlscyB7XG4gIGV4Y2VwdGlvbj86IENkcEV4Y2VwdGlvbk9iamVjdDtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwRXhjZXB0aW9uT2JqZWN0IHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZSB7XG4gIGlkOiBudW1iZXI7XG4gIHJlc3VsdD86IENkcFJlc3BvbnNlUmVzdWx0O1xufVxuXG5pbnRlcmZhY2UgQ2RwUmVzcG9uc2VSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHJldHVybmVkIGJ5IGBQYWdlLmNhcHR1cmVTY3JlZW5zaG90YC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkRldGFpbHM/OiBDZHBFeGNlcHRpb25EZXRhaWxzO1xuICByZWFkb25seSByZXN1bHQ/OiBDZHBWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHdlYlNvY2tldERlYnVnZ2VyVXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBWYWx1ZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgY29tbWFuZCB3YWl0aW5nIGZvciBpdHMgcmVwbHk6IHNldHRsZXMgdGhlIGNhbGxlcidzIHByb21pc2UgYW5kIGNhbmNlbHMgdGhlXG4gKiB0aW1lb3V0IHRoYXQgd291bGQgb3RoZXJ3aXNlIGZhaWwgaXQuXG4gKi9cbnR5cGUgUGVuZGluZ0NvbW1hbmQgPSAocmVzcG9uc2U6IENkcFJlc3BvbnNlKSA9PiB2b2lkO1xuXG5jb25zdCBWQVVMVF9JRF9CWVRFX0xFTkdUSCA9IDg7XG5jb25zdCBVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5jb25zdCBVU0VSX0RBVEFfUk1fUkVUUllfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTk9fT1VUUFVUID0gJyhubyBvdXRwdXQpJztcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbi8vIE9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiBvY2Nhc2lvbmFsbHkgYm9vdHMgd2l0aG91dCB0aGUgd29ya3NwYWNlIGV2ZXJcbi8vIEluaXRpYWxpemluZywgc28gdGhlIHZhdWx0IG5ldmVyIGJlY29tZXMgcmVhZHkuIEEgZnJlc2ggaW5zdGFuY2UgaXMgYW5cbi8vIEluZGVwZW5kZW50IGNoYW5jZTsgcmVsYXVuY2ggdXAgdG8gdGhpcyBtYW55IHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAuXG5jb25zdCBPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTID0gMztcbi8vIEJyaWVmIHNldHRsZSBiZWZvcmUgYSByZWxhdW5jaCBzbyB0aGUga2lsbGVkIGluc3RhbmNlJ3MgbWVtb3J5L2hhbmRsZXMgYXJlXG4vLyBSZWNsYWltZWQgYmVmb3JlIHRoZSBuZXh0IGJvb3QgXHUyMDE0IGltcHJvdmVzIHRoZSBvZGRzIG9uIGEgbG9hZGVkIG1hY2hpbmUuXG5jb25zdCBPV05FRF9SRUxBVU5DSF9TRVRUTEVfSU5fTUlMTElTRUNPTkRTID0gMzAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBJTlNUQU5DRV9FWElUX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG4vLyBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc3RhcnRlciBzY3JlZW4ncyByZW5kZXJlciB0byBleHBvc2UgYGxvY2FsU3RvcmFnZWBcbi8vIEFuZCBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyYCBcdTIwMTQgdGhlIHR3byB0aGluZ3MgdGhlIGNvbmZpZy1mb2xkZXIgb3ZlcnJpZGVcbi8vIE5lZWRzLiBDRFAgYWxyZWFkeSBzZXJ2ZXMgYSBwYWdlIHRhcmdldCBieSB0aGUgdGltZSB0aGUgbGF1bmNoIHJlc29sdmVzLCBzb1xuLy8gVGhpcyBvbmx5IGNvdmVycyB0aGUgcmVuZGVyZXIgZmluaXNoaW5nIGl0cyBvd24gc2NyaXB0IGV2YWx1YXRpb24uXG5jb25zdCBTVEFSVEVSX1NDUkVFTl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IFNUQVJURVJfU0NSRUVOX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjUwO1xuY29uc3QgT1dORURfV0lORE9XX09GRlNDUkVFTl9NQVJHSU5fSU5fUElYRUxTID0gMjAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAyMF8wMDA7XG5jb25zdCBPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDI1MDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKlxuICogQ29ubmVjdHMgdG8gT2JzaWRpYW4ncyBDRFAgV2ViU29ja2V0IGVuZHBvaW50LCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWBcbiAqIGNvbW1hbmRzLCBhbmQgcm91dGVzIGV4cHJlc3Npb25zIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDZHBUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBmb3IgYSBtb2JpbGUgcGxhdGZvcm0uIEFsd2F5cyBgZmFsc2VgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVZhdWx0UGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgYXNhckZhbGxiYWNrOiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RwSG9zdDogc3RyaW5nO1xuICBwcml2YXRlIGNkcFBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjZHBVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgZWxlY3Ryb25Db21wYXRpYmlsaXR5OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IG93bmVkQ29uZmlnOiBPd25lZEluc3RhbmNlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bmVkSW5zdGFuY2U6IE93bmVkT2JzaWRpYW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBpbi1mbGlnaHQgY29tbWFuZHMgb2YgZXZlcnkgc29ja2V0IHRoaXMgdHJhbnNwb3J0IGhhcyBvcGVuZWQsIGtleWVkIGJ5XG4gICAqIHRoZSBDRFAgbWVzc2FnZSBpZCBlYWNoIGlzIHdhaXRpbmcgZm9yLiBPbmUgZW50cnkgcGVyIGNvbW1hbmQsIGFkZGVkIGJ5XG4gICAqIHtAbGluayBzZW5kQ29tbWFuZH0gYW5kIHJlbW92ZWQgYnkgd2hpY2hldmVyIG9mIHRoZSByZXBseSBhbmQgdGhlIHRpbWVvdXRcbiAgICogY29tZXMgZmlyc3QgXHUyMDE0IHNlZSB7QGxpbmsgZ2V0UGVuZGluZ0NvbW1hbmRzfSBmb3Igd2h5IHRoaXMgZXhpc3RzIGF0IGFsbC5cbiAgICpcbiAgICogV2VhayBieSBzb2NrZXQgc28gYSBjbG9zZWQgdGVtcG9yYXJ5IGNvbm5lY3Rpb24gaXMgY29sbGVjdGFibGUgd2l0aCBpdHNcbiAgICogcGVuZGluZyBtYXA7IHRoZSBkaXNwYXRjaGVyIGxpc3RlbmVyIGlzIHRoZSBzb2NrZXQncyBvd24sIHNvIG5vdGhpbmcgaGVyZVxuICAgKiBrZWVwcyBpdCBhbGl2ZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ0NvbW1hbmRzQnlTb2NrZXQgPSBuZXcgV2Vha01hcDxXZWJTb2NrZXQsIE1hcDxudW1iZXIsIFBlbmRpbmdDb21tYW5kPj4oKTtcbiAgLyoqXG4gICAqIFZhdWx0IHBhdGhzIFRISVMgdHJhbnNwb3J0IG9wZW5lZCB2aWEge0BsaW5rIHJlZ2lzdGVyVmF1bHR9LCBub3JtYWxpemVkIGJ5XG4gICAqIHtAbGluayBub3JtYWxpemVWYXVsdFBhdGhGb3JDb21wYXJpc29ufS4gQSB3b3JrZXIgYXR0YWNoZWQgdG8gYVxuICAgKiBoYXJuZXNzLW93bmVkIGluc3RhbmNlIG1heSB0ZWFyIGRvd24gb25seSB0aGVzZSBcdTIwMTQgZXZlcnkgb3RoZXIgdmF1bHQgaW4gdGhhdFxuICAgKiBpbnN0YW5jZSBiZWxvbmdzIHRvIHRoZSBnbG9iYWwgc2V0dXAgdGhhdCBsYXVuY2hlZCBpdCAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUZWFyRG93blZhdWx0V2luZG93fSkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGZSZWdpc3RlcmVkVmF1bHRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZERpc2FibGVTYW5kYm94OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbiAgcHJpdmF0ZSB3czogbnVsbCB8IFdlYlNvY2tldCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ0RQIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIENEUCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnPzogRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZykge1xuICAgIC8vIERlc3RydWN0dXJlIHdpdGggcGVyLWZpZWxkIGRlZmF1bHRzIChlYWNoIGFwcGxpZXMgd2hlbiB0aGUgZmllbGQgaXMgb21pdHRlZCxcbiAgICAvLyBFeGFjdGx5IGxpa2UgdGhlIGZvcm1lciBgY29uZmlnPy54ID8/IGRlZmF1bHRgKSBzbyB0aGUgY29uc3RydWN0b3Igc3RheXNcbiAgICAvLyBVbmRlciB0aGUgY3ljbG9tYXRpYy1jb21wbGV4aXR5IGxpbWl0IGFzIGZpZWxkcyBhcmUgYWRkZWQuXG4gICAgY29uc3Qge1xuICAgICAgY2RwSG9zdCA9ICdsb2NhbGhvc3QnLFxuICAgICAgY2RwUG9ydCxcbiAgICAgIC8vIEEgdGVzdCdzIGNsb3N1cmUgdHJhdmVscyBhcyBvbmUgYFJ1bnRpbWUuZXZhbHVhdGVgIENEUCBjb21tYW5kLCBzbyB0aGVcbiAgICAgIC8vIENvbW1hbmQgYnVkZ2V0IElTIHRoZSBwZXItZXZhbCBjYXAgb24gdGhpcyB0cmFuc3BvcnQgXHUyMDE0IGhlbmNlIHRoZSBzaGFyZWRcbiAgICAgIC8vIENvbnN0YW50IHJhdGhlciB0aGFuIGEgZGVza3RvcC1zcGVjaWZpYyBudW1iZXIgdGhhdCBoYXBwZW5zIHRvIG1hdGNoLlxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgY29uZmlnRGlyZWN0b3J5LFxuICAgICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID0gREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA9IGZhbHNlLFxuICAgICAgaXNPYnNpZGlhbkFwcFZpc2libGUgPSB0cnVlLFxuICAgICAgb3duZWRJbnN0YW5jZSxcbiAgICAgIHNob3VsZERpc2FibGVTYW5kYm94ID0gZmFsc2UsXG4gICAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrID0gdHJ1ZSxcbiAgICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgPSB0cnVlXG4gICAgfSA9IGNvbmZpZyA/PyB7fTtcbiAgICB0aGlzLmNkcEhvc3QgPSBjZHBIb3N0O1xuICAgIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5jb25maWdEaXJlY3RvcnkgPSBjb25maWdEaXJlY3Rvcnk7XG4gICAgdGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID0gaXNIYXJuZXNzT3duZWRJbnN0YW5jZTtcbiAgICB0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlID0gaXNPYnNpZGlhbkFwcFZpc2libGU7XG4gICAgdGhpcy5vd25lZENvbmZpZyA9IG93bmVkSW5zdGFuY2U7XG4gICAgdGhpcy5zaG91bGREaXNhYmxlU2FuZGJveCA9IHNob3VsZERpc2FibGVTYW5kYm94O1xuICAgIHRoaXMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayA9IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s7XG4gICAgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzID0gc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcztcbiAgICAvLyBPd25lZCBtb2RlIHBpY2tzIGEgZnJlZSBwb3J0IGF0IGxhdW5jaCAoYXNzaWduZWQgaW4gcmVnaXN0ZXJWYXVsdCkuXG4gICAgLy8gQXR0YWNoIG1vZGUgY29ubmVjdHMgdG8gdGhlIGNvbmZpZ3VyZWQgcG9ydDsgbm8gcG9ydCBpcyBoYXJkY29kZWQuXG4gICAgdGhpcy5jZHBQb3J0ID0gY2RwUG9ydCA/PyAwO1xuICAgIHRoaXMuY2RwVXJsID0gY2RwUG9ydCA9PT0gdW5kZWZpbmVkID8gJycgOiBgaHR0cDovLyR7Y2RwSG9zdH06JHtTdHJpbmcoY2RwUG9ydCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlcyBhIFBORyBzY3JlZW5zaG90IG9mIHRoZSBPYnNpZGlhbiB3aW5kb3cgc2hvd2luZyB0aGUgZ2l2ZW4gdmF1bHQuXG4gICAqXG4gICAqIFdoZW4gYSBzaXplIGlzIHJlcXVlc3RlZCB0aGUgdmlld3BvcnQgaXMgcGlubmVkIHRvIGl0IHdpdGhcbiAgICogYEVtdWxhdGlvbi5zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGVgIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhcHR1cmUsIHNvIHRoZVxuICAgKiBlbWl0dGVkIFBORyBpcyBleGFjdGx5IHRoYXQgc2l6ZSB3aGF0ZXZlciBzaXplIHRoZSB3aW5kb3cgaGFwcGVucyB0byBiZSBcdTIwMTRcbiAgICogYW5kIHRoZSBvdmVycmlkZSBpcyBhbHdheXMgY2xlYXJlZCBhZnRlcndhcmRzLCBpbmNsdWRpbmcgd2hlbiB0aGUgY2FwdHVyZVxuICAgKiB0aHJvd3MsIHNvIGEgZmFpbGVkIGNhcHR1cmUgY2Fubm90IGxlYXZlIHRoZSB3aW5kb3cgc3R1Y2sgYXQgdGhlIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggdmF1bHQgd2luZG93IHRvIGNhcHR1cmUsIGFuZCB0aGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGl0IGF0LlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiBDRFAgcmV0dXJucyBubyBpbWFnZSBkYXRhLCBvciBkYXRhIHRoYXQgaXMgbm90IGEgUE5HLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhcHR1cmVTY3JlZW5zaG90KHBhcmFtczogQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbihwYXJhbXMuY3dkKTtcbiAgICBjb25zdCBkZXZpY2VNZXRyaWNzT3ZlcnJpZGUgPSBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZShwYXJhbXMpO1xuICAgIGlmIChkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdFbXVsYXRpb24uc2V0RGV2aWNlTWV0cmljc092ZXJyaWRlJywgZGV2aWNlTWV0cmljc092ZXJyaWRlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUGFnZS5jYXB0dXJlU2NyZWVuc2hvdCcsIHtcbiAgICAgICAgLy8gVGhlIG92ZXJyaWRlIGFscmVhZHkgc2l6ZXMgdGhlIHZpZXdwb3J0LCBzbyBjYXB0dXJpbmcgYmV5b25kIGl0IHdvdWxkXG4gICAgICAgIC8vIFJlLWludHJvZHVjZSB0aGUgc2Nyb2xsIGhlaWdodCB0aGUgb3ZlcnJpZGUgZXhpc3RzIHRvIHBpbiBkb3duLlxuICAgICAgICBjYXB0dXJlQmV5b25kVmlld3BvcnQ6IGZhbHNlLFxuICAgICAgICBmb3JtYXQ6ICdwbmcnXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLnJlc3VsdD8uZGF0YTtcbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDRFAgc2NyZWVuc2hvdCBlcnJvcjogUGFnZS5jYXB0dXJlU2NyZWVuc2hvdCByZXR1cm5lZCBubyBpbWFnZSBkYXRhLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBieXRlcyA9IGRlY29kZUJhc2U2NFBuZyhkYXRhKTtcbiAgICAgIGlmICghaXNQbmcoYnl0ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0RQIHNjcmVlbnNob3QgZXJyb3I6IFBhZ2UuY2FwdHVyZVNjcmVlbnNob3QgcmV0dXJuZWQgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZGV2aWNlTWV0cmljc092ZXJyaWRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdFbXVsYXRpb24uY2xlYXJEZXZpY2VNZXRyaWNzT3ZlcnJpZGUnLCB7fSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIG9mIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kLCBpbiBvd25lZC1pbnN0YW5jZSBtb2RlLFxuICAgKiBraWxscyB0aGUgb3duZWQgT2JzaWRpYW4gcHJvY2VzcyBhbmQgcmVtb3ZlcyBpdHMgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAgICpcbiAgICogVGhlIHJlbW92YWwgaXMgcmV0cmllZCBiZWNhdXNlIFdpbmRvd3MgYnJpZWZseSBob2xkcyB0aGUganVzdC1raWxsZWRcbiAgICogcHJvY2VzcydzIGZpbGUgaGFuZGxlcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGZhaWwgYHJtU3luY2Agd2l0aCBgRVBFUk1gLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKCF0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vd25lZEluc3RhbmNlPy5raWxsKCk7XG4gICAgY29uc3QgeyB1c2VyRGF0YURpcmVjdG9yeSB9ID0gdGhpcy5vd25lZENvbmZpZztcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKGRpZFJlbW92ZURpcmVjdG9yeSh1c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGlmICghZGlkUmVtb3ZlRGlyZWN0b3J5KHVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IHJlbW92ZSBvd25lZCB1c2VyLWRhdGEgZGlyZWN0b3J5IHdpdGhpbiAke1N0cmluZyhVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zIChub24tZmF0YWwpOiAke3VzZXJEYXRhRGlyZWN0b3J5fWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBkaXNwb3NhbCBcdTIwMTQga2lsbHMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBtYWtlcyBhIGJlc3QtZWZmb3J0XG4gICAqIHJlbW92YWwgb2YgaXRzIHVzZXItZGF0YSBkaXJlY3RvcnkuIFNhZmUgdG8gY2FsbCBmcm9tIGEgcHJvY2VzcyBgZXhpdGAgaGFuZGxlclxuICAgKiAod2hlcmUgYXN5bmMgcmV0cmllcyBhcmUgaW1wb3NzaWJsZTsgYSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yeSBpcyBhY2NlcHRhYmxlKS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlPy5raWxsKCk7XG4gICAgICBpZiAoIWRpZFJlbW92ZURpcmVjdG9yeSh0aGlzLm93bmVkQ29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPd25lZCB1c2VyLWRhdGEgZGlyZWN0b3J5IG5vdCByZW1vdmVkIHN5bmNocm9ub3VzbHkgKHByb2Nlc3MgbWF5IHN0aWxsIGhvbGQgaGFuZGxlcyk6ICR7dGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcmVjdG9yeX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgQ0RQIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAgICpcbiAgICogUm91dGVzIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCBiYXNlZCBvbiBgb3B0aW9ucy5jd2RgLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKG9wdGlvbnMuY3dkKTtcbiAgICBsZXQgcmVzcG9uc2U7XG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLypcbiAgICAgICAqIE9ubHkgVEhJUyBldmFsIGNhcnJpZXMgYSBjYWxsZXIncyBjbG9zdXJlIFx1MjAxNCB0aGUgaGFybmVzcydzIG93biBgUnVudGltZS5ldmFsdWF0ZWAgY2FsbHMgKHRoZSB0cnVzdFxuICAgICAgICogRGlhbG9nLCB0aGUgd2F0Y2hkb2csIHRoZSBib290IHByb2JlcykgdGltZSBvdXQgZm9yIHJlYXNvbnMgdGhhdCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBhIHRlc3Qnc1xuICAgICAgICogV2FpdGluZywgYW5kIHJlcG9ydGluZyB0aGUgY2FwIGZvciB0aG9zZSB3b3VsZCBiZSB0aGUgc2FtZSBtaXNkaWFnbm9zaXMgcG9pbnRpbmcgdGhlIG90aGVyIHdheS5cbiAgICAgICAqL1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2RwQ29tbWFuZFRpbWVvdXRFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXZhbENhcEV4Y2VlZGVkRXJyb3Ioe1xuICAgICAgICAgIGNhcEluTWlsbGlzZWNvbmRzOiB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIG9wdGlvbk5hbWU6ICdjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnZGVza3RvcCAoQ0RQKSdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LmV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgIGNvbnN0IGRlc2MgPSByZXNwb25zZS5yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24/LmRlc2NyaXB0aW9uXG4gICAgICAgID8/IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLnRleHQ7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENEUCBldmFsdWF0aW9uIGVycm9yOiAke2Rlc2N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0T2JqZWN0ID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHRPYmplY3QgfHwgcmVzdWx0T2JqZWN0LnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gTk9fT1VUUFVUO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcocmVzdWx0T2JqZWN0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0IGZvciB0aGlzIG93bmVkIGluc3RhbmNlIFx1MjAxNCB3aGV0aGVyIHRoZVxuICAgKiBhcHAgdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluLCBvciB0aGUgaW5zdGFsbGVyXG4gICAqIHNpbGVudGx5IHJldmVydGVkIHRvIGl0cyBvd24gYnVuZGxlZCBhc2FyIChyZWFkIGxpdmUgcG9zdC1ib290KS4gUmV0dXJuc1xuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90IGFuIG93bmVkIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaGFzIG5vdCBib290ZWRcbiAgICogeWV0LCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAobm8gYXNhciB3YXMgc3dhcHBlZCwgb3IgdGhlIGxpdmVcbiAgICogdmVyc2lvbiB3YXMgdW5yZWFkYWJsZSkuIEEgYCdmYWxsYmFjaydgIHZlcmRpY3QgcmVhY2hlcyB0aGlzIHN1cmZhY2Ugb25seSB3aGVuXG4gICAqIHRoZSB0aHJvdyBpcyBkaXNhYmxlZCAoe0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFja31cbiAgICogYGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNpbGVudC1hc2FyLWZhbGxiYWNrIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldEFzYXJGYWxsYmFjaygpOiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFzYXJGYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciB0aGlzIG93bmVkXG4gICAqIGluc3RhbmNlLCBzbyBjYWxsZXJzIGNhbiBhc3NlcnQgb24gaXQuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdFxuICAgKiBhbiBvd25lZCBpbnN0YW5jZSwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKGUuZy4gYW5cbiAgICogdW5kZXRlY3RhYmxlIHNoZWxsIHZlcnNpb24sIG9yIHRoZSBhcHAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGUgdGFibGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wYXRpYmlsaXR5KCk6IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm93bmVkQ29uZmlnPy5jb21wYXRpYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciB0aGlzIG93bmVkIGluc3RhbmNlIFx1MjAxNFxuICAgKiB3aGV0aGVyIHRoZSBFbGVjdHJvbiB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgbmV3IGVub3VnaCBmb3IgdGhlXG4gICAqIHJ1bm5pbmcgYXBwIHZlcnNpb24gKHJlYWQgbGl2ZSBwb3N0LWJvb3Q7IHNlZSB7QGxpbmsgT2JzaWRpYW5WZXJzaW9uTWV0YWRhdGEubWluUmVjb21tZW5kZWRFbGVjdHJvblZlcnNpb259KS5cbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90IGFuIG93bmVkIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaGFzIG5vdFxuICAgKiBib290ZWQgeWV0LCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAodGhlIGxpdmUgdmVyc2lvbiB3YXNcbiAgICogdW5yZWFkYWJsZSwgb3IgdGhlIGFwcCB2ZXJzaW9uIGNhcnJpZXMgbm8gcmVjb21tZW5kZWQgRWxlY3Ryb24gdmVyc2lvbikuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlY3Ryb25Db21wYXRpYmlsaXR5KCk6IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlY3Ryb25Db21wYXRpYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIENEUCBlbmRwb2ludCBvZiB0aGUgb3duZWQsIGxhdW5jaGVkIGluc3RhbmNlIHNvIHRoZSBnbG9iYWwgc2V0dXBcbiAgICogY2FuIGhhbmQgaXQgdG8gdGVzdCB3b3JrZXJzICh3aGljaCB0aGVuICoqYXR0YWNoKiogdG8gaXQgaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgdGhlaXIgb3duKS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgdHJhbnNwb3J0IGlzIG5vdCBhblxuICAgKiBvd25lZCBpbnN0YW5jZSwgb3IgaXRzIGluc3RhbmNlIGhhcyBub3QgYmVlbiBsYXVuY2hlZCB5ZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvd25lZCBpbnN0YW5jZSdzIENEUCBob3N0IGFuZCBwb3J0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTogT3duZWRJbnN0YW5jZUVuZHBvaW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMub3duZWRDb25maWcgfHwgIXRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdDogdGhpcy5jZHBIb3N0LCBwb3J0OiB0aGlzLmNkcFBvcnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSBDRFAgZW5kcG9pbnQgaXMgcmVhY2hhYmxlIGFuZCBoYXMgT2JzaWRpYW4gdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcsIGF0dGVtcHRzIHRvIGF1dG8tc3RhcnQgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgZm9yIHZhdWx0IHJlZ2lzdHJhdGlvbiBjaGVjaykuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZyB8fCB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UpIHtcbiAgICAgIC8vIE93bmVkIGluc3RhbmNlIChsYXVuY2hlZCBoZXJlKSBvciBhIHdvcmtlciBhdHRhY2hlZCB0byBvbmU6IHJlYWRpbmVzcyBpc1xuICAgICAgLy8gR3VhcmFudGVlZCBieSB0aGUgZ2xvYmFsIHNldHVwJ3MgcmVnaXN0ZXJWYXVsdCwgYW5kIHRoZSB2YXVsdCBsaXZlcyBpblxuICAgICAgLy8gVGhlIGlzb2xhdGVkIGNvbmZpZyBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkgYWdhaW5zdCB0aGUgdXNlci1zY29wZVxuICAgICAgLy8gUmVnaXN0cnkuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wb3JhcnlWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwYWdlIHRhcmdldHMnKTtcbiAgICAgIH1cbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENEUCByZWFjaGFibGUsICR7U3RyaW5nKHRhcmdldHMubGVuZ3RoKX0gdGFyZ2V0KHMpIGZvdW5kLmApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgdmlhIEVsZWN0cm9uIElQQyBldmFsdWF0ZWQgdGhyb3VnaCBDRFAuXG4gICAqXG4gICAqIFVzZXMgYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0IHRvIHNlbmQgdGhlIGB2YXVsdC1vcGVuYCBJUEMgY29tbWFuZCxcbiAgICogdGhlbiBwb2xscyB1bnRpbCB0aGUgbmV3IHZhdWx0J3MgdGFyZ2V0IGFwcGVhcnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclZhdWx0SW5Pd25lZEluc3RhbmNlKHZhdWx0UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICAgIC8vIFJlY29yZGVkIG9ubHkgb24gc3VjY2VzcywgYW5kIG9ubHkgaGVyZTogdGhpcyBpcyB0aGUgb25lIGJyYW5jaCB0aGF0IG9wZW5zXG4gICAgLy8gQSB3aW5kb3cgaW4gYW4gaW5zdGFuY2UgdGhpcyB0cmFuc3BvcnQgZGlkIG5vdCBsYXVuY2gsIHNvIGl0IGlzIHRoZSBvbmVcbiAgICAvLyBCcmFuY2ggdGhhdCBlYXJucyB0aGUgcmlnaHQgdG8gY2xvc2Ugb25lIChzZWUgYHVucmVnaXN0ZXJWYXVsdGApLlxuICAgIHRoaXMuc2VsZlJlZ2lzdGVyZWRWYXVsdFBhdGhzLmFkZChub3JtYWxpemVWYXVsdFBhdGhGb3JDb21wYXJpc29uKHZhdWx0UGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgYnkgZGVzdHJveWluZyBpdHMgd2luZG93IGFuZCByZW1vdmluZyBpdCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICpcbiAgICogUmVmdXNlcyB3aGVuIHRoaXMgdHJhbnNwb3J0IGRvZXMgbm90IG93biB3aGF0IGl0IHdvdWxkIGJlIHRlYXJpbmcgZG93biBcdTIwMTRcbiAgICogc2VlIHtAbGluayBzaG91bGRUZWFyRG93blZhdWx0V2luZG93fSBmb3Igd2hpY2ggb2YgdGhlIHR3byBvd25lcnNoaXAgZmxhZ3NcbiAgICogbWVhbnMgd2hhdCwgYW5kIHdoeSB0aGV5IGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3JtYWxpemVkVmF1bHRQYXRoID0gbm9ybWFsaXplVmF1bHRQYXRoRm9yQ29tcGFyaXNvbih2YXVsdFBhdGgpO1xuICAgIGlmIChcbiAgICAgICFzaG91bGRUZWFyRG93blZhdWx0V2luZG93KHtcbiAgICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlLFxuICAgICAgICBpc093bmVkSW5zdGFuY2U6IEJvb2xlYW4odGhpcy5vd25lZENvbmZpZyksXG4gICAgICAgIGlzU2VsZlJlZ2lzdGVyZWQ6IHRoaXMuc2VsZlJlZ2lzdGVyZWRWYXVsdFBhdGhzLmhhcyhub3JtYWxpemVkVmF1bHRQYXRoKVxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGxvZyhcbiAgICAgICAgdGhpcy5vd25lZENvbmZpZ1xuICAgICAgICAgID8gYFtjZHAtdHJhbnNwb3J0XSBTa2lwcGluZyBwZXItdmF1bHQgdGVhcmRvd247IHRoZSBvd25lZCBpbnN0YW5jZSBpcyBraWxsZWQgd2hvbGVzYWxlIG9uIGRpc3Bvc2U6ICR7dmF1bHRQYXRofWBcbiAgICAgICAgICA6IGBbY2RwLXRyYW5zcG9ydF0gU2tpcHBpbmcgcGVyLXZhdWx0IHRlYXJkb3duOyB0aGlzIHdvcmtlciBkaWQgbm90IHJlZ2lzdGVyIHRoZSB2YXVsdCBpdCB3YXMgYXNrZWQgdG8gdW5yZWdpc3RlcjogJHt2YXVsdFBhdGh9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGZSZWdpc3RlcmVkVmF1bHRQYXRocy5kZWxldGUobm9ybWFsaXplZFZhdWx0UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgd2luZG93RGVzdHJveUV4cHJlc3Npb24gPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgICBleHByZXNzaW9uOiB3aW5kb3dEZXN0cm95RXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdpbmRvdyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBgdmF1bHQtcmVtb3ZlYCBJUEMgaXMgc2VudCB0aHJvdWdoIGEgc3RpbGwtb3BlbiB3aW5kb3cgKGB0YXJnZXRzWzBdYCkgXHUyMDE0XG4gICAgICAvLyBgdmF1bHRQYXRoYCdzIG93biB3aW5kb3cgd2FzIGp1c3QgZGVzdHJveWVkIGFib3ZlLCBzbyBib290c3RyYXAgdGhlIG5hbWVzcGFjZVxuICAgICAgLy8gT24gdGhlIGV4aXN0aW5nIHdpbmRvdydzIE9XTiBiYXNlIHBhdGgsIG5vdCBvbiBgdmF1bHRQYXRoYCAod2hpY2ggbm8gbG9uZ2VyIGhhc1xuICAgICAgLy8gQSBsaXZlIHRhcmdldCB0byBtYXRjaCkuXG4gICAgICBjb25zdCByZW1vdmFsVGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgICBjb25zdCByZW1vdmFsQmFzZVBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKHJlbW92YWxUYXJnZXQpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChyZW1vdmFsVGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCByZW1vdmFsQmFzZVBhdGgpO1xuICAgICAgICBjb25zdCB2YXVsdFJlbW92ZUV4cHJlc3Npb24gPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWw6ICd2YXVsdC1yZW1vdmUnLCBjaGFubmVsQXJndW1lbnRzOiBbdmF1bHRQYXRoXSB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHZhdWx0UmVtb3ZlRXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTm8gQ0RQIHRhcmdldHMgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCByZW1vdmluZyBkaXJlY3RseSBmcm9tIG9ic2lkaWFuLmpzb24uJyk7XG4gICAgICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgcnVudGltZS1FbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgKG9uXG4gICAqIHtAbGluayBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9KSBmcm9tIGFuIGFscmVhZHktcmVhZCB2ZXJzaW9uIHBhaXIsIHdhcm5pbmdcbiAgICogd2hlbiB0aGUgbGl2ZSBFbGVjdHJvbiBpcyBiZWxvdyB0aGUgYXBwJ3MgcmVjb21tZW5kZWQgbWluaW11bS4gTmV2ZXIgdGhyb3dzOyBhXG4gICAqIGJvb3Qgd2hvc2UgcnVubmluZyBhcHAgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZSBpcyBza2lwcGVkIChub3RoaW5nIHRvIGp1ZGdlKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqIEBwYXJhbSBhY3R1YWxFbGVjdHJvblZlcnNpb24gLSBUaGUgbGl2ZSBFbGVjdHJvbiB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgYWN0dWFsRWxlY3Ryb25WZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoYXBwVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHJlc29sdmVFbGVjdHJvbkNvbXBhdGliaWxpdHkoe1xuICAgICAgYWN0dWFsRWxlY3Ryb25WZXJzaW9uLFxuICAgICAgYXBwVmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgICB9KTtcbiAgICB0aGlzLmVsZWN0cm9uQ29tcGF0aWJpbGl0eSA9IHZlcmRpY3Q7XG4gICAgaWYgKHZlcmRpY3QudGllciA9PT0gJ25hZ2dlZCcgJiYgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSAke2Vuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvaW50cyB0aGUgb3duZWQgaW5zdGFuY2UncyByZW5kZXJlciBhdCB0aGlzIHByb2Nlc3MncyBsaXZlbmVzcyBzb2NrZXQgc28gaXRcbiAgICogZGVzdHJveXMgaXRzZWxmIGlmIHdlIGRpZSB3aXRob3V0IHJ1bm5pbmcgdGVhcmRvd24gKHNlZSBgcGFyZW50LWxpdmVuZXNzLnRzYCkuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0IGJ5IGRlc2lnbi4gQSByZW5kZXJlciB3aXRob3V0IE5vZGUgYWNjZXNzIHJlcG9ydHMgYCd1bmF2YWlsYWJsZSdgXG4gICAqIGFuZCBhbiBldmFsdWF0aW9uIGZhaWx1cmUgaXMgbG9nZ2VkIGFuZCBzd2FsbG93ZWQ6IHRoZSB3YXRjaGRvZyBpcyBhIGJhY2tzdG9wXG4gICAqIGZvciBhbiBhbHJlYWR5LWFibm9ybWFsIGV4aXQsIG5ldmVyIGEgcmVhc29uIHRvIGZhaWwgYW4gb3RoZXJ3aXNlIGdvb2QgbGF1bmNoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqIEBwYXJhbSBwYXJlbnRMaXZlbmVzc1BvcnQgLSBUaGUgbG9vcGJhY2sgcG9ydCB0aGUgcmVuZGVyZXIgc2hvdWxkIGNvbm5lY3QgYmFjayB0by5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXJtUGFyZW50TGl2ZW5lc3NXYXRjaGRvZyh2YXVsdFBhdGg6IHN0cmluZywgcGFyZW50TGl2ZW5lc3NQb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShidWlsZFBhcmVudExpdmVuZXNzV2F0Y2hkb2dFeHByZXNzaW9uKHBhcmVudExpdmVuZXNzUG9ydCksIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2cgb24gcG9ydCAke1N0cmluZyhwYXJlbnRMaXZlbmVzc1BvcnQpfTogJHtyZXN1bHR9LmApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgYXJtIHRoZSBwYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2cgKGluc3RhbmNlIG1heSBvdXRsaXZlIGEga2lsbGVkIGhhcm5lc3MpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSByZWFkeSB2YXVsdCBpcyBhY3R1YWxseSB1c2luZyB0aGUgcmVxdWVzdGVkIGNvbmZpZyBmb2xkZXIsXG4gICAqIHRocm93aW5nIHtAbGluayBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yfSB3aGVuIGl0IGlzIG5vdC5cbiAgICpcbiAgICogT2JzaWRpYW4gYXBwbGllcyB0aGUgb3ZlcnJpZGUgd2l0aCBgc2V0Q29uZmlnRGlyYCwgd2hpY2ggc3Vic3RpdHV0ZXNcbiAgICogYC5vYnNpZGlhbmAgZm9yIGFueSB2YWx1ZSBpdHMgb3duIGB2YWxpZGF0ZUNvbmZpZ0RpcmAgcmVqZWN0cyBcdTIwMTQgd2l0aG91dCBhXG4gICAqIHdvcmQsIGFuZCB3aXRob3V0IGZhaWxpbmcgdGhlIGJvb3QuIFRoZSByZXN1bHRpbmcgdmF1bHQgb3BlbnMsIHJlYWNoZXNcbiAgICogbGF5b3V0LXJlYWR5LCBhbmQgcmVwb3J0cyBzdWNjZXNzOyB3aGF0IGl0IGxhY2tzIGlzIHRoZSBzZXR0aW5ncyBhbmQgZW5hYmxlZFxuICAgKiBwbHVnaW5zIG9mIHRoZSBmb2xkZXIgdGhhdCB3YXMgYXNrZWQgZm9yLiBSZWFkaW5nIHRoZSBsaXZlXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBiYWNrIGlzIHRoZSBvbmx5IHdheSB0byB0ZWxsIHRoZSB0d28gYXBhcnQsIGFuZCBpdFxuICAgKiBjb3ZlcnMgZXZlcnkgY2F1c2UgYXQgb25jZTogYSBuYW1lIE9ic2lkaWFuIHJlamVjdGVkIChpbmNsdWRpbmcgaXRzXG4gICAqIHVucmVjb3ZlcmFibGUgY2hhcmFjdGVyIGJsYWNrbGlzdCwgd2hpY2ggYGFzc2VydFZhbGlkQ29uZmlnRGlyZWN0b3J5YCBkZWxpYmVyYXRlbHlcbiAgICogZG9lcyBub3QgZ3Vlc3MgYXQpLCBhbmQgYSB3cml0ZSB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIHZhdWx0J3MgcmVuZGVyZXIuXG4gICAqXG4gICAqIEEgbm8tb3Agd2hlbiBubyBvdmVycmlkZSB3YXMgcmVxdWVzdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0UmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29uZmlnRGlyZWN0b3J5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxDb25maWdEaXJlY3RvcnkgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKCdhcHAudmF1bHQuY29uZmlnRGlyJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAoYWN0dWFsQ29uZmlnRGlyZWN0b3J5ID09PSB0aGlzLmNvbmZpZ0RpcmVjdG9yeSkge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gVmF1bHQgb3BlbmVkIHdpdGggdGhlIHJlcXVlc3RlZCBjb25maWcgZm9sZGVyICR7dGhpcy5jb25maWdEaXJlY3Rvcnl9LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yKHtcbiAgICAgIGFjdHVhbENvbmZpZ0RpcmVjdG9yeSxcbiAgICAgIHJlcXVlc3RlZENvbmZpZ0RpcmVjdG9yeTogdGhpcy5jb25maWdEaXJlY3RvcnksXG4gICAgICB2YXVsdFBhdGhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGVycm9yIGZvciBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgdGhhdCBpcyBubyBsb25nZXIgc2VydmluZyBDRFAsXG4gICAqIGZyb20gdGhlIGJlc3QgZXZpZGVuY2UgdGhpcyBwcm9jZXNzIGhhcy5cbiAgICpcbiAgICogVHdvIHByb2Nlc3NlcyBzZWUgdHdvIGRpZmZlcmVudCBoYWx2ZXMgb2YgdGhlIGRlYXRoLiBUaGUgb25lIHRoYXQgbGF1bmNoZWRcbiAgICogdGhlIGluc3RhbmNlIGhvbGRzIHRoZSBjaGlsZCBhbmQgY2FuIHJlYWQgdGhlIGV4aXQgY29kZSBzdHJhaWdodCBvZmYgaXQ7IGFcbiAgICogdGVzdCB3b3JrZXIgaG9sZHMgbm90aGluZyBidXQgdGhlIHBvcnQsIGFuZCByZWFkcyB0aGUgc2FtZSBmYWN0cyBmcm9tIHRoZVxuICAgKiBleGl0IG1hcmtlciB0aGUgb3duZXIgd3JvdGUgKGBvd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci50c2ApLiBXaXRoIG5laXRoZXJcbiAgICogXHUyMDE0IHRoZSBtYXJrZXIgbG9zdCwgb3IgYSBraWxsIHNvIGFicnVwdCBub3RoaW5nIHJlY29yZGVkIGl0IFx1MjAxNCB0aGUgZXJyb3Igc3RpbGxcbiAgICogbmFtZXMgdGhlIGluc3RhbmNlIGFzIHRoZSBjYXVzZSwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZXJyb3IgdG8gdGhyb3cgaW4gcGxhY2Ugb2YgYSByZWZ1c2VkIGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yKCk6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciB7XG4gICAgY29uc3QgZXhpdEluZm8gPSB0aGlzLm93bmVkSW5zdGFuY2U/LnJlYWRFeGl0SW5mbygpO1xuICAgIGlmIChleGl0SW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3Ioe1xuICAgICAgICBjZHBVcmw6IHRoaXMuY2RwVXJsLFxuICAgICAgICBjb2RlOiBleGl0SW5mby5jb2RlLFxuICAgICAgICBvdXRwdXRUYWlsOiB0aGlzLm93bmVkSW5zdGFuY2U/LnJlYWRPdXRwdXQoKSxcbiAgICAgICAgc2lnbmFsOiBleGl0SW5mby5zaWduYWwsXG4gICAgICAgIHNwYXduRXJyb3I6IGV4aXRJbmZvLnNwYXduRXJyb3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckZyb21NYXJrZXIodGhpcy5jZHBVcmwsIHJlYWRPd25lZEluc3RhbmNlRXhpdE1hcmtlcih0aGlzLmNkcFBvcnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcnVubmluZyBhcHAgKGFzYXIpIHZlcnNpb24gbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIHN0b3JpbmcgdGhlXG4gICAqIHZlcmRpY3Qgb24ge0BsaW5rIGdldEFzYXJGYWxsYmFja30uIE9uIGEgKipzaWxlbnQgZmFsbGJhY2sqKiAodGhlIGluc3RhbGxlciByYW5cbiAgICogaXRzIG93biBidW5kbGVkIGFzYXIgaW5zdGVhZCBvZiB0aGUgcGluKSBpdCB0aHJvd3Mge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfVxuICAgKiB3aGVuIHRoZSB0aHJvdyBpcyBlbmFibGVkLCBvdGhlcndpc2Ugd2FybnMgKHdoZW4gd2FybmluZ3MgYXJlIG9uKSBhbmQgbGV0cyB0aGVcbiAgICogYm9vdCBwcm9jZWVkLiBBIGJvb3Qgd2l0aCBubyBzd2FwcGVkLWluIGFzYXIsIG9yIGFuIHVucmVhZGFibGUgcnVubmluZyB2ZXJzaW9uLFxuICAgKiBpcyBgJ3Vua25vd24nYCBcdTIwMTQgbm90aGluZyBpcyB0aHJvd24gb3Igd2FybmVkLiBUaGlzIGlzIHRoZSBoZWFsdGh5LVVJIGNvbXBhbmlvbiB0b1xuICAgKiB0aGUgYmxhY2stc2NyZWVuIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfSBkZWFkLWJvb3QgZmFzdC1mYWlsLlxuICAgKlxuICAgKiBAcGFyYW0gcnVubmluZ0FwaVZlcnNpb24gLSBUaGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrUnVudGltZUFzYXJGYWxsYmFjayhydW5uaW5nQXBpVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHJlc29sdmVBc2FyRmFsbGJhY2soe1xuICAgICAgcmVxdWVzdGVkVmVyc2lvbjogdGhpcy5vd25lZENvbmZpZz8uYXNhcj8udmVyc2lvbixcbiAgICAgIHJ1bm5pbmdBcGlWZXJzaW9uXG4gICAgfSk7XG4gICAgdGhpcy5hc2FyRmFsbGJhY2sgPSB2ZXJkaWN0O1xuXG4gICAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUFzYXJGYWxsYmFja0FjdGlvbih7XG4gICAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiB0aGlzLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2ssXG4gICAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgICB0aWVyOiB2ZXJkaWN0LnRpZXJcbiAgICB9KTtcbiAgICBpZiAoYWN0aW9uID09PSAndGhyb3cnKSB7XG4gICAgICB0aHJvdyBuZXcgU2lsZW50QXNhckZhbGxiYWNrRXJyb3Ioe1xuICAgICAgICByZXF1ZXN0ZWRWZXJzaW9uOiBlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0LnJlcXVlc3RlZFZlcnNpb24pLFxuICAgICAgICBydW5uaW5nQXBpVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5ydW5uaW5nQXBpVmVyc2lvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uID09PSAnd2FybicpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdICR7ZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgcG9zdC1ib290IHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIGFuIG93bmVkIGluc3RhbmNlLCBvbmNlIHRoZVxuICAgKiB2YXVsdCBpcyByZWFkeS4gUmVhZHMgdGhlIGxpdmUgcnVubmluZyBhcHAgdmVyc2lvbiBhbmQgRWxlY3Ryb24gdmVyc2lvbiAqKm9uY2UqKlxuICAgKiBmcm9tIHRoZSBib290ZWQgcmVuZGVyZXIncyBtYWluIHByb2Nlc3MsIHRoZW46ICgxKSB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHBcbiAgICogdmVyc2lvbiBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiBcdTIwMTQgdGhyb3dpbmcge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfSBvblxuICAgKiBhIHNpbGVudCBmYWxsYmFjayAod2hlbiBlbmFibGVkKTsgYW5kICgyKSBydW5zIHRoZSBiZXN0LWVmZm9ydCBydW50aW1lLUVsZWN0cm9uXG4gICAqIG5hZy4gT25seSB0aGUgYXNhci1mYWxsYmFjayBjaGVjayBjYW4gdGhyb3csIHNvIHRoaXMgbXVzdCBydW4gb3V0c2lkZSB0aGVcbiAgICogcmVhZGluZXNzIHBvbGwncyB0cnkvY2F0Y2ggKGEgc3dhbGxvd2VkIHRocm93IHdvdWxkIGxvb3AgdW50aWwgdGltZW91dCkuXG4gICAqXG4gICAqIEJvdGggYXJlIHJlYWQgYXQgdGhlIHJlbmRlcmVyIHRvcCBsZXZlbDogYGlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2ZXJzaW9uJylgICh0aGVcbiAgICogcnVubmluZyBhcHAgdmVyc2lvbiwgdHJ1dGhmdWwgZXZlbiB1bmRlciBhIHNpbGVudCBhc2FyIGZhbGxiYWNrKSBhbmRcbiAgICogYHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb25gICh0aGUgbGl2ZSBzaGVsbCBFbGVjdHJvbik7IG5laXRoZXIgdXNlc1xuICAgKiBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIHJlc29sdmVzIG9ubHkgaW5zaWRlIGEgcGx1Z2luLWxvYWQgY29udGV4dC4gQSByZWFkXG4gICAqIGZhaWx1cmUgbGVhdmVzIGJvdGggdW5rbm93biAobG9nZ2VkLCBub24tZmF0YWwpIFx1MjAxNCBhbiB1bnJlYWRhYmxlIHJ1bm5pbmcgdmVyc2lvblxuICAgKiBjYW5ub3QgYmUganVkZ2VkIGEgZmFsbGJhY2ssIHNvIHRoZSBib290IGlzIG5vdCBicm9rZW4gYnkgYSBmbGFreSByZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrUnVudGltZUNvbXBhdGliaWxpdHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBhY3R1YWxFbGVjdHJvblZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3QXBwVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyh3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoXFwndmVyc2lvblxcJykpJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgIGFwcFZlcnNpb24gPSByYXdBcHBWZXJzaW9uID09PSAnJyB8fCByYXdBcHBWZXJzaW9uID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IHJhd0FwcFZlcnNpb247XG4gICAgICBhY3R1YWxFbGVjdHJvblZlcnNpb24gPSBhd2FpdCB0aGlzLmV2YWx1YXRlKCdTdHJpbmcocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgcmVhZCBydW50aW1lIHZlcnNpb25zIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gRmFpbHMgZmFzdCAod2hlbiBlbmFibGVkKSBvbiBhIHNpbGVudCBhc2FyIGZhbGxiYWNrIFx1MjAxNCBNVVNUIHJ1biBiZWZvcmUgdGhlXG4gICAgLy8gQmVzdC1lZmZvcnQgbmFnIGFuZCBvdXRzaWRlIGFueSB0cnkvY2F0Y2ggc28gdGhlIHRocm93IGVzY2FwZXMgdGhlIHBvbGwuXG4gICAgdGhpcy5jaGVja1J1bnRpbWVBc2FyRmFsbGJhY2soYXBwVmVyc2lvbik7XG4gICAgdGhpcy5hcHBseUVsZWN0cm9uQ29tcGF0aWJpbGl0eShhcHBWZXJzaW9uLCBhY3R1YWxFbGVjdHJvblZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3RzIHRvIGEgQ0RQIHRhcmdldCdzIFdlYlNvY2tldCBlbmRwb2ludC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBDRFAgdGFyZ2V0IHRvIGNvbm5lY3QgdG8uXG4gICAqIEByZXR1cm5zIFRoZSBvcGVuIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9UYXJnZXQodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPFdlYlNvY2tldD4ge1xuICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBjb25uZWN0IHRvIENEUCB0YXJnZXQ6ICR7dGFyZ2V0LndlYlNvY2tldERlYnVnZ2VyVXJsfWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB3cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLndzID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEFjdHMgYXMgYSBzYWZldHkgbmV0IHdoZW4gYGVuYWJsZS1wbHVnaW4tPGlkPmAgaXMgd3JpdHRlbiBpbiBvbmUgcmVuZGVyZXJcbiAgICogYnV0IG5vdCB5ZXQgdmlzaWJsZSB0byB0aGUgbmV3bHktb3BlbmVkIHZhdWx0J3MgcmVuZGVyZXIgKHJhY2Ugb2JzZXJ2ZWRcbiAgICogaW4gT2JzaWRpYW4gMS4xMy4wKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIEFuIG9wZW4gV2ViU29ja2V0IHRvIGFuIGV4aXN0aW5nIE9ic2lkaWFuIHRhcmdldC5cbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh3czogV2ViU29ja2V0LCB2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgaWYgKCF2YXVsdElkKSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgZmluZCB2YXVsdCBJRCBcdTIwMTQgc2tpcHBpbmcgbG9jYWxTdG9yYWdlIHRydXN0IGZsYWcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICBleHByZXNzaW9uOiBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2AsXG4gICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgfSk7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGVyZSBpcyBhbiBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0LlxuICAgKlxuICAgKiBSZXVzZXMgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gaWYgaXQgdGFyZ2V0cyB0aGUgcmVxdWVzdGVkIHZhdWx0LlxuICAgKiBPdGhlcndpc2UsIGZpbmRzIHRoZSBjb3JyZWN0IHRhcmdldCBhbmQgcmVjb25uZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHRhcmdldC5cbiAgICogQHJldHVybnMgVGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQ29ubmVjdGlvbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOICYmIHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLndzO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICB0aGlzLndzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9IHZhdWx0UGF0aDtcbiAgICByZXR1cm4gdGhpcy53cztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBPYnNpZGlhbiB3aXRoIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgYW5kIHBvbGxzIHVudGlsIENEUCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCBub3QgcmVhY2hhYmxlLiBTdGFydGluZyBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcuLi4nKTtcblxuICAgIGNvbnN0IGxhdW5jaENvbW1hbmQgPSBhd2FpdCBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQodGhpcy5jZHBQb3J0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhsYXVuY2hDb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbGF1bmNoIGNvbW1hbmQgbWF5IGZhaWwgb24gc29tZSBzeXN0ZW1zIFx1MjAxNCB3ZSdsbCBzdGlsbCB0cnkgcG9sbGluZy5cbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciBDRFAgZW5kcG9pbnQgYXQgJHt0aGlzLmNkcFVybH0gKHRpbWVvdXQ9JHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBkZWxheShBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPYnNpZGlhbiBDRFAgcmVhZHksICR7U3RyaW5nKHRhcmdldHMubGVuZ3RoKX0gdGFyZ2V0KHMpIGZvdW5kLmApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENEUCBub3QgcmVhZHkgeWV0LCByZXRyeWluZy4uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGFjY2Vzc2libGUuYCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIENEUCB0YXJnZXQgdGhhdCBoYXMgdGhlIGdpdmVuIHZhdWx0IG9wZW4uXG4gICAqXG4gICAqIFByb2JlcyBldmVyeSB0YXJnZXQgYnkgZXZhbHVhdGluZyBgZ2V0QmFzZVBhdGgoKWAgYW5kIHJldHVybnMgdGhlIG9uZSB3aG9zZVxuICAgKiBiYXNlIHBhdGggbWF0Y2hlcyBgdmF1bHRQYXRoYCAodmlhIHtAbGluayBhcmVWYXVsdFBhdGhzTWF0Y2hpbmd9LCB0b2xlcmFudCBvZlxuICAgKiBzZXBhcmF0b3IvY2FzZSBkaWZmZXJlbmNlcykuIEEgc2luZ2xlIHRhcmdldCBpcyAqKm5vdCoqIHJldHVybmVkIGJsaW5kbHk6IHdpdGhcbiAgICogbW9yZSB0aGFuIG9uZSB2YXVsdCBvcGVuIChhdHRhY2ggbW9kZSdzIHNoYXJlZCBpbnN0YW5jZSksIHRoZSBzb2xlLXRhcmdldFxuICAgKiBzaG9ydGN1dCB3b3VsZCByZXR1cm4gd2hpY2hldmVyIHdpbmRvdyBoYXBwZW5zIHRvIGJlIG9wZW4gcmVnYXJkbGVzcyBvZiB3aGljaFxuICAgKiB2YXVsdCB3YXMgcmVxdWVzdGVkIFx1MjAxNCB0aGUgZXhhY3QgbWlzLXJvdXRpbmcgdGhpcyBtZXRob2QgbXVzdCBhdm9pZC4gQSB0YXJnZXRcbiAgICogd2hvc2UgcHJvYmUgdGhyb3dzIGlzIHRyZWF0ZWQgYXMgbm90LXJlYWR5IGFuZCBza2lwcGVkICh0aGUgY2FsbGVyJ3MgcmVhZGluZXNzXG4gICAqIHBvbGwgcmV0cmllcyk7IGEgdGFyZ2V0IHdob3NlIHByb2JlIHN1Y2NlZWRzIGJ1dCBkb2VzIG5vdCBtYXRjaCBpcyBuZXZlclxuICAgKiByZXR1cm5lZC4gV2hlbiBub3RoaW5nIG1hdGNoZXMsIHRocm93IHNvIHRoZSBjYWxsZXIga2VlcHMgcG9sbGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIG1hdGNoLlxuICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgQ0RQIHRhcmdldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxDZHBUYXJnZXQ+IHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuXG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9ic2lkaWFuIENEUCB0YXJnZXRzIGZvdW5kJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKHRhcmdldCk7XG4gICAgICAgIGlmIChhcmVWYXVsdFBhdGhzTWF0Y2hpbmcoYmFzZVBhdGgsIHZhdWx0UGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGEgdmF1bHQgdGFyZ2V0IG9yIG5vdCByZWFkeS5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENEUCB0YXJnZXQgZm91bmQgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIHBhZ2UtdHlwZSB0YXJnZXRzIGZyb20gdGhlIENEUCBgL2pzb25gIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBwYWdlIHRhcmdldHMuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG5vIENEUCBlbmRwb2ludCBpcyBjb25maWd1cmVkIHlldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFnZVRhcmdldHMoKTogUHJvbWlzZTxDZHBUYXJnZXRbXT4ge1xuICAgIGlmICghdGhpcy5jZHBVcmwpIHtcbiAgICAgIC8vIEFuIG93bmVkIGluc3RhbmNlIHBpY2tzIGl0cyBwb3J0IGF0IGxhdW5jaCwgc28gYmVmb3JlIGByZWdpc3RlclZhdWx0YCB0aGVyZSBpcyBubyBlbmRwb2ludCBhbmRcbiAgICAgIC8vIGB0aGlzLmNkcFVybGAgaXMgc3RpbGwgZW1wdHkgLS0gd2hpY2ggdXNlZCB0byBtYWtlIHRoaXMgYSBgZmV0Y2goJy9qc29uJylgIGFuZCBmYWlsIHdpdGhcbiAgICAgIC8vIGBGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gL2pzb25gLCBhbiBlcnJvciBuYW1pbmcgbmVpdGhlciB0aGUgdHJhbnNwb3J0IG5vciB3aGF0IHdlbnQgd3JvbmcuXG4gICAgICAvLyBBIHRyYW5zcG9ydCBpbiB0aGlzIHN0YXRlIGlzIGFsd2F5cyBhIHN5bXB0b20gb2Ygc29tZXRoaW5nIHVwc3RyZWFtIChhIGZhaWxlZCBnbG9iYWwgc2V0dXAsIGFcbiAgICAgIC8vIFdvcmtlciB3aXRoIG5vIHJlZ2lzdGVyZWQgcmVzb2x2ZXJzIC0tIEw5KSwgc28gc2F5IHNvIHJhdGhlciB0aGFuIHJlcG9ydCBhIG1hbGZvcm1lZCBVUkwuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdObyBDRFAgZW5kcG9pbnQgY29uZmlndXJlZDogdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGhhcyBub3QgYmVlbiBsYXVuY2hlZCB5ZXQsIGFuZCBubyBgcG9ydGAgJ1xuICAgICAgICAgICsgJ3dhcyBnaXZlbiB0byBhdHRhY2ggdG8gYSBydW5uaW5nIG9uZS4gQSB0ZXN0IHdvcmtlciBpbiB0aGlzIHN0YXRlIHVzdWFsbHkgbWVhbnMgaXRzIGdsb2JhbCBzZXR1cCAnXG4gICAgICAgICAgKyAnZmFpbGVkLCBvciB0aGUgcHJvamVjdCBpcyBtaXNzaW5nIHRoZSBwZXItd29ya2VyIHNldHVwIGZpbGUgaW4gYHNldHVwRmlsZXNgLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmNkcFVybH0vanNvbmApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvKlxuICAgICAgICogQW4gdW5yZWFjaGFibGUgZW5kcG9pbnQgbWVhbnMgZGlmZmVyZW50IHRoaW5ncyBpbiB0aGUgdHdvIG1vZGVzLCBhbmRcbiAgICAgICAqIGNvbmZsYXRpbmcgdGhlbSBpcyB3aGF0IHByb2R1Y2VkIHRoZSBgRUNPTk5SRUZVU0VEYCBjYXNjYWRlcy4gVGhlXG4gICAgICAgKiBoYXJuZXNzIG93bnMgdGhpcyBwb3J0IGFuZCBub3RoaW5nIGVsc2UgbWF5IGhvbGQgaXQsIHNvIG5vdGhpbmdcbiAgICAgICAqIGFuc3dlcmluZyBtZWFucyBPVVIgaW5zdGFuY2UgaXMgZ29uZSBcdTIwMTQgc2F5IHRoYXQsIHdpdGggaXRzIGV4aXQgY29kZVxuICAgICAgICogd2hlbiBpdCBpcyBrbm93bi4gSW4gcGxhaW4gYXR0YWNoIG1vZGUgdGhlIGVuZHBvaW50IGJlbG9uZ3MgdG8gYVxuICAgICAgICogZm9yZWlnbiBPYnNpZGlhbiB0aGF0IGlzIHNpbXBseSBub3QgcnVubmluZywgd2hpY2ggYGVuc3VyZU9ic2lkaWFuUnVubmluZ2BcbiAgICAgICAqIGhhbmRsZXMgYnkgc3RhcnRpbmcgb25lOyB0aGF0IHBhdGggbXVzdCBrZWVwIHNlZWluZyB0aGUgcmF3IGZhaWx1cmUuXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLm93bmVkQ29uZmlnIHx8IHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgICAgICB0aHJvdyB0aGlzLmJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXTtcbiAgICByZXR1cm4gdGFyZ2V0cy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc29ja2V0J3MgaW4tZmxpZ2h0IGNvbW1hbmQgbWFwLCBpbnN0YWxsaW5nIGl0cyByZXBseSBkaXNwYXRjaGVyIG9uXG4gICAqIGZpcnN0IHVzZS5cbiAgICpcbiAgICogT05FIGBtZXNzYWdlYCBsaXN0ZW5lciBwZXIgc29ja2V0LCBmb3IgdGhlIHNvY2tldCdzIHdob2xlIGxpZmUgXHUyMDE0IG5vdCBvbmUgcGVyXG4gICAqIGNvbW1hbmQuIEEgbGlzdGVuZXIgcGVyIGluLWZsaWdodCBjb21tYW5kIG1ha2VzIHRoZSBjb3VudCBzY2FsZSB3aXRoIGhvdyBtYW55XG4gICAqIGV2YWx1YXRpb25zIGEgc3VpdGUgaGFzIGluIGZsaWdodCBhdCBvbmNlLCBzbyBhIGNvbnN1bWVyIHRoYXQgZmlyZXMgZWxldmVuXG4gICAqIGNvbmN1cnJlbnQgYGV2YWxJbk9ic2lkaWFuYCBjYWxscyBjcm9zc2VzIE5vZGUncyBkZWZhdWx0IGBtYXhMaXN0ZW5lcnNgIG9mIDEwXG4gICAqIGFuZCBpcyB0b2xkIGl0cyB0cmFuc3BvcnQgaXMgbGVha2luZyBtZW1vcnksIHdoaWNoIGl0IGlzIG5vdDogbWVhc3VyZWRcbiAgICogMjAyNi0wOS0xNSwgZmlmdGVlbiBjb25jdXJyZW50IGV2YWx1YXRpb25zIHJlZ2lzdGVyZWQgZmlmdGVlbiBsaXN0ZW5lcnMgb24gdGhlXG4gICAqIG9uZSBsb25nLWxpdmVkIHNvY2tldCBhbmQgdGhlIGNvdW50IGZlbGwgYmFjayB0byB6ZXJvIHRoZSBtb21lbnQgdGhleSBzZXR0bGVkLlxuICAgKiBBIHdhcm5pbmcgdGhhdCBmaXJlcyBvbiBjb3JyZWN0IHVzZSBpcyB3b3JzZSB0aGFuIG5vIHdhcm5pbmcsIGJlY2F1c2UgdGhlIHJlYWxcbiAgICogc2lnbmFsIFx1MjAxNCBhbiBlbnRyeSB0aGF0IGlzIGFkZGVkIGFuZCBuZXZlciByZW1vdmVkIFx1MjAxNCBpcyB0aGVuIGluZGlzdGluZ3Vpc2hhYmxlXG4gICAqIGZyb20gaXQuIFdpdGggb25lIGRpc3BhdGNoZXIgdGhlIGxpc3RlbmVyIGNvdW50IGlzIGEgY29uc3RhbnQsIGFuZCBhIGdlbnVpbmVcbiAgICogbGVhayBzaG93cyBpbnN0ZWFkIGFzIGEgcGVuZGluZyBtYXAgdGhhdCBuZXZlciBlbXB0aWVzLlxuICAgKlxuICAgKiBUaGUgZGlzcGF0Y2hlciBpcyBkZWxpYmVyYXRlbHkgZm9yZ2l2aW5nIGFib3V0IHdoYXQgYXJyaXZlczogYSBDRFAgKipldmVudCoqXG4gICAqIGNhcnJpZXMgbm8gYGlkYCBhbmQgYmVsb25ncyB0byBubyBjb21tYW5kLCBhbmQgYSBmcmFtZSB0aGF0IGlzIG5vdCBKU09OIGF0IGFsbFxuICAgKiBiZWxvbmdzIHRvIG5vdGhpbmcgdGhpcyB0cmFuc3BvcnQgc2VudC4gQm90aCBhcmUgaWdub3JlZC4gVGhlIG9sZCBwZXItY29tbWFuZFxuICAgKiBoYW5kbGVyIHBhcnNlZCB1bmd1YXJkZWQsIHNvIG9uZSBmcmFtZSB0aGF0IGlzIG5vdCBKU09OIHRocmV3IG9uY2UgcGVyXG4gICAqIGluLWZsaWdodCBjb21tYW5kLCBvdXQgb2YgdGhlIGV2ZW50IGRpc3BhdGNoLCB3aGVyZSBub3RoaW5nIGNvdWxkIGNhdGNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBUaGUgc29ja2V0IHdob3NlIHJlcGxpZXMgYXJlIGJlaW5nIGF3YWl0ZWQuXG4gICAqIEByZXR1cm5zIFRoZSBzb2NrZXQncyBtYXAgb2YgaW4tZmxpZ2h0IGNvbW1hbmRzLCBrZXllZCBieSBDRFAgbWVzc2FnZSBpZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGVuZGluZ0NvbW1hbmRzKHdzOiBXZWJTb2NrZXQpOiBNYXA8bnVtYmVyLCBQZW5kaW5nQ29tbWFuZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nUGVuZGluZ0NvbW1hbmRzID0gdGhpcy5wZW5kaW5nQ29tbWFuZHNCeVNvY2tldC5nZXQod3MpO1xuICAgIGlmIChleGlzdGluZ1BlbmRpbmdDb21tYW5kcykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUGVuZGluZ0NvbW1hbmRzO1xuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdDb21tYW5kcyA9IG5ldyBNYXA8bnVtYmVyLCBQZW5kaW5nQ29tbWFuZD4oKTtcbiAgICB0aGlzLnBlbmRpbmdDb21tYW5kc0J5U29ja2V0LnNldCh3cywgcGVuZGluZ0NvbW1hbmRzKTtcbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGxldCBtZXNzYWdlOiBDZHBSZXNwb25zZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKFN0cmluZyhldmVudC5kYXRhKSkgYXMgQ2RwUmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZW5kaW5nQ29tbWFuZCA9IHBlbmRpbmdDb21tYW5kcy5nZXQobWVzc2FnZS5pZCk7XG4gICAgICBpZiAoIXBlbmRpbmdDb21tYW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZ0NvbW1hbmRzLmRlbGV0ZShtZXNzYWdlLmlkKTtcbiAgICAgIHBlbmRpbmdDb21tYW5kKG1lc3NhZ2UpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBlbmRpbmdDb21tYW5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBLaWxscyB0aGUgY3VycmVudGx5LXJ1bm5pbmcgb3duZWQgaW5zdGFuY2UgKGlmIGFueSkgYW5kIHdhaXRzIGZvciBpdCB0byBleGl0LFxuICAgKiBzbyB0aGUgbmV4dCBsYXVuY2ggZ2V0cyBhIHByaXN0aW5lIHNpbmdsZS13aW5kb3cgaW5zdGFuY2UuXG4gICAqXG4gICAqIFJlbGF1bmNoaW5nIG92ZXIgYSBsaXZlIGluc3RhbmNlIGlzIGZvcndhcmRlZCBieSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBhbmQgc3VyZmFjZXMgdGhlIHZhdWx0IHBpY2tlciwgYW5kIG9wZW5pbmcgYVxuICAgKiBzZWNvbmQgd2luZG93IHZpYSBJUEMgbGVhdmVzIHN0YWxlIHdpbmRvd3MgdGhhdCBicmVhayB2YXVsdC10YXJnZXQgcm91dGluZyBcdTIwMTRcbiAgICogaGVuY2UgYSBmdWxsIGtpbGwgKyB3YWl0LWZvci1leGl0IChyZWxlYXNpbmcgdGhlIGxvY2spIGJldHdlZW4gbGF1bmNoZXMuIEFcbiAgICogbm8tb3Agb24gdGhlIGZpcnN0IGF0dGVtcHQsIHdoZW4gbm8gaW5zdGFuY2UgaXMgcnVubmluZyB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGtpbGxSdW5uaW5nT3duZWRJbnN0YW5jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBLaWxsaW5nIHJ1bm5pbmcgb3duZWQgaW5zdGFuY2UgYmVmb3JlIChyZSlsYXVuY2guJyk7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgY29uc3QgcHJldmlvdXNDZHBVcmwgPSB0aGlzLmNkcFVybDtcbiAgICB0aGlzLm93bmVkSW5zdGFuY2Uua2lsbCgpO1xuICAgIHRoaXMub3duZWRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JJbnN0YW5jZUV4aXQocHJldmlvdXNDZHBVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBvd25lZCBpbnN0YW5jZSdzIHdpbmRvdyBvZmYtc2NyZWVuIHNvIGEgaGlkZGVuIHJ1biBuZXZlciBzdGVhbHNcbiAgICogZm9jdXMuIFVzZXMgRWxlY3Ryb24ncyByZW1vdGUgYnJpZGdlIChgd2luZG93LmVsZWN0cm9uLnJlbW90ZWApIFx1MjAxNCB0aGUgb25seVxuICAgKiBjcm9zcy1wbGF0Zm9ybSB3YXkgdG8gcmVwb3NpdGlvbiB0aGUgd2luZG93IFx1MjAxNCBwbGFjaW5nIGl0IGp1c3QgYmV5b25kIHRoZVxuICAgKiByaWdodCBlZGdlIG9mIGFsbCBkaXNwbGF5cy4gVGhlIHdpbmRvdyBzdGF5cyBcInZpc2libGVcIiB0byBDaHJvbWl1bSAoc29cbiAgICogdGltZXJzLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGtlZXAgd29ya2luZyksXG4gICAqIHVubGlrZSBtaW5pbWl6aW5nLCB3aGljaCB3b3VsZCBmcmVlemUgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuXG4gICAqXG4gICAqIFRoZSByZW1vdGUgYnJpZGdlIGlzIG5vdCBhdmFpbGFibGUgdGhlIGluc3RhbnQgQ0RQIHN0YXJ0cyBzZXJ2aW5nLCBzbyB0aGlzXG4gICAqIHBvbGxzIHVudGlsIHRoZSBtb3ZlIHN1Y2NlZWRzLiBCZXN0LWVmZm9ydDogaWYgdGhlIHdpbmRvdyBjYW5ub3QgYmUgbW92ZWRcbiAgICogd2l0aGluIHRoZSB0aW1lb3V0LCB0aGUga2VlcC1hbGl2ZSBsYXVuY2ggZmxhZ3Mgc3RpbGwgYXBwbHkgYW5kIHRoZSBydW5cbiAgICogcHJvY2VlZHMgKHdvcnN0IGNhc2UgdGhlIHdpbmRvdyBpcyBicmllZmx5IHZpc2libGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgRWxlY3Ryb24gcmVtb3RlIGJyaWRnZSB0d28gd2F5cyBzbyBCT1RIIG1vZGVybiBhbmQgb2xkIE9ic2lkaWFuXG4gICAgLy8gQ2FuIGJlIG1vdmVkIG9mZi1zY3JlZW46IG1vZGVybiBpbmplY3RzIGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYDsgb2xkXG4gICAgLy8gVmVyc2lvbnMgKG5vIGB3aW5kb3cuZWxlY3Ryb25gKSBzdGlsbCBleHBvc2UgdGhlIGJ1aWx0LWluIGByZW1vdGVgIG1vZHVsZSB2aWFcbiAgICAvLyBgcmVxdWlyZSgnZWxlY3Ryb24nKWAgaW4gdGhlIG5vZGUtaW50ZWdyYXRlZCByZW5kZXJlciAocmVtb3ZlZCBmcm9tIEVsZWN0cm9uXG4gICAgLy8gMTQrLCBidXQgcHJlc2VudCBvbiB0aGUgRWxlY3Ryb24gOC0xMyBzaGVsbHMgb2xkIE9ic2lkaWFuIHNoaXBzKS4gUmV0dXJuaW5nXG4gICAgLy8gYG1vdmVkYCBvbiB0aGUgZmlyc3Qgc3VjY2VzcyBpcyBpbXBvcnRhbnQgb24gRWxlY3Ryb24gMTAtZXJhIGJ1aWxkczogcG9sbGluZ1xuICAgIC8vIE9uIHdpdGhvdXQgYSByZXNvbHZhYmxlIGJyaWRnZSBoYW1tZXJzIHRoZSByZW5kZXJlciB3aXRoIENEUCByb3VuZC10cmlwc1xuICAgIC8vIER1cmluZyBib290IGFuZCBpbnRlcm1pdHRlbnRseSBwcmV2ZW50cyB0aGUgd29ya3NwYWNlIGZyb20gaW5pdGlhbGl6aW5nLlxuICAgIGNvbnN0IG1vdmVFeHByZXNzaW9uID0gYCgoKSA9PiB7XG4gICAgICBsZXQgcmVtb3RlID0gKHdpbmRvdy5lbGVjdHJvbiAmJiB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlKSB8fCBudWxsO1xuICAgICAgaWYgKCFyZW1vdGUpIHtcbiAgICAgICAgdHJ5IHsgcmVtb3RlID0gcmVxdWlyZSgnZWxlY3Ryb24nKS5yZW1vdGUgfHwgbnVsbDsgfSBjYXRjaCAocmVxdWlyZUVycm9yKSB7IHJlbW90ZSA9IG51bGw7IH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVtb3RlIHx8IHR5cGVvZiByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cuYXBwID09PSAndW5kZWZpbmVkJykgPyAnbm90LXJlYWR5JyA6ICduby1icmlkZ2UnO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2luID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlzID0gcmVtb3RlLnNjcmVlbi5nZXRBbGxEaXNwbGF5cygpO1xuICAgICAgY29uc3QgbWF4UmlnaHQgPSBNYXRoLm1heCguLi5kaXNwbGF5cy5tYXAoKGRpc3BsYXkpID0+IGRpc3BsYXkuYm91bmRzLnggKyBkaXNwbGF5LmJvdW5kcy53aWR0aCkpO1xuICAgICAgd2luLnNldFBvc2l0aW9uKG1heFJpZ2h0ICsgJHtTdHJpbmcoT1dORURfV0lORE9XX09GRlNDUkVFTl9NQVJHSU5fSU5fUElYRUxTKX0sIDApO1xuICAgICAgcmV0dXJuICdtb3ZlZCc7XG4gICAgfSkoKWA7XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbW92ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBNb3ZlZCBvd25lZCBPYnNpZGlhbiB3aW5kb3cgb2ZmLXNjcmVlbiAoaGlkZGVuIG1vZGUpLicpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ0RQIGVuZHBvaW50IC8gdGFyZ2V0IC8gcmVtb3RlIGJyaWRnZSBub3QgcmVhZHkgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBtb3ZlIG93bmVkIHdpbmRvdyBvZmYtc2NyZWVuIHdpdGhpbiAke1N0cmluZyhPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMgKG5vbi1mYXRhbDsga2VlcC1hbGl2ZSBmbGFncyBzdGlsbCBhcHBsaWVkKS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGNvbmZpZy1mb2xkZXIgb3ZlcnJpZGUgaW50byB0aGUgc3RhcnRlciBzY3JlZW4ncyBgbG9jYWxTdG9yYWdlYFxuICAgKiBhbmQgdGhlbiBvcGVucyB0aGUgdmF1bHQgZnJvbSB0aGVyZSBvdmVyIHRoZSBgdmF1bHQtb3BlbmAgSVBDLlxuICAgKlxuICAgKiBPYnNpZGlhbiByZWFkcyB0aGUgb3ZlcnJpZGUgZXhhY3RseSBvbmNlLCBpbiB0aGUgdmF1bHQncyBvd24gcmVuZGVyZXIsIGR1cmluZ1xuICAgKiBgVmF1bHQuc2V0dXBgIFx1MjAxNCBgZ2V0T3ZlcnJpZGVDb25maWdEaXIoYXBwSWQpYCBpcyBgbG9jYWxTdG9yYWdlLmdldEl0ZW0oYXBwSWQgK1xuICAgKiAnLWNvbmZpZycpYC4gU28gdGhlcmUgaXMgbm8gd3JpdGluZyBpdCBpbnRvIHRoZSB2YXVsdCdzIHdpbmRvdzogYnkgdGhlIHRpbWVcbiAgICogdGhhdCB3aW5kb3cgZXhpc3RzIHRoZSByZWFkIGhhcyBoYXBwZW5lZC4gVGhlIHN0YXJ0ZXIgc2NyZWVuIGlzIHRoZSBlYXJsaWVyXG4gICAqIHJlbmRlcmVyIHRoZSB3cml0ZSBuZWVkcywgYW5kIGl0IHF1YWxpZmllcyBiZWNhdXNlIGl0IGhhcyBgbG9jYWxTdG9yYWdlYCBhbmRcbiAgICogYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlcmAgYnV0IG5vIGBhcHBgICh2ZXJpZmllZCBvbiAxLjEzLjcpLlxuICAgKlxuICAgKiBUaGF0IG1pc3NpbmcgYGFwcGAgaXMgYWxzbyB3aHkgdGhpcyB0YWxrcyByYXcgQ0RQIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAgICoge0BsaW5rIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZH0gLyB0aGUgYGlwY1NlbmRTeW5jYCBoZWxwZXIgYXNcbiAgICoge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnQub3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2V9IGRvZXM6IGV2ZXJ5IG9uZSBvZlxuICAgKiB0aG9zZSBwYXRocyBwcm9iZXMgYGFwcC52YXVsdC5hZGFwdGVyYCB0byBpZGVudGlmeSBpdHMgdGFyZ2V0LCBhbmQgd291bGQgZmFpbFxuICAgKiBvbiB0aGUgdmVyeSByZW5kZXJlciB0aGlzIG5lZWRzLlxuICAgKlxuICAgKiBUaGUga2V5IG5hbWUgaXMga25vd24gYWhlYWQgb2YgdGhlIHdyaXRlIGJlY2F1c2UgdGhlIGhhcm5lc3MgcmVnaXN0ZXJlZCB0aGVcbiAgICogdmF1bHQgdW5kZXIgYW4gaWQgaXQgZ2VuZXJhdGVkIGl0c2VsZiwgYW5kIGB2YXVsdC1vcGVuYCByZXVzZXMgdGhhdCBlbnRyeVxuICAgKiByYXRoZXIgdGhhbiBtaW50aW5nIGEgbmV3IG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSB2YXVsdElkIC0gVGhlIGhhcm5lc3MtZ2VuZXJhdGVkIHZhdWx0IGlkIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkIHVuZGVyLlxuICAgKiBAcGFyYW0gY29uZmlnRGlyZWN0b3J5IC0gVGhlIGNvbmZpZyBmb2xkZXIgdG8gb3ZlcnJpZGUgdG8uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG9wZW5WYXVsdEZyb21TdGFydGVyU2NyZWVuKHZhdWx0UGF0aDogc3RyaW5nLCB2YXVsdElkOiBzdHJpbmcsIGNvbmZpZ0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gU2VlZGluZyBjb25maWcgZm9sZGVyIG92ZXJyaWRlICR7Y29uZmlnRGlyZWN0b3J5fSBvbiB0aGUgc3RhcnRlciBzY3JlZW4uLi5gKTtcbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLndhaXRGb3JTdGFydGVyU2NyZWVuVGFyZ2V0KCk7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgZXhwcmVzc2lvbjogYGxvY2FsU3RvcmFnZS5zZXRJdGVtKCR7SlNPTi5zdHJpbmdpZnkoYCR7dmF1bHRJZH0tY29uZmlnYCl9LCAke0pTT04uc3RyaW5naWZ5KGNvbmZpZ0RpcmVjdG9yeSl9KTtgLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBleHByZXNzaW9uOiBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2AsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gU2V0ICR7dmF1bHRJZH0tY29uZmlnIGFuZCBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH0gaW4gbG9jYWxTdG9yYWdlLmApO1xuXG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgZXhwcmVzc2lvbjogYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsICR7SlNPTi5zdHJpbmdpZnkodmF1bHRQYXRoKX0sIGZhbHNlKWAsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gU2VudCB2YXVsdC1vcGVuIGZvciAke3ZhdWx0UGF0aH0gZnJvbSB0aGUgc3RhcnRlciBzY3JlZW4uYCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHdzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgdmF1bHQgaW4gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSB0aGUgYHZhdWx0LW9wZW5gXG4gICAqIEVsZWN0cm9uIElQQyAoZXZhbHVhdGVkIHRocm91Z2ggQ0RQIG9uIGFuIGV4aXN0aW5nIHRhcmdldCksIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIG5ldyB2YXVsdCdzIHdpbmRvdyB0YXJnZXQgYXBwZWFycywgaXMgbGF5b3V0LXJlYWR5LCBhbmQgaXRzIHRydXN0IGRpYWxvZ1xuICAgKiAoaWYgYW55KSBoYXMgYmVlbiBkaXNtaXNzZWQuXG4gICAqXG4gICAqIFNoYXJlZCBieSB0aGUgYXR0YWNoLW1vZGUge0BsaW5rIHJlZ2lzdGVyVmF1bHR9IGFuZCB0aGUgb3duZWQtbW9kZVxuICAgKiBcImluc3RhbmNlIGFscmVhZHkgbGF1bmNoZWRcIiBwYXRoLCBzbyBvcGVuaW5nIGFuIGFkZGl0aW9uYWwgdmF1bHQgbmV2ZXJcbiAgICogcmVsYXVuY2hlcyB0aGUgcHJvY2VzcyAod2hpY2ggd291bGQgc3VyZmFjZSB0aGUgdmF1bHQgcGlja2VyKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9ic2lkaWFuIENEUCB0YXJnZXRzIGF2YWlsYWJsZS4gSXMgT2JzaWRpYW4gcnVubmluZz8nKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgYHZhdWx0LW9wZW5gIElQQyBpcyBzZW50IHRocm91Z2ggYW4gRVhJU1RJTkcgd2luZG93IChgdGFyZ2V0c1swXWApLCBzbyB0aGVcbiAgICAvLyBIZWxwZXIgbmFtZXNwYWNlIG11c3QgYmUgYm9vdHN0cmFwcGVkIG9uIFRIQVQgd2luZG93IFx1MjAxNCBub3Qgb24gYHZhdWx0UGF0aGAsIHdob3NlXG4gICAgLy8gV2luZG93IGRvZXMgbm90IGV4aXN0IHlldC4gQm9vdHN0cmFwcGluZyBhZ2FpbnN0IGB2YXVsdFBhdGhgIGhlcmUgd291bGQgcm91dGVcbiAgICAvLyBUaHJvdWdoIGBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKWAgd2l0aCBvbmx5IHRoZSBleGlzdGluZyB3aW5kb3cgcHJlc2VudCBhbmRcbiAgICAvLyBQb2lzb24gdGhlIGNvbm5lY3Rpb24gY2FjaGUgKGxhYmVsIGB2YXVsdFBhdGhgLCBzb2NrZXQgXHUyMTkyIHRoZSBleGlzdGluZyB3aW5kb3cpLCBzb1xuICAgIC8vIEV2ZXJ5IGxhdGVyIGV2YWwgZm9yIGB2YXVsdFBhdGhgIHdvdWxkIG1pcy1yb3V0ZSB0byB0aGUgZXhpc3Rpbmcgd2luZG93LiBQcm9iZSB0aGVcbiAgICAvLyBFeGlzdGluZyB3aW5kb3cncyBvd24gYmFzZSBwYXRoIGFuZCBib290c3RyYXAgYWdhaW5zdCB0aGF0IGluc3RlYWQuXG4gICAgY29uc3QgZXhpc3RpbmdUYXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgoZXhpc3RpbmdUYXJnZXQpO1xuICAgIGNvbnN0IGlwY1dzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQoZXhpc3RpbmdUYXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdFBhdGgpO1xuICAgICAgY29uc3QgaXBjRXhwcmVzc2lvbiA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbDogJ3ZhdWx0LW9wZW4nLCBjaGFubmVsQXJndW1lbnRzOiBbdmF1bHRQYXRoLCBmYWxzZV0gfSl9KWA7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKGlwY1dzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICBleHByZXNzaW9uOiBpcGNFeHByZXNzaW9uLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UoaXBjV3MsIHZhdWx0UGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlwY1dzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgdmF1bHQgdGFyZ2V0ICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gVmF1bHQgdGFyZ2V0IGZvdW5kLicpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgdGFyZ2V0IG5vdCByZWFkeSB5ZXQuXG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbXBsZXMgdGhlIHZhdWx0IHJlbmRlcmVyJ3MgYm9vdHN0cmFwIHN0YXRlIFx1MjAxNCB3aGV0aGVyIHRoZSBkb2N1bWVudCBpc1xuICAgKiBgY29tcGxldGVgLCB3aGV0aGVyIGB3aW5kb3cuYXBwYCBleGlzdHMsIGFuZCB0aGUgYDxib2R5PmAgY2hpbGQgY291bnQgXHUyMDE0IGZyb21cbiAgICogdGhlIGZpcnN0IHBhZ2UgdGFyZ2V0LCBmb3IgZGVhZC1ib290IGRldGVjdGlvbi4gVGhpcyB3b3JrcyBldmVuIHdoZW4gdGhlIGFwcFxuICAgKiBuZXZlciBib290c3RyYXBwZWQgKHRoZSByZW5kZXJlciBwYWdlIHRhcmdldCBzdGlsbCBleGlzdHMpLCB3aGljaCBpcyBleGFjdGx5XG4gICAqIHRoZSBzdGF0ZSBpdCBtdXN0IG9ic2VydmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzYW1wbGVkIG9ic2VydmF0aW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIHRhcmdldCBpcyByZWFjaGFibGVcbiAgICogICBvciB0aGUgcHJvYmUgZmFpbGVkIChzbyB0aGUgY2FsbGVyIGtlZXBzIHBvbGxpbmcgcmF0aGVyIHRoYW4gZmFzdC1mYWlsaW5nKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVSZW5kZXJlckJvb3RTdGF0ZSgpOiBQcm9taXNlPFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvYmVFeHByZXNzaW9uID0gYEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBib2R5Q2hpbGRFbGVtZW50Q291bnQ6IGRvY3VtZW50LmJvZHkgPyBkb2N1bWVudC5ib2R5LmNoaWxkRWxlbWVudENvdW50IDogMCxcbiAgICAgICAgICBoYXNXaW5kb3dBcHA6IHR5cGVvZiB3aW5kb3cuYXBwICE9PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICBpc0RvY3VtZW50Q29tcGxldGU6IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZSdcbiAgICAgICAgfSlgO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGV4cHJlc3Npb246IHByb2JlRXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyBSZW5kZXJlckJvb3RPYnNlcnZhdGlvbjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgYSB0YXJnZXQgdG8gZGlzY292ZXIgd2hpY2ggdmF1bHQgcGF0aCBpdCBoYXMgb3Blbi5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBXZWJTb2NrZXQgY29ubmVjdGlvbiwgZXZhbHVhdGVzIGBnZXRCYXNlUGF0aCgpYCxcbiAgICogYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBDRFAgdGFyZ2V0IHRvIHByb2JlLlxuICAgKiBAcmV0dXJucyBUaGUgdmF1bHQncyBiYXNlIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlVmF1bHRQYXRoKHRhcmdldDogQ2RwVGFyZ2V0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgICAgLy8gRXhwb3NlIHRoZSBgYmFzZVBhdGhgIHByb3BlcnR5OyB0aGUgbWV0aG9kIGV4aXN0cyBmcm9tIH4wLjkuMjAgb253YXJkLlxuICAgICAgICBleHByZXNzaW9uOiAnYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpIDogYXBwLnZhdWx0LmFkYXB0ZXIuYmFzZVBhdGgnLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBTdHJpbmcocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd3MuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgYW5kIGNvbm5lY3RzIHRvIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIGFcbiAgICogdmF1bHQ6IHByb3Zpc2lvbnMgdGhlIGFzYXIgKGlmIGFueSksIHByZS1zZWVkcyB0aGUgaXNvbGF0ZWQgYG9ic2lkaWFuLmpzb25gXG4gICAqIHNvIHRoZSB2YXVsdCBvcGVucyBkaXJlY3RseSwgbGF1bmNoZXMgdGhlIGluc3RhbmNlIG9uIGEgZnJlZSBDRFAgcG9ydCwgdGhlblxuICAgKiB3YWl0cyB1bnRpbCB0aGUgdmF1bHQgd2luZG93IGlzIHJlYWR5IGFuZCBkaXNtaXNzZXMgdGhlIHRydXN0IGRpYWxvZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLm93bmVkQ29uZmlnKTtcblxuICAgIG1rZGlyU3luYyhjb25maWcudXNlckRhdGFEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGlmIChjb25maWcuYXNhcikge1xuICAgICAgY29weUFzYXJJbnRvVXNlckRhdGEoY29uZmlnLmFzYXIucGF0aCwgY29uZmlnLmFzYXIudmVyc2lvbiwgY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5KTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXVsdElkID0gcmFuZG9tQnl0ZXMoVkFVTFRfSURfQllURV9MRU5HVEgpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIEEgY29uZmlnLWZvbGRlciBvdmVycmlkZSBpcyBhIGBsb2NhbFN0b3JhZ2VgIGVudHJ5LCBhbmQgYGxvY2FsU3RvcmFnZWAgbmVlZHMgYVxuICAgIC8vIFJlbmRlcmVyLCBzbyB0aGUgdmF1bHQgbXVzdCBOT1QgYXV0by1vcGVuOiB0aGUgaW5zdGFuY2UgYm9vdHMgdG8gdGhlIHN0YXJ0ZXJcbiAgICAvLyBTY3JlZW4sIHRoZSBvdmVycmlkZSBpcyB3cml0dGVuIHRoZXJlLCBhbmQgdGhlIHZhdWx0IGlzIG9wZW5lZCBmcm9tIGl0IG92ZXJcbiAgICAvLyBJUEMuIE9ic2lkaWFuIHJldXNlcyB0aGUgcHJlLXJlZ2lzdGVyZWQgaWQgZm9yIHRoYXQgb3BlbiAodmVyaWZpZWQgb24gMS4xMy43KSxcbiAgICAvLyBXaGljaCBpcyB3aGF0IG1ha2VzIHRoZSBgPHZhdWx0SWQ+LWNvbmZpZ2Aga2V5IG5hbWUga25vd2FibGUgYmVmb3JlIGxhdW5jaC5cbiAgICBjb25zdCBzaG91bGRBdXRvT3BlblZhdWx0ID0gdGhpcy5jb25maWdEaXJlY3RvcnkgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIFJlbGF1bmNoLXJldHJ5OiBzb21lIG9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiBidWlsZHMgaW50ZXJtaXR0ZW50bHlcbiAgICAvLyBCb290IHdpdGggYHdpbmRvdy5hcHBgIHByZXNlbnQgYnV0IHRoZSB3b3Jrc3BhY2UgbmV2ZXIgaW5pdGlhbGl6aW5nLCBzbyB0aGVcbiAgICAvLyBWYXVsdCBuZXZlciBiZWNvbWVzIHJlYWR5LiBBIGZyZXNoIGluc3RhbmNlIGlzIGFuIGluZGVwZW5kZW50IGNoYW5jZS4gQVxuICAgIC8vIERldGVybWluaXN0aWMgZmFpbHVyZSAoZGVhZCBib290LCBzaWxlbnQgYXNhciBmYWxsYmFjaykgaXMgcmUtdGhyb3duIGF0IG9uY2UgXHUyMDE0XG4gICAgLy8gUmV0cnlpbmcgaXQgb25seSB3YXN0ZXMgdGhlIHJlYWRpbmVzcyB0aW1lb3V0LlxuICAgIGxldCBsYXN0RXJyb3I6IHVua25vd247XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gT1dORURfTEFVTkNIX01BWF9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICBhd2FpdCB0aGlzLmtpbGxSdW5uaW5nT3duZWRJbnN0YW5jZSgpO1xuICAgICAgaWYgKGF0dGVtcHQgPiAxKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KE9XTkVEX1JFTEFVTkNIX1NFVFRMRV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS1zZWVkZWQgZXZlcnkgYXR0ZW1wdCByYXRoZXIgdGhhbiBvbmNlIGJlZm9yZSB0aGUgbG9vcDogT2JzaWRpYW4gcmV3cml0ZXNcbiAgICAgIC8vIGBvYnNpZGlhbi5qc29uYCBhcyBpdCBvcGVucyBhIHZhdWx0IChpdCBzdGFtcHMgdGhlIGVudHJ5IGBvcGVuOiB0cnVlYCksIHNvIGFcbiAgICAgIC8vIFJlbGF1bmNoIHRoYXQgaW5oZXJpdGVkIHRoZSBwcmV2aW91cyBhdHRlbXB0J3MgZmlsZSB3b3VsZCBzYWlsIHBhc3QgdGhlXG4gICAgICAvLyBTdGFydGVyIHNjcmVlbiB0aGUgb3ZlcnJpZGUgbmVlZHMuXG4gICAgICBjb25zdCBvYnNpZGlhbkpzb24gPSBidWlsZE93bmVkT2JzaWRpYW5Kc29uKHsgc2hvdWxkQXV0b09wZW5WYXVsdCwgdHM6IERhdGUubm93KCksIHZhdWx0SWQsIHZhdWx0UGF0aCB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihjb25maWcudXNlckRhdGFEaXJlY3RvcnksICdvYnNpZGlhbi5qc29uJyksIEpTT04uc3RyaW5naWZ5KG9ic2lkaWFuSnNvbikpO1xuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGxhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZSh7XG4gICAgICAgIGNkcEhvc3Q6IHRoaXMuY2RwSG9zdCxcbiAgICAgICAgZXhlUGF0aDogY29uZmlnLmV4ZVBhdGgsXG4gICAgICAgIGV4dHJhQXJndW1lbnRzOiBbXG4gICAgICAgICAgLi4ucmVzb2x2ZU93bmVkSGlkZGVuTGF1bmNoQXJndW1lbnRzKHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUpLFxuICAgICAgICAgIC4uLnJlc29sdmVTYW5kYm94TGF1bmNoQXJndW1lbnRzKHRoaXMuc2hvdWxkRGlzYWJsZVNhbmRib3gpXG4gICAgICAgIF0sXG5cbiAgICAgICAgdXNlckRhdGFEaXJlY3Rvcnk6IGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeVxuICAgICAgfSk7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgIHRoaXMuY2RwUG9ydCA9IGluc3RhbmNlLnBvcnQ7XG4gICAgICB0aGlzLmNkcFVybCA9IGluc3RhbmNlLmNkcFVybDtcblxuICAgICAgaWYgKHNob3VsZEhpZGVPYnNpZGlhbkFwcCh0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdmVPd25lZFdpbmRvd09mZnNjcmVlbigpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXNob3VsZEF1dG9PcGVuVmF1bHQpIHtcbiAgICAgICAgICAvLyBgc2hvdWxkQXV0b09wZW5WYXVsdGAgaXMgYSBgY29uc3RgIGRlcml2ZWQgZnJvbSBgdGhpcy5jb25maWdEaXJlY3RvcnkgPT09IHVuZGVmaW5lZGAsXG4gICAgICAgICAgLy8gU28gVHlwZVNjcmlwdCBuYXJyb3dzIHRoZSBmaWVsZCB0byBgc3RyaW5nYCBpbiB0aGlzIGJyYW5jaCBvbiBpdHMgb3duLlxuICAgICAgICAgIGF3YWl0IHRoaXMub3BlblZhdWx0RnJvbVN0YXJ0ZXJTY3JlZW4odmF1bHRQYXRoLCB2YXVsdElkLCB0aGlzLmNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0UmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXJtUGFyZW50TGl2ZW5lc3NXYXRjaGRvZyh2YXVsdFBhdGgsIGluc3RhbmNlLnBhcmVudExpdmVuZXNzUG9ydCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIC8vIEEgY29uZmlnLWZvbGRlciBmYWxsYmFjayBpcyBkZXRlcm1pbmlzdGljIFx1MjAxNCB0aGUgbmFtZSBpcyBlaXRoZXIgb25lIE9ic2lkaWFuXG4gICAgICAgIC8vIEFjY2VwdHMgb3IgaXQgaXMgbm90IFx1MjAxNCBzbyByZWxhdW5jaGluZyBvbmx5IGJ1cm5zIGFub3RoZXIgYm9vdC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvclxuICAgICAgICAgIHx8IGVycm9yIGluc3RhbmNlb2YgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JcbiAgICAgICAgICB8fCBlcnJvciBpbnN0YW5jZW9mIENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IG5vdCByZWFkeSAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcoT1dORURfTEFVTkNIX01BWF9BVFRFTVBUUyl9KTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBsYXN0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGxhc3RFcnJvciA6IG5ldyBFcnJvcihgT3duZWQgdmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5YCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBDRFAgY29tbWFuZCBvdmVyIFdlYlNvY2tldCBhbmQgd2FpdHMgZm9yIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gVGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBDRFAgcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRDb21tYW5kKHdzOiBXZWJTb2NrZXQsIG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxDZHBSZXNwb25zZT4ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLm1lc3NhZ2VJZDtcbiAgICBjb25zdCBwZW5kaW5nQ29tbWFuZHMgPSB0aGlzLmdldFBlbmRpbmdDb21tYW5kcyh3cyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Q2RwUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcGVuZGluZ0NvbW1hbmRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgQ2RwQ29tbWFuZFRpbWVvdXRFcnJvcih7IG1ldGhvZCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSkpO1xuICAgICAgfSwgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgcGVuZGluZ0NvbW1hbmRzLnNldChpZCwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBOb3RoaW5nIHdpbGwgYW5zd2VyIGEgc2VuZCB0aGF0IHRocmV3LCBzbyBob2xkaW5nIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bGwgY29tbWFuZCB0aW1lb3V0IHdvdWxkIG9ubHkgZGVsYXkgdGhlIGZhaWx1cmUgYW5kIHRoZW4gbWlzbmFtZSBpdC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBwZW5kaW5nQ29tbWFuZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgYSBraWxsZWQgb3duZWQgaW5zdGFuY2UncyBDRFAgZW5kcG9pbnQgdW50aWwgaXQgc3RvcHMgcmVzcG9uZGluZyxcbiAgICogY29uZmlybWluZyB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBiZWZvcmUgYSBmcmVzaCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBpbnRvIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY2RwVXJsIC0gVGhlIENEUCBVUkwgb2YgdGhlIGluc3RhbmNlIHRoYXQgd2FzIGp1c3Qga2lsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9ySW5zdGFuY2VFeGl0KGNkcFVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgcHJldmlvdXMgb3duZWQgaW5zdGFuY2UgYXQgJHtjZHBVcmx9IHRvIGV4aXQuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBlbmRwb2ludCBpcyBnb25lOiB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCB0aGUgbG9jay5cbiAgICAgICAgYXdhaXQgZGVsYXkoSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBQcmV2aW91cyBpbnN0YW5jZSBzdGlsbCByZXNwb25kZWQgYmVmb3JlIHRpbWVvdXQ7IHJlbGF1bmNoaW5nIGFueXdheS4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHZhdWx0J3MgYGFwcC53b3Jrc3BhY2VgIHRvIHJlYWNoIGxheW91dC1yZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogYGZpbmRUYXJnZXRGb3JWYXVsdGAgcmV0dXJucyBhcyBzb29uIGFzIGBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpYFxuICAgKiBtYXRjaGVzIFx1MjAxNCB3aGljaCBpcyB0cnVlIHNob3J0bHkgYWZ0ZXIgdGhlIGBBcHBgIGNvbnN0cnVjdG9yIHJ1bnMsIGJlZm9yZVxuICAgKiBgcGx1Z2lucy5pbml0aWFsaXplKClgIChhbmQgYW55IHRydXN0IGRpYWxvZykgaGFzIGV4ZWN1dGVkLiBCb290c3RyYXBwaW5nXG4gICAqIHRoZSBuYW1lc3BhY2UgYW5kIGNhbGxpbmcgYHBvbGxWYXVsdEJhc2VQYXRoKClgIGF3YWl0cyBgbGF5b3V0UmVhZHlgLCBzb1xuICAgKiBieSB0aGUgdGltZSB0aGlzIHJldHVybnMgdGhlIGRpYWxvZyBoYXMgZWl0aGVyIHJlbmRlcmVkIG9yIGlzIG5vdCBnb2luZ1xuICAgKiB0byByZW5kZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZSgnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcucG9sbFZhdWx0QmFzZVBhdGgoKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIG93bmVkIGluc3RhbmNlIHVudGlsIHRoZSB2YXVsdCB0YXJnZXQgZXhpc3RzLCBsYXlvdXQgaXMgcmVhZHksIGFuZFxuICAgKiB0aGUgdHJ1c3QgZGlhbG9nIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogQmV0d2VlbiByZWFkaW5lc3MgYXR0ZW1wdHMgaXQgYWxzbyBjaGVja3MgZm9yIGEgKipkZWFkIGJvb3QqKiBcdTIwMTQgdGhlIHJlbmRlcmVyXG4gICAqIGxvYWRlZCAoYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkgYnV0IHRoZSBhcHAgbmV2ZXIgYm9vdHN0cmFwcGVkXG4gICAqIChlbXB0eSBgPGJvZHk+YCwgbm8gYHdpbmRvdy5hcHBgKSwgdGhlIHRlcm1pbmFsIHN0YXRlIHdoZW4gdGhlIGFzYXIgY2Fubm90XG4gICAqIHJ1biBvbiB0aGUgbGF1bmNoZWQgRWxlY3Ryb24gc2hlbGwuIE9uY2UgdGhhdCBzdGF0ZSBoYXMgaGVsZCBmb3IgdGhlXG4gICAqIGNvbmZpZ3VyZWQgZ3JhY2Ugd2luZG93IGl0IHRocm93cyBhIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzcyB0aW1lb3V0LiBBIGdyYWNlIG9mXG4gICAqIGAwYCBkaXNhYmxlcyB0aGUgZmFzdC1mYWlsLiBUaGUgZ3JhY2UgY2xvY2sgc3RhcnRzIHdoZW4gdGhlIHJlbmRlcmVyIGZpcnN0XG4gICAqIHJlcG9ydHMgYGNvbXBsZXRlYCwgc28gYSBzbG93IGxvYWQgYmVmb3JlIHRoZW4gaXMgbmV2ZXIgY291bnRlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIG93bmVkIHZhdWx0IHRvIGJlY29tZSByZWFkeSAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBkb2N1bWVudENvbXBsZXRlU2luY2U6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICAgIGxldCBpc1JlYWR5ID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgaXNSZWFkeSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSB2YXVsdCBpcyBub3QgcmVhZHkgeWV0IFx1MjAxNCBhbHNvIGRyb3AgdGhlIGNhY2hlZCBDRFAgY29ubmVjdGlvbiBiZWZvcmVcbiAgICAgICAgLy8gUmV0cnlpbmcuIE9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiByZWxvYWRzIHRoZSBvd25lZCB3aW5kb3cgZHVyaW5nXG4gICAgICAgIC8vIEJvb3QsIHdoaWNoIGNhbiBsZWF2ZSB0aGUgY2FjaGVkIFdlYlNvY2tldCBwaW5uZWQgdG8gYSBzdGFsZSBleGVjdXRpb25cbiAgICAgICAgLy8gQ29udGV4dDsgcmVjb25uZWN0aW5nIGVhY2ggYXR0ZW1wdCByZS1iaW5kcyB0byB0aGUgbGl2ZSBjb250ZXh0LlxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBjb25zdCBvYnNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucHJvYmVSZW5kZXJlckJvb3RTdGF0ZSgpO1xuICAgICAgICBpZiAob2JzZXJ2YXRpb24pIHtcbiAgICAgICAgICBpZiAob2JzZXJ2YXRpb24uaXNEb2N1bWVudENvbXBsZXRlICYmIGRvY3VtZW50Q29tcGxldGVTaW5jZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaGFzR3JhY2VFbGFwc2VkID0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlICE9PSBudWxsXG4gICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlID49IHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgIGlmIChyZXNvbHZlUmVuZGVyZXJCb290U3RhdGUoeyAuLi5vYnNlcnZhdGlvbiwgaGFzR3JhY2VFbGFwc2VkIH0pID09PSAnZGVhZCcpIHtcbiAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHJlbmRlcmVyIGZhaWxlZCB0byBpbml0aWFsaXplIChkZWFkIGJvb3QpOyBmYWlsaW5nIGZhc3QuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcih2YXVsdFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmF1bHQgaXMgcmVhZHkuIFJ1biB0aGUgcG9zdC1ib290IGNvbXBhdGliaWxpdHkgY2hlY2tzIGhlcmUgXHUyMDE0IE9VVFNJREUgdGhlXG4gICAgLy8gUG9sbCdzIHRyeS9jYXRjaCBcdTIwMTQgc28gYSBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciBmYWlscyBmYXN0IGluc3RlYWQgb2YgYmVpbmdcbiAgICAvLyBTd2FsbG93ZWQgYXMgXCJub3QgcmVhZHkgeWV0XCIgYW5kIGxvb3BpbmcgdW50aWwgdGhlIHJlYWRpbmVzcyB0aW1lb3V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGgpO1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IGlzIHJlYWR5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBzdGFydGVyIHNjcmVlbidzIHJlbmRlcmVyIGNhbiBhY2NlcHQgdGhlIGNvbmZpZy1mb2xkZXJcbiAgICogb3ZlcnJpZGUgXHUyMDE0IHRoYXQgaXMsIHVudGlsIGl0IGV4cG9zZXMgYm90aCBgbG9jYWxTdG9yYWdlYCBhbmRcbiAgICogYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luY2AuXG4gICAqXG4gICAqIEEgcGFnZSB0YXJnZXQgZXhpc3RzIGFzIHNvb24gYXMgdGhlIGxhdW5jaCByZXNvbHZlcywgc28gdGhpcyBpcyBub3Qgd2FpdGluZ1xuICAgKiBmb3IgYSB3aW5kb3c7IGl0IGlzIHdhaXRpbmcgZm9yIHRoYXQgd2luZG93J3Mgb3duIHNjcmlwdHMgdG8gZmluaXNoLiBXcml0aW5nXG4gICAqIGJlZm9yZSB0aGVuIHdvdWxkIGVpdGhlciB0aHJvdyBvciwgd29yc2UsIGxhbmQgaW4gYSByZW5kZXJlciB0aGF0IGlzIGFib3V0IHRvXG4gICAqIGJlIHJlcGxhY2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc3RhcnRlciBzY3JlZW4ncyBDRFAgdGFyZ2V0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyByZW5kZXJlciBiZWNvbWVzIHdyaXRhYmxlIHdpdGhpbiB0aGUgdGltZW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXJ0ZXJTY3JlZW5UYXJnZXQoKTogUHJvbWlzZTxDZHBUYXJnZXQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBTVEFSVEVSX1NDUkVFTl9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAndHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhISh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyICYmIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyknLFxuICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBUaGUgcmVuZGVyZXIgaXMgbm90IGV2YWx1YXRpbmcgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoU1RBUlRFUl9TQ1JFRU5fUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgc3RhcnRlciBzY3JlZW4gZGlkIG5vdCBleHBvc2UgbG9jYWxTdG9yYWdlIGFuZCB0aGUgRWxlY3Ryb24gSVBDIGJyaWRnZSB3aXRoaW4gJHtTdHJpbmcoU1RBUlRFUl9TQ1JFRU5fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBgXG4gICAgICAgICsgJ3NvIHRoZSBjb25maWcgZm9sZGVyIG92ZXJyaWRlIGNvdWxkIG5vdCBiZSB3cml0dGVuLidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgdGhlIHJlbW92YWwgdGhyZXcgKGUuZy4gaGFuZGxlcyBoZWxkKS5cbiAqL1xuZnVuY3Rpb24gZGlkUmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcm1TeW5jKGRpcmVjdG9yeSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcgZW5hYmxlZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gIGNvbnN0IGZsYWcgPSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnQ9JHtTdHJpbmcocG9ydCl9YDtcblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9YDtcbiAgfVxuXG4gIHJldHVybiBgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfSAmYDtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXFCQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBYXBCLFNBQVMsMkJBQTJCO0FBQ3BDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsNEJBQTRCO0FBQ3JD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
|