@mnaoumov/typescript-dev-toolkit 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/docs-site/api-doc-documented-files.cjs +51 -0
- package/dist/lib/cjs/docs-site/api-doc-documented-files.d.cts +31 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +3 -2
- package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +2 -1
- package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +4 -7
- package/dist/lib/cjs/docs-site/index.cjs +4 -1
- package/dist/lib/cjs/docs-site/index.d.cts +1 -0
- package/dist/lib/cjs/exec.cjs +18 -14
- package/dist/lib/cjs/exec.d.cts +31 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +59 -29
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -1
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +4 -1
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.cjs +170 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-logical-operator-over-ternary.d.cts +30 -0
- package/dist/lib/cjs/nano-staged-config.cjs +42 -3
- package/dist/lib/cjs/nano-staged-config.d.cts +24 -4
- package/dist/lib/esm/docs-site/api-doc-documented-files.d.mts +31 -0
- package/dist/lib/esm/docs-site/api-doc-documented-files.mjs +25 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +2 -1
- package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +3 -2
- package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +7 -7
- package/dist/lib/esm/docs-site/index.d.mts +1 -0
- package/dist/lib/esm/docs-site/index.mjs +3 -1
- package/dist/lib/esm/exec.d.mts +31 -0
- package/dist/lib/esm/exec.mjs +15 -13
- package/dist/lib/esm/linters/eslint-config.mjs +59 -29
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -1
- package/dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.d.mts +30 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-logical-operator-over-ternary.mjs +134 -0
- package/dist/lib/esm/nano-staged-config.d.mts +24 -4
- package/dist/lib/esm/nano-staged-config.mjs +48 -3
- package/docs-site/api-doc-documented-files/package.json +6 -0
- package/linters/eslint-rules/prefer-logical-operator-over-ternary/package.json +6 -0
- package/package.json +1 -1
package/dist/lib/cjs/exec.cjs
CHANGED
|
@@ -68,7 +68,9 @@ var exec_exports = {};
|
|
|
68
68
|
__export(exec_exports, {
|
|
69
69
|
appendNodeOption: () => appendNodeOption,
|
|
70
70
|
buildChildEnv: () => buildChildEnv,
|
|
71
|
-
exec: () => exec
|
|
71
|
+
exec: () => exec,
|
|
72
|
+
getEffectiveCommandLineLength: () => getEffectiveCommandLineLength,
|
|
73
|
+
getMaxBatchCommandLength: () => getMaxBatchCommandLength
|
|
72
74
|
});
|
|
73
75
|
module.exports = __toCommonJS(exec_exports);
|
|
74
76
|
var import_debug = require('@mnaoumov/typescript-lib/debug');
|
|
@@ -244,6 +246,17 @@ const NTSTATUS_NAMES = /* @__PURE__ */ new Map([
|
|
|
244
246
|
["0xC0000409", "STATUS_STACK_BUFFER_OVERRUN"]
|
|
245
247
|
]);
|
|
246
248
|
const WINDOWS_CHILD_EXPANSION_RESERVE = 2048;
|
|
249
|
+
function getEffectiveCommandLineLength(commandLine) {
|
|
250
|
+
if (import_node_process.default.platform !== "win32") {
|
|
251
|
+
return commandLine.length;
|
|
252
|
+
}
|
|
253
|
+
const comspec = import_node_process.default.env["comspec"] ?? "cmd.exe";
|
|
254
|
+
const CMD_WRAPPER = ' /d /s /c ""';
|
|
255
|
+
return comspec.length + CMD_WRAPPER.length + (0, import_cli_utils.cmdEscapeCommandLine)(commandLine).length;
|
|
256
|
+
}
|
|
257
|
+
function getMaxBatchCommandLength() {
|
|
258
|
+
return getMaxCommandLength() - (import_node_process.default.platform === "win32" ? WINDOWS_CHILD_EXPANSION_RESERVE : 0);
|
|
259
|
+
}
|
|
247
260
|
function buildCommandLine($arguments) {
|
|
248
261
|
return import_node_process.default.platform === "win32" ? (0, import_cli_utils.toCommandLine)($arguments) : (0, import_cli_utils.toPosixCommandLine)($arguments);
|
|
249
262
|
}
|
|
@@ -310,17 +323,6 @@ async function executeBatches(params) {
|
|
|
310
323
|
function getChildEnv() {
|
|
311
324
|
return buildChildEnv(import_node_process.default.env, import_node_process.default.allowedNodeEnvironmentFlags);
|
|
312
325
|
}
|
|
313
|
-
function getEffectiveCommandLineLength(commandLine) {
|
|
314
|
-
if (import_node_process.default.platform !== "win32") {
|
|
315
|
-
return commandLine.length;
|
|
316
|
-
}
|
|
317
|
-
const comspec = import_node_process.default.env["comspec"] ?? "cmd.exe";
|
|
318
|
-
const CMD_WRAPPER = ' /d /s /c ""';
|
|
319
|
-
return comspec.length + CMD_WRAPPER.length + (0, import_cli_utils.cmdEscapeCommandLine)(commandLine).length;
|
|
320
|
-
}
|
|
321
|
-
function getMaxBatchCommandLength() {
|
|
322
|
-
return getMaxCommandLength() - (import_node_process.default.platform === "win32" ? WINDOWS_CHILD_EXPANSION_RESERVE : 0);
|
|
323
|
-
}
|
|
324
326
|
function getMaxCommandLength() {
|
|
325
327
|
const WINDOWS_MAX_COMMAND_LENGTH = 8191;
|
|
326
328
|
const UNIX_MAX_COMMAND_LENGTH = 131072;
|
|
@@ -428,6 +430,8 @@ function truncateCommand(command) {
|
|
|
428
430
|
0 && (module.exports = {
|
|
429
431
|
appendNodeOption,
|
|
430
432
|
buildChildEnv,
|
|
431
|
-
exec
|
|
433
|
+
exec,
|
|
434
|
+
getEffectiveCommandLineLength,
|
|
435
|
+
getMaxBatchCommandLength
|
|
432
436
|
});
|
|
433
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGVidWcnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyB0cmltRW5kIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pID8gdHJpbW1lZCA6IGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCDigJQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IOKAlCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudixcbiAgICAuLi4oYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpICYmIHsgTk9ERV9PUFRJT05TOiBhcHBlbmROb2RlT3B0aW9uKGJhc2VFbnZbJ05PREVfT1BUSU9OUyddLCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OKSB9KVxuICB9O1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlLCB0aGUgY29tbWFuZCwgc3RkZXJyLCBhbmQgc3Rkb3V0IChvciBhIG5vdGUgdGhhdCBpdCB3YXNcbiAqICAgICAgICAgcHJpbnRlZCksIGFuZCBzYXlzIHdoZW4gdGhlIGNoaWxkIGNyYXNoZWQgb3Igd2FzIGtpbGxlZCByYXRoZXIgdGhhbiBleGl0aW5nIG9uIGl0cyBvd24uXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM/OiBFeGVjU2ltcGxlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY0RldGFpbGVkT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdD47XG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIG9yIGFuIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY09wdGlvbnMgPSB7fSk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21tYW5kKSkge1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0ID0gaGFuZGxlQmF0Y2hlZENvbW1hbmQoY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgaWYgKGJhdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gYmF0Y2hSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0ICRhcmd1bWVudHMgPSBjb21tYW5kLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgY29tbWFuZExpbmUgPSBidWlsZENvbW1hbmRMaW5lKCRhcmd1bWVudHMpO1xuXG4gICAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heENvbW1hbmRMZW5ndGgoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kTGluZSk7XG4gICAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICAgID8gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgOiBleGVjU3RyaW5nKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJhd0FyZ3VtZW50czogJGFyZ3VtZW50c1xuICAgICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICA/IFByb21pc2UucmVqZWN0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgIClcbiAgICApXG4gICAgOiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzaW5nbGUgc3RyaW5nIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBleGVjU3RyaW5nKHBhcmFtczogRXhlY1N0cmluZ1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcmF3QXJndW1lbnRzXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBjd2QgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudixcbiAgICBpc0ludGVyYWN0aXZlID0gZmFsc2UsXG4gICAgaXNRdWlldDogcXVpZXQgPSBmYWxzZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogaWdub3JlRXhpdENvZGUgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRGV0YWlscyA9IGZhbHNlLFxuICAgIHN0ZGluID0gJydcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignRXhlYycpKGBFeGVjdXRpbmcgY29tbWFuZDogJHtjb21tYW5kfWApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3blZpYVNoZWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTcGF3blZpYVNoZWxsUGFyYW1zPih7XG4gICAgICBjb21tYW5kLFxuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgaXNJbnRlcmFjdGl2ZSxcbiAgICAgIHJhd0FyZ3VtZW50c1xuICAgIH0pKTtcblxuICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICAvLyBJbiBpbnRlcmFjdGl2ZSBtb2RlIHRoZSBjaGlsZCdzIHN0ZGlvIGlzIGluaGVyaXRlZCBieSB0aGUgdGVybWluYWwsIHNvIHRoZXJlIGFyZSBubyBzdHJlYW1zIHRvIHJlYWQgYW5kIG5vdGhpbmcgaXMgY2FwdHVyZWQuXG4gICAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0ZGVycjogY2hpbGRTdGRlcnIsXG4gICAgICAgIHN0ZGluOiBjaGlsZFN0ZGluLFxuICAgICAgICBzdGRvdXQ6IGNoaWxkU3Rkb3V0XG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGluLCAnQ2hpbGQgcHJvY2VzcyBzdGRpbiBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZG91dCwgJ0NoaWxkIHByb2Nlc3Mgc3Rkb3V0IGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3RkZXJyLCAnQ2hpbGQgcHJvY2VzcyBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZScpO1xuXG4gICAgICBjaGlsZFN0ZGluLndyaXRlKHN0ZGluKTtcbiAgICAgIGNoaWxkU3RkaW4uZW5kKCk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3Rkb3V0ID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3Rkb3V0LFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGRlcnIgKz0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZFN0ZGVyci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBzdGRlcnIgPSB0cmltRW5kKHtcbiAgICAgICAgICAkc3RyaW5nOiBzdGRlcnIsXG4gICAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChleGl0Q29kZSwgZXhpdFNpZ25hbCkgPT4ge1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKGRlc2NyaWJlRXhpdEZhaWx1cmUoe1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICBpc1F1aWV0OiBxdWlldCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0ZG91dFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhpdENvZGUsXG4gICAgICAgIGV4aXRTaWduYWwsXG4gICAgICAgIHN0ZGVycixcbiAgICAgICAgc3Rkb3V0XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3QgcnVuIGNvbW1hbmQ6ICR7dHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQpfVxcbiR7ZXJyb3IubWVzc2FnZX1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIOKAlCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGNvbW1hbmQgYSBmYWlsdXJlIG1lc3NhZ2UgcXVvdGVzIGJlZm9yZSB0cnVuY2F0aW5nIGl0LiBBIGJhdGNoZWQgY29tbWFuZCBjYW4gcnVuIHRvIHNldmVyYWxcbiAqIHRob3VzYW5kIGNoYXJhY3RlcnMgb2YgcGF0aHMsIHdoaWNoIHdvdWxkIGJ1cnkgdGhlIG9uZSBsaW5lIG9mIHRoZSBtZXNzYWdlIHRoYXQgc2F5cyB3aGF0IHdlbnQgd3JvbmcuXG4gKi9cbmNvbnN0IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID0gNTAwO1xuXG4vKipcbiAqIE5hbWVzIG9mIHRoZSBXaW5kb3dzIE5UU1RBVFVTIGNvZGVzIGEgY3Jhc2hlZCBjaGlsZCBtb3N0IG9mdGVuIGV4aXRzIHdpdGgsIGZvciB0aGUgZmFpbHVyZSBtZXNzYWdlLiBBIGNvZGVcbiAqIG91dHNpZGUgdGhpcyBsaXN0IGlzIHN0aWxsIHJlY29nbml6ZWQgYXMgYW4gTlRTVEFUVVMgZmFpbHVyZSAoc2VlIHtAbGluayB0b050U3RhdHVzfSkgYW5kIHNob3duIGluIGhleDsgdGhlXG4gKiBuYW1lIGlzIGEgY291cnRlc3ksIG5vdCB0aGUgY2xhc3NpZmljYXRpb24uXG4gKi9cbmNvbnN0IE5UU1RBVFVTX05BTUVTOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKFtcbiAgWycweEMwMDAwMDA1JywgJ1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OJ10sXG4gIFsnMHhDMDAwMDAxNycsICdTVEFUVVNfTk9fTUVNT1JZJ10sXG4gIFsnMHhDMDAwMDAxRCcsICdTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiddLFxuICBbJzB4QzAwMDAwOTQnLCAnU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8nXSxcbiAgWycweEMwMDAwMEZEJywgJ1NUQVRVU19TVEFDS19PVkVSRkxPVyddLFxuICBbJzB4QzAwMDAxMzUnLCAnU1RBVFVTX0RMTF9OT1RfRk9VTkQnXSxcbiAgWycweEMwMDAwMTNBJywgJ1NUQVRVU19DT05UUk9MX0NfRVhJVCddLFxuICBbJzB4QzAwMDAzNzQnLCAnU1RBVFVTX0hFQVBfQ09SUlVQVElPTiddLFxuICBbJzB4QzAwMDA0MDknLCAnU1RBVFVTX1NUQUNLX0JVRkZFUl9PVkVSUlVOJ11cbl0pO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBzaGltbWVkIGA8dG9vbD4gPGFyZ3PigKY+YCBpbnZvY2F0aW9uIGlzIG5vdCBvbmUgYGNtZC5leGVgIGNvbW1hbmQgbGluZSBidXQgYSBjaGFpbiBvZiB0aGVtOiB0aGVcbiAqIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSDigKYgPHRvb2w+LWNsaS5qcyA8YXJnc+KApj5gIGxpbmUsIGFuZCBlYWNoIGhvcFxuICogcmUtcXVvdGVzIHdoYXQgaXQgZm9yd2FyZHMuIEV2ZXJ5IG9uZSBvZiB0aG9zZSBsaW5lcyBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIDgxOTEgbGltaXQsIGFuZCBldmVyeSBvbmUgaXNcbiAqIGxvbmdlciB0aGFuIHRoZSBsaW5lIHdlIGFzc2VtYmxlZCDigJQgYnV0IGJ5IGhvdyBtdWNoIGlzIHRoZSBjaGlsZCdzIGJ1c2luZXNzLCBub3Qgb3Vycywgc28gbm8gZm9ybXVsYSBjYW5cbiAqIGJlIHJpZ2h0LiBPbmx5IHRoZSBkZWxpYmVyYXRlIHNsYWNrIGJlbG93IGNhbi5cbiAqXG4gKiBgMjA0OGAgaXMgcm91Z2hseSBkb3VibGUgdGhlIG92ZXJoZWFkIG1lYXN1cmVkIHdoZW4gdGhpcyB3YXMgZm91bmQsIGJhY2sgd2hlbiBldmVyeSB0b29sIHdhc1xuICogYWRkaXRpb25hbGx5IGZyb250ZWQgYnkgYG5weGAgYW5kIHNvIHBhaWQgb25lIG1vcmUgcmUtZXhwYW5zaW9uIGhvcCB0aGFuIGl0IGRvZXMgbm93LiBPdmVyIGEgcmVwb3NpdG9yeSdzXG4gKiAxODcgbWFya2Rvd24gcGF0aHMsIGEgYG1hcmtkb3dubGludC1jbGkyIOKApmAgbGluZSAqKmFzc2VtYmxlZCBhdCA3MDUxIGNoYXJzKiog4oCUIDExNDAgdW5kZXIgdGhlIGxpbWl0IOKAlFxuICogc3RpbGwgZGllZCB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmA7IHRoZSBzYW1lIHBheWxvYWQgc3BsaXQgaW4gdHdvIHJ1bnMgY2xlYW4uIE5vdGUgdGhlIHRvb2w6XG4gKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0byBgbGlua2luYXRvcmAsIGl0IGlzIHRoZSBzaGFwZSBvZiBldmVyeSBzaGltLWZyb250ZWQgaW52b2NhdGlvbi5cbiAqXG4gKiBPdmVyLXJlc2VydmluZyBjb3N0cyBvbmUgZXh0cmEgc2VxdWVudGlhbCBpbnZvY2F0aW9uIG9mIGEgY29tbWFuZCB0aGF0IHdhcyBhbHJlYWR5IGdvaW5nIHRvIGJlIGJhdGNoZWQ7XG4gKiB1bmRlci1yZXNlcnZpbmcgY29zdHMgYSBsaW50IGZhaWx1cmUgdGhhdCBuYW1lcyBub3RoaW5nIHdyb25nIHdpdGggdGhlIGNvbnRlbnQuIFJhaXNlIGl0LCBuZXZlciBsb3dlciBpdCxcbiAqIGlmIHRoZSBzeW1wdG9tIHJldHVybnMuXG4gKi9cbmNvbnN0IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgPSAyMDQ4O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZXNjcmliZUV4aXRGYWlsdXJlfS5cbiAqL1xuaW50ZXJmYWNlIERlc2NyaWJlRXhpdEZhaWx1cmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgdGhlIGNoaWxkIHJlcG9ydGVkLCBvciBgbnVsbGAgd2hlbiBpdCBkaWQgbm90IGV4aXQgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmFsIHRoYXQgdGVybWluYXRlZCB0aGUgY2hpbGQsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hpbGQncyBzdGRpbyB3YXMgYXR0YWNoZWQgdG8gdGhlIHRlcm1pbmFsLCBzbyBub3RoaW5nIHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoaWxkJ3Mgb3V0cHV0IHdhcyBzdXBwcmVzc2VkLCBzbyB0aGUgdXNlciBoYXMgbm90IHNlZW4gaXQuXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjdXRlQmF0Y2hlc30uXG4gKi9cbmludGVyZmFjZSBFeGVjdXRlQmF0Y2hlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBjb21tYW5kIHdpdGhvdXQgYmF0Y2hlZCBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhdGNoZXMgb2YgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZXM6IHN0cmluZ1tdW107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBFeGVjT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKi9cbmludGVyZmFjZSBTcGF3blZpYVNoZWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWVyZ2VkIG92ZXIgdGhlIGluaGVyaXRlZCBjaGlsZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCdzIHN0ZGlvIHRvIHRoZSB0ZXJtaW5hbCBpbnN0ZWFkIG9mIHBpcGluZyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSkuXG4gICAqL1xuICByZWFkb25seSByYXdBcmd1bWVudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBjb21tYW5kLWxpbmUgc3RyaW5nIGZyb20gYW4gYXJndW1lbnQgYXJyYXksIHF1b3RlZCBmb3IgdGhlIHNoZWxsIHRoYXRcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSB3aWxsIHJvdXRlIHRocm91Z2ggb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKlxuICogT24gV2luZG93cyB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYGNtZC5leGVgLCBzbyBpdCB1c2VzIHRoZVxuICogYENvbW1hbmRMaW5lVG9Bcmd2V2AgY29udmVudGlvbiAoe0BsaW5rIHRvQ29tbWFuZExpbmV9KTsge0BsaW5rIHNwYXduVmlhU2hlbGx9XG4gKiB0aGVuIGFwcGxpZXMge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBvbiB0b3AgZm9yIGBjbWQuZXhlYCBtZXRhY2hhcmFjdGVycy5cbiAqIEVsc2V3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYHNoIC1jYCwgc28gaXQgdXNlcyBQT1NJWCBzaW5nbGUtcXVvdGVcbiAqIHF1b3RpbmcgKHtAbGluayB0b1Bvc2l4Q29tbWFuZExpbmV9KSBhbmQgbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZy5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudCBhcnJheSB0byBxdW90ZSBhbmQgam9pbi5cbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgY29tbWFuZC1saW5lIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBzaGVsbC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kTGluZSgkYXJndW1lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gdG9Db21tYW5kTGluZSgkYXJndW1lbnRzKSA6IHRvUG9zaXhDb21tYW5kTGluZSgkYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgY29tbWFuZCByZWplY3RzIHdpdGgsIHNheWluZyBub3Qgb25seSBUSEFUIGl0IGZhaWxlZCBidXQgSE9XLlxuICpcbiAqIFRoZSBtZXNzYWdlIHVzZWQgdG8gYmUgYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDxuPmAgcGx1cyBzdGRlcnIsIHdoYXRldmVyIHRoZSBjb2RlLiBTbyBhIGNoaWxkIHRoYXRcbiAqIGNyYXNoZWQgYmVmb3JlIHdyaXRpbmcgYSBieXRlIGFuZCBhIGxpbnRlciB0aGF0IGZvdW5kIHJlYWwgcHJvYmxlbXMgcmVhZCB0aGUgc2FtZSwgZGlmZmVyaW5nIG9ubHkgaW4gYVxuICogbnVtYmVyIG5vYm9keSByZWFkcyBhcyBhIHN0YXR1czogYSBXaW5kb3dzIGFjY2VzcyB2aW9sYXRpb24gYXJyaXZlcyBhcyBgZXhpdCBjb2RlIDMyMjEyMjU0NzdgIHdpdGggbm90aGluZ1xuICogYWZ0ZXIgaXQsIGFuZCB3aG9ldmVyIHJlYWRzIGl0IGdvZXMgbG9va2luZyBmb3IgYSBmaW5kaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgdGhhdFxuICogY2FuIHRlbGwgdGhlIHR3byBhcGFydCDigJQgdGhlIGAuY21kYCBzaGltIGlzIHNwYXduZWQgZGlyZWN0bHksIHNvIHRoZSBjaGlsZCdzIHJhdyBjb2RlIGlzIHZpc2libGUgaGVyZSwgd2hpbGVcbiAqIGFuIGBucG0gcnVuYCBsYXllciBmdXJ0aGVyIG91dCBpcyBrbm93biB0byBsYXVuZGVyIGl0IGludG8gYSBwbGFpbiBgMWAuXG4gKlxuICogVHdvIHNpZ25hbHMgYXJlIHJlYWQsIGFuZCB0aGVpciBjb25qdW5jdGlvbiBpcyB3aGF0IGVhcm5zIHRoZSB3b3JkIFwiY3Jhc2hlZFwiOiB0aGUgdGVybWluYXRpb24gd2FzIGFibm9ybWFsXG4gKiAoYW4gTlRTVEFUVVMgZXJyb3IgY29kZSwgb3IgYSBzaWduYWwpLCBhbmQgbmVpdGhlciBzdHJlYW0gY2FycmllZCBhbnl0aGluZy4gQSB0b29sIGZhaWxpbmcgb24gaXRzIG93biB0ZXJtc1xuICogc2F5cyBzb21ldGhpbmc7IGEgY2hpbGQgdGhhdCBkaWVkIG1pZC1pbnN0cnVjdGlvbiBkb2VzIG5vdC4gVGhlIENBVVNFIG9mIHN1Y2ggYSBjcmFzaCBpcyBub3QgdGhpc1xuICogZnVuY3Rpb24ncyBidXNpbmVzcywgc28gdGhlIG1lc3NhZ2Ugb25seSBuYW1lcyBpdCBhbmQgc2F5cyB3aGF0IHRvIGRvLlxuICpcbiAqIFRoZSBgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgPG4+YCBwcmVmaXggaXMga2VwdCwgc28gYSBjYWxsZXIgbWF0Y2hpbmcgb24gaXQgc3RpbGwgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmYWlsdXJlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdEZhaWx1cmUocGFyYW1zOiBEZXNjcmliZUV4aXRGYWlsdXJlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb21tYW5kLCBleGl0Q29kZSwgZXhpdFNpZ25hbCwgaXNJbnRlcmFjdGl2ZSwgaXNRdWlldCwgc3RkZXJyLCBzdGRvdXQgfSA9IHBhcmFtcztcbiAgY29uc3QgbnRTdGF0dXMgPSB0b050U3RhdHVzKGV4aXRDb2RlKTtcblxuICBsZXQgc3RhdHVzID0gYGV4aXQgY29kZSAke2V4aXRDb2RlID09PSBudWxsID8gJyhudWxsKScgOiBTdHJpbmcoZXhpdENvZGUpfWA7XG4gIGxldCBhYm5vcm1hbFJlYXNvbjogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGlmIChudFN0YXR1cyAhPT0gbnVsbCkge1xuICAgIGNvbnN0IEhFWF9SQURJWCA9IDE2O1xuICAgIGNvbnN0IGhleCA9IGAweCR7bnRTdGF0dXMudG9TdHJpbmcoSEVYX1JBRElYKS50b1VwcGVyQ2FzZSgpfWA7XG4gICAgY29uc3QgbmFtZSA9IE5UU1RBVFVTX05BTUVTLmdldChoZXgpO1xuICAgIHN0YXR1cyArPSBgIChOVFNUQVRVUyAke25hbWUgPyBgJHtoZXh9ICR7bmFtZX1gIDogaGV4fSlgO1xuICAgIGFibm9ybWFsUmVhc29uID0gbmFtZSA9PT0gJ1NUQVRVU19DT05UUk9MX0NfRVhJVCcgPyAnd2FzIGludGVycnVwdGVkJyA6ICdjcmFzaGVkJztcbiAgfSBlbHNlIGlmIChleGl0U2lnbmFsICE9PSBudWxsKSB7XG4gICAgc3RhdHVzICs9IGAsIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZXhpdFNpZ25hbH1gO1xuICAgIGFibm9ybWFsUmVhc29uID0gYHdhcyBraWxsZWQgYnkgJHtleGl0U2lnbmFsfWA7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtgQ29tbWFuZCBmYWlsZWQgd2l0aCAke3N0YXR1c31gLCBgQ29tbWFuZDogJHt0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZCl9YF07XG5cbiAgaWYgKGFibm9ybWFsUmVhc29uICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaChcbiAgICAgICFpc0ludGVyYWN0aXZlICYmIHN0ZG91dCA9PT0gJycgJiYgc3RkZXJyID09PSAnJ1xuICAgICAgICA/IGBUaGUgY2hpbGQgcHJvY2VzcyAke2Fibm9ybWFsUmVhc29ufSBiZWZvcmUgd3JpdGluZyBhbnl0aGluZyB0byBzdGRvdXQgb3Igc3RkZXJyLiBUaGlzIGlzIG5vdCBhIGZhaWx1cmUgdGhlIHRvb2wgcmVwb3J0ZWQgKG5vdCBhIGxpbnQgZmluZGluZywgbm90IGEgdHlwZSBlcnJvcik6IHJlLXJ1biB0aGUgY29tbWFuZC5gXG4gICAgICAgIDogYFRoZSBjaGlsZCBwcm9jZXNzICR7YWJub3JtYWxSZWFzb259IHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93biwgc28gYW55IG91dHB1dCBpdCB3cm90ZSBtYXkgYmUgaW5jb21wbGV0ZS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgIT09ICcnKSB7XG4gICAgbGluZXMucHVzaChpc1F1aWV0ID8gYHN0ZG91dDpcXG4ke3N0ZG91dH1gIDogYHN0ZG91dDogJHtTdHJpbmcoc3Rkb3V0LnNwbGl0KCdcXG4nKS5sZW5ndGgpfSBsaW5lKHMpLCBwcmludGVkIGFib3ZlLmApO1xuICB9XG5cbiAgaWYgKHN0ZGVyciAhPT0gJycpIHtcbiAgICBsaW5lcy5wdXNoKGBzdGRlcnI6XFxuJHtzdGRlcnJ9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCDigJQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2VzcyDigJQgZXhjZXB0IHRoYXQgYW4gYWJub3JtYWwgdGVybWluYXRpb24gKGEgY3Jhc2gsIGFcbiAqIHNpZ25hbCkgaW4gYSBsYXRlciBiYXRjaCBvdXRyYW5rcyBhbiBvcmRpbmFyeSBmYWlsdXJlIGluIGFuIGVhcmxpZXIgb25lLiBPdGhlcndpc2UgYSBjcmFzaCBpbiBiYXRjaCAyIGFmdGVyXG4gKiByZWFsIGZpbmRpbmdzIGluIGJhdGNoIDEgd291bGQgYWdncmVnYXRlIHRvIHRoZSBmaW5kaW5ncycgZXhpdCBjb2RlLCBhbmQgYSBjYWxsZXIgY2xhc3NpZnlpbmcgdGhlIHJlc3VsdFxuICogd291bGQgbmV2ZXIgbGVhcm4gdGhhdCBwYXJ0IG9mIHRoZSBpbnB1dCB3YXMgbm90IGNoZWNrZWQgYXQgYWxsLlxuICpcbiAqIFNpbGVudCBiYXRjaGVzIGNvbnRyaWJ1dGUgbm90aGluZyB0byB0aGUgam9pbmVkIG91dHB1dC4gYGV4ZWNTdHJpbmdgIGFscmVhZHkgdHJpbXMgZWFjaCByZXN1bHQncyB0cmFpbGluZ1xuICogbmV3bGluZSwgc28gam9pbmluZyBlbXB0eSBvbmVzIGJhY2sgaW4gd291bGQgcmVpbnRyb2R1Y2UgZXhhY3RseSB0aGUgYmxhbmstbGluZSBub2lzZSBpdCByZW1vdmVkIOKAlCBhXG4gKiBjb21tYW5kIHRoYXQgcHJpbnRlZCBub3RoaW5nIG11c3QgYWdncmVnYXRlIHRvIGAnJ2AsIG5vdCB0byBhIHJ1biBvZiBuZXdsaW5lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBiYXRjaGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbmNhdGVuYXRlZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaGVzKHBhcmFtczogRXhlY3V0ZUJhdGNoZXNQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3QgeyBiYXNlQ29tbWFuZCwgYmF0Y2hlcywgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBzdGRvdXRQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyUGFydHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBmYWlsdXJlOiBFeGVjUmVzdWx0IHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgY29uc3QgYmF0Y2hDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShiYXRjaCl9YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGJhdGNoQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcHVzaElmTm90RW1wdHkoc3Rkb3V0UGFydHMsIHJlc3VsdC5zdGRvdXQpO1xuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZGVyclBhcnRzLCByZXN1bHQuc3RkZXJyKTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwICYmIChmYWlsdXJlID09PSBudWxsIHx8ICghaXNBYm5vcm1hbFRlcm1pbmF0aW9uKGZhaWx1cmUpICYmIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQpKSkpIHtcbiAgICAgIGZhaWx1cmUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkSW5jbHVkZURldGFpbHNcbiAgICA/IHtcbiAgICAgIC8vIE5vdCBgZmFpbHVyZT8uZXhpdENvZGUgPz8gMGA6IGEgYmF0Y2gga2lsbGVkIGJ5IGEgc2lnbmFsIGhhcyBhIGBudWxsYCBjb2RlLCB3aGljaCBgPz9gIHdvdWxkIHJlcG9ydCBhcyBzdWNjZXNzLlxuICAgICAgZXhpdENvZGU6IGZhaWx1cmUgPT09IG51bGwgPyAwIDogZmFpbHVyZS5leGl0Q29kZSxcbiAgICAgIGV4aXRTaWduYWw6IGZhaWx1cmU/LmV4aXRTaWduYWwgPz8gbnVsbCxcbiAgICAgIHN0ZGVycjogc3RkZXJyUGFydHMuam9pbignXFxuJyksXG4gICAgICBzdGRvdXQ6IHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpXG4gICAgfVxuICAgIDogc3Rkb3V0UGFydHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3NlcywgcmVzb2x2ZWQgYXQgc3Bhd24gdGltZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGEgbW9kdWxlLWxldmVsIGNvbnN0YW50LiBgLmVudmAgaXMgbG9hZGVkIGJ5IGBsb2FkRW52RmlsZUlmRXhpc3RzYCBmcm9tIGluc2lkZVxuICogYHdyYXBDbGlUYXNrYCwgYW5kIEVTTSBldmFsdWF0ZXMgZXZlcnkgaW1wb3J0IGJlZm9yZSB0aGUgZW50cnkgbW9kdWxlJ3MgZmlyc3Qgc3RhdGVtZW50IOKAlCBzbyBhXG4gKiBzbmFwc2hvdCB0YWtlbiBoZXJlIHdvdWxkIGFsd2F5cyBwcmVkYXRlIHRoZSBsb2FkLCBhbmQgZXZlcnkgc3Bhd25lZCBjaGlsZCB3b3VsZCBydW4gd2l0aG91dCB0aGVcbiAqIHJlcG8ncyBvd24gYC5lbnZgLiBOb3RoaW5nIHN1cmZhY2VkIHRoYXQgd2hpbGUgVml0ZXN0IDMgY29waWVkIHRoZSBgLmVudmAgaXQgbG9hZGVkIGludG8gdGhlXG4gKiB3b3JrZXIncyBgcHJvY2Vzcy5lbnZgOyBWaXRlc3QgNCB3cml0ZXMgdGhvc2UgdG8gYGltcG9ydC5tZXRhLmVudmAgb25seSwgbGVhdmluZyB0aGlzIHRoZSBzb2xlXG4gKiBwYXRoIGFuZCBhbiBlbXB0eSBvbmUuXG4gKlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMsIHJlZmxlY3RpbmcgYHByb2Nlc3MuZW52YCBhcyBpdCBzdGFuZHMgbm93LlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiBidWlsZENoaWxkRW52KHByb2Nlc3MuZW52LCBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFncyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmUgYXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBhY3R1YWxseSBzZWUgaXQsIHdoaWNoIG9uIFdpbmRvd3MgaXNcbiAqIE5PVCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcGFzc2VkIGluLlxuICpcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSByb3V0ZXMgdGhlIGNvbW1hbmQgdGhyb3VnaCBgY21kLmV4ZWAsIGFuZCB0d28gdGhpbmdzIGFyZSBzcGVudCBiZXR3ZWVuIGhlcmUgYW5kXG4gKiB0aGVyZSwgbmVpdGhlciBvZiB0aGVtIHZpc2libGUgaW4gdGhlIGFzc2VtYmxlZCBjb21tYW5kOlxuICogLSBOb2RlJ3MgYHNwYXduKOKApiwgeyBzaGVsbDogdHJ1ZSB9KWAgd3JhcHMgaXQgYXMgYDxjb21zcGVjPiAvZCAvcyAvYyBcIjxjb21tYW5kPlwiYC5cbiAqIC0ge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBgXmAtZXNjYXBlcyBldmVyeSBvbmUgb2YgYGNtZC5leGVgJ3MgbWV0YWNoYXJhY3RlcnMsIHdoaWNoIG9uIGEgbGlzdCBvZlxuICogICBxdW90ZWQgcGF0aHMgaXMgYSBmZXcgcGVyY2VudCBvZiB0aGUgd2hvbGUgKG1lYXN1cmVkOiArMjM2IGNoYXJzIG9uIGEgNzIxNi1jaGFyIGludm9jYXRpb24pLlxuICpcbiAqIEJvdGggYXJlIG91cnMgdG8gY29tcHV0ZSwgc28gdGhleSBhcmUgY29tcHV0ZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZC4gV2hhdCBpcyBOT1QgY29tcHV0YWJsZSBmcm9tIGhlcmUgaXNcbiAqIHdoYXQgdGhlIHNwYXduZWQgY29tbWFuZCBkb2VzIHRvIGl0cyBvd24gYXJndW1lbnRzIOKAlCBzZWUge0BsaW5rIFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkV9LlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBicmFuY2ggaGVyZSBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4ge0BsaW5rIHNwYXduVmlhU2hlbGx9LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kTGluZSAtIFRoZSBhc3NlbWJsZWQgY29tbWFuZCBsaW5lLCBiZWZvcmUgYW55IHNoZWxsIHdyYXBwaW5nLlxuICogQHJldHVybnMgVGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHdoYXQgcmVhY2hlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoY29tbWFuZExpbmU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRMaW5lLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvbXNwZWMgPSBwcm9jZXNzLmVudlsnY29tc3BlYyddID8/ICdjbWQuZXhlJztcbiAgY29uc3QgQ01EX1dSQVBQRVIgPSAnIC9kIC9zIC9jIFwiXCInO1xuICByZXR1cm4gY29tc3BlYy5sZW5ndGggKyBDTURfV1JBUFBFUi5sZW5ndGggKyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZExpbmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aCB0byBzaXplIGFuIHtAbGluayBFeGVjQXJndW1lbnR9IGJhdGNoIGFnYWluc3Qg4oCUIHRoZSBwbGF0Zm9ybSBtYXhpbXVtXG4gKiBsZXNzIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhhbiB7QGxpbmsgZ2V0TWF4Q29tbWFuZExlbmd0aH0sIGJlY2F1c2UgdGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50XG4gKiBxdWVzdGlvbnMuIEV4Y2VlZGluZyB0aGUgcGxhaW4tY29tbWFuZCBsaW1pdCBpcyBhIGhhcmQgZmFpbHVyZSB0aGUgY2FsbGVyIGNhbm5vdCBhdm9pZCwgc28gdGhhdCBjaGVja1xuICogc3RheXMgZXhhY3QuIEV4Y2VlZGluZyB0aGUgYmF0Y2hpbmcgbGltaXQgb25seSBjb3N0cyBvbmUgZXh0cmEgaW52b2NhdGlvbiwgc28gdGhhdCBjaGVjayBtYXkg4oCUIGFuZFxuICogc2hvdWxkIOKAlCBsZWF2ZSByb29tIHRvIHNwYXJlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggbGVuZ3RoIGluIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGEgc2luZ2xlIGJhdGNoLlxuICovXG5mdW5jdGlvbiBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldE1heENvbW1hbmRMZW5ndGgoKSAtIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRSA6IDApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIG1heCBjb21tYW5kIGxpbmUgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggY29tbWFuZCBsZW5ndGggaW4gY2hhcmFjdGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF4Q29tbWFuZExlbmd0aCgpOiBudW1iZXIge1xuICBjb25zdCBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA9IDgxOTE7XG4gIGNvbnN0IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIID0gMTMxXzA3MjtcbiAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA6IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBjb21tYW5kIGFycmF5IHRoYXQgbWF5IGNvbnRhaW4gYW4ge0BsaW5rIEV4ZWNBcmd1bWVudH0uXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBuZWVkZWQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBjb21tYW5kXG4gKiBoYXMgbm8gRXhlY0FyZyBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCBub3JtYWxseS5cbiAqXG4gKiBAcGFyYW0gcGFydHMgLSBUaGUgY29tbWFuZCBwYXJ0cy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGV4ZWMgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBoYW5kbGVkLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlQmF0Y2hlZENvbW1hbmQocGFydHM6IENvbW1hbmRQYXJ0W10sIG9wdGlvbnM6IEV4ZWNPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4ZWNBcmd1bWVudHMgPSBwYXJ0cy5maWx0ZXIoaXNFeGVjQXJndW1lbnQpO1xuICBpZiAoZXhlY0FyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChleGVjQXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdPbmx5IG9uZSBFeGVjQXJnIHdpdGggYmF0Y2hlZEFyZ3VtZW50cyBpcyBhbGxvd2VkIHBlciBjb21tYW5kJykpO1xuICB9XG5cbiAgY29uc3QgZXhlY0FyZ3VtZW50ID0gZXhlY0FyZ3VtZW50c1swXTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhlY0FyZ3VtZW50KTtcbiAgY29uc3Qgc3RhdGljUGFydHMgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpO1xuICBjb25zdCBiYXNlQ29tbWFuZCA9IGJ1aWxkQ29tbWFuZExpbmUoc3RhdGljUGFydHMpO1xuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk7XG5cbiAgLy8gVHJ5IGV4cGFuZGluZyBhbGwgYXJncyBpbmxpbmVcbiAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHtiYXNlQ29tbWFuZH0gJHtidWlsZENvbW1hbmRMaW5lKFsuLi5leGVjQXJndW1lbnQuYmF0Y2hlZEFyZ3VtZW50c10pfWA7XG4gIGlmIChnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChmdWxsQ29tbWFuZCkgPD0gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgIHJldHVybiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGZ1bGxDb21tYW5kLFxuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU3BsaXQgaW50byBiYXRjaGVzXG4gIGNvbnN0IGJhdGNoZXM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRCYXRjaDogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGV4ZWNBcmd1bWVudC5iYXRjaGVkQXJndW1lbnRzKSB7XG4gICAgY29uc3QgdGVudGF0aXZlID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShbLi4uY3VycmVudEJhdGNoLCBhcmd1bWVudF0pfWA7XG4gICAgaWYgKGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKHRlbnRhdGl2ZSkgPiBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBzcGxpdCBjb21tYW5kIGludG8gYmF0Y2hlczogYSBzaW5nbGUgYXJndW1lbnQgKCR7U3RyaW5nKGFyZ3VtZW50Lmxlbmd0aCl9IGNoYXJzKSBwbHVzIHRoZSBiYXNlIGNvbW1hbmQgKCR7U3RyaW5nKGJhc2VDb21tYW5kLmxlbmd0aCl9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXggYmF0Y2ggY29tbWFuZCBsZW5ndGggKCR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSkuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICAgICAgY3VycmVudEJhdGNoID0gW2FyZ3VtZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEJhdGNoLnB1c2goYXJndW1lbnQpO1xuICAgIH1cbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWx3YXlzIHRydWUgYWZ0ZXIgdGhlIGxvb3A7IGJhdGNoZWRBcmd1bWVudHMgaXMgbm9uLWVtcHR5IGF0IHRoaXMgcG9pbnQuICovXG4gIGlmIChjdXJyZW50QmF0Y2gubGVuZ3RoID4gMCkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZUJhdGNoZXMoe1xuICAgIGJhc2VDb21tYW5kLFxuICAgIGJhdGNoZXMsXG4gICAgb3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHJlc3VsdCByZWNvcmRzIGFuIGFibm9ybWFsIHRlcm1pbmF0aW9uIOKAlCBhbiBOVFNUQVRVUyBlcnJvciBjb2RlIG9yIGEgc2lnbmFsIOKAlCByYXRoZXIgdGhhblxuICogdGhlIGNoaWxkIGV4aXRpbmcgb24gaXRzIG93biB3aXRoIGEgY29kZSBvZiBpdHMgY2hvb3NpbmcuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjaGlsZCB0ZXJtaW5hdGVkIGFibm9ybWFsbHkuXG4gKi9cbmZ1bmN0aW9uIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQ6IEV4ZWNSZXN1bHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3VsdC5leGl0U2lnbmFsICE9PSBudWxsIHx8IHRvTnRTdGF0dXMocmVzdWx0LmV4aXRDb2RlKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjb21tYW5kIHBhcnQgaXMgYW4ge0BsaW5rIEV4ZWNBcmd1bWVudH0uXG4gKlxuICogQHBhcmFtIHBhcnQgLSBUaGUgY29tbWFuZCBwYXJ0IHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFydCBpcyBhbiBFeGVjQXJnLlxuICovXG5mdW5jdGlvbiBpc0V4ZWNBcmd1bWVudChwYXJ0OiBDb21tYW5kUGFydCk6IHBhcnQgaXMgRXhlY0FyZ3VtZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiAnYmF0Y2hlZEFyZ3VtZW50cycgaW4gcGFydDtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGEgYmF0Y2gncyBjYXB0dXJlZCBvdXRwdXQgdG8gdGhlIGFjY3VtdWxhdG9yLCBza2lwcGluZyBhbiBlbXB0eSBvbmUgc28gdGhlIGV2ZW50dWFsIGpvaW4gZG9lcyBub3RcbiAqIGZhYnJpY2F0ZSBibGFuayBsaW5lcyBmb3IgYmF0Y2hlcyB0aGF0IHByaW50ZWQgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gYWNjdW11bGF0b3IgLSBUaGUgY29sbGVjdGVkIG91dHB1dHMgc28gZmFyLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBvdXRwdXQgb2YgYSBzaW5nbGUgYmF0Y2guXG4gKi9cbmZ1bmN0aW9uIHB1c2hJZk5vdEVtcHR5KGFjY3VtdWxhdG9yOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG91dHB1dCAhPT0gJycpIHtcbiAgICBhY2N1bXVsYXRvci5wdXNoKG91dHB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHZpYSB0aGUgYXBwcm9wcmlhdGUgc2hlbGwuXG4gKlxuICogT24gV2luZG93cywgaWYgdGhlIGNvbW1hbmQgY29udGFpbnMgbmV3bGluZXMgKHdoaWNoIGBjbWQuZXhlYCBjYW5ub3QgaGFuZGxlKVxuICogYW5kIHRoZSByYXcgYXJncyBhcnJheSBpcyBhdmFpbGFibGUsIHNwYXducyB0aGUgcHJvY2VzcyBkaXJlY3RseSB3aXRob3V0XG4gKiBhbnkgc2hlbGwg4oCUIHBhc3NpbmcgYXJncyB2aWEgYENyZWF0ZVByb2Nlc3NgLCB3aGljaCBhdm9pZHMgYWxsIHF1b3RpbmcgaXNzdWVzLlxuICpcbiAqIE9uIFdpbmRvd3MgKGNtZC5leGUgcGF0aCksIGFwcGxpZXMgYF5gLWVzY2FwaW5nIGZvciBjbWQgbWV0YWNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBzcGF3bmluZyB0aGUgY2hpbGQgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHNwYXduVmlhU2hlbGwocGFyYW1zOiBTcGF3blZpYVNoZWxsUGFyYW1zKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgeyBjb21tYW5kLCBjd2QsIGVudjogZXh0cmFFbnYsIGlzSW50ZXJhY3RpdmUgPSBmYWxzZSwgcmF3QXJndW1lbnRzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgLi4uZ2V0Q2hpbGRFbnYoKSxcbiAgICAuLi5leHRyYUVudlxuICB9O1xuICBjb25zdCBzdGRpbzogJ2luaGVyaXQnIHwgJ3BpcGUnID0gaXNJbnRlcmFjdGl2ZSA/ICdpbmhlcml0JyA6ICdwaXBlJztcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgY29tbWFuZC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICBpZiAoIXJhd0FyZ3VtZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kcyBjb250YWluaW5nIG5ld2xpbmVzIGNhbm5vdCBiZSBleGVjdXRlZCB0aHJvdWdoIGNtZC5leGUgb24gV2luZG93cy4gUGFzcyBhbiBhcmd1bWVudCBhcnJheSBpbnN0ZWFkIG9mIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBjb25zdCBbcHJvZ3JhbSwgLi4uJGFyZ3VtZW50c10gPSByYXdBcmd1bWVudHM7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0NvbW1hbmQgYXJyYXkgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICByZXR1cm4gc3Bhd24ocHJvZ3JhbSwgJGFyZ3VtZW50cywge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc3RkaW9cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZCkgOiBjb21tYW5kO1xuICByZXR1cm4gc3Bhd24oc2hlbGxDb21tYW5kLCBbXSwge1xuICAgIGN3ZCxcbiAgICBlbnYsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW9cbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgYW4gZXhpdCBjb2RlIGFzIGEgV2luZG93cyBOVFNUQVRVUyBlcnJvciwgaWYgaXQgaXMgb25lLlxuICpcbiAqIEEgY3Jhc2hlZCBwcm9jZXNzIG9uIFdpbmRvd3MgZXhpdHMgd2l0aCB0aGUgTlRTVEFUVVMgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGtpbGxlZCBpdCwgYW5kIGEgYC5jbWRgIHNoaW1cbiAqIGZvcndhcmRzIGl0cyBpbm5lciBwcm9jZXNzJ3MgY29kZSwgc28gYSBjcmFzaGVkIGBub2RlLmV4ZWAgYXJyaXZlcyBoZXJlIGludGFjdCDigJQgYDB4QzAwMDAwMDVgIGFzXG4gKiBgMzIyMTIyNTQ3N2AuIFRoZSB0ZXN0IGlzIHRoZSBOVFNUQVRVUyBsYXlvdXQgcmF0aGVyIHRoYW4gYSBiYXJlIGA+PSAweEMwMDAwMDAwYDogdGhlIHRvcCB0d28gYml0cyBhcmUgdGhlXG4gKiBlcnJvciBzZXZlcml0eSBhbmQgdGhlIG5leHQgb25lIGlzIHRoZSBjdXN0b21lciBmbGFnLCB3aGljaCBtdXN0IGJlIGNsZWFyLiBUaGF0IGtlZXBzIG91dCB0d28gY29kZXMgYSBiYXJlXG4gKiByYW5nZSB3b3VsZCBtaXNyZWFkIOKAlCBgcHJvY2Vzcy5leGl0KC0xKWAsIHdoaWNoIFdpbmRvd3MgcmVwb3J0cyBhcyBgMHhGRkZGRkZGRmAsIGFuZCB0aGUgYDB4RTA2RDczNjNgIG9mIGFuXG4gKiB1bmhhbmRsZWQgQysrIGV4Y2VwdGlvbiwgd2hpY2ggaXMgYSBjcmFzaCBidXQgbm90IGFuIE5UU1RBVFVTLiBBIHNpZ25lZCByZWFkaW5nIG9mIHRoZSBzYW1lIGNvZGUgaXMgYWNjZXB0ZWRcbiAqIHRvby4gTm8gbGludGVyLCBjb21waWxlciBvciB0ZXN0IHJ1bm5lciByZXR1cm5zIGEgY29kZSBvZiB0aGlzIHNoYXBlIGFzIGEgY291bnQgb2YgZmluZGluZ3MuXG4gKlxuICogQHBhcmFtIGV4aXRDb2RlIC0gVGhlIGV4aXQgY29kZSB0aGUgY2hpbGQgcmVwb3J0ZWQuXG4gKiBAcmV0dXJucyBUaGUgY29kZSBhcyBhbiB1bnNpZ25lZCBOVFNUQVRVUywgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGFuIE5UU1RBVFVTIGVycm9yLlxuICovXG5mdW5jdGlvbiB0b050U3RhdHVzKGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyKTogbnVsbCB8IG51bWJlciB7XG4gIGlmIChleGl0Q29kZSA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoZXhpdENvZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBFcnJvciBzZXZlcml0eSAodG9wIHR3byBiaXRzIHNldCkgd2l0aCB0aGUgY3VzdG9tZXIgYml0IGNsZWFyIGlzIGV4YWN0bHkgdGhlIHJhbmdlIFsweEMwMDAwMDAwLCAweEUwMDAwMDAwKS5cbiAgY29uc3QgTlRTVEFUVVNfRVJST1JfU1RBUlQgPSAweEMwXzAwXzAwXzAwO1xuICBjb25zdCBOVFNUQVRVU19FUlJPUl9FTkQgPSAweEUwXzAwXzAwXzAwO1xuICBjb25zdCBVSU5UMzJfUkFOR0UgPSAweDFfMDBfMDBfMDBfMDA7XG4gIGNvbnN0IHVuc2lnbmVkID0gZXhpdENvZGUgPCAwID8gZXhpdENvZGUgKyBVSU5UMzJfUkFOR0UgOiBleGl0Q29kZTtcbiAgcmV0dXJuIHVuc2lnbmVkID49IE5UU1RBVFVTX0VSUk9SX1NUQVJUICYmIHVuc2lnbmVkIDwgTlRTVEFUVVNfRVJST1JfRU5EID8gdW5zaWduZWQgOiBudWxsO1xufVxuXG4vKipcbiAqIFNob3J0ZW5zIGEgY29tbWFuZCBmb3IgcXVvdGluZyBpbiBhbiBlcnJvciBtZXNzYWdlLCBrZWVwaW5nIGl0cyBzdGFydCwgd2hpY2ggbmFtZXMgdGhlIHByb2dyYW0uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBzaG9ydGVuLlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQsIGN1dCB0byB7QGxpbmsgTUFYX0NPTU1BTkRfTEVOR1RIX0lOX01FU1NBR0V9IGNoYXJhY3RlcnMgcGx1cyBhbiBlbGxpcHNpcyB3aGVuIGxvbmdlci5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kLmxlbmd0aCA+IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID8gYCR7Y29tbWFuZC5zbGljZSgwLCBNQVhfQ09NTUFORF9MRU5HVEhfSU5fTUVTU0FHRSl94oCmYCA6IGNvbW1hbmQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsbUJBQStCO0FBQy9CLDBCQUE0QztBQUM1QyxvQkFBd0I7QUFDeEIseUJBQWtDO0FBQ2xDLGdDQUFzQjtBQUN0QiwwQkFBb0I7QUFFcEIsdUJBSU87QUEwSkEsU0FBUyxpQkFBaUIscUJBQXlDLFFBQXdCO0FBQ2hHLFFBQU0sV0FBVyx1QkFBdUIsSUFBSSxLQUFLO0FBQ2pELE1BQUksWUFBWSxJQUFJO0FBQ2xCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxRQUFRLE1BQU0sS0FBSyxFQUFFLFNBQVMsTUFBTSxJQUFJLFVBQVUsR0FBRyxPQUFPLElBQUksTUFBTTtBQUMvRTtBQWFPLFNBQVMsY0FBYyxTQUE0Qiw2QkFBcUU7QUFDN0gsU0FBTztBQUFBLElBQ0wsY0FBYztBQUFBLElBQ2QsR0FBRztBQUFBLElBQ0gsR0FBSSw0QkFBNEIsSUFBSSxxQkFBcUIsS0FBSyxFQUFFLGNBQWMsaUJBQWlCLFFBQVEsY0FBYyxHQUFHLHlCQUF5QixFQUFFO0FBQUEsRUFDcko7QUFDRjtBQTBDTyxTQUFTLEtBQUssU0FBaUMsVUFBdUIsQ0FBQyxHQUFpQztBQUM3RyxNQUFJLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFDMUIsVUFBTSxjQUFjLHFCQUFxQixTQUFT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UUFBTSxNQUF5QjtBQUFBLElBQzdCLEdBQUcsWUFBWTtBQUFBLElBQ2YsR0FBRztBQUFBLEVBQ0w7QUFDQSxRQUFNLFFBQTRCLGdCQUFnQixZQUFZO0FBQzlELE1BQUksb0JBQUFBLFFBQVEsYUFBYSxXQUFXLFFBQVEsU0FBUyxJQUFJLEdBQUc7QUFDMUQsUUFBSSxDQUFDLGNBQWM7QUFDakIsWUFBTSxJQUFJLE1BQU0seUhBQXlIO0FBQUEsSUFDM0k7QUFDQSxVQUFNLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSTtBQUNqQyw4Q0FBa0IsU0FBUyxpQ0FBaUM7QUFDNUQsZUFBTyxpQ0FBTSxTQUFTLFlBQVk7QUFBQSxNQUNoQztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sZUFBZSxvQkFBQUEsUUFBUSxhQUFhLGNBQVUsaUJBQUFDLHNCQUF5QixPQUFPLElBQUk7QUFDeEYsYUFBTyxpQ0FBTSxjQUFjLENBQUMsR0FBRztBQUFBLElBQzdCO0FBQUEsSUFDQTtBQUFBLElBQ0EsT0FBTztBQUFBLElBQ1A7QUFBQSxFQUNGLENBQUM7QUFDSDtBQWdCQSxTQUFTLFdBQVcsVUFBd0M7QUFDMUQsTUFBSSxhQUFhLFFBQVEsQ0FBQyxPQUFPLGNBQWMsUUFBUSxHQUFHO0FBQ3hELFdBQU87QUFBQSxFQUNUO0FBR0EsUUFBTSx1QkFBdUI7QUFDN0IsUUFBTSxxQkFBcUI7QUFDM0IsUUFBTSxlQUFlO0FBQ3JCLFFBQU0sV0FBVyxXQUFXLElBQUksV0FBVyxlQUFlO0FBQzFELFNBQU8sWUFBWSx3QkFBd0IsV0FBVyxxQkFBcUIsV0FBVztBQUN4RjtBQVFBLFNBQVMsZ0JBQWdCLFNBQXlCO0FBQ2hELFNBQU8sUUFBUSxTQUFTLGdDQUFnQyxHQUFHLFFBQVEsTUFBTSxHQUFHLDZCQUE2QixDQUFDLFdBQU07QUFDbEg7IiwibmFtZXMiOlsibWF4Q29tbWFuZExlbmd0aCIsImVmZmVjdGl2ZUxlbmd0aCIsInByb2Nlc3MiLCJjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUiXX0=
|
|
437
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGVidWcnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyB0cmltRW5kIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pID8gdHJpbW1lZCA6IGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCDigJQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IOKAlCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudixcbiAgICAuLi4oYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpICYmIHsgTk9ERV9PUFRJT05TOiBhcHBlbmROb2RlT3B0aW9uKGJhc2VFbnZbJ05PREVfT1BUSU9OUyddLCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OKSB9KVxuICB9O1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlLCB0aGUgY29tbWFuZCwgc3RkZXJyLCBhbmQgc3Rkb3V0IChvciBhIG5vdGUgdGhhdCBpdCB3YXNcbiAqICAgICAgICAgcHJpbnRlZCksIGFuZCBzYXlzIHdoZW4gdGhlIGNoaWxkIGNyYXNoZWQgb3Igd2FzIGtpbGxlZCByYXRoZXIgdGhhbiBleGl0aW5nIG9uIGl0cyBvd24uXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM/OiBFeGVjU2ltcGxlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY0RldGFpbGVkT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdD47XG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIG9yIGFuIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY09wdGlvbnMgPSB7fSk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21tYW5kKSkge1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0ID0gaGFuZGxlQmF0Y2hlZENvbW1hbmQoY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgaWYgKGJhdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gYmF0Y2hSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0ICRhcmd1bWVudHMgPSBjb21tYW5kLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgY29tbWFuZExpbmUgPSBidWlsZENvbW1hbmRMaW5lKCRhcmd1bWVudHMpO1xuXG4gICAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heENvbW1hbmRMZW5ndGgoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kTGluZSk7XG4gICAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICAgID8gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgOiBleGVjU3RyaW5nKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJhd0FyZ3VtZW50czogJGFyZ3VtZW50c1xuICAgICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICA/IFByb21pc2UucmVqZWN0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgIClcbiAgICApXG4gICAgOiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzaW5nbGUgc3RyaW5nIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBleGVjU3RyaW5nKHBhcmFtczogRXhlY1N0cmluZ1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcmF3QXJndW1lbnRzXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBjd2QgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudixcbiAgICBpc0ludGVyYWN0aXZlID0gZmFsc2UsXG4gICAgaXNRdWlldDogcXVpZXQgPSBmYWxzZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogaWdub3JlRXhpdENvZGUgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRGV0YWlscyA9IGZhbHNlLFxuICAgIHN0ZGluID0gJydcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignRXhlYycpKGBFeGVjdXRpbmcgY29tbWFuZDogJHtjb21tYW5kfWApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3blZpYVNoZWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTcGF3blZpYVNoZWxsUGFyYW1zPih7XG4gICAgICBjb21tYW5kLFxuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgaXNJbnRlcmFjdGl2ZSxcbiAgICAgIHJhd0FyZ3VtZW50c1xuICAgIH0pKTtcblxuICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICAvLyBJbiBpbnRlcmFjdGl2ZSBtb2RlIHRoZSBjaGlsZCdzIHN0ZGlvIGlzIGluaGVyaXRlZCBieSB0aGUgdGVybWluYWwsIHNvIHRoZXJlIGFyZSBubyBzdHJlYW1zIHRvIHJlYWQgYW5kIG5vdGhpbmcgaXMgY2FwdHVyZWQuXG4gICAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0ZGVycjogY2hpbGRTdGRlcnIsXG4gICAgICAgIHN0ZGluOiBjaGlsZFN0ZGluLFxuICAgICAgICBzdGRvdXQ6IGNoaWxkU3Rkb3V0XG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGluLCAnQ2hpbGQgcHJvY2VzcyBzdGRpbiBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZG91dCwgJ0NoaWxkIHByb2Nlc3Mgc3Rkb3V0IGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3RkZXJyLCAnQ2hpbGQgcHJvY2VzcyBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZScpO1xuXG4gICAgICBjaGlsZFN0ZGluLndyaXRlKHN0ZGluKTtcbiAgICAgIGNoaWxkU3RkaW4uZW5kKCk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3Rkb3V0ID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3Rkb3V0LFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGRlcnIgKz0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZFN0ZGVyci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBzdGRlcnIgPSB0cmltRW5kKHtcbiAgICAgICAgICAkc3RyaW5nOiBzdGRlcnIsXG4gICAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChleGl0Q29kZSwgZXhpdFNpZ25hbCkgPT4ge1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKGRlc2NyaWJlRXhpdEZhaWx1cmUoe1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICBpc1F1aWV0OiBxdWlldCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0ZG91dFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhpdENvZGUsXG4gICAgICAgIGV4aXRTaWduYWwsXG4gICAgICAgIHN0ZGVycixcbiAgICAgICAgc3Rkb3V0XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3QgcnVuIGNvbW1hbmQ6ICR7dHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQpfVxcbiR7ZXJyb3IubWVzc2FnZX1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIOKAlCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGNvbW1hbmQgYSBmYWlsdXJlIG1lc3NhZ2UgcXVvdGVzIGJlZm9yZSB0cnVuY2F0aW5nIGl0LiBBIGJhdGNoZWQgY29tbWFuZCBjYW4gcnVuIHRvIHNldmVyYWxcbiAqIHRob3VzYW5kIGNoYXJhY3RlcnMgb2YgcGF0aHMsIHdoaWNoIHdvdWxkIGJ1cnkgdGhlIG9uZSBsaW5lIG9mIHRoZSBtZXNzYWdlIHRoYXQgc2F5cyB3aGF0IHdlbnQgd3JvbmcuXG4gKi9cbmNvbnN0IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID0gNTAwO1xuXG4vKipcbiAqIE5hbWVzIG9mIHRoZSBXaW5kb3dzIE5UU1RBVFVTIGNvZGVzIGEgY3Jhc2hlZCBjaGlsZCBtb3N0IG9mdGVuIGV4aXRzIHdpdGgsIGZvciB0aGUgZmFpbHVyZSBtZXNzYWdlLiBBIGNvZGVcbiAqIG91dHNpZGUgdGhpcyBsaXN0IGlzIHN0aWxsIHJlY29nbml6ZWQgYXMgYW4gTlRTVEFUVVMgZmFpbHVyZSAoc2VlIHtAbGluayB0b050U3RhdHVzfSkgYW5kIHNob3duIGluIGhleDsgdGhlXG4gKiBuYW1lIGlzIGEgY291cnRlc3ksIG5vdCB0aGUgY2xhc3NpZmljYXRpb24uXG4gKi9cbmNvbnN0IE5UU1RBVFVTX05BTUVTOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKFtcbiAgWycweEMwMDAwMDA1JywgJ1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OJ10sXG4gIFsnMHhDMDAwMDAxNycsICdTVEFUVVNfTk9fTUVNT1JZJ10sXG4gIFsnMHhDMDAwMDAxRCcsICdTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiddLFxuICBbJzB4QzAwMDAwOTQnLCAnU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8nXSxcbiAgWycweEMwMDAwMEZEJywgJ1NUQVRVU19TVEFDS19PVkVSRkxPVyddLFxuICBbJzB4QzAwMDAxMzUnLCAnU1RBVFVTX0RMTF9OT1RfRk9VTkQnXSxcbiAgWycweEMwMDAwMTNBJywgJ1NUQVRVU19DT05UUk9MX0NfRVhJVCddLFxuICBbJzB4QzAwMDAzNzQnLCAnU1RBVFVTX0hFQVBfQ09SUlVQVElPTiddLFxuICBbJzB4QzAwMDA0MDknLCAnU1RBVFVTX1NUQUNLX0JVRkZFUl9PVkVSUlVOJ11cbl0pO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBzaGltbWVkIGA8dG9vbD4gPGFyZ3PigKY+YCBpbnZvY2F0aW9uIGlzIG5vdCBvbmUgYGNtZC5leGVgIGNvbW1hbmQgbGluZSBidXQgYSBjaGFpbiBvZiB0aGVtOiB0aGVcbiAqIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSDigKYgPHRvb2w+LWNsaS5qcyA8YXJnc+KApj5gIGxpbmUsIGFuZCBlYWNoIGhvcFxuICogcmUtcXVvdGVzIHdoYXQgaXQgZm9yd2FyZHMuIEV2ZXJ5IG9uZSBvZiB0aG9zZSBsaW5lcyBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIDgxOTEgbGltaXQsIGFuZCBldmVyeSBvbmUgaXNcbiAqIGxvbmdlciB0aGFuIHRoZSBsaW5lIHdlIGFzc2VtYmxlZCDigJQgYnV0IGJ5IGhvdyBtdWNoIGlzIHRoZSBjaGlsZCdzIGJ1c2luZXNzLCBub3Qgb3Vycywgc28gbm8gZm9ybXVsYSBjYW5cbiAqIGJlIHJpZ2h0LiBPbmx5IHRoZSBkZWxpYmVyYXRlIHNsYWNrIGJlbG93IGNhbi5cbiAqXG4gKiBgMjA0OGAgaXMgcm91Z2hseSBkb3VibGUgdGhlIG92ZXJoZWFkIG1lYXN1cmVkIHdoZW4gdGhpcyB3YXMgZm91bmQsIGJhY2sgd2hlbiBldmVyeSB0b29sIHdhc1xuICogYWRkaXRpb25hbGx5IGZyb250ZWQgYnkgYG5weGAgYW5kIHNvIHBhaWQgb25lIG1vcmUgcmUtZXhwYW5zaW9uIGhvcCB0aGFuIGl0IGRvZXMgbm93LiBPdmVyIGEgcmVwb3NpdG9yeSdzXG4gKiAxODcgbWFya2Rvd24gcGF0aHMsIGEgYG1hcmtkb3dubGludC1jbGkyIOKApmAgbGluZSAqKmFzc2VtYmxlZCBhdCA3MDUxIGNoYXJzKiog4oCUIDExNDAgdW5kZXIgdGhlIGxpbWl0IOKAlFxuICogc3RpbGwgZGllZCB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmA7IHRoZSBzYW1lIHBheWxvYWQgc3BsaXQgaW4gdHdvIHJ1bnMgY2xlYW4uIE5vdGUgdGhlIHRvb2w6XG4gKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0byBgbGlua2luYXRvcmAsIGl0IGlzIHRoZSBzaGFwZSBvZiBldmVyeSBzaGltLWZyb250ZWQgaW52b2NhdGlvbi5cbiAqXG4gKiBPdmVyLXJlc2VydmluZyBjb3N0cyBvbmUgZXh0cmEgc2VxdWVudGlhbCBpbnZvY2F0aW9uIG9mIGEgY29tbWFuZCB0aGF0IHdhcyBhbHJlYWR5IGdvaW5nIHRvIGJlIGJhdGNoZWQ7XG4gKiB1bmRlci1yZXNlcnZpbmcgY29zdHMgYSBsaW50IGZhaWx1cmUgdGhhdCBuYW1lcyBub3RoaW5nIHdyb25nIHdpdGggdGhlIGNvbnRlbnQuIFJhaXNlIGl0LCBuZXZlciBsb3dlciBpdCxcbiAqIGlmIHRoZSBzeW1wdG9tIHJldHVybnMuXG4gKi9cbmNvbnN0IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgPSAyMDQ4O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZXNjcmliZUV4aXRGYWlsdXJlfS5cbiAqL1xuaW50ZXJmYWNlIERlc2NyaWJlRXhpdEZhaWx1cmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgdGhlIGNoaWxkIHJlcG9ydGVkLCBvciBgbnVsbGAgd2hlbiBpdCBkaWQgbm90IGV4aXQgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmFsIHRoYXQgdGVybWluYXRlZCB0aGUgY2hpbGQsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hpbGQncyBzdGRpbyB3YXMgYXR0YWNoZWQgdG8gdGhlIHRlcm1pbmFsLCBzbyBub3RoaW5nIHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoaWxkJ3Mgb3V0cHV0IHdhcyBzdXBwcmVzc2VkLCBzbyB0aGUgdXNlciBoYXMgbm90IHNlZW4gaXQuXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjdXRlQmF0Y2hlc30uXG4gKi9cbmludGVyZmFjZSBFeGVjdXRlQmF0Y2hlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBjb21tYW5kIHdpdGhvdXQgYmF0Y2hlZCBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhdGNoZXMgb2YgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZXM6IHN0cmluZ1tdW107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBFeGVjT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKi9cbmludGVyZmFjZSBTcGF3blZpYVNoZWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWVyZ2VkIG92ZXIgdGhlIGluaGVyaXRlZCBjaGlsZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCdzIHN0ZGlvIHRvIHRoZSB0ZXJtaW5hbCBpbnN0ZWFkIG9mIHBpcGluZyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSkuXG4gICAqL1xuICByZWFkb25seSByYXdBcmd1bWVudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgbGluZSBhcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGFjdHVhbGx5IHNlZSBpdCwgd2hpY2ggb24gV2luZG93cyBpc1xuICogTk9UIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBwYXNzZWQgaW4uXG4gKlxuICoge0BsaW5rIHNwYXduVmlhU2hlbGx9IHJvdXRlcyB0aGUgY29tbWFuZCB0aHJvdWdoIGBjbWQuZXhlYCwgYW5kIHR3byB0aGluZ3MgYXJlIHNwZW50IGJldHdlZW4gaGVyZSBhbmRcbiAqIHRoZXJlLCBuZWl0aGVyIG9mIHRoZW0gdmlzaWJsZSBpbiB0aGUgYXNzZW1ibGVkIGNvbW1hbmQ6XG4gKiAtIE5vZGUncyBgc3Bhd24o4oCmLCB7IHNoZWxsOiB0cnVlIH0pYCB3cmFwcyBpdCBhcyBgPGNvbXNwZWM+IC9kIC9zIC9jIFwiPGNvbW1hbmQ+XCJgLlxuICogLSB7QGxpbmsgY21kRXNjYXBlQ29tbWFuZExpbmV9IGBeYC1lc2NhcGVzIGV2ZXJ5IG9uZSBvZiBgY21kLmV4ZWAncyBtZXRhY2hhcmFjdGVycywgd2hpY2ggb24gYSBsaXN0IG9mXG4gKiAgIHF1b3RlZCBwYXRocyBpcyBhIGZldyBwZXJjZW50IG9mIHRoZSB3aG9sZSAobWVhc3VyZWQ6ICsyMzYgY2hhcnMgb24gYSA3MjE2LWNoYXIgaW52b2NhdGlvbikuXG4gKlxuICogQm90aCBhcmUgb3VycyB0byBjb21wdXRlLCBzbyB0aGV5IGFyZSBjb21wdXRlZCByYXRoZXIgdGhhbiBndWVzc2VkLiBXaGF0IGlzIE5PVCBjb21wdXRhYmxlIGZyb20gaGVyZSBpc1xuICogd2hhdCB0aGUgc3Bhd25lZCBjb21tYW5kIGRvZXMgdG8gaXRzIG93biBhcmd1bWVudHMg4oCUIHNlZSB7QGxpbmsgV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRX0uXG4gKlxuICogVGhlIHBsYXRmb3JtIGJyYW5jaCBoZXJlIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKlxuICogQHBhcmFtIGNvbW1hbmRMaW5lIC0gVGhlIGFzc2VtYmxlZCBjb21tYW5kIGxpbmUsIGJlZm9yZSBhbnkgc2hlbGwgd3JhcHBpbmcuXG4gKiBAcmV0dXJucyBUaGUgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2Ygd2hhdCByZWFjaGVzIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoY29tbWFuZExpbmU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRMaW5lLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvbXNwZWMgPSBwcm9jZXNzLmVudlsnY29tc3BlYyddID8/ICdjbWQuZXhlJztcbiAgY29uc3QgQ01EX1dSQVBQRVIgPSAnIC9kIC9zIC9jIFwiXCInO1xuICByZXR1cm4gY29tc3BlYy5sZW5ndGggKyBDTURfV1JBUFBFUi5sZW5ndGggKyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZExpbmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aCB0byBzaXplIGFuIHtAbGluayBFeGVjQXJndW1lbnR9IGJhdGNoIGFnYWluc3Qg4oCUIHRoZSBwbGF0Zm9ybSBtYXhpbXVtXG4gKiBsZXNzIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhhbiB7QGxpbmsgZ2V0TWF4Q29tbWFuZExlbmd0aH0sIGJlY2F1c2UgdGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50XG4gKiBxdWVzdGlvbnMuIEV4Y2VlZGluZyB0aGUgcGxhaW4tY29tbWFuZCBsaW1pdCBpcyBhIGhhcmQgZmFpbHVyZSB0aGUgY2FsbGVyIGNhbm5vdCBhdm9pZCwgc28gdGhhdCBjaGVja1xuICogc3RheXMgZXhhY3QuIEV4Y2VlZGluZyB0aGUgYmF0Y2hpbmcgbGltaXQgb25seSBjb3N0cyBvbmUgZXh0cmEgaW52b2NhdGlvbiwgc28gdGhhdCBjaGVjayBtYXkg4oCUIGFuZFxuICogc2hvdWxkIOKAlCBsZWF2ZSByb29tIHRvIHNwYXJlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggbGVuZ3RoIGluIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGEgc2luZ2xlIGJhdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk6IG51bWJlciB7XG4gIHJldHVybiBnZXRNYXhDb21tYW5kTGVuZ3RoKCkgLSAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgOiAwKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBjb21tYW5kLWxpbmUgc3RyaW5nIGZyb20gYW4gYXJndW1lbnQgYXJyYXksIHF1b3RlZCBmb3IgdGhlIHNoZWxsIHRoYXRcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSB3aWxsIHJvdXRlIHRocm91Z2ggb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKlxuICogT24gV2luZG93cyB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYGNtZC5leGVgLCBzbyBpdCB1c2VzIHRoZVxuICogYENvbW1hbmRMaW5lVG9Bcmd2V2AgY29udmVudGlvbiAoe0BsaW5rIHRvQ29tbWFuZExpbmV9KTsge0BsaW5rIHNwYXduVmlhU2hlbGx9XG4gKiB0aGVuIGFwcGxpZXMge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBvbiB0b3AgZm9yIGBjbWQuZXhlYCBtZXRhY2hhcmFjdGVycy5cbiAqIEVsc2V3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYHNoIC1jYCwgc28gaXQgdXNlcyBQT1NJWCBzaW5nbGUtcXVvdGVcbiAqIHF1b3RpbmcgKHtAbGluayB0b1Bvc2l4Q29tbWFuZExpbmV9KSBhbmQgbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZy5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudCBhcnJheSB0byBxdW90ZSBhbmQgam9pbi5cbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgY29tbWFuZC1saW5lIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBzaGVsbC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kTGluZSgkYXJndW1lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gdG9Db21tYW5kTGluZSgkYXJndW1lbnRzKSA6IHRvUG9zaXhDb21tYW5kTGluZSgkYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgY29tbWFuZCByZWplY3RzIHdpdGgsIHNheWluZyBub3Qgb25seSBUSEFUIGl0IGZhaWxlZCBidXQgSE9XLlxuICpcbiAqIFRoZSBtZXNzYWdlIHVzZWQgdG8gYmUgYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDxuPmAgcGx1cyBzdGRlcnIsIHdoYXRldmVyIHRoZSBjb2RlLiBTbyBhIGNoaWxkIHRoYXRcbiAqIGNyYXNoZWQgYmVmb3JlIHdyaXRpbmcgYSBieXRlIGFuZCBhIGxpbnRlciB0aGF0IGZvdW5kIHJlYWwgcHJvYmxlbXMgcmVhZCB0aGUgc2FtZSwgZGlmZmVyaW5nIG9ubHkgaW4gYVxuICogbnVtYmVyIG5vYm9keSByZWFkcyBhcyBhIHN0YXR1czogYSBXaW5kb3dzIGFjY2VzcyB2aW9sYXRpb24gYXJyaXZlcyBhcyBgZXhpdCBjb2RlIDMyMjEyMjU0NzdgIHdpdGggbm90aGluZ1xuICogYWZ0ZXIgaXQsIGFuZCB3aG9ldmVyIHJlYWRzIGl0IGdvZXMgbG9va2luZyBmb3IgYSBmaW5kaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgdGhhdFxuICogY2FuIHRlbGwgdGhlIHR3byBhcGFydCDigJQgdGhlIGAuY21kYCBzaGltIGlzIHNwYXduZWQgZGlyZWN0bHksIHNvIHRoZSBjaGlsZCdzIHJhdyBjb2RlIGlzIHZpc2libGUgaGVyZSwgd2hpbGVcbiAqIGFuIGBucG0gcnVuYCBsYXllciBmdXJ0aGVyIG91dCBpcyBrbm93biB0byBsYXVuZGVyIGl0IGludG8gYSBwbGFpbiBgMWAuXG4gKlxuICogVHdvIHNpZ25hbHMgYXJlIHJlYWQsIGFuZCB0aGVpciBjb25qdW5jdGlvbiBpcyB3aGF0IGVhcm5zIHRoZSB3b3JkIFwiY3Jhc2hlZFwiOiB0aGUgdGVybWluYXRpb24gd2FzIGFibm9ybWFsXG4gKiAoYW4gTlRTVEFUVVMgZXJyb3IgY29kZSwgb3IgYSBzaWduYWwpLCBhbmQgbmVpdGhlciBzdHJlYW0gY2FycmllZCBhbnl0aGluZy4gQSB0b29sIGZhaWxpbmcgb24gaXRzIG93biB0ZXJtc1xuICogc2F5cyBzb21ldGhpbmc7IGEgY2hpbGQgdGhhdCBkaWVkIG1pZC1pbnN0cnVjdGlvbiBkb2VzIG5vdC4gVGhlIENBVVNFIG9mIHN1Y2ggYSBjcmFzaCBpcyBub3QgdGhpc1xuICogZnVuY3Rpb24ncyBidXNpbmVzcywgc28gdGhlIG1lc3NhZ2Ugb25seSBuYW1lcyBpdCBhbmQgc2F5cyB3aGF0IHRvIGRvLlxuICpcbiAqIFRoZSBgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgPG4+YCBwcmVmaXggaXMga2VwdCwgc28gYSBjYWxsZXIgbWF0Y2hpbmcgb24gaXQgc3RpbGwgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmYWlsdXJlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdEZhaWx1cmUocGFyYW1zOiBEZXNjcmliZUV4aXRGYWlsdXJlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb21tYW5kLCBleGl0Q29kZSwgZXhpdFNpZ25hbCwgaXNJbnRlcmFjdGl2ZSwgaXNRdWlldCwgc3RkZXJyLCBzdGRvdXQgfSA9IHBhcmFtcztcbiAgY29uc3QgbnRTdGF0dXMgPSB0b050U3RhdHVzKGV4aXRDb2RlKTtcblxuICBsZXQgc3RhdHVzID0gYGV4aXQgY29kZSAke2V4aXRDb2RlID09PSBudWxsID8gJyhudWxsKScgOiBTdHJpbmcoZXhpdENvZGUpfWA7XG4gIGxldCBhYm5vcm1hbFJlYXNvbjogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGlmIChudFN0YXR1cyAhPT0gbnVsbCkge1xuICAgIGNvbnN0IEhFWF9SQURJWCA9IDE2O1xuICAgIGNvbnN0IGhleCA9IGAweCR7bnRTdGF0dXMudG9TdHJpbmcoSEVYX1JBRElYKS50b1VwcGVyQ2FzZSgpfWA7XG4gICAgY29uc3QgbmFtZSA9IE5UU1RBVFVTX05BTUVTLmdldChoZXgpO1xuICAgIHN0YXR1cyArPSBgIChOVFNUQVRVUyAke25hbWUgPyBgJHtoZXh9ICR7bmFtZX1gIDogaGV4fSlgO1xuICAgIGFibm9ybWFsUmVhc29uID0gbmFtZSA9PT0gJ1NUQVRVU19DT05UUk9MX0NfRVhJVCcgPyAnd2FzIGludGVycnVwdGVkJyA6ICdjcmFzaGVkJztcbiAgfSBlbHNlIGlmIChleGl0U2lnbmFsICE9PSBudWxsKSB7XG4gICAgc3RhdHVzICs9IGAsIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZXhpdFNpZ25hbH1gO1xuICAgIGFibm9ybWFsUmVhc29uID0gYHdhcyBraWxsZWQgYnkgJHtleGl0U2lnbmFsfWA7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtgQ29tbWFuZCBmYWlsZWQgd2l0aCAke3N0YXR1c31gLCBgQ29tbWFuZDogJHt0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZCl9YF07XG5cbiAgaWYgKGFibm9ybWFsUmVhc29uICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaChcbiAgICAgICFpc0ludGVyYWN0aXZlICYmIHN0ZG91dCA9PT0gJycgJiYgc3RkZXJyID09PSAnJ1xuICAgICAgICA/IGBUaGUgY2hpbGQgcHJvY2VzcyAke2Fibm9ybWFsUmVhc29ufSBiZWZvcmUgd3JpdGluZyBhbnl0aGluZyB0byBzdGRvdXQgb3Igc3RkZXJyLiBUaGlzIGlzIG5vdCBhIGZhaWx1cmUgdGhlIHRvb2wgcmVwb3J0ZWQgKG5vdCBhIGxpbnQgZmluZGluZywgbm90IGEgdHlwZSBlcnJvcik6IHJlLXJ1biB0aGUgY29tbWFuZC5gXG4gICAgICAgIDogYFRoZSBjaGlsZCBwcm9jZXNzICR7YWJub3JtYWxSZWFzb259IHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93biwgc28gYW55IG91dHB1dCBpdCB3cm90ZSBtYXkgYmUgaW5jb21wbGV0ZS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgIT09ICcnKSB7XG4gICAgbGluZXMucHVzaChpc1F1aWV0ID8gYHN0ZG91dDpcXG4ke3N0ZG91dH1gIDogYHN0ZG91dDogJHtTdHJpbmcoc3Rkb3V0LnNwbGl0KCdcXG4nKS5sZW5ndGgpfSBsaW5lKHMpLCBwcmludGVkIGFib3ZlLmApO1xuICB9XG5cbiAgaWYgKHN0ZGVyciAhPT0gJycpIHtcbiAgICBsaW5lcy5wdXNoKGBzdGRlcnI6XFxuJHtzdGRlcnJ9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCDigJQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2VzcyDigJQgZXhjZXB0IHRoYXQgYW4gYWJub3JtYWwgdGVybWluYXRpb24gKGEgY3Jhc2gsIGFcbiAqIHNpZ25hbCkgaW4gYSBsYXRlciBiYXRjaCBvdXRyYW5rcyBhbiBvcmRpbmFyeSBmYWlsdXJlIGluIGFuIGVhcmxpZXIgb25lLiBPdGhlcndpc2UgYSBjcmFzaCBpbiBiYXRjaCAyIGFmdGVyXG4gKiByZWFsIGZpbmRpbmdzIGluIGJhdGNoIDEgd291bGQgYWdncmVnYXRlIHRvIHRoZSBmaW5kaW5ncycgZXhpdCBjb2RlLCBhbmQgYSBjYWxsZXIgY2xhc3NpZnlpbmcgdGhlIHJlc3VsdFxuICogd291bGQgbmV2ZXIgbGVhcm4gdGhhdCBwYXJ0IG9mIHRoZSBpbnB1dCB3YXMgbm90IGNoZWNrZWQgYXQgYWxsLlxuICpcbiAqIFNpbGVudCBiYXRjaGVzIGNvbnRyaWJ1dGUgbm90aGluZyB0byB0aGUgam9pbmVkIG91dHB1dC4gYGV4ZWNTdHJpbmdgIGFscmVhZHkgdHJpbXMgZWFjaCByZXN1bHQncyB0cmFpbGluZ1xuICogbmV3bGluZSwgc28gam9pbmluZyBlbXB0eSBvbmVzIGJhY2sgaW4gd291bGQgcmVpbnRyb2R1Y2UgZXhhY3RseSB0aGUgYmxhbmstbGluZSBub2lzZSBpdCByZW1vdmVkIOKAlCBhXG4gKiBjb21tYW5kIHRoYXQgcHJpbnRlZCBub3RoaW5nIG11c3QgYWdncmVnYXRlIHRvIGAnJ2AsIG5vdCB0byBhIHJ1biBvZiBuZXdsaW5lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBiYXRjaGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbmNhdGVuYXRlZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaGVzKHBhcmFtczogRXhlY3V0ZUJhdGNoZXNQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3QgeyBiYXNlQ29tbWFuZCwgYmF0Y2hlcywgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBzdGRvdXRQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyUGFydHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBmYWlsdXJlOiBFeGVjUmVzdWx0IHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgY29uc3QgYmF0Y2hDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShiYXRjaCl9YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGJhdGNoQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcHVzaElmTm90RW1wdHkoc3Rkb3V0UGFydHMsIHJlc3VsdC5zdGRvdXQpO1xuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZGVyclBhcnRzLCByZXN1bHQuc3RkZXJyKTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwICYmIChmYWlsdXJlID09PSBudWxsIHx8ICghaXNBYm5vcm1hbFRlcm1pbmF0aW9uKGZhaWx1cmUpICYmIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQpKSkpIHtcbiAgICAgIGZhaWx1cmUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkSW5jbHVkZURldGFpbHNcbiAgICA/IHtcbiAgICAgIC8vIE5vdCBgZmFpbHVyZT8uZXhpdENvZGUgPz8gMGA6IGEgYmF0Y2gga2lsbGVkIGJ5IGEgc2lnbmFsIGhhcyBhIGBudWxsYCBjb2RlLCB3aGljaCBgPz9gIHdvdWxkIHJlcG9ydCBhcyBzdWNjZXNzLlxuICAgICAgZXhpdENvZGU6IGZhaWx1cmUgPT09IG51bGwgPyAwIDogZmFpbHVyZS5leGl0Q29kZSxcbiAgICAgIGV4aXRTaWduYWw6IGZhaWx1cmU/LmV4aXRTaWduYWwgPz8gbnVsbCxcbiAgICAgIHN0ZGVycjogc3RkZXJyUGFydHMuam9pbignXFxuJyksXG4gICAgICBzdGRvdXQ6IHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpXG4gICAgfVxuICAgIDogc3Rkb3V0UGFydHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3NlcywgcmVzb2x2ZWQgYXQgc3Bhd24gdGltZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGEgbW9kdWxlLWxldmVsIGNvbnN0YW50LiBgLmVudmAgaXMgbG9hZGVkIGJ5IGBsb2FkRW52RmlsZUlmRXhpc3RzYCBmcm9tIGluc2lkZVxuICogYHdyYXBDbGlUYXNrYCwgYW5kIEVTTSBldmFsdWF0ZXMgZXZlcnkgaW1wb3J0IGJlZm9yZSB0aGUgZW50cnkgbW9kdWxlJ3MgZmlyc3Qgc3RhdGVtZW50IOKAlCBzbyBhXG4gKiBzbmFwc2hvdCB0YWtlbiBoZXJlIHdvdWxkIGFsd2F5cyBwcmVkYXRlIHRoZSBsb2FkLCBhbmQgZXZlcnkgc3Bhd25lZCBjaGlsZCB3b3VsZCBydW4gd2l0aG91dCB0aGVcbiAqIHJlcG8ncyBvd24gYC5lbnZgLiBOb3RoaW5nIHN1cmZhY2VkIHRoYXQgd2hpbGUgVml0ZXN0IDMgY29waWVkIHRoZSBgLmVudmAgaXQgbG9hZGVkIGludG8gdGhlXG4gKiB3b3JrZXIncyBgcHJvY2Vzcy5lbnZgOyBWaXRlc3QgNCB3cml0ZXMgdGhvc2UgdG8gYGltcG9ydC5tZXRhLmVudmAgb25seSwgbGVhdmluZyB0aGlzIHRoZSBzb2xlXG4gKiBwYXRoIGFuZCBhbiBlbXB0eSBvbmUuXG4gKlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMsIHJlZmxlY3RpbmcgYHByb2Nlc3MuZW52YCBhcyBpdCBzdGFuZHMgbm93LlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiBidWlsZENoaWxkRW52KHByb2Nlc3MuZW52LCBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFncyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgbWF4IGNvbW1hbmQgbGluZSBsZW5ndGguXG4gKlxuICogQHJldHVybnMgVGhlIG1heCBjb21tYW5kIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRNYXhDb21tYW5kTGVuZ3RoKCk6IG51bWJlciB7XG4gIGNvbnN0IFdJTkRPV1NfTUFYX0NPTU1BTkRfTEVOR1RIID0gODE5MTtcbiAgY29uc3QgVU5JWF9NQVhfQ09NTUFORF9MRU5HVEggPSAxMzFfMDcyO1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfTUFYX0NPTU1BTkRfTEVOR1RIIDogVU5JWF9NQVhfQ09NTUFORF9MRU5HVEg7XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGNvbW1hbmQgYXJyYXkgdGhhdCBtYXkgY29udGFpbiBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fS5cbiAqIFJldHVybnMgYSBQcm9taXNlIGlmIGJhdGNoaW5nIGlzIG5lZWRlZCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGNvbW1hbmRcbiAqIGhhcyBubyBFeGVjQXJnIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkIG5vcm1hbGx5LlxuICpcbiAqIEBwYXJhbSBwYXJ0cyAtIFRoZSBjb21tYW5kIHBhcnRzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgZXhlYyBvcHRpb25zLlxuICogQHJldHVybnMgQSBQcm9taXNlIGlmIGJhdGNoaW5nIGlzIGhhbmRsZWQsIG9yIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBoYW5kbGVCYXRjaGVkQ29tbWFuZChwYXJ0czogQ29tbWFuZFBhcnRbXSwgb3B0aW9uczogRXhlY09wdGlvbnMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhlY0FyZ3VtZW50cyA9IHBhcnRzLmZpbHRlcihpc0V4ZWNBcmd1bWVudCk7XG4gIGlmIChleGVjQXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGV4ZWNBcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ09ubHkgb25lIEV4ZWNBcmcgd2l0aCBiYXRjaGVkQXJndW1lbnRzIGlzIGFsbG93ZWQgcGVyIGNvbW1hbmQnKSk7XG4gIH1cblxuICBjb25zdCBleGVjQXJndW1lbnQgPSBleGVjQXJndW1lbnRzWzBdO1xuICBhc3NlcnROb25OdWxsYWJsZShleGVjQXJndW1lbnQpO1xuICBjb25zdCBzdGF0aWNQYXJ0cyA9IHBhcnRzLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gIGNvbnN0IGJhc2VDb21tYW5kID0gYnVpbGRDb21tYW5kTGluZShzdGF0aWNQYXJ0cyk7XG4gIGNvbnN0IG1heENvbW1hbmRMZW5ndGggPSBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKTtcblxuICAvLyBUcnkgZXhwYW5kaW5nIGFsbCBhcmdzIGlubGluZVxuICBjb25zdCBmdWxsQ29tbWFuZCA9IGAke2Jhc2VDb21tYW5kfSAke2J1aWxkQ29tbWFuZExpbmUoWy4uLmV4ZWNBcmd1bWVudC5iYXRjaGVkQXJndW1lbnRzXSl9YDtcbiAgaWYgKGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGZ1bGxDb21tYW5kKSA8PSBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGV4ZWNTdHJpbmcoe1xuICAgICAgY29tbWFuZDogZnVsbENvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICAvLyBTcGxpdCBpbnRvIGJhdGNoZXNcbiAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICBsZXQgY3VycmVudEJhdGNoOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYXJndW1lbnQgb2YgZXhlY0FyZ3VtZW50LmJhdGNoZWRBcmd1bWVudHMpIHtcbiAgICBjb25zdCB0ZW50YXRpdmUgPSBgJHtiYXNlQ29tbWFuZH0gJHtidWlsZENvbW1hbmRMaW5lKFsuLi5jdXJyZW50QmF0Y2gsIGFyZ3VtZW50XSl9YDtcbiAgICBpZiAoZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgodGVudGF0aXZlKSA+IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICAgIGlmIChjdXJyZW50QmF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHNwbGl0IGNvbW1hbmQgaW50byBiYXRjaGVzOiBhIHNpbmdsZSBhcmd1bWVudCAoJHtTdHJpbmcoYXJndW1lbnQubGVuZ3RoKX0gY2hhcnMpIHBsdXMgdGhlIGJhc2UgY29tbWFuZCAoJHtTdHJpbmcoYmFzZUNvbW1hbmQubGVuZ3RoKX0gY2hhcnMpIGV4Y2VlZHMgdGhlIG1heCBiYXRjaCBjb21tYW5kIGxlbmd0aCAoJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9KS5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XG4gICAgICBjdXJyZW50QmF0Y2ggPSBbYXJndW1lbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50QmF0Y2gucHVzaChhcmd1bWVudCk7XG4gICAgfVxuICB9XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbHdheXMgdHJ1ZSBhZnRlciB0aGUgbG9vcDsgYmF0Y2hlZEFyZ3VtZW50cyBpcyBub24tZW1wdHkgYXQgdGhpcyBwb2ludC4gKi9cbiAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRlQmF0Y2hlcyh7XG4gICAgYmFzZUNvbW1hbmQsXG4gICAgYmF0Y2hlcyxcbiAgICBvcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgcmVzdWx0IHJlY29yZHMgYW4gYWJub3JtYWwgdGVybWluYXRpb24g4oCUIGFuIE5UU1RBVFVTIGVycm9yIGNvZGUgb3IgYSBzaWduYWwg4oCUIHJhdGhlciB0aGFuXG4gKiB0aGUgY2hpbGQgZXhpdGluZyBvbiBpdHMgb3duIHdpdGggYSBjb2RlIG9mIGl0cyBjaG9vc2luZy5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNoaWxkIHRlcm1pbmF0ZWQgYWJub3JtYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNBYm5vcm1hbFRlcm1pbmF0aW9uKHJlc3VsdDogRXhlY1Jlc3VsdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVzdWx0LmV4aXRTaWduYWwgIT09IG51bGwgfHwgdG9OdFN0YXR1cyhyZXN1bHQuZXhpdENvZGUpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGNvbW1hbmQgcGFydCBpcyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fS5cbiAqXG4gKiBAcGFyYW0gcGFydCAtIFRoZSBjb21tYW5kIHBhcnQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXJ0IGlzIGFuIEV4ZWNBcmcuXG4gKi9cbmZ1bmN0aW9uIGlzRXhlY0FyZ3VtZW50KHBhcnQ6IENvbW1hbmRQYXJ0KTogcGFydCBpcyBFeGVjQXJndW1lbnQge1xuICByZXR1cm4gdHlwZW9mIHBhcnQgPT09ICdvYmplY3QnICYmICdiYXRjaGVkQXJndW1lbnRzJyBpbiBwYXJ0O1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYSBiYXRjaCdzIGNhcHR1cmVkIG91dHB1dCB0byB0aGUgYWNjdW11bGF0b3IsIHNraXBwaW5nIGFuIGVtcHR5IG9uZSBzbyB0aGUgZXZlbnR1YWwgam9pbiBkb2VzIG5vdFxuICogZmFicmljYXRlIGJsYW5rIGxpbmVzIGZvciBiYXRjaGVzIHRoYXQgcHJpbnRlZCBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBhY2N1bXVsYXRvciAtIFRoZSBjb2xsZWN0ZWQgb3V0cHV0cyBzbyBmYXIuXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIG91dHB1dCBvZiBhIHNpbmdsZSBiYXRjaC5cbiAqL1xuZnVuY3Rpb24gcHVzaElmTm90RW1wdHkoYWNjdW11bGF0b3I6IHN0cmluZ1tdLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAob3V0cHV0ICE9PSAnJykge1xuICAgIGFjY3VtdWxhdG9yLnB1c2gob3V0cHV0KTtcbiAgfVxufVxuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgdmlhIHRoZSBhcHByb3ByaWF0ZSBzaGVsbC5cbiAqXG4gKiBPbiBXaW5kb3dzLCBpZiB0aGUgY29tbWFuZCBjb250YWlucyBuZXdsaW5lcyAod2hpY2ggYGNtZC5leGVgIGNhbm5vdCBoYW5kbGUpXG4gKiBhbmQgdGhlIHJhdyBhcmdzIGFycmF5IGlzIGF2YWlsYWJsZSwgc3Bhd25zIHRoZSBwcm9jZXNzIGRpcmVjdGx5IHdpdGhvdXRcbiAqIGFueSBzaGVsbCDigJQgcGFzc2luZyBhcmdzIHZpYSBgQ3JlYXRlUHJvY2Vzc2AsIHdoaWNoIGF2b2lkcyBhbGwgcXVvdGluZyBpc3N1ZXMuXG4gKlxuICogT24gV2luZG93cyAoY21kLmV4ZSBwYXRoKSwgYXBwbGllcyBgXmAtZXNjYXBpbmcgZm9yIGNtZCBtZXRhY2hhcmFjdGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHNwYXduaW5nIHRoZSBjaGlsZCBwcm9jZXNzLlxuICogQHJldHVybnMgVGhlIHNwYXduZWQgY2hpbGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3Bhd25WaWFTaGVsbChwYXJhbXM6IFNwYXduVmlhU2hlbGxQYXJhbXMpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCB7IGNvbW1hbmQsIGN3ZCwgZW52OiBleHRyYUVudiwgaXNJbnRlcmFjdGl2ZSA9IGZhbHNlLCByYXdBcmd1bWVudHMgfSA9IHBhcmFtcztcbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHtcbiAgICAuLi5nZXRDaGlsZEVudigpLFxuICAgIC4uLmV4dHJhRW52XG4gIH07XG4gIGNvbnN0IHN0ZGlvOiAnaW5oZXJpdCcgfCAncGlwZScgPSBpc0ludGVyYWN0aXZlID8gJ2luaGVyaXQnIDogJ3BpcGUnO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiBjb21tYW5kLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgIGlmICghcmF3QXJndW1lbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbW1hbmRzIGNvbnRhaW5pbmcgbmV3bGluZXMgY2Fubm90IGJlIGV4ZWN1dGVkIHRocm91Z2ggY21kLmV4ZSBvbiBXaW5kb3dzLiBQYXNzIGFuIGFyZ3VtZW50IGFycmF5IGluc3RlYWQgb2YgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IFtwcm9ncmFtLCAuLi4kYXJndW1lbnRzXSA9IHJhd0FyZ3VtZW50cztcbiAgICBhc3NlcnROb25OdWxsYWJsZShwcm9ncmFtLCAnQ29tbWFuZCBhcnJheSBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICAgIHJldHVybiBzcGF3bihwcm9ncmFtLCAkYXJndW1lbnRzLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpb1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc2hlbGxDb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IGNvbW1hbmRFc2NhcGVDb21tYW5kTGluZShjb21tYW5kKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBzcGF3bihzaGVsbENvbW1hbmQsIFtdLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpb1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBleGl0IGNvZGUgYXMgYSBXaW5kb3dzIE5UU1RBVFVTIGVycm9yLCBpZiBpdCBpcyBvbmUuXG4gKlxuICogQSBjcmFzaGVkIHByb2Nlc3Mgb24gV2luZG93cyBleGl0cyB3aXRoIHRoZSBOVFNUQVRVUyBvZiB0aGUgZXhjZXB0aW9uIHRoYXQga2lsbGVkIGl0LCBhbmQgYSBgLmNtZGAgc2hpbVxuICogZm9yd2FyZHMgaXRzIGlubmVyIHByb2Nlc3MncyBjb2RlLCBzbyBhIGNyYXNoZWQgYG5vZGUuZXhlYCBhcnJpdmVzIGhlcmUgaW50YWN0IOKAlCBgMHhDMDAwMDAwNWAgYXNcbiAqIGAzMjIxMjI1NDc3YC4gVGhlIHRlc3QgaXMgdGhlIE5UU1RBVFVTIGxheW91dCByYXRoZXIgdGhhbiBhIGJhcmUgYD49IDB4QzAwMDAwMDBgOiB0aGUgdG9wIHR3byBiaXRzIGFyZSB0aGVcbiAqIGVycm9yIHNldmVyaXR5IGFuZCB0aGUgbmV4dCBvbmUgaXMgdGhlIGN1c3RvbWVyIGZsYWcsIHdoaWNoIG11c3QgYmUgY2xlYXIuIFRoYXQga2VlcHMgb3V0IHR3byBjb2RlcyBhIGJhcmVcbiAqIHJhbmdlIHdvdWxkIG1pc3JlYWQg4oCUIGBwcm9jZXNzLmV4aXQoLTEpYCwgd2hpY2ggV2luZG93cyByZXBvcnRzIGFzIGAweEZGRkZGRkZGYCwgYW5kIHRoZSBgMHhFMDZENzM2M2Agb2YgYW5cbiAqIHVuaGFuZGxlZCBDKysgZXhjZXB0aW9uLCB3aGljaCBpcyBhIGNyYXNoIGJ1dCBub3QgYW4gTlRTVEFUVVMuIEEgc2lnbmVkIHJlYWRpbmcgb2YgdGhlIHNhbWUgY29kZSBpcyBhY2NlcHRlZFxuICogdG9vLiBObyBsaW50ZXIsIGNvbXBpbGVyIG9yIHRlc3QgcnVubmVyIHJldHVybnMgYSBjb2RlIG9mIHRoaXMgc2hhcGUgYXMgYSBjb3VudCBvZiBmaW5kaW5ncy5cbiAqXG4gKiBAcGFyYW0gZXhpdENvZGUgLSBUaGUgZXhpdCBjb2RlIHRoZSBjaGlsZCByZXBvcnRlZC5cbiAqIEByZXR1cm5zIFRoZSBjb2RlIGFzIGFuIHVuc2lnbmVkIE5UU1RBVFVTLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3QgYW4gTlRTVEFUVVMgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIHRvTnRTdGF0dXMoZXhpdENvZGU6IG51bGwgfCBudW1iZXIpOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKGV4aXRDb2RlID09PSBudWxsIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihleGl0Q29kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEVycm9yIHNldmVyaXR5ICh0b3AgdHdvIGJpdHMgc2V0KSB3aXRoIHRoZSBjdXN0b21lciBiaXQgY2xlYXIgaXMgZXhhY3RseSB0aGUgcmFuZ2UgWzB4QzAwMDAwMDAsIDB4RTAwMDAwMDApLlxuICBjb25zdCBOVFNUQVRVU19FUlJPUl9TVEFSVCA9IDB4QzBfMDBfMDBfMDA7XG4gIGNvbnN0IE5UU1RBVFVTX0VSUk9SX0VORCA9IDB4RTBfMDBfMDBfMDA7XG4gIGNvbnN0IFVJTlQzMl9SQU5HRSA9IDB4MV8wMF8wMF8wMF8wMDtcbiAgY29uc3QgdW5zaWduZWQgPSBleGl0Q29kZSA8IDAgPyBleGl0Q29kZSArIFVJTlQzMl9SQU5HRSA6IGV4aXRDb2RlO1xuICByZXR1cm4gdW5zaWduZWQgPj0gTlRTVEFUVVNfRVJST1JfU1RBUlQgJiYgdW5zaWduZWQgPCBOVFNUQVRVU19FUlJPUl9FTkQgPyB1bnNpZ25lZCA6IG51bGw7XG59XG5cbi8qKlxuICogU2hvcnRlbnMgYSBjb21tYW5kIGZvciBxdW90aW5nIGluIGFuIGVycm9yIG1lc3NhZ2UsIGtlZXBpbmcgaXRzIHN0YXJ0LCB3aGljaCBuYW1lcyB0aGUgcHJvZ3JhbS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHNob3J0ZW4uXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCwgY3V0IHRvIHtAbGluayBNQVhfQ09NTUFORF9MRU5HVEhfSU5fTUVTU0FHRX0gY2hhcmFjdGVycyBwbHVzIGFuIGVsbGlwc2lzIHdoZW4gbG9uZ2VyLlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQubGVuZ3RoID4gTUFYX0NPTU1BTkRfTEVOR1RIX0lOX01FU1NBR0UgPyBgJHtjb21tYW5kLnNsaWNlKDAsIE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFKX3igKZgIDogY29tbWFuZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsbUJBQStCO0FBQy9CLDBCQUE0QztBQUM1QyxvQkFBd0I7QUFDeEIseUJBQWtDO0FBQ2xDLGdDQUFzQjtBQUN0QiwwQkFBb0I7QUFFcEIsdUJBSU87QUEwSkEsU0FBUyxpQkFBaUIscUJBQXlDLFFBQXdCO0FBQ2hHLFFBQU0sV0FBVyx1QkFBdUIsSUFBSSxLQUFLO0FBQ2pELE1BQUksWUFBWSxJQUFJO0FBQ2xCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxRQUFRLE1BQU0sS0FBSyxFQUFFLFNBQVMsTUFBTSxJQUFJLFVBQVUsR0FBRyxPQUFPLElBQUksTUFBTTtBQUMvRTtBQWFPLFNBQVMsY0FBYyxTQUE0Qiw2QkFBcUU7QUFDN0gsU0FBTztBQUFBLElBQ0wsY0FBYztBQUFBLElBQ2QsR0FBRztBQUFBLElBQ0gsR0FBSSw0QkFBNEIsSUFBSSxxQkFBcUIsS0FBSyxFQUFFLGNBQWMsaUJBQWlCLFFBQVEsY0FBYyxHQUFHLHlCQUF5QixFQUFFO0FBQUEsRUFDcko7QUFDRjtBQTBDTyxTQUFTLEtBQUssU0FBaUMsVUFBdUIsQ0FBQyxHQUFpQztBQUM3RyxNQUFJLE1BQU0sUUFBUSxPQUFPLEdBQUc7QUFD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
|
package/dist/lib/cjs/exec.d.cts
CHANGED
|
@@ -161,3 +161,34 @@ export declare function exec(command: CommandPart[] | string, options?: ExecSimp
|
|
|
161
161
|
* the error is resolved with the stdout and stderr.
|
|
162
162
|
*/
|
|
163
163
|
export declare function exec(command: CommandPart[] | string, options: ExecDetailedOptions): Promise<ExecResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Returns the length of the command line as the operating system will actually see it, which on Windows is
|
|
166
|
+
* NOT the length of the string passed in.
|
|
167
|
+
*
|
|
168
|
+
* {@link spawnViaShell} routes the command through `cmd.exe`, and two things are spent between here and
|
|
169
|
+
* there, neither of them visible in the assembled command:
|
|
170
|
+
* - Node's `spawn(…, { shell: true })` wraps it as `<comspec> /d /s /c "<command>"`.
|
|
171
|
+
* - {@link cmdEscapeCommandLine} `^`-escapes every one of `cmd.exe`'s metacharacters, which on a list of
|
|
172
|
+
* quoted paths is a few percent of the whole (measured: +236 chars on a 7216-char invocation).
|
|
173
|
+
*
|
|
174
|
+
* Both are ours to compute, so they are computed rather than guessed. What is NOT computable from here is
|
|
175
|
+
* what the spawned command does to its own arguments — see {@link WINDOWS_CHILD_EXPANSION_RESERVE}.
|
|
176
|
+
*
|
|
177
|
+
* The platform branch here MUST stay in sync with the one in {@link spawnViaShell}.
|
|
178
|
+
*
|
|
179
|
+
* @param commandLine - The assembled command line, before any shell wrapping.
|
|
180
|
+
* @returns The length in characters of what reaches the operating system.
|
|
181
|
+
*/
|
|
182
|
+
export declare function getEffectiveCommandLineLength(commandLine: string): number;
|
|
183
|
+
/**
|
|
184
|
+
* Returns the max command line length to size an {@link ExecArgument} batch against — the platform maximum
|
|
185
|
+
* less {@link WINDOWS_CHILD_EXPANSION_RESERVE}.
|
|
186
|
+
*
|
|
187
|
+
* Deliberately more conservative than {@link getMaxCommandLength}, because the two answer different
|
|
188
|
+
* questions. Exceeding the plain-command limit is a hard failure the caller cannot avoid, so that check
|
|
189
|
+
* stays exact. Exceeding the batching limit only costs one extra invocation, so that check may — and
|
|
190
|
+
* should — leave room to spare.
|
|
191
|
+
*
|
|
192
|
+
* @returns The max length in characters available to a single batch.
|
|
193
|
+
*/
|
|
194
|
+
export declare function getMaxBatchCommandLength(): number;
|