@chneau/x 0.0.70 → 0.0.71
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/package.json +1 -1
- package/x.js +38 -12
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "name": "@chneau/x", "version": "0.0.
|
|
1
|
+
{ "name": "@chneau/x", "version": "0.0.71", "bin": "x.js" }
|
package/x.js
CHANGED
|
@@ -618,7 +618,7 @@ var require_command = __commonJS((exports) => {
|
|
|
618
618
|
}
|
|
619
619
|
var EventEmitter = import.meta.require("events").EventEmitter;
|
|
620
620
|
var childProcess = import.meta.require("child_process");
|
|
621
|
-
var
|
|
621
|
+
var path2 = import.meta.require("path");
|
|
622
622
|
var fs = import.meta.require("fs");
|
|
623
623
|
var process = import.meta.require("process");
|
|
624
624
|
var { Argument, humanReadableArgName } = require_argument();
|
|
@@ -1113,10 +1113,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1113
1113
|
let launchWithNode = false;
|
|
1114
1114
|
const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"];
|
|
1115
1115
|
function findFile(baseDir, baseName) {
|
|
1116
|
-
const localBin =
|
|
1116
|
+
const localBin = path2.resolve(baseDir, baseName);
|
|
1117
1117
|
if (fs.existsSync(localBin))
|
|
1118
1118
|
return localBin;
|
|
1119
|
-
if (sourceExt.includes(
|
|
1119
|
+
if (sourceExt.includes(path2.extname(baseName)))
|
|
1120
1120
|
return;
|
|
1121
1121
|
const foundExt = sourceExt.find((ext) => fs.existsSync(`${localBin}${ext}`));
|
|
1122
1122
|
if (foundExt)
|
|
@@ -1134,19 +1134,19 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1134
1134
|
} catch (err) {
|
|
1135
1135
|
resolvedScriptPath = this._scriptPath;
|
|
1136
1136
|
}
|
|
1137
|
-
executableDir =
|
|
1137
|
+
executableDir = path2.resolve(path2.dirname(resolvedScriptPath), executableDir);
|
|
1138
1138
|
}
|
|
1139
1139
|
if (executableDir) {
|
|
1140
1140
|
let localFile = findFile(executableDir, executableFile);
|
|
1141
1141
|
if (!localFile && !subcommand._executableFile && this._scriptPath) {
|
|
1142
|
-
const legacyName =
|
|
1142
|
+
const legacyName = path2.basename(this._scriptPath, path2.extname(this._scriptPath));
|
|
1143
1143
|
if (legacyName !== this._name) {
|
|
1144
1144
|
localFile = findFile(executableDir, `${legacyName}-${subcommand._name}`);
|
|
1145
1145
|
}
|
|
1146
1146
|
}
|
|
1147
1147
|
executableFile = localFile || executableFile;
|
|
1148
1148
|
}
|
|
1149
|
-
launchWithNode = sourceExt.includes(
|
|
1149
|
+
launchWithNode = sourceExt.includes(path2.extname(executableFile));
|
|
1150
1150
|
let proc;
|
|
1151
1151
|
if (process.platform !== "win32") {
|
|
1152
1152
|
if (launchWithNode) {
|
|
@@ -1708,13 +1708,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1708
1708
|
return this;
|
|
1709
1709
|
}
|
|
1710
1710
|
nameFromFilename(filename) {
|
|
1711
|
-
this._name =
|
|
1711
|
+
this._name = path2.basename(filename, path2.extname(filename));
|
|
1712
1712
|
return this;
|
|
1713
1713
|
}
|
|
1714
|
-
executableDir(
|
|
1715
|
-
if (
|
|
1714
|
+
executableDir(path3) {
|
|
1715
|
+
if (path3 === undefined)
|
|
1716
1716
|
return this._executableDir;
|
|
1717
|
-
this._executableDir =
|
|
1717
|
+
this._executableDir = path3;
|
|
1718
1718
|
return this;
|
|
1719
1719
|
}
|
|
1720
1720
|
helpInformation(contextOptions) {
|
|
@@ -1844,6 +1844,32 @@ var require_commander = __commonJS((exports) => {
|
|
|
1844
1844
|
exports.InvalidOptionArgumentError = InvalidArgumentError;
|
|
1845
1845
|
});
|
|
1846
1846
|
|
|
1847
|
+
// fixPath.ts
|
|
1848
|
+
var path = Bun.env.PATH;
|
|
1849
|
+
var home = Bun.env.HOME;
|
|
1850
|
+
if (!path)
|
|
1851
|
+
throw new Error("\u274C PATH is not set");
|
|
1852
|
+
if (!home)
|
|
1853
|
+
throw new Error("\u274C HOME is not set");
|
|
1854
|
+
var splittedPath = path.split(":");
|
|
1855
|
+
splittedPath.push(`${home}/.pulumi/bin`);
|
|
1856
|
+
splittedPath.push(`${home}/.deno/bin`);
|
|
1857
|
+
splittedPath.push(`${home}/.bun/bin`);
|
|
1858
|
+
splittedPath.push(`${home}/go/bin`);
|
|
1859
|
+
splittedPath.push(`${home}/.arkade/bin`);
|
|
1860
|
+
splittedPath.push(`${home}/.krew/bin`);
|
|
1861
|
+
splittedPath.push(`${home}/.cargo/bin`);
|
|
1862
|
+
splittedPath.push(`${home}/.dotnet`);
|
|
1863
|
+
splittedPath.push(`${home}/.dotnet/tools`);
|
|
1864
|
+
splittedPath.push(`${home}/.go/bin`);
|
|
1865
|
+
splittedPath.push(`${home}/.local/bin`);
|
|
1866
|
+
splittedPath.push(`${home}/bin`);
|
|
1867
|
+
splittedPath.push(`${home}/snap/bin`);
|
|
1868
|
+
splittedPath.push(`${home}/usr/local/sbin`);
|
|
1869
|
+
splittedPath.push(`${home}/usr/sbin`);
|
|
1870
|
+
splittedPath.push(`${home}/sbin`);
|
|
1871
|
+
Bun.env.PATH = splittedPath.join(":");
|
|
1872
|
+
|
|
1847
1873
|
// node_modules/commander/esm.mjs
|
|
1848
1874
|
var import_ = __toESM(require_commander(), 1);
|
|
1849
1875
|
var {
|
|
@@ -2226,5 +2252,5 @@ program2.command("system").description("Update/install the system packages").act
|
|
|
2226
2252
|
program2.command("doctor").description("Check the system for issues").action(commandDoctor);
|
|
2227
2253
|
program2.parse();
|
|
2228
2254
|
|
|
2229
|
-
//# debugId=
|
|
2230
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvYXJndW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvaGVscC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9vcHRpb24uanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvc3VnZ2VzdFNpbWlsYXIuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvY29tbWFuZC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9jb21tYW5kZXIvZXNtLm1qcyIsICJjb21tYW5kRG9jdG9yLnRzIiwgImhlbHBlcnMudHMiLCAicGtncy50cyIsICJjb21tYW5kU3lzdGVtLnRzIiwgImNvbW1hbmRVcGRhdGUudHMiLCAiZmV0Y2hMYXRlc3RWZXJzaW9uLnRzIiwgImluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAqL1xuY2xhc3MgQ29tbWFuZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBDb21tYW5kZXJFcnJvciBjbGFzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgc3VnZ2VzdGVkIGV4aXQgY29kZSB3aGljaCBjb3VsZCBiZSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBwcm9wZXJseSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIE5vZGUuanNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgdGhpcy5uZXN0ZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgQ29tbWFuZGVyRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgSW52YWxpZEFyZ3VtZW50RXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBleHBsYW5hdGlvbiBvZiB3aHkgYXJndW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKDEsICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50JywgbWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbiIsCiAgICAiY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9lcnJvci5qcycpO1xuXG5jbGFzcyBBcmd1bWVudCB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgbmV3IGNvbW1hbmQgYXJndW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgZGVzY3JpcHRpb24uXG4gICAqIFRoZSBkZWZhdWx0IGlzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHJlcXVpcmVkLCBhbmQgeW91IGNhbiBleHBsaWNpdGx5XG4gICAqIGluZGljYXRlIHRoaXMgd2l0aCA8PiBhcm91bmQgdGhlIG5hbWUuIFB1dCBbXSBhcm91bmQgdGhlIG5hbWUgZm9yIGFuIG9wdGlvbmFsIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiB8fCAnJztcbiAgICB0aGlzLnZhcmlhZGljID0gZmFsc2U7XG4gICAgdGhpcy5wYXJzZUFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXJnQ2hvaWNlcyA9IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAobmFtZVswXSkge1xuICAgICAgY2FzZSAnPCc6IC8vIGUuZy4gPHJlcXVpcmVkPlxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWUuc2xpY2UoMSwgLTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1snOiAvLyBlLmcuIFtvcHRpb25hbF1cbiAgICAgICAgdGhpcy5yZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbmFtZS5sZW5ndGggPiAzICYmIHRoaXMuX25hbWUuc2xpY2UoLTMpID09PSAnLi4uJykge1xuICAgICAgdGhpcy52YXJpYWRpYyA9IHRydWU7XG4gICAgICB0aGlzLl9uYW1lID0gdGhpcy5fbmFtZS5zbGljZSgwLCAtMyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhcmd1bWVudCBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvKipcbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2NvbmNhdFZhbHVlKHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChwcmV2aW91cyA9PT0gdGhpcy5kZWZhdWx0VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXMuY29uY2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUsIGFuZCBvcHRpb25hbGx5IHN1cHBseSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fVxuICAgKi9cblxuICBkZWZhdWx0KHZhbHVlLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgQ0xJIGNvbW1hbmQgYXJndW1lbnRzIGludG8gYXJndW1lbnQgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fVxuICAgKi9cblxuICBhcmdQYXJzZXIoZm4pIHtcbiAgICB0aGlzLnBhcnNlQXJnID0gZm47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT25seSBhbGxvdyBhcmd1bWVudCB2YWx1ZSB0byBiZSBvbmUgb2YgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fVxuICAgKi9cblxuICBjaG9pY2VzKHZhbHVlcykge1xuICAgIHRoaXMuYXJnQ2hvaWNlcyA9IHZhbHVlcy5zbGljZSgpO1xuICAgIHRoaXMucGFyc2VBcmcgPSAoYXJnLCBwcmV2aW91cykgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFyZ0Nob2ljZXMuaW5jbHVkZXMoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEFsbG93ZWQgY2hvaWNlcyBhcmUgJHt0aGlzLmFyZ0Nob2ljZXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZhcmlhZGljKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25jYXRWYWx1ZShhcmcsIHByZXZpb3VzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFyZ3VtZW50IHJlcXVpcmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJndW1lbnR9XG4gICAqL1xuICBhcmdSZXF1aXJlZCgpIHtcbiAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFyZ3VtZW50IG9wdGlvbmFsLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJndW1lbnR9XG4gICAqL1xuICBhcmdPcHRpb25hbCgpIHtcbiAgICB0aGlzLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBhbiBhcmd1bWVudCBhbmQgcmV0dXJucyBpdHMgaHVtYW4gcmVhZGFibGUgZXF1aXZhbGVudCBmb3IgaGVscCB1c2FnZS5cbiAqXG4gKiBAcGFyYW0ge0FyZ3VtZW50fSBhcmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKSB7XG4gIGNvbnN0IG5hbWVPdXRwdXQgPSBhcmcubmFtZSgpICsgKGFyZy52YXJpYWRpYyA9PT0gdHJ1ZSA/ICcuLi4nIDogJycpO1xuXG4gIHJldHVybiBhcmcucmVxdWlyZWQgPyAnPCcgKyBuYW1lT3V0cHV0ICsgJz4nIDogJ1snICsgbmFtZU91dHB1dCArICddJztcbn1cblxuZXhwb3J0cy5Bcmd1bWVudCA9IEFyZ3VtZW50O1xuZXhwb3J0cy5odW1hblJlYWRhYmxlQXJnTmFtZSA9IGh1bWFuUmVhZGFibGVBcmdOYW1lO1xuIiwKICAgICJjb25zdCB7IGh1bWFuUmVhZGFibGVBcmdOYW1lIH0gPSByZXF1aXJlKCcuL2FyZ3VtZW50LmpzJyk7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBpbXBvcnQgdHlwZXMgZm9yIEpTRG9jLCB1c2VkIGJ5IFZpc3VhbCBTdHVkaW8gQ29kZSBJbnRlbGxpU2Vuc2UgYW5kIGBucG0gcnVuIHR5cGVzY3JpcHQtY2hlY2tKU2BcbiAqIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2pzZG9jLXN1cHBvcnRlZC10eXBlcy5odG1sI2ltcG9ydC10eXBlc1xuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL2FyZ3VtZW50LmpzXCIpLkFyZ3VtZW50IH0gQXJndW1lbnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9jb21tYW5kLmpzXCIpLkNvbW1hbmQgfSBDb21tYW5kXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vb3B0aW9uLmpzXCIpLk9wdGlvbiB9IE9wdGlvblxuICovXG5cbi8vIEFsdGhvdWdoIHRoaXMgaXMgYSBjbGFzcywgbWV0aG9kcyBhcmUgc3RhdGljIGluIHN0eWxlIHRvIGFsbG93IG92ZXJyaWRlIHVzaW5nIHN1YmNsYXNzIG9yIGp1c3QgZnVuY3Rpb25zLlxuY2xhc3MgSGVscCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVscFdpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc29ydFN1YmNvbW1hbmRzID0gZmFsc2U7XG4gICAgdGhpcy5zb3J0T3B0aW9ucyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0dsb2JhbE9wdGlvbnMgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgc3ViY29tbWFuZHMuIEluY2x1ZGVzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBpbXBsaWNpdCBoZWxwIGNvbW1hbmQsIGlmIHRoZXJlIGlzIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge0NvbW1hbmRbXX1cbiAgICovXG5cbiAgdmlzaWJsZUNvbW1hbmRzKGNtZCkge1xuICAgIGNvbnN0IHZpc2libGVDb21tYW5kcyA9IGNtZC5jb21tYW5kcy5maWx0ZXIoKGNtZCkgPT4gIWNtZC5faGlkZGVuKTtcbiAgICBjb25zdCBoZWxwQ29tbWFuZCA9IGNtZC5fZ2V0SGVscENvbW1hbmQoKTtcbiAgICBpZiAoaGVscENvbW1hbmQgJiYgIWhlbHBDb21tYW5kLl9oaWRkZW4pIHtcbiAgICAgIHZpc2libGVDb21tYW5kcy5wdXNoKGhlbHBDb21tYW5kKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydFN1YmNvbW1hbmRzKSB7XG4gICAgICB2aXNpYmxlQ29tbWFuZHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIG92ZXJsb2FkZWQgcmV0dXJuIHR5cGVcbiAgICAgICAgcmV0dXJuIGEubmFtZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lKCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlQ29tbWFuZHM7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBvcHRpb25zIGZvciBzb3J0LlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gYVxuICAgKiBAcGFyYW0ge09wdGlvbn0gYlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgY29tcGFyZU9wdGlvbnMoYSwgYikge1xuICAgIGNvbnN0IGdldFNvcnRLZXkgPSAob3B0aW9uKSA9PiB7XG4gICAgICAvLyBXWVNJV1lHIGZvciBvcmRlciBkaXNwbGF5ZWQgaW4gaGVscC4gU2hvcnQgdXNlZCBmb3IgY29tcGFyaXNvbiBpZiBwcmVzZW50LiBObyBzcGVjaWFsIGhhbmRsaW5nIGZvciBuZWdhdGVkLlxuICAgICAgcmV0dXJuIG9wdGlvbi5zaG9ydFxuICAgICAgICA/IG9wdGlvbi5zaG9ydC5yZXBsYWNlKC9eLS8sICcnKVxuICAgICAgICA6IG9wdGlvbi5sb25nLnJlcGxhY2UoL14tLS8sICcnKTtcbiAgICB9O1xuICAgIHJldHVybiBnZXRTb3J0S2V5KGEpLmxvY2FsZUNvbXBhcmUoZ2V0U29ydEtleShiKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSB2aXNpYmxlIG9wdGlvbnMuIEluY2x1ZGVzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBpbXBsaWNpdCBoZWxwIG9wdGlvbiwgaWYgdGhlcmUgaXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7T3B0aW9uW119XG4gICAqL1xuXG4gIHZpc2libGVPcHRpb25zKGNtZCkge1xuICAgIGNvbnN0IHZpc2libGVPcHRpb25zID0gY21kLm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uaGlkZGVuKTtcbiAgICAvLyBCdWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICBjb25zdCBoZWxwT3B0aW9uID0gY21kLl9nZXRIZWxwT3B0aW9uKCk7XG4gICAgaWYgKGhlbHBPcHRpb24gJiYgIWhlbHBPcHRpb24uaGlkZGVuKSB7XG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IGhpZGUgY29uZmxpY3RpbmcgZmxhZ3MuIEJpdCBkdWJpb3VzIGJ1dCBhIGhpc3RvcmljYWwgYmVoYXZpb3VyIHRoYXQgaXMgY29udmVuaWVudCBmb3Igc2luZ2xlLWNvbW1hbmQgcHJvZ3JhbXMuXG4gICAgICBjb25zdCByZW1vdmVTaG9ydCA9IGhlbHBPcHRpb24uc2hvcnQgJiYgY21kLl9maW5kT3B0aW9uKGhlbHBPcHRpb24uc2hvcnQpO1xuICAgICAgY29uc3QgcmVtb3ZlTG9uZyA9IGhlbHBPcHRpb24ubG9uZyAmJiBjbWQuX2ZpbmRPcHRpb24oaGVscE9wdGlvbi5sb25nKTtcbiAgICAgIGlmICghcmVtb3ZlU2hvcnQgJiYgIXJlbW92ZUxvbmcpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChoZWxwT3B0aW9uKTsgLy8gbm8gY2hhbmdlcyBuZWVkZWRcbiAgICAgIH0gZWxzZSBpZiAoaGVscE9wdGlvbi5sb25nICYmICFyZW1vdmVMb25nKSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goXG4gICAgICAgICAgY21kLmNyZWF0ZU9wdGlvbihoZWxwT3B0aW9uLmxvbmcsIGhlbHBPcHRpb24uZGVzY3JpcHRpb24pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChoZWxwT3B0aW9uLnNob3J0ICYmICFyZW1vdmVTaG9ydCkge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKFxuICAgICAgICAgIGNtZC5jcmVhdGVPcHRpb24oaGVscE9wdGlvbi5zaG9ydCwgaGVscE9wdGlvbi5kZXNjcmlwdGlvbiksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnRPcHRpb25zKSB7XG4gICAgICB2aXNpYmxlT3B0aW9ucy5zb3J0KHRoaXMuY29tcGFyZU9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaWJsZU9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSB2aXNpYmxlIGdsb2JhbCBvcHRpb25zLiAoTm90IGluY2x1ZGluZyBoZWxwLilcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge09wdGlvbltdfVxuICAgKi9cblxuICB2aXNpYmxlR2xvYmFsT3B0aW9ucyhjbWQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd0dsb2JhbE9wdGlvbnMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IGdsb2JhbE9wdGlvbnMgPSBbXTtcbiAgICBmb3IgKFxuICAgICAgbGV0IGFuY2VzdG9yQ21kID0gY21kLnBhcmVudDtcbiAgICAgIGFuY2VzdG9yQ21kO1xuICAgICAgYW5jZXN0b3JDbWQgPSBhbmNlc3RvckNtZC5wYXJlbnRcbiAgICApIHtcbiAgICAgIGNvbnN0IHZpc2libGVPcHRpb25zID0gYW5jZXN0b3JDbWQub3B0aW9ucy5maWx0ZXIoXG4gICAgICAgIChvcHRpb24pID0+ICFvcHRpb24uaGlkZGVuLFxuICAgICAgKTtcbiAgICAgIGdsb2JhbE9wdGlvbnMucHVzaCguLi52aXNpYmxlT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnRPcHRpb25zKSB7XG4gICAgICBnbG9iYWxPcHRpb25zLnNvcnQodGhpcy5jb21wYXJlT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBnbG9iYWxPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgYXJndW1lbnRzIGlmIGFueSBoYXZlIGEgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudFtdfVxuICAgKi9cblxuICB2aXNpYmxlQXJndW1lbnRzKGNtZCkge1xuICAgIC8vIFNpZGUgZWZmZWN0ISBBcHBseSB0aGUgbGVnYWN5IGRlc2NyaXB0aW9ucyBiZWZvcmUgdGhlIGFyZ3VtZW50cyBhcmUgZGlzcGxheWVkLlxuICAgIGlmIChjbWQuX2FyZ3NEZXNjcmlwdGlvbikge1xuICAgICAgY21kLnJlZ2lzdGVyZWRBcmd1bWVudHMuZm9yRWFjaCgoYXJndW1lbnQpID0+IHtcbiAgICAgICAgYXJndW1lbnQuZGVzY3JpcHRpb24gPVxuICAgICAgICAgIGFyZ3VtZW50LmRlc2NyaXB0aW9uIHx8IGNtZC5fYXJnc0Rlc2NyaXB0aW9uW2FyZ3VtZW50Lm5hbWUoKV0gfHwgJyc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGFyZ3VtZW50cyB3aXRoIGEgZGVzY3JpcHRpb24gdGhlbiByZXR1cm4gYWxsIHRoZSBhcmd1bWVudHMuXG4gICAgaWYgKGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzLmZpbmQoKGFyZ3VtZW50KSA9PiBhcmd1bWVudC5kZXNjcmlwdGlvbikpIHtcbiAgICAgIHJldHVybiBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29tbWFuZCB0ZXJtIHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIHN1YmNvbW1hbmRUZXJtKGNtZCkge1xuICAgIC8vIExlZ2FjeS4gSWdub3JlcyBjdXN0b20gdXNhZ2Ugc3RyaW5nLCBhbmQgbmVzdGVkIGNvbW1hbmRzLlxuICAgIGNvbnN0IGFyZ3MgPSBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50c1xuICAgICAgLm1hcCgoYXJnKSA9PiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gKFxuICAgICAgY21kLl9uYW1lICtcbiAgICAgIChjbWQuX2FsaWFzZXNbMF0gPyAnfCcgKyBjbWQuX2FsaWFzZXNbMF0gOiAnJykgK1xuICAgICAgKGNtZC5vcHRpb25zLmxlbmd0aCA/ICcgW29wdGlvbnNdJyA6ICcnKSArIC8vIHNpbXBsaXN0aWMgY2hlY2sgZm9yIG5vbi1oZWxwIG9wdGlvblxuICAgICAgKGFyZ3MgPyAnICcgKyBhcmdzIDogJycpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9wdGlvbiB0ZXJtIHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBvcHRpb25UZXJtKG9wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24uZmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcmd1bWVudCB0ZXJtIHRvIHNob3cgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FyZ3VtZW50fSBhcmd1bWVudFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBhcmd1bWVudFRlcm0oYXJndW1lbnQpIHtcbiAgICByZXR1cm4gYXJndW1lbnQubmFtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBjb21tYW5kIHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBsb25nZXN0U3ViY29tbWFuZFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVDb21tYW5kcyhjbWQpLnJlZHVjZSgobWF4LCBjb21tYW5kKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBoZWxwZXIuc3ViY29tbWFuZFRlcm0oY29tbWFuZCkubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3Qgb3B0aW9uIHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBsb25nZXN0T3B0aW9uVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZU9wdGlvbnMoY21kKS5yZWR1Y2UoKG1heCwgb3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLmxlbmd0aCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGdsb2JhbCBvcHRpb24gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RHbG9iYWxPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlR2xvYmFsT3B0aW9ucyhjbWQpLnJlZHVjZSgobWF4LCBvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbikubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgYXJndW1lbnQgdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RBcmd1bWVudFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVBcmd1bWVudHMoY21kKS5yZWR1Y2UoKG1heCwgYXJndW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5hcmd1bWVudFRlcm0oYXJndW1lbnQpLmxlbmd0aCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21tYW5kIHVzYWdlIHRvIGJlIGRpc3BsYXllZCBhdCB0aGUgdG9wIG9mIHRoZSBidWlsdC1pbiBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBjb21tYW5kVXNhZ2UoY21kKSB7XG4gICAgLy8gVXNhZ2VcbiAgICBsZXQgY21kTmFtZSA9IGNtZC5fbmFtZTtcbiAgICBpZiAoY21kLl9hbGlhc2VzWzBdKSB7XG4gICAgICBjbWROYW1lID0gY21kTmFtZSArICd8JyArIGNtZC5fYWxpYXNlc1swXTtcbiAgICB9XG4gICAgbGV0IGFuY2VzdG9yQ21kTmFtZXMgPSAnJztcbiAgICBmb3IgKFxuICAgICAgbGV0IGFuY2VzdG9yQ21kID0gY21kLnBhcmVudDtcbiAgICAgIGFuY2VzdG9yQ21kO1xuICAgICAgYW5jZXN0b3JDbWQgPSBhbmNlc3RvckNtZC5wYXJlbnRcbiAgICApIHtcbiAgICAgIGFuY2VzdG9yQ21kTmFtZXMgPSBhbmNlc3RvckNtZC5uYW1lKCkgKyAnICcgKyBhbmNlc3RvckNtZE5hbWVzO1xuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3JDbWROYW1lcyArIGNtZE5hbWUgKyAnICcgKyBjbWQudXNhZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgY29tbWFuZERlc2NyaXB0aW9uKGNtZCkge1xuICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgIHJldHVybiBjbWQuZGVzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN1YmNvbW1hbmQgc3VtbWFyeSB0byBzaG93IGluIHRoZSBsaXN0IG9mIHN1YmNvbW1hbmRzLlxuICAgKiAoRmFsbGJhY2sgdG8gZGVzY3JpcHRpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LilcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgc3ViY29tbWFuZERlc2NyaXB0aW9uKGNtZCkge1xuICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgIHJldHVybiBjbWQuc3VtbWFyeSgpIHx8IGNtZC5kZXNjcmlwdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIGRlc2NyaXB0aW9uIHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbikge1xuICAgIGNvbnN0IGV4dHJhSW5mbyA9IFtdO1xuXG4gICAgaWYgKG9wdGlvbi5hcmdDaG9pY2VzKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgLy8gdXNlIHN0cmluZ2lmeSB0byBtYXRjaCB0aGUgZGlzcGxheSBvZiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBgY2hvaWNlczogJHtvcHRpb24uYXJnQ2hvaWNlcy5tYXAoKGNob2ljZSkgPT4gSlNPTi5zdHJpbmdpZnkoY2hvaWNlKSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbi5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZGVmYXVsdCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBtb3JlIGZvciBwcm9ncmFtbWVyIHRoYW4gZW5kIHVzZXIsXG4gICAgICAvLyBidXQgc2hvdyB0cnVlL2ZhbHNlIGZvciBib29sZWFuIG9wdGlvbiBhcyBtYXkgYmUgZm9yIGhhbmQtcm9sbGVkIGVudiBvciBjb25maWcgcHJvY2Vzc2luZy5cbiAgICAgIGNvbnN0IHNob3dEZWZhdWx0ID1cbiAgICAgICAgb3B0aW9uLnJlcXVpcmVkIHx8XG4gICAgICAgIG9wdGlvbi5vcHRpb25hbCB8fFxuICAgICAgICAob3B0aW9uLmlzQm9vbGVhbigpICYmIHR5cGVvZiBvcHRpb24uZGVmYXVsdFZhbHVlID09PSAnYm9vbGVhbicpO1xuICAgICAgaWYgKHNob3dEZWZhdWx0KSB7XG4gICAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAgIGBkZWZhdWx0OiAke29wdGlvbi5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiB8fCBKU09OLnN0cmluZ2lmeShvcHRpb24uZGVmYXVsdFZhbHVlKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBwcmVzZXQgZm9yIGJvb2xlYW4gYW5kIG5lZ2F0ZWQgYXJlIG1vcmUgZm9yIHByb2dyYW1tZXIgdGhhbiBlbmQgdXNlclxuICAgIGlmIChvcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChgcHJlc2V0OiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbi5wcmVzZXRBcmcpfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9uLmVudlZhciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChgZW52OiAke29wdGlvbi5lbnZWYXJ9YCk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZm8ubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGAke29wdGlvbi5kZXNjcmlwdGlvbn0gKCR7ZXh0cmFJbmZvLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbi5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFyZ3VtZW50IGRlc2NyaXB0aW9uIHRvIHNob3cgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FyZ3VtZW50fSBhcmd1bWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGFyZ3VtZW50RGVzY3JpcHRpb24oYXJndW1lbnQpIHtcbiAgICBjb25zdCBleHRyYUluZm8gPSBbXTtcbiAgICBpZiAoYXJndW1lbnQuYXJnQ2hvaWNlcykge1xuICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgIC8vIHVzZSBzdHJpbmdpZnkgdG8gbWF0Y2ggdGhlIGRpc3BsYXkgb2YgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgYGNob2ljZXM6ICR7YXJndW1lbnQuYXJnQ2hvaWNlcy5tYXAoKGNob2ljZSkgPT4gSlNPTi5zdHJpbmdpZnkoY2hvaWNlKSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGFyZ3VtZW50LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgYGRlZmF1bHQ6ICR7YXJndW1lbnQuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gfHwgSlNPTi5zdHJpbmdpZnkoYXJndW1lbnQuZGVmYXVsdFZhbHVlKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleHRyYURlc2NyaXB0b24gPSBgKCR7ZXh0cmFJbmZvLmpvaW4oJywgJyl9KWA7XG4gICAgICBpZiAoYXJndW1lbnQuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIGAke2FyZ3VtZW50LmRlc2NyaXB0aW9ufSAke2V4dHJhRGVzY3JpcHRvbn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4dHJhRGVzY3JpcHRvbjtcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3VtZW50LmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRoZSBidWlsdC1pbiBoZWxwIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGZvcm1hdEhlbHAoY21kLCBoZWxwZXIpIHtcbiAgICBjb25zdCB0ZXJtV2lkdGggPSBoZWxwZXIucGFkV2lkdGgoY21kLCBoZWxwZXIpO1xuICAgIGNvbnN0IGhlbHBXaWR0aCA9IGhlbHBlci5oZWxwV2lkdGggfHwgODA7XG4gICAgY29uc3QgaXRlbUluZGVudFdpZHRoID0gMjtcbiAgICBjb25zdCBpdGVtU2VwYXJhdG9yV2lkdGggPSAyOyAvLyBiZXR3ZWVuIHRlcm0gYW5kIGRlc2NyaXB0aW9uXG4gICAgZnVuY3Rpb24gZm9ybWF0SXRlbSh0ZXJtLCBkZXNjcmlwdGlvbikge1xuICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gYCR7dGVybS5wYWRFbmQodGVybVdpZHRoICsgaXRlbVNlcGFyYXRvcldpZHRoKX0ke2Rlc2NyaXB0aW9ufWA7XG4gICAgICAgIHJldHVybiBoZWxwZXIud3JhcChcbiAgICAgICAgICBmdWxsVGV4dCxcbiAgICAgICAgICBoZWxwV2lkdGggLSBpdGVtSW5kZW50V2lkdGgsXG4gICAgICAgICAgdGVybVdpZHRoICsgaXRlbVNlcGFyYXRvcldpZHRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcm1hdExpc3QodGV4dEFycmF5KSB7XG4gICAgICByZXR1cm4gdGV4dEFycmF5LmpvaW4oJ1xcbicpLnJlcGxhY2UoL14vZ20sICcgJy5yZXBlYXQoaXRlbUluZGVudFdpZHRoKSk7XG4gICAgfVxuXG4gICAgLy8gVXNhZ2VcbiAgICBsZXQgb3V0cHV0ID0gW2BVc2FnZTogJHtoZWxwZXIuY29tbWFuZFVzYWdlKGNtZCl9YCwgJyddO1xuXG4gICAgLy8gRGVzY3JpcHRpb25cbiAgICBjb25zdCBjb21tYW5kRGVzY3JpcHRpb24gPSBoZWxwZXIuY29tbWFuZERlc2NyaXB0aW9uKGNtZCk7XG4gICAgaWYgKGNvbW1hbmREZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFtcbiAgICAgICAgaGVscGVyLndyYXAoY29tbWFuZERlc2NyaXB0aW9uLCBoZWxwV2lkdGgsIDApLFxuICAgICAgICAnJyxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIEFyZ3VtZW50c1xuICAgIGNvbnN0IGFyZ3VtZW50TGlzdCA9IGhlbHBlci52aXNpYmxlQXJndW1lbnRzKGNtZCkubWFwKChhcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgIGhlbHBlci5hcmd1bWVudFRlcm0oYXJndW1lbnQpLFxuICAgICAgICBoZWxwZXIuYXJndW1lbnREZXNjcmlwdGlvbihhcmd1bWVudCksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChhcmd1bWVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ0FyZ3VtZW50czonLCBmb3JtYXRMaXN0KGFyZ3VtZW50TGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbkxpc3QgPSBoZWxwZXIudmlzaWJsZU9wdGlvbnMoY21kKS5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbiksXG4gICAgICAgIGhlbHBlci5vcHRpb25EZXNjcmlwdGlvbihvcHRpb24pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAob3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnT3B0aW9uczonLCBmb3JtYXRMaXN0KG9wdGlvbkxpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dHbG9iYWxPcHRpb25zKSB7XG4gICAgICBjb25zdCBnbG9iYWxPcHRpb25MaXN0ID0gaGVscGVyXG4gICAgICAgIC52aXNpYmxlR2xvYmFsT3B0aW9ucyhjbWQpXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICAgICAgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKSxcbiAgICAgICAgICAgIGhlbHBlci5vcHRpb25EZXNjcmlwdGlvbihvcHRpb24pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgaWYgKGdsb2JhbE9wdGlvbkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFtcbiAgICAgICAgICAnR2xvYmFsIE9wdGlvbnM6JyxcbiAgICAgICAgICBmb3JtYXRMaXN0KGdsb2JhbE9wdGlvbkxpc3QpLFxuICAgICAgICAgICcnLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21tYW5kc1xuICAgIGNvbnN0IGNvbW1hbmRMaXN0ID0gaGVscGVyLnZpc2libGVDb21tYW5kcyhjbWQpLm1hcCgoY21kKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLnN1YmNvbW1hbmRUZXJtKGNtZCksXG4gICAgICAgIGhlbHBlci5zdWJjb21tYW5kRGVzY3JpcHRpb24oY21kKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGNvbW1hbmRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydDb21tYW5kczonLCBmb3JtYXRMaXN0KGNvbW1hbmRMaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgcGFkIHdpZHRoIGZyb20gdGhlIG1heGltdW0gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIHBhZFdpZHRoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgaGVscGVyLmxvbmdlc3RPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0R2xvYmFsT3B0aW9uVGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgICBoZWxwZXIubG9uZ2VzdFN1YmNvbW1hbmRUZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0QXJndW1lbnRUZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGdpdmVuIHN0cmluZyB0byB3aWR0aCBjaGFyYWN0ZXJzIHBlciBsaW5lLCB3aXRoIGxpbmVzIGFmdGVyIHRoZSBmaXJzdCBpbmRlbnRlZC5cbiAgICogRG8gbm90IHdyYXAgaWYgaW5zdWZmaWNpZW50IHJvb20gZm9yIHdyYXBwaW5nIChtaW5Db2x1bW5XaWR0aCksIG9yIHN0cmluZyBpcyBtYW51YWxseSBmb3JtYXR0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRlbnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW5Db2x1bW5XaWR0aD00MF1cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKlxuICAgKi9cblxuICB3cmFwKHN0ciwgd2lkdGgsIGluZGVudCwgbWluQ29sdW1uV2lkdGggPSA0MCkge1xuICAgIC8vIEZ1bGwgXFxzIGNoYXJhY3RlcnMsIG1pbnVzIHRoZSBsaW5lZmVlZHMuXG4gICAgY29uc3QgaW5kZW50cyA9XG4gICAgICAnIFxcXFxmXFxcXHRcXFxcdlxcdTAwYTBcXHUxNjgwXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1ZmVmZic7XG4gICAgLy8gRGV0ZWN0IG1hbnVhbGx5IHdyYXBwZWQgYW5kIGluZGVudGVkIHN0cmluZ3MgYnkgc2VhcmNoaW5nIGZvciBsaW5lIGJyZWFrIGZvbGxvd2VkIGJ5IHNwYWNlcy5cbiAgICBjb25zdCBtYW51YWxJbmRlbnQgPSBuZXcgUmVnRXhwKGBbXFxcXG5dWyR7aW5kZW50c31dK2ApO1xuICAgIGlmIChzdHIubWF0Y2gobWFudWFsSW5kZW50KSkgcmV0dXJuIHN0cjtcbiAgICAvLyBEbyBub3Qgd3JhcCBpZiBub3QgZW5vdWdoIHJvb20gZm9yIGEgd3JhcHBlZCBjb2x1bW4gb2YgdGV4dCAoYXMgY291bGQgZW5kIHVwIHdpdGggYSB3b3JkIHBlciBsaW5lKS5cbiAgICBjb25zdCBjb2x1bW5XaWR0aCA9IHdpZHRoIC0gaW5kZW50O1xuICAgIGlmIChjb2x1bW5XaWR0aCA8IG1pbkNvbHVtbldpZHRoKSByZXR1cm4gc3RyO1xuXG4gICAgY29uc3QgbGVhZGluZ1N0ciA9IHN0ci5zbGljZSgwLCBpbmRlbnQpO1xuICAgIGNvbnN0IGNvbHVtblRleHQgPSBzdHIuc2xpY2UoaW5kZW50KS5yZXBsYWNlKCdcXHJcXG4nLCAnXFxuJyk7XG4gICAgY29uc3QgaW5kZW50U3RyaW5nID0gJyAnLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IHplcm9XaWR0aFNwYWNlID0gJ1xcdTIwMEInO1xuICAgIGNvbnN0IGJyZWFrcyA9IGBcXFxccyR7emVyb1dpZHRoU3BhY2V9YDtcbiAgICAvLyBNYXRjaCBsaW5lIGVuZCAoc28gZW1wdHkgbGluZXMgZG9uJ3QgY29sbGFwc2UpLFxuICAgIC8vIG9yIGFzIG11Y2ggdGV4dCBhcyB3aWxsIGZpdCBpbiBjb2x1bW4sIG9yIGV4Y2VzcyB0ZXh0IHVwIHRvIGZpcnN0IGJyZWFrLlxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgIGBcXG58LnsxLCR7Y29sdW1uV2lkdGggLSAxfX0oWyR7YnJlYWtzfV18JCl8W14ke2JyZWFrc31dKz8oWyR7YnJlYWtzfV18JClgLFxuICAgICAgJ2cnLFxuICAgICk7XG4gICAgY29uc3QgbGluZXMgPSBjb2x1bW5UZXh0Lm1hdGNoKHJlZ2V4KSB8fCBbXTtcbiAgICByZXR1cm4gKFxuICAgICAgbGVhZGluZ1N0ciArXG4gICAgICBsaW5lc1xuICAgICAgICAubWFwKChsaW5lLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKGxpbmUgPT09ICdcXG4nKSByZXR1cm4gJyc7IC8vIHByZXNlcnZlIGVtcHR5IGxpbmVzXG4gICAgICAgICAgcmV0dXJuIChpID4gMCA/IGluZGVudFN0cmluZyA6ICcnKSArIGxpbmUudHJpbUVuZCgpO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignXFxuJylcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydHMuSGVscCA9IEhlbHA7XG4iLAogICAgImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgT3B0aW9uIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYE9wdGlvbmAgd2l0aCB0aGUgZ2l2ZW4gYGZsYWdzYCBhbmQgYGRlc2NyaXB0aW9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gZmxhZ3MuaW5jbHVkZXMoJzwnKTsgLy8gQSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluY2x1ZGVzKCdbJyk7IC8vIEEgdmFsdWUgaXMgb3B0aW9uYWwgd2hlbiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC5cbiAgICAvLyB2YXJpYWRpYyB0ZXN0IGlnbm9yZXMgPHZhbHVlLC4uLj4gZXQgYWwgd2hpY2ggbWlnaHQgYmUgdXNlZCB0byBkZXNjcmliZSBjdXN0b20gc3BsaXR0aW5nIG9mIHNpbmdsZSBhcmd1bWVudFxuICAgIHRoaXMudmFyaWFkaWMgPSAvXFx3XFwuXFwuXFwuWz5cXF1dJC8udGVzdChmbGFncyk7IC8vIFRoZSBvcHRpb24gY2FuIHRha2UgbXVsdGlwbGUgdmFsdWVzLlxuICAgIHRoaXMubWFuZGF0b3J5ID0gZmFsc2U7IC8vIFRoZSBvcHRpb24gbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZywgd2hpY2ggdXN1YWxseSBtZWFucyBpdCBtdXN0IGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuXG4gICAgY29uc3Qgb3B0aW9uRmxhZ3MgPSBzcGxpdE9wdGlvbkZsYWdzKGZsYWdzKTtcbiAgICB0aGlzLnNob3J0ID0gb3B0aW9uRmxhZ3Muc2hvcnRGbGFnO1xuICAgIHRoaXMubG9uZyA9IG9wdGlvbkZsYWdzLmxvbmdGbGFnO1xuICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgdGhpcy5uZWdhdGUgPSB0aGlzLmxvbmcuc3RhcnRzV2l0aCgnLS1uby0nKTtcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnByZXNldEFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudlZhciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IFtdO1xuICAgIHRoaXMuaW1wbGllZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUsIGFuZCBvcHRpb25hbGx5IHN1cHBseSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVzZXQgdG8gdXNlIHdoZW4gb3B0aW9uIHVzZWQgd2l0aG91dCBvcHRpb24tYXJndW1lbnQsIGVzcGVjaWFsbHkgb3B0aW9uYWwgYnV0IGFsc28gYm9vbGVhbiBhbmQgbmVnYXRlZC5cbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgT3B0aW9uKCctLWNvbG9yJykuZGVmYXVsdCgnR1JFWVNDQUxFJykucHJlc2V0KCdSR0InKTtcbiAgICogbmV3IE9wdGlvbignLS1kb25hdGUgW2Ftb3VudF0nKS5wcmVzZXQoJzIwJykuYXJnUGFyc2VyKHBhcnNlRmxvYXQpO1xuICAgKlxuICAgKiBAcGFyYW0geyp9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIHByZXNldChhcmcpIHtcbiAgICB0aGlzLnByZXNldEFyZyA9IGFyZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3B0aW9uIG5hbWUocykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGRpc3BsYXllZCBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSBmb3VuZCBkdXJpbmcgcGFyc2luZy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1yZ2InKS5jb25mbGljdHMoJ2NteWsnKTtcbiAgICogbmV3IE9wdGlvbignLS1qcycpLmNvbmZsaWN0cyhbJ3RzJywgJ2pzeCddKTtcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgc3RyaW5nW10pfSBuYW1lc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNvbmZsaWN0cyhuYW1lcykge1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IHRoaXMuY29uZmxpY3RzV2l0aC5jb25jYXQobmFtZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaW1wbGllZCBvcHRpb24gdmFsdWVzIGZvciB3aGVuIHRoaXMgb3B0aW9uIGlzIHNldCBhbmQgdGhlIGltcGxpZWQgb3B0aW9ucyBhcmUgbm90LlxuICAgKlxuICAgKiBUaGUgY3VzdG9tIHByb2Nlc3NpbmcgKHBhcnNlQXJnKSBpcyBub3QgY2FsbGVkIG9uIHRoZSBpbXBsaWVkIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1sb2cnLCAnd3JpdGUgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBmaWxlJykpXG4gICAqICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXRyYWNlJywgJ2xvZyBleHRyYSBkZXRhaWxzJykuaW1wbGllcyh7IGxvZzogJ3RyYWNlLnR4dCcgfSkpO1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW1wbGllZE9wdGlvblZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuICBpbXBsaWVzKGltcGxpZWRPcHRpb25WYWx1ZXMpIHtcbiAgICBsZXQgbmV3SW1wbGllZCA9IGltcGxpZWRPcHRpb25WYWx1ZXM7XG4gICAgaWYgKHR5cGVvZiBpbXBsaWVkT3B0aW9uVmFsdWVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gc3RyaW5nIGlzIG5vdCBkb2N1bWVudGVkLCBidXQgZWFzeSBtaXN0YWtlIGFuZCB3ZSBjYW4gZG8gd2hhdCB1c2VyIHByb2JhYmx5IGludGVuZGVkLlxuICAgICAgbmV3SW1wbGllZCA9IHsgW2ltcGxpZWRPcHRpb25WYWx1ZXNdOiB0cnVlIH07XG4gICAgfVxuICAgIHRoaXMuaW1wbGllZCA9IE9iamVjdC5hc3NpZ24odGhpcy5pbXBsaWVkIHx8IHt9LCBuZXdJbXBsaWVkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY2hlY2sgZm9yIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSB1c2VkIGlmIHdoZW4gcHJvY2Vzc2VkIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZSBpc1xuICAgKiB1bmRlZmluZWQsIG9yIHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICdjb25maWcnIG9yICdlbnYnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGVudihuYW1lKSB7XG4gICAgdGhpcy5lbnZWYXIgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgQ0xJIG9wdGlvbiBhcmd1bWVudHMgaW50byBvcHRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmRhdG9yeT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIG1ha2VPcHRpb25NYW5kYXRvcnkobWFuZGF0b3J5ID0gdHJ1ZSkge1xuICAgIHRoaXMubWFuZGF0b3J5ID0gISFtYW5kYXRvcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBvcHRpb24gaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbaGlkZT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGhpZGVIZWxwKGhpZGUgPSB0cnVlKSB7XG4gICAgdGhpcy5oaWRkZW4gPSAhIWhpZGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2NvbmNhdFZhbHVlKHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChwcmV2aW91cyA9PT0gdGhpcy5kZWZhdWx0VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXMuY29uY2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IG9wdGlvbiB2YWx1ZSB0byBiZSBvbmUgb2YgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG5hbWUoKSB7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgcmV0dXJuIHRoaXMubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3J0LnJlcGxhY2UoL14tLywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZSwgaW4gYSBjYW1lbGNhc2UgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhdHRyaWJ1dGVOYW1lKCkge1xuICAgIHJldHVybiBjYW1lbGNhc2UodGhpcy5uYW1lKCkucmVwbGFjZSgvXm5vLS8sICcnKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYGFyZ2AgbWF0Y2hlcyB0aGUgc2hvcnQgb3IgbG9uZyBmbGFnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzKGFyZykge1xuICAgIHJldHVybiB0aGlzLnNob3J0ID09PSBhcmcgfHwgdGhpcy5sb25nID09PSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBib29sZWFuIG9wdGlvbi5cbiAgICpcbiAgICogT3B0aW9ucyBhcmUgb25lIG9mIGJvb2xlYW4sIG5lZ2F0ZWQsIHJlcXVpcmVkIGFyZ3VtZW50LCBvciBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgaXNCb29sZWFuKCkge1xuICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5vcHRpb25hbCAmJiAhdGhpcy5uZWdhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCBkdWFsIG9wdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4aXN0aW5nXG4gKiBpbXBsZW1lbnRhdGlvbi4gV2Ugc3VwcG9ydCBzZXBhcmF0ZSBkdWFsIG9wdGlvbnMgZm9yIHNlcGFyYXRlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBvcHRpb25zLFxuICogbGlrZSBgLS1idWlsZGAgYW5kIGAtLW5vLWJ1aWxkYCwgd2hpY2ggc2hhcmUgYSBzaW5nbGUgb3B0aW9uIHZhbHVlLiBUaGlzIHdvcmtzIG5pY2VseSBmb3Igc29tZVxuICogdXNlIGNhc2VzLCBidXQgaXMgdHJpY2t5IGZvciBvdGhlcnMgd2hlcmUgd2Ugd2FudCBzZXBhcmF0ZSBiZWhhdmlvdXJzIGRlc3BpdGVcbiAqIHRoZSBzaW5nbGUgc2hhcmVkIG9wdGlvbiB2YWx1ZS5cbiAqL1xuY2xhc3MgRHVhbE9wdGlvbnMge1xuICAvKipcbiAgICogQHBhcmFtIHtPcHRpb25bXX0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMucG9zaXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVhbE9wdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGl2ZU9wdGlvbnMuc2V0KG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCksIG9wdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMucG9zaXRpdmVPcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuZHVhbE9wdGlvbnMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSB2YWx1ZSBjb21lIGZyb20gdGhlIG9wdGlvbiwgYW5kIG5vdCBmcm9tIHBvc3NpYmxlIG1hdGNoaW5nIGR1YWwgb3B0aW9uP1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWx1ZUZyb21PcHRpb24odmFsdWUsIG9wdGlvbikge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgaWYgKCF0aGlzLmR1YWxPcHRpb25zLmhhcyhvcHRpb25LZXkpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgdmFsdWUgdG8gZGVkdWNlIGlmIChwcm9iYWJseSkgY2FtZSBmcm9tIHRoZSBvcHRpb24uXG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZ2V0KG9wdGlvbktleSkucHJlc2V0QXJnO1xuICAgIGNvbnN0IG5lZ2F0aXZlVmFsdWUgPSBwcmVzZXQgIT09IHVuZGVmaW5lZCA/IHByZXNldCA6IGZhbHNlO1xuICAgIHJldHVybiBvcHRpb24ubmVnYXRlID09PSAobmVnYXRpdmVWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgZnJvbSBrZWJhYi1jYXNlIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNhbWVsY2FzZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnLScpLnJlZHVjZSgoc3RyLCB3b3JkKSA9PiB7XG4gICAgcmV0dXJuIHN0ciArIHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFnIG91dCBvZiBzb21ldGhpbmcgbGlrZSAnLW0sLS1taXhlZCA8dmFsdWU+J1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRPcHRpb25GbGFncyhmbGFncykge1xuICBsZXQgc2hvcnRGbGFnO1xuICBsZXQgbG9uZ0ZsYWc7XG4gIC8vIFVzZSBvcmlnaW5hbCB2ZXJ5IGxvb3NlIHBhcnNpbmcgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG5vdyxcbiAgLy8gd2hpY2ggYWxsb3dlZCBmb3IgZXhhbXBsZSB1bmludGVuZGVkIGAtc3csIC0tc2hvcnQtd29yZGAgW3NpY10uXG4gIGNvbnN0IGZsYWdQYXJ0cyA9IGZsYWdzLnNwbGl0KC9bIHwsXSsvKTtcbiAgaWYgKGZsYWdQYXJ0cy5sZW5ndGggPiAxICYmICEvXltbPF0vLnRlc3QoZmxhZ1BhcnRzWzFdKSlcbiAgICBzaG9ydEZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgbG9uZ0ZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgLy8gQWRkIHN1cHBvcnQgZm9yIGxvbmUgc2hvcnQgZmxhZyB3aXRob3V0IHNpZ25pZmljYW50bHkgY2hhbmdpbmcgcGFyc2luZyFcbiAgaWYgKCFzaG9ydEZsYWcgJiYgL14tW14tXSQvLnRlc3QobG9uZ0ZsYWcpKSB7XG4gICAgc2hvcnRGbGFnID0gbG9uZ0ZsYWc7XG4gICAgbG9uZ0ZsYWcgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2hvcnRGbGFnLCBsb25nRmxhZyB9O1xufVxuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuRHVhbE9wdGlvbnMgPSBEdWFsT3B0aW9ucztcbiIsCiAgICAiY29uc3QgbWF4RGlzdGFuY2UgPSAzO1xuXG5mdW5jdGlvbiBlZGl0RGlzdGFuY2UoYSwgYikge1xuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EYW1lcmF14oCTTGV2ZW5zaHRlaW5fZGlzdGFuY2VcbiAgLy8gQ2FsY3VsYXRpbmcgb3B0aW1hbCBzdHJpbmcgYWxpZ25tZW50IGRpc3RhbmNlLCBubyBzdWJzdHJpbmcgaXMgZWRpdGVkIG1vcmUgdGhhbiBvbmNlLlxuICAvLyAoU2ltcGxlIGltcGxlbWVudGF0aW9uLilcblxuICAvLyBRdWljayBlYXJseSBleGl0LCByZXR1cm4gd29yc3QgY2FzZS5cbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4RGlzdGFuY2UpXG4gICAgcmV0dXJuIE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cbiAgLy8gZGlzdGFuY2UgYmV0d2VlbiBwcmVmaXggc3Vic3RyaW5ncyBvZiBhIGFuZCBiXG4gIGNvbnN0IGQgPSBbXTtcblxuICAvLyBwdXJlIGRlbGV0aW9ucyB0dXJuIGEgaW50byBlbXB0eSBzdHJpbmdcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gYS5sZW5ndGg7IGkrKykge1xuICAgIGRbaV0gPSBbaV07XG4gIH1cbiAgLy8gcHVyZSBpbnNlcnRpb25zIHR1cm4gZW1wdHkgc3RyaW5nIGludG8gYlxuICBmb3IgKGxldCBqID0gMDsgaiA8PSBiLmxlbmd0aDsgaisrKSB7XG4gICAgZFswXVtqXSA9IGo7XG4gIH1cblxuICAvLyBmaWxsIG1hdHJpeFxuICBmb3IgKGxldCBqID0gMTsgaiA8PSBiLmxlbmd0aDsgaisrKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYS5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNvc3QgPSAxO1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBjb3N0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvc3QgPSAxO1xuICAgICAgfVxuICAgICAgZFtpXVtqXSA9IE1hdGgubWluKFxuICAgICAgICBkW2kgLSAxXVtqXSArIDEsIC8vIGRlbGV0aW9uXG4gICAgICAgIGRbaV1baiAtIDFdICsgMSwgLy8gaW5zZXJ0aW9uXG4gICAgICAgIGRbaSAtIDFdW2ogLSAxXSArIGNvc3QsIC8vIHN1YnN0aXR1dGlvblxuICAgICAgKTtcbiAgICAgIC8vIHRyYW5zcG9zaXRpb25cbiAgICAgIGlmIChpID4gMSAmJiBqID4gMSAmJiBhW2kgLSAxXSA9PT0gYltqIC0gMl0gJiYgYVtpIC0gMl0gPT09IGJbaiAtIDFdKSB7XG4gICAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihkW2ldW2pdLCBkW2kgLSAyXVtqIC0gMl0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZFthLmxlbmd0aF1bYi5sZW5ndGhdO1xufVxuXG4vKipcbiAqIEZpbmQgY2xvc2UgbWF0Y2hlcywgcmVzdHJpY3RlZCB0byBzYW1lIG51bWJlciBvZiBlZGl0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gd29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2FuZGlkYXRlc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBzdWdnZXN0U2ltaWxhcih3b3JkLCBjYW5kaWRhdGVzKSB7XG4gIGlmICghY2FuZGlkYXRlcyB8fCBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAvLyByZW1vdmUgcG9zc2libGUgZHVwbGljYXRlc1xuICBjYW5kaWRhdGVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGNhbmRpZGF0ZXMpKTtcblxuICBjb25zdCBzZWFyY2hpbmdPcHRpb25zID0gd29yZC5zdGFydHNXaXRoKCctLScpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHdvcmQgPSB3b3JkLnNsaWNlKDIpO1xuICAgIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLm1hcCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuc2xpY2UoMikpO1xuICB9XG5cbiAgbGV0IHNpbWlsYXIgPSBbXTtcbiAgbGV0IGJlc3REaXN0YW5jZSA9IG1heERpc3RhbmNlO1xuICBjb25zdCBtaW5TaW1pbGFyaXR5ID0gMC40O1xuICBjYW5kaWRhdGVzLmZvckVhY2goKGNhbmRpZGF0ZSkgPT4ge1xuICAgIGlmIChjYW5kaWRhdGUubGVuZ3RoIDw9IDEpIHJldHVybjsgLy8gbm8gb25lIGNoYXJhY3RlciBndWVzc2VzXG5cbiAgICBjb25zdCBkaXN0YW5jZSA9IGVkaXREaXN0YW5jZSh3b3JkLCBjYW5kaWRhdGUpO1xuICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KHdvcmQubGVuZ3RoLCBjYW5kaWRhdGUubGVuZ3RoKTtcbiAgICBjb25zdCBzaW1pbGFyaXR5ID0gKGxlbmd0aCAtIGRpc3RhbmNlKSAvIGxlbmd0aDtcbiAgICBpZiAoc2ltaWxhcml0eSA+IG1pblNpbWlsYXJpdHkpIHtcbiAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAvLyBiZXR0ZXIgZWRpdCBkaXN0YW5jZSwgdGhyb3cgYXdheSBwcmV2aW91cyB3b3JzZSBtYXRjaGVzXG4gICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICBzaW1pbGFyID0gW2NhbmRpZGF0ZV07XG4gICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID09PSBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgc2ltaWxhci5wdXNoKGNhbmRpZGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBzaW1pbGFyLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGlmIChzZWFyY2hpbmdPcHRpb25zKSB7XG4gICAgc2ltaWxhciA9IHNpbWlsYXIubWFwKChjYW5kaWRhdGUpID0+IGAtLSR7Y2FuZGlkYXRlfWApO1xuICB9XG5cbiAgaWYgKHNpbWlsYXIubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBgXFxuKERpZCB5b3UgbWVhbiBvbmUgb2YgJHtzaW1pbGFyLmpvaW4oJywgJyl9PylgO1xuICB9XG4gIGlmIChzaW1pbGFyLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBgXFxuKERpZCB5b3UgbWVhbiAke3NpbWlsYXJbMF19PylgO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0cy5zdWdnZXN0U2ltaWxhciA9IHN1Z2dlc3RTaW1pbGFyO1xuIiwKICAgICJjb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlcjtcbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ25vZGU6cGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgnbm9kZTpwcm9jZXNzJyk7XG5cbmNvbnN0IHsgQXJndW1lbnQsIGh1bWFuUmVhZGFibGVBcmdOYW1lIH0gPSByZXF1aXJlKCcuL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmRlckVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vaGVscC5qcycpO1xuY29uc3QgeyBPcHRpb24sIER1YWxPcHRpb25zIH0gPSByZXF1aXJlKCcuL29wdGlvbi5qcycpO1xuY29uc3QgeyBzdWdnZXN0U2ltaWxhciB9ID0gcmVxdWlyZSgnLi9zdWdnZXN0U2ltaWxhcicpO1xuXG5jbGFzcyBDb21tYW5kIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYENvbW1hbmRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAdHlwZSB7Q29tbWFuZFtdfSAqL1xuICAgIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgICAvKiogQHR5cGUge09wdGlvbltdfSAqL1xuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9IHRydWU7XG4gICAgLyoqIEB0eXBlIHtBcmd1bWVudFtdfSAqL1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cyA9IFtdO1xuICAgIHRoaXMuX2FyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHM7IC8vIGRlcHJlY2F0ZWQgb2xkIG5hbWVcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuYXJncyA9IFtdOyAvLyBjbGkgYXJncyB3aXRoIG9wdGlvbnMgcmVtb3ZlZFxuICAgIHRoaXMucmF3QXJncyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkQXJncyA9IFtdOyAvLyBsaWtlIC5hcmdzIGJ1dCBhZnRlciBjdXN0b20gcHJvY2Vzc2luZyBhbmQgY29sbGVjdGluZyB2YXJpYWRpY1xuICAgIHRoaXMuX3NjcmlwdFBhdGggPSBudWxsO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lIHx8ICcnO1xuICAgIHRoaXMuX29wdGlvblZhbHVlcyA9IHt9O1xuICAgIHRoaXMuX29wdGlvblZhbHVlU291cmNlcyA9IHt9OyAvLyBkZWZhdWx0LCBlbnYsIGNsaSBldGNcbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLl9leGVjdXRhYmxlSGFuZGxlciA9IGZhbHNlO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVGaWxlID0gbnVsbDsgLy8gY3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGVcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gbnVsbDsgLy8gY3VzdG9tIHNlYXJjaCBkaXJlY3RvcnkgZm9yIHN1YmNvbW1hbmRzXG4gICAgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX2FsaWFzZXMgPSBbXTtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5fc3VtbWFyeSA9ICcnO1xuICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgLy8gbGVnYWN5XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9saWZlQ3ljbGVIb29rcyA9IHt9OyAvLyBhIGhhc2ggb2YgYXJyYXlzXG4gICAgLyoqIEB0eXBlIHsoYm9vbGVhbiB8IHN0cmluZyl9ICovXG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gZmFsc2U7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gdHJ1ZTtcblxuICAgIC8vIHNlZSAuY29uZmlndXJlT3V0cHV0KCkgZm9yIGRvY3NcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0ge1xuICAgICAgd3JpdGVPdXQ6IChzdHIpID0+IHByb2Nlc3Muc3Rkb3V0LndyaXRlKHN0ciksXG4gICAgICB3cml0ZUVycjogKHN0cikgPT4gcHJvY2Vzcy5zdGRlcnIud3JpdGUoc3RyKSxcbiAgICAgIGdldE91dEhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgZ2V0RXJySGVscFdpZHRoOiAoKSA9PlxuICAgICAgICBwcm9jZXNzLnN0ZGVyci5pc1RUWSA/IHByb2Nlc3Muc3RkZXJyLmNvbHVtbnMgOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXRFcnJvcjogKHN0ciwgd3JpdGUpID0+IHdyaXRlKHN0ciksXG4gICAgfTtcblxuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7KE9wdGlvbiB8IG51bGwgfCB1bmRlZmluZWQpfSAqL1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSB1bmRlZmluZWQ7IC8vIExhenkgY3JlYXRlZCBvbiBkZW1hbmQuIE1heSBiZSBudWxsIGlmIGhlbHAgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB1bmRlZmluZWQ7IC8vIHVuZGVjaWRlZCB3aGV0aGVyIHRydWUgb3IgZmFsc2UgeWV0LCBub3QgaW5oZXJpdGVkXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kfSAqL1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyBsYXp5IGluaXRpYWxpc2VkLCBpbmhlcml0ZWRcbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgc2V0dGluZ3MgdGhhdCBhcmUgdXNlZnVsIHRvIGhhdmUgaW4gY29tbW9uIGFjcm9zcyByb290IGNvbW1hbmQgYW5kIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IHdoZW4gYWRkaW5nIGEgY29tbWFuZCB1c2luZyBgLmNvbW1hbmQoKWAgc28gc3ViY29tbWFuZHMgaW5oZXJpdCBwYXJlbnQgc2V0dGluZ3MuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHNvdXJjZUNvbW1hbmRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb3B5SW5oZXJpdGVkU2V0dGluZ3Moc291cmNlQ29tbWFuZCkge1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwT3B0aW9uO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gc291cmNlQ29tbWFuZC5faGVscENvbW1hbmQ7XG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBzb3VyY2VDb21tYW5kLl9leGl0Q2FsbGJhY2s7XG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gc291cmNlQ29tbWFuZC5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzO1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9XG4gICAgICBzb3VyY2VDb21tYW5kLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWU7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSBzb3VyY2VDb21tYW5kLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cztcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9IHNvdXJjZUNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IHNvdXJjZUNvbW1hbmQuX3Nob3dIZWxwQWZ0ZXJFcnJvcjtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3I7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBmb3IgKGxldCBjb21tYW5kID0gdGhpczsgY29tbWFuZDsgY29tbWFuZCA9IGNvbW1hbmQucGFyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjb21tYW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYSBjb21tYW5kLlxuICAgKlxuICAgKiBUaGVyZSBhcmUgdHdvIHN0eWxlcyBvZiBjb21tYW5kOiBwYXkgYXR0ZW50aW9uIHRvIHdoZXJlIHRvIHB1dCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENvbW1hbmQgaW1wbGVtZW50ZWQgdXNpbmcgYWN0aW9uIGhhbmRsZXIgKGRlc2NyaXB0aW9uIGlzIHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdjbG9uZSA8c291cmNlPiBbZGVzdGluYXRpb25dJylcbiAgICogICAuZGVzY3JpcHRpb24oJ2Nsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnknKVxuICAgKiAgIC5hY3Rpb24oKHNvdXJjZSwgZGVzdGluYXRpb24pID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdjbG9uZSBjb21tYW5kIGNhbGxlZCcpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIHNlcGFyYXRlIGV4ZWN1dGFibGUgZmlsZSAoZGVzY3JpcHRpb24gaXMgc2Vjb25kIHBhcmFtZXRlciB0byBgLmNvbW1hbmRgKVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3N0YXJ0IDxzZXJ2aWNlPicsICdzdGFydCBuYW1lZCBzZXJ2aWNlJylcbiAgICogICAuY29tbWFuZCgnc3RvcCBbc2VydmljZV0nLCAnc3RvcCBuYW1lZCBzZXJ2aWNlLCBvciBhbGwgaWYgbm8gbmFtZSBzdXBwbGllZCcpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZUFuZEFyZ3MgLSBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cywgYXJncyBhcmUgYDxyZXF1aXJlZD5gIG9yIGBbb3B0aW9uYWxdYCBhbmQgbGFzdCBtYXkgYWxzbyBiZSBgdmFyaWFkaWMuLi5gXG4gICAqIEBwYXJhbSB7KG9iamVjdCB8IHN0cmluZyl9IFthY3Rpb25PcHRzT3JFeGVjRGVzY10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBhY3Rpb24pLCBvciBkZXNjcmlwdGlvbiAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbZXhlY09wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgZXhlY3V0YWJsZSlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gcmV0dXJucyBuZXcgY29tbWFuZCBmb3IgYWN0aW9uIGhhbmRsZXIsIG9yIGB0aGlzYCBmb3IgZXhlY3V0YWJsZSBjb21tYW5kXG4gICAqL1xuXG4gIGNvbW1hbmQobmFtZUFuZEFyZ3MsIGFjdGlvbk9wdHNPckV4ZWNEZXNjLCBleGVjT3B0cykge1xuICAgIGxldCBkZXNjID0gYWN0aW9uT3B0c09yRXhlY0Rlc2M7XG4gICAgbGV0IG9wdHMgPSBleGVjT3B0cztcbiAgICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICAgIG9wdHMgPSBkZXNjO1xuICAgICAgZGVzYyA9IG51bGw7XG4gICAgfVxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGNvbnN0IFssIG5hbWUsIGFyZ3NdID0gbmFtZUFuZEFyZ3MubWF0Y2goLyhbXiBdKykgKiguKikvKTtcblxuICAgIGNvbnN0IGNtZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChuYW1lKTtcbiAgICBpZiAoZGVzYykge1xuICAgICAgY21kLmRlc2NyaXB0aW9uKGRlc2MpO1xuICAgICAgY21kLl9leGVjdXRhYmxlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGNtZC5faGlkZGVuID0gISEob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pOyAvLyBub0hlbHAgaXMgZGVwcmVjYXRlZCBvbGQgbmFtZSBmb3IgaGlkZGVuXG4gICAgY21kLl9leGVjdXRhYmxlRmlsZSA9IG9wdHMuZXhlY3V0YWJsZUZpbGUgfHwgbnVsbDsgLy8gQ3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGUgZmlsZSwgc2V0IG1pc3NpbmcgdG8gbnVsbCB0byBtYXRjaCBjb25zdHJ1Y3RvclxuICAgIGlmIChhcmdzKSBjbWQuYXJndW1lbnRzKGFyZ3MpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29tbWFuZChjbWQpO1xuICAgIGNtZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNtZC5jb3B5SW5oZXJpdGVkU2V0dGluZ3ModGhpcyk7XG5cbiAgICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIGNtZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgY29tbWFuZC5cbiAgICpcbiAgICogU2VlIC5jb21tYW5kKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIHN1YmNvbW1hbmQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgY29tbWFuZC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVDb21tYW5kIHRvIGN1c3RvbWlzZSBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBuZXcgY29tbWFuZFxuICAgKi9cblxuICBjcmVhdGVDb21tYW5kKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBjdXN0b21pc2UgdGhlIGhlbHAgd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwLFxuICAgKiBvciBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCkuXG4gICAqXG4gICAqIEByZXR1cm4ge0hlbHB9XG4gICAqL1xuXG4gIGNyZWF0ZUhlbHAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEhlbHAoKSwgdGhpcy5jb25maWd1cmVIZWxwKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIGJ5IG92ZXJyaWRpbmcgSGVscCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZ3VyZUhlbHAoKSxcbiAgICogb3Igd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZUhlbHAoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbjtcblxuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIHN0ZGVyci4gWW91IGNhbiBjdXN0b21pc2UgdGhpcyBmb3Igc3BlY2lhbFxuICAgKiBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gYWxzbyBjdXN0b21pc2UgdGhlIGRpc3BsYXkgb2YgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgb3V0cHV0RXJyb3IuXG4gICAqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIGFsbCBmdW5jdGlvbnM6XG4gICAqXG4gICAqICAgICAvLyBmdW5jdGlvbnMgdG8gY2hhbmdlIHdoZXJlIGJlaW5nIHdyaXR0ZW4sIHN0ZG91dCBhbmQgc3RkZXJyXG4gICAqICAgICB3cml0ZU91dChzdHIpXG4gICAqICAgICB3cml0ZUVycihzdHIpXG4gICAqICAgICAvLyBtYXRjaGluZyBmdW5jdGlvbnMgdG8gc3BlY2lmeSB3aWR0aCBmb3Igd3JhcHBpbmcgaGVscFxuICAgKiAgICAgZ2V0T3V0SGVscFdpZHRoKClcbiAgICogICAgIGdldEVyckhlbHBXaWR0aCgpXG4gICAqICAgICAvLyBmdW5jdGlvbnMgYmFzZWQgb24gd2hhdCBpcyBiZWluZyB3cml0dGVuIG91dFxuICAgKiAgICAgb3V0cHV0RXJyb3Ioc3RyLCB3cml0ZSkgLy8gdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvcnMsIGFuZCBub3QgdXNlZCBmb3IgZGlzcGxheWluZyBoZWxwXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZU91dHB1dChjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb247XG5cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGhlbHAgb3IgYSBjdXN0b20gbWVzc2FnZSBhZnRlciBhbiBlcnJvciBvY2N1cnMuXG4gICAqXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58c3RyaW5nKX0gW2Rpc3BsYXlIZWxwXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dIZWxwQWZ0ZXJFcnJvcihkaXNwbGF5SGVscCA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIGRpc3BsYXlIZWxwICE9PSAnc3RyaW5nJykgZGlzcGxheUhlbHAgPSAhIWRpc3BsYXlIZWxwO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGRpc3BsYXlIZWxwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc3VnZ2VzdGlvbiBvZiBzaW1pbGFyIGNvbW1hbmRzIGZvciB1bmtub3duIGNvbW1hbmRzLCBvciBvcHRpb25zIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BsYXlTdWdnZXN0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcihkaXNwbGF5U3VnZ2VzdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSAhIWRpc3BsYXlTdWdnZXN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByZXBhcmVkIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kIHdoaWNoIGluaGVyaXRzIHNldHRpbmdzIGZyb20gaXRzIHBhcmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWQgLSBuZXcgc3ViY29tbWFuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhZGRDb21tYW5kKGNtZCwgb3B0cykge1xuICAgIGlmICghY21kLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQgcGFzc2VkIHRvIC5hZGRDb21tYW5kKCkgbXVzdCBoYXZlIGEgbmFtZVxuLSBzcGVjaWZ5IHRoZSBuYW1lIGluIENvbW1hbmQgY29uc3RydWN0b3Igb3IgdXNpbmcgLm5hbWUoKWApO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChvcHRzLm5vSGVscCB8fCBvcHRzLmhpZGRlbikgY21kLl9oaWRkZW4gPSB0cnVlOyAvLyBtb2RpZnlpbmcgcGFzc2VkIGNvbW1hbmQgZHVlIHRvIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uXG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBhcmd1bWVudC5cbiAgICpcbiAgICogU2VlIC5hcmd1bWVudCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBhcmd1bWVudCwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBhcmd1bWVudC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVBcmd1bWVudCB0byByZXR1cm4gYSBjdXN0b20gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fSBuZXcgYXJndW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5hcmd1bWVudCgnPGlucHV0LWZpbGU+Jyk7XG4gICAqIHByb2dyYW0uYXJndW1lbnQoJ1tvdXRwdXQtZmlsZV0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtmbl0gLSBjdXN0b20gYXJndW1lbnQgcHJvY2Vzc2luZyBmdW5jdGlvblxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24sIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IHRoaXMuY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGZuKTtcbiAgICB9XG4gICAgdGhpcy5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIG11bHRpcGxlIGF0IG9uY2UgKHdpdGhvdXQgZGVzY3JpcHRpb25zKS5cbiAgICpcbiAgICogU2VlIGFsc28gLmFyZ3VtZW50KCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnRzKCc8Y21kPiBbZW52XScpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFyZ3VtZW50cyhuYW1lcykge1xuICAgIG5hbWVzXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoLyArLylcbiAgICAgIC5mb3JFYWNoKChkZXRhaWwpID0+IHtcbiAgICAgICAgdGhpcy5hcmd1bWVudChkZXRhaWwpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIGEgcHJlcGFyZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkQXJndW1lbnQoYXJndW1lbnQpIHtcbiAgICBjb25zdCBwcmV2aW91c0FyZ3VtZW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAocHJldmlvdXNBcmd1bWVudCAmJiBwcmV2aW91c0FyZ3VtZW50LnZhcmlhZGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBvbmx5IHRoZSBsYXN0IGFyZ3VtZW50IGNhbiBiZSB2YXJpYWRpYyAnJHtwcmV2aW91c0FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFyZ3VtZW50LnJlcXVpcmVkICYmXG4gICAgICBhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXJndW1lbnQucGFyc2VBcmcgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcXVpcmVkIGFyZ3VtZW50IGlzIG5ldmVyIHVzZWQ6ICcke2FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b21pc2Ugb3Igb3ZlcnJpZGUgZGVmYXVsdCBoZWxwIGNvbW1hbmQuIEJ5IGRlZmF1bHQgYSBoZWxwIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBpZiB5b3VyIGNvbW1hbmQgaGFzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnc2hvdyBoZWxwJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoZmFsc2UpOyAvLyBzdXBwcmVzcyBkZWZhdWx0IGhlbHAgY29tbWFuZFxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKHRydWUpOyAvLyBhZGQgaGVscCBjb21tYW5kIGV2ZW4gaWYgbm8gc3ViY29tbWFuZHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Ym9vbGVhbn0gZW5hYmxlT3JOYW1lQW5kQXJncyAtIGVuYWJsZSB3aXRoIGN1c3RvbSBuYW1lIGFuZC9vciBhcmd1bWVudHMsIG9yIGJvb2xlYW4gdG8gb3ZlcnJpZGUgd2hldGhlciBhZGRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXSAtIGN1c3RvbSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscENvbW1hbmQoZW5hYmxlT3JOYW1lQW5kQXJncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIGVuYWJsZU9yTmFtZUFuZEFyZ3MgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGVuYWJsZU9yTmFtZUFuZEFyZ3M7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBlbmFibGVPck5hbWVBbmRBcmdzID0gZW5hYmxlT3JOYW1lQW5kQXJncyA/PyAnaGVscCBbY29tbWFuZF0nO1xuICAgIGNvbnN0IFssIGhlbHBOYW1lLCBoZWxwQXJnc10gPSBlbmFibGVPck5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG4gICAgY29uc3QgaGVscERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG5cbiAgICBjb25zdCBoZWxwQ29tbWFuZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChoZWxwTmFtZSk7XG4gICAgaGVscENvbW1hbmQuaGVscE9wdGlvbihmYWxzZSk7XG4gICAgaWYgKGhlbHBBcmdzKSBoZWxwQ29tbWFuZC5hcmd1bWVudHMoaGVscEFyZ3MpO1xuICAgIGlmIChoZWxwRGVzY3JpcHRpb24pIGhlbHBDb21tYW5kLmRlc2NyaXB0aW9uKGhlbHBEZXNjcmlwdGlvbik7XG5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IGhlbHBDb21tYW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHByZXBhcmVkIGN1c3RvbSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7KENvbW1hbmR8c3RyaW5nfGJvb2xlYW4pfSBoZWxwQ29tbWFuZCAtIGN1c3RvbSBoZWxwIGNvbW1hbmQsIG9yIGRlcHJlY2F0ZWQgZW5hYmxlT3JOYW1lQW5kQXJncyBhcyBmb3IgYC5oZWxwQ29tbWFuZCgpYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RlcHJlY2F0ZWREZXNjcmlwdGlvbl0gLSBkZXByZWNhdGVkIGN1c3RvbSBkZXNjcmlwdGlvbiB1c2VkIHdpdGggY3VzdG9tIG5hbWUgb25seVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pIHtcbiAgICAvLyBJZiBub3QgcGFzc2VkIGFuIG9iamVjdCwgY2FsbCB0aHJvdWdoIHRvIGhlbHBDb21tYW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSxcbiAgICAvLyBhcyBhZGRIZWxwQ29tbWFuZCB3YXMgb3JpZ2luYWxseSB1c2VkIGxpa2UgaGVscENvbW1hbmQgaXMgbm93LlxuICAgIGlmICh0eXBlb2YgaGVscENvbW1hbmQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEByZXR1cm4geyhDb21tYW5kfG51bGwpfVxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBDb21tYW5kKCkge1xuICAgIGNvbnN0IGhhc0ltcGxpY2l0SGVscENvbW1hbmQgPVxuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA/P1xuICAgICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoICYmXG4gICAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAgICF0aGlzLl9maW5kQ29tbWFuZCgnaGVscCcpKTtcblxuICAgIGlmIChoYXNJbXBsaWNpdEhlbHBDb21tYW5kKSB7XG4gICAgICBpZiAodGhpcy5faGVscENvbW1hbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhlbHBDb21tYW5kKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTsgLy8gdXNlIGRlZmF1bHQgbmFtZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9oZWxwQ29tbWFuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGhvb2sgZm9yIGxpZmUgY3ljbGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaG9vayhldmVudCwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydwcmVTdWJjb21tYW5kJywgJ3ByZUFjdGlvbicsICdwb3N0QWN0aW9uJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBldmVudCBwYXNzZWQgdG8gaG9vayA6ICcke2V2ZW50fScuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgY2FsbGluZyBwcm9jZXNzLmV4aXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSBDb21tYW5kZXJFcnJvciwgZGVmYXVsdHMgdG8gdGhyb3dpbmdcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGV4aXRPdmVycmlkZShmbikge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrID0gZm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFzeW5jIGNhbGxiYWNrIGZyb20gc3Bhd24gZXZlbnRzLCBub3QgdXNlZnVsIHRvIHRocm93LlxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHByb2Nlc3MuZXhpdCwgYW5kIF9leGl0Q2FsbGJhY2sgaWYgZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIGV4aXQgY29kZSBmb3IgdXNpbmcgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yXG4gICAqIEByZXR1cm4gbmV2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4aXQoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5fZXhpdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sobmV3IENvbW1hbmRlckVycm9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAvLyBFeHBlY3RpbmcgdGhpcyBsaW5lIGlzIG5vdCByZWFjaGVkLlxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3NlcnZlJylcbiAgICogICAuZGVzY3JpcHRpb24oJ3N0YXJ0IHNlcnZpY2UnKVxuICAgKiAgIC5hY3Rpb24oZnVuY3Rpb24oKSB7XG4gICAqICAgICAgLy8gZG8gd29yayBoZXJlXG4gICAqICAgfSk7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhY3Rpb24oZm4pIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzKSA9PiB7XG4gICAgICAvLyBUaGUgLmFjdGlvbiBjYWxsYmFjayB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIGNvbW1hbmQgb3Igb3B0aW9ucy5cbiAgICAgIGNvbnN0IGV4cGVjdGVkQXJnc0NvdW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSBhcmdzLnNsaWNlKDAsIGV4cGVjdGVkQXJnc0NvdW50KTtcbiAgICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZSBcIm9wdGlvbnNcIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzLm9wdHMoKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbkFyZ3MucHVzaCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFjdGlvbkFyZ3MpO1xuICAgIH07XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBvcHRpb24uXG4gICAqXG4gICAqIFNlZSAub3B0aW9uKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIG9wdGlvbiwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBvcHRpb24uIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlT3B0aW9uIHRvIHJldHVybiBhIGN1c3RvbSBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259IG5ldyBvcHRpb25cbiAgICovXG5cbiAgY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCBwYXJzZUFyZ3MgdG8gY2F0Y2ggJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnLlxuICAgKlxuICAgKiBAcGFyYW0geyhPcHRpb24gfCBBcmd1bWVudCl9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHsqfSBwcmV2aW91c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZEFyZ3VtZW50TWVzc2FnZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2FsbFBhcnNlQXJnKHRhcmdldCwgdmFsdWUsIHByZXZpb3VzLCBpbnZhbGlkQXJndW1lbnRNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQucGFyc2VBcmcodmFsdWUsIHByZXZpb3VzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtpbnZhbGlkQXJndW1lbnRNZXNzYWdlfSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBleGl0Q29kZTogZXJyLmV4aXRDb2RlLCBjb2RlOiBlcnIuY29kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIG9wdGlvbiBmbGFnIGNvbmZsaWN0cy5cbiAgICogUmVnaXN0ZXIgb3B0aW9uIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbikge1xuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID1cbiAgICAgIChvcHRpb24uc2hvcnQgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24uc2hvcnQpKSB8fFxuICAgICAgKG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpKTtcbiAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmxhZyA9XG4gICAgICAgIG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpXG4gICAgICAgICAgPyBvcHRpb24ubG9uZ1xuICAgICAgICAgIDogb3B0aW9uLnNob3J0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWRkIG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyR7dGhpcy5fbmFtZSAmJiBgIHRvIGNvbW1hbmQgJyR7dGhpcy5fbmFtZX0nYH0gZHVlIHRvIGNvbmZsaWN0aW5nIGZsYWcgJyR7bWF0Y2hpbmdGbGFnfSdcbi0gIGFscmVhZHkgdXNlZCBieSBvcHRpb24gJyR7bWF0Y2hpbmdPcHRpb24uZmxhZ3N9J2ApO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNvbW1hbmQgbmFtZSBhbmQgYWxpYXMgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29tbWFuZHMuXG4gICAqIFJlZ2lzdGVyIGNvbW1hbmQgaWYgbm8gY29uZmxpY3RzIGZvdW5kLCBvciB0aHJvdyBvbiBjb25mbGljdC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3RlckNvbW1hbmQoY29tbWFuZCkge1xuICAgIGNvbnN0IGtub3duQnkgPSAoY21kKSA9PiB7XG4gICAgICByZXR1cm4gW2NtZC5uYW1lKCldLmNvbmNhdChjbWQuYWxpYXNlcygpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWxyZWFkeVVzZWQgPSBrbm93bkJ5KGNvbW1hbmQpLmZpbmQoKG5hbWUpID0+XG4gICAgICB0aGlzLl9maW5kQ29tbWFuZChuYW1lKSxcbiAgICApO1xuICAgIGlmIChhbHJlYWR5VXNlZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBrbm93bkJ5KHRoaXMuX2ZpbmRDb21tYW5kKGFscmVhZHlVc2VkKSkuam9pbignfCcpO1xuICAgICAgY29uc3QgbmV3Q21kID0ga25vd25CeShjb21tYW5kKS5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGNvbW1hbmQgJyR7bmV3Q21kfScgYXMgYWxyZWFkeSBoYXZlIGNvbW1hbmQgJyR7ZXhpc3RpbmdDbWR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbik7XG5cbiAgICBjb25zdCBvbmFtZSA9IG9wdGlvbi5uYW1lKCk7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG5cbiAgICAvLyBzdG9yZSBkZWZhdWx0IHZhbHVlXG4gICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgIC8vIC0tbm8tZm9vIGlzIHNwZWNpYWwgYW5kIGRlZmF1bHRzIGZvbyB0byB0cnVlLCB1bmxlc3MgYSAtLWZvbyBvcHRpb24gaXMgYWxyZWFkeSBkZWZpbmVkXG4gICAgICBjb25zdCBwb3NpdGl2ZUxvbmdGbGFnID0gb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tbm8tLywgJy0tJyk7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmRPcHRpb24ocG9zaXRpdmVMb25nRmxhZykpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBvcHRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIG9wdGlvbi5kZWZhdWx0VmFsdWUsICdkZWZhdWx0Jyk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlciBmb3IgY2xpIGFuZCBlbnYgc3VwcGxpZWQgdmFsdWVzXG4gICAgY29uc3QgaGFuZGxlT3B0aW9uVmFsdWUgPSAodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCB2YWx1ZVNvdXJjZSkgPT4ge1xuICAgICAgLy8gdmFsIGlzIG51bGwgZm9yIG9wdGlvbmFsIG9wdGlvbiB1c2VkIHdpdGhvdXQgYW4gb3B0aW9uYWwtYXJndW1lbnQuXG4gICAgICAvLyB2YWwgaXMgdW5kZWZpbmVkIGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG9wdGlvbi5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBvcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gb3B0aW9uLnByZXNldEFyZztcbiAgICAgIH1cblxuICAgICAgLy8gY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShuYW1lKTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuX2NhbGxQYXJzZUFyZyhvcHRpb24sIHZhbCwgb2xkVmFsdWUsIGludmFsaWRWYWx1ZU1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnZhcmlhZGljKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5fY29uY2F0VmFsdWUodmFsLCBvbGRWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGwtaW4gYXBwcm9wcmlhdGUgbWlzc2luZyB2YWx1ZXMuIExvbmcgd2luZGVkIGJ1dCBlYXN5IHRvIGZvbGxvdy5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5pc0Jvb2xlYW4oKSB8fCBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9ICcnOyAvLyBub3Qgbm9ybWFsLCBwYXJzZUFyZyBtaWdodCBoYXZlIGZhaWxlZCBvciBiZSBhIG1vY2sgZnVuY3Rpb24gZm9yIHRlc3RpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UobmFtZSwgdmFsLCB2YWx1ZVNvdXJjZSk7XG4gICAgfTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsICh2YWwpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCAnJHt2YWx9JyBpcyBpbnZhbGlkLmA7XG4gICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdjbGknKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb24uZW52VmFyKSB7XG4gICAgICB0aGlzLm9uKCdvcHRpb25FbnY6JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyB2YWx1ZSAnJHt2YWx9JyBmcm9tIGVudiAnJHtvcHRpb24uZW52VmFyfScgaXMgaW52YWxpZC5gO1xuICAgICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdlbnYnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIHNoYXJlZCBieSAub3B0aW9uKCkgYW5kIC5yZXF1aXJlZE9wdGlvbigpXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29wdGlvbkV4KGNvbmZpZywgZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ29iamVjdCcgJiYgZmxhZ3MgaW5zdGFuY2VvZiBPcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RvIGFkZCBhbiBPcHRpb24gb2JqZWN0IHVzZSBhZGRPcHRpb24oKSBpbnN0ZWFkIG9mIG9wdGlvbigpIG9yIHJlcXVpcmVkT3B0aW9uKCknLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICBvcHRpb24ubWFrZU9wdGlvbk1hbmRhdG9yeSghIWNvbmZpZy5tYW5kYXRvcnkpO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2UgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBkZXByZWNhdGVkXG4gICAgICBjb25zdCByZWdleCA9IGZuO1xuICAgICAgZm4gPSAodmFsLCBkZWYpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWModmFsKTtcbiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogZGVmO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvcHRpb24gd2l0aCBgZmxhZ3NgLCBgZGVzY3JpcHRpb25gLCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiBvciBgZGVmYXVsdFZhbHVlYCBvciBib3RoLlxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS4gQSByZXF1aXJlZFxuICAgKiBvcHRpb24tYXJndW1lbnQgaXMgaW5kaWNhdGVkIGJ5IGA8PmAgYW5kIGFuIG9wdGlvbmFsIG9wdGlvbi1hcmd1bWVudCBieSBgW11gLlxuICAgKlxuICAgKiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLCBhbmQgc2VlIGFsc28gYWRkT3B0aW9uKCkgYW5kIHJlcXVpcmVkT3B0aW9uKCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBlcHBlcicsICdhZGQgcGVwcGVyJylcbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBpenphLXR5cGUgPFRZUEU+JywgJ3R5cGUgb2YgcGl6emEnKSAvLyByZXF1aXJlZCBvcHRpb24tYXJndW1lbnRcbiAgICogICAgIC5vcHRpb24oJy1jLCAtLWNoZWVzZSBbQ0hFRVNFXScsICdhZGQgZXh0cmEgY2hlZXNlJywgJ21venphcmVsbGEnKSAvLyBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgd2l0aCBkZWZhdWx0XG4gICAqICAgICAub3B0aW9uKCctdCwgLS10aXAgPFZBTFVFPicsICdhZGQgdGlwIHRvIHB1cmNoYXNlIGNvc3QnLCBwYXJzZUZsb2F0KSAvLyBjdXN0b20gcGFyc2UgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgb3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeCh7fSwgZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZXF1aXJlZCBvcHRpb24gd2hpY2ggbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZy4gVGhpcyB1c3VhbGx5IG1lYW5zXG4gICAqIHRoZSBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKE90aGVyd2lzZSB0aGUgc2FtZSBhcyAub3B0aW9uKCkuKVxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcmVxdWlyZWRPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkV4KFxuICAgICAgeyBtYW5kYXRvcnk6IHRydWUgfSxcbiAgICAgIGZsYWdzLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBwYXJzZUFyZyxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyIHBhcnNpbmcgb2Ygc2hvcnQgZmxhZ3Mgd2l0aCBvcHRpb25hbCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGZvciBgLm9wdGlvbignLWYsLS1mbGFnIFt2YWx1ZV0nKTpcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUodHJ1ZSk7ICAvLyBgLWY4MGAgaXMgdHJlYXRlZCBsaWtlIGAtLWZsYWc9ODBgLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91clxuICAgKiBwcm9ncmFtLmNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZShmYWxzZSkgLy8gYC1mYmAgaXMgdHJlYXRlZCBsaWtlIGAtZiAtYmBcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29tYmluZV0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgYW4gb3B0aW9uYWwgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgZmxhZy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoY29tYmluZSA9IHRydWUpIHtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSAhIWNvbWJpbmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdW5rbm93biBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93VW5rbm93bl0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd1Vua25vd25PcHRpb24oYWxsb3dVbmtub3duID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9ICEhYWxsb3dVbmtub3duO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGV4Y2VzcyBjb21tYW5kLWFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBQYXNzIGZhbHNlIHRvIG1ha2UgZXhjZXNzIGFyZ3VtZW50cyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dFeGNlc3NdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciBleGNlc3MgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFsbG93RXhjZXNzQXJndW1lbnRzKGFsbG93RXhjZXNzID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gISFhbGxvd0V4Y2VzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcG9zaXRpb25hbCBvcHRpb25zLiBQb3NpdGlvbmFsIG1lYW5zIGdsb2JhbCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYmVmb3JlIHN1YmNvbW1hbmRzIHdoaWNoIGxldHNcbiAgICogc3ViY29tbWFuZHMgcmV1c2UgdGhlIHNhbWUgb3B0aW9uIG5hbWVzLCBhbmQgYWxzbyBlbmFibGVzIHN1YmNvbW1hbmRzIHRvIHR1cm4gb24gcGFzc1Rocm91Z2hPcHRpb25zLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIGdsb2JhbCBvcHRpb25zIG1heSBhcHBlYXIgYW55d2hlcmUgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcG9zaXRpb25hbF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVQb3NpdGlvbmFsT3B0aW9ucyhwb3NpdGlvbmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gISFwb3NpdGlvbmFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgdGhyb3VnaCBvcHRpb25zIHRoYXQgY29tZSBhZnRlciBjb21tYW5kLWFyZ3VtZW50cyByYXRoZXIgdGhhbiB0cmVhdCB0aGVtIGFzIGNvbW1hbmQtb3B0aW9ucyxcbiAgICogc28gYWN0dWFsIGNvbW1hbmQtb3B0aW9ucyBjb21lIGJlZm9yZSBjb21tYW5kLWFyZ3VtZW50cy4gVHVybmluZyB0aGlzIG9uIGZvciBhIHN1YmNvbW1hbmQgcmVxdWlyZXNcbiAgICogcG9zaXRpb25hbCBvcHRpb25zIHRvIGhhdmUgYmVlbiBlbmFibGVkIG9uIHRoZSBwcm9ncmFtIChwYXJlbnQgY29tbWFuZHMpLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIG9wdGlvbnMgbWF5IGFwcGVhciBiZWZvcmUgb3IgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bhc3NUaHJvdWdoXSBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHBhc3NUaHJvdWdoT3B0aW9ucyhwYXNzVGhyb3VnaCA9IHRydWUpIHtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSAhIXBhc3NUaHJvdWdoO1xuICAgIHRoaXMuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhcmVudCAmJlxuICAgICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zICYmXG4gICAgICAhdGhpcy5wYXJlbnQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwYXNzVGhyb3VnaE9wdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yICcke3RoaXMuX25hbWV9JyB3aXRob3V0IHR1cm5pbmcgb24gZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgZm9yIHBhcmVudCBjb21tYW5kKHMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RvcmUgb3B0aW9uIHZhbHVlcyBhcyBwcm9wZXJ0aWVzIG9uIGNvbW1hbmQgb2JqZWN0LFxuICAgKiBvciBzdG9yZSBzZXBhcmF0ZWx5IChzcGVjaWZ5IGZhbHNlKS4gSW4gYm90aCBjYXNlcyB0aGUgb3B0aW9uIHZhbHVlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgLm9wdHMoKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc3RvcmVBc1Byb3BlcnRpZXM9dHJ1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHN0b3JlT3B0aW9uc0FzUHJvcGVydGllcyhzdG9yZUFzUHJvcGVydGllcyA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgYWRkaW5nIG9wdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX29wdGlvblZhbHVlcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgc2V0dGluZyBvcHRpb24gdmFsdWVzJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9ICEhc3RvcmVBc1Byb3BlcnRpZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge29iamVjdH0gdmFsdWVcbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2Uoa2V5LCB2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBleHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQvY29uZmlnL2Vudi9jbGkvaW1wbGllZFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHNvdXJjZSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS5cbiAgICogRXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0IHwgY29uZmlnIHwgZW52IHwgY2xpIHwgaW1wbGllZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlU291cmNlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2Ugb2Ygb3B0aW9uIHZhbHVlLiBTZWUgYWxzbyAub3B0c1dpdGhHbG9iYWxzKCkuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlV2l0aEdsb2JhbHMoa2V5KSB7XG4gICAgLy8gZ2xvYmFsIG92ZXJ3cml0ZXMgbG9jYWwsIGxpa2Ugb3B0c1dpdGhHbG9iYWxzXG4gICAgbGV0IHNvdXJjZTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBpZiAoY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2UgPSBjbWQuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGFyZ3VtZW50cyBmcm9tIGltcGxpZWQgb3IgZXhwbGljaXQgYXJndW1lbnRzLlxuICAgKiBTaWRlLWVmZmVjdHM6IHNldCBfc2NyaXB0UGF0aCBpZiBhcmdzIGluY2x1ZGVkIHNjcmlwdC4gVXNlZCBmb3IgZGVmYXVsdCBwcm9ncmFtIG5hbWUsIGFuZCBzdWJjb21tYW5kIHNlYXJjaGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGlmIChhcmd2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYXJndikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmlyc3QgcGFyYW1ldGVyIHRvIHBhcnNlIG11c3QgYmUgYXJyYXkgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIGF1dG8tZGV0ZWN0IGFyZ3VtZW50IGNvbnZlbnRpb25zIGlmIG5vdGhpbmcgc3VwcGxpZWRcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkICYmIHBhcnNlT3B0aW9ucy5mcm9tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnZlcnNpb25zPy5lbGVjdHJvbikge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdlbGVjdHJvbic7XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBub2RlIHNwZWNpZmljIG9wdGlvbnMgZm9yIHNjZW5hcmlvcyB3aGVyZSB1c2VyIENMSSBhcmdzIGZvbGxvdyBleGVjdXRhYmxlIHdpdGhvdXQgc2NyaXB0bmFtZVxuICAgICAgY29uc3QgZXhlY0FyZ3YgPSBwcm9jZXNzLmV4ZWNBcmd2ID8/IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLWUnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLS1ldmFsJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1wJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tcHJpbnQnKVxuICAgICAgKSB7XG4gICAgICAgIHBhcnNlT3B0aW9ucy5mcm9tID0gJ2V2YWwnOyAvLyBpbnRlcm5hbCB1c2FnZSwgbm90IGRvY3VtZW50ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIHByb2Nlc3MuYXJndlxuICAgIGlmIChhcmd2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgfVxuICAgIHRoaXMucmF3QXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIC8vIGV4dHJhY3QgdGhlIHVzZXIgYXJncyBhbmQgc2NyaXB0UGF0aFxuICAgIGxldCB1c2VyQXJncztcbiAgICBzd2l0Y2ggKHBhcnNlT3B0aW9ucy5mcm9tKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VsZWN0cm9uJzpcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBkZWZhdWx0QXBwIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZGVmYXVsdEFwcCkge1xuICAgICAgICAgIHRoaXMuX3NjcmlwdFBhdGggPSBhcmd2WzFdO1xuICAgICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V2YWwnOlxuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmV4cGVjdGVkIHBhcnNlIG9wdGlvbiB7IGZyb206ICcke3BhcnNlT3B0aW9ucy5mcm9tfScgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBkZWZhdWx0IG5hbWUgZm9yIHByb2dyYW0gZnJvbSBhcmd1bWVudHMuXG4gICAgaWYgKCF0aGlzLl9uYW1lICYmIHRoaXMuX3NjcmlwdFBhdGgpXG4gICAgICB0aGlzLm5hbWVGcm9tRmlsZW5hbWUodGhpcy5fc2NyaXB0UGF0aCk7XG4gICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUgfHwgJ3Byb2dyYW0nO1xuXG4gICAgcmV0dXJuIHVzZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIFVzZSBwYXJzZUFzeW5jIGluc3RlYWQgb2YgcGFyc2UgaWYgYW55IG9mIHlvdXIgYWN0aW9uIGhhbmRsZXJzIGFyZSBhc3luYy5cbiAgICpcbiAgICogQ2FsbCB3aXRoIG5vIHBhcmFtZXRlcnMgdG8gcGFyc2UgYHByb2Nlc3MuYXJndmAuIERldGVjdHMgRWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBvcHRpb25zIGxpa2UgYG5vZGUgLS1ldmFsYC4gRWFzeSBtb2RlIVxuICAgKlxuICAgKiBPciBjYWxsIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBwYXJzZSwgYW5kIG9wdGlvbmFsbHkgd2hlcmUgdGhlIHVzZXIgYXJndW1lbnRzIHN0YXJ0IGJ5IHNwZWNpZnlpbmcgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgYGZyb21gOlxuICAgKiAtIGAnbm9kZSdgOiBkZWZhdWx0LCBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgaXMgdGhlIHNjcmlwdCBiZWluZyBydW4sIHdpdGggdXNlciBhcmd1bWVudHMgYWZ0ZXIgdGhhdFxuICAgKiAtIGAnZWxlY3Ryb24nYDogYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZWxlY3Ryb24gYXBwbGljYXRpb24gaXMgcGFja2FnZWRcbiAgICogLSBgJ3VzZXInYDoganVzdCB1c2VyIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLnBhcnNlKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogcHJvZ3JhbS5wYXJzZShteS1hcmdzLCB7IGZyb206ICd1c2VyJyB9KTsgLy8ganVzdCB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50cywgbm90aGluZyBzcGVjaWFsIGFib3V0IGFyZ3ZbMF1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3ZdIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHByb2Nlc3MuYXJndlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc10gLSBvcHRpb25hbGx5IHNwZWNpZnkgc3R5bGUgb2Ygb3B0aW9ucyB3aXRoIGZyb206IG5vZGUvdXNlci9lbGVjdHJvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcnNlT3B0aW9ucy5mcm9tXSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcGFyc2UoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KTsgLy8gYXNzdW1lIGFyZ3ZbMF0gaXMgYXBwIGFuZCBhcmd2WzFdIGlzIHNjcmlwdFxuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcnNlT3B0aW9ucy5mcm9tIC0gd2hlcmUgdGhlIGFyZ3MgYXJlIGZyb206ICdub2RlJywgJ3VzZXInLCAnZWxlY3Ryb24nXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuXG4gIGFzeW5jIHBhcnNlQXN5bmMoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWItY29tbWFuZCBleGVjdXRhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhlY3V0ZVN1YkNvbW1hbmQoc3ViY29tbWFuZCwgYXJncykge1xuICAgIGFyZ3MgPSBhcmdzLnNsaWNlKCk7XG4gICAgbGV0IGxhdW5jaFdpdGhOb2RlID0gZmFsc2U7IC8vIFVzZSBub2RlIGZvciBzb3VyY2UgdGFyZ2V0cyBzbyBkbyBub3QgbmVlZCB0byBnZXQgcGVybWlzc2lvbnMgY29ycmVjdCwgYW5kIG9uIFdpbmRvd3MuXG4gICAgY29uc3Qgc291cmNlRXh0ID0gWycuanMnLCAnLnRzJywgJy50c3gnLCAnLm1qcycsICcuY2pzJ107XG5cbiAgICBmdW5jdGlvbiBmaW5kRmlsZShiYXNlRGlyLCBiYXNlTmFtZSkge1xuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWVkIGZpbGVcbiAgICAgIGNvbnN0IGxvY2FsQmluID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGJhc2VOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQmluKSkgcmV0dXJuIGxvY2FsQmluO1xuXG4gICAgICAvLyBTdG9wIGxvb2tpbmcgaWYgY2FuZGlkYXRlIGFscmVhZHkgaGFzIGFuIGV4cGVjdGVkIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGJhc2VOYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFRyeSBhbGwgdGhlIGV4dGVuc2lvbnMuXG4gICAgICBjb25zdCBmb3VuZEV4dCA9IHNvdXJjZUV4dC5maW5kKChleHQpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoYCR7bG9jYWxCaW59JHtleHR9YCksXG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kRXh0KSByZXR1cm4gYCR7bG9jYWxCaW59JHtmb3VuZEV4dH1gO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE5vdCBjaGVja2luZyBmb3IgaGVscCBmaXJzdC4gVW5saWtlbHkgdG8gaGF2ZSBtYW5kYXRvcnkgYW5kIGV4ZWN1dGFibGUsIGFuZCBjYW4ndCByb2J1c3RseSB0ZXN0IGZvciBoZWxwIGZsYWdzIGluIGV4dGVybmFsIGNvbW1hbmQuXG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBleGVjdXRhYmxlRmlsZSBhbmQgZXhlY3V0YWJsZURpciBtaWdodCBiZSBmdWxsIHBhdGgsIG9yIGp1c3QgYSBuYW1lXG4gICAgbGV0IGV4ZWN1dGFibGVGaWxlID1cbiAgICAgIHN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlIHx8IGAke3RoaXMuX25hbWV9LSR7c3ViY29tbWFuZC5fbmFtZX1gO1xuICAgIGxldCBleGVjdXRhYmxlRGlyID0gdGhpcy5fZXhlY3V0YWJsZURpciB8fCAnJztcbiAgICBpZiAodGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgbGV0IHJlc29sdmVkU2NyaXB0UGF0aDsgLy8gcmVzb2x2ZSBwb3NzaWJsZSBzeW1saW5rIGZvciBpbnN0YWxsZWQgbnBtIGJpbmFyeVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRTY3JpcHRQYXRoID0gZnMucmVhbHBhdGhTeW5jKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IHRoaXMuX3NjcmlwdFBhdGg7XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRGlyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmRpcm5hbWUocmVzb2x2ZWRTY3JpcHRQYXRoKSxcbiAgICAgICAgZXhlY3V0YWJsZURpcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBmb3IgYSBsb2NhbCBmaWxlIGluIHByZWZlcmVuY2UgdG8gYSBjb21tYW5kIGluIFBBVEguXG4gICAgaWYgKGV4ZWN1dGFibGVEaXIpIHtcbiAgICAgIGxldCBsb2NhbEZpbGUgPSBmaW5kRmlsZShleGVjdXRhYmxlRGlyLCBleGVjdXRhYmxlRmlsZSk7XG5cbiAgICAgIC8vIExlZ2FjeSBzZWFyY2ggdXNpbmcgcHJlZml4IG9mIHNjcmlwdCBuYW1lIGluc3RlYWQgb2YgY29tbWFuZCBuYW1lXG4gICAgICBpZiAoIWxvY2FsRmlsZSAmJiAhc3ViY29tbWFuZC5fZXhlY3V0YWJsZUZpbGUgJiYgdGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgICBjb25zdCBsZWdhY3lOYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoLFxuICAgICAgICAgIHBhdGguZXh0bmFtZSh0aGlzLl9zY3JpcHRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxlZ2FjeU5hbWUgIT09IHRoaXMuX25hbWUpIHtcbiAgICAgICAgICBsb2NhbEZpbGUgPSBmaW5kRmlsZShcbiAgICAgICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICAgICAgICBgJHtsZWdhY3lOYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRmlsZSA9IGxvY2FsRmlsZSB8fCBleGVjdXRhYmxlRmlsZTtcbiAgICB9XG5cbiAgICBsYXVuY2hXaXRoTm9kZSA9IHNvdXJjZUV4dC5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZXhlY3V0YWJsZUZpbGUpKTtcblxuICAgIGxldCBwcm9jO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgICBpZiAobGF1bmNoV2l0aE5vZGUpIHtcbiAgICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG5cbiAgICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24oZXhlY3V0YWJsZUZpbGUsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgYXJncyA9IGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KHByb2Nlc3MuZXhlY0FyZ3YpLmNvbmNhdChhcmdzKTtcbiAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIH1cblxuICAgIGlmICghcHJvYy5raWxsZWQpIHtcbiAgICAgIC8vIHRlc3RpbmcgbWFpbmx5IHRvIGF2b2lkIGxlYWsgd2FybmluZ3MgZHVyaW5nIHVuaXQgdGVzdHMgd2l0aCBtb2NrZWQgc3Bhd25cbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBbJ1NJR1VTUjEnLCAnU0lHVVNSMicsICdTSUdURVJNJywgJ1NJR0lOVCcsICdTSUdIVVAnXTtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Mua2lsbGVkID09PSBmYWxzZSAmJiBwcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIGJlY2F1c2Ugc2lnbmFscyBub3QgdHlwZWQgdG8ga25vd24gc3RyaW5nc1xuICAgICAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQgdGVybWluYXRlIHByb2Nlc3Mgd2hlbiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICBjb25zdCBleGl0Q2FsbGJhY2sgPSB0aGlzLl9leGl0Q2FsbGJhY2s7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgY29kZSA9IGNvZGUgPz8gMTsgLy8gY29kZSBpcyBudWxsIGlmIHNwYXduZWQgcHJvY2VzcyB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbFxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdENhbGxiYWNrKFxuICAgICAgICAgIG5ldyBDb21tYW5kZXJFcnJvcihcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICAgJyhjbG9zZSknLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0YWJsZURpck1lc3NhZ2UgPSBleGVjdXRhYmxlRGlyXG4gICAgICAgICAgPyBgc2VhcmNoZWQgZm9yIGxvY2FsIHN1YmNvbW1hbmQgcmVsYXRpdmUgdG8gZGlyZWN0b3J5ICcke2V4ZWN1dGFibGVEaXJ9J2BcbiAgICAgICAgICA6ICdubyBkaXJlY3RvcnkgZm9yIHNlYXJjaCBmb3IgbG9jYWwgc3ViY29tbWFuZCwgdXNlIC5leGVjdXRhYmxlRGlyKCkgdG8gc3VwcGx5IGEgY3VzdG9tIGRpcmVjdG9yeSc7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVNaXNzaW5nID0gYCcke2V4ZWN1dGFibGVGaWxlfScgZG9lcyBub3QgZXhpc3RcbiAtIGlmICcke3N1YmNvbW1hbmQuX25hbWV9JyBpcyBub3QgbWVhbnQgdG8gYmUgYW4gZXhlY3V0YWJsZSBjb21tYW5kLCByZW1vdmUgZGVzY3JpcHRpb24gcGFyYW1ldGVyIGZyb20gJy5jb21tYW5kKCknIGFuZCB1c2UgJy5kZXNjcmlwdGlvbigpJyBpbnN0ZWFkXG4gLSBpZiB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIG5hbWUgaXMgbm90IHN1aXRhYmxlLCB1c2UgdGhlIGV4ZWN1dGFibGVGaWxlIG9wdGlvbiB0byBzdXBwbHkgYSBjdXN0b20gbmFtZSBvciBwYXRoXG4gLSAke2V4ZWN1dGFibGVEaXJNZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihleGVjdXRhYmxlTWlzc2luZyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZXJyLmNvZGUgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgfSBlbHNlIGlmIChlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtleGVjdXRhYmxlRmlsZX0nIG5vdCBleGVjdXRhYmxlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXRDYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgMSxcbiAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICcoZXJyb3IpJyxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlZEVycm9yLm5lc3RlZEVycm9yID0gZXJyO1xuICAgICAgICBleGl0Q2FsbGJhY2sod3JhcHBlZEVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICB0aGlzLnJ1bm5pbmdDb21tYW5kID0gcHJvYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hTdWJjb21tYW5kKGNvbW1hbmROYW1lLCBvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChjb21tYW5kTmFtZSk7XG4gICAgaWYgKCFzdWJDb21tYW5kKSB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcblxuICAgIGxldCBwcm9taXNlQ2hhaW47XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxTdWJDb21tYW5kSG9vayhcbiAgICAgIHByb21pc2VDaGFpbixcbiAgICAgIHN1YkNvbW1hbmQsXG4gICAgICAncHJlU3ViY29tbWFuZCcsXG4gICAgKTtcbiAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgIGlmIChzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9leGVjdXRlU3ViQ29tbWFuZChzdWJDb21tYW5kLCBvcGVyYW5kcy5jb25jYXQodW5rbm93bikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN1YkNvbW1hbmQuX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2VDaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgaGVscCBkaXJlY3RseSBpZiBwb3NzaWJsZSwgb3IgZGlzcGF0Y2ggaWYgbmVjZXNzYXJ5LlxuICAgKiBlLmcuIGhlbHAgZm9vXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9kaXNwYXRjaEhlbHBDb21tYW5kKHN1YmNvbW1hbmROYW1lKSB7XG4gICAgaWYgKCFzdWJjb21tYW5kTmFtZSkge1xuICAgICAgdGhpcy5oZWxwKCk7XG4gICAgfVxuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChzdWJjb21tYW5kTmFtZSk7XG4gICAgaWYgKHN1YkNvbW1hbmQgJiYgIXN1YkNvbW1hbmQuX2V4ZWN1dGFibGVIYW5kbGVyKSB7XG4gICAgICBzdWJDb21tYW5kLmhlbHAoKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBwYXJzaW5nIHRoZSBoZWxwIGZsYWcgdG8gaW52b2tlIHRoZSBoZWxwLlxuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICBzdWJjb21tYW5kTmFtZSxcbiAgICAgIFtdLFxuICAgICAgW3RoaXMuX2dldEhlbHBPcHRpb24oKT8ubG9uZyA/PyB0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LnNob3J0ID8/ICctLWhlbHAnXSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoaXMuYXJncyBhZ2FpbnN0IGV4cGVjdGVkIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKSB7XG4gICAgLy8gdG9vIGZld1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgIGlmIChhcmcucmVxdWlyZWQgJiYgdGhpcy5hcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdG9vIG1hbnlcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzW3RoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2V4Y2Vzc0FyZ3VtZW50cyh0aGlzLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoaXMuYXJncyB1c2luZyB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgYW5kIHNhdmUgYXMgdGhpcy5wcm9jZXNzZWRBcmdzIVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJvY2Vzc0FyZ3VtZW50cygpIHtcbiAgICBjb25zdCBteVBhcnNlQXJnID0gKGFyZ3VtZW50LCB2YWx1ZSwgcHJldmlvdXMpID0+IHtcbiAgICAgIC8vIEV4dHJhIHByb2Nlc3NpbmcgZm9yIG5pY2UgZXJyb3IgbWVzc2FnZSBvbiBwYXJzaW5nIGZhaWx1cmUuXG4gICAgICBsZXQgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBhcmd1bWVudC5wYXJzZUFyZykge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBjb21tYW5kLWFyZ3VtZW50IHZhbHVlICcke3ZhbHVlfScgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgJyR7YXJndW1lbnQubmFtZSgpfScuYDtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLl9jYWxsUGFyc2VBcmcoXG4gICAgICAgICAgYXJndW1lbnQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgaW52YWxpZFZhbHVlTWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9O1xuXG4gICAgdGhpcy5fY2hlY2tOdW1iZXJPZkFyZ3VtZW50cygpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkQXJncyA9IFtdO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChkZWNsYXJlZEFyZywgaW5kZXgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWNsYXJlZEFyZy52YXJpYWRpYykge1xuICAgICAgICAvLyBDb2xsZWN0IHRvZ2V0aGVyIHJlbWFpbmluZyBhcmd1bWVudHMgZm9yIHBhc3NpbmcgdG9nZXRoZXIgYXMgYW4gYXJyYXkuXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXJncy5zbGljZShpbmRleCk7XG4gICAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlZHVjZSgocHJvY2Vzc2VkLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2LCBwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5hcmdzW2luZGV4XTtcbiAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgdmFsdWUgPSBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2YWx1ZSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvY2Vzc2VkQXJnc1tpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBwcm9jZXNzZWRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uY2Ugd2UgaGF2ZSBhIHByb21pc2Ugd2UgY2hhaW4sIGJ1dCBjYWxsIHN5bmNocm9ub3VzbHkgdW50aWwgdGhlbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbChwcm9taXNlLCBmbikge1xuICAgIC8vIHRoZW5hYmxlXG4gICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS50aGVuICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSBhIHByb21pc2UsIGNoYWluIGNhbGxiYWNrXG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IGZuKCkpO1xuICAgIH1cbiAgICAvLyBjYWxsYmFjayBtaWdodCByZXR1cm4gYSBwcm9taXNlXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGxIb29rcyhwcm9taXNlLCBldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBwcm9taXNlO1xuICAgIGNvbnN0IGhvb2tzID0gW107XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKChjbWQpID0+IGNtZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaCgoaG9va2VkQ29tbWFuZCkgPT4ge1xuICAgICAgICBob29rZWRDb21tYW5kLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBob29rcy5wdXNoKHsgaG9va2VkQ29tbWFuZCwgY2FsbGJhY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgaWYgKGV2ZW50ID09PSAncG9zdEFjdGlvbicpIHtcbiAgICAgIGhvb2tzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBob29rcy5mb3JFYWNoKChob29rRGV0YWlsKSA9PiB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGhvb2tEZXRhaWwuY2FsbGJhY2soaG9va0RldGFpbC5ob29rZWRDb21tYW5kLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gc3ViQ29tbWFuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2socHJvbWlzZSwgc3ViQ29tbWFuZCwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2NoYWluT3JDYWxsKHJlc3VsdCwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBob29rKHRoaXMsIHN1YkNvbW1hbmQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYXJndW1lbnRzIGluIGNvbnRleHQgb2YgdGhpcyBjb21tYW5kLlxuICAgKiBSZXR1cm5zIGFjdGlvbiByZXN1bHQsIGluIGNhc2UgaXQgaXMgYSBwcm9taXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcGFyc2VDb21tYW5kKG9wZXJhbmRzLCB1bmtub3duKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModW5rbm93bik7XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zRW52KCk7IC8vIGFmdGVyIGNsaSwgc28gcGFyc2VBcmcgbm90IGNhbGxlZCBvbiBib3RoIGNsaSBhbmQgZW52XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zSW1wbGllZCgpO1xuICAgIG9wZXJhbmRzID0gb3BlcmFuZHMuY29uY2F0KHBhcnNlZC5vcGVyYW5kcyk7XG4gICAgdW5rbm93biA9IHBhcnNlZC51bmtub3duO1xuICAgIHRoaXMuYXJncyA9IG9wZXJhbmRzLmNvbmNhdCh1bmtub3duKTtcblxuICAgIGlmIChvcGVyYW5kcyAmJiB0aGlzLl9maW5kQ29tbWFuZChvcGVyYW5kc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQob3BlcmFuZHNbMF0sIG9wZXJhbmRzLnNsaWNlKDEpLCB1bmtub3duKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5fZ2V0SGVscENvbW1hbmQoKSAmJlxuICAgICAgb3BlcmFuZHNbMF0gPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hIZWxwQ29tbWFuZChvcGVyYW5kc1sxXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZCh1bmtub3duKTsgLy8gUnVuIHRoZSBoZWxwIGZvciBkZWZhdWx0IGNvbW1hbmQgZnJvbSBwYXJlbnQgcmF0aGVyIHRoYW4gcGFzc2luZyB0byBkZWZhdWx0IGNvbW1hbmRcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgICAgb3BlcmFuZHMsXG4gICAgICAgIHVua25vd24sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5hcmdzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuX2FjdGlvbkhhbmRsZXIgJiZcbiAgICAgICF0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWVcbiAgICApIHtcbiAgICAgIC8vIHByb2JhYmx5IG1pc3Npbmcgc3ViY29tbWFuZCBhbmQgbm8gaGFuZGxlciwgdXNlciBuZWVkcyBoZWxwIChhbmQgZXhpdClcbiAgICAgIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZChwYXJzZWQudW5rbm93bik7XG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBXZSBkbyBub3QgYWx3YXlzIGNhbGwgdGhpcyBjaGVjayB0byBhdm9pZCBtYXNraW5nIGEgXCJiZXR0ZXJcIiBlcnJvciwgbGlrZSB1bmtub3duIGNvbW1hbmQuXG4gICAgY29uc3QgY2hlY2tGb3JVbmtub3duT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudW5rbm93bk9wdGlvbihwYXJzZWQudW5rbm93blswXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbW1hbmRFdmVudCA9IGBjb21tYW5kOiR7dGhpcy5uYW1lKCl9YDtcbiAgICBpZiAodGhpcy5fYWN0aW9uSGFuZGxlcikge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuXG4gICAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwcmVBY3Rpb24nKTtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT5cbiAgICAgICAgdGhpcy5fYWN0aW9uSGFuZGxlcih0aGlzLnByb2Nlc3NlZEFyZ3MpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2VDaGFpbiwgJ3Bvc3RBY3Rpb24nKTtcbiAgICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KGNvbW1hbmRFdmVudCkpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIHRoaXMucGFyZW50LmVtaXQoY29tbWFuZEV2ZW50LCBvcGVyYW5kcywgdW5rbm93bik7IC8vIGxlZ2FjeVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fZmluZENvbW1hbmQoJyonKSkge1xuICAgICAgICAvLyBsZWdhY3kgZGVmYXVsdCBjb21tYW5kXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoJyonLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdjb21tYW5kOionKSkge1xuICAgICAgICAvLyBza2lwIG9wdGlvbiBjaGVjaywgZW1pdCBldmVudCBmb3IgcG9zc2libGUgbWlzc3BlbGxpbmcgc3VnZ2VzdGlvblxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bmtub3duQ29tbWFuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgLy8gVGhpcyBjb21tYW5kIGhhcyBzdWJjb21tYW5kcyBhbmQgbm90aGluZyBob29rZWQgdXAgYXQgdGhpcyBsZXZlbCwgc28gZGlzcGxheSBoZWxwIChhbmQgZXhpdCkuXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoIGZvciBjYWxsZXIgdG8gaGFuZGxlIGFmdGVyIGNhbGxpbmcgLnBhcnNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYXRjaGluZyBjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX2ZpbmRDb21tYW5kKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZmluZChcbiAgICAgIChjbWQpID0+IGNtZC5fbmFtZSA9PT0gbmFtZSB8fCBjbWQuX2FsaWFzZXMuaW5jbHVkZXMobmFtZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb3B0aW9uIG1hdGNoaW5nIGBhcmdgIGlmIGFueS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9maW5kT3B0aW9uKGFyZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXMoYXJnKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgbWFuZGF0b3J5IG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuXG4gICAqIENhbGxlZCBhZnRlciBjaGVja2luZyBmb3IgaGVscCBmbGFncyBpbiBsZWFmIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQub3B0aW9ucy5mb3JFYWNoKChhbk9wdGlvbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYW5PcHRpb24ubWFuZGF0b3J5ICYmXG4gICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlKGFuT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBjbWQubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlKGFuT3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG9nZXRoZXIgaW4gdGhpcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCkge1xuICAgIGNvbnN0IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGlmICh0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpICE9PSAnZGVmYXVsdCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvcHRpb25zV2l0aENvbmZsaWN0aW5nID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5jb25mbGljdHNXaXRoLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIG9wdGlvbnNXaXRoQ29uZmxpY3RpbmcuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBjb25mbGljdGluZ0FuZERlZmluZWQgPSBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMuZmluZCgoZGVmaW5lZCkgPT5cbiAgICAgICAgb3B0aW9uLmNvbmZsaWN0c1dpdGguaW5jbHVkZXMoZGVmaW5lZC5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgKTtcbiAgICAgIGlmIChjb25mbGljdGluZ0FuZERlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ0FuZERlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQuX2NoZWNrRm9yQ29uZmxpY3RpbmdMb2NhbE9wdGlvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJlbW92aW5nIGtub3duIG9wdGlvbnMsXG4gICAqIGFuZCByZXR1cm4gYXJndiBzcGxpdCBpbnRvIG9wZXJhbmRzIGFuZCB1bmtub3duIGFyZ3VtZW50cy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqICAgICBhcmd2ID0+IG9wZXJhbmRzLCB1bmtub3duXG4gICAqICAgICAtLWtub3duIGtrayBvcCA9PiBbb3BdLCBbXVxuICAgKiAgICAgb3AgLS1rbm93biBra2sgPT4gW29wXSwgW11cbiAgICogICAgIHN1YiAtLXVua25vd24gdXV1IG9wID0+IFtzdWJdLCBbLS11bmtub3duIHV1dSBvcF1cbiAgICogICAgIHN1YiAtLSAtLXVua25vd24gdXV1IG9wID0+IFtzdWIgLS11bmtub3duIHV1dSBvcF0sIFtdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAgICogQHJldHVybiB7e29wZXJhbmRzOiBzdHJpbmdbXSwgdW5rbm93bjogc3RyaW5nW119fVxuICAgKi9cblxuICBwYXJzZU9wdGlvbnMoYXJndikge1xuICAgIGNvbnN0IG9wZXJhbmRzID0gW107IC8vIG9wZXJhbmRzLCBub3Qgb3B0aW9ucyBvciB2YWx1ZXNcbiAgICBjb25zdCB1bmtub3duID0gW107IC8vIGZpcnN0IHVua25vd24gb3B0aW9uIGFuZCByZW1haW5pbmcgdW5rbm93biBhcmdzXG4gICAgbGV0IGRlc3QgPSBvcGVyYW5kcztcbiAgICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgpO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVPcHRpb24oYXJnKSB7XG4gICAgICByZXR1cm4gYXJnLmxlbmd0aCA+IDEgJiYgYXJnWzBdID09PSAnLSc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2Ugb3B0aW9uc1xuICAgIGxldCBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgIC8vIGxpdGVyYWxcbiAgICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgaWYgKGRlc3QgPT09IHVua25vd24pIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVmFyaWFkaWNPcHRpb24gJiYgIW1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHthY3RpdmVWYXJpYWRpY09wdGlvbi5uYW1lKCl9YCwgYXJnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnKTtcbiAgICAgICAgLy8gcmVjb2duaXNlZCBvcHRpb24sIGNhbGwgbGlzdGVuZXIgdG8gYXNzaWduIHZhbHVlIHdpdGggcG9zc2libGUgY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBiZWhhdmlvdXIgaXMgb3B0aW9uYWwgdmFsdWUgaXMgZm9sbG93aW5nIGFyZyB1bmxlc3MgYW4gb3B0aW9uXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmICFtYXliZU9wdGlvbihhcmdzWzBdKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gZmxhZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG9wdGlvbi52YXJpYWRpYyA/IG9wdGlvbiA6IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3IgY29tYm8gb3B0aW9ucyBmb2xsb3dpbmcgc2luZ2xlIGRhc2gsIGVhdCBmaXJzdCBvbmUgaWYga25vd24uXG4gICAgICBpZiAoYXJnLmxlbmd0aCA+IDIgJiYgYXJnWzBdID09PSAnLScgJiYgYXJnWzFdICE9PSAnLScpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihgLSR7YXJnWzFdfWApO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3B0aW9uLnJlcXVpcmVkIHx8XG4gICAgICAgICAgICAob3B0aW9uLm9wdGlvbmFsICYmIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGlvbiB3aXRoIHZhbHVlIGZvbGxvd2luZyBpbiBzYW1lIGFyZ3VtZW50XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgYXJnLnNsaWNlKDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhbiBvcHRpb24sIGVtaXQgYW5kIHB1dCBiYWNrIHJlbWFpbmRlciBvZiBhcmcgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgICAgYXJncy51bnNoaWZ0KGAtJHthcmcuc2xpY2UoMil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGtub3duIGxvbmcgZmxhZyB3aXRoIHZhbHVlLCBsaWtlIC0tZm9vPWJhclxuICAgICAgaWYgKC9eLS1bXj1dKz0vLnRlc3QoYXJnKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGFyZy5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICAgIGlmIChvcHRpb24gJiYgKG9wdGlvbi5yZXF1aXJlZCB8fCBvcHRpb24ub3B0aW9uYWwpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSByZWNvZ25pc2VkIG9wdGlvbiBieSB0aGlzIGNvbW1hbmQuXG4gICAgICAvLyBNaWdodCBiZSBhIGNvbW1hbmQtYXJndW1lbnQsIG9yIHN1YmNvbW1hbmQgb3B0aW9uLCBvciB1bmtub3duIG9wdGlvbiwgb3IgaGVscCBjb21tYW5kIG9yIG9wdGlvbi5cblxuICAgICAgLy8gQW4gdW5rbm93biBvcHRpb24gbWVhbnMgZnVydGhlciBhcmd1bWVudHMgYWxzbyBjbGFzc2lmaWVkIGFzIHVua25vd24gc28gY2FuIGJlIHJlcHJvY2Vzc2VkIGJ5IHN1YmNvbW1hbmRzLlxuICAgICAgaWYgKG1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgZGVzdCA9IHVua25vd247XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzaW5nIHBvc2l0aW9uYWxPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3VyIG9wdGlvbnMgYXQgc3ViY29tbWFuZC5cbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zIHx8IHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykgJiZcbiAgICAgICAgb3BlcmFuZHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHVua25vd24ubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKGFyZykpIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgdW5rbm93bi5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgICAgICBhcmcgPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIG9wZXJhbmRzLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBvcGVyYW5kcy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgIHVua25vd24ucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwYXNzVGhyb3VnaE9wdGlvbnMsIHN0b3AgcHJvY2Vzc2luZyBvcHRpb25zIGF0IGZpcnN0IGNvbW1hbmQtYXJndW1lbnQuXG4gICAgICBpZiAodGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zKSB7XG4gICAgICAgIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYXJnXG4gICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVyYW5kcywgdW5rbm93biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBsb2NhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0cygpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvcmlnaW5hbCBiZWhhdmlvdXIgc28gYmFja3dhcmRzIGNvbXBhdGlibGUgd2hlbiBzdGlsbCB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMub3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPVxuICAgICAgICAgIGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBtZXJnZWQgbG9jYWwgYW5kIGdsb2JhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0c1dpdGhHbG9iYWxzKCkge1xuICAgIC8vIGdsb2JhbHMgb3ZlcndyaXRlIGxvY2Fsc1xuICAgIHJldHVybiB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkucmVkdWNlKFxuICAgICAgKGNvbWJpbmVkT3B0aW9ucywgY21kKSA9PiBPYmplY3QuYXNzaWduKGNvbWJpbmVkT3B0aW9ucywgY21kLm9wdHMoKSksXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAob3IgY2FsbCBleGl0T3ZlcnJpZGUpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2Vycm9yT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvck9wdGlvbnMuY29kZV0gLSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Vycm9yT3B0aW9ucy5leGl0Q29kZV0gLSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqL1xuICBlcnJvcihtZXNzYWdlLCBlcnJvck9wdGlvbnMpIHtcbiAgICAvLyBvdXRwdXQgaGFuZGxpbmdcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLm91dHB1dEVycm9yKFxuICAgICAgYCR7bWVzc2FnZX1cXG5gLFxuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycixcbiAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycihgJHt0aGlzLl9zaG93SGVscEFmdGVyRXJyb3J9XFxuYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoJ1xcbicpO1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gZXhpdCBoYW5kbGluZ1xuICAgIGNvbnN0IGNvbmZpZyA9IGVycm9yT3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBleGl0Q29kZSA9IGNvbmZpZy5leGl0Q29kZSB8fCAxO1xuICAgIGNvbnN0IGNvZGUgPSBjb25maWcuY29kZSB8fCAnY29tbWFuZGVyLmVycm9yJztcbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgb3B0aW9uIHJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpZiBvcHRpb24gZG9lc1xuICAgKiBub3QgaGF2ZSBhIHZhbHVlIGZyb20gY2xpIG9yIGNsaWVudCBjb2RlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlT3B0aW9uc0VudigpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLmVudlZhciAmJiBvcHRpb24uZW52VmFyIGluIHByb2Nlc3MuZW52KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIC8vIFByaW9yaXR5IGNoZWNrLiBEbyBub3Qgb3ZlcndyaXRlIGNsaSBvciBvcHRpb25zIGZyb20gdW5rbm93biBzb3VyY2UgKGNsaWVudC1jb2RlKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgWydkZWZhdWx0JywgJ2NvbmZpZycsICdlbnYnXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gY2FuIHRha2UgYSB2YWx1ZVxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb3B0aW9uYWwgYWx3YXlzIHRha2VzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbkVudjoke29wdGlvbi5uYW1lKCl9YCwgcHJvY2Vzcy5lbnZbb3B0aW9uLmVudlZhcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuXG4gICAgICAgICAgICAvLyBrZWVwIHZlcnkgc2ltcGxlLCBvbmx5IGNhcmUgdGhhdCBlbnZWYXIgZGVmaW5lZCBhbmQgbm90IHRoZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBpbXBsaWVkIG9wdGlvbiB2YWx1ZXMsIGlmIG9wdGlvbiBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNJbXBsaWVkKCkge1xuICAgIGNvbnN0IGR1YWxIZWxwZXIgPSBuZXcgRHVhbE9wdGlvbnModGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCBoYXNDdXN0b21PcHRpb25WYWx1ZSA9IChvcHRpb25LZXkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICFbJ2RlZmF1bHQnLCAnaW1wbGllZCddLmluY2x1ZGVzKHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSlcbiAgICAgICk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgb3B0aW9uLmltcGxpZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGhhc0N1c3RvbU9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpICYmXG4gICAgICAgICAgZHVhbEhlbHBlci52YWx1ZUZyb21PcHRpb24oXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5pbXBsaWVkKVxuICAgICAgICAgIC5maWx0ZXIoKGltcGxpZWRLZXkpID0+ICFoYXNDdXN0b21PcHRpb25WYWx1ZShpbXBsaWVkS2V5KSlcbiAgICAgICAgICAuZm9yRWFjaCgoaW1wbGllZEtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgICAgIGltcGxpZWRLZXksXG4gICAgICAgICAgICAgIG9wdGlvbi5pbXBsaWVkW2ltcGxpZWRLZXldLFxuICAgICAgICAgICAgICAnaW1wbGllZCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXJndW1lbnQgYG5hbWVgIGlzIG1pc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdBcmd1bWVudChuYW1lKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAnJHtuYW1lfSdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgaXMgbWlzc2luZyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBvcHRpb25NaXNzaW5nQXJndW1lbnQob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIGFyZ3VtZW50IG1pc3NpbmdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm9wdGlvbk1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgaXMgYSBtYW5kYXRvcnkgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShvcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiByZXF1aXJlZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgbm90IHNwZWNpZmllZGA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBjb25mbGljdHMgd2l0aCBhbm90aGVyIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcGFyYW0ge09wdGlvbn0gY29uZmxpY3RpbmdPcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb25mbGljdGluZ09wdGlvbihvcHRpb24sIGNvbmZsaWN0aW5nT3B0aW9uKSB7XG4gICAgLy8gVGhlIGNhbGxpbmcgY29kZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIgYSBuZWdhdGVkIG9wdGlvbiBpcyB0aGUgc291cmNlIG9mIHRoZVxuICAgIC8vIHZhbHVlLCBzbyBkbyBzb21lIHdvcmsgdG8gdGFrZSBhbiBlZHVjYXRlZCBndWVzcy5cbiAgICBjb25zdCBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KTtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+IHRhcmdldC5uZWdhdGUgJiYgb3B0aW9uS2V5ID09PSB0YXJnZXQuYXR0cmlidXRlTmFtZSgpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBvc2l0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+ICF0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIG5lZ2F0aXZlT3B0aW9uICYmXG4gICAgICAgICgobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnID09PSB1bmRlZmluZWQgJiYgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB8fFxuICAgICAgICAgIChuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgb3B0aW9uVmFsdWUgPT09IG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5lZ2F0aXZlT3B0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aXZlT3B0aW9uIHx8IG9wdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgYmVzdE9wdGlvbiA9IGZpbmRCZXN0T3B0aW9uRnJvbVZhbHVlKG9wdGlvbik7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBiZXN0T3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KTtcbiAgICAgIGlmIChzb3VyY2UgPT09ICdlbnYnKSB7XG4gICAgICAgIHJldHVybiBgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7YmVzdE9wdGlvbi5lbnZWYXJ9J2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYG9wdGlvbiAnJHtiZXN0T3B0aW9uLmZsYWdzfSdgO1xuICAgIH07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiAke2dldEVycm9yTWVzc2FnZShvcHRpb24pfSBjYW5ub3QgYmUgdXNlZCB3aXRoICR7Z2V0RXJyb3JNZXNzYWdlKGNvbmZsaWN0aW5nT3B0aW9uKX1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLmNvbmZsaWN0aW5nT3B0aW9uJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIG9wdGlvbiBgZmxhZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25PcHRpb24oZmxhZykge1xuICAgIGlmICh0aGlzLl9hbGxvd1Vua25vd25PcHRpb24pIHJldHVybjtcbiAgICBsZXQgc3VnZ2VzdGlvbiA9ICcnO1xuXG4gICAgaWYgKGZsYWcuc3RhcnRzV2l0aCgnLS0nKSAmJiB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIC8vIExvb3BpbmcgdG8gcGljayB1cCB0aGUgZ2xvYmFsIG9wdGlvbnMgdG9vXG4gICAgICBsZXQgY2FuZGlkYXRlRmxhZ3MgPSBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtb3JlRmxhZ3MgPSBjb21tYW5kXG4gICAgICAgICAgLmNyZWF0ZUhlbHAoKVxuICAgICAgICAgIC52aXNpYmxlT3B0aW9ucyhjb21tYW5kKVxuICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubG9uZyk7XG4gICAgICAgIGNhbmRpZGF0ZUZsYWdzID0gY2FuZGlkYXRlRmxhZ3MuY29uY2F0KG1vcmVGbGFncyk7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKGNvbW1hbmQgJiYgIWNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zKTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcihmbGFnLCBjYW5kaWRhdGVGbGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdW5rbm93biBvcHRpb24gJyR7ZmxhZ30nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bk9wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhjZXNzIGFyZ3VtZW50cywgbW9yZSB0aGFuIGV4cGVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZWNlaXZlZEFyZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4Y2Vzc0FyZ3VtZW50cyhyZWNlaXZlZEFyZ3MpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMpIHJldHVybjtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICBjb25zdCBzID0gZXhwZWN0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgICBjb25zdCBmb3JTdWJjb21tYW5kID0gdGhpcy5wYXJlbnQgPyBgIGZvciAnJHt0aGlzLm5hbWUoKX0nYCA6ICcnO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHRvbyBtYW55IGFyZ3VtZW50cyR7Zm9yU3ViY29tbWFuZH0uIEV4cGVjdGVkICR7ZXhwZWN0ZWR9IGFyZ3VtZW50JHtzfSBidXQgZ290ICR7cmVjZWl2ZWRBcmdzLmxlbmd0aH0uYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5leGNlc3NBcmd1bWVudHMnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVua25vd24gY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdW5rbm93bkNvbW1hbmQoKSB7XG4gICAgY29uc3QgdW5rbm93bk5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmICh0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZU5hbWVzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUhlbHAoKVxuICAgICAgICAudmlzaWJsZUNvbW1hbmRzKHRoaXMpXG4gICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLm5hbWUoKSk7XG4gICAgICAgICAgLy8ganVzdCB2aXNpYmxlIGFsaWFzXG4gICAgICAgICAgaWYgKGNvbW1hbmQuYWxpYXMoKSkgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLmFsaWFzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcih1bmtub3duTmFtZSwgY2FuZGlkYXRlTmFtZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gY29tbWFuZCAnJHt1bmtub3duTmFtZX0nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bkNvbW1hbmQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIG9wdGlvbiB3aGljaCB3aWxsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHN1cHBseSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4geyh0aGlzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciB2ZXJzaW9uIHN0cmluZyBpZiBubyBhcmd1bWVudHNcbiAgICovXG5cbiAgdmVyc2lvbihzdHIsIGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgdGhpcy5fdmVyc2lvbiA9IHN0cjtcbiAgICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICdvdXRwdXQgdGhlIHZlcnNpb24gbnVtYmVyJztcbiAgICBjb25zdCB2ZXJzaW9uT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKHZlcnNpb25PcHRpb24pO1xuXG4gICAgdGhpcy5vbignb3B0aW9uOicgKyB2ZXJzaW9uT3B0aW9uLm5hbWUoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChgJHtzdHJ9XFxuYCk7XG4gICAgICB0aGlzLl9leGl0KDAsICdjb21tYW5kZXIudmVyc2lvbicsIHN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc0Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgZGVzY3JpcHRpb24oc3RyLCBhcmdzRGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQgJiYgYXJnc0Rlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSBzdHI7XG4gICAgaWYgKGFyZ3NEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gYXJnc0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN1bW1hcnkuIFVzZWQgd2hlbiBsaXN0ZWQgYXMgc3ViY29tbWFuZCBvZiBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgc3VtbWFyeShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zdW1tYXJ5O1xuICAgIHRoaXMuX3N1bW1hcnkgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGFsaWFzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIG1vcmUgdGhhbiBvbmNlIHRvIGFkZCBtdWx0aXBsZSBhbGlhc2VzLiBPbmx5IHRoZSBmaXJzdCBhbGlhcyBpcyBzaG93biBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc11cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgYWxpYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXNbMF07IC8vIGp1c3QgcmV0dXJuIGZpcnN0LCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgY29tbWFuZCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXS5fZXhlY3V0YWJsZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIC8vIGFzc3VtZSBhZGRpbmcgYWxpYXMgZm9yIGxhc3QgYWRkZWQgZXhlY3V0YWJsZSBzdWJjb21tYW5kLCByYXRoZXIgdGhhbiB0aGlzXG4gICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW1hbmQgYWxpYXMgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWVcIik7XG4gICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kID0gdGhpcy5wYXJlbnQ/Ll9maW5kQ29tbWFuZChhbGlhcyk7XG4gICAgaWYgKG1hdGNoaW5nQ29tbWFuZCkge1xuICAgICAgLy8gYy5mLiBfcmVnaXN0ZXJDb21tYW5kXG4gICAgICBjb25zdCBleGlzdGluZ0NtZCA9IFttYXRjaGluZ0NvbW1hbmQubmFtZSgpXVxuICAgICAgICAuY29uY2F0KG1hdGNoaW5nQ29tbWFuZC5hbGlhc2VzKCkpXG4gICAgICAgIC5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGFsaWFzICcke2FsaWFzfScgdG8gY29tbWFuZCAnJHt0aGlzLm5hbWUoKX0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21tYW5kLl9hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbGlhc2VzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGlhc2VzXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nW118Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzZXMoYWxpYXNlcykge1xuICAgIC8vIEdldHRlciBmb3IgdGhlIGFycmF5IG9mIGFsaWFzZXMgaXMgdGhlIG1haW4gcmVhc29uIGZvciBoYXZpbmcgYWxpYXNlcygpIGluIGFkZGl0aW9uIHRvIGFsaWFzKCkuXG4gICAgaWYgKGFsaWFzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXM7XG5cbiAgICBhbGlhc2VzLmZvckVhY2goKGFsaWFzKSA9PiB0aGlzLmFsaWFzKGFsaWFzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgdXNhZ2Uoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fdXNhZ2UpIHJldHVybiB0aGlzLl91c2FnZTtcblxuICAgICAgY29uc3QgYXJncyA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5tYXAoKGFyZykgPT4ge1xuICAgICAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxlbmd0aCB8fCB0aGlzLl9oZWxwT3B0aW9uICE9PSBudWxsID8gJ1tvcHRpb25zXScgOiBbXSxcbiAgICAgICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCA/ICdbY29tbWFuZF0nIDogW10sXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA/IGFyZ3MgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzYWdlID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICBuYW1lKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgZnJvbSBzY3JpcHQgZmlsZW5hbWUsIHN1Y2ggYXMgcHJvY2Vzcy5hcmd2WzFdLFxuICAgKiBvciByZXF1aXJlLm1haW4uZmlsZW5hbWUsIG9yIF9fZmlsZW5hbWUuXG4gICAqXG4gICAqIChVc2VkIGludGVybmFsbHkgYW5kIHB1YmxpYyBhbHRob3VnaCBub3QgZG9jdW1lbnRlZCBpbiBSRUFETUUuKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLm5hbWVGcm9tRmlsZW5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9XG4gICAqL1xuXG4gIG5hbWVGcm9tRmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICB0aGlzLl9uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBkaXJlY3RvcnkgZm9yIHNlYXJjaGluZyBmb3IgZXhlY3V0YWJsZSBzdWJjb21tYW5kcyBvZiB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uZXhlY3V0YWJsZURpcihfX2Rpcm5hbWUpO1xuICAgKiAvLyBvclxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoJ3N1YmNvbW1hbmRzJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsfENvbW1hbmQpfVxuICAgKi9cblxuICBleGVjdXRhYmxlRGlyKHBhdGgpIHtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fZXhlY3V0YWJsZURpcjtcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gcGF0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gcHJvZ3JhbSBoZWxwIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JhcCBmb3Igc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgaGVscEluZm9ybWF0aW9uKGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29uc3QgaGVscGVyID0gdGhpcy5jcmVhdGVIZWxwKCk7XG4gICAgaWYgKGhlbHBlci5oZWxwV2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVscGVyLmhlbHBXaWR0aCA9XG4gICAgICAgIGNvbnRleHRPcHRpb25zICYmIGNvbnRleHRPcHRpb25zLmVycm9yXG4gICAgICAgICAgPyB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldEVyckhlbHBXaWR0aCgpXG4gICAgICAgICAgOiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldE91dEhlbHBXaWR0aCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGVscGVyLmZvcm1hdEhlbHAodGhpcywgaGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0SGVscENvbnRleHQoY29udGV4dE9wdGlvbnMpIHtcbiAgICBjb250ZXh0T3B0aW9ucyA9IGNvbnRleHRPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IGVycm9yOiAhIWNvbnRleHRPcHRpb25zLmVycm9yIH07XG4gICAgbGV0IHdyaXRlO1xuICAgIGlmIChjb250ZXh0LmVycm9yKSB7XG4gICAgICB3cml0ZSA9IChhcmcpID0+IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlT3V0KGFyZyk7XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUgPSBjb250ZXh0T3B0aW9ucy53cml0ZSB8fCB3cml0ZTtcbiAgICBjb250ZXh0LmNvbW1hbmQgPSB0aGlzO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9IHwgRnVuY3Rpb259IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgb3V0cHV0SGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIGxldCBkZXByZWNhdGVkQ2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVwcmVjYXRlZENhbGxiYWNrID0gY29udGV4dE9wdGlvbnM7XG4gICAgICBjb250ZXh0T3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IGNvbW1hbmQuZW1pdCgnYmVmb3JlQWxsSGVscCcsIGNvbnRleHQpKTtcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUhlbHAnLCBjb250ZXh0KTtcblxuICAgIGxldCBoZWxwSW5mb3JtYXRpb24gPSB0aGlzLmhlbHBJbmZvcm1hdGlvbihjb250ZXh0KTtcbiAgICBpZiAoZGVwcmVjYXRlZENhbGxiYWNrKSB7XG4gICAgICBoZWxwSW5mb3JtYXRpb24gPSBkZXByZWNhdGVkQ2FsbGJhY2soaGVscEluZm9ybWF0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGhlbHBJbmZvcm1hdGlvbiAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihoZWxwSW5mb3JtYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXRIZWxwIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUoaGVscEluZm9ybWF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9nZXRIZWxwT3B0aW9uKCkubG9uZyk7IC8vIGRlcHJlY2F0ZWRcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdhZnRlckhlbHAnLCBjb250ZXh0KTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY29tbWFuZCkgPT5cbiAgICAgIGNvbW1hbmQuZW1pdCgnYWZ0ZXJBbGxIZWxwJywgY29udGV4dCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgaW4gZmxhZ3MgYW5kIGEgZGVzY3JpcHRpb24gdG8gY3VzdG9taXNlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICogUGFzcyBpbiBmYWxzZSB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKCctPywgLS1oZWxwJyAnc2hvdyBoZWxwJyk7IC8vIGN1c3RvbWlzZVxuICAgKiBwcm9ncmFtLmhlbHBPcHRpb24oZmFsc2UpOyAvLyBkaXNhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IGJvb2xlYW4pfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICAvLyBTdXBwb3J0IGRpc2FibGluZyBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGlmIChmbGFncykge1xuICAgICAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5faGVscE9wdGlvbiA/PyB1bmRlZmluZWQ7IC8vIHByZXNlcnZlIGV4aXN0aW5nIG9wdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IG51bGw7IC8vIGRpc2FibGVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbWlzZSBmbGFncyBhbmQgZGVzY3JpcHRpb24uXG4gICAgZmxhZ3MgPSBmbGFncyA/PyAnLWgsIC0taGVscCc7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/PyAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJztcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgaGFzIGJlZW4gZGlzYWJsZWQgd2l0aCAuaGVscE9wdGlvbihmYWxzZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHsoT3B0aW9uIHwgbnVsbCl9IHRoZSBoZWxwIG9wdGlvblxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBPcHRpb24oKSB7XG4gICAgLy8gTGF6eSBjcmVhdGUgaGVscCBvcHRpb24gb24gZGVtYW5kLlxuICAgIGlmICh0aGlzLl9oZWxwT3B0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaGVscE9wdGlvbih1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oZWxwT3B0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBvcHRpb24gdG8gdXNlIGZvciB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGVscE9wdGlvbigpIHRvIGN1c3RvbWlzZSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBPcHRpb24ob3B0aW9uKSB7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IG9wdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdC5cbiAgICpcbiAgICogT3V0cHV0cyBidWlsdC1pbiBoZWxwLCBhbmQgY3VzdG9tIHRleHQgYWRkZWQgdXNpbmcgYC5hZGRIZWxwVGV4dCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH19IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgaGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIHRoaXMub3V0cHV0SGVscChjb250ZXh0T3B0aW9ucyk7XG4gICAgbGV0IGV4aXRDb2RlID0gcHJvY2Vzcy5leGl0Q29kZSB8fCAwO1xuICAgIGlmIChcbiAgICAgIGV4aXRDb2RlID09PSAwICYmXG4gICAgICBjb250ZXh0T3B0aW9ucyAmJlxuICAgICAgdHlwZW9mIGNvbnRleHRPcHRpb25zICE9PSAnZnVuY3Rpb24nICYmXG4gICAgICBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICkge1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgICAvLyBtZXNzYWdlOiBkbyBub3QgaGF2ZSBhbGwgZGlzcGxheWVkIHRleHQgYXZhaWxhYmxlIHNvIG9ubHkgcGFzc2luZyBwbGFjZWhvbGRlci5cbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCAnY29tbWFuZGVyLmhlbHAnLCAnKG91dHB1dEhlbHApJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogUG9zaXRpb24gaXMgJ2JlZm9yZScgb3IgJ2FmdGVyJyB0byBhZmZlY3QganVzdCB0aGlzIGNvbW1hbmQsXG4gICAqIGFuZCAnYmVmb3JlQWxsJyBvciAnYWZ0ZXJBbGwnIHRvIGFmZmVjdCB0aGlzIGNvbW1hbmQgYW5kIGFsbCBpdHMgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbiAtIGJlZm9yZSBvciBhZnRlciBidWlsdC1pbiBoZWxwXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IEZ1bmN0aW9uKX0gdGV4dCAtIHN0cmluZyB0byBhZGQsIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RyaW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscFRleHQocG9zaXRpb24sIHRleHQpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydiZWZvcmVBbGwnLCAnYmVmb3JlJywgJ2FmdGVyJywgJ2FmdGVyQWxsJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBwb3NpdGlvbiB0byBhZGRIZWxwVGV4dC5cbkV4cGVjdGluZyBvbmUgb2YgJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGhlbHBFdmVudCA9IGAke3Bvc2l0aW9ufUhlbHBgO1xuICAgIHRoaXMub24oaGVscEV2ZW50LCAoY29udGV4dCkgPT4ge1xuICAgICAgbGV0IGhlbHBTdHI7XG4gICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQoeyBlcnJvcjogY29udGV4dC5lcnJvciwgY29tbWFuZDogY29udGV4dC5jb21tYW5kIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQ7XG4gICAgICB9XG4gICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWUgd2hlbiBub3RoaW5nIHRvIG91dHB1dC5cbiAgICAgIGlmIChoZWxwU3RyKSB7XG4gICAgICAgIGNvbnRleHQud3JpdGUoYCR7aGVscFN0cn1cXG5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBoZWxwIGZsYWdzIHNwZWNpZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gYXJyYXkgb2Ygb3B0aW9ucyB0byBzZWFyY2ggZm9yIGhlbHAgZmxhZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX291dHB1dEhlbHBJZlJlcXVlc3RlZChhcmdzKSB7XG4gICAgY29uc3QgaGVscE9wdGlvbiA9IHRoaXMuX2dldEhlbHBPcHRpb24oKTtcbiAgICBjb25zdCBoZWxwUmVxdWVzdGVkID0gaGVscE9wdGlvbiAmJiBhcmdzLmZpbmQoKGFyZykgPT4gaGVscE9wdGlvbi5pcyhhcmcpKTtcbiAgICBpZiAoaGVscFJlcXVlc3RlZCkge1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKCk7XG4gICAgICAvLyAoRG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuKVxuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLmhlbHBEaXNwbGF5ZWQnLCAnKG91dHB1dEhlbHApJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2NhbiBhcmd1bWVudHMgYW5kIGluY3JlbWVudCBwb3J0IG51bWJlciBmb3IgaW5zcGVjdCBjYWxscyAodG8gYXZvaWQgY29uZmxpY3RzIHdoZW4gc3Bhd25pbmcgbmV3IGNvbW1hbmQpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBhcnJheSBvZiBhcmd1bWVudHMgZnJvbSBub2RlLmV4ZWNBcmd2XG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KGFyZ3MpIHtcbiAgLy8gVGVzdGluZyBmb3IgdGhlc2Ugb3B0aW9uczpcbiAgLy8gIC0taW5zcGVjdFs9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtYnJrWz1baG9zdDpdcG9ydF1cbiAgLy8gIC0taW5zcGVjdC1wb3J0PVtob3N0Ol1wb3J0XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnLS1pbnNwZWN0JykpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGxldCBkZWJ1Z09wdGlvbjtcbiAgICBsZXQgZGVidWdIb3N0ID0gJzEyNy4wLjAuMSc7XG4gICAgbGV0IGRlYnVnUG9ydCA9ICc5MjI5JztcbiAgICBsZXQgbWF0Y2g7XG4gICAgaWYgKChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJyayk/KSQvKSkgIT09IG51bGwpIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmt8LXBvcnQpPyk9KFteOl0rKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBpZiAoL15cXGQrJC8udGVzdChtYXRjaFszXSkpIHtcbiAgICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9MTIzNFxuICAgICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFszXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdFxuICAgICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKyk6KFxcZCspJC8pKSAhPT0gbnVsbFxuICAgICkge1xuICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9bG9jYWxob3N0OjEyMzRcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIGRlYnVnUG9ydCA9IG1hdGNoWzRdO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Z09wdGlvbiAmJiBkZWJ1Z1BvcnQgIT09ICcwJykge1xuICAgICAgcmV0dXJuIGAke2RlYnVnT3B0aW9ufT0ke2RlYnVnSG9zdH06JHtwYXJzZUludChkZWJ1Z1BvcnQpICsgMX1gO1xuICAgIH1cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbiIsCiAgICAiY29uc3QgeyBBcmd1bWVudCB9ID0gcmVxdWlyZSgnLi9saWIvYXJndW1lbnQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZCB9ID0gcmVxdWlyZSgnLi9saWIvY29tbWFuZC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vbGliL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vbGliL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uIH0gPSByZXF1aXJlKCcuL2xpYi9vcHRpb24uanMnKTtcblxuZXhwb3J0cy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuZXhwb3J0cy5jcmVhdGVDb21tYW5kID0gKG5hbWUpID0+IG5ldyBDb21tYW5kKG5hbWUpO1xuZXhwb3J0cy5jcmVhdGVPcHRpb24gPSAoZmxhZ3MsIGRlc2NyaXB0aW9uKSA9PiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5leHBvcnRzLmNyZWF0ZUFyZ3VtZW50ID0gKG5hbWUsIGRlc2NyaXB0aW9uKSA9PiBuZXcgQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4vKipcbiAqIEV4cG9zZSBjbGFzc2VzXG4gKi9cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuZXhwb3J0cy5Bcmd1bWVudCA9IEFyZ3VtZW50O1xuZXhwb3J0cy5IZWxwID0gSGVscDtcblxuZXhwb3J0cy5Db21tYW5kZXJFcnJvciA9IENvbW1hbmRlckVycm9yO1xuZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yO1xuZXhwb3J0cy5JbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yOyAvLyBEZXByZWNhdGVkXG4iLAogICAgImltcG9ydCBjb21tYW5kZXIgZnJvbSAnLi9pbmRleC5qcyc7XG5cbi8vIHdyYXBwZXIgdG8gcHJvdmlkZSBuYW1lZCBleHBvcnRzIGZvciBFU00uXG5leHBvcnQgY29uc3Qge1xuICBwcm9ncmFtLFxuICBjcmVhdGVDb21tYW5kLFxuICBjcmVhdGVBcmd1bWVudCxcbiAgY3JlYXRlT3B0aW9uLFxuICBDb21tYW5kZXJFcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIEludmFsaWRPcHRpb25Bcmd1bWVudEVycm9yLCAvLyBkZXByZWNhdGVkIG9sZCBuYW1lXG4gIENvbW1hbmQsXG4gIEFyZ3VtZW50LFxuICBPcHRpb24sXG4gIEhlbHAsXG59ID0gY29tbWFuZGVyO1xuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHsgY2FuU3VkbywgaXNSb290IH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgcGtncyB9IGZyb20gXCIuL3BrZ3NcIjtcblxuQnVuLmVudi5QQVRIID0gW1xuXHRCdW4uZW52LlBBVEggPz8gXCJcIixcblx0XCIvaG9tZS9saW51eGJyZXcvLmxpbnV4YnJldy9iaW5cIixcblx0XCIvaG9tZS9saW51eGJyZXcvLmxpbnV4YnJldy9zYmluXCIsXG5cdFwiJEJVTl9JTlNUQUxML2JpblwiLFxuXHRcIiRIT01FL2dvL2JpblwiLFxuXHRcIiRIT01FLy5hcmthZGUvYmluXCIsXG5cdFwiJHtLUkVXX1JPT1Q6LSRIT01FLy5rcmV3fS9iaW5cIixcblx0XCIkSE9NRS8uY2FyZ28vYmluXCIsXG5cdFwiJEhPTUUvLmRvdG5ldFwiLFxuXHRcIiRIT01FLy5kb3RuZXQvdG9vbHNcIixcblx0XCIkSE9NRS8uZ28vYmluXCIsXG5cdFwiJEhPTUUvLmxvY2FsL2JpblwiLFxuXHRcIiRIT01FL2JpblwiLFxuXHRcIi9zbmFwL2JpblwiLFxuXHRcIi91c3IvbG9jYWwvc2JpblwiLFxuXHRcIi91c3Ivc2JpblwiLFxuXHRcIi9zYmluXCIsXG5dLmpvaW4oXCI6XCIpO1xuXG5jb25zdCBkb2N0b3JSb290ID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoIShhd2FpdCBpc1Jvb3QoKSkpIGNvbnNvbGUubG9nKFwi4pyFIFlvdSBhcmUgbm90IHJvb3RcIik7XG5cdGVsc2UgdGhyb3cgbmV3IEVycm9yKFwi4p2MIFlvdSBhcmUgcm9vdFwiKTtcbn07XG5cbmNvbnN0IGRvY3RvclN1ZG8gPSBhc3luYyAoKSA9PiB7XG5cdGlmIChhd2FpdCBjYW5TdWRvKCkpIGNvbnNvbGUubG9nKFwi4pyFIFlvdSBjYW4gc3Vkb1wiKTtcblx0ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCLinYwgWW91IGNhbm5vdCBzdWRvXCIpO1xufTtcblxuY29uc3QgZG9jdG9yUGtncyA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0cGtncy5tYXAoYXN5bmMgKHBrZykgPT4gKHtcblx0XHRcdG5hbWU6IHBrZy5uYW1lLFxuXHRcdFx0ZXhpc3RzOiBhd2FpdCBwa2cuY2hlY2soKSxcblx0XHRcdGluc3RhbGw6IHBrZy5pbnN0YWxsLFxuXHRcdH0pKSxcblx0KS50aGVuKCh4KSA9PiB4LmZpbHRlcigoeSkgPT4gIXkuZXhpc3RzKSk7XG5cdGlmICghcmVzdWx0Lmxlbmd0aCkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIEFsbCBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkXCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnNvbGUubG9nKFwi4p2MIFNvbWUgcGFja2FnZXMgYXJlIG5vdCBpbnN0YWxsZWRcIik7XG5cdFx0Y29uc29sZS50YWJsZShyZXN1bHQpO1xuXHRcdGZvciAoY29uc3QgciBvZiByZXN1bHQpIHtcblx0XHRcdGNvbnNvbGUubG9nKGDwn5WSIEluc3RhbGxpbmcgJHtyLm5hbWV9YCk7XG5cdFx0XHRhd2FpdCByXG5cdFx0XHRcdC5pbnN0YWxsKClcblx0XHRcdFx0LnRoZW4oKCkgPT4gY29uc29sZS5sb2coYOKchSBJbnN0YWxsZWQgJHtyLm5hbWV9YCkpXG5cdFx0XHRcdC5jYXRjaCgoKSA9PiBjb25zb2xlLmxvZyhg4p2MIEZhaWxlZCB0byBpbnN0YWxsICR7ci5uYW1lfWApKTtcblx0XHR9XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvckdpdGNvbmZpZyA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgZXhwZWN0ZWQgPSBgW3VzZXJdXG4gICAgICAgIGVtYWlsID0gY2hhcmxlczYzNTAwQGdtYWlsLmNvbVxuICAgICAgICBuYW1lID0gY2huZWF1XG5bdXJsIFwic3NoOi8vZ2l0QGdpdGh1Yi5jb20vXCJdXG4gICAgICAgIGluc3RlYWRPZiA9IGh0dHBzOi8vZ2l0aHViLmNvbS9cblttZXJnZV1cbiAgICAgICAgZmYgPSBmYWxzZVxuW3B1bGxdXG4gICAgICAgIGZmID0gdHJ1ZVxuICAgICAgICByZWJhc2UgPSB0cnVlXG5bY29yZV1cbiAgICAgICAgd2hpdGVzcGFjZSA9IGJsYW5rLWF0LWVvbCxibGFuay1hdC1lb2Ysc3BhY2UtYmVmb3JlLXRhYixjci1hdC1lb2xcbltmZXRjaF1cbiAgICAgICAgcHJ1bmUgPSB0cnVlXG5gO1xuXHRjb25zdCBnaXRjb25maWcgPSBhd2FpdCBCdW4uZmlsZShgJHtCdW4uZW52LkhPTUV9Ly5naXRjb25maWdgKVxuXHRcdC50ZXh0KClcblx0XHQuY2F0Y2goKCkgPT4gXCJcIik7XG5cdGlmIChnaXRjb25maWcgPT09IGV4cGVjdGVkKSB7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgR2l0IGNvbmZpZyBpcyBzZXRcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgR2l0IGNvbmZpZyBpcyBub3Qgc2V0XCIpO1xuXHRcdGNvbnNvbGUubG9nKFwi8J+VkiBTZXR0aW5nIGdpdCBjb25maWdcIik7XG5cdFx0YXdhaXQgQnVuLndyaXRlKGAke0J1bi5lbnYuSE9NRX0vLmdpdGNvbmZpZ2AsIGV4cGVjdGVkKTtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBHaXQgY29uZmlnIGlzIHNldFwiKTtcblx0fVxufTtcblxuY29uc3QgZG9jdG9yRG90ZmlsZXMgPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGJhc2VGaWxlcyA9IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NobmVhdS9kb3RmaWxlcy9IRUFEL1wiO1xuXHRjb25zdCBleHBlY3RlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFtcIi5iYXNocmNcIiwgXCIuenNocmNcIiwgXCIuYWxpYXNlc1wiLCBcIi5wcm9maWxlXCJdLm1hcChhc3luYyAoeCkgPT4gKHtcblx0XHRcdG5hbWU6IHgsXG5cdFx0XHRjb250ZW50OiBhd2FpdCBmZXRjaChgJHtiYXNlRmlsZXN9JHt4fWApLnRoZW4oKHgpID0+IHgudGV4dCgpKSxcblx0XHRcdGlzUHJlc2VudDogYXdhaXQgQnVuLmZpbGUoYCR7QnVuLmVudi5IT01FfS8ke3h9YCkuZXhpc3RzKCksXG5cdFx0fSkpLFxuXHQpO1xuXHRpZiAoZXhwZWN0ZWQuZXZlcnkoKHgpID0+IHguaXNQcmVzZW50KSkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIERvdGZpbGVzIGFyZSBpbnN0YWxsZWRcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgRG90ZmlsZXMgYXJlIG5vdCBpbnN0YWxsZWRcIik7XG5cdFx0Y29uc29sZS5sb2coXCLwn5WSIEluc3RhbGxpbmcgZG90ZmlsZXNcIik7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRleHBlY3RlZC5tYXAoYXN5bmMgKHgpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coYPCflZIgSW5zdGFsbGluZyAke3gubmFtZX1gKTtcblx0XHRcdFx0YXdhaXQgQnVuLndyaXRlKGAke0J1bi5lbnYuSE9NRX0vJHt4Lm5hbWV9YCwgeC5jb250ZW50KTtcblx0XHRcdFx0Y29uc29sZS5sb2coYOKchSBJbnN0YWxsZWQgJHt4Lm5hbWV9YCk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIERvdGZpbGVzIGFyZSBpbnN0YWxsZWRcIik7XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvckRvY2tlciA9IGFzeW5jICgpID0+IHtcblx0aWYgKCEoYXdhaXQgJGB3aGljaCBkb2NrZXJgLm5vdGhyb3coKS50ZXh0KCkpLmluY2x1ZGVzKFwibm90IGZvdW5kXCIpKSB7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgRG9ja2VyIGlzIGluc3RhbGxlZFwiKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmxvZyhcIuKdjCBEb2NrZXIgaXMgbm90IGluc3RhbGxlZFwiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgSW5zdGFsbGluZyBEb2NrZXJcIik7XG5cdFx0YXdhaXQgJGBjdXJsIC1zU0wgZ2V0LmRvY2tlci5jb20gfCBzaGA7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgRG9ja2VyIGlzIGluc3RhbGxlZFwiKTtcblx0fVxufTtcblxuY29uc3QgZG9jdG9yVXNlckdyb3VwcyA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgZ3JvdXBzID0gYXdhaXQgJGBncm91cHNgLnRleHQoKTtcblx0aWYgKGdyb3Vwcy5pbmNsdWRlcyhcImRvY2tlclwiKSkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIFVzZXIgaXMgaW4gZG9ja2VyIGdyb3Vwc1wiKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmxvZyhcIuKdjCBVc2VyIGlzIG5vdCBpbiBkb2NrZXIgZ3JvdXBzXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwi8J+VkiBBZGRpbmcgdXNlciB0byBkb2NrZXIgZ3JvdXBzXCIpO1xuXHRcdGF3YWl0ICRgc3VkbyB1c2VybW9kIC1hRyBkb2NrZXIgJFVTRVJgLmNhdGNoKCgpID0+IHt9KTtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBVc2VyIGlzIGluIGRvY2tlciBncm91cHNcIik7XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvclNzaCA9IGFzeW5jICgpID0+IHtcblx0Y29uc3Qgc3NoRGlyID0gYCR7QnVuLmVudi5IT01FfS8uc3NoL2lkX3JzYWA7XG5cdGlmIChhd2FpdCBCdW4uZmlsZShzc2hEaXIpLmV4aXN0cygpKSB7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgU1NIIGtleSBpcyBzZXRcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgU1NIIGtleSBpcyBub3Qgc2V0XCIpO1xuXHRcdGNvbnNvbGUubG9nKFwi8J+VkiBHZW5lcmF0aW5nIFNTSCBrZXlcIik7XG5cdFx0YXdhaXQgJGBlY2hvIHllcyB8IHNzaC1rZXlnZW4gLXQgcnNhIC1iIDQwOTYgLWYgfi8uc3NoL2lkX3JzYSAtUCBcIlwiYDtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBTU0gga2V5IGlzIHNldFwiKTtcblx0fVxufTtcblxuY29uc3QgZG9jdG9yR2l0aHViID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoXG5cdFx0YXdhaXQgJGBzc2ggZ2l0QGdpdGh1Yi5jb20gMj4mMWBcblx0XHRcdC5ub3Rocm93KClcblx0XHRcdC50ZXh0KClcblx0XHRcdC50aGVuKCh4KSA9PiB4LmluY2x1ZGVzKFwic3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWRcIikpXG5cdCkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIFNTSCBrZXkgaXMgc2V0IG9uIEdpdEh1YlwiKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmxvZyhcIuKdjCBTU0gga2V5IGlzIG5vdCBzZXQgb24gR2l0SHViXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwi8J+VkiBBZGRpbmcgU1NIIGtleSB0byBHaXRIdWJcIik7XG5cdFx0YXdhaXQgJGBjYXQgfi8uc3NoL2lkX3JzYS5wdWJgO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0XCLwn5WSIEdvIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy9zc2gvbmV3IGFuZCBwYXN0IHRoZSB0ZXh0IGFib3ZlXCIsXG5cdFx0KTtcblx0fVxufTtcblxuY29uc3QgZG9jdG9yWnNoID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBldGNTaGVsbHMgPSBhd2FpdCBCdW4uZmlsZShcIi9ldGMvc2hlbGxzXCIpXG5cdFx0LnRleHQoKVxuXHRcdC50aGVuKCh4KSA9PiB4LnNwbGl0KFwiXFxuXCIpKTtcblx0Y29uc3Qgd2hpY2hac2ggPSBhd2FpdCAkYHdoaWNoIHpzaGAubm90aHJvdygpLnRleHQoKTtcblx0aWYgKGV0Y1NoZWxscy5pbmNsdWRlcyh3aGljaFpzaCkpIHtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBac2ggaXMgc2V0IGFzIGEgdmFsaWQgc2hlbGxcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgWnNoIGlzIG5vdCBzZXQgYXMgYSB2YWxpZCBzaGVsbFwiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgQWRkaW5nIFpzaCB0byAvZXRjL3NoZWxsc1wiKTtcblx0XHRhd2FpdCAkYGVjaG8gJHt3aGljaFpzaH0gfCBzdWRvIHRlZSAtYSAvZXRjL3NoZWxsc2A7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgWnNoIGlzIHNldCBhcyBhIHZhbGlkIHNoZWxsXCIpO1xuXHR9XG5cdGNvbnN0IGV0Y1Bhc3N3ZE9mVVNlciA9IGF3YWl0ICRgY2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCBcIl4kVVNFUjpcImAudGV4dCgpO1xuXHRpZiAoZXRjUGFzc3dkT2ZVU2VyLmluY2x1ZGVzKHdoaWNoWnNoKSkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIFpzaCBpcyBzZXQgYXMgeW91ciBzaGVsbFwiKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmxvZyhcIuKdjCBac2ggaXMgbm90IHNldCBhcyB5b3VyIHNoZWxsXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwi8J+VkiBTZXR0aW5nIFpzaCBhcyB5b3VyIHNoZWxsXCIpO1xuXHRcdGF3YWl0ICRgc3VkbyBjaHNoIC1zICR7d2hpY2hac2h9ICRVU0VSYDtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBac2ggaXMgc2V0IGFzIHlvdXIgc2hlbGxcIik7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb21tYW5kRG9jdG9yID0gYXN5bmMgKCkgPT4ge1xuXHRhd2FpdCBQcm9taXNlLmFsbChbZG9jdG9yUm9vdCgpLCBkb2N0b3JTdWRvKCldKTtcblx0YXdhaXQgUHJvbWlzZS5hbGwoW1xuXHRcdGRvY3RvckRvdGZpbGVzKCksXG5cdFx0ZG9jdG9yUGtncygpLnRoZW4oKCkgPT5cblx0XHRcdFByb21pc2UuYWxsKFtcblx0XHRcdFx0ZG9jdG9yR2l0Y29uZmlnKCkudGhlbihkb2N0b3JTc2gpLnRoZW4oZG9jdG9yR2l0aHViKSxcblx0XHRcdFx0ZG9jdG9yWnNoKCksXG5cdFx0XHRcdGRvY3RvckRvY2tlcigpLnRoZW4oZG9jdG9yVXNlckdyb3VwcyksXG5cdFx0XHRdKSxcblx0XHQpLFxuXHRdKTtcbn07XG4iLAogICAgImltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5cbmV4cG9ydCBjb25zdCBjb21tYW5kRXhpc3RzID0gYXN5bmMgKGNtZDogc3RyaW5nKSA9PlxuXHQoYXdhaXQgJGB3aGljaCAke2NtZH1gLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKSkudHJpbSgpICE9PSBcIlwiO1xuXG5leHBvcnQgY29uc3QgaXNSb290ID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBpZCA9IChhd2FpdCAkYGlkIC11YC50ZXh0KCkpLnRyaW0oKTtcblx0cmV0dXJuIGlkID09PSBcIjBcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBjYW5TdWRvID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCB0ZXh0ID0gKGF3YWl0ICRgc3VkbyBlY2hvIDBgLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKSkudHJpbSgpO1xuXHRyZXR1cm4gdGV4dCA9PT0gXCIwXCI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFZlcnNpb24gPSBhc3luYyAoKSA9PlxuXHRhd2FpdCBCdW4uZmlsZShgJHtpbXBvcnQubWV0YS5kaXJ9L3BhY2thZ2UuanNvbmApXG5cdFx0Lmpzb24oKVxuXHRcdC50aGVuKCh4KSA9PiB4LnZlcnNpb24gYXMgc3RyaW5nKVxuXHRcdC5jYXRjaCgoKSA9PiBcIlVOS05PV05cIik7XG4iLAogICAgImltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBjb21tYW5kRXhpc3RzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG50eXBlIFBrZyA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRjaGVjazogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcblx0aW5zdGFsbDogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn07XG5cbmNvbnN0IGFwdEl0ID0gKG5hbWU6IHN0cmluZykgPT4gKHtcblx0bmFtZSxcblx0Y2hlY2s6IGFzeW5jICgpID0+IGNvbW1hbmRFeGlzdHMobmFtZSksXG5cdGluc3RhbGw6IGFzeW5jICgpID0+IGF3YWl0ICRgc3VkbyBhcHQgaW5zdGFsbCAteSAke25hbWV9YCxcbn0pO1xuXG5jb25zdCBhcHRQa2dzOiBQa2dbXSA9IFtcblx0YXB0SXQoXCJnaXRcIiksXG5cdGFwdEl0KFwiY3VybFwiKSxcblx0YXB0SXQoXCJ3Z2V0XCIpLFxuXHRhcHRJdChcInVuemlwXCIpLFxuXHRhcHRJdChcImJhc2hcIiksXG5dO1xuXG5jb25zdCBicmV3SXQgPSAobmFtZTogc3RyaW5nKSA9PiAoe1xuXHRuYW1lLFxuXHRjaGVjazogYXN5bmMgKCkgPT4gY29tbWFuZEV4aXN0cyhuYW1lKSxcblx0aW5zdGFsbDogYXN5bmMgKCkgPT4gYXdhaXQgJGBicmV3IGluc3RhbGwgJHtuYW1lfWAsXG59KTtcblxuY29uc3QgYnJld1BrZ3M6IFBrZ1tdID0gW1xuXHRicmV3SXQoXCJicHl0b3BcIiksXG5cdGJyZXdJdChcImRvY2tlci1jb21wb3NlXCIpLFxuXHRicmV3SXQoXCJnb1wiKSxcblx0YnJld0l0KFwiaGVsbVwiKSxcblx0YnJld0l0KFwiaHlwZXJmaW5lXCIpLFxuXHRicmV3SXQoXCJrdWJlY29sb3JcIiksXG5cdGJyZXdJdChcImt1YmVjdHhcIiksXG5cdHtcblx0XHQuLi5icmV3SXQoXCJrdWJlcm5ldGVzLWNsaVwiKSxcblx0XHRjaGVjazogYXN5bmMgKCkgPT4gY29tbWFuZEV4aXN0cyhcImt1YmVjdGxcIiksXG5cdH0sXG5cdGJyZXdJdChcImxhenlnaXRcIiksXG5cdGJyZXdJdChcIm5vZGVcIiksXG5cdGJyZXdJdChcInBpcHhcIiksXG5cdGJyZXdJdChcInpzaFwiKSxcbl07XG5cbmNvbnN0IGJ1bkl0ID0gKG5hbWU6IHN0cmluZykgPT4gKHtcblx0bmFtZSxcblx0Y2hlY2s6IGFzeW5jICgpID0+IGNvbW1hbmRFeGlzdHMobmFtZSksXG5cdGluc3RhbGw6IGFzeW5jICgpID0+IGF3YWl0ICRgYnVuIGluc3RhbGwgLS1mb3JjZSAtLWdsb2JhbCAke25hbWV9YCxcbn0pO1xuXG5jb25zdCBidW5Qa2dzOiBQa2dbXSA9IFtcblx0e1xuXHRcdC4uLmJ1bkl0KFwiYmlvbWVcIiksXG5cdFx0aW5zdGFsbDogYXN5bmMgKCkgPT4gYXdhaXQgJGBidW4gaW5zdGFsbCAtLWZvcmNlIC0tZ2xvYmFsIEBiaW9tZWpzL2Jpb21lYCxcblx0fSxcblx0YnVuSXQoXCJodHRwLXNlcnZlclwiKSxcblx0YnVuSXQoXCJsaXZlLXNlcnZlclwiKSxcblx0e1xuXHRcdC4uLmJ1bkl0KFwiZmtpbGxcIiksXG5cdFx0aW5zdGFsbDogYXN5bmMgKCkgPT4gYXdhaXQgJGBidW4gaW5zdGFsbCAtLWZvcmNlIC0tZ2xvYmFsIGZraWxsLWNsaWAsXG5cdH0sXG5cdGJ1bkl0KFwidW5naXRcIiksXG5cdGJ1bkl0KFwibnBtLWNoZWNrXCIpLFxuXHRidW5JdChcInRzeFwiKSxcblx0YnVuSXQoXCJucG0tY2hlY2stdXBkYXRlc1wiKSxcblx0YnVuSXQoXCJub2RlbW9uXCIpLFxuXHRidW5JdChcInByZXR0aWVyXCIpLFxuXHRidW5JdChcInR5cGVzeW5jXCIpLFxuXHRidW5JdChcImRlcGNoZWNrXCIpLFxuXHRidW5JdChcImNvbmN1cnJlbnRseVwiKSxcblx0YnVuSXQoXCJ0cy11bnVzZWQtZXhwb3J0c1wiKSxcbl07XG5leHBvcnQgY29uc3QgcGtnczogUGtnW10gPSBbXG5cdC4uLmFwdFBrZ3MsXG5cdHtcblx0XHRuYW1lOiBcImJyZXdcIixcblx0XHRjaGVjazogYXN5bmMgKCkgPT4gY29tbWFuZEV4aXN0cyhcImJyZXdcIiksXG5cdFx0aW5zdGFsbDogYXN5bmMgKCkgPT5cblx0XHRcdGF3YWl0ICRgSE9NRT0vdG1wIENJPTEgYmFzaCAtYyBcIiQoY3VybCAtZnNTTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSG9tZWJyZXcvaW5zdGFsbC9IRUFEL2luc3RhbGwuc2gpXCJgLFxuXHR9LFxuXHQuLi5icmV3UGtncyxcblx0Li4uYnVuUGtncyxcbl07XG4iLAogICAgImltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBjYW5TdWRvLCBjb21tYW5kRXhpc3RzLCBpc1Jvb3QgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmNvbnN0IHVwZGF0ZURvdGZpbGVzID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBpbml0U2NyaXB0ID0gYXdhaXQgZmV0Y2goXG5cdFx0XCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vY2huZWF1L2RvdGZpbGVzL21hc3Rlci9ib290c3RyYXAuc2hcIixcblx0KS50aGVuKCh4KSA9PiB4LnRleHQoKSk7XG5cdGF3YWl0ICRgZWNobyAke2luaXRTY3JpcHR9IHwgc2hgO1xufTtcblxuY29uc3QgdXBkYXRlQnVuID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBidW5Qa2dzID0gW1xuXHRcdFwiQGJpb21lanMvYmlvbWVcIixcblx0XHRcImh0dHAtc2VydmVyXCIsXG5cdFx0XCJsaXZlLXNlcnZlclwiLFxuXHRcdFwiZmtpbGwtY2xpXCIsXG5cdFx0XCJ1bmdpdFwiLFxuXHRcdFwibnBtLWNoZWNrXCIsXG5cdFx0XCJ0c3hcIixcblx0XHRcIm5wbS1jaGVjay11cGRhdGVzXCIsXG5cdFx0XCJub2RlbW9uXCIsXG5cdFx0XCJwcmV0dGllclwiLFxuXHRcdFwidHlwZXN5bmNcIixcblx0XHRcImRlcGNoZWNrXCIsXG5cdFx0XCJjb25jdXJyZW50bHlcIixcblx0XHRcInRzLXVudXNlZC1leHBvcnRzXCIsXG5cdF07XG5cdGF3YWl0ICRgYnVuIHVwZ3JhZGVgO1xuXHRhd2FpdCAkYGJ1biBpbnN0YWxsIC0tZm9yY2UgLS1nbG9iYWwgJHt7IHJhdzogYnVuUGtncy5qb2luKFwiIFwiKSB9fWA7XG5cdGF3YWl0ICRgYnVuIHVwZGF0ZSAtLWxhdGVzdCAtLWZvcmNlIC0tZ2xvYmFsYDtcbn07XG5cbmNvbnN0IHVwZGF0ZUFwdCA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgZXNzZW50aWFsUGtncyA9IFtcImdpdFwiLCBcImN1cmxcIiwgXCJ3Z2V0XCIsIFwidW56aXBcIiwgXCJ6c2hcIiwgXCJiYXNoXCJdO1xuXHRhd2FpdCAkYHN1ZG8gYXB0IGluc3RhbGwgLXkgJHt7IHJhdzogZXNzZW50aWFsUGtncy5qb2luKFwiIFwiKSB9fWA7XG5cdGF3YWl0ICRgc3VkbyBhcHQgdXBkYXRlIC15YDtcblx0YXdhaXQgJGBzdWRvIGFwdCB1cGdyYWRlIC15YDtcblx0YXdhaXQgJGBzdWRvIGFwdCBhdXRvcmVtb3ZlIC15YDtcblx0YXdhaXQgJGBzdWRvIGFwdCBhdXRvY2xlYW4gLXlgO1xufTtcblxuY29uc3QgdXBkYXRlQnJldyA9IGFzeW5jICgpID0+IHtcblx0aWYgKCEoYXdhaXQgY29tbWFuZEV4aXN0cyhcImJyZXdcIikpKVxuXHRcdGF3YWl0ICRgQ0k9MSBiYXNoIC1jIFwiJChjdXJsIC1mc1NMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Ib21lYnJldy9pbnN0YWxsL0hFQUQvaW5zdGFsbC5zaClcImA7XG5cdGNvbnN0IGVzc2VudGlhbFBrZ3MgPSBbXG5cdFx0XCJicHl0b3BcIixcblx0XHRcImRpdmVcIixcblx0XHRcImRsZGFzaC9jb3JlL2RvY2tlci1jb2xvci1vdXRwdXRcIixcblx0XHRcImRvY2tlci1jb21wb3NlXCIsXG5cdFx0XCJnb1wiLFxuXHRcdFwiaGVsbVwiLFxuXHRcdFwiaHlwZXJmaW5lXCIsXG5cdFx0XCJrdWJlY29sb3JcIixcblx0XHRcImt1YmVjdHhcIixcblx0XHRcImt1YmVybmV0ZXMtY2xpXCIsXG5cdFx0XCJsYXp5Z2l0XCIsXG5cdFx0XCJub2RlXCIsXG5cdFx0XCJwaXB4XCIsXG5cdFx0XCJ6c2hcIixcblx0XTtcblx0Y29uc3QgYnJldyA9XG5cdFx0KGF3YWl0ICRgd2hpY2ggYnJld2AudGV4dCgpLmNhdGNoKCgpID0+IFwiXCIpKS50cmltKCkgfHxcblx0XHRcIi9ob21lL2xpbnV4YnJldy8ubGludXhicmV3L2Jpbi9icmV3XCI7XG5cdGF3YWl0ICRgJHticmV3fSBpbnN0YWxsICR7eyByYXc6IGVzc2VudGlhbFBrZ3Muam9pbihcIiBcIikgfX1gO1xuXHRhd2FpdCAkYCR7YnJld30gdXBkYXRlYDtcblx0YXdhaXQgJGAke2JyZXd9IHVwZ3JhZGVgO1xuXHRhd2FpdCAkYCR7YnJld30gY2xlYW51cGA7XG59O1xuXG5leHBvcnQgY29uc3QgY29tbWFuZFN5c3RlbSA9IGFzeW5jICgpID0+IHtcblx0aWYgKGF3YWl0IGlzUm9vdCgpKSB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IHJ1biB0aGlzIGNvbW1hbmQgYXMgcm9vdFwiKTtcblx0aWYgKCEoYXdhaXQgY2FuU3VkbygpKSkgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBzdWRvXCIpO1xuXHRhd2FpdCB1cGRhdGVEb3RmaWxlcygpO1xuXHRhd2FpdCB1cGRhdGVBcHQoKTtcblx0YXdhaXQgdXBkYXRlQnVuKCk7XG5cdGF3YWl0IHVwZGF0ZUJyZXcoKTtcblx0Y29uc29sZS5sb2coXCJTeXN0ZW0gdXBkYXRlZFwiKTtcbn07XG4iLAogICAgImltcG9ydCB7ICQgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyBmZXRjaExhdGVzdFZlcnNpb24gfSBmcm9tIFwiLi9mZXRjaExhdGVzdFZlcnNpb25cIjtcbmltcG9ydCB7IGdldEN1cnJlbnRWZXJzaW9uIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY29uc3QgY29tbWFuZFVwZGF0ZSA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IGZldGNoTGF0ZXN0VmVyc2lvbigpO1xuXHRjb25zdCBjdXJyZW50VmVyc2lvbiA9IGF3YWl0IGdldEN1cnJlbnRWZXJzaW9uKCk7XG5cdGlmIChsYXRlc3RWZXJzaW9uID09PSBjdXJyZW50VmVyc2lvbikge1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YOKchSBZb3UgYXJlIGFscmVhZHkgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uICR7Y3VycmVudFZlcnNpb259YCxcblx0XHQpO1xuXHRcdHJldHVybjtcblx0fVxuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGNvbnNvbGUubG9nKGDwn5WSIFVwZGF0aW5nIHRvIHZlcnNpb24gJHtsYXRlc3RWZXJzaW9ufWApO1xuXHRcdGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0ICRgYnVuIGkgLWZnIEBjaG5lYXUveEAke2xhdGVzdFZlcnNpb259YFxuXHRcdFx0LnF1aWV0KClcblx0XHRcdC50aGVuKCgpID0+IHRydWUpXG5cdFx0XHQuY2F0Y2goKCkgPT4gZmFsc2UpO1xuXHRcdGlmIChpbnN0YWxsZWQpIGJyZWFrO1xuXHRcdGF3YWl0IEJ1bi5zbGVlcCgxMDAwKTtcblx0fVxuXHRjb25zb2xlLmxvZyhg4pyFIFVwZGF0ZWQgdG8gdmVyc2lvbiAke2xhdGVzdFZlcnNpb259YCk7XG59O1xuIiwKICAgICJleHBvcnQgY29uc3QgZmV0Y2hMYXRlc3RWZXJzaW9uID0gYXN5bmMgKCkgPT5cblx0YXdhaXQgZmV0Y2goXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AY2huZWF1L3gvbGF0ZXN0XCIpXG5cdFx0LnRoZW4oKHgpID0+IHguanNvbigpLnRoZW4oKHgpID0+IHgudmVyc2lvbiBhcyBzdHJpbmcpKVxuXHRcdC5jYXRjaCgoKSA9PiBcIlVOS05PV05cIik7XG4iLAogICAgIiMhL3Vzci9iaW4vZW52IGJ1blxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IGNvbW1hbmREb2N0b3IgfSBmcm9tIFwiLi9jb21tYW5kRG9jdG9yXCI7XG5pbXBvcnQgeyBjb21tYW5kU3lzdGVtIH0gZnJvbSBcIi4vY29tbWFuZFN5c3RlbVwiO1xuaW1wb3J0IHsgY29tbWFuZFVwZGF0ZSB9IGZyb20gXCIuL2NvbW1hbmRVcGRhdGVcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRWZXJzaW9uIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldEN1cnJlbnRWZXJzaW9uKCk7XG5cbnByb2dyYW0ubmFtZShcInhcIikuZGVzY3JpcHRpb24oXCJjaG5lYXUncyB1dGlsaXR5IENMSVwiKS52ZXJzaW9uKHZlcnNpb24pO1xuXG5wcm9ncmFtXG5cdC5jb21tYW5kKFwidXBkYXRlXCIpXG5cdC5kZXNjcmlwdGlvbihcIlVwZGF0ZSB4IHRvIHRoZSBsYXRlc3QgdmVyc2lvblwiKVxuXHQuYWN0aW9uKGNvbW1hbmRVcGRhdGUpO1xuXG5wcm9ncmFtXG5cdC5jb21tYW5kKFwic3lzdGVtXCIpXG5cdC5kZXNjcmlwdGlvbihcIlVwZGF0ZS9pbnN0YWxsIHRoZSBzeXN0ZW0gcGFja2FnZXNcIilcblx0LmFjdGlvbihjb21tYW5kU3lzdGVtKTtcblxucHJvZ3JhbVxuXHQuY29tbWFuZChcImRvY3RvclwiKVxuXHQuZGVzY3JpcHRpb24oXCJDaGVjayB0aGUgc3lzdGVtIGZvciBpc3N1ZXNcIilcblx0LmFjdGlvbihjb21tYW5kRG9jdG9yKTtcblxucHJvZ3JhbS5wYXJzZSgpO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLFFBQU0sdUJBQXVCLE1BQU07QUFBQSxJQU9qQyxXQUFXLENBQUMsVUFBVSxNQUFNLFNBQVM7QUFDbkMsWUFBTSxPQUFPO0FBRWIsWUFBTSxrQkFBa0IsTUFBTSxLQUFLLFdBQVc7QUFDOUMsV0FBSyxPQUFPLEtBQUssWUFBWTtBQUM3QixXQUFLLE9BQU87QUFDWixXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBQUE7QUFBQSxFQUV2QjtBQUtBO0FBQUEsUUFBTSw2QkFBNkIsZUFBZTtBQUFBLElBS2hELFdBQVcsQ0FBQyxTQUFTO0FBQ25CLFlBQU0sR0FBRyw2QkFBNkIsT0FBTztBQUU3QyxZQUFNLGtCQUFrQixNQUFNLEtBQUssV0FBVztBQUM5QyxXQUFLLE9BQU8sS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUVqQztBQUVBLEVBQVEseUJBQWlCO0FBQ3pCLEVBQVEsK0JBQXVCO0FBQUE7Ozs7QUN1Ry9CLFdBQVMsb0JBQW9CLENBQUMsS0FBSztBQUNqQyxVQUFNLGFBQWEsSUFBSSxLQUFLLEtBQUssSUFBSSxhQUFhLE9BQU8sUUFBUTtBQUVqRSxXQUFPLElBQUksV0FBVyxNQUFNLGFBQWEsTUFBTSxNQUFNLGFBQWE7QUFBQTtBQWhKcEUsUUFBUTtBQUVSO0FBQUEsUUFBTSxTQUFTO0FBQUEsSUFVYixXQUFXLENBQUMsTUFBTSxhQUFhO0FBQzdCLFdBQUssY0FBYyxlQUFlO0FBQ2xDLFdBQUss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QWdCO0FBQ3JDLFlBQVEsSUFDUCxtREFBNkMsZ0JBQzlDO0FBQ0E7QUFBQSxFQUNEO0FBQ0EsU0FBTyxNQUFNO0FBQ1osWUFBUSxJQUFJLG9DQUF5QixlQUFlO0FBQ3BELFVBQU0sWUFBWSxNQUFNLHlCQUF3QixnQkFDOUMsTUFBTSxFQUNOLEtBQUssTUFBTSxJQUFJLEVBQ2YsTUFBTSxNQUFNLEtBQUs7QUFDbkIsUUFBSTtBQUFXO0FBQ2YsVUFBTSxJQUFJLE1BQU0sSUFBSTtBQUFBLEVBQ3JCO0FBQ0EsVUFBUSxJQUFJLDZCQUF1QixlQUFlO0FBQUE7OztBRWZuRCxJQUFNLFdBQVUsSUFBSTtBQUVwQixJQUFNLFVBQVUsTUFBTSxrQkFBa0I7QUFFeEMsU0FBUSxLQUFLLEdBQUcsRUFBRSxZQUFZLHNCQUFzQixFQUFFLFFBQVEsT0FBTztBQUVyRSxTQUNFLFFBQVEsUUFBUSxFQUNoQixZQUFZLGdDQUFnQyxFQUM1QyxPQUFPLGFBQWE7QUFFdEIsU0FDRSxRQUFRLFFBQVEsRUFDaEIsWUFBWSxvQ0FBb0MsRUFDaEQsT0FBTyxhQUFhO0FBRXRCLFNBQ0UsUUFBUSxRQUFRLEVBQ2hCLFlBQVksNkJBQTZCLEVBQ3pDLE9BQU8sYUFBYTtBQUV0QixTQUFRLE1BQU07IiwKICAiZGVidWdJZCI6ICJEQjkzMTVGRjAxRjAzNkNFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
2255
|
+
//# debugId=F49427EEB2CEC21964756E2164756E21
|
|
2256
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvYXJndW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvaGVscC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9vcHRpb24uanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvc3VnZ2VzdFNpbWlsYXIuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvY29tbWFuZC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2luZGV4LmpzIiwgImZpeFBhdGgudHMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9lc20ubWpzIiwgImNvbW1hbmREb2N0b3IudHMiLCAiaGVscGVycy50cyIsICJwa2dzLnRzIiwgImNvbW1hbmRTeXN0ZW0udHMiLCAiY29tbWFuZFVwZGF0ZS50cyIsICJmZXRjaExhdGVzdFZlcnNpb24udHMiLCAiaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBDb21tYW5kZXJFcnJvciBjbGFzc1xuICovXG5jbGFzcyBDb21tYW5kZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIENvbW1hbmRlckVycm9yIGNsYXNzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBleGl0Q29kZSBzdWdnZXN0ZWQgZXhpdCBjb2RlIHdoaWNoIGNvdWxkIGJlIHVzZWQgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihleGl0Q29kZSwgY29kZSwgbWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIC8vIHByb3Blcmx5IGNhcHR1cmUgc3RhY2sgdHJhY2UgaW4gTm9kZS5qc1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIHRoaXMuZXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB0aGlzLm5lc3RlZEVycm9yID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogSW52YWxpZEFyZ3VtZW50RXJyb3IgY2xhc3NcbiAqL1xuY2xhc3MgSW52YWxpZEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBDb21tYW5kZXJFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBJbnZhbGlkQXJndW1lbnRFcnJvciBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGV4cGxhbmF0aW9uIG9mIHdoeSBhcmd1bWVudCBpcyBpbnZhbGlkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIoMSwgJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnLCBtZXNzYWdlKTtcbiAgICAvLyBwcm9wZXJseSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIE5vZGUuanNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cbn1cblxuZXhwb3J0cy5Db21tYW5kZXJFcnJvciA9IENvbW1hbmRlckVycm9yO1xuZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yO1xuIiwKICAgICJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIEFyZ3VtZW50IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgY29tbWFuZCBhcmd1bWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkZXNjcmlwdGlvbi5cbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMudmFyaWFkaWMgPSBmYWxzZTtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChuYW1lWzBdKSB7XG4gICAgICBjYXNlICc8JzogLy8gZS5nLiA8cmVxdWlyZWQ+XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6IC8vIGUuZy4gW29wdGlvbmFsXVxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uYW1lLmxlbmd0aCA+IDMgJiYgdGhpcy5fbmFtZS5zbGljZSgtMykgPT09ICcuLi4nKSB7XG4gICAgICB0aGlzLnZhcmlhZGljID0gdHJ1ZTtcbiAgICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lLnNsaWNlKDAsIC0zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFyZ3VtZW50IG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfY29uY2F0VmFsdWUodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzID09PSB0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiBbdmFsdWVdO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91cy5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBkZXNjcmlwdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXN0b20gaGFuZGxlciBmb3IgcHJvY2Vzc2luZyBDTEkgY29tbWFuZCBhcmd1bWVudHMgaW50byBhcmd1bWVudCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IGFyZ3VtZW50IHZhbHVlIHRvIGJlIG9uZSBvZiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXNcbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgcmVxdWlyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ1JlcXVpcmVkKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgb3B0aW9uYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ09wdGlvbmFsKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpIHtcbiAgY29uc3QgbmFtZU91dHB1dCA9IGFyZy5uYW1lKCkgKyAoYXJnLnZhcmlhZGljID09PSB0cnVlID8gJy4uLicgOiAnJyk7XG5cbiAgcmV0dXJuIGFyZy5yZXF1aXJlZCA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPicgOiAnWycgKyBuYW1lT3V0cHV0ICsgJ10nO1xufVxuXG5leHBvcnRzLkFyZ3VtZW50ID0gQXJndW1lbnQ7XG5leHBvcnRzLmh1bWFuUmVhZGFibGVBcmdOYW1lID0gaHVtYW5SZWFkYWJsZUFyZ05hbWU7XG4iLAogICAgImNvbnN0IHsgaHVtYW5SZWFkYWJsZUFyZ05hbWUgfSA9IHJlcXVpcmUoJy4vYXJndW1lbnQuanMnKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGltcG9ydCB0eXBlcyBmb3IgSlNEb2MsIHVzZWQgYnkgVmlzdWFsIFN0dWRpbyBDb2RlIEludGVsbGlTZW5zZSBhbmQgYG5wbSBydW4gdHlwZXNjcmlwdC1jaGVja0pTYFxuICogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svanNkb2Mtc3VwcG9ydGVkLXR5cGVzLmh0bWwjaW1wb3J0LXR5cGVzXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vYXJndW1lbnQuanNcIikuQXJndW1lbnQgfSBBcmd1bWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL2NvbW1hbmQuanNcIikuQ29tbWFuZCB9IENvbW1hbmRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9vcHRpb24uanNcIikuT3B0aW9uIH0gT3B0aW9uXG4gKi9cblxuLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGNsYXNzLCBtZXRob2RzIGFyZSBzdGF0aWMgaW4gc3R5bGUgdG8gYWxsb3cgb3ZlcnJpZGUgdXNpbmcgc3ViY2xhc3Mgb3IganVzdCBmdW5jdGlvbnMuXG5jbGFzcyBIZWxwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWxwV2lkdGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zb3J0U3ViY29tbWFuZHMgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnRPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5zaG93R2xvYmFsT3B0aW9ucyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBzdWJjb21tYW5kcy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgY29tbWFuZCwgaWYgdGhlcmUgaXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKi9cblxuICB2aXNpYmxlQ29tbWFuZHMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZUNvbW1hbmRzID0gY21kLmNvbW1hbmRzLmZpbHRlcigoY21kKSA9PiAhY21kLl9oaWRkZW4pO1xuICAgIGNvbnN0IGhlbHBDb21tYW5kID0gY21kLl9nZXRIZWxwQ29tbWFuZCgpO1xuICAgIGlmIChoZWxwQ29tbWFuZCAmJiAhaGVscENvbW1hbmQuX2hpZGRlbikge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnB1c2goaGVscENvbW1hbmQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3ViY29tbWFuZHMpIHtcbiAgICAgIHZpc2libGVDb21tYW5kcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgICAgICByZXR1cm4gYS5uYW1lKCkubG9jYWxlQ29tcGFyZShiLm5hbWUoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVDb21tYW5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIG9wdGlvbnMgZm9yIHNvcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBhXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBiXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBjb21wYXJlT3B0aW9ucyhhLCBiKSB7XG4gICAgY29uc3QgZ2V0U29ydEtleSA9IChvcHRpb24pID0+IHtcbiAgICAgIC8vIFdZU0lXWUcgZm9yIG9yZGVyIGRpc3BsYXllZCBpbiBoZWxwLiBTaG9ydCB1c2VkIGZvciBjb21wYXJpc29uIGlmIHByZXNlbnQuIE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5lZ2F0ZWQuXG4gICAgICByZXR1cm4gb3B0aW9uLnNob3J0XG4gICAgICAgID8gb3B0aW9uLnNob3J0LnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgIDogb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH07XG4gICAgcmV0dXJuIGdldFNvcnRLZXkoYSkubG9jYWxlQ29tcGFyZShnZXRTb3J0S2V5KGIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgb3B0aW9ucy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgb3B0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZU9wdGlvbnMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBjbWQub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4pO1xuICAgIC8vIEJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgIGNvbnN0IGhlbHBPcHRpb24gPSBjbWQuX2dldEhlbHBPcHRpb24oKTtcbiAgICBpZiAoaGVscE9wdGlvbiAmJiAhaGVscE9wdGlvbi5oaWRkZW4pIHtcbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgaGlkZSBjb25mbGljdGluZyBmbGFncy4gQml0IGR1YmlvdXMgYnV0IGEgaGlzdG9yaWNhbCBiZWhhdmlvdXIgdGhhdCBpcyBjb252ZW5pZW50IGZvciBzaW5nbGUtY29tbWFuZCBwcm9ncmFtcy5cbiAgICAgIGNvbnN0IHJlbW92ZVNob3J0ID0gaGVscE9wdGlvbi5zaG9ydCAmJiBjbWQuX2ZpbmRPcHRpb24oaGVscE9wdGlvbi5zaG9ydCk7XG4gICAgICBjb25zdCByZW1vdmVMb25nID0gaGVscE9wdGlvbi5sb25nICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLmxvbmcpO1xuICAgICAgaWYgKCFyZW1vdmVTaG9ydCAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKGhlbHBPcHRpb24pOyAvLyBubyBjaGFuZ2VzIG5lZWRlZFxuICAgICAgfSBlbHNlIGlmIChoZWxwT3B0aW9uLmxvbmcgJiYgIXJlbW92ZUxvbmcpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24ubG9uZywgaGVscE9wdGlvbi5kZXNjcmlwdGlvbiksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24uc2hvcnQgJiYgIXJlbW92ZVNob3J0KSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goXG4gICAgICAgICAgY21kLmNyZWF0ZU9wdGlvbihoZWxwT3B0aW9uLnNob3J0LCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIHZpc2libGVPcHRpb25zLnNvcnQodGhpcy5jb21wYXJlT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgZ2xvYmFsIG9wdGlvbnMuIChOb3QgaW5jbHVkaW5nIGhlbHAuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7T3B0aW9uW119XG4gICAqL1xuXG4gIHZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkge1xuICAgIGlmICghdGhpcy5zaG93R2xvYmFsT3B0aW9ucykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgZ2xvYmFsT3B0aW9ucyA9IFtdO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBhbmNlc3RvckNtZC5vcHRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4sXG4gICAgICApO1xuICAgICAgZ2xvYmFsT3B0aW9ucy5wdXNoKC4uLnZpc2libGVPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIGdsb2JhbE9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBhcmd1bWVudHMgaWYgYW55IGhhdmUgYSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge0FyZ3VtZW50W119XG4gICAqL1xuXG4gIHZpc2libGVBcmd1bWVudHMoY21kKSB7XG4gICAgLy8gU2lkZSBlZmZlY3QhIEFwcGx5IHRoZSBsZWdhY3kgZGVzY3JpcHRpb25zIGJlZm9yZSB0aGUgYXJndW1lbnRzIGFyZSBkaXNwbGF5ZWQuXG4gICAgaWYgKGNtZC5fYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgICBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmd1bWVudCkgPT4ge1xuICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXJndW1lbnQuZGVzY3JpcHRpb24gfHwgY21kLl9hcmdzRGVzY3JpcHRpb25bYXJndW1lbnQubmFtZSgpXSB8fCAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYXJndW1lbnRzIHdpdGggYSBkZXNjcmlwdGlvbiB0aGVuIHJldHVybiBhbGwgdGhlIGFyZ3VtZW50cy5cbiAgICBpZiAoY21kLnJlZ2lzdGVyZWRBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21tYW5kIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgc3ViY29tbWFuZFRlcm0oY21kKSB7XG4gICAgLy8gTGVnYWN5LiBJZ25vcmVzIGN1c3RvbSB1c2FnZSBzdHJpbmcsIGFuZCBuZXN0ZWQgY29tbWFuZHMuXG4gICAgY29uc3QgYXJncyA9IGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzXG4gICAgICAubWFwKChhcmcpID0+IGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykpXG4gICAgICAuam9pbignICcpO1xuICAgIHJldHVybiAoXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgKGNtZC5fYWxpYXNlc1swXSA/ICd8JyArIGNtZC5fYWxpYXNlc1swXSA6ICcnKSArXG4gICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICsgLy8gc2ltcGxpc3RpYyBjaGVjayBmb3Igbm9uLWhlbHAgb3B0aW9uXG4gICAgICAoYXJncyA/ICcgJyArIGFyZ3MgOiAnJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIG9wdGlvblRlcm0ob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5mbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFyZ3VtZW50IHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGFyZ3VtZW50VGVybShhcmd1bWVudCkge1xuICAgIHJldHVybiBhcmd1bWVudC5uYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGNvbW1hbmQgdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkucmVkdWNlKChtYXgsIGNvbW1hbmQpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5zdWJjb21tYW5kVGVybShjb21tYW5kKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBvcHRpb24gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLnJlZHVjZSgobWF4LCBvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbikubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgZ2xvYmFsIG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBhcmd1bWVudCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLnJlZHVjZSgobWF4LCBhcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCkubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdXNhZ2UgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmRVc2FnZShjbWQpIHtcbiAgICAvLyBVc2FnZVxuICAgIGxldCBjbWROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChjbWQuX2FsaWFzZXNbMF0pIHtcbiAgICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgY21kLl9hbGlhc2VzWzBdO1xuICAgIH1cbiAgICBsZXQgYW5jZXN0b3JDbWROYW1lcyA9ICcnO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgYW5jZXN0b3JDbWROYW1lcyA9IGFuY2VzdG9yQ21kLm5hbWUoKSArICcgJyArIGFuY2VzdG9yQ21kTmFtZXM7XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvckNtZE5hbWVzICsgY21kTmFtZSArICcgJyArIGNtZC51c2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5kZXNjcmlwdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3ViY29tbWFuZCBzdW1tYXJ5IHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygc3ViY29tbWFuZHMuXG4gICAqIChGYWxsYmFjayB0byBkZXNjcmlwdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5zdW1tYXJ5KCkgfHwgY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG5cbiAgICBpZiAob3B0aW9uLmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke29wdGlvbi5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkZWZhdWx0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG1vcmUgZm9yIHByb2dyYW1tZXIgdGhhbiBlbmQgdXNlcixcbiAgICAgIC8vIGJ1dCBzaG93IHRydWUvZmFsc2UgZm9yIGJvb2xlYW4gb3B0aW9uIGFzIG1heSBiZSBmb3IgaGFuZC1yb2xsZWQgZW52IG9yIGNvbmZpZyBwcm9jZXNzaW5nLlxuICAgICAgY29uc3Qgc2hvd0RlZmF1bHQgPVxuICAgICAgICBvcHRpb24ucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9uLm9wdGlvbmFsIHx8XG4gICAgICAgIChvcHRpb24uaXNCb29sZWFuKCkgJiYgdHlwZW9mIG9wdGlvbi5kZWZhdWx0VmFsdWUgPT09ICdib29sZWFuJyk7XG4gICAgICBpZiAoc2hvd0RlZmF1bHQpIHtcbiAgICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgICAgYGRlZmF1bHQ6ICR7b3B0aW9uLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZXNldCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBhcmUgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyXG4gICAgaWYgKG9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBwcmVzZXQ6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9uLnByZXNldEFyZyl9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZW52VmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBlbnY6ICR7b3B0aW9uLmVudlZhcn1gKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCR7b3B0aW9uLmRlc2NyaXB0aW9ufSAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnREZXNjcmlwdGlvbihhcmd1bWVudCkge1xuICAgIGNvbnN0IGV4dHJhSW5mbyA9IFtdO1xuICAgIGlmIChhcmd1bWVudC5hcmdDaG9pY2VzKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgLy8gdXNlIHN0cmluZ2lmeSB0byBtYXRjaCB0aGUgZGlzcGxheSBvZiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBgY2hvaWNlczogJHthcmd1bWVudC5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICBgZGVmYXVsdDogJHthcmd1bWVudC5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiB8fCBKU09OLnN0cmluZ2lmeShhcmd1bWVudC5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4dHJhRGVzY3JpcHRvbiA9IGAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICAgIGlmIChhcmd1bWVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICByZXR1cm4gYCR7YXJndW1lbnQuZGVzY3JpcHRpb259ICR7ZXh0cmFEZXNjcmlwdG9ufWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXh0cmFEZXNjcmlwdG9uO1xuICAgIH1cbiAgICByZXR1cm4gYXJndW1lbnQuZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGJ1aWx0LWluIGhlbHAgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgZm9ybWF0SGVscChjbWQsIGhlbHBlcikge1xuICAgIGNvbnN0IHRlcm1XaWR0aCA9IGhlbHBlci5wYWRXaWR0aChjbWQsIGhlbHBlcik7XG4gICAgY29uc3QgaGVscFdpZHRoID0gaGVscGVyLmhlbHBXaWR0aCB8fCA4MDtcbiAgICBjb25zdCBpdGVtSW5kZW50V2lkdGggPSAyO1xuICAgIGNvbnN0IGl0ZW1TZXBhcmF0b3JXaWR0aCA9IDI7IC8vIGJldHdlZW4gdGVybSBhbmQgZGVzY3JpcHRpb25cbiAgICBmdW5jdGlvbiBmb3JtYXRJdGVtKHRlcm0sIGRlc2NyaXB0aW9uKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBgJHt0ZXJtLnBhZEVuZCh0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgpfSR7ZGVzY3JpcHRpb259YDtcbiAgICAgICAgcmV0dXJuIGhlbHBlci53cmFwKFxuICAgICAgICAgIGZ1bGxUZXh0LFxuICAgICAgICAgIGhlbHBXaWR0aCAtIGl0ZW1JbmRlbnRXaWR0aCxcbiAgICAgICAgICB0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0TGlzdCh0ZXh0QXJyYXkpIHtcbiAgICAgIHJldHVybiB0ZXh0QXJyYXkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAnLnJlcGVhdChpdGVtSW5kZW50V2lkdGgpKTtcbiAgICB9XG5cbiAgICAvLyBVc2FnZVxuICAgIGxldCBvdXRwdXQgPSBbYFVzYWdlOiAke2hlbHBlci5jb21tYW5kVXNhZ2UoY21kKX1gLCAnJ107XG5cbiAgICAvLyBEZXNjcmlwdGlvblxuICAgIGNvbnN0IGNvbW1hbmREZXNjcmlwdGlvbiA9IGhlbHBlci5jb21tYW5kRGVzY3JpcHRpb24oY21kKTtcbiAgICBpZiAoY29tbWFuZERlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICBoZWxwZXIud3JhcChjb21tYW5kRGVzY3JpcHRpb24sIGhlbHBXaWR0aCwgMCksXG4gICAgICAgICcnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQXJndW1lbnRzXG4gICAgY29uc3QgYXJndW1lbnRMaXN0ID0gaGVscGVyLnZpc2libGVBcmd1bWVudHMoY21kKS5tYXAoKGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCksXG4gICAgICAgIGhlbHBlci5hcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3VtZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQXJndW1lbnRzOicsIGZvcm1hdExpc3QoYXJndW1lbnRMaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uTGlzdCA9IGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKSxcbiAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydPcHRpb25zOicsIGZvcm1hdExpc3Qob3B0aW9uTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd0dsb2JhbE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGdsb2JhbE9wdGlvbkxpc3QgPSBoZWxwZXJcbiAgICAgICAgLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZClcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZ2xvYmFsT3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICAgICdHbG9iYWwgT3B0aW9uczonLFxuICAgICAgICAgIGZvcm1hdExpc3QoZ2xvYmFsT3B0aW9uTGlzdCksXG4gICAgICAgICAgJycsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1hbmRzXG4gICAgY29uc3QgY29tbWFuZExpc3QgPSBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkubWFwKChjbWQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZFRlcm0oY21kKSxcbiAgICAgICAgaGVscGVyLnN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoY29tbWFuZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ0NvbW1hbmRzOicsIGZvcm1hdExpc3QoY29tbWFuZExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBwYWQgd2lkdGggZnJvbSB0aGUgbWF4aW11bSB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgcGFkV2lkdGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICBoZWxwZXIubG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RHbG9iYWxPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0U3ViY29tbWFuZFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RBcmd1bWVudFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHdpZHRoIGNoYXJhY3RlcnMgcGVyIGxpbmUsIHdpdGggbGluZXMgYWZ0ZXIgdGhlIGZpcnN0IGluZGVudGVkLlxuICAgKiBEbyBub3Qgd3JhcCBpZiBpbnN1ZmZpY2llbnQgcm9vbSBmb3Igd3JhcHBpbmcgKG1pbkNvbHVtbldpZHRoKSwgb3Igc3RyaW5nIGlzIG1hbnVhbGx5IGZvcm1hdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGVudFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbkNvbHVtbldpZHRoPTQwXVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqXG4gICAqL1xuXG4gIHdyYXAoc3RyLCB3aWR0aCwgaW5kZW50LCBtaW5Db2x1bW5XaWR0aCA9IDQwKSB7XG4gICAgLy8gRnVsbCBcXHMgY2hhcmFjdGVycywgbWludXMgdGhlIGxpbmVmZWVkcy5cbiAgICBjb25zdCBpbmRlbnRzID1cbiAgICAgICcgXFxcXGZcXFxcdFxcXFx2XFx1MDBhMFxcdTE2ODBcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmJztcbiAgICAvLyBEZXRlY3QgbWFudWFsbHkgd3JhcHBlZCBhbmQgaW5kZW50ZWQgc3RyaW5ncyBieSBzZWFyY2hpbmcgZm9yIGxpbmUgYnJlYWsgZm9sbG93ZWQgYnkgc3BhY2VzLlxuICAgIGNvbnN0IG1hbnVhbEluZGVudCA9IG5ldyBSZWdFeHAoYFtcXFxcbl1bJHtpbmRlbnRzfV0rYCk7XG4gICAgaWYgKHN0ci5tYXRjaChtYW51YWxJbmRlbnQpKSByZXR1cm4gc3RyO1xuICAgIC8vIERvIG5vdCB3cmFwIGlmIG5vdCBlbm91Z2ggcm9vbSBmb3IgYSB3cmFwcGVkIGNvbHVtbiBvZiB0ZXh0IChhcyBjb3VsZCBlbmQgdXAgd2l0aCBhIHdvcmQgcGVyIGxpbmUpLlxuICAgIGNvbnN0IGNvbHVtbldpZHRoID0gd2lkdGggLSBpbmRlbnQ7XG4gICAgaWYgKGNvbHVtbldpZHRoIDwgbWluQ29sdW1uV2lkdGgpIHJldHVybiBzdHI7XG5cbiAgICBjb25zdCBsZWFkaW5nU3RyID0gc3RyLnNsaWNlKDAsIGluZGVudCk7XG4gICAgY29uc3QgY29sdW1uVGV4dCA9IHN0ci5zbGljZShpbmRlbnQpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTtcbiAgICBjb25zdCBpbmRlbnRTdHJpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgemVyb1dpZHRoU3BhY2UgPSAnXFx1MjAwQic7XG4gICAgY29uc3QgYnJlYWtzID0gYFxcXFxzJHt6ZXJvV2lkdGhTcGFjZX1gO1xuICAgIC8vIE1hdGNoIGxpbmUgZW5kIChzbyBlbXB0eSBsaW5lcyBkb24ndCBjb2xsYXBzZSksXG4gICAgLy8gb3IgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGluIGNvbHVtbiwgb3IgZXhjZXNzIHRleHQgdXAgdG8gZmlyc3QgYnJlYWsuXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYFxcbnwuezEsJHtjb2x1bW5XaWR0aCAtIDF9fShbJHticmVha3N9XXwkKXxbXiR7YnJlYWtzfV0rPyhbJHticmVha3N9XXwkKWAsXG4gICAgICAnZycsXG4gICAgKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbHVtblRleHQubWF0Y2gocmVnZXgpIHx8IFtdO1xuICAgIHJldHVybiAoXG4gICAgICBsZWFkaW5nU3RyICtcbiAgICAgIGxpbmVzXG4gICAgICAgIC5tYXAoKGxpbmUsIGkpID0+IHtcbiAgICAgICAgICBpZiAobGluZSA9PT0gJ1xcbicpIHJldHVybiAnJzsgLy8gcHJlc2VydmUgZW1wdHkgbGluZXNcbiAgICAgICAgICByZXR1cm4gKGkgPiAwID8gaW5kZW50U3RyaW5nIDogJycpICsgbGluZS50cmltRW5kKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0cy5IZWxwID0gSGVscDtcbiIsCiAgICAiY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9lcnJvci5qcycpO1xuXG5jbGFzcyBPcHRpb24ge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBgT3B0aW9uYCB3aXRoIHRoZSBnaXZlbiBgZmxhZ3NgIGFuZCBgZGVzY3JpcHRpb25gLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoZmxhZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiB8fCAnJztcblxuICAgIHRoaXMucmVxdWlyZWQgPSBmbGFncy5pbmNsdWRlcygnPCcpOyAvLyBBIHZhbHVlIG11c3QgYmUgc3VwcGxpZWQgd2hlbiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC5cbiAgICB0aGlzLm9wdGlvbmFsID0gZmxhZ3MuaW5jbHVkZXMoJ1snKTsgLy8gQSB2YWx1ZSBpcyBvcHRpb25hbCB3aGVuIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkLlxuICAgIC8vIHZhcmlhZGljIHRlc3QgaWdub3JlcyA8dmFsdWUsLi4uPiBldCBhbCB3aGljaCBtaWdodCBiZSB1c2VkIHRvIGRlc2NyaWJlIGN1c3RvbSBzcGxpdHRpbmcgb2Ygc2luZ2xlIGFyZ3VtZW50XG4gICAgdGhpcy52YXJpYWRpYyA9IC9cXHdcXC5cXC5cXC5bPlxcXV0kLy50ZXN0KGZsYWdzKTsgLy8gVGhlIG9wdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSB2YWx1ZXMuXG4gICAgdGhpcy5tYW5kYXRvcnkgPSBmYWxzZTsgLy8gVGhlIG9wdGlvbiBtdXN0IGhhdmUgYSB2YWx1ZSBhZnRlciBwYXJzaW5nLCB3aGljaCB1c3VhbGx5IG1lYW5zIGl0IG11c3QgYmUgc3BlY2lmaWVkIG9uIGNvbW1hbmQgbGluZS5cbiAgICBjb25zdCBvcHRpb25GbGFncyA9IHNwbGl0T3B0aW9uRmxhZ3MoZmxhZ3MpO1xuICAgIHRoaXMuc2hvcnQgPSBvcHRpb25GbGFncy5zaG9ydEZsYWc7XG4gICAgdGhpcy5sb25nID0gb3B0aW9uRmxhZ3MubG9uZ0ZsYWc7XG4gICAgdGhpcy5uZWdhdGUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5sb25nKSB7XG4gICAgICB0aGlzLm5lZ2F0ZSA9IHRoaXMubG9uZy5zdGFydHNXaXRoKCctLW5vLScpO1xuICAgIH1cbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucHJlc2V0QXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW52VmFyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucGFyc2VBcmcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25mbGljdHNXaXRoID0gW107XG4gICAgdGhpcy5pbXBsaWVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBkZXNjcmlwdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBkZWZhdWx0KHZhbHVlLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXNldCB0byB1c2Ugd2hlbiBvcHRpb24gdXNlZCB3aXRob3V0IG9wdGlvbi1hcmd1bWVudCwgZXNwZWNpYWxseSBvcHRpb25hbCBidXQgYWxzbyBib29sZWFuIGFuZCBuZWdhdGVkLlxuICAgKiBUaGUgY3VzdG9tIHByb2Nlc3NpbmcgKHBhcnNlQXJnKSBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBPcHRpb24oJy0tY29sb3InKS5kZWZhdWx0KCdHUkVZU0NBTEUnKS5wcmVzZXQoJ1JHQicpO1xuICAgKiBuZXcgT3B0aW9uKCctLWRvbmF0ZSBbYW1vdW50XScpLnByZXNldCgnMjAnKS5hcmdQYXJzZXIocGFyc2VGbG9hdCk7XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gYXJnXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgcHJlc2V0KGFyZykge1xuICAgIHRoaXMucHJlc2V0QXJnID0gYXJnO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvcHRpb24gbmFtZShzKSB0aGF0IGNvbmZsaWN0IHdpdGggdGhpcyBvcHRpb24uXG4gICAqIEFuIGVycm9yIHdpbGwgYmUgZGlzcGxheWVkIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIGZvdW5kIGR1cmluZyBwYXJzaW5nLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgT3B0aW9uKCctLXJnYicpLmNvbmZsaWN0cygnY215aycpO1xuICAgKiBuZXcgT3B0aW9uKCctLWpzJykuY29uZmxpY3RzKFsndHMnLCAnanN4J10pO1xuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBzdHJpbmdbXSl9IG5hbWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgY29uZmxpY3RzKG5hbWVzKSB7XG4gICAgdGhpcy5jb25mbGljdHNXaXRoID0gdGhpcy5jb25mbGljdHNXaXRoLmNvbmNhdChuYW1lcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBpbXBsaWVkIG9wdGlvbiB2YWx1ZXMgZm9yIHdoZW4gdGhpcyBvcHRpb24gaXMgc2V0IGFuZCB0aGUgaW1wbGllZCBvcHRpb25zIGFyZSBub3QuXG4gICAqXG4gICAqIFRoZSBjdXN0b20gcHJvY2Vzc2luZyAocGFyc2VBcmcpIGlzIG5vdCBjYWxsZWQgb24gdGhlIGltcGxpZWQgdmFsdWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWxvZycsICd3cml0ZSBsb2dnaW5nIGluZm9ybWF0aW9uIHRvIGZpbGUnKSlcbiAgICogICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tdHJhY2UnLCAnbG9nIGV4dHJhIGRldGFpbHMnKS5pbXBsaWVzKHsgbG9nOiAndHJhY2UudHh0JyB9KSk7XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbXBsaWVkT3B0aW9uVmFsdWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG4gIGltcGxpZXMoaW1wbGllZE9wdGlvblZhbHVlcykge1xuICAgIGxldCBuZXdJbXBsaWVkID0gaW1wbGllZE9wdGlvblZhbHVlcztcbiAgICBpZiAodHlwZW9mIGltcGxpZWRPcHRpb25WYWx1ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBzdHJpbmcgaXMgbm90IGRvY3VtZW50ZWQsIGJ1dCBlYXN5IG1pc3Rha2UgYW5kIHdlIGNhbiBkbyB3aGF0IHVzZXIgcHJvYmFibHkgaW50ZW5kZWQuXG4gICAgICBuZXdJbXBsaWVkID0geyBbaW1wbGllZE9wdGlvblZhbHVlc106IHRydWUgfTtcbiAgICB9XG4gICAgdGhpcy5pbXBsaWVkID0gT2JqZWN0LmFzc2lnbih0aGlzLmltcGxpZWQgfHwge30sIG5ld0ltcGxpZWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBjaGVjayBmb3Igb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgaWYgd2hlbiBwcm9jZXNzZWQgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlIGlzXG4gICAqIHVuZGVmaW5lZCwgb3IgdGhlIHNvdXJjZSBvZiB0aGUgY3VycmVudCB2YWx1ZSBpcyAnZGVmYXVsdCcgb3IgJ2NvbmZpZycgb3IgJ2VudicuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgZW52KG5hbWUpIHtcbiAgICB0aGlzLmVudlZhciA9IG5hbWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXN0b20gaGFuZGxlciBmb3IgcHJvY2Vzc2luZyBDTEkgb3B0aW9uIGFyZ3VtZW50cyBpbnRvIG9wdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBhcmdQYXJzZXIoZm4pIHtcbiAgICB0aGlzLnBhcnNlQXJnID0gZm47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIG1hbmRhdG9yeSBhbmQgbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbbWFuZGF0b3J5PXRydWVdXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgbWFrZU9wdGlvbk1hbmRhdG9yeShtYW5kYXRvcnkgPSB0cnVlKSB7XG4gICAgdGhpcy5tYW5kYXRvcnkgPSAhIW1hbmRhdG9yeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIG9wdGlvbiBpbiBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWRlPXRydWVdXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgaGlkZUhlbHAoaGlkZSA9IHRydWUpIHtcbiAgICB0aGlzLmhpZGRlbiA9ICEhaGlkZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfY29uY2F0VmFsdWUodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzID09PSB0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiBbdmFsdWVdO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91cy5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgYWxsb3cgb3B0aW9uIHZhbHVlIHRvIGJlIG9uZSBvZiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXNcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBjaG9pY2VzKHZhbHVlcykge1xuICAgIHRoaXMuYXJnQ2hvaWNlcyA9IHZhbHVlcy5zbGljZSgpO1xuICAgIHRoaXMucGFyc2VBcmcgPSAoYXJnLCBwcmV2aW91cykgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFyZ0Nob2ljZXMuaW5jbHVkZXMoYXJnKSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgICAgYEFsbG93ZWQgY2hvaWNlcyBhcmUgJHt0aGlzLmFyZ0Nob2ljZXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZhcmlhZGljKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25jYXRWYWx1ZShhcmcsIHByZXZpb3VzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gb3B0aW9uIG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgbmFtZSgpIHtcbiAgICBpZiAodGhpcy5sb25nKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb25nLnJlcGxhY2UoL14tLS8sICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvcnQucmVwbGFjZSgvXi0vLCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9wdGlvbiBuYW1lLCBpbiBhIGNhbWVsY2FzZSBmb3JtYXQgdGhhdCBjYW4gYmUgdXNlZFxuICAgKiBhcyBhIG9iamVjdCBhdHRyaWJ1dGUga2V5LlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGF0dHJpYnV0ZU5hbWUoKSB7XG4gICAgcmV0dXJuIGNhbWVsY2FzZSh0aGlzLm5hbWUoKS5yZXBsYWNlKC9ebm8tLywgJycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBgYXJnYCBtYXRjaGVzIHRoZSBzaG9ydCBvciBsb25nIGZsYWcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgaXMoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvcnQgPT09IGFyZyB8fCB0aGlzLmxvbmcgPT09IGFyZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBhIGJvb2xlYW4gb3B0aW9uLlxuICAgKlxuICAgKiBPcHRpb25zIGFyZSBvbmUgb2YgYm9vbGVhbiwgbmVnYXRlZCwgcmVxdWlyZWQgYXJndW1lbnQsIG9yIG9wdGlvbmFsIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBpc0Jvb2xlYW4oKSB7XG4gICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkICYmICF0aGlzLm9wdGlvbmFsICYmICF0aGlzLm5lZ2F0ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd29yayB3aXRoIGR1YWwgb3B0aW9ucywgd2l0aG91dCBjaGFuZ2luZyB0aGUgZXhpc3RpbmdcbiAqIGltcGxlbWVudGF0aW9uLiBXZSBzdXBwb3J0IHNlcGFyYXRlIGR1YWwgb3B0aW9ucyBmb3Igc2VwYXJhdGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG9wdGlvbnMsXG4gKiBsaWtlIGAtLWJ1aWxkYCBhbmQgYC0tbm8tYnVpbGRgLCB3aGljaCBzaGFyZSBhIHNpbmdsZSBvcHRpb24gdmFsdWUuIFRoaXMgd29ya3MgbmljZWx5IGZvciBzb21lXG4gKiB1c2UgY2FzZXMsIGJ1dCBpcyB0cmlja3kgZm9yIG90aGVycyB3aGVyZSB3ZSB3YW50IHNlcGFyYXRlIGJlaGF2aW91cnMgZGVzcGl0ZVxuICogdGhlIHNpbmdsZSBzaGFyZWQgb3B0aW9uIHZhbHVlLlxuICovXG5jbGFzcyBEdWFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge09wdGlvbltdfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5wb3NpdGl2ZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kdWFsT3B0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMuc2V0KG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCksIG9wdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aXZlT3B0aW9ucy5zZXQob3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5lZ2F0aXZlT3B0aW9ucy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5wb3NpdGl2ZU9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgICAgdGhpcy5kdWFsT3B0aW9ucy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaWQgdGhlIHZhbHVlIGNvbWUgZnJvbSB0aGUgb3B0aW9uLCBhbmQgbm90IGZyb20gcG9zc2libGUgbWF0Y2hpbmcgZHVhbCBvcHRpb24/XG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHZhbHVlRnJvbU9wdGlvbih2YWx1ZSwgb3B0aW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICBpZiAoIXRoaXMuZHVhbE9wdGlvbnMuaGFzKG9wdGlvbktleSkpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gVXNlIHRoZSB2YWx1ZSB0byBkZWR1Y2UgaWYgKHByb2JhYmx5KSBjYW1lIGZyb20gdGhlIG9wdGlvbi5cbiAgICBjb25zdCBwcmVzZXQgPSB0aGlzLm5lZ2F0aXZlT3B0aW9ucy5nZXQob3B0aW9uS2V5KS5wcmVzZXRBcmc7XG4gICAgY29uc3QgbmVnYXRpdmVWYWx1ZSA9IHByZXNldCAhPT0gdW5kZWZpbmVkID8gcHJlc2V0IDogZmFsc2U7XG4gICAgcmV0dXJuIG9wdGlvbi5uZWdhdGUgPT09IChuZWdhdGl2ZVZhbHVlID09PSB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyBmcm9tIGtlYmFiLWNhc2UgdG8gY2FtZWxDYXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY2FtZWxjYXNlKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KCctJykucmVkdWNlKChzdHIsIHdvcmQpID0+IHtcbiAgICByZXR1cm4gc3RyICsgd29yZFswXS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKTtcbiAgfSk7XG59XG5cbi8qKlxuICogU3BsaXQgdGhlIHNob3J0IGFuZCBsb25nIGZsYWcgb3V0IG9mIHNvbWV0aGluZyBsaWtlICctbSwtLW1peGVkIDx2YWx1ZT4nXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGxpdE9wdGlvbkZsYWdzKGZsYWdzKSB7XG4gIGxldCBzaG9ydEZsYWc7XG4gIGxldCBsb25nRmxhZztcbiAgLy8gVXNlIG9yaWdpbmFsIHZlcnkgbG9vc2UgcGFyc2luZyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igbm93LFxuICAvLyB3aGljaCBhbGxvd2VkIGZvciBleGFtcGxlIHVuaW50ZW5kZWQgYC1zdywgLS1zaG9ydC13b3JkYCBbc2ljXS5cbiAgY29uc3QgZmxhZ1BhcnRzID0gZmxhZ3Muc3BsaXQoL1sgfCxdKy8pO1xuICBpZiAoZmxhZ1BhcnRzLmxlbmd0aCA+IDEgJiYgIS9eW1s8XS8udGVzdChmbGFnUGFydHNbMV0pKVxuICAgIHNob3J0RmxhZyA9IGZsYWdQYXJ0cy5zaGlmdCgpO1xuICBsb25nRmxhZyA9IGZsYWdQYXJ0cy5zaGlmdCgpO1xuICAvLyBBZGQgc3VwcG9ydCBmb3IgbG9uZSBzaG9ydCBmbGFnIHdpdGhvdXQgc2lnbmlmaWNhbnRseSBjaGFuZ2luZyBwYXJzaW5nIVxuICBpZiAoIXNob3J0RmxhZyAmJiAvXi1bXi1dJC8udGVzdChsb25nRmxhZykpIHtcbiAgICBzaG9ydEZsYWcgPSBsb25nRmxhZztcbiAgICBsb25nRmxhZyA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyBzaG9ydEZsYWcsIGxvbmdGbGFnIH07XG59XG5cbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuZXhwb3J0cy5EdWFsT3B0aW9ucyA9IER1YWxPcHRpb25zO1xuIiwKICAgICJjb25zdCBtYXhEaXN0YW5jZSA9IDM7XG5cbmZ1bmN0aW9uIGVkaXREaXN0YW5jZShhLCBiKSB7XG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RhbWVyYXXigJNMZXZlbnNodGVpbl9kaXN0YW5jZVxuICAvLyBDYWxjdWxhdGluZyBvcHRpbWFsIHN0cmluZyBhbGlnbm1lbnQgZGlzdGFuY2UsIG5vIHN1YnN0cmluZyBpcyBlZGl0ZWQgbW9yZSB0aGFuIG9uY2UuXG4gIC8vIChTaW1wbGUgaW1wbGVtZW50YXRpb24uKVxuXG4gIC8vIFF1aWNrIGVhcmx5IGV4aXQsIHJldHVybiB3b3JzdCBjYXNlLlxuICBpZiAoTWF0aC5hYnMoYS5sZW5ndGggLSBiLmxlbmd0aCkgPiBtYXhEaXN0YW5jZSlcbiAgICByZXR1cm4gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKTtcblxuICAvLyBkaXN0YW5jZSBiZXR3ZWVuIHByZWZpeCBzdWJzdHJpbmdzIG9mIGEgYW5kIGJcbiAgY29uc3QgZCA9IFtdO1xuXG4gIC8vIHB1cmUgZGVsZXRpb25zIHR1cm4gYSBpbnRvIGVtcHR5IHN0cmluZ1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgZFtpXSA9IFtpXTtcbiAgfVxuICAvLyBwdXJlIGluc2VydGlvbnMgdHVybiBlbXB0eSBzdHJpbmcgaW50byBiXG4gIGZvciAobGV0IGogPSAwOyBqIDw9IGIubGVuZ3RoOyBqKyspIHtcbiAgICBkWzBdW2pdID0gajtcbiAgfVxuXG4gIC8vIGZpbGwgbWF0cml4XG4gIGZvciAobGV0IGogPSAxOyBqIDw9IGIubGVuZ3RoOyBqKyspIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY29zdCA9IDE7XG4gICAgICBpZiAoYVtpIC0gMV0gPT09IGJbaiAtIDFdKSB7XG4gICAgICAgIGNvc3QgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29zdCA9IDE7XG4gICAgICB9XG4gICAgICBkW2ldW2pdID0gTWF0aC5taW4oXG4gICAgICAgIGRbaSAtIDFdW2pdICsgMSwgLy8gZGVsZXRpb25cbiAgICAgICAgZFtpXVtqIC0gMV0gKyAxLCAvLyBpbnNlcnRpb25cbiAgICAgICAgZFtpIC0gMV1baiAtIDFdICsgY29zdCwgLy8gc3Vic3RpdHV0aW9uXG4gICAgICApO1xuICAgICAgLy8gdHJhbnNwb3NpdGlvblxuICAgICAgaWYgKGkgPiAxICYmIGogPiAxICYmIGFbaSAtIDFdID09PSBiW2ogLSAyXSAmJiBhW2kgLSAyXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgZFtpXVtqXSA9IE1hdGgubWluKGRbaV1bal0sIGRbaSAtIDJdW2ogLSAyXSArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkW2EubGVuZ3RoXVtiLmxlbmd0aF07XG59XG5cbi8qKlxuICogRmluZCBjbG9zZSBtYXRjaGVzLCByZXN0cmljdGVkIHRvIHNhbWUgbnVtYmVyIG9mIGVkaXRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjYW5kaWRhdGVzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIHN1Z2dlc3RTaW1pbGFyKHdvcmQsIGNhbmRpZGF0ZXMpIHtcbiAgaWYgKCFjYW5kaWRhdGVzIHx8IGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIC8vIHJlbW92ZSBwb3NzaWJsZSBkdXBsaWNhdGVzXG4gIGNhbmRpZGF0ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoY2FuZGlkYXRlcykpO1xuXG4gIGNvbnN0IHNlYXJjaGluZ09wdGlvbnMgPSB3b3JkLnN0YXJ0c1dpdGgoJy0tJyk7XG4gIGlmIChzZWFyY2hpbmdPcHRpb25zKSB7XG4gICAgd29yZCA9IHdvcmQuc2xpY2UoMik7XG4gICAgY2FuZGlkYXRlcyA9IGNhbmRpZGF0ZXMubWFwKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5zbGljZSgyKSk7XG4gIH1cblxuICBsZXQgc2ltaWxhciA9IFtdO1xuICBsZXQgYmVzdERpc3RhbmNlID0gbWF4RGlzdGFuY2U7XG4gIGNvbnN0IG1pblNpbWlsYXJpdHkgPSAwLjQ7XG4gIGNhbmRpZGF0ZXMuZm9yRWFjaCgoY2FuZGlkYXRlKSA9PiB7XG4gICAgaWYgKGNhbmRpZGF0ZS5sZW5ndGggPD0gMSkgcmV0dXJuOyAvLyBubyBvbmUgY2hhcmFjdGVyIGd1ZXNzZXNcblxuICAgIGNvbnN0IGRpc3RhbmNlID0gZWRpdERpc3RhbmNlKHdvcmQsIGNhbmRpZGF0ZSk7XG4gICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgod29yZC5sZW5ndGgsIGNhbmRpZGF0ZS5sZW5ndGgpO1xuICAgIGNvbnN0IHNpbWlsYXJpdHkgPSAobGVuZ3RoIC0gZGlzdGFuY2UpIC8gbGVuZ3RoO1xuICAgIGlmIChzaW1pbGFyaXR5ID4gbWluU2ltaWxhcml0eSkge1xuICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIC8vIGJldHRlciBlZGl0IGRpc3RhbmNlLCB0aHJvdyBhd2F5IHByZXZpb3VzIHdvcnNlIG1hdGNoZXNcbiAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgIHNpbWlsYXIgPSBbY2FuZGlkYXRlXTtcbiAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPT09IGJlc3REaXN0YW5jZSkge1xuICAgICAgICBzaW1pbGFyLnB1c2goY2FuZGlkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHNpbWlsYXIuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICBzaW1pbGFyID0gc2ltaWxhci5tYXAoKGNhbmRpZGF0ZSkgPT4gYC0tJHtjYW5kaWRhdGV9YCk7XG4gIH1cblxuICBpZiAoc2ltaWxhci5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIGBcXG4oRGlkIHlvdSBtZWFuIG9uZSBvZiAke3NpbWlsYXIuam9pbignLCAnKX0/KWA7XG4gIH1cbiAgaWYgKHNpbWlsYXIubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGBcXG4oRGlkIHlvdSBtZWFuICR7c2ltaWxhclswXX0/KWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5leHBvcnRzLnN1Z2dlc3RTaW1pbGFyID0gc3VnZ2VzdFNpbWlsYXI7XG4iLAogICAgImNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuY29uc3QgY2hpbGRQcm9jZXNzID0gcmVxdWlyZSgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgnbm9kZTpwYXRoJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ25vZGU6ZnMnKTtcbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdub2RlOnByb2Nlc3MnKTtcblxuY29uc3QgeyBBcmd1bWVudCwgaHVtYW5SZWFkYWJsZUFyZ05hbWUgfSA9IHJlcXVpcmUoJy4vYXJndW1lbnQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZGVyRXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcbmNvbnN0IHsgSGVscCB9ID0gcmVxdWlyZSgnLi9oZWxwLmpzJyk7XG5jb25zdCB7IE9wdGlvbiwgRHVhbE9wdGlvbnMgfSA9IHJlcXVpcmUoJy4vb3B0aW9uLmpzJyk7XG5jb25zdCB7IHN1Z2dlc3RTaW1pbGFyIH0gPSByZXF1aXJlKCcuL3N1Z2dlc3RTaW1pbGFyJyk7XG5cbmNsYXNzIENvbW1hbmQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBgQ29tbWFuZGAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEB0eXBlIHtDb21tYW5kW119ICovXG4gICAgdGhpcy5jb21tYW5kcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7T3B0aW9uW119ICovXG4gICAgdGhpcy5vcHRpb25zID0gW107XG4gICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gdHJ1ZTtcbiAgICAvKiogQHR5cGUge0FyZ3VtZW50W119ICovXG4gICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzID0gW107XG4gICAgdGhpcy5fYXJncyA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50czsgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5hcmdzID0gW107IC8vIGNsaSBhcmdzIHdpdGggb3B0aW9ucyByZW1vdmVkXG4gICAgdGhpcy5yYXdBcmdzID0gW107XG4gICAgdGhpcy5wcm9jZXNzZWRBcmdzID0gW107IC8vIGxpa2UgLmFyZ3MgYnV0IGFmdGVyIGN1c3RvbSBwcm9jZXNzaW5nIGFuZCBjb2xsZWN0aW5nIHZhcmlhZGljXG4gICAgdGhpcy5fc2NyaXB0UGF0aCA9IG51bGw7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWUgfHwgJyc7XG4gICAgdGhpcy5fb3B0aW9uVmFsdWVzID0ge307XG4gICAgdGhpcy5fb3B0aW9uVmFsdWVTb3VyY2VzID0ge307IC8vIGRlZmF1bHQsIGVudiwgY2xpIGV0Y1xuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGlvbkhhbmRsZXIgPSBudWxsO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVIYW5kbGVyID0gZmFsc2U7XG4gICAgdGhpcy5fZXhlY3V0YWJsZUZpbGUgPSBudWxsOyAvLyBjdXN0b20gbmFtZSBmb3IgZXhlY3V0YWJsZVxuICAgIHRoaXMuX2V4ZWN1dGFibGVEaXIgPSBudWxsOyAvLyBjdXN0b20gc2VhcmNoIGRpcmVjdG9yeSBmb3Igc3ViY29tbWFuZHNcbiAgICB0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUgPSBudWxsO1xuICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5fYWxpYXNlcyA9IFtdO1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSAnJztcbiAgICB0aGlzLl9zdW1tYXJ5ID0gJyc7XG4gICAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkOyAvLyBsZWdhY3lcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9IGZhbHNlO1xuICAgIHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucyA9IGZhbHNlO1xuICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzID0ge307IC8vIGEgaGFzaCBvZiBhcnJheXNcbiAgICAvKiogQHR5cGUgeyhib29sZWFuIHwgc3RyaW5nKX0gKi9cbiAgICB0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSB0cnVlO1xuXG4gICAgLy8gc2VlIC5jb25maWd1cmVPdXRwdXQoKSBmb3IgZG9jc1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24gPSB7XG4gICAgICB3cml0ZU91dDogKHN0cikgPT4gcHJvY2Vzcy5zdGRvdXQud3JpdGUoc3RyKSxcbiAgICAgIHdyaXRlRXJyOiAoc3RyKSA9PiBwcm9jZXNzLnN0ZGVyci53cml0ZShzdHIpLFxuICAgICAgZ2V0T3V0SGVscFdpZHRoOiAoKSA9PlxuICAgICAgICBwcm9jZXNzLnN0ZG91dC5pc1RUWSA/IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgOiB1bmRlZmluZWQsXG4gICAgICBnZXRFcnJIZWxwV2lkdGg6ICgpID0+XG4gICAgICAgIHByb2Nlc3Muc3RkZXJyLmlzVFRZID8gcHJvY2Vzcy5zdGRlcnIuY29sdW1ucyA6IHVuZGVmaW5lZCxcbiAgICAgIG91dHB1dEVycm9yOiAoc3RyLCB3cml0ZSkgPT4gd3JpdGUoc3RyKSxcbiAgICB9O1xuXG4gICAgdGhpcy5faGlkZGVuID0gZmFsc2U7XG4gICAgLyoqIEB0eXBlIHsoT3B0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCl9ICovXG4gICAgdGhpcy5faGVscE9wdGlvbiA9IHVuZGVmaW5lZDsgLy8gTGF6eSBjcmVhdGVkIG9uIGRlbWFuZC4gTWF5IGJlIG51bGwgaWYgaGVscCBvcHRpb24gaXMgZGlzYWJsZWQuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHVuZGVmaW5lZDsgLy8gdW5kZWNpZGVkIHdoZXRoZXIgdHJ1ZSBvciBmYWxzZSB5ZXQsIG5vdCBpbmhlcml0ZWRcbiAgICAvKiogQHR5cGUge0NvbW1hbmR9ICovXG4gICAgdGhpcy5faGVscENvbW1hbmQgPSB1bmRlZmluZWQ7IC8vIGxhenkgaW5pdGlhbGlzZWQsIGluaGVyaXRlZFxuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0ge307XG4gIH1cblxuICAvKipcbiAgICogQ29weSBzZXR0aW5ncyB0aGF0IGFyZSB1c2VmdWwgdG8gaGF2ZSBpbiBjb21tb24gYWNyb3NzIHJvb3QgY29tbWFuZCBhbmQgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIChVc2VkIGludGVybmFsbHkgd2hlbiBhZGRpbmcgYSBjb21tYW5kIHVzaW5nIGAuY29tbWFuZCgpYCBzbyBzdWJjb21tYW5kcyBpbmhlcml0IHBhcmVudCBzZXR0aW5ncy4pXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gc291cmNlQ29tbWFuZFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGNvcHlJbmhlcml0ZWRTZXR0aW5ncyhzb3VyY2VDb21tYW5kKSB7XG4gICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbiA9IHNvdXJjZUNvbW1hbmQuX291dHB1dENvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IHNvdXJjZUNvbW1hbmQuX2hlbHBPcHRpb247XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBzb3VyY2VDb21tYW5kLl9oZWxwQ29tbWFuZDtcbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IHNvdXJjZUNvbW1hbmQuX2hlbHBDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IHNvdXJjZUNvbW1hbmQuX2V4aXRDYWxsYmFjaztcbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSBzb3VyY2VDb21tYW5kLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXM7XG4gICAgdGhpcy5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlID1cbiAgICAgIHNvdXJjZUNvbW1hbmQuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZTtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9IHNvdXJjZUNvbW1hbmQuX2FsbG93RXhjZXNzQXJndW1lbnRzO1xuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gc291cmNlQ29tbWFuZC5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnM7XG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gc291cmNlQ29tbWFuZC5fc2hvd0hlbHBBZnRlckVycm9yO1xuICAgIHRoaXMuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvciA9IHNvdXJjZUNvbW1hbmQuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtDb21tYW5kW119XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGZvciAobGV0IGNvbW1hbmQgPSB0aGlzOyBjb21tYW5kOyBjb21tYW5kID0gY29tbWFuZC5wYXJlbnQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGNvbW1hbmQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBhIGNvbW1hbmQuXG4gICAqXG4gICAqIFRoZXJlIGFyZSB0d28gc3R5bGVzIG9mIGNvbW1hbmQ6IHBheSBhdHRlbnRpb24gdG8gd2hlcmUgdG8gcHV0IHRoZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQ29tbWFuZCBpbXBsZW1lbnRlZCB1c2luZyBhY3Rpb24gaGFuZGxlciAoZGVzY3JpcHRpb24gaXMgc3VwcGxpZWQgc2VwYXJhdGVseSB0byBgLmNvbW1hbmRgKVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ2Nsb25lIDxzb3VyY2U+IFtkZXN0aW5hdGlvbl0nKVxuICAgKiAgIC5kZXNjcmlwdGlvbignY2xvbmUgYSByZXBvc2l0b3J5IGludG8gYSBuZXdseSBjcmVhdGVkIGRpcmVjdG9yeScpXG4gICAqICAgLmFjdGlvbigoc291cmNlLCBkZXN0aW5hdGlvbikgPT4ge1xuICAgKiAgICAgY29uc29sZS5sb2coJ2Nsb25lIGNvbW1hbmQgY2FsbGVkJyk7XG4gICAqICAgfSk7XG4gICAqXG4gICAqIC8vIENvbW1hbmQgaW1wbGVtZW50ZWQgdXNpbmcgc2VwYXJhdGUgZXhlY3V0YWJsZSBmaWxlIChkZXNjcmlwdGlvbiBpcyBzZWNvbmQgcGFyYW1ldGVyIHRvIGAuY29tbWFuZGApXG4gICAqIHByb2dyYW1cbiAgICogICAuY29tbWFuZCgnc3RhcnQgPHNlcnZpY2U+JywgJ3N0YXJ0IG5hbWVkIHNlcnZpY2UnKVxuICAgKiAgIC5jb21tYW5kKCdzdG9wIFtzZXJ2aWNlXScsICdzdG9wIG5hbWVkIHNlcnZpY2UsIG9yIGFsbCBpZiBubyBuYW1lIHN1cHBsaWVkJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lQW5kQXJncyAtIGNvbW1hbmQgbmFtZSBhbmQgYXJndW1lbnRzLCBhcmdzIGFyZSBgPHJlcXVpcmVkPmAgb3IgYFtvcHRpb25hbF1gIGFuZCBsYXN0IG1heSBhbHNvIGJlIGB2YXJpYWRpYy4uLmBcbiAgICogQHBhcmFtIHsob2JqZWN0IHwgc3RyaW5nKX0gW2FjdGlvbk9wdHNPckV4ZWNEZXNjXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoZm9yIGFjdGlvbiksIG9yIGRlc2NyaXB0aW9uIChmb3IgZXhlY3V0YWJsZSlcbiAgICogQHBhcmFtIHtvYmplY3R9IFtleGVjT3B0c10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBleGVjdXRhYmxlKVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSByZXR1cm5zIG5ldyBjb21tYW5kIGZvciBhY3Rpb24gaGFuZGxlciwgb3IgYHRoaXNgIGZvciBleGVjdXRhYmxlIGNvbW1hbmRcbiAgICovXG5cbiAgY29tbWFuZChuYW1lQW5kQXJncywgYWN0aW9uT3B0c09yRXhlY0Rlc2MsIGV4ZWNPcHRzKSB7XG4gICAgbGV0IGRlc2MgPSBhY3Rpb25PcHRzT3JFeGVjRGVzYztcbiAgICBsZXQgb3B0cyA9IGV4ZWNPcHRzO1xuICAgIGlmICh0eXBlb2YgZGVzYyA9PT0gJ29iamVjdCcgJiYgZGVzYyAhPT0gbnVsbCkge1xuICAgICAgb3B0cyA9IGRlc2M7XG4gICAgICBkZXNjID0gbnVsbDtcbiAgICB9XG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgY29uc3QgWywgbmFtZSwgYXJnc10gPSBuYW1lQW5kQXJncy5tYXRjaCgvKFteIF0rKSAqKC4qKS8pO1xuXG4gICAgY29uc3QgY21kID0gdGhpcy5jcmVhdGVDb21tYW5kKG5hbWUpO1xuICAgIGlmIChkZXNjKSB7XG4gICAgICBjbWQuZGVzY3JpcHRpb24oZGVzYyk7XG4gICAgICBjbWQuX2V4ZWN1dGFibGVIYW5kbGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdHMuaXNEZWZhdWx0KSB0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUgPSBjbWQuX25hbWU7XG4gICAgY21kLl9oaWRkZW4gPSAhIShvcHRzLm5vSGVscCB8fCBvcHRzLmhpZGRlbik7IC8vIG5vSGVscCBpcyBkZXByZWNhdGVkIG9sZCBuYW1lIGZvciBoaWRkZW5cbiAgICBjbWQuX2V4ZWN1dGFibGVGaWxlID0gb3B0cy5leGVjdXRhYmxlRmlsZSB8fCBudWxsOyAvLyBDdXN0b20gbmFtZSBmb3IgZXhlY3V0YWJsZSBmaWxlLCBzZXQgbWlzc2luZyB0byBudWxsIHRvIG1hdGNoIGNvbnN0cnVjdG9yXG4gICAgaWYgKGFyZ3MpIGNtZC5hcmd1bWVudHMoYXJncyk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb21tYW5kKGNtZCk7XG4gICAgY21kLnBhcmVudCA9IHRoaXM7XG4gICAgY21kLmNvcHlJbmhlcml0ZWRTZXR0aW5ncyh0aGlzKTtcblxuICAgIGlmIChkZXNjKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gY21kO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBjb21tYW5kLlxuICAgKlxuICAgKiBTZWUgLmNvbW1hbmQoKSBmb3IgY3JlYXRpbmcgYW4gYXR0YWNoZWQgc3ViY29tbWFuZCwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBjb21tYW5kLiBZb3UgY2FuIG92ZXJyaWRlIGNyZWF0ZUNvbW1hbmQgdG8gY3VzdG9taXNlIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IG5ldyBjb21tYW5kXG4gICAqL1xuXG4gIGNyZWF0ZUNvbW1hbmQobmFtZSkge1xuICAgIHJldHVybiBuZXcgQ29tbWFuZChuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIGN1c3RvbWlzZSB0aGUgaGVscCB3aXRoIGEgc3ViY2xhc3Mgb2YgSGVscCBieSBvdmVycmlkaW5nIGNyZWF0ZUhlbHAsXG4gICAqIG9yIGJ5IG92ZXJyaWRpbmcgSGVscCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZ3VyZUhlbHAoKS5cbiAgICpcbiAgICogQHJldHVybiB7SGVscH1cbiAgICovXG5cbiAgY3JlYXRlSGVscCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgSGVscCgpLCB0aGlzLmNvbmZpZ3VyZUhlbHAoKSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBjdXN0b21pc2UgdGhlIGhlbHAgYnkgb3ZlcnJpZGluZyBIZWxwIHByb3BlcnRpZXMgdXNpbmcgY29uZmlndXJlSGVscCgpLFxuICAgKiBvciB3aXRoIGEgc3ViY2xhc3Mgb2YgSGVscCBieSBvdmVycmlkaW5nIGNyZWF0ZUhlbHAoKS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFtjb25maWd1cmF0aW9uXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHsoQ29tbWFuZCB8IG9iamVjdCl9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZywgb3Igc3RvcmVkIGNvbmZpZ3VyYXRpb25cbiAgICovXG5cbiAgY29uZmlndXJlSGVscChjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uO1xuXG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgc3RkZXJyLiBZb3UgY2FuIGN1c3RvbWlzZSB0aGlzIGZvciBzcGVjaWFsXG4gICAqIGFwcGxpY2F0aW9ucy4gWW91IGNhbiBhbHNvIGN1c3RvbWlzZSB0aGUgZGlzcGxheSBvZiBlcnJvcnMgYnkgb3ZlcnJpZGluZyBvdXRwdXRFcnJvci5cbiAgICpcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBhcmUgYWxsIGZ1bmN0aW9uczpcbiAgICpcbiAgICogICAgIC8vIGZ1bmN0aW9ucyB0byBjaGFuZ2Ugd2hlcmUgYmVpbmcgd3JpdHRlbiwgc3Rkb3V0IGFuZCBzdGRlcnJcbiAgICogICAgIHdyaXRlT3V0KHN0cilcbiAgICogICAgIHdyaXRlRXJyKHN0cilcbiAgICogICAgIC8vIG1hdGNoaW5nIGZ1bmN0aW9ucyB0byBzcGVjaWZ5IHdpZHRoIGZvciB3cmFwcGluZyBoZWxwXG4gICAqICAgICBnZXRPdXRIZWxwV2lkdGgoKVxuICAgKiAgICAgZ2V0RXJySGVscFdpZHRoKClcbiAgICogICAgIC8vIGZ1bmN0aW9ucyBiYXNlZCBvbiB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4gb3V0XG4gICAqICAgICBvdXRwdXRFcnJvcihzdHIsIHdyaXRlKSAvLyB1c2VkIGZvciBkaXNwbGF5aW5nIGVycm9ycywgYW5kIG5vdCB1c2VkIGZvciBkaXNwbGF5aW5nIGhlbHBcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFtjb25maWd1cmF0aW9uXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHsoQ29tbWFuZCB8IG9iamVjdCl9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZywgb3Igc3RvcmVkIGNvbmZpZ3VyYXRpb25cbiAgICovXG5cbiAgY29uZmlndXJlT3V0cHV0KGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbjtcblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSB0aGUgaGVscCBvciBhIGN1c3RvbSBtZXNzYWdlIGFmdGVyIGFuIGVycm9yIG9jY3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHsoYm9vbGVhbnxzdHJpbmcpfSBbZGlzcGxheUhlbHBdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgc2hvd0hlbHBBZnRlckVycm9yKGRpc3BsYXlIZWxwID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2YgZGlzcGxheUhlbHAgIT09ICdzdHJpbmcnKSBkaXNwbGF5SGVscCA9ICEhZGlzcGxheUhlbHA7XG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gZGlzcGxheUhlbHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBzdWdnZXN0aW9uIG9mIHNpbWlsYXIgY29tbWFuZHMgZm9yIHVua25vd24gY29tbWFuZHMsIG9yIG9wdGlvbnMgZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbZGlzcGxheVN1Z2dlc3Rpb25dXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yKGRpc3BsYXlTdWdnZXN0aW9uID0gdHJ1ZSkge1xuICAgIHRoaXMuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvciA9ICEhZGlzcGxheVN1Z2dlc3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcHJlcGFyZWQgc3ViY29tbWFuZC5cbiAgICpcbiAgICogU2VlIC5jb21tYW5kKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIHN1YmNvbW1hbmQgd2hpY2ggaW5oZXJpdHMgc2V0dGluZ3MgZnJvbSBpdHMgcGFyZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZCAtIG5ldyBzdWJjb21tYW5kXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0c10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFkZENvbW1hbmQoY21kLCBvcHRzKSB7XG4gICAgaWYgKCFjbWQuX25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tbWFuZCBwYXNzZWQgdG8gLmFkZENvbW1hbmQoKSBtdXN0IGhhdmUgYSBuYW1lXG4tIHNwZWNpZnkgdGhlIG5hbWUgaW4gQ29tbWFuZCBjb25zdHJ1Y3RvciBvciB1c2luZyAubmFtZSgpYCk7XG4gICAgfVxuXG4gICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgaWYgKG9wdHMuaXNEZWZhdWx0KSB0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUgPSBjbWQuX25hbWU7XG4gICAgaWYgKG9wdHMubm9IZWxwIHx8IG9wdHMuaGlkZGVuKSBjbWQuX2hpZGRlbiA9IHRydWU7IC8vIG1vZGlmeWluZyBwYXNzZWQgY29tbWFuZCBkdWUgdG8gZXhpc3RpbmcgaW1wbGVtZW50YXRpb25cblxuICAgIHRoaXMuX3JlZ2lzdGVyQ29tbWFuZChjbWQpO1xuICAgIGNtZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNtZC5fY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSByb3V0aW5lIHRvIGNyZWF0ZSBhIG5ldyB1bmF0dGFjaGVkIGFyZ3VtZW50LlxuICAgKlxuICAgKiBTZWUgLmFyZ3VtZW50KCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIGFyZ3VtZW50LCB3aGljaCB1c2VzIHRoaXMgcm91dGluZSB0b1xuICAgKiBjcmVhdGUgdGhlIGFyZ3VtZW50LiBZb3UgY2FuIG92ZXJyaWRlIGNyZWF0ZUFyZ3VtZW50IHRvIHJldHVybiBhIGN1c3RvbSBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9IG5ldyBhcmd1bWVudFxuICAgKi9cblxuICBjcmVhdGVBcmd1bWVudChuYW1lLCBkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBuZXcgQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIGNvbW1hbmQuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGlzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHJlcXVpcmVkLCBhbmQgeW91IGNhbiBleHBsaWNpdGx5XG4gICAqIGluZGljYXRlIHRoaXMgd2l0aCA8PiBhcm91bmQgdGhlIG5hbWUuIFB1dCBbXSBhcm91bmQgdGhlIG5hbWUgZm9yIGFuIG9wdGlvbmFsIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLmFyZ3VtZW50KCc8aW5wdXQtZmlsZT4nKTtcbiAgICogcHJvZ3JhbS5hcmd1bWVudCgnW291dHB1dC1maWxlXScpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnwqKX0gW2ZuXSAtIGN1c3RvbSBhcmd1bWVudCBwcm9jZXNzaW5nIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhcmd1bWVudChuYW1lLCBkZXNjcmlwdGlvbiwgZm4sIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IGFyZ3VtZW50ID0gdGhpcy5jcmVhdGVBcmd1bWVudChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXJndW1lbnQuZGVmYXVsdChkZWZhdWx0VmFsdWUpLmFyZ1BhcnNlcihmbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHQoZm4pO1xuICAgIH1cbiAgICB0aGlzLmFkZEFyZ3VtZW50KGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLCBhZGRpbmcgbXVsdGlwbGUgYXQgb25jZSAod2l0aG91dCBkZXNjcmlwdGlvbnMpLlxuICAgKlxuICAgKiBTZWUgYWxzbyAuYXJndW1lbnQoKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5hcmd1bWVudHMoJzxjbWQ+IFtlbnZdJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgYXJndW1lbnRzKG5hbWVzKSB7XG4gICAgbmFtZXNcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgvICsvKVxuICAgICAgLmZvckVhY2goKGRldGFpbCkgPT4ge1xuICAgICAgICB0aGlzLmFyZ3VtZW50KGRldGFpbCk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLCBhZGRpbmcgYSBwcmVwYXJlZCBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtBcmd1bWVudH0gYXJndW1lbnRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRBcmd1bWVudChhcmd1bWVudCkge1xuICAgIGNvbnN0IHByZXZpb3VzQXJndW1lbnQgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuc2xpY2UoLTEpWzBdO1xuICAgIGlmIChwcmV2aW91c0FyZ3VtZW50ICYmIHByZXZpb3VzQXJndW1lbnQudmFyaWFkaWMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG9ubHkgdGhlIGxhc3QgYXJndW1lbnQgY2FuIGJlIHZhcmlhZGljICcke3ByZXZpb3VzQXJndW1lbnQubmFtZSgpfSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgYXJndW1lbnQucmVxdWlyZWQgJiZcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBhcmd1bWVudC5wYXJzZUFyZyA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhIGRlZmF1bHQgdmFsdWUgZm9yIGEgcmVxdWlyZWQgYXJndW1lbnQgaXMgbmV2ZXIgdXNlZDogJyR7YXJndW1lbnQubmFtZSgpfSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLnB1c2goYXJndW1lbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbWlzZSBvciBvdmVycmlkZSBkZWZhdWx0IGhlbHAgY29tbWFuZC4gQnkgZGVmYXVsdCBhIGhlbHAgY29tbWFuZCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGlmIHlvdXIgY29tbWFuZCBoYXMgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoJ2hlbHAgW2NtZF0nKTtcbiAgICogICAgcHJvZ3JhbS5oZWxwQ29tbWFuZCgnaGVscCBbY21kXScsICdzaG93IGhlbHAnKTtcbiAgICogICAgcHJvZ3JhbS5oZWxwQ29tbWFuZChmYWxzZSk7IC8vIHN1cHByZXNzIGRlZmF1bHQgaGVscCBjb21tYW5kXG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQodHJ1ZSk7IC8vIGFkZCBoZWxwIGNvbW1hbmQgZXZlbiBpZiBubyBzdWJjb21tYW5kc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBlbmFibGVPck5hbWVBbmRBcmdzIC0gZW5hYmxlIHdpdGggY3VzdG9tIG5hbWUgYW5kL29yIGFyZ3VtZW50cywgb3IgYm9vbGVhbiB0byBvdmVycmlkZSB3aGV0aGVyIGFkZGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gY3VzdG9tIGRlc2NyaXB0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBoZWxwQ29tbWFuZChlbmFibGVPck5hbWVBbmRBcmdzLCBkZXNjcmlwdGlvbikge1xuICAgIGlmICh0eXBlb2YgZW5hYmxlT3JOYW1lQW5kQXJncyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gZW5hYmxlT3JOYW1lQW5kQXJncztcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGVuYWJsZU9yTmFtZUFuZEFyZ3MgPSBlbmFibGVPck5hbWVBbmRBcmdzID8/ICdoZWxwIFtjb21tYW5kXSc7XG4gICAgY29uc3QgWywgaGVscE5hbWUsIGhlbHBBcmdzXSA9IGVuYWJsZU9yTmFtZUFuZEFyZ3MubWF0Y2goLyhbXiBdKykgKiguKikvKTtcbiAgICBjb25zdCBoZWxwRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/PyAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJztcblxuICAgIGNvbnN0IGhlbHBDb21tYW5kID0gdGhpcy5jcmVhdGVDb21tYW5kKGhlbHBOYW1lKTtcbiAgICBoZWxwQ29tbWFuZC5oZWxwT3B0aW9uKGZhbHNlKTtcbiAgICBpZiAoaGVscEFyZ3MpIGhlbHBDb21tYW5kLmFyZ3VtZW50cyhoZWxwQXJncyk7XG4gICAgaWYgKGhlbHBEZXNjcmlwdGlvbikgaGVscENvbW1hbmQuZGVzY3JpcHRpb24oaGVscERlc2NyaXB0aW9uKTtcblxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB0cnVlO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gaGVscENvbW1hbmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcHJlcGFyZWQgY3VzdG9tIGhlbHAgY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIHsoQ29tbWFuZHxzdHJpbmd8Ym9vbGVhbil9IGhlbHBDb21tYW5kIC0gY3VzdG9tIGhlbHAgY29tbWFuZCwgb3IgZGVwcmVjYXRlZCBlbmFibGVPck5hbWVBbmRBcmdzIGFzIGZvciBgLmhlbHBDb21tYW5kKClgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVwcmVjYXRlZERlc2NyaXB0aW9uXSAtIGRlcHJlY2F0ZWQgY3VzdG9tIGRlc2NyaXB0aW9uIHVzZWQgd2l0aCBjdXN0b20gbmFtZSBvbmx5XG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscENvbW1hbmQoaGVscENvbW1hbmQsIGRlcHJlY2F0ZWREZXNjcmlwdGlvbikge1xuICAgIC8vIElmIG5vdCBwYXNzZWQgYW4gb2JqZWN0LCBjYWxsIHRocm91Z2ggdG8gaGVscENvbW1hbmQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LFxuICAgIC8vIGFzIGFkZEhlbHBDb21tYW5kIHdhcyBvcmlnaW5hbGx5IHVzZWQgbGlrZSBoZWxwQ29tbWFuZCBpcyBub3cuXG4gICAgaWYgKHR5cGVvZiBoZWxwQ29tbWFuZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuaGVscENvbW1hbmQoaGVscENvbW1hbmQsIGRlcHJlY2F0ZWREZXNjcmlwdGlvbik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IGhlbHBDb21tYW5kO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhenkgY3JlYXRlIGhlbHAgY29tbWFuZC5cbiAgICpcbiAgICogQHJldHVybiB7KENvbW1hbmR8bnVsbCl9XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuICBfZ2V0SGVscENvbW1hbmQoKSB7XG4gICAgY29uc3QgaGFzSW1wbGljaXRIZWxwQ29tbWFuZCA9XG4gICAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID8/XG4gICAgICAodGhpcy5jb21tYW5kcy5sZW5ndGggJiZcbiAgICAgICAgIXRoaXMuX2FjdGlvbkhhbmRsZXIgJiZcbiAgICAgICAgIXRoaXMuX2ZpbmRDb21tYW5kKCdoZWxwJykpO1xuXG4gICAgaWYgKGhhc0ltcGxpY2l0SGVscENvbW1hbmQpIHtcbiAgICAgIGlmICh0aGlzLl9oZWxwQ29tbWFuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaGVscENvbW1hbmQodW5kZWZpbmVkLCB1bmRlZmluZWQpOyAvLyB1c2UgZGVmYXVsdCBuYW1lIGFuZCBkZXNjcmlwdGlvblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2hlbHBDb21tYW5kO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgaG9vayBmb3IgbGlmZSBjeWNsZSBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBob29rKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGFsbG93ZWRWYWx1ZXMgPSBbJ3ByZVN1YmNvbW1hbmQnLCAncHJlQWN0aW9uJywgJ3Bvc3RBY3Rpb24nXTtcbiAgICBpZiAoIWFsbG93ZWRWYWx1ZXMuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgZm9yIGV2ZW50IHBhc3NlZCB0byBob29rIDogJyR7ZXZlbnR9Jy5cbkV4cGVjdGluZyBvbmUgb2YgJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0pIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdID0gW2xpc3RlbmVyXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgY2FsbGJhY2sgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBjYWxsaW5nIHByb2Nlc3MuZXhpdC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXSBvcHRpb25hbCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHBhc3NlZCBhIENvbW1hbmRlckVycm9yLCBkZWZhdWx0cyB0byB0aHJvd2luZ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgZXhpdE92ZXJyaWRlKGZuKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBmbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrID0gKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmNvZGUgIT09ICdjb21tYW5kZXIuZXhlY3V0ZVN1YkNvbW1hbmRBc3luYycpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXN5bmMgY2FsbGJhY2sgZnJvbSBzcGF3biBldmVudHMsIG5vdCB1c2VmdWwgdG8gdGhyb3cuXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgcHJvY2Vzcy5leGl0LCBhbmQgX2V4aXRDYWxsYmFjayBpZiBkZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgZXhpdCBjb2RlIGZvciB1c2luZyB3aXRoIHByb2Nlc3MuZXhpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3JcbiAgICogQHJldHVybiBuZXZlclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhpdChleGl0Q29kZSwgY29kZSwgbWVzc2FnZSkge1xuICAgIGlmICh0aGlzLl9leGl0Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayhuZXcgQ29tbWFuZGVyRXJyb3IoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpKTtcbiAgICAgIC8vIEV4cGVjdGluZyB0aGlzIGxpbmUgaXMgbm90IHJlYWNoZWQuXG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgY2FsbGJhY2sgYGZuYCBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAuY29tbWFuZCgnc2VydmUnKVxuICAgKiAgIC5kZXNjcmlwdGlvbignc3RhcnQgc2VydmljZScpXG4gICAqICAgLmFjdGlvbihmdW5jdGlvbigpIHtcbiAgICogICAgICAvLyBkbyB3b3JrIGhlcmVcbiAgICogICB9KTtcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFjdGlvbihmbikge1xuICAgIGNvbnN0IGxpc3RlbmVyID0gKGFyZ3MpID0+IHtcbiAgICAgIC8vIFRoZSAuYWN0aW9uIGNhbGxiYWNrIHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciB3aGljaCBpcyB0aGUgY29tbWFuZCBvciBvcHRpb25zLlxuICAgICAgY29uc3QgZXhwZWN0ZWRBcmdzQ291bnQgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoO1xuICAgICAgY29uc3QgYWN0aW9uQXJncyA9IGFyZ3Muc2xpY2UoMCwgZXhwZWN0ZWRBcmdzQ291bnQpO1xuICAgICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgICBhY3Rpb25BcmdzW2V4cGVjdGVkQXJnc0NvdW50XSA9IHRoaXM7IC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIFwib3B0aW9uc1wiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3Rpb25BcmdzW2V4cGVjdGVkQXJnc0NvdW50XSA9IHRoaXMub3B0cygpO1xuICAgICAgfVxuICAgICAgYWN0aW9uQXJncy5wdXNoKHRoaXMpO1xuXG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYWN0aW9uQXJncyk7XG4gICAgfTtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVyID0gbGlzdGVuZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSByb3V0aW5lIHRvIGNyZWF0ZSBhIG5ldyB1bmF0dGFjaGVkIG9wdGlvbi5cbiAgICpcbiAgICogU2VlIC5vcHRpb24oKSBmb3IgY3JlYXRpbmcgYW4gYXR0YWNoZWQgb3B0aW9uLCB3aGljaCB1c2VzIHRoaXMgcm91dGluZSB0b1xuICAgKiBjcmVhdGUgdGhlIG9wdGlvbi4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVPcHRpb24gdG8gcmV0dXJuIGEgY3VzdG9tIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge09wdGlvbn0gbmV3IG9wdGlvblxuICAgKi9cblxuICBjcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHBhcnNlQXJncyB0byBjYXRjaCAnY29tbWFuZGVyLmludmFsaWRBcmd1bWVudCcuXG4gICAqXG4gICAqIEBwYXJhbSB7KE9wdGlvbiB8IEFyZ3VtZW50KX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0geyp9IHByZXZpb3VzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnZhbGlkQXJndW1lbnRNZXNzYWdlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jYWxsUGFyc2VBcmcodGFyZ2V0LCB2YWx1ZSwgcHJldmlvdXMsIGludmFsaWRBcmd1bWVudE1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRhcmdldC5wYXJzZUFyZyh2YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnY29tbWFuZGVyLmludmFsaWRBcmd1bWVudCcpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2ludmFsaWRBcmd1bWVudE1lc3NhZ2V9ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICAgICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGV4aXRDb2RlOiBlcnIuZXhpdENvZGUsIGNvZGU6IGVyci5jb2RlIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBmb3Igb3B0aW9uIGZsYWcgY29uZmxpY3RzLlxuICAgKiBSZWdpc3RlciBvcHRpb24gaWYgbm8gY29uZmxpY3RzIGZvdW5kLCBvciB0aHJvdyBvbiBjb25mbGljdC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcmVnaXN0ZXJPcHRpb24ob3B0aW9uKSB7XG4gICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPVxuICAgICAgKG9wdGlvbi5zaG9ydCAmJiB0aGlzLl9maW5kT3B0aW9uKG9wdGlvbi5zaG9ydCkpIHx8XG4gICAgICAob3B0aW9uLmxvbmcgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24ubG9uZykpO1xuICAgIGlmIChtYXRjaGluZ09wdGlvbikge1xuICAgICAgY29uc3QgbWF0Y2hpbmdGbGFnID1cbiAgICAgICAgb3B0aW9uLmxvbmcgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24ubG9uZylcbiAgICAgICAgICA/IG9wdGlvbi5sb25nXG4gICAgICAgICAgOiBvcHRpb24uc2hvcnQ7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhZGQgb3B0aW9uICcke29wdGlvbi5mbGFnc30nJHt0aGlzLl9uYW1lICYmIGAgdG8gY29tbWFuZCAnJHt0aGlzLl9uYW1lfSdgfSBkdWUgdG8gY29uZmxpY3RpbmcgZmxhZyAnJHttYXRjaGluZ0ZsYWd9J1xuLSAgYWxyZWFkeSB1c2VkIGJ5IG9wdGlvbiAnJHttYXRjaGluZ09wdGlvbi5mbGFnc30nYCk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgY29tbWFuZCBuYW1lIGFuZCBhbGlhcyBjb25mbGljdHMgd2l0aCBleGlzdGluZyBjb21tYW5kcy5cbiAgICogUmVnaXN0ZXIgY29tbWFuZCBpZiBubyBjb25mbGljdHMgZm91bmQsIG9yIHRocm93IG9uIGNvbmZsaWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNvbW1hbmRcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3JlZ2lzdGVyQ29tbWFuZChjb21tYW5kKSB7XG4gICAgY29uc3Qga25vd25CeSA9IChjbWQpID0+IHtcbiAgICAgIHJldHVybiBbY21kLm5hbWUoKV0uY29uY2F0KGNtZC5hbGlhc2VzKCkpO1xuICAgIH07XG5cbiAgICBjb25zdCBhbHJlYWR5VXNlZCA9IGtub3duQnkoY29tbWFuZCkuZmluZCgobmFtZSkgPT5cbiAgICAgIHRoaXMuX2ZpbmRDb21tYW5kKG5hbWUpLFxuICAgICk7XG4gICAgaWYgKGFscmVhZHlVc2VkKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NtZCA9IGtub3duQnkodGhpcy5fZmluZENvbW1hbmQoYWxyZWFkeVVzZWQpKS5qb2luKCd8Jyk7XG4gICAgICBjb25zdCBuZXdDbWQgPSBrbm93bkJ5KGNvbW1hbmQpLmpvaW4oJ3wnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNhbm5vdCBhZGQgY29tbWFuZCAnJHtuZXdDbWR9JyBhcyBhbHJlYWR5IGhhdmUgY29tbWFuZCAnJHtleGlzdGluZ0NtZH0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRPcHRpb24ob3B0aW9uKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXJPcHRpb24ob3B0aW9uKTtcblxuICAgIGNvbnN0IG9uYW1lID0gb3B0aW9uLm5hbWUoKTtcbiAgICBjb25zdCBuYW1lID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcblxuICAgIC8vIHN0b3JlIGRlZmF1bHQgdmFsdWVcbiAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgLy8gLS1uby1mb28gaXMgc3BlY2lhbCBhbmQgZGVmYXVsdHMgZm9vIHRvIHRydWUsIHVubGVzcyBhIC0tZm9vIG9wdGlvbiBpcyBhbHJlYWR5IGRlZmluZWRcbiAgICAgIGNvbnN0IHBvc2l0aXZlTG9uZ0ZsYWcgPSBvcHRpb24ubG9uZy5yZXBsYWNlKC9eLS1uby0vLCAnLS0nKTtcbiAgICAgIGlmICghdGhpcy5fZmluZE9wdGlvbihwb3NpdGl2ZUxvbmdGbGFnKSkge1xuICAgICAgICB0aGlzLnNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIG9wdGlvbi5kZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb24uZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICdkZWZhdWx0JyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdGlvbi5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UobmFtZSwgb3B0aW9uLmRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHQnKTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGVyIGZvciBjbGkgYW5kIGVudiBzdXBwbGllZCB2YWx1ZXNcbiAgICBjb25zdCBoYW5kbGVPcHRpb25WYWx1ZSA9ICh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsIHZhbHVlU291cmNlKSA9PiB7XG4gICAgICAvLyB2YWwgaXMgbnVsbCBmb3Igb3B0aW9uYWwgb3B0aW9uIHVzZWQgd2l0aG91dCBhbiBvcHRpb25hbC1hcmd1bWVudC5cbiAgICAgIC8vIHZhbCBpcyB1bmRlZmluZWQgZm9yIGJvb2xlYW4gYW5kIG5lZ2F0ZWQgb3B0aW9uLlxuICAgICAgaWYgKHZhbCA9PSBudWxsICYmIG9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWwgPSBvcHRpb24ucHJlc2V0QXJnO1xuICAgICAgfVxuXG4gICAgICAvLyBjdXN0b20gcHJvY2Vzc2luZ1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmdldE9wdGlvblZhbHVlKG5hbWUpO1xuICAgICAgaWYgKHZhbCAhPT0gbnVsbCAmJiBvcHRpb24ucGFyc2VBcmcpIHtcbiAgICAgICAgdmFsID0gdGhpcy5fY2FsbFBhcnNlQXJnKG9wdGlvbiwgdmFsLCBvbGRWYWx1ZSwgaW52YWxpZFZhbHVlTWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbCAhPT0gbnVsbCAmJiBvcHRpb24udmFyaWFkaWMpIHtcbiAgICAgICAgdmFsID0gb3B0aW9uLl9jb25jYXRWYWx1ZSh2YWwsIG9sZFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmlsbC1pbiBhcHByb3ByaWF0ZSBtaXNzaW5nIHZhbHVlcy4gTG9uZyB3aW5kZWQgYnV0IGVhc3kgdG8gZm9sbG93LlxuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmlzQm9vbGVhbigpIHx8IG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gJyc7IC8vIG5vdCBub3JtYWwsIHBhcnNlQXJnIG1pZ2h0IGhhdmUgZmFpbGVkIG9yIGJlIGEgbW9jayBmdW5jdGlvbiBmb3IgdGVzdGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShuYW1lLCB2YWwsIHZhbHVlU291cmNlKTtcbiAgICB9O1xuXG4gICAgdGhpcy5vbignb3B0aW9uOicgKyBvbmFtZSwgKHZhbCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZFZhbHVlTWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIGFyZ3VtZW50ICcke3ZhbH0nIGlzIGludmFsaWQuYDtcbiAgICAgIGhhbmRsZU9wdGlvblZhbHVlKHZhbCwgaW52YWxpZFZhbHVlTWVzc2FnZSwgJ2NsaScpO1xuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbi5lbnZWYXIpIHtcbiAgICAgIHRoaXMub24oJ29wdGlvbkVudjonICsgb25hbWUsICh2YWwpID0+IHtcbiAgICAgICAgY29uc3QgaW52YWxpZFZhbHVlTWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIHZhbHVlICcke3ZhbH0nIGZyb20gZW52ICcke29wdGlvbi5lbnZWYXJ9JyBpcyBpbnZhbGlkLmA7XG4gICAgICAgIGhhbmRsZU9wdGlvblZhbHVlKHZhbCwgaW52YWxpZFZhbHVlTWVzc2FnZSwgJ2VudicpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJ5IC5vcHRpb24oKSBhbmQgLnJlcXVpcmVkT3B0aW9uKClcbiAgICpcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb3B0aW9uRXgoY29uZmlnLCBmbGFncywgZGVzY3JpcHRpb24sIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnb2JqZWN0JyAmJiBmbGFncyBpbnN0YW5jZW9mIE9wdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVG8gYWRkIGFuIE9wdGlvbiBvYmplY3QgdXNlIGFkZE9wdGlvbigpIGluc3RlYWQgb2Ygb3B0aW9uKCkgb3IgcmVxdWlyZWRPcHRpb24oKScsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLmNyZWF0ZU9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuICAgIG9wdGlvbi5tYWtlT3B0aW9uTWFuZGF0b3J5KCEhY29uZmlnLm1hbmRhdG9yeSk7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSBpZiAoZm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIGRlcHJlY2F0ZWRcbiAgICAgIGNvbnN0IHJlZ2V4ID0gZm47XG4gICAgICBmbiA9ICh2YWwsIGRlZikgPT4ge1xuICAgICAgICBjb25zdCBtID0gcmVnZXguZXhlYyh2YWwpO1xuICAgICAgICByZXR1cm4gbSA/IG1bMF0gOiBkZWY7XG4gICAgICB9O1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb24uZGVmYXVsdChmbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkT3B0aW9uKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIG9wdGlvbiB3aXRoIGBmbGFnc2AsIGBkZXNjcmlwdGlvbmAsIGFuZCBvcHRpb25hbCBhcmd1bWVudCBwYXJzaW5nIGZ1bmN0aW9uIG9yIGBkZWZhdWx0VmFsdWVgIG9yIGJvdGguXG4gICAqXG4gICAqIFRoZSBgZmxhZ3NgIHN0cmluZyBjb250YWlucyB0aGUgc2hvcnQgYW5kL29yIGxvbmcgZmxhZ3MsIHNlcGFyYXRlZCBieSBjb21tYSwgYSBwaXBlIG9yIHNwYWNlLiBBIHJlcXVpcmVkXG4gICAqIG9wdGlvbi1hcmd1bWVudCBpcyBpbmRpY2F0ZWQgYnkgYDw+YCBhbmQgYW4gb3B0aW9uYWwgb3B0aW9uLWFyZ3VtZW50IGJ5IGBbXWAuXG4gICAqXG4gICAqIFNlZSB0aGUgUkVBRE1FIGZvciBtb3JlIGRldGFpbHMsIGFuZCBzZWUgYWxzbyBhZGRPcHRpb24oKSBhbmQgcmVxdWlyZWRPcHRpb24oKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgICAgLm9wdGlvbignLXAsIC0tcGVwcGVyJywgJ2FkZCBwZXBwZXInKVxuICAgKiAgICAgLm9wdGlvbignLXAsIC0tcGl6emEtdHlwZSA8VFlQRT4nLCAndHlwZSBvZiBwaXp6YScpIC8vIHJlcXVpcmVkIG9wdGlvbi1hcmd1bWVudFxuICAgKiAgICAgLm9wdGlvbignLWMsIC0tY2hlZXNlIFtDSEVFU0VdJywgJ2FkZCBleHRyYSBjaGVlc2UnLCAnbW96emFyZWxsYScpIC8vIG9wdGlvbmFsIG9wdGlvbi1hcmd1bWVudCB3aXRoIGRlZmF1bHRcbiAgICogICAgIC5vcHRpb24oJy10LCAtLXRpcCA8VkFMVUU+JywgJ2FkZCB0aXAgdG8gcHVyY2hhc2UgY29zdCcsIHBhcnNlRmxvYXQpIC8vIGN1c3RvbSBwYXJzZSBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtwYXJzZUFyZ10gLSBjdXN0b20gb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gb3IgZGVmYXVsdCB2YWx1ZVxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBvcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkV4KHt9LCBmbGFncywgZGVzY3JpcHRpb24sIHBhcnNlQXJnLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHJlcXVpcmVkIG9wdGlvbiB3aGljaCBtdXN0IGhhdmUgYSB2YWx1ZSBhZnRlciBwYXJzaW5nLiBUaGlzIHVzdWFsbHkgbWVhbnNcbiAgICogdGhlIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAoT3RoZXJ3aXNlIHRoZSBzYW1lIGFzIC5vcHRpb24oKS4pXG4gICAqXG4gICAqIFRoZSBgZmxhZ3NgIHN0cmluZyBjb250YWlucyB0aGUgc2hvcnQgYW5kL29yIGxvbmcgZmxhZ3MsIHNlcGFyYXRlZCBieSBjb21tYSwgYSBwaXBlIG9yIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtwYXJzZUFyZ10gLSBjdXN0b20gb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gb3IgZGVmYXVsdCB2YWx1ZVxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICByZXF1aXJlZE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24sIHBhcnNlQXJnLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRXgoXG4gICAgICB7IG1hbmRhdG9yeTogdHJ1ZSB9LFxuICAgICAgZmxhZ3MsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHBhcnNlQXJnLFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWx0ZXIgcGFyc2luZyBvZiBzaG9ydCBmbGFncyB3aXRoIG9wdGlvbmFsIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gZm9yIGAub3B0aW9uKCctZiwtLWZsYWcgW3ZhbHVlXScpOlxuICAgKiBwcm9ncmFtLmNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSh0cnVlKTsgIC8vIGAtZjgwYCBpcyB0cmVhdGVkIGxpa2UgYC0tZmxhZz04MGAsIHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyXG4gICAqIHByb2dyYW0uY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlKGZhbHNlKSAvLyBgLWZiYCBpcyB0cmVhdGVkIGxpa2UgYC1mIC1iYFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb21iaW5lXSAtIGlmIGB0cnVlYCBvciBvbWl0dGVkLCBhbiBvcHRpb25hbCB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGRpcmVjdGx5IGFmdGVyIHRoZSBmbGFnLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZShjb21iaW5lID0gdHJ1ZSkge1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9ICEhY29tYmluZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB1bmtub3duIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dVbmtub3duXSAtIGlmIGB0cnVlYCBvciBvbWl0dGVkLCBubyBlcnJvciB3aWxsIGJlIHRocm93biBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFsbG93VW5rbm93bk9wdGlvbihhbGxvd1Vua25vd24gPSB0cnVlKSB7XG4gICAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gISFhbGxvd1Vua25vd247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgZXhjZXNzIGNvbW1hbmQtYXJndW1lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFBhc3MgZmFsc2UgdG8gbWFrZSBleGNlc3MgYXJndW1lbnRzIGFuIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd0V4Y2Vzc10gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yIGV4Y2VzcyBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWxsb3dFeGNlc3NBcmd1bWVudHMoYWxsb3dFeGNlc3MgPSB0cnVlKSB7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSAhIWFsbG93RXhjZXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwb3NpdGlvbmFsIG9wdGlvbnMuIFBvc2l0aW9uYWwgbWVhbnMgZ2xvYmFsIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBiZWZvcmUgc3ViY29tbWFuZHMgd2hpY2ggbGV0c1xuICAgKiBzdWJjb21tYW5kcyByZXVzZSB0aGUgc2FtZSBvcHRpb24gbmFtZXMsIGFuZCBhbHNvIGVuYWJsZXMgc3ViY29tbWFuZHMgdG8gdHVybiBvbiBwYXNzVGhyb3VnaE9wdGlvbnMuXG4gICAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBub24tcG9zaXRpb25hbCBhbmQgZ2xvYmFsIG9wdGlvbnMgbWF5IGFwcGVhciBhbnl3aGVyZSBvbiB0aGUgY29tbWFuZCBsaW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3NpdGlvbmFsXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBvc2l0aW9uYWxPcHRpb25zKHBvc2l0aW9uYWwgPSB0cnVlKSB7XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSAhIXBvc2l0aW9uYWw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGFzcyB0aHJvdWdoIG9wdGlvbnMgdGhhdCBjb21lIGFmdGVyIGNvbW1hbmQtYXJndW1lbnRzIHJhdGhlciB0aGFuIHRyZWF0IHRoZW0gYXMgY29tbWFuZC1vcHRpb25zLFxuICAgKiBzbyBhY3R1YWwgY29tbWFuZC1vcHRpb25zIGNvbWUgYmVmb3JlIGNvbW1hbmQtYXJndW1lbnRzLiBUdXJuaW5nIHRoaXMgb24gZm9yIGEgc3ViY29tbWFuZCByZXF1aXJlc1xuICAgKiBwb3NpdGlvbmFsIG9wdGlvbnMgdG8gaGF2ZSBiZWVuIGVuYWJsZWQgb24gdGhlIHByb2dyYW0gKHBhcmVudCBjb21tYW5kcykuXG4gICAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBub24tcG9zaXRpb25hbCBhbmQgb3B0aW9ucyBtYXkgYXBwZWFyIGJlZm9yZSBvciBhZnRlciBjb21tYW5kLWFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcGFzc1Rocm91Z2hdIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgcGFzc1Rocm91Z2hPcHRpb25zKHBhc3NUaHJvdWdoID0gdHJ1ZSkge1xuICAgIHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucyA9ICEhcGFzc1Rocm91Z2g7XG4gICAgdGhpcy5fY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja0ZvckJyb2tlblBhc3NUaHJvdWdoKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucGFyZW50ICYmXG4gICAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgJiZcbiAgICAgICF0aGlzLnBhcmVudC5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHBhc3NUaHJvdWdoT3B0aW9ucyBjYW5ub3QgYmUgdXNlZCBmb3IgJyR7dGhpcy5fbmFtZX0nIHdpdGhvdXQgdHVybmluZyBvbiBlbmFibGVQb3NpdGlvbmFsT3B0aW9ucyBmb3IgcGFyZW50IGNvbW1hbmQocylgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBzdG9yZSBvcHRpb24gdmFsdWVzIGFzIHByb3BlcnRpZXMgb24gY29tbWFuZCBvYmplY3QsXG4gICAqIG9yIHN0b3JlIHNlcGFyYXRlbHkgKHNwZWNpZnkgZmFsc2UpLiBJbiBib3RoIGNhc2VzIHRoZSBvcHRpb24gdmFsdWVzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyAub3B0cygpLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdG9yZUFzUHJvcGVydGllcz10cnVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKHN0b3JlQXNQcm9wZXJ0aWVzID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGwgLnN0b3JlT3B0aW9uc0FzUHJvcGVydGllcygpIGJlZm9yZSBhZGRpbmcgb3B0aW9ucycpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fb3B0aW9uVmFsdWVzKS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2NhbGwgLnN0b3JlT3B0aW9uc0FzUHJvcGVydGllcygpIGJlZm9yZSBzZXR0aW5nIG9wdGlvbiB2YWx1ZXMnLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gISFzdG9yZUFzUHJvcGVydGllcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBvcHRpb24gdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7b2JqZWN0fSB2YWx1ZVxuICAgKi9cblxuICBnZXRPcHRpb25WYWx1ZShrZXkpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm4gdGhpc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc2V0T3B0aW9uVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShrZXksIHZhbHVlLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIG9wdGlvbiB2YWx1ZSBhbmQgd2hlcmUgdGhlIHZhbHVlIGNhbWUgZnJvbS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIGV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdC9jb25maWcvZW52L2NsaS9pbXBsaWVkXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBzZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2Uoa2V5LCB2YWx1ZSwgc291cmNlKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29wdGlvblZhbHVlc1trZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuX29wdGlvblZhbHVlU291cmNlc1trZXldID0gc291cmNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2Ugb2Ygb3B0aW9uIHZhbHVlLlxuICAgKiBFeHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQgfCBjb25maWcgfCBlbnYgfCBjbGkgfCBpbXBsaWVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBnZXRPcHRpb25WYWx1ZVNvdXJjZShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVTb3VyY2VzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBvZiBvcHRpb24gdmFsdWUuIFNlZSBhbHNvIC5vcHRzV2l0aEdsb2JhbHMoKS5cbiAgICogRXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0IHwgY29uZmlnIHwgZW52IHwgY2xpIHwgaW1wbGllZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWVTb3VyY2VXaXRoR2xvYmFscyhrZXkpIHtcbiAgICAvLyBnbG9iYWwgb3ZlcndyaXRlcyBsb2NhbCwgbGlrZSBvcHRzV2l0aEdsb2JhbHNcbiAgICBsZXQgc291cmNlO1xuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKS5mb3JFYWNoKChjbWQpID0+IHtcbiAgICAgIGlmIChjbWQuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNvdXJjZSA9IGNtZC5nZXRPcHRpb25WYWx1ZVNvdXJjZShrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXIgYXJndW1lbnRzIGZyb20gaW1wbGllZCBvciBleHBsaWNpdCBhcmd1bWVudHMuXG4gICAqIFNpZGUtZWZmZWN0czogc2V0IF9zY3JpcHRQYXRoIGlmIGFyZ3MgaW5jbHVkZWQgc2NyaXB0LiBVc2VkIGZvciBkZWZhdWx0IHByb2dyYW0gbmFtZSwgYW5kIHN1YmNvbW1hbmQgc2VhcmNoZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgaWYgKGFyZ3YgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShhcmd2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaXJzdCBwYXJhbWV0ZXIgdG8gcGFyc2UgbXVzdCBiZSBhcnJheSBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgcGFyc2VPcHRpb25zID0gcGFyc2VPcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gYXV0by1kZXRlY3QgYXJndW1lbnQgY29udmVudGlvbnMgaWYgbm90aGluZyBzdXBwbGllZFxuICAgIGlmIChhcmd2ID09PSB1bmRlZmluZWQgJiYgcGFyc2VPcHRpb25zLmZyb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudmVyc2lvbnM/LmVsZWN0cm9uKSB7XG4gICAgICAgIHBhcnNlT3B0aW9ucy5mcm9tID0gJ2VsZWN0cm9uJztcbiAgICAgIH1cbiAgICAgIC8vIGNoZWNrIG5vZGUgc3BlY2lmaWMgb3B0aW9ucyBmb3Igc2NlbmFyaW9zIHdoZXJlIHVzZXIgQ0xJIGFyZ3MgZm9sbG93IGV4ZWN1dGFibGUgd2l0aG91dCBzY3JpcHRuYW1lXG4gICAgICBjb25zdCBleGVjQXJndiA9IHByb2Nlc3MuZXhlY0FyZ3YgPz8gW107XG4gICAgICBpZiAoXG4gICAgICAgIGV4ZWNBcmd2LmluY2x1ZGVzKCctZScpIHx8XG4gICAgICAgIGV4ZWNBcmd2LmluY2x1ZGVzKCctLWV2YWwnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLXAnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLS1wcmludCcpXG4gICAgICApIHtcbiAgICAgICAgcGFyc2VPcHRpb25zLmZyb20gPSAnZXZhbCc7IC8vIGludGVybmFsIHVzYWdlLCBub3QgZG9jdW1lbnRlZFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlZmF1bHQgdG8gdXNpbmcgcHJvY2Vzcy5hcmd2XG4gICAgaWYgKGFyZ3YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJndiA9IHByb2Nlc3MuYXJndjtcbiAgICB9XG4gICAgdGhpcy5yYXdBcmdzID0gYXJndi5zbGljZSgpO1xuXG4gICAgLy8gZXh0cmFjdCB0aGUgdXNlciBhcmdzIGFuZCBzY3JpcHRQYXRoXG4gICAgbGV0IHVzZXJBcmdzO1xuICAgIHN3aXRjaCAocGFyc2VPcHRpb25zLmZyb20pIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgIHRoaXMuX3NjcmlwdFBhdGggPSBhcmd2WzFdO1xuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZWxlY3Ryb24nOlxuICAgICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGRlZmF1bHRBcHAgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgICBpZiAocHJvY2Vzcy5kZWZhdWx0QXBwKSB7XG4gICAgICAgICAgdGhpcy5fc2NyaXB0UGF0aCA9IGFyZ3ZbMV07XG4gICAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXZhbCc6XG4gICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHVuZXhwZWN0ZWQgcGFyc2Ugb3B0aW9uIHsgZnJvbTogJyR7cGFyc2VPcHRpb25zLmZyb219JyB9YCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGRlZmF1bHQgbmFtZSBmb3IgcHJvZ3JhbSBmcm9tIGFyZ3VtZW50cy5cbiAgICBpZiAoIXRoaXMuX25hbWUgJiYgdGhpcy5fc2NyaXB0UGF0aClcbiAgICAgIHRoaXMubmFtZUZyb21GaWxlbmFtZSh0aGlzLl9zY3JpcHRQYXRoKTtcbiAgICB0aGlzLl9uYW1lID0gdGhpcy5fbmFtZSB8fCAncHJvZ3JhbSc7XG5cbiAgICByZXR1cm4gdXNlckFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYGFyZ3ZgLCBzZXR0aW5nIG9wdGlvbnMgYW5kIGludm9raW5nIGNvbW1hbmRzIHdoZW4gZGVmaW5lZC5cbiAgICpcbiAgICogVXNlIHBhcnNlQXN5bmMgaW5zdGVhZCBvZiBwYXJzZSBpZiBhbnkgb2YgeW91ciBhY3Rpb24gaGFuZGxlcnMgYXJlIGFzeW5jLlxuICAgKlxuICAgKiBDYWxsIHdpdGggbm8gcGFyYW1ldGVycyB0byBwYXJzZSBgcHJvY2Vzcy5hcmd2YC4gRGV0ZWN0cyBFbGVjdHJvbiBhbmQgc3BlY2lhbCBub2RlIG9wdGlvbnMgbGlrZSBgbm9kZSAtLWV2YWxgLiBFYXN5IG1vZGUhXG4gICAqXG4gICAqIE9yIGNhbGwgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHBhcnNlLCBhbmQgb3B0aW9uYWxseSB3aGVyZSB0aGUgdXNlciBhcmd1bWVudHMgc3RhcnQgYnkgc3BlY2lmeWluZyB3aGVyZSB0aGUgYXJndW1lbnRzIGFyZSBgZnJvbWA6XG4gICAqIC0gYCdub2RlJ2A6IGRlZmF1bHQsIGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCBpcyB0aGUgc2NyaXB0IGJlaW5nIHJ1biwgd2l0aCB1c2VyIGFyZ3VtZW50cyBhZnRlciB0aGF0XG4gICAqIC0gYCdlbGVjdHJvbidgOiBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlbGVjdHJvbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZFxuICAgKiAtIGAndXNlcidgOiBqdXN0IHVzZXIgYXJndW1lbnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0ucGFyc2UoKTsgLy8gcGFyc2UgcHJvY2Vzcy5hcmd2IGFuZCBhdXRvLWRldGVjdCBlbGVjdHJvbiBhbmQgc3BlY2lhbCBub2RlIGZsYWdzXG4gICAqIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTsgLy8gYXNzdW1lIGFyZ3ZbMF0gaXMgYXBwIGFuZCBhcmd2WzFdIGlzIHNjcmlwdFxuICAgKiBwcm9ncmFtLnBhcnNlKG15LWFyZ3MsIHsgZnJvbTogJ3VzZXInIH0pOyAvLyBqdXN0IHVzZXIgc3VwcGxpZWQgYXJndW1lbnRzLCBub3RoaW5nIHNwZWNpYWwgYWJvdXQgYXJndlswXVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJndl0gLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gcHJvY2Vzcy5hcmd2XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyc2VPcHRpb25zXSAtIG9wdGlvbmFsbHkgc3BlY2lmeSBzdHlsZSBvZiBvcHRpb25zIHdpdGggZnJvbTogbm9kZS91c2VyL2VsZWN0cm9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyc2VPcHRpb25zLmZyb21dIC0gd2hlcmUgdGhlIGFyZ3MgYXJlIGZyb206ICdub2RlJywgJ3VzZXInLCAnZWxlY3Ryb24nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBwYXJzZShhcmd2LCBwYXJzZU9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VyQXJncyA9IHRoaXMuX3ByZXBhcmVVc2VyQXJncyhhcmd2LCBwYXJzZU9wdGlvbnMpO1xuICAgIHRoaXMuX3BhcnNlQ29tbWFuZChbXSwgdXNlckFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYGFyZ3ZgLCBzZXR0aW5nIG9wdGlvbnMgYW5kIGludm9raW5nIGNvbW1hbmRzIHdoZW4gZGVmaW5lZC5cbiAgICpcbiAgICogQ2FsbCB3aXRoIG5vIHBhcmFtZXRlcnMgdG8gcGFyc2UgYHByb2Nlc3MuYXJndmAuIERldGVjdHMgRWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBvcHRpb25zIGxpa2UgYG5vZGUgLS1ldmFsYC4gRWFzeSBtb2RlIVxuICAgKlxuICAgKiBPciBjYWxsIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBwYXJzZSwgYW5kIG9wdGlvbmFsbHkgd2hlcmUgdGhlIHVzZXIgYXJndW1lbnRzIHN0YXJ0IGJ5IHNwZWNpZnlpbmcgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgYGZyb21gOlxuICAgKiAtIGAnbm9kZSdgOiBkZWZhdWx0LCBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgaXMgdGhlIHNjcmlwdCBiZWluZyBydW4sIHdpdGggdXNlciBhcmd1bWVudHMgYWZ0ZXIgdGhhdFxuICAgKiAtIGAnZWxlY3Ryb24nYDogYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZWxlY3Ryb24gYXBwbGljYXRpb24gaXMgcGFja2FnZWRcbiAgICogLSBgJ3VzZXInYDoganVzdCB1c2VyIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMoKTsgLy8gcGFyc2UgcHJvY2Vzcy5hcmd2IGFuZCBhdXRvLWRldGVjdCBlbGVjdHJvbiBhbmQgc3BlY2lhbCBub2RlIGZsYWdzXG4gICAqIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYyhwcm9jZXNzLmFyZ3YpOyAvLyBhc3N1bWUgYXJndlswXSBpcyBhcHAgYW5kIGFyZ3ZbMV0gaXMgc2NyaXB0XG4gICAqIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYyhteS1hcmdzLCB7IGZyb206ICd1c2VyJyB9KTsgLy8ganVzdCB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50cywgbm90aGluZyBzcGVjaWFsIGFib3V0IGFyZ3ZbMF1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3ZdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyc2VPcHRpb25zXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyc2VPcHRpb25zLmZyb20gLSB3aGVyZSB0aGUgYXJncyBhcmUgZnJvbTogJ25vZGUnLCAndXNlcicsICdlbGVjdHJvbidcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG5cbiAgYXN5bmMgcGFyc2VBc3luYyhhcmd2LCBwYXJzZU9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VyQXJncyA9IHRoaXMuX3ByZXBhcmVVc2VyQXJncyhhcmd2LCBwYXJzZU9wdGlvbnMpO1xuICAgIGF3YWl0IHRoaXMuX3BhcnNlQ29tbWFuZChbXSwgdXNlckFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHN1Yi1jb21tYW5kIGV4ZWN1dGFibGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9leGVjdXRlU3ViQ29tbWFuZChzdWJjb21tYW5kLCBhcmdzKSB7XG4gICAgYXJncyA9IGFyZ3Muc2xpY2UoKTtcbiAgICBsZXQgbGF1bmNoV2l0aE5vZGUgPSBmYWxzZTsgLy8gVXNlIG5vZGUgZm9yIHNvdXJjZSB0YXJnZXRzIHNvIGRvIG5vdCBuZWVkIHRvIGdldCBwZXJtaXNzaW9ucyBjb3JyZWN0LCBhbmQgb24gV2luZG93cy5cbiAgICBjb25zdCBzb3VyY2VFeHQgPSBbJy5qcycsICcudHMnLCAnLnRzeCcsICcubWpzJywgJy5janMnXTtcblxuICAgIGZ1bmN0aW9uIGZpbmRGaWxlKGJhc2VEaXIsIGJhc2VOYW1lKSB7XG4gICAgICAvLyBMb29rIGZvciBzcGVjaWZpZWQgZmlsZVxuICAgICAgY29uc3QgbG9jYWxCaW4gPSBwYXRoLnJlc29sdmUoYmFzZURpciwgYmFzZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxCaW4pKSByZXR1cm4gbG9jYWxCaW47XG5cbiAgICAgIC8vIFN0b3AgbG9va2luZyBpZiBjYW5kaWRhdGUgYWxyZWFkeSBoYXMgYW4gZXhwZWN0ZWQgZXh0ZW5zaW9uLlxuICAgICAgaWYgKHNvdXJjZUV4dC5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoYmFzZU5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgLy8gVHJ5IGFsbCB0aGUgZXh0ZW5zaW9ucy5cbiAgICAgIGNvbnN0IGZvdW5kRXh0ID0gc291cmNlRXh0LmZpbmQoKGV4dCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhgJHtsb2NhbEJpbn0ke2V4dH1gKSxcbiAgICAgICk7XG4gICAgICBpZiAoZm91bmRFeHQpIHJldHVybiBgJHtsb2NhbEJpbn0ke2ZvdW5kRXh0fWA7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gTm90IGNoZWNraW5nIGZvciBoZWxwIGZpcnN0LiBVbmxpa2VseSB0byBoYXZlIG1hbmRhdG9yeSBhbmQgZXhlY3V0YWJsZSwgYW5kIGNhbid0IHJvYnVzdGx5IHRlc3QgZm9yIGhlbHAgZmxhZ3MgaW4gZXh0ZXJuYWwgY29tbWFuZC5cbiAgICB0aGlzLl9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCk7XG4gICAgdGhpcy5fY2hlY2tGb3JDb25mbGljdGluZ09wdGlvbnMoKTtcblxuICAgIC8vIGV4ZWN1dGFibGVGaWxlIGFuZCBleGVjdXRhYmxlRGlyIG1pZ2h0IGJlIGZ1bGwgcGF0aCwgb3IganVzdCBhIG5hbWVcbiAgICBsZXQgZXhlY3V0YWJsZUZpbGUgPVxuICAgICAgc3ViY29tbWFuZC5fZXhlY3V0YWJsZUZpbGUgfHwgYCR7dGhpcy5fbmFtZX0tJHtzdWJjb21tYW5kLl9uYW1lfWA7XG4gICAgbGV0IGV4ZWN1dGFibGVEaXIgPSB0aGlzLl9leGVjdXRhYmxlRGlyIHx8ICcnO1xuICAgIGlmICh0aGlzLl9zY3JpcHRQYXRoKSB7XG4gICAgICBsZXQgcmVzb2x2ZWRTY3JpcHRQYXRoOyAvLyByZXNvbHZlIHBvc3NpYmxlIHN5bWxpbmsgZm9yIGluc3RhbGxlZCBucG0gYmluYXJ5XG4gICAgICB0cnkge1xuICAgICAgICByZXNvbHZlZFNjcmlwdFBhdGggPSBmcy5yZWFscGF0aFN5bmModGhpcy5fc2NyaXB0UGF0aCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVzb2x2ZWRTY3JpcHRQYXRoID0gdGhpcy5fc2NyaXB0UGF0aDtcbiAgICAgIH1cbiAgICAgIGV4ZWN1dGFibGVEaXIgPSBwYXRoLnJlc29sdmUoXG4gICAgICAgIHBhdGguZGlybmFtZShyZXNvbHZlZFNjcmlwdFBhdGgpLFxuICAgICAgICBleGVjdXRhYmxlRGlyLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb29rIGZvciBhIGxvY2FsIGZpbGUgaW4gcHJlZmVyZW5jZSB0byBhIGNvbW1hbmQgaW4gUEFUSC5cbiAgICBpZiAoZXhlY3V0YWJsZURpcikge1xuICAgICAgbGV0IGxvY2FsRmlsZSA9IGZpbmRGaWxlKGV4ZWN1dGFibGVEaXIsIGV4ZWN1dGFibGVGaWxlKTtcblxuICAgICAgLy8gTGVnYWN5IHNlYXJjaCB1c2luZyBwcmVmaXggb2Ygc2NyaXB0IG5hbWUgaW5zdGVhZCBvZiBjb21tYW5kIG5hbWVcbiAgICAgIGlmICghbG9jYWxGaWxlICYmICFzdWJjb21tYW5kLl9leGVjdXRhYmxlRmlsZSAmJiB0aGlzLl9zY3JpcHRQYXRoKSB7XG4gICAgICAgIGNvbnN0IGxlZ2FjeU5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICAgIHRoaXMuX3NjcmlwdFBhdGgsXG4gICAgICAgICAgcGF0aC5leHRuYW1lKHRoaXMuX3NjcmlwdFBhdGgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAobGVnYWN5TmFtZSAhPT0gdGhpcy5fbmFtZSkge1xuICAgICAgICAgIGxvY2FsRmlsZSA9IGZpbmRGaWxlKFxuICAgICAgICAgICAgZXhlY3V0YWJsZURpcixcbiAgICAgICAgICAgIGAke2xlZ2FjeU5hbWV9LSR7c3ViY29tbWFuZC5fbmFtZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV4ZWN1dGFibGVGaWxlID0gbG9jYWxGaWxlIHx8IGV4ZWN1dGFibGVGaWxlO1xuICAgIH1cblxuICAgIGxhdW5jaFdpdGhOb2RlID0gc291cmNlRXh0LmluY2x1ZGVzKHBhdGguZXh0bmFtZShleGVjdXRhYmxlRmlsZSkpO1xuXG4gICAgbGV0IHByb2M7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgICAgIGlmIChsYXVuY2hXaXRoTm9kZSkge1xuICAgICAgICBhcmdzLnVuc2hpZnQoZXhlY3V0YWJsZUZpbGUpO1xuICAgICAgICAvLyBhZGQgZXhlY3V0YWJsZSBhcmd1bWVudHMgdG8gc3Bhd25cbiAgICAgICAgYXJncyA9IGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KHByb2Nlc3MuZXhlY0FyZ3YpLmNvbmNhdChhcmdzKTtcblxuICAgICAgICBwcm9jID0gY2hpbGRQcm9jZXNzLnNwYXduKHByb2Nlc3MuYXJndlswXSwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihleGVjdXRhYmxlRmlsZSwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzLnVuc2hpZnQoZXhlY3V0YWJsZUZpbGUpO1xuICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICBhcmdzID0gaW5jcmVtZW50Tm9kZUluc3BlY3RvclBvcnQocHJvY2Vzcy5leGVjQXJndikuY29uY2F0KGFyZ3MpO1xuICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwcm9jZXNzLmV4ZWNQYXRoLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9jLmtpbGxlZCkge1xuICAgICAgLy8gdGVzdGluZyBtYWlubHkgdG8gYXZvaWQgbGVhayB3YXJuaW5ncyBkdXJpbmcgdW5pdCB0ZXN0cyB3aXRoIG1vY2tlZCBzcGF3blxuICAgICAgY29uc3Qgc2lnbmFscyA9IFsnU0lHVVNSMScsICdTSUdVU1IyJywgJ1NJR1RFUk0nLCAnU0lHSU5UJywgJ1NJR0hVUCddO1xuICAgICAgc2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICAgICAgICBpZiAocHJvYy5raWxsZWQgPT09IGZhbHNlICYmIHByb2MuZXhpdENvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgYmVjYXVzZSBzaWduYWxzIG5vdCB0eXBlZCB0byBrbm93biBzdHJpbmdzXG4gICAgICAgICAgICBwcm9jLmtpbGwoc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCB0ZXJtaW5hdGUgcHJvY2VzcyB3aGVuIHNwYXduZWQgcHJvY2VzcyB0ZXJtaW5hdGVzLlxuICAgIGNvbnN0IGV4aXRDYWxsYmFjayA9IHRoaXMuX2V4aXRDYWxsYmFjaztcbiAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICBjb2RlID0gY29kZSA/PyAxOyAvLyBjb2RlIGlzIG51bGwgaWYgc3Bhd25lZCBwcm9jZXNzIHRlcm1pbmF0ZWQgZHVlIHRvIGEgc2lnbmFsXG4gICAgICBpZiAoIWV4aXRDYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzLmV4aXQoY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGl0Q2FsbGJhY2soXG4gICAgICAgICAgbmV3IENvbW1hbmRlckVycm9yKFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdjb21tYW5kZXIuZXhlY3V0ZVN1YkNvbW1hbmRBc3luYycsXG4gICAgICAgICAgICAnKGNsb3NlKScsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZXJyLmNvZGUgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb25zdCBleGVjdXRhYmxlRGlyTWVzc2FnZSA9IGV4ZWN1dGFibGVEaXJcbiAgICAgICAgICA/IGBzZWFyY2hlZCBmb3IgbG9jYWwgc3ViY29tbWFuZCByZWxhdGl2ZSB0byBkaXJlY3RvcnkgJyR7ZXhlY3V0YWJsZURpcn0nYFxuICAgICAgICAgIDogJ25vIGRpcmVjdG9yeSBmb3Igc2VhcmNoIGZvciBsb2NhbCBzdWJjb21tYW5kLCB1c2UgLmV4ZWN1dGFibGVEaXIoKSB0byBzdXBwbHkgYSBjdXN0b20gZGlyZWN0b3J5JztcbiAgICAgICAgY29uc3QgZXhlY3V0YWJsZU1pc3NpbmcgPSBgJyR7ZXhlY3V0YWJsZUZpbGV9JyBkb2VzIG5vdCBleGlzdFxuIC0gaWYgJyR7c3ViY29tbWFuZC5fbmFtZX0nIGlzIG5vdCBtZWFudCB0byBiZSBhbiBleGVjdXRhYmxlIGNvbW1hbmQsIHJlbW92ZSBkZXNjcmlwdGlvbiBwYXJhbWV0ZXIgZnJvbSAnLmNvbW1hbmQoKScgYW5kIHVzZSAnLmRlc2NyaXB0aW9uKCknIGluc3RlYWRcbiAtIGlmIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUgbmFtZSBpcyBub3Qgc3VpdGFibGUsIHVzZSB0aGUgZXhlY3V0YWJsZUZpbGUgb3B0aW9uIHRvIHN1cHBseSBhIGN1c3RvbSBuYW1lIG9yIHBhdGhcbiAtICR7ZXhlY3V0YWJsZURpck1lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4ZWN1dGFibGVNaXNzaW5nKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBlcnIuY29kZSBpcyBhbiB1bmtub3duIHByb3BlcnR5XG4gICAgICB9IGVsc2UgaWYgKGVyci5jb2RlID09PSAnRUFDQ0VTJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2V4ZWN1dGFibGVGaWxlfScgbm90IGV4ZWN1dGFibGVgKTtcbiAgICAgIH1cbiAgICAgIGlmICghZXhpdENhbGxiYWNrKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBDb21tYW5kZXJFcnJvcihcbiAgICAgICAgICAxLFxuICAgICAgICAgICdjb21tYW5kZXIuZXhlY3V0ZVN1YkNvbW1hbmRBc3luYycsXG4gICAgICAgICAgJyhlcnJvciknLFxuICAgICAgICApO1xuICAgICAgICB3cmFwcGVkRXJyb3IubmVzdGVkRXJyb3IgPSBlcnI7XG4gICAgICAgIGV4aXRDYWxsYmFjayh3cmFwcGVkRXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgY2hpbGQgcHJvY2Vzc1xuICAgIHRoaXMucnVubmluZ0NvbW1hbmQgPSBwcm9jO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9kaXNwYXRjaFN1YmNvbW1hbmQoY29tbWFuZE5hbWUsIG9wZXJhbmRzLCB1bmtub3duKSB7XG4gICAgY29uc3Qgc3ViQ29tbWFuZCA9IHRoaXMuX2ZpbmRDb21tYW5kKGNvbW1hbmROYW1lKTtcbiAgICBpZiAoIXN1YkNvbW1hbmQpIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuXG4gICAgbGV0IHByb21pc2VDaGFpbjtcbiAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbFN1YkNvbW1hbmRIb29rKFxuICAgICAgcHJvbWlzZUNoYWluLFxuICAgICAgc3ViQ29tbWFuZCxcbiAgICAgICdwcmVTdWJjb21tYW5kJyxcbiAgICApO1xuICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT4ge1xuICAgICAgaWYgKHN1YkNvbW1hbmQuX2V4ZWN1dGFibGVIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGVTdWJDb21tYW5kKHN1YkNvbW1hbmQsIG9wZXJhbmRzLmNvbmNhdCh1bmtub3duKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3ViQ29tbWFuZC5fcGFyc2VDb21tYW5kKG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZUNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBoZWxwIGRpcmVjdGx5IGlmIHBvc3NpYmxlLCBvciBkaXNwYXRjaCBpZiBuZWNlc3NhcnkuXG4gICAqIGUuZy4gaGVscCBmb29cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2Rpc3BhdGNoSGVscENvbW1hbmQoc3ViY29tbWFuZE5hbWUpIHtcbiAgICBpZiAoIXN1YmNvbW1hbmROYW1lKSB7XG4gICAgICB0aGlzLmhlbHAoKTtcbiAgICB9XG4gICAgY29uc3Qgc3ViQ29tbWFuZCA9IHRoaXMuX2ZpbmRDb21tYW5kKHN1YmNvbW1hbmROYW1lKTtcbiAgICBpZiAoc3ViQ29tbWFuZCAmJiAhc3ViQ29tbWFuZC5fZXhlY3V0YWJsZUhhbmRsZXIpIHtcbiAgICAgIHN1YkNvbW1hbmQuaGVscCgpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHBhcnNpbmcgdGhlIGhlbHAgZmxhZyB0byBpbnZva2UgdGhlIGhlbHAuXG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoU3ViY29tbWFuZChcbiAgICAgIHN1YmNvbW1hbmROYW1lLFxuICAgICAgW10sXG4gICAgICBbdGhpcy5fZ2V0SGVscE9wdGlvbigpPy5sb25nID8/IHRoaXMuX2dldEhlbHBPcHRpb24oKT8uc2hvcnQgPz8gJy0taGVscCddLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhpcy5hcmdzIGFnYWluc3QgZXhwZWN0ZWQgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tOdW1iZXJPZkFyZ3VtZW50cygpIHtcbiAgICAvLyB0b28gZmV3XG4gICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmZvckVhY2goKGFyZywgaSkgPT4ge1xuICAgICAgaWYgKGFyZy5yZXF1aXJlZCAmJiB0aGlzLmFyZ3NbaV0gPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1pc3NpbmdBcmd1bWVudChhcmcubmFtZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyB0b28gbWFueVxuICAgIGlmIChcbiAgICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHNbdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCAtIDFdLnZhcmlhZGljXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmFyZ3MubGVuZ3RoID4gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZXhjZXNzQXJndW1lbnRzKHRoaXMuYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhpcy5hcmdzIHVzaW5nIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cyBhbmQgc2F2ZSBhcyB0aGlzLnByb2Nlc3NlZEFyZ3MhXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9wcm9jZXNzQXJndW1lbnRzKCkge1xuICAgIGNvbnN0IG15UGFyc2VBcmcgPSAoYXJndW1lbnQsIHZhbHVlLCBwcmV2aW91cykgPT4ge1xuICAgICAgLy8gRXh0cmEgcHJvY2Vzc2luZyBmb3IgbmljZSBlcnJvciBtZXNzYWdlIG9uIHBhcnNpbmcgZmFpbHVyZS5cbiAgICAgIGxldCBwYXJzZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIGFyZ3VtZW50LnBhcnNlQXJnKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IGNvbW1hbmQtYXJndW1lbnQgdmFsdWUgJyR7dmFsdWV9JyBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCAnJHthcmd1bWVudC5uYW1lKCl9Jy5gO1xuICAgICAgICBwYXJzZWRWYWx1ZSA9IHRoaXMuX2NhbGxQYXJzZUFyZyhcbiAgICAgICAgICBhcmd1bWVudCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91cyxcbiAgICAgICAgICBpbnZhbGlkVmFsdWVNZXNzYWdlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICAgIH07XG5cbiAgICB0aGlzLl9jaGVja051bWJlck9mQXJndW1lbnRzKCk7XG5cbiAgICBjb25zdCBwcm9jZXNzZWRBcmdzID0gW107XG4gICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmZvckVhY2goKGRlY2xhcmVkQXJnLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGRlY2xhcmVkQXJnLnZhcmlhZGljKSB7XG4gICAgICAgIC8vIENvbGxlY3QgdG9nZXRoZXIgcmVtYWluaW5nIGFyZ3VtZW50cyBmb3IgcGFzc2luZyB0b2dldGhlciBhcyBhbiBhcnJheS5cbiAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5hcmdzLnNsaWNlKGluZGV4KTtcbiAgICAgICAgICBpZiAoZGVjbGFyZWRBcmcucGFyc2VBcmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVkdWNlKChwcm9jZXNzZWQsIHYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG15UGFyc2VBcmcoZGVjbGFyZWRBcmcsIHYsIHByb2Nlc3NlZCk7XG4gICAgICAgICAgICB9LCBkZWNsYXJlZEFyZy5kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpbmRleCA8IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmFyZ3NbaW5kZXhdO1xuICAgICAgICBpZiAoZGVjbGFyZWRBcmcucGFyc2VBcmcpIHtcbiAgICAgICAgICB2YWx1ZSA9IG15UGFyc2VBcmcoZGVjbGFyZWRBcmcsIHZhbHVlLCBkZWNsYXJlZEFyZy5kZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcm9jZXNzZWRBcmdzW2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMucHJvY2Vzc2VkQXJncyA9IHByb2Nlc3NlZEFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogT25jZSB3ZSBoYXZlIGEgcHJvbWlzZSB3ZSBjaGFpbiwgYnV0IGNhbGwgc3luY2hyb25vdXNseSB1bnRpbCB0aGVuLlxuICAgKlxuICAgKiBAcGFyYW0geyhQcm9taXNlfHVuZGVmaW5lZCl9IHByb21pc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsKHByb21pc2UsIGZuKSB7XG4gICAgLy8gdGhlbmFibGVcbiAgICBpZiAocHJvbWlzZSAmJiBwcm9taXNlLnRoZW4gJiYgdHlwZW9mIHByb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gYWxyZWFkeSBoYXZlIGEgcHJvbWlzZSwgY2hhaW4gY2FsbGJhY2tcbiAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKCkgPT4gZm4oKSk7XG4gICAgfVxuICAgIC8vIGNhbGxiYWNrIG1pZ2h0IHJldHVybiBhIHByb21pc2VcbiAgICByZXR1cm4gZm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyhQcm9taXNlfHVuZGVmaW5lZCl9IHByb21pc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2UsIGV2ZW50KSB7XG4gICAgbGV0IHJlc3VsdCA9IHByb21pc2U7XG4gICAgY29uc3QgaG9va3MgPSBbXTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maWx0ZXIoKGNtZCkgPT4gY21kLl9saWZlQ3ljbGVIb29rc1tldmVudF0gIT09IHVuZGVmaW5lZClcbiAgICAgIC5mb3JFYWNoKChob29rZWRDb21tYW5kKSA9PiB7XG4gICAgICAgIGhvb2tlZENvbW1hbmQuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIGhvb2tzLnB1c2goeyBob29rZWRDb21tYW5kLCBjYWxsYmFjayB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICBpZiAoZXZlbnQgPT09ICdwb3N0QWN0aW9uJykge1xuICAgICAgaG9va3MucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIGhvb2tzLmZvckVhY2goKGhvb2tEZXRhaWwpID0+IHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2NoYWluT3JDYWxsKHJlc3VsdCwgKCkgPT4ge1xuICAgICAgICByZXR1cm4gaG9va0RldGFpbC5jYWxsYmFjayhob29rRGV0YWlsLmhvb2tlZENvbW1hbmQsIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyhQcm9taXNlfHVuZGVmaW5lZCl9IHByb21pc2VcbiAgICogQHBhcmFtIHtDb21tYW5kfSBzdWJDb21tYW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGxTdWJDb21tYW5kSG9vayhwcm9taXNlLCBzdWJDb21tYW5kLCBldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBwcm9taXNlO1xuICAgIGlmICh0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdLmZvckVhY2goKGhvb2spID0+IHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fY2hhaW5PckNhbGwocmVzdWx0LCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGhvb2sodGhpcywgc3ViQ29tbWFuZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhcmd1bWVudHMgaW4gY29udGV4dCBvZiB0aGlzIGNvbW1hbmQuXG4gICAqIFJldHVybnMgYWN0aW9uIHJlc3VsdCwgaW4gY2FzZSBpdCBpcyBhIHByb21pc2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9wYXJzZUNvbW1hbmQob3BlcmFuZHMsIHVua25vd24pIHtcbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlT3B0aW9ucyh1bmtub3duKTtcbiAgICB0aGlzLl9wYXJzZU9wdGlvbnNFbnYoKTsgLy8gYWZ0ZXIgY2xpLCBzbyBwYXJzZUFyZyBub3QgY2FsbGVkIG9uIGJvdGggY2xpIGFuZCBlbnZcbiAgICB0aGlzLl9wYXJzZU9wdGlvbnNJbXBsaWVkKCk7XG4gICAgb3BlcmFuZHMgPSBvcGVyYW5kcy5jb25jYXQocGFyc2VkLm9wZXJhbmRzKTtcbiAgICB1bmtub3duID0gcGFyc2VkLnVua25vd247XG4gICAgdGhpcy5hcmdzID0gb3BlcmFuZHMuY29uY2F0KHVua25vd24pO1xuXG4gICAgaWYgKG9wZXJhbmRzICYmIHRoaXMuX2ZpbmRDb21tYW5kKG9wZXJhbmRzWzBdKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoU3ViY29tbWFuZChvcGVyYW5kc1swXSwgb3BlcmFuZHMuc2xpY2UoMSksIHVua25vd24pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpICYmXG4gICAgICBvcGVyYW5kc1swXSA9PT0gdGhpcy5fZ2V0SGVscENvbW1hbmQoKS5uYW1lKClcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaEhlbHBDb21tYW5kKG9wZXJhbmRzWzFdKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgdGhpcy5fb3V0cHV0SGVscElmUmVxdWVzdGVkKHVua25vd24pOyAvLyBSdW4gdGhlIGhlbHAgZm9yIGRlZmF1bHQgY29tbWFuZCBmcm9tIHBhcmVudCByYXRoZXIgdGhhbiBwYXNzaW5nIHRvIGRlZmF1bHQgY29tbWFuZFxuICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoU3ViY29tbWFuZChcbiAgICAgICAgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lLFxuICAgICAgICBvcGVyYW5kcyxcbiAgICAgICAgdW5rbm93bixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29tbWFuZHMubGVuZ3RoICYmXG4gICAgICB0aGlzLmFyZ3MubGVuZ3RoID09PSAwICYmXG4gICAgICAhdGhpcy5fYWN0aW9uSGFuZGxlciAmJlxuICAgICAgIXRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZVxuICAgICkge1xuICAgICAgLy8gcHJvYmFibHkgbWlzc2luZyBzdWJjb21tYW5kIGFuZCBubyBoYW5kbGVyLCB1c2VyIG5lZWRzIGhlbHAgKGFuZCBleGl0KVxuICAgICAgdGhpcy5oZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3V0cHV0SGVscElmUmVxdWVzdGVkKHBhcnNlZC51bmtub3duKTtcbiAgICB0aGlzLl9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCk7XG4gICAgdGhpcy5fY2hlY2tGb3JDb25mbGljdGluZ09wdGlvbnMoKTtcblxuICAgIC8vIFdlIGRvIG5vdCBhbHdheXMgY2FsbCB0aGlzIGNoZWNrIHRvIGF2b2lkIG1hc2tpbmcgYSBcImJldHRlclwiIGVycm9yLCBsaWtlIHVua25vd24gY29tbWFuZC5cbiAgICBjb25zdCBjaGVja0ZvclVua25vd25PcHRpb25zID0gKCkgPT4ge1xuICAgICAgaWYgKHBhcnNlZC51bmtub3duLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy51bmtub3duT3B0aW9uKHBhcnNlZC51bmtub3duWzBdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY29tbWFuZEV2ZW50ID0gYGNvbW1hbmQ6JHt0aGlzLm5hbWUoKX1gO1xuICAgIGlmICh0aGlzLl9hY3Rpb25IYW5kbGVyKSB7XG4gICAgICBjaGVja0ZvclVua25vd25PcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG5cbiAgICAgIGxldCBwcm9taXNlQ2hhaW47XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2VDaGFpbiwgJ3ByZUFjdGlvbicpO1xuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGwocHJvbWlzZUNoYWluLCAoKSA9PlxuICAgICAgICB0aGlzLl9hY3Rpb25IYW5kbGVyKHRoaXMucHJvY2Vzc2VkQXJncyksXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoY29tbWFuZEV2ZW50LCBvcGVyYW5kcywgdW5rbm93bik7IC8vIGxlZ2FjeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsSG9va3MocHJvbWlzZUNoYWluLCAncG9zdEFjdGlvbicpO1xuICAgICAgcmV0dXJuIHByb21pc2VDaGFpbjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lmxpc3RlbmVyQ291bnQoY29tbWFuZEV2ZW50KSkge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgdGhpcy5wYXJlbnQuZW1pdChjb21tYW5kRXZlbnQsIG9wZXJhbmRzLCB1bmtub3duKTsgLy8gbGVnYWN5XG4gICAgfSBlbHNlIGlmIChvcGVyYW5kcy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLl9maW5kQ29tbWFuZCgnKicpKSB7XG4gICAgICAgIC8vIGxlZ2FjeSBkZWZhdWx0IGNvbW1hbmRcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoU3ViY29tbWFuZCgnKicsIG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxpc3RlbmVyQ291bnQoJ2NvbW1hbmQ6KicpKSB7XG4gICAgICAgIC8vIHNraXAgb3B0aW9uIGNoZWNrLCBlbWl0IGV2ZW50IGZvciBwb3NzaWJsZSBtaXNzcGVsbGluZyBzdWdnZXN0aW9uXG4gICAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDoqJywgb3BlcmFuZHMsIHVua25vd24pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnVua25vd25Db21tYW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0ZvclVua25vd25PcHRpb25zKCk7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICBjaGVja0ZvclVua25vd25PcHRpb25zKCk7XG4gICAgICAvLyBUaGlzIGNvbW1hbmQgaGFzIHN1YmNvbW1hbmRzIGFuZCBub3RoaW5nIGhvb2tlZCB1cCBhdCB0aGlzIGxldmVsLCBzbyBkaXNwbGF5IGhlbHAgKGFuZCBleGl0KS5cbiAgICAgIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0ZvclVua25vd25PcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICAvLyBmYWxsIHRocm91Z2ggZm9yIGNhbGxlciB0byBoYW5kbGUgYWZ0ZXIgY2FsbGluZyAucGFyc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG1hdGNoaW5nIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm4ge0NvbW1hbmQgfCB1bmRlZmluZWR9XG4gICAqL1xuICBfZmluZENvbW1hbmQobmFtZSkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kcy5maW5kKFxuICAgICAgKGNtZCkgPT4gY21kLl9uYW1lID09PSBuYW1lIHx8IGNtZC5fYWxpYXNlcy5pbmNsdWRlcyhuYW1lKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvcHRpb24gbWF0Y2hpbmcgYGFyZ2AgaWYgYW55LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJnXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2ZpbmRPcHRpb24oYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5pcyhhcmcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgaWYgYSBtYW5kYXRvcnkgb3B0aW9uIGRvZXMgbm90IGhhdmUgYSB2YWx1ZS5cbiAgICogQ2FsbGVkIGFmdGVyIGNoZWNraW5nIGZvciBoZWxwIGZsYWdzIGluIGxlYWYgc3ViY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrRm9yTWlzc2luZ01hbmRhdG9yeU9wdGlvbnMoKSB7XG4gICAgLy8gV2FsayB1cCBoaWVyYXJjaHkgc28gY2FuIGNhbGwgaW4gc3ViY29tbWFuZCBhZnRlciBjaGVja2luZyBmb3IgZGlzcGxheWluZyBoZWxwLlxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKS5mb3JFYWNoKChjbWQpID0+IHtcbiAgICAgIGNtZC5vcHRpb25zLmZvckVhY2goKGFuT3B0aW9uKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbk9wdGlvbi5tYW5kYXRvcnkgJiZcbiAgICAgICAgICBjbWQuZ2V0T3B0aW9uVmFsdWUoYW5PcHRpb24uYXR0cmlidXRlTmFtZSgpKSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGNtZC5taXNzaW5nTWFuZGF0b3J5T3B0aW9uVmFsdWUoYW5PcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgaWYgY29uZmxpY3Rpbmcgb3B0aW9ucyBhcmUgdXNlZCB0b2dldGhlciBpbiB0aGlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrRm9yQ29uZmxpY3RpbmdMb2NhbE9wdGlvbnMoKSB7XG4gICAgY29uc3QgZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSkgIT09ICdkZWZhdWx0JztcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdGlvbnNXaXRoQ29uZmxpY3RpbmcgPSBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMuZmlsdGVyKFxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLmNvbmZsaWN0c1dpdGgubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgb3B0aW9uc1dpdGhDb25mbGljdGluZy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IGNvbmZsaWN0aW5nQW5kRGVmaW5lZCA9IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucy5maW5kKChkZWZpbmVkKSA9PlxuICAgICAgICBvcHRpb24uY29uZmxpY3RzV2l0aC5pbmNsdWRlcyhkZWZpbmVkLmF0dHJpYnV0ZU5hbWUoKSksXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZsaWN0aW5nQW5kRGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9jb25mbGljdGluZ09wdGlvbihvcHRpb24sIGNvbmZsaWN0aW5nQW5kRGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG9nZXRoZXIuXG4gICAqIENhbGxlZCBhZnRlciBjaGVja2luZyBmb3IgaGVscCBmbGFncyBpbiBsZWFmIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tGb3JDb25mbGljdGluZ09wdGlvbnMoKSB7XG4gICAgLy8gV2FsayB1cCBoaWVyYXJjaHkgc28gY2FuIGNhbGwgaW4gc3ViY29tbWFuZCBhZnRlciBjaGVja2luZyBmb3IgZGlzcGxheWluZyBoZWxwLlxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKS5mb3JFYWNoKChjbWQpID0+IHtcbiAgICAgIGNtZC5fY2hlY2tGb3JDb25mbGljdGluZ0xvY2FsT3B0aW9ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG9wdGlvbnMgZnJvbSBgYXJndmAgcmVtb3Zpbmcga25vd24gb3B0aW9ucyxcbiAgICogYW5kIHJldHVybiBhcmd2IHNwbGl0IGludG8gb3BlcmFuZHMgYW5kIHVua25vd24gYXJndW1lbnRzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogICAgIGFyZ3YgPT4gb3BlcmFuZHMsIHVua25vd25cbiAgICogICAgIC0ta25vd24ga2trIG9wID0+IFtvcF0sIFtdXG4gICAqICAgICBvcCAtLWtub3duIGtrayA9PiBbb3BdLCBbXVxuICAgKiAgICAgc3ViIC0tdW5rbm93biB1dXUgb3AgPT4gW3N1Yl0sIFstLXVua25vd24gdXV1IG9wXVxuICAgKiAgICAgc3ViIC0tIC0tdW5rbm93biB1dXUgb3AgPT4gW3N1YiAtLXVua25vd24gdXV1IG9wXSwgW11cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJndlxuICAgKiBAcmV0dXJuIHt7b3BlcmFuZHM6IHN0cmluZ1tdLCB1bmtub3duOiBzdHJpbmdbXX19XG4gICAqL1xuXG4gIHBhcnNlT3B0aW9ucyhhcmd2KSB7XG4gICAgY29uc3Qgb3BlcmFuZHMgPSBbXTsgLy8gb3BlcmFuZHMsIG5vdCBvcHRpb25zIG9yIHZhbHVlc1xuICAgIGNvbnN0IHVua25vd24gPSBbXTsgLy8gZmlyc3QgdW5rbm93biBvcHRpb24gYW5kIHJlbWFpbmluZyB1bmtub3duIGFyZ3NcbiAgICBsZXQgZGVzdCA9IG9wZXJhbmRzO1xuICAgIGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKCk7XG5cbiAgICBmdW5jdGlvbiBtYXliZU9wdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBhcmcubGVuZ3RoID4gMSAmJiBhcmdbMF0gPT09ICctJztcbiAgICB9XG5cbiAgICAvLyBwYXJzZSBvcHRpb25zXG4gICAgbGV0IGFjdGl2ZVZhcmlhZGljT3B0aW9uID0gbnVsbDtcbiAgICB3aGlsZSAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGFyZ3Muc2hpZnQoKTtcblxuICAgICAgLy8gbGl0ZXJhbFxuICAgICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgICBpZiAoZGVzdCA9PT0gdW5rbm93bikgZGVzdC5wdXNoKGFyZyk7XG4gICAgICAgIGRlc3QucHVzaCguLi5hcmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVWYXJpYWRpY09wdGlvbiAmJiAhbWF5YmVPcHRpb24oYXJnKSkge1xuICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke2FjdGl2ZVZhcmlhZGljT3B0aW9uLm5hbWUoKX1gLCBhcmcpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGFjdGl2ZVZhcmlhZGljT3B0aW9uID0gbnVsbDtcblxuICAgICAgaWYgKG1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihhcmcpO1xuICAgICAgICAvLyByZWNvZ25pc2VkIG9wdGlvbiwgY2FsbCBsaXN0ZW5lciB0byBhc3NpZ24gdmFsdWUgd2l0aCBwb3NzaWJsZSBjdXN0b20gcHJvY2Vzc2luZ1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgdGhpcy5vcHRpb25NaXNzaW5nQXJndW1lbnQob3B0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBoaXN0b3JpY2FsIGJlaGF2aW91ciBpcyBvcHRpb25hbCB2YWx1ZSBpcyBmb2xsb3dpbmcgYXJnIHVubGVzcyBhbiBvcHRpb25cbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDAgJiYgIW1heWJlT3B0aW9uKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhbiBmbGFnXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVZhcmlhZGljT3B0aW9uID0gb3B0aW9uLnZhcmlhZGljID8gb3B0aW9uIDogbnVsbDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29rIGZvciBjb21ibyBvcHRpb25zIGZvbGxvd2luZyBzaW5nbGUgZGFzaCwgZWF0IGZpcnN0IG9uZSBpZiBrbm93bi5cbiAgICAgIGlmIChhcmcubGVuZ3RoID4gMiAmJiBhcmdbMF0gPT09ICctJyAmJiBhcmdbMV0gIT09ICctJykge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9maW5kT3B0aW9uKGAtJHthcmdbMV19YCk7XG4gICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBvcHRpb24ucmVxdWlyZWQgfHxcbiAgICAgICAgICAgIChvcHRpb24ub3B0aW9uYWwgJiYgdGhpcy5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW9uIHdpdGggdmFsdWUgZm9sbG93aW5nIGluIHNhbWUgYXJndW1lbnRcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCBhcmcuc2xpY2UoMikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuIG9wdGlvbiwgZW1pdCBhbmQgcHV0IGJhY2sgcmVtYWluZGVyIG9mIGFyZyBmb3IgZnVydGhlciBwcm9jZXNzaW5nXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCk7XG4gICAgICAgICAgICBhcmdzLnVuc2hpZnQoYC0ke2FyZy5zbGljZSgyKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3Iga25vd24gbG9uZyBmbGFnIHdpdGggdmFsdWUsIGxpa2UgLS1mb289YmFyXG4gICAgICBpZiAoL14tLVtePV0rPS8udGVzdChhcmcpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYXJnLmluZGV4T2YoJz0nKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihhcmcuc2xpY2UoMCwgaW5kZXgpKTtcbiAgICAgICAgaWYgKG9wdGlvbiAmJiAob3B0aW9uLnJlcXVpcmVkIHx8IG9wdGlvbi5vcHRpb25hbCkpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgYXJnLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdCBhIHJlY29nbmlzZWQgb3B0aW9uIGJ5IHRoaXMgY29tbWFuZC5cbiAgICAgIC8vIE1pZ2h0IGJlIGEgY29tbWFuZC1hcmd1bWVudCwgb3Igc3ViY29tbWFuZCBvcHRpb24sIG9yIHVua25vd24gb3B0aW9uLCBvciBoZWxwIGNvbW1hbmQgb3Igb3B0aW9uLlxuXG4gICAgICAvLyBBbiB1bmtub3duIG9wdGlvbiBtZWFucyBmdXJ0aGVyIGFyZ3VtZW50cyBhbHNvIGNsYXNzaWZpZWQgYXMgdW5rbm93biBzbyBjYW4gYmUgcmVwcm9jZXNzZWQgYnkgc3ViY29tbWFuZHMuXG4gICAgICBpZiAobWF5YmVPcHRpb24oYXJnKSkge1xuICAgICAgICBkZXN0ID0gdW5rbm93bjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdXNpbmcgcG9zaXRpb25hbE9wdGlvbnMsIHN0b3AgcHJvY2Vzc2luZyBvdXIgb3B0aW9ucyBhdCBzdWJjb21tYW5kLlxuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgfHwgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zKSAmJlxuICAgICAgICBvcGVyYW5kcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgdW5rbm93bi5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5fZmluZENvbW1hbmQoYXJnKSkge1xuICAgICAgICAgIG9wZXJhbmRzLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB1bmtub3duLnB1c2goLi4uYXJncyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5fZ2V0SGVscENvbW1hbmQoKSAmJlxuICAgICAgICAgIGFyZyA9PT0gdGhpcy5fZ2V0SGVscENvbW1hbmQoKS5uYW1lKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgb3BlcmFuZHMucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIG9wZXJhbmRzLnB1c2goLi4uYXJncyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZGVmYXVsdENvbW1hbmROYW1lKSB7XG4gICAgICAgICAgdW5rbm93bi5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgdW5rbm93bi5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzaW5nIHBhc3NUaHJvdWdoT3B0aW9ucywgc3RvcCBwcm9jZXNzaW5nIG9wdGlvbnMgYXQgZmlyc3QgY29tbWFuZC1hcmd1bWVudC5cbiAgICAgIGlmICh0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMpIHtcbiAgICAgICAgZGVzdC5wdXNoKGFyZyk7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIGRlc3QucHVzaCguLi5hcmdzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBhcmdcbiAgICAgIGRlc3QucHVzaChhcmcpO1xuICAgIH1cblxuICAgIHJldHVybiB7IG9wZXJhbmRzLCB1bmtub3duIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIGxvY2FsIG9wdGlvbiB2YWx1ZXMgYXMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBvcHRzKCkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIC8vIFByZXNlcnZlIG9yaWdpbmFsIGJlaGF2aW91ciBzbyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aGVuIHN0aWxsIHVzaW5nIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgY29uc3QgbGVuID0gdGhpcy5vcHRpb25zLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLm9wdGlvbnNbaV0uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgICByZXN1bHRba2V5XSA9XG4gICAgICAgICAga2V5ID09PSB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA/IHRoaXMuX3ZlcnNpb24gOiB0aGlzW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9vcHRpb25WYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIG1lcmdlZCBsb2NhbCBhbmQgZ2xvYmFsIG9wdGlvbiB2YWx1ZXMgYXMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBvcHRzV2l0aEdsb2JhbHMoKSB7XG4gICAgLy8gZ2xvYmFscyBvdmVyd3JpdGUgbG9jYWxzXG4gICAgcmV0dXJuIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKS5yZWR1Y2UoXG4gICAgICAoY29tYmluZWRPcHRpb25zLCBjbWQpID0+IE9iamVjdC5hc3NpZ24oY29tYmluZWRPcHRpb25zLCBjbWQub3B0cygpKSxcbiAgICAgIHt9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBlcnJvciBtZXNzYWdlIGFuZCBleGl0IChvciBjYWxsIGV4aXRPdmVycmlkZSkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbZXJyb3JPcHRpb25zXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Vycm9yT3B0aW9ucy5jb2RlXSAtIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZXJyb3JPcHRpb25zLmV4aXRDb2RlXSAtIHVzZWQgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICovXG4gIGVycm9yKG1lc3NhZ2UsIGVycm9yT3B0aW9ucykge1xuICAgIC8vIG91dHB1dCBoYW5kbGluZ1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ub3V0cHV0RXJyb3IoXG4gICAgICBgJHttZXNzYWdlfVxcbmAsXG4gICAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlRXJyLFxuICAgICk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlRXJyKGAke3RoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvcn1cXG5gKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvcikge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycignXFxuJyk7XG4gICAgICB0aGlzLm91dHB1dEhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBleGl0IGhhbmRsaW5nXG4gICAgY29uc3QgY29uZmlnID0gZXJyb3JPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGV4aXRDb2RlID0gY29uZmlnLmV4aXRDb2RlIHx8IDE7XG4gICAgY29uc3QgY29kZSA9IGNvbmZpZy5jb2RlIHx8ICdjb21tYW5kZXIuZXJyb3InO1xuICAgIHRoaXMuX2V4aXQoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBvcHRpb24gcmVsYXRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGlmIG9wdGlvbiBkb2VzXG4gICAqIG5vdCBoYXZlIGEgdmFsdWUgZnJvbSBjbGkgb3IgY2xpZW50IGNvZGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGFyc2VPcHRpb25zRW52KCkge1xuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGlmIChvcHRpb24uZW52VmFyICYmIG9wdGlvbi5lbnZWYXIgaW4gcHJvY2Vzcy5lbnYpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgICAgLy8gUHJpb3JpdHkgY2hlY2suIERvIG5vdCBvdmVyd3JpdGUgY2xpIG9yIG9wdGlvbnMgZnJvbSB1bmtub3duIHNvdXJjZSAoY2xpZW50LWNvZGUpLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb25LZXkpID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBbJ2RlZmF1bHQnLCAnY29uZmlnJywgJ2VudiddLmluY2x1ZGVzKFxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbi5yZXF1aXJlZCB8fCBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIC8vIG9wdGlvbiBjYW4gdGFrZSBhIHZhbHVlXG4gICAgICAgICAgICAvLyBrZWVwIHZlcnkgc2ltcGxlLCBvcHRpb25hbCBhbHdheXMgdGFrZXMgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uRW52OiR7b3B0aW9uLm5hbWUoKX1gLCBwcm9jZXNzLmVudltvcHRpb24uZW52VmFyXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW5cbiAgICAgICAgICAgIC8vIGtlZXAgdmVyeSBzaW1wbGUsIG9ubHkgY2FyZSB0aGF0IGVudlZhciBkZWZpbmVkIGFuZCBub3QgdGhlIHZhbHVlXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbkVudjoke29wdGlvbi5uYW1lKCl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYW55IGltcGxpZWQgb3B0aW9uIHZhbHVlcywgaWYgb3B0aW9uIGlzIHVuZGVmaW5lZCBvciBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlT3B0aW9uc0ltcGxpZWQoKSB7XG4gICAgY29uc3QgZHVhbEhlbHBlciA9IG5ldyBEdWFsT3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IGhhc0N1c3RvbU9wdGlvblZhbHVlID0gKG9wdGlvbktleSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb25LZXkpICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIVsnZGVmYXVsdCcsICdpbXBsaWVkJ10uaW5jbHVkZXModGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpKVxuICAgICAgKTtcbiAgICB9O1xuICAgIHRoaXMub3B0aW9uc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKG9wdGlvbikgPT5cbiAgICAgICAgICBvcHRpb24uaW1wbGllZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgaGFzQ3VzdG9tT3B0aW9uVmFsdWUob3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSkgJiZcbiAgICAgICAgICBkdWFsSGVscGVyLnZhbHVlRnJvbU9wdGlvbihcbiAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSksXG4gICAgICAgICAgICBvcHRpb24sXG4gICAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXMob3B0aW9uLmltcGxpZWQpXG4gICAgICAgICAgLmZpbHRlcigoaW1wbGllZEtleSkgPT4gIWhhc0N1c3RvbU9wdGlvblZhbHVlKGltcGxpZWRLZXkpKVxuICAgICAgICAgIC5mb3JFYWNoKChpbXBsaWVkS2V5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShcbiAgICAgICAgICAgICAgaW1wbGllZEtleSxcbiAgICAgICAgICAgICAgb3B0aW9uLmltcGxpZWRbaW1wbGllZEtleV0sXG4gICAgICAgICAgICAgICdpbXBsaWVkJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmd1bWVudCBgbmFtZWAgaXMgbWlzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgbWlzc2luZ0FyZ3VtZW50KG5hbWUpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50ICcke25hbWV9J2A7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIubWlzc2luZ0FyZ3VtZW50JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBpcyBtaXNzaW5nIGFuIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG9wdGlvbk1pc3NpbmdBcmd1bWVudChvcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgYXJndW1lbnQgbWlzc2luZ2A7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIub3B0aW9uTWlzc2luZ0FyZ3VtZW50JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCBpcyBhIG1hbmRhdG9yeSBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgbWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlKG9wdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHJlcXVpcmVkIG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBub3Qgc3BlY2lmaWVkYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5taXNzaW5nTWFuZGF0b3J5T3B0aW9uVmFsdWUnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBPcHRpb25gIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBjb25mbGljdGluZ09wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbmZsaWN0aW5nT3B0aW9uKG9wdGlvbiwgY29uZmxpY3RpbmdPcHRpb24pIHtcbiAgICAvLyBUaGUgY2FsbGluZyBjb2RlIGRvZXMgbm90IGtub3cgd2hldGhlciBhIG5lZ2F0ZWQgb3B0aW9uIGlzIHRoZSBzb3VyY2Ugb2YgdGhlXG4gICAgLy8gdmFsdWUsIHNvIGRvIHNvbWUgd29yayB0byB0YWtlIGFuIGVkdWNhdGVkIGd1ZXNzLlxuICAgIGNvbnN0IGZpbmRCZXN0T3B0aW9uRnJvbVZhbHVlID0gKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb25LZXkpO1xuICAgICAgY29uc3QgbmVnYXRpdmVPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChcbiAgICAgICAgKHRhcmdldCkgPT4gdGFyZ2V0Lm5lZ2F0ZSAmJiBvcHRpb25LZXkgPT09IHRhcmdldC5hdHRyaWJ1dGVOYW1lKCksXG4gICAgICApO1xuICAgICAgY29uc3QgcG9zaXRpdmVPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChcbiAgICAgICAgKHRhcmdldCkgPT4gIXRhcmdldC5uZWdhdGUgJiYgb3B0aW9uS2V5ID09PSB0YXJnZXQuYXR0cmlidXRlTmFtZSgpLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgbmVnYXRpdmVPcHRpb24gJiZcbiAgICAgICAgKChuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25WYWx1ZSA9PT0gZmFsc2UpIHx8XG4gICAgICAgICAgKG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSA9PT0gbmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmVnYXRpdmVPcHRpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9zaXRpdmVPcHRpb24gfHwgb3B0aW9uO1xuICAgIH07XG5cbiAgICBjb25zdCBnZXRFcnJvck1lc3NhZ2UgPSAob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBiZXN0T3B0aW9uID0gZmluZEJlc3RPcHRpb25Gcm9tVmFsdWUob3B0aW9uKTtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IGJlc3RPcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpO1xuICAgICAgaWYgKHNvdXJjZSA9PT0gJ2VudicpIHtcbiAgICAgICAgcmV0dXJuIGBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJHtiZXN0T3B0aW9uLmVudlZhcn0nYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgb3B0aW9uICcke2Jlc3RPcHRpb24uZmxhZ3N9J2A7XG4gICAgfTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6ICR7Z2V0RXJyb3JNZXNzYWdlKG9wdGlvbil9IGNhbm5vdCBiZSB1c2VkIHdpdGggJHtnZXRFcnJvck1lc3NhZ2UoY29uZmxpY3RpbmdPcHRpb24pfWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIuY29uZmxpY3RpbmdPcHRpb24nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVua25vd24gb3B0aW9uIGBmbGFnYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdW5rbm93bk9wdGlvbihmbGFnKSB7XG4gICAgaWYgKHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbikgcmV0dXJuO1xuICAgIGxldCBzdWdnZXN0aW9uID0gJyc7XG5cbiAgICBpZiAoZmxhZy5zdGFydHNXaXRoKCctLScpICYmIHRoaXMuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcikge1xuICAgICAgLy8gTG9vcGluZyB0byBwaWNrIHVwIHRoZSBnbG9iYWwgb3B0aW9ucyB0b29cbiAgICAgIGxldCBjYW5kaWRhdGVGbGFncyA9IFtdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBsZXQgY29tbWFuZCA9IHRoaXM7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IG1vcmVGbGFncyA9IGNvbW1hbmRcbiAgICAgICAgICAuY3JlYXRlSGVscCgpXG4gICAgICAgICAgLnZpc2libGVPcHRpb25zKGNvbW1hbmQpXG4gICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ubG9uZylcbiAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi5sb25nKTtcbiAgICAgICAgY2FuZGlkYXRlRmxhZ3MgPSBjYW5kaWRhdGVGbGFncy5jb25jYXQobW9yZUZsYWdzKTtcbiAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucGFyZW50O1xuICAgICAgfSB3aGlsZSAoY29tbWFuZCAmJiAhY29tbWFuZC5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMpO1xuICAgICAgc3VnZ2VzdGlvbiA9IHN1Z2dlc3RTaW1pbGFyKGZsYWcsIGNhbmRpZGF0ZUZsYWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiB1bmtub3duIG9wdGlvbiAnJHtmbGFnfScke3N1Z2dlc3Rpb259YDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci51bmtub3duT3B0aW9uJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNlc3MgYXJndW1lbnRzLCBtb3JlIHRoYW4gZXhwZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHJlY2VpdmVkQXJnc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhjZXNzQXJndW1lbnRzKHJlY2VpdmVkQXJncykge1xuICAgIGlmICh0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cykgcmV0dXJuO1xuXG4gICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoO1xuICAgIGNvbnN0IHMgPSBleHBlY3RlZCA9PT0gMSA/ICcnIDogJ3MnO1xuICAgIGNvbnN0IGZvclN1YmNvbW1hbmQgPSB0aGlzLnBhcmVudCA/IGAgZm9yICcke3RoaXMubmFtZSgpfSdgIDogJyc7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdG9vIG1hbnkgYXJndW1lbnRzJHtmb3JTdWJjb21tYW5kfS4gRXhwZWN0ZWQgJHtleHBlY3RlZH0gYXJndW1lbnQke3N9IGJ1dCBnb3QgJHtyZWNlaXZlZEFyZ3MubGVuZ3RofS5gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLmV4Y2Vzc0FyZ3VtZW50cycgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5rbm93biBjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB1bmtub3duQ29tbWFuZCgpIHtcbiAgICBjb25zdCB1bmtub3duTmFtZSA9IHRoaXMuYXJnc1swXTtcbiAgICBsZXQgc3VnZ2VzdGlvbiA9ICcnO1xuXG4gICAgaWYgKHRoaXMuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcikge1xuICAgICAgY29uc3QgY2FuZGlkYXRlTmFtZXMgPSBbXTtcbiAgICAgIHRoaXMuY3JlYXRlSGVscCgpXG4gICAgICAgIC52aXNpYmxlQ29tbWFuZHModGhpcylcbiAgICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICBjYW5kaWRhdGVOYW1lcy5wdXNoKGNvbW1hbmQubmFtZSgpKTtcbiAgICAgICAgICAvLyBqdXN0IHZpc2libGUgYWxpYXNcbiAgICAgICAgICBpZiAoY29tbWFuZC5hbGlhcygpKSBjYW5kaWRhdGVOYW1lcy5wdXNoKGNvbW1hbmQuYWxpYXMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgc3VnZ2VzdGlvbiA9IHN1Z2dlc3RTaW1pbGFyKHVua25vd25OYW1lLCBjYW5kaWRhdGVOYW1lcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdW5rbm93biBjb21tYW5kICcke3Vua25vd25OYW1lfScke3N1Z2dlc3Rpb259YDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci51bmtub3duQ29tbWFuZCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgcHJvZ3JhbSB2ZXJzaW9uLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhdXRvLXJlZ2lzdGVycyB0aGUgXCItViwgLS12ZXJzaW9uXCIgb3B0aW9uIHdoaWNoIHdpbGwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyLlxuICAgKlxuICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBmbGFncyBhbmQgZGVzY3JpcHRpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7KHRoaXMgfCBzdHJpbmcgfCB1bmRlZmluZWQpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHZlcnNpb24gc3RyaW5nIGlmIG5vIGFyZ3VtZW50c1xuICAgKi9cblxuICB2ZXJzaW9uKHN0ciwgZmxhZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB0aGlzLl92ZXJzaW9uID0gc3RyO1xuICAgIGZsYWdzID0gZmxhZ3MgfHwgJy1WLCAtLXZlcnNpb24nO1xuICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJ291dHB1dCB0aGUgdmVyc2lvbiBudW1iZXInO1xuICAgIGNvbnN0IHZlcnNpb25PcHRpb24gPSB0aGlzLmNyZWF0ZU9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuICAgIHRoaXMuX3ZlcnNpb25PcHRpb25OYW1lID0gdmVyc2lvbk9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJPcHRpb24odmVyc2lvbk9wdGlvbik7XG5cbiAgICB0aGlzLm9uKCdvcHRpb246JyArIHZlcnNpb25PcHRpb24ubmFtZSgpLCAoKSA9PiB7XG4gICAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlT3V0KGAke3N0cn1cXG5gKTtcbiAgICAgIHRoaXMuX2V4aXQoMCwgJ2NvbW1hbmRlci52ZXJzaW9uJywgc3RyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlc2NyaXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzRGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuICBkZXNjcmlwdGlvbihzdHIsIGFyZ3NEZXNjcmlwdGlvbikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCAmJiBhcmdzRGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHN0cjtcbiAgICBpZiAoYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9hcmdzRGVzY3JpcHRpb24gPSBhcmdzRGVzY3JpcHRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3VtbWFyeS4gVXNlZCB3aGVuIGxpc3RlZCBhcyBzdWJjb21tYW5kIG9mIHBhcmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuICBzdW1tYXJ5KHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3N1bW1hcnk7XG4gICAgdGhpcy5fc3VtbWFyeSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW4gYWxpYXMgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBZb3UgbWF5IGNhbGwgbW9yZSB0aGFuIG9uY2UgdG8gYWRkIG11bHRpcGxlIGFsaWFzZXMuIE9ubHkgdGhlIGZpcnN0IGFsaWFzIGlzIHNob3duIGluIHRoZSBhdXRvLWdlbmVyYXRlZCBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICBhbGlhcyhhbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fYWxpYXNlc1swXTsgLy8ganVzdCByZXR1cm4gZmlyc3QsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kfSAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGxldCBjb21tYW5kID0gdGhpcztcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdLl9leGVjdXRhYmxlSGFuZGxlclxuICAgICkge1xuICAgICAgLy8gYXNzdW1lIGFkZGluZyBhbGlhcyBmb3IgbGFzdCBhZGRlZCBleGVjdXRhYmxlIHN1YmNvbW1hbmQsIHJhdGhlciB0aGFuIHRoaXNcbiAgICAgIGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgaWYgKGFsaWFzID09PSBjb21tYW5kLl9uYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbWFuZCBhbGlhcyBjYW4ndCBiZSB0aGUgc2FtZSBhcyBpdHMgbmFtZVwiKTtcbiAgICBjb25zdCBtYXRjaGluZ0NvbW1hbmQgPSB0aGlzLnBhcmVudD8uX2ZpbmRDb21tYW5kKGFsaWFzKTtcbiAgICBpZiAobWF0Y2hpbmdDb21tYW5kKSB7XG4gICAgICAvLyBjLmYuIF9yZWdpc3RlckNvbW1hbmRcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ21kID0gW21hdGNoaW5nQ29tbWFuZC5uYW1lKCldXG4gICAgICAgIC5jb25jYXQobWF0Y2hpbmdDb21tYW5kLmFsaWFzZXMoKSlcbiAgICAgICAgLmpvaW4oJ3wnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNhbm5vdCBhZGQgYWxpYXMgJyR7YWxpYXN9JyB0byBjb21tYW5kICcke3RoaXMubmFtZSgpfScgYXMgYWxyZWFkeSBoYXZlIGNvbW1hbmQgJyR7ZXhpc3RpbmdDbWR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbW1hbmQuX2FsaWFzZXMucHVzaChhbGlhcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFsaWFzZXMgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBPbmx5IHRoZSBmaXJzdCBhbGlhcyBpcyBzaG93biBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsaWFzZXNdXG4gICAqIEByZXR1cm4geyhzdHJpbmdbXXxDb21tYW5kKX1cbiAgICovXG5cbiAgYWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgLy8gR2V0dGVyIGZvciB0aGUgYXJyYXkgb2YgYWxpYXNlcyBpcyB0aGUgbWFpbiByZWFzb24gZm9yIGhhdmluZyBhbGlhc2VzKCkgaW4gYWRkaXRpb24gdG8gYWxpYXMoKS5cbiAgICBpZiAoYWxpYXNlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fYWxpYXNlcztcblxuICAgIGFsaWFzZXMuZm9yRWFjaCgoYWxpYXMpID0+IHRoaXMuYWxpYXMoYWxpYXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgLyBnZXQgdGhlIGNvbW1hbmQgdXNhZ2UgYHN0cmAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICB1c2FnZShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLl91c2FnZSkgcmV0dXJuIHRoaXMuX3VzYWdlO1xuXG4gICAgICBjb25zdCBhcmdzID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLm1hcCgoYXJnKSA9PiB7XG4gICAgICAgIHJldHVybiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW11cbiAgICAgICAgLmNvbmNhdChcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubGVuZ3RoIHx8IHRoaXMuX2hlbHBPcHRpb24gIT09IG51bGwgPyAnW29wdGlvbnNdJyA6IFtdLFxuICAgICAgICAgIHRoaXMuY29tbWFuZHMubGVuZ3RoID8gJ1tjb21tYW5kXScgOiBbXSxcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoID8gYXJncyA6IFtdLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXNhZ2UgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuXG4gIG5hbWUoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB0aGlzLl9uYW1lID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCBmcm9tIHNjcmlwdCBmaWxlbmFtZSwgc3VjaCBhcyBwcm9jZXNzLmFyZ3ZbMV0sXG4gICAqIG9yIHJlcXVpcmUubWFpbi5maWxlbmFtZSwgb3IgX19maWxlbmFtZS5cbiAgICpcbiAgICogKFVzZWQgaW50ZXJuYWxseSBhbmQgcHVibGljIGFsdGhvdWdoIG5vdCBkb2N1bWVudGVkIGluIFJFQURNRS4pXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0ubmFtZUZyb21GaWxlbmFtZShyZXF1aXJlLm1haW4uZmlsZW5hbWUpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICogQHJldHVybiB7Q29tbWFuZH1cbiAgICovXG5cbiAgbmFtZUZyb21GaWxlbmFtZShmaWxlbmFtZSkge1xuICAgIHRoaXMuX25hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lLCBwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIGRpcmVjdG9yeSBmb3Igc2VhcmNoaW5nIGZvciBleGVjdXRhYmxlIHN1YmNvbW1hbmRzIG9mIHRoaXMgY29tbWFuZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5leGVjdXRhYmxlRGlyKF9fZGlybmFtZSk7XG4gICAqIC8vIG9yXG4gICAqIHByb2dyYW0uZXhlY3V0YWJsZURpcignc3ViY29tbWFuZHMnKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfG51bGx8Q29tbWFuZCl9XG4gICAqL1xuXG4gIGV4ZWN1dGFibGVEaXIocGF0aCkge1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9leGVjdXRhYmxlRGlyO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVEaXIgPSBwYXRoO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBwcm9ncmFtIGhlbHAgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH19IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cmFwIGZvciBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBoZWxwSW5mb3JtYXRpb24oY29udGV4dE9wdGlvbnMpIHtcbiAgICBjb25zdCBoZWxwZXIgPSB0aGlzLmNyZWF0ZUhlbHAoKTtcbiAgICBpZiAoaGVscGVyLmhlbHBXaWR0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWxwZXIuaGVscFdpZHRoID1cbiAgICAgICAgY29udGV4dE9wdGlvbnMgJiYgY29udGV4dE9wdGlvbnMuZXJyb3JcbiAgICAgICAgICA/IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24uZ2V0RXJySGVscFdpZHRoKClcbiAgICAgICAgICA6IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24uZ2V0T3V0SGVscFdpZHRoKCk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXIuZm9ybWF0SGVscCh0aGlzLCBoZWxwZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9nZXRIZWxwQ29udGV4dChjb250ZXh0T3B0aW9ucykge1xuICAgIGNvbnRleHRPcHRpb25zID0gY29udGV4dE9wdGlvbnMgfHwge307XG4gICAgY29uc3QgY29udGV4dCA9IHsgZXJyb3I6ICEhY29udGV4dE9wdGlvbnMuZXJyb3IgfTtcbiAgICBsZXQgd3JpdGU7XG4gICAgaWYgKGNvbnRleHQuZXJyb3IpIHtcbiAgICAgIHdyaXRlID0gKGFyZykgPT4gdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycihhcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3cml0ZSA9IChhcmcpID0+IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVPdXQoYXJnKTtcbiAgICB9XG4gICAgY29udGV4dC53cml0ZSA9IGNvbnRleHRPcHRpb25zLndyaXRlIHx8IHdyaXRlO1xuICAgIGNvbnRleHQuY29tbWFuZCA9IHRoaXM7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoaXMgY29tbWFuZC5cbiAgICpcbiAgICogT3V0cHV0cyBidWlsdC1pbiBoZWxwLCBhbmQgY3VzdG9tIHRleHQgYWRkZWQgdXNpbmcgYC5hZGRIZWxwVGV4dCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH0gfCBGdW5jdGlvbn0gW2NvbnRleHRPcHRpb25zXSAtIHBhc3Mge2Vycm9yOnRydWV9IHRvIHdyaXRlIHRvIHN0ZGVyciBpbnN0ZWFkIG9mIHN0ZG91dFxuICAgKi9cblxuICBvdXRwdXRIZWxwKGNvbnRleHRPcHRpb25zKSB7XG4gICAgbGV0IGRlcHJlY2F0ZWRDYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIGNvbnRleHRPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkZXByZWNhdGVkQ2FsbGJhY2sgPSBjb250ZXh0T3B0aW9ucztcbiAgICAgIGNvbnRleHRPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fZ2V0SGVscENvbnRleHQoY29udGV4dE9wdGlvbnMpO1xuXG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZm9yRWFjaCgoY29tbWFuZCkgPT4gY29tbWFuZC5lbWl0KCdiZWZvcmVBbGxIZWxwJywgY29udGV4dCkpO1xuICAgIHRoaXMuZW1pdCgnYmVmb3JlSGVscCcsIGNvbnRleHQpO1xuXG4gICAgbGV0IGhlbHBJbmZvcm1hdGlvbiA9IHRoaXMuaGVscEluZm9ybWF0aW9uKGNvbnRleHQpO1xuICAgIGlmIChkZXByZWNhdGVkQ2FsbGJhY2spIHtcbiAgICAgIGhlbHBJbmZvcm1hdGlvbiA9IGRlcHJlY2F0ZWRDYWxsYmFjayhoZWxwSW5mb3JtYXRpb24pO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgaGVscEluZm9ybWF0aW9uICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAhQnVmZmVyLmlzQnVmZmVyKGhlbHBJbmZvcm1hdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ291dHB1dEhlbHAgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSBzdHJpbmcgb3IgYSBCdWZmZXInKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29udGV4dC53cml0ZShoZWxwSW5mb3JtYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuX2dldEhlbHBPcHRpb24oKT8ubG9uZykge1xuICAgICAgdGhpcy5lbWl0KHRoaXMuX2dldEhlbHBPcHRpb24oKS5sb25nKTsgLy8gZGVwcmVjYXRlZFxuICAgIH1cbiAgICB0aGlzLmVtaXQoJ2FmdGVySGVscCcsIGNvbnRleHQpO1xuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKS5mb3JFYWNoKChjb21tYW5kKSA9PlxuICAgICAgY29tbWFuZC5lbWl0KCdhZnRlckFsbEhlbHAnLCBjb250ZXh0KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gcGFzcyBpbiBmbGFncyBhbmQgYSBkZXNjcmlwdGlvbiB0byBjdXN0b21pc2UgdGhlIGJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgKiBQYXNzIGluIGZhbHNlIHRvIGRpc2FibGUgdGhlIGJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLmhlbHBPcHRpb24oJy0/LCAtLWhlbHAnICdzaG93IGhlbHAnKTsgLy8gY3VzdG9taXNlXG4gICAqIHByb2dyYW0uaGVscE9wdGlvbihmYWxzZSk7IC8vIGRpc2FibGVcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgYm9vbGVhbil9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBoZWxwT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIC8vIFN1cHBvcnQgZGlzYWJsaW5nIGJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgIGlmICh0eXBlb2YgZmxhZ3MgPT09ICdib29sZWFuJykge1xuICAgICAgaWYgKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuX2hlbHBPcHRpb24gPSB0aGlzLl9oZWxwT3B0aW9uID8/IHVuZGVmaW5lZDsgLy8gcHJlc2VydmUgZXhpc3Rpbmcgb3B0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9oZWxwT3B0aW9uID0gbnVsbDsgLy8gZGlzYWJsZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9taXNlIGZsYWdzIGFuZCBkZXNjcmlwdGlvbi5cbiAgICBmbGFncyA9IGZsYWdzID8/ICctaCwgLS1oZWxwJztcbiAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID8/ICdkaXNwbGF5IGhlbHAgZm9yIGNvbW1hbmQnO1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSB0aGlzLmNyZWF0ZU9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGF6eSBjcmVhdGUgaGVscCBvcHRpb24uXG4gICAqIFJldHVybnMgbnVsbCBpZiBoYXMgYmVlbiBkaXNhYmxlZCB3aXRoIC5oZWxwT3B0aW9uKGZhbHNlKS5cbiAgICpcbiAgICogQHJldHVybnMgeyhPcHRpb24gfCBudWxsKX0gdGhlIGhlbHAgb3B0aW9uXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuICBfZ2V0SGVscE9wdGlvbigpIHtcbiAgICAvLyBMYXp5IGNyZWF0ZSBoZWxwIG9wdGlvbiBvbiBkZW1hbmQuXG4gICAgaWYgKHRoaXMuX2hlbHBPcHRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5oZWxwT3B0aW9uKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2hlbHBPcHRpb247XG4gIH1cblxuICAvKipcbiAgICogU3VwcGx5IHlvdXIgb3duIG9wdGlvbiB0byB1c2UgZm9yIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICogVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB1c2luZyBoZWxwT3B0aW9uKCkgdG8gY3VzdG9taXNlIHRoZSBmbGFncyBhbmQgZGVzY3JpcHRpb24gZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscE9wdGlvbihvcHRpb24pIHtcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gb3B0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGFuZCBleGl0LlxuICAgKlxuICAgKiBPdXRwdXRzIGJ1aWx0LWluIGhlbHAsIGFuZCBjdXN0b20gdGV4dCBhZGRlZCB1c2luZyBgLmFkZEhlbHBUZXh0KClgLlxuICAgKlxuICAgKiBAcGFyYW0ge3sgZXJyb3I6IGJvb2xlYW4gfX0gW2NvbnRleHRPcHRpb25zXSAtIHBhc3Mge2Vycm9yOnRydWV9IHRvIHdyaXRlIHRvIHN0ZGVyciBpbnN0ZWFkIG9mIHN0ZG91dFxuICAgKi9cblxuICBoZWxwKGNvbnRleHRPcHRpb25zKSB7XG4gICAgdGhpcy5vdXRwdXRIZWxwKGNvbnRleHRPcHRpb25zKTtcbiAgICBsZXQgZXhpdENvZGUgPSBwcm9jZXNzLmV4aXRDb2RlIHx8IDA7XG4gICAgaWYgKFxuICAgICAgZXhpdENvZGUgPT09IDAgJiZcbiAgICAgIGNvbnRleHRPcHRpb25zICYmXG4gICAgICB0eXBlb2YgY29udGV4dE9wdGlvbnMgIT09ICdmdW5jdGlvbicgJiZcbiAgICAgIGNvbnRleHRPcHRpb25zLmVycm9yXG4gICAgKSB7XG4gICAgICBleGl0Q29kZSA9IDE7XG4gICAgfVxuICAgIC8vIG1lc3NhZ2U6IGRvIG5vdCBoYXZlIGFsbCBkaXNwbGF5ZWQgdGV4dCBhdmFpbGFibGUgc28gb25seSBwYXNzaW5nIHBsYWNlaG9sZGVyLlxuICAgIHRoaXMuX2V4aXQoZXhpdENvZGUsICdjb21tYW5kZXIuaGVscCcsICcob3V0cHV0SGVscCknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWRkaXRpb25hbCB0ZXh0IHRvIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBidWlsdC1pbiBoZWxwLlxuICAgKlxuICAgKiBQb3NpdGlvbiBpcyAnYmVmb3JlJyBvciAnYWZ0ZXInIHRvIGFmZmVjdCBqdXN0IHRoaXMgY29tbWFuZCxcbiAgICogYW5kICdiZWZvcmVBbGwnIG9yICdhZnRlckFsbCcgdG8gYWZmZWN0IHRoaXMgY29tbWFuZCBhbmQgYWxsIGl0cyBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBvc2l0aW9uIC0gYmVmb3JlIG9yIGFmdGVyIGJ1aWx0LWluIGhlbHBcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgRnVuY3Rpb24pfSB0ZXh0IC0gc3RyaW5nIHRvIGFkZCwgb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBzdHJpbmdcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRIZWxwVGV4dChwb3NpdGlvbiwgdGV4dCkge1xuICAgIGNvbnN0IGFsbG93ZWRWYWx1ZXMgPSBbJ2JlZm9yZUFsbCcsICdiZWZvcmUnLCAnYWZ0ZXInLCAnYWZ0ZXJBbGwnXTtcbiAgICBpZiAoIWFsbG93ZWRWYWx1ZXMuaW5jbHVkZXMocG9zaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgZm9yIHBvc2l0aW9uIHRvIGFkZEhlbHBUZXh0LlxuRXhwZWN0aW5nIG9uZSBvZiAnJHthbGxvd2VkVmFsdWVzLmpvaW4oXCInLCAnXCIpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgaGVscEV2ZW50ID0gYCR7cG9zaXRpb259SGVscGA7XG4gICAgdGhpcy5vbihoZWxwRXZlbnQsIChjb250ZXh0KSA9PiB7XG4gICAgICBsZXQgaGVscFN0cjtcbiAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBoZWxwU3RyID0gdGV4dCh7IGVycm9yOiBjb250ZXh0LmVycm9yLCBjb21tYW5kOiBjb250ZXh0LmNvbW1hbmQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWxwU3RyID0gdGV4dDtcbiAgICAgIH1cbiAgICAgIC8vIElnbm9yZSBmYWxzeSB2YWx1ZSB3aGVuIG5vdGhpbmcgdG8gb3V0cHV0LlxuICAgICAgaWYgKGhlbHBTdHIpIHtcbiAgICAgICAgY29udGV4dC53cml0ZShgJHtoZWxwU3RyfVxcbmApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGlmIGhlbHAgZmxhZ3Mgc3BlY2lmaWVkXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBhcnJheSBvZiBvcHRpb25zIHRvIHNlYXJjaCBmb3IgaGVscCBmbGFnc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfb3V0cHV0SGVscElmUmVxdWVzdGVkKGFyZ3MpIHtcbiAgICBjb25zdCBoZWxwT3B0aW9uID0gdGhpcy5fZ2V0SGVscE9wdGlvbigpO1xuICAgIGNvbnN0IGhlbHBSZXF1ZXN0ZWQgPSBoZWxwT3B0aW9uICYmIGFyZ3MuZmluZCgoYXJnKSA9PiBoZWxwT3B0aW9uLmlzKGFyZykpO1xuICAgIGlmIChoZWxwUmVxdWVzdGVkKSB7XG4gICAgICB0aGlzLm91dHB1dEhlbHAoKTtcbiAgICAgIC8vIChEbyBub3QgaGF2ZSBhbGwgZGlzcGxheWVkIHRleHQgYXZhaWxhYmxlIHNvIG9ubHkgcGFzc2luZyBwbGFjZWhvbGRlci4pXG4gICAgICB0aGlzLl9leGl0KDAsICdjb21tYW5kZXIuaGVscERpc3BsYXllZCcsICcob3V0cHV0SGVscCknKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTY2FuIGFyZ3VtZW50cyBhbmQgaW5jcmVtZW50IHBvcnQgbnVtYmVyIGZvciBpbnNwZWN0IGNhbGxzICh0byBhdm9pZCBjb25mbGljdHMgd2hlbiBzcGF3bmluZyBuZXcgY29tbWFuZCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIGFycmF5IG9mIGFyZ3VtZW50cyBmcm9tIG5vZGUuZXhlY0FyZ3ZcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaW5jcmVtZW50Tm9kZUluc3BlY3RvclBvcnQoYXJncykge1xuICAvLyBUZXN0aW5nIGZvciB0aGVzZSBvcHRpb25zOlxuICAvLyAgLS1pbnNwZWN0Wz1baG9zdDpdcG9ydF1cbiAgLy8gIC0taW5zcGVjdC1icmtbPVtob3N0Ol1wb3J0XVxuICAvLyAgLS1pbnNwZWN0LXBvcnQ9W2hvc3Q6XXBvcnRcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICBpZiAoIWFyZy5zdGFydHNXaXRoKCctLWluc3BlY3QnKSkge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgbGV0IGRlYnVnT3B0aW9uO1xuICAgIGxldCBkZWJ1Z0hvc3QgPSAnMTI3LjAuMC4xJztcbiAgICBsZXQgZGVidWdQb3J0ID0gJzkyMjknO1xuICAgIGxldCBtYXRjaDtcbiAgICBpZiAoKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrKT8pJC8pKSAhPT0gbnVsbCkge1xuICAgICAgLy8gZS5nLiAtLWluc3BlY3RcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJya3wtcG9ydCk/KT0oW146XSspJC8pKSAhPT0gbnVsbFxuICAgICkge1xuICAgICAgZGVidWdPcHRpb24gPSBtYXRjaFsxXTtcbiAgICAgIGlmICgvXlxcZCskLy50ZXN0KG1hdGNoWzNdKSkge1xuICAgICAgICAvLyBlLmcuIC0taW5zcGVjdD0xMjM0XG4gICAgICAgIGRlYnVnUG9ydCA9IG1hdGNoWzNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9bG9jYWxob3N0XG4gICAgICAgIGRlYnVnSG9zdCA9IG1hdGNoWzNdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmt8LXBvcnQpPyk9KFteOl0rKTooXFxkKykkLykpICE9PSBudWxsXG4gICAgKSB7XG4gICAgICAvLyBlLmcuIC0taW5zcGVjdD1sb2NhbGhvc3Q6MTIzNFxuICAgICAgZGVidWdPcHRpb24gPSBtYXRjaFsxXTtcbiAgICAgIGRlYnVnSG9zdCA9IG1hdGNoWzNdO1xuICAgICAgZGVidWdQb3J0ID0gbWF0Y2hbNF07XG4gICAgfVxuXG4gICAgaWYgKGRlYnVnT3B0aW9uICYmIGRlYnVnUG9ydCAhPT0gJzAnKSB7XG4gICAgICByZXR1cm4gYCR7ZGVidWdPcHRpb259PSR7ZGVidWdIb3N0fToke3BhcnNlSW50KGRlYnVnUG9ydCkgKyAxfWA7XG4gICAgfVxuICAgIHJldHVybiBhcmc7XG4gIH0pO1xufVxuXG5leHBvcnRzLkNvbW1hbmQgPSBDb21tYW5kO1xuIiwKICAgICJjb25zdCB7IEFyZ3VtZW50IH0gPSByZXF1aXJlKCcuL2xpYi9hcmd1bWVudC5qcycpO1xuY29uc3QgeyBDb21tYW5kIH0gPSByZXF1aXJlKCcuL2xpYi9jb21tYW5kLmpzJyk7XG5jb25zdCB7IENvbW1hbmRlckVycm9yLCBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9saWIvZXJyb3IuanMnKTtcbmNvbnN0IHsgSGVscCB9ID0gcmVxdWlyZSgnLi9saWIvaGVscC5qcycpO1xuY29uc3QgeyBPcHRpb24gfSA9IHJlcXVpcmUoJy4vbGliL29wdGlvbi5qcycpO1xuXG5leHBvcnRzLnByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5leHBvcnRzLmNyZWF0ZUNvbW1hbmQgPSAobmFtZSkgPT4gbmV3IENvbW1hbmQobmFtZSk7XG5leHBvcnRzLmNyZWF0ZU9wdGlvbiA9IChmbGFncywgZGVzY3JpcHRpb24pID0+IG5ldyBPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbmV4cG9ydHMuY3JlYXRlQXJndW1lbnQgPSAobmFtZSwgZGVzY3JpcHRpb24pID0+IG5ldyBBcmd1bWVudChuYW1lLCBkZXNjcmlwdGlvbik7XG5cbi8qKlxuICogRXhwb3NlIGNsYXNzZXNcbiAqL1xuXG5leHBvcnRzLkNvbW1hbmQgPSBDb21tYW5kO1xuZXhwb3J0cy5PcHRpb24gPSBPcHRpb247XG5leHBvcnRzLkFyZ3VtZW50ID0gQXJndW1lbnQ7XG5leHBvcnRzLkhlbHAgPSBIZWxwO1xuXG5leHBvcnRzLkNvbW1hbmRlckVycm9yID0gQ29tbWFuZGVyRXJyb3I7XG5leHBvcnRzLkludmFsaWRBcmd1bWVudEVycm9yID0gSW52YWxpZEFyZ3VtZW50RXJyb3I7XG5leHBvcnRzLkludmFsaWRPcHRpb25Bcmd1bWVudEVycm9yID0gSW52YWxpZEFyZ3VtZW50RXJyb3I7IC8vIERlcHJlY2F0ZWRcbiIsCiAgICAiY29uc3QgcGF0aCA9IEJ1bi5lbnYuUEFUSDtcbmNvbnN0IGhvbWUgPSBCdW4uZW52LkhPTUU7XG5pZiAoIXBhdGgpIHRocm93IG5ldyBFcnJvcihcIuKdjCBQQVRIIGlzIG5vdCBzZXRcIik7XG5pZiAoIWhvbWUpIHRocm93IG5ldyBFcnJvcihcIuKdjCBIT01FIGlzIG5vdCBzZXRcIik7XG5jb25zdCBzcGxpdHRlZFBhdGggPSBwYXRoLnNwbGl0KFwiOlwiKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5wdWx1bWkvYmluYCk7XG5zcGxpdHRlZFBhdGgucHVzaChgJHtob21lfS8uZGVuby9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5idW4vYmluYCk7XG5zcGxpdHRlZFBhdGgucHVzaChgJHtob21lfS9nby9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5hcmthZGUvYmluYCk7XG5zcGxpdHRlZFBhdGgucHVzaChgJHtob21lfS8ua3Jldy9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5jYXJnby9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5kb3RuZXRgKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5kb3RuZXQvdG9vbHNgKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5nby9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9Ly5sb2NhbC9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9L2JpbmApO1xuc3BsaXR0ZWRQYXRoLnB1c2goYCR7aG9tZX0vc25hcC9iaW5gKTtcbnNwbGl0dGVkUGF0aC5wdXNoKGAke2hvbWV9L3Vzci9sb2NhbC9zYmluYCk7XG5zcGxpdHRlZFBhdGgucHVzaChgJHtob21lfS91c3Ivc2JpbmApO1xuc3BsaXR0ZWRQYXRoLnB1c2goYCR7aG9tZX0vc2JpbmApO1xuQnVuLmVudi5QQVRIID0gc3BsaXR0ZWRQYXRoLmpvaW4oXCI6XCIpO1xuIiwKICAgICJpbXBvcnQgY29tbWFuZGVyIGZyb20gJy4vaW5kZXguanMnO1xuXG4vLyB3cmFwcGVyIHRvIHByb3ZpZGUgbmFtZWQgZXhwb3J0cyBmb3IgRVNNLlxuZXhwb3J0IGNvbnN0IHtcbiAgcHJvZ3JhbSxcbiAgY3JlYXRlQ29tbWFuZCxcbiAgY3JlYXRlQXJndW1lbnQsXG4gIGNyZWF0ZU9wdGlvbixcbiAgQ29tbWFuZGVyRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciwgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICBDb21tYW5kLFxuICBBcmd1bWVudCxcbiAgT3B0aW9uLFxuICBIZWxwLFxufSA9IGNvbW1hbmRlcjtcbiIsCiAgICAiaW1wb3J0IHsgJCB9IGZyb20gXCJidW5cIjtcbmltcG9ydCB7IGNhblN1ZG8sIGlzUm9vdCB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHBrZ3MgfSBmcm9tIFwiLi9wa2dzXCI7XG5cbkJ1bi5lbnYuUEFUSCA9IFtcblx0QnVuLmVudi5QQVRIID8/IFwiXCIsXG5cdFwiL2hvbWUvbGludXhicmV3Ly5saW51eGJyZXcvYmluXCIsXG5cdFwiL2hvbWUvbGludXhicmV3Ly5saW51eGJyZXcvc2JpblwiLFxuXHRcIiRCVU5fSU5TVEFMTC9iaW5cIixcblx0XCIkSE9NRS9nby9iaW5cIixcblx0XCIkSE9NRS8uYXJrYWRlL2JpblwiLFxuXHRcIiR7S1JFV19ST09UOi0kSE9NRS8ua3Jld30vYmluXCIsXG5cdFwiJEhPTUUvLmNhcmdvL2JpblwiLFxuXHRcIiRIT01FLy5kb3RuZXRcIixcblx0XCIkSE9NRS8uZG90bmV0L3Rvb2xzXCIsXG5cdFwiJEhPTUUvLmdvL2JpblwiLFxuXHRcIiRIT01FLy5sb2NhbC9iaW5cIixcblx0XCIkSE9NRS9iaW5cIixcblx0XCIvc25hcC9iaW5cIixcblx0XCIvdXNyL2xvY2FsL3NiaW5cIixcblx0XCIvdXNyL3NiaW5cIixcblx0XCIvc2JpblwiLFxuXS5qb2luKFwiOlwiKTtcblxuY29uc3QgZG9jdG9yUm9vdCA9IGFzeW5jICgpID0+IHtcblx0aWYgKCEoYXdhaXQgaXNSb290KCkpKSBjb25zb2xlLmxvZyhcIuKchSBZb3UgYXJlIG5vdCByb290XCIpO1xuXHRlbHNlIHRocm93IG5ldyBFcnJvcihcIuKdjCBZb3UgYXJlIHJvb3RcIik7XG59O1xuXG5jb25zdCBkb2N0b3JTdWRvID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoYXdhaXQgY2FuU3VkbygpKSBjb25zb2xlLmxvZyhcIuKchSBZb3UgY2FuIHN1ZG9cIik7XG5cdGVsc2UgdGhyb3cgbmV3IEVycm9yKFwi4p2MIFlvdSBjYW5ub3Qgc3Vkb1wiKTtcbn07XG5cbmNvbnN0IGRvY3RvclBrZ3MgPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdHBrZ3MubWFwKGFzeW5jIChwa2cpID0+ICh7XG5cdFx0XHRuYW1lOiBwa2cubmFtZSxcblx0XHRcdGV4aXN0czogYXdhaXQgcGtnLmNoZWNrKCksXG5cdFx0XHRpbnN0YWxsOiBwa2cuaW5zdGFsbCxcblx0XHR9KSksXG5cdCkudGhlbigoeCkgPT4geC5maWx0ZXIoKHkpID0+ICF5LmV4aXN0cykpO1xuXHRpZiAoIXJlc3VsdC5sZW5ndGgpIHtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBBbGwgcGFja2FnZXMgYXJlIGluc3RhbGxlZFwiKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmxvZyhcIuKdjCBTb21lIHBhY2thZ2VzIGFyZSBub3QgaW5zdGFsbGVkXCIpO1xuXHRcdGNvbnNvbGUudGFibGUocmVzdWx0KTtcblx0XHRmb3IgKGNvbnN0IHIgb2YgcmVzdWx0KSB7XG5cdFx0XHRjb25zb2xlLmxvZyhg8J+VkiBJbnN0YWxsaW5nICR7ci5uYW1lfWApO1xuXHRcdFx0YXdhaXQgclxuXHRcdFx0XHQuaW5zdGFsbCgpXG5cdFx0XHRcdC50aGVuKCgpID0+IGNvbnNvbGUubG9nKGDinIUgSW5zdGFsbGVkICR7ci5uYW1lfWApKVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4gY29uc29sZS5sb2coYOKdjCBGYWlsZWQgdG8gaW5zdGFsbCAke3IubmFtZX1gKSk7XG5cdFx0fVxuXHR9XG59O1xuXG5jb25zdCBkb2N0b3JHaXRjb25maWcgPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGV4cGVjdGVkID0gYFt1c2VyXVxuICAgICAgICBlbWFpbCA9IGNoYXJsZXM2MzUwMEBnbWFpbC5jb21cbiAgICAgICAgbmFtZSA9IGNobmVhdVxuW3VybCBcInNzaDovL2dpdEBnaXRodWIuY29tL1wiXVxuICAgICAgICBpbnN0ZWFkT2YgPSBodHRwczovL2dpdGh1Yi5jb20vXG5bbWVyZ2VdXG4gICAgICAgIGZmID0gZmFsc2VcbltwdWxsXVxuICAgICAgICBmZiA9IHRydWVcbiAgICAgICAgcmViYXNlID0gdHJ1ZVxuW2NvcmVdXG4gICAgICAgIHdoaXRlc3BhY2UgPSBibGFuay1hdC1lb2wsYmxhbmstYXQtZW9mLHNwYWNlLWJlZm9yZS10YWIsY3ItYXQtZW9sXG5bZmV0Y2hdXG4gICAgICAgIHBydW5lID0gdHJ1ZVxuYDtcblx0Y29uc3QgZ2l0Y29uZmlnID0gYXdhaXQgQnVuLmZpbGUoYCR7QnVuLmVudi5IT01FfS8uZ2l0Y29uZmlnYClcblx0XHQudGV4dCgpXG5cdFx0LmNhdGNoKCgpID0+IFwiXCIpO1xuXHRpZiAoZ2l0Y29uZmlnID09PSBleHBlY3RlZCkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIEdpdCBjb25maWcgaXMgc2V0XCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnNvbGUubG9nKFwi4p2MIEdpdCBjb25maWcgaXMgbm90IHNldFwiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgU2V0dGluZyBnaXQgY29uZmlnXCIpO1xuXHRcdGF3YWl0IEJ1bi53cml0ZShgJHtCdW4uZW52LkhPTUV9Ly5naXRjb25maWdgLCBleHBlY3RlZCk7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgR2l0IGNvbmZpZyBpcyBzZXRcIik7XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvckRvdGZpbGVzID0gYXN5bmMgKCkgPT4ge1xuXHRjb25zdCBiYXNlRmlsZXMgPSBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jaG5lYXUvZG90ZmlsZXMvSEVBRC9cIjtcblx0Y29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRbXCIuYmFzaHJjXCIsIFwiLnpzaHJjXCIsIFwiLmFsaWFzZXNcIiwgXCIucHJvZmlsZVwiXS5tYXAoYXN5bmMgKHgpID0+ICh7XG5cdFx0XHRuYW1lOiB4LFxuXHRcdFx0Y29udGVudDogYXdhaXQgZmV0Y2goYCR7YmFzZUZpbGVzfSR7eH1gKS50aGVuKCh4KSA9PiB4LnRleHQoKSksXG5cdFx0XHRpc1ByZXNlbnQ6IGF3YWl0IEJ1bi5maWxlKGAke0J1bi5lbnYuSE9NRX0vJHt4fWApLmV4aXN0cygpLFxuXHRcdH0pKSxcblx0KTtcblx0aWYgKGV4cGVjdGVkLmV2ZXJ5KCh4KSA9PiB4LmlzUHJlc2VudCkpIHtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBEb3RmaWxlcyBhcmUgaW5zdGFsbGVkXCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnNvbGUubG9nKFwi4p2MIERvdGZpbGVzIGFyZSBub3QgaW5zdGFsbGVkXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwi8J+VkiBJbnN0YWxsaW5nIGRvdGZpbGVzXCIpO1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0ZXhwZWN0ZWQubWFwKGFzeW5jICh4KSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGDwn5WSIEluc3RhbGxpbmcgJHt4Lm5hbWV9YCk7XG5cdFx0XHRcdGF3YWl0IEJ1bi53cml0ZShgJHtCdW4uZW52LkhPTUV9LyR7eC5uYW1lfWAsIHguY29udGVudCk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGDinIUgSW5zdGFsbGVkICR7eC5uYW1lfWApO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBEb3RmaWxlcyBhcmUgaW5zdGFsbGVkXCIpO1xuXHR9XG59O1xuXG5jb25zdCBkb2N0b3JEb2NrZXIgPSBhc3luYyAoKSA9PiB7XG5cdGlmICghKGF3YWl0ICRgd2hpY2ggZG9ja2VyYC5ub3Rocm93KCkudGV4dCgpKS5pbmNsdWRlcyhcIm5vdCBmb3VuZFwiKSkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIERvY2tlciBpcyBpbnN0YWxsZWRcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgRG9ja2VyIGlzIG5vdCBpbnN0YWxsZWRcIik7XG5cdFx0Y29uc29sZS5sb2coXCLwn5WSIEluc3RhbGxpbmcgRG9ja2VyXCIpO1xuXHRcdGF3YWl0ICRgY3VybCAtc1NMIGdldC5kb2NrZXIuY29tIHwgc2hgO1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIERvY2tlciBpcyBpbnN0YWxsZWRcIik7XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvclVzZXJHcm91cHMgPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGdyb3VwcyA9IGF3YWl0ICRgZ3JvdXBzYC50ZXh0KCk7XG5cdGlmIChncm91cHMuaW5jbHVkZXMoXCJkb2NrZXJcIikpIHtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBVc2VyIGlzIGluIGRvY2tlciBncm91cHNcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgVXNlciBpcyBub3QgaW4gZG9ja2VyIGdyb3Vwc1wiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgQWRkaW5nIHVzZXIgdG8gZG9ja2VyIGdyb3Vwc1wiKTtcblx0XHRhd2FpdCAkYHN1ZG8gdXNlcm1vZCAtYUcgZG9ja2VyICRVU0VSYC5jYXRjaCgoKSA9PiB7fSk7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgVXNlciBpcyBpbiBkb2NrZXIgZ3JvdXBzXCIpO1xuXHR9XG59O1xuXG5jb25zdCBkb2N0b3JTc2ggPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IHNzaERpciA9IGAke0J1bi5lbnYuSE9NRX0vLnNzaC9pZF9yc2FgO1xuXHRpZiAoYXdhaXQgQnVuLmZpbGUoc3NoRGlyKS5leGlzdHMoKSkge1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIFNTSCBrZXkgaXMgc2V0XCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnNvbGUubG9nKFwi4p2MIFNTSCBrZXkgaXMgbm90IHNldFwiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgR2VuZXJhdGluZyBTU0gga2V5XCIpO1xuXHRcdGF3YWl0ICRgZWNobyB5ZXMgfCBzc2gta2V5Z2VuIC10IHJzYSAtYiA0MDk2IC1mIH4vLnNzaC9pZF9yc2EgLVAgXCJcImA7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgU1NIIGtleSBpcyBzZXRcIik7XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvckdpdGh1YiA9IGFzeW5jICgpID0+IHtcblx0aWYgKFxuXHRcdGF3YWl0ICRgc3NoIGdpdEBnaXRodWIuY29tIDI+JjFgXG5cdFx0XHQubm90aHJvdygpXG5cdFx0XHQudGV4dCgpXG5cdFx0XHQudGhlbigoeCkgPT4geC5pbmNsdWRlcyhcInN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkXCIpKVxuXHQpIHtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBTU0gga2V5IGlzIHNldCBvbiBHaXRIdWJcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgU1NIIGtleSBpcyBub3Qgc2V0IG9uIEdpdEh1YlwiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgQWRkaW5nIFNTSCBrZXkgdG8gR2l0SHViXCIpO1xuXHRcdGF3YWl0ICRgY2F0IH4vLnNzaC9pZF9yc2EucHViYDtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdFwi8J+VkiBHbyB0byBodHRwczovL2dpdGh1Yi5jb20vc2V0dGluZ3Mvc3NoL25ldyBhbmQgcGFzdCB0aGUgdGV4dCBhYm92ZVwiLFxuXHRcdCk7XG5cdH1cbn07XG5cbmNvbnN0IGRvY3RvclpzaCA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgZXRjU2hlbGxzID0gYXdhaXQgQnVuLmZpbGUoXCIvZXRjL3NoZWxsc1wiKVxuXHRcdC50ZXh0KClcblx0XHQudGhlbigoeCkgPT4geC5zcGxpdChcIlxcblwiKSk7XG5cdGNvbnN0IHdoaWNoWnNoID0gYXdhaXQgJGB3aGljaCB6c2hgLm5vdGhyb3coKS50ZXh0KCk7XG5cdGlmIChldGNTaGVsbHMuaW5jbHVkZXMod2hpY2hac2gpKSB7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgWnNoIGlzIHNldCBhcyBhIHZhbGlkIHNoZWxsXCIpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnNvbGUubG9nKFwi4p2MIFpzaCBpcyBub3Qgc2V0IGFzIGEgdmFsaWQgc2hlbGxcIik7XG5cdFx0Y29uc29sZS5sb2coXCLwn5WSIEFkZGluZyBac2ggdG8gL2V0Yy9zaGVsbHNcIik7XG5cdFx0YXdhaXQgJGBlY2hvICR7d2hpY2hac2h9IHwgc3VkbyB0ZWUgLWEgL2V0Yy9zaGVsbHNgO1xuXHRcdGNvbnNvbGUubG9nKFwi4pyFIFpzaCBpcyBzZXQgYXMgYSB2YWxpZCBzaGVsbFwiKTtcblx0fVxuXHRjb25zdCBldGNQYXNzd2RPZlVTZXIgPSBhd2FpdCAkYGNhdCAvZXRjL3Bhc3N3ZCB8IGdyZXAgXCJeJFVTRVI6XCJgLnRleHQoKTtcblx0aWYgKGV0Y1Bhc3N3ZE9mVVNlci5pbmNsdWRlcyh3aGljaFpzaCkpIHtcblx0XHRjb25zb2xlLmxvZyhcIuKchSBac2ggaXMgc2V0IGFzIHlvdXIgc2hlbGxcIik7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc29sZS5sb2coXCLinYwgWnNoIGlzIG5vdCBzZXQgYXMgeW91ciBzaGVsbFwiKTtcblx0XHRjb25zb2xlLmxvZyhcIvCflZIgU2V0dGluZyBac2ggYXMgeW91ciBzaGVsbFwiKTtcblx0XHRhd2FpdCAkYHN1ZG8gY2hzaCAtcyAke3doaWNoWnNofSAkVVNFUmA7XG5cdFx0Y29uc29sZS5sb2coXCLinIUgWnNoIGlzIHNldCBhcyB5b3VyIHNoZWxsXCIpO1xuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgY29tbWFuZERvY3RvciA9IGFzeW5jICgpID0+IHtcblx0YXdhaXQgUHJvbWlzZS5hbGwoW2RvY3RvclJvb3QoKSwgZG9jdG9yU3VkbygpXSk7XG5cdGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRkb2N0b3JEb3RmaWxlcygpLFxuXHRcdGRvY3RvclBrZ3MoKS50aGVuKCgpID0+XG5cdFx0XHRQcm9taXNlLmFsbChbXG5cdFx0XHRcdGRvY3RvckdpdGNvbmZpZygpLnRoZW4oZG9jdG9yU3NoKS50aGVuKGRvY3RvckdpdGh1YiksXG5cdFx0XHRcdGRvY3RvclpzaCgpLFxuXHRcdFx0XHRkb2N0b3JEb2NrZXIoKS50aGVuKGRvY3RvclVzZXJHcm91cHMpLFxuXHRcdFx0XSksXG5cdFx0KSxcblx0XSk7XG59O1xuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuXG5leHBvcnQgY29uc3QgY29tbWFuZEV4aXN0cyA9IGFzeW5jIChjbWQ6IHN0cmluZykgPT5cblx0KGF3YWl0ICRgd2hpY2ggJHtjbWR9YC50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIikpLnRyaW0oKSAhPT0gXCJcIjtcblxuZXhwb3J0IGNvbnN0IGlzUm9vdCA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgaWQgPSAoYXdhaXQgJGBpZCAtdWAudGV4dCgpKS50cmltKCk7XG5cdHJldHVybiBpZCA9PT0gXCIwXCI7XG59O1xuXG5leHBvcnQgY29uc3QgY2FuU3VkbyA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgdGV4dCA9IChhd2FpdCAkYHN1ZG8gZWNobyAwYC50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIikpLnRyaW0oKTtcblx0cmV0dXJuIHRleHQgPT09IFwiMFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRWZXJzaW9uID0gYXN5bmMgKCkgPT5cblx0YXdhaXQgQnVuLmZpbGUoYCR7aW1wb3J0Lm1ldGEuZGlyfS9wYWNrYWdlLmpzb25gKVxuXHRcdC5qc29uKClcblx0XHQudGhlbigoeCkgPT4geC52ZXJzaW9uIGFzIHN0cmluZylcblx0XHQuY2F0Y2goKCkgPT4gXCJVTktOT1dOXCIpO1xuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHsgY29tbWFuZEV4aXN0cyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxudHlwZSBQa2cgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0Y2hlY2s6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cdGluc3RhbGw6ICgpID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG5jb25zdCBhcHRJdCA9IChuYW1lOiBzdHJpbmcpID0+ICh7XG5cdG5hbWUsXG5cdGNoZWNrOiBhc3luYyAoKSA9PiBjb21tYW5kRXhpc3RzKG5hbWUpLFxuXHRpbnN0YWxsOiBhc3luYyAoKSA9PiBhd2FpdCAkYHN1ZG8gYXB0IGluc3RhbGwgLXkgJHtuYW1lfWAsXG59KTtcblxuY29uc3QgYXB0UGtnczogUGtnW10gPSBbXG5cdGFwdEl0KFwiZ2l0XCIpLFxuXHRhcHRJdChcImN1cmxcIiksXG5cdGFwdEl0KFwid2dldFwiKSxcblx0YXB0SXQoXCJ1bnppcFwiKSxcblx0YXB0SXQoXCJiYXNoXCIpLFxuXTtcblxuY29uc3QgYnJld0l0ID0gKG5hbWU6IHN0cmluZykgPT4gKHtcblx0bmFtZSxcblx0Y2hlY2s6IGFzeW5jICgpID0+IGNvbW1hbmRFeGlzdHMobmFtZSksXG5cdGluc3RhbGw6IGFzeW5jICgpID0+IGF3YWl0ICRgYnJldyBpbnN0YWxsICR7bmFtZX1gLFxufSk7XG5cbmNvbnN0IGJyZXdQa2dzOiBQa2dbXSA9IFtcblx0YnJld0l0KFwiYnB5dG9wXCIpLFxuXHRicmV3SXQoXCJkb2NrZXItY29tcG9zZVwiKSxcblx0YnJld0l0KFwiZ29cIiksXG5cdGJyZXdJdChcImhlbG1cIiksXG5cdGJyZXdJdChcImh5cGVyZmluZVwiKSxcblx0YnJld0l0KFwia3ViZWNvbG9yXCIpLFxuXHRicmV3SXQoXCJrdWJlY3R4XCIpLFxuXHR7XG5cdFx0Li4uYnJld0l0KFwia3ViZXJuZXRlcy1jbGlcIiksXG5cdFx0Y2hlY2s6IGFzeW5jICgpID0+IGNvbW1hbmRFeGlzdHMoXCJrdWJlY3RsXCIpLFxuXHR9LFxuXHRicmV3SXQoXCJsYXp5Z2l0XCIpLFxuXHRicmV3SXQoXCJub2RlXCIpLFxuXHRicmV3SXQoXCJwaXB4XCIpLFxuXHRicmV3SXQoXCJ6c2hcIiksXG5dO1xuXG5jb25zdCBidW5JdCA9IChuYW1lOiBzdHJpbmcpID0+ICh7XG5cdG5hbWUsXG5cdGNoZWNrOiBhc3luYyAoKSA9PiBjb21tYW5kRXhpc3RzKG5hbWUpLFxuXHRpbnN0YWxsOiBhc3luYyAoKSA9PiBhd2FpdCAkYGJ1biBpbnN0YWxsIC0tZm9yY2UgLS1nbG9iYWwgJHtuYW1lfWAsXG59KTtcblxuY29uc3QgYnVuUGtnczogUGtnW10gPSBbXG5cdHtcblx0XHQuLi5idW5JdChcImJpb21lXCIpLFxuXHRcdGluc3RhbGw6IGFzeW5jICgpID0+IGF3YWl0ICRgYnVuIGluc3RhbGwgLS1mb3JjZSAtLWdsb2JhbCBAYmlvbWVqcy9iaW9tZWAsXG5cdH0sXG5cdGJ1bkl0KFwiaHR0cC1zZXJ2ZXJcIiksXG5cdGJ1bkl0KFwibGl2ZS1zZXJ2ZXJcIiksXG5cdHtcblx0XHQuLi5idW5JdChcImZraWxsXCIpLFxuXHRcdGluc3RhbGw6IGFzeW5jICgpID0+IGF3YWl0ICRgYnVuIGluc3RhbGwgLS1mb3JjZSAtLWdsb2JhbCBma2lsbC1jbGlgLFxuXHR9LFxuXHRidW5JdChcInVuZ2l0XCIpLFxuXHRidW5JdChcIm5wbS1jaGVja1wiKSxcblx0YnVuSXQoXCJ0c3hcIiksXG5cdGJ1bkl0KFwibnBtLWNoZWNrLXVwZGF0ZXNcIiksXG5cdGJ1bkl0KFwibm9kZW1vblwiKSxcblx0YnVuSXQoXCJwcmV0dGllclwiKSxcblx0YnVuSXQoXCJ0eXBlc3luY1wiKSxcblx0YnVuSXQoXCJkZXBjaGVja1wiKSxcblx0YnVuSXQoXCJjb25jdXJyZW50bHlcIiksXG5cdGJ1bkl0KFwidHMtdW51c2VkLWV4cG9ydHNcIiksXG5dO1xuZXhwb3J0IGNvbnN0IHBrZ3M6IFBrZ1tdID0gW1xuXHQuLi5hcHRQa2dzLFxuXHR7XG5cdFx0bmFtZTogXCJicmV3XCIsXG5cdFx0Y2hlY2s6IGFzeW5jICgpID0+IGNvbW1hbmRFeGlzdHMoXCJicmV3XCIpLFxuXHRcdGluc3RhbGw6IGFzeW5jICgpID0+XG5cdFx0XHRhd2FpdCAkYEhPTUU9L3RtcCBDST0xIGJhc2ggLWMgXCIkKGN1cmwgLWZzU0wgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0hvbWVicmV3L2luc3RhbGwvSEVBRC9pbnN0YWxsLnNoKVwiYCxcblx0fSxcblx0Li4uYnJld1BrZ3MsXG5cdC4uLmJ1blBrZ3MsXG5dO1xuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHsgY2FuU3VkbywgY29tbWFuZEV4aXN0cywgaXNSb290IH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5jb25zdCB1cGRhdGVEb3RmaWxlcyA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgaW5pdFNjcmlwdCA9IGF3YWl0IGZldGNoKFxuXHRcdFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NobmVhdS9kb3RmaWxlcy9tYXN0ZXIvYm9vdHN0cmFwLnNoXCIsXG5cdCkudGhlbigoeCkgPT4geC50ZXh0KCkpO1xuXHRhd2FpdCAkYGVjaG8gJHtpbml0U2NyaXB0fSB8IHNoYDtcbn07XG5cbmNvbnN0IHVwZGF0ZUJ1biA9IGFzeW5jICgpID0+IHtcblx0Y29uc3QgYnVuUGtncyA9IFtcblx0XHRcIkBiaW9tZWpzL2Jpb21lXCIsXG5cdFx0XCJodHRwLXNlcnZlclwiLFxuXHRcdFwibGl2ZS1zZXJ2ZXJcIixcblx0XHRcImZraWxsLWNsaVwiLFxuXHRcdFwidW5naXRcIixcblx0XHRcIm5wbS1jaGVja1wiLFxuXHRcdFwidHN4XCIsXG5cdFx0XCJucG0tY2hlY2stdXBkYXRlc1wiLFxuXHRcdFwibm9kZW1vblwiLFxuXHRcdFwicHJldHRpZXJcIixcblx0XHRcInR5cGVzeW5jXCIsXG5cdFx0XCJkZXBjaGVja1wiLFxuXHRcdFwiY29uY3VycmVudGx5XCIsXG5cdFx0XCJ0cy11bnVzZWQtZXhwb3J0c1wiLFxuXHRdO1xuXHRhd2FpdCAkYGJ1biB1cGdyYWRlYDtcblx0YXdhaXQgJGBidW4gaW5zdGFsbCAtLWZvcmNlIC0tZ2xvYmFsICR7eyByYXc6IGJ1blBrZ3Muam9pbihcIiBcIikgfX1gO1xuXHRhd2FpdCAkYGJ1biB1cGRhdGUgLS1sYXRlc3QgLS1mb3JjZSAtLWdsb2JhbGA7XG59O1xuXG5jb25zdCB1cGRhdGVBcHQgPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGVzc2VudGlhbFBrZ3MgPSBbXCJnaXRcIiwgXCJjdXJsXCIsIFwid2dldFwiLCBcInVuemlwXCIsIFwienNoXCIsIFwiYmFzaFwiXTtcblx0YXdhaXQgJGBzdWRvIGFwdCBpbnN0YWxsIC15ICR7eyByYXc6IGVzc2VudGlhbFBrZ3Muam9pbihcIiBcIikgfX1gO1xuXHRhd2FpdCAkYHN1ZG8gYXB0IHVwZGF0ZSAteWA7XG5cdGF3YWl0ICRgc3VkbyBhcHQgdXBncmFkZSAteWA7XG5cdGF3YWl0ICRgc3VkbyBhcHQgYXV0b3JlbW92ZSAteWA7XG5cdGF3YWl0ICRgc3VkbyBhcHQgYXV0b2NsZWFuIC15YDtcbn07XG5cbmNvbnN0IHVwZGF0ZUJyZXcgPSBhc3luYyAoKSA9PiB7XG5cdGlmICghKGF3YWl0IGNvbW1hbmRFeGlzdHMoXCJicmV3XCIpKSlcblx0XHRhd2FpdCAkYENJPTEgYmFzaCAtYyBcIiQoY3VybCAtZnNTTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSG9tZWJyZXcvaW5zdGFsbC9IRUFEL2luc3RhbGwuc2gpXCJgO1xuXHRjb25zdCBlc3NlbnRpYWxQa2dzID0gW1xuXHRcdFwiYnB5dG9wXCIsXG5cdFx0XCJkaXZlXCIsXG5cdFx0XCJkbGRhc2gvY29yZS9kb2NrZXItY29sb3Itb3V0cHV0XCIsXG5cdFx0XCJkb2NrZXItY29tcG9zZVwiLFxuXHRcdFwiZ29cIixcblx0XHRcImhlbG1cIixcblx0XHRcImh5cGVyZmluZVwiLFxuXHRcdFwia3ViZWNvbG9yXCIsXG5cdFx0XCJrdWJlY3R4XCIsXG5cdFx0XCJrdWJlcm5ldGVzLWNsaVwiLFxuXHRcdFwibGF6eWdpdFwiLFxuXHRcdFwibm9kZVwiLFxuXHRcdFwicGlweFwiLFxuXHRcdFwienNoXCIsXG5cdF07XG5cdGNvbnN0IGJyZXcgPVxuXHRcdChhd2FpdCAkYHdoaWNoIGJyZXdgLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKSkudHJpbSgpIHx8XG5cdFx0XCIvaG9tZS9saW51eGJyZXcvLmxpbnV4YnJldy9iaW4vYnJld1wiO1xuXHRhd2FpdCAkYCR7YnJld30gaW5zdGFsbCAke3sgcmF3OiBlc3NlbnRpYWxQa2dzLmpvaW4oXCIgXCIpIH19YDtcblx0YXdhaXQgJGAke2JyZXd9IHVwZGF0ZWA7XG5cdGF3YWl0ICRgJHticmV3fSB1cGdyYWRlYDtcblx0YXdhaXQgJGAke2JyZXd9IGNsZWFudXBgO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbW1hbmRTeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG5cdGlmIChhd2FpdCBpc1Jvb3QoKSkgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbm5vdCBydW4gdGhpcyBjb21tYW5kIGFzIHJvb3RcIik7XG5cdGlmICghKGF3YWl0IGNhblN1ZG8oKSkpIHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3Qgc3Vkb1wiKTtcblx0YXdhaXQgdXBkYXRlRG90ZmlsZXMoKTtcblx0YXdhaXQgdXBkYXRlQXB0KCk7XG5cdGF3YWl0IHVwZGF0ZUJ1bigpO1xuXHRhd2FpdCB1cGRhdGVCcmV3KCk7XG5cdGNvbnNvbGUubG9nKFwiU3lzdGVtIHVwZGF0ZWRcIik7XG59O1xuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHsgZmV0Y2hMYXRlc3RWZXJzaW9uIH0gZnJvbSBcIi4vZmV0Y2hMYXRlc3RWZXJzaW9uXCI7XG5pbXBvcnQgeyBnZXRDdXJyZW50VmVyc2lvbiB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNvbnN0IGNvbW1hbmRVcGRhdGUgPSBhc3luYyAoKSA9PiB7XG5cdGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCBmZXRjaExhdGVzdFZlcnNpb24oKTtcblx0Y29uc3QgY3VycmVudFZlcnNpb24gPSBhd2FpdCBnZXRDdXJyZW50VmVyc2lvbigpO1xuXHRpZiAobGF0ZXN0VmVyc2lvbiA9PT0gY3VycmVudFZlcnNpb24pIHtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGDinIUgWW91IGFyZSBhbHJlYWR5IHVzaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiAke2N1cnJlbnRWZXJzaW9ufWAsXG5cdFx0KTtcblx0XHRyZXR1cm47XG5cdH1cblx0d2hpbGUgKHRydWUpIHtcblx0XHRjb25zb2xlLmxvZyhg8J+VkiBVcGRhdGluZyB0byB2ZXJzaW9uICR7bGF0ZXN0VmVyc2lvbn1gKTtcblx0XHRjb25zdCBpbnN0YWxsZWQgPSBhd2FpdCAkYGJ1biBpIC1mZyBAY2huZWF1L3hAJHtsYXRlc3RWZXJzaW9ufWBcblx0XHRcdC5xdWlldCgpXG5cdFx0XHQudGhlbigoKSA9PiB0cnVlKVxuXHRcdFx0LmNhdGNoKCgpID0+IGZhbHNlKTtcblx0XHRpZiAoaW5zdGFsbGVkKSBicmVhaztcblx0XHRhd2FpdCBCdW4uc2xlZXAoMTAwMCk7XG5cdH1cblx0Y29uc29sZS5sb2coYOKchSBVcGRhdGVkIHRvIHZlcnNpb24gJHtsYXRlc3RWZXJzaW9ufWApO1xufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IGZldGNoTGF0ZXN0VmVyc2lvbiA9IGFzeW5jICgpID0+XG5cdGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGNobmVhdS94L2xhdGVzdFwiKVxuXHRcdC50aGVuKCh4KSA9PiB4Lmpzb24oKS50aGVuKCh4KSA9PiB4LnZlcnNpb24gYXMgc3RyaW5nKSlcblx0XHQuY2F0Y2goKCkgPT4gXCJVTktOT1dOXCIpO1xuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cbmltcG9ydCBcIi4vZml4UGF0aFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IGNvbW1hbmREb2N0b3IgfSBmcm9tIFwiLi9jb21tYW5kRG9jdG9yXCI7XG5pbXBvcnQgeyBjb21tYW5kU3lzdGVtIH0gZnJvbSBcIi4vY29tbWFuZFN5c3RlbVwiO1xuaW1wb3J0IHsgY29tbWFuZFVwZGF0ZSB9IGZyb20gXCIuL2NvbW1hbmRVcGRhdGVcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRWZXJzaW9uIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldEN1cnJlbnRWZXJzaW9uKCk7XG5cbnByb2dyYW0ubmFtZShcInhcIikuZGVzY3JpcHRpb24oXCJjaG5lYXUncyB1dGlsaXR5IENMSVwiKS52ZXJzaW9uKHZlcnNpb24pO1xuXG5wcm9ncmFtXG5cdC5jb21tYW5kKFwidXBkYXRlXCIpXG5cdC5kZXNjcmlwdGlvbihcIlVwZGF0ZSB4IHRvIHRoZSBsYXRlc3QgdmVyc2lvblwiKVxuXHQuYWN0aW9uKGNvbW1hbmRVcGRhdGUpO1xuXG5wcm9ncmFtXG5cdC5jb21tYW5kKFwic3lzdGVtXCIpXG5cdC5kZXNjcmlwdGlvbihcIlVwZGF0ZS9pbnN0YWxsIHRoZSBzeXN0ZW0gcGFja2FnZXNcIilcblx0LmFjdGlvbihjb21tYW5kU3lzdGVtKTtcblxucHJvZ3JhbVxuXHQuY29tbWFuZChcImRvY3RvclwiKVxuXHQuZGVzY3JpcHRpb24oXCJDaGVjayB0aGUgc3lzdGVtIGZvciBpc3N1ZXNcIilcblx0LmFjdGlvbihjb21tYW5kRG9jdG9yKTtcblxucHJvZ3JhbS5wYXJzZSgpO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLFFBQU0sdUJBQXVCLE1BQU07QUFBQSxJQU9qQyxXQUFXLENBQUMsVUFBVSxNQUFNLFNBQVM7QUFDbkMsWUFBTSxPQUFPO0FBRWIsWUFBTSxrQkFBa0IsTUFBTSxLQUFLLFdBQVc7QUFDOUMsV0FBSyxPQUFPLEtBQUssWUFBWTtBQUM3QixXQUFLLE9BQU87QUFDWixXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBQUE7QUFBQSxFQUV2QjtBQUtBO0FBQUEsUUFBTSw2QkFBNkIsZUFBZTtBQUFBLElBS2hELFdBQVcsQ0FBQyxTQUFTO0FBQ25CLFlBQU0sR0FBRyw2QkFBNkIsT0FBTztBQUU3QyxZQUFNLGtCQUFrQixNQUFNLEtBQUssV0FBVztBQUM5QyxXQUFLLE9BQU8sS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUVqQztBQUVBLEVBQVEseUJBQWlCO0FBQ3pCLEVBQVEsK0JBQXVCO0FBQUE7Ozs7QUN1Ry9CLFdBQVMsb0JBQW9CLENBQUMsS0FBSztBQUNqQyxVQUFNLGFBQWEsSUFBSSxLQUFLLEtBQUssSUFBSSxhQUFhLE9BQU8sUUFBUTtBQUVqRSxXQUFPLElBQUksV0FBVyxNQUFNLGFBQWEsTUFBTSxNQUFNLGFBQWE7QUFBQTtBQWhKcEUsUUFBUTtBQUVSO0FBQUEsUUFBTSxTQUFTO0FBQUEsSUFVYixXQUFXLENBQUMs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QUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Q7QUFDQSxRQUFNLFFBQ0osTUFBTSxlQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sRUFBRSxHQUFHLEtBQUssS0FDbEQ7QUFDRCxRQUFNLEtBQUksZ0JBQWdCLEVBQUUsS0FBSyxjQUFjLEtBQUssR0FBRyxFQUFFO0FBQ3pELFFBQU0sS0FBSTtBQUNWLFFBQU0sS0FBSTtBQUNWLFFBQU0sS0FBSTtBQUFBO0FBR0osSUFBTSxnQkFBZ0IsWUFBWTtBQUN4QyxNQUFJLE1BQU0sT0FBTztBQUFHLFVBQU0sSUFBSSxNQUFNLHFDQUFxQztBQUN6RSxPQUFNLE1BQU0sUUFBUTtBQUFJLFVBQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUN6RCxRQUFNLGVBQWU7QUFDckIsUUFBTSxVQUFVO0FBQ2hCLFFBQU0sVUFBVTtBQUNoQixRQUFNLFdBQVc7QUFDakIsVUFBUSxJQUFJLGdCQUFnQjtBQUFBOzs7QUM1RTdCOzs7QUNBTyxJQUFNLHFCQUFxQixZQUNqQyxNQUFNLE1BQU0sNkNBQTZDLEVBQ3ZELEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFNLEdBQUUsT0FBaUIsQ0FBQyxFQUNyRCxNQUFNLE1BQU0sU0FBUzs7O0FEQ2pCLElBQU0sZ0JBQWdCLFlBQVk7QUFDeEMsUUFBTSxnQkFBZ0IsTUFBTSxtQkFBbUI7QUFDL0MsUUFBTSxpQkFBaUIsTUFBTSxrQkFBa0I7QUFDL0MsTUFBSSxrQkFBa0IsZ0JBQWdCO0FBQ3JDLFlBQVEsSUFDUCxtREFBNkMsZ0JBQzlDO0FBQ0E7QUFBQSxFQUNEO0FBQ0EsU0FBTyxNQUFNO0FBQ1osWUFBUSxJQUFJLG9DQUF5QixlQUFlO0FBQ3BELFVBQU0sWUFBWSxNQUFNLHlCQUF3QixnQkFDOUMsTUFBTSxFQUNOLEtBQUssTUFBTSxJQUFJLEVBQ2YsTUFBTSxNQUFNLEtBQUs7QUFDbkIsUUFBSTtBQUFXO0FBQ2YsVUFBTSxJQUFJLE1BQU0sSUFBSTtBQUFBLEVBQ3JCO0FBQ0EsVUFBUSxJQUFJLDZCQUF1QixlQUFlO0FBQUE7OztBRWRuRCxJQUFNLFdBQVUsSUFBSTtBQUVwQixJQUFNLFVBQVUsTUFBTSxrQkFBa0I7QUFFeEMsU0FBUSxLQUFLLEdBQUcsRUFBRSxZQUFZLHNCQUFzQixFQUFFLFFBQVEsT0FBTztBQUVyRSxTQUNFLFFBQVEsUUFBUSxFQUNoQixZQUFZLGdDQUFnQyxFQUM1QyxPQUFPLGFBQWE7QUFFdEIsU0FDRSxRQUFRLFFBQVEsRUFDaEIsWUFBWSxvQ0FBb0MsRUFDaEQsT0FBTyxhQUFhO0FBRXRCLFNBQ0UsUUFBUSxRQUFRLEVBQ2hCLFlBQVksNkJBQTZCLEVBQ3pDLE9BQU8sYUFBYTtBQUV0QixTQUFRLE1BQU07IiwKICAiZGVidWdJZCI6ICJGNDk0MjdFRUIyQ0VDMjE5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|