48027 lines
3.6 MiB

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/adm-zip/util/fileSystem.js
var require_fileSystem = __commonJS({
"node_modules/adm-zip/util/fileSystem.js"(exports) {
exports.require = function() {
if (typeof process === "object" && process.versions && process.versions["electron"]) {
try {
const originalFs = require("original-fs");
if (Object.keys(originalFs).length > 0) {
return originalFs;
}
} catch (e) {
}
}
return require("fs");
};
}
});
// node_modules/adm-zip/util/constants.js
var require_constants = __commonJS({
"node_modules/adm-zip/util/constants.js"(exports, module2) {
module2.exports = {
LOCHDR: 30,
LOCSIG: 67324752,
LOCVER: 4,
LOCFLG: 6,
LOCHOW: 8,
LOCTIM: 10,
LOCCRC: 14,
LOCSIZ: 18,
LOCLEN: 22,
LOCNAM: 26,
LOCEXT: 28,
EXTSIG: 134695760,
EXTHDR: 16,
EXTCRC: 4,
EXTSIZ: 8,
EXTLEN: 12,
CENHDR: 46,
CENSIG: 33639248,
CENVEM: 4,
CENVER: 6,
CENFLG: 8,
CENHOW: 10,
CENTIM: 12,
CENCRC: 16,
CENSIZ: 20,
CENLEN: 24,
CENNAM: 28,
CENEXT: 30,
CENCOM: 32,
CENDSK: 34,
CENATT: 36,
CENATX: 38,
CENOFF: 42,
ENDHDR: 22,
ENDSIG: 101010256,
ENDSUB: 8,
ENDTOT: 10,
ENDSIZ: 12,
ENDOFF: 16,
ENDCOM: 20,
END64HDR: 20,
END64SIG: 117853008,
END64START: 4,
END64OFF: 8,
END64NUMDISKS: 16,
ZIP64SIG: 101075792,
ZIP64HDR: 56,
ZIP64LEAD: 12,
ZIP64SIZE: 4,
ZIP64VEM: 12,
ZIP64VER: 14,
ZIP64DSK: 16,
ZIP64DSKDIR: 20,
ZIP64SUB: 24,
ZIP64TOT: 32,
ZIP64SIZB: 40,
ZIP64OFF: 48,
ZIP64EXTRA: 56,
STORED: 0,
SHRUNK: 1,
REDUCED1: 2,
REDUCED2: 3,
REDUCED3: 4,
REDUCED4: 5,
IMPLODED: 6,
DEFLATED: 8,
ENHANCED_DEFLATED: 9,
PKWARE: 10,
BZIP2: 12,
LZMA: 14,
IBM_TERSE: 18,
IBM_LZ77: 19,
AES_ENCRYPT: 99,
FLG_ENC: 1,
FLG_COMP1: 2,
FLG_COMP2: 4,
FLG_DESC: 8,
FLG_ENH: 16,
FLG_PATCH: 32,
FLG_STR: 64,
FLG_EFS: 2048,
FLG_MSK: 4096,
FILE: 2,
BUFFER: 1,
NONE: 0,
EF_ID: 0,
EF_SIZE: 2,
ID_ZIP64: 1,
ID_AVINFO: 7,
ID_PFS: 8,
ID_OS2: 9,
ID_NTFS: 10,
ID_OPENVMS: 12,
ID_UNIX: 13,
ID_FORK: 14,
ID_PATCH: 15,
ID_X509_PKCS7: 20,
ID_X509_CERTID_F: 21,
ID_X509_CERTID_C: 22,
ID_STRONGENC: 23,
ID_RECORD_MGT: 24,
ID_X509_PKCS7_RL: 25,
ID_IBM1: 101,
ID_IBM2: 102,
ID_POSZIP: 18064,
EF_ZIP64_OR_32: 4294967295,
EF_ZIP64_OR_16: 65535,
EF_ZIP64_SUNCOMP: 0,
EF_ZIP64_SCOMP: 8,
EF_ZIP64_RHO: 16,
EF_ZIP64_DSN: 24
};
}
});
// node_modules/adm-zip/util/utils.js
var require_utils = __commonJS({
"node_modules/adm-zip/util/utils.js"(exports, module2) {
var fsystem = require_fileSystem().require();
var pth = require("path");
var Constants = require_constants();
var isWin = typeof process === "object" && process.platform === "win32";
var is_Obj = (obj) => obj && typeof obj === "object";
var crcTable = new Uint32Array(256).map((t, c) => {
for (let k = 0; k < 8; k++) {
if ((c & 1) !== 0) {
c = 3988292384 ^ c >>> 1;
} else {
c >>>= 1;
}
}
return c >>> 0;
});
function Utils2(opts) {
this.sep = pth.sep;
this.fs = fsystem;
if (is_Obj(opts)) {
if (is_Obj(opts.fs) && typeof opts.fs.statSync === "function") {
this.fs = opts.fs;
}
}
}
module2.exports = Utils2;
Utils2.prototype.makeDir = function(folder) {
const self2 = this;
function mkdirSync2(fpath) {
let resolvedPath = fpath.split(self2.sep)[0];
fpath.split(self2.sep).forEach(function(name) {
if (!name || name.substr(-1, 1) === ":")
return;
resolvedPath += self2.sep + name;
var stat;
try {
stat = self2.fs.statSync(resolvedPath);
} catch (e) {
self2.fs.mkdirSync(resolvedPath);
}
if (stat && stat.isFile())
throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath);
});
}
mkdirSync2(folder);
};
Utils2.prototype.writeFileTo = function(path3, content, overwrite, attr) {
const self2 = this;
if (self2.fs.existsSync(path3)) {
if (!overwrite)
return false;
var stat = self2.fs.statSync(path3);
if (stat.isDirectory()) {
return false;
}
}
var folder = pth.dirname(path3);
if (!self2.fs.existsSync(folder)) {
self2.makeDir(folder);
}
var fd;
try {
fd = self2.fs.openSync(path3, "w", 438);
} catch (e) {
self2.fs.chmodSync(path3, 438);
fd = self2.fs.openSync(path3, "w", 438);
}
if (fd) {
try {
self2.fs.writeSync(fd, content, 0, content.length, 0);
} finally {
self2.fs.closeSync(fd);
}
}
self2.fs.chmodSync(path3, attr || 438);
return true;
};
Utils2.prototype.writeFileToAsync = function(path3, content, overwrite, attr, callback) {
if (typeof attr === "function") {
callback = attr;
attr = void 0;
}
const self2 = this;
self2.fs.exists(path3, function(exist) {
if (exist && !overwrite)
return callback(false);
self2.fs.stat(path3, function(err, stat) {
if (exist && stat.isDirectory()) {
return callback(false);
}
var folder = pth.dirname(path3);
self2.fs.exists(folder, function(exists) {
if (!exists)
self2.makeDir(folder);
self2.fs.open(path3, "w", 438, function(err2, fd) {
if (err2) {
self2.fs.chmod(path3, 438, function() {
self2.fs.open(path3, "w", 438, function(err3, fd2) {
self2.fs.write(fd2, content, 0, content.length, 0, function() {
self2.fs.close(fd2, function() {
self2.fs.chmod(path3, attr || 438, function() {
callback(true);
});
});
});
});
});
} else if (fd) {
self2.fs.write(fd, content, 0, content.length, 0, function() {
self2.fs.close(fd, function() {
self2.fs.chmod(path3, attr || 438, function() {
callback(true);
});
});
});
} else {
self2.fs.chmod(path3, attr || 438, function() {
callback(true);
});
}
});
});
});
});
};
Utils2.prototype.findFiles = function(path3) {
const self2 = this;
function findSync(dir, pattern, recursive) {
if (typeof pattern === "boolean") {
recursive = pattern;
pattern = void 0;
}
let files = [];
self2.fs.readdirSync(dir).forEach(function(file) {
var path4 = pth.join(dir, file);
if (self2.fs.statSync(path4).isDirectory() && recursive)
files = files.concat(findSync(path4, pattern, recursive));
if (!pattern || pattern.test(path4)) {
files.push(pth.normalize(path4) + (self2.fs.statSync(path4).isDirectory() ? self2.sep : ""));
}
});
return files;
}
return findSync(path3, void 0, true);
};
Utils2.prototype.getAttributes = function() {
};
Utils2.prototype.setAttributes = function() {
};
Utils2.crc32update = function(crc, byte) {
return crcTable[(crc ^ byte) & 255] ^ crc >>> 8;
};
Utils2.crc32 = function(buf) {
if (typeof buf === "string") {
buf = Buffer.from(buf, "utf8");
}
if (!crcTable.length)
genCRCTable();
let len = buf.length;
let crc = ~0;
for (let off = 0; off < len; )
crc = Utils2.crc32update(crc, buf[off++]);
return ~crc >>> 0;
};
Utils2.methodToString = function(method) {
switch (method) {
case Constants.STORED:
return "STORED (" + method + ")";
case Constants.DEFLATED:
return "DEFLATED (" + method + ")";
default:
return "UNSUPPORTED (" + method + ")";
}
};
Utils2.canonical = function(path3) {
if (!path3)
return "";
var safeSuffix = pth.posix.normalize("/" + path3.split("\\").join("/"));
return pth.join(".", safeSuffix);
};
Utils2.sanitize = function(prefix, name) {
prefix = pth.resolve(pth.normalize(prefix));
var parts = name.split("/");
for (var i = 0, l = parts.length; i < l; i++) {
var path3 = pth.normalize(pth.join(prefix, parts.slice(i, l).join(pth.sep)));
if (path3.indexOf(prefix) === 0) {
return path3;
}
}
return pth.normalize(pth.join(prefix, pth.basename(name)));
};
Utils2.toBuffer = function toBuffer(input) {
if (Buffer.isBuffer(input)) {
return input;
} else if (input instanceof Uint8Array) {
return Buffer.from(input);
} else {
return typeof input === "string" ? Buffer.from(input, "utf8") : Buffer.alloc(0);
}
};
Utils2.readBigUInt64LE = function(buffer, index) {
var slice = Buffer.from(buffer.slice(index, index + 8));
slice.swap64();
return parseInt(`0x${slice.toString("hex")}`);
};
Utils2.isWin = isWin;
Utils2.crcTable = crcTable;
}
});
// node_modules/adm-zip/util/errors.js
var require_errors = __commonJS({
"node_modules/adm-zip/util/errors.js"(exports, module2) {
module2.exports = {
INVALID_LOC: "Invalid LOC header (bad signature)",
INVALID_CEN: "Invalid CEN header (bad signature)",
INVALID_END: "Invalid END header (bad signature)",
NO_DATA: "Nothing to decompress",
BAD_CRC: "CRC32 checksum failed",
FILE_IN_THE_WAY: "There is a file in the way: %s",
UNKNOWN_METHOD: "Invalid/unsupported compression method",
AVAIL_DATA: "inflate::Available inflate data did not terminate",
INVALID_DISTANCE: "inflate::Invalid literal/length or distance code in fixed or dynamic block",
TO_MANY_CODES: "inflate::Dynamic block code description: too many length or distance codes",
INVALID_REPEAT_LEN: "inflate::Dynamic block code description: repeat more than specified lengths",
INVALID_REPEAT_FIRST: "inflate::Dynamic block code description: repeat lengths with no first length",
INCOMPLETE_CODES: "inflate::Dynamic block code description: code lengths codes incomplete",
INVALID_DYN_DISTANCE: "inflate::Dynamic block code description: invalid distance code lengths",
INVALID_CODES_LEN: "inflate::Dynamic block code description: invalid literal/length code lengths",
INVALID_STORE_BLOCK: "inflate::Stored block length did not match one's complement",
INVALID_BLOCK_TYPE: "inflate::Invalid block type (type == 3)",
CANT_EXTRACT_FILE: "Could not extract the file",
CANT_OVERRIDE: "Target file already exists",
NO_ZIP: "No zip file was loaded",
NO_ENTRY: "Entry doesn't exist",
DIRECTORY_CONTENT_ERROR: "A directory cannot have content",
FILE_NOT_FOUND: "File not found: %s",
NOT_IMPLEMENTED: "Not implemented",
INVALID_FILENAME: "Invalid filename",
INVALID_FORMAT: "Invalid or unsupported zip format. No END header found"
};
}
});
// node_modules/adm-zip/util/fattr.js
var require_fattr = __commonJS({
"node_modules/adm-zip/util/fattr.js"(exports, module2) {
var fs4 = require_fileSystem().require();
var pth = require("path");
fs4.existsSync = fs4.existsSync || pth.existsSync;
module2.exports = function(path3) {
var _path = path3 || "", _obj = newAttr(), _stat = null;
function newAttr() {
return {
directory: false,
readonly: false,
hidden: false,
executable: false,
mtime: 0,
atime: 0
};
}
if (_path && fs4.existsSync(_path)) {
_stat = fs4.statSync(_path);
_obj.directory = _stat.isDirectory();
_obj.mtime = _stat.mtime;
_obj.atime = _stat.atime;
_obj.executable = (73 & _stat.mode) !== 0;
_obj.readonly = (128 & _stat.mode) === 0;
_obj.hidden = pth.basename(_path)[0] === ".";
} else {
console.warn("Invalid path: " + _path);
}
return {
get directory() {
return _obj.directory;
},
get readOnly() {
return _obj.readonly;
},
get hidden() {
return _obj.hidden;
},
get mtime() {
return _obj.mtime;
},
get atime() {
return _obj.atime;
},
get executable() {
return _obj.executable;
},
decodeAttributes: function() {
},
encodeAttributes: function() {
},
toJSON: function() {
return {
path: _path,
isDirectory: _obj.directory,
isReadOnly: _obj.readonly,
isHidden: _obj.hidden,
isExecutable: _obj.executable,
mTime: _obj.mtime,
aTime: _obj.atime
};
},
toString: function() {
return JSON.stringify(this.toJSON(), null, " ");
}
};
};
}
});
// node_modules/adm-zip/util/index.js
var require_util = __commonJS({
"node_modules/adm-zip/util/index.js"(exports, module2) {
module2.exports = require_utils();
module2.exports.Constants = require_constants();
module2.exports.Errors = require_errors();
module2.exports.FileAttr = require_fattr();
}
});
// node_modules/adm-zip/headers/entryHeader.js
var require_entryHeader = __commonJS({
"node_modules/adm-zip/headers/entryHeader.js"(exports, module2) {
var Utils2 = require_util();
var Constants = Utils2.Constants;
module2.exports = function() {
var _verMade = 20, _version = 10, _flags = 0, _method = 0, _time = 0, _crc = 0, _compressedSize = 0, _size = 0, _fnameLen = 0, _extraLen = 0, _comLen = 0, _diskStart = 0, _inattr = 0, _attr = 0, _offset = 0;
_verMade |= Utils2.isWin ? 2560 : 768;
_flags |= Constants.FLG_EFS;
var _dataHeader = {};
function setTime(val) {
val = new Date(val);
_time = (val.getFullYear() - 1980 & 127) << 25 | val.getMonth() + 1 << 21 | val.getDate() << 16 | val.getHours() << 11 | val.getMinutes() << 5 | val.getSeconds() >> 1;
}
setTime(+new Date());
return {
get made() {
return _verMade;
},
set made(val) {
_verMade = val;
},
get version() {
return _version;
},
set version(val) {
_version = val;
},
get flags() {
return _flags;
},
set flags(val) {
_flags = val;
},
get method() {
return _method;
},
set method(val) {
switch (val) {
case Constants.STORED:
this.version = 10;
case Constants.DEFLATED:
default:
this.version = 20;
}
_method = val;
},
get time() {
return new Date((_time >> 25 & 127) + 1980, (_time >> 21 & 15) - 1, _time >> 16 & 31, _time >> 11 & 31, _time >> 5 & 63, (_time & 31) << 1);
},
set time(val) {
setTime(val);
},
get crc() {
return _crc;
},
set crc(val) {
_crc = Math.max(0, val) >>> 0;
},
get compressedSize() {
return _compressedSize;
},
set compressedSize(val) {
_compressedSize = Math.max(0, val) >>> 0;
},
get size() {
return _size;
},
set size(val) {
_size = Math.max(0, val) >>> 0;
},
get fileNameLength() {
return _fnameLen;
},
set fileNameLength(val) {
_fnameLen = val;
},
get extraLength() {
return _extraLen;
},
set extraLength(val) {
_extraLen = val;
},
get commentLength() {
return _comLen;
},
set commentLength(val) {
_comLen = val;
},
get diskNumStart() {
return _diskStart;
},
set diskNumStart(val) {
_diskStart = Math.max(0, val) >>> 0;
},
get inAttr() {
return _inattr;
},
set inAttr(val) {
_inattr = Math.max(0, val) >>> 0;
},
get attr() {
return _attr;
},
set attr(val) {
_attr = Math.max(0, val) >>> 0;
},
get fileAttr() {
return _attr ? (_attr >>> 0 | 0) >> 16 & 4095 : 0;
},
get offset() {
return _offset;
},
set offset(val) {
_offset = Math.max(0, val) >>> 0;
},
get encripted() {
return (_flags & 1) === 1;
},
get entryHeaderSize() {
return Constants.CENHDR + _fnameLen + _extraLen + _comLen;
},
get realDataOffset() {
return _offset + Constants.LOCHDR + _dataHeader.fnameLen + _dataHeader.extraLen;
},
get dataHeader() {
return _dataHeader;
},
loadDataHeaderFromBinary: function(input) {
var data = input.slice(_offset, _offset + Constants.LOCHDR);
if (data.readUInt32LE(0) !== Constants.LOCSIG) {
throw new Error(Utils2.Errors.INVALID_LOC);
}
_dataHeader = {
version: data.readUInt16LE(Constants.LOCVER),
flags: data.readUInt16LE(Constants.LOCFLG),
method: data.readUInt16LE(Constants.LOCHOW),
time: data.readUInt32LE(Constants.LOCTIM),
crc: data.readUInt32LE(Constants.LOCCRC),
compressedSize: data.readUInt32LE(Constants.LOCSIZ),
size: data.readUInt32LE(Constants.LOCLEN),
fnameLen: data.readUInt16LE(Constants.LOCNAM),
extraLen: data.readUInt16LE(Constants.LOCEXT)
};
},
loadFromBinary: function(data) {
if (data.length !== Constants.CENHDR || data.readUInt32LE(0) !== Constants.CENSIG) {
throw new Error(Utils2.Errors.INVALID_CEN);
}
_verMade = data.readUInt16LE(Constants.CENVEM);
_version = data.readUInt16LE(Constants.CENVER);
_flags = data.readUInt16LE(Constants.CENFLG);
_method = data.readUInt16LE(Constants.CENHOW);
_time = data.readUInt32LE(Constants.CENTIM);
_crc = data.readUInt32LE(Constants.CENCRC);
_compressedSize = data.readUInt32LE(Constants.CENSIZ);
_size = data.readUInt32LE(Constants.CENLEN);
_fnameLen = data.readUInt16LE(Constants.CENNAM);
_extraLen = data.readUInt16LE(Constants.CENEXT);
_comLen = data.readUInt16LE(Constants.CENCOM);
_diskStart = data.readUInt16LE(Constants.CENDSK);
_inattr = data.readUInt16LE(Constants.CENATT);
_attr = data.readUInt32LE(Constants.CENATX);
_offset = data.readUInt32LE(Constants.CENOFF);
},
dataHeaderToBinary: function() {
var data = Buffer.alloc(Constants.LOCHDR);
data.writeUInt32LE(Constants.LOCSIG, 0);
data.writeUInt16LE(_version, Constants.LOCVER);
data.writeUInt16LE(_flags, Constants.LOCFLG);
data.writeUInt16LE(_method, Constants.LOCHOW);
data.writeUInt32LE(_time, Constants.LOCTIM);
data.writeUInt32LE(_crc, Constants.LOCCRC);
data.writeUInt32LE(_compressedSize, Constants.LOCSIZ);
data.writeUInt32LE(_size, Constants.LOCLEN);
data.writeUInt16LE(_fnameLen, Constants.LOCNAM);
data.writeUInt16LE(_extraLen, Constants.LOCEXT);
return data;
},
entryHeaderToBinary: function() {
var data = Buffer.alloc(Constants.CENHDR + _fnameLen + _extraLen + _comLen);
data.writeUInt32LE(Constants.CENSIG, 0);
data.writeUInt16LE(_verMade, Constants.CENVEM);
data.writeUInt16LE(_version, Constants.CENVER);
data.writeUInt16LE(_flags, Constants.CENFLG);
data.writeUInt16LE(_method, Constants.CENHOW);
data.writeUInt32LE(_time, Constants.CENTIM);
data.writeUInt32LE(_crc, Constants.CENCRC);
data.writeUInt32LE(_compressedSize, Constants.CENSIZ);
data.writeUInt32LE(_size, Constants.CENLEN);
data.writeUInt16LE(_fnameLen, Constants.CENNAM);
data.writeUInt16LE(_extraLen, Constants.CENEXT);
data.writeUInt16LE(_comLen, Constants.CENCOM);
data.writeUInt16LE(_diskStart, Constants.CENDSK);
data.writeUInt16LE(_inattr, Constants.CENATT);
data.writeUInt32LE(_attr, Constants.CENATX);
data.writeUInt32LE(_offset, Constants.CENOFF);
data.fill(0, Constants.CENHDR);
return data;
},
toJSON: function() {
const bytes = function(nr) {
return nr + " bytes";
};
return {
made: _verMade,
version: _version,
flags: _flags,
method: Utils2.methodToString(_method),
time: this.time,
crc: "0x" + _crc.toString(16).toUpperCase(),
compressedSize: bytes(_compressedSize),
size: bytes(_size),
fileNameLength: bytes(_fnameLen),
extraLength: bytes(_extraLen),
commentLength: bytes(_comLen),
diskNumStart: _diskStart,
inAttr: _inattr,
attr: _attr,
offset: _offset,
entryHeaderSize: bytes(Constants.CENHDR + _fnameLen + _extraLen + _comLen)
};
},
toString: function() {
return JSON.stringify(this.toJSON(), null, " ");
}
};
};
}
});
// node_modules/adm-zip/headers/mainHeader.js
var require_mainHeader = __commonJS({
"node_modules/adm-zip/headers/mainHeader.js"(exports, module2) {
var Utils2 = require_util();
var Constants = Utils2.Constants;
module2.exports = function() {
var _volumeEntries = 0, _totalEntries = 0, _size = 0, _offset = 0, _commentLength = 0;
return {
get diskEntries() {
return _volumeEntries;
},
set diskEntries(val) {
_volumeEntries = _totalEntries = val;
},
get totalEntries() {
return _totalEntries;
},
set totalEntries(val) {
_totalEntries = _volumeEntries = val;
},
get size() {
return _size;
},
set size(val) {
_size = val;
},
get offset() {
return _offset;
},
set offset(val) {
_offset = val;
},
get commentLength() {
return _commentLength;
},
set commentLength(val) {
_commentLength = val;
},
get mainHeaderSize() {
return Constants.ENDHDR + _commentLength;
},
loadFromBinary: function(data) {
if ((data.length !== Constants.ENDHDR || data.readUInt32LE(0) !== Constants.ENDSIG) && (data.length < Constants.ZIP64HDR || data.readUInt32LE(0) !== Constants.ZIP64SIG)) {
throw new Error(Utils2.Errors.INVALID_END);
}
if (data.readUInt32LE(0) === Constants.ENDSIG) {
_volumeEntries = data.readUInt16LE(Constants.ENDSUB);
_totalEntries = data.readUInt16LE(Constants.ENDTOT);
_size = data.readUInt32LE(Constants.ENDSIZ);
_offset = data.readUInt32LE(Constants.ENDOFF);
_commentLength = data.readUInt16LE(Constants.ENDCOM);
} else {
_volumeEntries = Utils2.readBigUInt64LE(data, Constants.ZIP64SUB);
_totalEntries = Utils2.readBigUInt64LE(data, Constants.ZIP64TOT);
_size = Utils2.readBigUInt64LE(data, Constants.ZIP64SIZ);
_offset = Utils2.readBigUInt64LE(data, Constants.ZIP64OFF);
_commentLength = 0;
}
},
toBinary: function() {
var b = Buffer.alloc(Constants.ENDHDR + _commentLength);
b.writeUInt32LE(Constants.ENDSIG, 0);
b.writeUInt32LE(0, 4);
b.writeUInt16LE(_volumeEntries, Constants.ENDSUB);
b.writeUInt16LE(_totalEntries, Constants.ENDTOT);
b.writeUInt32LE(_size, Constants.ENDSIZ);
b.writeUInt32LE(_offset, Constants.ENDOFF);
b.writeUInt16LE(_commentLength, Constants.ENDCOM);
b.fill(" ", Constants.ENDHDR);
return b;
},
toJSON: function() {
const offset = function(nr, len) {
let offs = nr.toString(16).toUpperCase();
while (offs.length < len)
offs = "0" + offs;
return "0x" + offs;
};
return {
diskEntries: _volumeEntries,
totalEntries: _totalEntries,
size: _size + " bytes",
offset: offset(_offset, 4),
commentLength: _commentLength
};
},
toString: function() {
return JSON.stringify(this.toJSON(), null, " ");
}
};
};
}
});
// node_modules/adm-zip/headers/index.js
var require_headers = __commonJS({
"node_modules/adm-zip/headers/index.js"(exports) {
exports.EntryHeader = require_entryHeader();
exports.MainHeader = require_mainHeader();
}
});
// node_modules/adm-zip/methods/deflater.js
var require_deflater = __commonJS({
"node_modules/adm-zip/methods/deflater.js"(exports, module2) {
module2.exports = function(inbuf) {
var zlib = require("zlib");
var opts = { chunkSize: (parseInt(inbuf.length / 1024) + 1) * 1024 };
return {
deflate: function() {
return zlib.deflateRawSync(inbuf, opts);
},
deflateAsync: function(callback) {
var tmp = zlib.createDeflateRaw(opts), parts = [], total = 0;
tmp.on("data", function(data) {
parts.push(data);
total += data.length;
});
tmp.on("end", function() {
var buf = Buffer.alloc(total), written = 0;
buf.fill(0);
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
part.copy(buf, written);
written += part.length;
}
callback && callback(buf);
});
tmp.end(inbuf);
}
};
};
}
});
// node_modules/adm-zip/methods/inflater.js
var require_inflater = __commonJS({
"node_modules/adm-zip/methods/inflater.js"(exports, module2) {
module2.exports = function(inbuf) {
var zlib = require("zlib");
return {
inflate: function() {
return zlib.inflateRawSync(inbuf);
},
inflateAsync: function(callback) {
var tmp = zlib.createInflateRaw(), parts = [], total = 0;
tmp.on("data", function(data) {
parts.push(data);
total += data.length;
});
tmp.on("end", function() {
var buf = Buffer.alloc(total), written = 0;
buf.fill(0);
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
part.copy(buf, written);
written += part.length;
}
callback && callback(buf);
});
tmp.end(inbuf);
}
};
};
}
});
// node_modules/adm-zip/methods/zipcrypto.js
var require_zipcrypto = __commonJS({
"node_modules/adm-zip/methods/zipcrypto.js"(exports, module2) {
"use strict";
var { randomFillSync } = require("crypto");
var crctable = new Uint32Array(256).map((t, crc) => {
for (let j = 0; j < 8; j++) {
if ((crc & 1) !== 0) {
crc = crc >>> 1 ^ 3988292384;
} else {
crc >>>= 1;
}
}
return crc >>> 0;
});
var uMul = (a, b) => Math.imul(a, b) >>> 0;
var crc32update = (pCrc32, bval) => {
return crctable[(pCrc32 ^ bval) & 255] ^ pCrc32 >>> 8;
};
var genSalt = () => {
if (typeof randomFillSync === "function") {
return randomFillSync(Buffer.alloc(12));
} else {
return genSalt.node();
}
};
genSalt.node = () => {
const salt = Buffer.alloc(12);
const len = salt.length;
for (let i = 0; i < len; i++)
salt[i] = Math.random() * 256 & 255;
return salt;
};
var config = {
genSalt
};
function Initkeys(pw) {
const pass = Buffer.isBuffer(pw) ? pw : Buffer.from(pw);
this.keys = new Uint32Array([305419896, 591751049, 878082192]);
for (let i = 0; i < pass.length; i++) {
this.updateKeys(pass[i]);
}
}
Initkeys.prototype.updateKeys = function(byteValue) {
const keys = this.keys;
keys[0] = crc32update(keys[0], byteValue);
keys[1] += keys[0] & 255;
keys[1] = uMul(keys[1], 134775813) + 1;
keys[2] = crc32update(keys[2], keys[1] >>> 24);
return byteValue;
};
Initkeys.prototype.next = function() {
const k = (this.keys[2] | 2) >>> 0;
return uMul(k, k ^ 1) >> 8 & 255;
};
function make_decrypter(pwd) {
const keys = new Initkeys(pwd);
return function(data) {
const result = Buffer.alloc(data.length);
let pos = 0;
for (let c of data) {
result[pos++] = keys.updateKeys(c ^ keys.next());
}
return result;
};
}
function make_encrypter(pwd) {
const keys = new Initkeys(pwd);
return function(data, result, pos = 0) {
if (!result)
result = Buffer.alloc(data.length);
for (let c of data) {
const k = keys.next();
result[pos++] = c ^ k;
keys.updateKeys(c);
}
return result;
};
}
function decrypt(data, header, pwd) {
if (!data || !Buffer.isBuffer(data) || data.length < 12) {
return Buffer.alloc(0);
}
const decrypter = make_decrypter(pwd);
const salt = decrypter(data.slice(0, 12));
if (salt[11] !== header.crc >>> 24) {
throw "ADM-ZIP: Wrong Password";
}
return decrypter(data.slice(12));
}
function _salter(data) {
if (Buffer.isBuffer(data) && data.length >= 12) {
config.genSalt = function() {
return data.slice(0, 12);
};
} else if (data === "node") {
config.genSalt = genSalt.node;
} else {
config.genSalt = genSalt;
}
}
function encrypt(data, header, pwd, oldlike = false) {
if (data == null)
data = Buffer.alloc(0);
if (!Buffer.isBuffer(data))
data = Buffer.from(data.toString());
const encrypter = make_encrypter(pwd);
const salt = config.genSalt();
salt[11] = header.crc >>> 24 & 255;
if (oldlike)
salt[10] = header.crc >>> 16 & 255;
const result = Buffer.alloc(data.length + 12);
encrypter(salt, result);
return encrypter(data, result, 12);
}
module2.exports = { decrypt, encrypt, _salter };
}
});
// node_modules/adm-zip/methods/index.js
var require_methods = __commonJS({
"node_modules/adm-zip/methods/index.js"(exports) {
exports.Deflater = require_deflater();
exports.Inflater = require_inflater();
exports.ZipCrypto = require_zipcrypto();
}
});
// node_modules/adm-zip/zipEntry.js
var require_zipEntry = __commonJS({
"node_modules/adm-zip/zipEntry.js"(exports, module2) {
var Utils2 = require_util();
var Headers = require_headers();
var Constants = Utils2.Constants;
var Methods = require_methods();
module2.exports = function(input) {
var _entryHeader = new Headers.EntryHeader(), _entryName = Buffer.alloc(0), _comment = Buffer.alloc(0), _isDirectory = false, uncompressedData = null, _extra = Buffer.alloc(0);
function getCompressedDataFromZip() {
if (!input || !Buffer.isBuffer(input)) {
return Buffer.alloc(0);
}
_entryHeader.loadDataHeaderFromBinary(input);
return input.slice(_entryHeader.realDataOffset, _entryHeader.realDataOffset + _entryHeader.compressedSize);
}
function crc32OK(data) {
if ((_entryHeader.flags & 8) !== 8) {
if (Utils2.crc32(data) !== _entryHeader.dataHeader.crc) {
return false;
}
} else {
}
return true;
}
function decompress(async, callback, pass) {
if (typeof callback === "undefined" && typeof async === "string") {
pass = async;
async = void 0;
}
if (_isDirectory) {
if (async && callback) {
callback(Buffer.alloc(0), Utils2.Errors.DIRECTORY_CONTENT_ERROR);
}
return Buffer.alloc(0);
}
var compressedData = getCompressedDataFromZip();
if (compressedData.length === 0) {
if (async && callback)
callback(compressedData);
return compressedData;
}
if (_entryHeader.encripted) {
if (typeof pass !== "string" && !Buffer.isBuffer(pass)) {
throw new Error("ADM-ZIP: Incompatible password parameter");
}
compressedData = Methods.ZipCrypto.decrypt(compressedData, _entryHeader, pass);
}
var data = Buffer.alloc(_entryHeader.size);
switch (_entryHeader.method) {
case Utils2.Constants.STORED:
compressedData.copy(data);
if (!crc32OK(data)) {
if (async && callback)
callback(data, Utils2.Errors.BAD_CRC);
throw new Error(Utils2.Errors.BAD_CRC);
} else {
if (async && callback)
callback(data);
return data;
}
case Utils2.Constants.DEFLATED:
var inflater = new Methods.Inflater(compressedData);
if (!async) {
const result = inflater.inflate(data);
result.copy(data, 0);
if (!crc32OK(data)) {
throw new Error(Utils2.Errors.BAD_CRC + " " + _entryName.toString());
}
return data;
} else {
inflater.inflateAsync(function(result) {
result.copy(result, 0);
if (callback) {
if (!crc32OK(result)) {
callback(result, Utils2.Errors.BAD_CRC);
} else {
callback(result);
}
}
});
}
break;
default:
if (async && callback)
callback(Buffer.alloc(0), Utils2.Errors.UNKNOWN_METHOD);
throw new Error(Utils2.Errors.UNKNOWN_METHOD);
}
}
function compress(async, callback) {
if ((!uncompressedData || !uncompressedData.length) && Buffer.isBuffer(input)) {
if (async && callback)
callback(getCompressedDataFromZip());
return getCompressedDataFromZip();
}
if (uncompressedData.length && !_isDirectory) {
var compressedData;
switch (_entryHeader.method) {
case Utils2.Constants.STORED:
_entryHeader.compressedSize = _entryHeader.size;
compressedData = Buffer.alloc(uncompressedData.length);
uncompressedData.copy(compressedData);
if (async && callback)
callback(compressedData);
return compressedData;
default:
case Utils2.Constants.DEFLATED:
var deflater = new Methods.Deflater(uncompressedData);
if (!async) {
var deflated = deflater.deflate();
_entryHeader.compressedSize = deflated.length;
return deflated;
} else {
deflater.deflateAsync(function(data) {
compressedData = Buffer.alloc(data.length);
_entryHeader.compressedSize = data.length;
data.copy(compressedData);
callback && callback(compressedData);
});
}
deflater = null;
break;
}
} else if (async && callback) {
callback(Buffer.alloc(0));
} else {
return Buffer.alloc(0);
}
}
function readUInt64LE(buffer, offset) {
return (buffer.readUInt32LE(offset + 4) << 4) + buffer.readUInt32LE(offset);
}
function parseExtra(data) {
var offset = 0;
var signature, size, part;
while (offset < data.length) {
signature = data.readUInt16LE(offset);
offset += 2;
size = data.readUInt16LE(offset);
offset += 2;
part = data.slice(offset, offset + size);
offset += size;
if (Constants.ID_ZIP64 === signature) {
parseZip64ExtendedInformation(part);
}
}
}
function parseZip64ExtendedInformation(data) {
var size, compressedSize, offset, diskNumStart;
if (data.length >= Constants.EF_ZIP64_SCOMP) {
size = readUInt64LE(data, Constants.EF_ZIP64_SUNCOMP);
if (_entryHeader.size === Constants.EF_ZIP64_OR_32) {
_entryHeader.size = size;
}
}
if (data.length >= Constants.EF_ZIP64_RHO) {
compressedSize = readUInt64LE(data, Constants.EF_ZIP64_SCOMP);
if (_entryHeader.compressedSize === Constants.EF_ZIP64_OR_32) {
_entryHeader.compressedSize = compressedSize;
}
}
if (data.length >= Constants.EF_ZIP64_DSN) {
offset = readUInt64LE(data, Constants.EF_ZIP64_RHO);
if (_entryHeader.offset === Constants.EF_ZIP64_OR_32) {
_entryHeader.offset = offset;
}
}
if (data.length >= Constants.EF_ZIP64_DSN + 4) {
diskNumStart = data.readUInt32LE(Constants.EF_ZIP64_DSN);
if (_entryHeader.diskNumStart === Constants.EF_ZIP64_OR_16) {
_entryHeader.diskNumStart = diskNumStart;
}
}
}
return {
get entryName() {
return _entryName.toString();
},
get rawEntryName() {
return _entryName;
},
set entryName(val) {
_entryName = Utils2.toBuffer(val);
var lastChar = _entryName[_entryName.length - 1];
_isDirectory = lastChar === 47 || lastChar === 92;
_entryHeader.fileNameLength = _entryName.length;
},
get extra() {
return _extra;
},
set extra(val) {
_extra = val;
_entryHeader.extraLength = val.length;
parseExtra(val);
},
get comment() {
return _comment.toString();
},
set comment(val) {
_comment = Utils2.toBuffer(val);
_entryHeader.commentLength = _comment.length;
},
get name() {
var n = _entryName.toString();
return _isDirectory ? n.substr(n.length - 1).split("/").pop() : n.split("/").pop();
},
get isDirectory() {
return _isDirectory;
},
getCompressedData: function() {
return compress(false, null);
},
getCompressedDataAsync: function(callback) {
compress(true, callback);
},
setData: function(value) {
uncompressedData = Utils2.toBuffer(value);
if (!_isDirectory && uncompressedData.length) {
_entryHeader.size = uncompressedData.length;
_entryHeader.method = Utils2.Constants.DEFLATED;
_entryHeader.crc = Utils2.crc32(value);
_entryHeader.changed = true;
} else {
_entryHeader.method = Utils2.Constants.STORED;
}
},
getData: function(pass) {
if (_entryHeader.changed) {
return uncompressedData;
} else {
return decompress(false, null, pass);
}
},
getDataAsync: function(callback, pass) {
if (_entryHeader.changed) {
callback(uncompressedData);
} else {
decompress(true, callback, pass);
}
},
set attr(attr) {
_entryHeader.attr = attr;
},
get attr() {
return _entryHeader.attr;
},
set header(data) {
_entryHeader.loadFromBinary(data);
},
get header() {
return _entryHeader;
},
packHeader: function() {
var header = _entryHeader.entryHeaderToBinary();
var addpos = Utils2.Constants.CENHDR;
_entryName.copy(header, addpos);
addpos += _entryName.length;
if (_entryHeader.extraLength) {
_extra.copy(header, addpos);
addpos += _entryHeader.extraLength;
}
if (_entryHeader.commentLength) {
_comment.copy(header, addpos);
}
return header;
},
toJSON: function() {
const bytes = function(nr) {
return "<" + (nr && nr.length + " bytes buffer" || "null") + ">";
};
return {
entryName: this.entryName,
name: this.name,
comment: this.comment,
isDirectory: this.isDirectory,
header: _entryHeader.toJSON(),
compressedData: bytes(input),
data: bytes(uncompressedData)
};
},
toString: function() {
return JSON.stringify(this.toJSON(), null, " ");
}
};
};
}
});
// node_modules/adm-zip/zipFile.js
var require_zipFile = __commonJS({
"node_modules/adm-zip/zipFile.js"(exports, module2) {
var ZipEntry = require_zipEntry();
var Headers = require_headers();
var Utils2 = require_util();
module2.exports = function(inBuffer, options) {
var entryList = [], entryTable = {}, _comment = Buffer.alloc(0), mainHeader = new Headers.MainHeader(), loadedEntries = false;
const opts = Object.assign(/* @__PURE__ */ Object.create(null), options);
const { noSort } = opts;
if (inBuffer) {
readMainHeader(opts.readEntries);
} else {
loadedEntries = true;
}
function iterateEntries(callback) {
const totalEntries = mainHeader.diskEntries;
let index = mainHeader.offset;
for (let i = 0; i < totalEntries; i++) {
let tmp = index;
const entry = new ZipEntry(inBuffer);
entry.header = inBuffer.slice(tmp, tmp += Utils2.Constants.CENHDR);
entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength);
index += entry.header.entryHeaderSize;
callback(entry);
}
}
function readEntries() {
loadedEntries = true;
entryTable = {};
entryList = new Array(mainHeader.diskEntries);
var index = mainHeader.offset;
for (var i = 0; i < entryList.length; i++) {
var tmp = index, entry = new ZipEntry(inBuffer);
entry.header = inBuffer.slice(tmp, tmp += Utils2.Constants.CENHDR);
entry.entryName = inBuffer.slice(tmp, tmp += entry.header.fileNameLength);
if (entry.header.extraLength) {
entry.extra = inBuffer.slice(tmp, tmp += entry.header.extraLength);
}
if (entry.header.commentLength)
entry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength);
index += entry.header.entryHeaderSize;
entryList[i] = entry;
entryTable[entry.entryName] = entry;
}
}
function readMainHeader(readNow) {
var i = inBuffer.length - Utils2.Constants.ENDHDR, max = Math.max(0, i - 65535), n = max, endStart = inBuffer.length, endOffset = -1, commentEnd = 0;
for (i; i >= n; i--) {
if (inBuffer[i] !== 80)
continue;
if (inBuffer.readUInt32LE(i) === Utils2.Constants.ENDSIG) {
endOffset = i;
commentEnd = i;
endStart = i + Utils2.Constants.ENDHDR;
n = i - Utils2.Constants.END64HDR;
continue;
}
if (inBuffer.readUInt32LE(i) === Utils2.Constants.END64SIG) {
n = max;
continue;
}
if (inBuffer.readUInt32LE(i) === Utils2.Constants.ZIP64SIG) {
endOffset = i;
endStart = i + Utils2.readBigUInt64LE(inBuffer, i + Utils2.Constants.ZIP64SIZE) + Utils2.Constants.ZIP64LEAD;
break;
}
}
if (!~endOffset)
throw new Error(Utils2.Errors.INVALID_FORMAT);
mainHeader.loadFromBinary(inBuffer.slice(endOffset, endStart));
if (mainHeader.commentLength) {
_comment = inBuffer.slice(commentEnd + Utils2.Constants.ENDHDR);
}
if (readNow)
readEntries();
}
function sortEntries() {
if (entryList.length > 1 && !noSort) {
entryList.sort((a, b) => a.entryName.toLowerCase().localeCompare(b.entryName.toLowerCase()));
}
}
return {
get entries() {
if (!loadedEntries) {
readEntries();
}
return entryList;
},
get comment() {
return _comment.toString();
},
set comment(val) {
_comment = Utils2.toBuffer(val);
mainHeader.commentLength = _comment.length;
},
getEntryCount: function() {
if (!loadedEntries) {
return mainHeader.diskEntries;
}
return entryList.length;
},
forEach: function(callback) {
if (!loadedEntries) {
iterateEntries(callback);
return;
}
entryList.forEach(callback);
},
getEntry: function(entryName) {
if (!loadedEntries) {
readEntries();
}
return entryTable[entryName] || null;
},
setEntry: function(entry) {
if (!loadedEntries) {
readEntries();
}
entryList.push(entry);
entryTable[entry.entryName] = entry;
mainHeader.totalEntries = entryList.length;
},
deleteEntry: function(entryName) {
if (!loadedEntries) {
readEntries();
}
var entry = entryTable[entryName];
if (entry && entry.isDirectory) {
var _self = this;
this.getEntryChildren(entry).forEach(function(child) {
if (child.entryName !== entryName) {
_self.deleteEntry(child.entryName);
}
});
}
entryList.splice(entryList.indexOf(entry), 1);
delete entryTable[entryName];
mainHeader.totalEntries = entryList.length;
},
getEntryChildren: function(entry) {
if (!loadedEntries) {
readEntries();
}
if (entry && entry.isDirectory) {
const list = [];
const name = entry.entryName;
const len = name.length;
entryList.forEach(function(zipEntry) {
if (zipEntry.entryName.substr(0, len) === name) {
list.push(zipEntry);
}
});
return list;
}
return [];
},
compressToBuffer: function() {
if (!loadedEntries) {
readEntries();
}
sortEntries();
const dataBlock = [];
const entryHeaders = [];
let totalSize = 0;
let dindex = 0;
mainHeader.size = 0;
mainHeader.offset = 0;
for (const entry of entryList) {
const compressedData = entry.getCompressedData();
entry.header.offset = dindex;
const dataHeader = entry.header.dataHeaderToBinary();
const entryNameLen = entry.rawEntryName.length;
const postHeader = Buffer.alloc(entryNameLen + entry.extra.length);
entry.rawEntryName.copy(postHeader, 0);
postHeader.copy(entry.extra, entryNameLen);
const dataLength = dataHeader.length + postHeader.length + compressedData.length;
dindex += dataLength;
dataBlock.push(dataHeader);
dataBlock.push(postHeader);
dataBlock.push(compressedData);
const entryHeader = entry.packHeader();
entryHeaders.push(entryHeader);
mainHeader.size += entryHeader.length;
totalSize += dataLength + entryHeader.length;
}
totalSize += mainHeader.mainHeaderSize;
mainHeader.offset = dindex;
dindex = 0;
const outBuffer = Buffer.alloc(totalSize);
for (const content of dataBlock) {
content.copy(outBuffer, dindex);
dindex += content.length;
}
for (const content of entryHeaders) {
content.copy(outBuffer, dindex);
dindex += content.length;
}
const mh = mainHeader.toBinary();
if (_comment) {
_comment.copy(mh, Utils2.Constants.ENDHDR);
}
mh.copy(outBuffer, dindex);
return outBuffer;
},
toAsyncBuffer: function(onSuccess, onFail, onItemStart, onItemEnd) {
try {
if (!loadedEntries) {
readEntries();
}
sortEntries();
const dataBlock = [];
const entryHeaders = [];
let totalSize = 0;
let dindex = 0;
mainHeader.size = 0;
mainHeader.offset = 0;
const compress2Buffer = function(entryLists) {
if (entryLists.length) {
const entry = entryLists.pop();
const name = entry.entryName + entry.extra.toString();
if (onItemStart)
onItemStart(name);
entry.getCompressedDataAsync(function(compressedData) {
if (onItemEnd)
onItemEnd(name);
entry.header.offset = dindex;
const dataHeader = entry.header.dataHeaderToBinary();
const postHeader = Buffer.alloc(name.length, name);
const dataLength = dataHeader.length + postHeader.length + compressedData.length;
dindex += dataLength;
dataBlock.push(dataHeader);
dataBlock.push(postHeader);
dataBlock.push(compressedData);
const entryHeader = entry.packHeader();
entryHeaders.push(entryHeader);
mainHeader.size += entryHeader.length;
totalSize += dataLength + entryHeader.length;
compress2Buffer(entryLists);
});
} else {
totalSize += mainHeader.mainHeaderSize;
mainHeader.offset = dindex;
dindex = 0;
const outBuffer = Buffer.alloc(totalSize);
dataBlock.forEach(function(content) {
content.copy(outBuffer, dindex);
dindex += content.length;
});
entryHeaders.forEach(function(content) {
content.copy(outBuffer, dindex);
dindex += content.length;
});
const mh = mainHeader.toBinary();
if (_comment) {
_comment.copy(mh, Utils2.Constants.ENDHDR);
}
mh.copy(outBuffer, dindex);
onSuccess(outBuffer);
}
};
compress2Buffer(entryList);
} catch (e) {
onFail(e);
}
}
};
};
}
});
// node_modules/adm-zip/adm-zip.js
var require_adm_zip = __commonJS({
"node_modules/adm-zip/adm-zip.js"(exports, module2) {
var Utils2 = require_util();
var pth = require("path");
var ZipEntry = require_zipEntry();
var ZipFile = require_zipFile();
var get_Bool = (val, def) => typeof val === "boolean" ? val : def;
var get_Str = (val, def) => typeof val === "string" ? val : def;
var defaultOptions = {
noSort: false,
readEntries: false,
method: Utils2.Constants.NONE,
fs: null
};
module2.exports = function(input, options) {
let inBuffer = null;
const opts = Object.assign(/* @__PURE__ */ Object.create(null), defaultOptions);
if (input && typeof input === "object") {
if (!(input instanceof Uint8Array)) {
Object.assign(opts, input);
input = opts.input ? opts.input : void 0;
if (opts.input)
delete opts.input;
}
if (Buffer.isBuffer(input)) {
inBuffer = input;
opts.method = Utils2.Constants.BUFFER;
input = void 0;
}
}
Object.assign(opts, options);
const filetools = new Utils2(opts);
if (input && typeof input === "string") {
if (filetools.fs.existsSync(input)) {
opts.method = Utils2.Constants.FILE;
opts.filename = input;
inBuffer = filetools.fs.readFileSync(input);
} else {
throw new Error(Utils2.Errors.INVALID_FILENAME);
}
}
const _zip = new ZipFile(inBuffer, opts);
const { canonical, sanitize } = Utils2;
function getEntry(entry) {
if (entry && _zip) {
var item;
if (typeof entry === "string")
item = _zip.getEntry(entry);
if (typeof entry === "object" && typeof entry.entryName !== "undefined" && typeof entry.header !== "undefined")
item = _zip.getEntry(entry.entryName);
if (item) {
return item;
}
}
return null;
}
function fixPath(zipPath) {
const { join: join3, normalize, sep } = pth.posix;
return join3(".", normalize(sep + zipPath.split("\\").join(sep) + sep));
}
return {
readFile: function(entry, pass) {
var item = getEntry(entry);
return item && item.getData(pass) || null;
},
readFileAsync: function(entry, callback) {
var item = getEntry(entry);
if (item) {
item.getDataAsync(callback);
} else {
callback(null, "getEntry failed for:" + entry);
}
},
readAsText: function(entry, encoding) {
var item = getEntry(entry);
if (item) {
var data = item.getData();
if (data && data.length) {
return data.toString(encoding || "utf8");
}
}
return "";
},
readAsTextAsync: function(entry, callback, encoding) {
var item = getEntry(entry);
if (item) {
item.getDataAsync(function(data, err) {
if (err) {
callback(data, err);
return;
}
if (data && data.length) {
callback(data.toString(encoding || "utf8"));
} else {
callback("");
}
});
} else {
callback("");
}
},
deleteFile: function(entry) {
var item = getEntry(entry);
if (item) {
_zip.deleteEntry(item.entryName);
}
},
addZipComment: function(comment) {
_zip.comment = comment;
},
getZipComment: function() {
return _zip.comment || "";
},
addZipEntryComment: function(entry, comment) {
var item = getEntry(entry);
if (item) {
item.comment = comment;
}
},
getZipEntryComment: function(entry) {
var item = getEntry(entry);
if (item) {
return item.comment || "";
}
return "";
},
updateFile: function(entry, content) {
var item = getEntry(entry);
if (item) {
item.setData(content);
}
},
addLocalFile: function(localPath, zipPath, zipName, comment) {
if (filetools.fs.existsSync(localPath)) {
zipPath = zipPath ? fixPath(zipPath) : "";
var p = localPath.split("\\").join("/").split("/").pop();
zipPath += zipName ? zipName : p;
const _attr = filetools.fs.statSync(localPath);
this.addFile(zipPath, filetools.fs.readFileSync(localPath), comment, _attr);
} else {
throw new Error(Utils2.Errors.FILE_NOT_FOUND.replace("%s", localPath));
}
},
addLocalFolder: function(localPath, zipPath, filter) {
if (filter instanceof RegExp) {
filter = function(rx) {
return function(filename) {
return rx.test(filename);
};
}(filter);
} else if (typeof filter !== "function") {
filter = function() {
return true;
};
}
zipPath = zipPath ? fixPath(zipPath) : "";
localPath = pth.normalize(localPath);
if (filetools.fs.existsSync(localPath)) {
const items = filetools.findFiles(localPath);
const self2 = this;
if (items.length) {
items.forEach(function(filepath) {
var p = pth.relative(localPath, filepath).split("\\").join("/");
if (filter(p)) {
var stats = filetools.fs.statSync(filepath);
if (stats.isFile()) {
self2.addFile(zipPath + p, filetools.fs.readFileSync(filepath), "", stats);
} else {
self2.addFile(zipPath + p + "/", Buffer.alloc(0), "", stats);
}
}
});
}
} else {
throw new Error(Utils2.Errors.FILE_NOT_FOUND.replace("%s", localPath));
}
},
addLocalFolderAsync: function(localPath, callback, zipPath, filter) {
if (filter instanceof RegExp) {
filter = function(rx) {
return function(filename) {
return rx.test(filename);
};
}(filter);
} else if (typeof filter !== "function") {
filter = function() {
return true;
};
}
zipPath = zipPath ? fixPath(zipPath) : "";
localPath = pth.normalize(localPath);
var self2 = this;
filetools.fs.open(localPath, "r", function(err) {
if (err && err.code === "ENOENT") {
callback(void 0, Utils2.Errors.FILE_NOT_FOUND.replace("%s", localPath));
} else if (err) {
callback(void 0, err);
} else {
var items = filetools.findFiles(localPath);
var i = -1;
var next = function() {
i += 1;
if (i < items.length) {
var filepath = items[i];
var p = pth.relative(localPath, filepath).split("\\").join("/");
p = p.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^\x20-\x7E]/g, "");
if (filter(p)) {
filetools.fs.stat(filepath, function(er0, stats) {
if (er0)
callback(void 0, er0);
if (stats.isFile()) {
filetools.fs.readFile(filepath, function(er1, data) {
if (er1) {
callback(void 0, er1);
} else {
self2.addFile(zipPath + p, data, "", stats);
next();
}
});
} else {
self2.addFile(zipPath + p + "/", Buffer.alloc(0), "", stats);
next();
}
});
} else {
next();
}
} else {
callback(true, void 0);
}
};
next();
}
});
},
addLocalFolderPromise: function(localPath, props) {
return new Promise((resolve, reject) => {
const { filter, zipPath } = Object.assign({}, props);
this.addLocalFolderAsync(localPath, (done, err) => {
if (err)
reject(err);
if (done)
resolve(this);
}, zipPath, filter);
});
},
addFile: function(entryName, content, comment, attr) {
let entry = getEntry(entryName);
const update = entry != null;
if (!update) {
entry = new ZipEntry();
entry.entryName = entryName;
}
entry.comment = comment || "";
const isStat = typeof attr === "object" && attr instanceof filetools.fs.Stats;
if (isStat) {
entry.header.time = attr.mtime;
}
var fileattr = entry.isDirectory ? 16 : 0;
if (!Utils2.isWin) {
let unix = entry.isDirectory ? 16384 : 32768;
if (isStat) {
unix |= 4095 & attr.mode;
} else if (typeof attr === "number") {
unix |= 4095 & attr;
} else {
unix |= entry.isDirectory ? 493 : 420;
}
fileattr = (fileattr | unix << 16) >>> 0;
}
entry.attr = fileattr;
entry.setData(content);
if (!update)
_zip.setEntry(entry);
},
getEntries: function() {
return _zip ? _zip.entries : [];
},
getEntry: function(name) {
return getEntry(name);
},
getEntryCount: function() {
return _zip.getEntryCount();
},
forEach: function(callback) {
return _zip.forEach(callback);
},
extractEntryTo: function(entry, targetPath, maintainEntryPath, overwrite, keepOriginalPermission, outFileName) {
overwrite = get_Bool(overwrite, false);
keepOriginalPermission = get_Bool(keepOriginalPermission, false);
maintainEntryPath = get_Bool(maintainEntryPath, true);
outFileName = get_Str(outFileName, get_Str(keepOriginalPermission, void 0));
var item = getEntry(entry);
if (!item) {
throw new Error(Utils2.Errors.NO_ENTRY);
}
var entryName = canonical(item.entryName);
var target = sanitize(targetPath, outFileName && !item.isDirectory ? outFileName : maintainEntryPath ? entryName : pth.basename(entryName));
if (item.isDirectory) {
var children = _zip.getEntryChildren(item);
children.forEach(function(child) {
if (child.isDirectory)
return;
var content2 = child.getData();
if (!content2) {
throw new Error(Utils2.Errors.CANT_EXTRACT_FILE);
}
var name = canonical(child.entryName);
var childName = sanitize(targetPath, maintainEntryPath ? name : pth.basename(name));
const fileAttr2 = keepOriginalPermission ? child.header.fileAttr : void 0;
filetools.writeFileTo(childName, content2, overwrite, fileAttr2);
});
return true;
}
var content = item.getData();
if (!content)
throw new Error(Utils2.Errors.CANT_EXTRACT_FILE);
if (filetools.fs.existsSync(target) && !overwrite) {
throw new Error(Utils2.Errors.CANT_OVERRIDE);
}
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : void 0;
filetools.writeFileTo(target, content, overwrite, fileAttr);
return true;
},
test: function(pass) {
if (!_zip) {
return false;
}
for (var entry in _zip.entries) {
try {
if (entry.isDirectory) {
continue;
}
var content = _zip.entries[entry].getData(pass);
if (!content) {
return false;
}
} catch (err) {
return false;
}
}
return true;
},
extractAllTo: function(targetPath, overwrite, keepOriginalPermission, pass) {
overwrite = get_Bool(overwrite, false);
pass = get_Str(keepOriginalPermission, pass);
keepOriginalPermission = get_Bool(keepOriginalPermission, false);
if (!_zip) {
throw new Error(Utils2.Errors.NO_ZIP);
}
_zip.entries.forEach(function(entry) {
var entryName = sanitize(targetPath, canonical(entry.entryName.toString()));
if (entry.isDirectory) {
filetools.makeDir(entryName);
return;
}
var content = entry.getData(pass);
if (!content) {
throw new Error(Utils2.Errors.CANT_EXTRACT_FILE);
}
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : void 0;
filetools.writeFileTo(entryName, content, overwrite, fileAttr);
try {
filetools.fs.utimesSync(entryName, entry.header.time, entry.header.time);
} catch (err) {
throw new Error(Utils2.Errors.CANT_EXTRACT_FILE);
}
});
},
extractAllToAsync: function(targetPath, overwrite, keepOriginalPermission, callback) {
if (!callback) {
callback = function() {
};
}
overwrite = get_Bool(overwrite, false);
if (typeof keepOriginalPermission === "function" && !callback)
callback = keepOriginalPermission;
keepOriginalPermission = get_Bool(keepOriginalPermission, false);
if (!_zip) {
callback(new Error(Utils2.Errors.NO_ZIP));
return;
}
targetPath = pth.resolve(targetPath);
const getPath = (entry) => sanitize(targetPath, pth.normalize(canonical(entry.entryName.toString())));
const getError = (msg, file) => new Error(msg + ': "' + file + '"');
const dirEntries = [];
const fileEntries = /* @__PURE__ */ new Set();
_zip.entries.forEach((e) => {
if (e.isDirectory) {
dirEntries.push(e);
} else {
fileEntries.add(e);
}
});
for (const entry of dirEntries) {
const dirPath = getPath(entry);
const dirAttr = keepOriginalPermission ? entry.header.fileAttr : void 0;
try {
filetools.makeDir(dirPath);
if (dirAttr)
filetools.fs.chmodSync(dirPath, dirAttr);
filetools.fs.utimesSync(dirPath, entry.header.time, entry.header.time);
} catch (er) {
callback(getError("Unable to create folder", dirPath));
}
}
const done = () => {
if (fileEntries.size === 0) {
callback();
}
};
for (const entry of fileEntries.values()) {
const entryName = pth.normalize(canonical(entry.entryName.toString()));
const filePath = sanitize(targetPath, entryName);
entry.getDataAsync(function(content, err_1) {
if (err_1) {
callback(new Error(err_1));
return;
}
if (!content) {
callback(new Error(Utils2.Errors.CANT_EXTRACT_FILE));
} else {
const fileAttr = keepOriginalPermission ? entry.header.fileAttr : void 0;
filetools.writeFileToAsync(filePath, content, overwrite, fileAttr, function(succ) {
if (!succ) {
callback(getError("Unable to write file", filePath));
return;
}
filetools.fs.utimes(filePath, entry.header.time, entry.header.time, function(err_2) {
if (err_2) {
callback(getError("Unable to set times", filePath));
return;
}
fileEntries.delete(entry);
done();
});
});
}
});
}
done();
},
writeZip: function(targetFileName, callback) {
if (arguments.length === 1) {
if (typeof targetFileName === "function") {
callback = targetFileName;
targetFileName = "";
}
}
if (!targetFileName && opts.filename) {
targetFileName = opts.filename;
}
if (!targetFileName)
return;
var zipData = _zip.compressToBuffer();
if (zipData) {
var ok = filetools.writeFileTo(targetFileName, zipData, true);
if (typeof callback === "function")
callback(!ok ? new Error("failed") : null, "");
}
},
writeZipPromise: function(targetFileName, props) {
const { overwrite, perm } = Object.assign({ overwrite: true }, props);
return new Promise((resolve, reject) => {
if (!targetFileName && opts.filename)
targetFileName = opts.filename;
if (!targetFileName)
reject("ADM-ZIP: ZIP File Name Missing");
this.toBufferPromise().then((zipData) => {
const ret = (done) => done ? resolve(done) : reject("ADM-ZIP: Wasn't able to write zip file");
filetools.writeFileToAsync(targetFileName, zipData, overwrite, perm, ret);
}, reject);
});
},
toBufferPromise: function() {
return new Promise((resolve, reject) => {
_zip.toAsyncBuffer(resolve, reject);
});
},
toBuffer: function(onSuccess, onFail, onItemStart, onItemEnd) {
this.valueOf = 2;
if (typeof onSuccess === "function") {
_zip.toAsyncBuffer(onSuccess, onFail, onItemStart, onItemEnd);
return null;
}
return _zip.compressToBuffer();
}
};
};
}
});
// node_modules/extend/index.js
var require_extend = __commonJS({
"node_modules/extend/index.js"(exports, module2) {
"use strict";
var hasOwn = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var defineProperty = Object.defineProperty;
var gOPD = Object.getOwnPropertyDescriptor;
var isArray = function isArray2(arr) {
if (typeof Array.isArray === "function") {
return Array.isArray(arr);
}
return toStr.call(arr) === "[object Array]";
};
var isPlainObject = function isPlainObject2(obj) {
if (!obj || toStr.call(obj) !== "[object Object]") {
return false;
}
var hasOwnConstructor = hasOwn.call(obj, "constructor");
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, "isPrototypeOf");
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
return false;
}
var key;
for (key in obj) {
}
return typeof key === "undefined" || hasOwn.call(obj, key);
};
var setProperty = function setProperty2(target, options) {
if (defineProperty && options.name === "__proto__") {
defineProperty(target, options.name, {
enumerable: true,
configurable: true,
value: options.newValue,
writable: true
});
} else {
target[options.name] = options.newValue;
}
};
var getProperty = function getProperty2(obj, name) {
if (name === "__proto__") {
if (!hasOwn.call(obj, name)) {
return void 0;
} else if (gOPD) {
return gOPD(obj, name).value;
}
}
return obj[name];
};
module2.exports = function extend() {
var options, name, src, copy, copyIsArray, clone;
var target = arguments[0];
var i = 1;
var length = arguments.length;
var deep = false;
if (typeof target === "boolean") {
deep = target;
target = arguments[1] || {};
i = 2;
}
if (target == null || typeof target !== "object" && typeof target !== "function") {
target = {};
}
for (; i < length; ++i) {
options = arguments[i];
if (options != null) {
for (name in options) {
src = getProperty(target, name);
copy = getProperty(options, name);
if (target !== copy) {
if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && isArray(src) ? src : [];
} else {
clone = src && isPlainObject(src) ? src : {};
}
setProperty(target, { name, newValue: extend(deep, clone, copy) });
} else if (typeof copy !== "undefined") {
setProperty(target, { name, newValue: copy });
}
}
}
}
}
return target;
};
}
});
// node_modules/psl/data/rules.json
var require_rules = __commonJS({
"node_modules/psl/data/rules.json"(exports, module2) {
module2.exports = [
"ac",
"com.ac",
"edu.ac",
"gov.ac",
"net.ac",
"mil.ac",
"org.ac",
"ad",
"nom.ad",
"ae",
"co.ae",
"net.ae",
"org.ae",
"sch.ae",
"ac.ae",
"gov.ae",
"mil.ae",
"aero",
"accident-investigation.aero",
"accident-prevention.aero",
"aerobatic.aero",
"aeroclub.aero",
"aerodrome.aero",
"agents.aero",
"aircraft.aero",
"airline.aero",
"airport.aero",
"air-surveillance.aero",
"airtraffic.aero",
"air-traffic-control.aero",
"ambulance.aero",
"amusement.aero",
"association.aero",
"author.aero",
"ballooning.aero",
"broker.aero",
"caa.aero",
"cargo.aero",
"catering.aero",
"certification.aero",
"championship.aero",
"charter.aero",
"civilaviation.aero",
"club.aero",
"conference.aero",
"consultant.aero",
"consulting.aero",
"control.aero",
"council.aero",
"crew.aero",
"design.aero",
"dgca.aero",
"educator.aero",
"emergency.aero",
"engine.aero",
"engineer.aero",
"entertainment.aero",
"equipment.aero",
"exchange.aero",
"express.aero",
"federation.aero",
"flight.aero",
"fuel.aero",
"gliding.aero",
"government.aero",
"groundhandling.aero",
"group.aero",
"hanggliding.aero",
"homebuilt.aero",
"insurance.aero",
"journal.aero",
"journalist.aero",
"leasing.aero",
"logistics.aero",
"magazine.aero",
"maintenance.aero",
"media.aero",
"microlight.aero",
"modelling.aero",
"navigation.aero",
"parachuting.aero",
"paragliding.aero",
"passenger-association.aero",
"pilot.aero",
"press.aero",
"production.aero",
"recreation.aero",
"repbody.aero",
"res.aero",
"research.aero",
"rotorcraft.aero",
"safety.aero",
"scientist.aero",
"services.aero",
"show.aero",
"skydiving.aero",
"software.aero",
"student.aero",
"trader.aero",
"trading.aero",
"trainer.aero",
"union.aero",
"workinggroup.aero",
"works.aero",
"af",
"gov.af",
"com.af",
"org.af",
"net.af",
"edu.af",
"ag",
"com.ag",
"org.ag",
"net.ag",
"co.ag",
"nom.ag",
"ai",
"off.ai",
"com.ai",
"net.ai",
"org.ai",
"al",
"com.al",
"edu.al",
"gov.al",
"mil.al",
"net.al",
"org.al",
"am",
"co.am",
"com.am",
"commune.am",
"net.am",
"org.am",
"ao",
"ed.ao",
"gv.ao",
"og.ao",
"co.ao",
"pb.ao",
"it.ao",
"aq",
"ar",
"bet.ar",
"com.ar",
"coop.ar",
"edu.ar",
"gob.ar",
"gov.ar",
"int.ar",
"mil.ar",
"musica.ar",
"mutual.ar",
"net.ar",
"org.ar",
"senasa.ar",
"tur.ar",
"arpa",
"e164.arpa",
"in-addr.arpa",
"ip6.arpa",
"iris.arpa",
"uri.arpa",
"urn.arpa",
"as",
"gov.as",
"asia",
"at",
"ac.at",
"co.at",
"gv.at",
"or.at",
"sth.ac.at",
"au",
"com.au",
"net.au",
"org.au",
"edu.au",
"gov.au",
"asn.au",
"id.au",
"info.au",
"conf.au",
"oz.au",
"act.au",
"nsw.au",
"nt.au",
"qld.au",
"sa.au",
"tas.au",
"vic.au",
"wa.au",
"act.edu.au",
"catholic.edu.au",
"nsw.edu.au",
"nt.edu.au",
"qld.edu.au",
"sa.edu.au",
"tas.edu.au",
"vic.edu.au",
"wa.edu.au",
"qld.gov.au",
"sa.gov.au",
"tas.gov.au",
"vic.gov.au",
"wa.gov.au",
"schools.nsw.edu.au",
"aw",
"com.aw",
"ax",
"az",
"com.az",
"net.az",
"int.az",
"gov.az",
"org.az",
"edu.az",
"info.az",
"pp.az",
"mil.az",
"name.az",
"pro.az",
"biz.az",
"ba",
"com.ba",
"edu.ba",
"gov.ba",
"mil.ba",
"net.ba",
"org.ba",
"bb",
"biz.bb",
"co.bb",
"com.bb",
"edu.bb",
"gov.bb",
"info.bb",
"net.bb",
"org.bb",
"store.bb",
"tv.bb",
"*.bd",
"be",
"ac.be",
"bf",
"gov.bf",
"bg",
"a.bg",
"b.bg",
"c.bg",
"d.bg",
"e.bg",
"f.bg",
"g.bg",
"h.bg",
"i.bg",
"j.bg",
"k.bg",
"l.bg",
"m.bg",
"n.bg",
"o.bg",
"p.bg",
"q.bg",
"r.bg",
"s.bg",
"t.bg",
"u.bg",
"v.bg",
"w.bg",
"x.bg",
"y.bg",
"z.bg",
"0.bg",
"1.bg",
"2.bg",
"3.bg",
"4.bg",
"5.bg",
"6.bg",
"7.bg",
"8.bg",
"9.bg",
"bh",
"com.bh",
"edu.bh",
"net.bh",
"org.bh",
"gov.bh",
"bi",
"co.bi",
"com.bi",
"edu.bi",
"or.bi",
"org.bi",
"biz",
"bj",
"asso.bj",
"barreau.bj",
"gouv.bj",
"bm",
"com.bm",
"edu.bm",
"gov.bm",
"net.bm",
"org.bm",
"bn",
"com.bn",
"edu.bn",
"gov.bn",
"net.bn",
"org.bn",
"bo",
"com.bo",
"edu.bo",
"gob.bo",
"int.bo",
"org.bo",
"net.bo",
"mil.bo",
"tv.bo",
"web.bo",
"academia.bo",
"agro.bo",
"arte.bo",
"blog.bo",
"bolivia.bo",
"ciencia.bo",
"cooperativa.bo",
"democracia.bo",
"deporte.bo",
"ecologia.bo",
"economia.bo",
"empresa.bo",
"indigena.bo",
"industria.bo",
"info.bo",
"medicina.bo",
"movimiento.bo",
"musica.bo",
"natural.bo",
"nombre.bo",
"noticias.bo",
"patria.bo",
"politica.bo",
"profesional.bo",
"plurinacional.bo",
"pueblo.bo",
"revista.bo",
"salud.bo",
"tecnologia.bo",
"tksat.bo",
"transporte.bo",
"wiki.bo",
"br",
"9guacu.br",
"abc.br",
"adm.br",
"adv.br",
"agr.br",
"aju.br",
"am.br",
"anani.br",
"aparecida.br",
"app.br",
"arq.br",
"art.br",
"ato.br",
"b.br",
"barueri.br",
"belem.br",
"bhz.br",
"bib.br",
"bio.br",
"blog.br",
"bmd.br",
"boavista.br",
"bsb.br",
"campinagrande.br",
"campinas.br",
"caxias.br",
"cim.br",
"cng.br",
"cnt.br",
"com.br",
"contagem.br",
"coop.br",
"coz.br",
"cri.br",
"cuiaba.br",
"curitiba.br",
"def.br",
"des.br",
"det.br",
"dev.br",
"ecn.br",
"eco.br",
"edu.br",
"emp.br",
"enf.br",
"eng.br",
"esp.br",
"etc.br",
"eti.br",
"far.br",
"feira.br",
"flog.br",
"floripa.br",
"fm.br",
"fnd.br",
"fortal.br",
"fot.br",
"foz.br",
"fst.br",
"g12.br",
"geo.br",
"ggf.br",
"goiania.br",
"gov.br",
"ac.gov.br",
"al.gov.br",
"am.gov.br",
"ap.gov.br",
"ba.gov.br",
"ce.gov.br",
"df.gov.br",
"es.gov.br",
"go.gov.br",
"ma.gov.br",
"mg.gov.br",
"ms.gov.br",
"mt.gov.br",
"pa.gov.br",
"pb.gov.br",
"pe.gov.br",
"pi.gov.br",
"pr.gov.br",
"rj.gov.br",
"rn.gov.br",
"ro.gov.br",
"rr.gov.br",
"rs.gov.br",
"sc.gov.br",
"se.gov.br",
"sp.gov.br",
"to.gov.br",
"gru.br",
"imb.br",
"ind.br",
"inf.br",
"jab.br",
"jampa.br",
"jdf.br",
"joinville.br",
"jor.br",
"jus.br",
"leg.br",
"lel.br",
"log.br",
"londrina.br",
"macapa.br",
"maceio.br",
"manaus.br",
"maringa.br",
"mat.br",
"med.br",
"mil.br",
"morena.br",
"mp.br",
"mus.br",
"natal.br",
"net.br",
"niteroi.br",
"*.nom.br",
"not.br",
"ntr.br",
"odo.br",
"ong.br",
"org.br",
"osasco.br",
"palmas.br",
"poa.br",
"ppg.br",
"pro.br",
"psc.br",
"psi.br",
"pvh.br",
"qsl.br",
"radio.br",
"rec.br",
"recife.br",
"rep.br",
"ribeirao.br",
"rio.br",
"riobranco.br",
"riopreto.br",
"salvador.br",
"sampa.br",
"santamaria.br",
"santoandre.br",
"saobernardo.br",
"saogonca.br",
"seg.br",
"sjc.br",
"slg.br",
"slz.br",
"sorocaba.br",
"srv.br",
"taxi.br",
"tc.br",
"tec.br",
"teo.br",
"the.br",
"tmp.br",
"trd.br",
"tur.br",
"tv.br",
"udi.br",
"vet.br",
"vix.br",
"vlog.br",
"wiki.br",
"zlg.br",
"bs",
"com.bs",
"net.bs",
"org.bs",
"edu.bs",
"gov.bs",
"bt",
"com.bt",
"edu.bt",
"gov.bt",
"net.bt",
"org.bt",
"bv",
"bw",
"co.bw",
"org.bw",
"by",
"gov.by",
"mil.by",
"com.by",
"of.by",
"bz",
"com.bz",
"net.bz",
"org.bz",
"edu.bz",
"gov.bz",
"ca",
"ab.ca",
"bc.ca",
"mb.ca",
"nb.ca",
"nf.ca",
"nl.ca",
"ns.ca",
"nt.ca",
"nu.ca",
"on.ca",
"pe.ca",
"qc.ca",
"sk.ca",
"yk.ca",
"gc.ca",
"cat",
"cc",
"cd",
"gov.cd",
"cf",
"cg",
"ch",
"ci",
"org.ci",
"or.ci",
"com.ci",
"co.ci",
"edu.ci",
"ed.ci",
"ac.ci",
"net.ci",
"go.ci",
"asso.ci",
"a\xE9roport.ci",
"int.ci",
"presse.ci",
"md.ci",
"gouv.ci",
"*.ck",
"!www.ck",
"cl",
"co.cl",
"gob.cl",
"gov.cl",
"mil.cl",
"cm",
"co.cm",
"com.cm",
"gov.cm",
"net.cm",
"cn",
"ac.cn",
"com.cn",
"edu.cn",
"gov.cn",
"net.cn",
"org.cn",
"mil.cn",
"\u516C\u53F8.cn",
"\u7F51\u7EDC.cn",
"\u7DB2\u7D61.cn",
"ah.cn",
"bj.cn",
"cq.cn",
"fj.cn",
"gd.cn",
"gs.cn",
"gz.cn",
"gx.cn",
"ha.cn",
"hb.cn",
"he.cn",
"hi.cn",
"hl.cn",
"hn.cn",
"jl.cn",
"js.cn",
"jx.cn",
"ln.cn",
"nm.cn",
"nx.cn",
"qh.cn",
"sc.cn",
"sd.cn",
"sh.cn",
"sn.cn",
"sx.cn",
"tj.cn",
"xj.cn",
"xz.cn",
"yn.cn",
"zj.cn",
"hk.cn",
"mo.cn",
"tw.cn",
"co",
"arts.co",
"com.co",
"edu.co",
"firm.co",
"gov.co",
"info.co",
"int.co",
"mil.co",
"net.co",
"nom.co",
"org.co",
"rec.co",
"web.co",
"com",
"coop",
"cr",
"ac.cr",
"co.cr",
"ed.cr",
"fi.cr",
"go.cr",
"or.cr",
"sa.cr",
"cu",
"com.cu",
"edu.cu",
"org.cu",
"net.cu",
"gov.cu",
"inf.cu",
"cv",
"com.cv",
"edu.cv",
"int.cv",
"nome.cv",
"org.cv",
"cw",
"com.cw",
"edu.cw",
"net.cw",
"org.cw",
"cx",
"gov.cx",
"cy",
"ac.cy",
"biz.cy",
"com.cy",
"ekloges.cy",
"gov.cy",
"ltd.cy",
"mil.cy",
"net.cy",
"org.cy",
"press.cy",
"pro.cy",
"tm.cy",
"cz",
"de",
"dj",
"dk",
"dm",
"com.dm",
"net.dm",
"org.dm",
"edu.dm",
"gov.dm",
"do",
"art.do",
"com.do",
"edu.do",
"gob.do",
"gov.do",
"mil.do",
"net.do",
"org.do",
"sld.do",
"web.do",
"dz",
"art.dz",
"asso.dz",
"com.dz",
"edu.dz",
"gov.dz",
"org.dz",
"net.dz",
"pol.dz",
"soc.dz",
"tm.dz",
"ec",
"com.ec",
"info.ec",
"net.ec",
"fin.ec",
"k12.ec",
"med.ec",
"pro.ec",
"org.ec",
"edu.ec",
"gov.ec",
"gob.ec",
"mil.ec",
"edu",
"ee",
"edu.ee",
"gov.ee",
"riik.ee",
"lib.ee",
"med.ee",
"com.ee",
"pri.ee",
"aip.ee",
"org.ee",
"fie.ee",
"eg",
"com.eg",
"edu.eg",
"eun.eg",
"gov.eg",
"mil.eg",
"name.eg",
"net.eg",
"org.eg",
"sci.eg",
"*.er",
"es",
"com.es",
"nom.es",
"org.es",
"gob.es",
"edu.es",
"et",
"com.et",
"gov.et",
"org.et",
"edu.et",
"biz.et",
"name.et",
"info.et",
"net.et",
"eu",
"fi",
"aland.fi",
"fj",
"ac.fj",
"biz.fj",
"com.fj",
"gov.fj",
"info.fj",
"mil.fj",
"name.fj",
"net.fj",
"org.fj",
"pro.fj",
"*.fk",
"com.fm",
"edu.fm",
"net.fm",
"org.fm",
"fm",
"fo",
"fr",
"asso.fr",
"com.fr",
"gouv.fr",
"nom.fr",
"prd.fr",
"tm.fr",
"aeroport.fr",
"avocat.fr",
"avoues.fr",
"cci.fr",
"chambagri.fr",
"chirurgiens-dentistes.fr",
"experts-comptables.fr",
"geometre-expert.fr",
"greta.fr",
"huissier-justice.fr",
"medecin.fr",
"notaires.fr",
"pharmacien.fr",
"port.fr",
"veterinaire.fr",
"ga",
"gb",
"edu.gd",
"gov.gd",
"gd",
"ge",
"com.ge",
"edu.ge",
"gov.ge",
"org.ge",
"mil.ge",
"net.ge",
"pvt.ge",
"gf",
"gg",
"co.gg",
"net.gg",
"org.gg",
"gh",
"com.gh",
"edu.gh",
"gov.gh",
"org.gh",
"mil.gh",
"gi",
"com.gi",
"ltd.gi",
"gov.gi",
"mod.gi",
"edu.gi",
"org.gi",
"gl",
"co.gl",
"com.gl",
"edu.gl",
"net.gl",
"org.gl",
"gm",
"gn",
"ac.gn",
"com.gn",
"edu.gn",
"gov.gn",
"org.gn",
"net.gn",
"gov",
"gp",
"com.gp",
"net.gp",
"mobi.gp",
"edu.gp",
"org.gp",
"asso.gp",
"gq",
"gr",
"com.gr",
"edu.gr",
"net.gr",
"org.gr",
"gov.gr",
"gs",
"gt",
"com.gt",
"edu.gt",
"gob.gt",
"ind.gt",
"mil.gt",
"net.gt",
"org.gt",
"gu",
"com.gu",
"edu.gu",
"gov.gu",
"guam.gu",
"info.gu",
"net.gu",
"org.gu",
"web.gu",
"gw",
"gy",
"co.gy",
"com.gy",
"edu.gy",
"gov.gy",
"net.gy",
"org.gy",
"hk",
"com.hk",
"edu.hk",
"gov.hk",
"idv.hk",
"net.hk",
"org.hk",
"\u516C\u53F8.hk",
"\u6559\u80B2.hk",
"\u654E\u80B2.hk",
"\u653F\u5E9C.hk",
"\u500B\u4EBA.hk",
"\u4E2A\uFFFD\uFFFD.hk",
"\u7B87\u4EBA.hk",
"\u7DB2\u7EDC.hk",
"\u7F51\u7EDC.hk",
"\u7EC4\u7E54.hk",
"\u7DB2\u7D61.hk",
"\u7F51\u7D61.hk",
"\u7EC4\u7EC7.hk",
"\u7D44\u7E54.hk",
"\u7D44\u7EC7.hk",
"hm",
"hn",
"com.hn",
"edu.hn",
"org.hn",
"net.hn",
"mil.hn",
"gob.hn",
"hr",
"iz.hr",
"from.hr",
"name.hr",
"com.hr",
"ht",
"com.ht",
"shop.ht",
"firm.ht",
"info.ht",
"adult.ht",
"net.ht",
"pro.ht",
"org.ht",
"med.ht",
"art.ht",
"coop.ht",
"pol.ht",
"asso.ht",
"edu.ht",
"rel.ht",
"gouv.ht",
"perso.ht",
"hu",
"co.hu",
"info.hu",
"org.hu",
"priv.hu",
"sport.hu",
"tm.hu",
"2000.hu",
"agrar.hu",
"bolt.hu",
"casino.hu",
"city.hu",
"erotica.hu",
"erotika.hu",
"film.hu",
"forum.hu",
"games.hu",
"hotel.hu",
"ingatlan.hu",
"jogasz.hu",
"konyvelo.hu",
"lakas.hu",
"media.hu",
"news.hu",
"reklam.hu",
"sex.hu",
"shop.hu",
"suli.hu",
"szex.hu",
"tozsde.hu",
"utazas.hu",
"video.hu",
"id",
"ac.id",
"biz.id",
"co.id",
"desa.id",
"go.id",
"mil.id",
"my.id",
"net.id",
"or.id",
"ponpes.id",
"sch.id",
"web.id",
"ie",
"gov.ie",
"il",
"ac.il",
"co.il",
"gov.il",
"idf.il",
"k12.il",
"muni.il",
"net.il",
"org.il",
"im",
"ac.im",
"co.im",
"com.im",
"ltd.co.im",
"net.im",
"org.im",
"plc.co.im",
"tt.im",
"tv.im",
"in",
"co.in",
"firm.in",
"net.in",
"org.in",
"gen.in",
"ind.in",
"nic.in",
"ac.in",
"edu.in",
"res.in",
"gov.in",
"mil.in",
"info",
"int",
"eu.int",
"io",
"com.io",
"iq",
"gov.iq",
"edu.iq",
"mil.iq",
"com.iq",
"org.iq",
"net.iq",
"ir",
"ac.ir",
"co.ir",
"gov.ir",
"id.ir",
"net.ir",
"org.ir",
"sch.ir",
"\u0627\u06CC\u0631\u0627\u0646.ir",
"\u0627\u064A\u0631\u0627\u0646.ir",
"is",
"net.is",
"com.is",
"edu.is",
"gov.is",
"org.is",
"int.is",
"it",
"gov.it",
"edu.it",
"abr.it",
"abruzzo.it",
"aosta-valley.it",
"aostavalley.it",
"bas.it",
"basilicata.it",
"cal.it",
"calabria.it",
"cam.it",
"campania.it",
"emilia-romagna.it",
"emiliaromagna.it",
"emr.it",
"friuli-v-giulia.it",
"friuli-ve-giulia.it",
"friuli-vegiulia.it",
"friuli-venezia-giulia.it",
"friuli-veneziagiulia.it",
"friuli-vgiulia.it",
"friuliv-giulia.it",
"friulive-giulia.it",
"friulivegiulia.it",
"friulivenezia-giulia.it",
"friuliveneziagiulia.it",
"friulivgiulia.it",
"fvg.it",
"laz.it",
"lazio.it",
"lig.it",
"liguria.it",
"lom.it",
"lombardia.it",
"lombardy.it",
"lucania.it",
"mar.it",
"marche.it",
"mol.it",
"molise.it",
"piedmont.it",
"piemonte.it",
"pmn.it",
"pug.it",
"puglia.it",
"sar.it",
"sardegna.it",
"sardinia.it",
"sic.it",
"sicilia.it",
"sicily.it",
"taa.it",
"tos.it",
"toscana.it",
"trentin-sud-tirol.it",
"trentin-s\xFCd-tirol.it",
"trentin-sudtirol.it",
"trentin-s\xFCdtirol.it",
"trentin-sued-tirol.it",
"trentin-suedtirol.it",
"trentino-a-adige.it",
"trentino-aadige.it",
"trentino-alto-adige.it",
"trentino-altoadige.it",
"trentino-s-tirol.it",
"trentino-stirol.it",
"trentino-sud-tirol.it",
"trentino-s\xFCd-tirol.it",
"trentino-sudtirol.it",
"trentino-s\xFCdtirol.it",
"trentino-sued-tirol.it",
"trentino-suedtirol.it",
"trentino.it",
"trentinoa-adige.it",
"trentinoaadige.it",
"trentinoalto-adige.it",
"trentinoaltoadige.it",
"trentinos-tirol.it",
"trentinostirol.it",
"trentinosud-tirol.it",
"trentinos\xFCd-tirol.it",
"trentinosudtirol.it",
"trentinos\xFCdtirol.it",
"trentinosued-tirol.it",
"trentinosuedtirol.it",
"trentinsud-tirol.it",
"trentins\xFCd-tirol.it",
"trentinsudtirol.it",
"trentins\xFCdtirol.it",
"trentinsued-tirol.it",
"trentinsuedtirol.it",
"tuscany.it",
"umb.it",
"umbria.it",
"val-d-aosta.it",
"val-daosta.it",
"vald-aosta.it",
"valdaosta.it",
"valle-aosta.it",
"valle-d-aosta.it",
"valle-daosta.it",
"valleaosta.it",
"valled-aosta.it",
"valledaosta.it",
"vallee-aoste.it",
"vall\xE9e-aoste.it",
"vallee-d-aoste.it",
"vall\xE9e-d-aoste.it",
"valleeaoste.it",
"vall\xE9eaoste.it",
"valleedaoste.it",
"vall\xE9edaoste.it",
"vao.it",
"vda.it",
"ven.it",
"veneto.it",
"ag.it",
"agrigento.it",
"al.it",
"alessandria.it",
"alto-adige.it",
"altoadige.it",
"an.it",
"ancona.it",
"andria-barletta-trani.it",
"andria-trani-barletta.it",
"andriabarlettatrani.it",
"andriatranibarletta.it",
"ao.it",
"aosta.it",
"aoste.it",
"ap.it",
"aq.it",
"aquila.it",
"ar.it",
"arezzo.it",
"ascoli-piceno.it",
"ascolipiceno.it",
"asti.it",
"at.it",
"av.it",
"avellino.it",
"ba.it",
"balsan-sudtirol.it",
"balsan-s\xFCdtirol.it",
"balsan-suedtirol.it",
"balsan.it",
"bari.it",
"barletta-trani-andria.it",
"barlettatraniandria.it",
"belluno.it",
"benevento.it",
"bergamo.it",
"bg.it",
"bi.it",
"biella.it",
"bl.it",
"bn.it",
"bo.it",
"bologna.it",
"bolzano-altoadige.it",
"bolzano.it",
"bozen-sudtirol.it",
"bozen-s\xFCdtirol.it",
"bozen-suedtirol.it",
"bozen.it",
"br.it",
"brescia.it",
"brindisi.it",
"bs.it",
"bt.it",
"bulsan-sudtirol.it",
"bulsan-s\xFCdtirol.it",
"bulsan-suedtirol.it",
"bulsan.it",
"bz.it",
"ca.it",
"cagliari.it",
"caltanissetta.it",
"campidano-medio.it",
"campidanomedio.it",
"campobasso.it",
"carbonia-iglesias.it",
"carboniaiglesias.it",
"carrara-massa.it",
"carraramassa.it",
"caserta.it",
"catania.it",
"catanzaro.it",
"cb.it",
"ce.it",
"cesena-forli.it",
"cesena-forl\xEC.it",
"cesenaforli.it",
"cesenaforl\xEC.it",
"ch.it",
"chieti.it",
"ci.it",
"cl.it",
"cn.it",
"co.it",
"como.it",
"cosenza.it",
"cr.it",
"cremona.it",
"crotone.it",
"cs.it",
"ct.it",
"cuneo.it",
"cz.it",
"dell-ogliastra.it",
"dellogliastra.it",
"en.it",
"enna.it",
"fc.it",
"fe.it",
"fermo.it",
"ferrara.it",
"fg.it",
"fi.it",
"firenze.it",
"florence.it",
"fm.it",
"foggia.it",
"forli-cesena.it",
"forl\xEC-cesena.it",
"forlicesena.it",
"forl\xECcesena.it",
"fr.it",
"frosinone.it",
"ge.it",
"genoa.it",
"genova.it",
"go.it",
"gorizia.it",
"gr.it",
"grosseto.it",
"iglesias-carbonia.it",
"iglesiascarbonia.it",
"im.it",
"imperia.it",
"is.it",
"isernia.it",
"kr.it",
"la-spezia.it",
"laquila.it",
"laspezia.it",
"latina.it",
"lc.it",
"le.it",
"lecce.it",
"lecco.it",
"li.it",
"livorno.it",
"lo.it",
"lodi.it",
"lt.it",
"lu.it",
"lucca.it",
"macerata.it",
"mantova.it",
"massa-carrara.it",
"massacarrara.it",
"matera.it",
"mb.it",
"mc.it",
"me.it",
"medio-campidano.it",
"mediocampidano.it",
"messina.it",
"mi.it",
"milan.it",
"milano.it",
"mn.it",
"mo.it",
"modena.it",
"monza-brianza.it",
"monza-e-della-brianza.it",
"monza.it",
"monzabrianza.it",
"monzaebrianza.it",
"monzaedellabrianza.it",
"ms.it",
"mt.it",
"na.it",
"naples.it",
"napoli.it",
"no.it",
"novara.it",
"nu.it",
"nuoro.it",
"og.it",
"ogliastra.it",
"olbia-tempio.it",
"olbiatempio.it",
"or.it",
"oristano.it",
"ot.it",
"pa.it",
"padova.it",
"padua.it",
"palermo.it",
"parma.it",
"pavia.it",
"pc.it",
"pd.it",
"pe.it",
"perugia.it",
"pesaro-urbino.it",
"pesarourbino.it",
"pescara.it",
"pg.it",
"pi.it",
"piacenza.it",
"pisa.it",
"pistoia.it",
"pn.it",
"po.it",
"pordenone.it",
"potenza.it",
"pr.it",
"prato.it",
"pt.it",
"pu.it",
"pv.it",
"pz.it",
"ra.it",
"ragusa.it",
"ravenna.it",
"rc.it",
"re.it",
"reggio-calabria.it",
"reggio-emilia.it",
"reggiocalabria.it",
"reggioemilia.it",
"rg.it",
"ri.it",
"rieti.it",
"rimini.it",
"rm.it",
"rn.it",
"ro.it",
"roma.it",
"rome.it",
"rovigo.it",
"sa.it",
"salerno.it",
"sassari.it",
"savona.it",
"si.it",
"siena.it",
"siracusa.it",
"so.it",
"sondrio.it",
"sp.it",
"sr.it",
"ss.it",
"suedtirol.it",
"s\xFCdtirol.it",
"sv.it",
"ta.it",
"taranto.it",
"te.it",
"tempio-olbia.it",
"tempioolbia.it",
"teramo.it",
"terni.it",
"tn.it",
"to.it",
"torino.it",
"tp.it",
"tr.it",
"trani-andria-barletta.it",
"trani-barletta-andria.it",
"traniandriabarletta.it",
"tranibarlettaandria.it",
"trapani.it",
"trento.it",
"treviso.it",
"trieste.it",
"ts.it",
"turin.it",
"tv.it",
"ud.it",
"udine.it",
"urbino-pesaro.it",
"urbinopesaro.it",
"va.it",
"varese.it",
"vb.it",
"vc.it",
"ve.it",
"venezia.it",
"venice.it",
"verbania.it",
"vercelli.it",
"verona.it",
"vi.it",
"vibo-valentia.it",
"vibovalentia.it",
"vicenza.it",
"viterbo.it",
"vr.it",
"vs.it",
"vt.it",
"vv.it",
"je",
"co.je",
"net.je",
"org.je",
"*.jm",
"jo",
"com.jo",
"org.jo",
"net.jo",
"edu.jo",
"sch.jo",
"gov.jo",
"mil.jo",
"name.jo",
"jobs",
"jp",
"ac.jp",
"ad.jp",
"co.jp",
"ed.jp",
"go.jp",
"gr.jp",
"lg.jp",
"ne.jp",
"or.jp",
"aichi.jp",
"akita.jp",
"aomori.jp",
"chiba.jp",
"ehime.jp",
"fukui.jp",
"fukuoka.jp",
"fukushima.jp",
"gifu.jp",
"gunma.jp",
"hiroshima.jp",
"hokkaido.jp",
"hyogo.jp",
"ibaraki.jp",
"ishikawa.jp",
"iwate.jp",
"kagawa.jp",
"kagoshima.jp",
"kanagawa.jp",
"kochi.jp",
"kumamoto.jp",
"kyoto.jp",
"mie.jp",
"miyagi.jp",
"miyazaki.jp",
"nagano.jp",
"nagasaki.jp",
"nara.jp",
"niigata.jp",
"oita.jp",
"okayama.jp",
"okinawa.jp",
"osaka.jp",
"saga.jp",
"saitama.jp",
"shiga.jp",
"shimane.jp",
"shizuoka.jp",
"tochigi.jp",
"tokushima.jp",
"tokyo.jp",
"tottori.jp",
"toyama.jp",
"wakayama.jp",
"yamagata.jp",
"yamaguchi.jp",
"yamanashi.jp",
"\u6803\u6728.jp",
"\u611B\u77E5.jp",
"\u611B\u5A9B.jp",
"\u5175\u5EAB.jp",
"\u718A\u672C.jp",
"\u8328\u57CE.jp",
"\u5317\u6D77\u9053.jp",
"\u5343\u8449.jp",
"\u548C\u6B4C\u5C71.jp",
"\u9577\u5D0E.jp",
"\u9577\u91CE.jp",
"\u65B0\u6F5F.jp",
"\u9752\u68EE.jp",
"\u9759\u5CA1.jp",
"\u6771\u4EAC.jp",
"\u77F3\u5DDD.jp",
"\u57FC\u7389.jp",
"\u4E09\u91CD.jp",
"\u4EAC\u90FD.jp",
"\u4F50\u8CC0.jp",
"\u5927\u5206.jp",
"\u5927\u962A.jp",
"\u5948\u826F.jp",
"\u5BAE\u57CE.jp",
"\u5BAE\u5D0E.jp",
"\u5BCC\u5C71.jp",
"\u5C71\u53E3.jp",
"\u5C71\u5F62.jp",
"\u5C71\u68A8.jp",
"\u5CA9\u624B.jp",
"\u5C90\u961C.jp",
"\u5CA1\u5C71.jp",
"\u5CF6\u6839.jp",
"\u5E83\u5CF6.jp",
"\u5FB3\u5CF6.jp",
"\u6C96\u7E04.jp",
"\u6ECB\u8CC0.jp",
"\u795E\u5948\u5DDD.jp",
"\u798F\u4E95.jp",
"\u798F\u5CA1.jp",
"\u798F\u5CF6.jp",
"\u79CB\u7530.jp",
"\u7FA4\u99AC.jp",
"\u9999\u5DDD.jp",
"\u9AD8\u77E5.jp",
"\u9CE5\u53D6.jp",
"\u9E7F\u5150\u5CF6.jp",
"*.kawasaki.jp",
"*.kitakyushu.jp",
"*.kobe.jp",
"*.nagoya.jp",
"*.sapporo.jp",
"*.sendai.jp",
"*.yokohama.jp",
"!city.kawasaki.jp",
"!city.kitakyushu.jp",
"!city.kobe.jp",
"!city.nagoya.jp",
"!city.sapporo.jp",
"!city.sendai.jp",
"!city.yokohama.jp",
"aisai.aichi.jp",
"ama.aichi.jp",
"anjo.aichi.jp",
"asuke.aichi.jp",
"chiryu.aichi.jp",
"chita.aichi.jp",
"fuso.aichi.jp",
"gamagori.aichi.jp",
"handa.aichi.jp",
"hazu.aichi.jp",
"hekinan.aichi.jp",
"higashiura.aichi.jp",
"ichinomiya.aichi.jp",
"inazawa.aichi.jp",
"inuyama.aichi.jp",
"isshiki.aichi.jp",
"iwakura.aichi.jp",
"kanie.aichi.jp",
"kariya.aichi.jp",
"kasugai.aichi.jp",
"kira.aichi.jp",
"kiyosu.aichi.jp",
"komaki.aichi.jp",
"konan.aichi.jp",
"kota.aichi.jp",
"mihama.aichi.jp",
"miyoshi.aichi.jp",
"nishio.aichi.jp",
"nisshin.aichi.jp",
"obu.aichi.jp",
"oguchi.aichi.jp",
"oharu.aichi.jp",
"okazaki.aichi.jp",
"owariasahi.aichi.jp",
"seto.aichi.jp",
"shikatsu.aichi.jp",
"shinshiro.aichi.jp",
"shitara.aichi.jp",
"tahara.aichi.jp",
"takahama.aichi.jp",
"tobishima.aichi.jp",
"toei.aichi.jp",
"togo.aichi.jp",
"tokai.aichi.jp",
"tokoname.aichi.jp",
"toyoake.aichi.jp",
"toyohashi.aichi.jp",
"toyokawa.aichi.jp",
"toyone.aichi.jp",
"toyota.aichi.jp",
"tsushima.aichi.jp",
"yatomi.aichi.jp",
"akita.akita.jp",
"daisen.akita.jp",
"fujisato.akita.jp",
"gojome.akita.jp",
"hachirogata.akita.jp",
"happou.akita.jp",
"higashinaruse.akita.jp",
"honjo.akita.jp",
"honjyo.akita.jp",
"ikawa.akita.jp",
"kamikoani.akita.jp",
"kamioka.akita.jp",
"katagami.akita.jp",
"kazuno.akita.jp",
"kitaakita.akita.jp",
"kosaka.akita.jp",
"kyowa.akita.jp",
"misato.akita.jp",
"mitane.akita.jp",
"moriyoshi.akita.jp",
"nikaho.akita.jp",
"noshiro.akita.jp",
"odate.akita.jp",
"oga.akita.jp",
"ogata.akita.jp",
"semboku.akita.jp",
"yokote.akita.jp",
"yurihonjo.akita.jp",
"aomori.aomori.jp",
"gonohe.aomori.jp",
"hachinohe.aomori.jp",
"hashikami.aomori.jp",
"hiranai.aomori.jp",
"hirosaki.aomori.jp",
"itayanagi.aomori.jp",
"kuroishi.aomori.jp",
"misawa.aomori.jp",
"mutsu.aomori.jp",
"nakadomari.aomori.jp",
"noheji.aomori.jp",
"oirase.aomori.jp",
"owani.aomori.jp",
"rokunohe.aomori.jp",
"sannohe.aomori.jp",
"shichinohe.aomori.jp",
"shingo.aomori.jp",
"takko.aomori.jp",
"towada.aomori.jp",
"tsugaru.aomori.jp",
"tsuruta.aomori.jp",
"abiko.chiba.jp",
"asahi.chiba.jp",
"chonan.chiba.jp",
"chosei.chiba.jp",
"choshi.chiba.jp",
"chuo.chiba.jp",
"funabashi.chiba.jp",
"futtsu.chiba.jp",
"hanamigawa.chiba.jp",
"ichihara.chiba.jp",
"ichikawa.chiba.jp",
"ichinomiya.chiba.jp",
"inzai.chiba.jp",
"isumi.chiba.jp",
"kamagaya.chiba.jp",
"kamogawa.chiba.jp",
"kashiwa.chiba.jp",
"katori.chiba.jp",
"katsuura.chiba.jp",
"kimitsu.chiba.jp",
"kisarazu.chiba.jp",
"kozaki.chiba.jp",
"kujukuri.chiba.jp",
"kyonan.chiba.jp",
"matsudo.chiba.jp",
"midori.chiba.jp",
"mihama.chiba.jp",
"minamiboso.chiba.jp",
"mobara.chiba.jp",
"mutsuzawa.chiba.jp",
"nagara.chiba.jp",
"nagareyama.chiba.jp",
"narashino.chiba.jp",
"narita.chiba.jp",
"noda.chiba.jp",
"oamishirasato.chiba.jp",
"omigawa.chiba.jp",
"onjuku.chiba.jp",
"otaki.chiba.jp",
"sakae.chiba.jp",
"sakura.chiba.jp",
"shimofusa.chiba.jp",
"shirako.chiba.jp",
"shiroi.chiba.jp",
"shisui.chiba.jp",
"sodegaura.chiba.jp",
"sosa.chiba.jp",
"tako.chiba.jp",
"tateyama.chiba.jp",
"togane.chiba.jp",
"tohnosho.chiba.jp",
"tomisato.chiba.jp",
"urayasu.chiba.jp",
"yachimata.chiba.jp",
"yachiyo.chiba.jp",
"yokaichiba.chiba.jp",
"yokoshibahikari.chiba.jp",
"yotsukaido.chiba.jp",
"ainan.ehime.jp",
"honai.ehime.jp",
"ikata.ehime.jp",
"imabari.ehime.jp",
"iyo.ehime.jp",
"kamijima.ehime.jp",
"kihoku.ehime.jp",
"kumakogen.ehime.jp",
"masaki.ehime.jp",
"matsuno.ehime.jp",
"matsuyama.ehime.jp",
"namikata.ehime.jp",
"niihama.ehime.jp",
"ozu.ehime.jp",
"saijo.ehime.jp",
"seiyo.ehime.jp",
"shikokuchuo.ehime.jp",
"tobe.ehime.jp",
"toon.ehime.jp",
"uchiko.ehime.jp",
"uwajima.ehime.jp",
"yawatahama.ehime.jp",
"echizen.fukui.jp",
"eiheiji.fukui.jp",
"fukui.fukui.jp",
"ikeda.fukui.jp",
"katsuyama.fukui.jp",
"mihama.fukui.jp",
"minamiechizen.fukui.jp",
"obama.fukui.jp",
"ohi.fukui.jp",
"ono.fukui.jp",
"sabae.fukui.jp",
"sakai.fukui.jp",
"takahama.fukui.jp",
"tsuruga.fukui.jp",
"wakasa.fukui.jp",
"ashiya.fukuoka.jp",
"buzen.fukuoka.jp",
"chikugo.fukuoka.jp",
"chikuho.fukuoka.jp",
"chikujo.fukuoka.jp",
"chikushino.fukuoka.jp",
"chikuzen.fukuoka.jp",
"chuo.fukuoka.jp",
"dazaifu.fukuoka.jp",
"fukuchi.fukuoka.jp",
"hakata.fukuoka.jp",
"higashi.fukuoka.jp",
"hirokawa.fukuoka.jp",
"hisayama.fukuoka.jp",
"iizuka.fukuoka.jp",
"inatsuki.fukuoka.jp",
"kaho.fukuoka.jp",
"kasuga.fukuoka.jp",
"kasuya.fukuoka.jp",
"kawara.fukuoka.jp",
"keisen.fukuoka.jp",
"koga.fukuoka.jp",
"kurate.fukuoka.jp",
"kurogi.fukuoka.jp",
"kurume.fukuoka.jp",
"minami.fukuoka.jp",
"miyako.fukuoka.jp",
"miyama.fukuoka.jp",
"miyawaka.fukuoka.jp",
"mizumaki.fukuoka.jp",
"munakata.fukuoka.jp",
"nakagawa.fukuoka.jp",
"nakama.fukuoka.jp",
"nishi.fukuoka.jp",
"nogata.fukuoka.jp",
"ogori.fukuoka.jp",
"okagaki.fukuoka.jp",
"okawa.fukuoka.jp",
"oki.fukuoka.jp",
"omuta.fukuoka.jp",
"onga.fukuoka.jp",
"onojo.fukuoka.jp",
"oto.fukuoka.jp",
"saigawa.fukuoka.jp",
"sasaguri.fukuoka.jp",
"shingu.fukuoka.jp",
"shinyoshitomi.fukuoka.jp",
"shonai.fukuoka.jp",
"soeda.fukuoka.jp",
"sue.fukuoka.jp",
"tachiarai.fukuoka.jp",
"tagawa.fukuoka.jp",
"takata.fukuoka.jp",
"toho.fukuoka.jp",
"toyotsu.fukuoka.jp",
"tsuiki.fukuoka.jp",
"ukiha.fukuoka.jp",
"umi.fukuoka.jp",
"usui.fukuoka.jp",
"yamada.fukuoka.jp",
"yame.fukuoka.jp",
"yanagawa.fukuoka.jp",
"yukuhashi.fukuoka.jp",
"aizubange.fukushima.jp",
"aizumisato.fukushima.jp",
"aizuwakamatsu.fukushima.jp",
"asakawa.fukushima.jp",
"bandai.fukushima.jp",
"date.fukushima.jp",
"fukushima.fukushima.jp",
"furudono.fukushima.jp",
"futaba.fukushima.jp",
"hanawa.fukushima.jp",
"higashi.fukushima.jp",
"hirata.fukushima.jp",
"hirono.fukushima.jp",
"iitate.fukushima.jp",
"inawashiro.fukushima.jp",
"ishikawa.fukushima.jp",
"iwaki.fukushima.jp",
"izumizaki.fukushima.jp",
"kagamiishi.fukushima.jp",
"kaneyama.fukushima.jp",
"kawamata.fukushima.jp",
"kitakata.fukushima.jp",
"kitashiobara.fukushima.jp",
"koori.fukushima.jp",
"koriyama.fukushima.jp",
"kunimi.fukushima.jp",
"miharu.fukushima.jp",
"mishima.fukushima.jp",
"namie.fukushima.jp",
"nango.fukushima.jp",
"nishiaizu.fukushima.jp",
"nishigo.fukushima.jp",
"okuma.fukushima.jp",
"omotego.fukushima.jp",
"ono.fukushima.jp",
"otama.fukushima.jp",
"samegawa.fukushima.jp",
"shimogo.fukushima.jp",
"shirakawa.fukushima.jp",
"showa.fukushima.jp",
"soma.fukushima.jp",
"sukagawa.fukushima.jp",
"taishin.fukushima.jp",
"tamakawa.fukushima.jp",
"tanagura.fukushima.jp",
"tenei.fukushima.jp",
"yabuki.fukushima.jp",
"yamato.fukushima.jp",
"yamatsuri.fukushima.jp",
"yanaizu.fukushima.jp",
"yugawa.fukushima.jp",
"anpachi.gifu.jp",
"ena.gifu.jp",
"gifu.gifu.jp",
"ginan.gifu.jp",
"godo.gifu.jp",
"gujo.gifu.jp",
"hashima.gifu.jp",
"hichiso.gifu.jp",
"hida.gifu.jp",
"higashishirakawa.gifu.jp",
"ibigawa.gifu.jp",
"ikeda.gifu.jp",
"kakamigahara.gifu.jp",
"kani.gifu.jp",
"kasahara.gifu.jp",
"kasamatsu.gifu.jp",
"kawaue.gifu.jp",
"kitagata.gifu.jp",
"mino.gifu.jp",
"minokamo.gifu.jp",
"mitake.gifu.jp",
"mizunami.gifu.jp",
"motosu.gifu.jp",
"nakatsugawa.gifu.jp",
"ogaki.gifu.jp",
"sakahogi.gifu.jp",
"seki.gifu.jp",
"sekigahara.gifu.jp",
"shirakawa.gifu.jp",
"tajimi.gifu.jp",
"takayama.gifu.jp",
"tarui.gifu.jp",
"toki.gifu.jp",
"tomika.gifu.jp",
"wanouchi.gifu.jp",
"yamagata.gifu.jp",
"yaotsu.gifu.jp",
"yoro.gifu.jp",
"annaka.gunma.jp",
"chiyoda.gunma.jp",
"fujioka.gunma.jp",
"higashiagatsuma.gunma.jp",
"isesaki.gunma.jp",
"itakura.gunma.jp",
"kanna.gunma.jp",
"kanra.gunma.jp",
"katashina.gunma.jp",
"kawaba.gunma.jp",
"kiryu.gunma.jp",
"kusatsu.gunma.jp",
"maebashi.gunma.jp",
"meiwa.gunma.jp",
"midori.gunma.jp",
"minakami.gunma.jp",
"naganohara.gunma.jp",
"nakanojo.gunma.jp",
"nanmoku.gunma.jp",
"numata.gunma.jp",
"oizumi.gunma.jp",
"ora.gunma.jp",
"ota.gunma.jp",
"shibukawa.gunma.jp",
"shimonita.gunma.jp",
"shinto.gunma.jp",
"showa.gunma.jp",
"takasaki.gunma.jp",
"takayama.gunma.jp",
"tamamura.gunma.jp",
"tatebayashi.gunma.jp",
"tomioka.gunma.jp",
"tsukiyono.gunma.jp",
"tsumagoi.gunma.jp",
"ueno.gunma.jp",
"yoshioka.gunma.jp",
"asaminami.hiroshima.jp",
"daiwa.hiroshima.jp",
"etajima.hiroshima.jp",
"fuchu.hiroshima.jp",
"fukuyama.hiroshima.jp",
"hatsukaichi.hiroshima.jp",
"higashihiroshima.hiroshima.jp",
"hongo.hiroshima.jp",
"jinsekikogen.hiroshima.jp",
"kaita.hiroshima.jp",
"kui.hiroshima.jp",
"kumano.hiroshima.jp",
"kure.hiroshima.jp",
"mihara.hiroshima.jp",
"miyoshi.hiroshima.jp",
"naka.hiroshima.jp",
"onomichi.hiroshima.jp",
"osakikamijima.hiroshima.jp",
"otake.hiroshima.jp",
"saka.hiroshima.jp",
"sera.hiroshima.jp",
"seranishi.hiroshima.jp",
"shinichi.hiroshima.jp",
"shobara.hiroshima.jp",
"takehara.hiroshima.jp",
"abashiri.hokkaido.jp",
"abira.hokkaido.jp",
"aibetsu.hokkaido.jp",
"akabira.hokkaido.jp",
"akkeshi.hokkaido.jp",
"asahikawa.hokkaido.jp",
"ashibetsu.hokkaido.jp",
"ashoro.hokkaido.jp",
"assabu.hokkaido.jp",
"atsuma.hokkaido.jp",
"bibai.hokkaido.jp",
"biei.hokkaido.jp",
"bifuka.hokkaido.jp",
"bihoro.hokkaido.jp",
"biratori.hokkaido.jp",
"chippubetsu.hokkaido.jp",
"chitose.hokkaido.jp",
"date.hokkaido.jp",
"ebetsu.hokkaido.jp",
"embetsu.hokkaido.jp",
"eniwa.hokkaido.jp",
"erimo.hokkaido.jp",
"esan.hokkaido.jp",
"esashi.hokkaido.jp",
"fukagawa.hokkaido.jp",
"fukushima.hokkaido.jp",
"furano.hokkaido.jp",
"furubira.hokkaido.jp",
"haboro.hokkaido.jp",
"hakodate.hokkaido.jp",
"hamatonbetsu.hokkaido.jp",
"hidaka.hokkaido.jp",
"higashikagura.hokkaido.jp",
"higashikawa.hokkaido.jp",
"hiroo.hokkaido.jp",
"hokuryu.hokkaido.jp",
"hokuto.hokkaido.jp",
"honbetsu.hokkaido.jp",
"horokanai.hokkaido.jp",
"horonobe.hokkaido.jp",
"ikeda.hokkaido.jp",
"imakane.hokkaido.jp",
"ishikari.hokkaido.jp",
"iwamizawa.hokkaido.jp",
"iwanai.hokkaido.jp",
"kamifurano.hokkaido.jp",
"kamikawa.hokkaido.jp",
"kamishihoro.hokkaido.jp",
"kamisunagawa.hokkaido.jp",
"kamoenai.hokkaido.jp",
"kayabe.hokkaido.jp",
"kembuchi.hokkaido.jp",
"kikonai.hokkaido.jp",
"kimobetsu.hokkaido.jp",
"kitahiroshima.hokkaido.jp",
"kitami.hokkaido.jp",
"kiyosato.hokkaido.jp",
"koshimizu.hokkaido.jp",
"kunneppu.hokkaido.jp",
"kuriyama.hokkaido.jp",
"kuromatsunai.hokkaido.jp",
"kushiro.hokkaido.jp",
"kutchan.hokkaido.jp",
"kyowa.hokkaido.jp",
"mashike.hokkaido.jp",
"matsumae.hokkaido.jp",
"mikasa.hokkaido.jp",
"minamifurano.hokkaido.jp",
"mombetsu.hokkaido.jp",
"moseushi.hokkaido.jp",
"mukawa.hokkaido.jp",
"muroran.hokkaido.jp",
"naie.hokkaido.jp",
"nakagawa.hokkaido.jp",
"nakasatsunai.hokkaido.jp",
"nakatombetsu.hokkaido.jp",
"nanae.hokkaido.jp",
"nanporo.hokkaido.jp",
"nayoro.hokkaido.jp",
"nemuro.hokkaido.jp",
"niikappu.hokkaido.jp",
"niki.hokkaido.jp",
"nishiokoppe.hokkaido.jp",
"noboribetsu.hokkaido.jp",
"numata.hokkaido.jp",
"obihiro.hokkaido.jp",
"obira.hokkaido.jp",
"oketo.hokkaido.jp",
"okoppe.hokkaido.jp",
"otaru.hokkaido.jp",
"otobe.hokkaido.jp",
"otofuke.hokkaido.jp",
"otoineppu.hokkaido.jp",
"oumu.hokkaido.jp",
"ozora.hokkaido.jp",
"pippu.hokkaido.jp",
"rankoshi.hokkaido.jp",
"rebun.hokkaido.jp",
"rikubetsu.hokkaido.jp",
"rishiri.hokkaido.jp",
"rishirifuji.hokkaido.jp",
"saroma.hokkaido.jp",
"sarufutsu.hokkaido.jp",
"shakotan.hokkaido.jp",
"shari.hokkaido.jp",
"shibecha.hokkaido.jp",
"shibetsu.hokkaido.jp",
"shikabe.hokkaido.jp",
"shikaoi.hokkaido.jp",
"shimamaki.hokkaido.jp",
"shimizu.hokkaido.jp",
"shimokawa.hokkaido.jp",
"shinshinotsu.hokkaido.jp",
"shintoku.hokkaido.jp",
"shiranuka.hokkaido.jp",
"shiraoi.hokkaido.jp",
"shiriuchi.hokkaido.jp",
"sobetsu.hokkaido.jp",
"sunagawa.hokkaido.jp",
"taiki.hokkaido.jp",
"takasu.hokkaido.jp",
"takikawa.hokkaido.jp",
"takinoue.hokkaido.jp",
"teshikaga.hokkaido.jp",
"tobetsu.hokkaido.jp",
"tohma.hokkaido.jp",
"tomakomai.hokkaido.jp",
"tomari.hokkaido.jp",
"toya.hokkaido.jp",
"toyako.hokkaido.jp",
"toyotomi.hokkaido.jp",
"toyoura.hokkaido.jp",
"tsubetsu.hokkaido.jp",
"tsukigata.hokkaido.jp",
"urakawa.hokkaido.jp",
"urausu.hokkaido.jp",
"uryu.hokkaido.jp",
"utashinai.hokkaido.jp",
"wakkanai.hokkaido.jp",
"wassamu.hokkaido.jp",
"yakumo.hokkaido.jp",
"yoichi.hokkaido.jp",
"aioi.hyogo.jp",
"akashi.hyogo.jp",
"ako.hyogo.jp",
"amagasaki.hyogo.jp",
"aogaki.hyogo.jp",
"asago.hyogo.jp",
"ashiya.hyogo.jp",
"awaji.hyogo.jp",
"fukusaki.hyogo.jp",
"goshiki.hyogo.jp",
"harima.hyogo.jp",
"himeji.hyogo.jp",
"ichikawa.hyogo.jp",
"inagawa.hyogo.jp",
"itami.hyogo.jp",
"kakogawa.hyogo.jp",
"kamigori.hyogo.jp",
"kamikawa.hyogo.jp",
"kasai.hyogo.jp",
"kasuga.hyogo.jp",
"kawanishi.hyogo.jp",
"miki.hyogo.jp",
"minamiawaji.hyogo.jp",
"nishinomiya.hyogo.jp",
"nishiwaki.hyogo.jp",
"ono.hyogo.jp",
"sanda.hyogo.jp",
"sannan.hyogo.jp",
"sasayama.hyogo.jp",
"sayo.hyogo.jp",
"shingu.hyogo.jp",
"shinonsen.hyogo.jp",
"shiso.hyogo.jp",
"sumoto.hyogo.jp",
"taishi.hyogo.jp",
"taka.hyogo.jp",
"takarazuka.hyogo.jp",
"takasago.hyogo.jp",
"takino.hyogo.jp",
"tamba.hyogo.jp",
"tatsuno.hyogo.jp",
"toyooka.hyogo.jp",
"yabu.hyogo.jp",
"yashiro.hyogo.jp",
"yoka.hyogo.jp",
"yokawa.hyogo.jp",
"ami.ibaraki.jp",
"asahi.ibaraki.jp",
"bando.ibaraki.jp",
"chikusei.ibaraki.jp",
"daigo.ibaraki.jp",
"fujishiro.ibaraki.jp",
"hitachi.ibaraki.jp",
"hitachinaka.ibaraki.jp",
"hitachiomiya.ibaraki.jp",
"hitachiota.ibaraki.jp",
"ibaraki.ibaraki.jp",
"ina.ibaraki.jp",
"inashiki.ibaraki.jp",
"itako.ibaraki.jp",
"iwama.ibaraki.jp",
"joso.ibaraki.jp",
"kamisu.ibaraki.jp",
"kasama.ibaraki.jp",
"kashima.ibaraki.jp",
"kasumigaura.ibaraki.jp",
"koga.ibaraki.jp",
"miho.ibaraki.jp",
"mito.ibaraki.jp",
"moriya.ibaraki.jp",
"naka.ibaraki.jp",
"namegata.ibaraki.jp",
"oarai.ibaraki.jp",
"ogawa.ibaraki.jp",
"omitama.ibaraki.jp",
"ryugasaki.ibaraki.jp",
"sakai.ibaraki.jp",
"sakuragawa.ibaraki.jp",
"shimodate.ibaraki.jp",
"shimotsuma.ibaraki.jp",
"shirosato.ibaraki.jp",
"sowa.ibaraki.jp",
"suifu.ibaraki.jp",
"takahagi.ibaraki.jp",
"tamatsukuri.ibaraki.jp",
"tokai.ibaraki.jp",
"tomobe.ibaraki.jp",
"tone.ibaraki.jp",
"toride.ibaraki.jp",
"tsuchiura.ibaraki.jp",
"tsukuba.ibaraki.jp",
"uchihara.ibaraki.jp",
"ushiku.ibaraki.jp",
"yachiyo.ibaraki.jp",
"yamagata.ibaraki.jp",
"yawara.ibaraki.jp",
"yuki.ibaraki.jp",
"anamizu.ishikawa.jp",
"hakui.ishikawa.jp",
"hakusan.ishikawa.jp",
"kaga.ishikawa.jp",
"kahoku.ishikawa.jp",
"kanazawa.ishikawa.jp",
"kawakita.ishikawa.jp",
"komatsu.ishikawa.jp",
"nakanoto.ishikawa.jp",
"nanao.ishikawa.jp",
"nomi.ishikawa.jp",
"nonoichi.ishikawa.jp",
"noto.ishikawa.jp",
"shika.ishikawa.jp",
"suzu.ishikawa.jp",
"tsubata.ishikawa.jp",
"tsurugi.ishikawa.jp",
"uchinada.ishikawa.jp",
"wajima.ishikawa.jp",
"fudai.iwate.jp",
"fujisawa.iwate.jp",
"hanamaki.iwate.jp",
"hiraizumi.iwate.jp",
"hirono.iwate.jp",
"ichinohe.iwate.jp",
"ichinoseki.iwate.jp",
"iwaizumi.iwate.jp",
"iwate.iwate.jp",
"joboji.iwate.jp",
"kamaishi.iwate.jp",
"kanegasaki.iwate.jp",
"karumai.iwate.jp",
"kawai.iwate.jp",
"kitakami.iwate.jp",
"kuji.iwate.jp",
"kunohe.iwate.jp",
"kuzumaki.iwate.jp",
"miyako.iwate.jp",
"mizusawa.iwate.jp",
"morioka.iwate.jp",
"ninohe.iwate.jp",
"noda.iwate.jp",
"ofunato.iwate.jp",
"oshu.iwate.jp",
"otsuchi.iwate.jp",
"rikuzentakata.iwate.jp",
"shiwa.iwate.jp",
"shizukuishi.iwate.jp",
"sumita.iwate.jp",
"tanohata.iwate.jp",
"tono.iwate.jp",
"yahaba.iwate.jp",
"yamada.iwate.jp",
"ayagawa.kagawa.jp",
"higashikagawa.kagawa.jp",
"kanonji.kagawa.jp",
"kotohira.kagawa.jp",
"manno.kagawa.jp",
"marugame.kagawa.jp",
"mitoyo.kagawa.jp",
"naoshima.kagawa.jp",
"sanuki.kagawa.jp",
"tadotsu.kagawa.jp",
"takamatsu.kagawa.jp",
"tonosho.kagawa.jp",
"uchinomi.kagawa.jp",
"utazu.kagawa.jp",
"zentsuji.kagawa.jp",
"akune.kagoshima.jp",
"amami.kagoshima.jp",
"hioki.kagoshima.jp",
"isa.kagoshima.jp",
"isen.kagoshima.jp",
"izumi.kagoshima.jp",
"kagoshima.kagoshima.jp",
"kanoya.kagoshima.jp",
"kawanabe.kagoshima.jp",
"kinko.kagoshima.jp",
"kouyama.kagoshima.jp",
"makurazaki.kagoshima.jp",
"matsumoto.kagoshima.jp",
"minamitane.kagoshima.jp",
"nakatane.kagoshima.jp",
"nishinoomote.kagoshima.jp",
"satsumasendai.kagoshima.jp",
"soo.kagoshima.jp",
"tarumizu.kagoshima.jp",
"yusui.kagoshima.jp",
"aikawa.kanagawa.jp",
"atsugi.kanagawa.jp",
"ayase.kanagawa.jp",
"chigasaki.kanagawa.jp",
"ebina.kanagawa.jp",
"fujisawa.kanagawa.jp",
"hadano.kanagawa.jp",
"hakone.kanagawa.jp",
"hiratsuka.kanagawa.jp",
"isehara.kanagawa.jp",
"kaisei.kanagawa.jp",
"kamakura.kanagawa.jp",
"kiyokawa.kanagawa.jp",
"matsuda.kanagawa.jp",
"minamiashigara.kanagawa.jp",
"miura.kanagawa.jp",
"nakai.kanagawa.jp",
"ninomiya.kanagawa.jp",
"odawara.kanagawa.jp",
"oi.kanagawa.jp",
"oiso.kanagawa.jp",
"sagamihara.kanagawa.jp",
"samukawa.kanagawa.jp",
"tsukui.kanagawa.jp",
"yamakita.kanagawa.jp",
"yamato.kanagawa.jp",
"yokosuka.kanagawa.jp",
"yugawara.kanagawa.jp",
"zama.kanagawa.jp",
"zushi.kanagawa.jp",
"aki.kochi.jp",
"geisei.kochi.jp",
"hidaka.kochi.jp",
"higashitsuno.kochi.jp",
"ino.kochi.jp",
"kagami.kochi.jp",
"kami.kochi.jp",
"kitagawa.kochi.jp",
"kochi.kochi.jp",
"mihara.kochi.jp",
"motoyama.kochi.jp",
"muroto.kochi.jp",
"nahari.kochi.jp",
"nakamura.kochi.jp",
"nankoku.kochi.jp",
"nishitosa.kochi.jp",
"niyodogawa.kochi.jp",
"ochi.kochi.jp",
"okawa.kochi.jp",
"otoyo.kochi.jp",
"otsuki.kochi.jp",
"sakawa.kochi.jp",
"sukumo.kochi.jp",
"susaki.kochi.jp",
"tosa.kochi.jp",
"tosashimizu.kochi.jp",
"toyo.kochi.jp",
"tsuno.kochi.jp",
"umaji.kochi.jp",
"yasuda.kochi.jp",
"yusuhara.kochi.jp",
"amakusa.kumamoto.jp",
"arao.kumamoto.jp",
"aso.kumamoto.jp",
"choyo.kumamoto.jp",
"gyokuto.kumamoto.jp",
"kamiamakusa.kumamoto.jp",
"kikuchi.kumamoto.jp",
"kumamoto.kumamoto.jp",
"mashiki.kumamoto.jp",
"mifune.kumamoto.jp",
"minamata.kumamoto.jp",
"minamioguni.kumamoto.jp",
"nagasu.kumamoto.jp",
"nishihara.kumamoto.jp",
"oguni.kumamoto.jp",
"ozu.kumamoto.jp",
"sumoto.kumamoto.jp",
"takamori.kumamoto.jp",
"uki.kumamoto.jp",
"uto.kumamoto.jp",
"yamaga.kumamoto.jp",
"yamato.kumamoto.jp",
"yatsushiro.kumamoto.jp",
"ayabe.kyoto.jp",
"fukuchiyama.kyoto.jp",
"higashiyama.kyoto.jp",
"ide.kyoto.jp",
"ine.kyoto.jp",
"joyo.kyoto.jp",
"kameoka.kyoto.jp",
"kamo.kyoto.jp",
"kita.kyoto.jp",
"kizu.kyoto.jp",
"kumiyama.kyoto.jp",
"kyotamba.kyoto.jp",
"kyotanabe.kyoto.jp",
"kyotango.kyoto.jp",
"maizuru.kyoto.jp",
"minami.kyoto.jp",
"minamiyamashiro.kyoto.jp",
"miyazu.kyoto.jp",
"muko.kyoto.jp",
"nagaokakyo.kyoto.jp",
"nakagyo.kyoto.jp",
"nantan.kyoto.jp",
"oyamazaki.kyoto.jp",
"sakyo.kyoto.jp",
"seika.kyoto.jp",
"tanabe.kyoto.jp",
"uji.kyoto.jp",
"ujitawara.kyoto.jp",
"wazuka.kyoto.jp",
"yamashina.kyoto.jp",
"yawata.kyoto.jp",
"asahi.mie.jp",
"inabe.mie.jp",
"ise.mie.jp",
"kameyama.mie.jp",
"kawagoe.mie.jp",
"kiho.mie.jp",
"kisosaki.mie.jp",
"kiwa.mie.jp",
"komono.mie.jp",
"kumano.mie.jp",
"kuwana.mie.jp",
"matsusaka.mie.jp",
"meiwa.mie.jp",
"mihama.mie.jp",
"minamiise.mie.jp",
"misugi.mie.jp",
"miyama.mie.jp",
"nabari.mie.jp",
"shima.mie.jp",
"suzuka.mie.jp",
"tado.mie.jp",
"taiki.mie.jp",
"taki.mie.jp",
"tamaki.mie.jp",
"toba.mie.jp",
"tsu.mie.jp",
"udono.mie.jp",
"ureshino.mie.jp",
"watarai.mie.jp",
"yokkaichi.mie.jp",
"furukawa.miyagi.jp",
"higashimatsushima.miyagi.jp",
"ishinomaki.miyagi.jp",
"iwanuma.miyagi.jp",
"kakuda.miyagi.jp",
"kami.miyagi.jp",
"kawasaki.miyagi.jp",
"marumori.miyagi.jp",
"matsushima.miyagi.jp",
"minamisanriku.miyagi.jp",
"misato.miyagi.jp",
"murata.miyagi.jp",
"natori.miyagi.jp",
"ogawara.miyagi.jp",
"ohira.miyagi.jp",
"onagawa.miyagi.jp",
"osaki.miyagi.jp",
"rifu.miyagi.jp",
"semine.miyagi.jp",
"shibata.miyagi.jp",
"shichikashuku.miyagi.jp",
"shikama.miyagi.jp",
"shiogama.miyagi.jp",
"shiroishi.miyagi.jp",
"tagajo.miyagi.jp",
"taiwa.miyagi.jp",
"tome.miyagi.jp",
"tomiya.miyagi.jp",
"wakuya.miyagi.jp",
"watari.miyagi.jp",
"yamamoto.miyagi.jp",
"zao.miyagi.jp",
"aya.miyazaki.jp",
"ebino.miyazaki.jp",
"gokase.miyazaki.jp",
"hyuga.miyazaki.jp",
"kadogawa.miyazaki.jp",
"kawaminami.miyazaki.jp",
"kijo.miyazaki.jp",
"kitagawa.miyazaki.jp",
"kitakata.miyazaki.jp",
"kitaura.miyazaki.jp",
"kobayashi.miyazaki.jp",
"kunitomi.miyazaki.jp",
"kushima.miyazaki.jp",
"mimata.miyazaki.jp",
"miyakonojo.miyazaki.jp",
"miyazaki.miyazaki.jp",
"morotsuka.miyazaki.jp",
"nichinan.miyazaki.jp",
"nishimera.miyazaki.jp",
"nobeoka.miyazaki.jp",
"saito.miyazaki.jp",
"shiiba.miyazaki.jp",
"shintomi.miyazaki.jp",
"takaharu.miyazaki.jp",
"takanabe.miyazaki.jp",
"takazaki.miyazaki.jp",
"tsuno.miyazaki.jp",
"achi.nagano.jp",
"agematsu.nagano.jp",
"anan.nagano.jp",
"aoki.nagano.jp",
"asahi.nagano.jp",
"azumino.nagano.jp",
"chikuhoku.nagano.jp",
"chikuma.nagano.jp",
"chino.nagano.jp",
"fujimi.nagano.jp",
"hakuba.nagano.jp",
"hara.nagano.jp",
"hiraya.nagano.jp",
"iida.nagano.jp",
"iijima.nagano.jp",
"iiyama.nagano.jp",
"iizuna.nagano.jp",
"ikeda.nagano.jp",
"ikusaka.nagano.jp",
"ina.nagano.jp",
"karuizawa.nagano.jp",
"kawakami.nagano.jp",
"kiso.nagano.jp",
"kisofukushima.nagano.jp",
"kitaaiki.nagano.jp",
"komagane.nagano.jp",
"komoro.nagano.jp",
"matsukawa.nagano.jp",
"matsumoto.nagano.jp",
"miasa.nagano.jp",
"minamiaiki.nagano.jp",
"minamimaki.nagano.jp",
"minamiminowa.nagano.jp",
"minowa.nagano.jp",
"miyada.nagano.jp",
"miyota.nagano.jp",
"mochizuki.nagano.jp",
"nagano.nagano.jp",
"nagawa.nagano.jp",
"nagiso.nagano.jp",
"nakagawa.nagano.jp",
"nakano.nagano.jp",
"nozawaonsen.nagano.jp",
"obuse.nagano.jp",
"ogawa.nagano.jp",
"okaya.nagano.jp",
"omachi.nagano.jp",
"omi.nagano.jp",
"ookuwa.nagano.jp",
"ooshika.nagano.jp",
"otaki.nagano.jp",
"otari.nagano.jp",
"sakae.nagano.jp",
"sakaki.nagano.jp",
"saku.nagano.jp",
"sakuho.nagano.jp",
"shimosuwa.nagano.jp",
"shinanomachi.nagano.jp",
"shiojiri.nagano.jp",
"suwa.nagano.jp",
"suzaka.nagano.jp",
"takagi.nagano.jp",
"takamori.nagano.jp",
"takayama.nagano.jp",
"tateshina.nagano.jp",
"tatsuno.nagano.jp",
"togakushi.nagano.jp",
"togura.nagano.jp",
"tomi.nagano.jp",
"ueda.nagano.jp",
"wada.nagano.jp",
"yamagata.nagano.jp",
"yamanouchi.nagano.jp",
"yasaka.nagano.jp",
"yasuoka.nagano.jp",
"chijiwa.nagasaki.jp",
"futsu.nagasaki.jp",
"goto.nagasaki.jp",
"hasami.nagasaki.jp",
"hirado.nagasaki.jp",
"iki.nagasaki.jp",
"isahaya.nagasaki.jp",
"kawatana.nagasaki.jp",
"kuchinotsu.nagasaki.jp",
"matsuura.nagasaki.jp",
"nagasaki.nagasaki.jp",
"obama.nagasaki.jp",
"omura.nagasaki.jp",
"oseto.nagasaki.jp",
"saikai.nagasaki.jp",
"sasebo.nagasaki.jp",
"seihi.nagasaki.jp",
"shimabara.nagasaki.jp",
"shinkamigoto.nagasaki.jp",
"togitsu.nagasaki.jp",
"tsushima.nagasaki.jp",
"unzen.nagasaki.jp",
"ando.nara.jp",
"gose.nara.jp",
"heguri.nara.jp",
"higashiyoshino.nara.jp",
"ikaruga.nara.jp",
"ikoma.nara.jp",
"kamikitayama.nara.jp",
"kanmaki.nara.jp",
"kashiba.nara.jp",
"kashihara.nara.jp",
"katsuragi.nara.jp",
"kawai.nara.jp",
"kawakami.nara.jp",
"kawanishi.nara.jp",
"koryo.nara.jp",
"kurotaki.nara.jp",
"mitsue.nara.jp",
"miyake.nara.jp",
"nara.nara.jp",
"nosegawa.nara.jp",
"oji.nara.jp",
"ouda.nara.jp",
"oyodo.nara.jp",
"sakurai.nara.jp",
"sango.nara.jp",
"shimoichi.nara.jp",
"shimokitayama.nara.jp",
"shinjo.nara.jp",
"soni.nara.jp",
"takatori.nara.jp",
"tawaramoto.nara.jp",
"tenkawa.nara.jp",
"tenri.nara.jp",
"uda.nara.jp",
"yamatokoriyama.nara.jp",
"yamatotakada.nara.jp",
"yamazoe.nara.jp",
"yoshino.nara.jp",
"aga.niigata.jp",
"agano.niigata.jp",
"gosen.niigata.jp",
"itoigawa.niigata.jp",
"izumozaki.niigata.jp",
"joetsu.niigata.jp",
"kamo.niigata.jp",
"kariwa.niigata.jp",
"kashiwazaki.niigata.jp",
"minamiuonuma.niigata.jp",
"mitsuke.niigata.jp",
"muika.niigata.jp",
"murakami.niigata.jp",
"myoko.niigata.jp",
"nagaoka.niigata.jp",
"niigata.niigata.jp",
"ojiya.niigata.jp",
"omi.niigata.jp",
"sado.niigata.jp",
"sanjo.niigata.jp",
"seiro.niigata.jp",
"seirou.niigata.jp",
"sekikawa.niigata.jp",
"shibata.niigata.jp",
"tagami.niigata.jp",
"tainai.niigata.jp",
"tochio.niigata.jp",
"tokamachi.niigata.jp",
"tsubame.niigata.jp",
"tsunan.niigata.jp",
"uonuma.niigata.jp",
"yahiko.niigata.jp",
"yoita.niigata.jp",
"yuzawa.niigata.jp",
"beppu.oita.jp",
"bungoono.oita.jp",
"bungotakada.oita.jp",
"hasama.oita.jp",
"hiji.oita.jp",
"himeshima.oita.jp",
"hita.oita.jp",
"kamitsue.oita.jp",
"kokonoe.oita.jp",
"kuju.oita.jp",
"kunisaki.oita.jp",
"kusu.oita.jp",
"oita.oita.jp",
"saiki.oita.jp",
"taketa.oita.jp",
"tsukumi.oita.jp",
"usa.oita.jp",
"usuki.oita.jp",
"yufu.oita.jp",
"akaiwa.okayama.jp",
"asakuchi.okayama.jp",
"bizen.okayama.jp",
"hayashima.okayama.jp",
"ibara.okayama.jp",
"kagamino.okayama.jp",
"kasaoka.okayama.jp",
"kibichuo.okayama.jp",
"kumenan.okayama.jp",
"kurashiki.okayama.jp",
"maniwa.okayama.jp",
"misaki.okayama.jp",
"nagi.okayama.jp",
"niimi.okayama.jp",
"nishiawakura.okayama.jp",
"okayama.okayama.jp",
"satosho.okayama.jp",
"setouchi.okayama.jp",
"shinjo.okayama.jp",
"shoo.okayama.jp",
"soja.okayama.jp",
"takahashi.okayama.jp",
"tamano.okayama.jp",
"tsuyama.okayama.jp",
"wake.okayama.jp",
"yakage.okayama.jp",
"aguni.okinawa.jp",
"ginowan.okinawa.jp",
"ginoza.okinawa.jp",
"gushikami.okinawa.jp",
"haebaru.okinawa.jp",
"higashi.okinawa.jp",
"hirara.okinawa.jp",
"iheya.okinawa.jp",
"ishigaki.okinawa.jp",
"ishikawa.okinawa.jp",
"itoman.okinawa.jp",
"izena.okinawa.jp",
"kadena.okinawa.jp",
"kin.okinawa.jp",
"kitadaito.okinawa.jp",
"kitanakagusuku.okinawa.jp",
"kumejima.okinawa.jp",
"kunigami.okinawa.jp",
"minamidaito.okinawa.jp",
"motobu.okinawa.jp",
"nago.okinawa.jp",
"naha.okinawa.jp",
"nakagusuku.okinawa.jp",
"nakijin.okinawa.jp",
"nanjo.okinawa.jp",
"nishihara.okinawa.jp",
"ogimi.okinawa.jp",
"okinawa.okinawa.jp",
"onna.okinawa.jp",
"shimoji.okinawa.jp",
"taketomi.okinawa.jp",
"tarama.okinawa.jp",
"tokashiki.okinawa.jp",
"tomigusuku.okinawa.jp",
"tonaki.okinawa.jp",
"urasoe.okinawa.jp",
"uruma.okinawa.jp",
"yaese.okinawa.jp",
"yomitan.okinawa.jp",
"yonabaru.okinawa.jp",
"yonaguni.okinawa.jp",
"zamami.okinawa.jp",
"abeno.osaka.jp",
"chihayaakasaka.osaka.jp",
"chuo.osaka.jp",
"daito.osaka.jp",
"fujiidera.osaka.jp",
"habikino.osaka.jp",
"hannan.osaka.jp",
"higashiosaka.osaka.jp",
"higashisumiyoshi.osaka.jp",
"higashiyodogawa.osaka.jp",
"hirakata.osaka.jp",
"ibaraki.osaka.jp",
"ikeda.osaka.jp",
"izumi.osaka.jp",
"izumiotsu.osaka.jp",
"izumisano.osaka.jp",
"kadoma.osaka.jp",
"kaizuka.osaka.jp",
"kanan.osaka.jp",
"kashiwara.osaka.jp",
"katano.osaka.jp",
"kawachinagano.osaka.jp",
"kishiwada.osaka.jp",
"kita.osaka.jp",
"kumatori.osaka.jp",
"matsubara.osaka.jp",
"minato.osaka.jp",
"minoh.osaka.jp",
"misaki.osaka.jp",
"moriguchi.osaka.jp",
"neyagawa.osaka.jp",
"nishi.osaka.jp",
"nose.osaka.jp",
"osakasayama.osaka.jp",
"sakai.osaka.jp",
"sayama.osaka.jp",
"sennan.osaka.jp",
"settsu.osaka.jp",
"shijonawate.osaka.jp",
"shimamoto.osaka.jp",
"suita.osaka.jp",
"tadaoka.osaka.jp",
"taishi.osaka.jp",
"tajiri.osaka.jp",
"takaishi.osaka.jp",
"takatsuki.osaka.jp",
"tondabayashi.osaka.jp",
"toyonaka.osaka.jp",
"toyono.osaka.jp",
"yao.osaka.jp",
"ariake.saga.jp",
"arita.saga.jp",
"fukudomi.saga.jp",
"genkai.saga.jp",
"hamatama.saga.jp",
"hizen.saga.jp",
"imari.saga.jp",
"kamimine.saga.jp",
"kanzaki.saga.jp",
"karatsu.saga.jp",
"kashima.saga.jp",
"kitagata.saga.jp",
"kitahata.saga.jp",
"kiyama.saga.jp",
"kouhoku.saga.jp",
"kyuragi.saga.jp",
"nishiarita.saga.jp",
"ogi.saga.jp",
"omachi.saga.jp",
"ouchi.saga.jp",
"saga.saga.jp",
"shiroishi.saga.jp",
"taku.saga.jp",
"tara.saga.jp",
"tosu.saga.jp",
"yoshinogari.saga.jp",
"arakawa.saitama.jp",
"asaka.saitama.jp",
"chichibu.saitama.jp",
"fujimi.saitama.jp",
"fujimino.saitama.jp",
"fukaya.saitama.jp",
"hanno.saitama.jp",
"hanyu.saitama.jp",
"hasuda.saitama.jp",
"hatogaya.saitama.jp",
"hatoyama.saitama.jp",
"hidaka.saitama.jp",
"higashichichibu.saitama.jp",
"higashimatsuyama.saitama.jp",
"honjo.saitama.jp",
"ina.saitama.jp",
"iruma.saitama.jp",
"iwatsuki.saitama.jp",
"kamiizumi.saitama.jp",
"kamikawa.saitama.jp",
"kamisato.saitama.jp",
"kasukabe.saitama.jp",
"kawagoe.saitama.jp",
"kawaguchi.saitama.jp",
"kawajima.saitama.jp",
"kazo.saitama.jp",
"kitamoto.saitama.jp",
"koshigaya.saitama.jp",
"kounosu.saitama.jp",
"kuki.saitama.jp",
"kumagaya.saitama.jp",
"matsubushi.saitama.jp",
"minano.saitama.jp",
"misato.saitama.jp",
"miyashiro.saitama.jp",
"miyoshi.saitama.jp",
"moroyama.saitama.jp",
"nagatoro.saitama.jp",
"namegawa.saitama.jp",
"niiza.saitama.jp",
"ogano.saitama.jp",
"ogawa.saitama.jp",
"ogose.saitama.jp",
"okegawa.saitama.jp",
"omiya.saitama.jp",
"otaki.saitama.jp",
"ranzan.saitama.jp",
"ryokami.saitama.jp",
"saitama.saitama.jp",
"sakado.saitama.jp",
"satte.saitama.jp",
"sayama.saitama.jp",
"shiki.saitama.jp",
"shiraoka.saitama.jp",
"soka.saitama.jp",
"sugito.saitama.jp",
"toda.saitama.jp",
"tokigawa.saitama.jp",
"tokorozawa.saitama.jp",
"tsurugashima.saitama.jp",
"urawa.saitama.jp",
"warabi.saitama.jp",
"yashio.saitama.jp",
"yokoze.saitama.jp",
"yono.saitama.jp",
"yorii.saitama.jp",
"yoshida.saitama.jp",
"yoshikawa.saitama.jp",
"yoshimi.saitama.jp",
"aisho.shiga.jp",
"gamo.shiga.jp",
"higashiomi.shiga.jp",
"hikone.shiga.jp",
"koka.shiga.jp",
"konan.shiga.jp",
"kosei.shiga.jp",
"koto.shiga.jp",
"kusatsu.shiga.jp",
"maibara.shiga.jp",
"moriyama.shiga.jp",
"nagahama.shiga.jp",
"nishiazai.shiga.jp",
"notogawa.shiga.jp",
"omihachiman.shiga.jp",
"otsu.shiga.jp",
"ritto.shiga.jp",
"ryuoh.shiga.jp",
"takashima.shiga.jp",
"takatsuki.shiga.jp",
"torahime.shiga.jp",
"toyosato.shiga.jp",
"yasu.shiga.jp",
"akagi.shimane.jp",
"ama.shimane.jp",
"gotsu.shimane.jp",
"hamada.shimane.jp",
"higashiizumo.shimane.jp",
"hikawa.shimane.jp",
"hikimi.shimane.jp",
"izumo.shimane.jp",
"kakinoki.shimane.jp",
"masuda.shimane.jp",
"matsue.shimane.jp",
"misato.shimane.jp",
"nishinoshima.shimane.jp",
"ohda.shimane.jp",
"okinoshima.shimane.jp",
"okuizumo.shimane.jp",
"shimane.shimane.jp",
"tamayu.shimane.jp",
"tsuwano.shimane.jp",
"unnan.shimane.jp",
"yakumo.shimane.jp",
"yasugi.shimane.jp",
"yatsuka.shimane.jp",
"arai.shizuoka.jp",
"atami.shizuoka.jp",
"fuji.shizuoka.jp",
"fujieda.shizuoka.jp",
"fujikawa.shizuoka.jp",
"fujinomiya.shizuoka.jp",
"fukuroi.shizuoka.jp",
"gotemba.shizuoka.jp",
"haibara.shizuoka.jp",
"hamamatsu.shizuoka.jp",
"higashiizu.shizuoka.jp",
"ito.shizuoka.jp",
"iwata.shizuoka.jp",
"izu.shizuoka.jp",
"izunokuni.shizuoka.jp",
"kakegawa.shizuoka.jp",
"kannami.shizuoka.jp",
"kawanehon.shizuoka.jp",
"kawazu.shizuoka.jp",
"kikugawa.shizuoka.jp",
"kosai.shizuoka.jp",
"makinohara.shizuoka.jp",
"matsuzaki.shizuoka.jp",
"minamiizu.shizuoka.jp",
"mishima.shizuoka.jp",
"morimachi.shizuoka.jp",
"nishiizu.shizuoka.jp",
"numazu.shizuoka.jp",
"omaezaki.shizuoka.jp",
"shimada.shizuoka.jp",
"shimizu.shizuoka.jp",
"shimoda.shizuoka.jp",
"shizuoka.shizuoka.jp",
"susono.shizuoka.jp",
"yaizu.shizuoka.jp",
"yoshida.shizuoka.jp",
"ashikaga.tochigi.jp",
"bato.tochigi.jp",
"haga.tochigi.jp",
"ichikai.tochigi.jp",
"iwafune.tochigi.jp",
"kaminokawa.tochigi.jp",
"kanuma.tochigi.jp",
"karasuyama.tochigi.jp",
"kuroiso.tochigi.jp",
"mashiko.tochigi.jp",
"mibu.tochigi.jp",
"moka.tochigi.jp",
"motegi.tochigi.jp",
"nasu.tochigi.jp",
"nasushiobara.tochigi.jp",
"nikko.tochigi.jp",
"nishikata.tochigi.jp",
"nogi.tochigi.jp",
"ohira.tochigi.jp",
"ohtawara.tochigi.jp",
"oyama.tochigi.jp",
"sakura.tochigi.jp",
"sano.tochigi.jp",
"shimotsuke.tochigi.jp",
"shioya.tochigi.jp",
"takanezawa.tochigi.jp",
"tochigi.tochigi.jp",
"tsuga.tochigi.jp",
"ujiie.tochigi.jp",
"utsunomiya.tochigi.jp",
"yaita.tochigi.jp",
"aizumi.tokushima.jp",
"anan.tokushima.jp",
"ichiba.tokushima.jp",
"itano.tokushima.jp",
"kainan.tokushima.jp",
"komatsushima.tokushima.jp",
"matsushige.tokushima.jp",
"mima.tokushima.jp",
"minami.tokushima.jp",
"miyoshi.tokushima.jp",
"mugi.tokushima.jp",
"nakagawa.tokushima.jp",
"naruto.tokushima.jp",
"sanagochi.tokushima.jp",
"shishikui.tokushima.jp",
"tokushima.tokushima.jp",
"wajiki.tokushima.jp",
"adachi.tokyo.jp",
"akiruno.tokyo.jp",
"akishima.tokyo.jp",
"aogashima.tokyo.jp",
"arakawa.tokyo.jp",
"bunkyo.tokyo.jp",
"chiyoda.tokyo.jp",
"chofu.tokyo.jp",
"chuo.tokyo.jp",
"edogawa.tokyo.jp",
"fuchu.tokyo.jp",
"fussa.tokyo.jp",
"hachijo.tokyo.jp",
"hachioji.tokyo.jp",
"hamura.tokyo.jp",
"higashikurume.tokyo.jp",
"higashimurayama.tokyo.jp",
"higashiyamato.tokyo.jp",
"hino.tokyo.jp",
"hinode.tokyo.jp",
"hinohara.tokyo.jp",
"inagi.tokyo.jp",
"itabashi.tokyo.jp",
"katsushika.tokyo.jp",
"kita.tokyo.jp",
"kiyose.tokyo.jp",
"kodaira.tokyo.jp",
"koganei.tokyo.jp",
"kokubunji.tokyo.jp",
"komae.tokyo.jp",
"koto.tokyo.jp",
"kouzushima.tokyo.jp",
"kunitachi.tokyo.jp",
"machida.tokyo.jp",
"meguro.tokyo.jp",
"minato.tokyo.jp",
"mitaka.tokyo.jp",
"mizuho.tokyo.jp",
"musashimurayama.tokyo.jp",
"musashino.tokyo.jp",
"nakano.tokyo.jp",
"nerima.tokyo.jp",
"ogasawara.tokyo.jp",
"okutama.tokyo.jp",
"ome.tokyo.jp",
"oshima.tokyo.jp",
"ota.tokyo.jp",
"setagaya.tokyo.jp",
"shibuya.tokyo.jp",
"shinagawa.tokyo.jp",
"shinjuku.tokyo.jp",
"suginami.tokyo.jp",
"sumida.tokyo.jp",
"tachikawa.tokyo.jp",
"taito.tokyo.jp",
"tama.tokyo.jp",
"toshima.tokyo.jp",
"chizu.tottori.jp",
"hino.tottori.jp",
"kawahara.tottori.jp",
"koge.tottori.jp",
"kotoura.tottori.jp",
"misasa.tottori.jp",
"nanbu.tottori.jp",
"nichinan.tottori.jp",
"sakaiminato.tottori.jp",
"tottori.tottori.jp",
"wakasa.tottori.jp",
"yazu.tottori.jp",
"yonago.tottori.jp",
"asahi.toyama.jp",
"fuchu.toyama.jp",
"fukumitsu.toyama.jp",
"funahashi.toyama.jp",
"himi.toyama.jp",
"imizu.toyama.jp",
"inami.toyama.jp",
"johana.toyama.jp",
"kamiichi.toyama.jp",
"kurobe.toyama.jp",
"nakaniikawa.toyama.jp",
"namerikawa.toyama.jp",
"nanto.toyama.jp",
"nyuzen.toyama.jp",
"oyabe.toyama.jp",
"taira.toyama.jp",
"takaoka.toyama.jp",
"tateyama.toyama.jp",
"toga.toyama.jp",
"tonami.toyama.jp",
"toyama.toyama.jp",
"unazuki.toyama.jp",
"uozu.toyama.jp",
"yamada.toyama.jp",
"arida.wakayama.jp",
"aridagawa.wakayama.jp",
"gobo.wakayama.jp",
"hashimoto.wakayama.jp",
"hidaka.wakayama.jp",
"hirogawa.wakayama.jp",
"inami.wakayama.jp",
"iwade.wakayama.jp",
"kainan.wakayama.jp",
"kamitonda.wakayama.jp",
"katsuragi.wakayama.jp",
"kimino.wakayama.jp",
"kinokawa.wakayama.jp",
"kitayama.wakayama.jp",
"koya.wakayama.jp",
"koza.wakayama.jp",
"kozagawa.wakayama.jp",
"kudoyama.wakayama.jp",
"kushimoto.wakayama.jp",
"mihama.wakayama.jp",
"misato.wakayama.jp",
"nachikatsuura.wakayama.jp",
"shingu.wakayama.jp",
"shirahama.wakayama.jp",
"taiji.wakayama.jp",
"tanabe.wakayama.jp",
"wakayama.wakayama.jp",
"yuasa.wakayama.jp",
"yura.wakayama.jp",
"asahi.yamagata.jp",
"funagata.yamagata.jp",
"higashine.yamagata.jp",
"iide.yamagata.jp",
"kahoku.yamagata.jp",
"kaminoyama.yamagata.jp",
"kaneyama.yamagata.jp",
"kawanishi.yamagata.jp",
"mamurogawa.yamagata.jp",
"mikawa.yamagata.jp",
"murayama.yamagata.jp",
"nagai.yamagata.jp",
"nakayama.yamagata.jp",
"nanyo.yamagata.jp",
"nishikawa.yamagata.jp",
"obanazawa.yamagata.jp",
"oe.yamagata.jp",
"oguni.yamagata.jp",
"ohkura.yamagata.jp",
"oishida.yamagata.jp",
"sagae.yamagata.jp",
"sakata.yamagata.jp",
"sakegawa.yamagata.jp",
"shinjo.yamagata.jp",
"shirataka.yamagata.jp",
"shonai.yamagata.jp",
"takahata.yamagata.jp",
"tendo.yamagata.jp",
"tozawa.yamagata.jp",
"tsuruoka.yamagata.jp",
"yamagata.yamagata.jp",
"yamanobe.yamagata.jp",
"yonezawa.yamagata.jp",
"yuza.yamagata.jp",
"abu.yamaguchi.jp",
"hagi.yamaguchi.jp",
"hikari.yamaguchi.jp",
"hofu.yamaguchi.jp",
"iwakuni.yamaguchi.jp",
"kudamatsu.yamaguchi.jp",
"mitou.yamaguchi.jp",
"nagato.yamaguchi.jp",
"oshima.yamaguchi.jp",
"shimonoseki.yamaguchi.jp",
"shunan.yamaguchi.jp",
"tabuse.yamaguchi.jp",
"tokuyama.yamaguchi.jp",
"toyota.yamaguchi.jp",
"ube.yamaguchi.jp",
"yuu.yamaguchi.jp",
"chuo.yamanashi.jp",
"doshi.yamanashi.jp",
"fuefuki.yamanashi.jp",
"fujikawa.yamanashi.jp",
"fujikawaguchiko.yamanashi.jp",
"fujiyoshida.yamanashi.jp",
"hayakawa.yamanashi.jp",
"hokuto.yamanashi.jp",
"ichikawamisato.yamanashi.jp",
"kai.yamanashi.jp",
"kofu.yamanashi.jp",
"koshu.yamanashi.jp",
"kosuge.yamanashi.jp",
"minami-alps.yamanashi.jp",
"minobu.yamanashi.jp",
"nakamichi.yamanashi.jp",
"nanbu.yamanashi.jp",
"narusawa.yamanashi.jp",
"nirasaki.yamanashi.jp",
"nishikatsura.yamanashi.jp",
"oshino.yamanashi.jp",
"otsuki.yamanashi.jp",
"showa.yamanashi.jp",
"tabayama.yamanashi.jp",
"tsuru.yamanashi.jp",
"uenohara.yamanashi.jp",
"yamanakako.yamanashi.jp",
"yamanashi.yamanashi.jp",
"ke",
"ac.ke",
"co.ke",
"go.ke",
"info.ke",
"me.ke",
"mobi.ke",
"ne.ke",
"or.ke",
"sc.ke",
"kg",
"org.kg",
"net.kg",
"com.kg",
"edu.kg",
"gov.kg",
"mil.kg",
"*.kh",
"ki",
"edu.ki",
"biz.ki",
"net.ki",
"org.ki",
"gov.ki",
"info.ki",
"com.ki",
"km",
"org.km",
"nom.km",
"gov.km",
"prd.km",
"tm.km",
"edu.km",
"mil.km",
"ass.km",
"com.km",
"coop.km",
"asso.km",
"presse.km",
"medecin.km",
"notaires.km",
"pharmaciens.km",
"veterinaire.km",
"gouv.km",
"kn",
"net.kn",
"org.kn",
"edu.kn",
"gov.kn",
"kp",
"com.kp",
"edu.kp",
"gov.kp",
"org.kp",
"rep.kp",
"tra.kp",
"kr",
"ac.kr",
"co.kr",
"es.kr",
"go.kr",
"hs.kr",
"kg.kr",
"mil.kr",
"ms.kr",
"ne.kr",
"or.kr",
"pe.kr",
"re.kr",
"sc.kr",
"busan.kr",
"chungbuk.kr",
"chungnam.kr",
"daegu.kr",
"daejeon.kr",
"gangwon.kr",
"gwangju.kr",
"gyeongbuk.kr",
"gyeonggi.kr",
"gyeongnam.kr",
"incheon.kr",
"jeju.kr",
"jeonbuk.kr",
"jeonnam.kr",
"seoul.kr",
"ulsan.kr",
"kw",
"com.kw",
"edu.kw",
"emb.kw",
"gov.kw",
"ind.kw",
"net.kw",
"org.kw",
"ky",
"com.ky",
"edu.ky",
"net.ky",
"org.ky",
"kz",
"org.kz",
"edu.kz",
"net.kz",
"gov.kz",
"mil.kz",
"com.kz",
"la",
"int.la",
"net.la",
"info.la",
"edu.la",
"gov.la",
"per.la",
"com.la",
"org.la",
"lb",
"com.lb",
"edu.lb",
"gov.lb",
"net.lb",
"org.lb",
"lc",
"com.lc",
"net.lc",
"co.lc",
"org.lc",
"edu.lc",
"gov.lc",
"li",
"lk",
"gov.lk",
"sch.lk",
"net.lk",
"int.lk",
"com.lk",
"org.lk",
"edu.lk",
"ngo.lk",
"soc.lk",
"web.lk",
"ltd.lk",
"assn.lk",
"grp.lk",
"hotel.lk",
"ac.lk",
"lr",
"com.lr",
"edu.lr",
"gov.lr",
"org.lr",
"net.lr",
"ls",
"ac.ls",
"biz.ls",
"co.ls",
"edu.ls",
"gov.ls",
"info.ls",
"net.ls",
"org.ls",
"sc.ls",
"lt",
"gov.lt",
"lu",
"lv",
"com.lv",
"edu.lv",
"gov.lv",
"org.lv",
"mil.lv",
"id.lv",
"net.lv",
"asn.lv",
"conf.lv",
"ly",
"com.ly",
"net.ly",
"gov.ly",
"plc.ly",
"edu.ly",
"sch.ly",
"med.ly",
"org.ly",
"id.ly",
"ma",
"co.ma",
"net.ma",
"gov.ma",
"org.ma",
"ac.ma",
"press.ma",
"mc",
"tm.mc",
"asso.mc",
"md",
"me",
"co.me",
"net.me",
"org.me",
"edu.me",
"ac.me",
"gov.me",
"its.me",
"priv.me",
"mg",
"org.mg",
"nom.mg",
"gov.mg",
"prd.mg",
"tm.mg",
"edu.mg",
"mil.mg",
"com.mg",
"co.mg",
"mh",
"mil",
"mk",
"com.mk",
"org.mk",
"net.mk",
"edu.mk",
"gov.mk",
"inf.mk",
"name.mk",
"ml",
"com.ml",
"edu.ml",
"gouv.ml",
"gov.ml",
"net.ml",
"org.ml",
"presse.ml",
"*.mm",
"mn",
"gov.mn",
"edu.mn",
"org.mn",
"mo",
"com.mo",
"net.mo",
"org.mo",
"edu.mo",
"gov.mo",
"mobi",
"mp",
"mq",
"mr",
"gov.mr",
"ms",
"com.ms",
"edu.ms",
"gov.ms",
"net.ms",
"org.ms",
"mt",
"com.mt",
"edu.mt",
"net.mt",
"org.mt",
"mu",
"com.mu",
"net.mu",
"org.mu",
"gov.mu",
"ac.mu",
"co.mu",
"or.mu",
"museum",
"academy.museum",
"agriculture.museum",
"air.museum",
"airguard.museum",
"alabama.museum",
"alaska.museum",
"amber.museum",
"ambulance.museum",
"american.museum",
"americana.museum",
"americanantiques.museum",
"americanart.museum",
"amsterdam.museum",
"and.museum",
"annefrank.museum",
"anthro.museum",
"anthropology.museum",
"antiques.museum",
"aquarium.museum",
"arboretum.museum",
"archaeological.museum",
"archaeology.museum",
"architecture.museum",
"art.museum",
"artanddesign.museum",
"artcenter.museum",
"artdeco.museum",
"arteducation.museum",
"artgallery.museum",
"arts.museum",
"artsandcrafts.museum",
"asmatart.museum",
"assassination.museum",
"assisi.museum",
"association.museum",
"astronomy.museum",
"atlanta.museum",
"austin.museum",
"australia.museum",
"automotive.museum",
"aviation.museum",
"axis.museum",
"badajoz.museum",
"baghdad.museum",
"bahn.museum",
"bale.museum",
"baltimore.museum",
"barcelona.museum",
"baseball.museum",
"basel.museum",
"baths.museum",
"bauern.museum",
"beauxarts.museum",
"beeldengeluid.museum",
"bellevue.museum",
"bergbau.museum",
"berkeley.museum",
"berlin.museum",
"bern.museum",
"bible.museum",
"bilbao.museum",
"bill.museum",
"birdart.museum",
"birthplace.museum",
"bonn.museum",
"boston.museum",
"botanical.museum",
"botanicalgarden.museum",
"botanicgarden.museum",
"botany.museum",
"brandywinevalley.museum",
"brasil.museum",
"bristol.museum",
"british.museum",
"britishcolumbia.museum",
"broadcast.museum",
"brunel.museum",
"brussel.museum",
"brussels.museum",
"bruxelles.museum",
"building.museum",
"burghof.museum",
"bus.museum",
"bushey.museum",
"cadaques.museum",
"california.museum",
"cambridge.museum",
"can.museum",
"canada.museum",
"capebreton.museum",
"carrier.museum",
"cartoonart.museum",
"casadelamoneda.museum",
"castle.museum",
"castres.museum",
"celtic.museum",
"center.museum",
"chattanooga.museum",
"cheltenham.museum",
"chesapeakebay.museum",
"chicago.museum",
"children.museum",
"childrens.museum",
"childrensgarden.museum",
"chiropractic.museum",
"chocolate.museum",
"christiansburg.museum",
"cincinnati.museum",
"cinema.museum",
"circus.museum",
"civilisation.museum",
"civilization.museum",
"civilwar.museum",
"clinton.museum",
"clock.museum",
"coal.museum",
"coastaldefence.museum",
"cody.museum",
"coldwar.museum",
"collection.museum",
"colonialwilliamsburg.museum",
"coloradoplateau.museum",
"columbia.museum",
"columbus.museum",
"communication.museum",
"communications.museum",
"community.museum",
"computer.museum",
"computerhistory.museum",
"comunica\xE7\xF5es.museum",
"contemporary.museum",
"contemporaryart.museum",
"convent.museum",
"copenhagen.museum",
"corporation.museum",
"correios-e-telecomunica\xE7\xF5es.museum",
"corvette.museum",
"costume.museum",
"countryestate.museum",
"county.museum",
"crafts.museum",
"cranbrook.museum",
"creation.museum",
"cultural.museum",
"culturalcenter.museum",
"culture.museum",
"cyber.museum",
"cymru.museum",
"dali.museum",
"dallas.museum",
"database.museum",
"ddr.museum",
"decorativearts.museum",
"delaware.museum",
"delmenhorst.museum",
"denmark.museum",
"depot.museum",
"design.museum",
"detroit.museum",
"dinosaur.museum",
"discovery.museum",
"dolls.museum",
"donostia.museum",
"durham.museum",
"eastafrica.museum",
"eastcoast.museum",
"education.museum",
"educational.museum",
"egyptian.museum",
"eisenbahn.museum",
"elburg.museum",
"elvendrell.museum",
"embroidery.museum",
"encyclopedic.museum",
"england.museum",
"entomology.museum",
"environment.museum",
"environmentalconservation.museum",
"epilepsy.museum",
"essex.museum",
"estate.museum",
"ethnology.museum",
"exeter.museum",
"exhibition.museum",
"family.museum",
"farm.museum",
"farmequipment.museum",
"farmers.museum",
"farmstead.museum",
"field.museum",
"figueres.museum",
"filatelia.museum",
"film.museum",
"fineart.museum",
"finearts.museum",
"finland.museum",
"flanders.museum",
"florida.museum",
"force.museum",
"fortmissoula.museum",
"fortworth.museum",
"foundation.museum",
"francaise.museum",
"frankfurt.museum",
"franziskaner.museum",
"freemasonry.museum",
"freiburg.museum",
"fribourg.museum",
"frog.museum",
"fundacio.museum",
"furniture.museum",
"gallery.museum",
"garden.museum",
"gateway.museum",
"geelvinck.museum",
"gemological.museum",
"geology.museum",
"georgia.museum",
"giessen.museum",
"glas.museum",
"glass.museum",
"gorge.museum",
"grandrapids.museum",
"graz.museum",
"guernsey.museum",
"halloffame.museum",
"hamburg.museum",
"handson.museum",
"harvestcelebration.museum",
"hawaii.museum",
"health.museum",
"heimatunduhren.museum",
"hellas.museum",
"helsinki.museum",
"hembygdsforbund.museum",
"heritage.museum",
"histoire.museum",
"historical.museum",
"historicalsociety.museum",
"historichouses.museum",
"historisch.museum",
"historisches.museum",
"history.museum",
"historyofscience.museum",
"horology.museum",
"house.museum",
"humanities.museum",
"illustration.museum",
"imageandsound.museum",
"indian.museum",
"indiana.museum",
"indianapolis.museum",
"indianmarket.museum",
"intelligence.museum",
"interactive.museum",
"iraq.museum",
"iron.museum",
"isleofman.museum",
"jamison.museum",
"jefferson.museum",
"jerusalem.museum",
"jewelry.museum",
"jewish.museum",
"jewishart.museum",
"jfk.museum",
"journalism.museum",
"judaica.museum",
"judygarland.museum",
"juedisches.museum",
"juif.museum",
"karate.museum",
"karikatur.museum",
"kids.museum",
"koebenhavn.museum",
"koeln.museum",
"kunst.museum",
"kunstsammlung.museum",
"kunstunddesign.museum",
"labor.museum",
"labour.museum",
"lajolla.museum",
"lancashire.museum",
"landes.museum",
"lans.museum",
"l\xE4ns.museum",
"larsson.museum",
"lewismiller.museum",
"lincoln.museum",
"linz.museum",
"living.museum",
"livinghistory.museum",
"localhistory.museum",
"london.museum",
"losangeles.museum",
"louvre.museum",
"loyalist.museum",
"lucerne.museum",
"luxembourg.museum",
"luzern.museum",
"mad.museum",
"madrid.museum",
"mallorca.museum",
"manchester.museum",
"mansion.museum",
"mansions.museum",
"manx.museum",
"marburg.museum",
"maritime.museum",
"maritimo.museum",
"maryland.museum",
"marylhurst.museum",
"media.museum",
"medical.museum",
"medizinhistorisches.museum",
"meeres.museum",
"memorial.museum",
"mesaverde.museum",
"michigan.museum",
"midatlantic.museum",
"military.museum",
"mill.museum",
"miners.museum",
"mining.museum",
"minnesota.museum",
"missile.museum",
"missoula.museum",
"modern.museum",
"moma.museum",
"money.museum",
"monmouth.museum",
"monticello.museum",
"montreal.museum",
"moscow.museum",
"motorcycle.museum",
"muenchen.museum",
"muenster.museum",
"mulhouse.museum",
"muncie.museum",
"museet.museum",
"museumcenter.museum",
"museumvereniging.museum",
"music.museum",
"national.museum",
"nationalfirearms.museum",
"nationalheritage.museum",
"nativeamerican.museum",
"naturalhistory.museum",
"naturalhistorymuseum.museum",
"naturalsciences.museum",
"nature.museum",
"naturhistorisches.museum",
"natuurwetenschappen.museum",
"naumburg.museum",
"naval.museum",
"nebraska.museum",
"neues.museum",
"newhampshire.museum",
"newjersey.museum",
"newmexico.museum",
"newport.museum",
"newspaper.museum",
"newyork.museum",
"niepce.museum",
"norfolk.museum",
"north.museum",
"nrw.museum",
"nyc.museum",
"nyny.museum",
"oceanographic.museum",
"oceanographique.museum",
"omaha.museum",
"online.museum",
"ontario.museum",
"openair.museum",
"oregon.museum",
"oregontrail.museum",
"otago.museum",
"oxford.museum",
"pacific.museum",
"paderborn.museum",
"palace.museum",
"paleo.museum",
"palmsprings.museum",
"panama.museum",
"paris.museum",
"pasadena.museum",
"pharmacy.museum",
"philadelphia.museum",
"philadelphiaarea.museum",
"philately.museum",
"phoenix.museum",
"photography.museum",
"pilots.museum",
"pittsburgh.museum",
"planetarium.museum",
"plantation.museum",
"plants.museum",
"plaza.museum",
"portal.museum",
"portland.museum",
"portlligat.museum",
"posts-and-telecommunications.museum",
"preservation.museum",
"presidio.museum",
"press.museum",
"project.museum",
"public.museum",
"pubol.museum",
"quebec.museum",
"railroad.museum",
"railway.museum",
"research.museum",
"resistance.museum",
"riodejaneiro.museum",
"rochester.museum",
"rockart.museum",
"roma.museum",
"russia.museum",
"saintlouis.museum",
"salem.museum",
"salvadordali.museum",
"salzburg.museum",
"sandiego.museum",
"sanfrancisco.museum",
"santabarbara.museum",
"santacruz.museum",
"santafe.museum",
"saskatchewan.museum",
"satx.museum",
"savannahga.museum",
"schlesisches.museum",
"schoenbrunn.museum",
"schokoladen.museum",
"school.museum",
"schweiz.museum",
"science.museum",
"scienceandhistory.museum",
"scienceandindustry.museum",
"sciencecenter.museum",
"sciencecenters.museum",
"science-fiction.museum",
"sciencehistory.museum",
"sciences.museum",
"sciencesnaturelles.museum",
"scotland.museum",
"seaport.museum",
"settlement.museum",
"settlers.museum",
"shell.museum",
"sherbrooke.museum",
"sibenik.museum",
"silk.museum",
"ski.museum",
"skole.museum",
"society.museum",
"sologne.museum",
"soundandvision.museum",
"southcarolina.museum",
"southwest.museum",
"space.museum",
"spy.museum",
"square.museum",
"stadt.museum",
"stalbans.museum",
"starnberg.museum",
"state.museum",
"stateofdelaware.museum",
"station.museum",
"steam.museum",
"steiermark.museum",
"stjohn.museum",
"stockholm.museum",
"stpetersburg.museum",
"stuttgart.museum",
"suisse.museum",
"surgeonshall.museum",
"surrey.museum",
"svizzera.museum",
"sweden.museum",
"sydney.museum",
"tank.museum",
"tcm.museum",
"technology.museum",
"telekommunikation.museum",
"television.museum",
"texas.museum",
"textile.museum",
"theater.museum",
"time.museum",
"timekeeping.museum",
"topology.museum",
"torino.museum",
"touch.museum",
"town.museum",
"transport.museum",
"tree.museum",
"trolley.museum",
"trust.museum",
"trustee.museum",
"uhren.museum",
"ulm.museum",
"undersea.museum",
"university.museum",
"usa.museum",
"usantiques.museum",
"usarts.museum",
"uscountryestate.museum",
"usculture.museum",
"usdecorativearts.museum",
"usgarden.museum",
"ushistory.museum",
"ushuaia.museum",
"uslivinghistory.museum",
"utah.museum",
"uvic.museum",
"valley.museum",
"vantaa.museum",
"versailles.museum",
"viking.museum",
"village.museum",
"virginia.museum",
"virtual.museum",
"virtuel.museum",
"vlaanderen.museum",
"volkenkunde.museum",
"wales.museum",
"wallonie.museum",
"war.museum",
"washingtondc.museum",
"watchandclock.museum",
"watch-and-clock.museum",
"western.museum",
"westfalen.museum",
"whaling.museum",
"wildlife.museum",
"williamsburg.museum",
"windmill.museum",
"workshop.museum",
"york.museum",
"yorkshire.museum",
"yosemite.museum",
"youth.museum",
"zoological.museum",
"zoology.museum",
"\u05D9\u05E8\u05D5\u05E9\u05DC\u05D9\u05DD.museum",
"\u0438\u043A\u043E\u043C.museum",
"mv",
"aero.mv",
"biz.mv",
"com.mv",
"coop.mv",
"edu.mv",
"gov.mv",
"info.mv",
"int.mv",
"mil.mv",
"museum.mv",
"name.mv",
"net.mv",
"org.mv",
"pro.mv",
"mw",
"ac.mw",
"biz.mw",
"co.mw",
"com.mw",
"coop.mw",
"edu.mw",
"gov.mw",
"int.mw",
"museum.mw",
"net.mw",
"org.mw",
"mx",
"com.mx",
"org.mx",
"gob.mx",
"edu.mx",
"net.mx",
"my",
"biz.my",
"com.my",
"edu.my",
"gov.my",
"mil.my",
"name.my",
"net.my",
"org.my",
"mz",
"ac.mz",
"adv.mz",
"co.mz",
"edu.mz",
"gov.mz",
"mil.mz",
"net.mz",
"org.mz",
"na",
"info.na",
"pro.na",
"name.na",
"school.na",
"or.na",
"dr.na",
"us.na",
"mx.na",
"ca.na",
"in.na",
"cc.na",
"tv.na",
"ws.na",
"mobi.na",
"co.na",
"com.na",
"org.na",
"name",
"nc",
"asso.nc",
"nom.nc",
"ne",
"net",
"nf",
"com.nf",
"net.nf",
"per.nf",
"rec.nf",
"web.nf",
"arts.nf",
"firm.nf",
"info.nf",
"other.nf",
"store.nf",
"ng",
"com.ng",
"edu.ng",
"gov.ng",
"i.ng",
"mil.ng",
"mobi.ng",
"name.ng",
"net.ng",
"org.ng",
"sch.ng",
"ni",
"ac.ni",
"biz.ni",
"co.ni",
"com.ni",
"edu.ni",
"gob.ni",
"in.ni",
"info.ni",
"int.ni",
"mil.ni",
"net.ni",
"nom.ni",
"org.ni",
"web.ni",
"nl",
"no",
"fhs.no",
"vgs.no",
"fylkesbibl.no",
"folkebibl.no",
"museum.no",
"idrett.no",
"priv.no",
"mil.no",
"stat.no",
"dep.no",
"kommune.no",
"herad.no",
"aa.no",
"ah.no",
"bu.no",
"fm.no",
"hl.no",
"hm.no",
"jan-mayen.no",
"mr.no",
"nl.no",
"nt.no",
"of.no",
"ol.no",
"oslo.no",
"rl.no",
"sf.no",
"st.no",
"svalbard.no",
"tm.no",
"tr.no",
"va.no",
"vf.no",
"gs.aa.no",
"gs.ah.no",
"gs.bu.no",
"gs.fm.no",
"gs.hl.no",
"gs.hm.no",
"gs.jan-mayen.no",
"gs.mr.no",
"gs.nl.no",
"gs.nt.no",
"gs.of.no",
"gs.ol.no",
"gs.oslo.no",
"gs.rl.no",
"gs.sf.no",
"gs.st.no",
"gs.svalbard.no",
"gs.tm.no",
"gs.tr.no",
"gs.va.no",
"gs.vf.no",
"akrehamn.no",
"\xE5krehamn.no",
"algard.no",
"\xE5lg\xE5rd.no",
"arna.no",
"brumunddal.no",
"bryne.no",
"bronnoysund.no",
"br\xF8nn\xF8ysund.no",
"drobak.no",
"dr\xF8bak.no",
"egersund.no",
"fetsund.no",
"floro.no",
"flor\xF8.no",
"fredrikstad.no",
"hokksund.no",
"honefoss.no",
"h\xF8nefoss.no",
"jessheim.no",
"jorpeland.no",
"j\xF8rpeland.no",
"kirkenes.no",
"kopervik.no",
"krokstadelva.no",
"langevag.no",
"langev\xE5g.no",
"leirvik.no",
"mjondalen.no",
"mj\xF8ndalen.no",
"mo-i-rana.no",
"mosjoen.no",
"mosj\xF8en.no",
"nesoddtangen.no",
"orkanger.no",
"osoyro.no",
"os\xF8yro.no",
"raholt.no",
"r\xE5holt.no",
"sandnessjoen.no",
"sandnessj\xF8en.no",
"skedsmokorset.no",
"slattum.no",
"spjelkavik.no",
"stathelle.no",
"stavern.no",
"stjordalshalsen.no",
"stj\xF8rdalshalsen.no",
"tananger.no",
"tranby.no",
"vossevangen.no",
"afjord.no",
"\xE5fjord.no",
"agdenes.no",
"al.no",
"\xE5l.no",
"alesund.no",
"\xE5lesund.no",
"alstahaug.no",
"alta.no",
"\xE1lt\xE1.no",
"alaheadju.no",
"\xE1laheadju.no",
"alvdal.no",
"amli.no",
"\xE5mli.no",
"amot.no",
"\xE5mot.no",
"andebu.no",
"andoy.no",
"and\xF8y.no",
"andasuolo.no",
"ardal.no",
"\xE5rdal.no",
"aremark.no",
"arendal.no",
"\xE5s.no",
"aseral.no",
"\xE5seral.no",
"asker.no",
"askim.no",
"askvoll.no",
"askoy.no",
"ask\xF8y.no",
"asnes.no",
"\xE5snes.no",
"audnedaln.no",
"aukra.no",
"aure.no",
"aurland.no",
"aurskog-holand.no",
"aurskog-h\xF8land.no",
"austevoll.no",
"austrheim.no",
"averoy.no",
"aver\xF8y.no",
"balestrand.no",
"ballangen.no",
"balat.no",
"b\xE1l\xE1t.no",
"balsfjord.no",
"bahccavuotna.no",
"b\xE1hccavuotna.no",
"bamble.no",
"bardu.no",
"beardu.no",
"beiarn.no",
"bajddar.no",
"b\xE1jddar.no",
"baidar.no",
"b\xE1id\xE1r.no",
"berg.no",
"bergen.no",
"berlevag.no",
"berlev\xE5g.no",
"bearalvahki.no",
"bearalv\xE1hki.no",
"bindal.no",
"birkenes.no",
"bjarkoy.no",
"bjark\xF8y.no",
"bjerkreim.no",
"bjugn.no",
"bodo.no",
"bod\xF8.no",
"badaddja.no",
"b\xE5d\xE5ddj\xE5.no",
"budejju.no",
"bokn.no",
"bremanger.no",
"bronnoy.no",
"br\xF8nn\xF8y.no",
"bygland.no",
"bykle.no",
"barum.no",
"b\xE6rum.no",
"bo.telemark.no",
"b\xF8.telemark.no",
"bo.nordland.no",
"b\xF8.nordland.no",
"bievat.no",
"biev\xE1t.no",
"bomlo.no",
"b\xF8mlo.no",
"batsfjord.no",
"b\xE5tsfjord.no",
"bahcavuotna.no",
"b\xE1hcavuotna.no",
"dovre.no",
"drammen.no",
"drangedal.no",
"dyroy.no",
"dyr\xF8y.no",
"donna.no",
"d\xF8nna.no",
"eid.no",
"eidfjord.no",
"eidsberg.no",
"eidskog.no",
"eidsvoll.no",
"eigersund.no",
"elverum.no",
"enebakk.no",
"engerdal.no",
"etne.no",
"etnedal.no",
"evenes.no",
"evenassi.no",
"even\xE1\u0161\u0161i.no",
"evje-og-hornnes.no",
"farsund.no",
"fauske.no",
"fuossko.no",
"fuoisku.no",
"fedje.no",
"fet.no",
"finnoy.no",
"finn\xF8y.no",
"fitjar.no",
"fjaler.no",
"fjell.no",
"flakstad.no",
"flatanger.no",
"flekkefjord.no",
"flesberg.no",
"flora.no",
"fla.no",
"fl\xE5.no",
"folldal.no",
"forsand.no",
"fosnes.no",
"frei.no",
"frogn.no",
"froland.no",
"frosta.no",
"frana.no",
"fr\xE6na.no",
"froya.no",
"fr\xF8ya.no",
"fusa.no",
"fyresdal.no",
"forde.no",
"f\xF8rde.no",
"gamvik.no",
"gangaviika.no",
"g\xE1\u014Bgaviika.no",
"gaular.no",
"gausdal.no",
"gildeskal.no",
"gildesk\xE5l.no",
"giske.no",
"gjemnes.no",
"gjerdrum.no",
"gjerstad.no",
"gjesdal.no",
"gjovik.no",
"gj\xF8vik.no",
"gloppen.no",
"gol.no",
"gran.no",
"grane.no",
"granvin.no",
"gratangen.no",
"grimstad.no",
"grong.no",
"kraanghke.no",
"kr\xE5anghke.no",
"grue.no",
"gulen.no",
"hadsel.no",
"halden.no",
"halsa.no",
"hamar.no",
"hamaroy.no",
"habmer.no",
"h\xE1bmer.no",
"hapmir.no",
"h\xE1pmir.no",
"hammerfest.no",
"hammarfeasta.no",
"h\xE1mm\xE1rfeasta.no",
"haram.no",
"hareid.no",
"harstad.no",
"hasvik.no",
"aknoluokta.no",
"\xE1k\u014Boluokta.no",
"hattfjelldal.no",
"aarborte.no",
"haugesund.no",
"hemne.no",
"hemnes.no",
"hemsedal.no",
"heroy.more-og-romsdal.no",
"her\xF8y.m\xF8re-og-romsdal.no",
"heroy.nordland.no",
"her\xF8y.nordland.no",
"hitra.no",
"hjartdal.no",
"hjelmeland.no",
"hobol.no",
"hob\xF8l.no",
"hof.no",
"hol.no",
"hole.no",
"holmestrand.no",
"holtalen.no",
"holt\xE5len.no",
"hornindal.no",
"horten.no",
"hurdal.no",
"hurum.no",
"hvaler.no",
"hyllestad.no",
"hagebostad.no",
"h\xE6gebostad.no",
"hoyanger.no",
"h\xF8yanger.no",
"hoylandet.no",
"h\xF8ylandet.no",
"ha.no",
"h\xE5.no",
"ibestad.no",
"inderoy.no",
"inder\xF8y.no",
"iveland.no",
"jevnaker.no",
"jondal.no",
"jolster.no",
"j\xF8lster.no",
"karasjok.no",
"karasjohka.no",
"k\xE1r\xE1\u0161johka.no",
"karlsoy.no",
"galsa.no",
"g\xE1ls\xE1.no",
"karmoy.no",
"karm\xF8y.no",
"kautokeino.no",
"guovdageaidnu.no",
"klepp.no",
"klabu.no",
"kl\xE6bu.no",
"kongsberg.no",
"kongsvinger.no",
"kragero.no",
"krager\xF8.no",
"kristiansand.no",
"kristiansund.no",
"krodsherad.no",
"kr\xF8dsherad.no",
"kvalsund.no",
"rahkkeravju.no",
"r\xE1hkker\xE1vju.no",
"kvam.no",
"kvinesdal.no",
"kvinnherad.no",
"kviteseid.no",
"kvitsoy.no",
"kvits\xF8y.no",
"kvafjord.no",
"kv\xE6fjord.no",
"giehtavuoatna.no",
"kvanangen.no",
"kv\xE6nangen.no",
"navuotna.no",
"n\xE1vuotna.no",
"kafjord.no",
"k\xE5fjord.no",
"gaivuotna.no",
"g\xE1ivuotna.no",
"larvik.no",
"lavangen.no",
"lavagis.no",
"loabat.no",
"loab\xE1t.no",
"lebesby.no",
"davvesiida.no",
"leikanger.no",
"leirfjord.no",
"leka.no",
"leksvik.no",
"lenvik.no",
"leangaviika.no",
"lea\u014Bgaviika.no",
"lesja.no",
"levanger.no",
"lier.no",
"lierne.no",
"lillehammer.no",
"lillesand.no",
"lindesnes.no",
"lindas.no",
"lind\xE5s.no",
"lom.no",
"loppa.no",
"lahppi.no",
"l\xE1hppi.no",
"lund.no",
"lunner.no",
"luroy.no",
"lur\xF8y.no",
"luster.no",
"lyngdal.no",
"lyngen.no",
"ivgu.no",
"lardal.no",
"lerdal.no",
"l\xE6rdal.no",
"lodingen.no",
"l\xF8dingen.no",
"lorenskog.no",
"l\xF8renskog.no",
"loten.no",
"l\xF8ten.no",
"malvik.no",
"masoy.no",
"m\xE5s\xF8y.no",
"muosat.no",
"muos\xE1t.no",
"mandal.no",
"marker.no",
"marnardal.no",
"masfjorden.no",
"meland.no",
"meldal.no",
"melhus.no",
"meloy.no",
"mel\xF8y.no",
"meraker.no",
"mer\xE5ker.no",
"moareke.no",
"mo\xE5reke.no",
"midsund.no",
"midtre-gauldal.no",
"modalen.no",
"modum.no",
"molde.no",
"moskenes.no",
"moss.no",
"mosvik.no",
"malselv.no",
"m\xE5lselv.no",
"malatvuopmi.no",
"m\xE1latvuopmi.no",
"namdalseid.no",
"aejrie.no",
"namsos.no",
"namsskogan.no",
"naamesjevuemie.no",
"n\xE5\xE5mesjevuemie.no",
"laakesvuemie.no",
"nannestad.no",
"narvik.no",
"narviika.no",
"naustdal.no",
"nedre-eiker.no",
"nes.akershus.no",
"nes.buskerud.no",
"nesna.no",
"nesodden.no",
"nesseby.no",
"unjarga.no",
"unj\xE1rga.no",
"nesset.no",
"nissedal.no",
"nittedal.no",
"nord-aurdal.no",
"nord-fron.no",
"nord-odal.no",
"norddal.no",
"nordkapp.no",
"davvenjarga.no",
"davvenj\xE1rga.no",
"nordre-land.no",
"nordreisa.no",
"raisa.no",
"r\xE1isa.no",
"nore-og-uvdal.no",
"notodden.no",
"naroy.no",
"n\xE6r\xF8y.no",
"notteroy.no",
"n\xF8tter\xF8y.no",
"odda.no",
"oksnes.no",
"\xF8ksnes.no",
"oppdal.no",
"oppegard.no",
"oppeg\xE5rd.no",
"orkdal.no",
"orland.no",
"\xF8rland.no",
"orskog.no",
"\xF8rskog.no",
"orsta.no",
"\xF8rsta.no",
"os.hedmark.no",
"os.hordaland.no",
"osen.no",
"osteroy.no",
"oster\xF8y.no",
"ostre-toten.no",
"\xF8stre-toten.no",
"overhalla.no",
"ovre-eiker.no",
"\xF8vre-eiker.no",
"oyer.no",
"\xF8yer.no",
"oygarden.no",
"\xF8ygarden.no",
"oystre-slidre.no",
"\xF8ystre-slidre.no",
"porsanger.no",
"porsangu.no",
"pors\xE1\u014Bgu.no",
"porsgrunn.no",
"radoy.no",
"rad\xF8y.no",
"rakkestad.no",
"rana.no",
"ruovat.no",
"randaberg.no",
"rauma.no",
"rendalen.no",
"rennebu.no",
"rennesoy.no",
"rennes\xF8y.no",
"rindal.no",
"ringebu.no",
"ringerike.no",
"ringsaker.no",
"rissa.no",
"risor.no",
"ris\xF8r.no",
"roan.no",
"rollag.no",
"rygge.no",
"ralingen.no",
"r\xE6lingen.no",
"rodoy.no",
"r\xF8d\xF8y.no",
"romskog.no",
"r\xF8mskog.no",
"roros.no",
"r\xF8ros.no",
"rost.no",
"r\xF8st.no",
"royken.no",
"r\xF8yken.no",
"royrvik.no",
"r\xF8yrvik.no",
"rade.no",
"r\xE5de.no",
"salangen.no",
"siellak.no",
"saltdal.no",
"salat.no",
"s\xE1l\xE1t.no",
"s\xE1lat.no",
"samnanger.no",
"sande.more-og-romsdal.no",
"sande.m\xF8re-og-romsdal.no",
"sande.vestfold.no",
"sandefjord.no",
"sandnes.no",
"sandoy.no",
"sand\xF8y.no",
"sarpsborg.no",
"sauda.no",
"sauherad.no",
"sel.no",
"selbu.no",
"selje.no",
"seljord.no",
"sigdal.no",
"siljan.no",
"sirdal.no",
"skaun.no",
"skedsmo.no",
"ski.no",
"skien.no",
"skiptvet.no",
"skjervoy.no",
"skjerv\xF8y.no",
"skierva.no",
"skierv\xE1.no",
"skjak.no",
"skj\xE5k.no",
"skodje.no",
"skanland.no",
"sk\xE5nland.no",
"skanit.no",
"sk\xE1nit.no",
"smola.no",
"sm\xF8la.no",
"snillfjord.no",
"snasa.no",
"sn\xE5sa.no",
"snoasa.no",
"snaase.no",
"sn\xE5ase.no",
"sogndal.no",
"sokndal.no",
"sola.no",
"solund.no",
"songdalen.no",
"sortland.no",
"spydeberg.no",
"stange.no",
"stavanger.no",
"steigen.no",
"steinkjer.no",
"stjordal.no",
"stj\xF8rdal.no",
"stokke.no",
"stor-elvdal.no",
"stord.no",
"stordal.no",
"storfjord.no",
"omasvuotna.no",
"strand.no",
"stranda.no",
"stryn.no",
"sula.no",
"suldal.no",
"sund.no",
"sunndal.no",
"surnadal.no",
"sveio.no",
"svelvik.no",
"sykkylven.no",
"sogne.no",
"s\xF8gne.no",
"somna.no",
"s\xF8mna.no",
"sondre-land.no",
"s\xF8ndre-land.no",
"sor-aurdal.no",
"s\xF8r-aurdal.no",
"sor-fron.no",
"s\xF8r-fron.no",
"sor-odal.no",
"s\xF8r-odal.no",
"sor-varanger.no",
"s\xF8r-varanger.no",
"matta-varjjat.no",
"m\xE1tta-v\xE1rjjat.no",
"sorfold.no",
"s\xF8rfold.no",
"sorreisa.no",
"s\xF8rreisa.no",
"sorum.no",
"s\xF8rum.no",
"tana.no",
"deatnu.no",
"time.no",
"tingvoll.no",
"tinn.no",
"tjeldsund.no",
"dielddanuorri.no",
"tjome.no",
"tj\xF8me.no",
"tokke.no",
"tolga.no",
"torsken.no",
"tranoy.no",
"tran\xF8y.no",
"tromso.no",
"troms\xF8.no",
"tromsa.no",
"romsa.no",
"trondheim.no",
"troandin.no",
"trysil.no",
"trana.no",
"tr\xE6na.no",
"trogstad.no",
"tr\xF8gstad.no",
"tvedestrand.no",
"tydal.no",
"tynset.no",
"tysfjord.no",
"divtasvuodna.no",
"divttasvuotna.no",
"tysnes.no",
"tysvar.no",
"tysv\xE6r.no",
"tonsberg.no",
"t\xF8nsberg.no",
"ullensaker.no",
"ullensvang.no",
"ulvik.no",
"utsira.no",
"vadso.no",
"vads\xF8.no",
"cahcesuolo.no",
"\u010D\xE1hcesuolo.no",
"vaksdal.no",
"valle.no",
"vang.no",
"vanylven.no",
"vardo.no",
"vard\xF8.no",
"varggat.no",
"v\xE1rgg\xE1t.no",
"vefsn.no",
"vaapste.no",
"vega.no",
"vegarshei.no",
"veg\xE5rshei.no",
"vennesla.no",
"verdal.no",
"verran.no",
"vestby.no",
"vestnes.no",
"vestre-slidre.no",
"vestre-toten.no",
"vestvagoy.no",
"vestv\xE5g\xF8y.no",
"vevelstad.no",
"vik.no",
"vikna.no",
"vindafjord.no",
"volda.no",
"voss.no",
"varoy.no",
"v\xE6r\xF8y.no",
"vagan.no",
"v\xE5gan.no",
"voagat.no",
"vagsoy.no",
"v\xE5gs\xF8y.no",
"vaga.no",
"v\xE5g\xE5.no",
"valer.ostfold.no",
"v\xE5ler.\xF8stfold.no",
"valer.hedmark.no",
"v\xE5ler.hedmark.no",
"*.np",
"nr",
"biz.nr",
"info.nr",
"gov.nr",
"edu.nr",
"org.nr",
"net.nr",
"com.nr",
"nu",
"nz",
"ac.nz",
"co.nz",
"cri.nz",
"geek.nz",
"gen.nz",
"govt.nz",
"health.nz",
"iwi.nz",
"kiwi.nz",
"maori.nz",
"mil.nz",
"m\u0101ori.nz",
"net.nz",
"org.nz",
"parliament.nz",
"school.nz",
"om",
"co.om",
"com.om",
"edu.om",
"gov.om",
"med.om",
"museum.om",
"net.om",
"org.om",
"pro.om",
"onion",
"org",
"pa",
"ac.pa",
"gob.pa",
"com.pa",
"org.pa",
"sld.pa",
"edu.pa",
"net.pa",
"ing.pa",
"abo.pa",
"med.pa",
"nom.pa",
"pe",
"edu.pe",
"gob.pe",
"nom.pe",
"mil.pe",
"org.pe",
"com.pe",
"net.pe",
"pf",
"com.pf",
"org.pf",
"edu.pf",
"*.pg",
"ph",
"com.ph",
"net.ph",
"org.ph",
"gov.ph",
"edu.ph",
"ngo.ph",
"mil.ph",
"i.ph",
"pk",
"com.pk",
"net.pk",
"edu.pk",
"org.pk",
"fam.pk",
"biz.pk",
"web.pk",
"gov.pk",
"gob.pk",
"gok.pk",
"gon.pk",
"gop.pk",
"gos.pk",
"info.pk",
"pl",
"com.pl",
"net.pl",
"org.pl",
"aid.pl",
"agro.pl",
"atm.pl",
"auto.pl",
"biz.pl",
"edu.pl",
"gmina.pl",
"gsm.pl",
"info.pl",
"mail.pl",
"miasta.pl",
"media.pl",
"mil.pl",
"nieruchomosci.pl",
"nom.pl",
"pc.pl",
"powiat.pl",
"priv.pl",
"realestate.pl",
"rel.pl",
"sex.pl",
"shop.pl",
"sklep.pl",
"sos.pl",
"szkola.pl",
"targi.pl",
"tm.pl",
"tourism.pl",
"travel.pl",
"turystyka.pl",
"gov.pl",
"ap.gov.pl",
"ic.gov.pl",
"is.gov.pl",
"us.gov.pl",
"kmpsp.gov.pl",
"kppsp.gov.pl",
"kwpsp.gov.pl",
"psp.gov.pl",
"wskr.gov.pl",
"kwp.gov.pl",
"mw.gov.pl",
"ug.gov.pl",
"um.gov.pl",
"umig.gov.pl",
"ugim.gov.pl",
"upow.gov.pl",
"uw.gov.pl",
"starostwo.gov.pl",
"pa.gov.pl",
"po.gov.pl",
"psse.gov.pl",
"pup.gov.pl",
"rzgw.gov.pl",
"sa.gov.pl",
"so.gov.pl",
"sr.gov.pl",
"wsa.gov.pl",
"sko.gov.pl",
"uzs.gov.pl",
"wiih.gov.pl",
"winb.gov.pl",
"pinb.gov.pl",
"wios.gov.pl",
"witd.gov.pl",
"wzmiuw.gov.pl",
"piw.gov.pl",
"wiw.gov.pl",
"griw.gov.pl",
"wif.gov.pl",
"oum.gov.pl",
"sdn.gov.pl",
"zp.gov.pl",
"uppo.gov.pl",
"mup.gov.pl",
"wuoz.gov.pl",
"konsulat.gov.pl",
"oirm.gov.pl",
"augustow.pl",
"babia-gora.pl",
"bedzin.pl",
"beskidy.pl",
"bialowieza.pl",
"bialystok.pl",
"bielawa.pl",
"bieszczady.pl",
"boleslawiec.pl",
"bydgoszcz.pl",
"bytom.pl",
"cieszyn.pl",
"czeladz.pl",
"czest.pl",
"dlugoleka.pl",
"elblag.pl",
"elk.pl",
"glogow.pl",
"gniezno.pl",
"gorlice.pl",
"grajewo.pl",
"ilawa.pl",
"jaworzno.pl",
"jelenia-gora.pl",
"jgora.pl",
"kalisz.pl",
"kazimierz-dolny.pl",
"karpacz.pl",
"kartuzy.pl",
"kaszuby.pl",
"katowice.pl",
"kepno.pl",
"ketrzyn.pl",
"klodzko.pl",
"kobierzyce.pl",
"kolobrzeg.pl",
"konin.pl",
"konskowola.pl",
"kutno.pl",
"lapy.pl",
"lebork.pl",
"legnica.pl",
"lezajsk.pl",
"limanowa.pl",
"lomza.pl",
"lowicz.pl",
"lubin.pl",
"lukow.pl",
"malbork.pl",
"malopolska.pl",
"mazowsze.pl",
"mazury.pl",
"mielec.pl",
"mielno.pl",
"mragowo.pl",
"naklo.pl",
"nowaruda.pl",
"nysa.pl",
"olawa.pl",
"olecko.pl",
"olkusz.pl",
"olsztyn.pl",
"opoczno.pl",
"opole.pl",
"ostroda.pl",
"ostroleka.pl",
"ostrowiec.pl",
"ostrowwlkp.pl",
"pila.pl",
"pisz.pl",
"podhale.pl",
"podlasie.pl",
"polkowice.pl",
"pomorze.pl",
"pomorskie.pl",
"prochowice.pl",
"pruszkow.pl",
"przeworsk.pl",
"pulawy.pl",
"radom.pl",
"rawa-maz.pl",
"rybnik.pl",
"rzeszow.pl",
"sanok.pl",
"sejny.pl",
"slask.pl",
"slupsk.pl",
"sosnowiec.pl",
"stalowa-wola.pl",
"skoczow.pl",
"starachowice.pl",
"stargard.pl",
"suwalki.pl",
"swidnica.pl",
"swiebodzin.pl",
"swinoujscie.pl",
"szczecin.pl",
"szczytno.pl",
"tarnobrzeg.pl",
"tgory.pl",
"turek.pl",
"tychy.pl",
"ustka.pl",
"walbrzych.pl",
"warmia.pl",
"warszawa.pl",
"waw.pl",
"wegrow.pl",
"wielun.pl",
"wlocl.pl",
"wloclawek.pl",
"wodzislaw.pl",
"wolomin.pl",
"wroclaw.pl",
"zachpomor.pl",
"zagan.pl",
"zarow.pl",
"zgora.pl",
"zgorzelec.pl",
"pm",
"pn",
"gov.pn",
"co.pn",
"org.pn",
"edu.pn",
"net.pn",
"post",
"pr",
"com.pr",
"net.pr",
"org.pr",
"gov.pr",
"edu.pr",
"isla.pr",
"pro.pr",
"biz.pr",
"info.pr",
"name.pr",
"est.pr",
"prof.pr",
"ac.pr",
"pro",
"aaa.pro",
"aca.pro",
"acct.pro",
"avocat.pro",
"bar.pro",
"cpa.pro",
"eng.pro",
"jur.pro",
"law.pro",
"med.pro",
"recht.pro",
"ps",
"edu.ps",
"gov.ps",
"sec.ps",
"plo.ps",
"com.ps",
"org.ps",
"net.ps",
"pt",
"net.pt",
"gov.pt",
"org.pt",
"edu.pt",
"int.pt",
"publ.pt",
"com.pt",
"nome.pt",
"pw",
"co.pw",
"ne.pw",
"or.pw",
"ed.pw",
"go.pw",
"belau.pw",
"py",
"com.py",
"coop.py",
"edu.py",
"gov.py",
"mil.py",
"net.py",
"org.py",
"qa",
"com.qa",
"edu.qa",
"gov.qa",
"mil.qa",
"name.qa",
"net.qa",
"org.qa",
"sch.qa",
"re",
"asso.re",
"com.re",
"nom.re",
"ro",
"arts.ro",
"com.ro",
"firm.ro",
"info.ro",
"nom.ro",
"nt.ro",
"org.ro",
"rec.ro",
"store.ro",
"tm.ro",
"www.ro",
"rs",
"ac.rs",
"co.rs",
"edu.rs",
"gov.rs",
"in.rs",
"org.rs",
"ru",
"rw",
"ac.rw",
"co.rw",
"coop.rw",
"gov.rw",
"mil.rw",
"net.rw",
"org.rw",
"sa",
"com.sa",
"net.sa",
"org.sa",
"gov.sa",
"med.sa",
"pub.sa",
"edu.sa",
"sch.sa",
"sb",
"com.sb",
"edu.sb",
"gov.sb",
"net.sb",
"org.sb",
"sc",
"com.sc",
"gov.sc",
"net.sc",
"org.sc",
"edu.sc",
"sd",
"com.sd",
"net.sd",
"org.sd",
"edu.sd",
"med.sd",
"tv.sd",
"gov.sd",
"info.sd",
"se",
"a.se",
"ac.se",
"b.se",
"bd.se",
"brand.se",
"c.se",
"d.se",
"e.se",
"f.se",
"fh.se",
"fhsk.se",
"fhv.se",
"g.se",
"h.se",
"i.se",
"k.se",
"komforb.se",
"kommunalforbund.se",
"komvux.se",
"l.se",
"lanbib.se",
"m.se",
"n.se",
"naturbruksgymn.se",
"o.se",
"org.se",
"p.se",
"parti.se",
"pp.se",
"press.se",
"r.se",
"s.se",
"t.se",
"tm.se",
"u.se",
"w.se",
"x.se",
"y.se",
"z.se",
"sg",
"com.sg",
"net.sg",
"org.sg",
"gov.sg",
"edu.sg",
"per.sg",
"sh",
"com.sh",
"net.sh",
"gov.sh",
"org.sh",
"mil.sh",
"si",
"sj",
"sk",
"sl",
"com.sl",
"net.sl",
"edu.sl",
"gov.sl",
"org.sl",
"sm",
"sn",
"art.sn",
"com.sn",
"edu.sn",
"gouv.sn",
"org.sn",
"perso.sn",
"univ.sn",
"so",
"com.so",
"edu.so",
"gov.so",
"me.so",
"net.so",
"org.so",
"sr",
"ss",
"biz.ss",
"com.ss",
"edu.ss",
"gov.ss",
"me.ss",
"net.ss",
"org.ss",
"sch.ss",
"st",
"co.st",
"com.st",
"consulado.st",
"edu.st",
"embaixada.st",
"mil.st",
"net.st",
"org.st",
"principe.st",
"saotome.st",
"store.st",
"su",
"sv",
"com.sv",
"edu.sv",
"gob.sv",
"org.sv",
"red.sv",
"sx",
"gov.sx",
"sy",
"edu.sy",
"gov.sy",
"net.sy",
"mil.sy",
"com.sy",
"org.sy",
"sz",
"co.sz",
"ac.sz",
"org.sz",
"tc",
"td",
"tel",
"tf",
"tg",
"th",
"ac.th",
"co.th",
"go.th",
"in.th",
"mi.th",
"net.th",
"or.th",
"tj",
"ac.tj",
"biz.tj",
"co.tj",
"com.tj",
"edu.tj",
"go.tj",
"gov.tj",
"int.tj",
"mil.tj",
"name.tj",
"net.tj",
"nic.tj",
"org.tj",
"test.tj",
"web.tj",
"tk",
"tl",
"gov.tl",
"tm",
"com.tm",
"co.tm",
"org.tm",
"net.tm",
"nom.tm",
"gov.tm",
"mil.tm",
"edu.tm",
"tn",
"com.tn",
"ens.tn",
"fin.tn",
"gov.tn",
"ind.tn",
"info.tn",
"intl.tn",
"mincom.tn",
"nat.tn",
"net.tn",
"org.tn",
"perso.tn",
"tourism.tn",
"to",
"com.to",
"gov.to",
"net.to",
"org.to",
"edu.to",
"mil.to",
"tr",
"av.tr",
"bbs.tr",
"bel.tr",
"biz.tr",
"com.tr",
"dr.tr",
"edu.tr",
"gen.tr",
"gov.tr",
"info.tr",
"mil.tr",
"k12.tr",
"kep.tr",
"name.tr",
"net.tr",
"org.tr",
"pol.tr",
"tel.tr",
"tsk.tr",
"tv.tr",
"web.tr",
"nc.tr",
"gov.nc.tr",
"tt",
"co.tt",
"com.tt",
"org.tt",
"net.tt",
"biz.tt",
"info.tt",
"pro.tt",
"int.tt",
"coop.tt",
"jobs.tt",
"mobi.tt",
"travel.tt",
"museum.tt",
"aero.tt",
"name.tt",
"gov.tt",
"edu.tt",
"tv",
"tw",
"edu.tw",
"gov.tw",
"mil.tw",
"com.tw",
"net.tw",
"org.tw",
"idv.tw",
"game.tw",
"ebiz.tw",
"club.tw",
"\u7DB2\u8DEF.tw",
"\u7D44\u7E54.tw",
"\u5546\u696D.tw",
"tz",
"ac.tz",
"co.tz",
"go.tz",
"hotel.tz",
"info.tz",
"me.tz",
"mil.tz",
"mobi.tz",
"ne.tz",
"or.tz",
"sc.tz",
"tv.tz",
"ua",
"com.ua",
"edu.ua",
"gov.ua",
"in.ua",
"net.ua",
"org.ua",
"cherkassy.ua",
"cherkasy.ua",
"chernigov.ua",
"chernihiv.ua",
"chernivtsi.ua",
"chernovtsy.ua",
"ck.ua",
"cn.ua",
"cr.ua",
"crimea.ua",
"cv.ua",
"dn.ua",
"dnepropetrovsk.ua",
"dnipropetrovsk.ua",
"donetsk.ua",
"dp.ua",
"if.ua",
"ivano-frankivsk.ua",
"kh.ua",
"kharkiv.ua",
"kharkov.ua",
"kherson.ua",
"khmelnitskiy.ua",
"khmelnytskyi.ua",
"kiev.ua",
"kirovograd.ua",
"km.ua",
"kr.ua",
"krym.ua",
"ks.ua",
"kv.ua",
"kyiv.ua",
"lg.ua",
"lt.ua",
"lugansk.ua",
"lutsk.ua",
"lv.ua",
"lviv.ua",
"mk.ua",
"mykolaiv.ua",
"nikolaev.ua",
"od.ua",
"odesa.ua",
"odessa.ua",
"pl.ua",
"poltava.ua",
"rivne.ua",
"rovno.ua",
"rv.ua",
"sb.ua",
"sebastopol.ua",
"sevastopol.ua",
"sm.ua",
"sumy.ua",
"te.ua",
"ternopil.ua",
"uz.ua",
"uzhgorod.ua",
"vinnica.ua",
"vinnytsia.ua",
"vn.ua",
"volyn.ua",
"yalta.ua",
"zaporizhzhe.ua",
"zaporizhzhia.ua",
"zhitomir.ua",
"zhytomyr.ua",
"zp.ua",
"zt.ua",
"ug",
"co.ug",
"or.ug",
"ac.ug",
"sc.ug",
"go.ug",
"ne.ug",
"com.ug",
"org.ug",
"uk",
"ac.uk",
"co.uk",
"gov.uk",
"ltd.uk",
"me.uk",
"net.uk",
"nhs.uk",
"org.uk",
"plc.uk",
"police.uk",
"*.sch.uk",
"us",
"dni.us",
"fed.us",
"isa.us",
"kids.us",
"nsn.us",
"ak.us",
"al.us",
"ar.us",
"as.us",
"az.us",
"ca.us",
"co.us",
"ct.us",
"dc.us",
"de.us",
"fl.us",
"ga.us",
"gu.us",
"hi.us",
"ia.us",
"id.us",
"il.us",
"in.us",
"ks.us",
"ky.us",
"la.us",
"ma.us",
"md.us",
"me.us",
"mi.us",
"mn.us",
"mo.us",
"ms.us",
"mt.us",
"nc.us",
"nd.us",
"ne.us",
"nh.us",
"nj.us",
"nm.us",
"nv.us",
"ny.us",
"oh.us",
"ok.us",
"or.us",
"pa.us",
"pr.us",
"ri.us",
"sc.us",
"sd.us",
"tn.us",
"tx.us",
"ut.us",
"vi.us",
"vt.us",
"va.us",
"wa.us",
"wi.us",
"wv.us",
"wy.us",
"k12.ak.us",
"k12.al.us",
"k12.ar.us",
"k12.as.us",
"k12.az.us",
"k12.ca.us",
"k12.co.us",
"k12.ct.us",
"k12.dc.us",
"k12.de.us",
"k12.fl.us",
"k12.ga.us",
"k12.gu.us",
"k12.ia.us",
"k12.id.us",
"k12.il.us",
"k12.in.us",
"k12.ks.us",
"k12.ky.us",
"k12.la.us",
"k12.ma.us",
"k12.md.us",
"k12.me.us",
"k12.mi.us",
"k12.mn.us",
"k12.mo.us",
"k12.ms.us",
"k12.mt.us",
"k12.nc.us",
"k12.ne.us",
"k12.nh.us",
"k12.nj.us",
"k12.nm.us",
"k12.nv.us",
"k12.ny.us",
"k12.oh.us",
"k12.ok.us",
"k12.or.us",
"k12.pa.us",
"k12.pr.us",
"k12.sc.us",
"k12.tn.us",
"k12.tx.us",
"k12.ut.us",
"k12.vi.us",
"k12.vt.us",
"k12.va.us",
"k12.wa.us",
"k12.wi.us",
"k12.wy.us",
"cc.ak.us",
"cc.al.us",
"cc.ar.us",
"cc.as.us",
"cc.az.us",
"cc.ca.us",
"cc.co.us",
"cc.ct.us",
"cc.dc.us",
"cc.de.us",
"cc.fl.us",
"cc.ga.us",
"cc.gu.us",
"cc.hi.us",
"cc.ia.us",
"cc.id.us",
"cc.il.us",
"cc.in.us",
"cc.ks.us",
"cc.ky.us",
"cc.la.us",
"cc.ma.us",
"cc.md.us",
"cc.me.us",
"cc.mi.us",
"cc.mn.us",
"cc.mo.us",
"cc.ms.us",
"cc.mt.us",
"cc.nc.us",
"cc.nd.us",
"cc.ne.us",
"cc.nh.us",
"cc.nj.us",
"cc.nm.us",
"cc.nv.us",
"cc.ny.us",
"cc.oh.us",
"cc.ok.us",
"cc.or.us",
"cc.pa.us",
"cc.pr.us",
"cc.ri.us",
"cc.sc.us",
"cc.sd.us",
"cc.tn.us",
"cc.tx.us",
"cc.ut.us",
"cc.vi.us",
"cc.vt.us",
"cc.va.us",
"cc.wa.us",
"cc.wi.us",
"cc.wv.us",
"cc.wy.us",
"lib.ak.us",
"lib.al.us",
"lib.ar.us",
"lib.as.us",
"lib.az.us",
"lib.ca.us",
"lib.co.us",
"lib.ct.us",
"lib.dc.us",
"lib.fl.us",
"lib.ga.us",
"lib.gu.us",
"lib.hi.us",
"lib.ia.us",
"lib.id.us",
"lib.il.us",
"lib.in.us",
"lib.ks.us",
"lib.ky.us",
"lib.la.us",
"lib.ma.us",
"lib.md.us",
"lib.me.us",
"lib.mi.us",
"lib.mn.us",
"lib.mo.us",
"lib.ms.us",
"lib.mt.us",
"lib.nc.us",
"lib.nd.us",
"lib.ne.us",
"lib.nh.us",
"lib.nj.us",
"lib.nm.us",
"lib.nv.us",
"lib.ny.us",
"lib.oh.us",
"lib.ok.us",
"lib.or.us",
"lib.pa.us",
"lib.pr.us",
"lib.ri.us",
"lib.sc.us",
"lib.sd.us",
"lib.tn.us",
"lib.tx.us",
"lib.ut.us",
"lib.vi.us",
"lib.vt.us",
"lib.va.us",
"lib.wa.us",
"lib.wi.us",
"lib.wy.us",
"pvt.k12.ma.us",
"chtr.k12.ma.us",
"paroch.k12.ma.us",
"ann-arbor.mi.us",
"cog.mi.us",
"dst.mi.us",
"eaton.mi.us",
"gen.mi.us",
"mus.mi.us",
"tec.mi.us",
"washtenaw.mi.us",
"uy",
"com.uy",
"edu.uy",
"gub.uy",
"mil.uy",
"net.uy",
"org.uy",
"uz",
"co.uz",
"com.uz",
"net.uz",
"org.uz",
"va",
"vc",
"com.vc",
"net.vc",
"org.vc",
"gov.vc",
"mil.vc",
"edu.vc",
"ve",
"arts.ve",
"bib.ve",
"co.ve",
"com.ve",
"e12.ve",
"edu.ve",
"firm.ve",
"gob.ve",
"gov.ve",
"info.ve",
"int.ve",
"mil.ve",
"net.ve",
"nom.ve",
"org.ve",
"rar.ve",
"rec.ve",
"store.ve",
"tec.ve",
"web.ve",
"vg",
"vi",
"co.vi",
"com.vi",
"k12.vi",
"net.vi",
"org.vi",
"vn",
"com.vn",
"net.vn",
"org.vn",
"edu.vn",
"gov.vn",
"int.vn",
"ac.vn",
"biz.vn",
"info.vn",
"name.vn",
"pro.vn",
"health.vn",
"vu",
"com.vu",
"edu.vu",
"net.vu",
"org.vu",
"wf",
"ws",
"com.ws",
"net.ws",
"org.ws",
"gov.ws",
"edu.ws",
"yt",
"\u0627\u0645\u0627\u0631\u0627\u062A",
"\u0570\u0561\u0575",
"\u09AC\u09BE\u0982\u09B2\u09BE",
"\u0431\u0433",
"\u0627\u0644\u0628\u062D\u0631\u064A\u0646",
"\u0431\u0435\u043B",
"\u4E2D\u56FD",
"\u4E2D\u570B",
"\u0627\u0644\u062C\u0632\u0627\u0626\u0631",
"\u0645\u0635\u0631",
"\u0435\u044E",
"\u03B5\u03C5",
"\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627",
"\u10D2\u10D4",
"\u03B5\u03BB",
"\u9999\u6E2F",
"\u516C\u53F8.\u9999\u6E2F",
"\u6559\u80B2.\u9999\u6E2F",
"\u653F\u5E9C.\u9999\u6E2F",
"\u500B\u4EBA.\u9999\u6E2F",
"\u7DB2\u7D61.\u9999\u6E2F",
"\u7D44\u7E54.\u9999\u6E2F",
"\u0CAD\u0CBE\u0CB0\u0CA4",
"\u0B2D\u0B3E\u0B30\u0B24",
"\u09AD\u09BE\u09F0\u09A4",
"\u092D\u093E\u0930\u0924\u092E\u094D",
"\u092D\u093E\u0930\u094B\u0924",
"\u0680\u0627\u0631\u062A",
"\u0D2D\u0D3E\u0D30\u0D24\u0D02",
"\u092D\u093E\u0930\u0924",
"\u0628\u0627\u0631\u062A",
"\u0628\u06BE\u0627\u0631\u062A",
"\u0C2D\u0C3E\u0C30\u0C24\u0C4D",
"\u0AAD\u0ABE\u0AB0\u0AA4",
"\u0A2D\u0A3E\u0A30\u0A24",
"\u09AD\u09BE\u09B0\u09A4",
"\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE",
"\u0627\u06CC\u0631\u0627\u0646",
"\u0627\u064A\u0631\u0627\u0646",
"\u0639\u0631\u0627\u0642",
"\u0627\u0644\u0627\u0631\u062F\u0646",
"\uD55C\uAD6D",
"\u049B\u0430\u0437",
"\u0EA5\u0EB2\u0EA7",
"\u0DBD\u0D82\u0D9A\u0DCF",
"\u0B87\u0BB2\u0B99\u0BCD\u0B95\u0BC8",
"\u0627\u0644\u0645\u063A\u0631\u0628",
"\u043C\u043A\u0434",
"\u043C\u043E\u043D",
"\u6FB3\u9580",
"\u6FB3\u95E8",
"\u0645\u0644\u064A\u0633\u064A\u0627",
"\u0639\u0645\u0627\u0646",
"\u067E\u0627\u06A9\u0633\u062A\u0627\u0646",
"\u067E\u0627\u0643\u0633\u062A\u0627\u0646",
"\u0641\u0644\u0633\u0637\u064A\u0646",
"\u0441\u0440\u0431",
"\u043F\u0440.\u0441\u0440\u0431",
"\u043E\u0440\u0433.\u0441\u0440\u0431",
"\u043E\u0431\u0440.\u0441\u0440\u0431",
"\u043E\u0434.\u0441\u0440\u0431",
"\u0443\u043F\u0440.\u0441\u0440\u0431",
"\u0430\u043A.\u0441\u0440\u0431",
"\u0440\u0444",
"\u0642\u0637\u0631",
"\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629",
"\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u0629",
"\u0627\u0644\u0633\u0639\u0648\u062F\u06CC\u06C3",
"\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0647",
"\u0633\u0648\u062F\u0627\u0646",
"\u65B0\u52A0\u5761",
"\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD",
"\u0633\u0648\u0631\u064A\u0629",
"\u0633\u0648\u0631\u064A\u0627",
"\u0E44\u0E17\u0E22",
"\u0E28\u0E36\u0E01\u0E29\u0E32.\u0E44\u0E17\u0E22",
"\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08.\u0E44\u0E17\u0E22",
"\u0E23\u0E31\u0E10\u0E1A\u0E32\u0E25.\u0E44\u0E17\u0E22",
"\u0E17\u0E2B\u0E32\u0E23.\u0E44\u0E17\u0E22",
"\u0E40\u0E19\u0E47\u0E15.\u0E44\u0E17\u0E22",
"\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23.\u0E44\u0E17\u0E22",
"\u062A\u0648\u0646\u0633",
"\u53F0\u7063",
"\u53F0\u6E7E",
"\u81FA\u7063",
"\u0443\u043A\u0440",
"\u0627\u0644\u064A\u0645\u0646",
"xxx",
"ye",
"com.ye",
"edu.ye",
"gov.ye",
"net.ye",
"mil.ye",
"org.ye",
"ac.za",
"agric.za",
"alt.za",
"co.za",
"edu.za",
"gov.za",
"grondar.za",
"law.za",
"mil.za",
"net.za",
"ngo.za",
"nic.za",
"nis.za",
"nom.za",
"org.za",
"school.za",
"tm.za",
"web.za",
"zm",
"ac.zm",
"biz.zm",
"co.zm",
"com.zm",
"edu.zm",
"gov.zm",
"info.zm",
"mil.zm",
"net.zm",
"org.zm",
"sch.zm",
"zw",
"ac.zw",
"co.zw",
"gov.zw",
"mil.zw",
"org.zw",
"aaa",
"aarp",
"abarth",
"abb",
"abbott",
"abbvie",
"abc",
"able",
"abogado",
"abudhabi",
"academy",
"accenture",
"accountant",
"accountants",
"aco",
"actor",
"adac",
"ads",
"adult",
"aeg",
"aetna",
"afl",
"africa",
"agakhan",
"agency",
"aig",
"airbus",
"airforce",
"airtel",
"akdn",
"alfaromeo",
"alibaba",
"alipay",
"allfinanz",
"allstate",
"ally",
"alsace",
"alstom",
"amazon",
"americanexpress",
"americanfamily",
"amex",
"amfam",
"amica",
"amsterdam",
"analytics",
"android",
"anquan",
"anz",
"aol",
"apartments",
"app",
"apple",
"aquarelle",
"arab",
"aramco",
"archi",
"army",
"art",
"arte",
"asda",
"associates",
"athleta",
"attorney",
"auction",
"audi",
"audible",
"audio",
"auspost",
"author",
"auto",
"autos",
"avianca",
"aws",
"axa",
"azure",
"baby",
"baidu",
"banamex",
"bananarepublic",
"band",
"bank",
"bar",
"barcelona",
"barclaycard",
"barclays",
"barefoot",
"bargains",
"baseball",
"basketball",
"bauhaus",
"bayern",
"bbc",
"bbt",
"bbva",
"bcg",
"bcn",
"beats",
"beauty",
"beer",
"bentley",
"berlin",
"best",
"bestbuy",
"bet",
"bharti",
"bible",
"bid",
"bike",
"bing",
"bingo",
"bio",
"black",
"blackfriday",
"blockbuster",
"blog",
"bloomberg",
"blue",
"bms",
"bmw",
"bnpparibas",
"boats",
"boehringer",
"bofa",
"bom",
"bond",
"boo",
"book",
"booking",
"bosch",
"bostik",
"boston",
"bot",
"boutique",
"box",
"bradesco",
"bridgestone",
"broadway",
"broker",
"brother",
"brussels",
"bugatti",
"build",
"builders",
"business",
"buy",
"buzz",
"bzh",
"cab",
"cafe",
"cal",
"call",
"calvinklein",
"cam",
"camera",
"camp",
"cancerresearch",
"canon",
"capetown",
"capital",
"capitalone",
"car",
"caravan",
"cards",
"care",
"career",
"careers",
"cars",
"casa",
"case",
"cash",
"casino",
"catering",
"catholic",
"cba",
"cbn",
"cbre",
"cbs",
"center",
"ceo",
"cern",
"cfa",
"cfd",
"chanel",
"channel",
"charity",
"chase",
"chat",
"cheap",
"chintai",
"christmas",
"chrome",
"church",
"cipriani",
"circle",
"cisco",
"citadel",
"citi",
"citic",
"city",
"cityeats",
"claims",
"cleaning",
"click",
"clinic",
"clinique",
"clothing",
"cloud",
"club",
"clubmed",
"coach",
"codes",
"coffee",
"college",
"cologne",
"comcast",
"commbank",
"community",
"company",
"compare",
"computer",
"comsec",
"condos",
"construction",
"consulting",
"contact",
"contractors",
"cooking",
"cookingchannel",
"cool",
"corsica",
"country",
"coupon",
"coupons",
"courses",
"cpa",
"credit",
"creditcard",
"creditunion",
"cricket",
"crown",
"crs",
"cruise",
"cruises",
"cuisinella",
"cymru",
"cyou",
"dabur",
"dad",
"dance",
"data",
"date",
"dating",
"datsun",
"day",
"dclk",
"dds",
"deal",
"dealer",
"deals",
"degree",
"delivery",
"dell",
"deloitte",
"delta",
"democrat",
"dental",
"dentist",
"desi",
"design",
"dev",
"dhl",
"diamonds",
"diet",
"digital",
"direct",
"directory",
"discount",
"discover",
"dish",
"diy",
"dnp",
"docs",
"doctor",
"dog",
"domains",
"dot",
"download",
"drive",
"dtv",
"dubai",
"dunlop",
"dupont",
"durban",
"dvag",
"dvr",
"earth",
"eat",
"eco",
"edeka",
"education",
"email",
"emerck",
"energy",
"engineer",
"engineering",
"enterprises",
"epson",
"equipment",
"ericsson",
"erni",
"esq",
"estate",
"etisalat",
"eurovision",
"eus",
"events",
"exchange",
"expert",
"exposed",
"express",
"extraspace",
"fage",
"fail",
"fairwinds",
"faith",
"family",
"fan",
"fans",
"farm",
"farmers",
"fashion",
"fast",
"fedex",
"feedback",
"ferrari",
"ferrero",
"fiat",
"fidelity",
"fido",
"film",
"final",
"finance",
"financial",
"fire",
"firestone",
"firmdale",
"fish",
"fishing",
"fit",
"fitness",
"flickr",
"flights",
"flir",
"florist",
"flowers",
"fly",
"foo",
"food",
"foodnetwork",
"football",
"ford",
"forex",
"forsale",
"forum",
"foundation",
"fox",
"free",
"fresenius",
"frl",
"frogans",
"frontdoor",
"frontier",
"ftr",
"fujitsu",
"fun",
"fund",
"furniture",
"futbol",
"fyi",
"gal",
"gallery",
"gallo",
"gallup",
"game",
"games",
"gap",
"garden",
"gay",
"gbiz",
"gdn",
"gea",
"gent",
"genting",
"george",
"ggee",
"gift",
"gifts",
"gives",
"giving",
"glass",
"gle",
"global",
"globo",
"gmail",
"gmbh",
"gmo",
"gmx",
"godaddy",
"gold",
"goldpoint",
"golf",
"goo",
"goodyear",
"goog",
"google",
"gop",
"got",
"grainger",
"graphics",
"gratis",
"green",
"gripe",
"grocery",
"group",
"guardian",
"gucci",
"guge",
"guide",
"guitars",
"guru",
"hair",
"hamburg",
"hangout",
"haus",
"hbo",
"hdfc",
"hdfcbank",
"health",
"healthcare",
"help",
"helsinki",
"here",
"hermes",
"hgtv",
"hiphop",
"hisamitsu",
"hitachi",
"hiv",
"hkt",
"hockey",
"holdings",
"holiday",
"homedepot",
"homegoods",
"homes",
"homesense",
"honda",
"horse",
"hospital",
"host",
"hosting",
"hot",
"hoteles",
"hotels",
"hotmail",
"house",
"how",
"hsbc",
"hughes",
"hyatt",
"hyundai",
"ibm",
"icbc",
"ice",
"icu",
"ieee",
"ifm",
"ikano",
"imamat",
"imdb",
"immo",
"immobilien",
"inc",
"industries",
"infiniti",
"ing",
"ink",
"institute",
"insurance",
"insure",
"international",
"intuit",
"investments",
"ipiranga",
"irish",
"ismaili",
"ist",
"istanbul",
"itau",
"itv",
"jaguar",
"java",
"jcb",
"jeep",
"jetzt",
"jewelry",
"jio",
"jll",
"jmp",
"jnj",
"joburg",
"jot",
"joy",
"jpmorgan",
"jprs",
"juegos",
"juniper",
"kaufen",
"kddi",
"kerryhotels",
"kerrylogistics",
"kerryproperties",
"kfh",
"kia",
"kids",
"kim",
"kinder",
"kindle",
"kitchen",
"kiwi",
"koeln",
"komatsu",
"kosher",
"kpmg",
"kpn",
"krd",
"kred",
"kuokgroup",
"kyoto",
"lacaixa",
"lamborghini",
"lamer",
"lancaster",
"lancia",
"land",
"landrover",
"lanxess",
"lasalle",
"lat",
"latino",
"latrobe",
"law",
"lawyer",
"lds",
"lease",
"leclerc",
"lefrak",
"legal",
"lego",
"lexus",
"lgbt",
"lidl",
"life",
"lifeinsurance",
"lifestyle",
"lighting",
"like",
"lilly",
"limited",
"limo",
"lincoln",
"linde",
"link",
"lipsy",
"live",
"living",
"llc",
"llp",
"loan",
"loans",
"locker",
"locus",
"loft",
"lol",
"london",
"lotte",
"lotto",
"love",
"lpl",
"lplfinancial",
"ltd",
"ltda",
"lundbeck",
"luxe",
"luxury",
"macys",
"madrid",
"maif",
"maison",
"makeup",
"man",
"management",
"mango",
"map",
"market",
"marketing",
"markets",
"marriott",
"marshalls",
"maserati",
"mattel",
"mba",
"mckinsey",
"med",
"media",
"meet",
"melbourne",
"meme",
"memorial",
"men",
"menu",
"merckmsd",
"miami",
"microsoft",
"mini",
"mint",
"mit",
"mitsubishi",
"mlb",
"mls",
"mma",
"mobile",
"moda",
"moe",
"moi",
"mom",
"monash",
"money",
"monster",
"mormon",
"mortgage",
"moscow",
"moto",
"motorcycles",
"mov",
"movie",
"msd",
"mtn",
"mtr",
"music",
"mutual",
"nab",
"nagoya",
"natura",
"navy",
"nba",
"nec",
"netbank",
"netflix",
"network",
"neustar",
"new",
"news",
"next",
"nextdirect",
"nexus",
"nfl",
"ngo",
"nhk",
"nico",
"nike",
"nikon",
"ninja",
"nissan",
"nissay",
"nokia",
"northwesternmutual",
"norton",
"now",
"nowruz",
"nowtv",
"nra",
"nrw",
"ntt",
"nyc",
"obi",
"observer",
"office",
"okinawa",
"olayan",
"olayangroup",
"oldnavy",
"ollo",
"omega",
"one",
"ong",
"onl",
"online",
"ooo",
"open",
"oracle",
"orange",
"organic",
"origins",
"osaka",
"otsuka",
"ott",
"ovh",
"page",
"panasonic",
"paris",
"pars",
"partners",
"parts",
"party",
"passagens",
"pay",
"pccw",
"pet",
"pfizer",
"pharmacy",
"phd",
"philips",
"phone",
"photo",
"photography",
"photos",
"physio",
"pics",
"pictet",
"pictures",
"pid",
"pin",
"ping",
"pink",
"pioneer",
"pizza",
"place",
"play",
"playstation",
"plumbing",
"plus",
"pnc",
"pohl",
"poker",
"politie",
"porn",
"pramerica",
"praxi",
"press",
"prime",
"prod",
"productions",
"prof",
"progressive",
"promo",
"properties",
"property",
"protection",
"pru",
"prudential",
"pub",
"pwc",
"qpon",
"quebec",
"quest",
"racing",
"radio",
"read",
"realestate",
"realtor",
"realty",
"recipes",
"red",
"redstone",
"redumbrella",
"rehab",
"reise",
"reisen",
"reit",
"reliance",
"ren",
"rent",
"rentals",
"repair",
"report",
"republican",
"rest",
"restaurant",
"review",
"reviews",
"rexroth",
"rich",
"richardli",
"ricoh",
"ril",
"rio",
"rip",
"rocher",
"rocks",
"rodeo",
"rogers",
"room",
"rsvp",
"rugby",
"ruhr",
"run",
"rwe",
"ryukyu",
"saarland",
"safe",
"safety",
"sakura",
"sale",
"salon",
"samsclub",
"samsung",
"sandvik",
"sandvikcoromant",
"sanofi",
"sap",
"sarl",
"sas",
"save",
"saxo",
"sbi",
"sbs",
"sca",
"scb",
"schaeffler",
"schmidt",
"scholarships",
"school",
"schule",
"schwarz",
"science",
"scot",
"search",
"seat",
"secure",
"security",
"seek",
"select",
"sener",
"services",
"ses",
"seven",
"sew",
"sex",
"sexy",
"sfr",
"shangrila",
"sharp",
"shaw",
"shell",
"shia",
"shiksha",
"shoes",
"shop",
"shopping",
"shouji",
"show",
"showtime",
"silk",
"sina",
"singles",
"site",
"ski",
"skin",
"sky",
"skype",
"sling",
"smart",
"smile",
"sncf",
"soccer",
"social",
"softbank",
"software",
"sohu",
"solar",
"solutions",
"song",
"sony",
"soy",
"spa",
"space",
"sport",
"spot",
"srl",
"stada",
"staples",
"star",
"statebank",
"statefarm",
"stc",
"stcgroup",
"stockholm",
"storage",
"store",
"stream",
"studio",
"study",
"style",
"sucks",
"supplies",
"supply",
"support",
"surf",
"surgery",
"suzuki",
"swatch",
"swiss",
"sydney",
"systems",
"tab",
"taipei",
"talk",
"taobao",
"target",
"tatamotors",
"tatar",
"tattoo",
"tax",
"taxi",
"tci",
"tdk",
"team",
"tech",
"technology",
"temasek",
"tennis",
"teva",
"thd",
"theater",
"theatre",
"tiaa",
"tickets",
"tienda",
"tiffany",
"tips",
"tires",
"tirol",
"tjmaxx",
"tjx",
"tkmaxx",
"tmall",
"today",
"tokyo",
"tools",
"top",
"toray",
"toshiba",
"total",
"tours",
"town",
"toyota",
"toys",
"trade",
"trading",
"training",
"travel",
"travelchannel",
"travelers",
"travelersinsurance",
"trust",
"trv",
"tube",
"tui",
"tunes",
"tushu",
"tvs",
"ubank",
"ubs",
"unicom",
"university",
"uno",
"uol",
"ups",
"vacations",
"vana",
"vanguard",
"vegas",
"ventures",
"verisign",
"versicherung",
"vet",
"viajes",
"video",
"vig",
"viking",
"villas",
"vin",
"vip",
"virgin",
"visa",
"vision",
"viva",
"vivo",
"vlaanderen",
"vodka",
"volkswagen",
"volvo",
"vote",
"voting",
"voto",
"voyage",
"vuelos",
"wales",
"walmart",
"walter",
"wang",
"wanggou",
"watch",
"watches",
"weather",
"weatherchannel",
"webcam",
"weber",
"website",
"wedding",
"weibo",
"weir",
"whoswho",
"wien",
"wiki",
"williamhill",
"win",
"windows",
"wine",
"winners",
"wme",
"wolterskluwer",
"woodside",
"work",
"works",
"world",
"wow",
"wtc",
"wtf",
"xbox",
"xerox",
"xfinity",
"xihuan",
"xin",
"\u0915\u0949\u092E",
"\u30BB\u30FC\u30EB",
"\u4F5B\u5C71",
"\u6148\u5584",
"\u96C6\u56E2",
"\u5728\u7EBF",
"\u70B9\u770B",
"\u0E04\u0E2D\u0E21",
"\u516B\u5366",
"\u0645\u0648\u0642\u0639",
"\u516C\u76CA",
"\u516C\u53F8",
"\u9999\u683C\u91CC\u62C9",
"\u7F51\u7AD9",
"\u79FB\u52A8",
"\u6211\u7231\u4F60",
"\u043C\u043E\u0441\u043A\u0432\u0430",
"\u043A\u0430\u0442\u043E\u043B\u0438\u043A",
"\u043E\u043D\u043B\u0430\u0439\u043D",
"\u0441\u0430\u0439\u0442",
"\u8054\u901A",
"\u05E7\u05D5\u05DD",
"\u65F6\u5C1A",
"\u5FAE\u535A",
"\u6DE1\u9A6C\u9521",
"\u30D5\u30A1\u30C3\u30B7\u30E7\u30F3",
"\u043E\u0440\u0433",
"\u0928\u0947\u091F",
"\u30B9\u30C8\u30A2",
"\u30A2\u30DE\u30BE\u30F3",
"\uC0BC\uC131",
"\u5546\u6807",
"\u5546\u5E97",
"\u5546\u57CE",
"\u0434\u0435\u0442\u0438",
"\u30DD\u30A4\u30F3\u30C8",
"\u65B0\u95FB",
"\u5BB6\u96FB",
"\u0643\u0648\u0645",
"\u4E2D\u6587\u7F51",
"\u4E2D\u4FE1",
"\u5A31\u4E50",
"\u8C37\u6B4C",
"\u96FB\u8A0A\u76C8\u79D1",
"\u8D2D\u7269",
"\u30AF\u30E9\u30A6\u30C9",
"\u901A\u8CA9",
"\u7F51\u5E97",
"\u0938\u0902\u0917\u0920\u0928",
"\u9910\u5385",
"\u7F51\u7EDC",
"\u043A\u043E\u043C",
"\u4E9A\u9A6C\u900A",
"\u8BFA\u57FA\u4E9A",
"\u98DF\u54C1",
"\u98DE\u5229\u6D66",
"\u624B\u673A",
"\u0627\u0631\u0627\u0645\u0643\u0648",
"\u0627\u0644\u0639\u0644\u064A\u0627\u0646",
"\u0627\u062A\u0635\u0627\u0644\u0627\u062A",
"\u0628\u0627\u0632\u0627\u0631",
"\u0627\u0628\u0648\u0638\u0628\u064A",
"\u0643\u0627\u062B\u0648\u0644\u064A\u0643",
"\u0647\u0645\u0631\u0627\u0647",
"\uB2F7\uCEF4",
"\u653F\u5E9C",
"\u0634\u0628\u0643\u0629",
"\u0628\u064A\u062A\u0643",
"\u0639\u0631\u0628",
"\u673A\u6784",
"\u7EC4\u7EC7\u673A\u6784",
"\u5065\u5EB7",
"\u62DB\u8058",
"\u0440\u0443\u0441",
"\u5927\u62FF",
"\u307F\u3093\u306A",
"\u30B0\u30FC\u30B0\u30EB",
"\u4E16\u754C",
"\u66F8\u7C4D",
"\u7F51\u5740",
"\uB2F7\uB137",
"\u30B3\u30E0",
"\u5929\u4E3B\u6559",
"\u6E38\u620F",
"verm\xF6gensberater",
"verm\xF6gensberatung",
"\u4F01\u4E1A",
"\u4FE1\u606F",
"\u5609\u91CC\u5927\u9152\u5E97",
"\u5609\u91CC",
"\u5E7F\u4E1C",
"\u653F\u52A1",
"xyz",
"yachts",
"yahoo",
"yamaxun",
"yandex",
"yodobashi",
"yoga",
"yokohama",
"you",
"youtube",
"yun",
"zappos",
"zara",
"zero",
"zip",
"zone",
"zuerich",
"cc.ua",
"inf.ua",
"ltd.ua",
"611.to",
"graphox.us",
"*.devcdnaccesso.com",
"adobeaemcloud.com",
"*.dev.adobeaemcloud.com",
"hlx.live",
"adobeaemcloud.net",
"hlx.page",
"hlx3.page",
"beep.pl",
"airkitapps.com",
"airkitapps-au.com",
"airkitapps.eu",
"aivencloud.com",
"barsy.ca",
"*.compute.estate",
"*.alces.network",
"kasserver.com",
"altervista.org",
"alwaysdata.net",
"cloudfront.net",
"*.compute.amazonaws.com",
"*.compute-1.amazonaws.com",
"*.compute.amazonaws.com.cn",
"us-east-1.amazonaws.com",
"cn-north-1.eb.amazonaws.com.cn",
"cn-northwest-1.eb.amazonaws.com.cn",
"elasticbeanstalk.com",
"ap-northeast-1.elasticbeanstalk.com",
"ap-northeast-2.elasticbeanstalk.com",
"ap-northeast-3.elasticbeanstalk.com",
"ap-south-1.elasticbeanstalk.com",
"ap-southeast-1.elasticbeanstalk.com",
"ap-southeast-2.elasticbeanstalk.com",
"ca-central-1.elasticbeanstalk.com",
"eu-central-1.elasticbeanstalk.com",
"eu-west-1.elasticbeanstalk.com",
"eu-west-2.elasticbeanstalk.com",
"eu-west-3.elasticbeanstalk.com",
"sa-east-1.elasticbeanstalk.com",
"us-east-1.elasticbeanstalk.com",
"us-east-2.elasticbeanstalk.com",
"us-gov-west-1.elasticbeanstalk.com",
"us-west-1.elasticbeanstalk.com",
"us-west-2.elasticbeanstalk.com",
"*.elb.amazonaws.com",
"*.elb.amazonaws.com.cn",
"awsglobalaccelerator.com",
"s3.amazonaws.com",
"s3-ap-northeast-1.amazonaws.com",
"s3-ap-northeast-2.amazonaws.com",
"s3-ap-south-1.amazonaws.com",
"s3-ap-southeast-1.amazonaws.com",
"s3-ap-southeast-2.amazonaws.com",
"s3-ca-central-1.amazonaws.com",
"s3-eu-central-1.amazonaws.com",
"s3-eu-west-1.amazonaws.com",
"s3-eu-west-2.amazonaws.com",
"s3-eu-west-3.amazonaws.com",
"s3-external-1.amazonaws.com",
"s3-fips-us-gov-west-1.amazonaws.com",
"s3-sa-east-1.amazonaws.com",
"s3-us-gov-west-1.amazonaws.com",
"s3-us-east-2.amazonaws.com",
"s3-us-west-1.amazonaws.com",
"s3-us-west-2.amazonaws.com",
"s3.ap-northeast-2.amazonaws.com",
"s3.ap-south-1.amazonaws.com",
"s3.cn-north-1.amazonaws.com.cn",
"s3.ca-central-1.amazonaws.com",
"s3.eu-central-1.amazonaws.com",
"s3.eu-west-2.amazonaws.com",
"s3.eu-west-3.amazonaws.com",
"s3.us-east-2.amazonaws.com",
"s3.dualstack.ap-northeast-1.amazonaws.com",
"s3.dualstack.ap-northeast-2.amazonaws.com",
"s3.dualstack.ap-south-1.amazonaws.com",
"s3.dualstack.ap-southeast-1.amazonaws.com",
"s3.dualstack.ap-southeast-2.amazonaws.com",
"s3.dualstack.ca-central-1.amazonaws.com",
"s3.dualstack.eu-central-1.amazonaws.com",
"s3.dualstack.eu-west-1.amazonaws.com",
"s3.dualstack.eu-west-2.amazonaws.com",
"s3.dualstack.eu-west-3.amazonaws.com",
"s3.dualstack.sa-east-1.amazonaws.com",
"s3.dualstack.us-east-1.amazonaws.com",
"s3.dualstack.us-east-2.amazonaws.com",
"s3-website-us-east-1.amazonaws.com",
"s3-website-us-west-1.amazonaws.com",
"s3-website-us-west-2.amazonaws.com",
"s3-website-ap-northeast-1.amazonaws.com",
"s3-website-ap-southeast-1.amazonaws.com",
"s3-website-ap-southeast-2.amazonaws.com",
"s3-website-eu-west-1.amazonaws.com",
"s3-website-sa-east-1.amazonaws.com",
"s3-website.ap-northeast-2.amazonaws.com",
"s3-website.ap-south-1.amazonaws.com",
"s3-website.ca-central-1.amazonaws.com",
"s3-website.eu-central-1.amazonaws.com",
"s3-website.eu-west-2.amazonaws.com",
"s3-website.eu-west-3.amazonaws.com",
"s3-website.us-east-2.amazonaws.com",
"t3l3p0rt.net",
"tele.amune.org",
"apigee.io",
"siiites.com",
"appspacehosted.com",
"appspaceusercontent.com",
"appudo.net",
"on-aptible.com",
"user.aseinet.ne.jp",
"gv.vc",
"d.gv.vc",
"user.party.eus",
"pimienta.org",
"poivron.org",
"potager.org",
"sweetpepper.org",
"myasustor.com",
"cdn.prod.atlassian-dev.net",
"translated.page",
"myfritz.net",
"onavstack.net",
"*.awdev.ca",
"*.advisor.ws",
"ecommerce-shop.pl",
"b-data.io",
"backplaneapp.io",
"balena-devices.com",
"rs.ba",
"*.banzai.cloud",
"app.banzaicloud.io",
"*.backyards.banzaicloud.io",
"base.ec",
"official.ec",
"buyshop.jp",
"fashionstore.jp",
"handcrafted.jp",
"kawaiishop.jp",
"supersale.jp",
"theshop.jp",
"shopselect.net",
"base.shop",
"*.beget.app",
"betainabox.com",
"bnr.la",
"bitbucket.io",
"blackbaudcdn.net",
"of.je",
"bluebite.io",
"boomla.net",
"boutir.com",
"boxfuse.io",
"square7.ch",
"bplaced.com",
"bplaced.de",
"square7.de",
"bplaced.net",
"square7.net",
"shop.brendly.rs",
"browsersafetymark.io",
"uk0.bigv.io",
"dh.bytemark.co.uk",
"vm.bytemark.co.uk",
"cafjs.com",
"mycd.eu",
"drr.ac",
"uwu.ai",
"carrd.co",
"crd.co",
"ju.mp",
"ae.org",
"br.com",
"cn.com",
"com.de",
"com.se",
"de.com",
"eu.com",
"gb.net",
"hu.net",
"jp.net",
"jpn.com",
"mex.com",
"ru.com",
"sa.com",
"se.net",
"uk.com",
"uk.net",
"us.com",
"za.bz",
"za.com",
"ar.com",
"hu.com",
"kr.com",
"no.com",
"qc.com",
"uy.com",
"africa.com",
"gr.com",
"in.net",
"web.in",
"us.org",
"co.com",
"aus.basketball",
"nz.basketball",
"radio.am",
"radio.fm",
"c.la",
"certmgr.org",
"cx.ua",
"discourse.group",
"discourse.team",
"cleverapps.io",
"clerk.app",
"clerkstage.app",
"*.lcl.dev",
"*.lclstage.dev",
"*.stg.dev",
"*.stgstage.dev",
"clickrising.net",
"c66.me",
"cloud66.ws",
"cloud66.zone",
"jdevcloud.com",
"wpdevcloud.com",
"cloudaccess.host",
"freesite.host",
"cloudaccess.net",
"cloudcontrolled.com",
"cloudcontrolapp.com",
"*.cloudera.site",
"pages.dev",
"trycloudflare.com",
"workers.dev",
"wnext.app",
"co.ca",
"*.otap.co",
"co.cz",
"c.cdn77.org",
"cdn77-ssl.net",
"r.cdn77.net",
"rsc.cdn77.org",
"ssl.origin.cdn77-secure.org",
"cloudns.asia",
"cloudns.biz",
"cloudns.club",
"cloudns.cc",
"cloudns.eu",
"cloudns.in",
"cloudns.info",
"cloudns.org",
"cloudns.pro",
"cloudns.pw",
"cloudns.us",
"cnpy.gdn",
"codeberg.page",
"co.nl",
"co.no",
"webhosting.be",
"hosting-cluster.nl",
"ac.ru",
"edu.ru",
"gov.ru",
"int.ru",
"mil.ru",
"test.ru",
"dyn.cosidns.de",
"dynamisches-dns.de",
"dnsupdater.de",
"internet-dns.de",
"l-o-g-i-n.de",
"dynamic-dns.info",
"feste-ip.net",
"knx-server.net",
"static-access.net",
"realm.cz",
"*.cryptonomic.net",
"cupcake.is",
"curv.dev",
"*.customer-oci.com",
"*.oci.customer-oci.com",
"*.ocp.customer-oci.com",
"*.ocs.customer-oci.com",
"cyon.link",
"cyon.site",
"fnwk.site",
"folionetwork.site",
"platform0.app",
"daplie.me",
"localhost.daplie.me",
"dattolocal.com",
"dattorelay.com",
"dattoweb.com",
"mydatto.com",
"dattolocal.net",
"mydatto.net",
"biz.dk",
"co.dk",
"firm.dk",
"reg.dk",
"store.dk",
"dyndns.dappnode.io",
"*.dapps.earth",
"*.bzz.dapps.earth",
"builtwithdark.com",
"demo.datadetect.com",
"instance.datadetect.com",
"edgestack.me",
"ddns5.com",
"debian.net",
"deno.dev",
"deno-staging.dev",
"dedyn.io",
"deta.app",
"deta.dev",
"*.rss.my.id",
"*.diher.solutions",
"discordsays.com",
"discordsez.com",
"jozi.biz",
"dnshome.de",
"online.th",
"shop.th",
"drayddns.com",
"shoparena.pl",
"dreamhosters.com",
"mydrobo.com",
"drud.io",
"drud.us",
"duckdns.org",
"bip.sh",
"bitbridge.net",
"dy.fi",
"tunk.org",
"dyndns-at-home.com",
"dyndns-at-work.com",
"dyndns-blog.com",
"dyndns-free.com",
"dyndns-home.com",
"dyndns-ip.com",
"dyndns-mail.com",
"dyndns-office.com",
"dyndns-pics.com",
"dyndns-remote.com",
"dyndns-server.com",
"dyndns-web.com",
"dyndns-wiki.com",
"dyndns-work.com",
"dyndns.biz",
"dyndns.info",
"dyndns.org",
"dyndns.tv",
"at-band-camp.net",
"ath.cx",
"barrel-of-knowledge.info",
"barrell-of-knowledge.info",
"better-than.tv",
"blogdns.com",
"blogdns.net",
"blogdns.org",
"blogsite.org",
"boldlygoingnowhere.org",
"broke-it.net",
"buyshouses.net",
"cechire.com",
"dnsalias.com",
"dnsalias.net",
"dnsalias.org",
"dnsdojo.com",
"dnsdojo.net",
"dnsdojo.org",
"does-it.net",
"doesntexist.com",
"doesntexist.org",
"dontexist.com",
"dontexist.net",
"dontexist.org",
"doomdns.com",
"doomdns.org",
"dvrdns.org",
"dyn-o-saur.com",
"dynalias.com",
"dynalias.net",
"dynalias.org",
"dynathome.net",
"dyndns.ws",
"endofinternet.net",
"endofinternet.org",
"endoftheinternet.org",
"est-a-la-maison.com",
"est-a-la-masion.com",
"est-le-patron.com",
"est-mon-blogueur.com",
"for-better.biz",
"for-more.biz",
"for-our.info",
"for-some.biz",
"for-the.biz",
"forgot.her.name",
"forgot.his.name",
"from-ak.com",
"from-al.com",
"from-ar.com",
"from-az.net",
"from-ca.com",
"from-co.net",
"from-ct.com",
"from-dc.com",
"from-de.com",
"from-fl.com",
"from-ga.com",
"from-hi.com",
"from-ia.com",
"from-id.com",
"from-il.com",
"from-in.com",
"from-ks.com",
"from-ky.com",
"from-la.net",
"from-ma.com",
"from-md.com",
"from-me.org",
"from-mi.com",
"from-mn.com",
"from-mo.com",
"from-ms.com",
"from-mt.com",
"from-nc.com",
"from-nd.com",
"from-ne.com",
"from-nh.com",
"from-nj.com",
"from-nm.com",
"from-nv.com",
"from-ny.net",
"from-oh.com",
"from-ok.com",
"from-or.com",
"from-pa.com",
"from-pr.com",
"from-ri.com",
"from-sc.com",
"from-sd.com",
"from-tn.com",
"from-tx.com",
"from-ut.com",
"from-va.com",
"from-vt.com",
"from-wa.com",
"from-wi.com",
"from-wv.com",
"from-wy.com",
"ftpaccess.cc",
"fuettertdasnetz.de",
"game-host.org",
"game-server.cc",
"getmyip.com",
"gets-it.net",
"go.dyndns.org",
"gotdns.com",
"gotdns.org",
"groks-the.info",
"groks-this.info",
"ham-radio-op.net",
"here-for-more.info",
"hobby-site.com",
"hobby-site.org",
"home.dyndns.org",
"homedns.org",
"homeftp.net",
"homeftp.org",
"homeip.net",
"homelinux.com",
"homelinux.net",
"homelinux.org",
"homeunix.com",
"homeunix.net",
"homeunix.org",
"iamallama.com",
"in-the-band.net",
"is-a-anarchist.com",
"is-a-blogger.com",
"is-a-bookkeeper.com",
"is-a-bruinsfan.org",
"is-a-bulls-fan.com",
"is-a-candidate.org",
"is-a-caterer.com",
"is-a-celticsfan.org",
"is-a-chef.com",
"is-a-chef.net",
"is-a-chef.org",
"is-a-conservative.com",
"is-a-cpa.com",
"is-a-cubicle-slave.com",
"is-a-democrat.com",
"is-a-designer.com",
"is-a-doctor.com",
"is-a-financialadvisor.com",
"is-a-geek.com",
"is-a-geek.net",
"is-a-geek.org",
"is-a-green.com",
"is-a-guru.com",
"is-a-hard-worker.com",
"is-a-hunter.com",
"is-a-knight.org",
"is-a-landscaper.com",
"is-a-lawyer.com",
"is-a-liberal.com",
"is-a-libertarian.com",
"is-a-linux-user.org",
"is-a-llama.com",
"is-a-musician.com",
"is-a-nascarfan.com",
"is-a-nurse.com",
"is-a-painter.com",
"is-a-patsfan.org",
"is-a-personaltrainer.com",
"is-a-photographer.com",
"is-a-player.com",
"is-a-republican.com",
"is-a-rockstar.com",
"is-a-socialist.com",
"is-a-soxfan.org",
"is-a-student.com",
"is-a-teacher.com",
"is-a-techie.com",
"is-a-therapist.com",
"is-an-accountant.com",
"is-an-actor.com",
"is-an-actress.com",
"is-an-anarchist.com",
"is-an-artist.com",
"is-an-engineer.com",
"is-an-entertainer.com",
"is-by.us",
"is-certified.com",
"is-found.org",
"is-gone.com",
"is-into-anime.com",
"is-into-cars.com",
"is-into-cartoons.com",
"is-into-games.com",
"is-leet.com",
"is-lost.org",
"is-not-certified.com",
"is-saved.org",
"is-slick.com",
"is-uberleet.com",
"is-very-bad.org",
"is-very-evil.org",
"is-very-good.org",
"is-very-nice.org",
"is-very-sweet.org",
"is-with-theband.com",
"isa-geek.com",
"isa-geek.net",
"isa-geek.org",
"isa-hockeynut.com",
"issmarterthanyou.com",
"isteingeek.de",
"istmein.de",
"kicks-ass.net",
"kicks-ass.org",
"knowsitall.info",
"land-4-sale.us",
"lebtimnetz.de",
"leitungsen.de",
"likes-pie.com",
"likescandy.com",
"merseine.nu",
"mine.nu",
"misconfused.org",
"mypets.ws",
"myphotos.cc",
"neat-url.com",
"office-on-the.net",
"on-the-web.tv",
"podzone.net",
"podzone.org",
"readmyblog.org",
"saves-the-whales.com",
"scrapper-site.net",
"scrapping.cc",
"selfip.biz",
"selfip.com",
"selfip.info",
"selfip.net",
"selfip.org",
"sells-for-less.com",
"sells-for-u.com",
"sells-it.net",
"sellsyourhome.org",
"servebbs.com",
"servebbs.net",
"servebbs.org",
"serveftp.net",
"serveftp.org",
"servegame.org",
"shacknet.nu",
"simple-url.com",
"space-to-rent.com",
"stuff-4-sale.org",
"stuff-4-sale.us",
"teaches-yoga.com",
"thruhere.net",
"traeumtgerade.de",
"webhop.biz",
"webhop.info",
"webhop.net",
"webhop.org",
"worse-than.tv",
"writesthisblog.com",
"ddnss.de",
"dyn.ddnss.de",
"dyndns.ddnss.de",
"dyndns1.de",
"dyn-ip24.de",
"home-webserver.de",
"dyn.home-webserver.de",
"myhome-server.de",
"ddnss.org",
"definima.net",
"definima.io",
"ondigitalocean.app",
"*.digitaloceanspaces.com",
"bci.dnstrace.pro",
"ddnsfree.com",
"ddnsgeek.com",
"giize.com",
"gleeze.com",
"kozow.com",
"loseyourip.com",
"ooguy.com",
"theworkpc.com",
"casacam.net",
"dynu.net",
"accesscam.org",
"camdvr.org",
"freeddns.org",
"mywire.org",
"webredirect.org",
"myddns.rocks",
"blogsite.xyz",
"dynv6.net",
"e4.cz",
"eero.online",
"eero-stage.online",
"elementor.cloud",
"elementor.cool",
"en-root.fr",
"mytuleap.com",
"tuleap-partners.com",
"encr.app",
"encoreapi.com",
"onred.one",
"staging.onred.one",
"eu.encoway.cloud",
"eu.org",
"al.eu.org",
"asso.eu.org",
"at.eu.org",
"au.eu.org",
"be.eu.org",
"bg.eu.org",
"ca.eu.org",
"cd.eu.org",
"ch.eu.org",
"cn.eu.org",
"cy.eu.org",
"cz.eu.org",
"de.eu.org",
"dk.eu.org",
"edu.eu.org",
"ee.eu.org",
"es.eu.org",
"fi.eu.org",
"fr.eu.org",
"gr.eu.org",
"hr.eu.org",
"hu.eu.org",
"ie.eu.org",
"il.eu.org",
"in.eu.org",
"int.eu.org",
"is.eu.org",
"it.eu.org",
"jp.eu.org",
"kr.eu.org",
"lt.eu.org",
"lu.eu.org",
"lv.eu.org",
"mc.eu.org",
"me.eu.org",
"mk.eu.org",
"mt.eu.org",
"my.eu.org",
"net.eu.org",
"ng.eu.org",
"nl.eu.org",
"no.eu.org",
"nz.eu.org",
"paris.eu.org",
"pl.eu.org",
"pt.eu.org",
"q-a.eu.org",
"ro.eu.org",
"ru.eu.org",
"se.eu.org",
"si.eu.org",
"sk.eu.org",
"tr.eu.org",
"uk.eu.org",
"us.eu.org",
"eurodir.ru",
"eu-1.evennode.com",
"eu-2.evennode.com",
"eu-3.evennode.com",
"eu-4.evennode.com",
"us-1.evennode.com",
"us-2.evennode.com",
"us-3.evennode.com",
"us-4.evennode.com",
"twmail.cc",
"twmail.net",
"twmail.org",
"mymailer.com.tw",
"url.tw",
"onfabrica.com",
"apps.fbsbx.com",
"ru.net",
"adygeya.ru",
"bashkiria.ru",
"bir.ru",
"cbg.ru",
"com.ru",
"dagestan.ru",
"grozny.ru",
"kalmykia.ru",
"kustanai.ru",
"marine.ru",
"mordovia.ru",
"msk.ru",
"mytis.ru",
"nalchik.ru",
"nov.ru",
"pyatigorsk.ru",
"spb.ru",
"vladikavkaz.ru",
"vladimir.ru",
"abkhazia.su",
"adygeya.su",
"aktyubinsk.su",
"arkhangelsk.su",
"armenia.su",
"ashgabad.su",
"azerbaijan.su",
"balashov.su",
"bashkiria.su",
"bryansk.su",
"bukhara.su",
"chimkent.su",
"dagestan.su",
"east-kazakhstan.su",
"exnet.su",
"georgia.su",
"grozny.su",
"ivanovo.su",
"jambyl.su",
"kalmykia.su",
"kaluga.su",
"karacol.su",
"karaganda.su",
"karelia.su",
"khakassia.su",
"krasnodar.su",
"kurgan.su",
"kustanai.su",
"lenug.su",
"mangyshlak.su",
"mordovia.su",
"msk.su",
"murmansk.su",
"nalchik.su",
"navoi.su",
"north-kazakhstan.su",
"nov.su",
"obninsk.su",
"penza.su",
"pokrovsk.su",
"sochi.su",
"spb.su",
"tashkent.su",
"termez.su",
"togliatti.su",
"troitsk.su",
"tselinograd.su",
"tula.su",
"tuva.su",
"vladikavkaz.su",
"vladimir.su",
"vologda.su",
"channelsdvr.net",
"u.channelsdvr.net",
"edgecompute.app",
"fastly-terrarium.com",
"fastlylb.net",
"map.fastlylb.net",
"freetls.fastly.net",
"map.fastly.net",
"a.prod.fastly.net",
"global.prod.fastly.net",
"a.ssl.fastly.net",
"b.ssl.fastly.net",
"global.ssl.fastly.net",
"fastvps-server.com",
"fastvps.host",
"myfast.host",
"fastvps.site",
"myfast.space",
"fedorainfracloud.org",
"fedorapeople.org",
"cloud.fedoraproject.org",
"app.os.fedoraproject.org",
"app.os.stg.fedoraproject.org",
"conn.uk",
"copro.uk",
"hosp.uk",
"mydobiss.com",
"fh-muenster.io",
"filegear.me",
"filegear-au.me",
"filegear-de.me",
"filegear-gb.me",
"filegear-ie.me",
"filegear-jp.me",
"filegear-sg.me",
"firebaseapp.com",
"fireweb.app",
"flap.id",
"onflashdrive.app",
"fldrv.com",
"fly.dev",
"edgeapp.net",
"shw.io",
"flynnhosting.net",
"forgeblocks.com",
"id.forgerock.io",
"framer.app",
"framercanvas.com",
"*.frusky.de",
"ravpage.co.il",
"0e.vc",
"freebox-os.com",
"freeboxos.com",
"fbx-os.fr",
"fbxos.fr",
"freebox-os.fr",
"freeboxos.fr",
"freedesktop.org",
"freemyip.com",
"wien.funkfeuer.at",
"*.futurecms.at",
"*.ex.futurecms.at",
"*.in.futurecms.at",
"futurehosting.at",
"futuremailing.at",
"*.ex.ortsinfo.at",
"*.kunden.ortsinfo.at",
"*.statics.cloud",
"independent-commission.uk",
"independent-inquest.uk",
"independent-inquiry.uk",
"independent-panel.uk",
"independent-review.uk",
"public-inquiry.uk",
"royal-commission.uk",
"campaign.gov.uk",
"service.gov.uk",
"api.gov.uk",
"gehirn.ne.jp",
"usercontent.jp",
"gentapps.com",
"gentlentapis.com",
"lab.ms",
"cdn-edges.net",
"ghost.io",
"gsj.bz",
"githubusercontent.com",
"githubpreview.dev",
"github.io",
"gitlab.io",
"gitapp.si",
"gitpage.si",
"glitch.me",
"nog.community",
"co.ro",
"shop.ro",
"lolipop.io",
"angry.jp",
"babyblue.jp",
"babymilk.jp",
"backdrop.jp",
"bambina.jp",
"bitter.jp",
"blush.jp",
"boo.jp",
"boy.jp",
"boyfriend.jp",
"but.jp",
"candypop.jp",
"capoo.jp",
"catfood.jp",
"cheap.jp",
"chicappa.jp",
"chillout.jp",
"chips.jp",
"chowder.jp",
"chu.jp",
"ciao.jp",
"cocotte.jp",
"coolblog.jp",
"cranky.jp",
"cutegirl.jp",
"daa.jp",
"deca.jp",
"deci.jp",
"digick.jp",
"egoism.jp",
"fakefur.jp",
"fem.jp",
"flier.jp",
"floppy.jp",
"fool.jp",
"frenchkiss.jp",
"girlfriend.jp",
"girly.jp",
"gloomy.jp",
"gonna.jp",
"greater.jp",
"hacca.jp",
"heavy.jp",
"her.jp",
"hiho.jp",
"hippy.jp",
"holy.jp",
"hungry.jp",
"icurus.jp",
"itigo.jp",
"jellybean.jp",
"kikirara.jp",
"kill.jp",
"kilo.jp",
"kuron.jp",
"littlestar.jp",
"lolipopmc.jp",
"lolitapunk.jp",
"lomo.jp",
"lovepop.jp",
"lovesick.jp",
"main.jp",
"mods.jp",
"mond.jp",
"mongolian.jp",
"moo.jp",
"namaste.jp",
"nikita.jp",
"nobushi.jp",
"noor.jp",
"oops.jp",
"parallel.jp",
"parasite.jp",
"pecori.jp",
"peewee.jp",
"penne.jp",
"pepper.jp",
"perma.jp",
"pigboat.jp",
"pinoko.jp",
"punyu.jp",
"pupu.jp",
"pussycat.jp",
"pya.jp",
"raindrop.jp",
"readymade.jp",
"sadist.jp",
"schoolbus.jp",
"secret.jp",
"staba.jp",
"stripper.jp",
"sub.jp",
"sunnyday.jp",
"thick.jp",
"tonkotsu.jp",
"under.jp",
"upper.jp",
"velvet.jp",
"verse.jp",
"versus.jp",
"vivian.jp",
"watson.jp",
"weblike.jp",
"whitesnow.jp",
"zombie.jp",
"heteml.net",
"cloudapps.digital",
"london.cloudapps.digital",
"pymnt.uk",
"homeoffice.gov.uk",
"ro.im",
"goip.de",
"run.app",
"a.run.app",
"web.app",
"*.0emm.com",
"appspot.com",
"*.r.appspot.com",
"codespot.com",
"googleapis.com",
"googlecode.com",
"pagespeedmobilizer.com",
"publishproxy.com",
"withgoogle.com",
"withyoutube.com",
"*.gateway.dev",
"cloud.goog",
"translate.goog",
"*.usercontent.goog",
"cloudfunctions.net",
"blogspot.ae",
"blogspot.al",
"blogspot.am",
"blogspot.ba",
"blogspot.be",
"blogspot.bg",
"blogspot.bj",
"blogspot.ca",
"blogspot.cf",
"blogspot.ch",
"blogspot.cl",
"blogspot.co.at",
"blogspot.co.id",
"blogspot.co.il",
"blogspot.co.ke",
"blogspot.co.nz",
"blogspot.co.uk",
"blogspot.co.za",
"blogspot.com",
"blogspot.com.ar",
"blogspot.com.au",
"blogspot.com.br",
"blogspot.com.by",
"blogspot.com.co",
"blogspot.com.cy",
"blogspot.com.ee",
"blogspot.com.eg",
"blogspot.com.es",
"blogspot.com.mt",
"blogspot.com.ng",
"blogspot.com.tr",
"blogspot.com.uy",
"blogspot.cv",
"blogspot.cz",
"blogspot.de",
"blogspot.dk",
"blogspot.fi",
"blogspot.fr",
"blogspot.gr",
"blogspot.hk",
"blogspot.hr",
"blogspot.hu",
"blogspot.ie",
"blogspot.in",
"blogspot.is",
"blogspot.it",
"blogspot.jp",
"blogspot.kr",
"blogspot.li",
"blogspot.lt",
"blogspot.lu",
"blogspot.md",
"blogspot.mk",
"blogspot.mr",
"blogspot.mx",
"blogspot.my",
"blogspot.nl",
"blogspot.no",
"blogspot.pe",
"blogspot.pt",
"blogspot.qa",
"blogspot.re",
"blogspot.ro",
"blogspot.rs",
"blogspot.ru",
"blogspot.se",
"blogspot.sg",
"blogspot.si",
"blogspot.sk",
"blogspot.sn",
"blogspot.td",
"blogspot.tw",
"blogspot.ug",
"blogspot.vn",
"goupile.fr",
"gov.nl",
"awsmppl.com",
"g\xFCnstigbestellen.de",
"g\xFCnstigliefern.de",
"fin.ci",
"free.hr",
"caa.li",
"ua.rs",
"conf.se",
"hs.zone",
"hs.run",
"hashbang.sh",
"hasura.app",
"hasura-app.io",
"pages.it.hs-heilbronn.de",
"hepforge.org",
"herokuapp.com",
"herokussl.com",
"ravendb.cloud",
"myravendb.com",
"ravendb.community",
"ravendb.me",
"development.run",
"ravendb.run",
"homesklep.pl",
"secaas.hk",
"hoplix.shop",
"orx.biz",
"biz.gl",
"col.ng",
"firm.ng",
"gen.ng",
"ltd.ng",
"ngo.ng",
"edu.scot",
"sch.so",
"hostyhosting.io",
"h\xE4kkinen.fi",
"*.moonscale.io",
"moonscale.net",
"iki.fi",
"ibxos.it",
"iliadboxos.it",
"impertrixcdn.com",
"impertrix.com",
"smushcdn.com",
"wphostedmail.com",
"wpmucdn.com",
"tempurl.host",
"wpmudev.host",
"dyn-berlin.de",
"in-berlin.de",
"in-brb.de",
"in-butter.de",
"in-dsl.de",
"in-dsl.net",
"in-dsl.org",
"in-vpn.de",
"in-vpn.net",
"in-vpn.org",
"biz.at",
"info.at",
"info.cx",
"ac.leg.br",
"al.leg.br",
"am.leg.br",
"ap.leg.br",
"ba.leg.br",
"ce.leg.br",
"df.leg.br",
"es.leg.br",
"go.leg.br",
"ma.leg.br",
"mg.leg.br",
"ms.leg.br",
"mt.leg.br",
"pa.leg.br",
"pb.leg.br",
"pe.leg.br",
"pi.leg.br",
"pr.leg.br",
"rj.leg.br",
"rn.leg.br",
"ro.leg.br",
"rr.leg.br",
"rs.leg.br",
"sc.leg.br",
"se.leg.br",
"sp.leg.br",
"to.leg.br",
"pixolino.com",
"na4u.ru",
"iopsys.se",
"ipifony.net",
"iservschule.de",
"mein-iserv.de",
"schulplattform.de",
"schulserver.de",
"test-iserv.de",
"iserv.dev",
"iobb.net",
"mel.cloudlets.com.au",
"cloud.interhostsolutions.be",
"users.scale.virtualcloud.com.br",
"mycloud.by",
"alp1.ae.flow.ch",
"appengine.flow.ch",
"es-1.axarnet.cloud",
"diadem.cloud",
"vip.jelastic.cloud",
"jele.cloud",
"it1.eur.aruba.jenv-aruba.cloud",
"it1.jenv-aruba.cloud",
"keliweb.cloud",
"cs.keliweb.cloud",
"oxa.cloud",
"tn.oxa.cloud",
"uk.oxa.cloud",
"primetel.cloud",
"uk.primetel.cloud",
"ca.reclaim.cloud",
"uk.reclaim.cloud",
"us.reclaim.cloud",
"ch.trendhosting.cloud",
"de.trendhosting.cloud",
"jele.club",
"amscompute.com",
"clicketcloud.com",
"dopaas.com",
"hidora.com",
"paas.hosted-by-previder.com",
"rag-cloud.hosteur.com",
"rag-cloud-ch.hosteur.com",
"jcloud.ik-server.com",
"jcloud-ver-jpc.ik-server.com",
"demo.jelastic.com",
"kilatiron.com",
"paas.massivegrid.com",
"jed.wafaicloud.com",
"lon.wafaicloud.com",
"ryd.wafaicloud.com",
"j.scaleforce.com.cy",
"jelastic.dogado.eu",
"fi.cloudplatform.fi",
"demo.datacenter.fi",
"paas.datacenter.fi",
"jele.host",
"mircloud.host",
"paas.beebyte.io",
"sekd1.beebyteapp.io",
"jele.io",
"cloud-fr1.unispace.io",
"jc.neen.it",
"cloud.jelastic.open.tim.it",
"jcloud.kz",
"upaas.kazteleport.kz",
"cloudjiffy.net",
"fra1-de.cloudjiffy.net",
"west1-us.cloudjiffy.net",
"jls-sto1.elastx.net",
"jls-sto2.elastx.net",
"jls-sto3.elastx.net",
"faststacks.net",
"fr-1.paas.massivegrid.net",
"lon-1.paas.massivegrid.net",
"lon-2.paas.massivegrid.net",
"ny-1.paas.massivegrid.net",
"ny-2.paas.massivegrid.net",
"sg-1.paas.massivegrid.net",
"jelastic.saveincloud.net",
"nordeste-idc.saveincloud.net",
"j.scaleforce.net",
"jelastic.tsukaeru.net",
"sdscloud.pl",
"unicloud.pl",
"mircloud.ru",
"jelastic.regruhosting.ru",
"enscaled.sg",
"jele.site",
"jelastic.team",
"orangecloud.tn",
"j.layershift.co.uk",
"phx.enscaled.us",
"mircloud.us",
"myjino.ru",
"*.hosting.myjino.ru",
"*.landing.myjino.ru",
"*.spectrum.myjino.ru",
"*.vps.myjino.ru",
"jotelulu.cloud",
"*.triton.zone",
"*.cns.joyent.com",
"js.org",
"kaas.gg",
"khplay.nl",
"ktistory.com",
"kapsi.fi",
"keymachine.de",
"kinghost.net",
"uni5.net",
"knightpoint.systems",
"koobin.events",
"oya.to",
"kuleuven.cloud",
"ezproxy.kuleuven.be",
"co.krd",
"edu.krd",
"krellian.net",
"webthings.io",
"git-repos.de",
"lcube-server.de",
"svn-repos.de",
"leadpages.co",
"lpages.co",
"lpusercontent.com",
"lelux.site",
"co.business",
"co.education",
"co.events",
"co.financial",
"co.network",
"co.place",
"co.technology",
"app.lmpm.com",
"linkyard.cloud",
"linkyard-cloud.ch",
"members.linode.com",
"*.nodebalancer.linode.com",
"*.linodeobjects.com",
"ip.linodeusercontent.com",
"we.bs",
"*.user.localcert.dev",
"localzone.xyz",
"loginline.app",
"loginline.dev",
"loginline.io",
"loginline.services",
"loginline.site",
"servers.run",
"lohmus.me",
"krasnik.pl",
"leczna.pl",
"lubartow.pl",
"lublin.pl",
"poniatowa.pl",
"swidnik.pl",
"glug.org.uk",
"lug.org.uk",
"lugs.org.uk",
"barsy.bg",
"barsy.co.uk",
"barsyonline.co.uk",
"barsycenter.com",
"barsyonline.com",
"barsy.club",
"barsy.de",
"barsy.eu",
"barsy.in",
"barsy.info",
"barsy.io",
"barsy.me",
"barsy.menu",
"barsy.mobi",
"barsy.net",
"barsy.online",
"barsy.org",
"barsy.pro",
"barsy.pub",
"barsy.ro",
"barsy.shop",
"barsy.site",
"barsy.support",
"barsy.uk",
"*.magentosite.cloud",
"mayfirst.info",
"mayfirst.org",
"hb.cldmail.ru",
"cn.vu",
"mazeplay.com",
"mcpe.me",
"mcdir.me",
"mcdir.ru",
"mcpre.ru",
"vps.mcdir.ru",
"mediatech.by",
"mediatech.dev",
"hra.health",
"miniserver.com",
"memset.net",
"messerli.app",
"*.cloud.metacentrum.cz",
"custom.metacentrum.cz",
"flt.cloud.muni.cz",
"usr.cloud.muni.cz",
"meteorapp.com",
"eu.meteorapp.com",
"co.pl",
"*.azurecontainer.io",
"azurewebsites.net",
"azure-mobile.net",
"cloudapp.net",
"azurestaticapps.net",
"1.azurestaticapps.net",
"centralus.azurestaticapps.net",
"eastasia.azurestaticapps.net",
"eastus2.azurestaticapps.net",
"westeurope.azurestaticapps.net",
"westus2.azurestaticapps.net",
"csx.cc",
"mintere.site",
"forte.id",
"mozilla-iot.org",
"bmoattachments.org",
"net.ru",
"org.ru",
"pp.ru",
"hostedpi.com",
"customer.mythic-beasts.com",
"caracal.mythic-beasts.com",
"fentiger.mythic-beasts.com",
"lynx.mythic-beasts.com",
"ocelot.mythic-beasts.com",
"oncilla.mythic-beasts.com",
"onza.mythic-beasts.com",
"sphinx.mythic-beasts.com",
"vs.mythic-beasts.com",
"x.mythic-beasts.com",
"yali.mythic-beasts.com",
"cust.retrosnub.co.uk",
"ui.nabu.casa",
"pony.club",
"of.fashion",
"in.london",
"of.london",
"from.marketing",
"with.marketing",
"for.men",
"repair.men",
"and.mom",
"for.mom",
"for.one",
"under.one",
"for.sale",
"that.win",
"from.work",
"to.work",
"cloud.nospamproxy.com",
"netlify.app",
"4u.com",
"ngrok.io",
"nh-serv.co.uk",
"nfshost.com",
"*.developer.app",
"noop.app",
"*.northflank.app",
"*.build.run",
"*.code.run",
"*.database.run",
"*.migration.run",
"noticeable.news",
"dnsking.ch",
"mypi.co",
"n4t.co",
"001www.com",
"ddnslive.com",
"myiphost.com",
"forumz.info",
"16-b.it",
"32-b.it",
"64-b.it",
"soundcast.me",
"tcp4.me",
"dnsup.net",
"hicam.net",
"now-dns.net",
"ownip.net",
"vpndns.net",
"dynserv.org",
"now-dns.org",
"x443.pw",
"now-dns.top",
"ntdll.top",
"freeddns.us",
"crafting.xyz",
"zapto.xyz",
"nsupdate.info",
"nerdpol.ovh",
"blogsyte.com",
"brasilia.me",
"cable-modem.org",
"ciscofreak.com",
"collegefan.org",
"couchpotatofries.org",
"damnserver.com",
"ddns.me",
"ditchyourip.com",
"dnsfor.me",
"dnsiskinky.com",
"dvrcam.info",
"dynns.com",
"eating-organic.net",
"fantasyleague.cc",
"geekgalaxy.com",
"golffan.us",
"health-carereform.com",
"homesecuritymac.com",
"homesecuritypc.com",
"hopto.me",
"ilovecollege.info",
"loginto.me",
"mlbfan.org",
"mmafan.biz",
"myactivedirectory.com",
"mydissent.net",
"myeffect.net",
"mymediapc.net",
"mypsx.net",
"mysecuritycamera.com",
"mysecuritycamera.net",
"mysecuritycamera.org",
"net-freaks.com",
"nflfan.org",
"nhlfan.net",
"no-ip.ca",
"no-ip.co.uk",
"no-ip.net",
"noip.us",
"onthewifi.com",
"pgafan.net",
"point2this.com",
"pointto.us",
"privatizehealthinsurance.net",
"quicksytes.com",
"read-books.org",
"securitytactics.com",
"serveexchange.com",
"servehumour.com",
"servep2p.com",
"servesarcasm.com",
"stufftoread.com",
"ufcfan.org",
"unusualperson.com",
"workisboring.com",
"3utilities.com",
"bounceme.net",
"ddns.net",
"ddnsking.com",
"gotdns.ch",
"hopto.org",
"myftp.biz",
"myftp.org",
"myvnc.com",
"no-ip.biz",
"no-ip.info",
"no-ip.org",
"noip.me",
"redirectme.net",
"servebeer.com",
"serveblog.net",
"servecounterstrike.com",
"serveftp.com",
"servegame.com",
"servehalflife.com",
"servehttp.com",
"serveirc.com",
"serveminecraft.net",
"servemp3.com",
"servepics.com",
"servequake.com",
"sytes.net",
"webhop.me",
"zapto.org",
"stage.nodeart.io",
"pcloud.host",
"nyc.mn",
"static.observableusercontent.com",
"cya.gg",
"omg.lol",
"cloudycluster.net",
"omniwe.site",
"service.one",
"nid.io",
"opensocial.site",
"opencraft.hosting",
"orsites.com",
"operaunite.com",
"tech.orange",
"authgear-staging.com",
"authgearapps.com",
"skygearapp.com",
"outsystemscloud.com",
"*.webpaas.ovh.net",
"*.hosting.ovh.net",
"ownprovider.com",
"own.pm",
"*.owo.codes",
"ox.rs",
"oy.lc",
"pgfog.com",
"pagefrontapp.com",
"pagexl.com",
"*.paywhirl.com",
"bar0.net",
"bar1.net",
"bar2.net",
"rdv.to",
"art.pl",
"gliwice.pl",
"krakow.pl",
"poznan.pl",
"wroc.pl",
"zakopane.pl",
"pantheonsite.io",
"gotpantheon.com",
"mypep.link",
"perspecta.cloud",
"lk3.ru",
"on-web.fr",
"bc.platform.sh",
"ent.platform.sh",
"eu.platform.sh",
"us.platform.sh",
"*.platformsh.site",
"*.tst.site",
"platter-app.com",
"platter-app.dev",
"platterp.us",
"pdns.page",
"plesk.page",
"pleskns.com",
"dyn53.io",
"onporter.run",
"co.bn",
"postman-echo.com",
"pstmn.io",
"mock.pstmn.io",
"httpbin.org",
"prequalifyme.today",
"xen.prgmr.com",
"priv.at",
"prvcy.page",
"*.dweb.link",
"protonet.io",
"chirurgiens-dentistes-en-france.fr",
"byen.site",
"pubtls.org",
"pythonanywhere.com",
"eu.pythonanywhere.com",
"qoto.io",
"qualifioapp.com",
"qbuser.com",
"cloudsite.builders",
"instances.spawn.cc",
"instantcloud.cn",
"ras.ru",
"qa2.com",
"qcx.io",
"*.sys.qcx.io",
"dev-myqnapcloud.com",
"alpha-myqnapcloud.com",
"myqnapcloud.com",
"*.quipelements.com",
"vapor.cloud",
"vaporcloud.io",
"rackmaze.com",
"rackmaze.net",
"g.vbrplsbx.io",
"*.on-k3s.io",
"*.on-rancher.cloud",
"*.on-rio.io",
"readthedocs.io",
"rhcloud.com",
"app.render.com",
"onrender.com",
"repl.co",
"id.repl.co",
"repl.run",
"resindevice.io",
"devices.resinstaging.io",
"hzc.io",
"wellbeingzone.eu",
"wellbeingzone.co.uk",
"adimo.co.uk",
"itcouldbewor.se",
"git-pages.rit.edu",
"rocky.page",
"\u0431\u0438\u0437.\u0440\u0443\u0441",
"\u043A\u043E\u043C.\u0440\u0443\u0441",
"\u043A\u0440\u044B\u043C.\u0440\u0443\u0441",
"\u043C\u0438\u0440.\u0440\u0443\u0441",
"\u043C\u0441\u043A.\u0440\u0443\u0441",
"\u043E\u0440\u0433.\u0440\u0443\u0441",
"\u0441\u0430\u043C\u0430\u0440\u0430.\u0440\u0443\u0441",
"\u0441\u043E\u0447\u0438.\u0440\u0443\u0441",
"\u0441\u043F\u0431.\u0440\u0443\u0441",
"\u044F.\u0440\u0443\u0441",
"*.builder.code.com",
"*.dev-builder.code.com",
"*.stg-builder.code.com",
"sandcats.io",
"logoip.de",
"logoip.com",
"fr-par-1.baremetal.scw.cloud",
"fr-par-2.baremetal.scw.cloud",
"nl-ams-1.baremetal.scw.cloud",
"fnc.fr-par.scw.cloud",
"functions.fnc.fr-par.scw.cloud",
"k8s.fr-par.scw.cloud",
"nodes.k8s.fr-par.scw.cloud",
"s3.fr-par.scw.cloud",
"s3-website.fr-par.scw.cloud",
"whm.fr-par.scw.cloud",
"priv.instances.scw.cloud",
"pub.instances.scw.cloud",
"k8s.scw.cloud",
"k8s.nl-ams.scw.cloud",
"nodes.k8s.nl-ams.scw.cloud",
"s3.nl-ams.scw.cloud",
"s3-website.nl-ams.scw.cloud",
"whm.nl-ams.scw.cloud",
"k8s.pl-waw.scw.cloud",
"nodes.k8s.pl-waw.scw.cloud",
"s3.pl-waw.scw.cloud",
"s3-website.pl-waw.scw.cloud",
"scalebook.scw.cloud",
"smartlabeling.scw.cloud",
"dedibox.fr",
"schokokeks.net",
"gov.scot",
"service.gov.scot",
"scrysec.com",
"firewall-gateway.com",
"firewall-gateway.de",
"my-gateway.de",
"my-router.de",
"spdns.de",
"spdns.eu",
"firewall-gateway.net",
"my-firewall.org",
"myfirewall.org",
"spdns.org",
"seidat.net",
"sellfy.store",
"senseering.net",
"minisite.ms",
"magnet.page",
"biz.ua",
"co.ua",
"pp.ua",
"shiftcrypto.dev",
"shiftcrypto.io",
"shiftedit.io",
"myshopblocks.com",
"myshopify.com",
"shopitsite.com",
"shopware.store",
"mo-siemens.io",
"1kapp.com",
"appchizi.com",
"applinzi.com",
"sinaapp.com",
"vipsinaapp.com",
"siteleaf.net",
"bounty-full.com",
"alpha.bounty-full.com",
"beta.bounty-full.com",
"small-web.org",
"vp4.me",
"try-snowplow.com",
"srht.site",
"stackhero-network.com",
"musician.io",
"novecore.site",
"static.land",
"dev.static.land",
"sites.static.land",
"storebase.store",
"vps-host.net",
"atl.jelastic.vps-host.net",
"njs.jelastic.vps-host.net",
"ric.jelastic.vps-host.net",
"playstation-cloud.com",
"apps.lair.io",
"*.stolos.io",
"spacekit.io",
"customer.speedpartner.de",
"myspreadshop.at",
"myspreadshop.com.au",
"myspreadshop.be",
"myspreadshop.ca",
"myspreadshop.ch",
"myspreadshop.com",
"myspreadshop.de",
"myspreadshop.dk",
"myspreadshop.es",
"myspreadshop.fi",
"myspreadshop.fr",
"myspreadshop.ie",
"myspreadshop.it",
"myspreadshop.net",
"myspreadshop.nl",
"myspreadshop.no",
"myspreadshop.pl",
"myspreadshop.se",
"myspreadshop.co.uk",
"api.stdlib.com",
"storj.farm",
"utwente.io",
"soc.srcf.net",
"user.srcf.net",
"temp-dns.com",
"supabase.co",
"supabase.in",
"supabase.net",
"su.paba.se",
"*.s5y.io",
"*.sensiosite.cloud",
"syncloud.it",
"dscloud.biz",
"direct.quickconnect.cn",
"dsmynas.com",
"familyds.com",
"diskstation.me",
"dscloud.me",
"i234.me",
"myds.me",
"synology.me",
"dscloud.mobi",
"dsmynas.net",
"familyds.net",
"dsmynas.org",
"familyds.org",
"vpnplus.to",
"direct.quickconnect.to",
"tabitorder.co.il",
"taifun-dns.de",
"beta.tailscale.net",
"ts.net",
"gda.pl",
"gdansk.pl",
"gdynia.pl",
"med.pl",
"sopot.pl",
"site.tb-hosting.com",
"edugit.io",
"s3.teckids.org",
"telebit.app",
"telebit.io",
"*.telebit.xyz",
"gwiddle.co.uk",
"*.firenet.ch",
"*.svc.firenet.ch",
"reservd.com",
"thingdustdata.com",
"cust.dev.thingdust.io",
"cust.disrec.thingdust.io",
"cust.prod.thingdust.io",
"cust.testing.thingdust.io",
"reservd.dev.thingdust.io",
"reservd.disrec.thingdust.io",
"reservd.testing.thingdust.io",
"tickets.io",
"arvo.network",
"azimuth.network",
"tlon.network",
"torproject.net",
"pages.torproject.net",
"bloxcms.com",
"townnews-staging.com",
"tbits.me",
"12hp.at",
"2ix.at",
"4lima.at",
"lima-city.at",
"12hp.ch",
"2ix.ch",
"4lima.ch",
"lima-city.ch",
"trafficplex.cloud",
"de.cool",
"12hp.de",
"2ix.de",
"4lima.de",
"lima-city.de",
"1337.pictures",
"clan.rip",
"lima-city.rocks",
"webspace.rocks",
"lima.zone",
"*.transurl.be",
"*.transurl.eu",
"*.transurl.nl",
"site.transip.me",
"tuxfamily.org",
"dd-dns.de",
"diskstation.eu",
"diskstation.org",
"dray-dns.de",
"draydns.de",
"dyn-vpn.de",
"dynvpn.de",
"mein-vigor.de",
"my-vigor.de",
"my-wan.de",
"syno-ds.de",
"synology-diskstation.de",
"synology-ds.de",
"typedream.app",
"pro.typeform.com",
"uber.space",
"*.uberspace.de",
"hk.com",
"hk.org",
"ltd.hk",
"inc.hk",
"name.pm",
"sch.tf",
"biz.wf",
"sch.wf",
"org.yt",
"virtualuser.de",
"virtual-user.de",
"upli.io",
"urown.cloud",
"dnsupdate.info",
"lib.de.us",
"2038.io",
"vercel.app",
"vercel.dev",
"now.sh",
"router.management",
"v-info.info",
"voorloper.cloud",
"neko.am",
"nyaa.am",
"be.ax",
"cat.ax",
"es.ax",
"eu.ax",
"gg.ax",
"mc.ax",
"us.ax",
"xy.ax",
"nl.ci",
"xx.gl",
"app.gp",
"blog.gt",
"de.gt",
"to.gt",
"be.gy",
"cc.hn",
"blog.kg",
"io.kg",
"jp.kg",
"tv.kg",
"uk.kg",
"us.kg",
"de.ls",
"at.md",
"de.md",
"jp.md",
"to.md",
"indie.porn",
"vxl.sh",
"ch.tc",
"me.tc",
"we.tc",
"nyan.to",
"at.vg",
"blog.vu",
"dev.vu",
"me.vu",
"v.ua",
"*.vultrobjects.com",
"wafflecell.com",
"*.webhare.dev",
"reserve-online.net",
"reserve-online.com",
"bookonline.app",
"hotelwithflight.com",
"wedeploy.io",
"wedeploy.me",
"wedeploy.sh",
"remotewd.com",
"pages.wiardweb.com",
"wmflabs.org",
"toolforge.org",
"wmcloud.org",
"panel.gg",
"daemon.panel.gg",
"messwithdns.com",
"woltlab-demo.com",
"myforum.community",
"community-pro.de",
"diskussionsbereich.de",
"community-pro.net",
"meinforum.net",
"affinitylottery.org.uk",
"raffleentry.org.uk",
"weeklylottery.org.uk",
"wpenginepowered.com",
"js.wpenginepowered.com",
"wixsite.com",
"editorx.io",
"half.host",
"xnbay.com",
"u2.xnbay.com",
"u2-local.xnbay.com",
"cistron.nl",
"demon.nl",
"xs4all.space",
"yandexcloud.net",
"storage.yandexcloud.net",
"website.yandexcloud.net",
"official.academy",
"yolasite.com",
"ybo.faith",
"yombo.me",
"homelink.one",
"ybo.party",
"ybo.review",
"ybo.science",
"ybo.trade",
"ynh.fr",
"nohost.me",
"noho.st",
"za.net",
"za.org",
"bss.design",
"basicserver.io",
"virtualserver.io",
"enterprisecloud.nu"
];
}
});
// node_modules/psl/index.js
var require_psl = __commonJS({
"node_modules/psl/index.js"(exports) {
"use strict";
var Punycode = require("punycode");
var internals = {};
internals.rules = require_rules().map(function(rule) {
return {
rule,
suffix: rule.replace(/^(\*\.|\!)/, ""),
punySuffix: -1,
wildcard: rule.charAt(0) === "*",
exception: rule.charAt(0) === "!"
};
});
internals.endsWith = function(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
};
internals.findRule = function(domain) {
var punyDomain = Punycode.toASCII(domain);
return internals.rules.reduce(function(memo, rule) {
if (rule.punySuffix === -1) {
rule.punySuffix = Punycode.toASCII(rule.suffix);
}
if (!internals.endsWith(punyDomain, "." + rule.punySuffix) && punyDomain !== rule.punySuffix) {
return memo;
}
return rule;
}, null);
};
exports.errorCodes = {
DOMAIN_TOO_SHORT: "Domain name too short.",
DOMAIN_TOO_LONG: "Domain name too long. It should be no more than 255 chars.",
LABEL_STARTS_WITH_DASH: "Domain name label can not start with a dash.",
LABEL_ENDS_WITH_DASH: "Domain name label can not end with a dash.",
LABEL_TOO_LONG: "Domain name label should be at most 63 chars long.",
LABEL_TOO_SHORT: "Domain name label should be at least 1 character long.",
LABEL_INVALID_CHARS: "Domain name label can only contain alphanumeric characters or dashes."
};
internals.validate = function(input) {
var ascii = Punycode.toASCII(input);
if (ascii.length < 1) {
return "DOMAIN_TOO_SHORT";
}
if (ascii.length > 255) {
return "DOMAIN_TOO_LONG";
}
var labels = ascii.split(".");
var label;
for (var i = 0; i < labels.length; ++i) {
label = labels[i];
if (!label.length) {
return "LABEL_TOO_SHORT";
}
if (label.length > 63) {
return "LABEL_TOO_LONG";
}
if (label.charAt(0) === "-") {
return "LABEL_STARTS_WITH_DASH";
}
if (label.charAt(label.length - 1) === "-") {
return "LABEL_ENDS_WITH_DASH";
}
if (!/^[a-z0-9\-]+$/.test(label)) {
return "LABEL_INVALID_CHARS";
}
}
};
exports.parse = function(input) {
if (typeof input !== "string") {
throw new TypeError("Domain name must be a string.");
}
var domain = input.slice(0).toLowerCase();
if (domain.charAt(domain.length - 1) === ".") {
domain = domain.slice(0, domain.length - 1);
}
var error = internals.validate(domain);
if (error) {
return {
input,
error: {
message: exports.errorCodes[error],
code: error
}
};
}
var parsed = {
input,
tld: null,
sld: null,
domain: null,
subdomain: null,
listed: false
};
var domainParts = domain.split(".");
if (domainParts[domainParts.length - 1] === "local") {
return parsed;
}
var handlePunycode = function() {
if (!/xn--/.test(domain)) {
return parsed;
}
if (parsed.domain) {
parsed.domain = Punycode.toASCII(parsed.domain);
}
if (parsed.subdomain) {
parsed.subdomain = Punycode.toASCII(parsed.subdomain);
}
return parsed;
};
var rule = internals.findRule(domain);
if (!rule) {
if (domainParts.length < 2) {
return parsed;
}
parsed.tld = domainParts.pop();
parsed.sld = domainParts.pop();
parsed.domain = [parsed.sld, parsed.tld].join(".");
if (domainParts.length) {
parsed.subdomain = domainParts.pop();
}
return handlePunycode();
}
parsed.listed = true;
var tldParts = rule.suffix.split(".");
var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);
if (rule.exception) {
privateParts.push(tldParts.shift());
}
parsed.tld = tldParts.join(".");
if (!privateParts.length) {
return handlePunycode();
}
if (rule.wildcard) {
tldParts.unshift(privateParts.pop());
parsed.tld = tldParts.join(".");
}
if (!privateParts.length) {
return handlePunycode();
}
parsed.sld = privateParts.pop();
parsed.domain = [parsed.sld, parsed.tld].join(".");
if (privateParts.length) {
parsed.subdomain = privateParts.join(".");
}
return handlePunycode();
};
exports.get = function(domain) {
if (!domain) {
return null;
}
return exports.parse(domain).domain || null;
};
exports.isValid = function(domain) {
var parsed = exports.parse(domain);
return Boolean(parsed.domain && parsed.listed);
};
}
});
// node_modules/tough-cookie/lib/pubsuffix-psl.js
var require_pubsuffix_psl = __commonJS({
"node_modules/tough-cookie/lib/pubsuffix-psl.js"(exports) {
"use strict";
var psl = require_psl();
function getPublicSuffix(domain) {
return psl.get(domain);
}
exports.getPublicSuffix = getPublicSuffix;
}
});
// node_modules/tough-cookie/lib/store.js
var require_store = __commonJS({
"node_modules/tough-cookie/lib/store.js"(exports) {
"use strict";
function Store() {
}
exports.Store = Store;
Store.prototype.synchronous = false;
Store.prototype.findCookie = function(domain, path3, key, cb) {
throw new Error("findCookie is not implemented");
};
Store.prototype.findCookies = function(domain, path3, cb) {
throw new Error("findCookies is not implemented");
};
Store.prototype.putCookie = function(cookie, cb) {
throw new Error("putCookie is not implemented");
};
Store.prototype.updateCookie = function(oldCookie, newCookie, cb) {
throw new Error("updateCookie is not implemented");
};
Store.prototype.removeCookie = function(domain, path3, key, cb) {
throw new Error("removeCookie is not implemented");
};
Store.prototype.removeCookies = function(domain, path3, cb) {
throw new Error("removeCookies is not implemented");
};
Store.prototype.removeAllCookies = function(cb) {
throw new Error("removeAllCookies is not implemented");
};
Store.prototype.getAllCookies = function(cb) {
throw new Error("getAllCookies is not implemented (therefore jar cannot be serialized)");
};
}
});
// node_modules/tough-cookie/lib/permuteDomain.js
var require_permuteDomain = __commonJS({
"node_modules/tough-cookie/lib/permuteDomain.js"(exports) {
"use strict";
var pubsuffix = require_pubsuffix_psl();
function permuteDomain(domain) {
var pubSuf = pubsuffix.getPublicSuffix(domain);
if (!pubSuf) {
return null;
}
if (pubSuf == domain) {
return [domain];
}
var prefix = domain.slice(0, -(pubSuf.length + 1));
var parts = prefix.split(".").reverse();
var cur = pubSuf;
var permutations = [cur];
while (parts.length) {
cur = parts.shift() + "." + cur;
permutations.push(cur);
}
return permutations;
}
exports.permuteDomain = permuteDomain;
}
});
// node_modules/tough-cookie/lib/pathMatch.js
var require_pathMatch = __commonJS({
"node_modules/tough-cookie/lib/pathMatch.js"(exports) {
"use strict";
function pathMatch(reqPath, cookiePath) {
if (cookiePath === reqPath) {
return true;
}
var idx = reqPath.indexOf(cookiePath);
if (idx === 0) {
if (cookiePath.substr(-1) === "/") {
return true;
}
if (reqPath.substr(cookiePath.length, 1) === "/") {
return true;
}
}
return false;
}
exports.pathMatch = pathMatch;
}
});
// node_modules/tough-cookie/lib/memstore.js
var require_memstore = __commonJS({
"node_modules/tough-cookie/lib/memstore.js"(exports) {
"use strict";
var Store = require_store().Store;
var permuteDomain = require_permuteDomain().permuteDomain;
var pathMatch = require_pathMatch().pathMatch;
var util = require("util");
function MemoryCookieStore() {
Store.call(this);
this.idx = {};
}
util.inherits(MemoryCookieStore, Store);
exports.MemoryCookieStore = MemoryCookieStore;
MemoryCookieStore.prototype.idx = null;
MemoryCookieStore.prototype.synchronous = true;
MemoryCookieStore.prototype.inspect = function() {
return "{ idx: " + util.inspect(this.idx, false, 2) + " }";
};
if (util.inspect.custom) {
MemoryCookieStore.prototype[util.inspect.custom] = MemoryCookieStore.prototype.inspect;
}
MemoryCookieStore.prototype.findCookie = function(domain, path3, key, cb) {
if (!this.idx[domain]) {
return cb(null, void 0);
}
if (!this.idx[domain][path3]) {
return cb(null, void 0);
}
return cb(null, this.idx[domain][path3][key] || null);
};
MemoryCookieStore.prototype.findCookies = function(domain, path3, cb) {
var results = [];
if (!domain) {
return cb(null, []);
}
var pathMatcher;
if (!path3) {
pathMatcher = function matchAll(domainIndex) {
for (var curPath in domainIndex) {
var pathIndex = domainIndex[curPath];
for (var key in pathIndex) {
results.push(pathIndex[key]);
}
}
};
} else {
pathMatcher = function matchRFC(domainIndex) {
Object.keys(domainIndex).forEach(function(cookiePath) {
if (pathMatch(path3, cookiePath)) {
var pathIndex = domainIndex[cookiePath];
for (var key in pathIndex) {
results.push(pathIndex[key]);
}
}
});
};
}
var domains = permuteDomain(domain) || [domain];
var idx = this.idx;
domains.forEach(function(curDomain) {
var domainIndex = idx[curDomain];
if (!domainIndex) {
return;
}
pathMatcher(domainIndex);
});
cb(null, results);
};
MemoryCookieStore.prototype.putCookie = function(cookie, cb) {
if (!this.idx[cookie.domain]) {
this.idx[cookie.domain] = {};
}
if (!this.idx[cookie.domain][cookie.path]) {
this.idx[cookie.domain][cookie.path] = {};
}
this.idx[cookie.domain][cookie.path][cookie.key] = cookie;
cb(null);
};
MemoryCookieStore.prototype.updateCookie = function(oldCookie, newCookie, cb) {
this.putCookie(newCookie, cb);
};
MemoryCookieStore.prototype.removeCookie = function(domain, path3, key, cb) {
if (this.idx[domain] && this.idx[domain][path3] && this.idx[domain][path3][key]) {
delete this.idx[domain][path3][key];
}
cb(null);
};
MemoryCookieStore.prototype.removeCookies = function(domain, path3, cb) {
if (this.idx[domain]) {
if (path3) {
delete this.idx[domain][path3];
} else {
delete this.idx[domain];
}
}
return cb(null);
};
MemoryCookieStore.prototype.removeAllCookies = function(cb) {
this.idx = {};
return cb(null);
};
MemoryCookieStore.prototype.getAllCookies = function(cb) {
var cookies = [];
var idx = this.idx;
var domains = Object.keys(idx);
domains.forEach(function(domain) {
var paths = Object.keys(idx[domain]);
paths.forEach(function(path3) {
var keys = Object.keys(idx[domain][path3]);
keys.forEach(function(key) {
if (key !== null) {
cookies.push(idx[domain][path3][key]);
}
});
});
});
cookies.sort(function(a, b) {
return (a.creationIndex || 0) - (b.creationIndex || 0);
});
cb(null, cookies);
};
}
});
// node_modules/tough-cookie/lib/version.js
var require_version = __commonJS({
"node_modules/tough-cookie/lib/version.js"(exports, module2) {
module2.exports = "2.5.0";
}
});
// node_modules/tough-cookie/lib/cookie.js
var require_cookie = __commonJS({
"node_modules/tough-cookie/lib/cookie.js"(exports) {
"use strict";
var net = require("net");
var urlParse = require("url").parse;
var util = require("util");
var pubsuffix = require_pubsuffix_psl();
var Store = require_store().Store;
var MemoryCookieStore = require_memstore().MemoryCookieStore;
var pathMatch = require_pathMatch().pathMatch;
var VERSION = require_version();
var punycode;
try {
punycode = require("punycode");
} catch (e) {
console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization");
}
var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/;
var CONTROL_CHARS = /[\x00-\x1F]/;
var TERMINATORS = ["\n", "\r", "\0"];
var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;
var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;
var MONTH_TO_NUM = {
jan: 0,
feb: 1,
mar: 2,
apr: 3,
may: 4,
jun: 5,
jul: 6,
aug: 7,
sep: 8,
oct: 9,
nov: 10,
dec: 11
};
var NUM_TO_MONTH = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
var NUM_TO_DAY = [
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat"
];
var MAX_TIME = 2147483647e3;
var MIN_TIME = 0;
function parseDigits(token, minDigits, maxDigits, trailingOK) {
var count = 0;
while (count < token.length) {
var c = token.charCodeAt(count);
if (c <= 47 || c >= 58) {
break;
}
count++;
}
if (count < minDigits || count > maxDigits) {
return null;
}
if (!trailingOK && count != token.length) {
return null;
}
return parseInt(token.substr(0, count), 10);
}
function parseTime(token) {
var parts = token.split(":");
var result = [0, 0, 0];
if (parts.length !== 3) {
return null;
}
for (var i = 0; i < 3; i++) {
var trailingOK = i == 2;
var num = parseDigits(parts[i], 1, 2, trailingOK);
if (num === null) {
return null;
}
result[i] = num;
}
return result;
}
function parseMonth(token) {
token = String(token).substr(0, 3).toLowerCase();
var num = MONTH_TO_NUM[token];
return num >= 0 ? num : null;
}
function parseDate(str) {
if (!str) {
return;
}
var tokens = str.split(DATE_DELIM);
if (!tokens) {
return;
}
var hour = null;
var minute = null;
var second = null;
var dayOfMonth = null;
var month = null;
var year = null;
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i].trim();
if (!token.length) {
continue;
}
var result;
if (second === null) {
result = parseTime(token);
if (result) {
hour = result[0];
minute = result[1];
second = result[2];
continue;
}
}
if (dayOfMonth === null) {
result = parseDigits(token, 1, 2, true);
if (result !== null) {
dayOfMonth = result;
continue;
}
}
if (month === null) {
result = parseMonth(token);
if (result !== null) {
month = result;
continue;
}
}
if (year === null) {
result = parseDigits(token, 2, 4, true);
if (result !== null) {
year = result;
if (year >= 70 && year <= 99) {
year += 1900;
} else if (year >= 0 && year <= 69) {
year += 2e3;
}
}
}
}
if (dayOfMonth === null || month === null || year === null || second === null || dayOfMonth < 1 || dayOfMonth > 31 || year < 1601 || hour > 23 || minute > 59 || second > 59) {
return;
}
return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));
}
function formatDate(date) {
var d = date.getUTCDate();
d = d >= 10 ? d : "0" + d;
var h = date.getUTCHours();
h = h >= 10 ? h : "0" + h;
var m = date.getUTCMinutes();
m = m >= 10 ? m : "0" + m;
var s = date.getUTCSeconds();
s = s >= 10 ? s : "0" + s;
return NUM_TO_DAY[date.getUTCDay()] + ", " + d + " " + NUM_TO_MONTH[date.getUTCMonth()] + " " + date.getUTCFullYear() + " " + h + ":" + m + ":" + s + " GMT";
}
function canonicalDomain(str) {
if (str == null) {
return null;
}
str = str.trim().replace(/^\./, "");
if (punycode && /[^\u0001-\u007f]/.test(str)) {
str = punycode.toASCII(str);
}
return str.toLowerCase();
}
function domainMatch(str, domStr, canonicalize) {
if (str == null || domStr == null) {
return null;
}
if (canonicalize !== false) {
str = canonicalDomain(str);
domStr = canonicalDomain(domStr);
}
if (str == domStr) {
return true;
}
if (net.isIP(str)) {
return false;
}
var idx = str.indexOf(domStr);
if (idx <= 0) {
return false;
}
if (str.length !== domStr.length + idx) {
return false;
}
if (str.substr(idx - 1, 1) !== ".") {
return false;
}
return true;
}
function defaultPath(path3) {
if (!path3 || path3.substr(0, 1) !== "/") {
return "/";
}
if (path3 === "/") {
return path3;
}
var rightSlash = path3.lastIndexOf("/");
if (rightSlash === 0) {
return "/";
}
return path3.slice(0, rightSlash);
}
function trimTerminator(str) {
for (var t = 0; t < TERMINATORS.length; t++) {
var terminatorIdx = str.indexOf(TERMINATORS[t]);
if (terminatorIdx !== -1) {
str = str.substr(0, terminatorIdx);
}
}
return str;
}
function parseCookiePair(cookiePair, looseMode) {
cookiePair = trimTerminator(cookiePair);
var firstEq = cookiePair.indexOf("=");
if (looseMode) {
if (firstEq === 0) {
cookiePair = cookiePair.substr(1);
firstEq = cookiePair.indexOf("=");
}
} else {
if (firstEq <= 0) {
return;
}
}
var cookieName, cookieValue;
if (firstEq <= 0) {
cookieName = "";
cookieValue = cookiePair.trim();
} else {
cookieName = cookiePair.substr(0, firstEq).trim();
cookieValue = cookiePair.substr(firstEq + 1).trim();
}
if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {
return;
}
var c = new Cookie();
c.key = cookieName;
c.value = cookieValue;
return c;
}
function parse(str, options) {
if (!options || typeof options !== "object") {
options = {};
}
str = str.trim();
var firstSemi = str.indexOf(";");
var cookiePair = firstSemi === -1 ? str : str.substr(0, firstSemi);
var c = parseCookiePair(cookiePair, !!options.loose);
if (!c) {
return;
}
if (firstSemi === -1) {
return c;
}
var unparsed = str.slice(firstSemi + 1).trim();
if (unparsed.length === 0) {
return c;
}
var cookie_avs = unparsed.split(";");
while (cookie_avs.length) {
var av = cookie_avs.shift().trim();
if (av.length === 0) {
continue;
}
var av_sep = av.indexOf("=");
var av_key, av_value;
if (av_sep === -1) {
av_key = av;
av_value = null;
} else {
av_key = av.substr(0, av_sep);
av_value = av.substr(av_sep + 1);
}
av_key = av_key.trim().toLowerCase();
if (av_value) {
av_value = av_value.trim();
}
switch (av_key) {
case "expires":
if (av_value) {
var exp = parseDate(av_value);
if (exp) {
c.expires = exp;
}
}
break;
case "max-age":
if (av_value) {
if (/^-?[0-9]+$/.test(av_value)) {
var delta = parseInt(av_value, 10);
c.setMaxAge(delta);
}
}
break;
case "domain":
if (av_value) {
var domain = av_value.trim().replace(/^\./, "");
if (domain) {
c.domain = domain.toLowerCase();
}
}
break;
case "path":
c.path = av_value && av_value[0] === "/" ? av_value : null;
break;
case "secure":
c.secure = true;
break;
case "httponly":
c.httpOnly = true;
break;
default:
c.extensions = c.extensions || [];
c.extensions.push(av);
break;
}
}
return c;
}
function jsonParse(str) {
var obj;
try {
obj = JSON.parse(str);
} catch (e) {
return e;
}
return obj;
}
function fromJSON(str) {
if (!str) {
return null;
}
var obj;
if (typeof str === "string") {
obj = jsonParse(str);
if (obj instanceof Error) {
return null;
}
} else {
obj = str;
}
var c = new Cookie();
for (var i = 0; i < Cookie.serializableProperties.length; i++) {
var prop = Cookie.serializableProperties[i];
if (obj[prop] === void 0 || obj[prop] === Cookie.prototype[prop]) {
continue;
}
if (prop === "expires" || prop === "creation" || prop === "lastAccessed") {
if (obj[prop] === null) {
c[prop] = null;
} else {
c[prop] = obj[prop] == "Infinity" ? "Infinity" : new Date(obj[prop]);
}
} else {
c[prop] = obj[prop];
}
}
return c;
}
function cookieCompare(a, b) {
var cmp = 0;
var aPathLen = a.path ? a.path.length : 0;
var bPathLen = b.path ? b.path.length : 0;
cmp = bPathLen - aPathLen;
if (cmp !== 0) {
return cmp;
}
var aTime = a.creation ? a.creation.getTime() : MAX_TIME;
var bTime = b.creation ? b.creation.getTime() : MAX_TIME;
cmp = aTime - bTime;
if (cmp !== 0) {
return cmp;
}
cmp = a.creationIndex - b.creationIndex;
return cmp;
}
function permutePath(path3) {
if (path3 === "/") {
return ["/"];
}
if (path3.lastIndexOf("/") === path3.length - 1) {
path3 = path3.substr(0, path3.length - 1);
}
var permutations = [path3];
while (path3.length > 1) {
var lindex = path3.lastIndexOf("/");
if (lindex === 0) {
break;
}
path3 = path3.substr(0, lindex);
permutations.push(path3);
}
permutations.push("/");
return permutations;
}
function getCookieContext(url) {
if (url instanceof Object) {
return url;
}
try {
url = decodeURI(url);
} catch (err) {
}
return urlParse(url);
}
function Cookie(options) {
options = options || {};
Object.keys(options).forEach(function(prop) {
if (Cookie.prototype.hasOwnProperty(prop) && Cookie.prototype[prop] !== options[prop] && prop.substr(0, 1) !== "_") {
this[prop] = options[prop];
}
}, this);
this.creation = this.creation || new Date();
Object.defineProperty(this, "creationIndex", {
configurable: false,
enumerable: false,
writable: true,
value: ++Cookie.cookiesCreated
});
}
Cookie.cookiesCreated = 0;
Cookie.parse = parse;
Cookie.fromJSON = fromJSON;
Cookie.prototype.key = "";
Cookie.prototype.value = "";
Cookie.prototype.expires = "Infinity";
Cookie.prototype.maxAge = null;
Cookie.prototype.domain = null;
Cookie.prototype.path = null;
Cookie.prototype.secure = false;
Cookie.prototype.httpOnly = false;
Cookie.prototype.extensions = null;
Cookie.prototype.hostOnly = null;
Cookie.prototype.pathIsDefault = null;
Cookie.prototype.creation = null;
Cookie.prototype.lastAccessed = null;
Object.defineProperty(Cookie.prototype, "creationIndex", {
configurable: true,
enumerable: false,
writable: true,
value: 0
});
Cookie.serializableProperties = Object.keys(Cookie.prototype).filter(function(prop) {
return !(Cookie.prototype[prop] instanceof Function || prop === "creationIndex" || prop.substr(0, 1) === "_");
});
Cookie.prototype.inspect = function inspect() {
var now = Date.now();
return 'Cookie="' + this.toString() + "; hostOnly=" + (this.hostOnly != null ? this.hostOnly : "?") + "; aAge=" + (this.lastAccessed ? now - this.lastAccessed.getTime() + "ms" : "?") + "; cAge=" + (this.creation ? now - this.creation.getTime() + "ms" : "?") + '"';
};
if (util.inspect.custom) {
Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect;
}
Cookie.prototype.toJSON = function() {
var obj = {};
var props = Cookie.serializableProperties;
for (var i = 0; i < props.length; i++) {
var prop = props[i];
if (this[prop] === Cookie.prototype[prop]) {
continue;
}
if (prop === "expires" || prop === "creation" || prop === "lastAccessed") {
if (this[prop] === null) {
obj[prop] = null;
} else {
obj[prop] = this[prop] == "Infinity" ? "Infinity" : this[prop].toISOString();
}
} else if (prop === "maxAge") {
if (this[prop] !== null) {
obj[prop] = this[prop] == Infinity || this[prop] == -Infinity ? this[prop].toString() : this[prop];
}
} else {
if (this[prop] !== Cookie.prototype[prop]) {
obj[prop] = this[prop];
}
}
}
return obj;
};
Cookie.prototype.clone = function() {
return fromJSON(this.toJSON());
};
Cookie.prototype.validate = function validate() {
if (!COOKIE_OCTETS.test(this.value)) {
return false;
}
if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires)) {
return false;
}
if (this.maxAge != null && this.maxAge <= 0) {
return false;
}
if (this.path != null && !PATH_VALUE.test(this.path)) {
return false;
}
var cdomain = this.cdomain();
if (cdomain) {
if (cdomain.match(/\.$/)) {
return false;
}
var suffix = pubsuffix.getPublicSuffix(cdomain);
if (suffix == null) {
return false;
}
}
return true;
};
Cookie.prototype.setExpires = function setExpires(exp) {
if (exp instanceof Date) {
this.expires = exp;
} else {
this.expires = parseDate(exp) || "Infinity";
}
};
Cookie.prototype.setMaxAge = function setMaxAge(age) {
if (age === Infinity || age === -Infinity) {
this.maxAge = age.toString();
} else {
this.maxAge = age;
}
};
Cookie.prototype.cookieString = function cookieString() {
var val = this.value;
if (val == null) {
val = "";
}
if (this.key === "") {
return val;
}
return this.key + "=" + val;
};
Cookie.prototype.toString = function toString() {
var str = this.cookieString();
if (this.expires != Infinity) {
if (this.expires instanceof Date) {
str += "; Expires=" + formatDate(this.expires);
} else {
str += "; Expires=" + this.expires;
}
}
if (this.maxAge != null && this.maxAge != Infinity) {
str += "; Max-Age=" + this.maxAge;
}
if (this.domain && !this.hostOnly) {
str += "; Domain=" + this.domain;
}
if (this.path) {
str += "; Path=" + this.path;
}
if (this.secure) {
str += "; Secure";
}
if (this.httpOnly) {
str += "; HttpOnly";
}
if (this.extensions) {
this.extensions.forEach(function(ext) {
str += "; " + ext;
});
}
return str;
};
Cookie.prototype.TTL = function TTL(now) {
if (this.maxAge != null) {
return this.maxAge <= 0 ? 0 : this.maxAge * 1e3;
}
var expires = this.expires;
if (expires != Infinity) {
if (!(expires instanceof Date)) {
expires = parseDate(expires) || Infinity;
}
if (expires == Infinity) {
return Infinity;
}
return expires.getTime() - (now || Date.now());
}
return Infinity;
};
Cookie.prototype.expiryTime = function expiryTime(now) {
if (this.maxAge != null) {
var relativeTo = now || this.creation || new Date();
var age = this.maxAge <= 0 ? -Infinity : this.maxAge * 1e3;
return relativeTo.getTime() + age;
}
if (this.expires == Infinity) {
return Infinity;
}
return this.expires.getTime();
};
Cookie.prototype.expiryDate = function expiryDate(now) {
var millisec = this.expiryTime(now);
if (millisec == Infinity) {
return new Date(MAX_TIME);
} else if (millisec == -Infinity) {
return new Date(MIN_TIME);
} else {
return new Date(millisec);
}
};
Cookie.prototype.isPersistent = function isPersistent() {
return this.maxAge != null || this.expires != Infinity;
};
Cookie.prototype.cdomain = Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() {
if (this.domain == null) {
return null;
}
return canonicalDomain(this.domain);
};
function CookieJar(store, options) {
if (typeof options === "boolean") {
options = { rejectPublicSuffixes: options };
} else if (options == null) {
options = {};
}
if (options.rejectPublicSuffixes != null) {
this.rejectPublicSuffixes = options.rejectPublicSuffixes;
}
if (options.looseMode != null) {
this.enableLooseMode = options.looseMode;
}
if (!store) {
store = new MemoryCookieStore();
}
this.store = store;
}
CookieJar.prototype.store = null;
CookieJar.prototype.rejectPublicSuffixes = true;
CookieJar.prototype.enableLooseMode = false;
var CAN_BE_SYNC = [];
CAN_BE_SYNC.push("setCookie");
CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
var err;
var context = getCookieContext(url);
if (options instanceof Function) {
cb = options;
options = {};
}
var host = canonicalDomain(context.hostname);
var loose = this.enableLooseMode;
if (options.loose != null) {
loose = options.loose;
}
if (!(cookie instanceof Cookie)) {
cookie = Cookie.parse(cookie, { loose });
}
if (!cookie) {
err = new Error("Cookie failed to parse");
return cb(options.ignoreError ? null : err);
}
var now = options.now || new Date();
if (this.rejectPublicSuffixes && cookie.domain) {
var suffix = pubsuffix.getPublicSuffix(cookie.cdomain());
if (suffix == null) {
err = new Error("Cookie has domain set to a public suffix");
return cb(options.ignoreError ? null : err);
}
}
if (cookie.domain) {
if (!domainMatch(host, cookie.cdomain(), false)) {
err = new Error("Cookie not in this host's domain. Cookie:" + cookie.cdomain() + " Request:" + host);
return cb(options.ignoreError ? null : err);
}
if (cookie.hostOnly == null) {
cookie.hostOnly = false;
}
} else {
cookie.hostOnly = true;
cookie.domain = host;
}
if (!cookie.path || cookie.path[0] !== "/") {
cookie.path = defaultPath(context.pathname);
cookie.pathIsDefault = true;
}
if (options.http === false && cookie.httpOnly) {
err = new Error("Cookie is HttpOnly and this isn't an HTTP API");
return cb(options.ignoreError ? null : err);
}
var store = this.store;
if (!store.updateCookie) {
store.updateCookie = function(oldCookie, newCookie, cb2) {
this.putCookie(newCookie, cb2);
};
}
function withCookie(err2, oldCookie) {
if (err2) {
return cb(err2);
}
var next = function(err3) {
if (err3) {
return cb(err3);
} else {
cb(null, cookie);
}
};
if (oldCookie) {
if (options.http === false && oldCookie.httpOnly) {
err2 = new Error("old Cookie is HttpOnly and this isn't an HTTP API");
return cb(options.ignoreError ? null : err2);
}
cookie.creation = oldCookie.creation;
cookie.creationIndex = oldCookie.creationIndex;
cookie.lastAccessed = now;
store.updateCookie(oldCookie, cookie, next);
} else {
cookie.creation = cookie.lastAccessed = now;
store.putCookie(cookie, next);
}
}
store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);
};
CAN_BE_SYNC.push("getCookies");
CookieJar.prototype.getCookies = function(url, options, cb) {
var context = getCookieContext(url);
if (options instanceof Function) {
cb = options;
options = {};
}
var host = canonicalDomain(context.hostname);
var path3 = context.pathname || "/";
var secure = options.secure;
if (secure == null && context.protocol && (context.protocol == "https:" || context.protocol == "wss:")) {
secure = true;
}
var http = options.http;
if (http == null) {
http = true;
}
var now = options.now || Date.now();
var expireCheck = options.expire !== false;
var allPaths = !!options.allPaths;
var store = this.store;
function matchingCookie(c) {
if (c.hostOnly) {
if (c.domain != host) {
return false;
}
} else {
if (!domainMatch(host, c.domain, false)) {
return false;
}
}
if (!allPaths && !pathMatch(path3, c.path)) {
return false;
}
if (c.secure && !secure) {
return false;
}
if (c.httpOnly && !http) {
return false;
}
if (expireCheck && c.expiryTime() <= now) {
store.removeCookie(c.domain, c.path, c.key, function() {
});
return false;
}
return true;
}
store.findCookies(host, allPaths ? null : path3, function(err, cookies) {
if (err) {
return cb(err);
}
cookies = cookies.filter(matchingCookie);
if (options.sort !== false) {
cookies = cookies.sort(cookieCompare);
}
var now2 = new Date();
cookies.forEach(function(c) {
c.lastAccessed = now2;
});
cb(null, cookies);
});
};
CAN_BE_SYNC.push("getCookieString");
CookieJar.prototype.getCookieString = function() {
var args = Array.prototype.slice.call(arguments, 0);
var cb = args.pop();
var next = function(err, cookies) {
if (err) {
cb(err);
} else {
cb(null, cookies.sort(cookieCompare).map(function(c) {
return c.cookieString();
}).join("; "));
}
};
args.push(next);
this.getCookies.apply(this, args);
};
CAN_BE_SYNC.push("getSetCookieStrings");
CookieJar.prototype.getSetCookieStrings = function() {
var args = Array.prototype.slice.call(arguments, 0);
var cb = args.pop();
var next = function(err, cookies) {
if (err) {
cb(err);
} else {
cb(null, cookies.map(function(c) {
return c.toString();
}));
}
};
args.push(next);
this.getCookies.apply(this, args);
};
CAN_BE_SYNC.push("serialize");
CookieJar.prototype.serialize = function(cb) {
var type = this.store.constructor.name;
if (type === "Object") {
type = null;
}
var serialized = {
version: "tough-cookie@" + VERSION,
storeType: type,
rejectPublicSuffixes: !!this.rejectPublicSuffixes,
cookies: []
};
if (!(this.store.getAllCookies && typeof this.store.getAllCookies === "function")) {
return cb(new Error("store does not support getAllCookies and cannot be serialized"));
}
this.store.getAllCookies(function(err, cookies) {
if (err) {
return cb(err);
}
serialized.cookies = cookies.map(function(cookie) {
cookie = cookie instanceof Cookie ? cookie.toJSON() : cookie;
delete cookie.creationIndex;
return cookie;
});
return cb(null, serialized);
});
};
CookieJar.prototype.toJSON = function() {
return this.serializeSync();
};
CAN_BE_SYNC.push("_importCookies");
CookieJar.prototype._importCookies = function(serialized, cb) {
var jar = this;
var cookies = serialized.cookies;
if (!cookies || !Array.isArray(cookies)) {
return cb(new Error("serialized jar has no cookies array"));
}
cookies = cookies.slice();
function putNext(err) {
if (err) {
return cb(err);
}
if (!cookies.length) {
return cb(err, jar);
}
var cookie;
try {
cookie = fromJSON(cookies.shift());
} catch (e) {
return cb(e);
}
if (cookie === null) {
return putNext(null);
}
jar.store.putCookie(cookie, putNext);
}
putNext();
};
CookieJar.deserialize = function(strOrObj, store, cb) {
if (arguments.length !== 3) {
cb = store;
store = null;
}
var serialized;
if (typeof strOrObj === "string") {
serialized = jsonParse(strOrObj);
if (serialized instanceof Error) {
return cb(serialized);
}
} else {
serialized = strOrObj;
}
var jar = new CookieJar(store, serialized.rejectPublicSuffixes);
jar._importCookies(serialized, function(err) {
if (err) {
return cb(err);
}
cb(null, jar);
});
};
CookieJar.deserializeSync = function(strOrObj, store) {
var serialized = typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj;
var jar = new CookieJar(store, serialized.rejectPublicSuffixes);
if (!jar.store.synchronous) {
throw new Error("CookieJar store is not synchronous; use async API instead.");
}
jar._importCookiesSync(serialized);
return jar;
};
CookieJar.fromJSON = CookieJar.deserializeSync;
CookieJar.prototype.clone = function(newStore, cb) {
if (arguments.length === 1) {
cb = newStore;
newStore = null;
}
this.serialize(function(err, serialized) {
if (err) {
return cb(err);
}
CookieJar.deserialize(serialized, newStore, cb);
});
};
CAN_BE_SYNC.push("removeAllCookies");
CookieJar.prototype.removeAllCookies = function(cb) {
var store = this.store;
if (store.removeAllCookies instanceof Function && store.removeAllCookies !== Store.prototype.removeAllCookies) {
return store.removeAllCookies(cb);
}
store.getAllCookies(function(err, cookies) {
if (err) {
return cb(err);
}
if (cookies.length === 0) {
return cb(null);
}
var completedCount = 0;
var removeErrors = [];
function removeCookieCb(removeErr) {
if (removeErr) {
removeErrors.push(removeErr);
}
completedCount++;
if (completedCount === cookies.length) {
return cb(removeErrors.length ? removeErrors[0] : null);
}
}
cookies.forEach(function(cookie) {
store.removeCookie(cookie.domain, cookie.path, cookie.key, removeCookieCb);
});
});
};
CookieJar.prototype._cloneSync = syncWrap("clone");
CookieJar.prototype.cloneSync = function(newStore) {
if (!newStore.synchronous) {
throw new Error("CookieJar clone destination store is not synchronous; use async API instead.");
}
return this._cloneSync(newStore);
};
function syncWrap(method) {
return function() {
if (!this.store.synchronous) {
throw new Error("CookieJar store is not synchronous; use async API instead.");
}
var args = Array.prototype.slice.call(arguments);
var syncErr, syncResult;
args.push(function syncCb(err, result) {
syncErr = err;
syncResult = result;
});
this[method].apply(this, args);
if (syncErr) {
throw syncErr;
}
return syncResult;
};
}
CAN_BE_SYNC.forEach(function(method) {
CookieJar.prototype[method + "Sync"] = syncWrap(method);
});
exports.version = VERSION;
exports.CookieJar = CookieJar;
exports.Cookie = Cookie;
exports.Store = Store;
exports.MemoryCookieStore = MemoryCookieStore;
exports.parseDate = parseDate;
exports.formatDate = formatDate;
exports.parse = parse;
exports.fromJSON = fromJSON;
exports.domainMatch = domainMatch;
exports.defaultPath = defaultPath;
exports.pathMatch = pathMatch;
exports.getPublicSuffix = pubsuffix.getPublicSuffix;
exports.cookieCompare = cookieCompare;
exports.permuteDomain = require_permuteDomain().permuteDomain;
exports.permutePath = permutePath;
exports.canonicalDomain = canonicalDomain;
}
});
// node_modules/request/lib/cookies.js
var require_cookies = __commonJS({
"node_modules/request/lib/cookies.js"(exports) {
"use strict";
var tough = require_cookie();
var Cookie = tough.Cookie;
var CookieJar = tough.CookieJar;
exports.parse = function(str) {
if (str && str.uri) {
str = str.uri;
}
if (typeof str !== "string") {
throw new Error("The cookie function only accepts STRING as param");
}
return Cookie.parse(str, { loose: true });
};
function RequestJar(store) {
var self2 = this;
self2._jar = new CookieJar(store, { looseMode: true });
}
RequestJar.prototype.setCookie = function(cookieOrStr, uri, options) {
var self2 = this;
return self2._jar.setCookieSync(cookieOrStr, uri, options || {});
};
RequestJar.prototype.getCookieString = function(uri) {
var self2 = this;
return self2._jar.getCookieStringSync(uri);
};
RequestJar.prototype.getCookies = function(uri) {
var self2 = this;
return self2._jar.getCookiesSync(uri);
};
exports.jar = function(store) {
return new RequestJar(store);
};
}
});
// node_modules/json-stringify-safe/stringify.js
var require_stringify = __commonJS({
"node_modules/json-stringify-safe/stringify.js"(exports, module2) {
exports = module2.exports = stringify;
exports.getSerialize = serializer;
function stringify(obj, replacer, spaces, cycleReplacer) {
return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces);
}
function serializer(replacer, cycleReplacer) {
var stack = [], keys = [];
if (cycleReplacer == null)
cycleReplacer = function(key, value) {
if (stack[0] === value)
return "[Circular ~]";
return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]";
};
return function(key, value) {
if (stack.length > 0) {
var thisPos = stack.indexOf(this);
~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
if (~stack.indexOf(value))
value = cycleReplacer.call(this, key, value);
} else
stack.push(value);
return replacer == null ? value : replacer.call(this, key, value);
};
}
}
});
// node_modules/safe-buffer/index.js
var require_safe_buffer = __commonJS({
"node_modules/safe-buffer/index.js"(exports, module2) {
var buffer = require("buffer");
var Buffer2 = buffer.Buffer;
function copyProps(src, dst) {
for (var key in src) {
dst[key] = src[key];
}
}
if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
module2.exports = buffer;
} else {
copyProps(buffer, exports);
exports.Buffer = SafeBuffer;
}
function SafeBuffer(arg, encodingOrOffset, length) {
return Buffer2(arg, encodingOrOffset, length);
}
SafeBuffer.prototype = Object.create(Buffer2.prototype);
copyProps(Buffer2, SafeBuffer);
SafeBuffer.from = function(arg, encodingOrOffset, length) {
if (typeof arg === "number") {
throw new TypeError("Argument must not be a number");
}
return Buffer2(arg, encodingOrOffset, length);
};
SafeBuffer.alloc = function(size, fill, encoding) {
if (typeof size !== "number") {
throw new TypeError("Argument must be a number");
}
var buf = Buffer2(size);
if (fill !== void 0) {
if (typeof encoding === "string") {
buf.fill(fill, encoding);
} else {
buf.fill(fill);
}
} else {
buf.fill(0);
}
return buf;
};
SafeBuffer.allocUnsafe = function(size) {
if (typeof size !== "number") {
throw new TypeError("Argument must be a number");
}
return Buffer2(size);
};
SafeBuffer.allocUnsafeSlow = function(size) {
if (typeof size !== "number") {
throw new TypeError("Argument must be a number");
}
return buffer.SlowBuffer(size);
};
}
});
// node_modules/request/lib/helpers.js
var require_helpers = __commonJS({
"node_modules/request/lib/helpers.js"(exports) {
"use strict";
var jsonSafeStringify = require_stringify();
var crypto2 = require("crypto");
var Buffer2 = require_safe_buffer().Buffer;
var defer = typeof setImmediate === "undefined" ? process.nextTick : setImmediate;
function paramsHaveRequestBody(params) {
return params.body || params.requestBodyStream || params.json && typeof params.json !== "boolean" || params.multipart;
}
function safeStringify(obj, replacer) {
var ret;
try {
ret = JSON.stringify(obj, replacer);
} catch (e) {
ret = jsonSafeStringify(obj, replacer);
}
return ret;
}
function md5(str) {
return crypto2.createHash("md5").update(str).digest("hex");
}
function isReadStream(rs) {
return rs.readable && rs.path && rs.mode;
}
function toBase64(str) {
return Buffer2.from(str || "", "utf8").toString("base64");
}
function copy(obj) {
var o = {};
Object.keys(obj).forEach(function(i) {
o[i] = obj[i];
});
return o;
}
function version() {
var numbers = process.version.replace("v", "").split(".");
return {
major: parseInt(numbers[0], 10),
minor: parseInt(numbers[1], 10),
patch: parseInt(numbers[2], 10)
};
}
exports.paramsHaveRequestBody = paramsHaveRequestBody;
exports.safeStringify = safeStringify;
exports.md5 = md5;
exports.isReadStream = isReadStream;
exports.toBase64 = toBase64;
exports.copy = copy;
exports.version = version;
exports.defer = defer;
}
});
// node_modules/aws-sign2/index.js
var require_aws_sign2 = __commonJS({
"node_modules/aws-sign2/index.js"(exports, module2) {
var crypto2 = require("crypto");
var parse = require("url").parse;
var keys = [
"acl",
"location",
"logging",
"notification",
"partNumber",
"policy",
"requestPayment",
"torrent",
"uploadId",
"uploads",
"versionId",
"versioning",
"versions",
"website"
];
function authorization(options) {
return "AWS " + options.key + ":" + sign(options);
}
module2.exports = authorization;
module2.exports.authorization = authorization;
function hmacSha1(options) {
return crypto2.createHmac("sha1", options.secret).update(options.message).digest("base64");
}
module2.exports.hmacSha1 = hmacSha1;
function sign(options) {
options.message = stringToSign(options);
return hmacSha1(options);
}
module2.exports.sign = sign;
function signQuery(options) {
options.message = queryStringToSign(options);
return hmacSha1(options);
}
module2.exports.signQuery = signQuery;
function stringToSign(options) {
var headers = options.amazonHeaders || "";
if (headers)
headers += "\n";
var r = [
options.verb,
options.md5,
options.contentType,
options.date ? options.date.toUTCString() : "",
headers + options.resource
];
return r.join("\n");
}
module2.exports.stringToSign = stringToSign;
function queryStringToSign(options) {
return "GET\n\n\n" + options.date + "\n" + options.resource;
}
module2.exports.queryStringToSign = queryStringToSign;
function canonicalizeHeaders(headers) {
var buf = [], fields = Object.keys(headers);
for (var i = 0, len = fields.length; i < len; ++i) {
var field = fields[i], val = headers[field], field = field.toLowerCase();
if (field.indexOf("x-amz") !== 0)
continue;
buf.push(field + ":" + val);
}
return buf.sort().join("\n");
}
module2.exports.canonicalizeHeaders = canonicalizeHeaders;
function canonicalizeResource(resource) {
var url = parse(resource, true), path3 = url.pathname, buf = [];
Object.keys(url.query).forEach(function(key) {
if (!~keys.indexOf(key))
return;
var val = url.query[key] == "" ? "" : "=" + encodeURIComponent(url.query[key]);
buf.push(key + val);
});
return path3 + (buf.length ? "?" + buf.sort().join("&") : "");
}
module2.exports.canonicalizeResource = canonicalizeResource;
}
});
// node_modules/aws4/lru.js
var require_lru = __commonJS({
"node_modules/aws4/lru.js"(exports, module2) {
module2.exports = function(size) {
return new LruCache(size);
};
function LruCache(size) {
this.capacity = size | 0;
this.map = /* @__PURE__ */ Object.create(null);
this.list = new DoublyLinkedList();
}
LruCache.prototype.get = function(key) {
var node = this.map[key];
if (node == null)
return void 0;
this.used(node);
return node.val;
};
LruCache.prototype.set = function(key, val) {
var node = this.map[key];
if (node != null) {
node.val = val;
} else {
if (!this.capacity)
this.prune();
if (!this.capacity)
return false;
node = new DoublyLinkedNode(key, val);
this.map[key] = node;
this.capacity--;
}
this.used(node);
return true;
};
LruCache.prototype.used = function(node) {
this.list.moveToFront(node);
};
LruCache.prototype.prune = function() {
var node = this.list.pop();
if (node != null) {
delete this.map[node.key];
this.capacity++;
}
};
function DoublyLinkedList() {
this.firstNode = null;
this.lastNode = null;
}
DoublyLinkedList.prototype.moveToFront = function(node) {
if (this.firstNode == node)
return;
this.remove(node);
if (this.firstNode == null) {
this.firstNode = node;
this.lastNode = node;
node.prev = null;
node.next = null;
} else {
node.prev = null;
node.next = this.firstNode;
node.next.prev = node;
this.firstNode = node;
}
};
DoublyLinkedList.prototype.pop = function() {
var lastNode = this.lastNode;
if (lastNode != null) {
this.remove(lastNode);
}
return lastNode;
};
DoublyLinkedList.prototype.remove = function(node) {
if (this.firstNode == node) {
this.firstNode = node.next;
} else if (node.prev != null) {
node.prev.next = node.next;
}
if (this.lastNode == node) {
this.lastNode = node.prev;
} else if (node.next != null) {
node.next.prev = node.prev;
}
};
function DoublyLinkedNode(key, val) {
this.key = key;
this.val = val;
this.prev = null;
this.next = null;
}
}
});
// node_modules/aws4/aws4.js
var require_aws4 = __commonJS({
"node_modules/aws4/aws4.js"(exports) {
var aws4 = exports;
var url = require("url");
var querystring = require("querystring");
var crypto2 = require("crypto");
var lru = require_lru();
var credentialsCache = lru(1e3);
function hmac(key, string, encoding) {
return crypto2.createHmac("sha256", key).update(string, "utf8").digest(encoding);
}
function hash(string, encoding) {
return crypto2.createHash("sha256").update(string, "utf8").digest(encoding);
}
function encodeRfc3986(urlEncodedString) {
return urlEncodedString.replace(/[!'()*]/g, function(c) {
return "%" + c.charCodeAt(0).toString(16).toUpperCase();
});
}
function encodeRfc3986Full(str) {
return encodeRfc3986(encodeURIComponent(str));
}
var HEADERS_TO_IGNORE = {
"authorization": true,
"connection": true,
"x-amzn-trace-id": true,
"user-agent": true,
"expect": true,
"presigned-expires": true,
"range": true
};
function RequestSigner(request2, credentials) {
if (typeof request2 === "string")
request2 = url.parse(request2);
var headers = request2.headers = request2.headers || {}, hostParts = (!this.service || !this.region) && this.matchHost(request2.hostname || request2.host || headers.Host || headers.host);
this.request = request2;
this.credentials = credentials || this.defaultCredentials();
this.service = request2.service || hostParts[0] || "";
this.region = request2.region || hostParts[1] || "us-east-1";
if (this.service === "email")
this.service = "ses";
if (!request2.method && request2.body)
request2.method = "POST";
if (!headers.Host && !headers.host) {
headers.Host = request2.hostname || request2.host || this.createHost();
if (request2.port)
headers.Host += ":" + request2.port;
}
if (!request2.hostname && !request2.host)
request2.hostname = headers.Host || headers.host;
this.isCodeCommitGit = this.service === "codecommit" && request2.method === "GIT";
}
RequestSigner.prototype.matchHost = function(host) {
var match = (host || "").match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/);
var hostParts = (match || []).slice(1, 3);
if (hostParts[1] === "es")
hostParts = hostParts.reverse();
if (hostParts[1] == "s3") {
hostParts[0] = "s3";
hostParts[1] = "us-east-1";
} else {
for (var i = 0; i < 2; i++) {
if (/^s3-/.test(hostParts[i])) {
hostParts[1] = hostParts[i].slice(3);
hostParts[0] = "s3";
break;
}
}
}
return hostParts;
};
RequestSigner.prototype.isSingleRegion = function() {
if (["s3", "sdb"].indexOf(this.service) >= 0 && this.region === "us-east-1")
return true;
return ["cloudfront", "ls", "route53", "iam", "importexport", "sts"].indexOf(this.service) >= 0;
};
RequestSigner.prototype.createHost = function() {
var region = this.isSingleRegion() ? "" : "." + this.region, subdomain = this.service === "ses" ? "email" : this.service;
return subdomain + region + ".amazonaws.com";
};
RequestSigner.prototype.prepareRequest = function() {
this.parsePath();
var request2 = this.request, headers = request2.headers, query;
if (request2.signQuery) {
this.parsedPath.query = query = this.parsedPath.query || {};
if (this.credentials.sessionToken)
query["X-Amz-Security-Token"] = this.credentials.sessionToken;
if (this.service === "s3" && !query["X-Amz-Expires"])
query["X-Amz-Expires"] = 86400;
if (query["X-Amz-Date"])
this.datetime = query["X-Amz-Date"];
else
query["X-Amz-Date"] = this.getDateTime();
query["X-Amz-Algorithm"] = "AWS4-HMAC-SHA256";
query["X-Amz-Credential"] = this.credentials.accessKeyId + "/" + this.credentialString();
query["X-Amz-SignedHeaders"] = this.signedHeaders();
} else {
if (!request2.doNotModifyHeaders && !this.isCodeCommitGit) {
if (request2.body && !headers["Content-Type"] && !headers["content-type"])
headers["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8";
if (request2.body && !headers["Content-Length"] && !headers["content-length"])
headers["Content-Length"] = Buffer.byteLength(request2.body);
if (this.credentials.sessionToken && !headers["X-Amz-Security-Token"] && !headers["x-amz-security-token"])
headers["X-Amz-Security-Token"] = this.credentials.sessionToken;
if (this.service === "s3" && !headers["X-Amz-Content-Sha256"] && !headers["x-amz-content-sha256"])
headers["X-Amz-Content-Sha256"] = hash(this.request.body || "", "hex");
if (headers["X-Amz-Date"] || headers["x-amz-date"])
this.datetime = headers["X-Amz-Date"] || headers["x-amz-date"];
else
headers["X-Amz-Date"] = this.getDateTime();
}
delete headers.Authorization;
delete headers.authorization;
}
};
RequestSigner.prototype.sign = function() {
if (!this.parsedPath)
this.prepareRequest();
if (this.request.signQuery) {
this.parsedPath.query["X-Amz-Signature"] = this.signature();
} else {
this.request.headers.Authorization = this.authHeader();
}
this.request.path = this.formatPath();
return this.request;
};
RequestSigner.prototype.getDateTime = function() {
if (!this.datetime) {
var headers = this.request.headers, date = new Date(headers.Date || headers.date || new Date());
this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, "");
if (this.isCodeCommitGit)
this.datetime = this.datetime.slice(0, -1);
}
return this.datetime;
};
RequestSigner.prototype.getDate = function() {
return this.getDateTime().substr(0, 8);
};
RequestSigner.prototype.authHeader = function() {
return [
"AWS4-HMAC-SHA256 Credential=" + this.credentials.accessKeyId + "/" + this.credentialString(),
"SignedHeaders=" + this.signedHeaders(),
"Signature=" + this.signature()
].join(", ");
};
RequestSigner.prototype.signature = function() {
var date = this.getDate(), cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey);
if (!kCredentials) {
kDate = hmac("AWS4" + this.credentials.secretAccessKey, date);
kRegion = hmac(kDate, this.region);
kService = hmac(kRegion, this.service);
kCredentials = hmac(kService, "aws4_request");
credentialsCache.set(cacheKey, kCredentials);
}
return hmac(kCredentials, this.stringToSign(), "hex");
};
RequestSigner.prototype.stringToSign = function() {
return [
"AWS4-HMAC-SHA256",
this.getDateTime(),
this.credentialString(),
hash(this.canonicalString(), "hex")
].join("\n");
};
RequestSigner.prototype.canonicalString = function() {
if (!this.parsedPath)
this.prepareRequest();
var pathStr = this.parsedPath.path, query = this.parsedPath.query, headers = this.request.headers, queryStr = "", normalizePath = this.service !== "s3", decodePath = this.service === "s3" || this.request.doNotEncodePath, decodeSlashesInPath = this.service === "s3", firstValOnly = this.service === "s3", bodyHash;
if (this.service === "s3" && this.request.signQuery) {
bodyHash = "UNSIGNED-PAYLOAD";
} else if (this.isCodeCommitGit) {
bodyHash = "";
} else {
bodyHash = headers["X-Amz-Content-Sha256"] || headers["x-amz-content-sha256"] || hash(this.request.body || "", "hex");
}
if (query) {
var reducedQuery = Object.keys(query).reduce(function(obj, key) {
if (!key)
return obj;
obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] : firstValOnly ? query[key][0] : query[key];
return obj;
}, {});
var encodedQueryPieces = [];
Object.keys(reducedQuery).sort().forEach(function(key) {
if (!Array.isArray(reducedQuery[key])) {
encodedQueryPieces.push(key + "=" + encodeRfc3986Full(reducedQuery[key]));
} else {
reducedQuery[key].map(encodeRfc3986Full).sort().forEach(function(val) {
encodedQueryPieces.push(key + "=" + val);
});
}
});
queryStr = encodedQueryPieces.join("&");
}
if (pathStr !== "/") {
if (normalizePath)
pathStr = pathStr.replace(/\/{2,}/g, "/");
pathStr = pathStr.split("/").reduce(function(path3, piece) {
if (normalizePath && piece === "..") {
path3.pop();
} else if (!normalizePath || piece !== ".") {
if (decodePath)
piece = decodeURIComponent(piece.replace(/\+/g, " "));
path3.push(encodeRfc3986Full(piece));
}
return path3;
}, []).join("/");
if (pathStr[0] !== "/")
pathStr = "/" + pathStr;
if (decodeSlashesInPath)
pathStr = pathStr.replace(/%2F/g, "/");
}
return [
this.request.method || "GET",
pathStr,
queryStr,
this.canonicalHeaders() + "\n",
this.signedHeaders(),
bodyHash
].join("\n");
};
RequestSigner.prototype.canonicalHeaders = function() {
var headers = this.request.headers;
function trimAll(header) {
return header.toString().trim().replace(/\s+/g, " ");
}
return Object.keys(headers).filter(function(key) {
return HEADERS_TO_IGNORE[key.toLowerCase()] == null;
}).sort(function(a, b) {
return a.toLowerCase() < b.toLowerCase() ? -1 : 1;
}).map(function(key) {
return key.toLowerCase() + ":" + trimAll(headers[key]);
}).join("\n");
};
RequestSigner.prototype.signedHeaders = function() {
return Object.keys(this.request.headers).map(function(key) {
return key.toLowerCase();
}).filter(function(key) {
return HEADERS_TO_IGNORE[key] == null;
}).sort().join(";");
};
RequestSigner.prototype.credentialString = function() {
return [
this.getDate(),
this.region,
this.service,
"aws4_request"
].join("/");
};
RequestSigner.prototype.defaultCredentials = function() {
var env = process.env;
return {
accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY,
secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY,
sessionToken: env.AWS_SESSION_TOKEN
};
};
RequestSigner.prototype.parsePath = function() {
var path3 = this.request.path || "/";
if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path3)) {
path3 = encodeURI(decodeURI(path3));
}
var queryIx = path3.indexOf("?"), query = null;
if (queryIx >= 0) {
query = querystring.parse(path3.slice(queryIx + 1));
path3 = path3.slice(0, queryIx);
}
this.parsedPath = {
path: path3,
query
};
};
RequestSigner.prototype.formatPath = function() {
var path3 = this.parsedPath.path, query = this.parsedPath.query;
if (!query)
return path3;
if (query[""] != null)
delete query[""];
return path3 + "?" + encodeRfc3986(querystring.stringify(query));
};
aws4.RequestSigner = RequestSigner;
aws4.sign = function(request2, credentials) {
return new RequestSigner(request2, credentials).sign();
};
}
});
// node_modules/assert-plus/assert.js
var require_assert = __commonJS({
"node_modules/assert-plus/assert.js"(exports, module2) {
var assert = require("assert");
var Stream = require("stream").Stream;
var util = require("util");
var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
function _capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
function _toss(name, expected, oper, arg, actual) {
throw new assert.AssertionError({
message: util.format("%s (%s) is required", name, expected),
actual: actual === void 0 ? typeof arg : actual(arg),
expected,
operator: oper || "===",
stackStartFunction: _toss.caller
});
}
function _getClass(arg) {
return Object.prototype.toString.call(arg).slice(8, -1);
}
function noop() {
}
var types = {
bool: {
check: function(arg) {
return typeof arg === "boolean";
}
},
func: {
check: function(arg) {
return typeof arg === "function";
}
},
string: {
check: function(arg) {
return typeof arg === "string";
}
},
object: {
check: function(arg) {
return typeof arg === "object" && arg !== null;
}
},
number: {
check: function(arg) {
return typeof arg === "number" && !isNaN(arg);
}
},
finite: {
check: function(arg) {
return typeof arg === "number" && !isNaN(arg) && isFinite(arg);
}
},
buffer: {
check: function(arg) {
return Buffer.isBuffer(arg);
},
operator: "Buffer.isBuffer"
},
array: {
check: function(arg) {
return Array.isArray(arg);
},
operator: "Array.isArray"
},
stream: {
check: function(arg) {
return arg instanceof Stream;
},
operator: "instanceof",
actual: _getClass
},
date: {
check: function(arg) {
return arg instanceof Date;
},
operator: "instanceof",
actual: _getClass
},
regexp: {
check: function(arg) {
return arg instanceof RegExp;
},
operator: "instanceof",
actual: _getClass
},
uuid: {
check: function(arg) {
return typeof arg === "string" && UUID_REGEXP.test(arg);
},
operator: "isUUID"
}
};
function _setExports(ndebug) {
var keys = Object.keys(types);
var out;
if (process.env.NODE_NDEBUG) {
out = noop;
} else {
out = function(arg, msg) {
if (!arg) {
_toss(msg, "true", arg);
}
};
}
keys.forEach(function(k) {
if (ndebug) {
out[k] = noop;
return;
}
var type = types[k];
out[k] = function(arg, msg) {
if (!type.check(arg)) {
_toss(msg, k, type.operator, arg, type.actual);
}
};
});
keys.forEach(function(k) {
var name = "optional" + _capitalize(k);
if (ndebug) {
out[name] = noop;
return;
}
var type = types[k];
out[name] = function(arg, msg) {
if (arg === void 0 || arg === null) {
return;
}
if (!type.check(arg)) {
_toss(msg, k, type.operator, arg, type.actual);
}
};
});
keys.forEach(function(k) {
var name = "arrayOf" + _capitalize(k);
if (ndebug) {
out[name] = noop;
return;
}
var type = types[k];
var expected = "[" + k + "]";
out[name] = function(arg, msg) {
if (!Array.isArray(arg)) {
_toss(msg, expected, type.operator, arg, type.actual);
}
var i;
for (i = 0; i < arg.length; i++) {
if (!type.check(arg[i])) {
_toss(msg, expected, type.operator, arg, type.actual);
}
}
};
});
keys.forEach(function(k) {
var name = "optionalArrayOf" + _capitalize(k);
if (ndebug) {
out[name] = noop;
return;
}
var type = types[k];
var expected = "[" + k + "]";
out[name] = function(arg, msg) {
if (arg === void 0 || arg === null) {
return;
}
if (!Array.isArray(arg)) {
_toss(msg, expected, type.operator, arg, type.actual);
}
var i;
for (i = 0; i < arg.length; i++) {
if (!type.check(arg[i])) {
_toss(msg, expected, type.operator, arg, type.actual);
}
}
};
});
Object.keys(assert).forEach(function(k) {
if (k === "AssertionError") {
out[k] = assert[k];
return;
}
if (ndebug) {
out[k] = noop;
return;
}
out[k] = assert[k];
});
out._setExports = _setExports;
return out;
}
module2.exports = _setExports(process.env.NODE_NDEBUG);
}
});
// node_modules/safer-buffer/safer.js
var require_safer = __commonJS({
"node_modules/safer-buffer/safer.js"(exports, module2) {
"use strict";
var buffer = require("buffer");
var Buffer2 = buffer.Buffer;
var safer = {};
var key;
for (key in buffer) {
if (!buffer.hasOwnProperty(key))
continue;
if (key === "SlowBuffer" || key === "Buffer")
continue;
safer[key] = buffer[key];
}
var Safer = safer.Buffer = {};
for (key in Buffer2) {
if (!Buffer2.hasOwnProperty(key))
continue;
if (key === "allocUnsafe" || key === "allocUnsafeSlow")
continue;
Safer[key] = Buffer2[key];
}
safer.Buffer.prototype = Buffer2.prototype;
if (!Safer.from || Safer.from === Uint8Array.from) {
Safer.from = function(value, encodingOrOffset, length) {
if (typeof value === "number") {
throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
}
if (value && typeof value.length === "undefined") {
throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
}
return Buffer2(value, encodingOrOffset, length);
};
}
if (!Safer.alloc) {
Safer.alloc = function(size, fill, encoding) {
if (typeof size !== "number") {
throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
}
if (size < 0 || size >= 2 * (1 << 30)) {
throw new RangeError('The value "' + size + '" is invalid for option "size"');
}
var buf = Buffer2(size);
if (!fill || fill.length === 0) {
buf.fill(0);
} else if (typeof encoding === "string") {
buf.fill(fill, encoding);
} else {
buf.fill(fill);
}
return buf;
};
}
if (!safer.kStringMaxLength) {
try {
safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
} catch (e) {
}
}
if (!safer.constants) {
safer.constants = {
MAX_LENGTH: safer.kMaxLength
};
if (safer.kStringMaxLength) {
safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
}
}
module2.exports = safer;
}
});
// node_modules/sshpk/lib/algs.js
var require_algs = __commonJS({
"node_modules/sshpk/lib/algs.js"(exports, module2) {
var Buffer2 = require_safer().Buffer;
var algInfo = {
"dsa": {
parts: ["p", "q", "g", "y"],
sizePart: "p"
},
"rsa": {
parts: ["e", "n"],
sizePart: "n"
},
"ecdsa": {
parts: ["curve", "Q"],
sizePart: "Q"
},
"ed25519": {
parts: ["A"],
sizePart: "A"
}
};
algInfo["curve25519"] = algInfo["ed25519"];
var algPrivInfo = {
"dsa": {
parts: ["p", "q", "g", "y", "x"]
},
"rsa": {
parts: ["n", "e", "d", "iqmp", "p", "q"]
},
"ecdsa": {
parts: ["curve", "Q", "d"]
},
"ed25519": {
parts: ["A", "k"]
}
};
algPrivInfo["curve25519"] = algPrivInfo["ed25519"];
var hashAlgs = {
"md5": true,
"sha1": true,
"sha256": true,
"sha384": true,
"sha512": true
};
var curves = {
"nistp256": {
size: 256,
pkcs8oid: "1.2.840.10045.3.1.7",
p: Buffer2.from("00ffffffff 00000001 00000000 0000000000000000 ffffffff ffffffff ffffffff".replace(/ /g, ""), "hex"),
a: Buffer2.from("00FFFFFFFF 00000001 00000000 0000000000000000 FFFFFFFF FFFFFFFF FFFFFFFC".replace(/ /g, ""), "hex"),
b: Buffer2.from("5ac635d8 aa3a93e7 b3ebbd55 769886bc651d06b0 cc53b0f6 3bce3c3e 27d2604b".replace(/ /g, ""), "hex"),
s: Buffer2.from("00c49d3608 86e70493 6a6678e1 139d26b7819f7e90".replace(/ /g, ""), "hex"),
n: Buffer2.from("00ffffffff 00000000 ffffffff ffffffffbce6faad a7179e84 f3b9cac2 fc632551".replace(/ /g, ""), "hex"),
G: Buffer2.from("046b17d1f2 e12c4247 f8bce6e5 63a440f277037d81 2deb33a0 f4a13945 d898c2964fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e162bce3357 6b315ece cbb64068 37bf51f5".replace(/ /g, ""), "hex")
},
"nistp384": {
size: 384,
pkcs8oid: "1.3.132.0.34",
p: Buffer2.from("00ffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff fffffffeffffffff 00000000 00000000 ffffffff".replace(/ /g, ""), "hex"),
a: Buffer2.from("00FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFEFFFFFFFF 00000000 00000000 FFFFFFFC".replace(/ /g, ""), "hex"),
b: Buffer2.from("b3312fa7 e23ee7e4 988e056b e3f82d19181d9c6e fe814112 0314088f 5013875ac656398d 8a2ed19d 2a85c8ed d3ec2aef".replace(/ /g, ""), "hex"),
s: Buffer2.from("00a335926a a319a27a 1d00896a 6773a4827acdac73".replace(/ /g, ""), "hex"),
n: Buffer2.from("00ffffffff ffffffff ffffffff ffffffffffffffff ffffffff c7634d81 f4372ddf581a0db2 48b0a77a ecec196a ccc52973".replace(/ /g, ""), "hex"),
G: Buffer2.from("04aa87ca22 be8b0537 8eb1c71e f320ad746e1d3b62 8ba79b98 59f741e0 82542a385502f25d bf55296c 3a545e38 72760ab73617de4a 96262c6f 5d9e98bf 9292dc29f8f41dbd 289a147c e9da3113 b5f0b8c00a60b1ce 1d7e819d 7a431d7c 90ea0e5f".replace(/ /g, ""), "hex")
},
"nistp521": {
size: 521,
pkcs8oid: "1.3.132.0.35",
p: Buffer2.from("01ffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff ffffffffffff".replace(/ /g, ""), "hex"),
a: Buffer2.from("01FFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC".replace(/ /g, ""), "hex"),
b: Buffer2.from("51953eb961 8e1c9a1f 929a21a0 b68540eea2da725b 99b315f3 b8b48991 8ef109e156193951 ec7e937b 1652c0bd 3bb1bf073573df88 3d2c34f1 ef451fd4 6b503f00".replace(/ /g, ""), "hex"),
s: Buffer2.from("00d09e8800 291cb853 96cc6717 393284aaa0da64ba".replace(/ /g, ""), "hex"),
n: Buffer2.from("01ffffffffff ffffffff ffffffff ffffffffffffffff ffffffff ffffffff fffffffa51868783 bf2f966b 7fcc0148 f709a5d03bb5c9b8 899c47ae bb6fb71e 91386409".replace(/ /g, ""), "hex"),
G: Buffer2.from("0400c6 858e06b7 0404e9cd 9e3ecb66 2395b4429c648139 053fb521 f828af60 6b4d3dbaa14b5e77 efe75928 fe1dc127 a2ffa8de3348b3c1 856a429b f97e7e31 c2e5bd660118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd998f54449 579b4468 17afbd17 273e662c97ee7299 5ef42640 c550b901 3fad0761353c7086 a272c240 88be9476 9fd16650".replace(/ /g, ""), "hex")
}
};
module2.exports = {
info: algInfo,
privInfo: algPrivInfo,
hashAlgs,
curves
};
}
});
// node_modules/sshpk/lib/errors.js
var require_errors2 = __commonJS({
"node_modules/sshpk/lib/errors.js"(exports, module2) {
var assert = require_assert();
var util = require("util");
function FingerprintFormatError(fp, format) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, FingerprintFormatError);
this.name = "FingerprintFormatError";
this.fingerprint = fp;
this.format = format;
this.message = "Fingerprint format is not supported, or is invalid: ";
if (fp !== void 0)
this.message += " fingerprint = " + fp;
if (format !== void 0)
this.message += " format = " + format;
}
util.inherits(FingerprintFormatError, Error);
function InvalidAlgorithmError(alg) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, InvalidAlgorithmError);
this.name = "InvalidAlgorithmError";
this.algorithm = alg;
this.message = 'Algorithm "' + alg + '" is not supported';
}
util.inherits(InvalidAlgorithmError, Error);
function KeyParseError(name, format, innerErr) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, KeyParseError);
this.name = "KeyParseError";
this.format = format;
this.keyName = name;
this.innerErr = innerErr;
this.message = "Failed to parse " + name + " as a valid " + format + " format key: " + innerErr.message;
}
util.inherits(KeyParseError, Error);
function SignatureParseError(type, format, innerErr) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, SignatureParseError);
this.name = "SignatureParseError";
this.type = type;
this.format = format;
this.innerErr = innerErr;
this.message = "Failed to parse the given data as a " + type + " signature in " + format + " format: " + innerErr.message;
}
util.inherits(SignatureParseError, Error);
function CertificateParseError(name, format, innerErr) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, CertificateParseError);
this.name = "CertificateParseError";
this.format = format;
this.certName = name;
this.innerErr = innerErr;
this.message = "Failed to parse " + name + " as a valid " + format + " format certificate: " + innerErr.message;
}
util.inherits(CertificateParseError, Error);
function KeyEncryptedError(name, format) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, KeyEncryptedError);
this.name = "KeyEncryptedError";
this.format = format;
this.keyName = name;
this.message = "The " + format + " format key " + name + " is encrypted (password-protected), and no passphrase was provided in `options`";
}
util.inherits(KeyEncryptedError, Error);
module2.exports = {
FingerprintFormatError,
InvalidAlgorithmError,
KeyParseError,
SignatureParseError,
KeyEncryptedError,
CertificateParseError
};
}
});
// node_modules/asn1/lib/ber/errors.js
var require_errors3 = __commonJS({
"node_modules/asn1/lib/ber/errors.js"(exports, module2) {
module2.exports = {
newInvalidAsn1Error: function(msg) {
var e = new Error();
e.name = "InvalidAsn1Error";
e.message = msg || "";
return e;
}
};
}
});
// node_modules/asn1/lib/ber/types.js
var require_types = __commonJS({
"node_modules/asn1/lib/ber/types.js"(exports, module2) {
module2.exports = {
EOC: 0,
Boolean: 1,
Integer: 2,
BitString: 3,
OctetString: 4,
Null: 5,
OID: 6,
ObjectDescriptor: 7,
External: 8,
Real: 9,
Enumeration: 10,
PDV: 11,
Utf8String: 12,
RelativeOID: 13,
Sequence: 16,
Set: 17,
NumericString: 18,
PrintableString: 19,
T61String: 20,
VideotexString: 21,
IA5String: 22,
UTCTime: 23,
GeneralizedTime: 24,
GraphicString: 25,
VisibleString: 26,
GeneralString: 28,
UniversalString: 29,
CharacterString: 30,
BMPString: 31,
Constructor: 32,
Context: 128
};
}
});
// node_modules/asn1/lib/ber/reader.js
var require_reader = __commonJS({
"node_modules/asn1/lib/ber/reader.js"(exports, module2) {
var assert = require("assert");
var Buffer2 = require_safer().Buffer;
var ASN1 = require_types();
var errors = require_errors3();
var newInvalidAsn1Error = errors.newInvalidAsn1Error;
function Reader(data) {
if (!data || !Buffer2.isBuffer(data))
throw new TypeError("data must be a node Buffer");
this._buf = data;
this._size = data.length;
this._len = 0;
this._offset = 0;
}
Object.defineProperty(Reader.prototype, "length", {
enumerable: true,
get: function() {
return this._len;
}
});
Object.defineProperty(Reader.prototype, "offset", {
enumerable: true,
get: function() {
return this._offset;
}
});
Object.defineProperty(Reader.prototype, "remain", {
get: function() {
return this._size - this._offset;
}
});
Object.defineProperty(Reader.prototype, "buffer", {
get: function() {
return this._buf.slice(this._offset);
}
});
Reader.prototype.readByte = function(peek) {
if (this._size - this._offset < 1)
return null;
var b = this._buf[this._offset] & 255;
if (!peek)
this._offset += 1;
return b;
};
Reader.prototype.peek = function() {
return this.readByte(true);
};
Reader.prototype.readLength = function(offset) {
if (offset === void 0)
offset = this._offset;
if (offset >= this._size)
return null;
var lenB = this._buf[offset++] & 255;
if (lenB === null)
return null;
if ((lenB & 128) === 128) {
lenB &= 127;
if (lenB === 0)
throw newInvalidAsn1Error("Indefinite length not supported");
if (lenB > 4)
throw newInvalidAsn1Error("encoding too long");
if (this._size - offset < lenB)
return null;
this._len = 0;
for (var i = 0; i < lenB; i++)
this._len = (this._len << 8) + (this._buf[offset++] & 255);
} else {
this._len = lenB;
}
return offset;
};
Reader.prototype.readSequence = function(tag) {
var seq = this.peek();
if (seq === null)
return null;
if (tag !== void 0 && tag !== seq)
throw newInvalidAsn1Error("Expected 0x" + tag.toString(16) + ": got 0x" + seq.toString(16));
var o = this.readLength(this._offset + 1);
if (o === null)
return null;
this._offset = o;
return seq;
};
Reader.prototype.readInt = function() {
return this._readTag(ASN1.Integer);
};
Reader.prototype.readBoolean = function() {
return this._readTag(ASN1.Boolean) === 0 ? false : true;
};
Reader.prototype.readEnumeration = function() {
return this._readTag(ASN1.Enumeration);
};
Reader.prototype.readString = function(tag, retbuf) {
if (!tag)
tag = ASN1.OctetString;
var b = this.peek();
if (b === null)
return null;
if (b !== tag)
throw newInvalidAsn1Error("Expected 0x" + tag.toString(16) + ": got 0x" + b.toString(16));
var o = this.readLength(this._offset + 1);
if (o === null)
return null;
if (this.length > this._size - o)
return null;
this._offset = o;
if (this.length === 0)
return retbuf ? Buffer2.alloc(0) : "";
var str = this._buf.slice(this._offset, this._offset + this.length);
this._offset += this.length;
return retbuf ? str : str.toString("utf8");
};
Reader.prototype.readOID = function(tag) {
if (!tag)
tag = ASN1.OID;
var b = this.readString(tag, true);
if (b === null)
return null;
var values = [];
var value = 0;
for (var i = 0; i < b.length; i++) {
var byte = b[i] & 255;
value <<= 7;
value += byte & 127;
if ((byte & 128) === 0) {
values.push(value);
value = 0;
}
}
value = values.shift();
values.unshift(value % 40);
values.unshift(value / 40 >> 0);
return values.join(".");
};
Reader.prototype._readTag = function(tag) {
assert.ok(tag !== void 0);
var b = this.peek();
if (b === null)
return null;
if (b !== tag)
throw newInvalidAsn1Error("Expected 0x" + tag.toString(16) + ": got 0x" + b.toString(16));
var o = this.readLength(this._offset + 1);
if (o === null)
return null;
if (this.length > 4)
throw newInvalidAsn1Error("Integer too long: " + this.length);
if (this.length > this._size - o)
return null;
this._offset = o;
var fb = this._buf[this._offset];
var value = 0;
for (var i = 0; i < this.length; i++) {
value <<= 8;
value |= this._buf[this._offset++] & 255;
}
if ((fb & 128) === 128 && i !== 4)
value -= 1 << i * 8;
return value >> 0;
};
module2.exports = Reader;
}
});
// node_modules/asn1/lib/ber/writer.js
var require_writer = __commonJS({
"node_modules/asn1/lib/ber/writer.js"(exports, module2) {
var assert = require("assert");
var Buffer2 = require_safer().Buffer;
var ASN1 = require_types();
var errors = require_errors3();
var newInvalidAsn1Error = errors.newInvalidAsn1Error;
var DEFAULT_OPTS = {
size: 1024,
growthFactor: 8
};
function merge(from, to) {
assert.ok(from);
assert.equal(typeof from, "object");
assert.ok(to);
assert.equal(typeof to, "object");
var keys = Object.getOwnPropertyNames(from);
keys.forEach(function(key) {
if (to[key])
return;
var value = Object.getOwnPropertyDescriptor(from, key);
Object.defineProperty(to, key, value);
});
return to;
}
function Writer(options) {
options = merge(DEFAULT_OPTS, options || {});
this._buf = Buffer2.alloc(options.size || 1024);
this._size = this._buf.length;
this._offset = 0;
this._options = options;
this._seq = [];
}
Object.defineProperty(Writer.prototype, "buffer", {
get: function() {
if (this._seq.length)
throw newInvalidAsn1Error(this._seq.length + " unended sequence(s)");
return this._buf.slice(0, this._offset);
}
});
Writer.prototype.writeByte = function(b) {
if (typeof b !== "number")
throw new TypeError("argument must be a Number");
this._ensure(1);
this._buf[this._offset++] = b;
};
Writer.prototype.writeInt = function(i, tag) {
if (typeof i !== "number")
throw new TypeError("argument must be a Number");
if (typeof tag !== "number")
tag = ASN1.Integer;
var sz = 4;
while (((i & 4286578688) === 0 || (i & 4286578688) === 4286578688 >> 0) && sz > 1) {
sz--;
i <<= 8;
}
if (sz > 4)
throw newInvalidAsn1Error("BER ints cannot be > 0xffffffff");
this._ensure(2 + sz);
this._buf[this._offset++] = tag;
this._buf[this._offset++] = sz;
while (sz-- > 0) {
this._buf[this._offset++] = (i & 4278190080) >>> 24;
i <<= 8;
}
};
Writer.prototype.writeNull = function() {
this.writeByte(ASN1.Null);
this.writeByte(0);
};
Writer.prototype.writeEnumeration = function(i, tag) {
if (typeof i !== "number")
throw new TypeError("argument must be a Number");
if (typeof tag !== "number")
tag = ASN1.Enumeration;
return this.writeInt(i, tag);
};
Writer.prototype.writeBoolean = function(b, tag) {
if (typeof b !== "boolean")
throw new TypeError("argument must be a Boolean");
if (typeof tag !== "number")
tag = ASN1.Boolean;
this._ensure(3);
this._buf[this._offset++] = tag;
this._buf[this._offset++] = 1;
this._buf[this._offset++] = b ? 255 : 0;
};
Writer.prototype.writeString = function(s, tag) {
if (typeof s !== "string")
throw new TypeError("argument must be a string (was: " + typeof s + ")");
if (typeof tag !== "number")
tag = ASN1.OctetString;
var len = Buffer2.byteLength(s);
this.writeByte(tag);
this.writeLength(len);
if (len) {
this._ensure(len);
this._buf.write(s, this._offset);
this._offset += len;
}
};
Writer.prototype.writeBuffer = function(buf, tag) {
if (typeof tag !== "number")
throw new TypeError("tag must be a number");
if (!Buffer2.isBuffer(buf))
throw new TypeError("argument must be a buffer");
this.writeByte(tag);
this.writeLength(buf.length);
this._ensure(buf.length);
buf.copy(this._buf, this._offset, 0, buf.length);
this._offset += buf.length;
};
Writer.prototype.writeStringArray = function(strings) {
if (!strings instanceof Array)
throw new TypeError("argument must be an Array[String]");
var self2 = this;
strings.forEach(function(s) {
self2.writeString(s);
});
};
Writer.prototype.writeOID = function(s, tag) {
if (typeof s !== "string")
throw new TypeError("argument must be a string");
if (typeof tag !== "number")
tag = ASN1.OID;
if (!/^([0-9]+\.){3,}[0-9]+$/.test(s))
throw new Error("argument is not a valid OID string");
function encodeOctet(bytes2, octet) {
if (octet < 128) {
bytes2.push(octet);
} else if (octet < 16384) {
bytes2.push(octet >>> 7 | 128);
bytes2.push(octet & 127);
} else if (octet < 2097152) {
bytes2.push(octet >>> 14 | 128);
bytes2.push((octet >>> 7 | 128) & 255);
bytes2.push(octet & 127);
} else if (octet < 268435456) {
bytes2.push(octet >>> 21 | 128);
bytes2.push((octet >>> 14 | 128) & 255);
bytes2.push((octet >>> 7 | 128) & 255);
bytes2.push(octet & 127);
} else {
bytes2.push((octet >>> 28 | 128) & 255);
bytes2.push((octet >>> 21 | 128) & 255);
bytes2.push((octet >>> 14 | 128) & 255);
bytes2.push((octet >>> 7 | 128) & 255);
bytes2.push(octet & 127);
}
}
var tmp = s.split(".");
var bytes = [];
bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));
tmp.slice(2).forEach(function(b) {
encodeOctet(bytes, parseInt(b, 10));
});
var self2 = this;
this._ensure(2 + bytes.length);
this.writeByte(tag);
this.writeLength(bytes.length);
bytes.forEach(function(b) {
self2.writeByte(b);
});
};
Writer.prototype.writeLength = function(len) {
if (typeof len !== "number")
throw new TypeError("argument must be a Number");
this._ensure(4);
if (len <= 127) {
this._buf[this._offset++] = len;
} else if (len <= 255) {
this._buf[this._offset++] = 129;
this._buf[this._offset++] = len;
} else if (len <= 65535) {
this._buf[this._offset++] = 130;
this._buf[this._offset++] = len >> 8;
this._buf[this._offset++] = len;
} else if (len <= 16777215) {
this._buf[this._offset++] = 131;
this._buf[this._offset++] = len >> 16;
this._buf[this._offset++] = len >> 8;
this._buf[this._offset++] = len;
} else {
throw newInvalidAsn1Error("Length too long (> 4 bytes)");
}
};
Writer.prototype.startSequence = function(tag) {
if (typeof tag !== "number")
tag = ASN1.Sequence | ASN1.Constructor;
this.writeByte(tag);
this._seq.push(this._offset);
this._ensure(3);
this._offset += 3;
};
Writer.prototype.endSequence = function() {
var seq = this._seq.pop();
var start = seq + 3;
var len = this._offset - start;
if (len <= 127) {
this._shift(start, len, -2);
this._buf[seq] = len;
} else if (len <= 255) {
this._shift(start, len, -1);
this._buf[seq] = 129;
this._buf[seq + 1] = len;
} else if (len <= 65535) {
this._buf[seq] = 130;
this._buf[seq + 1] = len >> 8;
this._buf[seq + 2] = len;
} else if (len <= 16777215) {
this._shift(start, len, 1);
this._buf[seq] = 131;
this._buf[seq + 1] = len >> 16;
this._buf[seq + 2] = len >> 8;
this._buf[seq + 3] = len;
} else {
throw newInvalidAsn1Error("Sequence too long");
}
};
Writer.prototype._shift = function(start, len, shift) {
assert.ok(start !== void 0);
assert.ok(len !== void 0);
assert.ok(shift);
this._buf.copy(this._buf, start + shift, start, start + len);
this._offset += shift;
};
Writer.prototype._ensure = function(len) {
assert.ok(len);
if (this._size - this._offset < len) {
var sz = this._size * this._options.growthFactor;
if (sz - this._offset < len)
sz += len;
var buf = Buffer2.alloc(sz);
this._buf.copy(buf, 0, 0, this._offset);
this._buf = buf;
this._size = sz;
}
};
module2.exports = Writer;
}
});
// node_modules/asn1/lib/ber/index.js
var require_ber = __commonJS({
"node_modules/asn1/lib/ber/index.js"(exports, module2) {
var errors = require_errors3();
var types = require_types();
var Reader = require_reader();
var Writer = require_writer();
module2.exports = {
Reader,
Writer
};
for (t in types) {
if (types.hasOwnProperty(t))
module2.exports[t] = types[t];
}
var t;
for (e in errors) {
if (errors.hasOwnProperty(e))
module2.exports[e] = errors[e];
}
var e;
}
});
// node_modules/asn1/lib/index.js
var require_lib = __commonJS({
"node_modules/asn1/lib/index.js"(exports, module2) {
var Ber = require_ber();
module2.exports = {
Ber,
BerReader: Ber.Reader,
BerWriter: Ber.Writer
};
}
});
// node_modules/jsbn/index.js
var require_jsbn = __commonJS({
"node_modules/jsbn/index.js"(exports, module2) {
(function() {
var dbits;
var canary = 244837814094590;
var j_lm = (canary & 16777215) == 15715070;
function BigInteger(a, b, c) {
if (a != null)
if (typeof a == "number")
this.fromNumber(a, b, c);
else if (b == null && typeof a != "string")
this.fromString(a, 256);
else
this.fromString(a, b);
}
function nbi() {
return new BigInteger(null);
}
function am1(i, x, w, j, c, n) {
while (--n >= 0) {
var v = x * this[i++] + w[j] + c;
c = Math.floor(v / 67108864);
w[j++] = v & 67108863;
}
return c;
}
function am2(i, x, w, j, c, n) {
var xl = x & 32767, xh = x >> 15;
while (--n >= 0) {
var l = this[i] & 32767;
var h = this[i++] >> 15;
var m = xh * l + h * xl;
l = xl * l + ((m & 32767) << 15) + w[j] + (c & 1073741823);
c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
w[j++] = l & 1073741823;
}
return c;
}
function am3(i, x, w, j, c, n) {
var xl = x & 16383, xh = x >> 14;
while (--n >= 0) {
var l = this[i] & 16383;
var h = this[i++] >> 14;
var m = xh * l + h * xl;
l = xl * l + ((m & 16383) << 14) + w[j] + c;
c = (l >> 28) + (m >> 14) + xh * h;
w[j++] = l & 268435455;
}
return c;
}
var inBrowser = typeof navigator !== "undefined";
if (inBrowser && j_lm && navigator.appName == "Microsoft Internet Explorer") {
BigInteger.prototype.am = am2;
dbits = 30;
} else if (inBrowser && j_lm && navigator.appName != "Netscape") {
BigInteger.prototype.am = am1;
dbits = 26;
} else {
BigInteger.prototype.am = am3;
dbits = 28;
}
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = (1 << dbits) - 1;
BigInteger.prototype.DV = 1 << dbits;
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv)
BI_RC[rr++] = vv;
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv)
BI_RC[rr++] = vv;
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv)
BI_RC[rr++] = vv;
function int2char(n) {
return BI_RM.charAt(n);
}
function intAt(s, i) {
var c = BI_RC[s.charCodeAt(i)];
return c == null ? -1 : c;
}
function bnpCopyTo(r) {
for (var i = this.t - 1; i >= 0; --i)
r[i] = this[i];
r.t = this.t;
r.s = this.s;
}
function bnpFromInt(x) {
this.t = 1;
this.s = x < 0 ? -1 : 0;
if (x > 0)
this[0] = x;
else if (x < -1)
this[0] = x + this.DV;
else
this.t = 0;
}
function nbv(i) {
var r = nbi();
r.fromInt(i);
return r;
}
function bnpFromString(s, b) {
var k;
if (b == 16)
k = 4;
else if (b == 8)
k = 3;
else if (b == 256)
k = 8;
else if (b == 2)
k = 1;
else if (b == 32)
k = 5;
else if (b == 4)
k = 2;
else {
this.fromRadix(s, b);
return;
}
this.t = 0;
this.s = 0;
var i = s.length, mi = false, sh = 0;
while (--i >= 0) {
var x = k == 8 ? s[i] & 255 : intAt(s, i);
if (x < 0) {
if (s.charAt(i) == "-")
mi = true;
continue;
}
mi = false;
if (sh == 0)
this[this.t++] = x;
else if (sh + k > this.DB) {
this[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh;
this[this.t++] = x >> this.DB - sh;
} else
this[this.t - 1] |= x << sh;
sh += k;
if (sh >= this.DB)
sh -= this.DB;
}
if (k == 8 && (s[0] & 128) != 0) {
this.s = -1;
if (sh > 0)
this[this.t - 1] |= (1 << this.DB - sh) - 1 << sh;
}
this.clamp();
if (mi)
BigInteger.ZERO.subTo(this, this);
}
function bnpClamp() {
var c = this.s & this.DM;
while (this.t > 0 && this[this.t - 1] == c)
--this.t;
}
function bnToString(b) {
if (this.s < 0)
return "-" + this.negate().toString(b);
var k;
if (b == 16)
k = 4;
else if (b == 8)
k = 3;
else if (b == 2)
k = 1;
else if (b == 32)
k = 5;
else if (b == 4)
k = 2;
else
return this.toRadix(b);
var km = (1 << k) - 1, d, m = false, r = "", i = this.t;
var p = this.DB - i * this.DB % k;
if (i-- > 0) {
if (p < this.DB && (d = this[i] >> p) > 0) {
m = true;
r = int2char(d);
}
while (i >= 0) {
if (p < k) {
d = (this[i] & (1 << p) - 1) << k - p;
d |= this[--i] >> (p += this.DB - k);
} else {
d = this[i] >> (p -= k) & km;
if (p <= 0) {
p += this.DB;
--i;
}
}
if (d > 0)
m = true;
if (m)
r += int2char(d);
}
}
return m ? r : "0";
}
function bnNegate() {
var r = nbi();
BigInteger.ZERO.subTo(this, r);
return r;
}
function bnAbs() {
return this.s < 0 ? this.negate() : this;
}
function bnCompareTo(a) {
var r = this.s - a.s;
if (r != 0)
return r;
var i = this.t;
r = i - a.t;
if (r != 0)
return this.s < 0 ? -r : r;
while (--i >= 0)
if ((r = this[i] - a[i]) != 0)
return r;
return 0;
}
function nbits(x) {
var r = 1, t2;
if ((t2 = x >>> 16) != 0) {
x = t2;
r += 16;
}
if ((t2 = x >> 8) != 0) {
x = t2;
r += 8;
}
if ((t2 = x >> 4) != 0) {
x = t2;
r += 4;
}
if ((t2 = x >> 2) != 0) {
x = t2;
r += 2;
}
if ((t2 = x >> 1) != 0) {
x = t2;
r += 1;
}
return r;
}
function bnBitLength() {
if (this.t <= 0)
return 0;
return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM);
}
function bnpDLShiftTo(n, r) {
var i;
for (i = this.t - 1; i >= 0; --i)
r[i + n] = this[i];
for (i = n - 1; i >= 0; --i)
r[i] = 0;
r.t = this.t + n;
r.s = this.s;
}
function bnpDRShiftTo(n, r) {
for (var i = n; i < this.t; ++i)
r[i - n] = this[i];
r.t = Math.max(this.t - n, 0);
r.s = this.s;
}
function bnpLShiftTo(n, r) {
var bs = n % this.DB;
var cbs = this.DB - bs;
var bm = (1 << cbs) - 1;
var ds = Math.floor(n / this.DB), c = this.s << bs & this.DM, i;
for (i = this.t - 1; i >= 0; --i) {
r[i + ds + 1] = this[i] >> cbs | c;
c = (this[i] & bm) << bs;
}
for (i = ds - 1; i >= 0; --i)
r[i] = 0;
r[ds] = c;
r.t = this.t + ds + 1;
r.s = this.s;
r.clamp();
}
function bnpRShiftTo(n, r) {
r.s = this.s;
var ds = Math.floor(n / this.DB);
if (ds >= this.t) {
r.t = 0;
return;
}
var bs = n % this.DB;
var cbs = this.DB - bs;
var bm = (1 << bs) - 1;
r[0] = this[ds] >> bs;
for (var i = ds + 1; i < this.t; ++i) {
r[i - ds - 1] |= (this[i] & bm) << cbs;
r[i - ds] = this[i] >> bs;
}
if (bs > 0)
r[this.t - ds - 1] |= (this.s & bm) << cbs;
r.t = this.t - ds;
r.clamp();
}
function bnpSubTo(a, r) {
var i = 0, c = 0, m = Math.min(a.t, this.t);
while (i < m) {
c += this[i] - a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
if (a.t < this.t) {
c -= a.s;
while (i < this.t) {
c += this[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c += this.s;
} else {
c += this.s;
while (i < a.t) {
c -= a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c -= a.s;
}
r.s = c < 0 ? -1 : 0;
if (c < -1)
r[i++] = this.DV + c;
else if (c > 0)
r[i++] = c;
r.t = i;
r.clamp();
}
function bnpMultiplyTo(a, r) {
var x = this.abs(), y = a.abs();
var i = x.t;
r.t = i + y.t;
while (--i >= 0)
r[i] = 0;
for (i = 0; i < y.t; ++i)
r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
r.s = 0;
r.clamp();
if (this.s != a.s)
BigInteger.ZERO.subTo(r, r);
}
function bnpSquareTo(r) {
var x = this.abs();
var i = r.t = 2 * x.t;
while (--i >= 0)
r[i] = 0;
for (i = 0; i < x.t - 1; ++i) {
var c = x.am(i, x[i], r, 2 * i, 0, 1);
if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {
r[i + x.t] -= x.DV;
r[i + x.t + 1] = 1;
}
}
if (r.t > 0)
r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
r.s = 0;
r.clamp();
}
function bnpDivRemTo(m, q2, r) {
var pm = m.abs();
if (pm.t <= 0)
return;
var pt = this.abs();
if (pt.t < pm.t) {
if (q2 != null)
q2.fromInt(0);
if (r != null)
this.copyTo(r);
return;
}
if (r == null)
r = nbi();
var y = nbi(), ts = this.s, ms = m.s;
var nsh = this.DB - nbits(pm[pm.t - 1]);
if (nsh > 0) {
pm.lShiftTo(nsh, y);
pt.lShiftTo(nsh, r);
} else {
pm.copyTo(y);
pt.copyTo(r);
}
var ys = y.t;
var y0 = y[ys - 1];
if (y0 == 0)
return;
var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0);
var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2;
var i = r.t, j = i - ys, t2 = q2 == null ? nbi() : q2;
y.dlShiftTo(j, t2);
if (r.compareTo(t2) >= 0) {
r[r.t++] = 1;
r.subTo(t2, r);
}
BigInteger.ONE.dlShiftTo(ys, t2);
t2.subTo(y, y);
while (y.t < ys)
y[y.t++] = 0;
while (--j >= 0) {
var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) {
y.dlShiftTo(j, t2);
r.subTo(t2, r);
while (r[i] < --qd)
r.subTo(t2, r);
}
}
if (q2 != null) {
r.drShiftTo(ys, q2);
if (ts != ms)
BigInteger.ZERO.subTo(q2, q2);
}
r.t = ys;
r.clamp();
if (nsh > 0)
r.rShiftTo(nsh, r);
if (ts < 0)
BigInteger.ZERO.subTo(r, r);
}
function bnMod(a) {
var r = nbi();
this.abs().divRemTo(a, null, r);
if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0)
a.subTo(r, r);
return r;
}
function Classic(m) {
this.m = m;
}
function cConvert(x) {
if (x.s < 0 || x.compareTo(this.m) >= 0)
return x.mod(this.m);
else
return x;
}
function cRevert(x) {
return x;
}
function cReduce(x) {
x.divRemTo(this.m, null, x);
}
function cMulTo(x, y, r) {
x.multiplyTo(y, r);
this.reduce(r);
}
function cSqrTo(x, r) {
x.squareTo(r);
this.reduce(r);
}
Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;
function bnpInvDigit() {
if (this.t < 1)
return 0;
var x = this[0];
if ((x & 1) == 0)
return 0;
var y = x & 3;
y = y * (2 - (x & 15) * y) & 15;
y = y * (2 - (x & 255) * y) & 255;
y = y * (2 - ((x & 65535) * y & 65535)) & 65535;
y = y * (2 - x * y % this.DV) % this.DV;
return y > 0 ? this.DV - y : -y;
}
function Montgomery(m) {
this.m = m;
this.mp = m.invDigit();
this.mpl = this.mp & 32767;
this.mph = this.mp >> 15;
this.um = (1 << m.DB - 15) - 1;
this.mt2 = 2 * m.t;
}
function montConvert(x) {
var r = nbi();
x.abs().dlShiftTo(this.m.t, r);
r.divRemTo(this.m, null, r);
if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0)
this.m.subTo(r, r);
return r;
}
function montRevert(x) {
var r = nbi();
x.copyTo(r);
this.reduce(r);
return r;
}
function montReduce(x) {
while (x.t <= this.mt2)
x[x.t++] = 0;
for (var i = 0; i < this.m.t; ++i) {
var j = x[i] & 32767;
var u0 = j * this.mpl + ((j * this.mph + (x[i] >> 15) * this.mpl & this.um) << 15) & x.DM;
j = i + this.m.t;
x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
while (x[j] >= x.DV) {
x[j] -= x.DV;
x[++j]++;
}
}
x.clamp();
x.drShiftTo(this.m.t, x);
if (x.compareTo(this.m) >= 0)
x.subTo(this.m, x);
}
function montSqrTo(x, r) {
x.squareTo(r);
this.reduce(r);
}
function montMulTo(x, y, r) {
x.multiplyTo(y, r);
this.reduce(r);
}
Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;
function bnpIsEven() {
return (this.t > 0 ? this[0] & 1 : this.s) == 0;
}
function bnpExp(e, z2) {
if (e > 4294967295 || e < 1)
return BigInteger.ONE;
var r = nbi(), r2 = nbi(), g = z2.convert(this), i = nbits(e) - 1;
g.copyTo(r);
while (--i >= 0) {
z2.sqrTo(r, r2);
if ((e & 1 << i) > 0)
z2.mulTo(r2, g, r);
else {
var t2 = r;
r = r2;
r2 = t2;
}
}
return z2.revert(r);
}
function bnModPowInt(e, m) {
var z2;
if (e < 256 || m.isEven())
z2 = new Classic(m);
else
z2 = new Montgomery(m);
return this.exp(e, z2);
}
BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);
function bnClone() {
var r = nbi();
this.copyTo(r);
return r;
}
function bnIntValue() {
if (this.s < 0) {
if (this.t == 1)
return this[0] - this.DV;
else if (this.t == 0)
return -1;
} else if (this.t == 1)
return this[0];
else if (this.t == 0)
return 0;
return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
}
function bnByteValue() {
return this.t == 0 ? this.s : this[0] << 24 >> 24;
}
function bnShortValue() {
return this.t == 0 ? this.s : this[0] << 16 >> 16;
}
function bnpChunkSize(r) {
return Math.floor(Math.LN2 * this.DB / Math.log(r));
}
function bnSigNum() {
if (this.s < 0)
return -1;
else if (this.t <= 0 || this.t == 1 && this[0] <= 0)
return 0;
else
return 1;
}
function bnpToRadix(b) {
if (b == null)
b = 10;
if (this.signum() == 0 || b < 2 || b > 36)
return "0";
var cs = this.chunkSize(b);
var a = Math.pow(b, cs);
var d = nbv(a), y = nbi(), z2 = nbi(), r = "";
this.divRemTo(d, y, z2);
while (y.signum() > 0) {
r = (a + z2.intValue()).toString(b).substr(1) + r;
y.divRemTo(d, y, z2);
}
return z2.intValue().toString(b) + r;
}
function bnpFromRadix(s, b) {
this.fromInt(0);
if (b == null)
b = 10;
var cs = this.chunkSize(b);
var d = Math.pow(b, cs), mi = false, j = 0, w = 0;
for (var i = 0; i < s.length; ++i) {
var x = intAt(s, i);
if (x < 0) {
if (s.charAt(i) == "-" && this.signum() == 0)
mi = true;
continue;
}
w = b * w + x;
if (++j >= cs) {
this.dMultiply(d);
this.dAddOffset(w, 0);
j = 0;
w = 0;
}
}
if (j > 0) {
this.dMultiply(Math.pow(b, j));
this.dAddOffset(w, 0);
}
if (mi)
BigInteger.ZERO.subTo(this, this);
}
function bnpFromNumber(a, b, c) {
if (typeof b == "number") {
if (a < 2)
this.fromInt(1);
else {
this.fromNumber(a, c);
if (!this.testBit(a - 1))
this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
if (this.isEven())
this.dAddOffset(1, 0);
while (!this.isProbablePrime(b)) {
this.dAddOffset(2, 0);
if (this.bitLength() > a)
this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
}
}
} else {
var x = new Array(), t2 = a & 7;
x.length = (a >> 3) + 1;
b.nextBytes(x);
if (t2 > 0)
x[0] &= (1 << t2) - 1;
else
x[0] = 0;
this.fromString(x, 256);
}
}
function bnToByteArray() {
var i = this.t, r = new Array();
r[0] = this.s;
var p = this.DB - i * this.DB % 8, d, k = 0;
if (i-- > 0) {
if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p)
r[k++] = d | this.s << this.DB - p;
while (i >= 0) {
if (p < 8) {
d = (this[i] & (1 << p) - 1) << 8 - p;
d |= this[--i] >> (p += this.DB - 8);
} else {
d = this[i] >> (p -= 8) & 255;
if (p <= 0) {
p += this.DB;
--i;
}
}
if ((d & 128) != 0)
d |= -256;
if (k == 0 && (this.s & 128) != (d & 128))
++k;
if (k > 0 || d != this.s)
r[k++] = d;
}
}
return r;
}
function bnEquals(a) {
return this.compareTo(a) == 0;
}
function bnMin(a) {
return this.compareTo(a) < 0 ? this : a;
}
function bnMax(a) {
return this.compareTo(a) > 0 ? this : a;
}
function bnpBitwiseTo(a, op, r) {
var i, f, m = Math.min(a.t, this.t);
for (i = 0; i < m; ++i)
r[i] = op(this[i], a[i]);
if (a.t < this.t) {
f = a.s & this.DM;
for (i = m; i < this.t; ++i)
r[i] = op(this[i], f);
r.t = this.t;
} else {
f = this.s & this.DM;
for (i = m; i < a.t; ++i)
r[i] = op(f, a[i]);
r.t = a.t;
}
r.s = op(this.s, a.s);
r.clamp();
}
function op_and(x, y) {
return x & y;
}
function bnAnd(a) {
var r = nbi();
this.bitwiseTo(a, op_and, r);
return r;
}
function op_or(x, y) {
return x | y;
}
function bnOr(a) {
var r = nbi();
this.bitwiseTo(a, op_or, r);
return r;
}
function op_xor(x, y) {
return x ^ y;
}
function bnXor(a) {
var r = nbi();
this.bitwiseTo(a, op_xor, r);
return r;
}
function op_andnot(x, y) {
return x & ~y;
}
function bnAndNot(a) {
var r = nbi();
this.bitwiseTo(a, op_andnot, r);
return r;
}
function bnNot() {
var r = nbi();
for (var i = 0; i < this.t; ++i)
r[i] = this.DM & ~this[i];
r.t = this.t;
r.s = ~this.s;
return r;
}
function bnShiftLeft(n) {
var r = nbi();
if (n < 0)
this.rShiftTo(-n, r);
else
this.lShiftTo(n, r);
return r;
}
function bnShiftRight(n) {
var r = nbi();
if (n < 0)
this.lShiftTo(-n, r);
else
this.rShiftTo(n, r);
return r;
}
function lbit(x) {
if (x == 0)
return -1;
var r = 0;
if ((x & 65535) == 0) {
x >>= 16;
r += 16;
}
if ((x & 255) == 0) {
x >>= 8;
r += 8;
}
if ((x & 15) == 0) {
x >>= 4;
r += 4;
}
if ((x & 3) == 0) {
x >>= 2;
r += 2;
}
if ((x & 1) == 0)
++r;
return r;
}
function bnGetLowestSetBit() {
for (var i = 0; i < this.t; ++i)
if (this[i] != 0)
return i * this.DB + lbit(this[i]);
if (this.s < 0)
return this.t * this.DB;
return -1;
}
function cbit(x) {
var r = 0;
while (x != 0) {
x &= x - 1;
++r;
}
return r;
}
function bnBitCount() {
var r = 0, x = this.s & this.DM;
for (var i = 0; i < this.t; ++i)
r += cbit(this[i] ^ x);
return r;
}
function bnTestBit(n) {
var j = Math.floor(n / this.DB);
if (j >= this.t)
return this.s != 0;
return (this[j] & 1 << n % this.DB) != 0;
}
function bnpChangeBit(n, op) {
var r = BigInteger.ONE.shiftLeft(n);
this.bitwiseTo(r, op, r);
return r;
}
function bnSetBit(n) {
return this.changeBit(n, op_or);
}
function bnClearBit(n) {
return this.changeBit(n, op_andnot);
}
function bnFlipBit(n) {
return this.changeBit(n, op_xor);
}
function bnpAddTo(a, r) {
var i = 0, c = 0, m = Math.min(a.t, this.t);
while (i < m) {
c += this[i] + a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
if (a.t < this.t) {
c += a.s;
while (i < this.t) {
c += this[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c += this.s;
} else {
c += this.s;
while (i < a.t) {
c += a[i];
r[i++] = c & this.DM;
c >>= this.DB;
}
c += a.s;
}
r.s = c < 0 ? -1 : 0;
if (c > 0)
r[i++] = c;
else if (c < -1)
r[i++] = this.DV + c;
r.t = i;
r.clamp();
}
function bnAdd(a) {
var r = nbi();
this.addTo(a, r);
return r;
}
function bnSubtract(a) {
var r = nbi();
this.subTo(a, r);
return r;
}
function bnMultiply(a) {
var r = nbi();
this.multiplyTo(a, r);
return r;
}
function bnSquare() {
var r = nbi();
this.squareTo(r);
return r;
}
function bnDivide(a) {
var r = nbi();
this.divRemTo(a, r, null);
return r;
}
function bnRemainder(a) {
var r = nbi();
this.divRemTo(a, null, r);
return r;
}
function bnDivideAndRemainder(a) {
var q2 = nbi(), r = nbi();
this.divRemTo(a, q2, r);
return new Array(q2, r);
}
function bnpDMultiply(n) {
this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
++this.t;
this.clamp();
}
function bnpDAddOffset(n, w) {
if (n == 0)
return;
while (this.t <= w)
this[this.t++] = 0;
this[w] += n;
while (this[w] >= this.DV) {
this[w] -= this.DV;
if (++w >= this.t)
this[this.t++] = 0;
++this[w];
}
}
function NullExp() {
}
function nNop(x) {
return x;
}
function nMulTo(x, y, r) {
x.multiplyTo(y, r);
}
function nSqrTo(x, r) {
x.squareTo(r);
}
NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;
function bnPow(e) {
return this.exp(e, new NullExp());
}
function bnpMultiplyLowerTo(a, n, r) {
var i = Math.min(this.t + a.t, n);
r.s = 0;
r.t = i;
while (i > 0)
r[--i] = 0;
var j;
for (j = r.t - this.t; i < j; ++i)
r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
for (j = Math.min(a.t, n); i < j; ++i)
this.am(0, a[i], r, i, 0, n - i);
r.clamp();
}
function bnpMultiplyUpperTo(a, n, r) {
--n;
var i = r.t = this.t + a.t - n;
r.s = 0;
while (--i >= 0)
r[i] = 0;
for (i = Math.max(n - this.t, 0); i < a.t; ++i)
r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
r.clamp();
r.drShiftTo(1, r);
}
function Barrett(m) {
this.r2 = nbi();
this.q3 = nbi();
BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
this.mu = this.r2.divide(m);
this.m = m;
}
function barrettConvert(x) {
if (x.s < 0 || x.t > 2 * this.m.t)
return x.mod(this.m);
else if (x.compareTo(this.m) < 0)
return x;
else {
var r = nbi();
x.copyTo(r);
this.reduce(r);
return r;
}
}
function barrettRevert(x) {
return x;
}
function barrettReduce(x) {
x.drShiftTo(this.m.t - 1, this.r2);
if (x.t > this.m.t + 1) {
x.t = this.m.t + 1;
x.clamp();
}
this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
while (x.compareTo(this.r2) < 0)
x.dAddOffset(1, this.m.t + 1);
x.subTo(this.r2, x);
while (x.compareTo(this.m) >= 0)
x.subTo(this.m, x);
}
function barrettSqrTo(x, r) {
x.squareTo(r);
this.reduce(r);
}
function barrettMulTo(x, y, r) {
x.multiplyTo(y, r);
this.reduce(r);
}
Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;
function bnModPow(e, m) {
var i = e.bitLength(), k, r = nbv(1), z2;
if (i <= 0)
return r;
else if (i < 18)
k = 1;
else if (i < 48)
k = 3;
else if (i < 144)
k = 4;
else if (i < 768)
k = 5;
else
k = 6;
if (i < 8)
z2 = new Classic(m);
else if (m.isEven())
z2 = new Barrett(m);
else
z2 = new Montgomery(m);
var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1;
g[1] = z2.convert(this);
if (k > 1) {
var g2 = nbi();
z2.sqrTo(g[1], g2);
while (n <= km) {
g[n] = nbi();
z2.mulTo(g2, g[n - 2], g[n]);
n += 2;
}
}
var j = e.t - 1, w, is1 = true, r2 = nbi(), t2;
i = nbits(e[j]) - 1;
while (j >= 0) {
if (i >= k1)
w = e[j] >> i - k1 & km;
else {
w = (e[j] & (1 << i + 1) - 1) << k1 - i;
if (j > 0)
w |= e[j - 1] >> this.DB + i - k1;
}
n = k;
while ((w & 1) == 0) {
w >>= 1;
--n;
}
if ((i -= n) < 0) {
i += this.DB;
--j;
}
if (is1) {
g[w].copyTo(r);
is1 = false;
} else {
while (n > 1) {
z2.sqrTo(r, r2);
z2.sqrTo(r2, r);
n -= 2;
}
if (n > 0)
z2.sqrTo(r, r2);
else {
t2 = r;
r = r2;
r2 = t2;
}
z2.mulTo(r2, g[w], r);
}
while (j >= 0 && (e[j] & 1 << i) == 0) {
z2.sqrTo(r, r2);
t2 = r;
r = r2;
r2 = t2;
if (--i < 0) {
i = this.DB - 1;
--j;
}
}
}
return z2.revert(r);
}
function bnGCD(a) {
var x = this.s < 0 ? this.negate() : this.clone();
var y = a.s < 0 ? a.negate() : a.clone();
if (x.compareTo(y) < 0) {
var t2 = x;
x = y;
y = t2;
}
var i = x.getLowestSetBit(), g = y.getLowestSetBit();
if (g < 0)
return x;
if (i < g)
g = i;
if (g > 0) {
x.rShiftTo(g, x);
y.rShiftTo(g, y);
}
while (x.signum() > 0) {
if ((i = x.getLowestSetBit()) > 0)
x.rShiftTo(i, x);
if ((i = y.getLowestSetBit()) > 0)
y.rShiftTo(i, y);
if (x.compareTo(y) >= 0) {
x.subTo(y, x);
x.rShiftTo(1, x);
} else {
y.subTo(x, y);
y.rShiftTo(1, y);
}
}
if (g > 0)
y.lShiftTo(g, y);
return y;
}
function bnpModInt(n) {
if (n <= 0)
return 0;
var d = this.DV % n, r = this.s < 0 ? n - 1 : 0;
if (this.t > 0)
if (d == 0)
r = this[0] % n;
else
for (var i = this.t - 1; i >= 0; --i)
r = (d * r + this[i]) % n;
return r;
}
function bnModInverse(m) {
var ac = m.isEven();
if (this.isEven() && ac || m.signum() == 0)
return BigInteger.ZERO;
var u = m.clone(), v = this.clone();
var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
while (u.signum() != 0) {
while (u.isEven()) {
u.rShiftTo(1, u);
if (ac) {
if (!a.isEven() || !b.isEven()) {
a.addTo(this, a);
b.subTo(m, b);
}
a.rShiftTo(1, a);
} else if (!b.isEven())
b.subTo(m, b);
b.rShiftTo(1, b);
}
while (v.isEven()) {
v.rShiftTo(1, v);
if (ac) {
if (!c.isEven() || !d.isEven()) {
c.addTo(this, c);
d.subTo(m, d);
}
c.rShiftTo(1, c);
} else if (!d.isEven())
d.subTo(m, d);
d.rShiftTo(1, d);
}
if (u.compareTo(v) >= 0) {
u.subTo(v, u);
if (ac)
a.subTo(c, a);
b.subTo(d, b);
} else {
v.subTo(u, v);
if (ac)
c.subTo(a, c);
d.subTo(b, d);
}
}
if (v.compareTo(BigInteger.ONE) != 0)
return BigInteger.ZERO;
if (d.compareTo(m) >= 0)
return d.subtract(m);
if (d.signum() < 0)
d.addTo(m, d);
else
return d;
if (d.signum() < 0)
return d.add(m);
else
return d;
}
var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
function bnIsProbablePrime(t2) {
var i, x = this.abs();
if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
for (i = 0; i < lowprimes.length; ++i)
if (x[0] == lowprimes[i])
return true;
return false;
}
if (x.isEven())
return false;
i = 1;
while (i < lowprimes.length) {
var m = lowprimes[i], j = i + 1;
while (j < lowprimes.length && m < lplim)
m *= lowprimes[j++];
m = x.modInt(m);
while (i < j)
if (m % lowprimes[i++] == 0)
return false;
}
return x.millerRabin(t2);
}
function bnpMillerRabin(t2) {
var n1 = this.subtract(BigInteger.ONE);
var k = n1.getLowestSetBit();
if (k <= 0)
return false;
var r = n1.shiftRight(k);
t2 = t2 + 1 >> 1;
if (t2 > lowprimes.length)
t2 = lowprimes.length;
var a = nbi();
for (var i = 0; i < t2; ++i) {
a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
var y = a.modPow(r, this);
if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
var j = 1;
while (j++ < k && y.compareTo(n1) != 0) {
y = y.modPowInt(2, this);
if (y.compareTo(BigInteger.ONE) == 0)
return false;
}
if (y.compareTo(n1) != 0)
return false;
}
}
return true;
}
BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
BigInteger.prototype.square = bnSquare;
BigInteger.prototype.Barrett = Barrett;
var rng_state;
var rng_pool;
var rng_pptr;
function rng_seed_int(x) {
rng_pool[rng_pptr++] ^= x & 255;
rng_pool[rng_pptr++] ^= x >> 8 & 255;
rng_pool[rng_pptr++] ^= x >> 16 & 255;
rng_pool[rng_pptr++] ^= x >> 24 & 255;
if (rng_pptr >= rng_psize)
rng_pptr -= rng_psize;
}
function rng_seed_time() {
rng_seed_int(new Date().getTime());
}
if (rng_pool == null) {
rng_pool = new Array();
rng_pptr = 0;
var t;
if (typeof window !== "undefined" && window.crypto) {
if (window.crypto.getRandomValues) {
var ua = new Uint8Array(32);
window.crypto.getRandomValues(ua);
for (t = 0; t < 32; ++t)
rng_pool[rng_pptr++] = ua[t];
} else if (navigator.appName == "Netscape" && navigator.appVersion < "5") {
var z = window.crypto.random(32);
for (t = 0; t < z.length; ++t)
rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
}
}
while (rng_pptr < rng_psize) {
t = Math.floor(65536 * Math.random());
rng_pool[rng_pptr++] = t >>> 8;
rng_pool[rng_pptr++] = t & 255;
}
rng_pptr = 0;
rng_seed_time();
}
function rng_get_byte() {
if (rng_state == null) {
rng_seed_time();
rng_state = prng_newstate();
rng_state.init(rng_pool);
for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
rng_pool[rng_pptr] = 0;
rng_pptr = 0;
}
return rng_state.next();
}
function rng_get_bytes(ba) {
var i;
for (i = 0; i < ba.length; ++i)
ba[i] = rng_get_byte();
}
function SecureRandom2() {
}
SecureRandom2.prototype.nextBytes = rng_get_bytes;
function Arcfour() {
this.i = 0;
this.j = 0;
this.S = new Array();
}
function ARC4init(key) {
var i, j, t2;
for (i = 0; i < 256; ++i)
this.S[i] = i;
j = 0;
for (i = 0; i < 256; ++i) {
j = j + this.S[i] + key[i % key.length] & 255;
t2 = this.S[i];
this.S[i] = this.S[j];
this.S[j] = t2;
}
this.i = 0;
this.j = 0;
}
function ARC4next() {
var t2;
this.i = this.i + 1 & 255;
this.j = this.j + this.S[this.i] & 255;
t2 = this.S[this.i];
this.S[this.i] = this.S[this.j];
this.S[this.j] = t2;
return this.S[t2 + this.S[this.i] & 255];
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;
function prng_newstate() {
return new Arcfour();
}
var rng_psize = 256;
BigInteger.SecureRandom = SecureRandom2;
BigInteger.BigInteger = BigInteger;
if (typeof exports !== "undefined") {
exports = module2.exports = BigInteger;
} else {
this.BigInteger = BigInteger;
this.SecureRandom = SecureRandom2;
}
}).call(exports);
}
});
// node_modules/ecc-jsbn/lib/ec.js
var require_ec = __commonJS({
"node_modules/ecc-jsbn/lib/ec.js"(exports, module2) {
var BigInteger = require_jsbn().BigInteger;
var Barrett = BigInteger.prototype.Barrett;
function ECFieldElementFp(q2, x) {
this.x = x;
this.q = q2;
}
function feFpEquals(other) {
if (other == this)
return true;
return this.q.equals(other.q) && this.x.equals(other.x);
}
function feFpToBigInteger() {
return this.x;
}
function feFpNegate() {
return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
}
function feFpAdd(b) {
return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
}
function feFpSubtract(b) {
return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
}
function feFpMultiply(b) {
return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
}
function feFpSquare() {
return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
}
function feFpDivide(b) {
return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
}
ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;
function ECPointFp(curve, x, y, z) {
this.curve = curve;
this.x = x;
this.y = y;
if (z == null) {
this.z = BigInteger.ONE;
} else {
this.z = z;
}
this.zinv = null;
}
function pointFpGetX() {
if (this.zinv == null) {
this.zinv = this.z.modInverse(this.curve.q);
}
var r = this.x.toBigInteger().multiply(this.zinv);
this.curve.reduce(r);
return this.curve.fromBigInteger(r);
}
function pointFpGetY() {
if (this.zinv == null) {
this.zinv = this.z.modInverse(this.curve.q);
}
var r = this.y.toBigInteger().multiply(this.zinv);
this.curve.reduce(r);
return this.curve.fromBigInteger(r);
}
function pointFpEquals(other) {
if (other == this)
return true;
if (this.isInfinity())
return other.isInfinity();
if (other.isInfinity())
return this.isInfinity();
var u, v;
u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);
if (!u.equals(BigInteger.ZERO))
return false;
v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);
return v.equals(BigInteger.ZERO);
}
function pointFpIsInfinity() {
if (this.x == null && this.y == null)
return true;
return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
}
function pointFpNegate() {
return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
}
function pointFpAdd(b) {
if (this.isInfinity())
return b;
if (b.isInfinity())
return this;
var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);
var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);
if (BigInteger.ZERO.equals(v)) {
if (BigInteger.ZERO.equals(u)) {
return this.twice();
}
return this.curve.getInfinity();
}
var THREE = new BigInteger("3");
var x1 = this.x.toBigInteger();
var y1 = this.y.toBigInteger();
var x2 = b.x.toBigInteger();
var y2 = b.y.toBigInteger();
var v2 = v.square();
var v3 = v2.multiply(v);
var x1v2 = x1.multiply(v2);
var zu2 = u.square().multiply(this.z);
var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);
var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);
var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);
return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
}
function pointFpTwice() {
if (this.isInfinity())
return this;
if (this.y.toBigInteger().signum() == 0)
return this.curve.getInfinity();
var THREE = new BigInteger("3");
var x1 = this.x.toBigInteger();
var y1 = this.y.toBigInteger();
var y1z1 = y1.multiply(this.z);
var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);
var a = this.curve.a.toBigInteger();
var w = x1.square().multiply(THREE);
if (!BigInteger.ZERO.equals(a)) {
w = w.add(this.z.square().multiply(a));
}
w = w.mod(this.curve.q);
var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);
var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);
var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);
return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
}
function pointFpMultiply(k) {
if (this.isInfinity())
return this;
if (k.signum() == 0)
return this.curve.getInfinity();
var e = k;
var h = e.multiply(new BigInteger("3"));
var neg = this.negate();
var R = this;
var i;
for (i = h.bitLength() - 2; i > 0; --i) {
R = R.twice();
var hBit = h.testBit(i);
var eBit = e.testBit(i);
if (hBit != eBit) {
R = R.add(hBit ? this : neg);
}
}
return R;
}
function pointFpMultiplyTwo(j, x, k) {
var i;
if (j.bitLength() > k.bitLength())
i = j.bitLength() - 1;
else
i = k.bitLength() - 1;
var R = this.curve.getInfinity();
var both = this.add(x);
while (i >= 0) {
R = R.twice();
if (j.testBit(i)) {
if (k.testBit(i)) {
R = R.add(both);
} else {
R = R.add(this);
}
} else {
if (k.testBit(i)) {
R = R.add(x);
}
}
--i;
}
return R;
}
ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;
function ECCurveFp(q2, a, b) {
this.q = q2;
this.a = this.fromBigInteger(a);
this.b = this.fromBigInteger(b);
this.infinity = new ECPointFp(this, null, null);
this.reducer = new Barrett(this.q);
}
function curveFpGetQ() {
return this.q;
}
function curveFpGetA() {
return this.a;
}
function curveFpGetB() {
return this.b;
}
function curveFpEquals(other) {
if (other == this)
return true;
return this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b);
}
function curveFpGetInfinity() {
return this.infinity;
}
function curveFpFromBigInteger(x) {
return new ECFieldElementFp(this.q, x);
}
function curveReduce(x) {
this.reducer.reduce(x);
}
function curveFpEncodePointHex(p) {
if (p.isInfinity())
return "00";
var xHex = p.getX().toBigInteger().toString(16);
var yHex = p.getY().toBigInteger().toString(16);
var oLen = this.getQ().toString(16).length;
if (oLen % 2 != 0)
oLen++;
while (xHex.length < oLen) {
xHex = "0" + xHex;
}
while (yHex.length < oLen) {
yHex = "0" + yHex;
}
return "04" + xHex + yHex;
}
ECCurveFp.prototype.getQ = curveFpGetQ;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.reduce = curveReduce;
ECCurveFp.prototype.encodePointHex = curveFpEncodePointHex;
ECCurveFp.prototype.decodePointHex = function(s) {
var yIsEven;
switch (parseInt(s.substr(0, 2), 16)) {
case 0:
return this.infinity;
case 2:
yIsEven = false;
case 3:
if (yIsEven == void 0)
yIsEven = true;
var len = s.length - 2;
var xHex = s.substr(2, len);
var x = this.fromBigInteger(new BigInteger(xHex, 16));
var alpha = x.multiply(x.square().add(this.getA())).add(this.getB());
var beta = alpha.sqrt();
if (beta == null)
throw "Invalid point compression";
var betaValue = beta.toBigInteger();
if (betaValue.testBit(0) != yIsEven) {
beta = this.fromBigInteger(this.getQ().subtract(betaValue));
}
return new ECPointFp(this, x, beta);
case 4:
case 6:
case 7:
var len = (s.length - 2) / 2;
var xHex = s.substr(2, len);
var yHex = s.substr(len + 2, len);
return new ECPointFp(this, this.fromBigInteger(new BigInteger(xHex, 16)), this.fromBigInteger(new BigInteger(yHex, 16)));
default:
return null;
}
};
ECCurveFp.prototype.encodeCompressedPointHex = function(p) {
if (p.isInfinity())
return "00";
var xHex = p.getX().toBigInteger().toString(16);
var oLen = this.getQ().toString(16).length;
if (oLen % 2 != 0)
oLen++;
while (xHex.length < oLen)
xHex = "0" + xHex;
var yPrefix;
if (p.getY().toBigInteger().isEven())
yPrefix = "02";
else
yPrefix = "03";
return yPrefix + xHex;
};
ECFieldElementFp.prototype.getR = function() {
if (this.r != void 0)
return this.r;
this.r = null;
var bitLength = this.q.bitLength();
if (bitLength > 128) {
var firstWord = this.q.shiftRight(bitLength - 64);
if (firstWord.intValue() == -1) {
this.r = BigInteger.ONE.shiftLeft(bitLength).subtract(this.q);
}
}
return this.r;
};
ECFieldElementFp.prototype.modMult = function(x1, x2) {
return this.modReduce(x1.multiply(x2));
};
ECFieldElementFp.prototype.modReduce = function(x) {
if (this.getR() != null) {
var qLen = q.bitLength();
while (x.bitLength() > qLen + 1) {
var u = x.shiftRight(qLen);
var v = x.subtract(u.shiftLeft(qLen));
if (!this.getR().equals(BigInteger.ONE)) {
u = u.multiply(this.getR());
}
x = u.add(v);
}
while (x.compareTo(q) >= 0) {
x = x.subtract(q);
}
} else {
x = x.mod(q);
}
return x;
};
ECFieldElementFp.prototype.sqrt = function() {
if (!this.q.testBit(0))
throw "unsupported";
if (this.q.testBit(1)) {
var z = new ECFieldElementFp(this.q, this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE), this.q));
return z.square().equals(this) ? z : null;
}
var qMinusOne = this.q.subtract(BigInteger.ONE);
var legendreExponent = qMinusOne.shiftRight(1);
if (!this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE)) {
return null;
}
var u = qMinusOne.shiftRight(2);
var k = u.shiftLeft(1).add(BigInteger.ONE);
var Q = this.x;
var fourQ = modDouble(modDouble(Q));
var U, V;
do {
var P;
do {
P = new BigInteger(this.q.bitLength(), new SecureRandom());
} while (P.compareTo(this.q) >= 0 || !P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne));
var result = this.lucasSequence(P, Q, k);
U = result[0];
V = result[1];
if (this.modMult(V, V).equals(fourQ)) {
if (V.testBit(0)) {
V = V.add(q);
}
V = V.shiftRight(1);
return new ECFieldElementFp(q, V);
}
} while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));
return null;
};
ECFieldElementFp.prototype.lucasSequence = function(P, Q, k) {
var n = k.bitLength();
var s = k.getLowestSetBit();
var Uh = BigInteger.ONE;
var Vl = BigInteger.TWO;
var Vh = P;
var Ql = BigInteger.ONE;
var Qh = BigInteger.ONE;
for (var j = n - 1; j >= s + 1; --j) {
Ql = this.modMult(Ql, Qh);
if (k.testBit(j)) {
Qh = this.modMult(Ql, Q);
Uh = this.modMult(Uh, Vh);
Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
Vh = this.modReduce(Vh.multiply(Vh).subtract(Qh.shiftLeft(1)));
} else {
Qh = Ql;
Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));
Vh = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));
}
}
Ql = this.modMult(Ql, Qh);
Qh = this.modMult(Ql, Q);
Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));
Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
Ql = this.modMult(Ql, Qh);
for (var j = 1; j <= s; ++j) {
Uh = this.modMult(Uh, Vl);
Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));
Ql = this.modMult(Ql, Ql);
}
return [Uh, Vl];
};
var exports = {
ECCurveFp,
ECPointFp,
ECFieldElementFp
};
module2.exports = exports;
}
});
// node_modules/tweetnacl/nacl-fast.js
var require_nacl_fast = __commonJS({
"node_modules/tweetnacl/nacl-fast.js"(exports, module2) {
(function(nacl) {
"use strict";
var gf = function(init) {
var i, r = new Float64Array(16);
if (init)
for (i = 0; i < init.length; i++)
r[i] = init[i];
return r;
};
var randombytes = function() {
throw new Error("no PRNG");
};
var _0 = new Uint8Array(16);
var _9 = new Uint8Array(32);
_9[0] = 9;
var gf0 = gf(), gf1 = gf([1]), _121665 = gf([56129, 1]), D = gf([30883, 4953, 19914, 30187, 55467, 16705, 2637, 112, 59544, 30585, 16505, 36039, 65139, 11119, 27886, 20995]), D2 = gf([61785, 9906, 39828, 60374, 45398, 33411, 5274, 224, 53552, 61171, 33010, 6542, 64743, 22239, 55772, 9222]), X = gf([54554, 36645, 11616, 51542, 42930, 38181, 51040, 26924, 56412, 64982, 57905, 49316, 21502, 52590, 14035, 8553]), Y = gf([26200, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214]), I = gf([41136, 18958, 6951, 50414, 58488, 44335, 6150, 12099, 55207, 15867, 153, 11085, 57099, 20417, 9344, 11139]);
function ts64(x, i, h, l) {
x[i] = h >> 24 & 255;
x[i + 1] = h >> 16 & 255;
x[i + 2] = h >> 8 & 255;
x[i + 3] = h & 255;
x[i + 4] = l >> 24 & 255;
x[i + 5] = l >> 16 & 255;
x[i + 6] = l >> 8 & 255;
x[i + 7] = l & 255;
}
function vn(x, xi, y, yi, n) {
var i, d = 0;
for (i = 0; i < n; i++)
d |= x[xi + i] ^ y[yi + i];
return (1 & d - 1 >>> 8) - 1;
}
function crypto_verify_16(x, xi, y, yi) {
return vn(x, xi, y, yi, 16);
}
function crypto_verify_32(x, xi, y, yi) {
return vn(x, xi, y, yi, 32);
}
function core_salsa20(o, p, k, c) {
var j0 = c[0] & 255 | (c[1] & 255) << 8 | (c[2] & 255) << 16 | (c[3] & 255) << 24, j1 = k[0] & 255 | (k[1] & 255) << 8 | (k[2] & 255) << 16 | (k[3] & 255) << 24, j2 = k[4] & 255 | (k[5] & 255) << 8 | (k[6] & 255) << 16 | (k[7] & 255) << 24, j3 = k[8] & 255 | (k[9] & 255) << 8 | (k[10] & 255) << 16 | (k[11] & 255) << 24, j4 = k[12] & 255 | (k[13] & 255) << 8 | (k[14] & 255) << 16 | (k[15] & 255) << 24, j5 = c[4] & 255 | (c[5] & 255) << 8 | (c[6] & 255) << 16 | (c[7] & 255) << 24, j6 = p[0] & 255 | (p[1] & 255) << 8 | (p[2] & 255) << 16 | (p[3] & 255) << 24, j7 = p[4] & 255 | (p[5] & 255) << 8 | (p[6] & 255) << 16 | (p[7] & 255) << 24, j8 = p[8] & 255 | (p[9] & 255) << 8 | (p[10] & 255) << 16 | (p[11] & 255) << 24, j9 = p[12] & 255 | (p[13] & 255) << 8 | (p[14] & 255) << 16 | (p[15] & 255) << 24, j10 = c[8] & 255 | (c[9] & 255) << 8 | (c[10] & 255) << 16 | (c[11] & 255) << 24, j11 = k[16] & 255 | (k[17] & 255) << 8 | (k[18] & 255) << 16 | (k[19] & 255) << 24, j12 = k[20] & 255 | (k[21] & 255) << 8 | (k[22] & 255) << 16 | (k[23] & 255) << 24, j13 = k[24] & 255 | (k[25] & 255) << 8 | (k[26] & 255) << 16 | (k[27] & 255) << 24, j14 = k[28] & 255 | (k[29] & 255) << 8 | (k[30] & 255) << 16 | (k[31] & 255) << 24, j15 = c[12] & 255 | (c[13] & 255) << 8 | (c[14] & 255) << 16 | (c[15] & 255) << 24;
var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u;
for (var i = 0; i < 20; i += 2) {
u = x0 + x12 | 0;
x4 ^= u << 7 | u >>> 32 - 7;
u = x4 + x0 | 0;
x8 ^= u << 9 | u >>> 32 - 9;
u = x8 + x4 | 0;
x12 ^= u << 13 | u >>> 32 - 13;
u = x12 + x8 | 0;
x0 ^= u << 18 | u >>> 32 - 18;
u = x5 + x1 | 0;
x9 ^= u << 7 | u >>> 32 - 7;
u = x9 + x5 | 0;
x13 ^= u << 9 | u >>> 32 - 9;
u = x13 + x9 | 0;
x1 ^= u << 13 | u >>> 32 - 13;
u = x1 + x13 | 0;
x5 ^= u << 18 | u >>> 32 - 18;
u = x10 + x6 | 0;
x14 ^= u << 7 | u >>> 32 - 7;
u = x14 + x10 | 0;
x2 ^= u << 9 | u >>> 32 - 9;
u = x2 + x14 | 0;
x6 ^= u << 13 | u >>> 32 - 13;
u = x6 + x2 | 0;
x10 ^= u << 18 | u >>> 32 - 18;
u = x15 + x11 | 0;
x3 ^= u << 7 | u >>> 32 - 7;
u = x3 + x15 | 0;
x7 ^= u << 9 | u >>> 32 - 9;
u = x7 + x3 | 0;
x11 ^= u << 13 | u >>> 32 - 13;
u = x11 + x7 | 0;
x15 ^= u << 18 | u >>> 32 - 18;
u = x0 + x3 | 0;
x1 ^= u << 7 | u >>> 32 - 7;
u = x1 + x0 | 0;
x2 ^= u << 9 | u >>> 32 - 9;
u = x2 + x1 | 0;
x3 ^= u << 13 | u >>> 32 - 13;
u = x3 + x2 | 0;
x0 ^= u << 18 | u >>> 32 - 18;
u = x5 + x4 | 0;
x6 ^= u << 7 | u >>> 32 - 7;
u = x6 + x5 | 0;
x7 ^= u << 9 | u >>> 32 - 9;
u = x7 + x6 | 0;
x4 ^= u << 13 | u >>> 32 - 13;
u = x4 + x7 | 0;
x5 ^= u << 18 | u >>> 32 - 18;
u = x10 + x9 | 0;
x11 ^= u << 7 | u >>> 32 - 7;
u = x11 + x10 | 0;
x8 ^= u << 9 | u >>> 32 - 9;
u = x8 + x11 | 0;
x9 ^= u << 13 | u >>> 32 - 13;
u = x9 + x8 | 0;
x10 ^= u << 18 | u >>> 32 - 18;
u = x15 + x14 | 0;
x12 ^= u << 7 | u >>> 32 - 7;
u = x12 + x15 | 0;
x13 ^= u << 9 | u >>> 32 - 9;
u = x13 + x12 | 0;
x14 ^= u << 13 | u >>> 32 - 13;
u = x14 + x13 | 0;
x15 ^= u << 18 | u >>> 32 - 18;
}
x0 = x0 + j0 | 0;
x1 = x1 + j1 | 0;
x2 = x2 + j2 | 0;
x3 = x3 + j3 | 0;
x4 = x4 + j4 | 0;
x5 = x5 + j5 | 0;
x6 = x6 + j6 | 0;
x7 = x7 + j7 | 0;
x8 = x8 + j8 | 0;
x9 = x9 + j9 | 0;
x10 = x10 + j10 | 0;
x11 = x11 + j11 | 0;
x12 = x12 + j12 | 0;
x13 = x13 + j13 | 0;
x14 = x14 + j14 | 0;
x15 = x15 + j15 | 0;
o[0] = x0 >>> 0 & 255;
o[1] = x0 >>> 8 & 255;
o[2] = x0 >>> 16 & 255;
o[3] = x0 >>> 24 & 255;
o[4] = x1 >>> 0 & 255;
o[5] = x1 >>> 8 & 255;
o[6] = x1 >>> 16 & 255;
o[7] = x1 >>> 24 & 255;
o[8] = x2 >>> 0 & 255;
o[9] = x2 >>> 8 & 255;
o[10] = x2 >>> 16 & 255;
o[11] = x2 >>> 24 & 255;
o[12] = x3 >>> 0 & 255;
o[13] = x3 >>> 8 & 255;
o[14] = x3 >>> 16 & 255;
o[15] = x3 >>> 24 & 255;
o[16] = x4 >>> 0 & 255;
o[17] = x4 >>> 8 & 255;
o[18] = x4 >>> 16 & 255;
o[19] = x4 >>> 24 & 255;
o[20] = x5 >>> 0 & 255;
o[21] = x5 >>> 8 & 255;
o[22] = x5 >>> 16 & 255;
o[23] = x5 >>> 24 & 255;
o[24] = x6 >>> 0 & 255;
o[25] = x6 >>> 8 & 255;
o[26] = x6 >>> 16 & 255;
o[27] = x6 >>> 24 & 255;
o[28] = x7 >>> 0 & 255;
o[29] = x7 >>> 8 & 255;
o[30] = x7 >>> 16 & 255;
o[31] = x7 >>> 24 & 255;
o[32] = x8 >>> 0 & 255;
o[33] = x8 >>> 8 & 255;
o[34] = x8 >>> 16 & 255;
o[35] = x8 >>> 24 & 255;
o[36] = x9 >>> 0 & 255;
o[37] = x9 >>> 8 & 255;
o[38] = x9 >>> 16 & 255;
o[39] = x9 >>> 24 & 255;
o[40] = x10 >>> 0 & 255;
o[41] = x10 >>> 8 & 255;
o[42] = x10 >>> 16 & 255;
o[43] = x10 >>> 24 & 255;
o[44] = x11 >>> 0 & 255;
o[45] = x11 >>> 8 & 255;
o[46] = x11 >>> 16 & 255;
o[47] = x11 >>> 24 & 255;
o[48] = x12 >>> 0 & 255;
o[49] = x12 >>> 8 & 255;
o[50] = x12 >>> 16 & 255;
o[51] = x12 >>> 24 & 255;
o[52] = x13 >>> 0 & 255;
o[53] = x13 >>> 8 & 255;
o[54] = x13 >>> 16 & 255;
o[55] = x13 >>> 24 & 255;
o[56] = x14 >>> 0 & 255;
o[57] = x14 >>> 8 & 255;
o[58] = x14 >>> 16 & 255;
o[59] = x14 >>> 24 & 255;
o[60] = x15 >>> 0 & 255;
o[61] = x15 >>> 8 & 255;
o[62] = x15 >>> 16 & 255;
o[63] = x15 >>> 24 & 255;
}
function core_hsalsa20(o, p, k, c) {
var j0 = c[0] & 255 | (c[1] & 255) << 8 | (c[2] & 255) << 16 | (c[3] & 255) << 24, j1 = k[0] & 255 | (k[1] & 255) << 8 | (k[2] & 255) << 16 | (k[3] & 255) << 24, j2 = k[4] & 255 | (k[5] & 255) << 8 | (k[6] & 255) << 16 | (k[7] & 255) << 24, j3 = k[8] & 255 | (k[9] & 255) << 8 | (k[10] & 255) << 16 | (k[11] & 255) << 24, j4 = k[12] & 255 | (k[13] & 255) << 8 | (k[14] & 255) << 16 | (k[15] & 255) << 24, j5 = c[4] & 255 | (c[5] & 255) << 8 | (c[6] & 255) << 16 | (c[7] & 255) << 24, j6 = p[0] & 255 | (p[1] & 255) << 8 | (p[2] & 255) << 16 | (p[3] & 255) << 24, j7 = p[4] & 255 | (p[5] & 255) << 8 | (p[6] & 255) << 16 | (p[7] & 255) << 24, j8 = p[8] & 255 | (p[9] & 255) << 8 | (p[10] & 255) << 16 | (p[11] & 255) << 24, j9 = p[12] & 255 | (p[13] & 255) << 8 | (p[14] & 255) << 16 | (p[15] & 255) << 24, j10 = c[8] & 255 | (c[9] & 255) << 8 | (c[10] & 255) << 16 | (c[11] & 255) << 24, j11 = k[16] & 255 | (k[17] & 255) << 8 | (k[18] & 255) << 16 | (k[19] & 255) << 24, j12 = k[20] & 255 | (k[21] & 255) << 8 | (k[22] & 255) << 16 | (k[23] & 255) << 24, j13 = k[24] & 255 | (k[25] & 255) << 8 | (k[26] & 255) << 16 | (k[27] & 255) << 24, j14 = k[28] & 255 | (k[29] & 255) << 8 | (k[30] & 255) << 16 | (k[31] & 255) << 24, j15 = c[12] & 255 | (c[13] & 255) << 8 | (c[14] & 255) << 16 | (c[15] & 255) << 24;
var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, x15 = j15, u;
for (var i = 0; i < 20; i += 2) {
u = x0 + x12 | 0;
x4 ^= u << 7 | u >>> 32 - 7;
u = x4 + x0 | 0;
x8 ^= u << 9 | u >>> 32 - 9;
u = x8 + x4 | 0;
x12 ^= u << 13 | u >>> 32 - 13;
u = x12 + x8 | 0;
x0 ^= u << 18 | u >>> 32 - 18;
u = x5 + x1 | 0;
x9 ^= u << 7 | u >>> 32 - 7;
u = x9 + x5 | 0;
x13 ^= u << 9 | u >>> 32 - 9;
u = x13 + x9 | 0;
x1 ^= u << 13 | u >>> 32 - 13;
u = x1 + x13 | 0;
x5 ^= u << 18 | u >>> 32 - 18;
u = x10 + x6 | 0;
x14 ^= u << 7 | u >>> 32 - 7;
u = x14 + x10 | 0;
x2 ^= u << 9 | u >>> 32 - 9;
u = x2 + x14 | 0;
x6 ^= u << 13 | u >>> 32 - 13;
u = x6 + x2 | 0;
x10 ^= u << 18 | u >>> 32 - 18;
u = x15 + x11 | 0;
x3 ^= u << 7 | u >>> 32 - 7;
u = x3 + x15 | 0;
x7 ^= u << 9 | u >>> 32 - 9;
u = x7 + x3 | 0;
x11 ^= u << 13 | u >>> 32 - 13;
u = x11 + x7 | 0;
x15 ^= u << 18 | u >>> 32 - 18;
u = x0 + x3 | 0;
x1 ^= u << 7 | u >>> 32 - 7;
u = x1 + x0 | 0;
x2 ^= u << 9 | u >>> 32 - 9;
u = x2 + x1 | 0;
x3 ^= u << 13 | u >>> 32 - 13;
u = x3 + x2 | 0;
x0 ^= u << 18 | u >>> 32 - 18;
u = x5 + x4 | 0;
x6 ^= u << 7 | u >>> 32 - 7;
u = x6 + x5 | 0;
x7 ^= u << 9 | u >>> 32 - 9;
u = x7 + x6 | 0;
x4 ^= u << 13 | u >>> 32 - 13;
u = x4 + x7 | 0;
x5 ^= u << 18 | u >>> 32 - 18;
u = x10 + x9 | 0;
x11 ^= u << 7 | u >>> 32 - 7;
u = x11 + x10 | 0;
x8 ^= u << 9 | u >>> 32 - 9;
u = x8 + x11 | 0;
x9 ^= u << 13 | u >>> 32 - 13;
u = x9 + x8 | 0;
x10 ^= u << 18 | u >>> 32 - 18;
u = x15 + x14 | 0;
x12 ^= u << 7 | u >>> 32 - 7;
u = x12 + x15 | 0;
x13 ^= u << 9 | u >>> 32 - 9;
u = x13 + x12 | 0;
x14 ^= u << 13 | u >>> 32 - 13;
u = x14 + x13 | 0;
x15 ^= u << 18 | u >>> 32 - 18;
}
o[0] = x0 >>> 0 & 255;
o[1] = x0 >>> 8 & 255;
o[2] = x0 >>> 16 & 255;
o[3] = x0 >>> 24 & 255;
o[4] = x5 >>> 0 & 255;
o[5] = x5 >>> 8 & 255;
o[6] = x5 >>> 16 & 255;
o[7] = x5 >>> 24 & 255;
o[8] = x10 >>> 0 & 255;
o[9] = x10 >>> 8 & 255;
o[10] = x10 >>> 16 & 255;
o[11] = x10 >>> 24 & 255;
o[12] = x15 >>> 0 & 255;
o[13] = x15 >>> 8 & 255;
o[14] = x15 >>> 16 & 255;
o[15] = x15 >>> 24 & 255;
o[16] = x6 >>> 0 & 255;
o[17] = x6 >>> 8 & 255;
o[18] = x6 >>> 16 & 255;
o[19] = x6 >>> 24 & 255;
o[20] = x7 >>> 0 & 255;
o[21] = x7 >>> 8 & 255;
o[22] = x7 >>> 16 & 255;
o[23] = x7 >>> 24 & 255;
o[24] = x8 >>> 0 & 255;
o[25] = x8 >>> 8 & 255;
o[26] = x8 >>> 16 & 255;
o[27] = x8 >>> 24 & 255;
o[28] = x9 >>> 0 & 255;
o[29] = x9 >>> 8 & 255;
o[30] = x9 >>> 16 & 255;
o[31] = x9 >>> 24 & 255;
}
function crypto_core_salsa20(out, inp, k, c) {
core_salsa20(out, inp, k, c);
}
function crypto_core_hsalsa20(out, inp, k, c) {
core_hsalsa20(out, inp, k, c);
}
var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
function crypto_stream_salsa20_xor(c, cpos, m, mpos, b, n, k) {
var z = new Uint8Array(16), x = new Uint8Array(64);
var u, i;
for (i = 0; i < 16; i++)
z[i] = 0;
for (i = 0; i < 8; i++)
z[i] = n[i];
while (b >= 64) {
crypto_core_salsa20(x, z, k, sigma);
for (i = 0; i < 64; i++)
c[cpos + i] = m[mpos + i] ^ x[i];
u = 1;
for (i = 8; i < 16; i++) {
u = u + (z[i] & 255) | 0;
z[i] = u & 255;
u >>>= 8;
}
b -= 64;
cpos += 64;
mpos += 64;
}
if (b > 0) {
crypto_core_salsa20(x, z, k, sigma);
for (i = 0; i < b; i++)
c[cpos + i] = m[mpos + i] ^ x[i];
}
return 0;
}
function crypto_stream_salsa20(c, cpos, b, n, k) {
var z = new Uint8Array(16), x = new Uint8Array(64);
var u, i;
for (i = 0; i < 16; i++)
z[i] = 0;
for (i = 0; i < 8; i++)
z[i] = n[i];
while (b >= 64) {
crypto_core_salsa20(x, z, k, sigma);
for (i = 0; i < 64; i++)
c[cpos + i] = x[i];
u = 1;
for (i = 8; i < 16; i++) {
u = u + (z[i] & 255) | 0;
z[i] = u & 255;
u >>>= 8;
}
b -= 64;
cpos += 64;
}
if (b > 0) {
crypto_core_salsa20(x, z, k, sigma);
for (i = 0; i < b; i++)
c[cpos + i] = x[i];
}
return 0;
}
function crypto_stream(c, cpos, d, n, k) {
var s = new Uint8Array(32);
crypto_core_hsalsa20(s, n, k, sigma);
var sn = new Uint8Array(8);
for (var i = 0; i < 8; i++)
sn[i] = n[i + 16];
return crypto_stream_salsa20(c, cpos, d, sn, s);
}
function crypto_stream_xor(c, cpos, m, mpos, d, n, k) {
var s = new Uint8Array(32);
crypto_core_hsalsa20(s, n, k, sigma);
var sn = new Uint8Array(8);
for (var i = 0; i < 8; i++)
sn[i] = n[i + 16];
return crypto_stream_salsa20_xor(c, cpos, m, mpos, d, sn, s);
}
var poly1305 = function(key) {
this.buffer = new Uint8Array(16);
this.r = new Uint16Array(10);
this.h = new Uint16Array(10);
this.pad = new Uint16Array(8);
this.leftover = 0;
this.fin = 0;
var t0, t1, t2, t3, t4, t5, t6, t7;
t0 = key[0] & 255 | (key[1] & 255) << 8;
this.r[0] = t0 & 8191;
t1 = key[2] & 255 | (key[3] & 255) << 8;
this.r[1] = (t0 >>> 13 | t1 << 3) & 8191;
t2 = key[4] & 255 | (key[5] & 255) << 8;
this.r[2] = (t1 >>> 10 | t2 << 6) & 7939;
t3 = key[6] & 255 | (key[7] & 255) << 8;
this.r[3] = (t2 >>> 7 | t3 << 9) & 8191;
t4 = key[8] & 255 | (key[9] & 255) << 8;
this.r[4] = (t3 >>> 4 | t4 << 12) & 255;
this.r[5] = t4 >>> 1 & 8190;
t5 = key[10] & 255 | (key[11] & 255) << 8;
this.r[6] = (t4 >>> 14 | t5 << 2) & 8191;
t6 = key[12] & 255 | (key[13] & 255) << 8;
this.r[7] = (t5 >>> 11 | t6 << 5) & 8065;
t7 = key[14] & 255 | (key[15] & 255) << 8;
this.r[8] = (t6 >>> 8 | t7 << 8) & 8191;
this.r[9] = t7 >>> 5 & 127;
this.pad[0] = key[16] & 255 | (key[17] & 255) << 8;
this.pad[1] = key[18] & 255 | (key[19] & 255) << 8;
this.pad[2] = key[20] & 255 | (key[21] & 255) << 8;
this.pad[3] = key[22] & 255 | (key[23] & 255) << 8;
this.pad[4] = key[24] & 255 | (key[25] & 255) << 8;
this.pad[5] = key[26] & 255 | (key[27] & 255) << 8;
this.pad[6] = key[28] & 255 | (key[29] & 255) << 8;
this.pad[7] = key[30] & 255 | (key[31] & 255) << 8;
};
poly1305.prototype.blocks = function(m, mpos, bytes) {
var hibit = this.fin ? 0 : 1 << 11;
var t0, t1, t2, t3, t4, t5, t6, t7, c;
var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;
var h0 = this.h[0], h1 = this.h[1], h2 = this.h[2], h3 = this.h[3], h4 = this.h[4], h5 = this.h[5], h6 = this.h[6], h7 = this.h[7], h8 = this.h[8], h9 = this.h[9];
var r0 = this.r[0], r1 = this.r[1], r2 = this.r[2], r3 = this.r[3], r4 = this.r[4], r5 = this.r[5], r6 = this.r[6], r7 = this.r[7], r8 = this.r[8], r9 = this.r[9];
while (bytes >= 16) {
t0 = m[mpos + 0] & 255 | (m[mpos + 1] & 255) << 8;
h0 += t0 & 8191;
t1 = m[mpos + 2] & 255 | (m[mpos + 3] & 255) << 8;
h1 += (t0 >>> 13 | t1 << 3) & 8191;
t2 = m[mpos + 4] & 255 | (m[mpos + 5] & 255) << 8;
h2 += (t1 >>> 10 | t2 << 6) & 8191;
t3 = m[mpos + 6] & 255 | (m[mpos + 7] & 255) << 8;
h3 += (t2 >>> 7 | t3 << 9) & 8191;
t4 = m[mpos + 8] & 255 | (m[mpos + 9] & 255) << 8;
h4 += (t3 >>> 4 | t4 << 12) & 8191;
h5 += t4 >>> 1 & 8191;
t5 = m[mpos + 10] & 255 | (m[mpos + 11] & 255) << 8;
h6 += (t4 >>> 14 | t5 << 2) & 8191;
t6 = m[mpos + 12] & 255 | (m[mpos + 13] & 255) << 8;
h7 += (t5 >>> 11 | t6 << 5) & 8191;
t7 = m[mpos + 14] & 255 | (m[mpos + 15] & 255) << 8;
h8 += (t6 >>> 8 | t7 << 8) & 8191;
h9 += t7 >>> 5 | hibit;
c = 0;
d0 = c;
d0 += h0 * r0;
d0 += h1 * (5 * r9);
d0 += h2 * (5 * r8);
d0 += h3 * (5 * r7);
d0 += h4 * (5 * r6);
c = d0 >>> 13;
d0 &= 8191;
d0 += h5 * (5 * r5);
d0 += h6 * (5 * r4);
d0 += h7 * (5 * r3);
d0 += h8 * (5 * r2);
d0 += h9 * (5 * r1);
c += d0 >>> 13;
d0 &= 8191;
d1 = c;
d1 += h0 * r1;
d1 += h1 * r0;
d1 += h2 * (5 * r9);
d1 += h3 * (5 * r8);
d1 += h4 * (5 * r7);
c = d1 >>> 13;
d1 &= 8191;
d1 += h5 * (5 * r6);
d1 += h6 * (5 * r5);
d1 += h7 * (5 * r4);
d1 += h8 * (5 * r3);
d1 += h9 * (5 * r2);
c += d1 >>> 13;
d1 &= 8191;
d2 = c;
d2 += h0 * r2;
d2 += h1 * r1;
d2 += h2 * r0;
d2 += h3 * (5 * r9);
d2 += h4 * (5 * r8);
c = d2 >>> 13;
d2 &= 8191;
d2 += h5 * (5 * r7);
d2 += h6 * (5 * r6);
d2 += h7 * (5 * r5);
d2 += h8 * (5 * r4);
d2 += h9 * (5 * r3);
c += d2 >>> 13;
d2 &= 8191;
d3 = c;
d3 += h0 * r3;
d3 += h1 * r2;
d3 += h2 * r1;
d3 += h3 * r0;
d3 += h4 * (5 * r9);
c = d3 >>> 13;
d3 &= 8191;
d3 += h5 * (5 * r8);
d3 += h6 * (5 * r7);
d3 += h7 * (5 * r6);
d3 += h8 * (5 * r5);
d3 += h9 * (5 * r4);
c += d3 >>> 13;
d3 &= 8191;
d4 = c;
d4 += h0 * r4;
d4 += h1 * r3;
d4 += h2 * r2;
d4 += h3 * r1;
d4 += h4 * r0;
c = d4 >>> 13;
d4 &= 8191;
d4 += h5 * (5 * r9);
d4 += h6 * (5 * r8);
d4 += h7 * (5 * r7);
d4 += h8 * (5 * r6);
d4 += h9 * (5 * r5);
c += d4 >>> 13;
d4 &= 8191;
d5 = c;
d5 += h0 * r5;
d5 += h1 * r4;
d5 += h2 * r3;
d5 += h3 * r2;
d5 += h4 * r1;
c = d5 >>> 13;
d5 &= 8191;
d5 += h5 * r0;
d5 += h6 * (5 * r9);
d5 += h7 * (5 * r8);
d5 += h8 * (5 * r7);
d5 += h9 * (5 * r6);
c += d5 >>> 13;
d5 &= 8191;
d6 = c;
d6 += h0 * r6;
d6 += h1 * r5;
d6 += h2 * r4;
d6 += h3 * r3;
d6 += h4 * r2;
c = d6 >>> 13;
d6 &= 8191;
d6 += h5 * r1;
d6 += h6 * r0;
d6 += h7 * (5 * r9);
d6 += h8 * (5 * r8);
d6 += h9 * (5 * r7);
c += d6 >>> 13;
d6 &= 8191;
d7 = c;
d7 += h0 * r7;
d7 += h1 * r6;
d7 += h2 * r5;
d7 += h3 * r4;
d7 += h4 * r3;
c = d7 >>> 13;
d7 &= 8191;
d7 += h5 * r2;
d7 += h6 * r1;
d7 += h7 * r0;
d7 += h8 * (5 * r9);
d7 += h9 * (5 * r8);
c += d7 >>> 13;
d7 &= 8191;
d8 = c;
d8 += h0 * r8;
d8 += h1 * r7;
d8 += h2 * r6;
d8 += h3 * r5;
d8 += h4 * r4;
c = d8 >>> 13;
d8 &= 8191;
d8 += h5 * r3;
d8 += h6 * r2;
d8 += h7 * r1;
d8 += h8 * r0;
d8 += h9 * (5 * r9);
c += d8 >>> 13;
d8 &= 8191;
d9 = c;
d9 += h0 * r9;
d9 += h1 * r8;
d9 += h2 * r7;
d9 += h3 * r6;
d9 += h4 * r5;
c = d9 >>> 13;
d9 &= 8191;
d9 += h5 * r4;
d9 += h6 * r3;
d9 += h7 * r2;
d9 += h8 * r1;
d9 += h9 * r0;
c += d9 >>> 13;
d9 &= 8191;
c = (c << 2) + c | 0;
c = c + d0 | 0;
d0 = c & 8191;
c = c >>> 13;
d1 += c;
h0 = d0;
h1 = d1;
h2 = d2;
h3 = d3;
h4 = d4;
h5 = d5;
h6 = d6;
h7 = d7;
h8 = d8;
h9 = d9;
mpos += 16;
bytes -= 16;
}
this.h[0] = h0;
this.h[1] = h1;
this.h[2] = h2;
this.h[3] = h3;
this.h[4] = h4;
this.h[5] = h5;
this.h[6] = h6;
this.h[7] = h7;
this.h[8] = h8;
this.h[9] = h9;
};
poly1305.prototype.finish = function(mac, macpos) {
var g = new Uint16Array(10);
var c, mask, f, i;
if (this.leftover) {
i = this.leftover;
this.buffer[i++] = 1;
for (; i < 16; i++)
this.buffer[i] = 0;
this.fin = 1;
this.blocks(this.buffer, 0, 16);
}
c = this.h[1] >>> 13;
this.h[1] &= 8191;
for (i = 2; i < 10; i++) {
this.h[i] += c;
c = this.h[i] >>> 13;
this.h[i] &= 8191;
}
this.h[0] += c * 5;
c = this.h[0] >>> 13;
this.h[0] &= 8191;
this.h[1] += c;
c = this.h[1] >>> 13;
this.h[1] &= 8191;
this.h[2] += c;
g[0] = this.h[0] + 5;
c = g[0] >>> 13;
g[0] &= 8191;
for (i = 1; i < 10; i++) {
g[i] = this.h[i] + c;
c = g[i] >>> 13;
g[i] &= 8191;
}
g[9] -= 1 << 13;
mask = (c ^ 1) - 1;
for (i = 0; i < 10; i++)
g[i] &= mask;
mask = ~mask;
for (i = 0; i < 10; i++)
this.h[i] = this.h[i] & mask | g[i];
this.h[0] = (this.h[0] | this.h[1] << 13) & 65535;
this.h[1] = (this.h[1] >>> 3 | this.h[2] << 10) & 65535;
this.h[2] = (this.h[2] >>> 6 | this.h[3] << 7) & 65535;
this.h[3] = (this.h[3] >>> 9 | this.h[4] << 4) & 65535;
this.h[4] = (this.h[4] >>> 12 | this.h[5] << 1 | this.h[6] << 14) & 65535;
this.h[5] = (this.h[6] >>> 2 | this.h[7] << 11) & 65535;
this.h[6] = (this.h[7] >>> 5 | this.h[8] << 8) & 65535;
this.h[7] = (this.h[8] >>> 8 | this.h[9] << 5) & 65535;
f = this.h[0] + this.pad[0];
this.h[0] = f & 65535;
for (i = 1; i < 8; i++) {
f = (this.h[i] + this.pad[i] | 0) + (f >>> 16) | 0;
this.h[i] = f & 65535;
}
mac[macpos + 0] = this.h[0] >>> 0 & 255;
mac[macpos + 1] = this.h[0] >>> 8 & 255;
mac[macpos + 2] = this.h[1] >>> 0 & 255;
mac[macpos + 3] = this.h[1] >>> 8 & 255;
mac[macpos + 4] = this.h[2] >>> 0 & 255;
mac[macpos + 5] = this.h[2] >>> 8 & 255;
mac[macpos + 6] = this.h[3] >>> 0 & 255;
mac[macpos + 7] = this.h[3] >>> 8 & 255;
mac[macpos + 8] = this.h[4] >>> 0 & 255;
mac[macpos + 9] = this.h[4] >>> 8 & 255;
mac[macpos + 10] = this.h[5] >>> 0 & 255;
mac[macpos + 11] = this.h[5] >>> 8 & 255;
mac[macpos + 12] = this.h[6] >>> 0 & 255;
mac[macpos + 13] = this.h[6] >>> 8 & 255;
mac[macpos + 14] = this.h[7] >>> 0 & 255;
mac[macpos + 15] = this.h[7] >>> 8 & 255;
};
poly1305.prototype.update = function(m, mpos, bytes) {
var i, want;
if (this.leftover) {
want = 16 - this.leftover;
if (want > bytes)
want = bytes;
for (i = 0; i < want; i++)
this.buffer[this.leftover + i] = m[mpos + i];
bytes -= want;
mpos += want;
this.leftover += want;
if (this.leftover < 16)
return;
this.blocks(this.buffer, 0, 16);
this.leftover = 0;
}
if (bytes >= 16) {
want = bytes - bytes % 16;
this.blocks(m, mpos, want);
mpos += want;
bytes -= want;
}
if (bytes) {
for (i = 0; i < bytes; i++)
this.buffer[this.leftover + i] = m[mpos + i];
this.leftover += bytes;
}
};
function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
var s = new poly1305(k);
s.update(m, mpos, n);
s.finish(out, outpos);
return 0;
}
function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
var x = new Uint8Array(16);
crypto_onetimeauth(x, 0, m, mpos, n, k);
return crypto_verify_16(h, hpos, x, 0);
}
function crypto_secretbox(c, m, d, n, k) {
var i;
if (d < 32)
return -1;
crypto_stream_xor(c, 0, m, 0, d, n, k);
crypto_onetimeauth(c, 16, c, 32, d - 32, c);
for (i = 0; i < 16; i++)
c[i] = 0;
return 0;
}
function crypto_secretbox_open(m, c, d, n, k) {
var i;
var x = new Uint8Array(32);
if (d < 32)
return -1;
crypto_stream(x, 0, 32, n, k);
if (crypto_onetimeauth_verify(c, 16, c, 32, d - 32, x) !== 0)
return -1;
crypto_stream_xor(m, 0, c, 0, d, n, k);
for (i = 0; i < 32; i++)
m[i] = 0;
return 0;
}
function set25519(r, a) {
var i;
for (i = 0; i < 16; i++)
r[i] = a[i] | 0;
}
function car25519(o) {
var i, v, c = 1;
for (i = 0; i < 16; i++) {
v = o[i] + c + 65535;
c = Math.floor(v / 65536);
o[i] = v - c * 65536;
}
o[0] += c - 1 + 37 * (c - 1);
}
function sel25519(p, q2, b) {
var t, c = ~(b - 1);
for (var i = 0; i < 16; i++) {
t = c & (p[i] ^ q2[i]);
p[i] ^= t;
q2[i] ^= t;
}
}
function pack25519(o, n) {
var i, j, b;
var m = gf(), t = gf();
for (i = 0; i < 16; i++)
t[i] = n[i];
car25519(t);
car25519(t);
car25519(t);
for (j = 0; j < 2; j++) {
m[0] = t[0] - 65517;
for (i = 1; i < 15; i++) {
m[i] = t[i] - 65535 - (m[i - 1] >> 16 & 1);
m[i - 1] &= 65535;
}
m[15] = t[15] - 32767 - (m[14] >> 16 & 1);
b = m[15] >> 16 & 1;
m[14] &= 65535;
sel25519(t, m, 1 - b);
}
for (i = 0; i < 16; i++) {
o[2 * i] = t[i] & 255;
o[2 * i + 1] = t[i] >> 8;
}
}
function neq25519(a, b) {
var c = new Uint8Array(32), d = new Uint8Array(32);
pack25519(c, a);
pack25519(d, b);
return crypto_verify_32(c, 0, d, 0);
}
function par25519(a) {
var d = new Uint8Array(32);
pack25519(d, a);
return d[0] & 1;
}
function unpack25519(o, n) {
var i;
for (i = 0; i < 16; i++)
o[i] = n[2 * i] + (n[2 * i + 1] << 8);
o[15] &= 32767;
}
function A(o, a, b) {
for (var i = 0; i < 16; i++)
o[i] = a[i] + b[i];
}
function Z(o, a, b) {
for (var i = 0; i < 16; i++)
o[i] = a[i] - b[i];
}
function M(o, a, b) {
var v, c, t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11], b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];
v = a[0];
t0 += v * b0;
t1 += v * b1;
t2 += v * b2;
t3 += v * b3;
t4 += v * b4;
t5 += v * b5;
t6 += v * b6;
t7 += v * b7;
t8 += v * b8;
t9 += v * b9;
t10 += v * b10;
t11 += v * b11;
t12 += v * b12;
t13 += v * b13;
t14 += v * b14;
t15 += v * b15;
v = a[1];
t1 += v * b0;
t2 += v * b1;
t3 += v * b2;
t4 += v * b3;
t5 += v * b4;
t6 += v * b5;
t7 += v * b6;
t8 += v * b7;
t9 += v * b8;
t10 += v * b9;
t11 += v * b10;
t12 += v * b11;
t13 += v * b12;
t14 += v * b13;
t15 += v * b14;
t16 += v * b15;
v = a[2];
t2 += v * b0;
t3 += v * b1;
t4 += v * b2;
t5 += v * b3;
t6 += v * b4;
t7 += v * b5;
t8 += v * b6;
t9 += v * b7;
t10 += v * b8;
t11 += v * b9;
t12 += v * b10;
t13 += v * b11;
t14 += v * b12;
t15 += v * b13;
t16 += v * b14;
t17 += v * b15;
v = a[3];
t3 += v * b0;
t4 += v * b1;
t5 += v * b2;
t6 += v * b3;
t7 += v * b4;
t8 += v * b5;
t9 += v * b6;
t10 += v * b7;
t11 += v * b8;
t12 += v * b9;
t13 += v * b10;
t14 += v * b11;
t15 += v * b12;
t16 += v * b13;
t17 += v * b14;
t18 += v * b15;
v = a[4];
t4 += v * b0;
t5 += v * b1;
t6 += v * b2;
t7 += v * b3;
t8 += v * b4;
t9 += v * b5;
t10 += v * b6;
t11 += v * b7;
t12 += v * b8;
t13 += v * b9;
t14 += v * b10;
t15 += v * b11;
t16 += v * b12;
t17 += v * b13;
t18 += v * b14;
t19 += v * b15;
v = a[5];
t5 += v * b0;
t6 += v * b1;
t7 += v * b2;
t8 += v * b3;
t9 += v * b4;
t10 += v * b5;
t11 += v * b6;
t12 += v * b7;
t13 += v * b8;
t14 += v * b9;
t15 += v * b10;
t16 += v * b11;
t17 += v * b12;
t18 += v * b13;
t19 += v * b14;
t20 += v * b15;
v = a[6];
t6 += v * b0;
t7 += v * b1;
t8 += v * b2;
t9 += v * b3;
t10 += v * b4;
t11 += v * b5;
t12 += v * b6;
t13 += v * b7;
t14 += v * b8;
t15 += v * b9;
t16 += v * b10;
t17 += v * b11;
t18 += v * b12;
t19 += v * b13;
t20 += v * b14;
t21 += v * b15;
v = a[7];
t7 += v * b0;
t8 += v * b1;
t9 += v * b2;
t10 += v * b3;
t11 += v * b4;
t12 += v * b5;
t13 += v * b6;
t14 += v * b7;
t15 += v * b8;
t16 += v * b9;
t17 += v * b10;
t18 += v * b11;
t19 += v * b12;
t20 += v * b13;
t21 += v * b14;
t22 += v * b15;
v = a[8];
t8 += v * b0;
t9 += v * b1;
t10 += v * b2;
t11 += v * b3;
t12 += v * b4;
t13 += v * b5;
t14 += v * b6;
t15 += v * b7;
t16 += v * b8;
t17 += v * b9;
t18 += v * b10;
t19 += v * b11;
t20 += v * b12;
t21 += v * b13;
t22 += v * b14;
t23 += v * b15;
v = a[9];
t9 += v * b0;
t10 += v * b1;
t11 += v * b2;
t12 += v * b3;
t13 += v * b4;
t14 += v * b5;
t15 += v * b6;
t16 += v * b7;
t17 += v * b8;
t18 += v * b9;
t19 += v * b10;
t20 += v * b11;
t21 += v * b12;
t22 += v * b13;
t23 += v * b14;
t24 += v * b15;
v = a[10];
t10 += v * b0;
t11 += v * b1;
t12 += v * b2;
t13 += v * b3;
t14 += v * b4;
t15 += v * b5;
t16 += v * b6;
t17 += v * b7;
t18 += v * b8;
t19 += v * b9;
t20 += v * b10;
t21 += v * b11;
t22 += v * b12;
t23 += v * b13;
t24 += v * b14;
t25 += v * b15;
v = a[11];
t11 += v * b0;
t12 += v * b1;
t13 += v * b2;
t14 += v * b3;
t15 += v * b4;
t16 += v * b5;
t17 += v * b6;
t18 += v * b7;
t19 += v * b8;
t20 += v * b9;
t21 += v * b10;
t22 += v * b11;
t23 += v * b12;
t24 += v * b13;
t25 += v * b14;
t26 += v * b15;
v = a[12];
t12 += v * b0;
t13 += v * b1;
t14 += v * b2;
t15 += v * b3;
t16 += v * b4;
t17 += v * b5;
t18 += v * b6;
t19 += v * b7;
t20 += v * b8;
t21 += v * b9;
t22 += v * b10;
t23 += v * b11;
t24 += v * b12;
t25 += v * b13;
t26 += v * b14;
t27 += v * b15;
v = a[13];
t13 += v * b0;
t14 += v * b1;
t15 += v * b2;
t16 += v * b3;
t17 += v * b4;
t18 += v * b5;
t19 += v * b6;
t20 += v * b7;
t21 += v * b8;
t22 += v * b9;
t23 += v * b10;
t24 += v * b11;
t25 += v * b12;
t26 += v * b13;
t27 += v * b14;
t28 += v * b15;
v = a[14];
t14 += v * b0;
t15 += v * b1;
t16 += v * b2;
t17 += v * b3;
t18 += v * b4;
t19 += v * b5;
t20 += v * b6;
t21 += v * b7;
t22 += v * b8;
t23 += v * b9;
t24 += v * b10;
t25 += v * b11;
t26 += v * b12;
t27 += v * b13;
t28 += v * b14;
t29 += v * b15;
v = a[15];
t15 += v * b0;
t16 += v * b1;
t17 += v * b2;
t18 += v * b3;
t19 += v * b4;
t20 += v * b5;
t21 += v * b6;
t22 += v * b7;
t23 += v * b8;
t24 += v * b9;
t25 += v * b10;
t26 += v * b11;
t27 += v * b12;
t28 += v * b13;
t29 += v * b14;
t30 += v * b15;
t0 += 38 * t16;
t1 += 38 * t17;
t2 += 38 * t18;
t3 += 38 * t19;
t4 += 38 * t20;
t5 += 38 * t21;
t6 += 38 * t22;
t7 += 38 * t23;
t8 += 38 * t24;
t9 += 38 * t25;
t10 += 38 * t26;
t11 += 38 * t27;
t12 += 38 * t28;
t13 += 38 * t29;
t14 += 38 * t30;
c = 1;
v = t0 + c + 65535;
c = Math.floor(v / 65536);
t0 = v - c * 65536;
v = t1 + c + 65535;
c = Math.floor(v / 65536);
t1 = v - c * 65536;
v = t2 + c + 65535;
c = Math.floor(v / 65536);
t2 = v - c * 65536;
v = t3 + c + 65535;
c = Math.floor(v / 65536);
t3 = v - c * 65536;
v = t4 + c + 65535;
c = Math.floor(v / 65536);
t4 = v - c * 65536;
v = t5 + c + 65535;
c = Math.floor(v / 65536);
t5 = v - c * 65536;
v = t6 + c + 65535;
c = Math.floor(v / 65536);
t6 = v - c * 65536;
v = t7 + c + 65535;
c = Math.floor(v / 65536);
t7 = v - c * 65536;
v = t8 + c + 65535;
c = Math.floor(v / 65536);
t8 = v - c * 65536;
v = t9 + c + 65535;
c = Math.floor(v / 65536);
t9 = v - c * 65536;
v = t10 + c + 65535;
c = Math.floor(v / 65536);
t10 = v - c * 65536;
v = t11 + c + 65535;
c = Math.floor(v / 65536);
t11 = v - c * 65536;
v = t12 + c + 65535;
c = Math.floor(v / 65536);
t12 = v - c * 65536;
v = t13 + c + 65535;
c = Math.floor(v / 65536);
t13 = v - c * 65536;
v = t14 + c + 65535;
c = Math.floor(v / 65536);
t14 = v - c * 65536;
v = t15 + c + 65535;
c = Math.floor(v / 65536);
t15 = v - c * 65536;
t0 += c - 1 + 37 * (c - 1);
c = 1;
v = t0 + c + 65535;
c = Math.floor(v / 65536);
t0 = v - c * 65536;
v = t1 + c + 65535;
c = Math.floor(v / 65536);
t1 = v - c * 65536;
v = t2 + c + 65535;
c = Math.floor(v / 65536);
t2 = v - c * 65536;
v = t3 + c + 65535;
c = Math.floor(v / 65536);
t3 = v - c * 65536;
v = t4 + c + 65535;
c = Math.floor(v / 65536);
t4 = v - c * 65536;
v = t5 + c + 65535;
c = Math.floor(v / 65536);
t5 = v - c * 65536;
v = t6 + c + 65535;
c = Math.floor(v / 65536);
t6 = v - c * 65536;
v = t7 + c + 65535;
c = Math.floor(v / 65536);
t7 = v - c * 65536;
v = t8 + c + 65535;
c = Math.floor(v / 65536);
t8 = v - c * 65536;
v = t9 + c + 65535;
c = Math.floor(v / 65536);
t9 = v - c * 65536;
v = t10 + c + 65535;
c = Math.floor(v / 65536);
t10 = v - c * 65536;
v = t11 + c + 65535;
c = Math.floor(v / 65536);
t11 = v - c * 65536;
v = t12 + c + 65535;
c = Math.floor(v / 65536);
t12 = v - c * 65536;
v = t13 + c + 65535;
c = Math.floor(v / 65536);
t13 = v - c * 65536;
v = t14 + c + 65535;
c = Math.floor(v / 65536);
t14 = v - c * 65536;
v = t15 + c + 65535;
c = Math.floor(v / 65536);
t15 = v - c * 65536;
t0 += c - 1 + 37 * (c - 1);
o[0] = t0;
o[1] = t1;
o[2] = t2;
o[3] = t3;
o[4] = t4;
o[5] = t5;
o[6] = t6;
o[7] = t7;
o[8] = t8;
o[9] = t9;
o[10] = t10;
o[11] = t11;
o[12] = t12;
o[13] = t13;
o[14] = t14;
o[15] = t15;
}
function S(o, a) {
M(o, a, a);
}
function inv25519(o, i) {
var c = gf();
var a;
for (a = 0; a < 16; a++)
c[a] = i[a];
for (a = 253; a >= 0; a--) {
S(c, c);
if (a !== 2 && a !== 4)
M(c, c, i);
}
for (a = 0; a < 16; a++)
o[a] = c[a];
}
function pow2523(o, i) {
var c = gf();
var a;
for (a = 0; a < 16; a++)
c[a] = i[a];
for (a = 250; a >= 0; a--) {
S(c, c);
if (a !== 1)
M(c, c, i);
}
for (a = 0; a < 16; a++)
o[a] = c[a];
}
function crypto_scalarmult(q2, n, p) {
var z = new Uint8Array(32);
var x = new Float64Array(80), r, i;
var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf();
for (i = 0; i < 31; i++)
z[i] = n[i];
z[31] = n[31] & 127 | 64;
z[0] &= 248;
unpack25519(x, p);
for (i = 0; i < 16; i++) {
b[i] = x[i];
d[i] = a[i] = c[i] = 0;
}
a[0] = d[0] = 1;
for (i = 254; i >= 0; --i) {
r = z[i >>> 3] >>> (i & 7) & 1;
sel25519(a, b, r);
sel25519(c, d, r);
A(e, a, c);
Z(a, a, c);
A(c, b, d);
Z(b, b, d);
S(d, e);
S(f, a);
M(a, c, a);
M(c, b, e);
A(e, a, c);
Z(a, a, c);
S(b, a);
Z(c, d, f);
M(a, c, _121665);
A(a, a, d);
M(c, c, a);
M(a, d, f);
M(d, b, x);
S(b, e);
sel25519(a, b, r);
sel25519(c, d, r);
}
for (i = 0; i < 16; i++) {
x[i + 16] = a[i];
x[i + 32] = c[i];
x[i + 48] = b[i];
x[i + 64] = d[i];
}
var x32 = x.subarray(32);
var x16 = x.subarray(16);
inv25519(x32, x32);
M(x16, x16, x32);
pack25519(q2, x16);
return 0;
}
function crypto_scalarmult_base(q2, n) {
return crypto_scalarmult(q2, n, _9);
}
function crypto_box_keypair(y, x) {
randombytes(x, 32);
return crypto_scalarmult_base(y, x);
}
function crypto_box_beforenm(k, y, x) {
var s = new Uint8Array(32);
crypto_scalarmult(s, x, y);
return crypto_core_hsalsa20(k, _0, s, sigma);
}
var crypto_box_afternm = crypto_secretbox;
var crypto_box_open_afternm = crypto_secretbox_open;
function crypto_box(c, m, d, n, y, x) {
var k = new Uint8Array(32);
crypto_box_beforenm(k, y, x);
return crypto_box_afternm(c, m, d, n, k);
}
function crypto_box_open(m, c, d, n, y, x) {
var k = new Uint8Array(32);
crypto_box_beforenm(k, y, x);
return crypto_box_open_afternm(m, c, d, n, k);
}
var K = [
1116352408,
3609767458,
1899447441,
602891725,
3049323471,
3964484399,
3921009573,
2173295548,
961987163,
4081628472,
1508970993,
3053834265,
2453635748,
2937671579,
2870763221,
3664609560,
3624381080,
2734883394,
310598401,
1164996542,
607225278,
1323610764,
1426881987,
3590304994,
1925078388,
4068182383,
2162078206,
991336113,
2614888103,
633803317,
3248222580,
3479774868,
3835390401,
2666613458,
4022224774,
944711139,
264347078,
2341262773,
604807628,
2007800933,
770255983,
1495990901,
1249150122,
1856431235,
1555081692,
3175218132,
1996064986,
2198950837,
2554220882,
3999719339,
2821834349,
766784016,
2952996808,
2566594879,
3210313671,
3203337956,
3336571891,
1034457026,
3584528711,
2466948901,
113926993,
3758326383,
338241895,
168717936,
666307205,
1188179964,
773529912,
1546045734,
1294757372,
1522805485,
1396182291,
2643833823,
1695183700,
2343527390,
1986661051,
1014477480,
2177026350,
1206759142,
2456956037,
344077627,
2730485921,
1290863460,
2820302411,
3158454273,
3259730800,
3505952657,
3345764771,
106217008,
3516065817,
3606008344,
3600352804,
1432725776,
4094571909,
1467031594,
275423344,
851169720,
430227734,
3100823752,
506948616,
1363258195,
659060556,
3750685593,
883997877,
3785050280,
958139571,
3318307427,
1322822218,
3812723403,
1537002063,
2003034995,
1747873779,
3602036899,
1955562222,
1575990012,
2024104815,
1125592928,
2227730452,
2716904306,
2361852424,
442776044,
2428436474,
593698344,
2756734187,
3733110249,
3204031479,
2999351573,
3329325298,
3815920427,
3391569614,
3928383900,
3515267271,
566280711,
3940187606,
3454069534,
4118630271,
4000239992,
116418474,
1914138554,
174292421,
2731055270,
289380356,
3203993006,
460393269,
320620315,
685471733,
587496836,
852142971,
1086792851,
1017036298,
365543100,
1126000580,
2618297676,
1288033470,
3409855158,
1501505948,
4234509866,
1607167915,
987167468,
1816402316,
1246189591
];
function crypto_hashblocks_hl(hh, hl, m, n) {
var wh = new Int32Array(16), wl = new Int32Array(16), bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, th, tl, i, j, h, l, a, b, c, d;
var ah0 = hh[0], ah1 = hh[1], ah2 = hh[2], ah3 = hh[3], ah4 = hh[4], ah5 = hh[5], ah6 = hh[6], ah7 = hh[7], al0 = hl[0], al1 = hl[1], al2 = hl[2], al3 = hl[3], al4 = hl[4], al5 = hl[5], al6 = hl[6], al7 = hl[7];
var pos = 0;
while (n >= 128) {
for (i = 0; i < 16; i++) {
j = 8 * i + pos;
wh[i] = m[j + 0] << 24 | m[j + 1] << 16 | m[j + 2] << 8 | m[j + 3];
wl[i] = m[j + 4] << 24 | m[j + 5] << 16 | m[j + 6] << 8 | m[j + 7];
}
for (i = 0; i < 80; i++) {
bh0 = ah0;
bh1 = ah1;
bh2 = ah2;
bh3 = ah3;
bh4 = ah4;
bh5 = ah5;
bh6 = ah6;
bh7 = ah7;
bl0 = al0;
bl1 = al1;
bl2 = al2;
bl3 = al3;
bl4 = al4;
bl5 = al5;
bl6 = al6;
bl7 = al7;
h = ah7;
l = al7;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = (ah4 >>> 14 | al4 << 32 - 14) ^ (ah4 >>> 18 | al4 << 32 - 18) ^ (al4 >>> 41 - 32 | ah4 << 32 - (41 - 32));
l = (al4 >>> 14 | ah4 << 32 - 14) ^ (al4 >>> 18 | ah4 << 32 - 18) ^ (ah4 >>> 41 - 32 | al4 << 32 - (41 - 32));
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
h = ah4 & ah5 ^ ~ah4 & ah6;
l = al4 & al5 ^ ~al4 & al6;
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
h = K[i * 2];
l = K[i * 2 + 1];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
h = wh[i % 16];
l = wl[i % 16];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
th = c & 65535 | d << 16;
tl = a & 65535 | b << 16;
h = th;
l = tl;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = (ah0 >>> 28 | al0 << 32 - 28) ^ (al0 >>> 34 - 32 | ah0 << 32 - (34 - 32)) ^ (al0 >>> 39 - 32 | ah0 << 32 - (39 - 32));
l = (al0 >>> 28 | ah0 << 32 - 28) ^ (ah0 >>> 34 - 32 | al0 << 32 - (34 - 32)) ^ (ah0 >>> 39 - 32 | al0 << 32 - (39 - 32));
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
h = ah0 & ah1 ^ ah0 & ah2 ^ ah1 & ah2;
l = al0 & al1 ^ al0 & al2 ^ al1 & al2;
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
bh7 = c & 65535 | d << 16;
bl7 = a & 65535 | b << 16;
h = bh3;
l = bl3;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = th;
l = tl;
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
bh3 = c & 65535 | d << 16;
bl3 = a & 65535 | b << 16;
ah1 = bh0;
ah2 = bh1;
ah3 = bh2;
ah4 = bh3;
ah5 = bh4;
ah6 = bh5;
ah7 = bh6;
ah0 = bh7;
al1 = bl0;
al2 = bl1;
al3 = bl2;
al4 = bl3;
al5 = bl4;
al6 = bl5;
al7 = bl6;
al0 = bl7;
if (i % 16 === 15) {
for (j = 0; j < 16; j++) {
h = wh[j];
l = wl[j];
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = wh[(j + 9) % 16];
l = wl[(j + 9) % 16];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
th = wh[(j + 1) % 16];
tl = wl[(j + 1) % 16];
h = (th >>> 1 | tl << 32 - 1) ^ (th >>> 8 | tl << 32 - 8) ^ th >>> 7;
l = (tl >>> 1 | th << 32 - 1) ^ (tl >>> 8 | th << 32 - 8) ^ (tl >>> 7 | th << 32 - 7);
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
th = wh[(j + 14) % 16];
tl = wl[(j + 14) % 16];
h = (th >>> 19 | tl << 32 - 19) ^ (tl >>> 61 - 32 | th << 32 - (61 - 32)) ^ th >>> 6;
l = (tl >>> 19 | th << 32 - 19) ^ (th >>> 61 - 32 | tl << 32 - (61 - 32)) ^ (tl >>> 6 | th << 32 - 6);
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
wh[j] = c & 65535 | d << 16;
wl[j] = a & 65535 | b << 16;
}
}
}
h = ah0;
l = al0;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[0];
l = hl[0];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[0] = ah0 = c & 65535 | d << 16;
hl[0] = al0 = a & 65535 | b << 16;
h = ah1;
l = al1;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[1];
l = hl[1];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[1] = ah1 = c & 65535 | d << 16;
hl[1] = al1 = a & 65535 | b << 16;
h = ah2;
l = al2;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[2];
l = hl[2];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[2] = ah2 = c & 65535 | d << 16;
hl[2] = al2 = a & 65535 | b << 16;
h = ah3;
l = al3;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[3];
l = hl[3];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[3] = ah3 = c & 65535 | d << 16;
hl[3] = al3 = a & 65535 | b << 16;
h = ah4;
l = al4;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[4];
l = hl[4];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[4] = ah4 = c & 65535 | d << 16;
hl[4] = al4 = a & 65535 | b << 16;
h = ah5;
l = al5;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[5];
l = hl[5];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[5] = ah5 = c & 65535 | d << 16;
hl[5] = al5 = a & 65535 | b << 16;
h = ah6;
l = al6;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[6];
l = hl[6];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[6] = ah6 = c & 65535 | d << 16;
hl[6] = al6 = a & 65535 | b << 16;
h = ah7;
l = al7;
a = l & 65535;
b = l >>> 16;
c = h & 65535;
d = h >>> 16;
h = hh[7];
l = hl[7];
a += l & 65535;
b += l >>> 16;
c += h & 65535;
d += h >>> 16;
b += a >>> 16;
c += b >>> 16;
d += c >>> 16;
hh[7] = ah7 = c & 65535 | d << 16;
hl[7] = al7 = a & 65535 | b << 16;
pos += 128;
n -= 128;
}
return n;
}
function crypto_hash(out, m, n) {
var hh = new Int32Array(8), hl = new Int32Array(8), x = new Uint8Array(256), i, b = n;
hh[0] = 1779033703;
hh[1] = 3144134277;
hh[2] = 1013904242;
hh[3] = 2773480762;
hh[4] = 1359893119;
hh[5] = 2600822924;
hh[6] = 528734635;
hh[7] = 1541459225;
hl[0] = 4089235720;
hl[1] = 2227873595;
hl[2] = 4271175723;
hl[3] = 1595750129;
hl[4] = 2917565137;
hl[5] = 725511199;
hl[6] = 4215389547;
hl[7] = 327033209;
crypto_hashblocks_hl(hh, hl, m, n);
n %= 128;
for (i = 0; i < n; i++)
x[i] = m[b - n + i];
x[n] = 128;
n = 256 - 128 * (n < 112 ? 1 : 0);
x[n - 9] = 0;
ts64(x, n - 8, b / 536870912 | 0, b << 3);
crypto_hashblocks_hl(hh, hl, x, n);
for (i = 0; i < 8; i++)
ts64(out, 8 * i, hh[i], hl[i]);
return 0;
}
function add(p, q2) {
var a = gf(), b = gf(), c = gf(), d = gf(), e = gf(), f = gf(), g = gf(), h = gf(), t = gf();
Z(a, p[1], p[0]);
Z(t, q2[1], q2[0]);
M(a, a, t);
A(b, p[0], p[1]);
A(t, q2[0], q2[1]);
M(b, b, t);
M(c, p[3], q2[3]);
M(c, c, D2);
M(d, p[2], q2[2]);
A(d, d, d);
Z(e, b, a);
Z(f, d, c);
A(g, d, c);
A(h, b, a);
M(p[0], e, f);
M(p[1], h, g);
M(p[2], g, f);
M(p[3], e, h);
}
function cswap(p, q2, b) {
var i;
for (i = 0; i < 4; i++) {
sel25519(p[i], q2[i], b);
}
}
function pack(r, p) {
var tx = gf(), ty = gf(), zi = gf();
inv25519(zi, p[2]);
M(tx, p[0], zi);
M(ty, p[1], zi);
pack25519(r, ty);
r[31] ^= par25519(tx) << 7;
}
function scalarmult(p, q2, s) {
var b, i;
set25519(p[0], gf0);
set25519(p[1], gf1);
set25519(p[2], gf1);
set25519(p[3], gf0);
for (i = 255; i >= 0; --i) {
b = s[i / 8 | 0] >> (i & 7) & 1;
cswap(p, q2, b);
add(q2, p);
add(p, p);
cswap(p, q2, b);
}
}
function scalarbase(p, s) {
var q2 = [gf(), gf(), gf(), gf()];
set25519(q2[0], X);
set25519(q2[1], Y);
set25519(q2[2], gf1);
M(q2[3], X, Y);
scalarmult(p, q2, s);
}
function crypto_sign_keypair(pk, sk, seeded) {
var d = new Uint8Array(64);
var p = [gf(), gf(), gf(), gf()];
var i;
if (!seeded)
randombytes(sk, 32);
crypto_hash(d, sk, 32);
d[0] &= 248;
d[31] &= 127;
d[31] |= 64;
scalarbase(p, d);
pack(pk, p);
for (i = 0; i < 32; i++)
sk[i + 32] = pk[i];
return 0;
}
var L = new Float64Array([237, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16]);
function modL(r, x) {
var carry, i, j, k;
for (i = 63; i >= 32; --i) {
carry = 0;
for (j = i - 32, k = i - 12; j < k; ++j) {
x[j] += carry - 16 * x[i] * L[j - (i - 32)];
carry = x[j] + 128 >> 8;
x[j] -= carry * 256;
}
x[j] += carry;
x[i] = 0;
}
carry = 0;
for (j = 0; j < 32; j++) {
x[j] += carry - (x[31] >> 4) * L[j];
carry = x[j] >> 8;
x[j] &= 255;
}
for (j = 0; j < 32; j++)
x[j] -= carry * L[j];
for (i = 0; i < 32; i++) {
x[i + 1] += x[i] >> 8;
r[i] = x[i] & 255;
}
}
function reduce(r) {
var x = new Float64Array(64), i;
for (i = 0; i < 64; i++)
x[i] = r[i];
for (i = 0; i < 64; i++)
r[i] = 0;
modL(r, x);
}
function crypto_sign(sm, m, n, sk) {
var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
var i, j, x = new Float64Array(64);
var p = [gf(), gf(), gf(), gf()];
crypto_hash(d, sk, 32);
d[0] &= 248;
d[31] &= 127;
d[31] |= 64;
var smlen = n + 64;
for (i = 0; i < n; i++)
sm[64 + i] = m[i];
for (i = 0; i < 32; i++)
sm[32 + i] = d[32 + i];
crypto_hash(r, sm.subarray(32), n + 32);
reduce(r);
scalarbase(p, r);
pack(sm, p);
for (i = 32; i < 64; i++)
sm[i] = sk[i];
crypto_hash(h, sm, n + 64);
reduce(h);
for (i = 0; i < 64; i++)
x[i] = 0;
for (i = 0; i < 32; i++)
x[i] = r[i];
for (i = 0; i < 32; i++) {
for (j = 0; j < 32; j++) {
x[i + j] += h[i] * d[j];
}
}
modL(sm.subarray(32), x);
return smlen;
}
function unpackneg(r, p) {
var t = gf(), chk = gf(), num = gf(), den = gf(), den2 = gf(), den4 = gf(), den6 = gf();
set25519(r[2], gf1);
unpack25519(r[1], p);
S(num, r[1]);
M(den, num, D);
Z(num, num, r[2]);
A(den, r[2], den);
S(den2, den);
S(den4, den2);
M(den6, den4, den2);
M(t, den6, num);
M(t, t, den);
pow2523(t, t);
M(t, t, num);
M(t, t, den);
M(t, t, den);
M(r[0], t, den);
S(chk, r[0]);
M(chk, chk, den);
if (neq25519(chk, num))
M(r[0], r[0], I);
S(chk, r[0]);
M(chk, chk, den);
if (neq25519(chk, num))
return -1;
if (par25519(r[0]) === p[31] >> 7)
Z(r[0], gf0, r[0]);
M(r[3], r[0], r[1]);
return 0;
}
function crypto_sign_open(m, sm, n, pk) {
var i, mlen;
var t = new Uint8Array(32), h = new Uint8Array(64);
var p = [gf(), gf(), gf(), gf()], q2 = [gf(), gf(), gf(), gf()];
mlen = -1;
if (n < 64)
return -1;
if (unpackneg(q2, pk))
return -1;
for (i = 0; i < n; i++)
m[i] = sm[i];
for (i = 0; i < 32; i++)
m[i + 32] = pk[i];
crypto_hash(h, m, n);
reduce(h);
scalarmult(p, q2, h);
scalarbase(q2, sm.subarray(32));
add(p, q2);
pack(t, p);
n -= 64;
if (crypto_verify_32(sm, 0, t, 0)) {
for (i = 0; i < n; i++)
m[i] = 0;
return -1;
}
for (i = 0; i < n; i++)
m[i] = sm[i + 64];
mlen = n;
return mlen;
}
var crypto_secretbox_KEYBYTES = 32, crypto_secretbox_NONCEBYTES = 24, crypto_secretbox_ZEROBYTES = 32, crypto_secretbox_BOXZEROBYTES = 16, crypto_scalarmult_BYTES = 32, crypto_scalarmult_SCALARBYTES = 32, crypto_box_PUBLICKEYBYTES = 32, crypto_box_SECRETKEYBYTES = 32, crypto_box_BEFORENMBYTES = 32, crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, crypto_sign_BYTES = 64, crypto_sign_PUBLICKEYBYTES = 32, crypto_sign_SECRETKEYBYTES = 64, crypto_sign_SEEDBYTES = 32, crypto_hash_BYTES = 64;
nacl.lowlevel = {
crypto_core_hsalsa20,
crypto_stream_xor,
crypto_stream,
crypto_stream_salsa20_xor,
crypto_stream_salsa20,
crypto_onetimeauth,
crypto_onetimeauth_verify,
crypto_verify_16,
crypto_verify_32,
crypto_secretbox,
crypto_secretbox_open,
crypto_scalarmult,
crypto_scalarmult_base,
crypto_box_beforenm,
crypto_box_afternm,
crypto_box,
crypto_box_open,
crypto_box_keypair,
crypto_hash,
crypto_sign,
crypto_sign_keypair,
crypto_sign_open,
crypto_secretbox_KEYBYTES,
crypto_secretbox_NONCEBYTES,
crypto_secretbox_ZEROBYTES,
crypto_secretbox_BOXZEROBYTES,
crypto_scalarmult_BYTES,
crypto_scalarmult_SCALARBYTES,
crypto_box_PUBLICKEYBYTES,
crypto_box_SECRETKEYBYTES,
crypto_box_BEFORENMBYTES,
crypto_box_NONCEBYTES,
crypto_box_ZEROBYTES,
crypto_box_BOXZEROBYTES,
crypto_sign_BYTES,
crypto_sign_PUBLICKEYBYTES,
crypto_sign_SECRETKEYBYTES,
crypto_sign_SEEDBYTES,
crypto_hash_BYTES
};
function checkLengths(k, n) {
if (k.length !== crypto_secretbox_KEYBYTES)
throw new Error("bad key size");
if (n.length !== crypto_secretbox_NONCEBYTES)
throw new Error("bad nonce size");
}
function checkBoxLengths(pk, sk) {
if (pk.length !== crypto_box_PUBLICKEYBYTES)
throw new Error("bad public key size");
if (sk.length !== crypto_box_SECRETKEYBYTES)
throw new Error("bad secret key size");
}
function checkArrayTypes() {
var t, i;
for (i = 0; i < arguments.length; i++) {
if ((t = Object.prototype.toString.call(arguments[i])) !== "[object Uint8Array]")
throw new TypeError("unexpected type " + t + ", use Uint8Array");
}
}
function cleanup(arr) {
for (var i = 0; i < arr.length; i++)
arr[i] = 0;
}
if (!nacl.util) {
nacl.util = {};
nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {
throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js");
};
}
nacl.randomBytes = function(n) {
var b = new Uint8Array(n);
randombytes(b, n);
return b;
};
nacl.secretbox = function(msg, nonce, key) {
checkArrayTypes(msg, nonce, key);
checkLengths(key, nonce);
var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
var c = new Uint8Array(m.length);
for (var i = 0; i < msg.length; i++)
m[i + crypto_secretbox_ZEROBYTES] = msg[i];
crypto_secretbox(c, m, m.length, nonce, key);
return c.subarray(crypto_secretbox_BOXZEROBYTES);
};
nacl.secretbox.open = function(box, nonce, key) {
checkArrayTypes(box, nonce, key);
checkLengths(key, nonce);
var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
var m = new Uint8Array(c.length);
for (var i = 0; i < box.length; i++)
c[i + crypto_secretbox_BOXZEROBYTES] = box[i];
if (c.length < 32)
return false;
if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0)
return false;
return m.subarray(crypto_secretbox_ZEROBYTES);
};
nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;
nacl.scalarMult = function(n, p) {
checkArrayTypes(n, p);
if (n.length !== crypto_scalarmult_SCALARBYTES)
throw new Error("bad n size");
if (p.length !== crypto_scalarmult_BYTES)
throw new Error("bad p size");
var q2 = new Uint8Array(crypto_scalarmult_BYTES);
crypto_scalarmult(q2, n, p);
return q2;
};
nacl.scalarMult.base = function(n) {
checkArrayTypes(n);
if (n.length !== crypto_scalarmult_SCALARBYTES)
throw new Error("bad n size");
var q2 = new Uint8Array(crypto_scalarmult_BYTES);
crypto_scalarmult_base(q2, n);
return q2;
};
nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;
nacl.box = function(msg, nonce, publicKey, secretKey) {
var k = nacl.box.before(publicKey, secretKey);
return nacl.secretbox(msg, nonce, k);
};
nacl.box.before = function(publicKey, secretKey) {
checkArrayTypes(publicKey, secretKey);
checkBoxLengths(publicKey, secretKey);
var k = new Uint8Array(crypto_box_BEFORENMBYTES);
crypto_box_beforenm(k, publicKey, secretKey);
return k;
};
nacl.box.after = nacl.secretbox;
nacl.box.open = function(msg, nonce, publicKey, secretKey) {
var k = nacl.box.before(publicKey, secretKey);
return nacl.secretbox.open(msg, nonce, k);
};
nacl.box.open.after = nacl.secretbox.open;
nacl.box.keyPair = function() {
var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
crypto_box_keypair(pk, sk);
return { publicKey: pk, secretKey: sk };
};
nacl.box.keyPair.fromSecretKey = function(secretKey) {
checkArrayTypes(secretKey);
if (secretKey.length !== crypto_box_SECRETKEYBYTES)
throw new Error("bad secret key size");
var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
crypto_scalarmult_base(pk, secretKey);
return { publicKey: pk, secretKey: new Uint8Array(secretKey) };
};
nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
nacl.box.nonceLength = crypto_box_NONCEBYTES;
nacl.box.overheadLength = nacl.secretbox.overheadLength;
nacl.sign = function(msg, secretKey) {
checkArrayTypes(msg, secretKey);
if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
throw new Error("bad secret key size");
var signedMsg = new Uint8Array(crypto_sign_BYTES + msg.length);
crypto_sign(signedMsg, msg, msg.length, secretKey);
return signedMsg;
};
nacl.sign.open = function(signedMsg, publicKey) {
if (arguments.length !== 2)
throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");
checkArrayTypes(signedMsg, publicKey);
if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
throw new Error("bad public key size");
var tmp = new Uint8Array(signedMsg.length);
var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
if (mlen < 0)
return null;
var m = new Uint8Array(mlen);
for (var i = 0; i < m.length; i++)
m[i] = tmp[i];
return m;
};
nacl.sign.detached = function(msg, secretKey) {
var signedMsg = nacl.sign(msg, secretKey);
var sig = new Uint8Array(crypto_sign_BYTES);
for (var i = 0; i < sig.length; i++)
sig[i] = signedMsg[i];
return sig;
};
nacl.sign.detached.verify = function(msg, sig, publicKey) {
checkArrayTypes(msg, sig, publicKey);
if (sig.length !== crypto_sign_BYTES)
throw new Error("bad signature size");
if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
throw new Error("bad public key size");
var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
var m = new Uint8Array(crypto_sign_BYTES + msg.length);
var i;
for (i = 0; i < crypto_sign_BYTES; i++)
sm[i] = sig[i];
for (i = 0; i < msg.length; i++)
sm[i + crypto_sign_BYTES] = msg[i];
return crypto_sign_open(m, sm, sm.length, publicKey) >= 0;
};
nacl.sign.keyPair = function() {
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
crypto_sign_keypair(pk, sk);
return { publicKey: pk, secretKey: sk };
};
nacl.sign.keyPair.fromSecretKey = function(secretKey) {
checkArrayTypes(secretKey);
if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
throw new Error("bad secret key size");
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
for (var i = 0; i < pk.length; i++)
pk[i] = secretKey[32 + i];
return { publicKey: pk, secretKey: new Uint8Array(secretKey) };
};
nacl.sign.keyPair.fromSeed = function(seed) {
checkArrayTypes(seed);
if (seed.length !== crypto_sign_SEEDBYTES)
throw new Error("bad seed size");
var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
for (var i = 0; i < 32; i++)
sk[i] = seed[i];
crypto_sign_keypair(pk, sk, true);
return { publicKey: pk, secretKey: sk };
};
nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
nacl.sign.seedLength = crypto_sign_SEEDBYTES;
nacl.sign.signatureLength = crypto_sign_BYTES;
nacl.hash = function(msg) {
checkArrayTypes(msg);
var h = new Uint8Array(crypto_hash_BYTES);
crypto_hash(h, msg, msg.length);
return h;
};
nacl.hash.hashLength = crypto_hash_BYTES;
nacl.verify = function(x, y) {
checkArrayTypes(x, y);
if (x.length === 0 || y.length === 0)
return false;
if (x.length !== y.length)
return false;
return vn(x, 0, y, 0, x.length) === 0 ? true : false;
};
nacl.setPRNG = function(fn) {
randombytes = fn;
};
(function() {
var crypto2 = typeof self !== "undefined" ? self.crypto || self.msCrypto : null;
if (crypto2 && crypto2.getRandomValues) {
var QUOTA = 65536;
nacl.setPRNG(function(x, n) {
var i, v = new Uint8Array(n);
for (i = 0; i < n; i += QUOTA) {
crypto2.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));
}
for (i = 0; i < n; i++)
x[i] = v[i];
cleanup(v);
});
} else if (typeof require !== "undefined") {
crypto2 = require("crypto");
if (crypto2 && crypto2.randomBytes) {
nacl.setPRNG(function(x, n) {
var i, v = crypto2.randomBytes(n);
for (i = 0; i < n; i++)
x[i] = v[i];
cleanup(v);
});
}
}
})();
})(typeof module2 !== "undefined" && module2.exports ? module2.exports : self.nacl = self.nacl || {});
}
});
// node_modules/sshpk/lib/utils.js
var require_utils2 = __commonJS({
"node_modules/sshpk/lib/utils.js"(exports, module2) {
module2.exports = {
bufferSplit,
addRSAMissing,
calculateDSAPublic,
calculateED25519Public,
calculateX25519Public,
mpNormalize,
mpDenormalize,
ecNormalize,
countZeros,
assertCompatible,
isCompatible,
opensslKeyDeriv,
opensshCipherInfo,
publicFromPrivateECDSA,
zeroPadToLength,
writeBitString,
readBitString,
pbkdf2
};
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var PrivateKey = require_private_key();
var Key = require_key();
var crypto2 = require("crypto");
var algs = require_algs();
var asn1 = require_lib();
var ec = require_ec();
var jsbn = require_jsbn().BigInteger;
var nacl = require_nacl_fast();
var MAX_CLASS_DEPTH = 3;
function isCompatible(obj, klass, needVer) {
if (obj === null || typeof obj !== "object")
return false;
if (needVer === void 0)
needVer = klass.prototype._sshpkApiVersion;
if (obj instanceof klass && klass.prototype._sshpkApiVersion[0] == needVer[0])
return true;
var proto = Object.getPrototypeOf(obj);
var depth = 0;
while (proto.constructor.name !== klass.name) {
proto = Object.getPrototypeOf(proto);
if (!proto || ++depth > MAX_CLASS_DEPTH)
return false;
}
if (proto.constructor.name !== klass.name)
return false;
var ver = proto._sshpkApiVersion;
if (ver === void 0)
ver = klass._oldVersionDetect(obj);
if (ver[0] != needVer[0] || ver[1] < needVer[1])
return false;
return true;
}
function assertCompatible(obj, klass, needVer, name) {
if (name === void 0)
name = "object";
assert.ok(obj, name + " must not be null");
assert.object(obj, name + " must be an object");
if (needVer === void 0)
needVer = klass.prototype._sshpkApiVersion;
if (obj instanceof klass && klass.prototype._sshpkApiVersion[0] == needVer[0])
return;
var proto = Object.getPrototypeOf(obj);
var depth = 0;
while (proto.constructor.name !== klass.name) {
proto = Object.getPrototypeOf(proto);
assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, name + " must be a " + klass.name + " instance");
}
assert.strictEqual(proto.constructor.name, klass.name, name + " must be a " + klass.name + " instance");
var ver = proto._sshpkApiVersion;
if (ver === void 0)
ver = klass._oldVersionDetect(obj);
assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], name + " must be compatible with " + klass.name + " klass version " + needVer[0] + "." + needVer[1]);
}
var CIPHER_LEN = {
"des-ede3-cbc": { key: 24, iv: 8 },
"aes-128-cbc": { key: 16, iv: 16 },
"aes-256-cbc": { key: 32, iv: 16 }
};
var PKCS5_SALT_LEN = 8;
function opensslKeyDeriv(cipher, salt, passphrase, count) {
assert.buffer(salt, "salt");
assert.buffer(passphrase, "passphrase");
assert.number(count, "iteration count");
var clen = CIPHER_LEN[cipher];
assert.object(clen, "supported cipher");
salt = salt.slice(0, PKCS5_SALT_LEN);
var D, D_prev, bufs;
var material = Buffer2.alloc(0);
while (material.length < clen.key + clen.iv) {
bufs = [];
if (D_prev)
bufs.push(D_prev);
bufs.push(passphrase);
bufs.push(salt);
D = Buffer2.concat(bufs);
for (var j = 0; j < count; ++j)
D = crypto2.createHash("md5").update(D).digest();
material = Buffer2.concat([material, D]);
D_prev = D;
}
return {
key: material.slice(0, clen.key),
iv: material.slice(clen.key, clen.key + clen.iv)
};
}
function pbkdf2(hashAlg, salt, iterations, size, passphrase) {
var hkey = Buffer2.alloc(salt.length + 4);
salt.copy(hkey);
var gen = 0, ts = [];
var i = 1;
while (gen < size) {
var t = T(i++);
gen += t.length;
ts.push(t);
}
return Buffer2.concat(ts).slice(0, size);
function T(I) {
hkey.writeUInt32BE(I, hkey.length - 4);
var hmac = crypto2.createHmac(hashAlg, passphrase);
hmac.update(hkey);
var Ti = hmac.digest();
var Uc = Ti;
var c = 1;
while (c++ < iterations) {
hmac = crypto2.createHmac(hashAlg, passphrase);
hmac.update(Uc);
Uc = hmac.digest();
for (var x = 0; x < Ti.length; ++x)
Ti[x] ^= Uc[x];
}
return Ti;
}
}
function countZeros(buf) {
var o = 0, obit = 8;
while (o < buf.length) {
var mask = 1 << obit;
if ((buf[o] & mask) === mask)
break;
obit--;
if (obit < 0) {
o++;
obit = 8;
}
}
return o * 8 + (8 - obit) - 1;
}
function bufferSplit(buf, chr) {
assert.buffer(buf);
assert.string(chr);
var parts = [];
var lastPart = 0;
var matches = 0;
for (var i = 0; i < buf.length; ++i) {
if (buf[i] === chr.charCodeAt(matches))
++matches;
else if (buf[i] === chr.charCodeAt(0))
matches = 1;
else
matches = 0;
if (matches >= chr.length) {
var newPart = i + 1;
parts.push(buf.slice(lastPart, newPart - matches));
lastPart = newPart;
matches = 0;
}
}
if (lastPart <= buf.length)
parts.push(buf.slice(lastPart, buf.length));
return parts;
}
function ecNormalize(buf, addZero) {
assert.buffer(buf);
if (buf[0] === 0 && buf[1] === 4) {
if (addZero)
return buf;
return buf.slice(1);
} else if (buf[0] === 4) {
if (!addZero)
return buf;
} else {
while (buf[0] === 0)
buf = buf.slice(1);
if (buf[0] === 2 || buf[0] === 3)
throw new Error("Compressed elliptic curve points are not supported");
if (buf[0] !== 4)
throw new Error("Not a valid elliptic curve point");
if (!addZero)
return buf;
}
var b = Buffer2.alloc(buf.length + 1);
b[0] = 0;
buf.copy(b, 1);
return b;
}
function readBitString(der, tag) {
if (tag === void 0)
tag = asn1.Ber.BitString;
var buf = der.readString(tag, true);
assert.strictEqual(buf[0], 0, "bit strings with unused bits are not supported (0x" + buf[0].toString(16) + ")");
return buf.slice(1);
}
function writeBitString(der, buf, tag) {
if (tag === void 0)
tag = asn1.Ber.BitString;
var b = Buffer2.alloc(buf.length + 1);
b[0] = 0;
buf.copy(b, 1);
der.writeBuffer(b, tag);
}
function mpNormalize(buf) {
assert.buffer(buf);
while (buf.length > 1 && buf[0] === 0 && (buf[1] & 128) === 0)
buf = buf.slice(1);
if ((buf[0] & 128) === 128) {
var b = Buffer2.alloc(buf.length + 1);
b[0] = 0;
buf.copy(b, 1);
buf = b;
}
return buf;
}
function mpDenormalize(buf) {
assert.buffer(buf);
while (buf.length > 1 && buf[0] === 0)
buf = buf.slice(1);
return buf;
}
function zeroPadToLength(buf, len) {
assert.buffer(buf);
assert.number(len);
while (buf.length > len) {
assert.equal(buf[0], 0);
buf = buf.slice(1);
}
while (buf.length < len) {
var b = Buffer2.alloc(buf.length + 1);
b[0] = 0;
buf.copy(b, 1);
buf = b;
}
return buf;
}
function bigintToMpBuf(bigint) {
var buf = Buffer2.from(bigint.toByteArray());
buf = mpNormalize(buf);
return buf;
}
function calculateDSAPublic(g, p, x) {
assert.buffer(g);
assert.buffer(p);
assert.buffer(x);
g = new jsbn(g);
p = new jsbn(p);
x = new jsbn(x);
var y = g.modPow(x, p);
var ybuf = bigintToMpBuf(y);
return ybuf;
}
function calculateED25519Public(k) {
assert.buffer(k);
var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k));
return Buffer2.from(kp.publicKey);
}
function calculateX25519Public(k) {
assert.buffer(k);
var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k));
return Buffer2.from(kp.publicKey);
}
function addRSAMissing(key) {
assert.object(key);
assertCompatible(key, PrivateKey, [1, 1]);
var d = new jsbn(key.part.d.data);
var buf;
if (!key.part.dmodp) {
var p = new jsbn(key.part.p.data);
var dmodp = d.mod(p.subtract(1));
buf = bigintToMpBuf(dmodp);
key.part.dmodp = { name: "dmodp", data: buf };
key.parts.push(key.part.dmodp);
}
if (!key.part.dmodq) {
var q2 = new jsbn(key.part.q.data);
var dmodq = d.mod(q2.subtract(1));
buf = bigintToMpBuf(dmodq);
key.part.dmodq = { name: "dmodq", data: buf };
key.parts.push(key.part.dmodq);
}
}
function publicFromPrivateECDSA(curveName, priv) {
assert.string(curveName, "curveName");
assert.buffer(priv);
var params = algs.curves[curveName];
var p = new jsbn(params.p);
var a = new jsbn(params.a);
var b = new jsbn(params.b);
var curve = new ec.ECCurveFp(p, a, b);
var G = curve.decodePointHex(params.G.toString("hex"));
var d = new jsbn(mpNormalize(priv));
var pub = G.multiply(d);
pub = Buffer2.from(curve.encodePointHex(pub), "hex");
var parts = [];
parts.push({ name: "curve", data: Buffer2.from(curveName) });
parts.push({ name: "Q", data: pub });
var key = new Key({ type: "ecdsa", curve, parts });
return key;
}
function opensshCipherInfo(cipher) {
var inf = {};
switch (cipher) {
case "3des-cbc":
inf.keySize = 24;
inf.blockSize = 8;
inf.opensslName = "des-ede3-cbc";
break;
case "blowfish-cbc":
inf.keySize = 16;
inf.blockSize = 8;
inf.opensslName = "bf-cbc";
break;
case "aes128-cbc":
case "aes128-ctr":
case "aes128-gcm@openssh.com":
inf.keySize = 16;
inf.blockSize = 16;
inf.opensslName = "aes-128-" + cipher.slice(7, 10);
break;
case "aes192-cbc":
case "aes192-ctr":
case "aes192-gcm@openssh.com":
inf.keySize = 24;
inf.blockSize = 16;
inf.opensslName = "aes-192-" + cipher.slice(7, 10);
break;
case "aes256-cbc":
case "aes256-ctr":
case "aes256-gcm@openssh.com":
inf.keySize = 32;
inf.blockSize = 16;
inf.opensslName = "aes-256-" + cipher.slice(7, 10);
break;
default:
throw new Error('Unsupported openssl cipher "' + cipher + '"');
}
return inf;
}
}
});
// node_modules/sshpk/lib/ssh-buffer.js
var require_ssh_buffer = __commonJS({
"node_modules/sshpk/lib/ssh-buffer.js"(exports, module2) {
module2.exports = SSHBuffer;
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
function SSHBuffer(opts) {
assert.object(opts, "options");
if (opts.buffer !== void 0)
assert.buffer(opts.buffer, "options.buffer");
this._size = opts.buffer ? opts.buffer.length : 1024;
this._buffer = opts.buffer || Buffer2.alloc(this._size);
this._offset = 0;
}
SSHBuffer.prototype.toBuffer = function() {
return this._buffer.slice(0, this._offset);
};
SSHBuffer.prototype.atEnd = function() {
return this._offset >= this._buffer.length;
};
SSHBuffer.prototype.remainder = function() {
return this._buffer.slice(this._offset);
};
SSHBuffer.prototype.skip = function(n) {
this._offset += n;
};
SSHBuffer.prototype.expand = function() {
this._size *= 2;
var buf = Buffer2.alloc(this._size);
this._buffer.copy(buf, 0);
this._buffer = buf;
};
SSHBuffer.prototype.readPart = function() {
return { data: this.readBuffer() };
};
SSHBuffer.prototype.readBuffer = function() {
var len = this._buffer.readUInt32BE(this._offset);
this._offset += 4;
assert.ok(this._offset + len <= this._buffer.length, "length out of bounds at +0x" + this._offset.toString(16) + " (data truncated?)");
var buf = this._buffer.slice(this._offset, this._offset + len);
this._offset += len;
return buf;
};
SSHBuffer.prototype.readString = function() {
return this.readBuffer().toString();
};
SSHBuffer.prototype.readCString = function() {
var offset = this._offset;
while (offset < this._buffer.length && this._buffer[offset] !== 0)
offset++;
assert.ok(offset < this._buffer.length, "c string does not terminate");
var str = this._buffer.slice(this._offset, offset).toString();
this._offset = offset + 1;
return str;
};
SSHBuffer.prototype.readInt = function() {
var v = this._buffer.readUInt32BE(this._offset);
this._offset += 4;
return v;
};
SSHBuffer.prototype.readInt64 = function() {
assert.ok(this._offset + 8 < this._buffer.length, "buffer not long enough to read Int64");
var v = this._buffer.slice(this._offset, this._offset + 8);
this._offset += 8;
return v;
};
SSHBuffer.prototype.readChar = function() {
var v = this._buffer[this._offset++];
return v;
};
SSHBuffer.prototype.writeBuffer = function(buf) {
while (this._offset + 4 + buf.length > this._size)
this.expand();
this._buffer.writeUInt32BE(buf.length, this._offset);
this._offset += 4;
buf.copy(this._buffer, this._offset);
this._offset += buf.length;
};
SSHBuffer.prototype.writeString = function(str) {
this.writeBuffer(Buffer2.from(str, "utf8"));
};
SSHBuffer.prototype.writeCString = function(str) {
while (this._offset + 1 + str.length > this._size)
this.expand();
this._buffer.write(str, this._offset);
this._offset += str.length;
this._buffer[this._offset++] = 0;
};
SSHBuffer.prototype.writeInt = function(v) {
while (this._offset + 4 > this._size)
this.expand();
this._buffer.writeUInt32BE(v, this._offset);
this._offset += 4;
};
SSHBuffer.prototype.writeInt64 = function(v) {
assert.buffer(v, "value");
if (v.length > 8) {
var lead = v.slice(0, v.length - 8);
for (var i = 0; i < lead.length; ++i) {
assert.strictEqual(lead[i], 0, "must fit in 64 bits of precision");
}
v = v.slice(v.length - 8, v.length);
}
while (this._offset + 8 > this._size)
this.expand();
v.copy(this._buffer, this._offset);
this._offset += 8;
};
SSHBuffer.prototype.writeChar = function(v) {
while (this._offset + 1 > this._size)
this.expand();
this._buffer[this._offset++] = v;
};
SSHBuffer.prototype.writePart = function(p) {
this.writeBuffer(p.data);
};
SSHBuffer.prototype.write = function(buf) {
while (this._offset + buf.length > this._size)
this.expand();
buf.copy(this._buffer, this._offset);
this._offset += buf.length;
};
}
});
// node_modules/sshpk/lib/signature.js
var require_signature = __commonJS({
"node_modules/sshpk/lib/signature.js"(exports, module2) {
module2.exports = Signature;
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var crypto2 = require("crypto");
var errs = require_errors2();
var utils = require_utils2();
var asn1 = require_lib();
var SSHBuffer = require_ssh_buffer();
var InvalidAlgorithmError = errs.InvalidAlgorithmError;
var SignatureParseError = errs.SignatureParseError;
function Signature(opts) {
assert.object(opts, "options");
assert.arrayOfObject(opts.parts, "options.parts");
assert.string(opts.type, "options.type");
var partLookup = {};
for (var i = 0; i < opts.parts.length; ++i) {
var part = opts.parts[i];
partLookup[part.name] = part;
}
this.type = opts.type;
this.hashAlgorithm = opts.hashAlgo;
this.curve = opts.curve;
this.parts = opts.parts;
this.part = partLookup;
}
Signature.prototype.toBuffer = function(format) {
if (format === void 0)
format = "asn1";
assert.string(format, "format");
var buf;
var stype = "ssh-" + this.type;
switch (this.type) {
case "rsa":
switch (this.hashAlgorithm) {
case "sha256":
stype = "rsa-sha2-256";
break;
case "sha512":
stype = "rsa-sha2-512";
break;
case "sha1":
case void 0:
break;
default:
throw new Error("SSH signature format does not support hash algorithm " + this.hashAlgorithm);
}
if (format === "ssh") {
buf = new SSHBuffer({});
buf.writeString(stype);
buf.writePart(this.part.sig);
return buf.toBuffer();
} else {
return this.part.sig.data;
}
break;
case "ed25519":
if (format === "ssh") {
buf = new SSHBuffer({});
buf.writeString(stype);
buf.writePart(this.part.sig);
return buf.toBuffer();
} else {
return this.part.sig.data;
}
break;
case "dsa":
case "ecdsa":
var r, s;
if (format === "asn1") {
var der = new asn1.BerWriter();
der.startSequence();
r = utils.mpNormalize(this.part.r.data);
s = utils.mpNormalize(this.part.s.data);
der.writeBuffer(r, asn1.Ber.Integer);
der.writeBuffer(s, asn1.Ber.Integer);
der.endSequence();
return der.buffer;
} else if (format === "ssh" && this.type === "dsa") {
buf = new SSHBuffer({});
buf.writeString("ssh-dss");
r = this.part.r.data;
if (r.length > 20 && r[0] === 0)
r = r.slice(1);
s = this.part.s.data;
if (s.length > 20 && s[0] === 0)
s = s.slice(1);
if (this.hashAlgorithm && this.hashAlgorithm !== "sha1" || r.length + s.length !== 40) {
throw new Error("OpenSSH only supports DSA signatures with SHA1 hash");
}
buf.writeBuffer(Buffer2.concat([r, s]));
return buf.toBuffer();
} else if (format === "ssh" && this.type === "ecdsa") {
var inner = new SSHBuffer({});
r = this.part.r.data;
inner.writeBuffer(r);
inner.writePart(this.part.s);
buf = new SSHBuffer({});
var curve;
if (r[0] === 0)
r = r.slice(1);
var sz = r.length * 8;
if (sz === 256)
curve = "nistp256";
else if (sz === 384)
curve = "nistp384";
else if (sz === 528)
curve = "nistp521";
buf.writeString("ecdsa-sha2-" + curve);
buf.writeBuffer(inner.toBuffer());
return buf.toBuffer();
}
throw new Error("Invalid signature format");
default:
throw new Error("Invalid signature data");
}
};
Signature.prototype.toString = function(format) {
assert.optionalString(format, "format");
return this.toBuffer(format).toString("base64");
};
Signature.parse = function(data, type, format) {
if (typeof data === "string")
data = Buffer2.from(data, "base64");
assert.buffer(data, "data");
assert.string(format, "format");
assert.string(type, "type");
var opts = {};
opts.type = type.toLowerCase();
opts.parts = [];
try {
assert.ok(data.length > 0, "signature must not be empty");
switch (opts.type) {
case "rsa":
return parseOneNum(data, type, format, opts);
case "ed25519":
return parseOneNum(data, type, format, opts);
case "dsa":
case "ecdsa":
if (format === "asn1")
return parseDSAasn1(data, type, format, opts);
else if (opts.type === "dsa")
return parseDSA(data, type, format, opts);
else
return parseECDSA(data, type, format, opts);
default:
throw new InvalidAlgorithmError(type);
}
} catch (e) {
if (e instanceof InvalidAlgorithmError)
throw e;
throw new SignatureParseError(type, format, e);
}
};
function parseOneNum(data, type, format, opts) {
if (format === "ssh") {
try {
var buf = new SSHBuffer({ buffer: data });
var head = buf.readString();
} catch (e) {
}
if (buf !== void 0) {
var msg = "SSH signature does not match expected type (expected " + type + ", got " + head + ")";
switch (head) {
case "ssh-rsa":
assert.strictEqual(type, "rsa", msg);
opts.hashAlgo = "sha1";
break;
case "rsa-sha2-256":
assert.strictEqual(type, "rsa", msg);
opts.hashAlgo = "sha256";
break;
case "rsa-sha2-512":
assert.strictEqual(type, "rsa", msg);
opts.hashAlgo = "sha512";
break;
case "ssh-ed25519":
assert.strictEqual(type, "ed25519", msg);
opts.hashAlgo = "sha512";
break;
default:
throw new Error("Unknown SSH signature type: " + head);
}
var sig = buf.readPart();
assert.ok(buf.atEnd(), "extra trailing bytes");
sig.name = "sig";
opts.parts.push(sig);
return new Signature(opts);
}
}
opts.parts.push({ name: "sig", data });
return new Signature(opts);
}
function parseDSAasn1(data, type, format, opts) {
var der = new asn1.BerReader(data);
der.readSequence();
var r = der.readString(asn1.Ber.Integer, true);
var s = der.readString(asn1.Ber.Integer, true);
opts.parts.push({ name: "r", data: utils.mpNormalize(r) });
opts.parts.push({ name: "s", data: utils.mpNormalize(s) });
return new Signature(opts);
}
function parseDSA(data, type, format, opts) {
if (data.length != 40) {
var buf = new SSHBuffer({ buffer: data });
var d = buf.readBuffer();
if (d.toString("ascii") === "ssh-dss")
d = buf.readBuffer();
assert.ok(buf.atEnd(), "extra trailing bytes");
assert.strictEqual(d.length, 40, "invalid inner length");
data = d;
}
opts.parts.push({ name: "r", data: data.slice(0, 20) });
opts.parts.push({ name: "s", data: data.slice(20, 40) });
return new Signature(opts);
}
function parseECDSA(data, type, format, opts) {
var buf = new SSHBuffer({ buffer: data });
var r, s;
var inner = buf.readBuffer();
var stype = inner.toString("ascii");
if (stype.slice(0, 6) === "ecdsa-") {
var parts = stype.split("-");
assert.strictEqual(parts[0], "ecdsa");
assert.strictEqual(parts[1], "sha2");
opts.curve = parts[2];
switch (opts.curve) {
case "nistp256":
opts.hashAlgo = "sha256";
break;
case "nistp384":
opts.hashAlgo = "sha384";
break;
case "nistp521":
opts.hashAlgo = "sha512";
break;
default:
throw new Error("Unsupported ECDSA curve: " + opts.curve);
}
inner = buf.readBuffer();
assert.ok(buf.atEnd(), "extra trailing bytes on outer");
buf = new SSHBuffer({ buffer: inner });
r = buf.readPart();
} else {
r = { data: inner };
}
s = buf.readPart();
assert.ok(buf.atEnd(), "extra trailing bytes");
r.name = "r";
s.name = "s";
opts.parts.push(r);
opts.parts.push(s);
return new Signature(opts);
}
Signature.isSignature = function(obj, ver) {
return utils.isCompatible(obj, Signature, ver);
};
Signature.prototype._sshpkApiVersion = [2, 1];
Signature._oldVersionDetect = function(obj) {
assert.func(obj.toBuffer);
if (obj.hasOwnProperty("hashAlgorithm"))
return [2, 0];
return [1, 0];
};
}
});
// node_modules/ecc-jsbn/lib/sec.js
var require_sec = __commonJS({
"node_modules/ecc-jsbn/lib/sec.js"(exports, module2) {
var BigInteger = require_jsbn().BigInteger;
var ECCurveFp = require_ec().ECCurveFp;
function X9ECParameters(curve, g, n, h) {
this.curve = curve;
this.g = g;
this.n = n;
this.h = h;
}
function x9getCurve() {
return this.curve;
}
function x9getG() {
return this.g;
}
function x9getN() {
return this.n;
}
function x9getH() {
return this.h;
}
X9ECParameters.prototype.getCurve = x9getCurve;
X9ECParameters.prototype.getG = x9getG;
X9ECParameters.prototype.getN = x9getN;
X9ECParameters.prototype.getH = x9getH;
function fromHex(s) {
return new BigInteger(s, 16);
}
function secp128r1() {
var p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF");
var a = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC");
var b = fromHex("E87579C11079F43DD824993C2CEE5ED3");
var n = fromHex("FFFFFFFE0000000075A30D1B9038A115");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83");
return new X9ECParameters(curve, G, n, h);
}
function secp160k1() {
var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73");
var a = BigInteger.ZERO;
var b = fromHex("7");
var n = fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE");
return new X9ECParameters(curve, G, n, h);
}
function secp160r1() {
var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF");
var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC");
var b = fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45");
var n = fromHex("0100000000000000000001F4C8F927AED3CA752257");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32");
return new X9ECParameters(curve, G, n, h);
}
function secp192k1() {
var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37");
var a = BigInteger.ZERO;
var b = fromHex("3");
var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D");
return new X9ECParameters(curve, G, n, h);
}
function secp192r1() {
var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF");
var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC");
var b = fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1");
var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("04188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811");
return new X9ECParameters(curve, G, n, h);
}
function secp224r1() {
var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001");
var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE");
var b = fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4");
var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34");
return new X9ECParameters(curve, G, n, h);
}
function secp256r1() {
var p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF");
var a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC");
var b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B");
var n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551");
var h = BigInteger.ONE;
var curve = new ECCurveFp(p, a, b);
var G = curve.decodePointHex("046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
return new X9ECParameters(curve, G, n, h);
}
module2.exports = {
"secp128r1": secp128r1,
"secp160k1": secp160k1,
"secp160r1": secp160r1,
"secp192k1": secp192k1,
"secp192r1": secp192r1,
"secp224r1": secp224r1,
"secp256r1": secp256r1
};
}
});
// node_modules/ecc-jsbn/index.js
var require_ecc_jsbn = __commonJS({
"node_modules/ecc-jsbn/index.js"(exports) {
var crypto2 = require("crypto");
var BigInteger = require_jsbn().BigInteger;
var ECPointFp = require_ec().ECPointFp;
var Buffer2 = require_safer().Buffer;
exports.ECCurves = require_sec();
function unstupid(hex, len) {
return hex.length >= len ? hex : unstupid("0" + hex, len);
}
exports.ECKey = function(curve, key, isPublic) {
var priv;
var c = curve();
var n = c.getN();
var bytes = Math.floor(n.bitLength() / 8);
if (key) {
if (isPublic) {
var curve = c.getCurve();
this.P = curve.decodePointHex(key.toString("hex"));
} else {
if (key.length != bytes)
return false;
priv = new BigInteger(key.toString("hex"), 16);
}
} else {
var n1 = n.subtract(BigInteger.ONE);
var r = new BigInteger(crypto2.randomBytes(n.bitLength()));
priv = r.mod(n1).add(BigInteger.ONE);
this.P = c.getG().multiply(priv);
}
if (this.P) {
this.PublicKey = Buffer2.from(c.getCurve().encodeCompressedPointHex(this.P), "hex");
}
if (priv) {
this.PrivateKey = Buffer2.from(unstupid(priv.toString(16), bytes * 2), "hex");
this.deriveSharedSecret = function(key2) {
if (!key2 || !key2.P)
return false;
var S = key2.P.multiply(priv);
return Buffer2.from(unstupid(S.getX().toBigInteger().toString(16), bytes * 2), "hex");
};
}
};
}
});
// node_modules/sshpk/lib/dhe.js
var require_dhe = __commonJS({
"node_modules/sshpk/lib/dhe.js"(exports, module2) {
module2.exports = {
DiffieHellman,
generateECDSA,
generateED25519
};
var assert = require_assert();
var crypto2 = require("crypto");
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var nacl = require_nacl_fast();
var Key = require_key();
var PrivateKey = require_private_key();
var CRYPTO_HAVE_ECDH = crypto2.createECDH !== void 0;
var ecdh = require_ecc_jsbn();
var ec = require_ec();
var jsbn = require_jsbn().BigInteger;
function DiffieHellman(key) {
utils.assertCompatible(key, Key, [1, 4], "key");
this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]);
this._algo = key.type;
this._curve = key.curve;
this._key = key;
if (key.type === "dsa") {
if (!CRYPTO_HAVE_ECDH) {
throw new Error("Due to bugs in the node 0.10 crypto API, node 0.12.x or later is required to use DH");
}
this._dh = crypto2.createDiffieHellman(key.part.p.data, void 0, key.part.g.data, void 0);
this._p = key.part.p;
this._g = key.part.g;
if (this._isPriv)
this._dh.setPrivateKey(key.part.x.data);
this._dh.setPublicKey(key.part.y.data);
} else if (key.type === "ecdsa") {
if (!CRYPTO_HAVE_ECDH) {
this._ecParams = new X9ECParameters(this._curve);
if (this._isPriv) {
this._priv = new ECPrivate(this._ecParams, key.part.d.data);
}
return;
}
var curve = {
"nistp256": "prime256v1",
"nistp384": "secp384r1",
"nistp521": "secp521r1"
}[key.curve];
this._dh = crypto2.createECDH(curve);
if (typeof this._dh !== "object" || typeof this._dh.setPrivateKey !== "function") {
CRYPTO_HAVE_ECDH = false;
DiffieHellman.call(this, key);
return;
}
if (this._isPriv)
this._dh.setPrivateKey(key.part.d.data);
this._dh.setPublicKey(key.part.Q.data);
} else if (key.type === "curve25519") {
if (this._isPriv) {
utils.assertCompatible(key, PrivateKey, [1, 5], "key");
this._priv = key.part.k.data;
}
} else {
throw new Error("DH not supported for " + key.type + " keys");
}
}
DiffieHellman.prototype.getPublicKey = function() {
if (this._isPriv)
return this._key.toPublic();
return this._key;
};
DiffieHellman.prototype.getPrivateKey = function() {
if (this._isPriv)
return this._key;
else
return void 0;
};
DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey;
DiffieHellman.prototype._keyCheck = function(pk, isPub) {
assert.object(pk, "key");
if (!isPub)
utils.assertCompatible(pk, PrivateKey, [1, 3], "key");
utils.assertCompatible(pk, Key, [1, 4], "key");
if (pk.type !== this._algo) {
throw new Error("A " + pk.type + " key cannot be used in " + this._algo + " Diffie-Hellman");
}
if (pk.curve !== this._curve) {
throw new Error("A key from the " + pk.curve + " curve cannot be used with a " + this._curve + " Diffie-Hellman");
}
if (pk.type === "dsa") {
assert.deepEqual(pk.part.p, this._p, "DSA key prime does not match");
assert.deepEqual(pk.part.g, this._g, "DSA key generator does not match");
}
};
DiffieHellman.prototype.setKey = function(pk) {
this._keyCheck(pk);
if (pk.type === "dsa") {
this._dh.setPrivateKey(pk.part.x.data);
this._dh.setPublicKey(pk.part.y.data);
} else if (pk.type === "ecdsa") {
if (CRYPTO_HAVE_ECDH) {
this._dh.setPrivateKey(pk.part.d.data);
this._dh.setPublicKey(pk.part.Q.data);
} else {
this._priv = new ECPrivate(this._ecParams, pk.part.d.data);
}
} else if (pk.type === "curve25519") {
var k = pk.part.k;
if (!pk.part.k)
k = pk.part.r;
this._priv = k.data;
if (this._priv[0] === 0)
this._priv = this._priv.slice(1);
this._priv = this._priv.slice(0, 32);
}
this._key = pk;
this._isPriv = true;
};
DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey;
DiffieHellman.prototype.computeSecret = function(otherpk) {
this._keyCheck(otherpk, true);
if (!this._isPriv)
throw new Error("DH exchange has not been initialized with a private key yet");
var pub;
if (this._algo === "dsa") {
return this._dh.computeSecret(otherpk.part.y.data);
} else if (this._algo === "ecdsa") {
if (CRYPTO_HAVE_ECDH) {
return this._dh.computeSecret(otherpk.part.Q.data);
} else {
pub = new ECPublic(this._ecParams, otherpk.part.Q.data);
return this._priv.deriveSharedSecret(pub);
}
} else if (this._algo === "curve25519") {
pub = otherpk.part.A.data;
while (pub[0] === 0 && pub.length > 32)
pub = pub.slice(1);
var priv = this._priv;
assert.strictEqual(pub.length, 32);
assert.strictEqual(priv.length, 32);
var secret = nacl.box.before(new Uint8Array(pub), new Uint8Array(priv));
return Buffer2.from(secret);
}
throw new Error("Invalid algorithm: " + this._algo);
};
DiffieHellman.prototype.generateKey = function() {
var parts = [];
var priv, pub;
if (this._algo === "dsa") {
this._dh.generateKeys();
parts.push({ name: "p", data: this._p.data });
parts.push({ name: "q", data: this._key.part.q.data });
parts.push({ name: "g", data: this._g.data });
parts.push({ name: "y", data: this._dh.getPublicKey() });
parts.push({ name: "x", data: this._dh.getPrivateKey() });
this._key = new PrivateKey({
type: "dsa",
parts
});
this._isPriv = true;
return this._key;
} else if (this._algo === "ecdsa") {
if (CRYPTO_HAVE_ECDH) {
this._dh.generateKeys();
parts.push({
name: "curve",
data: Buffer2.from(this._curve)
});
parts.push({ name: "Q", data: this._dh.getPublicKey() });
parts.push({ name: "d", data: this._dh.getPrivateKey() });
this._key = new PrivateKey({
type: "ecdsa",
curve: this._curve,
parts
});
this._isPriv = true;
return this._key;
} else {
var n = this._ecParams.getN();
var r = new jsbn(crypto2.randomBytes(n.bitLength()));
var n1 = n.subtract(jsbn.ONE);
priv = r.mod(n1).add(jsbn.ONE);
pub = this._ecParams.getG().multiply(priv);
priv = Buffer2.from(priv.toByteArray());
pub = Buffer2.from(this._ecParams.getCurve().encodePointHex(pub), "hex");
this._priv = new ECPrivate(this._ecParams, priv);
parts.push({
name: "curve",
data: Buffer2.from(this._curve)
});
parts.push({ name: "Q", data: pub });
parts.push({ name: "d", data: priv });
this._key = new PrivateKey({
type: "ecdsa",
curve: this._curve,
parts
});
this._isPriv = true;
return this._key;
}
} else if (this._algo === "curve25519") {
var pair = nacl.box.keyPair();
priv = Buffer2.from(pair.secretKey);
pub = Buffer2.from(pair.publicKey);
priv = Buffer2.concat([priv, pub]);
assert.strictEqual(priv.length, 64);
assert.strictEqual(pub.length, 32);
parts.push({ name: "A", data: pub });
parts.push({ name: "k", data: priv });
this._key = new PrivateKey({
type: "curve25519",
parts
});
this._isPriv = true;
return this._key;
}
throw new Error("Invalid algorithm: " + this._algo);
};
DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey;
function X9ECParameters(name) {
var params = algs.curves[name];
assert.object(params);
var p = new jsbn(params.p);
var a = new jsbn(params.a);
var b = new jsbn(params.b);
var n = new jsbn(params.n);
var h = jsbn.ONE;
var curve = new ec.ECCurveFp(p, a, b);
var G = curve.decodePointHex(params.G.toString("hex"));
this.curve = curve;
this.g = G;
this.n = n;
this.h = h;
}
X9ECParameters.prototype.getCurve = function() {
return this.curve;
};
X9ECParameters.prototype.getG = function() {
return this.g;
};
X9ECParameters.prototype.getN = function() {
return this.n;
};
X9ECParameters.prototype.getH = function() {
return this.h;
};
function ECPublic(params, buffer) {
this._params = params;
if (buffer[0] === 0)
buffer = buffer.slice(1);
this._pub = params.getCurve().decodePointHex(buffer.toString("hex"));
}
function ECPrivate(params, buffer) {
this._params = params;
this._priv = new jsbn(utils.mpNormalize(buffer));
}
ECPrivate.prototype.deriveSharedSecret = function(pubKey) {
assert.ok(pubKey instanceof ECPublic);
var S = pubKey._pub.multiply(this._priv);
return Buffer2.from(S.getX().toBigInteger().toByteArray());
};
function generateED25519() {
var pair = nacl.sign.keyPair();
var priv = Buffer2.from(pair.secretKey);
var pub = Buffer2.from(pair.publicKey);
assert.strictEqual(priv.length, 64);
assert.strictEqual(pub.length, 32);
var parts = [];
parts.push({ name: "A", data: pub });
parts.push({ name: "k", data: priv.slice(0, 32) });
var key = new PrivateKey({
type: "ed25519",
parts
});
return key;
}
function generateECDSA(curve) {
var parts = [];
var key;
if (CRYPTO_HAVE_ECDH) {
var osCurve = {
"nistp256": "prime256v1",
"nistp384": "secp384r1",
"nistp521": "secp521r1"
}[curve];
var dh = crypto2.createECDH(osCurve);
dh.generateKeys();
parts.push({
name: "curve",
data: Buffer2.from(curve)
});
parts.push({ name: "Q", data: dh.getPublicKey() });
parts.push({ name: "d", data: dh.getPrivateKey() });
key = new PrivateKey({
type: "ecdsa",
curve,
parts
});
return key;
} else {
var ecParams = new X9ECParameters(curve);
var n = ecParams.getN();
var cByteLen = Math.ceil((n.bitLength() + 64) / 8);
var c = new jsbn(crypto2.randomBytes(cByteLen));
var n1 = n.subtract(jsbn.ONE);
var priv = c.mod(n1).add(jsbn.ONE);
var pub = ecParams.getG().multiply(priv);
priv = Buffer2.from(priv.toByteArray());
pub = Buffer2.from(ecParams.getCurve().encodePointHex(pub), "hex");
parts.push({ name: "curve", data: Buffer2.from(curve) });
parts.push({ name: "Q", data: pub });
parts.push({ name: "d", data: priv });
key = new PrivateKey({
type: "ecdsa",
curve,
parts
});
return key;
}
}
}
});
// node_modules/sshpk/lib/ed-compat.js
var require_ed_compat = __commonJS({
"node_modules/sshpk/lib/ed-compat.js"(exports, module2) {
module2.exports = {
Verifier,
Signer
};
var nacl = require_nacl_fast();
var stream = require("stream");
var util = require("util");
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var Signature = require_signature();
function Verifier(key, hashAlgo) {
if (hashAlgo.toLowerCase() !== "sha512")
throw new Error("ED25519 only supports the use of SHA-512 hashes");
this.key = key;
this.chunks = [];
stream.Writable.call(this, {});
}
util.inherits(Verifier, stream.Writable);
Verifier.prototype._write = function(chunk, enc, cb) {
this.chunks.push(chunk);
cb();
};
Verifier.prototype.update = function(chunk) {
if (typeof chunk === "string")
chunk = Buffer2.from(chunk, "binary");
this.chunks.push(chunk);
};
Verifier.prototype.verify = function(signature, fmt) {
var sig;
if (Signature.isSignature(signature, [2, 0])) {
if (signature.type !== "ed25519")
return false;
sig = signature.toBuffer("raw");
} else if (typeof signature === "string") {
sig = Buffer2.from(signature, "base64");
} else if (Signature.isSignature(signature, [1, 0])) {
throw new Error("signature was created by too old a version of sshpk and cannot be verified");
}
assert.buffer(sig);
return nacl.sign.detached.verify(new Uint8Array(Buffer2.concat(this.chunks)), new Uint8Array(sig), new Uint8Array(this.key.part.A.data));
};
function Signer(key, hashAlgo) {
if (hashAlgo.toLowerCase() !== "sha512")
throw new Error("ED25519 only supports the use of SHA-512 hashes");
this.key = key;
this.chunks = [];
stream.Writable.call(this, {});
}
util.inherits(Signer, stream.Writable);
Signer.prototype._write = function(chunk, enc, cb) {
this.chunks.push(chunk);
cb();
};
Signer.prototype.update = function(chunk) {
if (typeof chunk === "string")
chunk = Buffer2.from(chunk, "binary");
this.chunks.push(chunk);
};
Signer.prototype.sign = function() {
var sig = nacl.sign.detached(new Uint8Array(Buffer2.concat(this.chunks)), new Uint8Array(Buffer2.concat([
this.key.part.k.data,
this.key.part.A.data
])));
var sigBuf = Buffer2.from(sig);
var sigObj = Signature.parse(sigBuf, "ed25519", "raw");
sigObj.hashAlgorithm = "sha512";
return sigObj;
};
}
});
// node_modules/sshpk/lib/formats/pkcs8.js
var require_pkcs8 = __commonJS({
"node_modules/sshpk/lib/formats/pkcs8.js"(exports, module2) {
module2.exports = {
read,
readPkcs8,
write,
writePkcs8,
pkcs8ToBuffer,
readECDSACurve,
writeECDSACurve
};
var assert = require_assert();
var asn1 = require_lib();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var pem = require_pem();
function read(buf, options) {
return pem.read(buf, options, "pkcs8");
}
function write(key, options) {
return pem.write(key, options, "pkcs8");
}
function readMPInt(der, nm) {
assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + " is not an Integer");
return utils.mpNormalize(der.readString(asn1.Ber.Integer, true));
}
function readPkcs8(alg, type, der) {
if (der.peek() === asn1.Ber.Integer) {
assert.strictEqual(type, "private", "unexpected Integer at start of public key");
der.readString(asn1.Ber.Integer, true);
}
der.readSequence();
var next = der.offset + der.length;
var oid = der.readOID();
switch (oid) {
case "1.2.840.113549.1.1.1":
der._offset = next;
if (type === "public")
return readPkcs8RSAPublic(der);
else
return readPkcs8RSAPrivate(der);
case "1.2.840.10040.4.1":
if (type === "public")
return readPkcs8DSAPublic(der);
else
return readPkcs8DSAPrivate(der);
case "1.2.840.10045.2.1":
if (type === "public")
return readPkcs8ECDSAPublic(der);
else
return readPkcs8ECDSAPrivate(der);
case "1.3.101.112":
if (type === "public") {
return readPkcs8EdDSAPublic(der);
} else {
return readPkcs8EdDSAPrivate(der);
}
case "1.3.101.110":
if (type === "public") {
return readPkcs8X25519Public(der);
} else {
return readPkcs8X25519Private(der);
}
default:
throw new Error("Unknown key type OID " + oid);
}
}
function readPkcs8RSAPublic(der) {
der.readSequence(asn1.Ber.BitString);
der.readByte();
der.readSequence();
var n = readMPInt(der, "modulus");
var e = readMPInt(der, "exponent");
var key = {
type: "rsa",
source: der.originalInput,
parts: [
{ name: "e", data: e },
{ name: "n", data: n }
]
};
return new Key(key);
}
function readPkcs8RSAPrivate(der) {
der.readSequence(asn1.Ber.OctetString);
der.readSequence();
var ver = readMPInt(der, "version");
assert.equal(ver[0], 0, "unknown RSA private key version");
var n = readMPInt(der, "modulus");
var e = readMPInt(der, "public exponent");
var d = readMPInt(der, "private exponent");
var p = readMPInt(der, "prime1");
var q2 = readMPInt(der, "prime2");
var dmodp = readMPInt(der, "exponent1");
var dmodq = readMPInt(der, "exponent2");
var iqmp = readMPInt(der, "iqmp");
var key = {
type: "rsa",
parts: [
{ name: "n", data: n },
{ name: "e", data: e },
{ name: "d", data: d },
{ name: "iqmp", data: iqmp },
{ name: "p", data: p },
{ name: "q", data: q2 },
{ name: "dmodp", data: dmodp },
{ name: "dmodq", data: dmodq }
]
};
return new PrivateKey(key);
}
function readPkcs8DSAPublic(der) {
der.readSequence();
var p = readMPInt(der, "p");
var q2 = readMPInt(der, "q");
var g = readMPInt(der, "g");
der.readSequence(asn1.Ber.BitString);
der.readByte();
var y = readMPInt(der, "y");
var key = {
type: "dsa",
parts: [
{ name: "p", data: p },
{ name: "q", data: q2 },
{ name: "g", data: g },
{ name: "y", data: y }
]
};
return new Key(key);
}
function readPkcs8DSAPrivate(der) {
der.readSequence();
var p = readMPInt(der, "p");
var q2 = readMPInt(der, "q");
var g = readMPInt(der, "g");
der.readSequence(asn1.Ber.OctetString);
var x = readMPInt(der, "x");
var y = utils.calculateDSAPublic(g, p, x);
var key = {
type: "dsa",
parts: [
{ name: "p", data: p },
{ name: "q", data: q2 },
{ name: "g", data: g },
{ name: "y", data: y },
{ name: "x", data: x }
]
};
return new PrivateKey(key);
}
function readECDSACurve(der) {
var curveName, curveNames;
var j, c, cd;
if (der.peek() === asn1.Ber.OID) {
var oid = der.readOID();
curveNames = Object.keys(algs.curves);
for (j = 0; j < curveNames.length; ++j) {
c = curveNames[j];
cd = algs.curves[c];
if (cd.pkcs8oid === oid) {
curveName = c;
break;
}
}
} else {
der.readSequence();
var version = der.readString(asn1.Ber.Integer, true);
assert.strictEqual(version[0], 1, "ECDSA key not version 1");
var curve = {};
der.readSequence();
var fieldTypeOid = der.readOID();
assert.strictEqual(fieldTypeOid, "1.2.840.10045.1.1", "ECDSA key is not from a prime-field");
var p = curve.p = utils.mpNormalize(der.readString(asn1.Ber.Integer, true));
curve.size = p.length * 8 - utils.countZeros(p);
der.readSequence();
curve.a = utils.mpNormalize(der.readString(asn1.Ber.OctetString, true));
curve.b = utils.mpNormalize(der.readString(asn1.Ber.OctetString, true));
if (der.peek() === asn1.Ber.BitString)
curve.s = der.readString(asn1.Ber.BitString, true);
curve.G = der.readString(asn1.Ber.OctetString, true);
assert.strictEqual(curve.G[0], 4, "uncompressed G is required");
curve.n = utils.mpNormalize(der.readString(asn1.Ber.Integer, true));
curve.h = utils.mpNormalize(der.readString(asn1.Ber.Integer, true));
assert.strictEqual(curve.h[0], 1, "a cofactor=1 curve is required");
curveNames = Object.keys(algs.curves);
var ks = Object.keys(curve);
for (j = 0; j < curveNames.length; ++j) {
c = curveNames[j];
cd = algs.curves[c];
var equal = true;
for (var i = 0; i < ks.length; ++i) {
var k = ks[i];
if (cd[k] === void 0)
continue;
if (typeof cd[k] === "object" && cd[k].equals !== void 0) {
if (!cd[k].equals(curve[k])) {
equal = false;
break;
}
} else if (Buffer2.isBuffer(cd[k])) {
if (cd[k].toString("binary") !== curve[k].toString("binary")) {
equal = false;
break;
}
} else {
if (cd[k] !== curve[k]) {
equal = false;
break;
}
}
}
if (equal) {
curveName = c;
break;
}
}
}
return curveName;
}
function readPkcs8ECDSAPrivate(der) {
var curveName = readECDSACurve(der);
assert.string(curveName, "a known elliptic curve");
der.readSequence(asn1.Ber.OctetString);
der.readSequence();
var version = readMPInt(der, "version");
assert.equal(version[0], 1, "unknown version of ECDSA key");
var d = der.readString(asn1.Ber.OctetString, true);
var Q;
if (der.peek() == 160) {
der.readSequence(160);
der._offset += der.length;
}
if (der.peek() == 161) {
der.readSequence(161);
Q = der.readString(asn1.Ber.BitString, true);
Q = utils.ecNormalize(Q);
}
if (Q === void 0) {
var pub = utils.publicFromPrivateECDSA(curveName, d);
Q = pub.part.Q.data;
}
var key = {
type: "ecdsa",
parts: [
{ name: "curve", data: Buffer2.from(curveName) },
{ name: "Q", data: Q },
{ name: "d", data: d }
]
};
return new PrivateKey(key);
}
function readPkcs8ECDSAPublic(der) {
var curveName = readECDSACurve(der);
assert.string(curveName, "a known elliptic curve");
var Q = der.readString(asn1.Ber.BitString, true);
Q = utils.ecNormalize(Q);
var key = {
type: "ecdsa",
parts: [
{ name: "curve", data: Buffer2.from(curveName) },
{ name: "Q", data: Q }
]
};
return new Key(key);
}
function readPkcs8EdDSAPublic(der) {
if (der.peek() === 0)
der.readByte();
var A = utils.readBitString(der);
var key = {
type: "ed25519",
parts: [
{ name: "A", data: utils.zeroPadToLength(A, 32) }
]
};
return new Key(key);
}
function readPkcs8X25519Public(der) {
var A = utils.readBitString(der);
var key = {
type: "curve25519",
parts: [
{ name: "A", data: utils.zeroPadToLength(A, 32) }
]
};
return new Key(key);
}
function readPkcs8EdDSAPrivate(der) {
if (der.peek() === 0)
der.readByte();
der.readSequence(asn1.Ber.OctetString);
var k = der.readString(asn1.Ber.OctetString, true);
k = utils.zeroPadToLength(k, 32);
var A;
if (der.peek() === asn1.Ber.BitString) {
A = utils.readBitString(der);
A = utils.zeroPadToLength(A, 32);
} else {
A = utils.calculateED25519Public(k);
}
var key = {
type: "ed25519",
parts: [
{ name: "A", data: utils.zeroPadToLength(A, 32) },
{ name: "k", data: utils.zeroPadToLength(k, 32) }
]
};
return new PrivateKey(key);
}
function readPkcs8X25519Private(der) {
if (der.peek() === 0)
der.readByte();
der.readSequence(asn1.Ber.OctetString);
var k = der.readString(asn1.Ber.OctetString, true);
k = utils.zeroPadToLength(k, 32);
var A = utils.calculateX25519Public(k);
var key = {
type: "curve25519",
parts: [
{ name: "A", data: utils.zeroPadToLength(A, 32) },
{ name: "k", data: utils.zeroPadToLength(k, 32) }
]
};
return new PrivateKey(key);
}
function pkcs8ToBuffer(key) {
var der = new asn1.BerWriter();
writePkcs8(der, key);
return der.buffer;
}
function writePkcs8(der, key) {
der.startSequence();
if (PrivateKey.isPrivateKey(key)) {
var sillyInt = Buffer2.from([0]);
der.writeBuffer(sillyInt, asn1.Ber.Integer);
}
der.startSequence();
switch (key.type) {
case "rsa":
der.writeOID("1.2.840.113549.1.1.1");
if (PrivateKey.isPrivateKey(key))
writePkcs8RSAPrivate(key, der);
else
writePkcs8RSAPublic(key, der);
break;
case "dsa":
der.writeOID("1.2.840.10040.4.1");
if (PrivateKey.isPrivateKey(key))
writePkcs8DSAPrivate(key, der);
else
writePkcs8DSAPublic(key, der);
break;
case "ecdsa":
der.writeOID("1.2.840.10045.2.1");
if (PrivateKey.isPrivateKey(key))
writePkcs8ECDSAPrivate(key, der);
else
writePkcs8ECDSAPublic(key, der);
break;
case "ed25519":
der.writeOID("1.3.101.112");
if (PrivateKey.isPrivateKey(key))
throw new Error("Ed25519 private keys in pkcs8 format are not supported");
writePkcs8EdDSAPublic(key, der);
break;
default:
throw new Error("Unsupported key type: " + key.type);
}
der.endSequence();
}
function writePkcs8RSAPrivate(key, der) {
der.writeNull();
der.endSequence();
der.startSequence(asn1.Ber.OctetString);
der.startSequence();
var version = Buffer2.from([0]);
der.writeBuffer(version, asn1.Ber.Integer);
der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
der.writeBuffer(key.part.d.data, asn1.Ber.Integer);
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
if (!key.part.dmodp || !key.part.dmodq)
utils.addRSAMissing(key);
der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);
der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);
der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);
der.endSequence();
der.endSequence();
}
function writePkcs8RSAPublic(key, der) {
der.writeNull();
der.endSequence();
der.startSequence(asn1.Ber.BitString);
der.writeByte(0);
der.startSequence();
der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
der.endSequence();
der.endSequence();
}
function writePkcs8DSAPrivate(key, der) {
der.startSequence();
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
der.endSequence();
der.endSequence();
der.startSequence(asn1.Ber.OctetString);
der.writeBuffer(key.part.x.data, asn1.Ber.Integer);
der.endSequence();
}
function writePkcs8DSAPublic(key, der) {
der.startSequence();
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
der.endSequence();
der.endSequence();
der.startSequence(asn1.Ber.BitString);
der.writeByte(0);
der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
der.endSequence();
}
function writeECDSACurve(key, der) {
var curve = algs.curves[key.curve];
if (curve.pkcs8oid) {
der.writeOID(curve.pkcs8oid);
} else {
der.startSequence();
var version = Buffer2.from([1]);
der.writeBuffer(version, asn1.Ber.Integer);
der.startSequence();
der.writeOID("1.2.840.10045.1.1");
der.writeBuffer(curve.p, asn1.Ber.Integer);
der.endSequence();
der.startSequence();
var a = curve.p;
if (a[0] === 0)
a = a.slice(1);
der.writeBuffer(a, asn1.Ber.OctetString);
der.writeBuffer(curve.b, asn1.Ber.OctetString);
der.writeBuffer(curve.s, asn1.Ber.BitString);
der.endSequence();
der.writeBuffer(curve.G, asn1.Ber.OctetString);
der.writeBuffer(curve.n, asn1.Ber.Integer);
var h = curve.h;
if (!h) {
h = Buffer2.from([1]);
}
der.writeBuffer(h, asn1.Ber.Integer);
der.endSequence();
}
}
function writePkcs8ECDSAPublic(key, der) {
writeECDSACurve(key, der);
der.endSequence();
var Q = utils.ecNormalize(key.part.Q.data, true);
der.writeBuffer(Q, asn1.Ber.BitString);
}
function writePkcs8ECDSAPrivate(key, der) {
writeECDSACurve(key, der);
der.endSequence();
der.startSequence(asn1.Ber.OctetString);
der.startSequence();
var version = Buffer2.from([1]);
der.writeBuffer(version, asn1.Ber.Integer);
der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);
der.startSequence(161);
var Q = utils.ecNormalize(key.part.Q.data, true);
der.writeBuffer(Q, asn1.Ber.BitString);
der.endSequence();
der.endSequence();
der.endSequence();
}
function writePkcs8EdDSAPublic(key, der) {
der.endSequence();
utils.writeBitString(der, key.part.A.data);
}
}
});
// node_modules/sshpk/lib/formats/pkcs1.js
var require_pkcs1 = __commonJS({
"node_modules/sshpk/lib/formats/pkcs1.js"(exports, module2) {
module2.exports = {
read,
readPkcs1,
write,
writePkcs1
};
var assert = require_assert();
var asn1 = require_lib();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var pem = require_pem();
var pkcs8 = require_pkcs8();
var readECDSACurve = pkcs8.readECDSACurve;
function read(buf, options) {
return pem.read(buf, options, "pkcs1");
}
function write(key, options) {
return pem.write(key, options, "pkcs1");
}
function readMPInt(der, nm) {
assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + " is not an Integer");
return utils.mpNormalize(der.readString(asn1.Ber.Integer, true));
}
function readPkcs1(alg, type, der) {
switch (alg) {
case "RSA":
if (type === "public")
return readPkcs1RSAPublic(der);
else if (type === "private")
return readPkcs1RSAPrivate(der);
throw new Error("Unknown key type: " + type);
case "DSA":
if (type === "public")
return readPkcs1DSAPublic(der);
else if (type === "private")
return readPkcs1DSAPrivate(der);
throw new Error("Unknown key type: " + type);
case "EC":
case "ECDSA":
if (type === "private")
return readPkcs1ECDSAPrivate(der);
else if (type === "public")
return readPkcs1ECDSAPublic(der);
throw new Error("Unknown key type: " + type);
case "EDDSA":
case "EdDSA":
if (type === "private")
return readPkcs1EdDSAPrivate(der);
throw new Error(type + " keys not supported with EdDSA");
default:
throw new Error("Unknown key algo: " + alg);
}
}
function readPkcs1RSAPublic(der) {
var n = readMPInt(der, "modulus");
var e = readMPInt(der, "exponent");
var key = {
type: "rsa",
parts: [
{ name: "e", data: e },
{ name: "n", data: n }
]
};
return new Key(key);
}
function readPkcs1RSAPrivate(der) {
var version = readMPInt(der, "version");
assert.strictEqual(version[0], 0);
var n = readMPInt(der, "modulus");
var e = readMPInt(der, "public exponent");
var d = readMPInt(der, "private exponent");
var p = readMPInt(der, "prime1");
var q2 = readMPInt(der, "prime2");
var dmodp = readMPInt(der, "exponent1");
var dmodq = readMPInt(der, "exponent2");
var iqmp = readMPInt(der, "iqmp");
var key = {
type: "rsa",
parts: [
{ name: "n", data: n },
{ name: "e", data: e },
{ name: "d", data: d },
{ name: "iqmp", data: iqmp },
{ name: "p", data: p },
{ name: "q", data: q2 },
{ name: "dmodp", data: dmodp },
{ name: "dmodq", data: dmodq }
]
};
return new PrivateKey(key);
}
function readPkcs1DSAPrivate(der) {
var version = readMPInt(der, "version");
assert.strictEqual(version.readUInt8(0), 0);
var p = readMPInt(der, "p");
var q2 = readMPInt(der, "q");
var g = readMPInt(der, "g");
var y = readMPInt(der, "y");
var x = readMPInt(der, "x");
var key = {
type: "dsa",
parts: [
{ name: "p", data: p },
{ name: "q", data: q2 },
{ name: "g", data: g },
{ name: "y", data: y },
{ name: "x", data: x }
]
};
return new PrivateKey(key);
}
function readPkcs1EdDSAPrivate(der) {
var version = readMPInt(der, "version");
assert.strictEqual(version.readUInt8(0), 1);
var k = der.readString(asn1.Ber.OctetString, true);
der.readSequence(160);
var oid = der.readOID();
assert.strictEqual(oid, "1.3.101.112", "the ed25519 curve identifier");
der.readSequence(161);
var A = utils.readBitString(der);
var key = {
type: "ed25519",
parts: [
{ name: "A", data: utils.zeroPadToLength(A, 32) },
{ name: "k", data: k }
]
};
return new PrivateKey(key);
}
function readPkcs1DSAPublic(der) {
var y = readMPInt(der, "y");
var p = readMPInt(der, "p");
var q2 = readMPInt(der, "q");
var g = readMPInt(der, "g");
var key = {
type: "dsa",
parts: [
{ name: "y", data: y },
{ name: "p", data: p },
{ name: "q", data: q2 },
{ name: "g", data: g }
]
};
return new Key(key);
}
function readPkcs1ECDSAPublic(der) {
der.readSequence();
var oid = der.readOID();
assert.strictEqual(oid, "1.2.840.10045.2.1", "must be ecPublicKey");
var curveOid = der.readOID();
var curve;
var curves = Object.keys(algs.curves);
for (var j = 0; j < curves.length; ++j) {
var c = curves[j];
var cd = algs.curves[c];
if (cd.pkcs8oid === curveOid) {
curve = c;
break;
}
}
assert.string(curve, "a known ECDSA named curve");
var Q = der.readString(asn1.Ber.BitString, true);
Q = utils.ecNormalize(Q);
var key = {
type: "ecdsa",
parts: [
{ name: "curve", data: Buffer2.from(curve) },
{ name: "Q", data: Q }
]
};
return new Key(key);
}
function readPkcs1ECDSAPrivate(der) {
var version = readMPInt(der, "version");
assert.strictEqual(version.readUInt8(0), 1);
var d = der.readString(asn1.Ber.OctetString, true);
der.readSequence(160);
var curve = readECDSACurve(der);
assert.string(curve, "a known elliptic curve");
der.readSequence(161);
var Q = der.readString(asn1.Ber.BitString, true);
Q = utils.ecNormalize(Q);
var key = {
type: "ecdsa",
parts: [
{ name: "curve", data: Buffer2.from(curve) },
{ name: "Q", data: Q },
{ name: "d", data: d }
]
};
return new PrivateKey(key);
}
function writePkcs1(der, key) {
der.startSequence();
switch (key.type) {
case "rsa":
if (PrivateKey.isPrivateKey(key))
writePkcs1RSAPrivate(der, key);
else
writePkcs1RSAPublic(der, key);
break;
case "dsa":
if (PrivateKey.isPrivateKey(key))
writePkcs1DSAPrivate(der, key);
else
writePkcs1DSAPublic(der, key);
break;
case "ecdsa":
if (PrivateKey.isPrivateKey(key))
writePkcs1ECDSAPrivate(der, key);
else
writePkcs1ECDSAPublic(der, key);
break;
case "ed25519":
if (PrivateKey.isPrivateKey(key))
writePkcs1EdDSAPrivate(der, key);
else
writePkcs1EdDSAPublic(der, key);
break;
default:
throw new Error("Unknown key algo: " + key.type);
}
der.endSequence();
}
function writePkcs1RSAPublic(der, key) {
der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
}
function writePkcs1RSAPrivate(der, key) {
var ver = Buffer2.from([0]);
der.writeBuffer(ver, asn1.Ber.Integer);
der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
der.writeBuffer(key.part.d.data, asn1.Ber.Integer);
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
if (!key.part.dmodp || !key.part.dmodq)
utils.addRSAMissing(key);
der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);
der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);
der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);
}
function writePkcs1DSAPrivate(der, key) {
var ver = Buffer2.from([0]);
der.writeBuffer(ver, asn1.Ber.Integer);
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
der.writeBuffer(key.part.x.data, asn1.Ber.Integer);
}
function writePkcs1DSAPublic(der, key) {
der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
}
function writePkcs1ECDSAPublic(der, key) {
der.startSequence();
der.writeOID("1.2.840.10045.2.1");
var curve = key.part.curve.data.toString();
var curveOid = algs.curves[curve].pkcs8oid;
assert.string(curveOid, "a known ECDSA named curve");
der.writeOID(curveOid);
der.endSequence();
var Q = utils.ecNormalize(key.part.Q.data, true);
der.writeBuffer(Q, asn1.Ber.BitString);
}
function writePkcs1ECDSAPrivate(der, key) {
var ver = Buffer2.from([1]);
der.writeBuffer(ver, asn1.Ber.Integer);
der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);
der.startSequence(160);
var curve = key.part.curve.data.toString();
var curveOid = algs.curves[curve].pkcs8oid;
assert.string(curveOid, "a known ECDSA named curve");
der.writeOID(curveOid);
der.endSequence();
der.startSequence(161);
var Q = utils.ecNormalize(key.part.Q.data, true);
der.writeBuffer(Q, asn1.Ber.BitString);
der.endSequence();
}
function writePkcs1EdDSAPrivate(der, key) {
var ver = Buffer2.from([1]);
der.writeBuffer(ver, asn1.Ber.Integer);
der.writeBuffer(key.part.k.data, asn1.Ber.OctetString);
der.startSequence(160);
der.writeOID("1.3.101.112");
der.endSequence();
der.startSequence(161);
utils.writeBitString(der, key.part.A.data);
der.endSequence();
}
function writePkcs1EdDSAPublic(der, key) {
throw new Error("Public keys are not supported for EdDSA PKCS#1");
}
}
});
// node_modules/sshpk/lib/formats/rfc4253.js
var require_rfc4253 = __commonJS({
"node_modules/sshpk/lib/formats/rfc4253.js"(exports, module2) {
module2.exports = {
read: read.bind(void 0, false, void 0),
readType: read.bind(void 0, false),
write,
readPartial: read.bind(void 0, true),
readInternal: read,
keyTypeToAlg,
algToKeyType
};
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var SSHBuffer = require_ssh_buffer();
function algToKeyType(alg) {
assert.string(alg);
if (alg === "ssh-dss")
return "dsa";
else if (alg === "ssh-rsa")
return "rsa";
else if (alg === "ssh-ed25519")
return "ed25519";
else if (alg === "ssh-curve25519")
return "curve25519";
else if (alg.match(/^ecdsa-sha2-/))
return "ecdsa";
else
throw new Error("Unknown algorithm " + alg);
}
function keyTypeToAlg(key) {
assert.object(key);
if (key.type === "dsa")
return "ssh-dss";
else if (key.type === "rsa")
return "ssh-rsa";
else if (key.type === "ed25519")
return "ssh-ed25519";
else if (key.type === "curve25519")
return "ssh-curve25519";
else if (key.type === "ecdsa")
return "ecdsa-sha2-" + key.part.curve.data.toString();
else
throw new Error("Unknown key type " + key.type);
}
function read(partial, type, buf, options) {
if (typeof buf === "string")
buf = Buffer2.from(buf);
assert.buffer(buf, "buf");
var key = {};
var parts = key.parts = [];
var sshbuf = new SSHBuffer({ buffer: buf });
var alg = sshbuf.readString();
assert.ok(!sshbuf.atEnd(), "key must have at least one part");
key.type = algToKeyType(alg);
var partCount = algs.info[key.type].parts.length;
if (type && type === "private")
partCount = algs.privInfo[key.type].parts.length;
while (!sshbuf.atEnd() && parts.length < partCount)
parts.push(sshbuf.readPart());
while (!partial && !sshbuf.atEnd())
parts.push(sshbuf.readPart());
assert.ok(parts.length >= 1, "key must have at least one part");
assert.ok(partial || sshbuf.atEnd(), "leftover bytes at end of key");
var Constructor = Key;
var algInfo = algs.info[key.type];
if (type === "private" || algInfo.parts.length !== parts.length) {
algInfo = algs.privInfo[key.type];
Constructor = PrivateKey;
}
assert.strictEqual(algInfo.parts.length, parts.length);
if (key.type === "ecdsa") {
var res = /^ecdsa-sha2-(.+)$/.exec(alg);
assert.ok(res !== null);
assert.strictEqual(res[1], parts[0].data.toString());
}
var normalized = true;
for (var i = 0; i < algInfo.parts.length; ++i) {
var p = parts[i];
p.name = algInfo.parts[i];
if (key.type === "ed25519" && p.name === "k")
p.data = p.data.slice(0, 32);
if (p.name !== "curve" && algInfo.normalize !== false) {
var nd;
if (key.type === "ed25519") {
nd = utils.zeroPadToLength(p.data, 32);
} else {
nd = utils.mpNormalize(p.data);
}
if (nd.toString("binary") !== p.data.toString("binary")) {
p.data = nd;
normalized = false;
}
}
}
if (normalized)
key._rfc4253Cache = sshbuf.toBuffer();
if (partial && typeof partial === "object") {
partial.remainder = sshbuf.remainder();
partial.consumed = sshbuf._offset;
}
return new Constructor(key);
}
function write(key, options) {
assert.object(key);
var alg = keyTypeToAlg(key);
var i;
var algInfo = algs.info[key.type];
if (PrivateKey.isPrivateKey(key))
algInfo = algs.privInfo[key.type];
var parts = algInfo.parts;
var buf = new SSHBuffer({});
buf.writeString(alg);
for (i = 0; i < parts.length; ++i) {
var data = key.part[parts[i]].data;
if (algInfo.normalize !== false) {
if (key.type === "ed25519")
data = utils.zeroPadToLength(data, 32);
else
data = utils.mpNormalize(data);
}
if (key.type === "ed25519" && parts[i] === "k")
data = Buffer2.concat([data, key.part.A.data]);
buf.writeBuffer(data);
}
return buf.toBuffer();
}
}
});
// node_modules/bcrypt-pbkdf/index.js
var require_bcrypt_pbkdf = __commonJS({
"node_modules/bcrypt-pbkdf/index.js"(exports, module2) {
"use strict";
var crypto_hash_sha512 = require_nacl_fast().lowlevel.crypto_hash;
var BLF_J = 0;
var Blowfish = function() {
this.S = [
new Uint32Array([
3509652390,
2564797868,
805139163,
3491422135,
3101798381,
1780907670,
3128725573,
4046225305,
614570311,
3012652279,
134345442,
2240740374,
1667834072,
1901547113,
2757295779,
4103290238,
227898511,
1921955416,
1904987480,
2182433518,
2069144605,
3260701109,
2620446009,
720527379,
3318853667,
677414384,
3393288472,
3101374703,
2390351024,
1614419982,
1822297739,
2954791486,
3608508353,
3174124327,
2024746970,
1432378464,
3864339955,
2857741204,
1464375394,
1676153920,
1439316330,
715854006,
3033291828,
289532110,
2706671279,
2087905683,
3018724369,
1668267050,
732546397,
1947742710,
3462151702,
2609353502,
2950085171,
1814351708,
2050118529,
680887927,
999245976,
1800124847,
3300911131,
1713906067,
1641548236,
4213287313,
1216130144,
1575780402,
4018429277,
3917837745,
3693486850,
3949271944,
596196993,
3549867205,
258830323,
2213823033,
772490370,
2760122372,
1774776394,
2652871518,
566650946,
4142492826,
1728879713,
2882767088,
1783734482,
3629395816,
2517608232,
2874225571,
1861159788,
326777828,
3124490320,
2130389656,
2716951837,
967770486,
1724537150,
2185432712,
2364442137,
1164943284,
2105845187,
998989502,
3765401048,
2244026483,
1075463327,
1455516326,
1322494562,
910128902,
469688178,
1117454909,
936433444,
3490320968,
3675253459,
1240580251,
122909385,
2157517691,
634681816,
4142456567,
3825094682,
3061402683,
2540495037,
79693498,
3249098678,
1084186820,
1583128258,
426386531,
1761308591,
1047286709,
322548459,
995290223,
1845252383,
2603652396,
3431023940,
2942221577,
3202600964,
3727903485,
1712269319,
422464435,
3234572375,
1170764815,
3523960633,
3117677531,
1434042557,
442511882,
3600875718,
1076654713,
1738483198,
4213154764,
2393238008,
3677496056,
1014306527,
4251020053,
793779912,
2902807211,
842905082,
4246964064,
1395751752,
1040244610,
2656851899,
3396308128,
445077038,
3742853595,
3577915638,
679411651,
2892444358,
2354009459,
1767581616,
3150600392,
3791627101,
3102740896,
284835224,
4246832056,
1258075500,
768725851,
2589189241,
3069724005,
3532540348,
1274779536,
3789419226,
2764799539,
1660621633,
3471099624,
4011903706,
913787905,
3497959166,
737222580,
2514213453,
2928710040,
3937242737,
1804850592,
3499020752,
2949064160,
2386320175,
2390070455,
2415321851,
4061277028,
2290661394,
2416832540,
1336762016,
1754252060,
3520065937,
3014181293,
791618072,
3188594551,
3933548030,
2332172193,
3852520463,
3043980520,
413987798,
3465142937,
3030929376,
4245938359,
2093235073,
3534596313,
375366246,
2157278981,
2479649556,
555357303,
3870105701,
2008414854,
3344188149,
4221384143,
3956125452,
2067696032,
3594591187,
2921233993,
2428461,
544322398,
577241275,
1471733935,
610547355,
4027169054,
1432588573,
1507829418,
2025931657,
3646575487,
545086370,
48609733,
2200306550,
1653985193,
298326376,
1316178497,
3007786442,
2064951626,
458293330,
2589141269,
3591329599,
3164325604,
727753846,
2179363840,
146436021,
1461446943,
4069977195,
705550613,
3059967265,
3887724982,
4281599278,
3313849956,
1404054877,
2845806497,
146425753,
1854211946
]),
new Uint32Array([
1266315497,
3048417604,
3681880366,
3289982499,
290971e4,
1235738493,
2632868024,
2414719590,
3970600049,
1771706367,
1449415276,
3266420449,
422970021,
1963543593,
2690192192,
3826793022,
1062508698,
1531092325,
1804592342,
2583117782,
2714934279,
4024971509,
1294809318,
4028980673,
1289560198,
2221992742,
1669523910,
35572830,
157838143,
1052438473,
1016535060,
1802137761,
1753167236,
1386275462,
3080475397,
2857371447,
1040679964,
2145300060,
2390574316,
1461121720,
2956646967,
4031777805,
4028374788,
33600511,
2920084762,
1018524850,
629373528,
3691585981,
3515945977,
2091462646,
2486323059,
586499841,
988145025,
935516892,
3367335476,
2599673255,
2839830854,
265290510,
3972581182,
2759138881,
3795373465,
1005194799,
847297441,
406762289,
1314163512,
1332590856,
1866599683,
4127851711,
750260880,
613907577,
1450815602,
3165620655,
3734664991,
3650291728,
3012275730,
3704569646,
1427272223,
778793252,
1343938022,
2676280711,
2052605720,
1946737175,
3164576444,
3914038668,
3967478842,
3682934266,
1661551462,
3294938066,
4011595847,
840292616,
3712170807,
616741398,
312560963,
711312465,
1351876610,
322626781,
1910503582,
271666773,
2175563734,
1594956187,
70604529,
3617834859,
1007753275,
1495573769,
4069517037,
2549218298,
2663038764,
504708206,
2263041392,
3941167025,
2249088522,
1514023603,
1998579484,
1312622330,
694541497,
2582060303,
2151582166,
1382467621,
776784248,
2618340202,
3323268794,
2497899128,
2784771155,
503983604,
4076293799,
907881277,
423175695,
432175456,
1378068232,
4145222326,
3954048622,
3938656102,
3820766613,
2793130115,
2977904593,
26017576,
3274890735,
3194772133,
1700274565,
1756076034,
4006520079,
3677328699,
720338349,
1533947780,
354530856,
688349552,
3973924725,
1637815568,
332179504,
3949051286,
53804574,
2852348879,
3044236432,
1282449977,
3583942155,
3416972820,
4006381244,
1617046695,
2628476075,
3002303598,
1686838959,
431878346,
2686675385,
1700445008,
1080580658,
1009431731,
832498133,
3223435511,
2605976345,
2271191193,
2516031870,
1648197032,
4164389018,
2548247927,
300782431,
375919233,
238389289,
3353747414,
2531188641,
2019080857,
1475708069,
455242339,
2609103871,
448939670,
3451063019,
1395535956,
2413381860,
1841049896,
1491858159,
885456874,
4264095073,
4001119347,
1565136089,
3898914787,
1108368660,
540939232,
1173283510,
2745871338,
3681308437,
4207628240,
3343053890,
4016749493,
1699691293,
1103962373,
3625875870,
2256883143,
3830138730,
1031889488,
3479347698,
1535977030,
4236805024,
3251091107,
2132092099,
1774941330,
1199868427,
1452454533,
157007616,
2904115357,
342012276,
595725824,
1480756522,
206960106,
497939518,
591360097,
863170706,
2375253569,
3596610801,
1814182875,
2094937945,
3421402208,
1082520231,
3463918190,
2785509508,
435703966,
3908032597,
1641649973,
2842273706,
3305899714,
1510255612,
2148256476,
2655287854,
3276092548,
4258621189,
236887753,
3681803219,
274041037,
1734335097,
3815195456,
3317970021,
1899903192,
1026095262,
4050517792,
356393447,
2410691914,
3873677099,
3682840055
]),
new Uint32Array([
3913112168,
2491498743,
4132185628,
2489919796,
1091903735,
1979897079,
3170134830,
3567386728,
3557303409,
857797738,
1136121015,
1342202287,
507115054,
2535736646,
337727348,
3213592640,
1301675037,
2528481711,
1895095763,
1721773893,
3216771564,
62756741,
2142006736,
835421444,
2531993523,
1442658625,
3659876326,
2882144922,
676362277,
1392781812,
170690266,
3921047035,
1759253602,
3611846912,
1745797284,
664899054,
1329594018,
3901205900,
3045908486,
2062866102,
2865634940,
3543621612,
3464012697,
1080764994,
553557557,
3656615353,
3996768171,
991055499,
499776247,
1265440854,
648242737,
3940784050,
980351604,
3713745714,
1749149687,
3396870395,
4211799374,
3640570775,
1161844396,
3125318951,
1431517754,
545492359,
4268468663,
3499529547,
1437099964,
2702547544,
3433638243,
2581715763,
2787789398,
1060185593,
1593081372,
2418618748,
4260947970,
69676912,
2159744348,
86519011,
2512459080,
3838209314,
1220612927,
3339683548,
133810670,
1090789135,
1078426020,
1569222167,
845107691,
3583754449,
4072456591,
1091646820,
628848692,
1613405280,
3757631651,
526609435,
236106946,
48312990,
2942717905,
3402727701,
1797494240,
859738849,
992217954,
4005476642,
2243076622,
3870952857,
3732016268,
765654824,
3490871365,
2511836413,
1685915746,
3888969200,
1414112111,
2273134842,
3281911079,
4080962846,
172450625,
2569994100,
980381355,
4109958455,
2819808352,
2716589560,
2568741196,
3681446669,
3329971472,
1835478071,
660984891,
3704678404,
4045999559,
3422617507,
3040415634,
1762651403,
1719377915,
3470491036,
2693910283,
3642056355,
3138596744,
1364962596,
2073328063,
1983633131,
926494387,
3423689081,
2150032023,
4096667949,
1749200295,
3328846651,
309677260,
2016342300,
1779581495,
3079819751,
111262694,
1274766160,
443224088,
298511866,
1025883608,
3806446537,
1145181785,
168956806,
3641502830,
3584813610,
1689216846,
3666258015,
3200248200,
1692713982,
2646376535,
4042768518,
1618508792,
1610833997,
3523052358,
4130873264,
2001055236,
3610705100,
2202168115,
4028541809,
2961195399,
1006657119,
2006996926,
3186142756,
1430667929,
3210227297,
1314452623,
4074634658,
4101304120,
2273951170,
1399257539,
3367210612,
3027628629,
1190975929,
2062231137,
2333990788,
2221543033,
2438960610,
1181637006,
548689776,
2362791313,
3372408396,
3104550113,
3145860560,
296247880,
1970579870,
3078560182,
3769228297,
1714227617,
3291629107,
3898220290,
166772364,
1251581989,
493813264,
448347421,
195405023,
2709975567,
677966185,
3703036547,
1463355134,
2715995803,
1338867538,
1343315457,
2802222074,
2684532164,
233230375,
2599980071,
2000651841,
3277868038,
1638401717,
4028070440,
3237316320,
6314154,
819756386,
300326615,
590932579,
1405279636,
3267499572,
3150704214,
2428286686,
3959192993,
3461946742,
1862657033,
1266418056,
963775037,
2089974820,
2263052895,
1917689273,
448879540,
3550394620,
3981727096,
150775221,
3627908307,
1303187396,
508620638,
2975983352,
2726630617,
1817252668,
1876281319,
1457606340,
908771278,
3720792119,
3617206836,
2455994898,
1729034894,
1080033504
]),
new Uint32Array([
976866871,
3556439503,
2881648439,
1522871579,
1555064734,
1336096578,
3548522304,
2579274686,
3574697629,
3205460757,
3593280638,
3338716283,
3079412587,
564236357,
2993598910,
1781952180,
1464380207,
3163844217,
3332601554,
1699332808,
1393555694,
1183702653,
3581086237,
1288719814,
691649499,
2847557200,
2895455976,
3193889540,
2717570544,
1781354906,
1676643554,
2592534050,
3230253752,
1126444790,
2770207658,
2633158820,
2210423226,
2615765581,
2414155088,
3127139286,
673620729,
2805611233,
1269405062,
4015350505,
3341807571,
4149409754,
1057255273,
2012875353,
2162469141,
2276492801,
2601117357,
993977747,
3918593370,
2654263191,
753973209,
36408145,
2530585658,
25011837,
3520020182,
2088578344,
530523599,
2918365339,
1524020338,
1518925132,
3760827505,
3759777254,
1202760957,
3985898139,
3906192525,
674977740,
4174734889,
2031300136,
2019492241,
3983892565,
4153806404,
3822280332,
352677332,
2297720250,
60907813,
90501309,
3286998549,
1016092578,
2535922412,
2839152426,
457141659,
509813237,
4120667899,
652014361,
1966332200,
2975202805,
55981186,
2327461051,
676427537,
3255491064,
2882294119,
3433927263,
1307055953,
942726286,
933058658,
2468411793,
3933900994,
4215176142,
1361170020,
2001714738,
2830558078,
3274259782,
1222529897,
1679025792,
2729314320,
3714953764,
1770335741,
151462246,
3013232138,
1682292957,
1483529935,
471910574,
1539241949,
458788160,
3436315007,
1807016891,
3718408830,
978976581,
1043663428,
3165965781,
1927990952,
4200891579,
2372276910,
3208408903,
3533431907,
1412390302,
2931980059,
4132332400,
1947078029,
3881505623,
4168226417,
2941484381,
1077988104,
1320477388,
886195818,
18198404,
3786409e3,
2509781533,
112762804,
3463356488,
1866414978,
891333506,
18488651,
661792760,
1628790961,
3885187036,
3141171499,
876946877,
2693282273,
1372485963,
791857591,
2686433993,
3759982718,
3167212022,
3472953795,
2716379847,
445679433,
3561995674,
3504004811,
3574258232,
54117162,
3331405415,
2381918588,
3769707343,
4154350007,
1140177722,
4074052095,
668550556,
3214352940,
367459370,
261225585,
2610173221,
4209349473,
3468074219,
3265815641,
314222801,
3066103646,
3808782860,
282218597,
3406013506,
3773591054,
379116347,
1285071038,
846784868,
2669647154,
3771962079,
3550491691,
2305946142,
453669953,
1268987020,
3317592352,
3279303384,
3744833421,
2610507566,
3859509063,
266596637,
3847019092,
517658769,
3462560207,
3443424879,
370717030,
4247526661,
2224018117,
4143653529,
4112773975,
2788324899,
2477274417,
1456262402,
2901442914,
1517677493,
1846949527,
2295493580,
3734397586,
2176403920,
1280348187,
1908823572,
3871786941,
846861322,
1172426758,
3287448474,
3383383037,
1655181056,
3139813346,
901632758,
1897031941,
2986607138,
3066810236,
3447102507,
1393639104,
373351379,
950779232,
625454576,
3124240540,
4148612726,
2007998917,
544563296,
2244738638,
2330496472,
2058025392,
1291430526,
424198748,
50039436,
29584100,
3605783033,
2429876329,
2791104160,
1057563949,
3255363231,
3075367218,
3463963227,
1469046755,
985887462
])
];
this.P = new Uint32Array([
608135816,
2242054355,
320440878,
57701188,
2752067618,
698298832,
137296536,
3964562569,
1160258022,
953160567,
3193202383,
887688300,
3232508343,
3380367581,
1065670069,
3041331479,
2450970073,
2306472731
]);
};
function F(S, x8, i) {
return (S[0][x8[i + 3]] + S[1][x8[i + 2]] ^ S[2][x8[i + 1]]) + S[3][x8[i]];
}
Blowfish.prototype.encipher = function(x, x8) {
if (x8 === void 0) {
x8 = new Uint8Array(x.buffer);
if (x.byteOffset !== 0)
x8 = x8.subarray(x.byteOffset);
}
x[0] ^= this.P[0];
for (var i = 1; i < 16; i += 2) {
x[1] ^= F(this.S, x8, 0) ^ this.P[i];
x[0] ^= F(this.S, x8, 4) ^ this.P[i + 1];
}
var t = x[0];
x[0] = x[1] ^ this.P[17];
x[1] = t;
};
Blowfish.prototype.decipher = function(x) {
var x8 = new Uint8Array(x.buffer);
if (x.byteOffset !== 0)
x8 = x8.subarray(x.byteOffset);
x[0] ^= this.P[17];
for (var i = 16; i > 0; i -= 2) {
x[1] ^= F(this.S, x8, 0) ^ this.P[i];
x[0] ^= F(this.S, x8, 4) ^ this.P[i - 1];
}
var t = x[0];
x[0] = x[1] ^ this.P[0];
x[1] = t;
};
function stream2word(data, databytes) {
var i, temp = 0;
for (i = 0; i < 4; i++, BLF_J++) {
if (BLF_J >= databytes)
BLF_J = 0;
temp = temp << 8 | data[BLF_J];
}
return temp;
}
Blowfish.prototype.expand0state = function(key, keybytes) {
var d = new Uint32Array(2), i, k;
var d8 = new Uint8Array(d.buffer);
for (i = 0, BLF_J = 0; i < 18; i++) {
this.P[i] ^= stream2word(key, keybytes);
}
BLF_J = 0;
for (i = 0; i < 18; i += 2) {
this.encipher(d, d8);
this.P[i] = d[0];
this.P[i + 1] = d[1];
}
for (i = 0; i < 4; i++) {
for (k = 0; k < 256; k += 2) {
this.encipher(d, d8);
this.S[i][k] = d[0];
this.S[i][k + 1] = d[1];
}
}
};
Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) {
var d = new Uint32Array(2), i, k;
for (i = 0, BLF_J = 0; i < 18; i++) {
this.P[i] ^= stream2word(key, keybytes);
}
for (i = 0, BLF_J = 0; i < 18; i += 2) {
d[0] ^= stream2word(data, databytes);
d[1] ^= stream2word(data, databytes);
this.encipher(d);
this.P[i] = d[0];
this.P[i + 1] = d[1];
}
for (i = 0; i < 4; i++) {
for (k = 0; k < 256; k += 2) {
d[0] ^= stream2word(data, databytes);
d[1] ^= stream2word(data, databytes);
this.encipher(d);
this.S[i][k] = d[0];
this.S[i][k + 1] = d[1];
}
}
BLF_J = 0;
};
Blowfish.prototype.enc = function(data, blocks) {
for (var i = 0; i < blocks; i++) {
this.encipher(data.subarray(i * 2));
}
};
Blowfish.prototype.dec = function(data, blocks) {
for (var i = 0; i < blocks; i++) {
this.decipher(data.subarray(i * 2));
}
};
var BCRYPT_BLOCKS = 8;
var BCRYPT_HASHSIZE = 32;
function bcrypt_hash(sha2pass, sha2salt, out) {
var state = new Blowfish(), cdata = new Uint32Array(BCRYPT_BLOCKS), i, ciphertext = new Uint8Array([
79,
120,
121,
99,
104,
114,
111,
109,
97,
116,
105,
99,
66,
108,
111,
119,
102,
105,
115,
104,
83,
119,
97,
116,
68,
121,
110,
97,
109,
105,
116,
101
]);
state.expandstate(sha2salt, 64, sha2pass, 64);
for (i = 0; i < 64; i++) {
state.expand0state(sha2salt, 64);
state.expand0state(sha2pass, 64);
}
for (i = 0; i < BCRYPT_BLOCKS; i++)
cdata[i] = stream2word(ciphertext, ciphertext.byteLength);
for (i = 0; i < 64; i++)
state.enc(cdata, cdata.byteLength / 8);
for (i = 0; i < BCRYPT_BLOCKS; i++) {
out[4 * i + 3] = cdata[i] >>> 24;
out[4 * i + 2] = cdata[i] >>> 16;
out[4 * i + 1] = cdata[i] >>> 8;
out[4 * i + 0] = cdata[i];
}
}
function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) {
var sha2pass = new Uint8Array(64), sha2salt = new Uint8Array(64), out = new Uint8Array(BCRYPT_HASHSIZE), tmpout = new Uint8Array(BCRYPT_HASHSIZE), countsalt = new Uint8Array(saltlen + 4), i, j, amt, stride, dest, count, origkeylen = keylen;
if (rounds < 1)
return -1;
if (passlen === 0 || saltlen === 0 || keylen === 0 || keylen > out.byteLength * out.byteLength || saltlen > 1 << 20)
return -1;
stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength);
amt = Math.floor((keylen + stride - 1) / stride);
for (i = 0; i < saltlen; i++)
countsalt[i] = salt[i];
crypto_hash_sha512(sha2pass, pass, passlen);
for (count = 1; keylen > 0; count++) {
countsalt[saltlen + 0] = count >>> 24;
countsalt[saltlen + 1] = count >>> 16;
countsalt[saltlen + 2] = count >>> 8;
countsalt[saltlen + 3] = count;
crypto_hash_sha512(sha2salt, countsalt, saltlen + 4);
bcrypt_hash(sha2pass, sha2salt, tmpout);
for (i = out.byteLength; i--; )
out[i] = tmpout[i];
for (i = 1; i < rounds; i++) {
crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength);
bcrypt_hash(sha2pass, sha2salt, tmpout);
for (j = 0; j < out.byteLength; j++)
out[j] ^= tmpout[j];
}
amt = Math.min(amt, keylen);
for (i = 0; i < amt; i++) {
dest = i * stride + (count - 1);
if (dest >= origkeylen)
break;
key[dest] = out[i];
}
keylen -= i;
}
return 0;
}
module2.exports = {
BLOCKS: BCRYPT_BLOCKS,
HASHSIZE: BCRYPT_HASHSIZE,
hash: bcrypt_hash,
pbkdf: bcrypt_pbkdf
};
}
});
// node_modules/sshpk/lib/formats/ssh-private.js
var require_ssh_private = __commonJS({
"node_modules/sshpk/lib/formats/ssh-private.js"(exports, module2) {
module2.exports = {
read,
readSSHPrivate,
write
};
var assert = require_assert();
var asn1 = require_lib();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var crypto2 = require("crypto");
var Key = require_key();
var PrivateKey = require_private_key();
var pem = require_pem();
var rfc4253 = require_rfc4253();
var SSHBuffer = require_ssh_buffer();
var errors = require_errors2();
var bcrypt;
function read(buf, options) {
return pem.read(buf, options);
}
var MAGIC = "openssh-key-v1";
function readSSHPrivate(type, buf, options) {
buf = new SSHBuffer({ buffer: buf });
var magic = buf.readCString();
assert.strictEqual(magic, MAGIC, "bad magic string");
var cipher = buf.readString();
var kdf = buf.readString();
var kdfOpts = buf.readBuffer();
var nkeys = buf.readInt();
if (nkeys !== 1) {
throw new Error("OpenSSH-format key file contains multiple keys: this is unsupported.");
}
var pubKey = buf.readBuffer();
if (type === "public") {
assert.ok(buf.atEnd(), "excess bytes left after key");
return rfc4253.read(pubKey);
}
var privKeyBlob = buf.readBuffer();
assert.ok(buf.atEnd(), "excess bytes left after key");
var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts });
switch (kdf) {
case "none":
if (cipher !== "none") {
throw new Error('OpenSSH-format key uses KDF "none" but specifies a cipher other than "none"');
}
break;
case "bcrypt":
var salt = kdfOptsBuf.readBuffer();
var rounds = kdfOptsBuf.readInt();
var cinf = utils.opensshCipherInfo(cipher);
if (bcrypt === void 0) {
bcrypt = require_bcrypt_pbkdf();
}
if (typeof options.passphrase === "string") {
options.passphrase = Buffer2.from(options.passphrase, "utf-8");
}
if (!Buffer2.isBuffer(options.passphrase)) {
throw new errors.KeyEncryptedError(options.filename, "OpenSSH");
}
var pass = new Uint8Array(options.passphrase);
var salti = new Uint8Array(salt);
var out = new Uint8Array(cinf.keySize + cinf.blockSize);
var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, out, out.length, rounds);
if (res !== 0) {
throw new Error("bcrypt_pbkdf function returned failure, parameters invalid");
}
out = Buffer2.from(out);
var ckey = out.slice(0, cinf.keySize);
var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);
var cipherStream = crypto2.createDecipheriv(cinf.opensslName, ckey, iv);
cipherStream.setAutoPadding(false);
var chunk, chunks = [];
cipherStream.once("error", function(e) {
if (e.toString().indexOf("bad decrypt") !== -1) {
throw new Error("Incorrect passphrase supplied, could not decrypt key");
}
throw e;
});
cipherStream.write(privKeyBlob);
cipherStream.end();
while ((chunk = cipherStream.read()) !== null)
chunks.push(chunk);
privKeyBlob = Buffer2.concat(chunks);
break;
default:
throw new Error('OpenSSH-format key uses unknown KDF "' + kdf + '"');
}
buf = new SSHBuffer({ buffer: privKeyBlob });
var checkInt1 = buf.readInt();
var checkInt2 = buf.readInt();
if (checkInt1 !== checkInt2) {
throw new Error("Incorrect passphrase supplied, could not decrypt key");
}
var ret = {};
var key = rfc4253.readInternal(ret, "private", buf.remainder());
buf.skip(ret.consumed);
var comment = buf.readString();
key.comment = comment;
return key;
}
function write(key, options) {
var pubKey;
if (PrivateKey.isPrivateKey(key))
pubKey = key.toPublic();
else
pubKey = key;
var cipher = "none";
var kdf = "none";
var kdfopts = Buffer2.alloc(0);
var cinf = { blockSize: 8 };
var passphrase;
if (options !== void 0) {
passphrase = options.passphrase;
if (typeof passphrase === "string")
passphrase = Buffer2.from(passphrase, "utf-8");
if (passphrase !== void 0) {
assert.buffer(passphrase, "options.passphrase");
assert.optionalString(options.cipher, "options.cipher");
cipher = options.cipher;
if (cipher === void 0)
cipher = "aes128-ctr";
cinf = utils.opensshCipherInfo(cipher);
kdf = "bcrypt";
}
}
var privBuf;
if (PrivateKey.isPrivateKey(key)) {
privBuf = new SSHBuffer({});
var checkInt = crypto2.randomBytes(4).readUInt32BE(0);
privBuf.writeInt(checkInt);
privBuf.writeInt(checkInt);
privBuf.write(key.toBuffer("rfc4253"));
privBuf.writeString(key.comment || "");
var n = 1;
while (privBuf._offset % cinf.blockSize !== 0)
privBuf.writeChar(n++);
privBuf = privBuf.toBuffer();
}
switch (kdf) {
case "none":
break;
case "bcrypt":
var salt = crypto2.randomBytes(16);
var rounds = 16;
var kdfssh = new SSHBuffer({});
kdfssh.writeBuffer(salt);
kdfssh.writeInt(rounds);
kdfopts = kdfssh.toBuffer();
if (bcrypt === void 0) {
bcrypt = require_bcrypt_pbkdf();
}
var pass = new Uint8Array(passphrase);
var salti = new Uint8Array(salt);
var out = new Uint8Array(cinf.keySize + cinf.blockSize);
var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, out, out.length, rounds);
if (res !== 0) {
throw new Error("bcrypt_pbkdf function returned failure, parameters invalid");
}
out = Buffer2.from(out);
var ckey = out.slice(0, cinf.keySize);
var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);
var cipherStream = crypto2.createCipheriv(cinf.opensslName, ckey, iv);
cipherStream.setAutoPadding(false);
var chunk, chunks = [];
cipherStream.once("error", function(e) {
throw e;
});
cipherStream.write(privBuf);
cipherStream.end();
while ((chunk = cipherStream.read()) !== null)
chunks.push(chunk);
privBuf = Buffer2.concat(chunks);
break;
default:
throw new Error("Unsupported kdf " + kdf);
}
var buf = new SSHBuffer({});
buf.writeCString(MAGIC);
buf.writeString(cipher);
buf.writeString(kdf);
buf.writeBuffer(kdfopts);
buf.writeInt(1);
buf.writeBuffer(pubKey.toBuffer("rfc4253"));
if (privBuf)
buf.writeBuffer(privBuf);
buf = buf.toBuffer();
var header;
if (PrivateKey.isPrivateKey(key))
header = "OPENSSH PRIVATE KEY";
else
header = "OPENSSH PUBLIC KEY";
var tmp = buf.toString("base64");
var len = tmp.length + tmp.length / 70 + 18 + 16 + header.length * 2 + 10;
buf = Buffer2.alloc(len);
var o = 0;
o += buf.write("-----BEGIN " + header + "-----\n", o);
for (var i = 0; i < tmp.length; ) {
var limit = i + 70;
if (limit > tmp.length)
limit = tmp.length;
o += buf.write(tmp.slice(i, limit), o);
buf[o++] = 10;
i = limit;
}
o += buf.write("-----END " + header + "-----\n", o);
return buf.slice(0, o);
}
}
});
// node_modules/sshpk/lib/formats/pem.js
var require_pem = __commonJS({
"node_modules/sshpk/lib/formats/pem.js"(exports, module2) {
module2.exports = {
read,
write
};
var assert = require_assert();
var asn1 = require_lib();
var crypto2 = require("crypto");
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var pkcs1 = require_pkcs1();
var pkcs8 = require_pkcs8();
var sshpriv = require_ssh_private();
var rfc4253 = require_rfc4253();
var errors = require_errors2();
var OID_PBES2 = "1.2.840.113549.1.5.13";
var OID_PBKDF2 = "1.2.840.113549.1.5.12";
var OID_TO_CIPHER = {
"1.2.840.113549.3.7": "3des-cbc",
"2.16.840.1.101.3.4.1.2": "aes128-cbc",
"2.16.840.1.101.3.4.1.42": "aes256-cbc"
};
var CIPHER_TO_OID = {};
Object.keys(OID_TO_CIPHER).forEach(function(k) {
CIPHER_TO_OID[OID_TO_CIPHER[k]] = k;
});
var OID_TO_HASH = {
"1.2.840.113549.2.7": "sha1",
"1.2.840.113549.2.9": "sha256",
"1.2.840.113549.2.11": "sha512"
};
var HASH_TO_OID = {};
Object.keys(OID_TO_HASH).forEach(function(k) {
HASH_TO_OID[OID_TO_HASH[k]] = k;
});
function read(buf, options, forceType) {
var input = buf;
if (typeof buf !== "string") {
assert.buffer(buf, "buf");
buf = buf.toString("ascii");
}
var lines = buf.trim().split(/[\r\n]+/g);
var m;
var si = -1;
while (!m && si < lines.length) {
m = lines[++si].match(/[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);
}
assert.ok(m, "invalid PEM header");
var m2;
var ei = lines.length;
while (!m2 && ei > 0) {
m2 = lines[--ei].match(/[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);
}
assert.ok(m2, "invalid PEM footer");
assert.equal(m[2], m2[2]);
var type = m[2].toLowerCase();
var alg;
if (m[1]) {
assert.equal(m[1], m2[1], "PEM header and footer mismatch");
alg = m[1].trim();
}
lines = lines.slice(si, ei + 1);
var headers = {};
while (true) {
lines = lines.slice(1);
m = lines[0].match(/^([A-Za-z0-9-]+): (.+)$/);
if (!m)
break;
headers[m[1].toLowerCase()] = m[2];
}
lines = lines.slice(0, -1).join("");
buf = Buffer2.from(lines, "base64");
var cipher, key, iv;
if (headers["proc-type"]) {
var parts = headers["proc-type"].split(",");
if (parts[0] === "4" && parts[1] === "ENCRYPTED") {
if (typeof options.passphrase === "string") {
options.passphrase = Buffer2.from(options.passphrase, "utf-8");
}
if (!Buffer2.isBuffer(options.passphrase)) {
throw new errors.KeyEncryptedError(options.filename, "PEM");
} else {
parts = headers["dek-info"].split(",");
assert.ok(parts.length === 2);
cipher = parts[0].toLowerCase();
iv = Buffer2.from(parts[1], "hex");
key = utils.opensslKeyDeriv(cipher, iv, options.passphrase, 1).key;
}
}
}
if (alg && alg.toLowerCase() === "encrypted") {
var eder = new asn1.BerReader(buf);
var pbesEnd;
eder.readSequence();
eder.readSequence();
pbesEnd = eder.offset + eder.length;
var method = eder.readOID();
if (method !== OID_PBES2) {
throw new Error("Unsupported PEM/PKCS8 encryption scheme: " + method);
}
eder.readSequence();
eder.readSequence();
var kdfEnd = eder.offset + eder.length;
var kdfOid = eder.readOID();
if (kdfOid !== OID_PBKDF2)
throw new Error("Unsupported PBES2 KDF: " + kdfOid);
eder.readSequence();
var salt = eder.readString(asn1.Ber.OctetString, true);
var iterations = eder.readInt();
var hashAlg = "sha1";
if (eder.offset < kdfEnd) {
eder.readSequence();
var hashAlgOid = eder.readOID();
hashAlg = OID_TO_HASH[hashAlgOid];
if (hashAlg === void 0) {
throw new Error("Unsupported PBKDF2 hash: " + hashAlgOid);
}
}
eder._offset = kdfEnd;
eder.readSequence();
var cipherOid = eder.readOID();
cipher = OID_TO_CIPHER[cipherOid];
if (cipher === void 0) {
throw new Error("Unsupported PBES2 cipher: " + cipherOid);
}
iv = eder.readString(asn1.Ber.OctetString, true);
eder._offset = pbesEnd;
buf = eder.readString(asn1.Ber.OctetString, true);
if (typeof options.passphrase === "string") {
options.passphrase = Buffer2.from(options.passphrase, "utf-8");
}
if (!Buffer2.isBuffer(options.passphrase)) {
throw new errors.KeyEncryptedError(options.filename, "PEM");
}
var cinfo = utils.opensshCipherInfo(cipher);
cipher = cinfo.opensslName;
key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize, options.passphrase);
alg = void 0;
}
if (cipher && key && iv) {
var cipherStream = crypto2.createDecipheriv(cipher, key, iv);
var chunk, chunks = [];
cipherStream.once("error", function(e) {
if (e.toString().indexOf("bad decrypt") !== -1) {
throw new Error("Incorrect passphrase supplied, could not decrypt key");
}
throw e;
});
cipherStream.write(buf);
cipherStream.end();
while ((chunk = cipherStream.read()) !== null)
chunks.push(chunk);
buf = Buffer2.concat(chunks);
}
if (alg && alg.toLowerCase() === "openssh")
return sshpriv.readSSHPrivate(type, buf, options);
if (alg && alg.toLowerCase() === "ssh2")
return rfc4253.readType(type, buf, options);
var der = new asn1.BerReader(buf);
der.originalInput = input;
der.readSequence();
if (alg) {
if (forceType)
assert.strictEqual(forceType, "pkcs1");
return pkcs1.readPkcs1(alg, type, der);
} else {
if (forceType)
assert.strictEqual(forceType, "pkcs8");
return pkcs8.readPkcs8(alg, type, der);
}
}
function write(key, options, type) {
assert.object(key);
var alg = {
"ecdsa": "EC",
"rsa": "RSA",
"dsa": "DSA",
"ed25519": "EdDSA"
}[key.type];
var header;
var der = new asn1.BerWriter();
if (PrivateKey.isPrivateKey(key)) {
if (type && type === "pkcs8") {
header = "PRIVATE KEY";
pkcs8.writePkcs8(der, key);
} else {
if (type)
assert.strictEqual(type, "pkcs1");
header = alg + " PRIVATE KEY";
pkcs1.writePkcs1(der, key);
}
} else if (Key.isKey(key)) {
if (type && type === "pkcs1") {
header = alg + " PUBLIC KEY";
pkcs1.writePkcs1(der, key);
} else {
if (type)
assert.strictEqual(type, "pkcs8");
header = "PUBLIC KEY";
pkcs8.writePkcs8(der, key);
}
} else {
throw new Error("key is not a Key or PrivateKey");
}
var tmp = der.buffer.toString("base64");
var len = tmp.length + tmp.length / 64 + 18 + 16 + header.length * 2 + 10;
var buf = Buffer2.alloc(len);
var o = 0;
o += buf.write("-----BEGIN " + header + "-----\n", o);
for (var i = 0; i < tmp.length; ) {
var limit = i + 64;
if (limit > tmp.length)
limit = tmp.length;
o += buf.write(tmp.slice(i, limit), o);
buf[o++] = 10;
i = limit;
}
o += buf.write("-----END " + header + "-----\n", o);
return buf.slice(0, o);
}
}
});
// node_modules/sshpk/lib/formats/ssh.js
var require_ssh = __commonJS({
"node_modules/sshpk/lib/formats/ssh.js"(exports, module2) {
module2.exports = {
read,
write
};
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var rfc4253 = require_rfc4253();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var sshpriv = require_ssh_private();
var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/;
var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/;
function read(buf, options) {
if (typeof buf !== "string") {
assert.buffer(buf, "buf");
buf = buf.toString("ascii");
}
var trimmed = buf.trim().replace(/[\\\r]/g, "");
var m = trimmed.match(SSHKEY_RE);
if (!m)
m = trimmed.match(SSHKEY_RE2);
assert.ok(m, "key must match regex");
var type = rfc4253.algToKeyType(m[1]);
var kbuf = Buffer2.from(m[2], "base64");
var key;
var ret = {};
if (m[4]) {
try {
key = rfc4253.read(kbuf);
} catch (e) {
m = trimmed.match(SSHKEY_RE2);
assert.ok(m, "key must match regex");
kbuf = Buffer2.from(m[2], "base64");
key = rfc4253.readInternal(ret, "public", kbuf);
}
} else {
key = rfc4253.readInternal(ret, "public", kbuf);
}
assert.strictEqual(type, key.type);
if (m[4] && m[4].length > 0) {
key.comment = m[4];
} else if (ret.consumed) {
var data = m[2] + (m[3] ? m[3] : "");
var realOffset = Math.ceil(ret.consumed / 3) * 4;
data = data.slice(0, realOffset - 2).replace(/[^a-zA-Z0-9+\/=]/g, "") + data.slice(realOffset - 2);
var padding = ret.consumed % 3;
if (padding > 0 && data.slice(realOffset - 1, realOffset) !== "=")
realOffset--;
while (data.slice(realOffset, realOffset + 1) === "=")
realOffset++;
var trailer = data.slice(realOffset);
trailer = trailer.replace(/[\r\n]/g, " ").replace(/^\s+/, "");
if (trailer.match(/^[a-zA-Z0-9]/))
key.comment = trailer;
}
return key;
}
function write(key, options) {
assert.object(key);
if (!Key.isKey(key))
throw new Error("Must be a public key");
var parts = [];
var alg = rfc4253.keyTypeToAlg(key);
parts.push(alg);
var buf = rfc4253.write(key);
parts.push(buf.toString("base64"));
if (key.comment)
parts.push(key.comment);
return Buffer2.from(parts.join(" "));
}
}
});
// node_modules/sshpk/lib/formats/dnssec.js
var require_dnssec = __commonJS({
"node_modules/sshpk/lib/formats/dnssec.js"(exports, module2) {
module2.exports = {
read,
write
};
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var Key = require_key();
var PrivateKey = require_private_key();
var utils = require_utils2();
var SSHBuffer = require_ssh_buffer();
var Dhe = require_dhe();
var supportedAlgos = {
"rsa-sha1": 5,
"rsa-sha256": 8,
"rsa-sha512": 10,
"ecdsa-p256-sha256": 13,
"ecdsa-p384-sha384": 14
};
var supportedAlgosById = {};
Object.keys(supportedAlgos).forEach(function(k) {
supportedAlgosById[supportedAlgos[k]] = k.toUpperCase();
});
function read(buf, options) {
if (typeof buf !== "string") {
assert.buffer(buf, "buf");
buf = buf.toString("ascii");
}
var lines = buf.split("\n");
if (lines[0].match(/^Private-key-format\: v1/)) {
var algElems = lines[1].split(" ");
var algoNum = parseInt(algElems[1], 10);
var algoName = algElems[2];
if (!supportedAlgosById[algoNum])
throw new Error("Unsupported algorithm: " + algoName);
return readDNSSECPrivateKey(algoNum, lines.slice(2));
}
var line = 0;
while (lines[line].match(/^\;/))
line++;
if ((lines[line].match(/\. IN KEY /) || lines[line].match(/\. IN DNSKEY /)) && lines[line + 1].length === 0) {
return readRFC3110(lines[line]);
}
throw new Error("Cannot parse dnssec key");
}
function readRFC3110(keyString) {
var elems = keyString.split(" ");
var algorithm = parseInt(elems[5], 10);
if (!supportedAlgosById[algorithm])
throw new Error("Unsupported algorithm: " + algorithm);
var base64key = elems.slice(6, elems.length).join();
var keyBuffer = Buffer2.from(base64key, "base64");
if (supportedAlgosById[algorithm].match(/^RSA-/)) {
var publicExponentLen = keyBuffer.readUInt8(0);
if (publicExponentLen != 3 && publicExponentLen != 1)
throw new Error("Cannot parse dnssec key: unsupported exponent length");
var publicExponent = keyBuffer.slice(1, publicExponentLen + 1);
publicExponent = utils.mpNormalize(publicExponent);
var modulus = keyBuffer.slice(1 + publicExponentLen);
modulus = utils.mpNormalize(modulus);
var rsaKey = {
type: "rsa",
parts: []
};
rsaKey.parts.push({ name: "e", data: publicExponent });
rsaKey.parts.push({ name: "n", data: modulus });
return new Key(rsaKey);
}
if (supportedAlgosById[algorithm] === "ECDSA-P384-SHA384" || supportedAlgosById[algorithm] === "ECDSA-P256-SHA256") {
var curve = "nistp384";
var size = 384;
if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) {
curve = "nistp256";
size = 256;
}
var ecdsaKey = {
type: "ecdsa",
curve,
size,
parts: [
{ name: "curve", data: Buffer2.from(curve) },
{ name: "Q", data: utils.ecNormalize(keyBuffer) }
]
};
return new Key(ecdsaKey);
}
throw new Error("Unsupported algorithm: " + supportedAlgosById[algorithm]);
}
function elementToBuf(e) {
return Buffer2.from(e.split(" ")[1], "base64");
}
function readDNSSECRSAPrivateKey(elements) {
var rsaParams = {};
elements.forEach(function(element) {
if (element.split(" ")[0] === "Modulus:")
rsaParams["n"] = elementToBuf(element);
else if (element.split(" ")[0] === "PublicExponent:")
rsaParams["e"] = elementToBuf(element);
else if (element.split(" ")[0] === "PrivateExponent:")
rsaParams["d"] = elementToBuf(element);
else if (element.split(" ")[0] === "Prime1:")
rsaParams["p"] = elementToBuf(element);
else if (element.split(" ")[0] === "Prime2:")
rsaParams["q"] = elementToBuf(element);
else if (element.split(" ")[0] === "Exponent1:")
rsaParams["dmodp"] = elementToBuf(element);
else if (element.split(" ")[0] === "Exponent2:")
rsaParams["dmodq"] = elementToBuf(element);
else if (element.split(" ")[0] === "Coefficient:")
rsaParams["iqmp"] = elementToBuf(element);
});
var key = {
type: "rsa",
parts: [
{ name: "e", data: utils.mpNormalize(rsaParams["e"]) },
{ name: "n", data: utils.mpNormalize(rsaParams["n"]) },
{ name: "d", data: utils.mpNormalize(rsaParams["d"]) },
{ name: "p", data: utils.mpNormalize(rsaParams["p"]) },
{ name: "q", data: utils.mpNormalize(rsaParams["q"]) },
{
name: "dmodp",
data: utils.mpNormalize(rsaParams["dmodp"])
},
{
name: "dmodq",
data: utils.mpNormalize(rsaParams["dmodq"])
},
{
name: "iqmp",
data: utils.mpNormalize(rsaParams["iqmp"])
}
]
};
return new PrivateKey(key);
}
function readDNSSECPrivateKey(alg, elements) {
if (supportedAlgosById[alg].match(/^RSA-/)) {
return readDNSSECRSAPrivateKey(elements);
}
if (supportedAlgosById[alg] === "ECDSA-P384-SHA384" || supportedAlgosById[alg] === "ECDSA-P256-SHA256") {
var d = Buffer2.from(elements[0].split(" ")[1], "base64");
var curve = "nistp384";
var size = 384;
if (supportedAlgosById[alg] === "ECDSA-P256-SHA256") {
curve = "nistp256";
size = 256;
}
var publicKey = utils.publicFromPrivateECDSA(curve, d);
var Q = publicKey.part["Q"].data;
var ecdsaKey = {
type: "ecdsa",
curve,
size,
parts: [
{ name: "curve", data: Buffer2.from(curve) },
{ name: "d", data: d },
{ name: "Q", data: Q }
]
};
return new PrivateKey(ecdsaKey);
}
throw new Error("Unsupported algorithm: " + supportedAlgosById[alg]);
}
function dnssecTimestamp(date) {
var year = date.getFullYear() + "";
var month = date.getMonth() + 1;
var timestampStr = year + month + date.getUTCDate();
timestampStr += "" + date.getUTCHours() + date.getUTCMinutes();
timestampStr += date.getUTCSeconds();
return timestampStr;
}
function rsaAlgFromOptions(opts) {
if (!opts || !opts.hashAlgo || opts.hashAlgo === "sha1")
return "5 (RSASHA1)";
else if (opts.hashAlgo === "sha256")
return "8 (RSASHA256)";
else if (opts.hashAlgo === "sha512")
return "10 (RSASHA512)";
else
throw new Error("Unknown or unsupported hash: " + opts.hashAlgo);
}
function writeRSA(key, options) {
if (!key.part.dmodp || !key.part.dmodq) {
utils.addRSAMissing(key);
}
var out = "";
out += "Private-key-format: v1.3\n";
out += "Algorithm: " + rsaAlgFromOptions(options) + "\n";
var n = utils.mpDenormalize(key.part["n"].data);
out += "Modulus: " + n.toString("base64") + "\n";
var e = utils.mpDenormalize(key.part["e"].data);
out += "PublicExponent: " + e.toString("base64") + "\n";
var d = utils.mpDenormalize(key.part["d"].data);
out += "PrivateExponent: " + d.toString("base64") + "\n";
var p = utils.mpDenormalize(key.part["p"].data);
out += "Prime1: " + p.toString("base64") + "\n";
var q2 = utils.mpDenormalize(key.part["q"].data);
out += "Prime2: " + q2.toString("base64") + "\n";
var dmodp = utils.mpDenormalize(key.part["dmodp"].data);
out += "Exponent1: " + dmodp.toString("base64") + "\n";
var dmodq = utils.mpDenormalize(key.part["dmodq"].data);
out += "Exponent2: " + dmodq.toString("base64") + "\n";
var iqmp = utils.mpDenormalize(key.part["iqmp"].data);
out += "Coefficient: " + iqmp.toString("base64") + "\n";
var timestamp = new Date();
out += "Created: " + dnssecTimestamp(timestamp) + "\n";
out += "Publish: " + dnssecTimestamp(timestamp) + "\n";
out += "Activate: " + dnssecTimestamp(timestamp) + "\n";
return Buffer2.from(out, "ascii");
}
function writeECDSA(key, options) {
var out = "";
out += "Private-key-format: v1.3\n";
if (key.curve === "nistp256") {
out += "Algorithm: 13 (ECDSAP256SHA256)\n";
} else if (key.curve === "nistp384") {
out += "Algorithm: 14 (ECDSAP384SHA384)\n";
} else {
throw new Error("Unsupported curve");
}
var base64Key = key.part["d"].data.toString("base64");
out += "PrivateKey: " + base64Key + "\n";
var timestamp = new Date();
out += "Created: " + dnssecTimestamp(timestamp) + "\n";
out += "Publish: " + dnssecTimestamp(timestamp) + "\n";
out += "Activate: " + dnssecTimestamp(timestamp) + "\n";
return Buffer2.from(out, "ascii");
}
function write(key, options) {
if (PrivateKey.isPrivateKey(key)) {
if (key.type === "rsa") {
return writeRSA(key, options);
} else if (key.type === "ecdsa") {
return writeECDSA(key, options);
} else {
throw new Error("Unsupported algorithm: " + key.type);
}
} else if (Key.isKey(key)) {
throw new Error('Format "dnssec" only supports writing private keys');
} else {
throw new Error("key is not a Key or PrivateKey");
}
}
}
});
// node_modules/sshpk/lib/formats/putty.js
var require_putty = __commonJS({
"node_modules/sshpk/lib/formats/putty.js"(exports, module2) {
module2.exports = {
read,
write
};
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var rfc4253 = require_rfc4253();
var Key = require_key();
var SSHBuffer = require_ssh_buffer();
var crypto2 = require("crypto");
var PrivateKey = require_private_key();
var errors = require_errors2();
function read(buf, options) {
var lines = buf.toString("ascii").split(/[\r\n]+/);
var found = false;
var parts;
var si = 0;
var formatVersion;
while (si < lines.length) {
parts = splitHeader(lines[si++]);
if (parts) {
formatVersion = {
"putty-user-key-file-2": 2,
"putty-user-key-file-3": 3
}[parts[0].toLowerCase()];
if (formatVersion) {
found = true;
break;
}
}
}
if (!found) {
throw new Error("No PuTTY format first line found");
}
var alg = parts[1];
parts = splitHeader(lines[si++]);
assert.equal(parts[0].toLowerCase(), "encryption");
var encryption = parts[1];
parts = splitHeader(lines[si++]);
assert.equal(parts[0].toLowerCase(), "comment");
var comment = parts[1];
parts = splitHeader(lines[si++]);
assert.equal(parts[0].toLowerCase(), "public-lines");
var publicLines = parseInt(parts[1], 10);
if (!isFinite(publicLines) || publicLines < 0 || publicLines > lines.length) {
throw new Error("Invalid public-lines count");
}
var publicBuf = Buffer2.from(lines.slice(si, si + publicLines).join(""), "base64");
var keyType = rfc4253.algToKeyType(alg);
var key = rfc4253.read(publicBuf);
if (key.type !== keyType) {
throw new Error("Outer key algorithm mismatch");
}
si += publicLines;
if (lines[si]) {
parts = splitHeader(lines[si++]);
assert.equal(parts[0].toLowerCase(), "private-lines");
var privateLines = parseInt(parts[1], 10);
if (!isFinite(privateLines) || privateLines < 0 || privateLines > lines.length) {
throw new Error("Invalid private-lines count");
}
var privateBuf = Buffer2.from(lines.slice(si, si + privateLines).join(""), "base64");
if (encryption !== "none" && formatVersion === 3) {
throw new Error("Encrypted keys arenot supported for PuTTY format version 3");
}
if (encryption === "aes256-cbc") {
if (!options.passphrase) {
throw new errors.KeyEncryptedError(options.filename, "PEM");
}
var iv = Buffer2.alloc(16, 0);
var decipher = crypto2.createDecipheriv("aes-256-cbc", derivePPK2EncryptionKey(options.passphrase), iv);
decipher.setAutoPadding(false);
privateBuf = Buffer2.concat([
decipher.update(privateBuf),
decipher.final()
]);
}
key = new PrivateKey(key);
if (key.type !== keyType) {
throw new Error("Outer key algorithm mismatch");
}
var sshbuf = new SSHBuffer({ buffer: privateBuf });
var privateKeyParts;
if (alg === "ssh-dss") {
privateKeyParts = [{
name: "x",
data: sshbuf.readBuffer()
}];
} else if (alg === "ssh-rsa") {
privateKeyParts = [
{ name: "d", data: sshbuf.readBuffer() },
{ name: "p", data: sshbuf.readBuffer() },
{ name: "q", data: sshbuf.readBuffer() },
{ name: "iqmp", data: sshbuf.readBuffer() }
];
} else if (alg.match(/^ecdsa-sha2-nistp/)) {
privateKeyParts = [{
name: "d",
data: sshbuf.readBuffer()
}];
} else if (alg === "ssh-ed25519") {
privateKeyParts = [{
name: "k",
data: sshbuf.readBuffer()
}];
} else {
throw new Error("Unsupported PPK key type: " + alg);
}
key = new PrivateKey({
type: key.type,
parts: key.parts.concat(privateKeyParts)
});
}
key.comment = comment;
return key;
}
function derivePPK2EncryptionKey(passphrase) {
var hash1 = crypto2.createHash("sha1").update(Buffer2.concat([
Buffer2.from([0, 0, 0, 0]),
Buffer2.from(passphrase)
])).digest();
var hash2 = crypto2.createHash("sha1").update(Buffer2.concat([
Buffer2.from([0, 0, 0, 1]),
Buffer2.from(passphrase)
])).digest();
return Buffer2.concat([hash1, hash2]).slice(0, 32);
}
function splitHeader(line) {
var idx = line.indexOf(":");
if (idx === -1)
return null;
var header = line.slice(0, idx);
++idx;
while (line[idx] === " ")
++idx;
var rest = line.slice(idx);
return [header, rest];
}
function write(key, options) {
assert.object(key);
if (!Key.isKey(key))
throw new Error("Must be a public key");
var alg = rfc4253.keyTypeToAlg(key);
var buf = rfc4253.write(key);
var comment = key.comment || "";
var b64 = buf.toString("base64");
var lines = wrap(b64, 64);
lines.unshift("Public-Lines: " + lines.length);
lines.unshift("Comment: " + comment);
lines.unshift("Encryption: none");
lines.unshift("PuTTY-User-Key-File-2: " + alg);
return Buffer2.from(lines.join("\n") + "\n");
}
function wrap(txt, len) {
var lines = [];
var pos = 0;
while (pos < txt.length) {
lines.push(txt.slice(pos, pos + 64));
pos += 64;
}
return lines;
}
}
});
// node_modules/sshpk/lib/formats/auto.js
var require_auto = __commonJS({
"node_modules/sshpk/lib/formats/auto.js"(exports, module2) {
module2.exports = {
read,
write
};
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var pem = require_pem();
var ssh = require_ssh();
var rfc4253 = require_rfc4253();
var dnssec = require_dnssec();
var putty = require_putty();
var DNSSEC_PRIVKEY_HEADER_PREFIX = "Private-key-format: v1";
function read(buf, options) {
if (typeof buf === "string") {
if (buf.trim().match(/^[-]+[ ]*BEGIN/))
return pem.read(buf, options);
if (buf.match(/^\s*ssh-[a-z]/))
return ssh.read(buf, options);
if (buf.match(/^\s*ecdsa-/))
return ssh.read(buf, options);
if (buf.match(/^putty-user-key-file-2:/i))
return putty.read(buf, options);
if (findDNSSECHeader(buf))
return dnssec.read(buf, options);
buf = Buffer2.from(buf, "binary");
} else {
assert.buffer(buf);
if (findPEMHeader(buf))
return pem.read(buf, options);
if (findSSHHeader(buf))
return ssh.read(buf, options);
if (findPuTTYHeader(buf))
return putty.read(buf, options);
if (findDNSSECHeader(buf))
return dnssec.read(buf, options);
}
if (buf.readUInt32BE(0) < buf.length)
return rfc4253.read(buf, options);
throw new Error("Failed to auto-detect format of key");
}
function findPuTTYHeader(buf) {
var offset = 0;
while (offset < buf.length && (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9))
++offset;
if (offset + 22 <= buf.length && buf.slice(offset, offset + 22).toString("ascii").toLowerCase() === "putty-user-key-file-2:")
return true;
return false;
}
function findSSHHeader(buf) {
var offset = 0;
while (offset < buf.length && (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9))
++offset;
if (offset + 4 <= buf.length && buf.slice(offset, offset + 4).toString("ascii") === "ssh-")
return true;
if (offset + 6 <= buf.length && buf.slice(offset, offset + 6).toString("ascii") === "ecdsa-")
return true;
return false;
}
function findPEMHeader(buf) {
var offset = 0;
while (offset < buf.length && (buf[offset] === 32 || buf[offset] === 10))
++offset;
if (buf[offset] !== 45)
return false;
while (offset < buf.length && buf[offset] === 45)
++offset;
while (offset < buf.length && buf[offset] === 32)
++offset;
if (offset + 5 > buf.length || buf.slice(offset, offset + 5).toString("ascii") !== "BEGIN")
return false;
return true;
}
function findDNSSECHeader(buf) {
if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length)
return false;
var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length);
if (headerCheck.toString("ascii") === DNSSEC_PRIVKEY_HEADER_PREFIX)
return true;
if (typeof buf !== "string") {
buf = buf.toString("ascii");
}
var lines = buf.split("\n");
var line = 0;
while (lines[line].match(/^\;/))
line++;
if (lines[line].toString("ascii").match(/\. IN KEY /))
return true;
if (lines[line].toString("ascii").match(/\. IN DNSKEY /))
return true;
return false;
}
function write(key, options) {
throw new Error('"auto" format cannot be used for writing');
}
}
});
// node_modules/sshpk/lib/private-key.js
var require_private_key = __commonJS({
"node_modules/sshpk/lib/private-key.js"(exports, module2) {
module2.exports = PrivateKey;
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var crypto2 = require("crypto");
var Fingerprint = require_fingerprint();
var Signature = require_signature();
var errs = require_errors2();
var util = require("util");
var utils = require_utils2();
var dhe = require_dhe();
var generateECDSA = dhe.generateECDSA;
var generateED25519 = dhe.generateED25519;
var edCompat = require_ed_compat();
var nacl = require_nacl_fast();
var Key = require_key();
var InvalidAlgorithmError = errs.InvalidAlgorithmError;
var KeyParseError = errs.KeyParseError;
var KeyEncryptedError = errs.KeyEncryptedError;
var formats = {};
formats["auto"] = require_auto();
formats["pem"] = require_pem();
formats["pkcs1"] = require_pkcs1();
formats["pkcs8"] = require_pkcs8();
formats["rfc4253"] = require_rfc4253();
formats["ssh-private"] = require_ssh_private();
formats["openssh"] = formats["ssh-private"];
formats["ssh"] = formats["ssh-private"];
formats["dnssec"] = require_dnssec();
formats["putty"] = require_putty();
function PrivateKey(opts) {
assert.object(opts, "options");
Key.call(this, opts);
this._pubCache = void 0;
}
util.inherits(PrivateKey, Key);
PrivateKey.formats = formats;
PrivateKey.prototype.toBuffer = function(format, options) {
if (format === void 0)
format = "pkcs1";
assert.string(format, "format");
assert.object(formats[format], "formats[format]");
assert.optionalObject(options, "options");
return formats[format].write(this, options);
};
PrivateKey.prototype.hash = function(algo, type) {
return this.toPublic().hash(algo, type);
};
PrivateKey.prototype.fingerprint = function(algo, type) {
return this.toPublic().fingerprint(algo, type);
};
PrivateKey.prototype.toPublic = function() {
if (this._pubCache)
return this._pubCache;
var algInfo = algs.info[this.type];
var pubParts = [];
for (var i = 0; i < algInfo.parts.length; ++i) {
var p = algInfo.parts[i];
pubParts.push(this.part[p]);
}
this._pubCache = new Key({
type: this.type,
source: this,
parts: pubParts
});
if (this.comment)
this._pubCache.comment = this.comment;
return this._pubCache;
};
PrivateKey.prototype.derive = function(newType) {
assert.string(newType, "type");
var priv, pub, pair;
if (this.type === "ed25519" && newType === "curve25519") {
priv = this.part.k.data;
if (priv[0] === 0)
priv = priv.slice(1);
pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv));
pub = Buffer2.from(pair.publicKey);
return new PrivateKey({
type: "curve25519",
parts: [
{ name: "A", data: utils.mpNormalize(pub) },
{ name: "k", data: utils.mpNormalize(priv) }
]
});
} else if (this.type === "curve25519" && newType === "ed25519") {
priv = this.part.k.data;
if (priv[0] === 0)
priv = priv.slice(1);
pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv));
pub = Buffer2.from(pair.publicKey);
return new PrivateKey({
type: "ed25519",
parts: [
{ name: "A", data: utils.mpNormalize(pub) },
{ name: "k", data: utils.mpNormalize(priv) }
]
});
}
throw new Error("Key derivation not supported from " + this.type + " to " + newType);
};
PrivateKey.prototype.createVerify = function(hashAlgo) {
return this.toPublic().createVerify(hashAlgo);
};
PrivateKey.prototype.createSign = function(hashAlgo) {
if (hashAlgo === void 0)
hashAlgo = this.defaultHashAlgorithm();
assert.string(hashAlgo, "hash algorithm");
if (this.type === "ed25519" && edCompat !== void 0)
return new edCompat.Signer(this, hashAlgo);
if (this.type === "curve25519")
throw new Error("Curve25519 keys are not suitable for signing or verification");
var v, nm, err;
try {
nm = hashAlgo.toUpperCase();
v = crypto2.createSign(nm);
} catch (e) {
err = e;
}
if (v === void 0 || err instanceof Error && err.message.match(/Unknown message digest/)) {
nm = "RSA-";
nm += hashAlgo.toUpperCase();
v = crypto2.createSign(nm);
}
assert.ok(v, "failed to create verifier");
var oldSign = v.sign.bind(v);
var key = this.toBuffer("pkcs1");
var type = this.type;
var curve = this.curve;
v.sign = function() {
var sig = oldSign(key);
if (typeof sig === "string")
sig = Buffer2.from(sig, "binary");
sig = Signature.parse(sig, type, "asn1");
sig.hashAlgorithm = hashAlgo;
sig.curve = curve;
return sig;
};
return v;
};
PrivateKey.parse = function(data, format, options) {
if (typeof data !== "string")
assert.buffer(data, "data");
if (format === void 0)
format = "auto";
assert.string(format, "format");
if (typeof options === "string")
options = { filename: options };
assert.optionalObject(options, "options");
if (options === void 0)
options = {};
assert.optionalString(options.filename, "options.filename");
if (options.filename === void 0)
options.filename = "(unnamed)";
assert.object(formats[format], "formats[format]");
try {
var k = formats[format].read(data, options);
assert.ok(k instanceof PrivateKey, "key is not a private key");
if (!k.comment)
k.comment = options.filename;
return k;
} catch (e) {
if (e.name === "KeyEncryptedError")
throw e;
throw new KeyParseError(options.filename, format, e);
}
};
PrivateKey.isPrivateKey = function(obj, ver) {
return utils.isCompatible(obj, PrivateKey, ver);
};
PrivateKey.generate = function(type, options) {
if (options === void 0)
options = {};
assert.object(options, "options");
switch (type) {
case "ecdsa":
if (options.curve === void 0)
options.curve = "nistp256";
assert.string(options.curve, "options.curve");
return generateECDSA(options.curve);
case "ed25519":
return generateED25519();
default:
throw new Error('Key generation not supported with key type "' + type + '"');
}
};
PrivateKey.prototype._sshpkApiVersion = [1, 6];
PrivateKey._oldVersionDetect = function(obj) {
assert.func(obj.toPublic);
assert.func(obj.createSign);
if (obj.derive)
return [1, 3];
if (obj.defaultHashAlgorithm)
return [1, 2];
if (obj.formats["auto"])
return [1, 1];
return [1, 0];
};
}
});
// node_modules/sshpk/lib/identity.js
var require_identity = __commonJS({
"node_modules/sshpk/lib/identity.js"(exports, module2) {
module2.exports = Identity;
var assert = require_assert();
var algs = require_algs();
var crypto2 = require("crypto");
var Fingerprint = require_fingerprint();
var Signature = require_signature();
var errs = require_errors2();
var util = require("util");
var utils = require_utils2();
var asn1 = require_lib();
var Buffer2 = require_safer().Buffer;
var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i;
var oids = {};
oids.cn = "2.5.4.3";
oids.o = "2.5.4.10";
oids.ou = "2.5.4.11";
oids.l = "2.5.4.7";
oids.s = "2.5.4.8";
oids.c = "2.5.4.6";
oids.sn = "2.5.4.4";
oids.postalCode = "2.5.4.17";
oids.serialNumber = "2.5.4.5";
oids.street = "2.5.4.9";
oids.x500UniqueIdentifier = "2.5.4.45";
oids.role = "2.5.4.72";
oids.telephoneNumber = "2.5.4.20";
oids.description = "2.5.4.13";
oids.dc = "0.9.2342.19200300.100.1.25";
oids.uid = "0.9.2342.19200300.100.1.1";
oids.mail = "0.9.2342.19200300.100.1.3";
oids.title = "2.5.4.12";
oids.gn = "2.5.4.42";
oids.initials = "2.5.4.43";
oids.pseudonym = "2.5.4.65";
oids.emailAddress = "1.2.840.113549.1.9.1";
var unoids = {};
Object.keys(oids).forEach(function(k) {
unoids[oids[k]] = k;
});
function Identity(opts) {
var self2 = this;
assert.object(opts, "options");
assert.arrayOfObject(opts.components, "options.components");
this.components = opts.components;
this.componentLookup = {};
this.components.forEach(function(c) {
if (c.name && !c.oid)
c.oid = oids[c.name];
if (c.oid && !c.name)
c.name = unoids[c.oid];
if (self2.componentLookup[c.name] === void 0)
self2.componentLookup[c.name] = [];
self2.componentLookup[c.name].push(c);
});
if (this.componentLookup.cn && this.componentLookup.cn.length > 0) {
this.cn = this.componentLookup.cn[0].value;
}
assert.optionalString(opts.type, "options.type");
if (opts.type === void 0) {
if (this.components.length === 1 && this.componentLookup.cn && this.componentLookup.cn.length === 1 && this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {
this.type = "host";
this.hostname = this.componentLookup.cn[0].value;
} else if (this.componentLookup.dc && this.components.length === this.componentLookup.dc.length) {
this.type = "host";
this.hostname = this.componentLookup.dc.map(function(c) {
return c.value;
}).join(".");
} else if (this.componentLookup.uid && this.components.length === this.componentLookup.uid.length) {
this.type = "user";
this.uid = this.componentLookup.uid[0].value;
} else if (this.componentLookup.cn && this.componentLookup.cn.length === 1 && this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {
this.type = "host";
this.hostname = this.componentLookup.cn[0].value;
} else if (this.componentLookup.uid && this.componentLookup.uid.length === 1) {
this.type = "user";
this.uid = this.componentLookup.uid[0].value;
} else if (this.componentLookup.mail && this.componentLookup.mail.length === 1) {
this.type = "email";
this.email = this.componentLookup.mail[0].value;
} else if (this.componentLookup.cn && this.componentLookup.cn.length === 1) {
this.type = "user";
this.uid = this.componentLookup.cn[0].value;
} else {
this.type = "unknown";
}
} else {
this.type = opts.type;
if (this.type === "host")
this.hostname = opts.hostname;
else if (this.type === "user")
this.uid = opts.uid;
else if (this.type === "email")
this.email = opts.email;
else
throw new Error("Unknown type " + this.type);
}
}
Identity.prototype.toString = function() {
return this.components.map(function(c) {
var n = c.name.toUpperCase();
n = n.replace(/=/g, "\\=");
var v = c.value;
v = v.replace(/,/g, "\\,");
return n + "=" + v;
}).join(", ");
};
Identity.prototype.get = function(name, asArray) {
assert.string(name, "name");
var arr = this.componentLookup[name];
if (arr === void 0 || arr.length === 0)
return void 0;
if (!asArray && arr.length > 1)
throw new Error("Multiple values for attribute " + name);
if (!asArray)
return arr[0].value;
return arr.map(function(c) {
return c.value;
});
};
Identity.prototype.toArray = function(idx) {
return this.components.map(function(c) {
return {
name: c.name,
value: c.value
};
});
};
var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/;
var NOT_IA5 = /[^\x00-\x7f]/;
Identity.prototype.toAsn1 = function(der, tag) {
der.startSequence(tag);
this.components.forEach(function(c) {
der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set);
der.startSequence();
der.writeOID(c.oid);
if (c.asn1type === asn1.Ber.Utf8String || c.value.match(NOT_IA5)) {
var v = Buffer2.from(c.value, "utf8");
der.writeBuffer(v, asn1.Ber.Utf8String);
} else if (c.asn1type === asn1.Ber.IA5String || c.value.match(NOT_PRINTABLE)) {
der.writeString(c.value, asn1.Ber.IA5String);
} else {
var type = asn1.Ber.PrintableString;
if (c.asn1type !== void 0)
type = c.asn1type;
der.writeString(c.value, type);
}
der.endSequence();
der.endSequence();
});
der.endSequence();
};
function globMatch(a, b) {
if (a === "**" || b === "**")
return true;
var aParts = a.split(".");
var bParts = b.split(".");
if (aParts.length !== bParts.length)
return false;
for (var i = 0; i < aParts.length; ++i) {
if (aParts[i] === "*" || bParts[i] === "*")
continue;
if (aParts[i] !== bParts[i])
return false;
}
return true;
}
Identity.prototype.equals = function(other) {
if (!Identity.isIdentity(other, [1, 0]))
return false;
if (other.components.length !== this.components.length)
return false;
for (var i = 0; i < this.components.length; ++i) {
if (this.components[i].oid !== other.components[i].oid)
return false;
if (!globMatch(this.components[i].value, other.components[i].value)) {
return false;
}
}
return true;
};
Identity.forHost = function(hostname) {
assert.string(hostname, "hostname");
return new Identity({
type: "host",
hostname,
components: [{ name: "cn", value: hostname }]
});
};
Identity.forUser = function(uid) {
assert.string(uid, "uid");
return new Identity({
type: "user",
uid,
components: [{ name: "uid", value: uid }]
});
};
Identity.forEmail = function(email) {
assert.string(email, "email");
return new Identity({
type: "email",
email,
components: [{ name: "mail", value: email }]
});
};
Identity.parseDN = function(dn) {
assert.string(dn, "dn");
var parts = [""];
var idx = 0;
var rem = dn;
while (rem.length > 0) {
var m;
if ((m = /^,/.exec(rem)) !== null) {
parts[++idx] = "";
rem = rem.slice(m[0].length);
} else if ((m = /^\\,/.exec(rem)) !== null) {
parts[idx] += ",";
rem = rem.slice(m[0].length);
} else if ((m = /^\\./.exec(rem)) !== null) {
parts[idx] += m[0];
rem = rem.slice(m[0].length);
} else if ((m = /^[^\\,]+/.exec(rem)) !== null) {
parts[idx] += m[0];
rem = rem.slice(m[0].length);
} else {
throw new Error("Failed to parse DN");
}
}
var cmps = parts.map(function(c) {
c = c.trim();
var eqPos = c.indexOf("=");
while (eqPos > 0 && c.charAt(eqPos - 1) === "\\")
eqPos = c.indexOf("=", eqPos + 1);
if (eqPos === -1) {
throw new Error("Failed to parse DN");
}
var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, "=");
var value = c.slice(eqPos + 1);
return { name, value };
});
return new Identity({ components: cmps });
};
Identity.fromArray = function(components) {
assert.arrayOfObject(components, "components");
components.forEach(function(cmp) {
assert.object(cmp, "component");
assert.string(cmp.name, "component.name");
if (!Buffer2.isBuffer(cmp.value) && !(typeof cmp.value === "string")) {
throw new Error("Invalid component value");
}
});
return new Identity({ components });
};
Identity.parseAsn1 = function(der, top) {
var components = [];
der.readSequence(top);
var end = der.offset + der.length;
while (der.offset < end) {
der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set);
var after = der.offset + der.length;
der.readSequence();
var oid = der.readOID();
var type = der.peek();
var value;
switch (type) {
case asn1.Ber.PrintableString:
case asn1.Ber.IA5String:
case asn1.Ber.OctetString:
case asn1.Ber.T61String:
value = der.readString(type);
break;
case asn1.Ber.Utf8String:
value = der.readString(type, true);
value = value.toString("utf8");
break;
case asn1.Ber.CharacterString:
case asn1.Ber.BMPString:
value = der.readString(type, true);
value = value.toString("utf16le");
break;
default:
throw new Error("Unknown asn1 type " + type);
}
components.push({ oid, asn1type: type, value });
der._offset = after;
}
der._offset = end;
return new Identity({
components
});
};
Identity.isIdentity = function(obj, ver) {
return utils.isCompatible(obj, Identity, ver);
};
Identity.prototype._sshpkApiVersion = [1, 0];
Identity._oldVersionDetect = function(obj) {
return [1, 0];
};
}
});
// node_modules/sshpk/lib/formats/openssh-cert.js
var require_openssh_cert = __commonJS({
"node_modules/sshpk/lib/formats/openssh-cert.js"(exports, module2) {
module2.exports = {
read,
verify,
sign,
signAsync,
write,
fromBuffer,
toBuffer
};
var assert = require_assert();
var SSHBuffer = require_ssh_buffer();
var crypto2 = require("crypto");
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var Key = require_key();
var PrivateKey = require_private_key();
var Identity = require_identity();
var rfc4253 = require_rfc4253();
var Signature = require_signature();
var utils = require_utils2();
var Certificate = require_certificate();
function verify(cert, key) {
return false;
}
var TYPES = {
"user": 1,
"host": 2
};
Object.keys(TYPES).forEach(function(k) {
TYPES[TYPES[k]] = k;
});
var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/;
function read(buf, options) {
if (Buffer2.isBuffer(buf))
buf = buf.toString("ascii");
var parts = buf.trim().split(/[ \t\n]+/g);
if (parts.length < 2 || parts.length > 3)
throw new Error("Not a valid SSH certificate line");
var algo = parts[0];
var data = parts[1];
data = Buffer2.from(data, "base64");
return fromBuffer(data, algo);
}
function fromBuffer(data, algo, partial) {
var sshbuf = new SSHBuffer({ buffer: data });
var innerAlgo = sshbuf.readString();
if (algo !== void 0 && innerAlgo !== algo)
throw new Error("SSH certificate algorithm mismatch");
if (algo === void 0)
algo = innerAlgo;
var cert = {};
cert.signatures = {};
cert.signatures.openssh = {};
cert.signatures.openssh.nonce = sshbuf.readBuffer();
var key = {};
var parts = key.parts = [];
key.type = getAlg(algo);
var partCount = algs.info[key.type].parts.length;
while (parts.length < partCount)
parts.push(sshbuf.readPart());
assert.ok(parts.length >= 1, "key must have at least one part");
var algInfo = algs.info[key.type];
if (key.type === "ecdsa") {
var res = ECDSA_ALGO.exec(algo);
assert.ok(res !== null);
assert.strictEqual(res[1], parts[0].data.toString());
}
for (var i = 0; i < algInfo.parts.length; ++i) {
parts[i].name = algInfo.parts[i];
if (parts[i].name !== "curve" && algInfo.normalize !== false) {
var p = parts[i];
p.data = utils.mpNormalize(p.data);
}
}
cert.subjectKey = new Key(key);
cert.serial = sshbuf.readInt64();
var type = TYPES[sshbuf.readInt()];
assert.string(type, "valid cert type");
cert.signatures.openssh.keyId = sshbuf.readString();
var principals = [];
var pbuf = sshbuf.readBuffer();
var psshbuf = new SSHBuffer({ buffer: pbuf });
while (!psshbuf.atEnd())
principals.push(psshbuf.readString());
if (principals.length === 0)
principals = ["*"];
cert.subjects = principals.map(function(pr) {
if (type === "user")
return Identity.forUser(pr);
else if (type === "host")
return Identity.forHost(pr);
throw new Error("Unknown identity type " + type);
});
cert.validFrom = int64ToDate(sshbuf.readInt64());
cert.validUntil = int64ToDate(sshbuf.readInt64());
var exts = [];
var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() });
var ext;
while (!extbuf.atEnd()) {
ext = { critical: true };
ext.name = extbuf.readString();
ext.data = extbuf.readBuffer();
exts.push(ext);
}
extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() });
while (!extbuf.atEnd()) {
ext = { critical: false };
ext.name = extbuf.readString();
ext.data = extbuf.readBuffer();
exts.push(ext);
}
cert.signatures.openssh.exts = exts;
sshbuf.readBuffer();
var signingKeyBuf = sshbuf.readBuffer();
cert.issuerKey = rfc4253.read(signingKeyBuf);
cert.issuer = Identity.forHost("**");
var sigBuf = sshbuf.readBuffer();
cert.signatures.openssh.signature = Signature.parse(sigBuf, cert.issuerKey.type, "ssh");
if (partial !== void 0) {
partial.remainder = sshbuf.remainder();
partial.consumed = sshbuf._offset;
}
return new Certificate(cert);
}
function int64ToDate(buf) {
var i = buf.readUInt32BE(0) * 4294967296;
i += buf.readUInt32BE(4);
var d = new Date();
d.setTime(i * 1e3);
d.sourceInt64 = buf;
return d;
}
function dateToInt64(date) {
if (date.sourceInt64 !== void 0)
return date.sourceInt64;
var i = Math.round(date.getTime() / 1e3);
var upper = Math.floor(i / 4294967296);
var lower = Math.floor(i % 4294967296);
var buf = Buffer2.alloc(8);
buf.writeUInt32BE(upper, 0);
buf.writeUInt32BE(lower, 4);
return buf;
}
function sign(cert, key) {
if (cert.signatures.openssh === void 0)
cert.signatures.openssh = {};
try {
var blob = toBuffer(cert, true);
} catch (e) {
delete cert.signatures.openssh;
return false;
}
var sig = cert.signatures.openssh;
var hashAlgo = void 0;
if (key.type === "rsa" || key.type === "dsa")
hashAlgo = "sha1";
var signer = key.createSign(hashAlgo);
signer.write(blob);
sig.signature = signer.sign();
return true;
}
function signAsync(cert, signer, done) {
if (cert.signatures.openssh === void 0)
cert.signatures.openssh = {};
try {
var blob = toBuffer(cert, true);
} catch (e) {
delete cert.signatures.openssh;
done(e);
return;
}
var sig = cert.signatures.openssh;
signer(blob, function(err, signature) {
if (err) {
done(err);
return;
}
try {
signature.toBuffer("ssh");
} catch (e) {
done(e);
return;
}
sig.signature = signature;
done();
});
}
function write(cert, options) {
if (options === void 0)
options = {};
var blob = toBuffer(cert);
var out = getCertType(cert.subjectKey) + " " + blob.toString("base64");
if (options.comment)
out = out + " " + options.comment;
return out;
}
function toBuffer(cert, noSig) {
assert.object(cert.signatures.openssh, "signature for openssh format");
var sig = cert.signatures.openssh;
if (sig.nonce === void 0)
sig.nonce = crypto2.randomBytes(16);
var buf = new SSHBuffer({});
buf.writeString(getCertType(cert.subjectKey));
buf.writeBuffer(sig.nonce);
var key = cert.subjectKey;
var algInfo = algs.info[key.type];
algInfo.parts.forEach(function(part) {
buf.writePart(key.part[part]);
});
buf.writeInt64(cert.serial);
var type = cert.subjects[0].type;
assert.notStrictEqual(type, "unknown");
cert.subjects.forEach(function(id) {
assert.strictEqual(id.type, type);
});
type = TYPES[type];
buf.writeInt(type);
if (sig.keyId === void 0) {
sig.keyId = cert.subjects[0].type + "_" + (cert.subjects[0].uid || cert.subjects[0].hostname);
}
buf.writeString(sig.keyId);
var sub = new SSHBuffer({});
cert.subjects.forEach(function(id) {
if (type === TYPES.host)
sub.writeString(id.hostname);
else if (type === TYPES.user)
sub.writeString(id.uid);
});
buf.writeBuffer(sub.toBuffer());
buf.writeInt64(dateToInt64(cert.validFrom));
buf.writeInt64(dateToInt64(cert.validUntil));
var exts = sig.exts;
if (exts === void 0)
exts = [];
var extbuf = new SSHBuffer({});
exts.forEach(function(ext) {
if (ext.critical !== true)
return;
extbuf.writeString(ext.name);
extbuf.writeBuffer(ext.data);
});
buf.writeBuffer(extbuf.toBuffer());
extbuf = new SSHBuffer({});
exts.forEach(function(ext) {
if (ext.critical === true)
return;
extbuf.writeString(ext.name);
extbuf.writeBuffer(ext.data);
});
buf.writeBuffer(extbuf.toBuffer());
buf.writeBuffer(Buffer2.alloc(0));
sub = rfc4253.write(cert.issuerKey);
buf.writeBuffer(sub);
if (!noSig)
buf.writeBuffer(sig.signature.toBuffer("ssh"));
return buf.toBuffer();
}
function getAlg(certType) {
if (certType === "ssh-rsa-cert-v01@openssh.com")
return "rsa";
if (certType === "ssh-dss-cert-v01@openssh.com")
return "dsa";
if (certType.match(ECDSA_ALGO))
return "ecdsa";
if (certType === "ssh-ed25519-cert-v01@openssh.com")
return "ed25519";
throw new Error("Unsupported cert type " + certType);
}
function getCertType(key) {
if (key.type === "rsa")
return "ssh-rsa-cert-v01@openssh.com";
if (key.type === "dsa")
return "ssh-dss-cert-v01@openssh.com";
if (key.type === "ecdsa")
return "ecdsa-sha2-" + key.curve + "-cert-v01@openssh.com";
if (key.type === "ed25519")
return "ssh-ed25519-cert-v01@openssh.com";
throw new Error("Unsupported key type " + key.type);
}
}
});
// node_modules/sshpk/lib/formats/x509.js
var require_x509 = __commonJS({
"node_modules/sshpk/lib/formats/x509.js"(exports, module2) {
module2.exports = {
read,
verify,
sign,
signAsync,
write
};
var assert = require_assert();
var asn1 = require_lib();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var pem = require_pem();
var Identity = require_identity();
var Signature = require_signature();
var Certificate = require_certificate();
var pkcs8 = require_pkcs8();
function readMPInt(der, nm) {
assert.strictEqual(der.peek(), asn1.Ber.Integer, nm + " is not an Integer");
return utils.mpNormalize(der.readString(asn1.Ber.Integer, true));
}
function verify(cert, key) {
var sig = cert.signatures.x509;
assert.object(sig, "x509 signature");
var algParts = sig.algo.split("-");
if (algParts[0] !== key.type)
return false;
var blob = sig.cache;
if (blob === void 0) {
var der = new asn1.BerWriter();
writeTBSCert(cert, der);
blob = der.buffer;
}
var verifier = key.createVerify(algParts[1]);
verifier.write(blob);
return verifier.verify(sig.signature);
}
function Local(i) {
return asn1.Ber.Context | asn1.Ber.Constructor | i;
}
function Context(i) {
return asn1.Ber.Context | i;
}
var SIGN_ALGS = {
"rsa-md5": "1.2.840.113549.1.1.4",
"rsa-sha1": "1.2.840.113549.1.1.5",
"rsa-sha256": "1.2.840.113549.1.1.11",
"rsa-sha384": "1.2.840.113549.1.1.12",
"rsa-sha512": "1.2.840.113549.1.1.13",
"dsa-sha1": "1.2.840.10040.4.3",
"dsa-sha256": "2.16.840.1.101.3.4.3.2",
"ecdsa-sha1": "1.2.840.10045.4.1",
"ecdsa-sha256": "1.2.840.10045.4.3.2",
"ecdsa-sha384": "1.2.840.10045.4.3.3",
"ecdsa-sha512": "1.2.840.10045.4.3.4",
"ed25519-sha512": "1.3.101.112"
};
Object.keys(SIGN_ALGS).forEach(function(k) {
SIGN_ALGS[SIGN_ALGS[k]] = k;
});
SIGN_ALGS["1.3.14.3.2.3"] = "rsa-md5";
SIGN_ALGS["1.3.14.3.2.29"] = "rsa-sha1";
var EXTS = {
"issuerKeyId": "2.5.29.35",
"altName": "2.5.29.17",
"basicConstraints": "2.5.29.19",
"keyUsage": "2.5.29.15",
"extKeyUsage": "2.5.29.37"
};
function read(buf, options) {
if (typeof buf === "string") {
buf = Buffer2.from(buf, "binary");
}
assert.buffer(buf, "buf");
var der = new asn1.BerReader(buf);
der.readSequence();
if (Math.abs(der.length - der.remain) > 1) {
throw new Error("DER sequence does not contain whole byte stream");
}
var tbsStart = der.offset;
der.readSequence();
var sigOffset = der.offset + der.length;
var tbsEnd = sigOffset;
if (der.peek() === Local(0)) {
der.readSequence(Local(0));
var version = der.readInt();
assert.ok(version <= 3, "only x.509 versions up to v3 supported");
}
var cert = {};
cert.signatures = {};
var sig = cert.signatures.x509 = {};
sig.extras = {};
cert.serial = readMPInt(der, "serial");
der.readSequence();
var after = der.offset + der.length;
var certAlgOid = der.readOID();
var certAlg = SIGN_ALGS[certAlgOid];
if (certAlg === void 0)
throw new Error("unknown signature algorithm " + certAlgOid);
der._offset = after;
cert.issuer = Identity.parseAsn1(der);
der.readSequence();
cert.validFrom = readDate(der);
cert.validUntil = readDate(der);
cert.subjects = [Identity.parseAsn1(der)];
der.readSequence();
after = der.offset + der.length;
cert.subjectKey = pkcs8.readPkcs8(void 0, "public", der);
der._offset = after;
if (der.peek() === Local(1)) {
der.readSequence(Local(1));
sig.extras.issuerUniqueID = buf.slice(der.offset, der.offset + der.length);
der._offset += der.length;
}
if (der.peek() === Local(2)) {
der.readSequence(Local(2));
sig.extras.subjectUniqueID = buf.slice(der.offset, der.offset + der.length);
der._offset += der.length;
}
if (der.peek() === Local(3)) {
der.readSequence(Local(3));
var extEnd = der.offset + der.length;
der.readSequence();
while (der.offset < extEnd)
readExtension(cert, buf, der);
assert.strictEqual(der.offset, extEnd);
}
assert.strictEqual(der.offset, sigOffset);
der.readSequence();
after = der.offset + der.length;
var sigAlgOid = der.readOID();
var sigAlg = SIGN_ALGS[sigAlgOid];
if (sigAlg === void 0)
throw new Error("unknown signature algorithm " + sigAlgOid);
der._offset = after;
var sigData = der.readString(asn1.Ber.BitString, true);
if (sigData[0] === 0)
sigData = sigData.slice(1);
var algParts = sigAlg.split("-");
sig.signature = Signature.parse(sigData, algParts[0], "asn1");
sig.signature.hashAlgorithm = algParts[1];
sig.algo = sigAlg;
sig.cache = buf.slice(tbsStart, tbsEnd);
return new Certificate(cert);
}
function readDate(der) {
if (der.peek() === asn1.Ber.UTCTime) {
return utcTimeToDate(der.readString(asn1.Ber.UTCTime));
} else if (der.peek() === asn1.Ber.GeneralizedTime) {
return gTimeToDate(der.readString(asn1.Ber.GeneralizedTime));
} else {
throw new Error("Unsupported date format");
}
}
function writeDate(der, date) {
if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) {
der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime);
} else {
der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime);
}
}
var ALTNAME = {
OtherName: Local(0),
RFC822Name: Context(1),
DNSName: Context(2),
X400Address: Local(3),
DirectoryName: Local(4),
EDIPartyName: Local(5),
URI: Context(6),
IPAddress: Context(7),
OID: Context(8)
};
var EXTPURPOSE = {
"serverAuth": "1.3.6.1.5.5.7.3.1",
"clientAuth": "1.3.6.1.5.5.7.3.2",
"codeSigning": "1.3.6.1.5.5.7.3.3",
"joyentDocker": "1.3.6.1.4.1.38678.1.4.1",
"joyentCmon": "1.3.6.1.4.1.38678.1.4.2"
};
var EXTPURPOSE_REV = {};
Object.keys(EXTPURPOSE).forEach(function(k) {
EXTPURPOSE_REV[EXTPURPOSE[k]] = k;
});
var KEYUSEBITS = [
"signature",
"identity",
"keyEncryption",
"encryption",
"keyAgreement",
"ca",
"crl"
];
function readExtension(cert, buf, der) {
der.readSequence();
var after = der.offset + der.length;
var extId = der.readOID();
var id;
var sig = cert.signatures.x509;
if (!sig.extras.exts)
sig.extras.exts = [];
var critical;
if (der.peek() === asn1.Ber.Boolean)
critical = der.readBoolean();
switch (extId) {
case EXTS.basicConstraints:
der.readSequence(asn1.Ber.OctetString);
der.readSequence();
var bcEnd = der.offset + der.length;
var ca = false;
if (der.peek() === asn1.Ber.Boolean)
ca = der.readBoolean();
if (cert.purposes === void 0)
cert.purposes = [];
if (ca === true)
cert.purposes.push("ca");
var bc = { oid: extId, critical };
if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer)
bc.pathLen = der.readInt();
sig.extras.exts.push(bc);
break;
case EXTS.extKeyUsage:
der.readSequence(asn1.Ber.OctetString);
der.readSequence();
if (cert.purposes === void 0)
cert.purposes = [];
var ekEnd = der.offset + der.length;
while (der.offset < ekEnd) {
var oid = der.readOID();
cert.purposes.push(EXTPURPOSE_REV[oid] || oid);
}
if (cert.purposes.indexOf("serverAuth") !== -1 && cert.purposes.indexOf("clientAuth") === -1) {
cert.subjects.forEach(function(ide) {
if (ide.type !== "host") {
ide.type = "host";
ide.hostname = ide.uid || ide.email || ide.components[0].value;
}
});
} else if (cert.purposes.indexOf("clientAuth") !== -1 && cert.purposes.indexOf("serverAuth") === -1) {
cert.subjects.forEach(function(ide) {
if (ide.type !== "user") {
ide.type = "user";
ide.uid = ide.hostname || ide.email || ide.components[0].value;
}
});
}
sig.extras.exts.push({ oid: extId, critical });
break;
case EXTS.keyUsage:
der.readSequence(asn1.Ber.OctetString);
var bits = der.readString(asn1.Ber.BitString, true);
var setBits = readBitField(bits, KEYUSEBITS);
setBits.forEach(function(bit) {
if (cert.purposes === void 0)
cert.purposes = [];
if (cert.purposes.indexOf(bit) === -1)
cert.purposes.push(bit);
});
sig.extras.exts.push({
oid: extId,
critical,
bits
});
break;
case EXTS.altName:
der.readSequence(asn1.Ber.OctetString);
der.readSequence();
var aeEnd = der.offset + der.length;
while (der.offset < aeEnd) {
switch (der.peek()) {
case ALTNAME.OtherName:
case ALTNAME.EDIPartyName:
der.readSequence();
der._offset += der.length;
break;
case ALTNAME.OID:
der.readOID(ALTNAME.OID);
break;
case ALTNAME.RFC822Name:
var email = der.readString(ALTNAME.RFC822Name);
id = Identity.forEmail(email);
if (!cert.subjects[0].equals(id))
cert.subjects.push(id);
break;
case ALTNAME.DirectoryName:
der.readSequence(ALTNAME.DirectoryName);
id = Identity.parseAsn1(der);
if (!cert.subjects[0].equals(id))
cert.subjects.push(id);
break;
case ALTNAME.DNSName:
var host = der.readString(ALTNAME.DNSName);
id = Identity.forHost(host);
if (!cert.subjects[0].equals(id))
cert.subjects.push(id);
break;
default:
der.readString(der.peek());
break;
}
}
sig.extras.exts.push({ oid: extId, critical });
break;
default:
sig.extras.exts.push({
oid: extId,
critical,
data: der.readString(asn1.Ber.OctetString, true)
});
break;
}
der._offset = after;
}
var UTCTIME_RE = /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/;
function utcTimeToDate(t) {
var m = t.match(UTCTIME_RE);
assert.ok(m, "timestamps must be in UTC");
var d = new Date();
var thisYear = d.getUTCFullYear();
var century = Math.floor(thisYear / 100) * 100;
var year = parseInt(m[1], 10);
if (thisYear % 100 < 50 && year >= 60)
year += century - 1;
else
year += century;
d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10));
d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10));
if (m[6] && m[6].length > 0)
d.setUTCSeconds(parseInt(m[6], 10));
return d;
}
var GTIME_RE = /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/;
function gTimeToDate(t) {
var m = t.match(GTIME_RE);
assert.ok(m);
var d = new Date();
d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1, parseInt(m[3], 10));
d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10));
if (m[6] && m[6].length > 0)
d.setUTCSeconds(parseInt(m[6], 10));
return d;
}
function zeroPad(n, m) {
if (m === void 0)
m = 2;
var s = "" + n;
while (s.length < m)
s = "0" + s;
return s;
}
function dateToUTCTime(d) {
var s = "";
s += zeroPad(d.getUTCFullYear() % 100);
s += zeroPad(d.getUTCMonth() + 1);
s += zeroPad(d.getUTCDate());
s += zeroPad(d.getUTCHours());
s += zeroPad(d.getUTCMinutes());
s += zeroPad(d.getUTCSeconds());
s += "Z";
return s;
}
function dateToGTime(d) {
var s = "";
s += zeroPad(d.getUTCFullYear(), 4);
s += zeroPad(d.getUTCMonth() + 1);
s += zeroPad(d.getUTCDate());
s += zeroPad(d.getUTCHours());
s += zeroPad(d.getUTCMinutes());
s += zeroPad(d.getUTCSeconds());
s += "Z";
return s;
}
function sign(cert, key) {
if (cert.signatures.x509 === void 0)
cert.signatures.x509 = {};
var sig = cert.signatures.x509;
sig.algo = key.type + "-" + key.defaultHashAlgorithm();
if (SIGN_ALGS[sig.algo] === void 0)
return false;
var der = new asn1.BerWriter();
writeTBSCert(cert, der);
var blob = der.buffer;
sig.cache = blob;
var signer = key.createSign();
signer.write(blob);
cert.signatures.x509.signature = signer.sign();
return true;
}
function signAsync(cert, signer, done) {
if (cert.signatures.x509 === void 0)
cert.signatures.x509 = {};
var sig = cert.signatures.x509;
var der = new asn1.BerWriter();
writeTBSCert(cert, der);
var blob = der.buffer;
sig.cache = blob;
signer(blob, function(err, signature) {
if (err) {
done(err);
return;
}
sig.algo = signature.type + "-" + signature.hashAlgorithm;
if (SIGN_ALGS[sig.algo] === void 0) {
done(new Error('Invalid signing algorithm "' + sig.algo + '"'));
return;
}
sig.signature = signature;
done();
});
}
function write(cert, options) {
var sig = cert.signatures.x509;
assert.object(sig, "x509 signature");
var der = new asn1.BerWriter();
der.startSequence();
if (sig.cache) {
der._ensure(sig.cache.length);
sig.cache.copy(der._buf, der._offset);
der._offset += sig.cache.length;
} else {
writeTBSCert(cert, der);
}
der.startSequence();
der.writeOID(SIGN_ALGS[sig.algo]);
if (sig.algo.match(/^rsa-/))
der.writeNull();
der.endSequence();
var sigData = sig.signature.toBuffer("asn1");
var data = Buffer2.alloc(sigData.length + 1);
data[0] = 0;
sigData.copy(data, 1);
der.writeBuffer(data, asn1.Ber.BitString);
der.endSequence();
return der.buffer;
}
function writeTBSCert(cert, der) {
var sig = cert.signatures.x509;
assert.object(sig, "x509 signature");
der.startSequence();
der.startSequence(Local(0));
der.writeInt(2);
der.endSequence();
der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer);
der.startSequence();
der.writeOID(SIGN_ALGS[sig.algo]);
if (sig.algo.match(/^rsa-/))
der.writeNull();
der.endSequence();
cert.issuer.toAsn1(der);
der.startSequence();
writeDate(der, cert.validFrom);
writeDate(der, cert.validUntil);
der.endSequence();
var subject = cert.subjects[0];
var altNames = cert.subjects.slice(1);
subject.toAsn1(der);
pkcs8.writePkcs8(der, cert.subjectKey);
if (sig.extras && sig.extras.issuerUniqueID) {
der.writeBuffer(sig.extras.issuerUniqueID, Local(1));
}
if (sig.extras && sig.extras.subjectUniqueID) {
der.writeBuffer(sig.extras.subjectUniqueID, Local(2));
}
if (altNames.length > 0 || subject.type === "host" || cert.purposes !== void 0 && cert.purposes.length > 0 || sig.extras && sig.extras.exts) {
der.startSequence(Local(3));
der.startSequence();
var exts = [];
if (cert.purposes !== void 0 && cert.purposes.length > 0) {
exts.push({
oid: EXTS.basicConstraints,
critical: true
});
exts.push({
oid: EXTS.keyUsage,
critical: true
});
exts.push({
oid: EXTS.extKeyUsage,
critical: true
});
}
exts.push({ oid: EXTS.altName });
if (sig.extras && sig.extras.exts)
exts = sig.extras.exts;
for (var i = 0; i < exts.length; ++i) {
der.startSequence();
der.writeOID(exts[i].oid);
if (exts[i].critical !== void 0)
der.writeBoolean(exts[i].critical);
if (exts[i].oid === EXTS.altName) {
der.startSequence(asn1.Ber.OctetString);
der.startSequence();
if (subject.type === "host") {
der.writeString(subject.hostname, Context(2));
}
for (var j = 0; j < altNames.length; ++j) {
if (altNames[j].type === "host") {
der.writeString(altNames[j].hostname, ALTNAME.DNSName);
} else if (altNames[j].type === "email") {
der.writeString(altNames[j].email, ALTNAME.RFC822Name);
} else {
der.startSequence(ALTNAME.DirectoryName);
altNames[j].toAsn1(der);
der.endSequence();
}
}
der.endSequence();
der.endSequence();
} else if (exts[i].oid === EXTS.basicConstraints) {
der.startSequence(asn1.Ber.OctetString);
der.startSequence();
var ca = cert.purposes.indexOf("ca") !== -1;
var pathLen = exts[i].pathLen;
der.writeBoolean(ca);
if (pathLen !== void 0)
der.writeInt(pathLen);
der.endSequence();
der.endSequence();
} else if (exts[i].oid === EXTS.extKeyUsage) {
der.startSequence(asn1.Ber.OctetString);
der.startSequence();
cert.purposes.forEach(function(purpose) {
if (purpose === "ca")
return;
if (KEYUSEBITS.indexOf(purpose) !== -1)
return;
var oid = purpose;
if (EXTPURPOSE[purpose] !== void 0)
oid = EXTPURPOSE[purpose];
der.writeOID(oid);
});
der.endSequence();
der.endSequence();
} else if (exts[i].oid === EXTS.keyUsage) {
der.startSequence(asn1.Ber.OctetString);
if (exts[i].bits !== void 0) {
der.writeBuffer(exts[i].bits, asn1.Ber.BitString);
} else {
var bits = writeBitField(cert.purposes, KEYUSEBITS);
der.writeBuffer(bits, asn1.Ber.BitString);
}
der.endSequence();
} else {
der.writeBuffer(exts[i].data, asn1.Ber.OctetString);
}
der.endSequence();
}
der.endSequence();
der.endSequence();
}
der.endSequence();
}
function readBitField(bits, bitIndex) {
var bitLen = 8 * (bits.length - 1) - bits[0];
var setBits = {};
for (var i = 0; i < bitLen; ++i) {
var byteN = 1 + Math.floor(i / 8);
var bit = 7 - i % 8;
var mask = 1 << bit;
var bitVal = (bits[byteN] & mask) !== 0;
var name = bitIndex[i];
if (bitVal && typeof name === "string") {
setBits[name] = true;
}
}
return Object.keys(setBits);
}
function writeBitField(setBits, bitIndex) {
var bitLen = bitIndex.length;
var blen = Math.ceil(bitLen / 8);
var unused = blen * 8 - bitLen;
var bits = Buffer2.alloc(1 + blen);
bits[0] = unused;
for (var i = 0; i < bitLen; ++i) {
var byteN = 1 + Math.floor(i / 8);
var bit = 7 - i % 8;
var mask = 1 << bit;
var name = bitIndex[i];
if (name === void 0)
continue;
var bitVal = setBits.indexOf(name) !== -1;
if (bitVal) {
bits[byteN] |= mask;
}
}
return bits;
}
}
});
// node_modules/sshpk/lib/formats/x509-pem.js
var require_x509_pem = __commonJS({
"node_modules/sshpk/lib/formats/x509-pem.js"(exports, module2) {
var x509 = require_x509();
module2.exports = {
read,
verify: x509.verify,
sign: x509.sign,
write
};
var assert = require_assert();
var asn1 = require_lib();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var pem = require_pem();
var Identity = require_identity();
var Signature = require_signature();
var Certificate = require_certificate();
function read(buf, options) {
if (typeof buf !== "string") {
assert.buffer(buf, "buf");
buf = buf.toString("ascii");
}
var lines = buf.trim().split(/[\r\n]+/g);
var m;
var si = -1;
while (!m && si < lines.length) {
m = lines[++si].match(/[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/);
}
assert.ok(m, "invalid PEM header");
var m2;
var ei = lines.length;
while (!m2 && ei > 0) {
m2 = lines[--ei].match(/[-]+[ ]*END CERTIFICATE[ ]*[-]+/);
}
assert.ok(m2, "invalid PEM footer");
lines = lines.slice(si, ei + 1);
var headers = {};
while (true) {
lines = lines.slice(1);
m = lines[0].match(/^([A-Za-z0-9-]+): (.+)$/);
if (!m)
break;
headers[m[1].toLowerCase()] = m[2];
}
lines = lines.slice(0, -1).join("");
buf = Buffer2.from(lines, "base64");
return x509.read(buf, options);
}
function write(cert, options) {
var dbuf = x509.write(cert, options);
var header = "CERTIFICATE";
var tmp = dbuf.toString("base64");
var len = tmp.length + tmp.length / 64 + 18 + 16 + header.length * 2 + 10;
var buf = Buffer2.alloc(len);
var o = 0;
o += buf.write("-----BEGIN " + header + "-----\n", o);
for (var i = 0; i < tmp.length; ) {
var limit = i + 64;
if (limit > tmp.length)
limit = tmp.length;
o += buf.write(tmp.slice(i, limit), o);
buf[o++] = 10;
i = limit;
}
o += buf.write("-----END " + header + "-----\n", o);
return buf.slice(0, o);
}
}
});
// node_modules/sshpk/lib/certificate.js
var require_certificate = __commonJS({
"node_modules/sshpk/lib/certificate.js"(exports, module2) {
module2.exports = Certificate;
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var crypto2 = require("crypto");
var Fingerprint = require_fingerprint();
var Signature = require_signature();
var errs = require_errors2();
var util = require("util");
var utils = require_utils2();
var Key = require_key();
var PrivateKey = require_private_key();
var Identity = require_identity();
var formats = {};
formats["openssh"] = require_openssh_cert();
formats["x509"] = require_x509();
formats["pem"] = require_x509_pem();
var CertificateParseError = errs.CertificateParseError;
var InvalidAlgorithmError = errs.InvalidAlgorithmError;
function Certificate(opts) {
assert.object(opts, "options");
assert.arrayOfObject(opts.subjects, "options.subjects");
utils.assertCompatible(opts.subjects[0], Identity, [1, 0], "options.subjects");
utils.assertCompatible(opts.subjectKey, Key, [1, 0], "options.subjectKey");
utils.assertCompatible(opts.issuer, Identity, [1, 0], "options.issuer");
if (opts.issuerKey !== void 0) {
utils.assertCompatible(opts.issuerKey, Key, [1, 0], "options.issuerKey");
}
assert.object(opts.signatures, "options.signatures");
assert.buffer(opts.serial, "options.serial");
assert.date(opts.validFrom, "options.validFrom");
assert.date(opts.validUntil, "optons.validUntil");
assert.optionalArrayOfString(opts.purposes, "options.purposes");
this._hashCache = {};
this.subjects = opts.subjects;
this.issuer = opts.issuer;
this.subjectKey = opts.subjectKey;
this.issuerKey = opts.issuerKey;
this.signatures = opts.signatures;
this.serial = opts.serial;
this.validFrom = opts.validFrom;
this.validUntil = opts.validUntil;
this.purposes = opts.purposes;
}
Certificate.formats = formats;
Certificate.prototype.toBuffer = function(format, options) {
if (format === void 0)
format = "x509";
assert.string(format, "format");
assert.object(formats[format], "formats[format]");
assert.optionalObject(options, "options");
return formats[format].write(this, options);
};
Certificate.prototype.toString = function(format, options) {
if (format === void 0)
format = "pem";
return this.toBuffer(format, options).toString();
};
Certificate.prototype.fingerprint = function(algo) {
if (algo === void 0)
algo = "sha256";
assert.string(algo, "algorithm");
var opts = {
type: "certificate",
hash: this.hash(algo),
algorithm: algo
};
return new Fingerprint(opts);
};
Certificate.prototype.hash = function(algo) {
assert.string(algo, "algorithm");
algo = algo.toLowerCase();
if (algs.hashAlgs[algo] === void 0)
throw new InvalidAlgorithmError(algo);
if (this._hashCache[algo])
return this._hashCache[algo];
var hash = crypto2.createHash(algo).update(this.toBuffer("x509")).digest();
this._hashCache[algo] = hash;
return hash;
};
Certificate.prototype.isExpired = function(when) {
if (when === void 0)
when = new Date();
return !(when.getTime() >= this.validFrom.getTime() && when.getTime() < this.validUntil.getTime());
};
Certificate.prototype.isSignedBy = function(issuerCert) {
utils.assertCompatible(issuerCert, Certificate, [1, 0], "issuer");
if (!this.issuer.equals(issuerCert.subjects[0]))
return false;
if (this.issuer.purposes && this.issuer.purposes.length > 0 && this.issuer.purposes.indexOf("ca") === -1) {
return false;
}
return this.isSignedByKey(issuerCert.subjectKey);
};
Certificate.prototype.getExtension = function(keyOrOid) {
assert.string(keyOrOid, "keyOrOid");
var ext = this.getExtensions().filter(function(maybeExt) {
if (maybeExt.format === "x509")
return maybeExt.oid === keyOrOid;
if (maybeExt.format === "openssh")
return maybeExt.name === keyOrOid;
return false;
})[0];
return ext;
};
Certificate.prototype.getExtensions = function() {
var exts = [];
var x509 = this.signatures.x509;
if (x509 && x509.extras && x509.extras.exts) {
x509.extras.exts.forEach(function(ext) {
ext.format = "x509";
exts.push(ext);
});
}
var openssh = this.signatures.openssh;
if (openssh && openssh.exts) {
openssh.exts.forEach(function(ext) {
ext.format = "openssh";
exts.push(ext);
});
}
return exts;
};
Certificate.prototype.isSignedByKey = function(issuerKey) {
utils.assertCompatible(issuerKey, Key, [1, 2], "issuerKey");
if (this.issuerKey !== void 0) {
return this.issuerKey.fingerprint("sha512").matches(issuerKey);
}
var fmt = Object.keys(this.signatures)[0];
var valid = formats[fmt].verify(this, issuerKey);
if (valid)
this.issuerKey = issuerKey;
return valid;
};
Certificate.prototype.signWith = function(key) {
utils.assertCompatible(key, PrivateKey, [1, 2], "key");
var fmts = Object.keys(formats);
var didOne = false;
for (var i = 0; i < fmts.length; ++i) {
if (fmts[i] !== "pem") {
var ret = formats[fmts[i]].sign(this, key);
if (ret === true)
didOne = true;
}
}
if (!didOne) {
throw new Error("Failed to sign the certificate for any available certificate formats");
}
};
Certificate.createSelfSigned = function(subjectOrSubjects, key, options) {
var subjects;
if (Array.isArray(subjectOrSubjects))
subjects = subjectOrSubjects;
else
subjects = [subjectOrSubjects];
assert.arrayOfObject(subjects);
subjects.forEach(function(subject) {
utils.assertCompatible(subject, Identity, [1, 0], "subject");
});
utils.assertCompatible(key, PrivateKey, [1, 2], "private key");
assert.optionalObject(options, "options");
if (options === void 0)
options = {};
assert.optionalObject(options.validFrom, "options.validFrom");
assert.optionalObject(options.validUntil, "options.validUntil");
var validFrom = options.validFrom;
var validUntil = options.validUntil;
if (validFrom === void 0)
validFrom = new Date();
if (validUntil === void 0) {
assert.optionalNumber(options.lifetime, "options.lifetime");
var lifetime = options.lifetime;
if (lifetime === void 0)
lifetime = 10 * 365 * 24 * 3600;
validUntil = new Date();
validUntil.setTime(validUntil.getTime() + lifetime * 1e3);
}
assert.optionalBuffer(options.serial, "options.serial");
var serial = options.serial;
if (serial === void 0)
serial = Buffer2.from("0000000000000001", "hex");
var purposes = options.purposes;
if (purposes === void 0)
purposes = [];
if (purposes.indexOf("signature") === -1)
purposes.push("signature");
if (purposes.indexOf("ca") === -1)
purposes.push("ca");
if (purposes.indexOf("crl") === -1)
purposes.push("crl");
if (purposes.length <= 3) {
var hostSubjects = subjects.filter(function(subject) {
return subject.type === "host";
});
var userSubjects = subjects.filter(function(subject) {
return subject.type === "user";
});
if (hostSubjects.length > 0) {
if (purposes.indexOf("serverAuth") === -1)
purposes.push("serverAuth");
}
if (userSubjects.length > 0) {
if (purposes.indexOf("clientAuth") === -1)
purposes.push("clientAuth");
}
if (userSubjects.length > 0 || hostSubjects.length > 0) {
if (purposes.indexOf("keyAgreement") === -1)
purposes.push("keyAgreement");
if (key.type === "rsa" && purposes.indexOf("encryption") === -1)
purposes.push("encryption");
}
}
var cert = new Certificate({
subjects,
issuer: subjects[0],
subjectKey: key.toPublic(),
issuerKey: key.toPublic(),
signatures: {},
serial,
validFrom,
validUntil,
purposes
});
cert.signWith(key);
return cert;
};
Certificate.create = function(subjectOrSubjects, key, issuer, issuerKey, options) {
var subjects;
if (Array.isArray(subjectOrSubjects))
subjects = subjectOrSubjects;
else
subjects = [subjectOrSubjects];
assert.arrayOfObject(subjects);
subjects.forEach(function(subject) {
utils.assertCompatible(subject, Identity, [1, 0], "subject");
});
utils.assertCompatible(key, Key, [1, 0], "key");
if (PrivateKey.isPrivateKey(key))
key = key.toPublic();
utils.assertCompatible(issuer, Identity, [1, 0], "issuer");
utils.assertCompatible(issuerKey, PrivateKey, [1, 2], "issuer key");
assert.optionalObject(options, "options");
if (options === void 0)
options = {};
assert.optionalObject(options.validFrom, "options.validFrom");
assert.optionalObject(options.validUntil, "options.validUntil");
var validFrom = options.validFrom;
var validUntil = options.validUntil;
if (validFrom === void 0)
validFrom = new Date();
if (validUntil === void 0) {
assert.optionalNumber(options.lifetime, "options.lifetime");
var lifetime = options.lifetime;
if (lifetime === void 0)
lifetime = 10 * 365 * 24 * 3600;
validUntil = new Date();
validUntil.setTime(validUntil.getTime() + lifetime * 1e3);
}
assert.optionalBuffer(options.serial, "options.serial");
var serial = options.serial;
if (serial === void 0)
serial = Buffer2.from("0000000000000001", "hex");
var purposes = options.purposes;
if (purposes === void 0)
purposes = [];
if (purposes.indexOf("signature") === -1)
purposes.push("signature");
if (options.ca === true) {
if (purposes.indexOf("ca") === -1)
purposes.push("ca");
if (purposes.indexOf("crl") === -1)
purposes.push("crl");
}
var hostSubjects = subjects.filter(function(subject) {
return subject.type === "host";
});
var userSubjects = subjects.filter(function(subject) {
return subject.type === "user";
});
if (hostSubjects.length > 0) {
if (purposes.indexOf("serverAuth") === -1)
purposes.push("serverAuth");
}
if (userSubjects.length > 0) {
if (purposes.indexOf("clientAuth") === -1)
purposes.push("clientAuth");
}
if (userSubjects.length > 0 || hostSubjects.length > 0) {
if (purposes.indexOf("keyAgreement") === -1)
purposes.push("keyAgreement");
if (key.type === "rsa" && purposes.indexOf("encryption") === -1)
purposes.push("encryption");
}
var cert = new Certificate({
subjects,
issuer,
subjectKey: key,
issuerKey: issuerKey.toPublic(),
signatures: {},
serial,
validFrom,
validUntil,
purposes
});
cert.signWith(issuerKey);
return cert;
};
Certificate.parse = function(data, format, options) {
if (typeof data !== "string")
assert.buffer(data, "data");
if (format === void 0)
format = "auto";
assert.string(format, "format");
if (typeof options === "string")
options = { filename: options };
assert.optionalObject(options, "options");
if (options === void 0)
options = {};
assert.optionalString(options.filename, "options.filename");
if (options.filename === void 0)
options.filename = "(unnamed)";
assert.object(formats[format], "formats[format]");
try {
var k = formats[format].read(data, options);
return k;
} catch (e) {
throw new CertificateParseError(options.filename, format, e);
}
};
Certificate.isCertificate = function(obj, ver) {
return utils.isCompatible(obj, Certificate, ver);
};
Certificate.prototype._sshpkApiVersion = [1, 1];
Certificate._oldVersionDetect = function(obj) {
return [1, 0];
};
}
});
// node_modules/sshpk/lib/fingerprint.js
var require_fingerprint = __commonJS({
"node_modules/sshpk/lib/fingerprint.js"(exports, module2) {
module2.exports = Fingerprint;
var assert = require_assert();
var Buffer2 = require_safer().Buffer;
var algs = require_algs();
var crypto2 = require("crypto");
var errs = require_errors2();
var Key = require_key();
var PrivateKey = require_private_key();
var Certificate = require_certificate();
var utils = require_utils2();
var FingerprintFormatError = errs.FingerprintFormatError;
var InvalidAlgorithmError = errs.InvalidAlgorithmError;
function Fingerprint(opts) {
assert.object(opts, "options");
assert.string(opts.type, "options.type");
assert.buffer(opts.hash, "options.hash");
assert.string(opts.algorithm, "options.algorithm");
this.algorithm = opts.algorithm.toLowerCase();
if (algs.hashAlgs[this.algorithm] !== true)
throw new InvalidAlgorithmError(this.algorithm);
this.hash = opts.hash;
this.type = opts.type;
this.hashType = opts.hashType;
}
Fingerprint.prototype.toString = function(format) {
if (format === void 0) {
if (this.algorithm === "md5" || this.hashType === "spki")
format = "hex";
else
format = "base64";
}
assert.string(format);
switch (format) {
case "hex":
if (this.hashType === "spki")
return this.hash.toString("hex");
return addColons(this.hash.toString("hex"));
case "base64":
if (this.hashType === "spki")
return this.hash.toString("base64");
return sshBase64Format(this.algorithm, this.hash.toString("base64"));
default:
throw new FingerprintFormatError(void 0, format);
}
};
Fingerprint.prototype.matches = function(other) {
assert.object(other, "key or certificate");
if (this.type === "key" && this.hashType !== "ssh") {
utils.assertCompatible(other, Key, [1, 7], "key with spki");
if (PrivateKey.isPrivateKey(other)) {
utils.assertCompatible(other, PrivateKey, [1, 6], "privatekey with spki support");
}
} else if (this.type === "key") {
utils.assertCompatible(other, Key, [1, 0], "key");
} else {
utils.assertCompatible(other, Certificate, [1, 0], "certificate");
}
var theirHash = other.hash(this.algorithm, this.hashType);
var theirHash2 = crypto2.createHash(this.algorithm).update(theirHash).digest("base64");
if (this.hash2 === void 0)
this.hash2 = crypto2.createHash(this.algorithm).update(this.hash).digest("base64");
return this.hash2 === theirHash2;
};
var base64RE = /^[A-Za-z0-9+\/=]+$/;
var hexRE = /^[a-fA-F0-9]+$/;
Fingerprint.parse = function(fp, options) {
assert.string(fp, "fingerprint");
var alg, hash, enAlgs;
if (Array.isArray(options)) {
enAlgs = options;
options = {};
}
assert.optionalObject(options, "options");
if (options === void 0)
options = {};
if (options.enAlgs !== void 0)
enAlgs = options.enAlgs;
if (options.algorithms !== void 0)
enAlgs = options.algorithms;
assert.optionalArrayOfString(enAlgs, "algorithms");
var hashType = "ssh";
if (options.hashType !== void 0)
hashType = options.hashType;
assert.string(hashType, "options.hashType");
var parts = fp.split(":");
if (parts.length == 2) {
alg = parts[0].toLowerCase();
if (!base64RE.test(parts[1]))
throw new FingerprintFormatError(fp);
try {
hash = Buffer2.from(parts[1], "base64");
} catch (e) {
throw new FingerprintFormatError(fp);
}
} else if (parts.length > 2) {
alg = "md5";
if (parts[0].toLowerCase() === "md5")
parts = parts.slice(1);
parts = parts.map(function(p) {
while (p.length < 2)
p = "0" + p;
if (p.length > 2)
throw new FingerprintFormatError(fp);
return p;
});
parts = parts.join("");
if (!hexRE.test(parts) || parts.length % 2 !== 0)
throw new FingerprintFormatError(fp);
try {
hash = Buffer2.from(parts, "hex");
} catch (e) {
throw new FingerprintFormatError(fp);
}
} else {
if (hexRE.test(fp)) {
hash = Buffer2.from(fp, "hex");
} else if (base64RE.test(fp)) {
hash = Buffer2.from(fp, "base64");
} else {
throw new FingerprintFormatError(fp);
}
switch (hash.length) {
case 32:
alg = "sha256";
break;
case 16:
alg = "md5";
break;
case 20:
alg = "sha1";
break;
case 64:
alg = "sha512";
break;
default:
throw new FingerprintFormatError(fp);
}
if (options.hashType === void 0)
hashType = "spki";
}
if (alg === void 0)
throw new FingerprintFormatError(fp);
if (algs.hashAlgs[alg] === void 0)
throw new InvalidAlgorithmError(alg);
if (enAlgs !== void 0) {
enAlgs = enAlgs.map(function(a) {
return a.toLowerCase();
});
if (enAlgs.indexOf(alg) === -1)
throw new InvalidAlgorithmError(alg);
}
return new Fingerprint({
algorithm: alg,
hash,
type: options.type || "key",
hashType
});
};
function addColons(s) {
return s.replace(/(.{2})(?=.)/g, "$1:");
}
function base64Strip(s) {
return s.replace(/=*$/, "");
}
function sshBase64Format(alg, h) {
return alg.toUpperCase() + ":" + base64Strip(h);
}
Fingerprint.isFingerprint = function(obj, ver) {
return utils.isCompatible(obj, Fingerprint, ver);
};
Fingerprint.prototype._sshpkApiVersion = [1, 2];
Fingerprint._oldVersionDetect = function(obj) {
assert.func(obj.toString);
assert.func(obj.matches);
return [1, 0];
};
}
});
// node_modules/sshpk/lib/key.js
var require_key = __commonJS({
"node_modules/sshpk/lib/key.js"(exports, module2) {
module2.exports = Key;
var assert = require_assert();
var algs = require_algs();
var crypto2 = require("crypto");
var Fingerprint = require_fingerprint();
var Signature = require_signature();
var DiffieHellman = require_dhe().DiffieHellman;
var errs = require_errors2();
var utils = require_utils2();
var PrivateKey = require_private_key();
var edCompat;
try {
edCompat = require_ed_compat();
} catch (e) {
}
var InvalidAlgorithmError = errs.InvalidAlgorithmError;
var KeyParseError = errs.KeyParseError;
var formats = {};
formats["auto"] = require_auto();
formats["pem"] = require_pem();
formats["pkcs1"] = require_pkcs1();
formats["pkcs8"] = require_pkcs8();
formats["rfc4253"] = require_rfc4253();
formats["ssh"] = require_ssh();
formats["ssh-private"] = require_ssh_private();
formats["openssh"] = formats["ssh-private"];
formats["dnssec"] = require_dnssec();
formats["putty"] = require_putty();
formats["ppk"] = formats["putty"];
function Key(opts) {
assert.object(opts, "options");
assert.arrayOfObject(opts.parts, "options.parts");
assert.string(opts.type, "options.type");
assert.optionalString(opts.comment, "options.comment");
var algInfo = algs.info[opts.type];
if (typeof algInfo !== "object")
throw new InvalidAlgorithmError(opts.type);
var partLookup = {};
for (var i = 0; i < opts.parts.length; ++i) {
var part = opts.parts[i];
partLookup[part.name] = part;
}
this.type = opts.type;
this.parts = opts.parts;
this.part = partLookup;
this.comment = void 0;
this.source = opts.source;
this._rfc4253Cache = opts._rfc4253Cache;
this._hashCache = {};
var sz;
this.curve = void 0;
if (this.type === "ecdsa") {
var curve = this.part.curve.data.toString();
this.curve = curve;
sz = algs.curves[curve].size;
} else if (this.type === "ed25519" || this.type === "curve25519") {
sz = 256;
this.curve = "curve25519";
} else {
var szPart = this.part[algInfo.sizePart];
sz = szPart.data.length;
sz = sz * 8 - utils.countZeros(szPart.data);
}
this.size = sz;
}
Key.formats = formats;
Key.prototype.toBuffer = function(format, options) {
if (format === void 0)
format = "ssh";
assert.string(format, "format");
assert.object(formats[format], "formats[format]");
assert.optionalObject(options, "options");
if (format === "rfc4253") {
if (this._rfc4253Cache === void 0)
this._rfc4253Cache = formats["rfc4253"].write(this);
return this._rfc4253Cache;
}
return formats[format].write(this, options);
};
Key.prototype.toString = function(format, options) {
return this.toBuffer(format, options).toString();
};
Key.prototype.hash = function(algo, type) {
assert.string(algo, "algorithm");
assert.optionalString(type, "type");
if (type === void 0)
type = "ssh";
algo = algo.toLowerCase();
if (algs.hashAlgs[algo] === void 0)
throw new InvalidAlgorithmError(algo);
var cacheKey = algo + "||" + type;
if (this._hashCache[cacheKey])
return this._hashCache[cacheKey];
var buf;
if (type === "ssh") {
buf = this.toBuffer("rfc4253");
} else if (type === "spki") {
buf = formats.pkcs8.pkcs8ToBuffer(this);
} else {
throw new Error("Hash type " + type + " not supported");
}
var hash = crypto2.createHash(algo).update(buf).digest();
this._hashCache[cacheKey] = hash;
return hash;
};
Key.prototype.fingerprint = function(algo, type) {
if (algo === void 0)
algo = "sha256";
if (type === void 0)
type = "ssh";
assert.string(algo, "algorithm");
assert.string(type, "type");
var opts = {
type: "key",
hash: this.hash(algo, type),
algorithm: algo,
hashType: type
};
return new Fingerprint(opts);
};
Key.prototype.defaultHashAlgorithm = function() {
var hashAlgo = "sha1";
if (this.type === "rsa")
hashAlgo = "sha256";
if (this.type === "dsa" && this.size > 1024)
hashAlgo = "sha256";
if (this.type === "ed25519")
hashAlgo = "sha512";
if (this.type === "ecdsa") {
if (this.size <= 256)
hashAlgo = "sha256";
else if (this.size <= 384)
hashAlgo = "sha384";
else
hashAlgo = "sha512";
}
return hashAlgo;
};
Key.prototype.createVerify = function(hashAlgo) {
if (hashAlgo === void 0)
hashAlgo = this.defaultHashAlgorithm();
assert.string(hashAlgo, "hash algorithm");
if (this.type === "ed25519" && edCompat !== void 0)
return new edCompat.Verifier(this, hashAlgo);
if (this.type === "curve25519")
throw new Error("Curve25519 keys are not suitable for signing or verification");
var v, nm, err;
try {
nm = hashAlgo.toUpperCase();
v = crypto2.createVerify(nm);
} catch (e) {
err = e;
}
if (v === void 0 || err instanceof Error && err.message.match(/Unknown message digest/)) {
nm = "RSA-";
nm += hashAlgo.toUpperCase();
v = crypto2.createVerify(nm);
}
assert.ok(v, "failed to create verifier");
var oldVerify = v.verify.bind(v);
var key = this.toBuffer("pkcs8");
var curve = this.curve;
var self2 = this;
v.verify = function(signature, fmt) {
if (Signature.isSignature(signature, [2, 0])) {
if (signature.type !== self2.type)
return false;
if (signature.hashAlgorithm && signature.hashAlgorithm !== hashAlgo)
return false;
if (signature.curve && self2.type === "ecdsa" && signature.curve !== curve)
return false;
return oldVerify(key, signature.toBuffer("asn1"));
} else if (typeof signature === "string" || Buffer.isBuffer(signature)) {
return oldVerify(key, signature, fmt);
} else if (Signature.isSignature(signature, [1, 0])) {
throw new Error("signature was created by too old a version of sshpk and cannot be verified");
} else {
throw new TypeError("signature must be a string, Buffer, or Signature object");
}
};
return v;
};
Key.prototype.createDiffieHellman = function() {
if (this.type === "rsa")
throw new Error("RSA keys do not support Diffie-Hellman");
return new DiffieHellman(this);
};
Key.prototype.createDH = Key.prototype.createDiffieHellman;
Key.parse = function(data, format, options) {
if (typeof data !== "string")
assert.buffer(data, "data");
if (format === void 0)
format = "auto";
assert.string(format, "format");
if (typeof options === "string")
options = { filename: options };
assert.optionalObject(options, "options");
if (options === void 0)
options = {};
assert.optionalString(options.filename, "options.filename");
if (options.filename === void 0)
options.filename = "(unnamed)";
assert.object(formats[format], "formats[format]");
try {
var k = formats[format].read(data, options);
if (k instanceof PrivateKey)
k = k.toPublic();
if (!k.comment)
k.comment = options.filename;
return k;
} catch (e) {
if (e.name === "KeyEncryptedError")
throw e;
throw new KeyParseError(options.filename, format, e);
}
};
Key.isKey = function(obj, ver) {
return utils.isCompatible(obj, Key, ver);
};
Key.prototype._sshpkApiVersion = [1, 7];
Key._oldVersionDetect = function(obj) {
assert.func(obj.toBuffer);
assert.func(obj.fingerprint);
if (obj.createDH)
return [1, 4];
if (obj.defaultHashAlgorithm)
return [1, 3];
if (obj.formats["auto"])
return [1, 2];
if (obj.formats["pkcs1"])
return [1, 1];
return [1, 0];
};
}
});
// node_modules/sshpk/lib/index.js
var require_lib2 = __commonJS({
"node_modules/sshpk/lib/index.js"(exports, module2) {
var Key = require_key();
var Fingerprint = require_fingerprint();
var Signature = require_signature();
var PrivateKey = require_private_key();
var Certificate = require_certificate();
var Identity = require_identity();
var errs = require_errors2();
module2.exports = {
Key,
parseKey: Key.parse,
Fingerprint,
parseFingerprint: Fingerprint.parse,
Signature,
parseSignature: Signature.parse,
PrivateKey,
parsePrivateKey: PrivateKey.parse,
generatePrivateKey: PrivateKey.generate,
Certificate,
parseCertificate: Certificate.parse,
createSelfSignedCertificate: Certificate.createSelfSigned,
createCertificate: Certificate.create,
Identity,
identityFromDN: Identity.parseDN,
identityForHost: Identity.forHost,
identityForUser: Identity.forUser,
identityForEmail: Identity.forEmail,
identityFromArray: Identity.fromArray,
FingerprintFormatError: errs.FingerprintFormatError,
InvalidAlgorithmError: errs.InvalidAlgorithmError,
KeyParseError: errs.KeyParseError,
SignatureParseError: errs.SignatureParseError,
KeyEncryptedError: errs.KeyEncryptedError,
CertificateParseError: errs.CertificateParseError
};
}
});
// node_modules/http-signature/lib/utils.js
var require_utils3 = __commonJS({
"node_modules/http-signature/lib/utils.js"(exports, module2) {
var assert = require_assert();
var sshpk = require_lib2();
var util = require("util");
var HASH_ALGOS = {
"sha1": true,
"sha256": true,
"sha512": true
};
var PK_ALGOS = {
"rsa": true,
"dsa": true,
"ecdsa": true
};
function HttpSignatureError(message, caller) {
if (Error.captureStackTrace)
Error.captureStackTrace(this, caller || HttpSignatureError);
this.message = message;
this.name = caller.name;
}
util.inherits(HttpSignatureError, Error);
function InvalidAlgorithmError(message) {
HttpSignatureError.call(this, message, InvalidAlgorithmError);
}
util.inherits(InvalidAlgorithmError, HttpSignatureError);
function validateAlgorithm(algorithm) {
var alg = algorithm.toLowerCase().split("-");
if (alg.length !== 2) {
throw new InvalidAlgorithmError(alg[0].toUpperCase() + " is not a valid algorithm");
}
if (alg[0] !== "hmac" && !PK_ALGOS[alg[0]]) {
throw new InvalidAlgorithmError(alg[0].toUpperCase() + " type keys are not supported");
}
if (!HASH_ALGOS[alg[1]]) {
throw new InvalidAlgorithmError(alg[1].toUpperCase() + " is not a supported hash algorithm");
}
return alg;
}
module2.exports = {
HASH_ALGOS,
PK_ALGOS,
HttpSignatureError,
InvalidAlgorithmError,
validateAlgorithm,
sshKeyToPEM: function sshKeyToPEM(key) {
assert.string(key, "ssh_key");
var k = sshpk.parseKey(key, "ssh");
return k.toString("pem");
},
fingerprint: function fingerprint(key) {
assert.string(key, "ssh_key");
var k = sshpk.parseKey(key, "ssh");
return k.fingerprint("md5").toString("hex");
},
pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {
assert.equal("string", typeof pem, "typeof pem");
var k = sshpk.parseKey(pem, "pem");
k.comment = comment;
return k.toString("ssh");
}
};
}
});
// node_modules/http-signature/lib/parser.js
var require_parser = __commonJS({
"node_modules/http-signature/lib/parser.js"(exports, module2) {
var assert = require_assert();
var util = require("util");
var utils = require_utils3();
var HASH_ALGOS = utils.HASH_ALGOS;
var PK_ALGOS = utils.PK_ALGOS;
var HttpSignatureError = utils.HttpSignatureError;
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
var validateAlgorithm = utils.validateAlgorithm;
var State = {
New: 0,
Params: 1
};
var ParamsState = {
Name: 0,
Quote: 1,
Value: 2,
Comma: 3
};
function ExpiredRequestError(message) {
HttpSignatureError.call(this, message, ExpiredRequestError);
}
util.inherits(ExpiredRequestError, HttpSignatureError);
function InvalidHeaderError(message) {
HttpSignatureError.call(this, message, InvalidHeaderError);
}
util.inherits(InvalidHeaderError, HttpSignatureError);
function InvalidParamsError(message) {
HttpSignatureError.call(this, message, InvalidParamsError);
}
util.inherits(InvalidParamsError, HttpSignatureError);
function MissingHeaderError(message) {
HttpSignatureError.call(this, message, MissingHeaderError);
}
util.inherits(MissingHeaderError, HttpSignatureError);
function StrictParsingError(message) {
HttpSignatureError.call(this, message, StrictParsingError);
}
util.inherits(StrictParsingError, HttpSignatureError);
module2.exports = {
parseRequest: function parseRequest(request2, options) {
assert.object(request2, "request");
assert.object(request2.headers, "request.headers");
if (options === void 0) {
options = {};
}
if (options.headers === void 0) {
options.headers = [request2.headers["x-date"] ? "x-date" : "date"];
}
assert.object(options, "options");
assert.arrayOfString(options.headers, "options.headers");
assert.optionalFinite(options.clockSkew, "options.clockSkew");
var authzHeaderName = options.authorizationHeaderName || "authorization";
if (!request2.headers[authzHeaderName]) {
throw new MissingHeaderError("no " + authzHeaderName + " header present in the request");
}
options.clockSkew = options.clockSkew || 300;
var i = 0;
var state = State.New;
var substate = ParamsState.Name;
var tmpName = "";
var tmpValue = "";
var parsed = {
scheme: "",
params: {},
signingString: ""
};
var authz = request2.headers[authzHeaderName];
for (i = 0; i < authz.length; i++) {
var c = authz.charAt(i);
switch (Number(state)) {
case State.New:
if (c !== " ")
parsed.scheme += c;
else
state = State.Params;
break;
case State.Params:
switch (Number(substate)) {
case ParamsState.Name:
var code = c.charCodeAt(0);
if (code >= 65 && code <= 90 || code >= 97 && code <= 122) {
tmpName += c;
} else if (c === "=") {
if (tmpName.length === 0)
throw new InvalidHeaderError("bad param format");
substate = ParamsState.Quote;
} else {
throw new InvalidHeaderError("bad param format");
}
break;
case ParamsState.Quote:
if (c === '"') {
tmpValue = "";
substate = ParamsState.Value;
} else {
throw new InvalidHeaderError("bad param format");
}
break;
case ParamsState.Value:
if (c === '"') {
parsed.params[tmpName] = tmpValue;
substate = ParamsState.Comma;
} else {
tmpValue += c;
}
break;
case ParamsState.Comma:
if (c === ",") {
tmpName = "";
substate = ParamsState.Name;
} else {
throw new InvalidHeaderError("bad param format");
}
break;
default:
throw new Error("Invalid substate");
}
break;
default:
throw new Error("Invalid substate");
}
}
if (!parsed.params.headers || parsed.params.headers === "") {
if (request2.headers["x-date"]) {
parsed.params.headers = ["x-date"];
} else {
parsed.params.headers = ["date"];
}
} else {
parsed.params.headers = parsed.params.headers.split(" ");
}
if (!parsed.scheme || parsed.scheme !== "Signature")
throw new InvalidHeaderError('scheme was not "Signature"');
if (!parsed.params.keyId)
throw new InvalidHeaderError("keyId was not specified");
if (!parsed.params.algorithm)
throw new InvalidHeaderError("algorithm was not specified");
if (!parsed.params.signature)
throw new InvalidHeaderError("signature was not specified");
parsed.params.algorithm = parsed.params.algorithm.toLowerCase();
try {
validateAlgorithm(parsed.params.algorithm);
} catch (e) {
if (e instanceof InvalidAlgorithmError)
throw new InvalidParamsError(parsed.params.algorithm + " is not supported");
else
throw e;
}
for (i = 0; i < parsed.params.headers.length; i++) {
var h = parsed.params.headers[i].toLowerCase();
parsed.params.headers[i] = h;
if (h === "request-line") {
if (!options.strict) {
parsed.signingString += request2.method + " " + request2.url + " HTTP/" + request2.httpVersion;
} else {
throw new StrictParsingError("request-line is not a valid header with strict parsing enabled.");
}
} else if (h === "(request-target)") {
parsed.signingString += "(request-target): " + request2.method.toLowerCase() + " " + request2.url;
} else {
var value = request2.headers[h];
if (value === void 0)
throw new MissingHeaderError(h + " was not in the request");
parsed.signingString += h + ": " + value;
}
if (i + 1 < parsed.params.headers.length)
parsed.signingString += "\n";
}
var date;
if (request2.headers.date || request2.headers["x-date"]) {
if (request2.headers["x-date"]) {
date = new Date(request2.headers["x-date"]);
} else {
date = new Date(request2.headers.date);
}
var now = new Date();
var skew = Math.abs(now.getTime() - date.getTime());
if (skew > options.clockSkew * 1e3) {
throw new ExpiredRequestError("clock skew of " + skew / 1e3 + "s was greater than " + options.clockSkew + "s");
}
}
options.headers.forEach(function(hdr) {
if (parsed.params.headers.indexOf(hdr.toLowerCase()) < 0)
throw new MissingHeaderError(hdr + " was not a signed header");
});
if (options.algorithms) {
if (options.algorithms.indexOf(parsed.params.algorithm) === -1)
throw new InvalidParamsError(parsed.params.algorithm + " is not a supported algorithm");
}
parsed.algorithm = parsed.params.algorithm.toUpperCase();
parsed.keyId = parsed.params.keyId;
return parsed;
}
};
}
});
// node_modules/extsprintf/lib/extsprintf.js
var require_extsprintf = __commonJS({
"node_modules/extsprintf/lib/extsprintf.js"(exports) {
var mod_assert = require("assert");
var mod_util = require("util");
exports.sprintf = jsSprintf;
exports.printf = jsPrintf;
exports.fprintf = jsFprintf;
function jsSprintf(fmt) {
var regex = [
"([^%]*)",
"%",
"(['\\-+ #0]*?)",
"([1-9]\\d*)?",
"(\\.([1-9]\\d*))?",
"[lhjztL]*?",
"([diouxXfFeEgGaAcCsSp%jr])"
].join("");
var re = new RegExp(regex);
var args = Array.prototype.slice.call(arguments, 1);
var flags, width, precision, conversion;
var left, pad, sign, arg, match;
var ret = "";
var argn = 1;
mod_assert.equal("string", typeof fmt);
while ((match = re.exec(fmt)) !== null) {
ret += match[1];
fmt = fmt.substring(match[0].length);
flags = match[2] || "";
width = match[3] || 0;
precision = match[4] || "";
conversion = match[6];
left = false;
sign = false;
pad = " ";
if (conversion == "%") {
ret += "%";
continue;
}
if (args.length === 0)
throw new Error("too few args to sprintf");
arg = args.shift();
argn++;
if (flags.match(/[\' #]/))
throw new Error("unsupported flags: " + flags);
if (precision.length > 0)
throw new Error("non-zero precision not supported");
if (flags.match(/-/))
left = true;
if (flags.match(/0/))
pad = "0";
if (flags.match(/\+/))
sign = true;
switch (conversion) {
case "s":
if (arg === void 0 || arg === null)
throw new Error("argument " + argn + ": attempted to print undefined or null as a string");
ret += doPad(pad, width, left, arg.toString());
break;
case "d":
arg = Math.floor(arg);
case "f":
sign = sign && arg > 0 ? "+" : "";
ret += sign + doPad(pad, width, left, arg.toString());
break;
case "x":
ret += doPad(pad, width, left, arg.toString(16));
break;
case "j":
if (width === 0)
width = 10;
ret += mod_util.inspect(arg, false, width);
break;
case "r":
ret += dumpException(arg);
break;
default:
throw new Error("unsupported conversion: " + conversion);
}
}
ret += fmt;
return ret;
}
function jsPrintf() {
var args = Array.prototype.slice.call(arguments);
args.unshift(process.stdout);
jsFprintf.apply(null, args);
}
function jsFprintf(stream) {
var args = Array.prototype.slice.call(arguments, 1);
return stream.write(jsSprintf.apply(this, args));
}
function doPad(chr, width, left, str) {
var ret = str;
while (ret.length < width) {
if (left)
ret += chr;
else
ret = chr + ret;
}
return ret;
}
function dumpException(ex) {
var ret;
if (!(ex instanceof Error))
throw new Error(jsSprintf("invalid type for %%r: %j", ex));
ret = "EXCEPTION: " + ex.constructor.name + ": " + ex.stack;
if (ex.cause && typeof ex.cause === "function") {
var cex = ex.cause();
if (cex) {
ret += "\nCaused by: " + dumpException(cex);
}
}
return ret;
}
}
});
// node_modules/core-util-is/lib/util.js
var require_util2 = __commonJS({
"node_modules/core-util-is/lib/util.js"(exports) {
function isArray(arg) {
if (Array.isArray) {
return Array.isArray(arg);
}
return objectToString(arg) === "[object Array]";
}
exports.isArray = isArray;
function isBoolean(arg) {
return typeof arg === "boolean";
}
exports.isBoolean = isBoolean;
function isNull(arg) {
return arg === null;
}
exports.isNull = isNull;
function isNullOrUndefined(arg) {
return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;
function isNumber(arg) {
return typeof arg === "number";
}
exports.isNumber = isNumber;
function isString(arg) {
return typeof arg === "string";
}
exports.isString = isString;
function isSymbol(arg) {
return typeof arg === "symbol";
}
exports.isSymbol = isSymbol;
function isUndefined(arg) {
return arg === void 0;
}
exports.isUndefined = isUndefined;
function isRegExp(re) {
return objectToString(re) === "[object RegExp]";
}
exports.isRegExp = isRegExp;
function isObject(arg) {
return typeof arg === "object" && arg !== null;
}
exports.isObject = isObject;
function isDate(d) {
return objectToString(d) === "[object Date]";
}
exports.isDate = isDate;
function isError(e) {
return objectToString(e) === "[object Error]" || e instanceof Error;
}
exports.isError = isError;
function isFunction(arg) {
return typeof arg === "function";
}
exports.isFunction = isFunction;
function isPrimitive(arg) {
return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || typeof arg === "undefined";
}
exports.isPrimitive = isPrimitive;
exports.isBuffer = Buffer.isBuffer;
function objectToString(o) {
return Object.prototype.toString.call(o);
}
}
});
// node_modules/verror/lib/verror.js
var require_verror = __commonJS({
"node_modules/verror/lib/verror.js"(exports, module2) {
var mod_assertplus = require_assert();
var mod_util = require("util");
var mod_extsprintf = require_extsprintf();
var mod_isError = require_util2().isError;
var sprintf = mod_extsprintf.sprintf;
module2.exports = VError;
VError.VError = VError;
VError.SError = SError;
VError.WError = WError;
VError.MultiError = MultiError;
function parseConstructorArguments(args) {
var argv, options, sprintf_args, shortmessage, k;
mod_assertplus.object(args, "args");
mod_assertplus.bool(args.strict, "args.strict");
mod_assertplus.array(args.argv, "args.argv");
argv = args.argv;
if (argv.length === 0) {
options = {};
sprintf_args = [];
} else if (mod_isError(argv[0])) {
options = { "cause": argv[0] };
sprintf_args = argv.slice(1);
} else if (typeof argv[0] === "object") {
options = {};
for (k in argv[0]) {
options[k] = argv[0][k];
}
sprintf_args = argv.slice(1);
} else {
mod_assertplus.string(argv[0], "first argument to VError, SError, or WError constructor must be a string, object, or Error");
options = {};
sprintf_args = argv;
}
mod_assertplus.object(options);
if (!options.strict && !args.strict) {
sprintf_args = sprintf_args.map(function(a) {
return a === null ? "null" : a === void 0 ? "undefined" : a;
});
}
if (sprintf_args.length === 0) {
shortmessage = "";
} else {
shortmessage = sprintf.apply(null, sprintf_args);
}
return {
"options": options,
"shortmessage": shortmessage
};
}
function VError() {
var args, obj, parsed, cause, ctor, message, k;
args = Array.prototype.slice.call(arguments, 0);
if (!(this instanceof VError)) {
obj = Object.create(VError.prototype);
VError.apply(obj, arguments);
return obj;
}
parsed = parseConstructorArguments({
"argv": args,
"strict": false
});
if (parsed.options.name) {
mod_assertplus.string(parsed.options.name, `error's "name" must be a string`);
this.name = parsed.options.name;
}
this.jse_shortmsg = parsed.shortmessage;
message = parsed.shortmessage;
cause = parsed.options.cause;
if (cause) {
mod_assertplus.ok(mod_isError(cause), "cause is not an Error");
this.jse_cause = cause;
if (!parsed.options.skipCauseMessage) {
message += ": " + cause.message;
}
}
this.jse_info = {};
if (parsed.options.info) {
for (k in parsed.options.info) {
this.jse_info[k] = parsed.options.info[k];
}
}
this.message = message;
Error.call(this, message);
if (Error.captureStackTrace) {
ctor = parsed.options.constructorOpt || this.constructor;
Error.captureStackTrace(this, ctor);
}
return this;
}
mod_util.inherits(VError, Error);
VError.prototype.name = "VError";
VError.prototype.toString = function ve_toString() {
var str = this.hasOwnProperty("name") && this.name || this.constructor.name || this.constructor.prototype.name;
if (this.message)
str += ": " + this.message;
return str;
};
VError.prototype.cause = function ve_cause() {
var cause = VError.cause(this);
return cause === null ? void 0 : cause;
};
VError.cause = function(err) {
mod_assertplus.ok(mod_isError(err), "err must be an Error");
return mod_isError(err.jse_cause) ? err.jse_cause : null;
};
VError.info = function(err) {
var rv, cause, k;
mod_assertplus.ok(mod_isError(err), "err must be an Error");
cause = VError.cause(err);
if (cause !== null) {
rv = VError.info(cause);
} else {
rv = {};
}
if (typeof err.jse_info == "object" && err.jse_info !== null) {
for (k in err.jse_info) {
rv[k] = err.jse_info[k];
}
}
return rv;
};
VError.findCauseByName = function(err, name) {
var cause;
mod_assertplus.ok(mod_isError(err), "err must be an Error");
mod_assertplus.string(name, "name");
mod_assertplus.ok(name.length > 0, "name cannot be empty");
for (cause = err; cause !== null; cause = VError.cause(cause)) {
mod_assertplus.ok(mod_isError(cause));
if (cause.name == name) {
return cause;
}
}
return null;
};
VError.hasCauseWithName = function(err, name) {
return VError.findCauseByName(err, name) !== null;
};
VError.fullStack = function(err) {
mod_assertplus.ok(mod_isError(err), "err must be an Error");
var cause = VError.cause(err);
if (cause) {
return err.stack + "\ncaused by: " + VError.fullStack(cause);
}
return err.stack;
};
VError.errorFromList = function(errors) {
mod_assertplus.arrayOfObject(errors, "errors");
if (errors.length === 0) {
return null;
}
errors.forEach(function(e) {
mod_assertplus.ok(mod_isError(e));
});
if (errors.length == 1) {
return errors[0];
}
return new MultiError(errors);
};
VError.errorForEach = function(err, func) {
mod_assertplus.ok(mod_isError(err), "err must be an Error");
mod_assertplus.func(func, "func");
if (err instanceof MultiError) {
err.errors().forEach(function iterError(e) {
func(e);
});
} else {
func(err);
}
};
function SError() {
var args, obj, parsed, options;
args = Array.prototype.slice.call(arguments, 0);
if (!(this instanceof SError)) {
obj = Object.create(SError.prototype);
SError.apply(obj, arguments);
return obj;
}
parsed = parseConstructorArguments({
"argv": args,
"strict": true
});
options = parsed.options;
VError.call(this, options, "%s", parsed.shortmessage);
return this;
}
mod_util.inherits(SError, VError);
function MultiError(errors) {
mod_assertplus.array(errors, "list of errors");
mod_assertplus.ok(errors.length > 0, "must be at least one error");
this.ase_errors = errors;
VError.call(this, {
"cause": errors[0]
}, "first of %d error%s", errors.length, errors.length == 1 ? "" : "s");
}
mod_util.inherits(MultiError, VError);
MultiError.prototype.name = "MultiError";
MultiError.prototype.errors = function me_errors() {
return this.ase_errors.slice(0);
};
function WError() {
var args, obj, parsed, options;
args = Array.prototype.slice.call(arguments, 0);
if (!(this instanceof WError)) {
obj = Object.create(WError.prototype);
WError.apply(obj, args);
return obj;
}
parsed = parseConstructorArguments({
"argv": args,
"strict": false
});
options = parsed.options;
options["skipCauseMessage"] = true;
VError.call(this, options, "%s", parsed.shortmessage);
return this;
}
mod_util.inherits(WError, VError);
WError.prototype.name = "WError";
WError.prototype.toString = function we_toString() {
var str = this.hasOwnProperty("name") && this.name || this.constructor.name || this.constructor.prototype.name;
if (this.message)
str += ": " + this.message;
if (this.jse_cause && this.jse_cause.message)
str += "; caused by " + this.jse_cause.toString();
return str;
};
WError.prototype.cause = function we_cause(c) {
if (mod_isError(c))
this.jse_cause = c;
return this.jse_cause;
};
}
});
// node_modules/json-schema/lib/validate.js
var require_validate = __commonJS({
"node_modules/json-schema/lib/validate.js"(exports, module2) {
(function(root, factory) {
if (typeof define === "function" && define.amd) {
define([], function() {
return factory();
});
} else if (typeof module2 === "object" && module2.exports) {
module2.exports = factory();
} else {
root.jsonSchema = factory();
}
})(exports, function() {
var exports2 = validate;
exports2.Integer = { type: "integer" };
var primitiveConstructors = {
String,
Boolean,
Number,
Object,
Array,
Date
};
exports2.validate = validate;
function validate(instance, schema) {
return validate(instance, schema, { changing: false });
}
;
exports2.checkPropertyChange = function(value, schema, property) {
return validate(value, schema, { changing: property || "property" });
};
var validate = exports2._validate = function(instance, schema, options) {
if (!options)
options = {};
var _changing = options.changing;
function getType(schema2) {
return schema2.type || primitiveConstructors[schema2.name] == schema2 && schema2.name.toLowerCase();
}
var errors = [];
function checkProp(value, schema2, path3, i) {
var l;
path3 += path3 ? typeof i == "number" ? "[" + i + "]" : typeof i == "undefined" ? "" : "." + i : i;
function addError(message) {
errors.push({ property: path3, message });
}
if ((typeof schema2 != "object" || schema2 instanceof Array) && (path3 || typeof schema2 != "function") && !(schema2 && getType(schema2))) {
if (typeof schema2 == "function") {
if (!(value instanceof schema2)) {
addError("is not an instance of the class/constructor " + schema2.name);
}
} else if (schema2) {
addError("Invalid schema/property definition " + schema2);
}
return null;
}
if (_changing && schema2.readonly) {
addError("is a readonly field, it can not be changed");
}
if (schema2["extends"]) {
checkProp(value, schema2["extends"], path3, i);
}
function checkType(type, value2) {
if (type) {
if (typeof type == "string" && type != "any" && (type == "null" ? value2 !== null : typeof value2 != type) && !(value2 instanceof Array && type == "array") && !(value2 instanceof Date && type == "date") && !(type == "integer" && value2 % 1 === 0)) {
return [{ property: path3, message: value2 + " - " + typeof value2 + " value found, but a " + type + " is required" }];
}
if (type instanceof Array) {
var unionErrors = [];
for (var j2 = 0; j2 < type.length; j2++) {
if (!(unionErrors = checkType(type[j2], value2)).length) {
break;
}
}
if (unionErrors.length) {
return unionErrors;
}
} else if (typeof type == "object") {
var priorErrors = errors;
errors = [];
checkProp(value2, type, path3);
var theseErrors = errors;
errors = priorErrors;
return theseErrors;
}
}
return [];
}
if (value === void 0) {
if (schema2.required) {
addError("is missing and it is required");
}
} else {
errors = errors.concat(checkType(getType(schema2), value));
if (schema2.disallow && !checkType(schema2.disallow, value).length) {
addError(" disallowed value was matched");
}
if (value !== null) {
if (value instanceof Array) {
if (schema2.items) {
var itemsIsArray = schema2.items instanceof Array;
var propDef = schema2.items;
for (i = 0, l = value.length; i < l; i += 1) {
if (itemsIsArray)
propDef = schema2.items[i];
if (options.coerce)
value[i] = options.coerce(value[i], propDef);
errors.concat(checkProp(value[i], propDef, path3, i));
}
}
if (schema2.minItems && value.length < schema2.minItems) {
addError("There must be a minimum of " + schema2.minItems + " in the array");
}
if (schema2.maxItems && value.length > schema2.maxItems) {
addError("There must be a maximum of " + schema2.maxItems + " in the array");
}
} else if (schema2.properties || schema2.additionalProperties) {
errors.concat(checkObj(value, schema2.properties, path3, schema2.additionalProperties));
}
if (schema2.pattern && typeof value == "string" && !value.match(schema2.pattern)) {
addError("does not match the regex pattern " + schema2.pattern);
}
if (schema2.maxLength && typeof value == "string" && value.length > schema2.maxLength) {
addError("may only be " + schema2.maxLength + " characters long");
}
if (schema2.minLength && typeof value == "string" && value.length < schema2.minLength) {
addError("must be at least " + schema2.minLength + " characters long");
}
if (typeof schema2.minimum !== "undefined" && typeof value == typeof schema2.minimum && schema2.minimum > value) {
addError("must have a minimum value of " + schema2.minimum);
}
if (typeof schema2.maximum !== "undefined" && typeof value == typeof schema2.maximum && schema2.maximum < value) {
addError("must have a maximum value of " + schema2.maximum);
}
if (schema2["enum"]) {
var enumer = schema2["enum"];
l = enumer.length;
var found;
for (var j = 0; j < l; j++) {
if (enumer[j] === value) {
found = 1;
break;
}
}
if (!found) {
addError("does not have a value in the enumeration " + enumer.join(", "));
}
}
if (typeof schema2.maxDecimal == "number" && value.toString().match(new RegExp("\\.[0-9]{" + (schema2.maxDecimal + 1) + ",}"))) {
addError("may only have " + schema2.maxDecimal + " digits of decimal places");
}
}
}
return null;
}
function checkObj(instance2, objTypeDef, path3, additionalProp) {
if (typeof objTypeDef == "object") {
if (typeof instance2 != "object" || instance2 instanceof Array) {
errors.push({ property: path3, message: "an object is required" });
}
for (var i in objTypeDef) {
if (objTypeDef.hasOwnProperty(i) && i != "__proto__" && i != "constructor") {
var value = instance2.hasOwnProperty(i) ? instance2[i] : void 0;
if (value === void 0 && options.existingOnly)
continue;
var propDef = objTypeDef[i];
if (value === void 0 && propDef["default"]) {
value = instance2[i] = propDef["default"];
}
if (options.coerce && i in instance2) {
value = instance2[i] = options.coerce(value, propDef);
}
checkProp(value, propDef, path3, i);
}
}
}
for (i in instance2) {
if (instance2.hasOwnProperty(i) && !(i.charAt(0) == "_" && i.charAt(1) == "_") && objTypeDef && !objTypeDef[i] && additionalProp === false) {
if (options.filter) {
delete instance2[i];
continue;
} else {
errors.push({ property: path3, message: "The property " + i + " is not defined in the schema and the schema does not allow additional properties" });
}
}
var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires;
if (requires && !(requires in instance2)) {
errors.push({ property: path3, message: "the presence of the property " + i + " requires that " + requires + " also be present" });
}
value = instance2[i];
if (additionalProp && (!(objTypeDef && typeof objTypeDef == "object") || !(i in objTypeDef))) {
if (options.coerce) {
value = instance2[i] = options.coerce(value, additionalProp);
}
checkProp(value, additionalProp, path3, i);
}
if (!_changing && value && value.$schema) {
errors = errors.concat(checkProp(value, value.$schema, path3, i));
}
}
return errors;
}
if (schema) {
checkProp(instance, schema, "", _changing || "");
}
if (!_changing && instance && instance.$schema) {
checkProp(instance, instance.$schema, "", "");
}
return { valid: !errors.length, errors };
};
exports2.mustBeValid = function(result) {
if (!result.valid) {
throw new TypeError(result.errors.map(function(error) {
return "for property " + error.property + ": " + error.message;
}).join(", \n"));
}
};
return exports2;
});
}
});
// node_modules/jsprim/lib/jsprim.js
var require_jsprim = __commonJS({
"node_modules/jsprim/lib/jsprim.js"(exports) {
var mod_assert = require_assert();
var mod_util = require("util");
var mod_extsprintf = require_extsprintf();
var mod_verror = require_verror();
var mod_jsonschema = require_validate();
exports.deepCopy = deepCopy;
exports.deepEqual = deepEqual;
exports.isEmpty = isEmpty;
exports.hasKey = hasKey;
exports.forEachKey = forEachKey;
exports.pluck = pluck;
exports.flattenObject = flattenObject;
exports.flattenIter = flattenIter;
exports.validateJsonObject = validateJsonObjectJS;
exports.validateJsonObjectJS = validateJsonObjectJS;
exports.randElt = randElt;
exports.extraProperties = extraProperties;
exports.mergeObjects = mergeObjects;
exports.startsWith = startsWith;
exports.endsWith = endsWith;
exports.parseInteger = parseInteger;
exports.iso8601 = iso8601;
exports.rfc1123 = rfc1123;
exports.parseDateTime = parseDateTime;
exports.hrtimediff = hrtimeDiff;
exports.hrtimeDiff = hrtimeDiff;
exports.hrtimeAccum = hrtimeAccum;
exports.hrtimeAdd = hrtimeAdd;
exports.hrtimeNanosec = hrtimeNanosec;
exports.hrtimeMicrosec = hrtimeMicrosec;
exports.hrtimeMillisec = hrtimeMillisec;
function deepCopy(obj) {
var ret, key;
var marker = "__deepCopy";
if (obj && obj[marker])
throw new Error("attempted deep copy of cyclic object");
if (obj && obj.constructor == Object) {
ret = {};
obj[marker] = true;
for (key in obj) {
if (key == marker)
continue;
ret[key] = deepCopy(obj[key]);
}
delete obj[marker];
return ret;
}
if (obj && obj.constructor == Array) {
ret = [];
obj[marker] = true;
for (key = 0; key < obj.length; key++)
ret.push(deepCopy(obj[key]));
delete obj[marker];
return ret;
}
return obj;
}
function deepEqual(obj1, obj2) {
if (typeof obj1 != typeof obj2)
return false;
if (obj1 === null || obj2 === null || typeof obj1 != "object")
return obj1 === obj2;
if (obj1.constructor != obj2.constructor)
return false;
var k;
for (k in obj1) {
if (!obj2.hasOwnProperty(k))
return false;
if (!deepEqual(obj1[k], obj2[k]))
return false;
}
for (k in obj2) {
if (!obj1.hasOwnProperty(k))
return false;
}
return true;
}
function isEmpty(obj) {
var key;
for (key in obj)
return false;
return true;
}
function hasKey(obj, key) {
mod_assert.equal(typeof key, "string");
return Object.prototype.hasOwnProperty.call(obj, key);
}
function forEachKey(obj, callback) {
for (var key in obj) {
if (hasKey(obj, key)) {
callback(key, obj[key]);
}
}
}
function pluck(obj, key) {
mod_assert.equal(typeof key, "string");
return pluckv(obj, key);
}
function pluckv(obj, key) {
if (obj === null || typeof obj !== "object")
return void 0;
if (obj.hasOwnProperty(key))
return obj[key];
var i = key.indexOf(".");
if (i == -1)
return void 0;
var key1 = key.substr(0, i);
if (!obj.hasOwnProperty(key1))
return void 0;
return pluckv(obj[key1], key.substr(i + 1));
}
function flattenIter(data, depth, callback) {
doFlattenIter(data, depth, [], callback);
}
function doFlattenIter(data, depth, accum, callback) {
var each;
var key;
if (depth === 0) {
each = accum.slice(0);
each.push(data);
callback(each);
return;
}
mod_assert.ok(data !== null);
mod_assert.equal(typeof data, "object");
mod_assert.equal(typeof depth, "number");
mod_assert.ok(depth >= 0);
for (key in data) {
each = accum.slice(0);
each.push(key);
doFlattenIter(data[key], depth - 1, each, callback);
}
}
function flattenObject(data, depth) {
if (depth === 0)
return [data];
mod_assert.ok(data !== null);
mod_assert.equal(typeof data, "object");
mod_assert.equal(typeof depth, "number");
mod_assert.ok(depth >= 0);
var rv = [];
var key;
for (key in data) {
flattenObject(data[key], depth - 1).forEach(function(p) {
rv.push([key].concat(p));
});
}
return rv;
}
function startsWith(str, prefix) {
return str.substr(0, prefix.length) == prefix;
}
function endsWith(str, suffix) {
return str.substr(str.length - suffix.length, suffix.length) == suffix;
}
function iso8601(d) {
if (typeof d == "number")
d = new Date(d);
mod_assert.ok(d.constructor === Date);
return mod_extsprintf.sprintf("%4d-%02d-%02dT%02d:%02d:%02d.%03dZ", d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds());
}
var RFC1123_MONTHS = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
var RFC1123_DAYS = [
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat"
];
function rfc1123(date) {
return mod_extsprintf.sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(), RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
function parseDateTime(str) {
var numeric = +str;
if (!isNaN(numeric)) {
return new Date(numeric);
} else {
return new Date(str);
}
}
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
var PI_DEFAULTS = {
base: 10,
allowSign: true,
allowPrefix: false,
allowTrailing: false,
allowImprecise: false,
trimWhitespace: false,
leadingZeroIsOctal: false
};
var CP_0 = 48;
var CP_9 = 57;
var CP_A = 65;
var CP_B = 66;
var CP_O = 79;
var CP_T = 84;
var CP_X = 88;
var CP_Z = 90;
var CP_a = 97;
var CP_b = 98;
var CP_o = 111;
var CP_t = 116;
var CP_x = 120;
var CP_z = 122;
var PI_CONV_DEC = 48;
var PI_CONV_UC = 55;
var PI_CONV_LC = 87;
function parseInteger(str, uopts) {
mod_assert.string(str, "str");
mod_assert.optionalObject(uopts, "options");
var baseOverride = false;
var options = PI_DEFAULTS;
if (uopts) {
baseOverride = hasKey(uopts, "base");
options = mergeObjects(options, uopts);
mod_assert.number(options.base, "options.base");
mod_assert.ok(options.base >= 2, "options.base >= 2");
mod_assert.ok(options.base <= 36, "options.base <= 36");
mod_assert.bool(options.allowSign, "options.allowSign");
mod_assert.bool(options.allowPrefix, "options.allowPrefix");
mod_assert.bool(options.allowTrailing, "options.allowTrailing");
mod_assert.bool(options.allowImprecise, "options.allowImprecise");
mod_assert.bool(options.trimWhitespace, "options.trimWhitespace");
mod_assert.bool(options.leadingZeroIsOctal, "options.leadingZeroIsOctal");
if (options.leadingZeroIsOctal) {
mod_assert.ok(!baseOverride, '"base" and "leadingZeroIsOctal" are mutually exclusive');
}
}
var c;
var pbase = -1;
var base = options.base;
var start;
var mult = 1;
var value = 0;
var idx = 0;
var len = str.length;
if (options.trimWhitespace) {
while (idx < len && isSpace(str.charCodeAt(idx))) {
++idx;
}
}
if (options.allowSign) {
if (str[idx] === "-") {
idx += 1;
mult = -1;
} else if (str[idx] === "+") {
idx += 1;
}
}
if (str[idx] === "0") {
if (options.allowPrefix) {
pbase = prefixToBase(str.charCodeAt(idx + 1));
if (pbase !== -1 && (!baseOverride || pbase === base)) {
base = pbase;
idx += 2;
}
}
if (pbase === -1 && options.leadingZeroIsOctal) {
base = 8;
}
}
for (start = idx; idx < len; ++idx) {
c = translateDigit(str.charCodeAt(idx));
if (c !== -1 && c < base) {
value *= base;
value += c;
} else {
break;
}
}
if (start === idx) {
return new Error("invalid number: " + JSON.stringify(str));
}
if (options.trimWhitespace) {
while (idx < len && isSpace(str.charCodeAt(idx))) {
++idx;
}
}
if (idx < len && !options.allowTrailing) {
return new Error("trailing characters after number: " + JSON.stringify(str.slice(idx)));
}
if (value === 0) {
return 0;
}
var result = value * mult;
if (!options.allowImprecise && (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) {
return new Error("number is outside of the supported range: " + JSON.stringify(str.slice(start, idx)));
}
return result;
}
function translateDigit(d) {
if (d >= CP_0 && d <= CP_9) {
return d - PI_CONV_DEC;
} else if (d >= CP_A && d <= CP_Z) {
return d - PI_CONV_UC;
} else if (d >= CP_a && d <= CP_z) {
return d - PI_CONV_LC;
} else {
return -1;
}
}
function isSpace(c) {
return c === 32 || c >= 9 && c <= 13 || c === 160 || c === 5760 || c === 6158 || c >= 8192 && c <= 8202 || c === 8232 || c === 8233 || c === 8239 || c === 8287 || c === 12288 || c === 65279;
}
function prefixToBase(c) {
if (c === CP_b || c === CP_B) {
return 2;
} else if (c === CP_o || c === CP_O) {
return 8;
} else if (c === CP_t || c === CP_T) {
return 10;
} else if (c === CP_x || c === CP_X) {
return 16;
} else {
return -1;
}
}
function validateJsonObjectJS(schema, input) {
var report = mod_jsonschema.validate(input, schema);
if (report.errors.length === 0)
return null;
var error = report.errors[0];
var propname = error["property"];
var reason = error["message"].toLowerCase();
var i, j;
if ((i = reason.indexOf("the property ")) != -1 && (j = reason.indexOf(" is not defined in the schema and the schema does not allow additional properties")) != -1) {
i += "the property ".length;
if (propname === "")
propname = reason.substr(i, j - i);
else
propname = propname + "." + reason.substr(i, j - i);
reason = "unsupported property";
}
var rv = new mod_verror.VError('property "%s": %s', propname, reason);
rv.jsv_details = error;
return rv;
}
function randElt(arr) {
mod_assert.ok(Array.isArray(arr) && arr.length > 0, "randElt argument must be a non-empty array");
return arr[Math.floor(Math.random() * arr.length)];
}
function assertHrtime(a) {
mod_assert.ok(a[0] >= 0 && a[1] >= 0, "negative numbers not allowed in hrtimes");
mod_assert.ok(a[1] < 1e9, "nanoseconds column overflow");
}
function hrtimeDiff(a, b) {
assertHrtime(a);
assertHrtime(b);
mod_assert.ok(a[0] > b[0] || a[0] == b[0] && a[1] >= b[1], "negative differences not allowed");
var rv = [a[0] - b[0], 0];
if (a[1] >= b[1]) {
rv[1] = a[1] - b[1];
} else {
rv[0]--;
rv[1] = 1e9 - (b[1] - a[1]);
}
return rv;
}
function hrtimeNanosec(a) {
assertHrtime(a);
return Math.floor(a[0] * 1e9 + a[1]);
}
function hrtimeMicrosec(a) {
assertHrtime(a);
return Math.floor(a[0] * 1e6 + a[1] / 1e3);
}
function hrtimeMillisec(a) {
assertHrtime(a);
return Math.floor(a[0] * 1e3 + a[1] / 1e6);
}
function hrtimeAccum(a, b) {
assertHrtime(a);
assertHrtime(b);
a[1] += b[1];
if (a[1] >= 1e9) {
a[0]++;
a[1] -= 1e9;
}
a[0] += b[0];
return a;
}
function hrtimeAdd(a, b) {
assertHrtime(a);
var rv = [a[0], a[1]];
return hrtimeAccum(rv, b);
}
function extraProperties(obj, allowed) {
mod_assert.ok(typeof obj === "object" && obj !== null, "obj argument must be a non-null object");
mod_assert.ok(Array.isArray(allowed), "allowed argument must be an array of strings");
for (var i = 0; i < allowed.length; i++) {
mod_assert.ok(typeof allowed[i] === "string", "allowed argument must be an array of strings");
}
return Object.keys(obj).filter(function(key) {
return allowed.indexOf(key) === -1;
});
}
function mergeObjects(provided, overrides, defaults) {
var rv, k;
rv = {};
if (defaults) {
for (k in defaults)
rv[k] = defaults[k];
}
if (provided) {
for (k in provided)
rv[k] = provided[k];
}
if (overrides) {
for (k in overrides)
rv[k] = overrides[k];
}
return rv;
}
}
});
// node_modules/http-signature/lib/signer.js
var require_signer = __commonJS({
"node_modules/http-signature/lib/signer.js"(exports, module2) {
var assert = require_assert();
var crypto2 = require("crypto");
var http = require("http");
var util = require("util");
var sshpk = require_lib2();
var jsprim = require_jsprim();
var utils = require_utils3();
var sprintf = require("util").format;
var HASH_ALGOS = utils.HASH_ALGOS;
var PK_ALGOS = utils.PK_ALGOS;
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
var HttpSignatureError = utils.HttpSignatureError;
var validateAlgorithm = utils.validateAlgorithm;
var AUTHZ_FMT = 'Signature keyId="%s",algorithm="%s",headers="%s",signature="%s"';
function MissingHeaderError(message) {
HttpSignatureError.call(this, message, MissingHeaderError);
}
util.inherits(MissingHeaderError, HttpSignatureError);
function StrictParsingError(message) {
HttpSignatureError.call(this, message, StrictParsingError);
}
util.inherits(StrictParsingError, HttpSignatureError);
function RequestSigner(options) {
assert.object(options, "options");
var alg = [];
if (options.algorithm !== void 0) {
assert.string(options.algorithm, "options.algorithm");
alg = validateAlgorithm(options.algorithm);
}
this.rs_alg = alg;
if (options.sign !== void 0) {
assert.func(options.sign, "options.sign");
this.rs_signFunc = options.sign;
} else if (alg[0] === "hmac" && options.key !== void 0) {
assert.string(options.keyId, "options.keyId");
this.rs_keyId = options.keyId;
if (typeof options.key !== "string" && !Buffer.isBuffer(options.key))
throw new TypeError("options.key for HMAC must be a string or Buffer");
this.rs_signer = crypto2.createHmac(alg[1].toUpperCase(), options.key);
this.rs_signer.sign = function() {
var digest = this.digest("base64");
return {
hashAlgorithm: alg[1],
toString: function() {
return digest;
}
};
};
} else if (options.key !== void 0) {
var key = options.key;
if (typeof key === "string" || Buffer.isBuffer(key))
key = sshpk.parsePrivateKey(key);
assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]), "options.key must be a sshpk.PrivateKey");
this.rs_key = key;
assert.string(options.keyId, "options.keyId");
this.rs_keyId = options.keyId;
if (!PK_ALGOS[key.type]) {
throw new InvalidAlgorithmError(key.type.toUpperCase() + " type keys are not supported");
}
if (alg[0] !== void 0 && key.type !== alg[0]) {
throw new InvalidAlgorithmError("options.key must be a " + alg[0].toUpperCase() + " key, was given a " + key.type.toUpperCase() + " key instead");
}
this.rs_signer = key.createSign(alg[1]);
} else {
throw new TypeError("options.sign (func) or options.key is required");
}
this.rs_headers = [];
this.rs_lines = [];
}
RequestSigner.prototype.writeHeader = function(header, value) {
assert.string(header, "header");
header = header.toLowerCase();
assert.string(value, "value");
this.rs_headers.push(header);
if (this.rs_signFunc) {
this.rs_lines.push(header + ": " + value);
} else {
var line = header + ": " + value;
if (this.rs_headers.length > 0)
line = "\n" + line;
this.rs_signer.update(line);
}
return value;
};
RequestSigner.prototype.writeDateHeader = function() {
return this.writeHeader("date", jsprim.rfc1123(new Date()));
};
RequestSigner.prototype.writeTarget = function(method, path3) {
assert.string(method, "method");
assert.string(path3, "path");
method = method.toLowerCase();
this.writeHeader("(request-target)", method + " " + path3);
};
RequestSigner.prototype.sign = function(cb) {
assert.func(cb, "callback");
if (this.rs_headers.length < 1)
throw new Error("At least one header must be signed");
var alg, authz;
if (this.rs_signFunc) {
var data = this.rs_lines.join("\n");
var self2 = this;
this.rs_signFunc(data, function(err, sig) {
if (err) {
cb(err);
return;
}
try {
assert.object(sig, "signature");
assert.string(sig.keyId, "signature.keyId");
assert.string(sig.algorithm, "signature.algorithm");
assert.string(sig.signature, "signature.signature");
alg = validateAlgorithm(sig.algorithm);
authz = sprintf(AUTHZ_FMT, sig.keyId, sig.algorithm, self2.rs_headers.join(" "), sig.signature);
} catch (e) {
cb(e);
return;
}
cb(null, authz);
});
} else {
try {
var sigObj = this.rs_signer.sign();
} catch (e) {
cb(e);
return;
}
alg = (this.rs_alg[0] || this.rs_key.type) + "-" + sigObj.hashAlgorithm;
var signature = sigObj.toString();
authz = sprintf(AUTHZ_FMT, this.rs_keyId, alg, this.rs_headers.join(" "), signature);
cb(null, authz);
}
};
module2.exports = {
isSigner: function(obj) {
if (typeof obj === "object" && obj instanceof RequestSigner)
return true;
return false;
},
createSigner: function createSigner(options) {
return new RequestSigner(options);
},
signRequest: function signRequest(request2, options) {
assert.object(request2, "request");
assert.object(options, "options");
assert.optionalString(options.algorithm, "options.algorithm");
assert.string(options.keyId, "options.keyId");
assert.optionalArrayOfString(options.headers, "options.headers");
assert.optionalString(options.httpVersion, "options.httpVersion");
if (!request2.getHeader("Date"))
request2.setHeader("Date", jsprim.rfc1123(new Date()));
if (!options.headers)
options.headers = ["date"];
if (!options.httpVersion)
options.httpVersion = "1.1";
var alg = [];
if (options.algorithm) {
options.algorithm = options.algorithm.toLowerCase();
alg = validateAlgorithm(options.algorithm);
}
var i;
var stringToSign = "";
for (i = 0; i < options.headers.length; i++) {
if (typeof options.headers[i] !== "string")
throw new TypeError("options.headers must be an array of Strings");
var h = options.headers[i].toLowerCase();
if (h === "request-line") {
if (!options.strict) {
stringToSign += request2.method + " " + request2.path + " HTTP/" + options.httpVersion;
} else {
throw new StrictParsingError("request-line is not a valid header with strict parsing enabled.");
}
} else if (h === "(request-target)") {
stringToSign += "(request-target): " + request2.method.toLowerCase() + " " + request2.path;
} else {
var value = request2.getHeader(h);
if (value === void 0 || value === "") {
throw new MissingHeaderError(h + " was not in the request");
}
stringToSign += h + ": " + value;
}
if (i + 1 < options.headers.length)
stringToSign += "\n";
}
if (request2.hasOwnProperty("_stringToSign")) {
request2._stringToSign = stringToSign;
}
var signature;
if (alg[0] === "hmac") {
if (typeof options.key !== "string" && !Buffer.isBuffer(options.key))
throw new TypeError("options.key must be a string or Buffer");
var hmac = crypto2.createHmac(alg[1].toUpperCase(), options.key);
hmac.update(stringToSign);
signature = hmac.digest("base64");
} else {
var key = options.key;
if (typeof key === "string" || Buffer.isBuffer(key))
key = sshpk.parsePrivateKey(options.key);
assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]), "options.key must be a sshpk.PrivateKey");
if (!PK_ALGOS[key.type]) {
throw new InvalidAlgorithmError(key.type.toUpperCase() + " type keys are not supported");
}
if (alg[0] !== void 0 && key.type !== alg[0]) {
throw new InvalidAlgorithmError("options.key must be a " + alg[0].toUpperCase() + " key, was given a " + key.type.toUpperCase() + " key instead");
}
var signer = key.createSign(alg[1]);
signer.update(stringToSign);
var sigObj = signer.sign();
if (!HASH_ALGOS[sigObj.hashAlgorithm]) {
throw new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() + " is not a supported hash algorithm");
}
options.algorithm = key.type + "-" + sigObj.hashAlgorithm;
signature = sigObj.toString();
assert.notStrictEqual(signature, "", "empty signature produced");
}
var authzHeaderName = options.authorizationHeaderName || "Authorization";
request2.setHeader(authzHeaderName, sprintf(AUTHZ_FMT, options.keyId, options.algorithm, options.headers.join(" "), signature));
return true;
}
};
}
});
// node_modules/http-signature/lib/verify.js
var require_verify = __commonJS({
"node_modules/http-signature/lib/verify.js"(exports, module2) {
var assert = require_assert();
var crypto2 = require("crypto");
var sshpk = require_lib2();
var utils = require_utils3();
var HASH_ALGOS = utils.HASH_ALGOS;
var PK_ALGOS = utils.PK_ALGOS;
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
var HttpSignatureError = utils.HttpSignatureError;
var validateAlgorithm = utils.validateAlgorithm;
module2.exports = {
verifySignature: function verifySignature(parsedSignature, pubkey) {
assert.object(parsedSignature, "parsedSignature");
if (typeof pubkey === "string" || Buffer.isBuffer(pubkey))
pubkey = sshpk.parseKey(pubkey);
assert.ok(sshpk.Key.isKey(pubkey, [1, 1]), "pubkey must be a sshpk.Key");
var alg = validateAlgorithm(parsedSignature.algorithm);
if (alg[0] === "hmac" || alg[0] !== pubkey.type)
return false;
var v = pubkey.createVerify(alg[1]);
v.update(parsedSignature.signingString);
return v.verify(parsedSignature.params.signature, "base64");
},
verifyHMAC: function verifyHMAC(parsedSignature, secret) {
assert.object(parsedSignature, "parsedHMAC");
assert.string(secret, "secret");
var alg = validateAlgorithm(parsedSignature.algorithm);
if (alg[0] !== "hmac")
return false;
var hashAlg = alg[1].toUpperCase();
var hmac = crypto2.createHmac(hashAlg, secret);
hmac.update(parsedSignature.signingString);
var h1 = crypto2.createHmac(hashAlg, secret);
h1.update(hmac.digest());
h1 = h1.digest();
var h2 = crypto2.createHmac(hashAlg, secret);
h2.update(new Buffer(parsedSignature.params.signature, "base64"));
h2 = h2.digest();
if (typeof h1 === "string")
return h1 === h2;
if (Buffer.isBuffer(h1) && !h1.equals)
return h1.toString("binary") === h2.toString("binary");
return h1.equals(h2);
}
};
}
});
// node_modules/http-signature/lib/index.js
var require_lib3 = __commonJS({
"node_modules/http-signature/lib/index.js"(exports, module2) {
var parser = require_parser();
var signer = require_signer();
var verify = require_verify();
var utils = require_utils3();
module2.exports = {
parse: parser.parseRequest,
parseRequest: parser.parseRequest,
sign: signer.signRequest,
signRequest: signer.signRequest,
createSigner: signer.createSigner,
isSigner: signer.isSigner,
sshKeyToPEM: utils.sshKeyToPEM,
sshKeyFingerprint: utils.fingerprint,
pemToRsaSSHKey: utils.pemToRsaSSHKey,
verify: verify.verifySignature,
verifySignature: verify.verifySignature,
verifyHMAC: verify.verifyHMAC
};
}
});
// node_modules/mime-db/db.json
var require_db = __commonJS({
"node_modules/mime-db/db.json"(exports, module2) {
module2.exports = {
"application/1d-interleaved-parityfec": {
source: "iana"
},
"application/3gpdash-qoe-report+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/3gpp-ims+xml": {
source: "iana",
compressible: true
},
"application/3gpphal+json": {
source: "iana",
compressible: true
},
"application/3gpphalforms+json": {
source: "iana",
compressible: true
},
"application/a2l": {
source: "iana"
},
"application/ace+cbor": {
source: "iana"
},
"application/activemessage": {
source: "iana"
},
"application/activity+json": {
source: "iana",
compressible: true
},
"application/alto-costmap+json": {
source: "iana",
compressible: true
},
"application/alto-costmapfilter+json": {
source: "iana",
compressible: true
},
"application/alto-directory+json": {
source: "iana",
compressible: true
},
"application/alto-endpointcost+json": {
source: "iana",
compressible: true
},
"application/alto-endpointcostparams+json": {
source: "iana",
compressible: true
},
"application/alto-endpointprop+json": {
source: "iana",
compressible: true
},
"application/alto-endpointpropparams+json": {
source: "iana",
compressible: true
},
"application/alto-error+json": {
source: "iana",
compressible: true
},
"application/alto-networkmap+json": {
source: "iana",
compressible: true
},
"application/alto-networkmapfilter+json": {
source: "iana",
compressible: true
},
"application/alto-updatestreamcontrol+json": {
source: "iana",
compressible: true
},
"application/alto-updatestreamparams+json": {
source: "iana",
compressible: true
},
"application/aml": {
source: "iana"
},
"application/andrew-inset": {
source: "iana",
extensions: ["ez"]
},
"application/applefile": {
source: "iana"
},
"application/applixware": {
source: "apache",
extensions: ["aw"]
},
"application/at+jwt": {
source: "iana"
},
"application/atf": {
source: "iana"
},
"application/atfx": {
source: "iana"
},
"application/atom+xml": {
source: "iana",
compressible: true,
extensions: ["atom"]
},
"application/atomcat+xml": {
source: "iana",
compressible: true,
extensions: ["atomcat"]
},
"application/atomdeleted+xml": {
source: "iana",
compressible: true,
extensions: ["atomdeleted"]
},
"application/atomicmail": {
source: "iana"
},
"application/atomsvc+xml": {
source: "iana",
compressible: true,
extensions: ["atomsvc"]
},
"application/atsc-dwd+xml": {
source: "iana",
compressible: true,
extensions: ["dwd"]
},
"application/atsc-dynamic-event-message": {
source: "iana"
},
"application/atsc-held+xml": {
source: "iana",
compressible: true,
extensions: ["held"]
},
"application/atsc-rdt+json": {
source: "iana",
compressible: true
},
"application/atsc-rsat+xml": {
source: "iana",
compressible: true,
extensions: ["rsat"]
},
"application/atxml": {
source: "iana"
},
"application/auth-policy+xml": {
source: "iana",
compressible: true
},
"application/bacnet-xdd+zip": {
source: "iana",
compressible: false
},
"application/batch-smtp": {
source: "iana"
},
"application/bdoc": {
compressible: false,
extensions: ["bdoc"]
},
"application/beep+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/calendar+json": {
source: "iana",
compressible: true
},
"application/calendar+xml": {
source: "iana",
compressible: true,
extensions: ["xcs"]
},
"application/call-completion": {
source: "iana"
},
"application/cals-1840": {
source: "iana"
},
"application/captive+json": {
source: "iana",
compressible: true
},
"application/cbor": {
source: "iana"
},
"application/cbor-seq": {
source: "iana"
},
"application/cccex": {
source: "iana"
},
"application/ccmp+xml": {
source: "iana",
compressible: true
},
"application/ccxml+xml": {
source: "iana",
compressible: true,
extensions: ["ccxml"]
},
"application/cdfx+xml": {
source: "iana",
compressible: true,
extensions: ["cdfx"]
},
"application/cdmi-capability": {
source: "iana",
extensions: ["cdmia"]
},
"application/cdmi-container": {
source: "iana",
extensions: ["cdmic"]
},
"application/cdmi-domain": {
source: "iana",
extensions: ["cdmid"]
},
"application/cdmi-object": {
source: "iana",
extensions: ["cdmio"]
},
"application/cdmi-queue": {
source: "iana",
extensions: ["cdmiq"]
},
"application/cdni": {
source: "iana"
},
"application/cea": {
source: "iana"
},
"application/cea-2018+xml": {
source: "iana",
compressible: true
},
"application/cellml+xml": {
source: "iana",
compressible: true
},
"application/cfw": {
source: "iana"
},
"application/city+json": {
source: "iana",
compressible: true
},
"application/clr": {
source: "iana"
},
"application/clue+xml": {
source: "iana",
compressible: true
},
"application/clue_info+xml": {
source: "iana",
compressible: true
},
"application/cms": {
source: "iana"
},
"application/cnrp+xml": {
source: "iana",
compressible: true
},
"application/coap-group+json": {
source: "iana",
compressible: true
},
"application/coap-payload": {
source: "iana"
},
"application/commonground": {
source: "iana"
},
"application/conference-info+xml": {
source: "iana",
compressible: true
},
"application/cose": {
source: "iana"
},
"application/cose-key": {
source: "iana"
},
"application/cose-key-set": {
source: "iana"
},
"application/cpl+xml": {
source: "iana",
compressible: true,
extensions: ["cpl"]
},
"application/csrattrs": {
source: "iana"
},
"application/csta+xml": {
source: "iana",
compressible: true
},
"application/cstadata+xml": {
source: "iana",
compressible: true
},
"application/csvm+json": {
source: "iana",
compressible: true
},
"application/cu-seeme": {
source: "apache",
extensions: ["cu"]
},
"application/cwt": {
source: "iana"
},
"application/cybercash": {
source: "iana"
},
"application/dart": {
compressible: true
},
"application/dash+xml": {
source: "iana",
compressible: true,
extensions: ["mpd"]
},
"application/dash-patch+xml": {
source: "iana",
compressible: true,
extensions: ["mpp"]
},
"application/dashdelta": {
source: "iana"
},
"application/davmount+xml": {
source: "iana",
compressible: true,
extensions: ["davmount"]
},
"application/dca-rft": {
source: "iana"
},
"application/dcd": {
source: "iana"
},
"application/dec-dx": {
source: "iana"
},
"application/dialog-info+xml": {
source: "iana",
compressible: true
},
"application/dicom": {
source: "iana"
},
"application/dicom+json": {
source: "iana",
compressible: true
},
"application/dicom+xml": {
source: "iana",
compressible: true
},
"application/dii": {
source: "iana"
},
"application/dit": {
source: "iana"
},
"application/dns": {
source: "iana"
},
"application/dns+json": {
source: "iana",
compressible: true
},
"application/dns-message": {
source: "iana"
},
"application/docbook+xml": {
source: "apache",
compressible: true,
extensions: ["dbk"]
},
"application/dots+cbor": {
source: "iana"
},
"application/dskpp+xml": {
source: "iana",
compressible: true
},
"application/dssc+der": {
source: "iana",
extensions: ["dssc"]
},
"application/dssc+xml": {
source: "iana",
compressible: true,
extensions: ["xdssc"]
},
"application/dvcs": {
source: "iana"
},
"application/ecmascript": {
source: "iana",
compressible: true,
extensions: ["es", "ecma"]
},
"application/edi-consent": {
source: "iana"
},
"application/edi-x12": {
source: "iana",
compressible: false
},
"application/edifact": {
source: "iana",
compressible: false
},
"application/efi": {
source: "iana"
},
"application/elm+json": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/elm+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.cap+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/emergencycalldata.comment+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.control+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.deviceinfo+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.ecall.msd": {
source: "iana"
},
"application/emergencycalldata.providerinfo+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.serviceinfo+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.subscriberinfo+xml": {
source: "iana",
compressible: true
},
"application/emergencycalldata.veds+xml": {
source: "iana",
compressible: true
},
"application/emma+xml": {
source: "iana",
compressible: true,
extensions: ["emma"]
},
"application/emotionml+xml": {
source: "iana",
compressible: true,
extensions: ["emotionml"]
},
"application/encaprtp": {
source: "iana"
},
"application/epp+xml": {
source: "iana",
compressible: true
},
"application/epub+zip": {
source: "iana",
compressible: false,
extensions: ["epub"]
},
"application/eshop": {
source: "iana"
},
"application/exi": {
source: "iana",
extensions: ["exi"]
},
"application/expect-ct-report+json": {
source: "iana",
compressible: true
},
"application/express": {
source: "iana",
extensions: ["exp"]
},
"application/fastinfoset": {
source: "iana"
},
"application/fastsoap": {
source: "iana"
},
"application/fdt+xml": {
source: "iana",
compressible: true,
extensions: ["fdt"]
},
"application/fhir+json": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/fhir+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/fido.trusted-apps+json": {
compressible: true
},
"application/fits": {
source: "iana"
},
"application/flexfec": {
source: "iana"
},
"application/font-sfnt": {
source: "iana"
},
"application/font-tdpfr": {
source: "iana",
extensions: ["pfr"]
},
"application/font-woff": {
source: "iana",
compressible: false
},
"application/framework-attributes+xml": {
source: "iana",
compressible: true
},
"application/geo+json": {
source: "iana",
compressible: true,
extensions: ["geojson"]
},
"application/geo+json-seq": {
source: "iana"
},
"application/geopackage+sqlite3": {
source: "iana"
},
"application/geoxacml+xml": {
source: "iana",
compressible: true
},
"application/gltf-buffer": {
source: "iana"
},
"application/gml+xml": {
source: "iana",
compressible: true,
extensions: ["gml"]
},
"application/gpx+xml": {
source: "apache",
compressible: true,
extensions: ["gpx"]
},
"application/gxf": {
source: "apache",
extensions: ["gxf"]
},
"application/gzip": {
source: "iana",
compressible: false,
extensions: ["gz"]
},
"application/h224": {
source: "iana"
},
"application/held+xml": {
source: "iana",
compressible: true
},
"application/hjson": {
extensions: ["hjson"]
},
"application/http": {
source: "iana"
},
"application/hyperstudio": {
source: "iana",
extensions: ["stk"]
},
"application/ibe-key-request+xml": {
source: "iana",
compressible: true
},
"application/ibe-pkg-reply+xml": {
source: "iana",
compressible: true
},
"application/ibe-pp-data": {
source: "iana"
},
"application/iges": {
source: "iana"
},
"application/im-iscomposing+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/index": {
source: "iana"
},
"application/index.cmd": {
source: "iana"
},
"application/index.obj": {
source: "iana"
},
"application/index.response": {
source: "iana"
},
"application/index.vnd": {
source: "iana"
},
"application/inkml+xml": {
source: "iana",
compressible: true,
extensions: ["ink", "inkml"]
},
"application/iotp": {
source: "iana"
},
"application/ipfix": {
source: "iana",
extensions: ["ipfix"]
},
"application/ipp": {
source: "iana"
},
"application/isup": {
source: "iana"
},
"application/its+xml": {
source: "iana",
compressible: true,
extensions: ["its"]
},
"application/java-archive": {
source: "apache",
compressible: false,
extensions: ["jar", "war", "ear"]
},
"application/java-serialized-object": {
source: "apache",
compressible: false,
extensions: ["ser"]
},
"application/java-vm": {
source: "apache",
compressible: false,
extensions: ["class"]
},
"application/javascript": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["js", "mjs"]
},
"application/jf2feed+json": {
source: "iana",
compressible: true
},
"application/jose": {
source: "iana"
},
"application/jose+json": {
source: "iana",
compressible: true
},
"application/jrd+json": {
source: "iana",
compressible: true
},
"application/jscalendar+json": {
source: "iana",
compressible: true
},
"application/json": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["json", "map"]
},
"application/json-patch+json": {
source: "iana",
compressible: true
},
"application/json-seq": {
source: "iana"
},
"application/json5": {
extensions: ["json5"]
},
"application/jsonml+json": {
source: "apache",
compressible: true,
extensions: ["jsonml"]
},
"application/jwk+json": {
source: "iana",
compressible: true
},
"application/jwk-set+json": {
source: "iana",
compressible: true
},
"application/jwt": {
source: "iana"
},
"application/kpml-request+xml": {
source: "iana",
compressible: true
},
"application/kpml-response+xml": {
source: "iana",
compressible: true
},
"application/ld+json": {
source: "iana",
compressible: true,
extensions: ["jsonld"]
},
"application/lgr+xml": {
source: "iana",
compressible: true,
extensions: ["lgr"]
},
"application/link-format": {
source: "iana"
},
"application/load-control+xml": {
source: "iana",
compressible: true
},
"application/lost+xml": {
source: "iana",
compressible: true,
extensions: ["lostxml"]
},
"application/lostsync+xml": {
source: "iana",
compressible: true
},
"application/lpf+zip": {
source: "iana",
compressible: false
},
"application/lxf": {
source: "iana"
},
"application/mac-binhex40": {
source: "iana",
extensions: ["hqx"]
},
"application/mac-compactpro": {
source: "apache",
extensions: ["cpt"]
},
"application/macwriteii": {
source: "iana"
},
"application/mads+xml": {
source: "iana",
compressible: true,
extensions: ["mads"]
},
"application/manifest+json": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["webmanifest"]
},
"application/marc": {
source: "iana",
extensions: ["mrc"]
},
"application/marcxml+xml": {
source: "iana",
compressible: true,
extensions: ["mrcx"]
},
"application/mathematica": {
source: "iana",
extensions: ["ma", "nb", "mb"]
},
"application/mathml+xml": {
source: "iana",
compressible: true,
extensions: ["mathml"]
},
"application/mathml-content+xml": {
source: "iana",
compressible: true
},
"application/mathml-presentation+xml": {
source: "iana",
compressible: true
},
"application/mbms-associated-procedure-description+xml": {
source: "iana",
compressible: true
},
"application/mbms-deregister+xml": {
source: "iana",
compressible: true
},
"application/mbms-envelope+xml": {
source: "iana",
compressible: true
},
"application/mbms-msk+xml": {
source: "iana",
compressible: true
},
"application/mbms-msk-response+xml": {
source: "iana",
compressible: true
},
"application/mbms-protection-description+xml": {
source: "iana",
compressible: true
},
"application/mbms-reception-report+xml": {
source: "iana",
compressible: true
},
"application/mbms-register+xml": {
source: "iana",
compressible: true
},
"application/mbms-register-response+xml": {
source: "iana",
compressible: true
},
"application/mbms-schedule+xml": {
source: "iana",
compressible: true
},
"application/mbms-user-service-description+xml": {
source: "iana",
compressible: true
},
"application/mbox": {
source: "iana",
extensions: ["mbox"]
},
"application/media-policy-dataset+xml": {
source: "iana",
compressible: true,
extensions: ["mpf"]
},
"application/media_control+xml": {
source: "iana",
compressible: true
},
"application/mediaservercontrol+xml": {
source: "iana",
compressible: true,
extensions: ["mscml"]
},
"application/merge-patch+json": {
source: "iana",
compressible: true
},
"application/metalink+xml": {
source: "apache",
compressible: true,
extensions: ["metalink"]
},
"application/metalink4+xml": {
source: "iana",
compressible: true,
extensions: ["meta4"]
},
"application/mets+xml": {
source: "iana",
compressible: true,
extensions: ["mets"]
},
"application/mf4": {
source: "iana"
},
"application/mikey": {
source: "iana"
},
"application/mipc": {
source: "iana"
},
"application/missing-blocks+cbor-seq": {
source: "iana"
},
"application/mmt-aei+xml": {
source: "iana",
compressible: true,
extensions: ["maei"]
},
"application/mmt-usd+xml": {
source: "iana",
compressible: true,
extensions: ["musd"]
},
"application/mods+xml": {
source: "iana",
compressible: true,
extensions: ["mods"]
},
"application/moss-keys": {
source: "iana"
},
"application/moss-signature": {
source: "iana"
},
"application/mosskey-data": {
source: "iana"
},
"application/mosskey-request": {
source: "iana"
},
"application/mp21": {
source: "iana",
extensions: ["m21", "mp21"]
},
"application/mp4": {
source: "iana",
extensions: ["mp4s", "m4p"]
},
"application/mpeg4-generic": {
source: "iana"
},
"application/mpeg4-iod": {
source: "iana"
},
"application/mpeg4-iod-xmt": {
source: "iana"
},
"application/mrb-consumer+xml": {
source: "iana",
compressible: true
},
"application/mrb-publish+xml": {
source: "iana",
compressible: true
},
"application/msc-ivr+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/msc-mixer+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/msword": {
source: "iana",
compressible: false,
extensions: ["doc", "dot"]
},
"application/mud+json": {
source: "iana",
compressible: true
},
"application/multipart-core": {
source: "iana"
},
"application/mxf": {
source: "iana",
extensions: ["mxf"]
},
"application/n-quads": {
source: "iana",
extensions: ["nq"]
},
"application/n-triples": {
source: "iana",
extensions: ["nt"]
},
"application/nasdata": {
source: "iana"
},
"application/news-checkgroups": {
source: "iana",
charset: "US-ASCII"
},
"application/news-groupinfo": {
source: "iana",
charset: "US-ASCII"
},
"application/news-transmission": {
source: "iana"
},
"application/nlsml+xml": {
source: "iana",
compressible: true
},
"application/node": {
source: "iana",
extensions: ["cjs"]
},
"application/nss": {
source: "iana"
},
"application/oauth-authz-req+jwt": {
source: "iana"
},
"application/oblivious-dns-message": {
source: "iana"
},
"application/ocsp-request": {
source: "iana"
},
"application/ocsp-response": {
source: "iana"
},
"application/octet-stream": {
source: "iana",
compressible: false,
extensions: ["bin", "dms", "lrf", "mar", "so", "dist", "distz", "pkg", "bpk", "dump", "elc", "deploy", "exe", "dll", "deb", "dmg", "iso", "img", "msi", "msp", "msm", "buffer"]
},
"application/oda": {
source: "iana",
extensions: ["oda"]
},
"application/odm+xml": {
source: "iana",
compressible: true
},
"application/odx": {
source: "iana"
},
"application/oebps-package+xml": {
source: "iana",
compressible: true,
extensions: ["opf"]
},
"application/ogg": {
source: "iana",
compressible: false,
extensions: ["ogx"]
},
"application/omdoc+xml": {
source: "apache",
compressible: true,
extensions: ["omdoc"]
},
"application/onenote": {
source: "apache",
extensions: ["onetoc", "onetoc2", "onetmp", "onepkg"]
},
"application/opc-nodeset+xml": {
source: "iana",
compressible: true
},
"application/oscore": {
source: "iana"
},
"application/oxps": {
source: "iana",
extensions: ["oxps"]
},
"application/p21": {
source: "iana"
},
"application/p21+zip": {
source: "iana",
compressible: false
},
"application/p2p-overlay+xml": {
source: "iana",
compressible: true,
extensions: ["relo"]
},
"application/parityfec": {
source: "iana"
},
"application/passport": {
source: "iana"
},
"application/patch-ops-error+xml": {
source: "iana",
compressible: true,
extensions: ["xer"]
},
"application/pdf": {
source: "iana",
compressible: false,
extensions: ["pdf"]
},
"application/pdx": {
source: "iana"
},
"application/pem-certificate-chain": {
source: "iana"
},
"application/pgp-encrypted": {
source: "iana",
compressible: false,
extensions: ["pgp"]
},
"application/pgp-keys": {
source: "iana",
extensions: ["asc"]
},
"application/pgp-signature": {
source: "iana",
extensions: ["asc", "sig"]
},
"application/pics-rules": {
source: "apache",
extensions: ["prf"]
},
"application/pidf+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/pidf-diff+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/pkcs10": {
source: "iana",
extensions: ["p10"]
},
"application/pkcs12": {
source: "iana"
},
"application/pkcs7-mime": {
source: "iana",
extensions: ["p7m", "p7c"]
},
"application/pkcs7-signature": {
source: "iana",
extensions: ["p7s"]
},
"application/pkcs8": {
source: "iana",
extensions: ["p8"]
},
"application/pkcs8-encrypted": {
source: "iana"
},
"application/pkix-attr-cert": {
source: "iana",
extensions: ["ac"]
},
"application/pkix-cert": {
source: "iana",
extensions: ["cer"]
},
"application/pkix-crl": {
source: "iana",
extensions: ["crl"]
},
"application/pkix-pkipath": {
source: "iana",
extensions: ["pkipath"]
},
"application/pkixcmp": {
source: "iana",
extensions: ["pki"]
},
"application/pls+xml": {
source: "iana",
compressible: true,
extensions: ["pls"]
},
"application/poc-settings+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/postscript": {
source: "iana",
compressible: true,
extensions: ["ai", "eps", "ps"]
},
"application/ppsp-tracker+json": {
source: "iana",
compressible: true
},
"application/problem+json": {
source: "iana",
compressible: true
},
"application/problem+xml": {
source: "iana",
compressible: true
},
"application/provenance+xml": {
source: "iana",
compressible: true,
extensions: ["provx"]
},
"application/prs.alvestrand.titrax-sheet": {
source: "iana"
},
"application/prs.cww": {
source: "iana",
extensions: ["cww"]
},
"application/prs.cyn": {
source: "iana",
charset: "7-BIT"
},
"application/prs.hpub+zip": {
source: "iana",
compressible: false
},
"application/prs.nprend": {
source: "iana"
},
"application/prs.plucker": {
source: "iana"
},
"application/prs.rdf-xml-crypt": {
source: "iana"
},
"application/prs.xsf+xml": {
source: "iana",
compressible: true
},
"application/pskc+xml": {
source: "iana",
compressible: true,
extensions: ["pskcxml"]
},
"application/pvd+json": {
source: "iana",
compressible: true
},
"application/qsig": {
source: "iana"
},
"application/raml+yaml": {
compressible: true,
extensions: ["raml"]
},
"application/raptorfec": {
source: "iana"
},
"application/rdap+json": {
source: "iana",
compressible: true
},
"application/rdf+xml": {
source: "iana",
compressible: true,
extensions: ["rdf", "owl"]
},
"application/reginfo+xml": {
source: "iana",
compressible: true,
extensions: ["rif"]
},
"application/relax-ng-compact-syntax": {
source: "iana",
extensions: ["rnc"]
},
"application/remote-printing": {
source: "iana"
},
"application/reputon+json": {
source: "iana",
compressible: true
},
"application/resource-lists+xml": {
source: "iana",
compressible: true,
extensions: ["rl"]
},
"application/resource-lists-diff+xml": {
source: "iana",
compressible: true,
extensions: ["rld"]
},
"application/rfc+xml": {
source: "iana",
compressible: true
},
"application/riscos": {
source: "iana"
},
"application/rlmi+xml": {
source: "iana",
compressible: true
},
"application/rls-services+xml": {
source: "iana",
compressible: true,
extensions: ["rs"]
},
"application/route-apd+xml": {
source: "iana",
compressible: true,
extensions: ["rapd"]
},
"application/route-s-tsid+xml": {
source: "iana",
compressible: true,
extensions: ["sls"]
},
"application/route-usd+xml": {
source: "iana",
compressible: true,
extensions: ["rusd"]
},
"application/rpki-ghostbusters": {
source: "iana",
extensions: ["gbr"]
},
"application/rpki-manifest": {
source: "iana",
extensions: ["mft"]
},
"application/rpki-publication": {
source: "iana"
},
"application/rpki-roa": {
source: "iana",
extensions: ["roa"]
},
"application/rpki-updown": {
source: "iana"
},
"application/rsd+xml": {
source: "apache",
compressible: true,
extensions: ["rsd"]
},
"application/rss+xml": {
source: "apache",
compressible: true,
extensions: ["rss"]
},
"application/rtf": {
source: "iana",
compressible: true,
extensions: ["rtf"]
},
"application/rtploopback": {
source: "iana"
},
"application/rtx": {
source: "iana"
},
"application/samlassertion+xml": {
source: "iana",
compressible: true
},
"application/samlmetadata+xml": {
source: "iana",
compressible: true
},
"application/sarif+json": {
source: "iana",
compressible: true
},
"application/sarif-external-properties+json": {
source: "iana",
compressible: true
},
"application/sbe": {
source: "iana"
},
"application/sbml+xml": {
source: "iana",
compressible: true,
extensions: ["sbml"]
},
"application/scaip+xml": {
source: "iana",
compressible: true
},
"application/scim+json": {
source: "iana",
compressible: true
},
"application/scvp-cv-request": {
source: "iana",
extensions: ["scq"]
},
"application/scvp-cv-response": {
source: "iana",
extensions: ["scs"]
},
"application/scvp-vp-request": {
source: "iana",
extensions: ["spq"]
},
"application/scvp-vp-response": {
source: "iana",
extensions: ["spp"]
},
"application/sdp": {
source: "iana",
extensions: ["sdp"]
},
"application/secevent+jwt": {
source: "iana"
},
"application/senml+cbor": {
source: "iana"
},
"application/senml+json": {
source: "iana",
compressible: true
},
"application/senml+xml": {
source: "iana",
compressible: true,
extensions: ["senmlx"]
},
"application/senml-etch+cbor": {
source: "iana"
},
"application/senml-etch+json": {
source: "iana",
compressible: true
},
"application/senml-exi": {
source: "iana"
},
"application/sensml+cbor": {
source: "iana"
},
"application/sensml+json": {
source: "iana",
compressible: true
},
"application/sensml+xml": {
source: "iana",
compressible: true,
extensions: ["sensmlx"]
},
"application/sensml-exi": {
source: "iana"
},
"application/sep+xml": {
source: "iana",
compressible: true
},
"application/sep-exi": {
source: "iana"
},
"application/session-info": {
source: "iana"
},
"application/set-payment": {
source: "iana"
},
"application/set-payment-initiation": {
source: "iana",
extensions: ["setpay"]
},
"application/set-registration": {
source: "iana"
},
"application/set-registration-initiation": {
source: "iana",
extensions: ["setreg"]
},
"application/sgml": {
source: "iana"
},
"application/sgml-open-catalog": {
source: "iana"
},
"application/shf+xml": {
source: "iana",
compressible: true,
extensions: ["shf"]
},
"application/sieve": {
source: "iana",
extensions: ["siv", "sieve"]
},
"application/simple-filter+xml": {
source: "iana",
compressible: true
},
"application/simple-message-summary": {
source: "iana"
},
"application/simplesymbolcontainer": {
source: "iana"
},
"application/sipc": {
source: "iana"
},
"application/slate": {
source: "iana"
},
"application/smil": {
source: "iana"
},
"application/smil+xml": {
source: "iana",
compressible: true,
extensions: ["smi", "smil"]
},
"application/smpte336m": {
source: "iana"
},
"application/soap+fastinfoset": {
source: "iana"
},
"application/soap+xml": {
source: "iana",
compressible: true
},
"application/sparql-query": {
source: "iana",
extensions: ["rq"]
},
"application/sparql-results+xml": {
source: "iana",
compressible: true,
extensions: ["srx"]
},
"application/spdx+json": {
source: "iana",
compressible: true
},
"application/spirits-event+xml": {
source: "iana",
compressible: true
},
"application/sql": {
source: "iana"
},
"application/srgs": {
source: "iana",
extensions: ["gram"]
},
"application/srgs+xml": {
source: "iana",
compressible: true,
extensions: ["grxml"]
},
"application/sru+xml": {
source: "iana",
compressible: true,
extensions: ["sru"]
},
"application/ssdl+xml": {
source: "apache",
compressible: true,
extensions: ["ssdl"]
},
"application/ssml+xml": {
source: "iana",
compressible: true,
extensions: ["ssml"]
},
"application/stix+json": {
source: "iana",
compressible: true
},
"application/swid+xml": {
source: "iana",
compressible: true,
extensions: ["swidtag"]
},
"application/tamp-apex-update": {
source: "iana"
},
"application/tamp-apex-update-confirm": {
source: "iana"
},
"application/tamp-community-update": {
source: "iana"
},
"application/tamp-community-update-confirm": {
source: "iana"
},
"application/tamp-error": {
source: "iana"
},
"application/tamp-sequence-adjust": {
source: "iana"
},
"application/tamp-sequence-adjust-confirm": {
source: "iana"
},
"application/tamp-status-query": {
source: "iana"
},
"application/tamp-status-response": {
source: "iana"
},
"application/tamp-update": {
source: "iana"
},
"application/tamp-update-confirm": {
source: "iana"
},
"application/tar": {
compressible: true
},
"application/taxii+json": {
source: "iana",
compressible: true
},
"application/td+json": {
source: "iana",
compressible: true
},
"application/tei+xml": {
source: "iana",
compressible: true,
extensions: ["tei", "teicorpus"]
},
"application/tetra_isi": {
source: "iana"
},
"application/thraud+xml": {
source: "iana",
compressible: true,
extensions: ["tfi"]
},
"application/timestamp-query": {
source: "iana"
},
"application/timestamp-reply": {
source: "iana"
},
"application/timestamped-data": {
source: "iana",
extensions: ["tsd"]
},
"application/tlsrpt+gzip": {
source: "iana"
},
"application/tlsrpt+json": {
source: "iana",
compressible: true
},
"application/tnauthlist": {
source: "iana"
},
"application/token-introspection+jwt": {
source: "iana"
},
"application/toml": {
compressible: true,
extensions: ["toml"]
},
"application/trickle-ice-sdpfrag": {
source: "iana"
},
"application/trig": {
source: "iana",
extensions: ["trig"]
},
"application/ttml+xml": {
source: "iana",
compressible: true,
extensions: ["ttml"]
},
"application/tve-trigger": {
source: "iana"
},
"application/tzif": {
source: "iana"
},
"application/tzif-leap": {
source: "iana"
},
"application/ubjson": {
compressible: false,
extensions: ["ubj"]
},
"application/ulpfec": {
source: "iana"
},
"application/urc-grpsheet+xml": {
source: "iana",
compressible: true
},
"application/urc-ressheet+xml": {
source: "iana",
compressible: true,
extensions: ["rsheet"]
},
"application/urc-targetdesc+xml": {
source: "iana",
compressible: true,
extensions: ["td"]
},
"application/urc-uisocketdesc+xml": {
source: "iana",
compressible: true
},
"application/vcard+json": {
source: "iana",
compressible: true
},
"application/vcard+xml": {
source: "iana",
compressible: true
},
"application/vemmi": {
source: "iana"
},
"application/vividence.scriptfile": {
source: "apache"
},
"application/vnd.1000minds.decision-model+xml": {
source: "iana",
compressible: true,
extensions: ["1km"]
},
"application/vnd.3gpp-prose+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp-prose-pc3ch+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp-v2x-local-service-information": {
source: "iana"
},
"application/vnd.3gpp.5gnas": {
source: "iana"
},
"application/vnd.3gpp.access-transfer-events+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.bsf+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.gmop+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.gtpc": {
source: "iana"
},
"application/vnd.3gpp.interworking-data": {
source: "iana"
},
"application/vnd.3gpp.lpp": {
source: "iana"
},
"application/vnd.3gpp.mc-signalling-ear": {
source: "iana"
},
"application/vnd.3gpp.mcdata-affiliation-command+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcdata-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcdata-payload": {
source: "iana"
},
"application/vnd.3gpp.mcdata-service-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcdata-signalling": {
source: "iana"
},
"application/vnd.3gpp.mcdata-ue-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcdata-user-profile+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-affiliation-command+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-floor-request+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-location-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-mbms-usage-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-service-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-signed+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-ue-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-ue-init-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcptt-user-profile+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-affiliation-command+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-affiliation-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-location-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-mbms-usage-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-service-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-transmission-request+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-ue-config+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mcvideo-user-profile+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.mid-call+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.ngap": {
source: "iana"
},
"application/vnd.3gpp.pfcp": {
source: "iana"
},
"application/vnd.3gpp.pic-bw-large": {
source: "iana",
extensions: ["plb"]
},
"application/vnd.3gpp.pic-bw-small": {
source: "iana",
extensions: ["psb"]
},
"application/vnd.3gpp.pic-bw-var": {
source: "iana",
extensions: ["pvb"]
},
"application/vnd.3gpp.s1ap": {
source: "iana"
},
"application/vnd.3gpp.sms": {
source: "iana"
},
"application/vnd.3gpp.sms+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.srvcc-ext+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.srvcc-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.state-and-event-info+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp.ussd+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp2.bcmcsinfo+xml": {
source: "iana",
compressible: true
},
"application/vnd.3gpp2.sms": {
source: "iana"
},
"application/vnd.3gpp2.tcap": {
source: "iana",
extensions: ["tcap"]
},
"application/vnd.3lightssoftware.imagescal": {
source: "iana"
},
"application/vnd.3m.post-it-notes": {
source: "iana",
extensions: ["pwn"]
},
"application/vnd.accpac.simply.aso": {
source: "iana",
extensions: ["aso"]
},
"application/vnd.accpac.simply.imp": {
source: "iana",
extensions: ["imp"]
},
"application/vnd.acucobol": {
source: "iana",
extensions: ["acu"]
},
"application/vnd.acucorp": {
source: "iana",
extensions: ["atc", "acutc"]
},
"application/vnd.adobe.air-application-installer-package+zip": {
source: "apache",
compressible: false,
extensions: ["air"]
},
"application/vnd.adobe.flash.movie": {
source: "iana"
},
"application/vnd.adobe.formscentral.fcdt": {
source: "iana",
extensions: ["fcdt"]
},
"application/vnd.adobe.fxp": {
source: "iana",
extensions: ["fxp", "fxpl"]
},
"application/vnd.adobe.partial-upload": {
source: "iana"
},
"application/vnd.adobe.xdp+xml": {
source: "iana",
compressible: true,
extensions: ["xdp"]
},
"application/vnd.adobe.xfdf": {
source: "iana",
extensions: ["xfdf"]
},
"application/vnd.aether.imp": {
source: "iana"
},
"application/vnd.afpc.afplinedata": {
source: "iana"
},
"application/vnd.afpc.afplinedata-pagedef": {
source: "iana"
},
"application/vnd.afpc.cmoca-cmresource": {
source: "iana"
},
"application/vnd.afpc.foca-charset": {
source: "iana"
},
"application/vnd.afpc.foca-codedfont": {
source: "iana"
},
"application/vnd.afpc.foca-codepage": {
source: "iana"
},
"application/vnd.afpc.modca": {
source: "iana"
},
"application/vnd.afpc.modca-cmtable": {
source: "iana"
},
"application/vnd.afpc.modca-formdef": {
source: "iana"
},
"application/vnd.afpc.modca-mediummap": {
source: "iana"
},
"application/vnd.afpc.modca-objectcontainer": {
source: "iana"
},
"application/vnd.afpc.modca-overlay": {
source: "iana"
},
"application/vnd.afpc.modca-pagesegment": {
source: "iana"
},
"application/vnd.age": {
source: "iana",
extensions: ["age"]
},
"application/vnd.ah-barcode": {
source: "iana"
},
"application/vnd.ahead.space": {
source: "iana",
extensions: ["ahead"]
},
"application/vnd.airzip.filesecure.azf": {
source: "iana",
extensions: ["azf"]
},
"application/vnd.airzip.filesecure.azs": {
source: "iana",
extensions: ["azs"]
},
"application/vnd.amadeus+json": {
source: "iana",
compressible: true
},
"application/vnd.amazon.ebook": {
source: "apache",
extensions: ["azw"]
},
"application/vnd.amazon.mobi8-ebook": {
source: "iana"
},
"application/vnd.americandynamics.acc": {
source: "iana",
extensions: ["acc"]
},
"application/vnd.amiga.ami": {
source: "iana",
extensions: ["ami"]
},
"application/vnd.amundsen.maze+xml": {
source: "iana",
compressible: true
},
"application/vnd.android.ota": {
source: "iana"
},
"application/vnd.android.package-archive": {
source: "apache",
compressible: false,
extensions: ["apk"]
},
"application/vnd.anki": {
source: "iana"
},
"application/vnd.anser-web-certificate-issue-initiation": {
source: "iana",
extensions: ["cii"]
},
"application/vnd.anser-web-funds-transfer-initiation": {
source: "apache",
extensions: ["fti"]
},
"application/vnd.antix.game-component": {
source: "iana",
extensions: ["atx"]
},
"application/vnd.apache.arrow.file": {
source: "iana"
},
"application/vnd.apache.arrow.stream": {
source: "iana"
},
"application/vnd.apache.thrift.binary": {
source: "iana"
},
"application/vnd.apache.thrift.compact": {
source: "iana"
},
"application/vnd.apache.thrift.json": {
source: "iana"
},
"application/vnd.api+json": {
source: "iana",
compressible: true
},
"application/vnd.aplextor.warrp+json": {
source: "iana",
compressible: true
},
"application/vnd.apothekende.reservation+json": {
source: "iana",
compressible: true
},
"application/vnd.apple.installer+xml": {
source: "iana",
compressible: true,
extensions: ["mpkg"]
},
"application/vnd.apple.keynote": {
source: "iana",
extensions: ["key"]
},
"application/vnd.apple.mpegurl": {
source: "iana",
extensions: ["m3u8"]
},
"application/vnd.apple.numbers": {
source: "iana",
extensions: ["numbers"]
},
"application/vnd.apple.pages": {
source: "iana",
extensions: ["pages"]
},
"application/vnd.apple.pkpass": {
compressible: false,
extensions: ["pkpass"]
},
"application/vnd.arastra.swi": {
source: "iana"
},
"application/vnd.aristanetworks.swi": {
source: "iana",
extensions: ["swi"]
},
"application/vnd.artisan+json": {
source: "iana",
compressible: true
},
"application/vnd.artsquare": {
source: "iana"
},
"application/vnd.astraea-software.iota": {
source: "iana",
extensions: ["iota"]
},
"application/vnd.audiograph": {
source: "iana",
extensions: ["aep"]
},
"application/vnd.autopackage": {
source: "iana"
},
"application/vnd.avalon+json": {
source: "iana",
compressible: true
},
"application/vnd.avistar+xml": {
source: "iana",
compressible: true
},
"application/vnd.balsamiq.bmml+xml": {
source: "iana",
compressible: true,
extensions: ["bmml"]
},
"application/vnd.balsamiq.bmpr": {
source: "iana"
},
"application/vnd.banana-accounting": {
source: "iana"
},
"application/vnd.bbf.usp.error": {
source: "iana"
},
"application/vnd.bbf.usp.msg": {
source: "iana"
},
"application/vnd.bbf.usp.msg+json": {
source: "iana",
compressible: true
},
"application/vnd.bekitzur-stech+json": {
source: "iana",
compressible: true
},
"application/vnd.bint.med-content": {
source: "iana"
},
"application/vnd.biopax.rdf+xml": {
source: "iana",
compressible: true
},
"application/vnd.blink-idb-value-wrapper": {
source: "iana"
},
"application/vnd.blueice.multipass": {
source: "iana",
extensions: ["mpm"]
},
"application/vnd.bluetooth.ep.oob": {
source: "iana"
},
"application/vnd.bluetooth.le.oob": {
source: "iana"
},
"application/vnd.bmi": {
source: "iana",
extensions: ["bmi"]
},
"application/vnd.bpf": {
source: "iana"
},
"application/vnd.bpf3": {
source: "iana"
},
"application/vnd.businessobjects": {
source: "iana",
extensions: ["rep"]
},
"application/vnd.byu.uapi+json": {
source: "iana",
compressible: true
},
"application/vnd.cab-jscript": {
source: "iana"
},
"application/vnd.canon-cpdl": {
source: "iana"
},
"application/vnd.canon-lips": {
source: "iana"
},
"application/vnd.capasystems-pg+json": {
source: "iana",
compressible: true
},
"application/vnd.cendio.thinlinc.clientconf": {
source: "iana"
},
"application/vnd.century-systems.tcp_stream": {
source: "iana"
},
"application/vnd.chemdraw+xml": {
source: "iana",
compressible: true,
extensions: ["cdxml"]
},
"application/vnd.chess-pgn": {
source: "iana"
},
"application/vnd.chipnuts.karaoke-mmd": {
source: "iana",
extensions: ["mmd"]
},
"application/vnd.ciedi": {
source: "iana"
},
"application/vnd.cinderella": {
source: "iana",
extensions: ["cdy"]
},
"application/vnd.cirpack.isdn-ext": {
source: "iana"
},
"application/vnd.citationstyles.style+xml": {
source: "iana",
compressible: true,
extensions: ["csl"]
},
"application/vnd.claymore": {
source: "iana",
extensions: ["cla"]
},
"application/vnd.cloanto.rp9": {
source: "iana",
extensions: ["rp9"]
},
"application/vnd.clonk.c4group": {
source: "iana",
extensions: ["c4g", "c4d", "c4f", "c4p", "c4u"]
},
"application/vnd.cluetrust.cartomobile-config": {
source: "iana",
extensions: ["c11amc"]
},
"application/vnd.cluetrust.cartomobile-config-pkg": {
source: "iana",
extensions: ["c11amz"]
},
"application/vnd.coffeescript": {
source: "iana"
},
"application/vnd.collabio.xodocuments.document": {
source: "iana"
},
"application/vnd.collabio.xodocuments.document-template": {
source: "iana"
},
"application/vnd.collabio.xodocuments.presentation": {
source: "iana"
},
"application/vnd.collabio.xodocuments.presentation-template": {
source: "iana"
},
"application/vnd.collabio.xodocuments.spreadsheet": {
source: "iana"
},
"application/vnd.collabio.xodocuments.spreadsheet-template": {
source: "iana"
},
"application/vnd.collection+json": {
source: "iana",
compressible: true
},
"application/vnd.collection.doc+json": {
source: "iana",
compressible: true
},
"application/vnd.collection.next+json": {
source: "iana",
compressible: true
},
"application/vnd.comicbook+zip": {
source: "iana",
compressible: false
},
"application/vnd.comicbook-rar": {
source: "iana"
},
"application/vnd.commerce-battelle": {
source: "iana"
},
"application/vnd.commonspace": {
source: "iana",
extensions: ["csp"]
},
"application/vnd.contact.cmsg": {
source: "iana",
extensions: ["cdbcmsg"]
},
"application/vnd.coreos.ignition+json": {
source: "iana",
compressible: true
},
"application/vnd.cosmocaller": {
source: "iana",
extensions: ["cmc"]
},
"application/vnd.crick.clicker": {
source: "iana",
extensions: ["clkx"]
},
"application/vnd.crick.clicker.keyboard": {
source: "iana",
extensions: ["clkk"]
},
"application/vnd.crick.clicker.palette": {
source: "iana",
extensions: ["clkp"]
},
"application/vnd.crick.clicker.template": {
source: "iana",
extensions: ["clkt"]
},
"application/vnd.crick.clicker.wordbank": {
source: "iana",
extensions: ["clkw"]
},
"application/vnd.criticaltools.wbs+xml": {
source: "iana",
compressible: true,
extensions: ["wbs"]
},
"application/vnd.cryptii.pipe+json": {
source: "iana",
compressible: true
},
"application/vnd.crypto-shade-file": {
source: "iana"
},
"application/vnd.cryptomator.encrypted": {
source: "iana"
},
"application/vnd.cryptomator.vault": {
source: "iana"
},
"application/vnd.ctc-posml": {
source: "iana",
extensions: ["pml"]
},
"application/vnd.ctct.ws+xml": {
source: "iana",
compressible: true
},
"application/vnd.cups-pdf": {
source: "iana"
},
"application/vnd.cups-postscript": {
source: "iana"
},
"application/vnd.cups-ppd": {
source: "iana",
extensions: ["ppd"]
},
"application/vnd.cups-raster": {
source: "iana"
},
"application/vnd.cups-raw": {
source: "iana"
},
"application/vnd.curl": {
source: "iana"
},
"application/vnd.curl.car": {
source: "apache",
extensions: ["car"]
},
"application/vnd.curl.pcurl": {
source: "apache",
extensions: ["pcurl"]
},
"application/vnd.cyan.dean.root+xml": {
source: "iana",
compressible: true
},
"application/vnd.cybank": {
source: "iana"
},
"application/vnd.cyclonedx+json": {
source: "iana",
compressible: true
},
"application/vnd.cyclonedx+xml": {
source: "iana",
compressible: true
},
"application/vnd.d2l.coursepackage1p0+zip": {
source: "iana",
compressible: false
},
"application/vnd.d3m-dataset": {
source: "iana"
},
"application/vnd.d3m-problem": {
source: "iana"
},
"application/vnd.dart": {
source: "iana",
compressible: true,
extensions: ["dart"]
},
"application/vnd.data-vision.rdz": {
source: "iana",
extensions: ["rdz"]
},
"application/vnd.datapackage+json": {
source: "iana",
compressible: true
},
"application/vnd.dataresource+json": {
source: "iana",
compressible: true
},
"application/vnd.dbf": {
source: "iana",
extensions: ["dbf"]
},
"application/vnd.debian.binary-package": {
source: "iana"
},
"application/vnd.dece.data": {
source: "iana",
extensions: ["uvf", "uvvf", "uvd", "uvvd"]
},
"application/vnd.dece.ttml+xml": {
source: "iana",
compressible: true,
extensions: ["uvt", "uvvt"]
},
"application/vnd.dece.unspecified": {
source: "iana",
extensions: ["uvx", "uvvx"]
},
"application/vnd.dece.zip": {
source: "iana",
extensions: ["uvz", "uvvz"]
},
"application/vnd.denovo.fcselayout-link": {
source: "iana",
extensions: ["fe_launch"]
},
"application/vnd.desmume.movie": {
source: "iana"
},
"application/vnd.dir-bi.plate-dl-nosuffix": {
source: "iana"
},
"application/vnd.dm.delegation+xml": {
source: "iana",
compressible: true
},
"application/vnd.dna": {
source: "iana",
extensions: ["dna"]
},
"application/vnd.document+json": {
source: "iana",
compressible: true
},
"application/vnd.dolby.mlp": {
source: "apache",
extensions: ["mlp"]
},
"application/vnd.dolby.mobile.1": {
source: "iana"
},
"application/vnd.dolby.mobile.2": {
source: "iana"
},
"application/vnd.doremir.scorecloud-binary-document": {
source: "iana"
},
"application/vnd.dpgraph": {
source: "iana",
extensions: ["dpg"]
},
"application/vnd.dreamfactory": {
source: "iana",
extensions: ["dfac"]
},
"application/vnd.drive+json": {
source: "iana",
compressible: true
},
"application/vnd.ds-keypoint": {
source: "apache",
extensions: ["kpxx"]
},
"application/vnd.dtg.local": {
source: "iana"
},
"application/vnd.dtg.local.flash": {
source: "iana"
},
"application/vnd.dtg.local.html": {
source: "iana"
},
"application/vnd.dvb.ait": {
source: "iana",
extensions: ["ait"]
},
"application/vnd.dvb.dvbisl+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.dvbj": {
source: "iana"
},
"application/vnd.dvb.esgcontainer": {
source: "iana"
},
"application/vnd.dvb.ipdcdftnotifaccess": {
source: "iana"
},
"application/vnd.dvb.ipdcesgaccess": {
source: "iana"
},
"application/vnd.dvb.ipdcesgaccess2": {
source: "iana"
},
"application/vnd.dvb.ipdcesgpdd": {
source: "iana"
},
"application/vnd.dvb.ipdcroaming": {
source: "iana"
},
"application/vnd.dvb.iptv.alfec-base": {
source: "iana"
},
"application/vnd.dvb.iptv.alfec-enhancement": {
source: "iana"
},
"application/vnd.dvb.notif-aggregate-root+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.notif-container+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.notif-generic+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.notif-ia-msglist+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.notif-ia-registration-request+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.notif-ia-registration-response+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.notif-init+xml": {
source: "iana",
compressible: true
},
"application/vnd.dvb.pfr": {
source: "iana"
},
"application/vnd.dvb.service": {
source: "iana",
extensions: ["svc"]
},
"application/vnd.dxr": {
source: "iana"
},
"application/vnd.dynageo": {
source: "iana",
extensions: ["geo"]
},
"application/vnd.dzr": {
source: "iana"
},
"application/vnd.easykaraoke.cdgdownload": {
source: "iana"
},
"application/vnd.ecdis-update": {
source: "iana"
},
"application/vnd.ecip.rlp": {
source: "iana"
},
"application/vnd.eclipse.ditto+json": {
source: "iana",
compressible: true
},
"application/vnd.ecowin.chart": {
source: "iana",
extensions: ["mag"]
},
"application/vnd.ecowin.filerequest": {
source: "iana"
},
"application/vnd.ecowin.fileupdate": {
source: "iana"
},
"application/vnd.ecowin.series": {
source: "iana"
},
"application/vnd.ecowin.seriesrequest": {
source: "iana"
},
"application/vnd.ecowin.seriesupdate": {
source: "iana"
},
"application/vnd.efi.img": {
source: "iana"
},
"application/vnd.efi.iso": {
source: "iana"
},
"application/vnd.emclient.accessrequest+xml": {
source: "iana",
compressible: true
},
"application/vnd.enliven": {
source: "iana",
extensions: ["nml"]
},
"application/vnd.enphase.envoy": {
source: "iana"
},
"application/vnd.eprints.data+xml": {
source: "iana",
compressible: true
},
"application/vnd.epson.esf": {
source: "iana",
extensions: ["esf"]
},
"application/vnd.epson.msf": {
source: "iana",
extensions: ["msf"]
},
"application/vnd.epson.quickanime": {
source: "iana",
extensions: ["qam"]
},
"application/vnd.epson.salt": {
source: "iana",
extensions: ["slt"]
},
"application/vnd.epson.ssf": {
source: "iana",
extensions: ["ssf"]
},
"application/vnd.ericsson.quickcall": {
source: "iana"
},
"application/vnd.espass-espass+zip": {
source: "iana",
compressible: false
},
"application/vnd.eszigno3+xml": {
source: "iana",
compressible: true,
extensions: ["es3", "et3"]
},
"application/vnd.etsi.aoc+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.asic-e+zip": {
source: "iana",
compressible: false
},
"application/vnd.etsi.asic-s+zip": {
source: "iana",
compressible: false
},
"application/vnd.etsi.cug+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvcommand+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvdiscovery+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvprofile+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvsad-bc+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvsad-cod+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvsad-npvr+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvservice+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvsync+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.iptvueprofile+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.mcid+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.mheg5": {
source: "iana"
},
"application/vnd.etsi.overload-control-policy-dataset+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.pstn+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.sci+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.simservs+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.timestamp-token": {
source: "iana"
},
"application/vnd.etsi.tsl+xml": {
source: "iana",
compressible: true
},
"application/vnd.etsi.tsl.der": {
source: "iana"
},
"application/vnd.eu.kasparian.car+json": {
source: "iana",
compressible: true
},
"application/vnd.eudora.data": {
source: "iana"
},
"application/vnd.evolv.ecig.profile": {
source: "iana"
},
"application/vnd.evolv.ecig.settings": {
source: "iana"
},
"application/vnd.evolv.ecig.theme": {
source: "iana"
},
"application/vnd.exstream-empower+zip": {
source: "iana",
compressible: false
},
"application/vnd.exstream-package": {
source: "iana"
},
"application/vnd.ezpix-album": {
source: "iana",
extensions: ["ez2"]
},
"application/vnd.ezpix-package": {
source: "iana",
extensions: ["ez3"]
},
"application/vnd.f-secure.mobile": {
source: "iana"
},
"application/vnd.familysearch.gedcom+zip": {
source: "iana",
compressible: false
},
"application/vnd.fastcopy-disk-image": {
source: "iana"
},
"application/vnd.fdf": {
source: "iana",
extensions: ["fdf"]
},
"application/vnd.fdsn.mseed": {
source: "iana",
extensions: ["mseed"]
},
"application/vnd.fdsn.seed": {
source: "iana",
extensions: ["seed", "dataless"]
},
"application/vnd.ffsns": {
source: "iana"
},
"application/vnd.ficlab.flb+zip": {
source: "iana",
compressible: false
},
"application/vnd.filmit.zfc": {
source: "iana"
},
"application/vnd.fints": {
source: "iana"
},
"application/vnd.firemonkeys.cloudcell": {
source: "iana"
},
"application/vnd.flographit": {
source: "iana",
extensions: ["gph"]
},
"application/vnd.fluxtime.clip": {
source: "iana",
extensions: ["ftc"]
},
"application/vnd.font-fontforge-sfd": {
source: "iana"
},
"application/vnd.framemaker": {
source: "iana",
extensions: ["fm", "frame", "maker", "book"]
},
"application/vnd.frogans.fnc": {
source: "iana",
extensions: ["fnc"]
},
"application/vnd.frogans.ltf": {
source: "iana",
extensions: ["ltf"]
},
"application/vnd.fsc.weblaunch": {
source: "iana",
extensions: ["fsc"]
},
"application/vnd.fujifilm.fb.docuworks": {
source: "iana"
},
"application/vnd.fujifilm.fb.docuworks.binder": {
source: "iana"
},
"application/vnd.fujifilm.fb.docuworks.container": {
source: "iana"
},
"application/vnd.fujifilm.fb.jfi+xml": {
source: "iana",
compressible: true
},
"application/vnd.fujitsu.oasys": {
source: "iana",
extensions: ["oas"]
},
"application/vnd.fujitsu.oasys2": {
source: "iana",
extensions: ["oa2"]
},
"application/vnd.fujitsu.oasys3": {
source: "iana",
extensions: ["oa3"]
},
"application/vnd.fujitsu.oasysgp": {
source: "iana",
extensions: ["fg5"]
},
"application/vnd.fujitsu.oasysprs": {
source: "iana",
extensions: ["bh2"]
},
"application/vnd.fujixerox.art-ex": {
source: "iana"
},
"application/vnd.fujixerox.art4": {
source: "iana"
},
"application/vnd.fujixerox.ddd": {
source: "iana",
extensions: ["ddd"]
},
"application/vnd.fujixerox.docuworks": {
source: "iana",
extensions: ["xdw"]
},
"application/vnd.fujixerox.docuworks.binder": {
source: "iana",
extensions: ["xbd"]
},
"application/vnd.fujixerox.docuworks.container": {
source: "iana"
},
"application/vnd.fujixerox.hbpl": {
source: "iana"
},
"application/vnd.fut-misnet": {
source: "iana"
},
"application/vnd.futoin+cbor": {
source: "iana"
},
"application/vnd.futoin+json": {
source: "iana",
compressible: true
},
"application/vnd.fuzzysheet": {
source: "iana",
extensions: ["fzs"]
},
"application/vnd.genomatix.tuxedo": {
source: "iana",
extensions: ["txd"]
},
"application/vnd.gentics.grd+json": {
source: "iana",
compressible: true
},
"application/vnd.geo+json": {
source: "iana",
compressible: true
},
"application/vnd.geocube+xml": {
source: "iana",
compressible: true
},
"application/vnd.geogebra.file": {
source: "iana",
extensions: ["ggb"]
},
"application/vnd.geogebra.slides": {
source: "iana"
},
"application/vnd.geogebra.tool": {
source: "iana",
extensions: ["ggt"]
},
"application/vnd.geometry-explorer": {
source: "iana",
extensions: ["gex", "gre"]
},
"application/vnd.geonext": {
source: "iana",
extensions: ["gxt"]
},
"application/vnd.geoplan": {
source: "iana",
extensions: ["g2w"]
},
"application/vnd.geospace": {
source: "iana",
extensions: ["g3w"]
},
"application/vnd.gerber": {
source: "iana"
},
"application/vnd.globalplatform.card-content-mgt": {
source: "iana"
},
"application/vnd.globalplatform.card-content-mgt-response": {
source: "iana"
},
"application/vnd.gmx": {
source: "iana",
extensions: ["gmx"]
},
"application/vnd.google-apps.document": {
compressible: false,
extensions: ["gdoc"]
},
"application/vnd.google-apps.presentation": {
compressible: false,
extensions: ["gslides"]
},
"application/vnd.google-apps.spreadsheet": {
compressible: false,
extensions: ["gsheet"]
},
"application/vnd.google-earth.kml+xml": {
source: "iana",
compressible: true,
extensions: ["kml"]
},
"application/vnd.google-earth.kmz": {
source: "iana",
compressible: false,
extensions: ["kmz"]
},
"application/vnd.gov.sk.e-form+xml": {
source: "iana",
compressible: true
},
"application/vnd.gov.sk.e-form+zip": {
source: "iana",
compressible: false
},
"application/vnd.gov.sk.xmldatacontainer+xml": {
source: "iana",
compressible: true
},
"application/vnd.grafeq": {
source: "iana",
extensions: ["gqf", "gqs"]
},
"application/vnd.gridmp": {
source: "iana"
},
"application/vnd.groove-account": {
source: "iana",
extensions: ["gac"]
},
"application/vnd.groove-help": {
source: "iana",
extensions: ["ghf"]
},
"application/vnd.groove-identity-message": {
source: "iana",
extensions: ["gim"]
},
"application/vnd.groove-injector": {
source: "iana",
extensions: ["grv"]
},
"application/vnd.groove-tool-message": {
source: "iana",
extensions: ["gtm"]
},
"application/vnd.groove-tool-template": {
source: "iana",
extensions: ["tpl"]
},
"application/vnd.groove-vcard": {
source: "iana",
extensions: ["vcg"]
},
"application/vnd.hal+json": {
source: "iana",
compressible: true
},
"application/vnd.hal+xml": {
source: "iana",
compressible: true,
extensions: ["hal"]
},
"application/vnd.handheld-entertainment+xml": {
source: "iana",
compressible: true,
extensions: ["zmm"]
},
"application/vnd.hbci": {
source: "iana",
extensions: ["hbci"]
},
"application/vnd.hc+json": {
source: "iana",
compressible: true
},
"application/vnd.hcl-bireports": {
source: "iana"
},
"application/vnd.hdt": {
source: "iana"
},
"application/vnd.heroku+json": {
source: "iana",
compressible: true
},
"application/vnd.hhe.lesson-player": {
source: "iana",
extensions: ["les"]
},
"application/vnd.hl7cda+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/vnd.hl7v2+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/vnd.hp-hpgl": {
source: "iana",
extensions: ["hpgl"]
},
"application/vnd.hp-hpid": {
source: "iana",
extensions: ["hpid"]
},
"application/vnd.hp-hps": {
source: "iana",
extensions: ["hps"]
},
"application/vnd.hp-jlyt": {
source: "iana",
extensions: ["jlt"]
},
"application/vnd.hp-pcl": {
source: "iana",
extensions: ["pcl"]
},
"application/vnd.hp-pclxl": {
source: "iana",
extensions: ["pclxl"]
},
"application/vnd.httphone": {
source: "iana"
},
"application/vnd.hydrostatix.sof-data": {
source: "iana",
extensions: ["sfd-hdstx"]
},
"application/vnd.hyper+json": {
source: "iana",
compressible: true
},
"application/vnd.hyper-item+json": {
source: "iana",
compressible: true
},
"application/vnd.hyperdrive+json": {
source: "iana",
compressible: true
},
"application/vnd.hzn-3d-crossword": {
source: "iana"
},
"application/vnd.ibm.afplinedata": {
source: "iana"
},
"application/vnd.ibm.electronic-media": {
source: "iana"
},
"application/vnd.ibm.minipay": {
source: "iana",
extensions: ["mpy"]
},
"application/vnd.ibm.modcap": {
source: "iana",
extensions: ["afp", "listafp", "list3820"]
},
"application/vnd.ibm.rights-management": {
source: "iana",
extensions: ["irm"]
},
"application/vnd.ibm.secure-container": {
source: "iana",
extensions: ["sc"]
},
"application/vnd.iccprofile": {
source: "iana",
extensions: ["icc", "icm"]
},
"application/vnd.ieee.1905": {
source: "iana"
},
"application/vnd.igloader": {
source: "iana",
extensions: ["igl"]
},
"application/vnd.imagemeter.folder+zip": {
source: "iana",
compressible: false
},
"application/vnd.imagemeter.image+zip": {
source: "iana",
compressible: false
},
"application/vnd.immervision-ivp": {
source: "iana",
extensions: ["ivp"]
},
"application/vnd.immervision-ivu": {
source: "iana",
extensions: ["ivu"]
},
"application/vnd.ims.imsccv1p1": {
source: "iana"
},
"application/vnd.ims.imsccv1p2": {
source: "iana"
},
"application/vnd.ims.imsccv1p3": {
source: "iana"
},
"application/vnd.ims.lis.v2.result+json": {
source: "iana",
compressible: true
},
"application/vnd.ims.lti.v2.toolconsumerprofile+json": {
source: "iana",
compressible: true
},
"application/vnd.ims.lti.v2.toolproxy+json": {
source: "iana",
compressible: true
},
"application/vnd.ims.lti.v2.toolproxy.id+json": {
source: "iana",
compressible: true
},
"application/vnd.ims.lti.v2.toolsettings+json": {
source: "iana",
compressible: true
},
"application/vnd.ims.lti.v2.toolsettings.simple+json": {
source: "iana",
compressible: true
},
"application/vnd.informedcontrol.rms+xml": {
source: "iana",
compressible: true
},
"application/vnd.informix-visionary": {
source: "iana"
},
"application/vnd.infotech.project": {
source: "iana"
},
"application/vnd.infotech.project+xml": {
source: "iana",
compressible: true
},
"application/vnd.innopath.wamp.notification": {
source: "iana"
},
"application/vnd.insors.igm": {
source: "iana",
extensions: ["igm"]
},
"application/vnd.intercon.formnet": {
source: "iana",
extensions: ["xpw", "xpx"]
},
"application/vnd.intergeo": {
source: "iana",
extensions: ["i2g"]
},
"application/vnd.intertrust.digibox": {
source: "iana"
},
"application/vnd.intertrust.nncp": {
source: "iana"
},
"application/vnd.intu.qbo": {
source: "iana",
extensions: ["qbo"]
},
"application/vnd.intu.qfx": {
source: "iana",
extensions: ["qfx"]
},
"application/vnd.iptc.g2.catalogitem+xml": {
source: "iana",
compressible: true
},
"application/vnd.iptc.g2.conceptitem+xml": {
source: "iana",
compressible: true
},
"application/vnd.iptc.g2.knowledgeitem+xml": {
source: "iana",
compressible: true
},
"application/vnd.iptc.g2.newsitem+xml": {
source: "iana",
compressible: true
},
"application/vnd.iptc.g2.newsmessage+xml": {
source: "iana",
compressible: true
},
"application/vnd.iptc.g2.packageitem+xml": {
source: "iana",
compressible: true
},
"application/vnd.iptc.g2.planningitem+xml": {
source: "iana",
compressible: true
},
"application/vnd.ipunplugged.rcprofile": {
source: "iana",
extensions: ["rcprofile"]
},
"application/vnd.irepository.package+xml": {
source: "iana",
compressible: true,
extensions: ["irp"]
},
"application/vnd.is-xpr": {
source: "iana",
extensions: ["xpr"]
},
"application/vnd.isac.fcs": {
source: "iana",
extensions: ["fcs"]
},
"application/vnd.iso11783-10+zip": {
source: "iana",
compressible: false
},
"application/vnd.jam": {
source: "iana",
extensions: ["jam"]
},
"application/vnd.japannet-directory-service": {
source: "iana"
},
"application/vnd.japannet-jpnstore-wakeup": {
source: "iana"
},
"application/vnd.japannet-payment-wakeup": {
source: "iana"
},
"application/vnd.japannet-registration": {
source: "iana"
},
"application/vnd.japannet-registration-wakeup": {
source: "iana"
},
"application/vnd.japannet-setstore-wakeup": {
source: "iana"
},
"application/vnd.japannet-verification": {
source: "iana"
},
"application/vnd.japannet-verification-wakeup": {
source: "iana"
},
"application/vnd.jcp.javame.midlet-rms": {
source: "iana",
extensions: ["rms"]
},
"application/vnd.jisp": {
source: "iana",
extensions: ["jisp"]
},
"application/vnd.joost.joda-archive": {
source: "iana",
extensions: ["joda"]
},
"application/vnd.jsk.isdn-ngn": {
source: "iana"
},
"application/vnd.kahootz": {
source: "iana",
extensions: ["ktz", "ktr"]
},
"application/vnd.kde.karbon": {
source: "iana",
extensions: ["karbon"]
},
"application/vnd.kde.kchart": {
source: "iana",
extensions: ["chrt"]
},
"application/vnd.kde.kformula": {
source: "iana",
extensions: ["kfo"]
},
"application/vnd.kde.kivio": {
source: "iana",
extensions: ["flw"]
},
"application/vnd.kde.kontour": {
source: "iana",
extensions: ["kon"]
},
"application/vnd.kde.kpresenter": {
source: "iana",
extensions: ["kpr", "kpt"]
},
"application/vnd.kde.kspread": {
source: "iana",
extensions: ["ksp"]
},
"application/vnd.kde.kword": {
source: "iana",
extensions: ["kwd", "kwt"]
},
"application/vnd.kenameaapp": {
source: "iana",
extensions: ["htke"]
},
"application/vnd.kidspiration": {
source: "iana",
extensions: ["kia"]
},
"application/vnd.kinar": {
source: "iana",
extensions: ["kne", "knp"]
},
"application/vnd.koan": {
source: "iana",
extensions: ["skp", "skd", "skt", "skm"]
},
"application/vnd.kodak-descriptor": {
source: "iana",
extensions: ["sse"]
},
"application/vnd.las": {
source: "iana"
},
"application/vnd.las.las+json": {
source: "iana",
compressible: true
},
"application/vnd.las.las+xml": {
source: "iana",
compressible: true,
extensions: ["lasxml"]
},
"application/vnd.laszip": {
source: "iana"
},
"application/vnd.leap+json": {
source: "iana",
compressible: true
},
"application/vnd.liberty-request+xml": {
source: "iana",
compressible: true
},
"application/vnd.llamagraphics.life-balance.desktop": {
source: "iana",
extensions: ["lbd"]
},
"application/vnd.llamagraphics.life-balance.exchange+xml": {
source: "iana",
compressible: true,
extensions: ["lbe"]
},
"application/vnd.logipipe.circuit+zip": {
source: "iana",
compressible: false
},
"application/vnd.loom": {
source: "iana"
},
"application/vnd.lotus-1-2-3": {
source: "iana",
extensions: ["123"]
},
"application/vnd.lotus-approach": {
source: "iana",
extensions: ["apr"]
},
"application/vnd.lotus-freelance": {
source: "iana",
extensions: ["pre"]
},
"application/vnd.lotus-notes": {
source: "iana",
extensions: ["nsf"]
},
"application/vnd.lotus-organizer": {
source: "iana",
extensions: ["org"]
},
"application/vnd.lotus-screencam": {
source: "iana",
extensions: ["scm"]
},
"application/vnd.lotus-wordpro": {
source: "iana",
extensions: ["lwp"]
},
"application/vnd.macports.portpkg": {
source: "iana",
extensions: ["portpkg"]
},
"application/vnd.mapbox-vector-tile": {
source: "iana",
extensions: ["mvt"]
},
"application/vnd.marlin.drm.actiontoken+xml": {
source: "iana",
compressible: true
},
"application/vnd.marlin.drm.conftoken+xml": {
source: "iana",
compressible: true
},
"application/vnd.marlin.drm.license+xml": {
source: "iana",
compressible: true
},
"application/vnd.marlin.drm.mdcf": {
source: "iana"
},
"application/vnd.mason+json": {
source: "iana",
compressible: true
},
"application/vnd.maxar.archive.3tz+zip": {
source: "iana",
compressible: false
},
"application/vnd.maxmind.maxmind-db": {
source: "iana"
},
"application/vnd.mcd": {
source: "iana",
extensions: ["mcd"]
},
"application/vnd.medcalcdata": {
source: "iana",
extensions: ["mc1"]
},
"application/vnd.mediastation.cdkey": {
source: "iana",
extensions: ["cdkey"]
},
"application/vnd.meridian-slingshot": {
source: "iana"
},
"application/vnd.mfer": {
source: "iana",
extensions: ["mwf"]
},
"application/vnd.mfmp": {
source: "iana",
extensions: ["mfm"]
},
"application/vnd.micro+json": {
source: "iana",
compressible: true
},
"application/vnd.micrografx.flo": {
source: "iana",
extensions: ["flo"]
},
"application/vnd.micrografx.igx": {
source: "iana",
extensions: ["igx"]
},
"application/vnd.microsoft.portable-executable": {
source: "iana"
},
"application/vnd.microsoft.windows.thumbnail-cache": {
source: "iana"
},
"application/vnd.miele+json": {
source: "iana",
compressible: true
},
"application/vnd.mif": {
source: "iana",
extensions: ["mif"]
},
"application/vnd.minisoft-hp3000-save": {
source: "iana"
},
"application/vnd.mitsubishi.misty-guard.trustweb": {
source: "iana"
},
"application/vnd.mobius.daf": {
source: "iana",
extensions: ["daf"]
},
"application/vnd.mobius.dis": {
source: "iana",
extensions: ["dis"]
},
"application/vnd.mobius.mbk": {
source: "iana",
extensions: ["mbk"]
},
"application/vnd.mobius.mqy": {
source: "iana",
extensions: ["mqy"]
},
"application/vnd.mobius.msl": {
source: "iana",
extensions: ["msl"]
},
"application/vnd.mobius.plc": {
source: "iana",
extensions: ["plc"]
},
"application/vnd.mobius.txf": {
source: "iana",
extensions: ["txf"]
},
"application/vnd.mophun.application": {
source: "iana",
extensions: ["mpn"]
},
"application/vnd.mophun.certificate": {
source: "iana",
extensions: ["mpc"]
},
"application/vnd.motorola.flexsuite": {
source: "iana"
},
"application/vnd.motorola.flexsuite.adsi": {
source: "iana"
},
"application/vnd.motorola.flexsuite.fis": {
source: "iana"
},
"application/vnd.motorola.flexsuite.gotap": {
source: "iana"
},
"application/vnd.motorola.flexsuite.kmr": {
source: "iana"
},
"application/vnd.motorola.flexsuite.ttc": {
source: "iana"
},
"application/vnd.motorola.flexsuite.wem": {
source: "iana"
},
"application/vnd.motorola.iprm": {
source: "iana"
},
"application/vnd.mozilla.xul+xml": {
source: "iana",
compressible: true,
extensions: ["xul"]
},
"application/vnd.ms-3mfdocument": {
source: "iana"
},
"application/vnd.ms-artgalry": {
source: "iana",
extensions: ["cil"]
},
"application/vnd.ms-asf": {
source: "iana"
},
"application/vnd.ms-cab-compressed": {
source: "iana",
extensions: ["cab"]
},
"application/vnd.ms-color.iccprofile": {
source: "apache"
},
"application/vnd.ms-excel": {
source: "iana",
compressible: false,
extensions: ["xls", "xlm", "xla", "xlc", "xlt", "xlw"]
},
"application/vnd.ms-excel.addin.macroenabled.12": {
source: "iana",
extensions: ["xlam"]
},
"application/vnd.ms-excel.sheet.binary.macroenabled.12": {
source: "iana",
extensions: ["xlsb"]
},
"application/vnd.ms-excel.sheet.macroenabled.12": {
source: "iana",
extensions: ["xlsm"]
},
"application/vnd.ms-excel.template.macroenabled.12": {
source: "iana",
extensions: ["xltm"]
},
"application/vnd.ms-fontobject": {
source: "iana",
compressible: true,
extensions: ["eot"]
},
"application/vnd.ms-htmlhelp": {
source: "iana",
extensions: ["chm"]
},
"application/vnd.ms-ims": {
source: "iana",
extensions: ["ims"]
},
"application/vnd.ms-lrm": {
source: "iana",
extensions: ["lrm"]
},
"application/vnd.ms-office.activex+xml": {
source: "iana",
compressible: true
},
"application/vnd.ms-officetheme": {
source: "iana",
extensions: ["thmx"]
},
"application/vnd.ms-opentype": {
source: "apache",
compressible: true
},
"application/vnd.ms-outlook": {
compressible: false,
extensions: ["msg"]
},
"application/vnd.ms-package.obfuscated-opentype": {
source: "apache"
},
"application/vnd.ms-pki.seccat": {
source: "apache",
extensions: ["cat"]
},
"application/vnd.ms-pki.stl": {
source: "apache",
extensions: ["stl"]
},
"application/vnd.ms-playready.initiator+xml": {
source: "iana",
compressible: true
},
"application/vnd.ms-powerpoint": {
source: "iana",
compressible: false,
extensions: ["ppt", "pps", "pot"]
},
"application/vnd.ms-powerpoint.addin.macroenabled.12": {
source: "iana",
extensions: ["ppam"]
},
"application/vnd.ms-powerpoint.presentation.macroenabled.12": {
source: "iana",
extensions: ["pptm"]
},
"application/vnd.ms-powerpoint.slide.macroenabled.12": {
source: "iana",
extensions: ["sldm"]
},
"application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
source: "iana",
extensions: ["ppsm"]
},
"application/vnd.ms-powerpoint.template.macroenabled.12": {
source: "iana",
extensions: ["potm"]
},
"application/vnd.ms-printdevicecapabilities+xml": {
source: "iana",
compressible: true
},
"application/vnd.ms-printing.printticket+xml": {
source: "apache",
compressible: true
},
"application/vnd.ms-printschematicket+xml": {
source: "iana",
compressible: true
},
"application/vnd.ms-project": {
source: "iana",
extensions: ["mpp", "mpt"]
},
"application/vnd.ms-tnef": {
source: "iana"
},
"application/vnd.ms-windows.devicepairing": {
source: "iana"
},
"application/vnd.ms-windows.nwprinting.oob": {
source: "iana"
},
"application/vnd.ms-windows.printerpairing": {
source: "iana"
},
"application/vnd.ms-windows.wsd.oob": {
source: "iana"
},
"application/vnd.ms-wmdrm.lic-chlg-req": {
source: "iana"
},
"application/vnd.ms-wmdrm.lic-resp": {
source: "iana"
},
"application/vnd.ms-wmdrm.meter-chlg-req": {
source: "iana"
},
"application/vnd.ms-wmdrm.meter-resp": {
source: "iana"
},
"application/vnd.ms-word.document.macroenabled.12": {
source: "iana",
extensions: ["docm"]
},
"application/vnd.ms-word.template.macroenabled.12": {
source: "iana",
extensions: ["dotm"]
},
"application/vnd.ms-works": {
source: "iana",
extensions: ["wps", "wks", "wcm", "wdb"]
},
"application/vnd.ms-wpl": {
source: "iana",
extensions: ["wpl"]
},
"application/vnd.ms-xpsdocument": {
source: "iana",
compressible: false,
extensions: ["xps"]
},
"application/vnd.msa-disk-image": {
source: "iana"
},
"application/vnd.mseq": {
source: "iana",
extensions: ["mseq"]
},
"application/vnd.msign": {
source: "iana"
},
"application/vnd.multiad.creator": {
source: "iana"
},
"application/vnd.multiad.creator.cif": {
source: "iana"
},
"application/vnd.music-niff": {
source: "iana"
},
"application/vnd.musician": {
source: "iana",
extensions: ["mus"]
},
"application/vnd.muvee.style": {
source: "iana",
extensions: ["msty"]
},
"application/vnd.mynfc": {
source: "iana",
extensions: ["taglet"]
},
"application/vnd.nacamar.ybrid+json": {
source: "iana",
compressible: true
},
"application/vnd.ncd.control": {
source: "iana"
},
"application/vnd.ncd.reference": {
source: "iana"
},
"application/vnd.nearst.inv+json": {
source: "iana",
compressible: true
},
"application/vnd.nebumind.line": {
source: "iana"
},
"application/vnd.nervana": {
source: "iana"
},
"application/vnd.netfpx": {
source: "iana"
},
"application/vnd.neurolanguage.nlu": {
source: "iana",
extensions: ["nlu"]
},
"application/vnd.nimn": {
source: "iana"
},
"application/vnd.nintendo.nitro.rom": {
source: "iana"
},
"application/vnd.nintendo.snes.rom": {
source: "iana"
},
"application/vnd.nitf": {
source: "iana",
extensions: ["ntf", "nitf"]
},
"application/vnd.noblenet-directory": {
source: "iana",
extensions: ["nnd"]
},
"application/vnd.noblenet-sealer": {
source: "iana",
extensions: ["nns"]
},
"application/vnd.noblenet-web": {
source: "iana",
extensions: ["nnw"]
},
"application/vnd.nokia.catalogs": {
source: "iana"
},
"application/vnd.nokia.conml+wbxml": {
source: "iana"
},
"application/vnd.nokia.conml+xml": {
source: "iana",
compressible: true
},
"application/vnd.nokia.iptv.config+xml": {
source: "iana",
compressible: true
},
"application/vnd.nokia.isds-radio-presets": {
source: "iana"
},
"application/vnd.nokia.landmark+wbxml": {
source: "iana"
},
"application/vnd.nokia.landmark+xml": {
source: "iana",
compressible: true
},
"application/vnd.nokia.landmarkcollection+xml": {
source: "iana",
compressible: true
},
"application/vnd.nokia.n-gage.ac+xml": {
source: "iana",
compressible: true,
extensions: ["ac"]
},
"application/vnd.nokia.n-gage.data": {
source: "iana",
extensions: ["ngdat"]
},
"application/vnd.nokia.n-gage.symbian.install": {
source: "iana",
extensions: ["n-gage"]
},
"application/vnd.nokia.ncd": {
source: "iana"
},
"application/vnd.nokia.pcd+wbxml": {
source: "iana"
},
"application/vnd.nokia.pcd+xml": {
source: "iana",
compressible: true
},
"application/vnd.nokia.radio-preset": {
source: "iana",
extensions: ["rpst"]
},
"application/vnd.nokia.radio-presets": {
source: "iana",
extensions: ["rpss"]
},
"application/vnd.novadigm.edm": {
source: "iana",
extensions: ["edm"]
},
"application/vnd.novadigm.edx": {
source: "iana",
extensions: ["edx"]
},
"application/vnd.novadigm.ext": {
source: "iana",
extensions: ["ext"]
},
"application/vnd.ntt-local.content-share": {
source: "iana"
},
"application/vnd.ntt-local.file-transfer": {
source: "iana"
},
"application/vnd.ntt-local.ogw_remote-access": {
source: "iana"
},
"application/vnd.ntt-local.sip-ta_remote": {
source: "iana"
},
"application/vnd.ntt-local.sip-ta_tcp_stream": {
source: "iana"
},
"application/vnd.oasis.opendocument.chart": {
source: "iana",
extensions: ["odc"]
},
"application/vnd.oasis.opendocument.chart-template": {
source: "iana",
extensions: ["otc"]
},
"application/vnd.oasis.opendocument.database": {
source: "iana",
extensions: ["odb"]
},
"application/vnd.oasis.opendocument.formula": {
source: "iana",
extensions: ["odf"]
},
"application/vnd.oasis.opendocument.formula-template": {
source: "iana",
extensions: ["odft"]
},
"application/vnd.oasis.opendocument.graphics": {
source: "iana",
compressible: false,
extensions: ["odg"]
},
"application/vnd.oasis.opendocument.graphics-template": {
source: "iana",
extensions: ["otg"]
},
"application/vnd.oasis.opendocument.image": {
source: "iana",
extensions: ["odi"]
},
"application/vnd.oasis.opendocument.image-template": {
source: "iana",
extensions: ["oti"]
},
"application/vnd.oasis.opendocument.presentation": {
source: "iana",
compressible: false,
extensions: ["odp"]
},
"application/vnd.oasis.opendocument.presentation-template": {
source: "iana",
extensions: ["otp"]
},
"application/vnd.oasis.opendocument.spreadsheet": {
source: "iana",
compressible: false,
extensions: ["ods"]
},
"application/vnd.oasis.opendocument.spreadsheet-template": {
source: "iana",
extensions: ["ots"]
},
"application/vnd.oasis.opendocument.text": {
source: "iana",
compressible: false,
extensions: ["odt"]
},
"application/vnd.oasis.opendocument.text-master": {
source: "iana",
extensions: ["odm"]
},
"application/vnd.oasis.opendocument.text-template": {
source: "iana",
extensions: ["ott"]
},
"application/vnd.oasis.opendocument.text-web": {
source: "iana",
extensions: ["oth"]
},
"application/vnd.obn": {
source: "iana"
},
"application/vnd.ocf+cbor": {
source: "iana"
},
"application/vnd.oci.image.manifest.v1+json": {
source: "iana",
compressible: true
},
"application/vnd.oftn.l10n+json": {
source: "iana",
compressible: true
},
"application/vnd.oipf.contentaccessdownload+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.contentaccessstreaming+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.cspg-hexbinary": {
source: "iana"
},
"application/vnd.oipf.dae.svg+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.dae.xhtml+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.mippvcontrolmessage+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.pae.gem": {
source: "iana"
},
"application/vnd.oipf.spdiscovery+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.spdlist+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.ueprofile+xml": {
source: "iana",
compressible: true
},
"application/vnd.oipf.userprofile+xml": {
source: "iana",
compressible: true
},
"application/vnd.olpc-sugar": {
source: "iana",
extensions: ["xo"]
},
"application/vnd.oma-scws-config": {
source: "iana"
},
"application/vnd.oma-scws-http-request": {
source: "iana"
},
"application/vnd.oma-scws-http-response": {
source: "iana"
},
"application/vnd.oma.bcast.associated-procedure-parameter+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.drm-trigger+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.imd+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.ltkm": {
source: "iana"
},
"application/vnd.oma.bcast.notification+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.provisioningtrigger": {
source: "iana"
},
"application/vnd.oma.bcast.sgboot": {
source: "iana"
},
"application/vnd.oma.bcast.sgdd+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.sgdu": {
source: "iana"
},
"application/vnd.oma.bcast.simple-symbol-container": {
source: "iana"
},
"application/vnd.oma.bcast.smartcard-trigger+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.sprov+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.bcast.stkm": {
source: "iana"
},
"application/vnd.oma.cab-address-book+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.cab-feature-handler+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.cab-pcc+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.cab-subs-invite+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.cab-user-prefs+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.dcd": {
source: "iana"
},
"application/vnd.oma.dcdc": {
source: "iana"
},
"application/vnd.oma.dd2+xml": {
source: "iana",
compressible: true,
extensions: ["dd2"]
},
"application/vnd.oma.drm.risd+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.group-usage-list+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.lwm2m+cbor": {
source: "iana"
},
"application/vnd.oma.lwm2m+json": {
source: "iana",
compressible: true
},
"application/vnd.oma.lwm2m+tlv": {
source: "iana"
},
"application/vnd.oma.pal+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.poc.detailed-progress-report+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.poc.final-report+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.poc.groups+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.poc.invocation-descriptor+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.poc.optimized-progress-report+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.push": {
source: "iana"
},
"application/vnd.oma.scidm.messages+xml": {
source: "iana",
compressible: true
},
"application/vnd.oma.xcap-directory+xml": {
source: "iana",
compressible: true
},
"application/vnd.omads-email+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/vnd.omads-file+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/vnd.omads-folder+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/vnd.omaloc-supl-init": {
source: "iana"
},
"application/vnd.onepager": {
source: "iana"
},
"application/vnd.onepagertamp": {
source: "iana"
},
"application/vnd.onepagertamx": {
source: "iana"
},
"application/vnd.onepagertat": {
source: "iana"
},
"application/vnd.onepagertatp": {
source: "iana"
},
"application/vnd.onepagertatx": {
source: "iana"
},
"application/vnd.openblox.game+xml": {
source: "iana",
compressible: true,
extensions: ["obgx"]
},
"application/vnd.openblox.game-binary": {
source: "iana"
},
"application/vnd.openeye.oeb": {
source: "iana"
},
"application/vnd.openofficeorg.extension": {
source: "apache",
extensions: ["oxt"]
},
"application/vnd.openstreetmap.data+xml": {
source: "iana",
compressible: true,
extensions: ["osm"]
},
"application/vnd.opentimestamps.ots": {
source: "iana"
},
"application/vnd.openxmlformats-officedocument.custom-properties+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawing+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.extended-properties+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.presentation": {
source: "iana",
compressible: false,
extensions: ["pptx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.slide": {
source: "iana",
extensions: ["sldx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
source: "iana",
extensions: ["ppsx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.template": {
source: "iana",
extensions: ["potx"]
},
"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
source: "iana",
compressible: false,
extensions: ["xlsx"]
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
source: "iana",
extensions: ["xltx"]
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.theme+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.themeoverride+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.vmldrawing": {
source: "iana"
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
source: "iana",
compressible: false,
extensions: ["docx"]
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
source: "iana",
extensions: ["dotx"]
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-package.core-properties+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
source: "iana",
compressible: true
},
"application/vnd.openxmlformats-package.relationships+xml": {
source: "iana",
compressible: true
},
"application/vnd.oracle.resource+json": {
source: "iana",
compressible: true
},
"application/vnd.orange.indata": {
source: "iana"
},
"application/vnd.osa.netdeploy": {
source: "iana"
},
"application/vnd.osgeo.mapguide.package": {
source: "iana",
extensions: ["mgp"]
},
"application/vnd.osgi.bundle": {
source: "iana"
},
"application/vnd.osgi.dp": {
source: "iana",
extensions: ["dp"]
},
"application/vnd.osgi.subsystem": {
source: "iana",
extensions: ["esa"]
},
"application/vnd.otps.ct-kip+xml": {
source: "iana",
compressible: true
},
"application/vnd.oxli.countgraph": {
source: "iana"
},
"application/vnd.pagerduty+json": {
source: "iana",
compressible: true
},
"application/vnd.palm": {
source: "iana",
extensions: ["pdb", "pqa", "oprc"]
},
"application/vnd.panoply": {
source: "iana"
},
"application/vnd.paos.xml": {
source: "iana"
},
"application/vnd.patentdive": {
source: "iana"
},
"application/vnd.patientecommsdoc": {
source: "iana"
},
"application/vnd.pawaafile": {
source: "iana",
extensions: ["paw"]
},
"application/vnd.pcos": {
source: "iana"
},
"application/vnd.pg.format": {
source: "iana",
extensions: ["str"]
},
"application/vnd.pg.osasli": {
source: "iana",
extensions: ["ei6"]
},
"application/vnd.piaccess.application-licence": {
source: "iana"
},
"application/vnd.picsel": {
source: "iana",
extensions: ["efif"]
},
"application/vnd.pmi.widget": {
source: "iana",
extensions: ["wg"]
},
"application/vnd.poc.group-advertisement+xml": {
source: "iana",
compressible: true
},
"application/vnd.pocketlearn": {
source: "iana",
extensions: ["plf"]
},
"application/vnd.powerbuilder6": {
source: "iana",
extensions: ["pbd"]
},
"application/vnd.powerbuilder6-s": {
source: "iana"
},
"application/vnd.powerbuilder7": {
source: "iana"
},
"application/vnd.powerbuilder7-s": {
source: "iana"
},
"application/vnd.powerbuilder75": {
source: "iana"
},
"application/vnd.powerbuilder75-s": {
source: "iana"
},
"application/vnd.preminet": {
source: "iana"
},
"application/vnd.previewsystems.box": {
source: "iana",
extensions: ["box"]
},
"application/vnd.proteus.magazine": {
source: "iana",
extensions: ["mgz"]
},
"application/vnd.psfs": {
source: "iana"
},
"application/vnd.publishare-delta-tree": {
source: "iana",
extensions: ["qps"]
},
"application/vnd.pvi.ptid1": {
source: "iana",
extensions: ["ptid"]
},
"application/vnd.pwg-multiplexed": {
source: "iana"
},
"application/vnd.pwg-xhtml-print+xml": {
source: "iana",
compressible: true
},
"application/vnd.qualcomm.brew-app-res": {
source: "iana"
},
"application/vnd.quarantainenet": {
source: "iana"
},
"application/vnd.quark.quarkxpress": {
source: "iana",
extensions: ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"]
},
"application/vnd.quobject-quoxdocument": {
source: "iana"
},
"application/vnd.radisys.moml+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-audit+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-audit-conf+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-audit-conn+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-audit-dialog+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-audit-stream+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-conf+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog-base+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog-fax-detect+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog-group+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog-speech+xml": {
source: "iana",
compressible: true
},
"application/vnd.radisys.msml-dialog-transform+xml": {
source: "iana",
compressible: true
},
"application/vnd.rainstor.data": {
source: "iana"
},
"application/vnd.rapid": {
source: "iana"
},
"application/vnd.rar": {
source: "iana",
extensions: ["rar"]
},
"application/vnd.realvnc.bed": {
source: "iana",
extensions: ["bed"]
},
"application/vnd.recordare.musicxml": {
source: "iana",
extensions: ["mxl"]
},
"application/vnd.recordare.musicxml+xml": {
source: "iana",
compressible: true,
extensions: ["musicxml"]
},
"application/vnd.renlearn.rlprint": {
source: "iana"
},
"application/vnd.resilient.logic": {
source: "iana"
},
"application/vnd.restful+json": {
source: "iana",
compressible: true
},
"application/vnd.rig.cryptonote": {
source: "iana",
extensions: ["cryptonote"]
},
"application/vnd.rim.cod": {
source: "apache",
extensions: ["cod"]
},
"application/vnd.rn-realmedia": {
source: "apache",
extensions: ["rm"]
},
"application/vnd.rn-realmedia-vbr": {
source: "apache",
extensions: ["rmvb"]
},
"application/vnd.route66.link66+xml": {
source: "iana",
compressible: true,
extensions: ["link66"]
},
"application/vnd.rs-274x": {
source: "iana"
},
"application/vnd.ruckus.download": {
source: "iana"
},
"application/vnd.s3sms": {
source: "iana"
},
"application/vnd.sailingtracker.track": {
source: "iana",
extensions: ["st"]
},
"application/vnd.sar": {
source: "iana"
},
"application/vnd.sbm.cid": {
source: "iana"
},
"application/vnd.sbm.mid2": {
source: "iana"
},
"application/vnd.scribus": {
source: "iana"
},
"application/vnd.sealed.3df": {
source: "iana"
},
"application/vnd.sealed.csf": {
source: "iana"
},
"application/vnd.sealed.doc": {
source: "iana"
},
"application/vnd.sealed.eml": {
source: "iana"
},
"application/vnd.sealed.mht": {
source: "iana"
},
"application/vnd.sealed.net": {
source: "iana"
},
"application/vnd.sealed.ppt": {
source: "iana"
},
"application/vnd.sealed.tiff": {
source: "iana"
},
"application/vnd.sealed.xls": {
source: "iana"
},
"application/vnd.sealedmedia.softseal.html": {
source: "iana"
},
"application/vnd.sealedmedia.softseal.pdf": {
source: "iana"
},
"application/vnd.seemail": {
source: "iana",
extensions: ["see"]
},
"application/vnd.seis+json": {
source: "iana",
compressible: true
},
"application/vnd.sema": {
source: "iana",
extensions: ["sema"]
},
"application/vnd.semd": {
source: "iana",
extensions: ["semd"]
},
"application/vnd.semf": {
source: "iana",
extensions: ["semf"]
},
"application/vnd.shade-save-file": {
source: "iana"
},
"application/vnd.shana.informed.formdata": {
source: "iana",
extensions: ["ifm"]
},
"application/vnd.shana.informed.formtemplate": {
source: "iana",
extensions: ["itp"]
},
"application/vnd.shana.informed.interchange": {
source: "iana",
extensions: ["iif"]
},
"application/vnd.shana.informed.package": {
source: "iana",
extensions: ["ipk"]
},
"application/vnd.shootproof+json": {
source: "iana",
compressible: true
},
"application/vnd.shopkick+json": {
source: "iana",
compressible: true
},
"application/vnd.shp": {
source: "iana"
},
"application/vnd.shx": {
source: "iana"
},
"application/vnd.sigrok.session": {
source: "iana"
},
"application/vnd.simtech-mindmapper": {
source: "iana",
extensions: ["twd", "twds"]
},
"application/vnd.siren+json": {
source: "iana",
compressible: true
},
"application/vnd.smaf": {
source: "iana",
extensions: ["mmf"]
},
"application/vnd.smart.notebook": {
source: "iana"
},
"application/vnd.smart.teacher": {
source: "iana",
extensions: ["teacher"]
},
"application/vnd.snesdev-page-table": {
source: "iana"
},
"application/vnd.software602.filler.form+xml": {
source: "iana",
compressible: true,
extensions: ["fo"]
},
"application/vnd.software602.filler.form-xml-zip": {
source: "iana"
},
"application/vnd.solent.sdkm+xml": {
source: "iana",
compressible: true,
extensions: ["sdkm", "sdkd"]
},
"application/vnd.spotfire.dxp": {
source: "iana",
extensions: ["dxp"]
},
"application/vnd.spotfire.sfs": {
source: "iana",
extensions: ["sfs"]
},
"application/vnd.sqlite3": {
source: "iana"
},
"application/vnd.sss-cod": {
source: "iana"
},
"application/vnd.sss-dtf": {
source: "iana"
},
"application/vnd.sss-ntf": {
source: "iana"
},
"application/vnd.stardivision.calc": {
source: "apache",
extensions: ["sdc"]
},
"application/vnd.stardivision.draw": {
source: "apache",
extensions: ["sda"]
},
"application/vnd.stardivision.impress": {
source: "apache",
extensions: ["sdd"]
},
"application/vnd.stardivision.math": {
source: "apache",
extensions: ["smf"]
},
"application/vnd.stardivision.writer": {
source: "apache",
extensions: ["sdw", "vor"]
},
"application/vnd.stardivision.writer-global": {
source: "apache",
extensions: ["sgl"]
},
"application/vnd.stepmania.package": {
source: "iana",
extensions: ["smzip"]
},
"application/vnd.stepmania.stepchart": {
source: "iana",
extensions: ["sm"]
},
"application/vnd.street-stream": {
source: "iana"
},
"application/vnd.sun.wadl+xml": {
source: "iana",
compressible: true,
extensions: ["wadl"]
},
"application/vnd.sun.xml.calc": {
source: "apache",
extensions: ["sxc"]
},
"application/vnd.sun.xml.calc.template": {
source: "apache",
extensions: ["stc"]
},
"application/vnd.sun.xml.draw": {
source: "apache",
extensions: ["sxd"]
},
"application/vnd.sun.xml.draw.template": {
source: "apache",
extensions: ["std"]
},
"application/vnd.sun.xml.impress": {
source: "apache",
extensions: ["sxi"]
},
"application/vnd.sun.xml.impress.template": {
source: "apache",
extensions: ["sti"]
},
"application/vnd.sun.xml.math": {
source: "apache",
extensions: ["sxm"]
},
"application/vnd.sun.xml.writer": {
source: "apache",
extensions: ["sxw"]
},
"application/vnd.sun.xml.writer.global": {
source: "apache",
extensions: ["sxg"]
},
"application/vnd.sun.xml.writer.template": {
source: "apache",
extensions: ["stw"]
},
"application/vnd.sus-calendar": {
source: "iana",
extensions: ["sus", "susp"]
},
"application/vnd.svd": {
source: "iana",
extensions: ["svd"]
},
"application/vnd.swiftview-ics": {
source: "iana"
},
"application/vnd.sycle+xml": {
source: "iana",
compressible: true
},
"application/vnd.syft+json": {
source: "iana",
compressible: true
},
"application/vnd.symbian.install": {
source: "apache",
extensions: ["sis", "sisx"]
},
"application/vnd.syncml+xml": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["xsm"]
},
"application/vnd.syncml.dm+wbxml": {
source: "iana",
charset: "UTF-8",
extensions: ["bdm"]
},
"application/vnd.syncml.dm+xml": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["xdm"]
},
"application/vnd.syncml.dm.notification": {
source: "iana"
},
"application/vnd.syncml.dmddf+wbxml": {
source: "iana"
},
"application/vnd.syncml.dmddf+xml": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["ddf"]
},
"application/vnd.syncml.dmtnds+wbxml": {
source: "iana"
},
"application/vnd.syncml.dmtnds+xml": {
source: "iana",
charset: "UTF-8",
compressible: true
},
"application/vnd.syncml.ds.notification": {
source: "iana"
},
"application/vnd.tableschema+json": {
source: "iana",
compressible: true
},
"application/vnd.tao.intent-module-archive": {
source: "iana",
extensions: ["tao"]
},
"application/vnd.tcpdump.pcap": {
source: "iana",
extensions: ["pcap", "cap", "dmp"]
},
"application/vnd.think-cell.ppttc+json": {
source: "iana",
compressible: true
},
"application/vnd.tmd.mediaflex.api+xml": {
source: "iana",
compressible: true
},
"application/vnd.tml": {
source: "iana"
},
"application/vnd.tmobile-livetv": {
source: "iana",
extensions: ["tmo"]
},
"application/vnd.tri.onesource": {
source: "iana"
},
"application/vnd.trid.tpt": {
source: "iana",
extensions: ["tpt"]
},
"application/vnd.triscape.mxs": {
source: "iana",
extensions: ["mxs"]
},
"application/vnd.trueapp": {
source: "iana",
extensions: ["tra"]
},
"application/vnd.truedoc": {
source: "iana"
},
"application/vnd.ubisoft.webplayer": {
source: "iana"
},
"application/vnd.ufdl": {
source: "iana",
extensions: ["ufd", "ufdl"]
},
"application/vnd.uiq.theme": {
source: "iana",
extensions: ["utz"]
},
"application/vnd.umajin": {
source: "iana",
extensions: ["umj"]
},
"application/vnd.unity": {
source: "iana",
extensions: ["unityweb"]
},
"application/vnd.uoml+xml": {
source: "iana",
compressible: true,
extensions: ["uoml"]
},
"application/vnd.uplanet.alert": {
source: "iana"
},
"application/vnd.uplanet.alert-wbxml": {
source: "iana"
},
"application/vnd.uplanet.bearer-choice": {
source: "iana"
},
"application/vnd.uplanet.bearer-choice-wbxml": {
source: "iana"
},
"application/vnd.uplanet.cacheop": {
source: "iana"
},
"application/vnd.uplanet.cacheop-wbxml": {
source: "iana"
},
"application/vnd.uplanet.channel": {
source: "iana"
},
"application/vnd.uplanet.channel-wbxml": {
source: "iana"
},
"application/vnd.uplanet.list": {
source: "iana"
},
"application/vnd.uplanet.list-wbxml": {
source: "iana"
},
"application/vnd.uplanet.listcmd": {
source: "iana"
},
"application/vnd.uplanet.listcmd-wbxml": {
source: "iana"
},
"application/vnd.uplanet.signal": {
source: "iana"
},
"application/vnd.uri-map": {
source: "iana"
},
"application/vnd.valve.source.material": {
source: "iana"
},
"application/vnd.vcx": {
source: "iana",
extensions: ["vcx"]
},
"application/vnd.vd-study": {
source: "iana"
},
"application/vnd.vectorworks": {
source: "iana"
},
"application/vnd.vel+json": {
source: "iana",
compressible: true
},
"application/vnd.verimatrix.vcas": {
source: "iana"
},
"application/vnd.veritone.aion+json": {
source: "iana",
compressible: true
},
"application/vnd.veryant.thin": {
source: "iana"
},
"application/vnd.ves.encrypted": {
source: "iana"
},
"application/vnd.vidsoft.vidconference": {
source: "iana"
},
"application/vnd.visio": {
source: "iana",
extensions: ["vsd", "vst", "vss", "vsw"]
},
"application/vnd.visionary": {
source: "iana",
extensions: ["vis"]
},
"application/vnd.vividence.scriptfile": {
source: "iana"
},
"application/vnd.vsf": {
source: "iana",
extensions: ["vsf"]
},
"application/vnd.wap.sic": {
source: "iana"
},
"application/vnd.wap.slc": {
source: "iana"
},
"application/vnd.wap.wbxml": {
source: "iana",
charset: "UTF-8",
extensions: ["wbxml"]
},
"application/vnd.wap.wmlc": {
source: "iana",
extensions: ["wmlc"]
},
"application/vnd.wap.wmlscriptc": {
source: "iana",
extensions: ["wmlsc"]
},
"application/vnd.webturbo": {
source: "iana",
extensions: ["wtb"]
},
"application/vnd.wfa.dpp": {
source: "iana"
},
"application/vnd.wfa.p2p": {
source: "iana"
},
"application/vnd.wfa.wsc": {
source: "iana"
},
"application/vnd.windows.devicepairing": {
source: "iana"
},
"application/vnd.wmc": {
source: "iana"
},
"application/vnd.wmf.bootstrap": {
source: "iana"
},
"application/vnd.wolfram.mathematica": {
source: "iana"
},
"application/vnd.wolfram.mathematica.package": {
source: "iana"
},
"application/vnd.wolfram.player": {
source: "iana",
extensions: ["nbp"]
},
"application/vnd.wordperfect": {
source: "iana",
extensions: ["wpd"]
},
"application/vnd.wqd": {
source: "iana",
extensions: ["wqd"]
},
"application/vnd.wrq-hp3000-labelled": {
source: "iana"
},
"application/vnd.wt.stf": {
source: "iana",
extensions: ["stf"]
},
"application/vnd.wv.csp+wbxml": {
source: "iana"
},
"application/vnd.wv.csp+xml": {
source: "iana",
compressible: true
},
"application/vnd.wv.ssp+xml": {
source: "iana",
compressible: true
},
"application/vnd.xacml+json": {
source: "iana",
compressible: true
},
"application/vnd.xara": {
source: "iana",
extensions: ["xar"]
},
"application/vnd.xfdl": {
source: "iana",
extensions: ["xfdl"]
},
"application/vnd.xfdl.webform": {
source: "iana"
},
"application/vnd.xmi+xml": {
source: "iana",
compressible: true
},
"application/vnd.xmpie.cpkg": {
source: "iana"
},
"application/vnd.xmpie.dpkg": {
source: "iana"
},
"application/vnd.xmpie.plan": {
source: "iana"
},
"application/vnd.xmpie.ppkg": {
source: "iana"
},
"application/vnd.xmpie.xlim": {
source: "iana"
},
"application/vnd.yamaha.hv-dic": {
source: "iana",
extensions: ["hvd"]
},
"application/vnd.yamaha.hv-script": {
source: "iana",
extensions: ["hvs"]
},
"application/vnd.yamaha.hv-voice": {
source: "iana",
extensions: ["hvp"]
},
"application/vnd.yamaha.openscoreformat": {
source: "iana",
extensions: ["osf"]
},
"application/vnd.yamaha.openscoreformat.osfpvg+xml": {
source: "iana",
compressible: true,
extensions: ["osfpvg"]
},
"application/vnd.yamaha.remote-setup": {
source: "iana"
},
"application/vnd.yamaha.smaf-audio": {
source: "iana",
extensions: ["saf"]
},
"application/vnd.yamaha.smaf-phrase": {
source: "iana",
extensions: ["spf"]
},
"application/vnd.yamaha.through-ngn": {
source: "iana"
},
"application/vnd.yamaha.tunnel-udpencap": {
source: "iana"
},
"application/vnd.yaoweme": {
source: "iana"
},
"application/vnd.yellowriver-custom-menu": {
source: "iana",
extensions: ["cmp"]
},
"application/vnd.youtube.yt": {
source: "iana"
},
"application/vnd.zul": {
source: "iana",
extensions: ["zir", "zirz"]
},
"application/vnd.zzazz.deck+xml": {
source: "iana",
compressible: true,
extensions: ["zaz"]
},
"application/voicexml+xml": {
source: "iana",
compressible: true,
extensions: ["vxml"]
},
"application/voucher-cms+json": {
source: "iana",
compressible: true
},
"application/vq-rtcpxr": {
source: "iana"
},
"application/wasm": {
source: "iana",
compressible: true,
extensions: ["wasm"]
},
"application/watcherinfo+xml": {
source: "iana",
compressible: true,
extensions: ["wif"]
},
"application/webpush-options+json": {
source: "iana",
compressible: true
},
"application/whoispp-query": {
source: "iana"
},
"application/whoispp-response": {
source: "iana"
},
"application/widget": {
source: "iana",
extensions: ["wgt"]
},
"application/winhlp": {
source: "apache",
extensions: ["hlp"]
},
"application/wita": {
source: "iana"
},
"application/wordperfect5.1": {
source: "iana"
},
"application/wsdl+xml": {
source: "iana",
compressible: true,
extensions: ["wsdl"]
},
"application/wspolicy+xml": {
source: "iana",
compressible: true,
extensions: ["wspolicy"]
},
"application/x-7z-compressed": {
source: "apache",
compressible: false,
extensions: ["7z"]
},
"application/x-abiword": {
source: "apache",
extensions: ["abw"]
},
"application/x-ace-compressed": {
source: "apache",
extensions: ["ace"]
},
"application/x-amf": {
source: "apache"
},
"application/x-apple-diskimage": {
source: "apache",
extensions: ["dmg"]
},
"application/x-arj": {
compressible: false,
extensions: ["arj"]
},
"application/x-authorware-bin": {
source: "apache",
extensions: ["aab", "x32", "u32", "vox"]
},
"application/x-authorware-map": {
source: "apache",
extensions: ["aam"]
},
"application/x-authorware-seg": {
source: "apache",
extensions: ["aas"]
},
"application/x-bcpio": {
source: "apache",
extensions: ["bcpio"]
},
"application/x-bdoc": {
compressible: false,
extensions: ["bdoc"]
},
"application/x-bittorrent": {
source: "apache",
extensions: ["torrent"]
},
"application/x-blorb": {
source: "apache",
extensions: ["blb", "blorb"]
},
"application/x-bzip": {
source: "apache",
compressible: false,
extensions: ["bz"]
},
"application/x-bzip2": {
source: "apache",
compressible: false,
extensions: ["bz2", "boz"]
},
"application/x-cbr": {
source: "apache",
extensions: ["cbr", "cba", "cbt", "cbz", "cb7"]
},
"application/x-cdlink": {
source: "apache",
extensions: ["vcd"]
},
"application/x-cfs-compressed": {
source: "apache",
extensions: ["cfs"]
},
"application/x-chat": {
source: "apache",
extensions: ["chat"]
},
"application/x-chess-pgn": {
source: "apache",
extensions: ["pgn"]
},
"application/x-chrome-extension": {
extensions: ["crx"]
},
"application/x-cocoa": {
source: "nginx",
extensions: ["cco"]
},
"application/x-compress": {
source: "apache"
},
"application/x-conference": {
source: "apache",
extensions: ["nsc"]
},
"application/x-cpio": {
source: "apache",
extensions: ["cpio"]
},
"application/x-csh": {
source: "apache",
extensions: ["csh"]
},
"application/x-deb": {
compressible: false
},
"application/x-debian-package": {
source: "apache",
extensions: ["deb", "udeb"]
},
"application/x-dgc-compressed": {
source: "apache",
extensions: ["dgc"]
},
"application/x-director": {
source: "apache",
extensions: ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"]
},
"application/x-doom": {
source: "apache",
extensions: ["wad"]
},
"application/x-dtbncx+xml": {
source: "apache",
compressible: true,
extensions: ["ncx"]
},
"application/x-dtbook+xml": {
source: "apache",
compressible: true,
extensions: ["dtb"]
},
"application/x-dtbresource+xml": {
source: "apache",
compressible: true,
extensions: ["res"]
},
"application/x-dvi": {
source: "apache",
compressible: false,
extensions: ["dvi"]
},
"application/x-envoy": {
source: "apache",
extensions: ["evy"]
},
"application/x-eva": {
source: "apache",
extensions: ["eva"]
},
"application/x-font-bdf": {
source: "apache",
extensions: ["bdf"]
},
"application/x-font-dos": {
source: "apache"
},
"application/x-font-framemaker": {
source: "apache"
},
"application/x-font-ghostscript": {
source: "apache",
extensions: ["gsf"]
},
"application/x-font-libgrx": {
source: "apache"
},
"application/x-font-linux-psf": {
source: "apache",
extensions: ["psf"]
},
"application/x-font-pcf": {
source: "apache",
extensions: ["pcf"]
},
"application/x-font-snf": {
source: "apache",
extensions: ["snf"]
},
"application/x-font-speedo": {
source: "apache"
},
"application/x-font-sunos-news": {
source: "apache"
},
"application/x-font-type1": {
source: "apache",
extensions: ["pfa", "pfb", "pfm", "afm"]
},
"application/x-font-vfont": {
source: "apache"
},
"application/x-freearc": {
source: "apache",
extensions: ["arc"]
},
"application/x-futuresplash": {
source: "apache",
extensions: ["spl"]
},
"application/x-gca-compressed": {
source: "apache",
extensions: ["gca"]
},
"application/x-glulx": {
source: "apache",
extensions: ["ulx"]
},
"application/x-gnumeric": {
source: "apache",
extensions: ["gnumeric"]
},
"application/x-gramps-xml": {
source: "apache",
extensions: ["gramps"]
},
"application/x-gtar": {
source: "apache",
extensions: ["gtar"]
},
"application/x-gzip": {
source: "apache"
},
"application/x-hdf": {
source: "apache",
extensions: ["hdf"]
},
"application/x-httpd-php": {
compressible: true,
extensions: ["php"]
},
"application/x-install-instructions": {
source: "apache",
extensions: ["install"]
},
"application/x-iso9660-image": {
source: "apache",
extensions: ["iso"]
},
"application/x-iwork-keynote-sffkey": {
extensions: ["key"]
},
"application/x-iwork-numbers-sffnumbers": {
extensions: ["numbers"]
},
"application/x-iwork-pages-sffpages": {
extensions: ["pages"]
},
"application/x-java-archive-diff": {
source: "nginx",
extensions: ["jardiff"]
},
"application/x-java-jnlp-file": {
source: "apache",
compressible: false,
extensions: ["jnlp"]
},
"application/x-javascript": {
compressible: true
},
"application/x-keepass2": {
extensions: ["kdbx"]
},
"application/x-latex": {
source: "apache",
compressible: false,
extensions: ["latex"]
},
"application/x-lua-bytecode": {
extensions: ["luac"]
},
"application/x-lzh-compressed": {
source: "apache",
extensions: ["lzh", "lha"]
},
"application/x-makeself": {
source: "nginx",
extensions: ["run"]
},
"application/x-mie": {
source: "apache",
extensions: ["mie"]
},
"application/x-mobipocket-ebook": {
source: "apache",
extensions: ["prc", "mobi"]
},
"application/x-mpegurl": {
compressible: false
},
"application/x-ms-application": {
source: "apache",
extensions: ["application"]
},
"application/x-ms-shortcut": {
source: "apache",
extensions: ["lnk"]
},
"application/x-ms-wmd": {
source: "apache",
extensions: ["wmd"]
},
"application/x-ms-wmz": {
source: "apache",
extensions: ["wmz"]
},
"application/x-ms-xbap": {
source: "apache",
extensions: ["xbap"]
},
"application/x-msaccess": {
source: "apache",
extensions: ["mdb"]
},
"application/x-msbinder": {
source: "apache",
extensions: ["obd"]
},
"application/x-mscardfile": {
source: "apache",
extensions: ["crd"]
},
"application/x-msclip": {
source: "apache",
extensions: ["clp"]
},
"application/x-msdos-program": {
extensions: ["exe"]
},
"application/x-msdownload": {
source: "apache",
extensions: ["exe", "dll", "com", "bat", "msi"]
},
"application/x-msmediaview": {
source: "apache",
extensions: ["mvb", "m13", "m14"]
},
"application/x-msmetafile": {
source: "apache",
extensions: ["wmf", "wmz", "emf", "emz"]
},
"application/x-msmoney": {
source: "apache",
extensions: ["mny"]
},
"application/x-mspublisher": {
source: "apache",
extensions: ["pub"]
},
"application/x-msschedule": {
source: "apache",
extensions: ["scd"]
},
"application/x-msterminal": {
source: "apache",
extensions: ["trm"]
},
"application/x-mswrite": {
source: "apache",
extensions: ["wri"]
},
"application/x-netcdf": {
source: "apache",
extensions: ["nc", "cdf"]
},
"application/x-ns-proxy-autoconfig": {
compressible: true,
extensions: ["pac"]
},
"application/x-nzb": {
source: "apache",
extensions: ["nzb"]
},
"application/x-perl": {
source: "nginx",
extensions: ["pl", "pm"]
},
"application/x-pilot": {
source: "nginx",
extensions: ["prc", "pdb"]
},
"application/x-pkcs12": {
source: "apache",
compressible: false,
extensions: ["p12", "pfx"]
},
"application/x-pkcs7-certificates": {
source: "apache",
extensions: ["p7b", "spc"]
},
"application/x-pkcs7-certreqresp": {
source: "apache",
extensions: ["p7r"]
},
"application/x-pki-message": {
source: "iana"
},
"application/x-rar-compressed": {
source: "apache",
compressible: false,
extensions: ["rar"]
},
"application/x-redhat-package-manager": {
source: "nginx",
extensions: ["rpm"]
},
"application/x-research-info-systems": {
source: "apache",
extensions: ["ris"]
},
"application/x-sea": {
source: "nginx",
extensions: ["sea"]
},
"application/x-sh": {
source: "apache",
compressible: true,
extensions: ["sh"]
},
"application/x-shar": {
source: "apache",
extensions: ["shar"]
},
"application/x-shockwave-flash": {
source: "apache",
compressible: false,
extensions: ["swf"]
},
"application/x-silverlight-app": {
source: "apache",
extensions: ["xap"]
},
"application/x-sql": {
source: "apache",
extensions: ["sql"]
},
"application/x-stuffit": {
source: "apache",
compressible: false,
extensions: ["sit"]
},
"application/x-stuffitx": {
source: "apache",
extensions: ["sitx"]
},
"application/x-subrip": {
source: "apache",
extensions: ["srt"]
},
"application/x-sv4cpio": {
source: "apache",
extensions: ["sv4cpio"]
},
"application/x-sv4crc": {
source: "apache",
extensions: ["sv4crc"]
},
"application/x-t3vm-image": {
source: "apache",
extensions: ["t3"]
},
"application/x-tads": {
source: "apache",
extensions: ["gam"]
},
"application/x-tar": {
source: "apache",
compressible: true,
extensions: ["tar"]
},
"application/x-tcl": {
source: "apache",
extensions: ["tcl", "tk"]
},
"application/x-tex": {
source: "apache",
extensions: ["tex"]
},
"application/x-tex-tfm": {
source: "apache",
extensions: ["tfm"]
},
"application/x-texinfo": {
source: "apache",
extensions: ["texinfo", "texi"]
},
"application/x-tgif": {
source: "apache",
extensions: ["obj"]
},
"application/x-ustar": {
source: "apache",
extensions: ["ustar"]
},
"application/x-virtualbox-hdd": {
compressible: true,
extensions: ["hdd"]
},
"application/x-virtualbox-ova": {
compressible: true,
extensions: ["ova"]
},
"application/x-virtualbox-ovf": {
compressible: true,
extensions: ["ovf"]
},
"application/x-virtualbox-vbox": {
compressible: true,
extensions: ["vbox"]
},
"application/x-virtualbox-vbox-extpack": {
compressible: false,
extensions: ["vbox-extpack"]
},
"application/x-virtualbox-vdi": {
compressible: true,
extensions: ["vdi"]
},
"application/x-virtualbox-vhd": {
compressible: true,
extensions: ["vhd"]
},
"application/x-virtualbox-vmdk": {
compressible: true,
extensions: ["vmdk"]
},
"application/x-wais-source": {
source: "apache",
extensions: ["src"]
},
"application/x-web-app-manifest+json": {
compressible: true,
extensions: ["webapp"]
},
"application/x-www-form-urlencoded": {
source: "iana",
compressible: true
},
"application/x-x509-ca-cert": {
source: "iana",
extensions: ["der", "crt", "pem"]
},
"application/x-x509-ca-ra-cert": {
source: "iana"
},
"application/x-x509-next-ca-cert": {
source: "iana"
},
"application/x-xfig": {
source: "apache",
extensions: ["fig"]
},
"application/x-xliff+xml": {
source: "apache",
compressible: true,
extensions: ["xlf"]
},
"application/x-xpinstall": {
source: "apache",
compressible: false,
extensions: ["xpi"]
},
"application/x-xz": {
source: "apache",
extensions: ["xz"]
},
"application/x-zmachine": {
source: "apache",
extensions: ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"]
},
"application/x400-bp": {
source: "iana"
},
"application/xacml+xml": {
source: "iana",
compressible: true
},
"application/xaml+xml": {
source: "apache",
compressible: true,
extensions: ["xaml"]
},
"application/xcap-att+xml": {
source: "iana",
compressible: true,
extensions: ["xav"]
},
"application/xcap-caps+xml": {
source: "iana",
compressible: true,
extensions: ["xca"]
},
"application/xcap-diff+xml": {
source: "iana",
compressible: true,
extensions: ["xdf"]
},
"application/xcap-el+xml": {
source: "iana",
compressible: true,
extensions: ["xel"]
},
"application/xcap-error+xml": {
source: "iana",
compressible: true
},
"application/xcap-ns+xml": {
source: "iana",
compressible: true,
extensions: ["xns"]
},
"application/xcon-conference-info+xml": {
source: "iana",
compressible: true
},
"application/xcon-conference-info-diff+xml": {
source: "iana",
compressible: true
},
"application/xenc+xml": {
source: "iana",
compressible: true,
extensions: ["xenc"]
},
"application/xhtml+xml": {
source: "iana",
compressible: true,
extensions: ["xhtml", "xht"]
},
"application/xhtml-voice+xml": {
source: "apache",
compressible: true
},
"application/xliff+xml": {
source: "iana",
compressible: true,
extensions: ["xlf"]
},
"application/xml": {
source: "iana",
compressible: true,
extensions: ["xml", "xsl", "xsd", "rng"]
},
"application/xml-dtd": {
source: "iana",
compressible: true,
extensions: ["dtd"]
},
"application/xml-external-parsed-entity": {
source: "iana"
},
"application/xml-patch+xml": {
source: "iana",
compressible: true
},
"application/xmpp+xml": {
source: "iana",
compressible: true
},
"application/xop+xml": {
source: "iana",
compressible: true,
extensions: ["xop"]
},
"application/xproc+xml": {
source: "apache",
compressible: true,
extensions: ["xpl"]
},
"application/xslt+xml": {
source: "iana",
compressible: true,
extensions: ["xsl", "xslt"]
},
"application/xspf+xml": {
source: "apache",
compressible: true,
extensions: ["xspf"]
},
"application/xv+xml": {
source: "iana",
compressible: true,
extensions: ["mxml", "xhvml", "xvml", "xvm"]
},
"application/yang": {
source: "iana",
extensions: ["yang"]
},
"application/yang-data+json": {
source: "iana",
compressible: true
},
"application/yang-data+xml": {
source: "iana",
compressible: true
},
"application/yang-patch+json": {
source: "iana",
compressible: true
},
"application/yang-patch+xml": {
source: "iana",
compressible: true
},
"application/yin+xml": {
source: "iana",
compressible: true,
extensions: ["yin"]
},
"application/zip": {
source: "iana",
compressible: false,
extensions: ["zip"]
},
"application/zlib": {
source: "iana"
},
"application/zstd": {
source: "iana"
},
"audio/1d-interleaved-parityfec": {
source: "iana"
},
"audio/32kadpcm": {
source: "iana"
},
"audio/3gpp": {
source: "iana",
compressible: false,
extensions: ["3gpp"]
},
"audio/3gpp2": {
source: "iana"
},
"audio/aac": {
source: "iana"
},
"audio/ac3": {
source: "iana"
},
"audio/adpcm": {
source: "apache",
extensions: ["adp"]
},
"audio/amr": {
source: "iana",
extensions: ["amr"]
},
"audio/amr-wb": {
source: "iana"
},
"audio/amr-wb+": {
source: "iana"
},
"audio/aptx": {
source: "iana"
},
"audio/asc": {
source: "iana"
},
"audio/atrac-advanced-lossless": {
source: "iana"
},
"audio/atrac-x": {
source: "iana"
},
"audio/atrac3": {
source: "iana"
},
"audio/basic": {
source: "iana",
compressible: false,
extensions: ["au", "snd"]
},
"audio/bv16": {
source: "iana"
},
"audio/bv32": {
source: "iana"
},
"audio/clearmode": {
source: "iana"
},
"audio/cn": {
source: "iana"
},
"audio/dat12": {
source: "iana"
},
"audio/dls": {
source: "iana"
},
"audio/dsr-es201108": {
source: "iana"
},
"audio/dsr-es202050": {
source: "iana"
},
"audio/dsr-es202211": {
source: "iana"
},
"audio/dsr-es202212": {
source: "iana"
},
"audio/dv": {
source: "iana"
},
"audio/dvi4": {
source: "iana"
},
"audio/eac3": {
source: "iana"
},
"audio/encaprtp": {
source: "iana"
},
"audio/evrc": {
source: "iana"
},
"audio/evrc-qcp": {
source: "iana"
},
"audio/evrc0": {
source: "iana"
},
"audio/evrc1": {
source: "iana"
},
"audio/evrcb": {
source: "iana"
},
"audio/evrcb0": {
source: "iana"
},
"audio/evrcb1": {
source: "iana"
},
"audio/evrcnw": {
source: "iana"
},
"audio/evrcnw0": {
source: "iana"
},
"audio/evrcnw1": {
source: "iana"
},
"audio/evrcwb": {
source: "iana"
},
"audio/evrcwb0": {
source: "iana"
},
"audio/evrcwb1": {
source: "iana"
},
"audio/evs": {
source: "iana"
},
"audio/flexfec": {
source: "iana"
},
"audio/fwdred": {
source: "iana"
},
"audio/g711-0": {
source: "iana"
},
"audio/g719": {
source: "iana"
},
"audio/g722": {
source: "iana"
},
"audio/g7221": {
source: "iana"
},
"audio/g723": {
source: "iana"
},
"audio/g726-16": {
source: "iana"
},
"audio/g726-24": {
source: "iana"
},
"audio/g726-32": {
source: "iana"
},
"audio/g726-40": {
source: "iana"
},
"audio/g728": {
source: "iana"
},
"audio/g729": {
source: "iana"
},
"audio/g7291": {
source: "iana"
},
"audio/g729d": {
source: "iana"
},
"audio/g729e": {
source: "iana"
},
"audio/gsm": {
source: "iana"
},
"audio/gsm-efr": {
source: "iana"
},
"audio/gsm-hr-08": {
source: "iana"
},
"audio/ilbc": {
source: "iana"
},
"audio/ip-mr_v2.5": {
source: "iana"
},
"audio/isac": {
source: "apache"
},
"audio/l16": {
source: "iana"
},
"audio/l20": {
source: "iana"
},
"audio/l24": {
source: "iana",
compressible: false
},
"audio/l8": {
source: "iana"
},
"audio/lpc": {
source: "iana"
},
"audio/melp": {
source: "iana"
},
"audio/melp1200": {
source: "iana"
},
"audio/melp2400": {
source: "iana"
},
"audio/melp600": {
source: "iana"
},
"audio/mhas": {
source: "iana"
},
"audio/midi": {
source: "apache",
extensions: ["mid", "midi", "kar", "rmi"]
},
"audio/mobile-xmf": {
source: "iana",
extensions: ["mxmf"]
},
"audio/mp3": {
compressible: false,
extensions: ["mp3"]
},
"audio/mp4": {
source: "iana",
compressible: false,
extensions: ["m4a", "mp4a"]
},
"audio/mp4a-latm": {
source: "iana"
},
"audio/mpa": {
source: "iana"
},
"audio/mpa-robust": {
source: "iana"
},
"audio/mpeg": {
source: "iana",
compressible: false,
extensions: ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"]
},
"audio/mpeg4-generic": {
source: "iana"
},
"audio/musepack": {
source: "apache"
},
"audio/ogg": {
source: "iana",
compressible: false,
extensions: ["oga", "ogg", "spx", "opus"]
},
"audio/opus": {
source: "iana"
},
"audio/parityfec": {
source: "iana"
},
"audio/pcma": {
source: "iana"
},
"audio/pcma-wb": {
source: "iana"
},
"audio/pcmu": {
source: "iana"
},
"audio/pcmu-wb": {
source: "iana"
},
"audio/prs.sid": {
source: "iana"
},
"audio/qcelp": {
source: "iana"
},
"audio/raptorfec": {
source: "iana"
},
"audio/red": {
source: "iana"
},
"audio/rtp-enc-aescm128": {
source: "iana"
},
"audio/rtp-midi": {
source: "iana"
},
"audio/rtploopback": {
source: "iana"
},
"audio/rtx": {
source: "iana"
},
"audio/s3m": {
source: "apache",
extensions: ["s3m"]
},
"audio/scip": {
source: "iana"
},
"audio/silk": {
source: "apache",
extensions: ["sil"]
},
"audio/smv": {
source: "iana"
},
"audio/smv-qcp": {
source: "iana"
},
"audio/smv0": {
source: "iana"
},
"audio/sofa": {
source: "iana"
},
"audio/sp-midi": {
source: "iana"
},
"audio/speex": {
source: "iana"
},
"audio/t140c": {
source: "iana"
},
"audio/t38": {
source: "iana"
},
"audio/telephone-event": {
source: "iana"
},
"audio/tetra_acelp": {
source: "iana"
},
"audio/tetra_acelp_bb": {
source: "iana"
},
"audio/tone": {
source: "iana"
},
"audio/tsvcis": {
source: "iana"
},
"audio/uemclip": {
source: "iana"
},
"audio/ulpfec": {
source: "iana"
},
"audio/usac": {
source: "iana"
},
"audio/vdvi": {
source: "iana"
},
"audio/vmr-wb": {
source: "iana"
},
"audio/vnd.3gpp.iufp": {
source: "iana"
},
"audio/vnd.4sb": {
source: "iana"
},
"audio/vnd.audiokoz": {
source: "iana"
},
"audio/vnd.celp": {
source: "iana"
},
"audio/vnd.cisco.nse": {
source: "iana"
},
"audio/vnd.cmles.radio-events": {
source: "iana"
},
"audio/vnd.cns.anp1": {
source: "iana"
},
"audio/vnd.cns.inf1": {
source: "iana"
},
"audio/vnd.dece.audio": {
source: "iana",
extensions: ["uva", "uvva"]
},
"audio/vnd.digital-winds": {
source: "iana",
extensions: ["eol"]
},
"audio/vnd.dlna.adts": {
source: "iana"
},
"audio/vnd.dolby.heaac.1": {
source: "iana"
},
"audio/vnd.dolby.heaac.2": {
source: "iana"
},
"audio/vnd.dolby.mlp": {
source: "iana"
},
"audio/vnd.dolby.mps": {
source: "iana"
},
"audio/vnd.dolby.pl2": {
source: "iana"
},
"audio/vnd.dolby.pl2x": {
source: "iana"
},
"audio/vnd.dolby.pl2z": {
source: "iana"
},
"audio/vnd.dolby.pulse.1": {
source: "iana"
},
"audio/vnd.dra": {
source: "iana",
extensions: ["dra"]
},
"audio/vnd.dts": {
source: "iana",
extensions: ["dts"]
},
"audio/vnd.dts.hd": {
source: "iana",
extensions: ["dtshd"]
},
"audio/vnd.dts.uhd": {
source: "iana"
},
"audio/vnd.dvb.file": {
source: "iana"
},
"audio/vnd.everad.plj": {
source: "iana"
},
"audio/vnd.hns.audio": {
source: "iana"
},
"audio/vnd.lucent.voice": {
source: "iana",
extensions: ["lvp"]
},
"audio/vnd.ms-playready.media.pya": {
source: "iana",
extensions: ["pya"]
},
"audio/vnd.nokia.mobile-xmf": {
source: "iana"
},
"audio/vnd.nortel.vbk": {
source: "iana"
},
"audio/vnd.nuera.ecelp4800": {
source: "iana",
extensions: ["ecelp4800"]
},
"audio/vnd.nuera.ecelp7470": {
source: "iana",
extensions: ["ecelp7470"]
},
"audio/vnd.nuera.ecelp9600": {
source: "iana",
extensions: ["ecelp9600"]
},
"audio/vnd.octel.sbc": {
source: "iana"
},
"audio/vnd.presonus.multitrack": {
source: "iana"
},
"audio/vnd.qcelp": {
source: "iana"
},
"audio/vnd.rhetorex.32kadpcm": {
source: "iana"
},
"audio/vnd.rip": {
source: "iana",
extensions: ["rip"]
},
"audio/vnd.rn-realaudio": {
compressible: false
},
"audio/vnd.sealedmedia.softseal.mpeg": {
source: "iana"
},
"audio/vnd.vmx.cvsd": {
source: "iana"
},
"audio/vnd.wave": {
compressible: false
},
"audio/vorbis": {
source: "iana",
compressible: false
},
"audio/vorbis-config": {
source: "iana"
},
"audio/wav": {
compressible: false,
extensions: ["wav"]
},
"audio/wave": {
compressible: false,
extensions: ["wav"]
},
"audio/webm": {
source: "apache",
compressible: false,
extensions: ["weba"]
},
"audio/x-aac": {
source: "apache",
compressible: false,
extensions: ["aac"]
},
"audio/x-aiff": {
source: "apache",
extensions: ["aif", "aiff", "aifc"]
},
"audio/x-caf": {
source: "apache",
compressible: false,
extensions: ["caf"]
},
"audio/x-flac": {
source: "apache",
extensions: ["flac"]
},
"audio/x-m4a": {
source: "nginx",
extensions: ["m4a"]
},
"audio/x-matroska": {
source: "apache",
extensions: ["mka"]
},
"audio/x-mpegurl": {
source: "apache",
extensions: ["m3u"]
},
"audio/x-ms-wax": {
source: "apache",
extensions: ["wax"]
},
"audio/x-ms-wma": {
source: "apache",
extensions: ["wma"]
},
"audio/x-pn-realaudio": {
source: "apache",
extensions: ["ram", "ra"]
},
"audio/x-pn-realaudio-plugin": {
source: "apache",
extensions: ["rmp"]
},
"audio/x-realaudio": {
source: "nginx",
extensions: ["ra"]
},
"audio/x-tta": {
source: "apache"
},
"audio/x-wav": {
source: "apache",
extensions: ["wav"]
},
"audio/xm": {
source: "apache",
extensions: ["xm"]
},
"chemical/x-cdx": {
source: "apache",
extensions: ["cdx"]
},
"chemical/x-cif": {
source: "apache",
extensions: ["cif"]
},
"chemical/x-cmdf": {
source: "apache",
extensions: ["cmdf"]
},
"chemical/x-cml": {
source: "apache",
extensions: ["cml"]
},
"chemical/x-csml": {
source: "apache",
extensions: ["csml"]
},
"chemical/x-pdb": {
source: "apache"
},
"chemical/x-xyz": {
source: "apache",
extensions: ["xyz"]
},
"font/collection": {
source: "iana",
extensions: ["ttc"]
},
"font/otf": {
source: "iana",
compressible: true,
extensions: ["otf"]
},
"font/sfnt": {
source: "iana"
},
"font/ttf": {
source: "iana",
compressible: true,
extensions: ["ttf"]
},
"font/woff": {
source: "iana",
extensions: ["woff"]
},
"font/woff2": {
source: "iana",
extensions: ["woff2"]
},
"image/aces": {
source: "iana",
extensions: ["exr"]
},
"image/apng": {
compressible: false,
extensions: ["apng"]
},
"image/avci": {
source: "iana",
extensions: ["avci"]
},
"image/avcs": {
source: "iana",
extensions: ["avcs"]
},
"image/avif": {
source: "iana",
compressible: false,
extensions: ["avif"]
},
"image/bmp": {
source: "iana",
compressible: true,
extensions: ["bmp"]
},
"image/cgm": {
source: "iana",
extensions: ["cgm"]
},
"image/dicom-rle": {
source: "iana",
extensions: ["drle"]
},
"image/emf": {
source: "iana",
extensions: ["emf"]
},
"image/fits": {
source: "iana",
extensions: ["fits"]
},
"image/g3fax": {
source: "iana",
extensions: ["g3"]
},
"image/gif": {
source: "iana",
compressible: false,
extensions: ["gif"]
},
"image/heic": {
source: "iana",
extensions: ["heic"]
},
"image/heic-sequence": {
source: "iana",
extensions: ["heics"]
},
"image/heif": {
source: "iana",
extensions: ["heif"]
},
"image/heif-sequence": {
source: "iana",
extensions: ["heifs"]
},
"image/hej2k": {
source: "iana",
extensions: ["hej2"]
},
"image/hsj2": {
source: "iana",
extensions: ["hsj2"]
},
"image/ief": {
source: "iana",
extensions: ["ief"]
},
"image/jls": {
source: "iana",
extensions: ["jls"]
},
"image/jp2": {
source: "iana",
compressible: false,
extensions: ["jp2", "jpg2"]
},
"image/jpeg": {
source: "iana",
compressible: false,
extensions: ["jpeg", "jpg", "jpe"]
},
"image/jph": {
source: "iana",
extensions: ["jph"]
},
"image/jphc": {
source: "iana",
extensions: ["jhc"]
},
"image/jpm": {
source: "iana",
compressible: false,
extensions: ["jpm"]
},
"image/jpx": {
source: "iana",
compressible: false,
extensions: ["jpx", "jpf"]
},
"image/jxr": {
source: "iana",
extensions: ["jxr"]
},
"image/jxra": {
source: "iana",
extensions: ["jxra"]
},
"image/jxrs": {
source: "iana",
extensions: ["jxrs"]
},
"image/jxs": {
source: "iana",
extensions: ["jxs"]
},
"image/jxsc": {
source: "iana",
extensions: ["jxsc"]
},
"image/jxsi": {
source: "iana",
extensions: ["jxsi"]
},
"image/jxss": {
source: "iana",
extensions: ["jxss"]
},
"image/ktx": {
source: "iana",
extensions: ["ktx"]
},
"image/ktx2": {
source: "iana",
extensions: ["ktx2"]
},
"image/naplps": {
source: "iana"
},
"image/pjpeg": {
compressible: false
},
"image/png": {
source: "iana",
compressible: false,
extensions: ["png"]
},
"image/prs.btif": {
source: "iana",
extensions: ["btif"]
},
"image/prs.pti": {
source: "iana",
extensions: ["pti"]
},
"image/pwg-raster": {
source: "iana"
},
"image/sgi": {
source: "apache",
extensions: ["sgi"]
},
"image/svg+xml": {
source: "iana",
compressible: true,
extensions: ["svg", "svgz"]
},
"image/t38": {
source: "iana",
extensions: ["t38"]
},
"image/tiff": {
source: "iana",
compressible: false,
extensions: ["tif", "tiff"]
},
"image/tiff-fx": {
source: "iana",
extensions: ["tfx"]
},
"image/vnd.adobe.photoshop": {
source: "iana",
compressible: true,
extensions: ["psd"]
},
"image/vnd.airzip.accelerator.azv": {
source: "iana",
extensions: ["azv"]
},
"image/vnd.cns.inf2": {
source: "iana"
},
"image/vnd.dece.graphic": {
source: "iana",
extensions: ["uvi", "uvvi", "uvg", "uvvg"]
},
"image/vnd.djvu": {
source: "iana",
extensions: ["djvu", "djv"]
},
"image/vnd.dvb.subtitle": {
source: "iana",
extensions: ["sub"]
},
"image/vnd.dwg": {
source: "iana",
extensions: ["dwg"]
},
"image/vnd.dxf": {
source: "iana",
extensions: ["dxf"]
},
"image/vnd.fastbidsheet": {
source: "iana",
extensions: ["fbs"]
},
"image/vnd.fpx": {
source: "iana",
extensions: ["fpx"]
},
"image/vnd.fst": {
source: "iana",
extensions: ["fst"]
},
"image/vnd.fujixerox.edmics-mmr": {
source: "iana",
extensions: ["mmr"]
},
"image/vnd.fujixerox.edmics-rlc": {
source: "iana",
extensions: ["rlc"]
},
"image/vnd.globalgraphics.pgb": {
source: "iana"
},
"image/vnd.microsoft.icon": {
source: "iana",
compressible: true,
extensions: ["ico"]
},
"image/vnd.mix": {
source: "iana"
},
"image/vnd.mozilla.apng": {
source: "iana"
},
"image/vnd.ms-dds": {
compressible: true,
extensions: ["dds"]
},
"image/vnd.ms-modi": {
source: "iana",
extensions: ["mdi"]
},
"image/vnd.ms-photo": {
source: "apache",
extensions: ["wdp"]
},
"image/vnd.net-fpx": {
source: "iana",
extensions: ["npx"]
},
"image/vnd.pco.b16": {
source: "iana",
extensions: ["b16"]
},
"image/vnd.radiance": {
source: "iana"
},
"image/vnd.sealed.png": {
source: "iana"
},
"image/vnd.sealedmedia.softseal.gif": {
source: "iana"
},
"image/vnd.sealedmedia.softseal.jpg": {
source: "iana"
},
"image/vnd.svf": {
source: "iana"
},
"image/vnd.tencent.tap": {
source: "iana",
extensions: ["tap"]
},
"image/vnd.valve.source.texture": {
source: "iana",
extensions: ["vtf"]
},
"image/vnd.wap.wbmp": {
source: "iana",
extensions: ["wbmp"]
},
"image/vnd.xiff": {
source: "iana",
extensions: ["xif"]
},
"image/vnd.zbrush.pcx": {
source: "iana",
extensions: ["pcx"]
},
"image/webp": {
source: "apache",
extensions: ["webp"]
},
"image/wmf": {
source: "iana",
extensions: ["wmf"]
},
"image/x-3ds": {
source: "apache",
extensions: ["3ds"]
},
"image/x-cmu-raster": {
source: "apache",
extensions: ["ras"]
},
"image/x-cmx": {
source: "apache",
extensions: ["cmx"]
},
"image/x-freehand": {
source: "apache",
extensions: ["fh", "fhc", "fh4", "fh5", "fh7"]
},
"image/x-icon": {
source: "apache",
compressible: true,
extensions: ["ico"]
},
"image/x-jng": {
source: "nginx",
extensions: ["jng"]
},
"image/x-mrsid-image": {
source: "apache",
extensions: ["sid"]
},
"image/x-ms-bmp": {
source: "nginx",
compressible: true,
extensions: ["bmp"]
},
"image/x-pcx": {
source: "apache",
extensions: ["pcx"]
},
"image/x-pict": {
source: "apache",
extensions: ["pic", "pct"]
},
"image/x-portable-anymap": {
source: "apache",
extensions: ["pnm"]
},
"image/x-portable-bitmap": {
source: "apache",
extensions: ["pbm"]
},
"image/x-portable-graymap": {
source: "apache",
extensions: ["pgm"]
},
"image/x-portable-pixmap": {
source: "apache",
extensions: ["ppm"]
},
"image/x-rgb": {
source: "apache",
extensions: ["rgb"]
},
"image/x-tga": {
source: "apache",
extensions: ["tga"]
},
"image/x-xbitmap": {
source: "apache",
extensions: ["xbm"]
},
"image/x-xcf": {
compressible: false
},
"image/x-xpixmap": {
source: "apache",
extensions: ["xpm"]
},
"image/x-xwindowdump": {
source: "apache",
extensions: ["xwd"]
},
"message/cpim": {
source: "iana"
},
"message/delivery-status": {
source: "iana"
},
"message/disposition-notification": {
source: "iana",
extensions: [
"disposition-notification"
]
},
"message/external-body": {
source: "iana"
},
"message/feedback-report": {
source: "iana"
},
"message/global": {
source: "iana",
extensions: ["u8msg"]
},
"message/global-delivery-status": {
source: "iana",
extensions: ["u8dsn"]
},
"message/global-disposition-notification": {
source: "iana",
extensions: ["u8mdn"]
},
"message/global-headers": {
source: "iana",
extensions: ["u8hdr"]
},
"message/http": {
source: "iana",
compressible: false
},
"message/imdn+xml": {
source: "iana",
compressible: true
},
"message/news": {
source: "iana"
},
"message/partial": {
source: "iana",
compressible: false
},
"message/rfc822": {
source: "iana",
compressible: true,
extensions: ["eml", "mime"]
},
"message/s-http": {
source: "iana"
},
"message/sip": {
source: "iana"
},
"message/sipfrag": {
source: "iana"
},
"message/tracking-status": {
source: "iana"
},
"message/vnd.si.simp": {
source: "iana"
},
"message/vnd.wfa.wsc": {
source: "iana",
extensions: ["wsc"]
},
"model/3mf": {
source: "iana",
extensions: ["3mf"]
},
"model/e57": {
source: "iana"
},
"model/gltf+json": {
source: "iana",
compressible: true,
extensions: ["gltf"]
},
"model/gltf-binary": {
source: "iana",
compressible: true,
extensions: ["glb"]
},
"model/iges": {
source: "iana",
compressible: false,
extensions: ["igs", "iges"]
},
"model/mesh": {
source: "iana",
compressible: false,
extensions: ["msh", "mesh", "silo"]
},
"model/mtl": {
source: "iana",
extensions: ["mtl"]
},
"model/obj": {
source: "iana",
extensions: ["obj"]
},
"model/step": {
source: "iana"
},
"model/step+xml": {
source: "iana",
compressible: true,
extensions: ["stpx"]
},
"model/step+zip": {
source: "iana",
compressible: false,
extensions: ["stpz"]
},
"model/step-xml+zip": {
source: "iana",
compressible: false,
extensions: ["stpxz"]
},
"model/stl": {
source: "iana",
extensions: ["stl"]
},
"model/vnd.collada+xml": {
source: "iana",
compressible: true,
extensions: ["dae"]
},
"model/vnd.dwf": {
source: "iana",
extensions: ["dwf"]
},
"model/vnd.flatland.3dml": {
source: "iana"
},
"model/vnd.gdl": {
source: "iana",
extensions: ["gdl"]
},
"model/vnd.gs-gdl": {
source: "apache"
},
"model/vnd.gs.gdl": {
source: "iana"
},
"model/vnd.gtw": {
source: "iana",
extensions: ["gtw"]
},
"model/vnd.moml+xml": {
source: "iana",
compressible: true
},
"model/vnd.mts": {
source: "iana",
extensions: ["mts"]
},
"model/vnd.opengex": {
source: "iana",
extensions: ["ogex"]
},
"model/vnd.parasolid.transmit.binary": {
source: "iana",
extensions: ["x_b"]
},
"model/vnd.parasolid.transmit.text": {
source: "iana",
extensions: ["x_t"]
},
"model/vnd.pytha.pyox": {
source: "iana"
},
"model/vnd.rosette.annotated-data-model": {
source: "iana"
},
"model/vnd.sap.vds": {
source: "iana",
extensions: ["vds"]
},
"model/vnd.usdz+zip": {
source: "iana",
compressible: false,
extensions: ["usdz"]
},
"model/vnd.valve.source.compiled-map": {
source: "iana",
extensions: ["bsp"]
},
"model/vnd.vtu": {
source: "iana",
extensions: ["vtu"]
},
"model/vrml": {
source: "iana",
compressible: false,
extensions: ["wrl", "vrml"]
},
"model/x3d+binary": {
source: "apache",
compressible: false,
extensions: ["x3db", "x3dbz"]
},
"model/x3d+fastinfoset": {
source: "iana",
extensions: ["x3db"]
},
"model/x3d+vrml": {
source: "apache",
compressible: false,
extensions: ["x3dv", "x3dvz"]
},
"model/x3d+xml": {
source: "iana",
compressible: true,
extensions: ["x3d", "x3dz"]
},
"model/x3d-vrml": {
source: "iana",
extensions: ["x3dv"]
},
"multipart/alternative": {
source: "iana",
compressible: false
},
"multipart/appledouble": {
source: "iana"
},
"multipart/byteranges": {
source: "iana"
},
"multipart/digest": {
source: "iana"
},
"multipart/encrypted": {
source: "iana",
compressible: false
},
"multipart/form-data": {
source: "iana",
compressible: false
},
"multipart/header-set": {
source: "iana"
},
"multipart/mixed": {
source: "iana"
},
"multipart/multilingual": {
source: "iana"
},
"multipart/parallel": {
source: "iana"
},
"multipart/related": {
source: "iana",
compressible: false
},
"multipart/report": {
source: "iana"
},
"multipart/signed": {
source: "iana",
compressible: false
},
"multipart/vnd.bint.med-plus": {
source: "iana"
},
"multipart/voice-message": {
source: "iana"
},
"multipart/x-mixed-replace": {
source: "iana"
},
"text/1d-interleaved-parityfec": {
source: "iana"
},
"text/cache-manifest": {
source: "iana",
compressible: true,
extensions: ["appcache", "manifest"]
},
"text/calendar": {
source: "iana",
extensions: ["ics", "ifb"]
},
"text/calender": {
compressible: true
},
"text/cmd": {
compressible: true
},
"text/coffeescript": {
extensions: ["coffee", "litcoffee"]
},
"text/cql": {
source: "iana"
},
"text/cql-expression": {
source: "iana"
},
"text/cql-identifier": {
source: "iana"
},
"text/css": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["css"]
},
"text/csv": {
source: "iana",
compressible: true,
extensions: ["csv"]
},
"text/csv-schema": {
source: "iana"
},
"text/directory": {
source: "iana"
},
"text/dns": {
source: "iana"
},
"text/ecmascript": {
source: "iana"
},
"text/encaprtp": {
source: "iana"
},
"text/enriched": {
source: "iana"
},
"text/fhirpath": {
source: "iana"
},
"text/flexfec": {
source: "iana"
},
"text/fwdred": {
source: "iana"
},
"text/gff3": {
source: "iana"
},
"text/grammar-ref-list": {
source: "iana"
},
"text/html": {
source: "iana",
compressible: true,
extensions: ["html", "htm", "shtml"]
},
"text/jade": {
extensions: ["jade"]
},
"text/javascript": {
source: "iana",
compressible: true
},
"text/jcr-cnd": {
source: "iana"
},
"text/jsx": {
compressible: true,
extensions: ["jsx"]
},
"text/less": {
compressible: true,
extensions: ["less"]
},
"text/markdown": {
source: "iana",
compressible: true,
extensions: ["markdown", "md"]
},
"text/mathml": {
source: "nginx",
extensions: ["mml"]
},
"text/mdx": {
compressible: true,
extensions: ["mdx"]
},
"text/mizar": {
source: "iana"
},
"text/n3": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["n3"]
},
"text/parameters": {
source: "iana",
charset: "UTF-8"
},
"text/parityfec": {
source: "iana"
},
"text/plain": {
source: "iana",
compressible: true,
extensions: ["txt", "text", "conf", "def", "list", "log", "in", "ini"]
},
"text/provenance-notation": {
source: "iana",
charset: "UTF-8"
},
"text/prs.fallenstein.rst": {
source: "iana"
},
"text/prs.lines.tag": {
source: "iana",
extensions: ["dsc"]
},
"text/prs.prop.logic": {
source: "iana"
},
"text/raptorfec": {
source: "iana"
},
"text/red": {
source: "iana"
},
"text/rfc822-headers": {
source: "iana"
},
"text/richtext": {
source: "iana",
compressible: true,
extensions: ["rtx"]
},
"text/rtf": {
source: "iana",
compressible: true,
extensions: ["rtf"]
},
"text/rtp-enc-aescm128": {
source: "iana"
},
"text/rtploopback": {
source: "iana"
},
"text/rtx": {
source: "iana"
},
"text/sgml": {
source: "iana",
extensions: ["sgml", "sgm"]
},
"text/shaclc": {
source: "iana"
},
"text/shex": {
source: "iana",
extensions: ["shex"]
},
"text/slim": {
extensions: ["slim", "slm"]
},
"text/spdx": {
source: "iana",
extensions: ["spdx"]
},
"text/strings": {
source: "iana"
},
"text/stylus": {
extensions: ["stylus", "styl"]
},
"text/t140": {
source: "iana"
},
"text/tab-separated-values": {
source: "iana",
compressible: true,
extensions: ["tsv"]
},
"text/troff": {
source: "iana",
extensions: ["t", "tr", "roff", "man", "me", "ms"]
},
"text/turtle": {
source: "iana",
charset: "UTF-8",
extensions: ["ttl"]
},
"text/ulpfec": {
source: "iana"
},
"text/uri-list": {
source: "iana",
compressible: true,
extensions: ["uri", "uris", "urls"]
},
"text/vcard": {
source: "iana",
compressible: true,
extensions: ["vcard"]
},
"text/vnd.a": {
source: "iana"
},
"text/vnd.abc": {
source: "iana"
},
"text/vnd.ascii-art": {
source: "iana"
},
"text/vnd.curl": {
source: "iana",
extensions: ["curl"]
},
"text/vnd.curl.dcurl": {
source: "apache",
extensions: ["dcurl"]
},
"text/vnd.curl.mcurl": {
source: "apache",
extensions: ["mcurl"]
},
"text/vnd.curl.scurl": {
source: "apache",
extensions: ["scurl"]
},
"text/vnd.debian.copyright": {
source: "iana",
charset: "UTF-8"
},
"text/vnd.dmclientscript": {
source: "iana"
},
"text/vnd.dvb.subtitle": {
source: "iana",
extensions: ["sub"]
},
"text/vnd.esmertec.theme-descriptor": {
source: "iana",
charset: "UTF-8"
},
"text/vnd.familysearch.gedcom": {
source: "iana",
extensions: ["ged"]
},
"text/vnd.ficlab.flt": {
source: "iana"
},
"text/vnd.fly": {
source: "iana",
extensions: ["fly"]
},
"text/vnd.fmi.flexstor": {
source: "iana",
extensions: ["flx"]
},
"text/vnd.gml": {
source: "iana"
},
"text/vnd.graphviz": {
source: "iana",
extensions: ["gv"]
},
"text/vnd.hans": {
source: "iana"
},
"text/vnd.hgl": {
source: "iana"
},
"text/vnd.in3d.3dml": {
source: "iana",
extensions: ["3dml"]
},
"text/vnd.in3d.spot": {
source: "iana",
extensions: ["spot"]
},
"text/vnd.iptc.newsml": {
source: "iana"
},
"text/vnd.iptc.nitf": {
source: "iana"
},
"text/vnd.latex-z": {
source: "iana"
},
"text/vnd.motorola.reflex": {
source: "iana"
},
"text/vnd.ms-mediapackage": {
source: "iana"
},
"text/vnd.net2phone.commcenter.command": {
source: "iana"
},
"text/vnd.radisys.msml-basic-layout": {
source: "iana"
},
"text/vnd.senx.warpscript": {
source: "iana"
},
"text/vnd.si.uricatalogue": {
source: "iana"
},
"text/vnd.sosi": {
source: "iana"
},
"text/vnd.sun.j2me.app-descriptor": {
source: "iana",
charset: "UTF-8",
extensions: ["jad"]
},
"text/vnd.trolltech.linguist": {
source: "iana",
charset: "UTF-8"
},
"text/vnd.wap.si": {
source: "iana"
},
"text/vnd.wap.sl": {
source: "iana"
},
"text/vnd.wap.wml": {
source: "iana",
extensions: ["wml"]
},
"text/vnd.wap.wmlscript": {
source: "iana",
extensions: ["wmls"]
},
"text/vtt": {
source: "iana",
charset: "UTF-8",
compressible: true,
extensions: ["vtt"]
},
"text/x-asm": {
source: "apache",
extensions: ["s", "asm"]
},
"text/x-c": {
source: "apache",
extensions: ["c", "cc", "cxx", "cpp", "h", "hh", "dic"]
},
"text/x-component": {
source: "nginx",
extensions: ["htc"]
},
"text/x-fortran": {
source: "apache",
extensions: ["f", "for", "f77", "f90"]
},
"text/x-gwt-rpc": {
compressible: true
},
"text/x-handlebars-template": {
extensions: ["hbs"]
},
"text/x-java-source": {
source: "apache",
extensions: ["java"]
},
"text/x-jquery-tmpl": {
compressible: true
},
"text/x-lua": {
extensions: ["lua"]
},
"text/x-markdown": {
compressible: true,
extensions: ["mkd"]
},
"text/x-nfo": {
source: "apache",
extensions: ["nfo"]
},
"text/x-opml": {
source: "apache",
extensions: ["opml"]
},
"text/x-org": {
compressible: true,
extensions: ["org"]
},
"text/x-pascal": {
source: "apache",
extensions: ["p", "pas"]
},
"text/x-processing": {
compressible: true,
extensions: ["pde"]
},
"text/x-sass": {
extensions: ["sass"]
},
"text/x-scss": {
extensions: ["scss"]
},
"text/x-setext": {
source: "apache",
extensions: ["etx"]
},
"text/x-sfv": {
source: "apache",
extensions: ["sfv"]
},
"text/x-suse-ymp": {
compressible: true,
extensions: ["ymp"]
},
"text/x-uuencode": {
source: "apache",
extensions: ["uu"]
},
"text/x-vcalendar": {
source: "apache",
extensions: ["vcs"]
},
"text/x-vcard": {
source: "apache",
extensions: ["vcf"]
},
"text/xml": {
source: "iana",
compressible: true,
extensions: ["xml"]
},
"text/xml-external-parsed-entity": {
source: "iana"
},
"text/yaml": {
compressible: true,
extensions: ["yaml", "yml"]
},
"video/1d-interleaved-parityfec": {
source: "iana"
},
"video/3gpp": {
source: "iana",
extensions: ["3gp", "3gpp"]
},
"video/3gpp-tt": {
source: "iana"
},
"video/3gpp2": {
source: "iana",
extensions: ["3g2"]
},
"video/av1": {
source: "iana"
},
"video/bmpeg": {
source: "iana"
},
"video/bt656": {
source: "iana"
},
"video/celb": {
source: "iana"
},
"video/dv": {
source: "iana"
},
"video/encaprtp": {
source: "iana"
},
"video/ffv1": {
source: "iana"
},
"video/flexfec": {
source: "iana"
},
"video/h261": {
source: "iana",
extensions: ["h261"]
},
"video/h263": {
source: "iana",
extensions: ["h263"]
},
"video/h263-1998": {
source: "iana"
},
"video/h263-2000": {
source: "iana"
},
"video/h264": {
source: "iana",
extensions: ["h264"]
},
"video/h264-rcdo": {
source: "iana"
},
"video/h264-svc": {
source: "iana"
},
"video/h265": {
source: "iana"
},
"video/iso.segment": {
source: "iana",
extensions: ["m4s"]
},
"video/jpeg": {
source: "iana",
extensions: ["jpgv"]
},
"video/jpeg2000": {
source: "iana"
},
"video/jpm": {
source: "apache",
extensions: ["jpm", "jpgm"]
},
"video/jxsv": {
source: "iana"
},
"video/mj2": {
source: "iana",
extensions: ["mj2", "mjp2"]
},
"video/mp1s": {
source: "iana"
},
"video/mp2p": {
source: "iana"
},
"video/mp2t": {
source: "iana",
extensions: ["ts"]
},
"video/mp4": {
source: "iana",
compressible: false,
extensions: ["mp4", "mp4v", "mpg4"]
},
"video/mp4v-es": {
source: "iana"
},
"video/mpeg": {
source: "iana",
compressible: false,
extensions: ["mpeg", "mpg", "mpe", "m1v", "m2v"]
},
"video/mpeg4-generic": {
source: "iana"
},
"video/mpv": {
source: "iana"
},
"video/nv": {
source: "iana"
},
"video/ogg": {
source: "iana",
compressible: false,
extensions: ["ogv"]
},
"video/parityfec": {
source: "iana"
},
"video/pointer": {
source: "iana"
},
"video/quicktime": {
source: "iana",
compressible: false,
extensions: ["qt", "mov"]
},
"video/raptorfec": {
source: "iana"
},
"video/raw": {
source: "iana"
},
"video/rtp-enc-aescm128": {
source: "iana"
},
"video/rtploopback": {
source: "iana"
},
"video/rtx": {
source: "iana"
},
"video/scip": {
source: "iana"
},
"video/smpte291": {
source: "iana"
},
"video/smpte292m": {
source: "iana"
},
"video/ulpfec": {
source: "iana"
},
"video/vc1": {
source: "iana"
},
"video/vc2": {
source: "iana"
},
"video/vnd.cctv": {
source: "iana"
},
"video/vnd.dece.hd": {
source: "iana",
extensions: ["uvh", "uvvh"]
},
"video/vnd.dece.mobile": {
source: "iana",
extensions: ["uvm", "uvvm"]
},
"video/vnd.dece.mp4": {
source: "iana"
},
"video/vnd.dece.pd": {
source: "iana",
extensions: ["uvp", "uvvp"]
},
"video/vnd.dece.sd": {
source: "iana",
extensions: ["uvs", "uvvs"]
},
"video/vnd.dece.video": {
source: "iana",
extensions: ["uvv", "uvvv"]
},
"video/vnd.directv.mpeg": {
source: "iana"
},
"video/vnd.directv.mpeg-tts": {
source: "iana"
},
"video/vnd.dlna.mpeg-tts": {
source: "iana"
},
"video/vnd.dvb.file": {
source: "iana",
extensions: ["dvb"]
},
"video/vnd.fvt": {
source: "iana",
extensions: ["fvt"]
},
"video/vnd.hns.video": {
source: "iana"
},
"video/vnd.iptvforum.1dparityfec-1010": {
source: "iana"
},
"video/vnd.iptvforum.1dparityfec-2005": {
source: "iana"
},
"video/vnd.iptvforum.2dparityfec-1010": {
source: "iana"
},
"video/vnd.iptvforum.2dparityfec-2005": {
source: "iana"
},
"video/vnd.iptvforum.ttsavc": {
source: "iana"
},
"video/vnd.iptvforum.ttsmpeg2": {
source: "iana"
},
"video/vnd.motorola.video": {
source: "iana"
},
"video/vnd.motorola.videop": {
source: "iana"
},
"video/vnd.mpegurl": {
source: "iana",
extensions: ["mxu", "m4u"]
},
"video/vnd.ms-playready.media.pyv": {
source: "iana",
extensions: ["pyv"]
},
"video/vnd.nokia.interleaved-multimedia": {
source: "iana"
},
"video/vnd.nokia.mp4vr": {
source: "iana"
},
"video/vnd.nokia.videovoip": {
source: "iana"
},
"video/vnd.objectvideo": {
source: "iana"
},
"video/vnd.radgamettools.bink": {
source: "iana"
},
"video/vnd.radgamettools.smacker": {
source: "iana"
},
"video/vnd.sealed.mpeg1": {
source: "iana"
},
"video/vnd.sealed.mpeg4": {
source: "iana"
},
"video/vnd.sealed.swf": {
source: "iana"
},
"video/vnd.sealedmedia.softseal.mov": {
source: "iana"
},
"video/vnd.uvvu.mp4": {
source: "iana",
extensions: ["uvu", "uvvu"]
},
"video/vnd.vivo": {
source: "iana",
extensions: ["viv"]
},
"video/vnd.youtube.yt": {
source: "iana"
},
"video/vp8": {
source: "iana"
},
"video/vp9": {
source: "iana"
},
"video/webm": {
source: "apache",
compressible: false,
extensions: ["webm"]
},
"video/x-f4v": {
source: "apache",
extensions: ["f4v"]
},
"video/x-fli": {
source: "apache",
extensions: ["fli"]
},
"video/x-flv": {
source: "apache",
compressible: false,
extensions: ["flv"]
},
"video/x-m4v": {
source: "apache",
extensions: ["m4v"]
},
"video/x-matroska": {
source: "apache",
compressible: false,
extensions: ["mkv", "mk3d", "mks"]
},
"video/x-mng": {
source: "apache",
extensions: ["mng"]
},
"video/x-ms-asf": {
source: "apache",
extensions: ["asf", "asx"]
},
"video/x-ms-vob": {
source: "apache",
extensions: ["vob"]
},
"video/x-ms-wm": {
source: "apache",
extensions: ["wm"]
},
"video/x-ms-wmv": {
source: "apache",
compressible: false,
extensions: ["wmv"]
},
"video/x-ms-wmx": {
source: "apache",
extensions: ["wmx"]
},
"video/x-ms-wvx": {
source: "apache",
extensions: ["wvx"]
},
"video/x-msvideo": {
source: "apache",
extensions: ["avi"]
},
"video/x-sgi-movie": {
source: "apache",
extensions: ["movie"]
},
"video/x-smv": {
source: "apache",
extensions: ["smv"]
},
"x-conference/x-cooltalk": {
source: "apache",
extensions: ["ice"]
},
"x-shader/x-fragment": {
compressible: true
},
"x-shader/x-vertex": {
compressible: true
}
};
}
});
// node_modules/mime-db/index.js
var require_mime_db = __commonJS({
"node_modules/mime-db/index.js"(exports, module2) {
module2.exports = require_db();
}
});
// node_modules/mime-types/index.js
var require_mime_types = __commonJS({
"node_modules/mime-types/index.js"(exports) {
"use strict";
var db = require_mime_db();
var extname = require("path").extname;
var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/;
var TEXT_TYPE_REGEXP = /^text\//i;
exports.charset = charset;
exports.charsets = { lookup: charset };
exports.contentType = contentType;
exports.extension = extension;
exports.extensions = /* @__PURE__ */ Object.create(null);
exports.lookup = lookup;
exports.types = /* @__PURE__ */ Object.create(null);
populateMaps(exports.extensions, exports.types);
function charset(type) {
if (!type || typeof type !== "string") {
return false;
}
var match = EXTRACT_TYPE_REGEXP.exec(type);
var mime = match && db[match[1].toLowerCase()];
if (mime && mime.charset) {
return mime.charset;
}
if (match && TEXT_TYPE_REGEXP.test(match[1])) {
return "UTF-8";
}
return false;
}
function contentType(str) {
if (!str || typeof str !== "string") {
return false;
}
var mime = str.indexOf("/") === -1 ? exports.lookup(str) : str;
if (!mime) {
return false;
}
if (mime.indexOf("charset") === -1) {
var charset2 = exports.charset(mime);
if (charset2)
mime += "; charset=" + charset2.toLowerCase();
}
return mime;
}
function extension(type) {
if (!type || typeof type !== "string") {
return false;
}
var match = EXTRACT_TYPE_REGEXP.exec(type);
var exts = match && exports.extensions[match[1].toLowerCase()];
if (!exts || !exts.length) {
return false;
}
return exts[0];
}
function lookup(path3) {
if (!path3 || typeof path3 !== "string") {
return false;
}
var extension2 = extname("x." + path3).toLowerCase().substr(1);
if (!extension2) {
return false;
}
return exports.types[extension2] || false;
}
function populateMaps(extensions, types) {
var preference = ["nginx", "apache", void 0, "iana"];
Object.keys(db).forEach(function forEachMimeType(type) {
var mime = db[type];
var exts = mime.extensions;
if (!exts || !exts.length) {
return;
}
extensions[type] = exts;
for (var i = 0; i < exts.length; i++) {
var extension2 = exts[i];
if (types[extension2]) {
var from = preference.indexOf(db[types[extension2]].source);
var to = preference.indexOf(mime.source);
if (types[extension2] !== "application/octet-stream" && (from > to || from === to && types[extension2].substr(0, 12) === "application/")) {
continue;
}
}
types[extension2] = type;
}
});
}
}
});
// node_modules/caseless/index.js
var require_caseless = __commonJS({
"node_modules/caseless/index.js"(exports, module2) {
function Caseless(dict) {
this.dict = dict || {};
}
Caseless.prototype.set = function(name, value, clobber) {
if (typeof name === "object") {
for (var i in name) {
this.set(i, name[i], value);
}
} else {
if (typeof clobber === "undefined")
clobber = true;
var has = this.has(name);
if (!clobber && has)
this.dict[has] = this.dict[has] + "," + value;
else
this.dict[has || name] = value;
return has;
}
};
Caseless.prototype.has = function(name) {
var keys = Object.keys(this.dict), name = name.toLowerCase();
for (var i = 0; i < keys.length; i++) {
if (keys[i].toLowerCase() === name)
return keys[i];
}
return false;
};
Caseless.prototype.get = function(name) {
name = name.toLowerCase();
var result, _key;
var headers = this.dict;
Object.keys(headers).forEach(function(key) {
_key = key.toLowerCase();
if (name === _key)
result = headers[key];
});
return result;
};
Caseless.prototype.swap = function(name) {
var has = this.has(name);
if (has === name)
return;
if (!has)
throw new Error('There is no header than matches "' + name + '"');
this.dict[name] = this.dict[has];
delete this.dict[has];
};
Caseless.prototype.del = function(name) {
var has = this.has(name);
return delete this.dict[has || name];
};
module2.exports = function(dict) {
return new Caseless(dict);
};
module2.exports.httpify = function(resp, headers) {
var c = new Caseless(headers);
resp.setHeader = function(key, value, clobber) {
if (typeof value === "undefined")
return;
return c.set(key, value, clobber);
};
resp.hasHeader = function(key) {
return c.has(key);
};
resp.getHeader = function(key) {
return c.get(key);
};
resp.removeHeader = function(key) {
return c.del(key);
};
resp.headers = c.dict;
return c;
};
}
});
// node_modules/forever-agent/index.js
var require_forever_agent = __commonJS({
"node_modules/forever-agent/index.js"(exports, module2) {
module2.exports = ForeverAgent;
ForeverAgent.SSL = ForeverAgentSSL;
var util = require("util");
var Agent = require("http").Agent;
var net = require("net");
var tls = require("tls");
var AgentSSL = require("https").Agent;
function getConnectionName(host, port) {
var name = "";
if (typeof host === "string") {
name = host + ":" + port;
} else {
name = host.host + ":" + host.port + ":" + (host.localAddress ? host.localAddress + ":" : ":");
}
return name;
}
function ForeverAgent(options) {
var self2 = this;
self2.options = options || {};
self2.requests = {};
self2.sockets = {};
self2.freeSockets = {};
self2.maxSockets = self2.options.maxSockets || Agent.defaultMaxSockets;
self2.minSockets = self2.options.minSockets || ForeverAgent.defaultMinSockets;
self2.on("free", function(socket, host, port) {
var name = getConnectionName(host, port);
if (self2.requests[name] && self2.requests[name].length) {
self2.requests[name].shift().onSocket(socket);
} else if (self2.sockets[name].length < self2.minSockets) {
if (!self2.freeSockets[name])
self2.freeSockets[name] = [];
self2.freeSockets[name].push(socket);
var onIdleError = function() {
socket.destroy();
};
socket._onIdleError = onIdleError;
socket.on("error", onIdleError);
} else {
socket.destroy();
}
});
}
util.inherits(ForeverAgent, Agent);
ForeverAgent.defaultMinSockets = 5;
ForeverAgent.prototype.createConnection = net.createConnection;
ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest;
ForeverAgent.prototype.addRequest = function(req, host, port) {
var name = getConnectionName(host, port);
if (typeof host !== "string") {
var options = host;
port = options.port;
host = options.host;
}
if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) {
var idleSocket = this.freeSockets[name].pop();
idleSocket.removeListener("error", idleSocket._onIdleError);
delete idleSocket._onIdleError;
req._reusedSocket = true;
req.onSocket(idleSocket);
} else {
this.addRequestNoreuse(req, host, port);
}
};
ForeverAgent.prototype.removeSocket = function(s, name, host, port) {
if (this.sockets[name]) {
var index = this.sockets[name].indexOf(s);
if (index !== -1) {
this.sockets[name].splice(index, 1);
}
} else if (this.sockets[name] && this.sockets[name].length === 0) {
delete this.sockets[name];
delete this.requests[name];
}
if (this.freeSockets[name]) {
var index = this.freeSockets[name].indexOf(s);
if (index !== -1) {
this.freeSockets[name].splice(index, 1);
if (this.freeSockets[name].length === 0) {
delete this.freeSockets[name];
}
}
}
if (this.requests[name] && this.requests[name].length) {
this.createSocket(name, host, port).emit("free");
}
};
function ForeverAgentSSL(options) {
ForeverAgent.call(this, options);
}
util.inherits(ForeverAgentSSL, ForeverAgent);
ForeverAgentSSL.prototype.createConnection = createConnectionSSL;
ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest;
function createConnectionSSL(port, host, options) {
if (typeof port === "object") {
options = port;
} else if (typeof host === "object") {
options = host;
} else if (typeof options === "object") {
options = options;
} else {
options = {};
}
if (typeof port === "number") {
options.port = port;
}
if (typeof host === "string") {
options.host = host;
}
return tls.connect(options);
}
}
});
// node_modules/request/node_modules/form-data/lib/browser.js
var require_browser = __commonJS({
"node_modules/request/node_modules/form-data/lib/browser.js"(exports, module2) {
module2.exports = typeof self == "object" ? self.FormData : window.FormData;
}
});
// node_modules/isstream/isstream.js
var require_isstream = __commonJS({
"node_modules/isstream/isstream.js"(exports, module2) {
var stream = require("stream");
function isStream(obj) {
return obj instanceof stream.Stream;
}
function isReadable(obj) {
return isStream(obj) && typeof obj._read == "function" && typeof obj._readableState == "object";
}
function isWritable(obj) {
return isStream(obj) && typeof obj._write == "function" && typeof obj._writableState == "object";
}
function isDuplex(obj) {
return isReadable(obj) && isWritable(obj);
}
module2.exports = isStream;
module2.exports.isReadable = isReadable;
module2.exports.isWritable = isWritable;
module2.exports.isDuplex = isDuplex;
}
});
// node_modules/is-typedarray/index.js
var require_is_typedarray = __commonJS({
"node_modules/is-typedarray/index.js"(exports, module2) {
module2.exports = isTypedArray;
isTypedArray.strict = isStrictTypedArray;
isTypedArray.loose = isLooseTypedArray;
var toString = Object.prototype.toString;
var names = {
"[object Int8Array]": true,
"[object Int16Array]": true,
"[object Int32Array]": true,
"[object Uint8Array]": true,
"[object Uint8ClampedArray]": true,
"[object Uint16Array]": true,
"[object Uint32Array]": true,
"[object Float32Array]": true,
"[object Float64Array]": true
};
function isTypedArray(arr) {
return isStrictTypedArray(arr) || isLooseTypedArray(arr);
}
function isStrictTypedArray(arr) {
return arr instanceof Int8Array || arr instanceof Int16Array || arr instanceof Int32Array || arr instanceof Uint8Array || arr instanceof Uint8ClampedArray || arr instanceof Uint16Array || arr instanceof Uint32Array || arr instanceof Float32Array || arr instanceof Float64Array;
}
function isLooseTypedArray(arr) {
return names[toString.call(arr)];
}
}
});
// node_modules/request/lib/getProxyFromURI.js
var require_getProxyFromURI = __commonJS({
"node_modules/request/lib/getProxyFromURI.js"(exports, module2) {
"use strict";
function formatHostname(hostname) {
return hostname.replace(/^\.*/, ".").toLowerCase();
}
function parseNoProxyZone(zone) {
zone = zone.trim().toLowerCase();
var zoneParts = zone.split(":", 2);
var zoneHost = formatHostname(zoneParts[0]);
var zonePort = zoneParts[1];
var hasPort = zone.indexOf(":") > -1;
return { hostname: zoneHost, port: zonePort, hasPort };
}
function uriInNoProxy(uri, noProxy) {
var port = uri.port || (uri.protocol === "https:" ? "443" : "80");
var hostname = formatHostname(uri.hostname);
var noProxyList = noProxy.split(",");
return noProxyList.map(parseNoProxyZone).some(function(noProxyZone) {
var isMatchedAt = hostname.indexOf(noProxyZone.hostname);
var hostnameMatched = isMatchedAt > -1 && isMatchedAt === hostname.length - noProxyZone.hostname.length;
if (noProxyZone.hasPort) {
return port === noProxyZone.port && hostnameMatched;
}
return hostnameMatched;
});
}
function getProxyFromURI(uri) {
var noProxy = process.env.NO_PROXY || process.env.no_proxy || "";
if (noProxy === "*") {
return null;
}
if (noProxy !== "" && uriInNoProxy(uri, noProxy)) {
return null;
}
if (uri.protocol === "http:") {
return process.env.HTTP_PROXY || process.env.http_proxy || null;
}
if (uri.protocol === "https:") {
return process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy || null;
}
return null;
}
module2.exports = getProxyFromURI;
}
});
// node_modules/qs/lib/utils.js
var require_utils4 = __commonJS({
"node_modules/qs/lib/utils.js"(exports, module2) {
"use strict";
var has = Object.prototype.hasOwnProperty;
var hexTable = function() {
var array = [];
for (var i = 0; i < 256; ++i) {
array.push("%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase());
}
return array;
}();
var compactQueue = function compactQueue2(queue) {
var obj;
while (queue.length) {
var item = queue.pop();
obj = item.obj[item.prop];
if (Array.isArray(obj)) {
var compacted = [];
for (var j = 0; j < obj.length; ++j) {
if (typeof obj[j] !== "undefined") {
compacted.push(obj[j]);
}
}
item.obj[item.prop] = compacted;
}
}
return obj;
};
var arrayToObject = function arrayToObject2(source, options) {
var obj = options && options.plainObjects ? /* @__PURE__ */ Object.create(null) : {};
for (var i = 0; i < source.length; ++i) {
if (typeof source[i] !== "undefined") {
obj[i] = source[i];
}
}
return obj;
};
var merge = function merge2(target, source, options) {
if (!source) {
return target;
}
if (typeof source !== "object") {
if (Array.isArray(target)) {
target.push(source);
} else if (target && typeof target === "object") {
if (options && (options.plainObjects || options.allowPrototypes) || !has.call(Object.prototype, source)) {
target[source] = true;
}
} else {
return [target, source];
}
return target;
}
if (!target || typeof target !== "object") {
return [target].concat(source);
}
var mergeTarget = target;
if (Array.isArray(target) && !Array.isArray(source)) {
mergeTarget = arrayToObject(target, options);
}
if (Array.isArray(target) && Array.isArray(source)) {
source.forEach(function(item, i) {
if (has.call(target, i)) {
var targetItem = target[i];
if (targetItem && typeof targetItem === "object" && item && typeof item === "object") {
target[i] = merge2(targetItem, item, options);
} else {
target.push(item);
}
} else {
target[i] = item;
}
});
return target;
}
return Object.keys(source).reduce(function(acc, key) {
var value = source[key];
if (has.call(acc, key)) {
acc[key] = merge2(acc[key], value, options);
} else {
acc[key] = value;
}
return acc;
}, mergeTarget);
};
var assign = function assignSingleSource(target, source) {
return Object.keys(source).reduce(function(acc, key) {
acc[key] = source[key];
return acc;
}, target);
};
var decode = function(str) {
try {
return decodeURIComponent(str.replace(/\+/g, " "));
} catch (e) {
return str;
}
};
var encode = function encode2(str) {
if (str.length === 0) {
return str;
}
var string = typeof str === "string" ? str : String(str);
var out = "";
for (var i = 0; i < string.length; ++i) {
var c = string.charCodeAt(i);
if (c === 45 || c === 46 || c === 95 || c === 126 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122) {
out += string.charAt(i);
continue;
}
if (c < 128) {
out = out + hexTable[c];
continue;
}
if (c < 2048) {
out = out + (hexTable[192 | c >> 6] + hexTable[128 | c & 63]);
continue;
}
if (c < 55296 || c >= 57344) {
out = out + (hexTable[224 | c >> 12] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63]);
continue;
}
i += 1;
c = 65536 + ((c & 1023) << 10 | string.charCodeAt(i) & 1023);
out += hexTable[240 | c >> 18] + hexTable[128 | c >> 12 & 63] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63];
}
return out;
};
var compact = function compact2(value) {
var queue = [{ obj: { o: value }, prop: "o" }];
var refs = [];
for (var i = 0; i < queue.length; ++i) {
var item = queue[i];
var obj = item.obj[item.prop];
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
var val = obj[key];
if (typeof val === "object" && val !== null && refs.indexOf(val) === -1) {
queue.push({ obj, prop: key });
refs.push(val);
}
}
}
return compactQueue(queue);
};
var isRegExp = function isRegExp2(obj) {
return Object.prototype.toString.call(obj) === "[object RegExp]";
};
var isBuffer = function isBuffer2(obj) {
if (obj === null || typeof obj === "undefined") {
return false;
}
return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};
module2.exports = {
arrayToObject,
assign,
compact,
decode,
encode,
isBuffer,
isRegExp,
merge
};
}
});
// node_modules/qs/lib/formats.js
var require_formats = __commonJS({
"node_modules/qs/lib/formats.js"(exports, module2) {
"use strict";
var replace = String.prototype.replace;
var percentTwenties = /%20/g;
module2.exports = {
"default": "RFC3986",
formatters: {
RFC1738: function(value) {
return replace.call(value, percentTwenties, "+");
},
RFC3986: function(value) {
return String(value);
}
},
RFC1738: "RFC1738",
RFC3986: "RFC3986"
};
}
});
// node_modules/qs/lib/stringify.js
var require_stringify2 = __commonJS({
"node_modules/qs/lib/stringify.js"(exports, module2) {
"use strict";
var utils = require_utils4();
var formats = require_formats();
var arrayPrefixGenerators = {
brackets: function brackets(prefix) {
return prefix + "[]";
},
indices: function indices(prefix, key) {
return prefix + "[" + key + "]";
},
repeat: function repeat(prefix) {
return prefix;
}
};
var isArray = Array.isArray;
var push = Array.prototype.push;
var pushToArray = function(arr, valueOrArray) {
push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};
var toISO = Date.prototype.toISOString;
var defaults = {
delimiter: "&",
encode: true,
encoder: utils.encode,
encodeValuesOnly: false,
serializeDate: function serializeDate(date) {
return toISO.call(date);
},
skipNulls: false,
strictNullHandling: false
};
var stringify = function stringify2(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly) {
var obj = object;
if (typeof filter === "function") {
obj = filter(prefix, obj);
} else if (obj instanceof Date) {
obj = serializeDate(obj);
}
if (obj === null) {
if (strictNullHandling) {
return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;
}
obj = "";
}
if (typeof obj === "string" || typeof obj === "number" || typeof obj === "boolean" || utils.isBuffer(obj)) {
if (encoder) {
var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);
return [formatter(keyValue) + "=" + formatter(encoder(obj, defaults.encoder))];
}
return [formatter(prefix) + "=" + formatter(String(obj))];
}
var values = [];
if (typeof obj === "undefined") {
return values;
}
var objKeys;
if (isArray(filter)) {
objKeys = filter;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (skipNulls && obj[key] === null) {
continue;
}
if (isArray(obj)) {
pushToArray(values, stringify2(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly));
} else {
pushToArray(values, stringify2(obj[key], prefix + (allowDots ? "." + key : "[" + key + "]"), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly));
}
}
return values;
};
module2.exports = function(object, opts) {
var obj = object;
var options = opts ? utils.assign({}, opts) : {};
if (options.encoder !== null && typeof options.encoder !== "undefined" && typeof options.encoder !== "function") {
throw new TypeError("Encoder has to be a function.");
}
var delimiter = typeof options.delimiter === "undefined" ? defaults.delimiter : options.delimiter;
var strictNullHandling = typeof options.strictNullHandling === "boolean" ? options.strictNullHandling : defaults.strictNullHandling;
var skipNulls = typeof options.skipNulls === "boolean" ? options.skipNulls : defaults.skipNulls;
var encode = typeof options.encode === "boolean" ? options.encode : defaults.encode;
var encoder = typeof options.encoder === "function" ? options.encoder : defaults.encoder;
var sort = typeof options.sort === "function" ? options.sort : null;
var allowDots = typeof options.allowDots === "undefined" ? false : options.allowDots;
var serializeDate = typeof options.serializeDate === "function" ? options.serializeDate : defaults.serializeDate;
var encodeValuesOnly = typeof options.encodeValuesOnly === "boolean" ? options.encodeValuesOnly : defaults.encodeValuesOnly;
if (typeof options.format === "undefined") {
options.format = formats["default"];
} else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
throw new TypeError("Unknown format option provided.");
}
var formatter = formats.formatters[options.format];
var objKeys;
var filter;
if (typeof options.filter === "function") {
filter = options.filter;
obj = filter("", obj);
} else if (isArray(options.filter)) {
filter = options.filter;
objKeys = filter;
}
var keys = [];
if (typeof obj !== "object" || obj === null) {
return "";
}
var arrayFormat;
if (options.arrayFormat in arrayPrefixGenerators) {
arrayFormat = options.arrayFormat;
} else if ("indices" in options) {
arrayFormat = options.indices ? "indices" : "repeat";
} else {
arrayFormat = "indices";
}
var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
if (!objKeys) {
objKeys = Object.keys(obj);
}
if (sort) {
objKeys.sort(sort);
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (skipNulls && obj[key] === null) {
continue;
}
pushToArray(keys, stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode ? encoder : null, filter, sort, allowDots, serializeDate, formatter, encodeValuesOnly));
}
var joined = keys.join(delimiter);
var prefix = options.addQueryPrefix === true ? "?" : "";
return joined.length > 0 ? prefix + joined : "";
};
}
});
// node_modules/qs/lib/parse.js
var require_parse = __commonJS({
"node_modules/qs/lib/parse.js"(exports, module2) {
"use strict";
var utils = require_utils4();
var has = Object.prototype.hasOwnProperty;
var defaults = {
allowDots: false,
allowPrototypes: false,
arrayLimit: 20,
decoder: utils.decode,
delimiter: "&",
depth: 5,
parameterLimit: 1e3,
plainObjects: false,
strictNullHandling: false
};
var parseValues = function parseQueryStringValues(str, options) {
var obj = {};
var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, "") : str;
var limit = options.parameterLimit === Infinity ? void 0 : options.parameterLimit;
var parts = cleanStr.split(options.delimiter, limit);
for (var i = 0; i < parts.length; ++i) {
var part = parts[i];
var bracketEqualsPos = part.indexOf("]=");
var pos = bracketEqualsPos === -1 ? part.indexOf("=") : bracketEqualsPos + 1;
var key, val;
if (pos === -1) {
key = options.decoder(part, defaults.decoder);
val = options.strictNullHandling ? null : "";
} else {
key = options.decoder(part.slice(0, pos), defaults.decoder);
val = options.decoder(part.slice(pos + 1), defaults.decoder);
}
if (has.call(obj, key)) {
obj[key] = [].concat(obj[key]).concat(val);
} else {
obj[key] = val;
}
}
return obj;
};
var parseObject = function(chain, val, options) {
var leaf = val;
for (var i = chain.length - 1; i >= 0; --i) {
var obj;
var root = chain[i];
if (root === "[]" && options.parseArrays) {
obj = [].concat(leaf);
} else {
obj = options.plainObjects ? /* @__PURE__ */ Object.create(null) : {};
var cleanRoot = root.charAt(0) === "[" && root.charAt(root.length - 1) === "]" ? root.slice(1, -1) : root;
var index = parseInt(cleanRoot, 10);
if (!options.parseArrays && cleanRoot === "") {
obj = { 0: leaf };
} else if (!isNaN(index) && root !== cleanRoot && String(index) === cleanRoot && index >= 0 && (options.parseArrays && index <= options.arrayLimit)) {
obj = [];
obj[index] = leaf;
} else if (cleanRoot !== "__proto__") {
obj[cleanRoot] = leaf;
}
}
leaf = obj;
}
return leaf;
};
var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
if (!givenKey) {
return;
}
var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, "[$1]") : givenKey;
var brackets = /(\[[^[\]]*])/;
var child = /(\[[^[\]]*])/g;
var segment = brackets.exec(key);
var parent = segment ? key.slice(0, segment.index) : key;
var keys = [];
if (parent) {
if (!options.plainObjects && has.call(Object.prototype, parent)) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(parent);
}
var i = 0;
while ((segment = child.exec(key)) !== null && i < options.depth) {
i += 1;
if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(segment[1]);
}
if (segment) {
keys.push("[" + key.slice(segment.index) + "]");
}
return parseObject(keys, val, options);
};
module2.exports = function(str, opts) {
var options = opts ? utils.assign({}, opts) : {};
if (options.decoder !== null && options.decoder !== void 0 && typeof options.decoder !== "function") {
throw new TypeError("Decoder has to be a function.");
}
options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;
options.delimiter = typeof options.delimiter === "string" || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
options.depth = typeof options.depth === "number" ? options.depth : defaults.depth;
options.arrayLimit = typeof options.arrayLimit === "number" ? options.arrayLimit : defaults.arrayLimit;
options.parseArrays = options.parseArrays !== false;
options.decoder = typeof options.decoder === "function" ? options.decoder : defaults.decoder;
options.allowDots = typeof options.allowDots === "boolean" ? options.allowDots : defaults.allowDots;
options.plainObjects = typeof options.plainObjects === "boolean" ? options.plainObjects : defaults.plainObjects;
options.allowPrototypes = typeof options.allowPrototypes === "boolean" ? options.allowPrototypes : defaults.allowPrototypes;
options.parameterLimit = typeof options.parameterLimit === "number" ? options.parameterLimit : defaults.parameterLimit;
options.strictNullHandling = typeof options.strictNullHandling === "boolean" ? options.strictNullHandling : defaults.strictNullHandling;
if (str === "" || str === null || typeof str === "undefined") {
return options.plainObjects ? /* @__PURE__ */ Object.create(null) : {};
}
var tempObj = typeof str === "string" ? parseValues(str, options) : str;
var obj = options.plainObjects ? /* @__PURE__ */ Object.create(null) : {};
var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = parseKeys(key, tempObj[key], options);
obj = utils.merge(obj, newObj, options);
}
return utils.compact(obj);
};
}
});
// node_modules/qs/lib/index.js
var require_lib4 = __commonJS({
"node_modules/qs/lib/index.js"(exports, module2) {
"use strict";
var stringify = require_stringify2();
var parse = require_parse();
var formats = require_formats();
module2.exports = {
formats,
parse,
stringify
};
}
});
// node_modules/request/lib/querystring.js
var require_querystring = __commonJS({
"node_modules/request/lib/querystring.js"(exports) {
"use strict";
var qs = require_lib4();
var querystring = require("querystring");
function Querystring(request2) {
this.request = request2;
this.lib = null;
this.useQuerystring = null;
this.parseOptions = null;
this.stringifyOptions = null;
}
Querystring.prototype.init = function(options) {
if (this.lib) {
return;
}
this.useQuerystring = options.useQuerystring;
this.lib = this.useQuerystring ? querystring : qs;
this.parseOptions = options.qsParseOptions || {};
this.stringifyOptions = options.qsStringifyOptions || {};
};
Querystring.prototype.stringify = function(obj) {
return this.useQuerystring ? this.rfc3986(this.lib.stringify(obj, this.stringifyOptions.sep || null, this.stringifyOptions.eq || null, this.stringifyOptions)) : this.lib.stringify(obj, this.stringifyOptions);
};
Querystring.prototype.parse = function(str) {
return this.useQuerystring ? this.lib.parse(str, this.parseOptions.sep || null, this.parseOptions.eq || null, this.parseOptions) : this.lib.parse(str, this.parseOptions);
};
Querystring.prototype.rfc3986 = function(str) {
return str.replace(/[!'()*]/g, function(c) {
return "%" + c.charCodeAt(0).toString(16).toUpperCase();
});
};
Querystring.prototype.unescape = querystring.unescape;
exports.Querystring = Querystring;
}
});
// node_modules/uri-js/dist/es5/uri.all.js
var require_uri_all = __commonJS({
"node_modules/uri-js/dist/es5/uri.all.js"(exports, module2) {
(function(global2, factory) {
typeof exports === "object" && typeof module2 !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : factory(global2.URI = global2.URI || {});
})(exports, function(exports2) {
"use strict";
function merge() {
for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) {
sets[_key] = arguments[_key];
}
if (sets.length > 1) {
sets[0] = sets[0].slice(0, -1);
var xl = sets.length - 1;
for (var x = 1; x < xl; ++x) {
sets[x] = sets[x].slice(1, -1);
}
sets[xl] = sets[xl].slice(1);
return sets.join("");
} else {
return sets[0];
}
}
function subexp(str) {
return "(?:" + str + ")";
}
function typeOf(o) {
return o === void 0 ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase();
}
function toUpperCase(str) {
return str.toUpperCase();
}
function toArray(obj) {
return obj !== void 0 && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : [];
}
function assign(target, source) {
var obj = target;
if (source) {
for (var key in source) {
obj[key] = source[key];
}
}
return obj;
}
function buildExps(isIRI2) {
var ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$2 = merge(DIGIT$$, "[A-Fa-f]"), LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$2 = subexp(subexp("%[EFef]" + HEXDIG$$2 + "%" + HEXDIG$$2 + HEXDIG$$2 + "%" + HEXDIG$$2 + HEXDIG$$2) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$2 + "%" + HEXDIG$$2 + HEXDIG$$2) + "|" + subexp("%" + HEXDIG$$2 + HEXDIG$$2)), GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI2 ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", IPRIVATE$$ = isIRI2 ? "[\\uE000-\\uF8FF]" : "[]", UNRESERVED$$2 = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$2 + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$2 + "|" + PCT_ENCODED$2) + "+"), IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$2 + "{2})") + ZONEID$), IPVFUTURE$ = subexp("[vV]" + HEXDIG$$2 + "+\\." + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), REG_NAME$ = subexp(subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$2 + "|" + merge(UNRESERVED$$2, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$";
return {
NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"),
NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$2, SUB_DELIMS$$), "g"),
NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$2, SUB_DELIMS$$), "g"),
NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$2, SUB_DELIMS$$), "g"),
NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$2, SUB_DELIMS$$), "g"),
NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$2, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"),
NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$2, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"),
ESCAPE: new RegExp(merge("[^]", UNRESERVED$$2, SUB_DELIMS$$), "g"),
UNRESERVED: new RegExp(UNRESERVED$$2, "g"),
OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$2, RESERVED$$), "g"),
PCT_ENCODED: new RegExp(PCT_ENCODED$2, "g"),
IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"),
IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$2 + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$")
};
}
var URI_PROTOCOL = buildExps(false);
var IRI_PROTOCOL = buildExps(true);
var slicedToArray = function() {
function sliceIterator(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = void 0;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i)
break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"])
_i["return"]();
} finally {
if (_d)
throw _e;
}
}
return _arr;
}
return function(arr, i) {
if (Array.isArray(arr)) {
return arr;
} else if (Symbol.iterator in Object(arr)) {
return sliceIterator(arr, i);
} else {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
};
}();
var toConsumableArray = function(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++)
arr2[i] = arr[i];
return arr2;
} else {
return Array.from(arr);
}
};
var maxInt = 2147483647;
var base = 36;
var tMin = 1;
var tMax = 26;
var skew = 38;
var damp = 700;
var initialBias = 72;
var initialN = 128;
var delimiter = "-";
var regexPunycode = /^xn--/;
var regexNonASCII = /[^\0-\x7E]/;
var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g;
var errors = {
"overflow": "Overflow: input needs wider integers to process",
"not-basic": "Illegal input >= 0x80 (not a basic code point)",
"invalid-input": "Invalid input"
};
var baseMinusTMin = base - tMin;
var floor = Math.floor;
var stringFromCharCode = String.fromCharCode;
function error$1(type) {
throw new RangeError(errors[type]);
}
function map(array, fn) {
var result = [];
var length = array.length;
while (length--) {
result[length] = fn(array[length]);
}
return result;
}
function mapDomain(string, fn) {
var parts = string.split("@");
var result = "";
if (parts.length > 1) {
result = parts[0] + "@";
string = parts[1];
}
string = string.replace(regexSeparators, ".");
var labels = string.split(".");
var encoded = map(labels, fn).join(".");
return result + encoded;
}
function ucs2decode(string) {
var output = [];
var counter = 0;
var length = string.length;
while (counter < length) {
var value = string.charCodeAt(counter++);
if (value >= 55296 && value <= 56319 && counter < length) {
var extra = string.charCodeAt(counter++);
if ((extra & 64512) == 56320) {
output.push(((value & 1023) << 10) + (extra & 1023) + 65536);
} else {
output.push(value);
counter--;
}
} else {
output.push(value);
}
}
return output;
}
var ucs2encode = function ucs2encode2(array) {
return String.fromCodePoint.apply(String, toConsumableArray(array));
};
var basicToDigit = function basicToDigit2(codePoint) {
if (codePoint - 48 < 10) {
return codePoint - 22;
}
if (codePoint - 65 < 26) {
return codePoint - 65;
}
if (codePoint - 97 < 26) {
return codePoint - 97;
}
return base;
};
var digitToBasic = function digitToBasic2(digit, flag) {
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};
var adapt = function adapt2(delta, numPoints, firstTime) {
var k = 0;
delta = firstTime ? floor(delta / damp) : delta >> 1;
delta += floor(delta / numPoints);
for (; delta > baseMinusTMin * tMax >> 1; k += base) {
delta = floor(delta / baseMinusTMin);
}
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};
var decode = function decode2(input) {
var output = [];
var inputLength = input.length;
var i = 0;
var n = initialN;
var bias = initialBias;
var basic = input.lastIndexOf(delimiter);
if (basic < 0) {
basic = 0;
}
for (var j = 0; j < basic; ++j) {
if (input.charCodeAt(j) >= 128) {
error$1("not-basic");
}
output.push(input.charCodeAt(j));
}
for (var index = basic > 0 ? basic + 1 : 0; index < inputLength; ) {
var oldi = i;
for (var w = 1, k = base; ; k += base) {
if (index >= inputLength) {
error$1("invalid-input");
}
var digit = basicToDigit(input.charCodeAt(index++));
if (digit >= base || digit > floor((maxInt - i) / w)) {
error$1("overflow");
}
i += digit * w;
var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
if (digit < t) {
break;
}
var baseMinusT = base - t;
if (w > floor(maxInt / baseMinusT)) {
error$1("overflow");
}
w *= baseMinusT;
}
var out = output.length + 1;
bias = adapt(i - oldi, out, oldi == 0);
if (floor(i / out) > maxInt - n) {
error$1("overflow");
}
n += floor(i / out);
i %= out;
output.splice(i++, 0, n);
}
return String.fromCodePoint.apply(String, output);
};
var encode = function encode2(input) {
var output = [];
input = ucs2decode(input);
var inputLength = input.length;
var n = initialN;
var delta = 0;
var bias = initialBias;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = void 0;
try {
for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _currentValue2 = _step.value;
if (_currentValue2 < 128) {
output.push(stringFromCharCode(_currentValue2));
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var basicLength = output.length;
var handledCPCount = basicLength;
if (basicLength) {
output.push(delimiter);
}
while (handledCPCount < inputLength) {
var m = maxInt;
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = void 0;
try {
for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var currentValue = _step2.value;
if (currentValue >= n && currentValue < m) {
m = currentValue;
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
var handledCPCountPlusOne = handledCPCount + 1;
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
error$1("overflow");
}
delta += (m - n) * handledCPCountPlusOne;
n = m;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = void 0;
try {
for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var _currentValue = _step3.value;
if (_currentValue < n && ++delta > maxInt) {
error$1("overflow");
}
if (_currentValue == n) {
var q2 = delta;
for (var k = base; ; k += base) {
var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
if (q2 < t) {
break;
}
var qMinusT = q2 - t;
var baseMinusT = base - t;
output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
q2 = floor(qMinusT / baseMinusT);
}
output.push(stringFromCharCode(digitToBasic(q2, 0)));
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
delta = 0;
++handledCPCount;
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
++delta;
++n;
}
return output.join("");
};
var toUnicode = function toUnicode2(input) {
return mapDomain(input, function(string) {
return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
});
};
var toASCII = function toASCII2(input) {
return mapDomain(input, function(string) {
return regexNonASCII.test(string) ? "xn--" + encode(string) : string;
});
};
var punycode = {
"version": "2.1.0",
"ucs2": {
"decode": ucs2decode,
"encode": ucs2encode
},
"decode": decode,
"encode": encode,
"toASCII": toASCII,
"toUnicode": toUnicode
};
var SCHEMES = {};
function pctEncChar(chr) {
var c = chr.charCodeAt(0);
var e = void 0;
if (c < 16)
e = "%0" + c.toString(16).toUpperCase();
else if (c < 128)
e = "%" + c.toString(16).toUpperCase();
else if (c < 2048)
e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();
else
e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();
return e;
}
function pctDecChars(str) {
var newStr = "";
var i = 0;
var il = str.length;
while (i < il) {
var c = parseInt(str.substr(i + 1, 2), 16);
if (c < 128) {
newStr += String.fromCharCode(c);
i += 3;
} else if (c >= 194 && c < 224) {
if (il - i >= 6) {
var c2 = parseInt(str.substr(i + 4, 2), 16);
newStr += String.fromCharCode((c & 31) << 6 | c2 & 63);
} else {
newStr += str.substr(i, 6);
}
i += 6;
} else if (c >= 224) {
if (il - i >= 9) {
var _c = parseInt(str.substr(i + 4, 2), 16);
var c3 = parseInt(str.substr(i + 7, 2), 16);
newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63);
} else {
newStr += str.substr(i, 9);
}
i += 9;
} else {
newStr += str.substr(i, 3);
i += 3;
}
}
return newStr;
}
function _normalizeComponentEncoding(components, protocol) {
function decodeUnreserved2(str) {
var decStr = pctDecChars(str);
return !decStr.match(protocol.UNRESERVED) ? str : decStr;
}
if (components.scheme)
components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved2).toLowerCase().replace(protocol.NOT_SCHEME, "");
if (components.userinfo !== void 0)
components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
if (components.host !== void 0)
components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved2).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
if (components.path !== void 0)
components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
if (components.query !== void 0)
components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
if (components.fragment !== void 0)
components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved2).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);
return components;
}
function _stripLeadingZeros(str) {
return str.replace(/^0*(.*)/, "$1") || "0";
}
function _normalizeIPv4(host, protocol) {
var matches = host.match(protocol.IPV4ADDRESS) || [];
var _matches = slicedToArray(matches, 2), address = _matches[1];
if (address) {
return address.split(".").map(_stripLeadingZeros).join(".");
} else {
return host;
}
}
function _normalizeIPv6(host, protocol) {
var matches = host.match(protocol.IPV6ADDRESS) || [];
var _matches2 = slicedToArray(matches, 3), address = _matches2[1], zone = _matches2[2];
if (address) {
var _address$toLowerCase$ = address.toLowerCase().split("::").reverse(), _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), last = _address$toLowerCase$2[0], first = _address$toLowerCase$2[1];
var firstFields = first ? first.split(":").map(_stripLeadingZeros) : [];
var lastFields = last.split(":").map(_stripLeadingZeros);
var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);
var fieldCount = isLastFieldIPv4Address ? 7 : 8;
var lastFieldsStart = lastFields.length - fieldCount;
var fields = Array(fieldCount);
for (var x = 0; x < fieldCount; ++x) {
fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || "";
}
if (isLastFieldIPv4Address) {
fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);
}
var allZeroFields = fields.reduce(function(acc, field, index) {
if (!field || field === "0") {
var lastLongest = acc[acc.length - 1];
if (lastLongest && lastLongest.index + lastLongest.length === index) {
lastLongest.length++;
} else {
acc.push({ index, length: 1 });
}
}
return acc;
}, []);
var longestZeroFields = allZeroFields.sort(function(a, b) {
return b.length - a.length;
})[0];
var newHost = void 0;
if (longestZeroFields && longestZeroFields.length > 1) {
var newFirst = fields.slice(0, longestZeroFields.index);
var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);
newHost = newFirst.join(":") + "::" + newLast.join(":");
} else {
newHost = fields.join(":");
}
if (zone) {
newHost += "%" + zone;
}
return newHost;
} else {
return host;
}
}
var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === void 0;
function parse(uriString) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var components = {};
var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
if (options.reference === "suffix")
uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString;
var matches = uriString.match(URI_PARSE);
if (matches) {
if (NO_MATCH_IS_UNDEFINED) {
components.scheme = matches[1];
components.userinfo = matches[3];
components.host = matches[4];
components.port = parseInt(matches[5], 10);
components.path = matches[6] || "";
components.query = matches[7];
components.fragment = matches[8];
if (isNaN(components.port)) {
components.port = matches[5];
}
} else {
components.scheme = matches[1] || void 0;
components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : void 0;
components.host = uriString.indexOf("//") !== -1 ? matches[4] : void 0;
components.port = parseInt(matches[5], 10);
components.path = matches[6] || "";
components.query = uriString.indexOf("?") !== -1 ? matches[7] : void 0;
components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : void 0;
if (isNaN(components.port)) {
components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : void 0;
}
}
if (components.host) {
components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);
}
if (components.scheme === void 0 && components.userinfo === void 0 && components.host === void 0 && components.port === void 0 && !components.path && components.query === void 0) {
components.reference = "same-document";
} else if (components.scheme === void 0) {
components.reference = "relative";
} else if (components.fragment === void 0) {
components.reference = "absolute";
} else {
components.reference = "uri";
}
if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) {
components.error = components.error || "URI is not a " + options.reference + " reference.";
}
var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) {
try {
components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());
} catch (e) {
components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e;
}
}
_normalizeComponentEncoding(components, URI_PROTOCOL);
} else {
_normalizeComponentEncoding(components, protocol);
}
if (schemeHandler && schemeHandler.parse) {
schemeHandler.parse(components, options);
}
} else {
components.error = components.error || "URI can not be parsed.";
}
return components;
}
function _recomposeAuthority(components, options) {
var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
var uriTokens = [];
if (components.userinfo !== void 0) {
uriTokens.push(components.userinfo);
uriTokens.push("@");
}
if (components.host !== void 0) {
uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function(_, $1, $2) {
return "[" + $1 + ($2 ? "%25" + $2 : "") + "]";
}));
}
if (typeof components.port === "number" || typeof components.port === "string") {
uriTokens.push(":");
uriTokens.push(String(components.port));
}
return uriTokens.length ? uriTokens.join("") : void 0;
}
var RDS1 = /^\.\.?\//;
var RDS2 = /^\/\.(\/|$)/;
var RDS3 = /^\/\.\.(\/|$)/;
var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/;
function removeDotSegments(input) {
var output = [];
while (input.length) {
if (input.match(RDS1)) {
input = input.replace(RDS1, "");
} else if (input.match(RDS2)) {
input = input.replace(RDS2, "/");
} else if (input.match(RDS3)) {
input = input.replace(RDS3, "/");
output.pop();
} else if (input === "." || input === "..") {
input = "";
} else {
var im = input.match(RDS5);
if (im) {
var s = im[0];
input = input.slice(s.length);
output.push(s);
} else {
throw new Error("Unexpected dot segment condition");
}
}
}
return output.join("");
}
function serialize(components) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL;
var uriTokens = [];
var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()];
if (schemeHandler && schemeHandler.serialize)
schemeHandler.serialize(components, options);
if (components.host) {
if (protocol.IPV6ADDRESS.test(components.host)) {
} else if (options.domainHost || schemeHandler && schemeHandler.domainHost) {
try {
components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host);
} catch (e) {
components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
}
}
}
_normalizeComponentEncoding(components, protocol);
if (options.reference !== "suffix" && components.scheme) {
uriTokens.push(components.scheme);
uriTokens.push(":");
}
var authority = _recomposeAuthority(components, options);
if (authority !== void 0) {
if (options.reference !== "suffix") {
uriTokens.push("//");
}
uriTokens.push(authority);
if (components.path && components.path.charAt(0) !== "/") {
uriTokens.push("/");
}
}
if (components.path !== void 0) {
var s = components.path;
if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
s = removeDotSegments(s);
}
if (authority === void 0) {
s = s.replace(/^\/\//, "/%2F");
}
uriTokens.push(s);
}
if (components.query !== void 0) {
uriTokens.push("?");
uriTokens.push(components.query);
}
if (components.fragment !== void 0) {
uriTokens.push("#");
uriTokens.push(components.fragment);
}
return uriTokens.join("");
}
function resolveComponents(base2, relative) {
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
var skipNormalization = arguments[3];
var target = {};
if (!skipNormalization) {
base2 = parse(serialize(base2, options), options);
relative = parse(serialize(relative, options), options);
}
options = options || {};
if (!options.tolerant && relative.scheme) {
target.scheme = relative.scheme;
target.userinfo = relative.userinfo;
target.host = relative.host;
target.port = relative.port;
target.path = removeDotSegments(relative.path || "");
target.query = relative.query;
} else {
if (relative.userinfo !== void 0 || relative.host !== void 0 || relative.port !== void 0) {
target.userinfo = relative.userinfo;
target.host = relative.host;
target.port = relative.port;
target.path = removeDotSegments(relative.path || "");
target.query = relative.query;
} else {
if (!relative.path) {
target.path = base2.path;
if (relative.query !== void 0) {
target.query = relative.query;
} else {
target.query = base2.query;
}
} else {
if (relative.path.charAt(0) === "/") {
target.path = removeDotSegments(relative.path);
} else {
if ((base2.userinfo !== void 0 || base2.host !== void 0 || base2.port !== void 0) && !base2.path) {
target.path = "/" + relative.path;
} else if (!base2.path) {
target.path = relative.path;
} else {
target.path = base2.path.slice(0, base2.path.lastIndexOf("/") + 1) + relative.path;
}
target.path = removeDotSegments(target.path);
}
target.query = relative.query;
}
target.userinfo = base2.userinfo;
target.host = base2.host;
target.port = base2.port;
}
target.scheme = base2.scheme;
}
target.fragment = relative.fragment;
return target;
}
function resolve(baseURI, relativeURI, options) {
var schemelessOptions = assign({ scheme: "null" }, options);
return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
}
function normalize(uri, options) {
if (typeof uri === "string") {
uri = serialize(parse(uri, options), options);
} else if (typeOf(uri) === "object") {
uri = parse(serialize(uri, options), options);
}
return uri;
}
function equal(uriA, uriB, options) {
if (typeof uriA === "string") {
uriA = serialize(parse(uriA, options), options);
} else if (typeOf(uriA) === "object") {
uriA = serialize(uriA, options);
}
if (typeof uriB === "string") {
uriB = serialize(parse(uriB, options), options);
} else if (typeOf(uriB) === "object") {
uriB = serialize(uriB, options);
}
return uriA === uriB;
}
function escapeComponent(str, options) {
return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar);
}
function unescapeComponent(str, options) {
return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars);
}
var handler = {
scheme: "http",
domainHost: true,
parse: function parse2(components, options) {
if (!components.host) {
components.error = components.error || "HTTP URIs must have a host.";
}
return components;
},
serialize: function serialize2(components, options) {
var secure = String(components.scheme).toLowerCase() === "https";
if (components.port === (secure ? 443 : 80) || components.port === "") {
components.port = void 0;
}
if (!components.path) {
components.path = "/";
}
return components;
}
};
var handler$1 = {
scheme: "https",
domainHost: handler.domainHost,
parse: handler.parse,
serialize: handler.serialize
};
function isSecure(wsComponents) {
return typeof wsComponents.secure === "boolean" ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss";
}
var handler$2 = {
scheme: "ws",
domainHost: true,
parse: function parse2(components, options) {
var wsComponents = components;
wsComponents.secure = isSecure(wsComponents);
wsComponents.resourceName = (wsComponents.path || "/") + (wsComponents.query ? "?" + wsComponents.query : "");
wsComponents.path = void 0;
wsComponents.query = void 0;
return wsComponents;
},
serialize: function serialize2(wsComponents, options) {
if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") {
wsComponents.port = void 0;
}
if (typeof wsComponents.secure === "boolean") {
wsComponents.scheme = wsComponents.secure ? "wss" : "ws";
wsComponents.secure = void 0;
}
if (wsComponents.resourceName) {
var _wsComponents$resourc = wsComponents.resourceName.split("?"), _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2), path3 = _wsComponents$resourc2[0], query = _wsComponents$resourc2[1];
wsComponents.path = path3 && path3 !== "/" ? path3 : void 0;
wsComponents.query = query;
wsComponents.resourceName = void 0;
}
wsComponents.fragment = void 0;
return wsComponents;
}
};
var handler$3 = {
scheme: "wss",
domainHost: handler$2.domainHost,
parse: handler$2.parse,
serialize: handler$2.serialize
};
var O = {};
var isIRI = true;
var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]";
var HEXDIG$$ = "[0-9A-Fa-f]";
var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$));
var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]";
var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]";
var VCHAR$$ = merge(QTEXT$$, '[\\"\\\\]');
var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]";
var UNRESERVED = new RegExp(UNRESERVED$$, "g");
var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g");
var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g");
var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g");
var NOT_HFVALUE = NOT_HFNAME;
function decodeUnreserved(str) {
var decStr = pctDecChars(str);
return !decStr.match(UNRESERVED) ? str : decStr;
}
var handler$4 = {
scheme: "mailto",
parse: function parse$$1(components, options) {
var mailtoComponents = components;
var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : [];
mailtoComponents.path = void 0;
if (mailtoComponents.query) {
var unknownHeaders = false;
var headers = {};
var hfields = mailtoComponents.query.split("&");
for (var x = 0, xl = hfields.length; x < xl; ++x) {
var hfield = hfields[x].split("=");
switch (hfield[0]) {
case "to":
var toAddrs = hfield[1].split(",");
for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) {
to.push(toAddrs[_x]);
}
break;
case "subject":
mailtoComponents.subject = unescapeComponent(hfield[1], options);
break;
case "body":
mailtoComponents.body = unescapeComponent(hfield[1], options);
break;
default:
unknownHeaders = true;
headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);
break;
}
}
if (unknownHeaders)
mailtoComponents.headers = headers;
}
mailtoComponents.query = void 0;
for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) {
var addr = to[_x2].split("@");
addr[0] = unescapeComponent(addr[0]);
if (!options.unicodeSupport) {
try {
addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());
} catch (e) {
mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e;
}
} else {
addr[1] = unescapeComponent(addr[1], options).toLowerCase();
}
to[_x2] = addr.join("@");
}
return mailtoComponents;
},
serialize: function serialize$$1(mailtoComponents, options) {
var components = mailtoComponents;
var to = toArray(mailtoComponents.to);
if (to) {
for (var x = 0, xl = to.length; x < xl; ++x) {
var toAddr = String(to[x]);
var atIdx = toAddr.lastIndexOf("@");
var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);
var domain = toAddr.slice(atIdx + 1);
try {
domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain);
} catch (e) {
components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e;
}
to[x] = localPart + "@" + domain;
}
components.path = to.join(",");
}
var headers = mailtoComponents.headers = mailtoComponents.headers || {};
if (mailtoComponents.subject)
headers["subject"] = mailtoComponents.subject;
if (mailtoComponents.body)
headers["body"] = mailtoComponents.body;
var fields = [];
for (var name in headers) {
if (headers[name] !== O[name]) {
fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar));
}
}
if (fields.length) {
components.query = fields.join("&");
}
return components;
}
};
var URN_PARSE = /^([^\:]+)\:(.*)/;
var handler$5 = {
scheme: "urn",
parse: function parse$$1(components, options) {
var matches = components.path && components.path.match(URN_PARSE);
var urnComponents = components;
if (matches) {
var scheme = options.scheme || urnComponents.scheme || "urn";
var nid = matches[1].toLowerCase();
var nss = matches[2];
var urnScheme = scheme + ":" + (options.nid || nid);
var schemeHandler = SCHEMES[urnScheme];
urnComponents.nid = nid;
urnComponents.nss = nss;
urnComponents.path = void 0;
if (schemeHandler) {
urnComponents = schemeHandler.parse(urnComponents, options);
}
} else {
urnComponents.error = urnComponents.error || "URN can not be parsed.";
}
return urnComponents;
},
serialize: function serialize$$1(urnComponents, options) {
var scheme = options.scheme || urnComponents.scheme || "urn";
var nid = urnComponents.nid;
var urnScheme = scheme + ":" + (options.nid || nid);
var schemeHandler = SCHEMES[urnScheme];
if (schemeHandler) {
urnComponents = schemeHandler.serialize(urnComponents, options);
}
var uriComponents = urnComponents;
var nss = urnComponents.nss;
uriComponents.path = (nid || options.nid) + ":" + nss;
return uriComponents;
}
};
var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
var handler$6 = {
scheme: "urn:uuid",
parse: function parse2(urnComponents, options) {
var uuidComponents = urnComponents;
uuidComponents.uuid = uuidComponents.nss;
uuidComponents.nss = void 0;
if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {
uuidComponents.error = uuidComponents.error || "UUID is not valid.";
}
return uuidComponents;
},
serialize: function serialize2(uuidComponents, options) {
var urnComponents = uuidComponents;
urnComponents.nss = (uuidComponents.uuid || "").toLowerCase();
return urnComponents;
}
};
SCHEMES[handler.scheme] = handler;
SCHEMES[handler$1.scheme] = handler$1;
SCHEMES[handler$2.scheme] = handler$2;
SCHEMES[handler$3.scheme] = handler$3;
SCHEMES[handler$4.scheme] = handler$4;
SCHEMES[handler$5.scheme] = handler$5;
SCHEMES[handler$6.scheme] = handler$6;
exports2.SCHEMES = SCHEMES;
exports2.pctEncChar = pctEncChar;
exports2.pctDecChars = pctDecChars;
exports2.parse = parse;
exports2.removeDotSegments = removeDotSegments;
exports2.serialize = serialize;
exports2.resolveComponents = resolveComponents;
exports2.resolve = resolve;
exports2.normalize = normalize;
exports2.equal = equal;
exports2.escapeComponent = escapeComponent;
exports2.unescapeComponent = unescapeComponent;
Object.defineProperty(exports2, "__esModule", { value: true });
});
}
});
// node_modules/fast-deep-equal/index.js
var require_fast_deep_equal = __commonJS({
"node_modules/fast-deep-equal/index.js"(exports, module2) {
"use strict";
module2.exports = function equal(a, b) {
if (a === b)
return true;
if (a && b && typeof a == "object" && typeof b == "object") {
if (a.constructor !== b.constructor)
return false;
var length, i, keys;
if (Array.isArray(a)) {
length = a.length;
if (length != b.length)
return false;
for (i = length; i-- !== 0; )
if (!equal(a[i], b[i]))
return false;
return true;
}
if (a.constructor === RegExp)
return a.source === b.source && a.flags === b.flags;
if (a.valueOf !== Object.prototype.valueOf)
return a.valueOf() === b.valueOf();
if (a.toString !== Object.prototype.toString)
return a.toString() === b.toString();
keys = Object.keys(a);
length = keys.length;
if (length !== Object.keys(b).length)
return false;
for (i = length; i-- !== 0; )
if (!Object.prototype.hasOwnProperty.call(b, keys[i]))
return false;
for (i = length; i-- !== 0; ) {
var key = keys[i];
if (!equal(a[key], b[key]))
return false;
}
return true;
}
return a !== a && b !== b;
};
}
});
// node_modules/ajv/lib/compile/ucs2length.js
var require_ucs2length = __commonJS({
"node_modules/ajv/lib/compile/ucs2length.js"(exports, module2) {
"use strict";
module2.exports = function ucs2length(str) {
var length = 0, len = str.length, pos = 0, value;
while (pos < len) {
length++;
value = str.charCodeAt(pos++);
if (value >= 55296 && value <= 56319 && pos < len) {
value = str.charCodeAt(pos);
if ((value & 64512) == 56320)
pos++;
}
}
return length;
};
}
});
// node_modules/ajv/lib/compile/util.js
var require_util3 = __commonJS({
"node_modules/ajv/lib/compile/util.js"(exports, module2) {
"use strict";
module2.exports = {
copy,
checkDataType,
checkDataTypes,
coerceToTypes,
toHash,
getProperty,
escapeQuotes,
equal: require_fast_deep_equal(),
ucs2length: require_ucs2length(),
varOccurences,
varReplace,
schemaHasRules,
schemaHasRulesExcept,
schemaUnknownRules,
toQuotedString,
getPathExpr,
getPath,
getData,
unescapeFragment,
unescapeJsonPointer,
escapeFragment,
escapeJsonPointer
};
function copy(o, to) {
to = to || {};
for (var key in o)
to[key] = o[key];
return to;
}
function checkDataType(dataType, data, strictNumbers, negate) {
var EQUAL = negate ? " !== " : " === ", AND = negate ? " || " : " && ", OK = negate ? "!" : "", NOT = negate ? "" : "!";
switch (dataType) {
case "null":
return data + EQUAL + "null";
case "array":
return OK + "Array.isArray(" + data + ")";
case "object":
return "(" + OK + data + AND + "typeof " + data + EQUAL + '"object"' + AND + NOT + "Array.isArray(" + data + "))";
case "integer":
return "(typeof " + data + EQUAL + '"number"' + AND + NOT + "(" + data + " % 1)" + AND + data + EQUAL + data + (strictNumbers ? AND + OK + "isFinite(" + data + ")" : "") + ")";
case "number":
return "(typeof " + data + EQUAL + '"' + dataType + '"' + (strictNumbers ? AND + OK + "isFinite(" + data + ")" : "") + ")";
default:
return "typeof " + data + EQUAL + '"' + dataType + '"';
}
}
function checkDataTypes(dataTypes, data, strictNumbers) {
switch (dataTypes.length) {
case 1:
return checkDataType(dataTypes[0], data, strictNumbers, true);
default:
var code = "";
var types = toHash(dataTypes);
if (types.array && types.object) {
code = types.null ? "(" : "(!" + data + " || ";
code += "typeof " + data + ' !== "object")';
delete types.null;
delete types.array;
delete types.object;
}
if (types.number)
delete types.integer;
for (var t in types)
code += (code ? " && " : "") + checkDataType(t, data, strictNumbers, true);
return code;
}
}
var COERCE_TO_TYPES = toHash(["string", "number", "integer", "boolean", "null"]);
function coerceToTypes(optionCoerceTypes, dataTypes) {
if (Array.isArray(dataTypes)) {
var types = [];
for (var i = 0; i < dataTypes.length; i++) {
var t = dataTypes[i];
if (COERCE_TO_TYPES[t])
types[types.length] = t;
else if (optionCoerceTypes === "array" && t === "array")
types[types.length] = t;
}
if (types.length)
return types;
} else if (COERCE_TO_TYPES[dataTypes]) {
return [dataTypes];
} else if (optionCoerceTypes === "array" && dataTypes === "array") {
return ["array"];
}
}
function toHash(arr) {
var hash = {};
for (var i = 0; i < arr.length; i++)
hash[arr[i]] = true;
return hash;
}
var IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
var SINGLE_QUOTE = /'|\\/g;
function getProperty(key) {
return typeof key == "number" ? "[" + key + "]" : IDENTIFIER.test(key) ? "." + key : "['" + escapeQuotes(key) + "']";
}
function escapeQuotes(str) {
return str.replace(SINGLE_QUOTE, "\\$&").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\f/g, "\\f").replace(/\t/g, "\\t");
}
function varOccurences(str, dataVar) {
dataVar += "[^0-9]";
var matches = str.match(new RegExp(dataVar, "g"));
return matches ? matches.length : 0;
}
function varReplace(str, dataVar, expr) {
dataVar += "([^0-9])";
expr = expr.replace(/\$/g, "$$$$");
return str.replace(new RegExp(dataVar, "g"), expr + "$1");
}
function schemaHasRules(schema, rules) {
if (typeof schema == "boolean")
return !schema;
for (var key in schema)
if (rules[key])
return true;
}
function schemaHasRulesExcept(schema, rules, exceptKeyword) {
if (typeof schema == "boolean")
return !schema && exceptKeyword != "not";
for (var key in schema)
if (key != exceptKeyword && rules[key])
return true;
}
function schemaUnknownRules(schema, rules) {
if (typeof schema == "boolean")
return;
for (var key in schema)
if (!rules[key])
return key;
}
function toQuotedString(str) {
return "'" + escapeQuotes(str) + "'";
}
function getPathExpr(currentPath, expr, jsonPointers, isNumber) {
var path3 = jsonPointers ? "'/' + " + expr + (isNumber ? "" : ".replace(/~/g, '~0').replace(/\\//g, '~1')") : isNumber ? "'[' + " + expr + " + ']'" : "'[\\'' + " + expr + " + '\\']'";
return joinPaths(currentPath, path3);
}
function getPath(currentPath, prop, jsonPointers) {
var path3 = jsonPointers ? toQuotedString("/" + escapeJsonPointer(prop)) : toQuotedString(getProperty(prop));
return joinPaths(currentPath, path3);
}
var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, lvl, paths) {
var up, jsonPointer, data, matches;
if ($data === "")
return "rootData";
if ($data[0] == "/") {
if (!JSON_POINTER.test($data))
throw new Error("Invalid JSON-pointer: " + $data);
jsonPointer = $data;
data = "rootData";
} else {
matches = $data.match(RELATIVE_JSON_POINTER);
if (!matches)
throw new Error("Invalid JSON-pointer: " + $data);
up = +matches[1];
jsonPointer = matches[2];
if (jsonPointer == "#") {
if (up >= lvl)
throw new Error("Cannot access property/index " + up + " levels up, current level is " + lvl);
return paths[lvl - up];
}
if (up > lvl)
throw new Error("Cannot access data " + up + " levels up, current level is " + lvl);
data = "data" + (lvl - up || "");
if (!jsonPointer)
return data;
}
var expr = data;
var segments = jsonPointer.split("/");
for (var i = 0; i < segments.length; i++) {
var segment = segments[i];
if (segment) {
data += getProperty(unescapeJsonPointer(segment));
expr += " && " + data;
}
}
return expr;
}
function joinPaths(a, b) {
if (a == '""')
return b;
return (a + " + " + b).replace(/([^\\])' \+ '/g, "$1");
}
function unescapeFragment(str) {
return unescapeJsonPointer(decodeURIComponent(str));
}
function escapeFragment(str) {
return encodeURIComponent(escapeJsonPointer(str));
}
function escapeJsonPointer(str) {
return str.replace(/~/g, "~0").replace(/\//g, "~1");
}
function unescapeJsonPointer(str) {
return str.replace(/~1/g, "/").replace(/~0/g, "~");
}
}
});
// node_modules/ajv/lib/compile/schema_obj.js
var require_schema_obj = __commonJS({
"node_modules/ajv/lib/compile/schema_obj.js"(exports, module2) {
"use strict";
var util = require_util3();
module2.exports = SchemaObject;
function SchemaObject(obj) {
util.copy(obj, this);
}
}
});
// node_modules/json-schema-traverse/index.js
var require_json_schema_traverse = __commonJS({
"node_modules/json-schema-traverse/index.js"(exports, module2) {
"use strict";
var traverse = module2.exports = function(schema, opts, cb) {
if (typeof opts == "function") {
cb = opts;
opts = {};
}
cb = opts.cb || cb;
var pre = typeof cb == "function" ? cb : cb.pre || function() {
};
var post = cb.post || function() {
};
_traverse(opts, pre, post, schema, "", schema);
};
traverse.keywords = {
additionalItems: true,
items: true,
contains: true,
additionalProperties: true,
propertyNames: true,
not: true
};
traverse.arrayKeywords = {
items: true,
allOf: true,
anyOf: true,
oneOf: true
};
traverse.propsKeywords = {
definitions: true,
properties: true,
patternProperties: true,
dependencies: true
};
traverse.skipKeywords = {
default: true,
enum: true,
const: true,
required: true,
maximum: true,
minimum: true,
exclusiveMaximum: true,
exclusiveMinimum: true,
multipleOf: true,
maxLength: true,
minLength: true,
pattern: true,
format: true,
maxItems: true,
minItems: true,
uniqueItems: true,
maxProperties: true,
minProperties: true
};
function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
if (schema && typeof schema == "object" && !Array.isArray(schema)) {
pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
for (var key in schema) {
var sch = schema[key];
if (Array.isArray(sch)) {
if (key in traverse.arrayKeywords) {
for (var i = 0; i < sch.length; i++)
_traverse(opts, pre, post, sch[i], jsonPtr + "/" + key + "/" + i, rootSchema, jsonPtr, key, schema, i);
}
} else if (key in traverse.propsKeywords) {
if (sch && typeof sch == "object") {
for (var prop in sch)
_traverse(opts, pre, post, sch[prop], jsonPtr + "/" + key + "/" + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
}
} else if (key in traverse.keywords || opts.allKeys && !(key in traverse.skipKeywords)) {
_traverse(opts, pre, post, sch, jsonPtr + "/" + key, rootSchema, jsonPtr, key, schema);
}
}
post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
}
}
function escapeJsonPtr(str) {
return str.replace(/~/g, "~0").replace(/\//g, "~1");
}
}
});
// node_modules/ajv/lib/compile/resolve.js
var require_resolve = __commonJS({
"node_modules/ajv/lib/compile/resolve.js"(exports, module2) {
"use strict";
var URI = require_uri_all();
var equal = require_fast_deep_equal();
var util = require_util3();
var SchemaObject = require_schema_obj();
var traverse = require_json_schema_traverse();
module2.exports = resolve;
resolve.normalizeId = normalizeId;
resolve.fullPath = getFullPath;
resolve.url = resolveUrl;
resolve.ids = resolveIds;
resolve.inlineRef = inlineRef;
resolve.schema = resolveSchema;
function resolve(compile, root, ref) {
var refVal = this._refs[ref];
if (typeof refVal == "string") {
if (this._refs[refVal])
refVal = this._refs[refVal];
else
return resolve.call(this, compile, root, refVal);
}
refVal = refVal || this._schemas[ref];
if (refVal instanceof SchemaObject) {
return inlineRef(refVal.schema, this._opts.inlineRefs) ? refVal.schema : refVal.validate || this._compile(refVal);
}
var res = resolveSchema.call(this, root, ref);
var schema, v, baseId;
if (res) {
schema = res.schema;
root = res.root;
baseId = res.baseId;
}
if (schema instanceof SchemaObject) {
v = schema.validate || compile.call(this, schema.schema, root, void 0, baseId);
} else if (schema !== void 0) {
v = inlineRef(schema, this._opts.inlineRefs) ? schema : compile.call(this, schema, root, void 0, baseId);
}
return v;
}
function resolveSchema(root, ref) {
var p = URI.parse(ref), refPath = _getFullPath(p), baseId = getFullPath(this._getId(root.schema));
if (Object.keys(root.schema).length === 0 || refPath !== baseId) {
var id = normalizeId(refPath);
var refVal = this._refs[id];
if (typeof refVal == "string") {
return resolveRecursive.call(this, root, refVal, p);
} else if (refVal instanceof SchemaObject) {
if (!refVal.validate)
this._compile(refVal);
root = refVal;
} else {
refVal = this._schemas[id];
if (refVal instanceof SchemaObject) {
if (!refVal.validate)
this._compile(refVal);
if (id == normalizeId(ref))
return { schema: refVal, root, baseId };
root = refVal;
} else {
return;
}
}
if (!root.schema)
return;
baseId = getFullPath(this._getId(root.schema));
}
return getJsonPointer.call(this, p, baseId, root.schema, root);
}
function resolveRecursive(root, ref, parsedRef) {
var res = resolveSchema.call(this, root, ref);
if (res) {
var schema = res.schema;
var baseId = res.baseId;
root = res.root;
var id = this._getId(schema);
if (id)
baseId = resolveUrl(baseId, id);
return getJsonPointer.call(this, parsedRef, baseId, schema, root);
}
}
var PREVENT_SCOPE_CHANGE = util.toHash(["properties", "patternProperties", "enum", "dependencies", "definitions"]);
function getJsonPointer(parsedRef, baseId, schema, root) {
parsedRef.fragment = parsedRef.fragment || "";
if (parsedRef.fragment.slice(0, 1) != "/")
return;
var parts = parsedRef.fragment.split("/");
for (var i = 1; i < parts.length; i++) {
var part = parts[i];
if (part) {
part = util.unescapeFragment(part);
schema = schema[part];
if (schema === void 0)
break;
var id;
if (!PREVENT_SCOPE_CHANGE[part]) {
id = this._getId(schema);
if (id)
baseId = resolveUrl(baseId, id);
if (schema.$ref) {
var $ref = resolveUrl(baseId, schema.$ref);
var res = resolveSchema.call(this, root, $ref);
if (res) {
schema = res.schema;
root = res.root;
baseId = res.baseId;
}
}
}
}
}
if (schema !== void 0 && schema !== root.schema)
return { schema, root, baseId };
}
var SIMPLE_INLINED = util.toHash([
"type",
"format",
"pattern",
"maxLength",
"minLength",
"maxProperties",
"minProperties",
"maxItems",
"minItems",
"maximum",
"minimum",
"uniqueItems",
"multipleOf",
"required",
"enum"
]);
function inlineRef(schema, limit) {
if (limit === false)
return false;
if (limit === void 0 || limit === true)
return checkNoRef(schema);
else if (limit)
return countKeys(schema) <= limit;
}
function checkNoRef(schema) {
var item;
if (Array.isArray(schema)) {
for (var i = 0; i < schema.length; i++) {
item = schema[i];
if (typeof item == "object" && !checkNoRef(item))
return false;
}
} else {
for (var key in schema) {
if (key == "$ref")
return false;
item = schema[key];
if (typeof item == "object" && !checkNoRef(item))
return false;
}
}
return true;
}
function countKeys(schema) {
var count = 0, item;
if (Array.isArray(schema)) {
for (var i = 0; i < schema.length; i++) {
item = schema[i];
if (typeof item == "object")
count += countKeys(item);
if (count == Infinity)
return Infinity;
}
} else {
for (var key in schema) {
if (key == "$ref")
return Infinity;
if (SIMPLE_INLINED[key]) {
count++;
} else {
item = schema[key];
if (typeof item == "object")
count += countKeys(item) + 1;
if (count == Infinity)
return Infinity;
}
}
}
return count;
}
function getFullPath(id, normalize) {
if (normalize !== false)
id = normalizeId(id);
var p = URI.parse(id);
return _getFullPath(p);
}
function _getFullPath(p) {
return URI.serialize(p).split("#")[0] + "#";
}
var TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
return id ? id.replace(TRAILING_SLASH_HASH, "") : "";
}
function resolveUrl(baseId, id) {
id = normalizeId(id);
return URI.resolve(baseId, id);
}
function resolveIds(schema) {
var schemaId = normalizeId(this._getId(schema));
var baseIds = { "": schemaId };
var fullPaths = { "": getFullPath(schemaId, false) };
var localRefs = {};
var self2 = this;
traverse(schema, { allKeys: true }, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
if (jsonPtr === "")
return;
var id = self2._getId(sch);
var baseId = baseIds[parentJsonPtr];
var fullPath = fullPaths[parentJsonPtr] + "/" + parentKeyword;
if (keyIndex !== void 0)
fullPath += "/" + (typeof keyIndex == "number" ? keyIndex : util.escapeFragment(keyIndex));
if (typeof id == "string") {
id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);
var refVal = self2._refs[id];
if (typeof refVal == "string")
refVal = self2._refs[refVal];
if (refVal && refVal.schema) {
if (!equal(sch, refVal.schema))
throw new Error('id "' + id + '" resolves to more than one schema');
} else if (id != normalizeId(fullPath)) {
if (id[0] == "#") {
if (localRefs[id] && !equal(sch, localRefs[id]))
throw new Error('id "' + id + '" resolves to more than one schema');
localRefs[id] = sch;
} else {
self2._refs[id] = fullPath;
}
}
}
baseIds[jsonPtr] = baseId;
fullPaths[jsonPtr] = fullPath;
});
return localRefs;
}
}
});
// node_modules/ajv/lib/compile/error_classes.js
var require_error_classes = __commonJS({
"node_modules/ajv/lib/compile/error_classes.js"(exports, module2) {
"use strict";
var resolve = require_resolve();
module2.exports = {
Validation: errorSubclass(ValidationError),
MissingRef: errorSubclass(MissingRefError)
};
function ValidationError(errors) {
this.message = "validation failed";
this.errors = errors;
this.ajv = this.validation = true;
}
MissingRefError.message = function(baseId, ref) {
return "can't resolve reference " + ref + " from id " + baseId;
};
function MissingRefError(baseId, ref, message) {
this.message = message || MissingRefError.message(baseId, ref);
this.missingRef = resolve.url(baseId, ref);
this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
}
function errorSubclass(Subclass) {
Subclass.prototype = Object.create(Error.prototype);
Subclass.prototype.constructor = Subclass;
return Subclass;
}
}
});
// node_modules/fast-json-stable-stringify/index.js
var require_fast_json_stable_stringify = __commonJS({
"node_modules/fast-json-stable-stringify/index.js"(exports, module2) {
"use strict";
module2.exports = function(data, opts) {
if (!opts)
opts = {};
if (typeof opts === "function")
opts = { cmp: opts };
var cycles = typeof opts.cycles === "boolean" ? opts.cycles : false;
var cmp = opts.cmp && function(f) {
return function(node) {
return function(a, b) {
var aobj = { key: a, value: node[a] };
var bobj = { key: b, value: node[b] };
return f(aobj, bobj);
};
};
}(opts.cmp);
var seen = [];
return function stringify(node) {
if (node && node.toJSON && typeof node.toJSON === "function") {
node = node.toJSON();
}
if (node === void 0)
return;
if (typeof node == "number")
return isFinite(node) ? "" + node : "null";
if (typeof node !== "object")
return JSON.stringify(node);
var i, out;
if (Array.isArray(node)) {
out = "[";
for (i = 0; i < node.length; i++) {
if (i)
out += ",";
out += stringify(node[i]) || "null";
}
return out + "]";
}
if (node === null)
return "null";
if (seen.indexOf(node) !== -1) {
if (cycles)
return JSON.stringify("__cycle__");
throw new TypeError("Converting circular structure to JSON");
}
var seenIndex = seen.push(node) - 1;
var keys = Object.keys(node).sort(cmp && cmp(node));
out = "";
for (i = 0; i < keys.length; i++) {
var key = keys[i];
var value = stringify(node[key]);
if (!value)
continue;
if (out)
out += ",";
out += JSON.stringify(key) + ":" + value;
}
seen.splice(seenIndex, 1);
return "{" + out + "}";
}(data);
};
}
});
// node_modules/ajv/lib/dotjs/validate.js
var require_validate2 = __commonJS({
"node_modules/ajv/lib/dotjs/validate.js"(exports, module2) {
"use strict";
module2.exports = function generate_validate(it, $keyword, $ruleType) {
var out = "";
var $async = it.schema.$async === true, $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, "$ref"), $id = it.self._getId(it.schema);
if (it.opts.strictKeywords) {
var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);
if ($unknownKwd) {
var $keywordsMsg = "unknown keyword: " + $unknownKwd;
if (it.opts.strictKeywords === "log")
it.logger.warn($keywordsMsg);
else
throw new Error($keywordsMsg);
}
}
if (it.isTop) {
out += " var validate = ";
if ($async) {
it.async = true;
out += "async ";
}
out += "function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ";
if ($id && (it.opts.sourceCode || it.opts.processCode)) {
out += " " + ("/*# sourceURL=" + $id + " */") + " ";
}
}
if (typeof it.schema == "boolean" || !($refKeywords || it.schema.$ref)) {
var $keyword = "false schema";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $errorKeyword;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
if (it.schema === false) {
if (it.isTop) {
$breakOnError = true;
} else {
out += " var " + $valid + " = false; ";
}
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "false schema") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} ";
if (it.opts.messages !== false) {
out += " , message: 'boolean schema is false' ";
}
if (it.opts.verbose) {
out += " , schema: false , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
} else {
if (it.isTop) {
if ($async) {
out += " return data; ";
} else {
out += " validate.errors = null; return true; ";
}
} else {
out += " var " + $valid + " = true; ";
}
}
if (it.isTop) {
out += " }; return validate; ";
}
return out;
}
if (it.isTop) {
var $top = it.isTop, $lvl = it.level = 0, $dataLvl = it.dataLevel = 0, $data = "data";
it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));
it.baseId = it.baseId || it.rootId;
delete it.isTop;
it.dataPathArr = [""];
if (it.schema.default !== void 0 && it.opts.useDefaults && it.opts.strictDefaults) {
var $defaultMsg = "default is ignored in the schema root";
if (it.opts.strictDefaults === "log")
it.logger.warn($defaultMsg);
else
throw new Error($defaultMsg);
}
out += " var vErrors = null; ";
out += " var errors = 0; ";
out += " if (rootData === undefined) rootData = data; ";
} else {
var $lvl = it.level, $dataLvl = it.dataLevel, $data = "data" + ($dataLvl || "");
if ($id)
it.baseId = it.resolve.url(it.baseId, $id);
if ($async && !it.async)
throw new Error("async schema in sync schema");
out += " var errs_" + $lvl + " = errors;";
}
var $valid = "valid" + $lvl, $breakOnError = !it.opts.allErrors, $closingBraces1 = "", $closingBraces2 = "";
var $errorKeyword;
var $typeSchema = it.schema.type, $typeIsArray = Array.isArray($typeSchema);
if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {
if ($typeIsArray) {
if ($typeSchema.indexOf("null") == -1)
$typeSchema = $typeSchema.concat("null");
} else if ($typeSchema != "null") {
$typeSchema = [$typeSchema, "null"];
$typeIsArray = true;
}
}
if ($typeIsArray && $typeSchema.length == 1) {
$typeSchema = $typeSchema[0];
$typeIsArray = false;
}
if (it.schema.$ref && $refKeywords) {
if (it.opts.extendRefs == "fail") {
throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)');
} else if (it.opts.extendRefs !== true) {
$refKeywords = false;
it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"');
}
}
if (it.schema.$comment && it.opts.$comment) {
out += " " + it.RULES.all.$comment.code(it, "$comment");
}
if ($typeSchema) {
if (it.opts.coerceTypes) {
var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);
}
var $rulesGroup = it.RULES.types[$typeSchema];
if ($coerceToTypes || $typeIsArray || $rulesGroup === true || $rulesGroup && !$shouldUseGroup($rulesGroup)) {
var $schemaPath = it.schemaPath + ".type", $errSchemaPath = it.errSchemaPath + "/type";
var $schemaPath = it.schemaPath + ".type", $errSchemaPath = it.errSchemaPath + "/type", $method = $typeIsArray ? "checkDataTypes" : "checkDataType";
out += " if (" + it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) + ") { ";
if ($coerceToTypes) {
var $dataType = "dataType" + $lvl, $coerced = "coerced" + $lvl;
out += " var " + $dataType + " = typeof " + $data + "; var " + $coerced + " = undefined; ";
if (it.opts.coerceTypes == "array") {
out += " if (" + $dataType + " == 'object' && Array.isArray(" + $data + ") && " + $data + ".length == 1) { " + $data + " = " + $data + "[0]; " + $dataType + " = typeof " + $data + "; if (" + it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers) + ") " + $coerced + " = " + $data + "; } ";
}
out += " if (" + $coerced + " !== undefined) ; ";
var arr1 = $coerceToTypes;
if (arr1) {
var $type, $i = -1, l1 = arr1.length - 1;
while ($i < l1) {
$type = arr1[$i += 1];
if ($type == "string") {
out += " else if (" + $dataType + " == 'number' || " + $dataType + " == 'boolean') " + $coerced + " = '' + " + $data + "; else if (" + $data + " === null) " + $coerced + " = ''; ";
} else if ($type == "number" || $type == "integer") {
out += " else if (" + $dataType + " == 'boolean' || " + $data + " === null || (" + $dataType + " == 'string' && " + $data + " && " + $data + " == +" + $data + " ";
if ($type == "integer") {
out += " && !(" + $data + " % 1)";
}
out += ")) " + $coerced + " = +" + $data + "; ";
} else if ($type == "boolean") {
out += " else if (" + $data + " === 'false' || " + $data + " === 0 || " + $data + " === null) " + $coerced + " = false; else if (" + $data + " === 'true' || " + $data + " === 1) " + $coerced + " = true; ";
} else if ($type == "null") {
out += " else if (" + $data + " === '' || " + $data + " === 0 || " + $data + " === false) " + $coerced + " = null; ";
} else if (it.opts.coerceTypes == "array" && $type == "array") {
out += " else if (" + $dataType + " == 'string' || " + $dataType + " == 'number' || " + $dataType + " == 'boolean' || " + $data + " == null) " + $coerced + " = [" + $data + "]; ";
}
}
}
out += " else { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "type") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { type: '";
if ($typeIsArray) {
out += "" + $typeSchema.join(",");
} else {
out += "" + $typeSchema;
}
out += "' } ";
if (it.opts.messages !== false) {
out += " , message: 'should be ";
if ($typeIsArray) {
out += "" + $typeSchema.join(",");
} else {
out += "" + $typeSchema;
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } if (" + $coerced + " !== undefined) { ";
var $parentData = $dataLvl ? "data" + ($dataLvl - 1 || "") : "parentData", $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : "parentDataProperty";
out += " " + $data + " = " + $coerced + "; ";
if (!$dataLvl) {
out += "if (" + $parentData + " !== undefined)";
}
out += " " + $parentData + "[" + $parentDataProperty + "] = " + $coerced + "; } ";
} else {
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "type") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { type: '";
if ($typeIsArray) {
out += "" + $typeSchema.join(",");
} else {
out += "" + $typeSchema;
}
out += "' } ";
if (it.opts.messages !== false) {
out += " , message: 'should be ";
if ($typeIsArray) {
out += "" + $typeSchema.join(",");
} else {
out += "" + $typeSchema;
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
}
out += " } ";
}
}
if (it.schema.$ref && !$refKeywords) {
out += " " + it.RULES.all.$ref.code(it, "$ref") + " ";
if ($breakOnError) {
out += " } if (errors === ";
if ($top) {
out += "0";
} else {
out += "errs_" + $lvl;
}
out += ") { ";
$closingBraces2 += "}";
}
} else {
var arr2 = it.RULES;
if (arr2) {
var $rulesGroup, i2 = -1, l2 = arr2.length - 1;
while (i2 < l2) {
$rulesGroup = arr2[i2 += 1];
if ($shouldUseGroup($rulesGroup)) {
if ($rulesGroup.type) {
out += " if (" + it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) + ") { ";
}
if (it.opts.useDefaults) {
if ($rulesGroup.type == "object" && it.schema.properties) {
var $schema = it.schema.properties, $schemaKeys = Object.keys($schema);
var arr3 = $schemaKeys;
if (arr3) {
var $propertyKey, i3 = -1, l3 = arr3.length - 1;
while (i3 < l3) {
$propertyKey = arr3[i3 += 1];
var $sch = $schema[$propertyKey];
if ($sch.default !== void 0) {
var $passData = $data + it.util.getProperty($propertyKey);
if (it.compositeRule) {
if (it.opts.strictDefaults) {
var $defaultMsg = "default is ignored for: " + $passData;
if (it.opts.strictDefaults === "log")
it.logger.warn($defaultMsg);
else
throw new Error($defaultMsg);
}
} else {
out += " if (" + $passData + " === undefined ";
if (it.opts.useDefaults == "empty") {
out += " || " + $passData + " === null || " + $passData + " === '' ";
}
out += " ) " + $passData + " = ";
if (it.opts.useDefaults == "shared") {
out += " " + it.useDefault($sch.default) + " ";
} else {
out += " " + JSON.stringify($sch.default) + " ";
}
out += "; ";
}
}
}
}
} else if ($rulesGroup.type == "array" && Array.isArray(it.schema.items)) {
var arr4 = it.schema.items;
if (arr4) {
var $sch, $i = -1, l4 = arr4.length - 1;
while ($i < l4) {
$sch = arr4[$i += 1];
if ($sch.default !== void 0) {
var $passData = $data + "[" + $i + "]";
if (it.compositeRule) {
if (it.opts.strictDefaults) {
var $defaultMsg = "default is ignored for: " + $passData;
if (it.opts.strictDefaults === "log")
it.logger.warn($defaultMsg);
else
throw new Error($defaultMsg);
}
} else {
out += " if (" + $passData + " === undefined ";
if (it.opts.useDefaults == "empty") {
out += " || " + $passData + " === null || " + $passData + " === '' ";
}
out += " ) " + $passData + " = ";
if (it.opts.useDefaults == "shared") {
out += " " + it.useDefault($sch.default) + " ";
} else {
out += " " + JSON.stringify($sch.default) + " ";
}
out += "; ";
}
}
}
}
}
}
var arr5 = $rulesGroup.rules;
if (arr5) {
var $rule, i5 = -1, l5 = arr5.length - 1;
while (i5 < l5) {
$rule = arr5[i5 += 1];
if ($shouldUseRule($rule)) {
var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);
if ($code) {
out += " " + $code + " ";
if ($breakOnError) {
$closingBraces1 += "}";
}
}
}
}
}
if ($breakOnError) {
out += " " + $closingBraces1 + " ";
$closingBraces1 = "";
}
if ($rulesGroup.type) {
out += " } ";
if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {
out += " else { ";
var $schemaPath = it.schemaPath + ".type", $errSchemaPath = it.errSchemaPath + "/type";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "type") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { type: '";
if ($typeIsArray) {
out += "" + $typeSchema.join(",");
} else {
out += "" + $typeSchema;
}
out += "' } ";
if (it.opts.messages !== false) {
out += " , message: 'should be ";
if ($typeIsArray) {
out += "" + $typeSchema.join(",");
} else {
out += "" + $typeSchema;
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } ";
}
}
if ($breakOnError) {
out += " if (errors === ";
if ($top) {
out += "0";
} else {
out += "errs_" + $lvl;
}
out += ") { ";
$closingBraces2 += "}";
}
}
}
}
}
if ($breakOnError) {
out += " " + $closingBraces2 + " ";
}
if ($top) {
if ($async) {
out += " if (errors === 0) return data; ";
out += " else throw new ValidationError(vErrors); ";
} else {
out += " validate.errors = vErrors; ";
out += " return errors === 0; ";
}
out += " }; return validate;";
} else {
out += " var " + $valid + " = errors === errs_" + $lvl + ";";
}
function $shouldUseGroup($rulesGroup2) {
var rules = $rulesGroup2.rules;
for (var i = 0; i < rules.length; i++)
if ($shouldUseRule(rules[i]))
return true;
}
function $shouldUseRule($rule2) {
return it.schema[$rule2.keyword] !== void 0 || $rule2.implements && $ruleImplementsSomeKeyword($rule2);
}
function $ruleImplementsSomeKeyword($rule2) {
var impl = $rule2.implements;
for (var i = 0; i < impl.length; i++)
if (it.schema[impl[i]] !== void 0)
return true;
}
return out;
};
}
});
// node_modules/ajv/lib/compile/index.js
var require_compile = __commonJS({
"node_modules/ajv/lib/compile/index.js"(exports, module2) {
"use strict";
var resolve = require_resolve();
var util = require_util3();
var errorClasses = require_error_classes();
var stableStringify = require_fast_json_stable_stringify();
var validateGenerator = require_validate2();
var ucs2length = util.ucs2length;
var equal = require_fast_deep_equal();
var ValidationError = errorClasses.Validation;
module2.exports = compile;
function compile(schema, root, localRefs, baseId) {
var self2 = this, opts = this._opts, refVal = [void 0], refs = {}, patterns = [], patternsHash = {}, defaults = [], defaultsHash = {}, customRules = [];
root = root || { schema, refVal, refs };
var c = checkCompiling.call(this, schema, root, baseId);
var compilation = this._compilations[c.index];
if (c.compiling)
return compilation.callValidate = callValidate;
var formats = this._formats;
var RULES = this.RULES;
try {
var v = localCompile(schema, root, localRefs, baseId);
compilation.validate = v;
var cv = compilation.callValidate;
if (cv) {
cv.schema = v.schema;
cv.errors = null;
cv.refs = v.refs;
cv.refVal = v.refVal;
cv.root = v.root;
cv.$async = v.$async;
if (opts.sourceCode)
cv.source = v.source;
}
return v;
} finally {
endCompiling.call(this, schema, root, baseId);
}
function callValidate() {
var validate = compilation.validate;
var result = validate.apply(this, arguments);
callValidate.errors = validate.errors;
return result;
}
function localCompile(_schema, _root, localRefs2, baseId2) {
var isRoot = !_root || _root && _root.schema == _schema;
if (_root.schema != root.schema)
return compile.call(self2, _schema, _root, localRefs2, baseId2);
var $async = _schema.$async === true;
var sourceCode = validateGenerator({
isTop: true,
schema: _schema,
isRoot,
baseId: baseId2,
root: _root,
schemaPath: "",
errSchemaPath: "#",
errorPath: '""',
MissingRefError: errorClasses.MissingRef,
RULES,
validate: validateGenerator,
util,
resolve,
resolveRef,
usePattern,
useDefault,
useCustomRule,
opts,
formats,
logger: self2.logger,
self: self2
});
sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + sourceCode;
if (opts.processCode)
sourceCode = opts.processCode(sourceCode, _schema);
var validate;
try {
var makeValidate = new Function("self", "RULES", "formats", "root", "refVal", "defaults", "customRules", "equal", "ucs2length", "ValidationError", sourceCode);
validate = makeValidate(self2, RULES, formats, root, refVal, defaults, customRules, equal, ucs2length, ValidationError);
refVal[0] = validate;
} catch (e) {
self2.logger.error("Error compiling schema, function code:", sourceCode);
throw e;
}
validate.schema = _schema;
validate.errors = null;
validate.refs = refs;
validate.refVal = refVal;
validate.root = isRoot ? validate : _root;
if ($async)
validate.$async = true;
if (opts.sourceCode === true) {
validate.source = {
code: sourceCode,
patterns,
defaults
};
}
return validate;
}
function resolveRef(baseId2, ref, isRoot) {
ref = resolve.url(baseId2, ref);
var refIndex = refs[ref];
var _refVal, refCode;
if (refIndex !== void 0) {
_refVal = refVal[refIndex];
refCode = "refVal[" + refIndex + "]";
return resolvedRef(_refVal, refCode);
}
if (!isRoot && root.refs) {
var rootRefId = root.refs[ref];
if (rootRefId !== void 0) {
_refVal = root.refVal[rootRefId];
refCode = addLocalRef(ref, _refVal);
return resolvedRef(_refVal, refCode);
}
}
refCode = addLocalRef(ref);
var v2 = resolve.call(self2, localCompile, root, ref);
if (v2 === void 0) {
var localSchema = localRefs && localRefs[ref];
if (localSchema) {
v2 = resolve.inlineRef(localSchema, opts.inlineRefs) ? localSchema : compile.call(self2, localSchema, root, localRefs, baseId2);
}
}
if (v2 === void 0) {
removeLocalRef(ref);
} else {
replaceLocalRef(ref, v2);
return resolvedRef(v2, refCode);
}
}
function addLocalRef(ref, v2) {
var refId = refVal.length;
refVal[refId] = v2;
refs[ref] = refId;
return "refVal" + refId;
}
function removeLocalRef(ref) {
delete refs[ref];
}
function replaceLocalRef(ref, v2) {
var refId = refs[ref];
refVal[refId] = v2;
}
function resolvedRef(refVal2, code) {
return typeof refVal2 == "object" || typeof refVal2 == "boolean" ? { code, schema: refVal2, inline: true } : { code, $async: refVal2 && !!refVal2.$async };
}
function usePattern(regexStr) {
var index = patternsHash[regexStr];
if (index === void 0) {
index = patternsHash[regexStr] = patterns.length;
patterns[index] = regexStr;
}
return "pattern" + index;
}
function useDefault(value) {
switch (typeof value) {
case "boolean":
case "number":
return "" + value;
case "string":
return util.toQuotedString(value);
case "object":
if (value === null)
return "null";
var valueStr = stableStringify(value);
var index = defaultsHash[valueStr];
if (index === void 0) {
index = defaultsHash[valueStr] = defaults.length;
defaults[index] = value;
}
return "default" + index;
}
}
function useCustomRule(rule, schema2, parentSchema, it) {
if (self2._opts.validateSchema !== false) {
var deps = rule.definition.dependencies;
if (deps && !deps.every(function(keyword) {
return Object.prototype.hasOwnProperty.call(parentSchema, keyword);
}))
throw new Error("parent schema must have all required keywords: " + deps.join(","));
var validateSchema = rule.definition.validateSchema;
if (validateSchema) {
var valid = validateSchema(schema2);
if (!valid) {
var message = "keyword schema is invalid: " + self2.errorsText(validateSchema.errors);
if (self2._opts.validateSchema == "log")
self2.logger.error(message);
else
throw new Error(message);
}
}
}
var compile2 = rule.definition.compile, inline = rule.definition.inline, macro = rule.definition.macro;
var validate;
if (compile2) {
validate = compile2.call(self2, schema2, parentSchema, it);
} else if (macro) {
validate = macro.call(self2, schema2, parentSchema, it);
if (opts.validateSchema !== false)
self2.validateSchema(validate, true);
} else if (inline) {
validate = inline.call(self2, it, rule.keyword, schema2, parentSchema);
} else {
validate = rule.definition.validate;
if (!validate)
return;
}
if (validate === void 0)
throw new Error('custom keyword "' + rule.keyword + '"failed to compile');
var index = customRules.length;
customRules[index] = validate;
return {
code: "customRule" + index,
validate
};
}
}
function checkCompiling(schema, root, baseId) {
var index = compIndex.call(this, schema, root, baseId);
if (index >= 0)
return { index, compiling: true };
index = this._compilations.length;
this._compilations[index] = {
schema,
root,
baseId
};
return { index, compiling: false };
}
function endCompiling(schema, root, baseId) {
var i = compIndex.call(this, schema, root, baseId);
if (i >= 0)
this._compilations.splice(i, 1);
}
function compIndex(schema, root, baseId) {
for (var i = 0; i < this._compilations.length; i++) {
var c = this._compilations[i];
if (c.schema == schema && c.root == root && c.baseId == baseId)
return i;
}
return -1;
}
function patternCode(i, patterns) {
return "var pattern" + i + " = new RegExp(" + util.toQuotedString(patterns[i]) + ");";
}
function defaultCode(i) {
return "var default" + i + " = defaults[" + i + "];";
}
function refValCode(i, refVal) {
return refVal[i] === void 0 ? "" : "var refVal" + i + " = refVal[" + i + "];";
}
function customRuleCode(i) {
return "var customRule" + i + " = customRules[" + i + "];";
}
function vars(arr, statement) {
if (!arr.length)
return "";
var code = "";
for (var i = 0; i < arr.length; i++)
code += statement(i, arr);
return code;
}
}
});
// node_modules/ajv/lib/cache.js
var require_cache = __commonJS({
"node_modules/ajv/lib/cache.js"(exports, module2) {
"use strict";
var Cache = module2.exports = function Cache2() {
this._cache = {};
};
Cache.prototype.put = function Cache_put(key, value) {
this._cache[key] = value;
};
Cache.prototype.get = function Cache_get(key) {
return this._cache[key];
};
Cache.prototype.del = function Cache_del(key) {
delete this._cache[key];
};
Cache.prototype.clear = function Cache_clear() {
this._cache = {};
};
}
});
// node_modules/ajv/lib/compile/formats.js
var require_formats2 = __commonJS({
"node_modules/ajv/lib/compile/formats.js"(exports, module2) {
"use strict";
var util = require_util3();
var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i;
var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i;
var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i;
var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i;
var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;
module2.exports = formats;
function formats(mode) {
mode = mode == "full" ? "full" : "fast";
return util.copy(formats[mode]);
}
formats.fast = {
date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/,
time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,
"date-time": /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,
uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
"uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
"uri-template": URITEMPLATE,
url: URL,
email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
hostname: HOSTNAME,
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
regex,
uuid: UUID,
"json-pointer": JSON_POINTER,
"json-pointer-uri-fragment": JSON_POINTER_URI_FRAGMENT,
"relative-json-pointer": RELATIVE_JSON_POINTER
};
formats.full = {
date,
time,
"date-time": date_time,
uri,
"uri-reference": URIREF,
"uri-template": URITEMPLATE,
url: URL,
email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
hostname: HOSTNAME,
ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,
regex,
uuid: UUID,
"json-pointer": JSON_POINTER,
"json-pointer-uri-fragment": JSON_POINTER_URI_FRAGMENT,
"relative-json-pointer": RELATIVE_JSON_POINTER
};
function isLeapYear(year) {
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
function date(str) {
var matches = str.match(DATE);
if (!matches)
return false;
var year = +matches[1];
var month = +matches[2];
var day = +matches[3];
return month >= 1 && month <= 12 && day >= 1 && day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);
}
function time(str, full) {
var matches = str.match(TIME);
if (!matches)
return false;
var hour = matches[1];
var minute = matches[2];
var second = matches[3];
var timeZone = matches[5];
return (hour <= 23 && minute <= 59 && second <= 59 || hour == 23 && minute == 59 && second == 60) && (!full || timeZone);
}
var DATE_TIME_SEPARATOR = /t|\s/i;
function date_time(str) {
var dateTime = str.split(DATE_TIME_SEPARATOR);
return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);
}
var NOT_URI_FRAGMENT = /\/|:/;
function uri(str) {
return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}
var Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
if (Z_ANCHOR.test(str))
return false;
try {
new RegExp(str);
return true;
} catch (e) {
return false;
}
}
}
});
// node_modules/ajv/lib/dotjs/ref.js
var require_ref = __commonJS({
"node_modules/ajv/lib/dotjs/ref.js"(exports, module2) {
"use strict";
module2.exports = function generate_ref(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $async, $refCode;
if ($schema == "#" || $schema == "#/") {
if (it.isRoot) {
$async = it.async;
$refCode = "validate";
} else {
$async = it.root.schema.$async === true;
$refCode = "root.refVal[0]";
}
} else {
var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);
if ($refVal === void 0) {
var $message = it.MissingRefError.message(it.baseId, $schema);
if (it.opts.missingRefs == "fail") {
it.logger.error($message);
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '$ref' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { ref: '" + it.util.escapeQuotes($schema) + "' } ";
if (it.opts.messages !== false) {
out += " , message: 'can\\'t resolve reference " + it.util.escapeQuotes($schema) + "' ";
}
if (it.opts.verbose) {
out += " , schema: " + it.util.toQuotedString($schema) + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
if ($breakOnError) {
out += " if (false) { ";
}
} else if (it.opts.missingRefs == "ignore") {
it.logger.warn($message);
if ($breakOnError) {
out += " if (true) { ";
}
} else {
throw new it.MissingRefError(it.baseId, $schema, $message);
}
} else if ($refVal.inline) {
var $it = it.util.copy(it);
$it.level++;
var $nextValid = "valid" + $it.level;
$it.schema = $refVal.schema;
$it.schemaPath = "";
$it.errSchemaPath = $schema;
var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code);
out += " " + $code + " ";
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
}
} else {
$async = $refVal.$async === true || it.async && $refVal.$async !== false;
$refCode = $refVal.code;
}
}
if ($refCode) {
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.opts.passContext) {
out += " " + $refCode + ".call(this, ";
} else {
out += " " + $refCode + "( ";
}
out += " " + $data + ", (dataPath || '')";
if (it.errorPath != '""') {
out += " + " + it.errorPath;
}
var $parentData = $dataLvl ? "data" + ($dataLvl - 1 || "") : "parentData", $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : "parentDataProperty";
out += " , " + $parentData + " , " + $parentDataProperty + ", rootData) ";
var __callValidate = out;
out = $$outStack.pop();
if ($async) {
if (!it.async)
throw new Error("async schema referenced by sync schema");
if ($breakOnError) {
out += " var " + $valid + "; ";
}
out += " try { await " + __callValidate + "; ";
if ($breakOnError) {
out += " " + $valid + " = true; ";
}
out += " } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ";
if ($breakOnError) {
out += " " + $valid + " = false; ";
}
out += " } ";
if ($breakOnError) {
out += " if (" + $valid + ") { ";
}
} else {
out += " if (!" + __callValidate + ") { if (vErrors === null) vErrors = " + $refCode + ".errors; else vErrors = vErrors.concat(" + $refCode + ".errors); errors = vErrors.length; } ";
if ($breakOnError) {
out += " else { ";
}
}
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/allOf.js
var require_allOf = __commonJS({
"node_modules/ajv/lib/dotjs/allOf.js"(exports, module2) {
"use strict";
module2.exports = function generate_allOf(it, $keyword, $ruleType) {
var out = " ";
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $currentBaseId = $it.baseId, $allSchemasEmpty = true;
var arr1 = $schema;
if (arr1) {
var $sch, $i = -1, l1 = arr1.length - 1;
while ($i < l1) {
$sch = arr1[$i += 1];
if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) {
$allSchemasEmpty = false;
$it.schema = $sch;
$it.schemaPath = $schemaPath + "[" + $i + "]";
$it.errSchemaPath = $errSchemaPath + "/" + $i;
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
}
}
if ($breakOnError) {
if ($allSchemasEmpty) {
out += " if (true) { ";
} else {
out += " " + $closingBraces.slice(0, -1) + " ";
}
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/anyOf.js
var require_anyOf = __commonJS({
"node_modules/ajv/lib/dotjs/anyOf.js"(exports, module2) {
"use strict";
module2.exports = function generate_anyOf(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $noEmptySchema = $schema.every(function($sch2) {
return it.opts.strictKeywords ? typeof $sch2 == "object" && Object.keys($sch2).length > 0 || $sch2 === false : it.util.schemaHasRules($sch2, it.RULES.all);
});
if ($noEmptySchema) {
var $currentBaseId = $it.baseId;
out += " var " + $errs + " = errors; var " + $valid + " = false; ";
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
var arr1 = $schema;
if (arr1) {
var $sch, $i = -1, l1 = arr1.length - 1;
while ($i < l1) {
$sch = arr1[$i += 1];
$it.schema = $sch;
$it.schemaPath = $schemaPath + "[" + $i + "]";
$it.errSchemaPath = $errSchemaPath + "/" + $i;
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
out += " " + $valid + " = " + $valid + " || " + $nextValid + "; if (!" + $valid + ") { ";
$closingBraces += "}";
}
}
it.compositeRule = $it.compositeRule = $wasComposite;
out += " " + $closingBraces + " if (!" + $valid + ") { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'anyOf' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} ";
if (it.opts.messages !== false) {
out += " , message: 'should match some schema in anyOf' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError(vErrors); ";
} else {
out += " validate.errors = vErrors; return false; ";
}
}
out += " } else { errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } ";
if (it.opts.allErrors) {
out += " } ";
}
} else {
if ($breakOnError) {
out += " if (true) { ";
}
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/comment.js
var require_comment = __commonJS({
"node_modules/ajv/lib/dotjs/comment.js"(exports, module2) {
"use strict";
module2.exports = function generate_comment(it, $keyword, $ruleType) {
var out = " ";
var $schema = it.schema[$keyword];
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $comment = it.util.toQuotedString($schema);
if (it.opts.$comment === true) {
out += " console.log(" + $comment + ");";
} else if (typeof it.opts.$comment == "function") {
out += " self._opts.$comment(" + $comment + ", " + it.util.toQuotedString($errSchemaPath) + ", validate.root.schema);";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/const.js
var require_const = __commonJS({
"node_modules/ajv/lib/dotjs/const.js"(exports, module2) {
"use strict";
module2.exports = function generate_const(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
if (!$isData) {
out += " var schema" + $lvl + " = validate.schema" + $schemaPath + ";";
}
out += "var " + $valid + " = equal(" + $data + ", schema" + $lvl + "); if (!" + $valid + ") { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'const' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { allowedValue: schema" + $lvl + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should be equal to constant' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " }";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/contains.js
var require_contains = __commonJS({
"node_modules/ajv/lib/dotjs/contains.js"(exports, module2) {
"use strict";
module2.exports = function generate_contains(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $idx = "i" + $lvl, $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $currentBaseId = it.baseId, $nonEmptySchema = it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all);
out += "var " + $errs + " = errors;var " + $valid + ";";
if ($nonEmptySchema) {
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
$it.schema = $schema;
$it.schemaPath = $schemaPath;
$it.errSchemaPath = $errSchemaPath;
out += " var " + $nextValid + " = false; for (var " + $idx + " = 0; " + $idx + " < " + $data + ".length; " + $idx + "++) { ";
$it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
var $passData = $data + "[" + $idx + "]";
$it.dataPathArr[$dataNxt] = $idx;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
out += " if (" + $nextValid + ") break; } ";
it.compositeRule = $it.compositeRule = $wasComposite;
out += " " + $closingBraces + " if (!" + $nextValid + ") {";
} else {
out += " if (" + $data + ".length == 0) {";
}
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'contains' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} ";
if (it.opts.messages !== false) {
out += " , message: 'should contain a valid item' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } else { ";
if ($nonEmptySchema) {
out += " errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } ";
}
if (it.opts.allErrors) {
out += " } ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/dependencies.js
var require_dependencies = __commonJS({
"node_modules/ajv/lib/dotjs/dependencies.js"(exports, module2) {
"use strict";
module2.exports = function generate_dependencies(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $schemaDeps = {}, $propertyDeps = {}, $ownProperties = it.opts.ownProperties;
for ($property in $schema) {
if ($property == "__proto__")
continue;
var $sch = $schema[$property];
var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;
$deps[$property] = $sch;
}
out += "var " + $errs + " = errors;";
var $currentErrorPath = it.errorPath;
out += "var missing" + $lvl + ";";
for (var $property in $propertyDeps) {
$deps = $propertyDeps[$property];
if ($deps.length) {
out += " if ( " + $data + it.util.getProperty($property) + " !== undefined ";
if ($ownProperties) {
out += " && Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($property) + "') ";
}
if ($breakOnError) {
out += " && ( ";
var arr1 = $deps;
if (arr1) {
var $propertyKey, $i = -1, l1 = arr1.length - 1;
while ($i < l1) {
$propertyKey = arr1[$i += 1];
if ($i) {
out += " || ";
}
var $prop = it.util.getProperty($propertyKey), $useData = $data + $prop;
out += " ( ( " + $useData + " === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += ") && (missing" + $lvl + " = " + it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) + ") ) ";
}
}
out += ")) { ";
var $propertyPath = "missing" + $lvl, $missingProperty = "' + " + $propertyPath + " + '";
if (it.opts._errorDataPathProperty) {
it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + " + " + $propertyPath;
}
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'dependencies' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { property: '" + it.util.escapeQuotes($property) + "', missingProperty: '" + $missingProperty + "', depsCount: " + $deps.length + ", deps: '" + it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", ")) + "' } ";
if (it.opts.messages !== false) {
out += " , message: 'should have ";
if ($deps.length == 1) {
out += "property " + it.util.escapeQuotes($deps[0]);
} else {
out += "properties " + it.util.escapeQuotes($deps.join(", "));
}
out += " when property " + it.util.escapeQuotes($property) + " is present' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
} else {
out += " ) { ";
var arr2 = $deps;
if (arr2) {
var $propertyKey, i2 = -1, l2 = arr2.length - 1;
while (i2 < l2) {
$propertyKey = arr2[i2 += 1];
var $prop = it.util.getProperty($propertyKey), $missingProperty = it.util.escapeQuotes($propertyKey), $useData = $data + $prop;
if (it.opts._errorDataPathProperty) {
it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
}
out += " if ( " + $useData + " === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += ") { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'dependencies' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { property: '" + it.util.escapeQuotes($property) + "', missingProperty: '" + $missingProperty + "', depsCount: " + $deps.length + ", deps: '" + it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", ")) + "' } ";
if (it.opts.messages !== false) {
out += " , message: 'should have ";
if ($deps.length == 1) {
out += "property " + it.util.escapeQuotes($deps[0]);
} else {
out += "properties " + it.util.escapeQuotes($deps.join(", "));
}
out += " when property " + it.util.escapeQuotes($property) + " is present' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ";
}
}
}
out += " } ";
if ($breakOnError) {
$closingBraces += "}";
out += " else { ";
}
}
}
it.errorPath = $currentErrorPath;
var $currentBaseId = $it.baseId;
for (var $property in $schemaDeps) {
var $sch = $schemaDeps[$property];
if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) {
out += " " + $nextValid + " = true; if ( " + $data + it.util.getProperty($property) + " !== undefined ";
if ($ownProperties) {
out += " && Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($property) + "') ";
}
out += ") { ";
$it.schema = $sch;
$it.schemaPath = $schemaPath + it.util.getProperty($property);
$it.errSchemaPath = $errSchemaPath + "/" + it.util.escapeFragment($property);
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
out += " } ";
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
}
if ($breakOnError) {
out += " " + $closingBraces + " if (" + $errs + " == errors) {";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/enum.js
var require_enum = __commonJS({
"node_modules/ajv/lib/dotjs/enum.js"(exports, module2) {
"use strict";
module2.exports = function generate_enum(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
var $i = "i" + $lvl, $vSchema = "schema" + $lvl;
if (!$isData) {
out += " var " + $vSchema + " = validate.schema" + $schemaPath + ";";
}
out += "var " + $valid + ";";
if ($isData) {
out += " if (schema" + $lvl + " === undefined) " + $valid + " = true; else if (!Array.isArray(schema" + $lvl + ")) " + $valid + " = false; else {";
}
out += "" + $valid + " = false;for (var " + $i + "=0; " + $i + "<" + $vSchema + ".length; " + $i + "++) if (equal(" + $data + ", " + $vSchema + "[" + $i + "])) { " + $valid + " = true; break; }";
if ($isData) {
out += " } ";
}
out += " if (!" + $valid + ") { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'enum' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { allowedValues: schema" + $lvl + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should be equal to one of the allowed values' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " }";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/format.js
var require_format = __commonJS({
"node_modules/ajv/lib/dotjs/format.js"(exports, module2) {
"use strict";
module2.exports = function generate_format(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
if (it.opts.format === false) {
if ($breakOnError) {
out += " if (true) { ";
}
return out;
}
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
var $unknownFormats = it.opts.unknownFormats, $allowUnknown = Array.isArray($unknownFormats);
if ($isData) {
var $format = "format" + $lvl, $isObject = "isObject" + $lvl, $formatType = "formatType" + $lvl;
out += " var " + $format + " = formats[" + $schemaValue + "]; var " + $isObject + " = typeof " + $format + " == 'object' && !(" + $format + " instanceof RegExp) && " + $format + ".validate; var " + $formatType + " = " + $isObject + " && " + $format + ".type || 'string'; if (" + $isObject + ") { ";
if (it.async) {
out += " var async" + $lvl + " = " + $format + ".async; ";
}
out += " " + $format + " = " + $format + ".validate; } if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'string') || ";
}
out += " (";
if ($unknownFormats != "ignore") {
out += " (" + $schemaValue + " && !" + $format + " ";
if ($allowUnknown) {
out += " && self._opts.unknownFormats.indexOf(" + $schemaValue + ") == -1 ";
}
out += ") || ";
}
out += " (" + $format + " && " + $formatType + " == '" + $ruleType + "' && !(typeof " + $format + " == 'function' ? ";
if (it.async) {
out += " (async" + $lvl + " ? await " + $format + "(" + $data + ") : " + $format + "(" + $data + ")) ";
} else {
out += " " + $format + "(" + $data + ") ";
}
out += " : " + $format + ".test(" + $data + "))))) {";
} else {
var $format = it.formats[$schema];
if (!$format) {
if ($unknownFormats == "ignore") {
it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"');
if ($breakOnError) {
out += " if (true) { ";
}
return out;
} else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {
if ($breakOnError) {
out += " if (true) { ";
}
return out;
} else {
throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"');
}
}
var $isObject = typeof $format == "object" && !($format instanceof RegExp) && $format.validate;
var $formatType = $isObject && $format.type || "string";
if ($isObject) {
var $async = $format.async === true;
$format = $format.validate;
}
if ($formatType != $ruleType) {
if ($breakOnError) {
out += " if (true) { ";
}
return out;
}
if ($async) {
if (!it.async)
throw new Error("async format in sync schema");
var $formatRef = "formats" + it.util.getProperty($schema) + ".validate";
out += " if (!(await " + $formatRef + "(" + $data + "))) { ";
} else {
out += " if (! ";
var $formatRef = "formats" + it.util.getProperty($schema);
if ($isObject)
$formatRef += ".validate";
if (typeof $format == "function") {
out += " " + $formatRef + "(" + $data + ") ";
} else {
out += " " + $formatRef + ".test(" + $data + ") ";
}
out += ") { ";
}
}
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'format' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { format: ";
if ($isData) {
out += "" + $schemaValue;
} else {
out += "" + it.util.toQuotedString($schema);
}
out += " } ";
if (it.opts.messages !== false) {
out += ` , message: 'should match format "`;
if ($isData) {
out += "' + " + $schemaValue + " + '";
} else {
out += "" + it.util.escapeQuotes($schema);
}
out += `"' `;
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + it.util.toQuotedString($schema);
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/if.js
var require_if = __commonJS({
"node_modules/ajv/lib/dotjs/if.js"(exports, module2) {
"use strict";
module2.exports = function generate_if(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
$it.level++;
var $nextValid = "valid" + $it.level;
var $thenSch = it.schema["then"], $elseSch = it.schema["else"], $thenPresent = $thenSch !== void 0 && (it.opts.strictKeywords ? typeof $thenSch == "object" && Object.keys($thenSch).length > 0 || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), $elsePresent = $elseSch !== void 0 && (it.opts.strictKeywords ? typeof $elseSch == "object" && Object.keys($elseSch).length > 0 || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), $currentBaseId = $it.baseId;
if ($thenPresent || $elsePresent) {
var $ifClause;
$it.createErrors = false;
$it.schema = $schema;
$it.schemaPath = $schemaPath;
$it.errSchemaPath = $errSchemaPath;
out += " var " + $errs + " = errors; var " + $valid + " = true; ";
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
$it.createErrors = true;
out += " errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } ";
it.compositeRule = $it.compositeRule = $wasComposite;
if ($thenPresent) {
out += " if (" + $nextValid + ") { ";
$it.schema = it.schema["then"];
$it.schemaPath = it.schemaPath + ".then";
$it.errSchemaPath = it.errSchemaPath + "/then";
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
out += " " + $valid + " = " + $nextValid + "; ";
if ($thenPresent && $elsePresent) {
$ifClause = "ifClause" + $lvl;
out += " var " + $ifClause + " = 'then'; ";
} else {
$ifClause = "'then'";
}
out += " } ";
if ($elsePresent) {
out += " else { ";
}
} else {
out += " if (!" + $nextValid + ") { ";
}
if ($elsePresent) {
$it.schema = it.schema["else"];
$it.schemaPath = it.schemaPath + ".else";
$it.errSchemaPath = it.errSchemaPath + "/else";
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
out += " " + $valid + " = " + $nextValid + "; ";
if ($thenPresent && $elsePresent) {
$ifClause = "ifClause" + $lvl;
out += " var " + $ifClause + " = 'else'; ";
} else {
$ifClause = "'else'";
}
out += " } ";
}
out += " if (!" + $valid + ") { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'if' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { failingKeyword: " + $ifClause + " } ";
if (it.opts.messages !== false) {
out += ` , message: 'should match "' + ` + $ifClause + ` + '" schema' `;
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError(vErrors); ";
} else {
out += " validate.errors = vErrors; return false; ";
}
}
out += " } ";
if ($breakOnError) {
out += " else { ";
}
} else {
if ($breakOnError) {
out += " if (true) { ";
}
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/items.js
var require_items = __commonJS({
"node_modules/ajv/lib/dotjs/items.js"(exports, module2) {
"use strict";
module2.exports = function generate_items(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $idx = "i" + $lvl, $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $currentBaseId = it.baseId;
out += "var " + $errs + " = errors;var " + $valid + ";";
if (Array.isArray($schema)) {
var $additionalItems = it.schema.additionalItems;
if ($additionalItems === false) {
out += " " + $valid + " = " + $data + ".length <= " + $schema.length + "; ";
var $currErrSchemaPath = $errSchemaPath;
$errSchemaPath = it.errSchemaPath + "/additionalItems";
out += " if (!" + $valid + ") { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'additionalItems' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schema.length + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT have more than " + $schema.length + " items' ";
}
if (it.opts.verbose) {
out += " , schema: false , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } ";
$errSchemaPath = $currErrSchemaPath;
if ($breakOnError) {
$closingBraces += "}";
out += " else { ";
}
}
var arr1 = $schema;
if (arr1) {
var $sch, $i = -1, l1 = arr1.length - 1;
while ($i < l1) {
$sch = arr1[$i += 1];
if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) {
out += " " + $nextValid + " = true; if (" + $data + ".length > " + $i + ") { ";
var $passData = $data + "[" + $i + "]";
$it.schema = $sch;
$it.schemaPath = $schemaPath + "[" + $i + "]";
$it.errSchemaPath = $errSchemaPath + "/" + $i;
$it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);
$it.dataPathArr[$dataNxt] = $i;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
out += " } ";
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
}
}
if (typeof $additionalItems == "object" && (it.opts.strictKeywords ? typeof $additionalItems == "object" && Object.keys($additionalItems).length > 0 || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) {
$it.schema = $additionalItems;
$it.schemaPath = it.schemaPath + ".additionalItems";
$it.errSchemaPath = it.errSchemaPath + "/additionalItems";
out += " " + $nextValid + " = true; if (" + $data + ".length > " + $schema.length + ") { for (var " + $idx + " = " + $schema.length + "; " + $idx + " < " + $data + ".length; " + $idx + "++) { ";
$it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
var $passData = $data + "[" + $idx + "]";
$it.dataPathArr[$dataNxt] = $idx;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
if ($breakOnError) {
out += " if (!" + $nextValid + ") break; ";
}
out += " } } ";
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
} else if (it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)) {
$it.schema = $schema;
$it.schemaPath = $schemaPath;
$it.errSchemaPath = $errSchemaPath;
out += " for (var " + $idx + " = " + 0 + "; " + $idx + " < " + $data + ".length; " + $idx + "++) { ";
$it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);
var $passData = $data + "[" + $idx + "]";
$it.dataPathArr[$dataNxt] = $idx;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
if ($breakOnError) {
out += " if (!" + $nextValid + ") break; ";
}
out += " }";
}
if ($breakOnError) {
out += " " + $closingBraces + " if (" + $errs + " == errors) {";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/_limit.js
var require_limit = __commonJS({
"node_modules/ajv/lib/dotjs/_limit.js"(exports, module2) {
"use strict";
module2.exports = function generate__limit(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $errorKeyword;
var $data = "data" + ($dataLvl || "");
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
var $isMax = $keyword == "maximum", $exclusiveKeyword = $isMax ? "exclusiveMaximum" : "exclusiveMinimum", $schemaExcl = it.schema[$exclusiveKeyword], $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, $op = $isMax ? "<" : ">", $notOp = $isMax ? ">" : "<", $errorKeyword = void 0;
if (!($isData || typeof $schema == "number" || $schema === void 0)) {
throw new Error($keyword + " must be number");
}
if (!($isDataExcl || $schemaExcl === void 0 || typeof $schemaExcl == "number" || typeof $schemaExcl == "boolean")) {
throw new Error($exclusiveKeyword + " must be number or boolean");
}
if ($isDataExcl) {
var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), $exclusive = "exclusive" + $lvl, $exclType = "exclType" + $lvl, $exclIsNumber = "exclIsNumber" + $lvl, $opExpr = "op" + $lvl, $opStr = "' + " + $opExpr + " + '";
out += " var schemaExcl" + $lvl + " = " + $schemaValueExcl + "; ";
$schemaValueExcl = "schemaExcl" + $lvl;
out += " var " + $exclusive + "; var " + $exclType + " = typeof " + $schemaValueExcl + "; if (" + $exclType + " != 'boolean' && " + $exclType + " != 'undefined' && " + $exclType + " != 'number') { ";
var $errorKeyword = $exclusiveKeyword;
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "_exclusiveLimit") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} ";
if (it.opts.messages !== false) {
out += " , message: '" + $exclusiveKeyword + " should be boolean' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } else if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || ";
}
out += " " + $exclType + " == 'number' ? ( (" + $exclusive + " = " + $schemaValue + " === undefined || " + $schemaValueExcl + " " + $op + "= " + $schemaValue + ") ? " + $data + " " + $notOp + "= " + $schemaValueExcl + " : " + $data + " " + $notOp + " " + $schemaValue + " ) : ( (" + $exclusive + " = " + $schemaValueExcl + " === true) ? " + $data + " " + $notOp + "= " + $schemaValue + " : " + $data + " " + $notOp + " " + $schemaValue + " ) || " + $data + " !== " + $data + ") { var op" + $lvl + " = " + $exclusive + " ? '" + $op + "' : '" + $op + "='; ";
if ($schema === void 0) {
$errorKeyword = $exclusiveKeyword;
$errSchemaPath = it.errSchemaPath + "/" + $exclusiveKeyword;
$schemaValue = $schemaValueExcl;
$isData = $isDataExcl;
}
} else {
var $exclIsNumber = typeof $schemaExcl == "number", $opStr = $op;
if ($exclIsNumber && $isData) {
var $opExpr = "'" + $opStr + "'";
out += " if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || ";
}
out += " ( " + $schemaValue + " === undefined || " + $schemaExcl + " " + $op + "= " + $schemaValue + " ? " + $data + " " + $notOp + "= " + $schemaExcl + " : " + $data + " " + $notOp + " " + $schemaValue + " ) || " + $data + " !== " + $data + ") { ";
} else {
if ($exclIsNumber && $schema === void 0) {
$exclusive = true;
$errorKeyword = $exclusiveKeyword;
$errSchemaPath = it.errSchemaPath + "/" + $exclusiveKeyword;
$schemaValue = $schemaExcl;
$notOp += "=";
} else {
if ($exclIsNumber)
$schemaValue = Math[$isMax ? "min" : "max"]($schemaExcl, $schema);
if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {
$exclusive = true;
$errorKeyword = $exclusiveKeyword;
$errSchemaPath = it.errSchemaPath + "/" + $exclusiveKeyword;
$notOp += "=";
} else {
$exclusive = false;
$opStr += "=";
}
}
var $opExpr = "'" + $opStr + "'";
out += " if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || ";
}
out += " " + $data + " " + $notOp + " " + $schemaValue + " || " + $data + " !== " + $data + ") { ";
}
}
$errorKeyword = $errorKeyword || $keyword;
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "_limit") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { comparison: " + $opExpr + ", limit: " + $schemaValue + ", exclusive: " + $exclusive + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should be " + $opStr + " ";
if ($isData) {
out += "' + " + $schemaValue;
} else {
out += "" + $schemaValue + "'";
}
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + $schema;
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/_limitItems.js
var require_limitItems = __commonJS({
"node_modules/ajv/lib/dotjs/_limitItems.js"(exports, module2) {
"use strict";
module2.exports = function generate__limitItems(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $errorKeyword;
var $data = "data" + ($dataLvl || "");
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
if (!($isData || typeof $schema == "number")) {
throw new Error($keyword + " must be number");
}
var $op = $keyword == "maxItems" ? ">" : "<";
out += "if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || ";
}
out += " " + $data + ".length " + $op + " " + $schemaValue + ") { ";
var $errorKeyword = $keyword;
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "_limitItems") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schemaValue + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT have ";
if ($keyword == "maxItems") {
out += "more";
} else {
out += "fewer";
}
out += " than ";
if ($isData) {
out += "' + " + $schemaValue + " + '";
} else {
out += "" + $schema;
}
out += " items' ";
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + $schema;
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += "} ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/_limitLength.js
var require_limitLength = __commonJS({
"node_modules/ajv/lib/dotjs/_limitLength.js"(exports, module2) {
"use strict";
module2.exports = function generate__limitLength(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $errorKeyword;
var $data = "data" + ($dataLvl || "");
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
if (!($isData || typeof $schema == "number")) {
throw new Error($keyword + " must be number");
}
var $op = $keyword == "maxLength" ? ">" : "<";
out += "if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || ";
}
if (it.opts.unicode === false) {
out += " " + $data + ".length ";
} else {
out += " ucs2length(" + $data + ") ";
}
out += " " + $op + " " + $schemaValue + ") { ";
var $errorKeyword = $keyword;
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "_limitLength") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schemaValue + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT be ";
if ($keyword == "maxLength") {
out += "longer";
} else {
out += "shorter";
}
out += " than ";
if ($isData) {
out += "' + " + $schemaValue + " + '";
} else {
out += "" + $schema;
}
out += " characters' ";
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + $schema;
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += "} ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/_limitProperties.js
var require_limitProperties = __commonJS({
"node_modules/ajv/lib/dotjs/_limitProperties.js"(exports, module2) {
"use strict";
module2.exports = function generate__limitProperties(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $errorKeyword;
var $data = "data" + ($dataLvl || "");
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
if (!($isData || typeof $schema == "number")) {
throw new Error($keyword + " must be number");
}
var $op = $keyword == "maxProperties" ? ">" : "<";
out += "if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'number') || ";
}
out += " Object.keys(" + $data + ").length " + $op + " " + $schemaValue + ") { ";
var $errorKeyword = $keyword;
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "_limitProperties") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { limit: " + $schemaValue + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT have ";
if ($keyword == "maxProperties") {
out += "more";
} else {
out += "fewer";
}
out += " than ";
if ($isData) {
out += "' + " + $schemaValue + " + '";
} else {
out += "" + $schema;
}
out += " properties' ";
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + $schema;
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += "} ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/multipleOf.js
var require_multipleOf = __commonJS({
"node_modules/ajv/lib/dotjs/multipleOf.js"(exports, module2) {
"use strict";
module2.exports = function generate_multipleOf(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
if (!($isData || typeof $schema == "number")) {
throw new Error($keyword + " must be number");
}
out += "var division" + $lvl + ";if (";
if ($isData) {
out += " " + $schemaValue + " !== undefined && ( typeof " + $schemaValue + " != 'number' || ";
}
out += " (division" + $lvl + " = " + $data + " / " + $schemaValue + ", ";
if (it.opts.multipleOfPrecision) {
out += " Math.abs(Math.round(division" + $lvl + ") - division" + $lvl + ") > 1e-" + it.opts.multipleOfPrecision + " ";
} else {
out += " division" + $lvl + " !== parseInt(division" + $lvl + ") ";
}
out += " ) ";
if ($isData) {
out += " ) ";
}
out += " ) { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'multipleOf' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { multipleOf: " + $schemaValue + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should be multiple of ";
if ($isData) {
out += "' + " + $schemaValue;
} else {
out += "" + $schemaValue + "'";
}
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + $schema;
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += "} ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/not.js
var require_not = __commonJS({
"node_modules/ajv/lib/dotjs/not.js"(exports, module2) {
"use strict";
module2.exports = function generate_not(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
$it.level++;
var $nextValid = "valid" + $it.level;
if (it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)) {
$it.schema = $schema;
$it.schemaPath = $schemaPath;
$it.errSchemaPath = $errSchemaPath;
out += " var " + $errs + " = errors; ";
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
$it.createErrors = false;
var $allErrorsOption;
if ($it.opts.allErrors) {
$allErrorsOption = $it.opts.allErrors;
$it.opts.allErrors = false;
}
out += " " + it.validate($it) + " ";
$it.createErrors = true;
if ($allErrorsOption)
$it.opts.allErrors = $allErrorsOption;
it.compositeRule = $it.compositeRule = $wasComposite;
out += " if (" + $nextValid + ") { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'not' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT be valid' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } else { errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; } ";
if (it.opts.allErrors) {
out += " } ";
}
} else {
out += " var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'not' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: {} ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT be valid' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
if ($breakOnError) {
out += " if (false) { ";
}
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/oneOf.js
var require_oneOf = __commonJS({
"node_modules/ajv/lib/dotjs/oneOf.js"(exports, module2) {
"use strict";
module2.exports = function generate_oneOf(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $currentBaseId = $it.baseId, $prevValid = "prevValid" + $lvl, $passingSchemas = "passingSchemas" + $lvl;
out += "var " + $errs + " = errors , " + $prevValid + " = false , " + $valid + " = false , " + $passingSchemas + " = null; ";
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
var arr1 = $schema;
if (arr1) {
var $sch, $i = -1, l1 = arr1.length - 1;
while ($i < l1) {
$sch = arr1[$i += 1];
if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) {
$it.schema = $sch;
$it.schemaPath = $schemaPath + "[" + $i + "]";
$it.errSchemaPath = $errSchemaPath + "/" + $i;
out += " " + it.validate($it) + " ";
$it.baseId = $currentBaseId;
} else {
out += " var " + $nextValid + " = true; ";
}
if ($i) {
out += " if (" + $nextValid + " && " + $prevValid + ") { " + $valid + " = false; " + $passingSchemas + " = [" + $passingSchemas + ", " + $i + "]; } else { ";
$closingBraces += "}";
}
out += " if (" + $nextValid + ") { " + $valid + " = " + $prevValid + " = true; " + $passingSchemas + " = " + $i + "; }";
}
}
it.compositeRule = $it.compositeRule = $wasComposite;
out += "" + $closingBraces + "if (!" + $valid + ") { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'oneOf' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { passingSchemas: " + $passingSchemas + " } ";
if (it.opts.messages !== false) {
out += " , message: 'should match exactly one schema in oneOf' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError(vErrors); ";
} else {
out += " validate.errors = vErrors; return false; ";
}
}
out += "} else { errors = " + $errs + "; if (vErrors !== null) { if (" + $errs + ") vErrors.length = " + $errs + "; else vErrors = null; }";
if (it.opts.allErrors) {
out += " } ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/pattern.js
var require_pattern = __commonJS({
"node_modules/ajv/lib/dotjs/pattern.js"(exports, module2) {
"use strict";
module2.exports = function generate_pattern(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
var $regexp = $isData ? "(new RegExp(" + $schemaValue + "))" : it.usePattern($schema);
out += "if ( ";
if ($isData) {
out += " (" + $schemaValue + " !== undefined && typeof " + $schemaValue + " != 'string') || ";
}
out += " !" + $regexp + ".test(" + $data + ") ) { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'pattern' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { pattern: ";
if ($isData) {
out += "" + $schemaValue;
} else {
out += "" + it.util.toQuotedString($schema);
}
out += " } ";
if (it.opts.messages !== false) {
out += ` , message: 'should match pattern "`;
if ($isData) {
out += "' + " + $schemaValue + " + '";
} else {
out += "" + it.util.escapeQuotes($schema);
}
out += `"' `;
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + it.util.toQuotedString($schema);
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += "} ";
if ($breakOnError) {
out += " else { ";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/properties.js
var require_properties = __commonJS({
"node_modules/ajv/lib/dotjs/properties.js"(exports, module2) {
"use strict";
module2.exports = function generate_properties(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
var $key = "key" + $lvl, $idx = "idx" + $lvl, $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $dataProperties = "dataProperties" + $lvl;
var $schemaKeys = Object.keys($schema || {}).filter(notProto), $pProperties = it.schema.patternProperties || {}, $pPropertyKeys = Object.keys($pProperties).filter(notProto), $aProperties = it.schema.additionalProperties, $someProperties = $schemaKeys.length || $pPropertyKeys.length, $noAdditional = $aProperties === false, $additionalIsSchema = typeof $aProperties == "object" && Object.keys($aProperties).length, $removeAdditional = it.opts.removeAdditional, $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, $ownProperties = it.opts.ownProperties, $currentBaseId = it.baseId;
var $required = it.schema.required;
if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {
var $requiredHash = it.util.toHash($required);
}
function notProto(p) {
return p !== "__proto__";
}
out += "var " + $errs + " = errors;var " + $nextValid + " = true;";
if ($ownProperties) {
out += " var " + $dataProperties + " = undefined;";
}
if ($checkAdditional) {
if ($ownProperties) {
out += " " + $dataProperties + " = " + $dataProperties + " || Object.keys(" + $data + "); for (var " + $idx + "=0; " + $idx + "<" + $dataProperties + ".length; " + $idx + "++) { var " + $key + " = " + $dataProperties + "[" + $idx + "]; ";
} else {
out += " for (var " + $key + " in " + $data + ") { ";
}
if ($someProperties) {
out += " var isAdditional" + $lvl + " = !(false ";
if ($schemaKeys.length) {
if ($schemaKeys.length > 8) {
out += " || validate.schema" + $schemaPath + ".hasOwnProperty(" + $key + ") ";
} else {
var arr1 = $schemaKeys;
if (arr1) {
var $propertyKey, i1 = -1, l1 = arr1.length - 1;
while (i1 < l1) {
$propertyKey = arr1[i1 += 1];
out += " || " + $key + " == " + it.util.toQuotedString($propertyKey) + " ";
}
}
}
}
if ($pPropertyKeys.length) {
var arr2 = $pPropertyKeys;
if (arr2) {
var $pProperty, $i = -1, l2 = arr2.length - 1;
while ($i < l2) {
$pProperty = arr2[$i += 1];
out += " || " + it.usePattern($pProperty) + ".test(" + $key + ") ";
}
}
}
out += " ); if (isAdditional" + $lvl + ") { ";
}
if ($removeAdditional == "all") {
out += " delete " + $data + "[" + $key + "]; ";
} else {
var $currentErrorPath = it.errorPath;
var $additionalProperty = "' + " + $key + " + '";
if (it.opts._errorDataPathProperty) {
it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
}
if ($noAdditional) {
if ($removeAdditional) {
out += " delete " + $data + "[" + $key + "]; ";
} else {
out += " " + $nextValid + " = false; ";
var $currErrSchemaPath = $errSchemaPath;
$errSchemaPath = it.errSchemaPath + "/additionalProperties";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'additionalProperties' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { additionalProperty: '" + $additionalProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is an invalid additional property";
} else {
out += "should NOT have additional properties";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: false , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
$errSchemaPath = $currErrSchemaPath;
if ($breakOnError) {
out += " break; ";
}
}
} else if ($additionalIsSchema) {
if ($removeAdditional == "failing") {
out += " var " + $errs + " = errors; ";
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
$it.schema = $aProperties;
$it.schemaPath = it.schemaPath + ".additionalProperties";
$it.errSchemaPath = it.errSchemaPath + "/additionalProperties";
$it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
var $passData = $data + "[" + $key + "]";
$it.dataPathArr[$dataNxt] = $key;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
out += " if (!" + $nextValid + ") { errors = " + $errs + "; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete " + $data + "[" + $key + "]; } ";
it.compositeRule = $it.compositeRule = $wasComposite;
} else {
$it.schema = $aProperties;
$it.schemaPath = it.schemaPath + ".additionalProperties";
$it.errSchemaPath = it.errSchemaPath + "/additionalProperties";
$it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
var $passData = $data + "[" + $key + "]";
$it.dataPathArr[$dataNxt] = $key;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
if ($breakOnError) {
out += " if (!" + $nextValid + ") break; ";
}
}
}
it.errorPath = $currentErrorPath;
}
if ($someProperties) {
out += " } ";
}
out += " } ";
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
var $useDefaults = it.opts.useDefaults && !it.compositeRule;
if ($schemaKeys.length) {
var arr3 = $schemaKeys;
if (arr3) {
var $propertyKey, i3 = -1, l3 = arr3.length - 1;
while (i3 < l3) {
$propertyKey = arr3[i3 += 1];
var $sch = $schema[$propertyKey];
if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) {
var $prop = it.util.getProperty($propertyKey), $passData = $data + $prop, $hasDefault = $useDefaults && $sch.default !== void 0;
$it.schema = $sch;
$it.schemaPath = $schemaPath + $prop;
$it.errSchemaPath = $errSchemaPath + "/" + it.util.escapeFragment($propertyKey);
$it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);
$it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
$code = it.util.varReplace($code, $nextData, $passData);
var $useData = $passData;
} else {
var $useData = $nextData;
out += " var " + $nextData + " = " + $passData + "; ";
}
if ($hasDefault) {
out += " " + $code + " ";
} else {
if ($requiredHash && $requiredHash[$propertyKey]) {
out += " if ( " + $useData + " === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += ") { " + $nextValid + " = false; ";
var $currentErrorPath = it.errorPath, $currErrSchemaPath = $errSchemaPath, $missingProperty = it.util.escapeQuotes($propertyKey);
if (it.opts._errorDataPathProperty) {
it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
}
$errSchemaPath = it.errSchemaPath + "/required";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is a required property";
} else {
out += "should have required property \\'" + $missingProperty + "\\'";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
$errSchemaPath = $currErrSchemaPath;
it.errorPath = $currentErrorPath;
out += " } else { ";
} else {
if ($breakOnError) {
out += " if ( " + $useData + " === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += ") { " + $nextValid + " = true; } else { ";
} else {
out += " if (" + $useData + " !== undefined ";
if ($ownProperties) {
out += " && Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += " ) { ";
}
}
out += " " + $code + " } ";
}
}
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
}
}
if ($pPropertyKeys.length) {
var arr4 = $pPropertyKeys;
if (arr4) {
var $pProperty, i4 = -1, l4 = arr4.length - 1;
while (i4 < l4) {
$pProperty = arr4[i4 += 1];
var $sch = $pProperties[$pProperty];
if (it.opts.strictKeywords ? typeof $sch == "object" && Object.keys($sch).length > 0 || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)) {
$it.schema = $sch;
$it.schemaPath = it.schemaPath + ".patternProperties" + it.util.getProperty($pProperty);
$it.errSchemaPath = it.errSchemaPath + "/patternProperties/" + it.util.escapeFragment($pProperty);
if ($ownProperties) {
out += " " + $dataProperties + " = " + $dataProperties + " || Object.keys(" + $data + "); for (var " + $idx + "=0; " + $idx + "<" + $dataProperties + ".length; " + $idx + "++) { var " + $key + " = " + $dataProperties + "[" + $idx + "]; ";
} else {
out += " for (var " + $key + " in " + $data + ") { ";
}
out += " if (" + it.usePattern($pProperty) + ".test(" + $key + ")) { ";
$it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);
var $passData = $data + "[" + $key + "]";
$it.dataPathArr[$dataNxt] = $key;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
if ($breakOnError) {
out += " if (!" + $nextValid + ") break; ";
}
out += " } ";
if ($breakOnError) {
out += " else " + $nextValid + " = true; ";
}
out += " } ";
if ($breakOnError) {
out += " if (" + $nextValid + ") { ";
$closingBraces += "}";
}
}
}
}
}
if ($breakOnError) {
out += " " + $closingBraces + " if (" + $errs + " == errors) {";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/propertyNames.js
var require_propertyNames = __commonJS({
"node_modules/ajv/lib/dotjs/propertyNames.js"(exports, module2) {
"use strict";
module2.exports = function generate_propertyNames(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $errs = "errs__" + $lvl;
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
out += "var " + $errs + " = errors;";
if (it.opts.strictKeywords ? typeof $schema == "object" && Object.keys($schema).length > 0 || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)) {
$it.schema = $schema;
$it.schemaPath = $schemaPath;
$it.errSchemaPath = $errSchemaPath;
var $key = "key" + $lvl, $idx = "idx" + $lvl, $i = "i" + $lvl, $invalidName = "' + " + $key + " + '", $dataNxt = $it.dataLevel = it.dataLevel + 1, $nextData = "data" + $dataNxt, $dataProperties = "dataProperties" + $lvl, $ownProperties = it.opts.ownProperties, $currentBaseId = it.baseId;
if ($ownProperties) {
out += " var " + $dataProperties + " = undefined; ";
}
if ($ownProperties) {
out += " " + $dataProperties + " = " + $dataProperties + " || Object.keys(" + $data + "); for (var " + $idx + "=0; " + $idx + "<" + $dataProperties + ".length; " + $idx + "++) { var " + $key + " = " + $dataProperties + "[" + $idx + "]; ";
} else {
out += " for (var " + $key + " in " + $data + ") { ";
}
out += " var startErrs" + $lvl + " = errors; ";
var $passData = $key;
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
var $code = it.validate($it);
$it.baseId = $currentBaseId;
if (it.util.varOccurences($code, $nextData) < 2) {
out += " " + it.util.varReplace($code, $nextData, $passData) + " ";
} else {
out += " var " + $nextData + " = " + $passData + "; " + $code + " ";
}
it.compositeRule = $it.compositeRule = $wasComposite;
out += " if (!" + $nextValid + ") { for (var " + $i + "=startErrs" + $lvl + "; " + $i + "<errors; " + $i + "++) { vErrors[" + $i + "].propertyName = " + $key + "; } var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'propertyNames' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { propertyName: '" + $invalidName + "' } ";
if (it.opts.messages !== false) {
out += " , message: 'property name \\'" + $invalidName + "\\' is invalid' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError(vErrors); ";
} else {
out += " validate.errors = vErrors; return false; ";
}
}
if ($breakOnError) {
out += " break; ";
}
out += " } }";
}
if ($breakOnError) {
out += " " + $closingBraces + " if (" + $errs + " == errors) {";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/required.js
var require_required = __commonJS({
"node_modules/ajv/lib/dotjs/required.js"(exports, module2) {
"use strict";
module2.exports = function generate_required(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
var $vSchema = "schema" + $lvl;
if (!$isData) {
if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {
var $required = [];
var arr1 = $schema;
if (arr1) {
var $property, i1 = -1, l1 = arr1.length - 1;
while (i1 < l1) {
$property = arr1[i1 += 1];
var $propertySch = it.schema.properties[$property];
if (!($propertySch && (it.opts.strictKeywords ? typeof $propertySch == "object" && Object.keys($propertySch).length > 0 || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) {
$required[$required.length] = $property;
}
}
}
} else {
var $required = $schema;
}
}
if ($isData || $required.length) {
var $currentErrorPath = it.errorPath, $loopRequired = $isData || $required.length >= it.opts.loopRequired, $ownProperties = it.opts.ownProperties;
if ($breakOnError) {
out += " var missing" + $lvl + "; ";
if ($loopRequired) {
if (!$isData) {
out += " var " + $vSchema + " = validate.schema" + $schemaPath + "; ";
}
var $i = "i" + $lvl, $propertyPath = "schema" + $lvl + "[" + $i + "]", $missingProperty = "' + " + $propertyPath + " + '";
if (it.opts._errorDataPathProperty) {
it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
}
out += " var " + $valid + " = true; ";
if ($isData) {
out += " if (schema" + $lvl + " === undefined) " + $valid + " = true; else if (!Array.isArray(schema" + $lvl + ")) " + $valid + " = false; else {";
}
out += " for (var " + $i + " = 0; " + $i + " < " + $vSchema + ".length; " + $i + "++) { " + $valid + " = " + $data + "[" + $vSchema + "[" + $i + "]] !== undefined ";
if ($ownProperties) {
out += " && Object.prototype.hasOwnProperty.call(" + $data + ", " + $vSchema + "[" + $i + "]) ";
}
out += "; if (!" + $valid + ") break; } ";
if ($isData) {
out += " } ";
}
out += " if (!" + $valid + ") { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is a required property";
} else {
out += "should have required property \\'" + $missingProperty + "\\'";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } else { ";
} else {
out += " if ( ";
var arr2 = $required;
if (arr2) {
var $propertyKey, $i = -1, l2 = arr2.length - 1;
while ($i < l2) {
$propertyKey = arr2[$i += 1];
if ($i) {
out += " || ";
}
var $prop = it.util.getProperty($propertyKey), $useData = $data + $prop;
out += " ( ( " + $useData + " === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += ") && (missing" + $lvl + " = " + it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) + ") ) ";
}
}
out += ") { ";
var $propertyPath = "missing" + $lvl, $missingProperty = "' + " + $propertyPath + " + '";
if (it.opts._errorDataPathProperty) {
it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + " + " + $propertyPath;
}
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is a required property";
} else {
out += "should have required property \\'" + $missingProperty + "\\'";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } else { ";
}
} else {
if ($loopRequired) {
if (!$isData) {
out += " var " + $vSchema + " = validate.schema" + $schemaPath + "; ";
}
var $i = "i" + $lvl, $propertyPath = "schema" + $lvl + "[" + $i + "]", $missingProperty = "' + " + $propertyPath + " + '";
if (it.opts._errorDataPathProperty) {
it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);
}
if ($isData) {
out += " if (" + $vSchema + " && !Array.isArray(" + $vSchema + ")) { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is a required property";
} else {
out += "should have required property \\'" + $missingProperty + "\\'";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (" + $vSchema + " !== undefined) { ";
}
out += " for (var " + $i + " = 0; " + $i + " < " + $vSchema + ".length; " + $i + "++) { if (" + $data + "[" + $vSchema + "[" + $i + "]] === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", " + $vSchema + "[" + $i + "]) ";
}
out += ") { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is a required property";
} else {
out += "should have required property \\'" + $missingProperty + "\\'";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ";
if ($isData) {
out += " } ";
}
} else {
var arr3 = $required;
if (arr3) {
var $propertyKey, i3 = -1, l3 = arr3.length - 1;
while (i3 < l3) {
$propertyKey = arr3[i3 += 1];
var $prop = it.util.getProperty($propertyKey), $missingProperty = it.util.escapeQuotes($propertyKey), $useData = $data + $prop;
if (it.opts._errorDataPathProperty) {
it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);
}
out += " if ( " + $useData + " === undefined ";
if ($ownProperties) {
out += " || ! Object.prototype.hasOwnProperty.call(" + $data + ", '" + it.util.escapeQuotes($propertyKey) + "') ";
}
out += ") { var err = ";
if (it.createErrors !== false) {
out += " { keyword: 'required' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { missingProperty: '" + $missingProperty + "' } ";
if (it.opts.messages !== false) {
out += " , message: '";
if (it.opts._errorDataPathProperty) {
out += "is a required property";
} else {
out += "should have required property \\'" + $missingProperty + "\\'";
}
out += "' ";
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ";
}
}
}
}
it.errorPath = $currentErrorPath;
} else if ($breakOnError) {
out += " if (true) {";
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/uniqueItems.js
var require_uniqueItems = __commonJS({
"node_modules/ajv/lib/dotjs/uniqueItems.js"(exports, module2) {
"use strict";
module2.exports = function generate_uniqueItems(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
if (($schema || $isData) && it.opts.uniqueItems !== false) {
if ($isData) {
out += " var " + $valid + "; if (" + $schemaValue + " === false || " + $schemaValue + " === undefined) " + $valid + " = true; else if (typeof " + $schemaValue + " != 'boolean') " + $valid + " = false; else { ";
}
out += " var i = " + $data + ".length , " + $valid + " = true , j; if (i > 1) { ";
var $itemType = it.schema.items && it.schema.items.type, $typeIsArray = Array.isArray($itemType);
if (!$itemType || $itemType == "object" || $itemType == "array" || $typeIsArray && ($itemType.indexOf("object") >= 0 || $itemType.indexOf("array") >= 0)) {
out += " outer: for (;i--;) { for (j = i; j--;) { if (equal(" + $data + "[i], " + $data + "[j])) { " + $valid + " = false; break outer; } } } ";
} else {
out += " var itemIndices = {}, item; for (;i--;) { var item = " + $data + "[i]; ";
var $method = "checkDataType" + ($typeIsArray ? "s" : "");
out += " if (" + it.util[$method]($itemType, "item", it.opts.strictNumbers, true) + ") continue; ";
if ($typeIsArray) {
out += ` if (typeof item == 'string') item = '"' + item; `;
}
out += " if (typeof itemIndices[item] == 'number') { " + $valid + " = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ";
}
out += " } ";
if ($isData) {
out += " } ";
}
out += " if (!" + $valid + ") { ";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: 'uniqueItems' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { i: i, j: j } ";
if (it.opts.messages !== false) {
out += " , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' ";
}
if (it.opts.verbose) {
out += " , schema: ";
if ($isData) {
out += "validate.schema" + $schemaPath;
} else {
out += "" + $schema;
}
out += " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
out += " } ";
if ($breakOnError) {
out += " else { ";
}
} else {
if ($breakOnError) {
out += " if (true) { ";
}
}
return out;
};
}
});
// node_modules/ajv/lib/dotjs/index.js
var require_dotjs = __commonJS({
"node_modules/ajv/lib/dotjs/index.js"(exports, module2) {
"use strict";
module2.exports = {
"$ref": require_ref(),
allOf: require_allOf(),
anyOf: require_anyOf(),
"$comment": require_comment(),
const: require_const(),
contains: require_contains(),
dependencies: require_dependencies(),
"enum": require_enum(),
format: require_format(),
"if": require_if(),
items: require_items(),
maximum: require_limit(),
minimum: require_limit(),
maxItems: require_limitItems(),
minItems: require_limitItems(),
maxLength: require_limitLength(),
minLength: require_limitLength(),
maxProperties: require_limitProperties(),
minProperties: require_limitProperties(),
multipleOf: require_multipleOf(),
not: require_not(),
oneOf: require_oneOf(),
pattern: require_pattern(),
properties: require_properties(),
propertyNames: require_propertyNames(),
required: require_required(),
uniqueItems: require_uniqueItems(),
validate: require_validate2()
};
}
});
// node_modules/ajv/lib/compile/rules.js
var require_rules2 = __commonJS({
"node_modules/ajv/lib/compile/rules.js"(exports, module2) {
"use strict";
var ruleModules = require_dotjs();
var toHash = require_util3().toHash;
module2.exports = function rules() {
var RULES = [
{
type: "number",
rules: [
{ "maximum": ["exclusiveMaximum"] },
{ "minimum": ["exclusiveMinimum"] },
"multipleOf",
"format"
]
},
{
type: "string",
rules: ["maxLength", "minLength", "pattern", "format"]
},
{
type: "array",
rules: ["maxItems", "minItems", "items", "contains", "uniqueItems"]
},
{
type: "object",
rules: [
"maxProperties",
"minProperties",
"required",
"dependencies",
"propertyNames",
{ "properties": ["additionalProperties", "patternProperties"] }
]
},
{ rules: ["$ref", "const", "enum", "not", "anyOf", "oneOf", "allOf", "if"] }
];
var ALL = ["type", "$comment"];
var KEYWORDS = [
"$schema",
"$id",
"id",
"$data",
"$async",
"title",
"description",
"default",
"definitions",
"examples",
"readOnly",
"writeOnly",
"contentMediaType",
"contentEncoding",
"additionalItems",
"then",
"else"
];
var TYPES = ["number", "integer", "string", "array", "object", "boolean", "null"];
RULES.all = toHash(ALL);
RULES.types = toHash(TYPES);
RULES.forEach(function(group) {
group.rules = group.rules.map(function(keyword) {
var implKeywords;
if (typeof keyword == "object") {
var key = Object.keys(keyword)[0];
implKeywords = keyword[key];
keyword = key;
implKeywords.forEach(function(k) {
ALL.push(k);
RULES.all[k] = true;
});
}
ALL.push(keyword);
var rule = RULES.all[keyword] = {
keyword,
code: ruleModules[keyword],
implements: implKeywords
};
return rule;
});
RULES.all.$comment = {
keyword: "$comment",
code: ruleModules.$comment
};
if (group.type)
RULES.types[group.type] = group;
});
RULES.keywords = toHash(ALL.concat(KEYWORDS));
RULES.custom = {};
return RULES;
};
}
});
// node_modules/ajv/lib/data.js
var require_data = __commonJS({
"node_modules/ajv/lib/data.js"(exports, module2) {
"use strict";
var KEYWORDS = [
"multipleOf",
"maximum",
"exclusiveMaximum",
"minimum",
"exclusiveMinimum",
"maxLength",
"minLength",
"pattern",
"additionalItems",
"maxItems",
"minItems",
"uniqueItems",
"maxProperties",
"minProperties",
"required",
"additionalProperties",
"enum",
"format",
"const"
];
module2.exports = function(metaSchema, keywordsJsonPointers) {
for (var i = 0; i < keywordsJsonPointers.length; i++) {
metaSchema = JSON.parse(JSON.stringify(metaSchema));
var segments = keywordsJsonPointers[i].split("/");
var keywords = metaSchema;
var j;
for (j = 1; j < segments.length; j++)
keywords = keywords[segments[j]];
for (j = 0; j < KEYWORDS.length; j++) {
var key = KEYWORDS[j];
var schema = keywords[key];
if (schema) {
keywords[key] = {
anyOf: [
schema,
{ $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" }
]
};
}
}
}
return metaSchema;
};
}
});
// node_modules/ajv/lib/compile/async.js
var require_async = __commonJS({
"node_modules/ajv/lib/compile/async.js"(exports, module2) {
"use strict";
var MissingRefError = require_error_classes().MissingRef;
module2.exports = compileAsync;
function compileAsync(schema, meta, callback) {
var self2 = this;
if (typeof this._opts.loadSchema != "function")
throw new Error("options.loadSchema should be a function");
if (typeof meta == "function") {
callback = meta;
meta = void 0;
}
var p = loadMetaSchemaOf(schema).then(function() {
var schemaObj = self2._addSchema(schema, void 0, meta);
return schemaObj.validate || _compileAsync(schemaObj);
});
if (callback) {
p.then(function(v) {
callback(null, v);
}, callback);
}
return p;
function loadMetaSchemaOf(sch) {
var $schema = sch.$schema;
return $schema && !self2.getSchema($schema) ? compileAsync.call(self2, { $ref: $schema }, true) : Promise.resolve();
}
function _compileAsync(schemaObj) {
try {
return self2._compile(schemaObj);
} catch (e) {
if (e instanceof MissingRefError)
return loadMissingSchema(e);
throw e;
}
function loadMissingSchema(e) {
var ref = e.missingSchema;
if (added(ref))
throw new Error("Schema " + ref + " is loaded but " + e.missingRef + " cannot be resolved");
var schemaPromise = self2._loadingSchemas[ref];
if (!schemaPromise) {
schemaPromise = self2._loadingSchemas[ref] = self2._opts.loadSchema(ref);
schemaPromise.then(removePromise, removePromise);
}
return schemaPromise.then(function(sch) {
if (!added(ref)) {
return loadMetaSchemaOf(sch).then(function() {
if (!added(ref))
self2.addSchema(sch, ref, void 0, meta);
});
}
}).then(function() {
return _compileAsync(schemaObj);
});
function removePromise() {
delete self2._loadingSchemas[ref];
}
function added(ref2) {
return self2._refs[ref2] || self2._schemas[ref2];
}
}
}
}
}
});
// node_modules/ajv/lib/dotjs/custom.js
var require_custom = __commonJS({
"node_modules/ajv/lib/dotjs/custom.js"(exports, module2) {
"use strict";
module2.exports = function generate_custom(it, $keyword, $ruleType) {
var out = " ";
var $lvl = it.level;
var $dataLvl = it.dataLevel;
var $schema = it.schema[$keyword];
var $schemaPath = it.schemaPath + it.util.getProperty($keyword);
var $errSchemaPath = it.errSchemaPath + "/" + $keyword;
var $breakOnError = !it.opts.allErrors;
var $errorKeyword;
var $data = "data" + ($dataLvl || "");
var $valid = "valid" + $lvl;
var $errs = "errs__" + $lvl;
var $isData = it.opts.$data && $schema && $schema.$data, $schemaValue;
if ($isData) {
out += " var schema" + $lvl + " = " + it.util.getData($schema.$data, $dataLvl, it.dataPathArr) + "; ";
$schemaValue = "schema" + $lvl;
} else {
$schemaValue = $schema;
}
var $rule = this, $definition = "definition" + $lvl, $rDef = $rule.definition, $closingBraces = "";
var $compile, $inline, $macro, $ruleValidate, $validateCode;
if ($isData && $rDef.$data) {
$validateCode = "keywordValidate" + $lvl;
var $validateSchema = $rDef.validateSchema;
out += " var " + $definition + " = RULES.custom['" + $keyword + "'].definition; var " + $validateCode + " = " + $definition + ".validate;";
} else {
$ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
if (!$ruleValidate)
return;
$schemaValue = "validate.schema" + $schemaPath;
$validateCode = $ruleValidate.code;
$compile = $rDef.compile;
$inline = $rDef.inline;
$macro = $rDef.macro;
}
var $ruleErrs = $validateCode + ".errors", $i = "i" + $lvl, $ruleErr = "ruleErr" + $lvl, $asyncKeyword = $rDef.async;
if ($asyncKeyword && !it.async)
throw new Error("async keyword in sync schema");
if (!($inline || $macro)) {
out += "" + $ruleErrs + " = null;";
}
out += "var " + $errs + " = errors;var " + $valid + ";";
if ($isData && $rDef.$data) {
$closingBraces += "}";
out += " if (" + $schemaValue + " === undefined) { " + $valid + " = true; } else { ";
if ($validateSchema) {
$closingBraces += "}";
out += " " + $valid + " = " + $definition + ".validateSchema(" + $schemaValue + "); if (" + $valid + ") { ";
}
}
if ($inline) {
if ($rDef.statements) {
out += " " + $ruleValidate.validate + " ";
} else {
out += " " + $valid + " = " + $ruleValidate.validate + "; ";
}
} else if ($macro) {
var $it = it.util.copy(it);
var $closingBraces = "";
$it.level++;
var $nextValid = "valid" + $it.level;
$it.schema = $ruleValidate.validate;
$it.schemaPath = "";
var $wasComposite = it.compositeRule;
it.compositeRule = $it.compositeRule = true;
var $code = it.validate($it).replace(/validate\.schema/g, $validateCode);
it.compositeRule = $it.compositeRule = $wasComposite;
out += " " + $code;
} else {
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
out += " " + $validateCode + ".call( ";
if (it.opts.passContext) {
out += "this";
} else {
out += "self";
}
if ($compile || $rDef.schema === false) {
out += " , " + $data + " ";
} else {
out += " , " + $schemaValue + " , " + $data + " , validate.schema" + it.schemaPath + " ";
}
out += " , (dataPath || '')";
if (it.errorPath != '""') {
out += " + " + it.errorPath;
}
var $parentData = $dataLvl ? "data" + ($dataLvl - 1 || "") : "parentData", $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : "parentDataProperty";
out += " , " + $parentData + " , " + $parentDataProperty + " , rootData ) ";
var def_callRuleValidate = out;
out = $$outStack.pop();
if ($rDef.errors === false) {
out += " " + $valid + " = ";
if ($asyncKeyword) {
out += "await ";
}
out += "" + def_callRuleValidate + "; ";
} else {
if ($asyncKeyword) {
$ruleErrs = "customErrors" + $lvl;
out += " var " + $ruleErrs + " = null; try { " + $valid + " = await " + def_callRuleValidate + "; } catch (e) { " + $valid + " = false; if (e instanceof ValidationError) " + $ruleErrs + " = e.errors; else throw e; } ";
} else {
out += " " + $ruleErrs + " = null; " + $valid + " = " + def_callRuleValidate + "; ";
}
}
}
if ($rDef.modifying) {
out += " if (" + $parentData + ") " + $data + " = " + $parentData + "[" + $parentDataProperty + "];";
}
out += "" + $closingBraces;
if ($rDef.valid) {
if ($breakOnError) {
out += " if (true) { ";
}
} else {
out += " if ( ";
if ($rDef.valid === void 0) {
out += " !";
if ($macro) {
out += "" + $nextValid;
} else {
out += "" + $valid;
}
} else {
out += " " + !$rDef.valid + " ";
}
out += ") { ";
$errorKeyword = $rule.keyword;
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
var $$outStack = $$outStack || [];
$$outStack.push(out);
out = "";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "custom") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { keyword: '" + $rule.keyword + "' } ";
if (it.opts.messages !== false) {
out += ` , message: 'should pass "` + $rule.keyword + `" keyword validation' `;
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
var __err = out;
out = $$outStack.pop();
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError([" + __err + "]); ";
} else {
out += " validate.errors = [" + __err + "]; return false; ";
}
} else {
out += " var err = " + __err + "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
}
var def_customError = out;
out = $$outStack.pop();
if ($inline) {
if ($rDef.errors) {
if ($rDef.errors != "full") {
out += " for (var " + $i + "=" + $errs + "; " + $i + "<errors; " + $i + "++) { var " + $ruleErr + " = vErrors[" + $i + "]; if (" + $ruleErr + ".dataPath === undefined) " + $ruleErr + ".dataPath = (dataPath || '') + " + it.errorPath + "; if (" + $ruleErr + ".schemaPath === undefined) { " + $ruleErr + '.schemaPath = "' + $errSchemaPath + '"; } ';
if (it.opts.verbose) {
out += " " + $ruleErr + ".schema = " + $schemaValue + "; " + $ruleErr + ".data = " + $data + "; ";
}
out += " } ";
}
} else {
if ($rDef.errors === false) {
out += " " + def_customError + " ";
} else {
out += " if (" + $errs + " == errors) { " + def_customError + " } else { for (var " + $i + "=" + $errs + "; " + $i + "<errors; " + $i + "++) { var " + $ruleErr + " = vErrors[" + $i + "]; if (" + $ruleErr + ".dataPath === undefined) " + $ruleErr + ".dataPath = (dataPath || '') + " + it.errorPath + "; if (" + $ruleErr + ".schemaPath === undefined) { " + $ruleErr + '.schemaPath = "' + $errSchemaPath + '"; } ';
if (it.opts.verbose) {
out += " " + $ruleErr + ".schema = " + $schemaValue + "; " + $ruleErr + ".data = " + $data + "; ";
}
out += " } } ";
}
}
} else if ($macro) {
out += " var err = ";
if (it.createErrors !== false) {
out += " { keyword: '" + ($errorKeyword || "custom") + "' , dataPath: (dataPath || '') + " + it.errorPath + " , schemaPath: " + it.util.toQuotedString($errSchemaPath) + " , params: { keyword: '" + $rule.keyword + "' } ";
if (it.opts.messages !== false) {
out += ` , message: 'should pass "` + $rule.keyword + `" keyword validation' `;
}
if (it.opts.verbose) {
out += " , schema: validate.schema" + $schemaPath + " , parentSchema: validate.schema" + it.schemaPath + " , data: " + $data + " ";
}
out += " } ";
} else {
out += " {} ";
}
out += "; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ";
if (!it.compositeRule && $breakOnError) {
if (it.async) {
out += " throw new ValidationError(vErrors); ";
} else {
out += " validate.errors = vErrors; return false; ";
}
}
} else {
if ($rDef.errors === false) {
out += " " + def_customError + " ";
} else {
out += " if (Array.isArray(" + $ruleErrs + ")) { if (vErrors === null) vErrors = " + $ruleErrs + "; else vErrors = vErrors.concat(" + $ruleErrs + "); errors = vErrors.length; for (var " + $i + "=" + $errs + "; " + $i + "<errors; " + $i + "++) { var " + $ruleErr + " = vErrors[" + $i + "]; if (" + $ruleErr + ".dataPath === undefined) " + $ruleErr + ".dataPath = (dataPath || '') + " + it.errorPath + "; " + $ruleErr + '.schemaPath = "' + $errSchemaPath + '"; ';
if (it.opts.verbose) {
out += " " + $ruleErr + ".schema = " + $schemaValue + "; " + $ruleErr + ".data = " + $data + "; ";
}
out += " } } else { " + def_customError + " } ";
}
}
out += " } ";
if ($breakOnError) {
out += " else { ";
}
}
return out;
};
}
});
// node_modules/ajv/lib/refs/json-schema-draft-07.json
var require_json_schema_draft_07 = __commonJS({
"node_modules/ajv/lib/refs/json-schema-draft-07.json"(exports, module2) {
module2.exports = {
$schema: "http://json-schema.org/draft-07/schema#",
$id: "http://json-schema.org/draft-07/schema#",
title: "Core schema meta-schema",
definitions: {
schemaArray: {
type: "array",
minItems: 1,
items: { $ref: "#" }
},
nonNegativeInteger: {
type: "integer",
minimum: 0
},
nonNegativeIntegerDefault0: {
allOf: [
{ $ref: "#/definitions/nonNegativeInteger" },
{ default: 0 }
]
},
simpleTypes: {
enum: [
"array",
"boolean",
"integer",
"null",
"number",
"object",
"string"
]
},
stringArray: {
type: "array",
items: { type: "string" },
uniqueItems: true,
default: []
}
},
type: ["object", "boolean"],
properties: {
$id: {
type: "string",
format: "uri-reference"
},
$schema: {
type: "string",
format: "uri"
},
$ref: {
type: "string",
format: "uri-reference"
},
$comment: {
type: "string"
},
title: {
type: "string"
},
description: {
type: "string"
},
default: true,
readOnly: {
type: "boolean",
default: false
},
examples: {
type: "array",
items: true
},
multipleOf: {
type: "number",
exclusiveMinimum: 0
},
maximum: {
type: "number"
},
exclusiveMaximum: {
type: "number"
},
minimum: {
type: "number"
},
exclusiveMinimum: {
type: "number"
},
maxLength: { $ref: "#/definitions/nonNegativeInteger" },
minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
pattern: {
type: "string",
format: "regex"
},
additionalItems: { $ref: "#" },
items: {
anyOf: [
{ $ref: "#" },
{ $ref: "#/definitions/schemaArray" }
],
default: true
},
maxItems: { $ref: "#/definitions/nonNegativeInteger" },
minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
uniqueItems: {
type: "boolean",
default: false
},
contains: { $ref: "#" },
maxProperties: { $ref: "#/definitions/nonNegativeInteger" },
minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
required: { $ref: "#/definitions/stringArray" },
additionalProperties: { $ref: "#" },
definitions: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
properties: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
patternProperties: {
type: "object",
additionalProperties: { $ref: "#" },
propertyNames: { format: "regex" },
default: {}
},
dependencies: {
type: "object",
additionalProperties: {
anyOf: [
{ $ref: "#" },
{ $ref: "#/definitions/stringArray" }
]
}
},
propertyNames: { $ref: "#" },
const: true,
enum: {
type: "array",
items: true,
minItems: 1,
uniqueItems: true
},
type: {
anyOf: [
{ $ref: "#/definitions/simpleTypes" },
{
type: "array",
items: { $ref: "#/definitions/simpleTypes" },
minItems: 1,
uniqueItems: true
}
]
},
format: { type: "string" },
contentMediaType: { type: "string" },
contentEncoding: { type: "string" },
if: { $ref: "#" },
then: { $ref: "#" },
else: { $ref: "#" },
allOf: { $ref: "#/definitions/schemaArray" },
anyOf: { $ref: "#/definitions/schemaArray" },
oneOf: { $ref: "#/definitions/schemaArray" },
not: { $ref: "#" }
},
default: true
};
}
});
// node_modules/ajv/lib/definition_schema.js
var require_definition_schema = __commonJS({
"node_modules/ajv/lib/definition_schema.js"(exports, module2) {
"use strict";
var metaSchema = require_json_schema_draft_07();
module2.exports = {
$id: "https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js",
definitions: {
simpleTypes: metaSchema.definitions.simpleTypes
},
type: "object",
dependencies: {
schema: ["validate"],
$data: ["validate"],
statements: ["inline"],
valid: { not: { required: ["macro"] } }
},
properties: {
type: metaSchema.properties.type,
schema: { type: "boolean" },
statements: { type: "boolean" },
dependencies: {
type: "array",
items: { type: "string" }
},
metaSchema: { type: "object" },
modifying: { type: "boolean" },
valid: { type: "boolean" },
$data: { type: "boolean" },
async: { type: "boolean" },
errors: {
anyOf: [
{ type: "boolean" },
{ const: "full" }
]
}
}
};
}
});
// node_modules/ajv/lib/keyword.js
var require_keyword = __commonJS({
"node_modules/ajv/lib/keyword.js"(exports, module2) {
"use strict";
var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;
var customRuleCode = require_custom();
var definitionSchema = require_definition_schema();
module2.exports = {
add: addKeyword,
get: getKeyword,
remove: removeKeyword,
validate: validateKeyword
};
function addKeyword(keyword, definition) {
var RULES = this.RULES;
if (RULES.keywords[keyword])
throw new Error("Keyword " + keyword + " is already defined");
if (!IDENTIFIER.test(keyword))
throw new Error("Keyword " + keyword + " is not a valid identifier");
if (definition) {
this.validateKeyword(definition, true);
var dataType = definition.type;
if (Array.isArray(dataType)) {
for (var i = 0; i < dataType.length; i++)
_addRule(keyword, dataType[i], definition);
} else {
_addRule(keyword, dataType, definition);
}
var metaSchema = definition.metaSchema;
if (metaSchema) {
if (definition.$data && this._opts.$data) {
metaSchema = {
anyOf: [
metaSchema,
{ "$ref": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" }
]
};
}
definition.validateSchema = this.compile(metaSchema, true);
}
}
RULES.keywords[keyword] = RULES.all[keyword] = true;
function _addRule(keyword2, dataType2, definition2) {
var ruleGroup;
for (var i2 = 0; i2 < RULES.length; i2++) {
var rg = RULES[i2];
if (rg.type == dataType2) {
ruleGroup = rg;
break;
}
}
if (!ruleGroup) {
ruleGroup = { type: dataType2, rules: [] };
RULES.push(ruleGroup);
}
var rule = {
keyword: keyword2,
definition: definition2,
custom: true,
code: customRuleCode,
implements: definition2.implements
};
ruleGroup.rules.push(rule);
RULES.custom[keyword2] = rule;
}
return this;
}
function getKeyword(keyword) {
var rule = this.RULES.custom[keyword];
return rule ? rule.definition : this.RULES.keywords[keyword] || false;
}
function removeKeyword(keyword) {
var RULES = this.RULES;
delete RULES.keywords[keyword];
delete RULES.all[keyword];
delete RULES.custom[keyword];
for (var i = 0; i < RULES.length; i++) {
var rules = RULES[i].rules;
for (var j = 0; j < rules.length; j++) {
if (rules[j].keyword == keyword) {
rules.splice(j, 1);
break;
}
}
}
return this;
}
function validateKeyword(definition, throwError) {
validateKeyword.errors = null;
var v = this._validateKeyword = this._validateKeyword || this.compile(definitionSchema, true);
if (v(definition))
return true;
validateKeyword.errors = v.errors;
if (throwError)
throw new Error("custom keyword definition is invalid: " + this.errorsText(v.errors));
else
return false;
}
}
});
// node_modules/ajv/lib/refs/data.json
var require_data2 = __commonJS({
"node_modules/ajv/lib/refs/data.json"(exports, module2) {
module2.exports = {
$schema: "http://json-schema.org/draft-07/schema#",
$id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
description: "Meta-schema for $data reference (JSON Schema extension proposal)",
type: "object",
required: ["$data"],
properties: {
$data: {
type: "string",
anyOf: [
{ format: "relative-json-pointer" },
{ format: "json-pointer" }
]
}
},
additionalProperties: false
};
}
});
// node_modules/ajv/lib/ajv.js
var require_ajv = __commonJS({
"node_modules/ajv/lib/ajv.js"(exports, module2) {
"use strict";
var compileSchema = require_compile();
var resolve = require_resolve();
var Cache = require_cache();
var SchemaObject = require_schema_obj();
var stableStringify = require_fast_json_stable_stringify();
var formats = require_formats2();
var rules = require_rules2();
var $dataMetaSchema = require_data();
var util = require_util3();
module2.exports = Ajv;
Ajv.prototype.validate = validate;
Ajv.prototype.compile = compile;
Ajv.prototype.addSchema = addSchema;
Ajv.prototype.addMetaSchema = addMetaSchema;
Ajv.prototype.validateSchema = validateSchema;
Ajv.prototype.getSchema = getSchema;
Ajv.prototype.removeSchema = removeSchema;
Ajv.prototype.addFormat = addFormat;
Ajv.prototype.errorsText = errorsText;
Ajv.prototype._addSchema = _addSchema;
Ajv.prototype._compile = _compile;
Ajv.prototype.compileAsync = require_async();
var customKeyword = require_keyword();
Ajv.prototype.addKeyword = customKeyword.add;
Ajv.prototype.getKeyword = customKeyword.get;
Ajv.prototype.removeKeyword = customKeyword.remove;
Ajv.prototype.validateKeyword = customKeyword.validate;
var errorClasses = require_error_classes();
Ajv.ValidationError = errorClasses.Validation;
Ajv.MissingRefError = errorClasses.MissingRef;
Ajv.$dataMetaSchema = $dataMetaSchema;
var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema";
var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes", "strictDefaults"];
var META_SUPPORT_DATA = ["/properties"];
function Ajv(opts) {
if (!(this instanceof Ajv))
return new Ajv(opts);
opts = this._opts = util.copy(opts) || {};
setLogger(this);
this._schemas = {};
this._refs = {};
this._fragments = {};
this._formats = formats(opts.format);
this._cache = opts.cache || new Cache();
this._loadingSchemas = {};
this._compilations = [];
this.RULES = rules();
this._getId = chooseGetId(opts);
opts.loopRequired = opts.loopRequired || Infinity;
if (opts.errorDataPath == "property")
opts._errorDataPathProperty = true;
if (opts.serialize === void 0)
opts.serialize = stableStringify;
this._metaOpts = getMetaSchemaOptions(this);
if (opts.formats)
addInitialFormats(this);
if (opts.keywords)
addInitialKeywords(this);
addDefaultMetaSchema(this);
if (typeof opts.meta == "object")
this.addMetaSchema(opts.meta);
if (opts.nullable)
this.addKeyword("nullable", { metaSchema: { type: "boolean" } });
addInitialSchemas(this);
}
function validate(schemaKeyRef, data) {
var v;
if (typeof schemaKeyRef == "string") {
v = this.getSchema(schemaKeyRef);
if (!v)
throw new Error('no schema with key or ref "' + schemaKeyRef + '"');
} else {
var schemaObj = this._addSchema(schemaKeyRef);
v = schemaObj.validate || this._compile(schemaObj);
}
var valid = v(data);
if (v.$async !== true)
this.errors = v.errors;
return valid;
}
function compile(schema, _meta) {
var schemaObj = this._addSchema(schema, void 0, _meta);
return schemaObj.validate || this._compile(schemaObj);
}
function addSchema(schema, key, _skipValidation, _meta) {
if (Array.isArray(schema)) {
for (var i = 0; i < schema.length; i++)
this.addSchema(schema[i], void 0, _skipValidation, _meta);
return this;
}
var id = this._getId(schema);
if (id !== void 0 && typeof id != "string")
throw new Error("schema id must be string");
key = resolve.normalizeId(key || id);
checkUnique(this, key);
this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);
return this;
}
function addMetaSchema(schema, key, skipValidation) {
this.addSchema(schema, key, skipValidation, true);
return this;
}
function validateSchema(schema, throwOrLogError) {
var $schema = schema.$schema;
if ($schema !== void 0 && typeof $schema != "string")
throw new Error("$schema must be a string");
$schema = $schema || this._opts.defaultMeta || defaultMeta(this);
if (!$schema) {
this.logger.warn("meta-schema not available");
this.errors = null;
return true;
}
var valid = this.validate($schema, schema);
if (!valid && throwOrLogError) {
var message = "schema is invalid: " + this.errorsText();
if (this._opts.validateSchema == "log")
this.logger.error(message);
else
throw new Error(message);
}
return valid;
}
function defaultMeta(self2) {
var meta = self2._opts.meta;
self2._opts.defaultMeta = typeof meta == "object" ? self2._getId(meta) || meta : self2.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0;
return self2._opts.defaultMeta;
}
function getSchema(keyRef) {
var schemaObj = _getSchemaObj(this, keyRef);
switch (typeof schemaObj) {
case "object":
return schemaObj.validate || this._compile(schemaObj);
case "string":
return this.getSchema(schemaObj);
case "undefined":
return _getSchemaFragment(this, keyRef);
}
}
function _getSchemaFragment(self2, ref) {
var res = resolve.schema.call(self2, { schema: {} }, ref);
if (res) {
var schema = res.schema, root = res.root, baseId = res.baseId;
var v = compileSchema.call(self2, schema, root, void 0, baseId);
self2._fragments[ref] = new SchemaObject({
ref,
fragment: true,
schema,
root,
baseId,
validate: v
});
return v;
}
}
function _getSchemaObj(self2, keyRef) {
keyRef = resolve.normalizeId(keyRef);
return self2._schemas[keyRef] || self2._refs[keyRef] || self2._fragments[keyRef];
}
function removeSchema(schemaKeyRef) {
if (schemaKeyRef instanceof RegExp) {
_removeAllSchemas(this, this._schemas, schemaKeyRef);
_removeAllSchemas(this, this._refs, schemaKeyRef);
return this;
}
switch (typeof schemaKeyRef) {
case "undefined":
_removeAllSchemas(this, this._schemas);
_removeAllSchemas(this, this._refs);
this._cache.clear();
return this;
case "string":
var schemaObj = _getSchemaObj(this, schemaKeyRef);
if (schemaObj)
this._cache.del(schemaObj.cacheKey);
delete this._schemas[schemaKeyRef];
delete this._refs[schemaKeyRef];
return this;
case "object":
var serialize = this._opts.serialize;
var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;
this._cache.del(cacheKey);
var id = this._getId(schemaKeyRef);
if (id) {
id = resolve.normalizeId(id);
delete this._schemas[id];
delete this._refs[id];
}
}
return this;
}
function _removeAllSchemas(self2, schemas, regex) {
for (var keyRef in schemas) {
var schemaObj = schemas[keyRef];
if (!schemaObj.meta && (!regex || regex.test(keyRef))) {
self2._cache.del(schemaObj.cacheKey);
delete schemas[keyRef];
}
}
}
function _addSchema(schema, skipValidation, meta, shouldAddSchema) {
if (typeof schema != "object" && typeof schema != "boolean")
throw new Error("schema should be object or boolean");
var serialize = this._opts.serialize;
var cacheKey = serialize ? serialize(schema) : schema;
var cached = this._cache.get(cacheKey);
if (cached)
return cached;
shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;
var id = resolve.normalizeId(this._getId(schema));
if (id && shouldAddSchema)
checkUnique(this, id);
var willValidate = this._opts.validateSchema !== false && !skipValidation;
var recursiveMeta;
if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))
this.validateSchema(schema, true);
var localRefs = resolve.ids.call(this, schema);
var schemaObj = new SchemaObject({
id,
schema,
localRefs,
cacheKey,
meta
});
if (id[0] != "#" && shouldAddSchema)
this._refs[id] = schemaObj;
this._cache.put(cacheKey, schemaObj);
if (willValidate && recursiveMeta)
this.validateSchema(schema, true);
return schemaObj;
}
function _compile(schemaObj, root) {
if (schemaObj.compiling) {
schemaObj.validate = callValidate;
callValidate.schema = schemaObj.schema;
callValidate.errors = null;
callValidate.root = root ? root : callValidate;
if (schemaObj.schema.$async === true)
callValidate.$async = true;
return callValidate;
}
schemaObj.compiling = true;
var currentOpts;
if (schemaObj.meta) {
currentOpts = this._opts;
this._opts = this._metaOpts;
}
var v;
try {
v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs);
} catch (e) {
delete schemaObj.validate;
throw e;
} finally {
schemaObj.compiling = false;
if (schemaObj.meta)
this._opts = currentOpts;
}
schemaObj.validate = v;
schemaObj.refs = v.refs;
schemaObj.refVal = v.refVal;
schemaObj.root = v.root;
return v;
function callValidate() {
var _validate = schemaObj.validate;
var result = _validate.apply(this, arguments);
callValidate.errors = _validate.errors;
return result;
}
}
function chooseGetId(opts) {
switch (opts.schemaId) {
case "auto":
return _get$IdOrId;
case "id":
return _getId;
default:
return _get$Id;
}
}
function _getId(schema) {
if (schema.$id)
this.logger.warn("schema $id ignored", schema.$id);
return schema.id;
}
function _get$Id(schema) {
if (schema.id)
this.logger.warn("schema id ignored", schema.id);
return schema.$id;
}
function _get$IdOrId(schema) {
if (schema.$id && schema.id && schema.$id != schema.id)
throw new Error("schema $id is different from id");
return schema.$id || schema.id;
}
function errorsText(errors, options) {
errors = errors || this.errors;
if (!errors)
return "No errors";
options = options || {};
var separator = options.separator === void 0 ? ", " : options.separator;
var dataVar = options.dataVar === void 0 ? "data" : options.dataVar;
var text = "";
for (var i = 0; i < errors.length; i++) {
var e = errors[i];
if (e)
text += dataVar + e.dataPath + " " + e.message + separator;
}
return text.slice(0, -separator.length);
}
function addFormat(name, format) {
if (typeof format == "string")
format = new RegExp(format);
this._formats[name] = format;
return this;
}
function addDefaultMetaSchema(self2) {
var $dataSchema;
if (self2._opts.$data) {
$dataSchema = require_data2();
self2.addMetaSchema($dataSchema, $dataSchema.$id, true);
}
if (self2._opts.meta === false)
return;
var metaSchema = require_json_schema_draft_07();
if (self2._opts.$data)
metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);
self2.addMetaSchema(metaSchema, META_SCHEMA_ID, true);
self2._refs["http://json-schema.org/schema"] = META_SCHEMA_ID;
}
function addInitialSchemas(self2) {
var optsSchemas = self2._opts.schemas;
if (!optsSchemas)
return;
if (Array.isArray(optsSchemas))
self2.addSchema(optsSchemas);
else
for (var key in optsSchemas)
self2.addSchema(optsSchemas[key], key);
}
function addInitialFormats(self2) {
for (var name in self2._opts.formats) {
var format = self2._opts.formats[name];
self2.addFormat(name, format);
}
}
function addInitialKeywords(self2) {
for (var name in self2._opts.keywords) {
var keyword = self2._opts.keywords[name];
self2.addKeyword(name, keyword);
}
}
function checkUnique(self2, id) {
if (self2._schemas[id] || self2._refs[id])
throw new Error('schema with key or id "' + id + '" already exists');
}
function getMetaSchemaOptions(self2) {
var metaOpts = util.copy(self2._opts);
for (var i = 0; i < META_IGNORE_OPTIONS.length; i++)
delete metaOpts[META_IGNORE_OPTIONS[i]];
return metaOpts;
}
function setLogger(self2) {
var logger = self2._opts.logger;
if (logger === false) {
self2.logger = { log: noop, warn: noop, error: noop };
} else {
if (logger === void 0)
logger = console;
if (!(typeof logger == "object" && logger.log && logger.warn && logger.error))
throw new Error("logger must implement log, warn and error methods");
self2.logger = logger;
}
}
function noop() {
}
}
});
// node_modules/har-validator/lib/error.js
var require_error = __commonJS({
"node_modules/har-validator/lib/error.js"(exports, module2) {
function HARError(errors) {
var message = "validation failed";
this.name = "HARError";
this.message = message;
this.errors = errors;
if (typeof Error.captureStackTrace === "function") {
Error.captureStackTrace(this, this.constructor);
} else {
this.stack = new Error(message).stack;
}
}
HARError.prototype = Error.prototype;
module2.exports = HARError;
}
});
// node_modules/har-schema/lib/afterRequest.json
var require_afterRequest = __commonJS({
"node_modules/har-schema/lib/afterRequest.json"(exports, module2) {
module2.exports = {
$id: "afterRequest.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
optional: true,
required: [
"lastAccess",
"eTag",
"hitCount"
],
properties: {
expires: {
type: "string",
pattern: "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
},
lastAccess: {
type: "string",
pattern: "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
},
eTag: {
type: "string"
},
hitCount: {
type: "integer"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/beforeRequest.json
var require_beforeRequest = __commonJS({
"node_modules/har-schema/lib/beforeRequest.json"(exports, module2) {
module2.exports = {
$id: "beforeRequest.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
optional: true,
required: [
"lastAccess",
"eTag",
"hitCount"
],
properties: {
expires: {
type: "string",
pattern: "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
},
lastAccess: {
type: "string",
pattern: "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))?"
},
eTag: {
type: "string"
},
hitCount: {
type: "integer"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/browser.json
var require_browser2 = __commonJS({
"node_modules/har-schema/lib/browser.json"(exports, module2) {
module2.exports = {
$id: "browser.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"name",
"version"
],
properties: {
name: {
type: "string"
},
version: {
type: "string"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/cache.json
var require_cache2 = __commonJS({
"node_modules/har-schema/lib/cache.json"(exports, module2) {
module2.exports = {
$id: "cache.json#",
$schema: "http://json-schema.org/draft-06/schema#",
properties: {
beforeRequest: {
oneOf: [
{ type: "null" },
{ $ref: "beforeRequest.json#" }
]
},
afterRequest: {
oneOf: [
{ type: "null" },
{ $ref: "afterRequest.json#" }
]
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/content.json
var require_content = __commonJS({
"node_modules/har-schema/lib/content.json"(exports, module2) {
module2.exports = {
$id: "content.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"size",
"mimeType"
],
properties: {
size: {
type: "integer"
},
compression: {
type: "integer"
},
mimeType: {
type: "string"
},
text: {
type: "string"
},
encoding: {
type: "string"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/cookie.json
var require_cookie2 = __commonJS({
"node_modules/har-schema/lib/cookie.json"(exports, module2) {
module2.exports = {
$id: "cookie.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"name",
"value"
],
properties: {
name: {
type: "string"
},
value: {
type: "string"
},
path: {
type: "string"
},
domain: {
type: "string"
},
expires: {
type: ["string", "null"],
format: "date-time"
},
httpOnly: {
type: "boolean"
},
secure: {
type: "boolean"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/creator.json
var require_creator = __commonJS({
"node_modules/har-schema/lib/creator.json"(exports, module2) {
module2.exports = {
$id: "creator.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"name",
"version"
],
properties: {
name: {
type: "string"
},
version: {
type: "string"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/entry.json
var require_entry = __commonJS({
"node_modules/har-schema/lib/entry.json"(exports, module2) {
module2.exports = {
$id: "entry.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
optional: true,
required: [
"startedDateTime",
"time",
"request",
"response",
"cache",
"timings"
],
properties: {
pageref: {
type: "string"
},
startedDateTime: {
type: "string",
format: "date-time",
pattern: "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"
},
time: {
type: "number",
min: 0
},
request: {
$ref: "request.json#"
},
response: {
$ref: "response.json#"
},
cache: {
$ref: "cache.json#"
},
timings: {
$ref: "timings.json#"
},
serverIPAddress: {
type: "string",
oneOf: [
{ format: "ipv4" },
{ format: "ipv6" }
]
},
connection: {
type: "string"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/har.json
var require_har = __commonJS({
"node_modules/har-schema/lib/har.json"(exports, module2) {
module2.exports = {
$id: "har.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"log"
],
properties: {
log: {
$ref: "log.json#"
}
}
};
}
});
// node_modules/har-schema/lib/header.json
var require_header = __commonJS({
"node_modules/har-schema/lib/header.json"(exports, module2) {
module2.exports = {
$id: "header.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"name",
"value"
],
properties: {
name: {
type: "string"
},
value: {
type: "string"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/log.json
var require_log = __commonJS({
"node_modules/har-schema/lib/log.json"(exports, module2) {
module2.exports = {
$id: "log.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"version",
"creator",
"entries"
],
properties: {
version: {
type: "string"
},
creator: {
$ref: "creator.json#"
},
browser: {
$ref: "browser.json#"
},
pages: {
type: "array",
items: {
$ref: "page.json#"
}
},
entries: {
type: "array",
items: {
$ref: "entry.json#"
}
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/page.json
var require_page = __commonJS({
"node_modules/har-schema/lib/page.json"(exports, module2) {
module2.exports = {
$id: "page.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
optional: true,
required: [
"startedDateTime",
"id",
"title",
"pageTimings"
],
properties: {
startedDateTime: {
type: "string",
format: "date-time",
pattern: "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"
},
id: {
type: "string",
unique: true
},
title: {
type: "string"
},
pageTimings: {
$ref: "pageTimings.json#"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/pageTimings.json
var require_pageTimings = __commonJS({
"node_modules/har-schema/lib/pageTimings.json"(exports, module2) {
module2.exports = {
$id: "pageTimings.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
properties: {
onContentLoad: {
type: "number",
min: -1
},
onLoad: {
type: "number",
min: -1
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/postData.json
var require_postData = __commonJS({
"node_modules/har-schema/lib/postData.json"(exports, module2) {
module2.exports = {
$id: "postData.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
optional: true,
required: [
"mimeType"
],
properties: {
mimeType: {
type: "string"
},
text: {
type: "string"
},
params: {
type: "array",
required: [
"name"
],
properties: {
name: {
type: "string"
},
value: {
type: "string"
},
fileName: {
type: "string"
},
contentType: {
type: "string"
},
comment: {
type: "string"
}
}
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/query.json
var require_query = __commonJS({
"node_modules/har-schema/lib/query.json"(exports, module2) {
module2.exports = {
$id: "query.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"name",
"value"
],
properties: {
name: {
type: "string"
},
value: {
type: "string"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/request.json
var require_request = __commonJS({
"node_modules/har-schema/lib/request.json"(exports, module2) {
module2.exports = {
$id: "request.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"method",
"url",
"httpVersion",
"cookies",
"headers",
"queryString",
"headersSize",
"bodySize"
],
properties: {
method: {
type: "string"
},
url: {
type: "string",
format: "uri"
},
httpVersion: {
type: "string"
},
cookies: {
type: "array",
items: {
$ref: "cookie.json#"
}
},
headers: {
type: "array",
items: {
$ref: "header.json#"
}
},
queryString: {
type: "array",
items: {
$ref: "query.json#"
}
},
postData: {
$ref: "postData.json#"
},
headersSize: {
type: "integer"
},
bodySize: {
type: "integer"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/response.json
var require_response = __commonJS({
"node_modules/har-schema/lib/response.json"(exports, module2) {
module2.exports = {
$id: "response.json#",
$schema: "http://json-schema.org/draft-06/schema#",
type: "object",
required: [
"status",
"statusText",
"httpVersion",
"cookies",
"headers",
"content",
"redirectURL",
"headersSize",
"bodySize"
],
properties: {
status: {
type: "integer"
},
statusText: {
type: "string"
},
httpVersion: {
type: "string"
},
cookies: {
type: "array",
items: {
$ref: "cookie.json#"
}
},
headers: {
type: "array",
items: {
$ref: "header.json#"
}
},
content: {
$ref: "content.json#"
},
redirectURL: {
type: "string"
},
headersSize: {
type: "integer"
},
bodySize: {
type: "integer"
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/timings.json
var require_timings = __commonJS({
"node_modules/har-schema/lib/timings.json"(exports, module2) {
module2.exports = {
$id: "timings.json#",
$schema: "http://json-schema.org/draft-06/schema#",
required: [
"send",
"wait",
"receive"
],
properties: {
dns: {
type: "number",
min: -1
},
connect: {
type: "number",
min: -1
},
blocked: {
type: "number",
min: -1
},
send: {
type: "number",
min: -1
},
wait: {
type: "number",
min: -1
},
receive: {
type: "number",
min: -1
},
ssl: {
type: "number",
min: -1
},
comment: {
type: "string"
}
}
};
}
});
// node_modules/har-schema/lib/index.js
var require_lib5 = __commonJS({
"node_modules/har-schema/lib/index.js"(exports, module2) {
"use strict";
module2.exports = {
afterRequest: require_afterRequest(),
beforeRequest: require_beforeRequest(),
browser: require_browser2(),
cache: require_cache2(),
content: require_content(),
cookie: require_cookie2(),
creator: require_creator(),
entry: require_entry(),
har: require_har(),
header: require_header(),
log: require_log(),
page: require_page(),
pageTimings: require_pageTimings(),
postData: require_postData(),
query: require_query(),
request: require_request(),
response: require_response(),
timings: require_timings()
};
}
});
// node_modules/ajv/lib/refs/json-schema-draft-06.json
var require_json_schema_draft_06 = __commonJS({
"node_modules/ajv/lib/refs/json-schema-draft-06.json"(exports, module2) {
module2.exports = {
$schema: "http://json-schema.org/draft-06/schema#",
$id: "http://json-schema.org/draft-06/schema#",
title: "Core schema meta-schema",
definitions: {
schemaArray: {
type: "array",
minItems: 1,
items: { $ref: "#" }
},
nonNegativeInteger: {
type: "integer",
minimum: 0
},
nonNegativeIntegerDefault0: {
allOf: [
{ $ref: "#/definitions/nonNegativeInteger" },
{ default: 0 }
]
},
simpleTypes: {
enum: [
"array",
"boolean",
"integer",
"null",
"number",
"object",
"string"
]
},
stringArray: {
type: "array",
items: { type: "string" },
uniqueItems: true,
default: []
}
},
type: ["object", "boolean"],
properties: {
$id: {
type: "string",
format: "uri-reference"
},
$schema: {
type: "string",
format: "uri"
},
$ref: {
type: "string",
format: "uri-reference"
},
title: {
type: "string"
},
description: {
type: "string"
},
default: {},
examples: {
type: "array",
items: {}
},
multipleOf: {
type: "number",
exclusiveMinimum: 0
},
maximum: {
type: "number"
},
exclusiveMaximum: {
type: "number"
},
minimum: {
type: "number"
},
exclusiveMinimum: {
type: "number"
},
maxLength: { $ref: "#/definitions/nonNegativeInteger" },
minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
pattern: {
type: "string",
format: "regex"
},
additionalItems: { $ref: "#" },
items: {
anyOf: [
{ $ref: "#" },
{ $ref: "#/definitions/schemaArray" }
],
default: {}
},
maxItems: { $ref: "#/definitions/nonNegativeInteger" },
minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
uniqueItems: {
type: "boolean",
default: false
},
contains: { $ref: "#" },
maxProperties: { $ref: "#/definitions/nonNegativeInteger" },
minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" },
required: { $ref: "#/definitions/stringArray" },
additionalProperties: { $ref: "#" },
definitions: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
properties: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
patternProperties: {
type: "object",
additionalProperties: { $ref: "#" },
default: {}
},
dependencies: {
type: "object",
additionalProperties: {
anyOf: [
{ $ref: "#" },
{ $ref: "#/definitions/stringArray" }
]
}
},
propertyNames: { $ref: "#" },
const: {},
enum: {
type: "array",
minItems: 1,
uniqueItems: true
},
type: {
anyOf: [
{ $ref: "#/definitions/simpleTypes" },
{
type: "array",
items: { $ref: "#/definitions/simpleTypes" },
minItems: 1,
uniqueItems: true
}
]
},
format: { type: "string" },
allOf: { $ref: "#/definitions/schemaArray" },
anyOf: { $ref: "#/definitions/schemaArray" },
oneOf: { $ref: "#/definitions/schemaArray" },
not: { $ref: "#" }
},
default: {}
};
}
});
// node_modules/har-validator/lib/promise.js
var require_promise = __commonJS({
"node_modules/har-validator/lib/promise.js"(exports) {
var Ajv = require_ajv();
var HARError = require_error();
var schemas = require_lib5();
var ajv;
function createAjvInstance() {
var ajv2 = new Ajv({
allErrors: true
});
ajv2.addMetaSchema(require_json_schema_draft_06());
ajv2.addSchema(schemas);
return ajv2;
}
function validate(name, data) {
data = data || {};
ajv = ajv || createAjvInstance();
var validate2 = ajv.getSchema(name + ".json");
return new Promise(function(resolve, reject) {
var valid = validate2(data);
!valid ? reject(new HARError(validate2.errors)) : resolve(data);
});
}
exports.afterRequest = function(data) {
return validate("afterRequest", data);
};
exports.beforeRequest = function(data) {
return validate("beforeRequest", data);
};
exports.browser = function(data) {
return validate("browser", data);
};
exports.cache = function(data) {
return validate("cache", data);
};
exports.content = function(data) {
return validate("content", data);
};
exports.cookie = function(data) {
return validate("cookie", data);
};
exports.creator = function(data) {
return validate("creator", data);
};
exports.entry = function(data) {
return validate("entry", data);
};
exports.har = function(data) {
return validate("har", data);
};
exports.header = function(data) {
return validate("header", data);
};
exports.log = function(data) {
return validate("log", data);
};
exports.page = function(data) {
return validate("page", data);
};
exports.pageTimings = function(data) {
return validate("pageTimings", data);
};
exports.postData = function(data) {
return validate("postData", data);
};
exports.query = function(data) {
return validate("query", data);
};
exports.request = function(data) {
return validate("request", data);
};
exports.response = function(data) {
return validate("response", data);
};
exports.timings = function(data) {
return validate("timings", data);
};
}
});
// node_modules/request/lib/har.js
var require_har2 = __commonJS({
"node_modules/request/lib/har.js"(exports) {
"use strict";
var fs4 = require("fs");
var qs = require("querystring");
var validate = require_promise();
var extend = require_extend();
function Har(request2) {
this.request = request2;
}
Har.prototype.reducer = function(obj, pair) {
if (obj[pair.name] === void 0) {
obj[pair.name] = pair.value;
return obj;
}
var arr = [
obj[pair.name],
pair.value
];
obj[pair.name] = arr;
return obj;
};
Har.prototype.prep = function(data) {
data.queryObj = {};
data.headersObj = {};
data.postData.jsonObj = false;
data.postData.paramsObj = false;
if (data.queryString && data.queryString.length) {
data.queryObj = data.queryString.reduce(this.reducer, {});
}
if (data.headers && data.headers.length) {
data.headersObj = data.headers.reduceRight(function(headers, header) {
headers[header.name] = header.value;
return headers;
}, {});
}
if (data.cookies && data.cookies.length) {
var cookies = data.cookies.map(function(cookie) {
return cookie.name + "=" + cookie.value;
});
if (cookies.length) {
data.headersObj.cookie = cookies.join("; ");
}
}
function some(arr) {
return arr.some(function(type) {
return data.postData.mimeType.indexOf(type) === 0;
});
}
if (some([
"multipart/mixed",
"multipart/related",
"multipart/form-data",
"multipart/alternative"
])) {
data.postData.mimeType = "multipart/form-data";
} else if (some([
"application/x-www-form-urlencoded"
])) {
if (!data.postData.params) {
data.postData.text = "";
} else {
data.postData.paramsObj = data.postData.params.reduce(this.reducer, {});
data.postData.text = qs.stringify(data.postData.paramsObj);
}
} else if (some([
"text/json",
"text/x-json",
"application/json",
"application/x-json"
])) {
data.postData.mimeType = "application/json";
if (data.postData.text) {
try {
data.postData.jsonObj = JSON.parse(data.postData.text);
} catch (e) {
this.request.debug(e);
data.postData.mimeType = "text/plain";
}
}
}
return data;
};
Har.prototype.options = function(options) {
if (!options.har) {
return options;
}
var har = {};
extend(har, options.har);
if (har.log && har.log.entries) {
har = har.log.entries[0];
}
har.url = har.url || options.url || options.uri || options.baseUrl || "/";
har.httpVersion = har.httpVersion || "HTTP/1.1";
har.queryString = har.queryString || [];
har.headers = har.headers || [];
har.cookies = har.cookies || [];
har.postData = har.postData || {};
har.postData.mimeType = har.postData.mimeType || "application/octet-stream";
har.bodySize = 0;
har.headersSize = 0;
har.postData.size = 0;
if (!validate.request(har)) {
return options;
}
var req = this.prep(har);
if (req.url) {
options.url = req.url;
}
if (req.method) {
options.method = req.method;
}
if (Object.keys(req.queryObj).length) {
options.qs = req.queryObj;
}
if (Object.keys(req.headersObj).length) {
options.headers = req.headersObj;
}
function test(type) {
return req.postData.mimeType.indexOf(type) === 0;
}
if (test("application/x-www-form-urlencoded")) {
options.form = req.postData.paramsObj;
} else if (test("application/json")) {
if (req.postData.jsonObj) {
options.body = req.postData.jsonObj;
options.json = true;
}
} else if (test("multipart/form-data")) {
options.formData = {};
req.postData.params.forEach(function(param) {
var attachment = {};
if (!param.fileName && !param.contentType) {
options.formData[param.name] = param.value;
return;
}
if (param.fileName && !param.value) {
attachment.value = fs4.createReadStream(param.fileName);
} else if (param.value) {
attachment.value = param.value;
}
if (param.fileName) {
attachment.options = {
filename: param.fileName,
contentType: param.contentType ? param.contentType : null
};
}
options.formData[param.name] = attachment;
});
} else {
if (req.postData.text) {
options.body = req.postData.text;
}
}
return options;
};
exports.Har = Har;
}
});
// node_modules/uuid/lib/rng-browser.js
var require_rng_browser = __commonJS({
"node_modules/uuid/lib/rng-browser.js"(exports, module2) {
var getRandomValues = typeof crypto != "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto != "undefined" && typeof window.msCrypto.getRandomValues == "function" && msCrypto.getRandomValues.bind(msCrypto);
if (getRandomValues) {
rnds8 = new Uint8Array(16);
module2.exports = function whatwgRNG() {
getRandomValues(rnds8);
return rnds8;
};
} else {
rnds = new Array(16);
module2.exports = function mathRNG() {
for (var i = 0, r; i < 16; i++) {
if ((i & 3) === 0)
r = Math.random() * 4294967296;
rnds[i] = r >>> ((i & 3) << 3) & 255;
}
return rnds;
};
}
var rnds8;
var rnds;
}
});
// node_modules/uuid/lib/bytesToUuid.js
var require_bytesToUuid = __commonJS({
"node_modules/uuid/lib/bytesToUuid.js"(exports, module2) {
var byteToHex = [];
for (i = 0; i < 256; ++i) {
byteToHex[i] = (i + 256).toString(16).substr(1);
}
var i;
function bytesToUuid(buf, offset) {
var i2 = offset || 0;
var bth = byteToHex;
return [
bth[buf[i2++]],
bth[buf[i2++]],
bth[buf[i2++]],
bth[buf[i2++]],
"-",
bth[buf[i2++]],
bth[buf[i2++]],
"-",
bth[buf[i2++]],
bth[buf[i2++]],
"-",
bth[buf[i2++]],
bth[buf[i2++]],
"-",
bth[buf[i2++]],
bth[buf[i2++]],
bth[buf[i2++]],
bth[buf[i2++]],
bth[buf[i2++]],
bth[buf[i2++]]
].join("");
}
module2.exports = bytesToUuid;
}
});
// node_modules/uuid/v4.js
var require_v4 = __commonJS({
"node_modules/uuid/v4.js"(exports, module2) {
var rng = require_rng_browser();
var bytesToUuid = require_bytesToUuid();
function v4(options, buf, offset) {
var i = buf && offset || 0;
if (typeof options == "string") {
buf = options === "binary" ? new Array(16) : null;
options = null;
}
options = options || {};
var rnds = options.random || (options.rng || rng)();
rnds[6] = rnds[6] & 15 | 64;
rnds[8] = rnds[8] & 63 | 128;
if (buf) {
for (var ii = 0; ii < 16; ++ii) {
buf[i + ii] = rnds[ii];
}
}
return buf || bytesToUuid(rnds);
}
module2.exports = v4;
}
});
// node_modules/request/lib/auth.js
var require_auth = __commonJS({
"node_modules/request/lib/auth.js"(exports) {
"use strict";
var caseless = require_caseless();
var uuid = require_v4();
var helpers = require_helpers();
var md5 = helpers.md5;
var toBase64 = helpers.toBase64;
function Auth(request2) {
this.request = request2;
this.hasAuth = false;
this.sentAuth = false;
this.bearerToken = null;
this.user = null;
this.pass = null;
}
Auth.prototype.basic = function(user, pass, sendImmediately) {
var self2 = this;
if (typeof user !== "string" || pass !== void 0 && typeof pass !== "string") {
self2.request.emit("error", new Error("auth() received invalid user or password"));
}
self2.user = user;
self2.pass = pass;
self2.hasAuth = true;
var header = user + ":" + (pass || "");
if (sendImmediately || typeof sendImmediately === "undefined") {
var authHeader = "Basic " + toBase64(header);
self2.sentAuth = true;
return authHeader;
}
};
Auth.prototype.bearer = function(bearer, sendImmediately) {
var self2 = this;
self2.bearerToken = bearer;
self2.hasAuth = true;
if (sendImmediately || typeof sendImmediately === "undefined") {
if (typeof bearer === "function") {
bearer = bearer();
}
var authHeader = "Bearer " + (bearer || "");
self2.sentAuth = true;
return authHeader;
}
};
Auth.prototype.digest = function(method, path3, authHeader) {
var self2 = this;
var challenge = {};
var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi;
while (true) {
var match = re.exec(authHeader);
if (!match) {
break;
}
challenge[match[1]] = match[2] || match[3];
}
var ha1Compute = function(algorithm, user, realm, pass, nonce, cnonce2) {
var ha12 = md5(user + ":" + realm + ":" + pass);
if (algorithm && algorithm.toLowerCase() === "md5-sess") {
return md5(ha12 + ":" + nonce + ":" + cnonce2);
} else {
return ha12;
}
};
var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && "auth";
var nc = qop && "00000001";
var cnonce = qop && uuid().replace(/-/g, "");
var ha1 = ha1Compute(challenge.algorithm, self2.user, challenge.realm, self2.pass, challenge.nonce, cnonce);
var ha2 = md5(method + ":" + path3);
var digestResponse = qop ? md5(ha1 + ":" + challenge.nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + ha2) : md5(ha1 + ":" + challenge.nonce + ":" + ha2);
var authValues = {
username: self2.user,
realm: challenge.realm,
nonce: challenge.nonce,
uri: path3,
qop,
response: digestResponse,
nc,
cnonce,
algorithm: challenge.algorithm,
opaque: challenge.opaque
};
authHeader = [];
for (var k in authValues) {
if (authValues[k]) {
if (k === "qop" || k === "nc" || k === "algorithm") {
authHeader.push(k + "=" + authValues[k]);
} else {
authHeader.push(k + '="' + authValues[k] + '"');
}
}
}
authHeader = "Digest " + authHeader.join(", ");
self2.sentAuth = true;
return authHeader;
};
Auth.prototype.onRequest = function(user, pass, sendImmediately, bearer) {
var self2 = this;
var request2 = self2.request;
var authHeader;
if (bearer === void 0 && user === void 0) {
self2.request.emit("error", new Error("no auth mechanism defined"));
} else if (bearer !== void 0) {
authHeader = self2.bearer(bearer, sendImmediately);
} else {
authHeader = self2.basic(user, pass, sendImmediately);
}
if (authHeader) {
request2.setHeader("authorization", authHeader);
}
};
Auth.prototype.onResponse = function(response) {
var self2 = this;
var request2 = self2.request;
if (!self2.hasAuth || self2.sentAuth) {
return null;
}
var c = caseless(response.headers);
var authHeader = c.get("www-authenticate");
var authVerb = authHeader && authHeader.split(" ")[0].toLowerCase();
request2.debug("reauth", authVerb);
switch (authVerb) {
case "basic":
return self2.basic(self2.user, self2.pass, true);
case "bearer":
return self2.bearer(self2.bearerToken, true);
case "digest":
return self2.digest(request2.method, request2.path, authHeader);
}
};
exports.Auth = Auth;
}
});
// node_modules/oauth-sign/index.js
var require_oauth_sign = __commonJS({
"node_modules/oauth-sign/index.js"(exports) {
var crypto2 = require("crypto");
function sha(key, body, algorithm) {
return crypto2.createHmac(algorithm, key).update(body).digest("base64");
}
function rsa(key, body) {
return crypto2.createSign("RSA-SHA1").update(body).sign(key, "base64");
}
function rfc3986(str) {
return encodeURIComponent(str).replace(/!/g, "%21").replace(/\*/g, "%2A").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/'/g, "%27");
}
function map(obj) {
var key, val, arr = [];
for (key in obj) {
val = obj[key];
if (Array.isArray(val))
for (var i = 0; i < val.length; i++)
arr.push([key, val[i]]);
else if (typeof val === "object")
for (var prop in val)
arr.push([key + "[" + prop + "]", val[prop]]);
else
arr.push([key, val]);
}
return arr;
}
function compare(a, b) {
return a > b ? 1 : a < b ? -1 : 0;
}
function generateBase(httpMethod, base_uri, params) {
var normalized = map(params).map(function(p) {
return [rfc3986(p[0]), rfc3986(p[1] || "")];
}).sort(function(a, b) {
return compare(a[0], b[0]) || compare(a[1], b[1]);
}).map(function(p) {
return p.join("=");
}).join("&");
var base = [
rfc3986(httpMethod ? httpMethod.toUpperCase() : "GET"),
rfc3986(base_uri),
rfc3986(normalized)
].join("&");
return base;
}
function hmacsign(httpMethod, base_uri, params, consumer_secret, token_secret) {
var base = generateBase(httpMethod, base_uri, params);
var key = [
consumer_secret || "",
token_secret || ""
].map(rfc3986).join("&");
return sha(key, base, "sha1");
}
function hmacsign256(httpMethod, base_uri, params, consumer_secret, token_secret) {
var base = generateBase(httpMethod, base_uri, params);
var key = [
consumer_secret || "",
token_secret || ""
].map(rfc3986).join("&");
return sha(key, base, "sha256");
}
function rsasign(httpMethod, base_uri, params, private_key, token_secret) {
var base = generateBase(httpMethod, base_uri, params);
var key = private_key || "";
return rsa(key, base);
}
function plaintext(consumer_secret, token_secret) {
var key = [
consumer_secret || "",
token_secret || ""
].map(rfc3986).join("&");
return key;
}
function sign(signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) {
var method;
var skipArgs = 1;
switch (signMethod) {
case "RSA-SHA1":
method = rsasign;
break;
case "HMAC-SHA1":
method = hmacsign;
break;
case "HMAC-SHA256":
method = hmacsign256;
break;
case "PLAINTEXT":
method = plaintext;
skipArgs = 4;
break;
default:
throw new Error("Signature method not supported: " + signMethod);
}
return method.apply(null, [].slice.call(arguments, skipArgs));
}
exports.hmacsign = hmacsign;
exports.hmacsign256 = hmacsign256;
exports.rsasign = rsasign;
exports.plaintext = plaintext;
exports.sign = sign;
exports.rfc3986 = rfc3986;
exports.generateBase = generateBase;
}
});
// node_modules/request/lib/oauth.js
var require_oauth = __commonJS({
"node_modules/request/lib/oauth.js"(exports) {
"use strict";
var url = require("url");
var qs = require_lib4();
var caseless = require_caseless();
var uuid = require_v4();
var oauth = require_oauth_sign();
var crypto2 = require("crypto");
var Buffer2 = require_safe_buffer().Buffer;
function OAuth(request2) {
this.request = request2;
this.params = null;
}
OAuth.prototype.buildParams = function(_oauth, uri, method, query, form, qsLib) {
var oa = {};
for (var i in _oauth) {
oa["oauth_" + i] = _oauth[i];
}
if (!oa.oauth_version) {
oa.oauth_version = "1.0";
}
if (!oa.oauth_timestamp) {
oa.oauth_timestamp = Math.floor(Date.now() / 1e3).toString();
}
if (!oa.oauth_nonce) {
oa.oauth_nonce = uuid().replace(/-/g, "");
}
if (!oa.oauth_signature_method) {
oa.oauth_signature_method = "HMAC-SHA1";
}
var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key;
delete oa.oauth_consumer_secret;
delete oa.oauth_private_key;
var token_secret = oa.oauth_token_secret;
delete oa.oauth_token_secret;
var realm = oa.oauth_realm;
delete oa.oauth_realm;
delete oa.oauth_transport_method;
var baseurl = uri.protocol + "//" + uri.host + uri.pathname;
var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join("&"));
oa.oauth_signature = oauth.sign(oa.oauth_signature_method, method, baseurl, params, consumer_secret_or_private_key, token_secret);
if (realm) {
oa.realm = realm;
}
return oa;
};
OAuth.prototype.buildBodyHash = function(_oauth, body) {
if (["HMAC-SHA1", "RSA-SHA1"].indexOf(_oauth.signature_method || "HMAC-SHA1") < 0) {
this.request.emit("error", new Error("oauth: " + _oauth.signature_method + " signature_method not supported with body_hash signing."));
}
var shasum = crypto2.createHash("sha1");
shasum.update(body || "");
var sha1 = shasum.digest("hex");
return Buffer2.from(sha1, "hex").toString("base64");
};
OAuth.prototype.concatParams = function(oa, sep, wrap) {
wrap = wrap || "";
var params = Object.keys(oa).filter(function(i) {
return i !== "realm" && i !== "oauth_signature";
}).sort();
if (oa.realm) {
params.splice(0, 0, "realm");
}
params.push("oauth_signature");
return params.map(function(i) {
return i + "=" + wrap + oauth.rfc3986(oa[i]) + wrap;
}).join(sep);
};
OAuth.prototype.onRequest = function(_oauth) {
var self2 = this;
self2.params = _oauth;
var uri = self2.request.uri || {};
var method = self2.request.method || "";
var headers = caseless(self2.request.headers);
var body = self2.request.body || "";
var qsLib = self2.request.qsLib || qs;
var form;
var query;
var contentType = headers.get("content-type") || "";
var formContentType = "application/x-www-form-urlencoded";
var transport = _oauth.transport_method || "header";
if (contentType.slice(0, formContentType.length) === formContentType) {
contentType = formContentType;
form = body;
}
if (uri.query) {
query = uri.query;
}
if (transport === "body" && (method !== "POST" || contentType !== formContentType)) {
self2.request.emit("error", new Error("oauth: transport_method of body requires POST and content-type " + formContentType));
}
if (!form && typeof _oauth.body_hash === "boolean") {
_oauth.body_hash = self2.buildBodyHash(_oauth, self2.request.body.toString());
}
var oa = self2.buildParams(_oauth, uri, method, query, form, qsLib);
switch (transport) {
case "header":
self2.request.setHeader("Authorization", "OAuth " + self2.concatParams(oa, ",", '"'));
break;
case "query":
var href = self2.request.uri.href += (query ? "&" : "?") + self2.concatParams(oa, "&");
self2.request.uri = url.parse(href);
self2.request.path = self2.request.uri.path;
break;
case "body":
self2.request.body = (form ? form + "&" : "") + self2.concatParams(oa, "&");
break;
default:
self2.request.emit("error", new Error("oauth: transport_method invalid"));
}
};
exports.OAuth = OAuth;
}
});
// node_modules/request/lib/hawk.js
var require_hawk = __commonJS({
"node_modules/request/lib/hawk.js"(exports) {
"use strict";
var crypto2 = require("crypto");
function randomString(size) {
var bits = (size + 1) * 6;
var buffer = crypto2.randomBytes(Math.ceil(bits / 8));
var string = buffer.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
return string.slice(0, size);
}
function calculatePayloadHash(payload, algorithm, contentType) {
var hash = crypto2.createHash(algorithm);
hash.update("hawk.1.payload\n");
hash.update((contentType ? contentType.split(";")[0].trim().toLowerCase() : "") + "\n");
hash.update(payload || "");
hash.update("\n");
return hash.digest("base64");
}
exports.calculateMac = function(credentials, opts) {
var normalized = "hawk.1.header\n" + opts.ts + "\n" + opts.nonce + "\n" + (opts.method || "").toUpperCase() + "\n" + opts.resource + "\n" + opts.host.toLowerCase() + "\n" + opts.port + "\n" + (opts.hash || "") + "\n";
if (opts.ext) {
normalized = normalized + opts.ext.replace("\\", "\\\\").replace("\n", "\\n");
}
normalized = normalized + "\n";
if (opts.app) {
normalized = normalized + opts.app + "\n" + (opts.dlg || "") + "\n";
}
var hmac = crypto2.createHmac(credentials.algorithm, credentials.key).update(normalized);
var digest = hmac.digest("base64");
return digest;
};
exports.header = function(uri, method, opts) {
var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1e3);
var credentials = opts.credentials;
if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) {
return "";
}
if (["sha1", "sha256"].indexOf(credentials.algorithm) === -1) {
return "";
}
var artifacts = {
ts: timestamp,
nonce: opts.nonce || randomString(6),
method,
resource: uri.pathname + (uri.search || ""),
host: uri.hostname,
port: uri.port || (uri.protocol === "http:" ? 80 : 443),
hash: opts.hash,
ext: opts.ext,
app: opts.app,
dlg: opts.dlg
};
if (!artifacts.hash && (opts.payload || opts.payload === "")) {
artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType);
}
var mac = exports.calculateMac(credentials, artifacts);
var hasExt = artifacts.ext !== null && artifacts.ext !== void 0 && artifacts.ext !== "";
var header = 'Hawk id="' + credentials.id + '", ts="' + artifacts.ts + '", nonce="' + artifacts.nonce + (artifacts.hash ? '", hash="' + artifacts.hash : "") + (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, "\\\\").replace(/"/g, '\\"') : "") + '", mac="' + mac + '"';
if (artifacts.app) {
header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : "") + '"';
}
return header;
};
}
});
// node_modules/delayed-stream/lib/delayed_stream.js
var require_delayed_stream = __commonJS({
"node_modules/delayed-stream/lib/delayed_stream.js"(exports, module2) {
var Stream = require("stream").Stream;
var util = require("util");
module2.exports = DelayedStream;
function DelayedStream() {
this.source = null;
this.dataSize = 0;
this.maxDataSize = 1024 * 1024;
this.pauseStream = true;
this._maxDataSizeExceeded = false;
this._released = false;
this._bufferedEvents = [];
}
util.inherits(DelayedStream, Stream);
DelayedStream.create = function(source, options) {
var delayedStream = new this();
options = options || {};
for (var option in options) {
delayedStream[option] = options[option];
}
delayedStream.source = source;
var realEmit = source.emit;
source.emit = function() {
delayedStream._handleEmit(arguments);
return realEmit.apply(source, arguments);
};
source.on("error", function() {
});
if (delayedStream.pauseStream) {
source.pause();
}
return delayedStream;
};
Object.defineProperty(DelayedStream.prototype, "readable", {
configurable: true,
enumerable: true,
get: function() {
return this.source.readable;
}
});
DelayedStream.prototype.setEncoding = function() {
return this.source.setEncoding.apply(this.source, arguments);
};
DelayedStream.prototype.resume = function() {
if (!this._released) {
this.release();
}
this.source.resume();
};
DelayedStream.prototype.pause = function() {
this.source.pause();
};
DelayedStream.prototype.release = function() {
this._released = true;
this._bufferedEvents.forEach(function(args) {
this.emit.apply(this, args);
}.bind(this));
this._bufferedEvents = [];
};
DelayedStream.prototype.pipe = function() {
var r = Stream.prototype.pipe.apply(this, arguments);
this.resume();
return r;
};
DelayedStream.prototype._handleEmit = function(args) {
if (this._released) {
this.emit.apply(this, args);
return;
}
if (args[0] === "data") {
this.dataSize += args[1].length;
this._checkIfMaxDataSizeExceeded();
}
this._bufferedEvents.push(args);
};
DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
if (this._maxDataSizeExceeded) {
return;
}
if (this.dataSize <= this.maxDataSize) {
return;
}
this._maxDataSizeExceeded = true;
var message = "DelayedStream#maxDataSize of " + this.maxDataSize + " bytes exceeded.";
this.emit("error", new Error(message));
};
}
});
// node_modules/combined-stream/lib/combined_stream.js
var require_combined_stream = __commonJS({
"node_modules/combined-stream/lib/combined_stream.js"(exports, module2) {
var util = require("util");
var Stream = require("stream").Stream;
var DelayedStream = require_delayed_stream();
module2.exports = CombinedStream;
function CombinedStream() {
this.writable = false;
this.readable = true;
this.dataSize = 0;
this.maxDataSize = 2 * 1024 * 1024;
this.pauseStreams = true;
this._released = false;
this._streams = [];
this._currentStream = null;
this._insideLoop = false;
this._pendingNext = false;
}
util.inherits(CombinedStream, Stream);
CombinedStream.create = function(options) {
var combinedStream = new this();
options = options || {};
for (var option in options) {
combinedStream[option] = options[option];
}
return combinedStream;
};
CombinedStream.isStreamLike = function(stream) {
return typeof stream !== "function" && typeof stream !== "string" && typeof stream !== "boolean" && typeof stream !== "number" && !Buffer.isBuffer(stream);
};
CombinedStream.prototype.append = function(stream) {
var isStreamLike = CombinedStream.isStreamLike(stream);
if (isStreamLike) {
if (!(stream instanceof DelayedStream)) {
var newStream = DelayedStream.create(stream, {
maxDataSize: Infinity,
pauseStream: this.pauseStreams
});
stream.on("data", this._checkDataSize.bind(this));
stream = newStream;
}
this._handleErrors(stream);
if (this.pauseStreams) {
stream.pause();
}
}
this._streams.push(stream);
return this;
};
CombinedStream.prototype.pipe = function(dest, options) {
Stream.prototype.pipe.call(this, dest, options);
this.resume();
return dest;
};
CombinedStream.prototype._getNext = function() {
this._currentStream = null;
if (this._insideLoop) {
this._pendingNext = true;
return;
}
this._insideLoop = true;
try {
do {
this._pendingNext = false;
this._realGetNext();
} while (this._pendingNext);
} finally {
this._insideLoop = false;
}
};
CombinedStream.prototype._realGetNext = function() {
var stream = this._streams.shift();
if (typeof stream == "undefined") {
this.end();
return;
}
if (typeof stream !== "function") {
this._pipeNext(stream);
return;
}
var getStream = stream;
getStream(function(stream2) {
var isStreamLike = CombinedStream.isStreamLike(stream2);
if (isStreamLike) {
stream2.on("data", this._checkDataSize.bind(this));
this._handleErrors(stream2);
}
this._pipeNext(stream2);
}.bind(this));
};
CombinedStream.prototype._pipeNext = function(stream) {
this._currentStream = stream;
var isStreamLike = CombinedStream.isStreamLike(stream);
if (isStreamLike) {
stream.on("end", this._getNext.bind(this));
stream.pipe(this, { end: false });
return;
}
var value = stream;
this.write(value);
this._getNext();
};
CombinedStream.prototype._handleErrors = function(stream) {
var self2 = this;
stream.on("error", function(err) {
self2._emitError(err);
});
};
CombinedStream.prototype.write = function(data) {
this.emit("data", data);
};
CombinedStream.prototype.pause = function() {
if (!this.pauseStreams) {
return;
}
if (this.pauseStreams && this._currentStream && typeof this._currentStream.pause == "function")
this._currentStream.pause();
this.emit("pause");
};
CombinedStream.prototype.resume = function() {
if (!this._released) {
this._released = true;
this.writable = true;
this._getNext();
}
if (this.pauseStreams && this._currentStream && typeof this._currentStream.resume == "function")
this._currentStream.resume();
this.emit("resume");
};
CombinedStream.prototype.end = function() {
this._reset();
this.emit("end");
};
CombinedStream.prototype.destroy = function() {
this._reset();
this.emit("close");
};
CombinedStream.prototype._reset = function() {
this.writable = false;
this._streams = [];
this._currentStream = null;
};
CombinedStream.prototype._checkDataSize = function() {
this._updateDataSize();
if (this.dataSize <= this.maxDataSize) {
return;
}
var message = "DelayedStream#maxDataSize of " + this.maxDataSize + " bytes exceeded.";
this._emitError(new Error(message));
};
CombinedStream.prototype._updateDataSize = function() {
this.dataSize = 0;
var self2 = this;
this._streams.forEach(function(stream) {
if (!stream.dataSize) {
return;
}
self2.dataSize += stream.dataSize;
});
if (this._currentStream && this._currentStream.dataSize) {
this.dataSize += this._currentStream.dataSize;
}
};
CombinedStream.prototype._emitError = function(err) {
this._reset();
this.emit("error", err);
};
}
});
// node_modules/request/lib/multipart.js
var require_multipart = __commonJS({
"node_modules/request/lib/multipart.js"(exports) {
"use strict";
var uuid = require_v4();
var CombinedStream = require_combined_stream();
var isstream = require_isstream();
var Buffer2 = require_safe_buffer().Buffer;
function Multipart(request2) {
this.request = request2;
this.boundary = uuid();
this.chunked = false;
this.body = null;
}
Multipart.prototype.isChunked = function(options) {
var self2 = this;
var chunked = false;
var parts = options.data || options;
if (!parts.forEach) {
self2.request.emit("error", new Error("Argument error, options.multipart."));
}
if (options.chunked !== void 0) {
chunked = options.chunked;
}
if (self2.request.getHeader("transfer-encoding") === "chunked") {
chunked = true;
}
if (!chunked) {
parts.forEach(function(part) {
if (typeof part.body === "undefined") {
self2.request.emit("error", new Error("Body attribute missing in multipart."));
}
if (isstream(part.body)) {
chunked = true;
}
});
}
return chunked;
};
Multipart.prototype.setHeaders = function(chunked) {
var self2 = this;
if (chunked && !self2.request.hasHeader("transfer-encoding")) {
self2.request.setHeader("transfer-encoding", "chunked");
}
var header = self2.request.getHeader("content-type");
if (!header || header.indexOf("multipart") === -1) {
self2.request.setHeader("content-type", "multipart/related; boundary=" + self2.boundary);
} else {
if (header.indexOf("boundary") !== -1) {
self2.boundary = header.replace(/.*boundary=([^\s;]+).*/, "$1");
} else {
self2.request.setHeader("content-type", header + "; boundary=" + self2.boundary);
}
}
};
Multipart.prototype.build = function(parts, chunked) {
var self2 = this;
var body = chunked ? new CombinedStream() : [];
function add(part) {
if (typeof part === "number") {
part = part.toString();
}
return chunked ? body.append(part) : body.push(Buffer2.from(part));
}
if (self2.request.preambleCRLF) {
add("\r\n");
}
parts.forEach(function(part) {
var preamble = "--" + self2.boundary + "\r\n";
Object.keys(part).forEach(function(key) {
if (key === "body") {
return;
}
preamble += key + ": " + part[key] + "\r\n";
});
preamble += "\r\n";
add(preamble);
add(part.body);
add("\r\n");
});
add("--" + self2.boundary + "--");
if (self2.request.postambleCRLF) {
add("\r\n");
}
return body;
};
Multipart.prototype.onRequest = function(options) {
var self2 = this;
var chunked = self2.isChunked(options);
var parts = options.data || options;
self2.setHeaders(chunked);
self2.chunked = chunked;
self2.body = self2.build(parts, chunked);
};
exports.Multipart = Multipart;
}
});
// node_modules/request/lib/redirect.js
var require_redirect = __commonJS({
"node_modules/request/lib/redirect.js"(exports) {
"use strict";
var url = require("url");
var isUrl = /^https?:/;
function Redirect(request2) {
this.request = request2;
this.followRedirect = true;
this.followRedirects = true;
this.followAllRedirects = false;
this.followOriginalHttpMethod = false;
this.allowRedirect = function() {
return true;
};
this.maxRedirects = 10;
this.redirects = [];
this.redirectsFollowed = 0;
this.removeRefererHeader = false;
}
Redirect.prototype.onRequest = function(options) {
var self2 = this;
if (options.maxRedirects !== void 0) {
self2.maxRedirects = options.maxRedirects;
}
if (typeof options.followRedirect === "function") {
self2.allowRedirect = options.followRedirect;
}
if (options.followRedirect !== void 0) {
self2.followRedirects = !!options.followRedirect;
}
if (options.followAllRedirects !== void 0) {
self2.followAllRedirects = options.followAllRedirects;
}
if (self2.followRedirects || self2.followAllRedirects) {
self2.redirects = self2.redirects || [];
}
if (options.removeRefererHeader !== void 0) {
self2.removeRefererHeader = options.removeRefererHeader;
}
if (options.followOriginalHttpMethod !== void 0) {
self2.followOriginalHttpMethod = options.followOriginalHttpMethod;
}
};
Redirect.prototype.redirectTo = function(response) {
var self2 = this;
var request2 = self2.request;
var redirectTo = null;
if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has("location")) {
var location = response.caseless.get("location");
request2.debug("redirect", location);
if (self2.followAllRedirects) {
redirectTo = location;
} else if (self2.followRedirects) {
switch (request2.method) {
case "PATCH":
case "PUT":
case "POST":
case "DELETE":
break;
default:
redirectTo = location;
break;
}
}
} else if (response.statusCode === 401) {
var authHeader = request2._auth.onResponse(response);
if (authHeader) {
request2.setHeader("authorization", authHeader);
redirectTo = request2.uri;
}
}
return redirectTo;
};
Redirect.prototype.onResponse = function(response) {
var self2 = this;
var request2 = self2.request;
var redirectTo = self2.redirectTo(response);
if (!redirectTo || !self2.allowRedirect.call(request2, response)) {
return false;
}
request2.debug("redirect to", redirectTo);
if (response.resume) {
response.resume();
}
if (self2.redirectsFollowed >= self2.maxRedirects) {
request2.emit("error", new Error("Exceeded maxRedirects. Probably stuck in a redirect loop " + request2.uri.href));
return false;
}
self2.redirectsFollowed += 1;
if (!isUrl.test(redirectTo)) {
redirectTo = url.resolve(request2.uri.href, redirectTo);
}
var uriPrev = request2.uri;
request2.uri = url.parse(redirectTo);
if (request2.uri.protocol !== uriPrev.protocol) {
delete request2.agent;
}
self2.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo });
if (self2.followAllRedirects && request2.method !== "HEAD" && response.statusCode !== 401 && response.statusCode !== 307) {
request2.method = self2.followOriginalHttpMethod ? request2.method : "GET";
}
delete request2.src;
delete request2.req;
delete request2._started;
if (response.statusCode !== 401 && response.statusCode !== 307) {
delete request2.body;
delete request2._form;
if (request2.headers) {
request2.removeHeader("host");
request2.removeHeader("content-type");
request2.removeHeader("content-length");
if (request2.uri.hostname !== request2.originalHost.split(":")[0]) {
request2.removeHeader("authorization");
}
}
}
if (!self2.removeRefererHeader) {
request2.setHeader("referer", uriPrev.href);
}
request2.emit("redirect");
request2.init();
return true;
};
exports.Redirect = Redirect;
}
});
// node_modules/tunnel-agent/index.js
var require_tunnel_agent = __commonJS({
"node_modules/tunnel-agent/index.js"(exports) {
"use strict";
var net = require("net");
var tls = require("tls");
var http = require("http");
var https = require("https");
var events = require("events");
var assert = require("assert");
var util = require("util");
var Buffer2 = require_safe_buffer().Buffer;
exports.httpOverHttp = httpOverHttp;
exports.httpsOverHttp = httpsOverHttp;
exports.httpOverHttps = httpOverHttps;
exports.httpsOverHttps = httpsOverHttps;
function httpOverHttp(options) {
var agent = new TunnelingAgent(options);
agent.request = http.request;
return agent;
}
function httpsOverHttp(options) {
var agent = new TunnelingAgent(options);
agent.request = http.request;
agent.createSocket = createSecureSocket;
agent.defaultPort = 443;
return agent;
}
function httpOverHttps(options) {
var agent = new TunnelingAgent(options);
agent.request = https.request;
return agent;
}
function httpsOverHttps(options) {
var agent = new TunnelingAgent(options);
agent.request = https.request;
agent.createSocket = createSecureSocket;
agent.defaultPort = 443;
return agent;
}
function TunnelingAgent(options) {
var self2 = this;
self2.options = options || {};
self2.proxyOptions = self2.options.proxy || {};
self2.maxSockets = self2.options.maxSockets || http.Agent.defaultMaxSockets;
self2.requests = [];
self2.sockets = [];
self2.on("free", function onFree(socket, host, port) {
for (var i = 0, len = self2.requests.length; i < len; ++i) {
var pending = self2.requests[i];
if (pending.host === host && pending.port === port) {
self2.requests.splice(i, 1);
pending.request.onSocket(socket);
return;
}
}
socket.destroy();
self2.removeSocket(socket);
});
}
util.inherits(TunnelingAgent, events.EventEmitter);
TunnelingAgent.prototype.addRequest = function addRequest(req, options) {
var self2 = this;
if (typeof options === "string") {
options = {
host: options,
port: arguments[2],
path: arguments[3]
};
}
if (self2.sockets.length >= this.maxSockets) {
self2.requests.push({ host: options.host, port: options.port, request: req });
return;
}
self2.createConnection({ host: options.host, port: options.port, request: req });
};
TunnelingAgent.prototype.createConnection = function createConnection(pending) {
var self2 = this;
self2.createSocket(pending, function(socket) {
socket.on("free", onFree);
socket.on("close", onCloseOrRemove);
socket.on("agentRemove", onCloseOrRemove);
pending.request.onSocket(socket);
function onFree() {
self2.emit("free", socket, pending.host, pending.port);
}
function onCloseOrRemove(err) {
self2.removeSocket(socket);
socket.removeListener("free", onFree);
socket.removeListener("close", onCloseOrRemove);
socket.removeListener("agentRemove", onCloseOrRemove);
}
});
};
TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
var self2 = this;
var placeholder = {};
self2.sockets.push(placeholder);
var connectOptions = mergeOptions({}, self2.proxyOptions, {
method: "CONNECT",
path: options.host + ":" + options.port,
agent: false
});
if (connectOptions.proxyAuth) {
connectOptions.headers = connectOptions.headers || {};
connectOptions.headers["Proxy-Authorization"] = "Basic " + Buffer2.from(connectOptions.proxyAuth).toString("base64");
}
debug("making CONNECT request");
var connectReq = self2.request(connectOptions);
connectReq.useChunkedEncodingByDefault = false;
connectReq.once("response", onResponse);
connectReq.once("upgrade", onUpgrade);
connectReq.once("connect", onConnect);
connectReq.once("error", onError);
connectReq.end();
function onResponse(res) {
res.upgrade = true;
}
function onUpgrade(res, socket, head) {
process.nextTick(function() {
onConnect(res, socket, head);
});
}
function onConnect(res, socket, head) {
connectReq.removeAllListeners();
socket.removeAllListeners();
if (res.statusCode === 200) {
assert.equal(head.length, 0);
debug("tunneling connection has established");
self2.sockets[self2.sockets.indexOf(placeholder)] = socket;
cb(socket);
} else {
debug("tunneling socket could not be established, statusCode=%d", res.statusCode);
var error = new Error("tunneling socket could not be established, statusCode=" + res.statusCode);
error.code = "ECONNRESET";
options.request.emit("error", error);
self2.removeSocket(placeholder);
}
}
function onError(cause) {
connectReq.removeAllListeners();
debug("tunneling socket could not be established, cause=%s\n", cause.message, cause.stack);
var error = new Error("tunneling socket could not be established, cause=" + cause.message);
error.code = "ECONNRESET";
options.request.emit("error", error);
self2.removeSocket(placeholder);
}
};
TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
var pos = this.sockets.indexOf(socket);
if (pos === -1)
return;
this.sockets.splice(pos, 1);
var pending = this.requests.shift();
if (pending) {
this.createConnection(pending);
}
};
function createSecureSocket(options, cb) {
var self2 = this;
TunnelingAgent.prototype.createSocket.call(self2, options, function(socket) {
var secureSocket = tls.connect(0, mergeOptions({}, self2.options, {
servername: options.host,
socket
}));
self2.sockets[self2.sockets.indexOf(socket)] = secureSocket;
cb(secureSocket);
});
}
function mergeOptions(target) {
for (var i = 1, len = arguments.length; i < len; ++i) {
var overrides = arguments[i];
if (typeof overrides === "object") {
var keys = Object.keys(overrides);
for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
var k = keys[j];
if (overrides[k] !== void 0) {
target[k] = overrides[k];
}
}
}
}
return target;
}
var debug;
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
debug = function() {
var args = Array.prototype.slice.call(arguments);
if (typeof args[0] === "string") {
args[0] = "TUNNEL: " + args[0];
} else {
args.unshift("TUNNEL:");
}
console.error.apply(console, args);
};
} else {
debug = function() {
};
}
exports.debug = debug;
}
});
// node_modules/request/lib/tunnel.js
var require_tunnel = __commonJS({
"node_modules/request/lib/tunnel.js"(exports) {
"use strict";
var url = require("url");
var tunnel = require_tunnel_agent();
var defaultProxyHeaderWhiteList = [
"accept",
"accept-charset",
"accept-encoding",
"accept-language",
"accept-ranges",
"cache-control",
"content-encoding",
"content-language",
"content-location",
"content-md5",
"content-range",
"content-type",
"connection",
"date",
"expect",
"max-forwards",
"pragma",
"referer",
"te",
"user-agent",
"via"
];
var defaultProxyHeaderExclusiveList = [
"proxy-authorization"
];
function constructProxyHost(uriObject) {
var port = uriObject.port;
var protocol = uriObject.protocol;
var proxyHost = uriObject.hostname + ":";
if (port) {
proxyHost += port;
} else if (protocol === "https:") {
proxyHost += "443";
} else {
proxyHost += "80";
}
return proxyHost;
}
function constructProxyHeaderWhiteList(headers, proxyHeaderWhiteList) {
var whiteList = proxyHeaderWhiteList.reduce(function(set, header) {
set[header.toLowerCase()] = true;
return set;
}, {});
return Object.keys(headers).filter(function(header) {
return whiteList[header.toLowerCase()];
}).reduce(function(set, header) {
set[header] = headers[header];
return set;
}, {});
}
function constructTunnelOptions(request2, proxyHeaders) {
var proxy = request2.proxy;
var tunnelOptions = {
proxy: {
host: proxy.hostname,
port: +proxy.port,
proxyAuth: proxy.auth,
headers: proxyHeaders
},
headers: request2.headers,
ca: request2.ca,
cert: request2.cert,
key: request2.key,
passphrase: request2.passphrase,
pfx: request2.pfx,
ciphers: request2.ciphers,
rejectUnauthorized: request2.rejectUnauthorized,
secureOptions: request2.secureOptions,
secureProtocol: request2.secureProtocol
};
return tunnelOptions;
}
function constructTunnelFnName(uri, proxy) {
var uriProtocol = uri.protocol === "https:" ? "https" : "http";
var proxyProtocol = proxy.protocol === "https:" ? "Https" : "Http";
return [uriProtocol, proxyProtocol].join("Over");
}
function getTunnelFn(request2) {
var uri = request2.uri;
var proxy = request2.proxy;
var tunnelFnName = constructTunnelFnName(uri, proxy);
return tunnel[tunnelFnName];
}
function Tunnel(request2) {
this.request = request2;
this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList;
this.proxyHeaderExclusiveList = [];
if (typeof request2.tunnel !== "undefined") {
this.tunnelOverride = request2.tunnel;
}
}
Tunnel.prototype.isEnabled = function() {
var self2 = this;
var request2 = self2.request;
if (typeof self2.tunnelOverride !== "undefined") {
return self2.tunnelOverride;
}
if (request2.uri.protocol === "https:") {
return true;
}
return false;
};
Tunnel.prototype.setup = function(options) {
var self2 = this;
var request2 = self2.request;
options = options || {};
if (typeof request2.proxy === "string") {
request2.proxy = url.parse(request2.proxy);
}
if (!request2.proxy || !request2.tunnel) {
return false;
}
if (options.proxyHeaderWhiteList) {
self2.proxyHeaderWhiteList = options.proxyHeaderWhiteList;
}
if (options.proxyHeaderExclusiveList) {
self2.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList;
}
var proxyHeaderExclusiveList = self2.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList);
var proxyHeaderWhiteList = self2.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList);
var proxyHeaders = constructProxyHeaderWhiteList(request2.headers, proxyHeaderWhiteList);
proxyHeaders.host = constructProxyHost(request2.uri);
proxyHeaderExclusiveList.forEach(request2.removeHeader, request2);
var tunnelFn = getTunnelFn(request2);
var tunnelOptions = constructTunnelOptions(request2, proxyHeaders);
request2.agent = tunnelFn(tunnelOptions);
return true;
};
Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList;
Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList;
exports.Tunnel = Tunnel;
}
});
// node_modules/performance-now/lib/performance-now.js
var require_performance_now = __commonJS({
"node_modules/performance-now/lib/performance-now.js"(exports, module2) {
(function() {
var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
if (typeof performance !== "undefined" && performance !== null && performance.now) {
module2.exports = function() {
return performance.now();
};
} else if (typeof process !== "undefined" && process !== null && process.hrtime) {
module2.exports = function() {
return (getNanoSeconds() - nodeLoadTime) / 1e6;
};
hrtime = process.hrtime;
getNanoSeconds = function() {
var hr;
hr = hrtime();
return hr[0] * 1e9 + hr[1];
};
moduleLoadTime = getNanoSeconds();
upTime = process.uptime() * 1e9;
nodeLoadTime = moduleLoadTime - upTime;
} else if (Date.now) {
module2.exports = function() {
return Date.now() - loadTime;
};
loadTime = Date.now();
} else {
module2.exports = function() {
return new Date().getTime() - loadTime;
};
loadTime = new Date().getTime();
}
}).call(exports);
}
});
// node_modules/request/request.js
var require_request2 = __commonJS({
"node_modules/request/request.js"(exports, module2) {
"use strict";
var http = require("http");
var https = require("https");
var url = require("url");
var util = require("util");
var stream = require("stream");
var zlib = require("zlib");
var aws2 = require_aws_sign2();
var aws4 = require_aws4();
var httpSignature = require_lib3();
var mime = require_mime_types();
var caseless = require_caseless();
var ForeverAgent = require_forever_agent();
var FormData = require_browser();
var extend = require_extend();
var isstream = require_isstream();
var isTypedArray = require_is_typedarray().strict;
var helpers = require_helpers();
var cookies = require_cookies();
var getProxyFromURI = require_getProxyFromURI();
var Querystring = require_querystring().Querystring;
var Har = require_har2().Har;
var Auth = require_auth().Auth;
var OAuth = require_oauth().OAuth;
var hawk = require_hawk();
var Multipart = require_multipart().Multipart;
var Redirect = require_redirect().Redirect;
var Tunnel = require_tunnel().Tunnel;
var now = require_performance_now();
var Buffer2 = require_safe_buffer().Buffer;
var safeStringify = helpers.safeStringify;
var isReadStream = helpers.isReadStream;
var toBase64 = helpers.toBase64;
var defer = helpers.defer;
var copy = helpers.copy;
var version = helpers.version;
var globalCookieJar = cookies.jar();
var globalPool = {};
function filterForNonReserved(reserved, options) {
var object = {};
for (var i in options) {
var notReserved = reserved.indexOf(i) === -1;
if (notReserved) {
object[i] = options[i];
}
}
return object;
}
function filterOutReservedFunctions(reserved, options) {
var object = {};
for (var i in options) {
var isReserved = !(reserved.indexOf(i) === -1);
var isFunction = typeof options[i] === "function";
if (!(isReserved && isFunction)) {
object[i] = options[i];
}
}
return object;
}
function requestToJSON() {
var self2 = this;
return {
uri: self2.uri,
method: self2.method,
headers: self2.headers
};
}
function responseToJSON() {
var self2 = this;
return {
statusCode: self2.statusCode,
body: self2.body,
headers: self2.headers,
request: requestToJSON.call(self2.request)
};
}
function Request(options) {
var self2 = this;
if (options.har) {
self2._har = new Har(self2);
options = self2._har.options(options);
}
stream.Stream.call(self2);
var reserved = Object.keys(Request.prototype);
var nonReserved = filterForNonReserved(reserved, options);
extend(self2, nonReserved);
options = filterOutReservedFunctions(reserved, options);
self2.readable = true;
self2.writable = true;
if (options.method) {
self2.explicitMethod = true;
}
self2._qs = new Querystring(self2);
self2._auth = new Auth(self2);
self2._oauth = new OAuth(self2);
self2._multipart = new Multipart(self2);
self2._redirect = new Redirect(self2);
self2._tunnel = new Tunnel(self2);
self2.init(options);
}
util.inherits(Request, stream.Stream);
Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG);
function debug() {
if (Request.debug) {
console.error("REQUEST %s", util.format.apply(util, arguments));
}
}
Request.prototype.debug = debug;
Request.prototype.init = function(options) {
var self2 = this;
if (!options) {
options = {};
}
self2.headers = self2.headers ? copy(self2.headers) : {};
for (var headerName in self2.headers) {
if (typeof self2.headers[headerName] === "undefined") {
delete self2.headers[headerName];
}
}
caseless.httpify(self2, self2.headers);
if (!self2.method) {
self2.method = options.method || "GET";
}
if (!self2.localAddress) {
self2.localAddress = options.localAddress;
}
self2._qs.init(options);
debug(options);
if (!self2.pool && self2.pool !== false) {
self2.pool = globalPool;
}
self2.dests = self2.dests || [];
self2.__isRequestRequest = true;
if (!self2._callback && self2.callback) {
self2._callback = self2.callback;
self2.callback = function() {
if (self2._callbackCalled) {
return;
}
self2._callbackCalled = true;
self2._callback.apply(self2, arguments);
};
self2.on("error", self2.callback.bind());
self2.on("complete", self2.callback.bind(self2, null));
}
if (!self2.uri && self2.url) {
self2.uri = self2.url;
delete self2.url;
}
if (self2.baseUrl) {
if (typeof self2.baseUrl !== "string") {
return self2.emit("error", new Error("options.baseUrl must be a string"));
}
if (typeof self2.uri !== "string") {
return self2.emit("error", new Error("options.uri must be a string when using options.baseUrl"));
}
if (self2.uri.indexOf("//") === 0 || self2.uri.indexOf("://") !== -1) {
return self2.emit("error", new Error("options.uri must be a path when using options.baseUrl"));
}
var baseUrlEndsWithSlash = self2.baseUrl.lastIndexOf("/") === self2.baseUrl.length - 1;
var uriStartsWithSlash = self2.uri.indexOf("/") === 0;
if (baseUrlEndsWithSlash && uriStartsWithSlash) {
self2.uri = self2.baseUrl + self2.uri.slice(1);
} else if (baseUrlEndsWithSlash || uriStartsWithSlash) {
self2.uri = self2.baseUrl + self2.uri;
} else if (self2.uri === "") {
self2.uri = self2.baseUrl;
} else {
self2.uri = self2.baseUrl + "/" + self2.uri;
}
delete self2.baseUrl;
}
if (!self2.uri) {
return self2.emit("error", new Error("options.uri is a required argument"));
}
if (typeof self2.uri === "string") {
self2.uri = url.parse(self2.uri);
}
if (!self2.uri.href) {
self2.uri.href = url.format(self2.uri);
}
if (self2.uri.protocol === "unix:") {
return self2.emit("error", new Error("`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`"));
}
if (self2.uri.host === "unix") {
self2.enableUnixSocket();
}
if (self2.strictSSL === false) {
self2.rejectUnauthorized = false;
}
if (!self2.uri.pathname) {
self2.uri.pathname = "/";
}
if (!(self2.uri.host || self2.uri.hostname && self2.uri.port) && !self2.uri.isUnix) {
var faultyUri = url.format(self2.uri);
var message = 'Invalid URI "' + faultyUri + '"';
if (Object.keys(options).length === 0) {
message += ". This can be caused by a crappy redirection.";
}
self2.abort();
return self2.emit("error", new Error(message));
}
if (!self2.hasOwnProperty("proxy")) {
self2.proxy = getProxyFromURI(self2.uri);
}
self2.tunnel = self2._tunnel.isEnabled();
if (self2.proxy) {
self2._tunnel.setup(options);
}
self2._redirect.onRequest(options);
self2.setHost = false;
if (!self2.hasHeader("host")) {
var hostHeaderName = self2.originalHostHeaderName || "host";
self2.setHeader(hostHeaderName, self2.uri.host);
if (self2.uri.port) {
if (self2.uri.port === "80" && self2.uri.protocol === "http:" || self2.uri.port === "443" && self2.uri.protocol === "https:") {
self2.setHeader(hostHeaderName, self2.uri.hostname);
}
}
self2.setHost = true;
}
self2.jar(self2._jar || options.jar);
if (!self2.uri.port) {
if (self2.uri.protocol === "http:") {
self2.uri.port = 80;
} else if (self2.uri.protocol === "https:") {
self2.uri.port = 443;
}
}
if (self2.proxy && !self2.tunnel) {
self2.port = self2.proxy.port;
self2.host = self2.proxy.hostname;
} else {
self2.port = self2.uri.port;
self2.host = self2.uri.hostname;
}
if (options.form) {
self2.form(options.form);
}
if (options.formData) {
var formData = options.formData;
var requestForm = self2.form();
var appendFormValue = function(key, value) {
if (value && value.hasOwnProperty("value") && value.hasOwnProperty("options")) {
requestForm.append(key, value.value, value.options);
} else {
requestForm.append(key, value);
}
};
for (var formKey in formData) {
if (formData.hasOwnProperty(formKey)) {
var formValue = formData[formKey];
if (formValue instanceof Array) {
for (var j = 0; j < formValue.length; j++) {
appendFormValue(formKey, formValue[j]);
}
} else {
appendFormValue(formKey, formValue);
}
}
}
}
if (options.qs) {
self2.qs(options.qs);
}
if (self2.uri.path) {
self2.path = self2.uri.path;
} else {
self2.path = self2.uri.pathname + (self2.uri.search || "");
}
if (self2.path.length === 0) {
self2.path = "/";
}
if (options.aws) {
self2.aws(options.aws);
}
if (options.hawk) {
self2.hawk(options.hawk);
}
if (options.httpSignature) {
self2.httpSignature(options.httpSignature);
}
if (options.auth) {
if (Object.prototype.hasOwnProperty.call(options.auth, "username")) {
options.auth.user = options.auth.username;
}
if (Object.prototype.hasOwnProperty.call(options.auth, "password")) {
options.auth.pass = options.auth.password;
}
self2.auth(options.auth.user, options.auth.pass, options.auth.sendImmediately, options.auth.bearer);
}
if (self2.gzip && !self2.hasHeader("accept-encoding")) {
self2.setHeader("accept-encoding", "gzip, deflate");
}
if (self2.uri.auth && !self2.hasHeader("authorization")) {
var uriAuthPieces = self2.uri.auth.split(":").map(function(item) {
return self2._qs.unescape(item);
});
self2.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(":"), true);
}
if (!self2.tunnel && self2.proxy && self2.proxy.auth && !self2.hasHeader("proxy-authorization")) {
var proxyAuthPieces = self2.proxy.auth.split(":").map(function(item) {
return self2._qs.unescape(item);
});
var authHeader = "Basic " + toBase64(proxyAuthPieces.join(":"));
self2.setHeader("proxy-authorization", authHeader);
}
if (self2.proxy && !self2.tunnel) {
self2.path = self2.uri.protocol + "//" + self2.uri.host + self2.path;
}
if (options.json) {
self2.json(options.json);
}
if (options.multipart) {
self2.multipart(options.multipart);
}
if (options.time) {
self2.timing = true;
self2.elapsedTime = self2.elapsedTime || 0;
}
function setContentLength() {
if (isTypedArray(self2.body)) {
self2.body = Buffer2.from(self2.body);
}
if (!self2.hasHeader("content-length")) {
var length;
if (typeof self2.body === "string") {
length = Buffer2.byteLength(self2.body);
} else if (Array.isArray(self2.body)) {
length = self2.body.reduce(function(a, b) {
return a + b.length;
}, 0);
} else {
length = self2.body.length;
}
if (length) {
self2.setHeader("content-length", length);
} else {
self2.emit("error", new Error("Argument error, options.body."));
}
}
}
if (self2.body && !isstream(self2.body)) {
setContentLength();
}
if (options.oauth) {
self2.oauth(options.oauth);
} else if (self2._oauth.params && self2.hasHeader("authorization")) {
self2.oauth(self2._oauth.params);
}
var protocol = self2.proxy && !self2.tunnel ? self2.proxy.protocol : self2.uri.protocol;
var defaultModules = { "http:": http, "https:": https };
var httpModules = self2.httpModules || {};
self2.httpModule = httpModules[protocol] || defaultModules[protocol];
if (!self2.httpModule) {
return self2.emit("error", new Error("Invalid protocol: " + protocol));
}
if (options.ca) {
self2.ca = options.ca;
}
if (!self2.agent) {
if (options.agentOptions) {
self2.agentOptions = options.agentOptions;
}
if (options.agentClass) {
self2.agentClass = options.agentClass;
} else if (options.forever) {
var v = version();
if (v.major === 0 && v.minor <= 10) {
self2.agentClass = protocol === "http:" ? ForeverAgent : ForeverAgent.SSL;
} else {
self2.agentClass = self2.httpModule.Agent;
self2.agentOptions = self2.agentOptions || {};
self2.agentOptions.keepAlive = true;
}
} else {
self2.agentClass = self2.httpModule.Agent;
}
}
if (self2.pool === false) {
self2.agent = false;
} else {
self2.agent = self2.agent || self2.getNewAgent();
}
self2.on("pipe", function(src) {
if (self2.ntick && self2._started) {
self2.emit("error", new Error("You cannot pipe to this stream after the outbound request has started."));
}
self2.src = src;
if (isReadStream(src)) {
if (!self2.hasHeader("content-type")) {
self2.setHeader("content-type", mime.lookup(src.path));
}
} else {
if (src.headers) {
for (var i in src.headers) {
if (!self2.hasHeader(i)) {
self2.setHeader(i, src.headers[i]);
}
}
}
if (self2._json && !self2.hasHeader("content-type")) {
self2.setHeader("content-type", "application/json");
}
if (src.method && !self2.explicitMethod) {
self2.method = src.method;
}
}
});
defer(function() {
if (self2._aborted) {
return;
}
var end = function() {
if (self2._form) {
if (!self2._auth.hasAuth) {
self2._form.pipe(self2);
} else if (self2._auth.hasAuth && self2._auth.sentAuth) {
self2._form.pipe(self2);
}
}
if (self2._multipart && self2._multipart.chunked) {
self2._multipart.body.pipe(self2);
}
if (self2.body) {
if (isstream(self2.body)) {
self2.body.pipe(self2);
} else {
setContentLength();
if (Array.isArray(self2.body)) {
self2.body.forEach(function(part) {
self2.write(part);
});
} else {
self2.write(self2.body);
}
self2.end();
}
} else if (self2.requestBodyStream) {
console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.");
self2.requestBodyStream.pipe(self2);
} else if (!self2.src) {
if (self2._auth.hasAuth && !self2._auth.sentAuth) {
self2.end();
return;
}
if (self2.method !== "GET" && typeof self2.method !== "undefined") {
self2.setHeader("content-length", 0);
}
self2.end();
}
};
if (self2._form && !self2.hasHeader("content-length")) {
self2.setHeader(self2._form.getHeaders(), true);
self2._form.getLength(function(err, length) {
if (!err && !isNaN(length)) {
self2.setHeader("content-length", length);
}
end();
});
} else {
end();
}
self2.ntick = true;
});
};
Request.prototype.getNewAgent = function() {
var self2 = this;
var Agent = self2.agentClass;
var options = {};
if (self2.agentOptions) {
for (var i in self2.agentOptions) {
options[i] = self2.agentOptions[i];
}
}
if (self2.ca) {
options.ca = self2.ca;
}
if (self2.ciphers) {
options.ciphers = self2.ciphers;
}
if (self2.secureProtocol) {
options.secureProtocol = self2.secureProtocol;
}
if (self2.secureOptions) {
options.secureOptions = self2.secureOptions;
}
if (typeof self2.rejectUnauthorized !== "undefined") {
options.rejectUnauthorized = self2.rejectUnauthorized;
}
if (self2.cert && self2.key) {
options.key = self2.key;
options.cert = self2.cert;
}
if (self2.pfx) {
options.pfx = self2.pfx;
}
if (self2.passphrase) {
options.passphrase = self2.passphrase;
}
var poolKey = "";
if (Agent !== self2.httpModule.Agent) {
poolKey += Agent.name;
}
var proxy = self2.proxy;
if (typeof proxy === "string") {
proxy = url.parse(proxy);
}
var isHttps = proxy && proxy.protocol === "https:" || this.uri.protocol === "https:";
if (isHttps) {
if (options.ca) {
if (poolKey) {
poolKey += ":";
}
poolKey += options.ca;
}
if (typeof options.rejectUnauthorized !== "undefined") {
if (poolKey) {
poolKey += ":";
}
poolKey += options.rejectUnauthorized;
}
if (options.cert) {
if (poolKey) {
poolKey += ":";
}
poolKey += options.cert.toString("ascii") + options.key.toString("ascii");
}
if (options.pfx) {
if (poolKey) {
poolKey += ":";
}
poolKey += options.pfx.toString("ascii");
}
if (options.ciphers) {
if (poolKey) {
poolKey += ":";
}
poolKey += options.ciphers;
}
if (options.secureProtocol) {
if (poolKey) {
poolKey += ":";
}
poolKey += options.secureProtocol;
}
if (options.secureOptions) {
if (poolKey) {
poolKey += ":";
}
poolKey += options.secureOptions;
}
}
if (self2.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self2.httpModule.globalAgent) {
return self2.httpModule.globalAgent;
}
poolKey = self2.uri.protocol + poolKey;
if (!self2.pool[poolKey]) {
self2.pool[poolKey] = new Agent(options);
if (self2.pool.maxSockets) {
self2.pool[poolKey].maxSockets = self2.pool.maxSockets;
}
}
return self2.pool[poolKey];
};
Request.prototype.start = function() {
var self2 = this;
if (self2.timing) {
var startTime = new Date().getTime();
var startTimeNow = now();
}
if (self2._aborted) {
return;
}
self2._started = true;
self2.method = self2.method || "GET";
self2.href = self2.uri.href;
if (self2.src && self2.src.stat && self2.src.stat.size && !self2.hasHeader("content-length")) {
self2.setHeader("content-length", self2.src.stat.size);
}
if (self2._aws) {
self2.aws(self2._aws, true);
}
var reqOptions = copy(self2);
delete reqOptions.auth;
debug("make request", self2.uri.href);
delete reqOptions.timeout;
try {
self2.req = self2.httpModule.request(reqOptions);
} catch (err) {
self2.emit("error", err);
return;
}
if (self2.timing) {
self2.startTime = startTime;
self2.startTimeNow = startTimeNow;
self2.timings = {};
}
var timeout;
if (self2.timeout && !self2.timeoutTimer) {
if (self2.timeout < 0) {
timeout = 0;
} else if (typeof self2.timeout === "number" && isFinite(self2.timeout)) {
timeout = self2.timeout;
}
}
self2.req.on("response", self2.onRequestResponse.bind(self2));
self2.req.on("error", self2.onRequestError.bind(self2));
self2.req.on("drain", function() {
self2.emit("drain");
});
self2.req.on("socket", function(socket) {
var isConnecting = socket._connecting || socket.connecting;
if (self2.timing) {
self2.timings.socket = now() - self2.startTimeNow;
if (isConnecting) {
var onLookupTiming = function() {
self2.timings.lookup = now() - self2.startTimeNow;
};
var onConnectTiming = function() {
self2.timings.connect = now() - self2.startTimeNow;
};
socket.once("lookup", onLookupTiming);
socket.once("connect", onConnectTiming);
self2.req.once("error", function() {
socket.removeListener("lookup", onLookupTiming);
socket.removeListener("connect", onConnectTiming);
});
}
}
var setReqTimeout = function() {
self2.req.setTimeout(timeout, function() {
if (self2.req) {
self2.abort();
var e = new Error("ESOCKETTIMEDOUT");
e.code = "ESOCKETTIMEDOUT";
e.connect = false;
self2.emit("error", e);
}
});
};
if (timeout !== void 0) {
if (isConnecting) {
var onReqSockConnect = function() {
socket.removeListener("connect", onReqSockConnect);
self2.clearTimeout();
setReqTimeout();
};
socket.on("connect", onReqSockConnect);
self2.req.on("error", function(err) {
socket.removeListener("connect", onReqSockConnect);
});
self2.timeoutTimer = setTimeout(function() {
socket.removeListener("connect", onReqSockConnect);
self2.abort();
var e = new Error("ETIMEDOUT");
e.code = "ETIMEDOUT";
e.connect = true;
self2.emit("error", e);
}, timeout);
} else {
setReqTimeout();
}
}
self2.emit("socket", socket);
});
self2.emit("request", self2.req);
};
Request.prototype.onRequestError = function(error) {
var self2 = this;
if (self2._aborted) {
return;
}
if (self2.req && self2.req._reusedSocket && error.code === "ECONNRESET" && self2.agent.addRequestNoreuse) {
self2.agent = { addRequest: self2.agent.addRequestNoreuse.bind(self2.agent) };
self2.start();
self2.req.end();
return;
}
self2.clearTimeout();
self2.emit("error", error);
};
Request.prototype.onRequestResponse = function(response) {
var self2 = this;
if (self2.timing) {
self2.timings.response = now() - self2.startTimeNow;
}
debug("onRequestResponse", self2.uri.href, response.statusCode, response.headers);
response.on("end", function() {
if (self2.timing) {
self2.timings.end = now() - self2.startTimeNow;
response.timingStart = self2.startTime;
if (!self2.timings.socket) {
self2.timings.socket = 0;
}
if (!self2.timings.lookup) {
self2.timings.lookup = self2.timings.socket;
}
if (!self2.timings.connect) {
self2.timings.connect = self2.timings.lookup;
}
if (!self2.timings.response) {
self2.timings.response = self2.timings.connect;
}
debug("elapsed time", self2.timings.end);
self2.elapsedTime += Math.round(self2.timings.end);
response.elapsedTime = self2.elapsedTime;
response.timings = self2.timings;
response.timingPhases = {
wait: self2.timings.socket,
dns: self2.timings.lookup - self2.timings.socket,
tcp: self2.timings.connect - self2.timings.lookup,
firstByte: self2.timings.response - self2.timings.connect,
download: self2.timings.end - self2.timings.response,
total: self2.timings.end
};
}
debug("response end", self2.uri.href, response.statusCode, response.headers);
});
if (self2._aborted) {
debug("aborted", self2.uri.href);
response.resume();
return;
}
self2.response = response;
response.request = self2;
response.toJSON = responseToJSON;
if (self2.httpModule === https && self2.strictSSL && (!response.hasOwnProperty("socket") || !response.socket.authorized)) {
debug("strict ssl error", self2.uri.href);
var sslErr = response.hasOwnProperty("socket") ? response.socket.authorizationError : self2.uri.href + " does not support SSL";
self2.emit("error", new Error("SSL Error: " + sslErr));
return;
}
self2.originalHost = self2.getHeader("host");
if (!self2.originalHostHeaderName) {
self2.originalHostHeaderName = self2.hasHeader("host");
}
if (self2.setHost) {
self2.removeHeader("host");
}
self2.clearTimeout();
var targetCookieJar = self2._jar && self2._jar.setCookie ? self2._jar : globalCookieJar;
var addCookie = function(cookie) {
try {
targetCookieJar.setCookie(cookie, self2.uri.href, { ignoreError: true });
} catch (e) {
self2.emit("error", e);
}
};
response.caseless = caseless(response.headers);
if (response.caseless.has("set-cookie") && !self2._disableCookies) {
var headerName = response.caseless.has("set-cookie");
if (Array.isArray(response.headers[headerName])) {
response.headers[headerName].forEach(addCookie);
} else {
addCookie(response.headers[headerName]);
}
}
if (self2._redirect.onResponse(response)) {
return;
} else {
response.on("close", function() {
if (!self2._ended) {
self2.response.emit("end");
}
});
response.once("end", function() {
self2._ended = true;
});
var noBody = function(code) {
return self2.method === "HEAD" || code >= 100 && code < 200 || code === 204 || code === 304;
};
var responseContent;
if (self2.gzip && !noBody(response.statusCode)) {
var contentEncoding = response.headers["content-encoding"] || "identity";
contentEncoding = contentEncoding.trim().toLowerCase();
var zlibOptions = {
flush: zlib.Z_SYNC_FLUSH,
finishFlush: zlib.Z_SYNC_FLUSH
};
if (contentEncoding === "gzip") {
responseContent = zlib.createGunzip(zlibOptions);
response.pipe(responseContent);
} else if (contentEncoding === "deflate") {
responseContent = zlib.createInflate(zlibOptions);
response.pipe(responseContent);
} else {
if (contentEncoding !== "identity") {
debug("ignoring unrecognized Content-Encoding " + contentEncoding);
}
responseContent = response;
}
} else {
responseContent = response;
}
if (self2.encoding) {
if (self2.dests.length !== 0) {
console.error("Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.");
} else {
responseContent.setEncoding(self2.encoding);
}
}
if (self2._paused) {
responseContent.pause();
}
self2.responseContent = responseContent;
self2.emit("response", response);
self2.dests.forEach(function(dest) {
self2.pipeDest(dest);
});
responseContent.on("data", function(chunk) {
if (self2.timing && !self2.responseStarted) {
self2.responseStartTime = new Date().getTime();
response.responseStartTime = self2.responseStartTime;
}
self2._destdata = true;
self2.emit("data", chunk);
});
responseContent.once("end", function(chunk) {
self2.emit("end", chunk);
});
responseContent.on("error", function(error) {
self2.emit("error", error);
});
responseContent.on("close", function() {
self2.emit("close");
});
if (self2.callback) {
self2.readResponseBody(response);
} else {
self2.on("end", function() {
if (self2._aborted) {
debug("aborted", self2.uri.href);
return;
}
self2.emit("complete", response);
});
}
}
debug("finish init function", self2.uri.href);
};
Request.prototype.readResponseBody = function(response) {
var self2 = this;
debug("reading response's body");
var buffers = [];
var bufferLength = 0;
var strings = [];
self2.on("data", function(chunk) {
if (!Buffer2.isBuffer(chunk)) {
strings.push(chunk);
} else if (chunk.length) {
bufferLength += chunk.length;
buffers.push(chunk);
}
});
self2.on("end", function() {
debug("end event", self2.uri.href);
if (self2._aborted) {
debug("aborted", self2.uri.href);
buffers = [];
bufferLength = 0;
return;
}
if (bufferLength) {
debug("has body", self2.uri.href, bufferLength);
response.body = Buffer2.concat(buffers, bufferLength);
if (self2.encoding !== null) {
response.body = response.body.toString(self2.encoding);
}
buffers = [];
bufferLength = 0;
} else if (strings.length) {
if (self2.encoding === "utf8" && strings[0].length > 0 && strings[0][0] === "\uFEFF") {
strings[0] = strings[0].substring(1);
}
response.body = strings.join("");
}
if (self2._json) {
try {
response.body = JSON.parse(response.body, self2._jsonReviver);
} catch (e) {
debug("invalid JSON received", self2.uri.href);
}
}
debug("emitting complete", self2.uri.href);
if (typeof response.body === "undefined" && !self2._json) {
response.body = self2.encoding === null ? Buffer2.alloc(0) : "";
}
self2.emit("complete", response, response.body);
});
};
Request.prototype.abort = function() {
var self2 = this;
self2._aborted = true;
if (self2.req) {
self2.req.abort();
} else if (self2.response) {
self2.response.destroy();
}
self2.clearTimeout();
self2.emit("abort");
};
Request.prototype.pipeDest = function(dest) {
var self2 = this;
var response = self2.response;
if (dest.headers && !dest.headersSent) {
if (response.caseless.has("content-type")) {
var ctname = response.caseless.has("content-type");
if (dest.setHeader) {
dest.setHeader(ctname, response.headers[ctname]);
} else {
dest.headers[ctname] = response.headers[ctname];
}
}
if (response.caseless.has("content-length")) {
var clname = response.caseless.has("content-length");
if (dest.setHeader) {
dest.setHeader(clname, response.headers[clname]);
} else {
dest.headers[clname] = response.headers[clname];
}
}
}
if (dest.setHeader && !dest.headersSent) {
for (var i in response.headers) {
if (!self2.gzip || i !== "content-encoding") {
dest.setHeader(i, response.headers[i]);
}
}
dest.statusCode = response.statusCode;
}
if (self2.pipefilter) {
self2.pipefilter(response, dest);
}
};
Request.prototype.qs = function(q2, clobber) {
var self2 = this;
var base;
if (!clobber && self2.uri.query) {
base = self2._qs.parse(self2.uri.query);
} else {
base = {};
}
for (var i in q2) {
base[i] = q2[i];
}
var qs = self2._qs.stringify(base);
if (qs === "") {
return self2;
}
self2.uri = url.parse(self2.uri.href.split("?")[0] + "?" + qs);
self2.url = self2.uri;
self2.path = self2.uri.path;
if (self2.uri.host === "unix") {
self2.enableUnixSocket();
}
return self2;
};
Request.prototype.form = function(form) {
var self2 = this;
if (form) {
if (!/^application\/x-www-form-urlencoded\b/.test(self2.getHeader("content-type"))) {
self2.setHeader("content-type", "application/x-www-form-urlencoded");
}
self2.body = typeof form === "string" ? self2._qs.rfc3986(form.toString("utf8")) : self2._qs.stringify(form).toString("utf8");
return self2;
}
self2._form = new FormData();
self2._form.on("error", function(err) {
err.message = "form-data: " + err.message;
self2.emit("error", err);
self2.abort();
});
return self2._form;
};
Request.prototype.multipart = function(multipart) {
var self2 = this;
self2._multipart.onRequest(multipart);
if (!self2._multipart.chunked) {
self2.body = self2._multipart.body;
}
return self2;
};
Request.prototype.json = function(val) {
var self2 = this;
if (!self2.hasHeader("accept")) {
self2.setHeader("accept", "application/json");
}
if (typeof self2.jsonReplacer === "function") {
self2._jsonReplacer = self2.jsonReplacer;
}
self2._json = true;
if (typeof val === "boolean") {
if (self2.body !== void 0) {
if (!/^application\/x-www-form-urlencoded\b/.test(self2.getHeader("content-type"))) {
self2.body = safeStringify(self2.body, self2._jsonReplacer);
} else {
self2.body = self2._qs.rfc3986(self2.body);
}
if (!self2.hasHeader("content-type")) {
self2.setHeader("content-type", "application/json");
}
}
} else {
self2.body = safeStringify(val, self2._jsonReplacer);
if (!self2.hasHeader("content-type")) {
self2.setHeader("content-type", "application/json");
}
}
if (typeof self2.jsonReviver === "function") {
self2._jsonReviver = self2.jsonReviver;
}
return self2;
};
Request.prototype.getHeader = function(name, headers) {
var self2 = this;
var result, re, match;
if (!headers) {
headers = self2.headers;
}
Object.keys(headers).forEach(function(key) {
if (key.length !== name.length) {
return;
}
re = new RegExp(name, "i");
match = key.match(re);
if (match) {
result = headers[key];
}
});
return result;
};
Request.prototype.enableUnixSocket = function() {
var unixParts = this.uri.path.split(":");
var host = unixParts[0];
var path3 = unixParts[1];
this.socketPath = host;
this.uri.pathname = path3;
this.uri.path = path3;
this.uri.host = host;
this.uri.hostname = host;
this.uri.isUnix = true;
};
Request.prototype.auth = function(user, pass, sendImmediately, bearer) {
var self2 = this;
self2._auth.onRequest(user, pass, sendImmediately, bearer);
return self2;
};
Request.prototype.aws = function(opts, now2) {
var self2 = this;
if (!now2) {
self2._aws = opts;
return self2;
}
if (opts.sign_version === 4 || opts.sign_version === "4") {
var options = {
host: self2.uri.host,
path: self2.uri.path,
method: self2.method,
headers: self2.headers,
body: self2.body
};
if (opts.service) {
options.service = opts.service;
}
var signRes = aws4.sign(options, {
accessKeyId: opts.key,
secretAccessKey: opts.secret,
sessionToken: opts.session
});
self2.setHeader("authorization", signRes.headers.Authorization);
self2.setHeader("x-amz-date", signRes.headers["X-Amz-Date"]);
if (signRes.headers["X-Amz-Security-Token"]) {
self2.setHeader("x-amz-security-token", signRes.headers["X-Amz-Security-Token"]);
}
} else {
var date = new Date();
self2.setHeader("date", date.toUTCString());
var auth = {
key: opts.key,
secret: opts.secret,
verb: self2.method.toUpperCase(),
date,
contentType: self2.getHeader("content-type") || "",
md5: self2.getHeader("content-md5") || "",
amazonHeaders: aws2.canonicalizeHeaders(self2.headers)
};
var path3 = self2.uri.path;
if (opts.bucket && path3) {
auth.resource = "/" + opts.bucket + path3;
} else if (opts.bucket && !path3) {
auth.resource = "/" + opts.bucket;
} else if (!opts.bucket && path3) {
auth.resource = path3;
} else if (!opts.bucket && !path3) {
auth.resource = "/";
}
auth.resource = aws2.canonicalizeResource(auth.resource);
self2.setHeader("authorization", aws2.authorization(auth));
}
return self2;
};
Request.prototype.httpSignature = function(opts) {
var self2 = this;
httpSignature.signRequest({
getHeader: function(header) {
return self2.getHeader(header, self2.headers);
},
setHeader: function(header, value) {
self2.setHeader(header, value);
},
method: self2.method,
path: self2.path
}, opts);
debug("httpSignature authorization", self2.getHeader("authorization"));
return self2;
};
Request.prototype.hawk = function(opts) {
var self2 = this;
self2.setHeader("Authorization", hawk.header(self2.uri, self2.method, opts));
};
Request.prototype.oauth = function(_oauth) {
var self2 = this;
self2._oauth.onRequest(_oauth);
return self2;
};
Request.prototype.jar = function(jar) {
var self2 = this;
var cookies2;
if (self2._redirect.redirectsFollowed === 0) {
self2.originalCookieHeader = self2.getHeader("cookie");
}
if (!jar) {
cookies2 = false;
self2._disableCookies = true;
} else {
var targetCookieJar = jar.getCookieString ? jar : globalCookieJar;
var urihref = self2.uri.href;
if (targetCookieJar) {
cookies2 = targetCookieJar.getCookieString(urihref);
}
}
if (cookies2 && cookies2.length) {
if (self2.originalCookieHeader) {
self2.setHeader("cookie", self2.originalCookieHeader + "; " + cookies2);
} else {
self2.setHeader("cookie", cookies2);
}
}
self2._jar = jar;
return self2;
};
Request.prototype.pipe = function(dest, opts) {
var self2 = this;
if (self2.response) {
if (self2._destdata) {
self2.emit("error", new Error("You cannot pipe after data has been emitted from the response."));
} else if (self2._ended) {
self2.emit("error", new Error("You cannot pipe after the response has been ended."));
} else {
stream.Stream.prototype.pipe.call(self2, dest, opts);
self2.pipeDest(dest);
return dest;
}
} else {
self2.dests.push(dest);
stream.Stream.prototype.pipe.call(self2, dest, opts);
return dest;
}
};
Request.prototype.write = function() {
var self2 = this;
if (self2._aborted) {
return;
}
if (!self2._started) {
self2.start();
}
if (self2.req) {
return self2.req.write.apply(self2.req, arguments);
}
};
Request.prototype.end = function(chunk) {
var self2 = this;
if (self2._aborted) {
return;
}
if (chunk) {
self2.write(chunk);
}
if (!self2._started) {
self2.start();
}
if (self2.req) {
self2.req.end();
}
};
Request.prototype.pause = function() {
var self2 = this;
if (!self2.responseContent) {
self2._paused = true;
} else {
self2.responseContent.pause.apply(self2.responseContent, arguments);
}
};
Request.prototype.resume = function() {
var self2 = this;
if (!self2.responseContent) {
self2._paused = false;
} else {
self2.responseContent.resume.apply(self2.responseContent, arguments);
}
};
Request.prototype.destroy = function() {
var self2 = this;
this.clearTimeout();
if (!self2._ended) {
self2.end();
} else if (self2.response) {
self2.response.destroy();
}
};
Request.prototype.clearTimeout = function() {
if (this.timeoutTimer) {
clearTimeout(this.timeoutTimer);
this.timeoutTimer = null;
}
};
Request.defaultProxyHeaderWhiteList = Tunnel.defaultProxyHeaderWhiteList.slice();
Request.defaultProxyHeaderExclusiveList = Tunnel.defaultProxyHeaderExclusiveList.slice();
Request.prototype.toJSON = requestToJSON;
module2.exports = Request;
}
});
// node_modules/request/index.js
var require_request3 = __commonJS({
"node_modules/request/index.js"(exports, module2) {
"use strict";
var extend = require_extend();
var cookies = require_cookies();
var helpers = require_helpers();
var paramsHaveRequestBody = helpers.paramsHaveRequestBody;
function initParams(uri, options, callback) {
if (typeof options === "function") {
callback = options;
}
var params = {};
if (options !== null && typeof options === "object") {
extend(params, options, { uri });
} else if (typeof uri === "string") {
extend(params, { uri });
} else {
extend(params, uri);
}
params.callback = callback || params.callback;
return params;
}
function request2(uri, options, callback) {
if (typeof uri === "undefined") {
throw new Error("undefined is not a valid uri or options object.");
}
var params = initParams(uri, options, callback);
if (params.method === "HEAD" && paramsHaveRequestBody(params)) {
throw new Error("HTTP HEAD requests MUST NOT include a request body.");
}
return new request2.Request(params);
}
function verbFunc(verb) {
var method = verb.toUpperCase();
return function(uri, options, callback) {
var params = initParams(uri, options, callback);
params.method = method;
return request2(params, params.callback);
};
}
request2.get = verbFunc("get");
request2.head = verbFunc("head");
request2.options = verbFunc("options");
request2.post = verbFunc("post");
request2.put = verbFunc("put");
request2.patch = verbFunc("patch");
request2.del = verbFunc("delete");
request2["delete"] = verbFunc("delete");
request2.jar = function(store) {
return cookies.jar(store);
};
request2.cookie = function(str) {
return cookies.parse(str);
};
function wrapRequestMethod(method, options, requester, verb) {
return function(uri, opts, callback) {
var params = initParams(uri, opts, callback);
var target = {};
extend(true, target, options, params);
target.pool = params.pool || options.pool;
if (verb) {
target.method = verb.toUpperCase();
}
if (typeof requester === "function") {
method = requester;
}
return method(target, target.callback);
};
}
request2.defaults = function(options, requester) {
var self2 = this;
options = options || {};
if (typeof options === "function") {
requester = options;
options = {};
}
var defaults = wrapRequestMethod(self2, options, requester);
var verbs = ["get", "head", "post", "put", "patch", "del", "delete"];
verbs.forEach(function(verb) {
defaults[verb] = wrapRequestMethod(self2[verb], options, requester, verb);
});
defaults.cookie = wrapRequestMethod(self2.cookie, options, requester);
defaults.jar = self2.jar;
defaults.defaults = self2.defaults;
return defaults;
};
request2.forever = function(agentOptions, optionsArg) {
var options = {};
if (optionsArg) {
extend(options, optionsArg);
}
if (agentOptions) {
options.agentOptions = agentOptions;
}
options.forever = true;
return request2.defaults(options);
};
module2.exports = request2;
request2.Request = require_request2();
request2.initParams = initParams;
Object.defineProperty(request2, "debug", {
enumerable: true,
get: function() {
return request2.Request.debug;
},
set: function(debug) {
request2.Request.debug = debug;
}
});
}
});
// node_modules/isexe/windows.js
var require_windows = __commonJS({
"node_modules/isexe/windows.js"(exports, module2) {
module2.exports = isexe;
isexe.sync = sync2;
var fs4 = require("fs");
function checkPathExt(path3, options) {
var pathext = options.pathExt !== void 0 ? options.pathExt : process.env.PATHEXT;
if (!pathext) {
return true;
}
pathext = pathext.split(";");
if (pathext.indexOf("") !== -1) {
return true;
}
for (var i = 0; i < pathext.length; i++) {
var p = pathext[i].toLowerCase();
if (p && path3.substr(-p.length).toLowerCase() === p) {
return true;
}
}
return false;
}
function checkStat(stat, path3, options) {
if (!stat.isSymbolicLink() && !stat.isFile()) {
return false;
}
return checkPathExt(path3, options);
}
function isexe(path3, options, cb) {
fs4.stat(path3, function(er, stat) {
cb(er, er ? false : checkStat(stat, path3, options));
});
}
function sync2(path3, options) {
return checkStat(fs4.statSync(path3), path3, options);
}
}
});
// node_modules/isexe/mode.js
var require_mode = __commonJS({
"node_modules/isexe/mode.js"(exports, module2) {
module2.exports = isexe;
isexe.sync = sync2;
var fs4 = require("fs");
function isexe(path3, options, cb) {
fs4.stat(path3, function(er, stat) {
cb(er, er ? false : checkStat(stat, options));
});
}
function sync2(path3, options) {
return checkStat(fs4.statSync(path3), options);
}
function checkStat(stat, options) {
return stat.isFile() && checkMode(stat, options);
}
function checkMode(stat, options) {
var mod = stat.mode;
var uid = stat.uid;
var gid = stat.gid;
var myUid = options.uid !== void 0 ? options.uid : process.getuid && process.getuid();
var myGid = options.gid !== void 0 ? options.gid : process.getgid && process.getgid();
var u = parseInt("100", 8);
var g = parseInt("010", 8);
var o = parseInt("001", 8);
var ug = u | g;
var ret = mod & o || mod & g && gid === myGid || mod & u && uid === myUid || mod & ug && myUid === 0;
return ret;
}
}
});
// node_modules/isexe/index.js
var require_isexe = __commonJS({
"node_modules/isexe/index.js"(exports, module2) {
var fs4 = require("fs");
var core;
if (process.platform === "win32" || global.TESTING_WINDOWS) {
core = require_windows();
} else {
core = require_mode();
}
module2.exports = isexe;
isexe.sync = sync2;
function isexe(path3, options, cb) {
if (typeof options === "function") {
cb = options;
options = {};
}
if (!cb) {
if (typeof Promise !== "function") {
throw new TypeError("callback not provided");
}
return new Promise(function(resolve, reject) {
isexe(path3, options || {}, function(er, is) {
if (er) {
reject(er);
} else {
resolve(is);
}
});
});
}
core(path3, options || {}, function(er, is) {
if (er) {
if (er.code === "EACCES" || options && options.ignoreErrors) {
er = null;
is = false;
}
}
cb(er, is);
});
}
function sync2(path3, options) {
try {
return core.sync(path3, options || {});
} catch (er) {
if (options && options.ignoreErrors || er.code === "EACCES") {
return false;
} else {
throw er;
}
}
}
}
});
// node_modules/which/which.js
var require_which = __commonJS({
"node_modules/which/which.js"(exports, module2) {
var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys";
var path3 = require("path");
var COLON = isWindows ? ";" : ":";
var isexe = require_isexe();
var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" });
var getPathInfo = (cmd, opt) => {
const colon = opt.colon || COLON;
const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [""] : [
...isWindows ? [process.cwd()] : [],
...(opt.path || process.env.PATH || "").split(colon)
];
const pathExtExe = isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : "";
const pathExt = isWindows ? pathExtExe.split(colon) : [""];
if (isWindows) {
if (cmd.indexOf(".") !== -1 && pathExt[0] !== "")
pathExt.unshift("");
}
return {
pathEnv,
pathExt,
pathExtExe
};
};
var which2 = (cmd, opt, cb) => {
if (typeof opt === "function") {
cb = opt;
opt = {};
}
if (!opt)
opt = {};
const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
const found = [];
const step = (i) => new Promise((resolve, reject) => {
if (i === pathEnv.length)
return opt.all && found.length ? resolve(found) : reject(getNotFoundError(cmd));
const ppRaw = pathEnv[i];
const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
const pCmd = path3.join(pathPart, cmd);
const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
resolve(subStep(p, i, 0));
});
const subStep = (p, i, ii) => new Promise((resolve, reject) => {
if (ii === pathExt.length)
return resolve(step(i + 1));
const ext = pathExt[ii];
isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
if (!er && is) {
if (opt.all)
found.push(p + ext);
else
return resolve(p + ext);
}
return resolve(subStep(p, i, ii + 1));
});
});
return cb ? step(0).then((res) => cb(null, res), cb) : step(0);
};
var whichSync = (cmd, opt) => {
opt = opt || {};
const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
const found = [];
for (let i = 0; i < pathEnv.length; i++) {
const ppRaw = pathEnv[i];
const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
const pCmd = path3.join(pathPart, cmd);
const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
for (let j = 0; j < pathExt.length; j++) {
const cur = p + pathExt[j];
try {
const is = isexe.sync(cur, { pathExt: pathExtExe });
if (is) {
if (opt.all)
found.push(cur);
else
return cur;
}
} catch (ex) {
}
}
}
if (opt.all && found.length)
return found;
if (opt.nothrow)
return null;
throw getNotFoundError(cmd);
};
module2.exports = which2;
which2.sync = whichSync;
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => WakaTime
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
var child_process3 = __toESM(require("child_process"));
// src/options.ts
var path = __toESM(require("path"));
var fs2 = __toESM(require("fs"));
var child_process = __toESM(require("child_process"));
// src/utils.ts
var Utils = class {
static quote(str) {
if (str.includes(" "))
return `"${str.replace('"', '\\"')}"`;
return str;
}
static apiKeyInvalid(key) {
const err = "Invalid api key... check https://wakatime.com/settings for your key";
if (!key)
return err;
const re = new RegExp("^(waka_)?[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$", "i");
if (!re.test(key))
return err;
return "";
}
static validateProxy(proxy) {
if (!proxy)
return "";
let re;
if (proxy.indexOf("\\") === -1) {
re = new RegExp("^((https?|socks5)://)?([^:@]+(:([^:@])+)?@)?[\\w\\.-]+(:\\d+)?$", "i");
} else {
re = new RegExp("^.*\\\\.+$", "i");
}
if (!re.test(proxy))
return "Invalid proxy. Valid formats are https://user:pass@host:port or socks5://user:pass@host:port or domain\\user:pass";
return "";
}
static formatDate(date) {
const months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
let ampm = "AM";
let hour = date.getHours();
if (hour > 11) {
ampm = "PM";
hour = hour - 12;
}
if (hour == 0) {
hour = 12;
}
const minute = date.getMinutes();
return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()} ${hour}:${minute < 10 ? `0${minute}` : minute} ${ampm}`;
}
static obfuscateKey(key) {
let newKey = "";
if (key) {
newKey = key;
if (key.length > 4)
newKey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX" + key.substring(key.length - 4);
}
return newKey;
}
static wrapArg(arg) {
if (arg.indexOf(" ") > -1)
return '"' + arg.replace(/"/g, '\\"') + '"';
return arg;
}
static formatArguments(binary, args) {
const clone = args.slice(0);
clone.unshift(this.wrapArg(binary));
const newCmds = [];
let lastCmd = "";
for (let i = 0; i < clone.length; i++) {
if (lastCmd == "--key")
newCmds.push(this.wrapArg(this.obfuscateKey(clone[i])));
else
newCmds.push(this.wrapArg(clone[i]));
lastCmd = clone[i];
}
return newCmds.join(" ");
}
};
// src/desktop.ts
var fs = __toESM(require("fs"));
var os = __toESM(require("os"));
var Desktop = class {
static isWindows() {
return os.platform() === "win32";
}
static getHomeDirectory() {
const home = process.env.WAKATIME_HOME;
if (home && home.trim() && fs.existsSync(home.trim()))
return home.trim();
return process.env[this.isWindows() ? "USERPROFILE" : "HOME"] || process.cwd();
}
static buildOptions() {
const options = {
windowsHide: true
};
if (!this.isWindows() && !process.env.WAKATIME_HOME && !process.env.HOME) {
options["env"] = { ...process.env, WAKATIME_HOME: this.getHomeDirectory() };
}
return options;
}
};
// src/options.ts
var Options = class {
constructor(logger) {
this.cache = {};
const wakaHome = Desktop.getHomeDirectory();
this.configFile = path.join(wakaHome, ".wakatime.cfg");
this.internalConfigFile = path.join(wakaHome, ".wakatime-internal.cfg");
this.logFile = path.join(wakaHome, ".wakatime.log");
this.logger = logger;
}
async getSettingAsync(section, key) {
return new Promise((resolve, reject) => {
this.getSetting(section, key, false, (setting) => {
setting.error ? reject(setting.error) : resolve(setting.value);
});
});
}
getSetting(section, key, internal, callback) {
fs2.readFile(this.getConfigFile(internal), "utf-8", (err, content) => {
if (err) {
callback({
error: new Error(`could not read ${this.getConfigFile(internal)}`),
key,
value: ""
});
} else {
let currentSection = "";
const lines = content.split("\n");
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (this.startsWith(line.trim(), "[") && this.endsWith(line.trim(), "]")) {
currentSection = line.trim().substring(1, line.trim().length - 1).toLowerCase();
} else if (currentSection === section) {
const parts = line.split("=");
const currentKey = parts[0].trim();
if (currentKey === key && parts.length > 1) {
callback({ key, value: this.removeNulls(parts[1].trim()) });
return;
}
}
}
callback({ key, value: "" });
}
});
}
setSetting(section, key, val, internal) {
const configFile = this.getConfigFile(internal);
fs2.readFile(configFile, "utf-8", (err, content) => {
if (err)
content = "";
const contents = [];
let currentSection = "";
let found = false;
const lines = content.split("\n");
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (this.startsWith(line.trim(), "[") && this.endsWith(line.trim(), "]")) {
if (currentSection === section && !found) {
contents.push(this.removeNulls(key + " = " + val));
found = true;
}
currentSection = line.trim().substring(1, line.trim().length - 1).toLowerCase();
contents.push(this.removeNulls(line));
} else if (currentSection === section) {
const parts = line.split("=");
const currentKey = parts[0].trim();
if (currentKey === key) {
if (!found) {
contents.push(this.removeNulls(key + " = " + val));
found = true;
}
} else {
contents.push(this.removeNulls(line));
}
} else {
contents.push(this.removeNulls(line));
}
}
if (!found) {
if (currentSection !== section) {
contents.push("[" + section + "]");
}
contents.push(this.removeNulls(key + " = " + val));
}
fs2.writeFile(configFile, contents.join("\n"), (err2) => {
if (err2)
throw err2;
});
});
}
setSettings(section, settings, internal) {
const configFile = this.getConfigFile(internal);
fs2.readFile(configFile, "utf-8", (err, content) => {
if (err)
content = "";
const contents = [];
let currentSection = "";
const found = {};
const lines = content.split("\n");
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (this.startsWith(line.trim(), "[") && this.endsWith(line.trim(), "]")) {
if (currentSection === section) {
settings.forEach((setting) => {
if (!found[setting.key]) {
contents.push(this.removeNulls(setting.key + " = " + setting.value));
found[setting.key] = true;
}
});
}
currentSection = line.trim().substring(1, line.trim().length - 1).toLowerCase();
contents.push(this.removeNulls(line));
} else if (currentSection === section) {
const parts = line.split("=");
const currentKey = parts[0].trim();
let keepLineUnchanged = true;
settings.forEach((setting) => {
if (currentKey === setting.key) {
keepLineUnchanged = false;
if (!found[setting.key]) {
contents.push(this.removeNulls(setting.key + " = " + setting.value));
found[setting.key] = true;
}
}
});
if (keepLineUnchanged) {
contents.push(this.removeNulls(line));
}
} else {
contents.push(this.removeNulls(line));
}
}
settings.forEach((setting) => {
if (!found[setting.key]) {
if (currentSection !== section) {
contents.push("[" + section + "]");
currentSection = section;
}
contents.push(this.removeNulls(setting.key + " = " + setting.value));
found[setting.key] = true;
}
});
fs2.writeFile(configFile, contents.join("\n"), (err2) => {
if (err2)
throw err2;
});
});
}
getConfigFile(internal) {
return internal ? this.internalConfigFile : this.configFile;
}
getLogFile() {
return this.logFile;
}
async getApiKeyAsync() {
if (!Utils.apiKeyInvalid(this.cache.api_key)) {
return this.cache.api_key;
}
try {
const apiKeyFromVault = await this.getApiKeyFromVaultCmd();
if (!Utils.apiKeyInvalid(apiKeyFromVault)) {
this.cache.api_key = apiKeyFromVault;
return this.cache.api_key;
}
} catch (err) {
}
try {
const apiKey = await this.getSettingAsync("settings", "api_key");
if (!Utils.apiKeyInvalid(apiKey))
this.cache.api_key = apiKey;
return apiKey;
} catch (err) {
this.logger.debug(`Exception while reading API Key from config file: ${err}`);
return "";
}
}
async getApiKeyFromVaultCmd() {
try {
const apiKeyCmd = await this.getSettingAsync("settings", "api_key_vault_cmd");
if (!apiKeyCmd)
return "";
const options = Desktop.buildOptions();
const proc = child_process.spawn(apiKeyCmd, options);
let stdout = "";
for await (const chunk of proc.stdout) {
stdout += chunk;
}
let stderr = "";
for await (const chunk of proc.stderr) {
stderr += chunk;
}
const exitCode = await new Promise((resolve) => {
proc.on("close", resolve);
});
if (exitCode)
this.logger.warn(`api key vault command error (${exitCode}): ${stderr}`);
else if (stderr && stderr.trim())
this.logger.warn(stderr.trim());
const apiKey = stdout.toString().trim();
return apiKey;
} catch (err) {
this.logger.debug(`Exception while reading API Key Vault Cmd from config file: ${err}`);
return "";
}
}
getApiKey(callback) {
this.getApiKeyAsync().then((apiKey) => {
if (!Utils.apiKeyInvalid(apiKey)) {
callback(apiKey);
} else {
callback(null);
}
}).catch((err) => {
this.logger.warn(`Unable to get api key: ${err}`);
callback(null);
});
}
hasApiKey(callback) {
this.getApiKeyAsync().then((apiKey) => callback(!Utils.apiKeyInvalid(apiKey))).catch((err) => {
this.logger.warn(`Unable to check for api key: ${err}`);
callback(false);
});
}
startsWith(outer, inner) {
return outer.slice(0, inner.length) === inner;
}
endsWith(outer, inner) {
return inner === "" || outer.slice(-inner.length) === inner;
}
removeNulls(s) {
return s.replace(/\0/g, "");
}
};
// src/constants.ts
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
return LogLevel2;
})(LogLevel || {});
// src/logger.ts
var Logger = class {
constructor(level) {
this.setLevel(level);
}
getLevel() {
return this.level;
}
setLevel(level) {
this.level = level;
}
log(level, msg) {
if (level >= this.level) {
msg = `[WakaTime][${LogLevel[level]}] ${msg}`;
if (level == 0 /* DEBUG */)
console.log(msg);
if (level == 1 /* INFO */)
console.info(msg);
if (level == 2 /* WARN */)
console.warn(msg);
if (level == 3 /* ERROR */)
console.error(msg);
}
}
debug(msg) {
this.log(0 /* DEBUG */, msg);
}
info(msg) {
this.log(1 /* INFO */, msg);
}
warn(msg) {
this.log(2 /* WARN */, msg);
}
warnException(msg) {
if (msg.message !== void 0) {
this.log(2 /* WARN */, msg.message);
}
}
error(msg) {
this.log(3 /* ERROR */, msg);
}
errorException(msg) {
if (msg.message !== void 0) {
this.log(3 /* ERROR */, msg.message);
}
}
};
// src/dependencies.ts
var import_adm_zip = __toESM(require_adm_zip());
var child_process2 = __toESM(require("child_process"));
var fs3 = __toESM(require("fs"));
var os2 = __toESM(require("os"));
var path2 = __toESM(require("path"));
var request = __toESM(require_request3());
var which = __toESM(require_which());
var Dependencies = class {
constructor(options, logger) {
this.resourcesLocation = void 0;
this.cliLocation = void 0;
this.cliLocationGlobal = void 0;
this.cliInstalled = false;
this.githubDownloadPrefix = "https://github.com/wakatime/wakatime-cli/releases/download";
this.githubReleasesStableUrl = "https://api.github.com/repos/wakatime/wakatime-cli/releases/latest";
this.githubReleasesAlphaUrl = "https://api.github.com/repos/wakatime/wakatime-cli/releases?per_page=1";
this.latestCliVersion = "";
this.options = options;
this.logger = logger;
}
getResourcesLocation() {
if (this.resourcesLocation)
return this.resourcesLocation;
const folder = path2.join(Desktop.getHomeDirectory(), ".wakatime");
try {
fs3.mkdirSync(folder, { recursive: true });
this.resourcesLocation = folder;
} catch (e) {
this.resourcesLocation = "./.wakatime";
}
return this.resourcesLocation;
}
getCliLocation() {
if (this.cliLocation)
return this.cliLocation;
this.cliLocation = this.getCliLocationGlobal();
if (this.cliLocation)
return this.cliLocation;
const ext = Desktop.isWindows() ? ".exe" : "";
let osname = os2.platform();
if (osname == "win32")
osname = "windows";
const arch2 = this.architecture();
this.cliLocation = path2.join(this.getResourcesLocation(), `wakatime-cli-${osname}-${arch2}${ext}`);
return this.cliLocation;
}
getCliLocationGlobal() {
if (this.cliLocationGlobal)
return this.cliLocationGlobal;
const binaryName = `wakatime-cli${Desktop.isWindows() ? ".exe" : ""}`;
const path3 = which.sync(binaryName, { nothrow: true });
if (path3) {
this.cliLocationGlobal = path3;
this.logger.debug(`Using global wakatime-cli location: ${path3}`);
}
return this.cliLocationGlobal;
}
isCliInstalled() {
if (this.cliInstalled)
return true;
this.cliInstalled = fs3.existsSync(this.getCliLocation());
return this.cliInstalled;
}
checkAndInstallCli(callback) {
if (!this.isCliInstalled()) {
this.installCli(callback);
} else {
this.isCliLatest((isLatest) => {
if (!isLatest) {
this.installCli(callback);
} else {
callback();
}
});
}
}
isCliLatest(callback) {
if (this.getCliLocationGlobal()) {
callback(true);
return;
}
const args = ["--version"];
const options = Desktop.buildOptions();
try {
child_process2.execFile(this.getCliLocation(), args, options, (error, _stdout, stderr) => {
if (!(error != null)) {
const currentVersion = _stdout.toString().trim() + stderr.toString().trim();
this.logger.debug(`Current wakatime-cli version is ${currentVersion}`);
this.logger.debug("Checking for updates to wakatime-cli...");
this.getLatestCliVersion((latestVersion) => {
if (currentVersion === latestVersion) {
this.logger.debug("wakatime-cli is up to date");
callback(true);
} else if (latestVersion) {
this.logger.debug(`Found an updated wakatime-cli ${latestVersion}`);
callback(false);
} else {
this.logger.debug("Unable to find latest wakatime-cli version");
callback(false);
}
});
} else {
callback(false);
}
});
} catch (e) {
callback(false);
}
}
getLatestCliVersion(callback) {
if (this.latestCliVersion) {
callback(this.latestCliVersion);
return;
}
this.options.getSetting("settings", "proxy", false, (proxy) => {
this.options.getSetting("settings", "no_ssl_verify", false, (noSSLVerify) => {
this.options.getSetting("internal", "cli_version_last_modified", true, (modified) => {
this.options.getSetting("internal", "cli_version", true, (version) => {
this.options.getSetting("settings", "alpha", false, (alpha) => {
const options = {
url: alpha.value == "true" ? this.githubReleasesAlphaUrl : this.githubReleasesStableUrl,
json: true,
headers: {
"User-Agent": "github.com/wakatime/vscode-wakatime"
}
};
if (proxy.value) {
this.logger.debug(`Using Proxy: ${proxy.value}`);
options["proxy"] = proxy.value;
}
if (noSSLVerify.value === "true")
options["strictSSL"] = false;
if (modified.value && version.value && options.headers)
options.headers["If-Modified-Since"] = modified.value;
try {
request.get(options, (error, response, json) => {
if (!error && response && (response.statusCode == 200 || response.statusCode == 304)) {
this.logger.debug(`GitHub API Response ${response.statusCode}`);
if (response.statusCode == 304) {
this.latestCliVersion = version.value;
callback(this.latestCliVersion);
return;
}
this.latestCliVersion = alpha.value == "true" ? json[0]["tag_name"] : json["tag_name"];
this.logger.debug(`Latest wakatime-cli version from GitHub: ${this.latestCliVersion}`);
const lastModified = response.headers["last-modified"];
if (lastModified && this.latestCliVersion) {
this.options.setSettings("internal", [
{ key: "cli_version", value: this.latestCliVersion },
{ key: "cli_version_last_modified", value: lastModified }
], true);
}
callback(this.latestCliVersion);
} else {
if (response) {
this.logger.warn(`GitHub API Response ${response.statusCode}: ${error}`);
} else {
this.logger.warn(`GitHub API Response Error: ${error}`);
}
callback("");
}
});
} catch (e) {
this.logger.warnException(e);
callback("");
}
});
});
});
});
});
}
installCli(callback) {
this.getLatestCliVersion((version) => {
if (!version) {
callback();
return;
}
this.logger.debug(`Downloading wakatime-cli ${version}...`);
const url = this.cliDownloadUrl(version);
const zipFile = path2.join(this.getResourcesLocation(), "wakatime-cli" + this.randStr() + ".zip");
this.downloadFile(url, zipFile, () => {
this.extractCli(zipFile, callback);
}, callback);
});
}
isSymlink(file) {
try {
return fs3.lstatSync(file).isSymbolicLink();
} catch (_) {
}
return false;
}
extractCli(zipFile, callback) {
this.logger.debug(`Extracting wakatime-cli into "${this.getResourcesLocation()}"...`);
this.removeCli(() => {
this.unzip(zipFile, this.getResourcesLocation(), () => {
if (!Desktop.isWindows()) {
const cli = this.getCliLocation();
try {
this.logger.debug("Chmod 755 wakatime-cli...");
fs3.chmodSync(cli, 493);
} catch (e) {
this.logger.warnException(e);
}
const ext = Desktop.isWindows() ? ".exe" : "";
const link = path2.join(this.getResourcesLocation(), `wakatime-cli${ext}`);
if (!this.isSymlink(link)) {
try {
this.logger.debug(`Create symlink from wakatime-cli to ${cli}`);
fs3.symlinkSync(cli, link);
} catch (e) {
this.logger.warnException(e);
try {
fs3.copyFileSync(cli, link);
fs3.chmodSync(link, 493);
} catch (e2) {
this.logger.warnException(e2);
}
}
}
}
callback();
});
this.logger.debug("Finished extracting wakatime-cli.");
});
}
removeCli(callback) {
if (fs3.existsSync(this.getCliLocation())) {
fs3.unlink(this.getCliLocation(), () => {
callback();
});
} else {
callback();
}
}
downloadFile(url, outputFile, callback, error) {
this.options.getSetting("settings", "proxy", false, (proxy) => {
this.options.getSetting("settings", "no_ssl_verify", false, (noSSLVerify) => {
const options = { url };
if (proxy.value) {
this.logger.debug(`Using Proxy: ${proxy.value}`);
options["proxy"] = proxy.value;
}
if (noSSLVerify.value === "true")
options["strictSSL"] = false;
try {
const r = request.get(options);
r.on("error", (e) => {
this.logger.warn(`Failed to download ${url}`);
this.logger.warn(e.toString());
error();
});
const out = fs3.createWriteStream(outputFile);
r.pipe(out);
r.on("end", () => {
out.on("finish", () => {
callback();
});
});
} catch (e) {
this.logger.warnException(e);
callback();
}
});
});
}
unzip(file, outputDir, callback) {
if (fs3.existsSync(file)) {
try {
const zip = new import_adm_zip.default(file);
zip.extractAllTo(outputDir, true);
} catch (e) {
this.logger.errorException(e);
} finally {
try {
fs3.unlink(file, () => {
callback();
});
} catch (e2) {
callback();
}
}
}
}
architecture() {
const arch2 = os2.arch();
if (arch2.indexOf("32") > -1)
return "386";
if (arch2.indexOf("x64") > -1)
return "amd64";
return arch2;
}
cliDownloadUrl(version) {
let osname = os2.platform();
if (osname == "win32")
osname = "windows";
const arch2 = this.architecture();
const validCombinations = [
"darwin-amd64",
"darwin-arm64",
"freebsd-386",
"freebsd-amd64",
"freebsd-arm",
"linux-386",
"linux-amd64",
"linux-arm",
"linux-arm64",
"netbsd-386",
"netbsd-amd64",
"netbsd-arm",
"openbsd-386",
"openbsd-amd64",
"openbsd-arm",
"openbsd-arm64",
"windows-386",
"windows-amd64",
"windows-arm64"
];
if (!validCombinations.includes(`${osname}-${arch2}`))
this.reportMissingPlatformSupport(osname, arch2);
return `${this.githubDownloadPrefix}/${version}/wakatime-cli-${osname}-${arch2}.zip`;
}
reportMissingPlatformSupport(osname, architecture) {
const url = `https://api.wakatime.com/api/v1/cli-missing?osname=${osname}&architecture=${architecture}&plugin=vscode`;
this.options.getSetting("settings", "proxy", false, (proxy) => {
this.options.getSetting("settings", "no_ssl_verify", false, (noSSLVerify) => {
const options = { url };
if (proxy.value)
options["proxy"] = proxy.value;
if (noSSLVerify.value === "true")
options["strictSSL"] = false;
try {
request.get(options);
} catch (e) {
}
});
});
}
randStr() {
return (Math.random() + 1).toString(36).substring(7);
}
};
// src/main.ts
var WakaTime = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
this.lastFetchToday = 0;
this.fetchTodayInterval = 6e4;
this.lastHeartbeat = 0;
}
async onload() {
this.logger = new Logger(1 /* INFO */);
this.options = new Options(this.logger);
this.addCommand({
id: "wakatime-api-key",
name: "WakaTime API Key",
callback: () => {
this.promptForApiKey();
}
});
this.options.getSetting("settings", "debug", false, (debug) => {
this.logger.setLevel(debug.value == "true" ? 0 /* DEBUG */ : 1 /* INFO */);
this.dependencies = new Dependencies(this.options, this.logger);
this.options.getSetting("settings", "disabled", false, (disabled) => {
this.disabled = disabled.value === "true";
if (this.disabled) {
return;
}
this.initializeDependencies();
});
});
}
onunload() {
}
initializeDependencies() {
this.logger.debug(`Initializing WakaTime v${this.manifest.version}`);
this.statusBar = this.addStatusBarItem();
this.options.getSetting("settings", "status_bar_enabled", false, (statusBarEnabled) => {
this.showStatusBar = statusBarEnabled.value !== "false";
this.updateStatusBarText("WakaTime Initializing...");
this.checkApiKey();
this.setupEventListeners();
this.options.getSetting("settings", "status_bar_coding_activity", false, (showCodingActivity) => {
this.showCodingActivity = showCodingActivity.value !== "false";
this.dependencies.checkAndInstallCli(() => {
this.logger.debug("WakaTime initialized");
this.updateStatusBarText();
this.updateStatusBarTooltip("WakaTime: Initialized");
this.getCodingActivity();
});
});
});
}
checkApiKey() {
this.options.hasApiKey((hasApiKey) => {
if (!hasApiKey)
this.promptForApiKey();
});
}
setupEventListeners() {
this.registerDomEvent(document, "click", (evt) => {
this.onEvent(false);
});
this.registerDomEvent(document, "keydown", (evt) => {
this.onEvent(false);
});
}
onEvent(isWrite) {
const view = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
if (!view)
return;
const activeFile = this.app.workspace.getActiveFile();
if (!activeFile)
return;
const cursor = view.editor.getCursor();
const file = `${this.app.vault.adapter.basePath}/${activeFile.path}`;
const time = Date.now();
if (isWrite || this.enoughTimePassed(time) || this.lastFile !== file) {
this.sendHeartbeat(file, time, cursor.line, cursor.ch, isWrite);
this.lastFile = file;
this.lastHeartbeat = time;
}
}
enoughTimePassed(time) {
return this.lastHeartbeat + 12e4 < time;
}
updateStatusBarText(text) {
if (!this.statusBar)
return;
if (!text) {
this.statusBar.setText("\u{1F552}");
} else {
this.statusBar.setText("\u{1F552} " + text);
}
}
updateStatusBarTooltip(tooltipText) {
if (!this.statusBar)
return;
this.statusBar.setAttr("title", tooltipText);
}
promptForApiKey() {
new ApiKeyModal(this.app, this.options).open();
}
sendHeartbeat(file, time, lineno, cursorpos, isWrite) {
this.options.getApiKey((apiKey) => {
if (!apiKey)
return;
this._sendHeartbeat(file, time, lineno, cursorpos, isWrite);
});
}
_sendHeartbeat(file, time, lineno, cursorpos, isWrite) {
if (!this.dependencies.isCliInstalled())
return;
const args = [];
args.push("--entity", Utils.quote(file));
const user_agent = "obsidian/" + import_obsidian.apiVersion + " obsidian-wakatime/" + this.manifest.version;
args.push("--plugin", Utils.quote(user_agent));
args.push("--lineno", String(lineno + 1));
args.push("--cursorpos", String(cursorpos + 1));
if (isWrite)
args.push("--write");
if (Desktop.isWindows()) {
args.push("--config", Utils.quote(this.options.getConfigFile(false)), "--log-file", Utils.quote(this.options.getLogFile()));
}
const binary = this.dependencies.getCliLocation();
this.logger.debug(`Sending heartbeat: ${Utils.formatArguments(binary, args)}`);
const options = Desktop.buildOptions();
const proc = child_process3.execFile(binary, args, options, (error, stdout, stderr) => {
if (error != null) {
if (stderr && stderr.toString() != "")
this.logger.error(stderr.toString());
if (stdout && stdout.toString() != "")
this.logger.error(stdout.toString());
this.logger.error(error.toString());
}
});
proc.on("close", (code, _signal) => {
if (code == 0) {
if (this.showStatusBar)
this.getCodingActivity();
this.logger.debug(`last heartbeat sent ${Utils.formatDate(new Date())}`);
} else if (code == 102 || code == 112) {
if (this.showStatusBar) {
if (!this.showCodingActivity)
this.updateStatusBarText();
this.updateStatusBarTooltip("WakaTime: working offline... coding activity will sync next time we are online");
}
this.logger.warn(`Working offline (${code}); Check your ${this.options.getLogFile()} file for more details`);
} else if (code == 103) {
const error_msg = `Config parsing error (103); Check your ${this.options.getLogFile()} file for more details`;
if (this.showStatusBar) {
this.updateStatusBarText("WakaTime Error");
this.updateStatusBarTooltip(`WakaTime: ${error_msg}`);
}
this.logger.error(error_msg);
} else if (code == 104) {
const error_msg = "Invalid Api Key (104); Make sure your Api Key is correct!";
if (this.showStatusBar) {
this.updateStatusBarText("WakaTime Error");
this.updateStatusBarTooltip(`WakaTime: ${error_msg}`);
}
this.logger.error(error_msg);
} else {
const error_msg = `Unknown Error (${code}); Check your ${this.options.getLogFile()} file for more details`;
if (this.showStatusBar) {
this.updateStatusBarText("WakaTime Error");
this.updateStatusBarTooltip(`WakaTime: ${error_msg}`);
}
this.logger.error(error_msg);
}
});
}
getCodingActivity() {
if (!this.showStatusBar) {
return;
}
if (this.lastFetchToday > 0 && this.lastFetchToday > this.lastHeartbeat)
return;
const cutoff = Date.now() - this.fetchTodayInterval;
if (this.lastFetchToday > cutoff)
return;
this.lastFetchToday = Date.now();
this.options.getApiKey((apiKey) => {
if (!apiKey)
return;
this._getCodingActivity();
});
}
_getCodingActivity() {
if (!this.dependencies.isCliInstalled())
return;
const user_agent = "obsidian/" + import_obsidian.apiVersion + " obsidian-wakatime/" + this.manifest.version;
const args = ["--today", "--plugin", Utils.quote(user_agent)];
if (Desktop.isWindows()) {
args.push("--config", Utils.quote(this.options.getConfigFile(false)), "--logfile", Utils.quote(this.options.getLogFile()));
}
const binary = this.dependencies.getCliLocation();
this.logger.debug(`Fetching coding activity for Today from api: ${Utils.formatArguments(binary, args)}`);
const options = Desktop.buildOptions();
const proc = child_process3.execFile(binary, args, options, (error, stdout, stderr) => {
if (error != null) {
if (stderr && stderr.toString() != "")
this.logger.error(stderr.toString());
if (stdout && stdout.toString() != "")
this.logger.error(stdout.toString());
this.logger.error(error.toString());
}
});
let output = "";
if (proc.stdout) {
proc.stdout.on("data", (data) => {
if (data)
output += data;
});
}
proc.on("close", (code, _signal) => {
if (code == 0) {
if (this.showStatusBar) {
if (output && output.trim()) {
if (this.showCodingActivity) {
this.updateStatusBarText(output.trim());
this.updateStatusBarTooltip("WakaTime: Today\u2019s coding time.");
} else {
this.updateStatusBarText();
this.updateStatusBarTooltip(output.trim());
}
} else {
this.updateStatusBarText();
this.updateStatusBarTooltip("WakaTime: Calculating time spent today in background...");
}
}
} else if (code == 102 || code == 112) {
} else {
const error_msg = `Error fetching today coding activity (${code}); Check your ${this.options.getLogFile()} file for more details`;
this.logger.debug(error_msg);
}
});
}
};
var ApiKeyModal = class extends import_obsidian.Modal {
constructor(app, options) {
if (ApiKeyModal.instance) {
return ApiKeyModal.instance;
}
super(app);
this.options = options;
ApiKeyModal.instance = this;
}
onOpen() {
const { contentEl } = this;
this.options.getSetting("settings", "api_key", false, (setting) => {
let defaultVal = setting.value;
if (Utils.apiKeyInvalid(defaultVal))
defaultVal = "";
contentEl.createEl("h2", { text: "Enter your WakaTime API Key" });
new import_obsidian.Setting(contentEl).addText((text) => {
text.setValue(defaultVal);
text.inputEl.addClass("api-key-input");
this.input = text;
});
new import_obsidian.Setting(contentEl).addButton((btn) => btn.setButtonText("Save").setCta().onClick(() => {
const val = this.input.getValue();
const invalid = Utils.apiKeyInvalid(val);
console.log(invalid);
if (!invalid) {
this.close();
this.options.setSetting("settings", "api_key", val, false);
}
}));
});
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
/*!
* Copyright 2010 LearnBoost <dev@learnboost.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*!
* Copyright (c) 2015, Salesforce.com, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of Salesforce.com nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*!
* Copyright (c) 2018, Salesforce.com, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of Salesforce.com nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*!
* mime-db
* Copyright(c) 2014 Jonathan Ong
* Copyright(c) 2015-2022 Douglas Christopher Wilson
* MIT Licensed
*/
/*!
* mime-types
* Copyright(c) 2014 Jonathan Ong
* Copyright(c) 2015 Douglas Christopher Wilson
* MIT Licensed
*/
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9maWxlU3lzdGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL3V0aWwvY29uc3RhbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL3V0aWwvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9mYXR0ci5qcyIsICJub2RlX21vZHVsZXMvYWRtLXppcC91dGlsL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL2hlYWRlcnMvZW50cnlIZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvaGVhZGVycy9tYWluSGVhZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL2hlYWRlcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvbWV0aG9kcy9kZWZsYXRlci5qcyIsICJub2RlX21vZHVsZXMvYWRtLXppcC9tZXRob2RzL2luZmxhdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL21ldGhvZHMvemlwY3J5cHRvLmpzIiwgIm5vZGVfbW9kdWxlcy9hZG0temlwL21ldGhvZHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvemlwRW50cnkuanMiLCAibm9kZV9tb2R1bGVzL2FkbS16aXAvemlwRmlsZS5qcyIsICJub2RlX21vZHVsZXMvYWRtLXppcC9hZG0temlwLmpzIiwgIm5vZGVfbW9kdWxlcy9leHRlbmQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3BzbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdG91Z2gtY29va2llL2xpYi9wdWJzdWZmaXgtcHNsLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3N0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3Blcm11dGVEb21haW4uanMiLCAibm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvcGF0aE1hdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL21lbXN0b3JlLmpzIiwgIm5vZGVfbW9kdWxlcy90b3VnaC1jb29raWUvbGliL3ZlcnNpb24uanMiLCAibm9kZV9tb2R1bGVzL3RvdWdoLWNvb2tpZS9saWIvY29va2llLmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2xpYi9jb29raWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9qc29uLXN0cmluZ2lmeS1zYWZlL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL2hlbHBlcnMuanMiLCAibm9kZV9tb2R1bGVzL2F3cy1zaWduMi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXdzNC9scnUuanMiLCAibm9kZV9tb2R1bGVzL2F3czQvYXdzNC5qcyIsICJub2RlX21vZHVsZXMvYXNzZXJ0LXBsdXMvYXNzZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9zYWZlci1idWZmZXIvc2FmZXIuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9hbGdzLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZXJyb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9hc24xL2xpYi9iZXIvZXJyb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9hc24xL2xpYi9iZXIvdHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL2FzbjEvbGliL2Jlci9yZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL2FzbjEvbGliL2Jlci93cml0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2FzbjEvbGliL2Jlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXNuMS9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2pzYm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VjYy1qc2JuL2xpYi9lYy5qcyIsICJub2RlX21vZHVsZXMvdHdlZXRuYWNsL25hY2wtZmFzdC5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvc3NoLWJ1ZmZlci5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL3NpZ25hdHVyZS5qcyIsICJub2RlX21vZHVsZXMvZWNjLWpzYm4vbGliL3NlYy5qcyIsICJub2RlX21vZHVsZXMvZWNjLWpzYm4vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9kaGUuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9lZC1jb21wYXQuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL3BrY3M4LmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9wa2NzMS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2Zvcm1hdHMvcmZjNDI1My5qcyIsICJub2RlX21vZHVsZXMvYmNyeXB0LXBia2RmL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9zc2gtcHJpdmF0ZS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2Zvcm1hdHMvcGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9zc2guanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL2Ruc3NlYy5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2Zvcm1hdHMvcHV0dHkuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL2F1dG8uanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9wcml2YXRlLWtleS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2lkZW50aXR5LmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvZm9ybWF0cy9vcGVuc3NoLWNlcnQuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL3g1MDkuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9mb3JtYXRzL3g1MDktcGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9zc2hway9saWIvY2VydGlmaWNhdGUuanMiLCAibm9kZV9tb2R1bGVzL3NzaHBrL2xpYi9maW5nZXJwcmludC5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2tleS5qcyIsICJub2RlX21vZHVsZXMvc3NocGsvbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXNpZ25hdHVyZS9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi9wYXJzZXIuanMiLCAibm9kZV9tb2R1bGVzL2V4dHNwcmludGYvbGliL2V4dHNwcmludGYuanMiLCAibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvdmVycm9yL2xpYi92ZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL2pzb24tc2NoZW1hL2xpYi92YWxpZGF0ZS5qcyIsICJub2RlX21vZHVsZXMvanNwcmltL2xpYi9qc3ByaW0uanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi9zaWduZXIuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi92ZXJpZnkuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtc2lnbmF0dXJlL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWltZS1kYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbWltZS10eXBlcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2FzZWxlc3MvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2ZvcmV2ZXItYWdlbnQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3Qvbm9kZV9tb2R1bGVzL2Zvcm0tZGF0YS9saWIvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvaXNzdHJlYW0vaXNzdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL2lzLXR5cGVkYXJyYXkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL2dldFByb3h5RnJvbVVSSS5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL3F1ZXJ5c3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL2luZGV4LnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3NjaGVtZXMvdXJuLXV1aWQudHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy91cm4udHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy9tYWlsdG8udHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy93c3MudHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9zcmMvc2NoZW1lcy93cy50cyIsICJub2RlX21vZHVsZXMvdXJpLWpzL3NyYy9zY2hlbWVzL2h0dHBzLnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3NjaGVtZXMvaHR0cC50cyIsICJub2RlX21vZHVsZXMvdXJpLWpzL3NyYy91cmkudHMiLCAibm9kZV9tb2R1bGVzL3VyaS1qcy9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuZXM2LmpzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3JlZ2V4cHMtaXJpLnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3JlZ2V4cHMtdXJpLnRzIiwgIm5vZGVfbW9kdWxlcy91cmktanMvc3JjL3V0aWwudHMiLCAibm9kZV9tb2R1bGVzL2Zhc3QtZGVlcC1lcXVhbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL3VjczJsZW5ndGguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvc2NoZW1hX29iai5qcyIsICJub2RlX21vZHVsZXMvanNvbi1zY2hlbWEtdHJhdmVyc2UvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9yZXNvbHZlLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2NvbXBpbGUvZXJyb3JfY2xhc3Nlcy5qcyIsICJub2RlX21vZHVsZXMvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvdmFsaWRhdGUuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jYWNoZS5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL2Zvcm1hdHMuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvcmVmLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2FsbE9mLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2FueU9mLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2NvbW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvY29uc3QuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvY29udGFpbnMuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvZGVwZW5kZW5jaWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2VudW0uanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvZm9ybWF0LmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2lmLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL2l0ZW1zLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL19saW1pdC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9fbGltaXRJdGVtcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9fbGltaXRMZW5ndGguanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvX2xpbWl0UHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9tdWx0aXBsZU9mLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL25vdC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9vbmVPZi5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9wYXR0ZXJuLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RvdGpzL3Byb3BlcnRpZXMuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZG90anMvcHJvcGVydHlOYW1lcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9yZXF1aXJlZC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy91bmlxdWVJdGVtcy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9jb21waWxlL3J1bGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9hanYvbGliL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvY29tcGlsZS9hc3luYy5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9kb3Rqcy9jdXN0b20uanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIvZGVmaW5pdGlvbl9zY2hlbWEuanMiLCAibm9kZV9tb2R1bGVzL2Fqdi9saWIva2V5d29yZC5qcyIsICJub2RlX21vZHVsZXMvYWp2L2xpYi9hanYuanMiLCAibm9kZV9tb2R1bGVzL2hhci12YWxpZGF0b3IvbGliL2Vycm9yLmpzIiwgIm5vZGVfbW9kdWxlcy9oYXItc2NoZW1hL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaGFyLXZhbGlkYXRvci9saWIvcHJvbWlzZS5qcyIsICJub2RlX21vZHVsZXMvcmVxdWVzdC9saWIvaGFyLmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9saWIvYnl0ZXNUb1V1aWQuanMiLCAibm9kZV9tb2R1bGVzL3V1aWQvdjQuanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL2F1dGguanMiLCAibm9kZV9tb2R1bGVzL29hdXRoLXNpZ24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL29hdXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2xpYi9oYXdrLmpzIiwgIm5vZGVfbW9kdWxlcy9kZWxheWVkLXN0cmVhbS9saWIvZGVsYXllZF9zdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL2NvbWJpbmVkLXN0cmVhbS9saWIvY29tYmluZWRfc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2xpYi9tdWx0aXBhcnQuanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL3JlZGlyZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy90dW5uZWwtYWdlbnQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlcXVlc3QvbGliL3R1bm5lbC5qcyIsICJub2RlX21vZHVsZXMvcGVyZm9ybWFuY2Utbm93L2xpYi9zcmMvcGVyZm9ybWFuY2Utbm93LmNvZmZlZSIsICJub2RlX21vZHVsZXMvcmVxdWVzdC9yZXF1ZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1ZXN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pc2V4ZS93aW5kb3dzLmpzIiwgIm5vZGVfbW9kdWxlcy9pc2V4ZS9tb2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9pc2V4ZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvd2hpY2gvd2hpY2guanMiLCAic3JjL21haW4udHMiLCAic3JjL29wdGlvbnMudHMiLCAic3JjL3V0aWxzLnRzIiwgInNyYy9kZXNrdG9wLnRzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL2xvZ2dlci50cyIsICJzcmMvZGVwZW5kZW5jaWVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnRzLnJlcXVpcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9uc1tcImVsZWN0cm9uXCJdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEZzID0gcmVxdWlyZShcIm9yaWdpbmFsLWZzXCIpO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yaWdpbmFsRnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgcmV0dXJuIHJlcXVpcmUoXCJmc1wiKTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLyogVGhlIGxvY2FsIGZpbGUgaGVhZGVyICovXG4gICAgTE9DSERSICAgICAgICAgICA6IDMwLCAvLyBMT0MgaGVhZGVyIHNpemVcbiAgICBMT0NTSUcgICAgICAgICAgIDogMHgwNDAzNGI1MCwgLy8gXCJQS1xcMDAzXFwwMDRcIlxuICAgIExPQ1ZFUiAgICAgICAgICAgOiA0LFx0Ly8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgIExPQ0ZMRyAgICAgICAgICAgOiA2LCAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICBMT0NIT1cgICAgICAgICAgIDogOCwgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gICAgTE9DVElNICAgICAgICAgICA6IDEwLCAvLyBtb2RpZmljYXRpb24gdGltZSAoMiBieXRlcyB0aW1lLCAyIGJ5dGVzIGRhdGUpXG4gICAgTE9DQ1JDICAgICAgICAgICA6IDE0LCAvLyB1bmNvbXByZXNzZWQgZmlsZSBjcmMtMzIgdmFsdWVcbiAgICBMT0NTSVogICAgICAgICAgIDogMTgsIC8vIGNvbXByZXNzZWQgc2l6ZVxuICAgIExPQ0xFTiAgICAgICAgICAgOiAyMiwgLy8gdW5jb21wcmVzc2VkIHNpemVcbiAgICBMT0NOQU0gICAgICAgICAgIDogMjYsIC8vIGZpbGVuYW1lIGxlbmd0aFxuICAgIExPQ0VYVCAgICAgICAgICAgOiAyOCwgLy8gZXh0cmEgZmllbGQgbGVuZ3RoXG5cbiAgICAvKiBUaGUgRGF0YSBkZXNjcmlwdG9yICovXG4gICAgRVhUU0lHICAgICAgICAgICA6IDB4MDgwNzRiNTAsIC8vIFwiUEtcXDAwN1xcMDA4XCJcbiAgICBFWFRIRFIgICAgICAgICAgIDogMTYsIC8vIEVYVCBoZWFkZXIgc2l6ZVxuICAgIEVYVENSQyAgICAgICAgICAgOiA0LCAvLyB1bmNvbXByZXNzZWQgZmlsZSBjcmMtMzIgdmFsdWVcbiAgICBFWFRTSVogICAgICAgICAgIDogOCwgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgRVhUTEVOICAgICAgICAgICA6IDEyLCAvLyB1bmNvbXByZXNzZWQgc2l6ZVxuXG4gICAgLyogVGhlIGNlbnRyYWwgZGlyZWN0b3J5IGZpbGUgaGVhZGVyICovXG4gICAgQ0VOSERSICAgICAgICAgICA6IDQ2LCAvLyBDRU4gaGVhZGVyIHNpemVcbiAgICBDRU5TSUcgICAgICAgICAgIDogMHgwMjAxNGI1MCwgLy8gXCJQS1xcMDAxXFwwMDJcIlxuICAgIENFTlZFTSAgICAgICAgICAgOiA0LCAvLyB2ZXJzaW9uIG1hZGUgYnlcbiAgICBDRU5WRVIgICAgICAgICAgIDogNiwgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgIENFTkZMRyAgICAgICAgICAgOiA4LCAvLyBlbmNyeXB0LCBkZWNyeXB0IGZsYWdzXG4gICAgQ0VOSE9XICAgICAgICAgICA6IDEwLCAvLyBjb21wcmVzc2lvbiBtZXRob2RcbiAgICBDRU5USU0gICAgICAgICAgIDogMTIsIC8vIG1vZGlmaWNhdGlvbiB0aW1lICgyIGJ5dGVzIHRpbWUsIDIgYnl0ZXMgZGF0ZSlcbiAgICBDRU5DUkMgICAgICAgICAgIDogMTYsIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgIENFTlNJWiAgICAgICAgICAgOiAyMCwgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgQ0VOTEVOICAgICAgICAgICA6IDI0LCAvLyB1bmNvbXByZXNzZWQgc2l6ZVxuICAgIENFTk5BTSAgICAgICAgICAgOiAyOCwgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgQ0VORVhUICAgICAgICAgICA6IDMwLCAvLyBleHRyYSBmaWVsZCBsZW5ndGhcbiAgICBDRU5DT00gICAgICAgICAgIDogMzIsIC8vIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICBDRU5EU0sgICAgICAgICAgIDogMzQsIC8vIHZvbHVtZSBudW1iZXIgc3RhcnRcbiAgICBDRU5BVFQgICAgICAgICAgIDogMzYsIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIENFTkFUWCAgICAgICAgICAgOiAzOCwgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIChob3N0IHN5c3RlbSBkZXBlbmRlbnQpXG4gICAgQ0VOT0ZGICAgICAgICAgICA6IDQyLCAvLyBMT0MgaGVhZGVyIG9mZnNldFxuXG4gICAgLyogVGhlIGVudHJpZXMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqL1xuICAgIEVOREhEUiAgICAgICAgICAgOiAyMiwgLy8gRU5EIGhlYWRlciBzaXplXG4gICAgRU5EU0lHICAgICAgICAgICA6IDB4MDYwNTRiNTAsIC8vIFwiUEtcXDAwNVxcMDA2XCJcbiAgICBFTkRTVUIgICAgICAgICAgIDogOCwgLy8gbnVtYmVyIG9mIGVudHJpZXMgb24gdGhpcyBkaXNrXG4gICAgRU5EVE9UICAgICAgICAgICA6IDEwLCAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgIEVORFNJWiAgICAgICAgICAgOiAxMiwgLy8gY2VudHJhbCBkaXJlY3Rvcnkgc2l6ZSBpbiBieXRlc1xuICAgIEVORE9GRiAgICAgICAgICAgOiAxNiwgLy8gb2Zmc2V0IG9mIGZpcnN0IENFTiBoZWFkZXJcbiAgICBFTkRDT00gICAgICAgICAgIDogMjAsIC8vIHppcCBmaWxlIGNvbW1lbnQgbGVuZ3RoXG5cbiAgICBFTkQ2NEhEUiAgICAgICAgIDogMjAsIC8vIHppcDY0IEVORCBoZWFkZXIgc2l6ZVxuICAgIEVORDY0U0lHICAgICAgICAgOiAweDA3MDY0YjUwLCAvLyB6aXA2NCBMb2NhdG9yIHNpZ25hdHVyZSwgXCJQS1xcMDA2XFwwMDdcIlxuICAgIEVORDY0U1RBUlQgICAgICAgOiA0LCAvLyBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0XG4gICAgRU5ENjRPRkYgICAgICAgICA6IDgsIC8vIHJlbGF0aXZlIG9mZnNldCBvZiB0aGUgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XG4gICAgRU5ENjROVU1ESVNLUyAgICA6IDE2LCAvLyB0b3RhbCBudW1iZXIgb2YgZGlza3NcblxuICAgIFpJUDY0U0lHICAgICAgICAgOiAweDA2MDY0YjUwLCAvLyB6aXA2NCBzaWduYXR1cmUsIFwiUEtcXDAwNlxcMDA2XCJcbiAgICBaSVA2NEhEUiAgICAgICAgIDogNTYsIC8vIHppcDY0IHJlY29yZCBtaW5pbXVtIHNpemVcbiAgICBaSVA2NExFQUQgICAgICAgIDogMTIsIC8vIGxlYWRpbmcgYnl0ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQsIG5vdCBjb3VudGVkIGJ5IHRoZSB2YWx1ZSBzdG9yZWQgaW4gWklQNjRTSVpFXG4gICAgWklQNjRTSVpFICAgICAgICA6IDQsIC8vIHppcDY0IHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZFxuICAgIFpJUDY0VkVNICAgICAgICAgOiAxMiwgLy8gemlwNjQgdmVyc2lvbiBtYWRlIGJ5XG4gICAgWklQNjRWRVIgICAgICAgICA6IDE0LCAvLyB6aXA2NCB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0XG4gICAgWklQNjREU0sgICAgICAgICA6IDE2LCAvLyB6aXA2NCBudW1iZXIgb2YgdGhpcyBkaXNrXG4gICAgWklQNjREU0tESVIgICAgICA6IDIwLCAvLyBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZCBkaXJlY3RvcnlcbiAgICBaSVA2NFNVQiAgICAgICAgIDogMjQsIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgZGlza1xuICAgIFpJUDY0VE9UICAgICAgICAgOiAzMiwgLy8gdG90YWwgbnVtYmVyIG9mIGVudHJpZXNcbiAgICBaSVA2NFNJWkIgICAgICAgIDogNDAsIC8vIHppcDY0IGNlbnRyYWwgZGlyZWN0b3J5IHNpemUgaW4gYnl0ZXNcbiAgICBaSVA2NE9GRiAgICAgICAgIDogNDgsIC8vIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyXG4gICAgWklQNjRFWFRSQSAgICAgICA6IDU2LCAvLyBleHRlbnNpYmxlIGRhdGEgc2VjdG9yXG5cbiAgICAvKiBDb21wcmVzc2lvbiBtZXRob2RzICovXG4gICAgU1RPUkVEICAgICAgICAgICA6IDAsIC8vIG5vIGNvbXByZXNzaW9uXG4gICAgU0hSVU5LICAgICAgICAgICA6IDEsIC8vIHNocnVua1xuICAgIFJFRFVDRUQxICAgICAgICAgOiAyLCAvLyByZWR1Y2VkIHdpdGggY29tcHJlc3Npb24gZmFjdG9yIDFcbiAgICBSRURVQ0VEMiAgICAgICAgIDogMywgLy8gcmVkdWNlZCB3aXRoIGNvbXByZXNzaW9uIGZhY3RvciAyXG4gICAgUkVEVUNFRDMgICAgICAgICA6IDQsIC8vIHJlZHVjZWQgd2l0aCBjb21wcmVzc2lvbiBmYWN0b3IgM1xuICAgIFJFRFVDRUQ0ICAgICAgICAgOiA1LCAvLyByZWR1Y2VkIHdpdGggY29tcHJlc3Npb24gZmFjdG9yIDRcbiAgICBJTVBMT0RFRCAgICAgICAgIDogNiwgLy8gaW1wbG9kZWRcbiAgICAvLyA3IHJlc2VydmVkIGZvciBUb2tlbml6aW5nIGNvbXByZXNzaW9uIGFsZ29yaXRobVxuICAgIERFRkxBVEVEICAgICAgICAgOiA4LCAvLyBkZWZsYXRlZFxuICAgIEVOSEFOQ0VEX0RFRkxBVEVEOiA5LCAvLyBlbmhhbmNlZCBkZWZsYXRlZFxuICAgIFBLV0FSRSAgICAgICAgICAgOiAxMCwvLyBQS1dhcmUgRENMIGltcGxvZGVkXG4gICAgLy8gMTEgcmVzZXJ2ZWQgYnkgUEtXQVJFXG4gICAgQlpJUDIgICAgICAgICAgICA6IDEyLCAvLyAgY29tcHJlc3NlZCB1c2luZyBCWklQMlxuICAgIC8vIDEzIHJlc2VydmVkIGJ5IFBLV0FSRVxuICAgIExaTUEgICAgICAgICAgICAgOiAxNCwgLy8gTFpNQVxuICAgIC8vIDE1LTE3IHJlc2VydmVkIGJ5IFBLV0FSRVxuICAgIElCTV9URVJTRSAgICAgICAgOiAxOCwgLy8gY29tcHJlc3NlZCB1c2luZyBJQk0gVEVSU0VcbiAgICBJQk1fTFo3NyAgICAgICAgIDogMTksIC8vIElCTSBMWjc3IHpcbiAgICBBRVNfRU5DUllQVCAgICAgIDogOTksIC8vIFdpblpJUCBBRVMgZW5jcnlwdGlvbiBtZXRob2RcblxuICAgIC8qIEdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAqL1xuICAgIC8vIHZhbHVlcyBjYW4gb2J0YWluZWQgd2l0aCBleHByZXNzaW9uIDIqKmJpdG5yXG4gICAgRkxHX0VOQyAgICAgICAgICA6IDEsICAgIC8vIEJpdCAwOiBlbmNyeXB0ZWQgZmlsZVxuICAgIEZMR19DT01QMSAgICAgICAgOiAyLCAgICAvLyBCaXQgMSwgY29tcHJlc3Npb24gb3B0aW9uXG4gICAgRkxHX0NPTVAyICAgICAgICA6IDQsICAgIC8vIEJpdCAyLCBjb21wcmVzc2lvbiBvcHRpb25cbiAgICBGTEdfREVTQyAgICAgICAgIDogOCwgICAgLy8gQml0IDMsIGRhdGEgZGVzY3JpcHRvclxuICAgIEZMR19FTkggICAgICAgICAgOiAxNiwgICAvLyBCaXQgNCwgZW5oYW5jZWQgZGVmbGF0aW5nXG4gICAgRkxHX1BBVENIICAgICAgICA6IDMyLCAgIC8vIEJpdCA1LCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZSBpcyBjb21wcmVzc2VkIHBhdGNoZWQgZGF0YS5cbiAgICBGTEdfU1RSICAgICAgICAgIDogNjQsICAgLy8gQml0IDYsIHN0cm9uZyBlbmNyeXB0aW9uIChwYXRlbnRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyA3LTEwOiBDdXJyZW50bHkgdW51c2VkLlxuICAgIEZMR19FRlMgICAgICAgICAgOiAyMDQ4LCAvLyBCaXQgMTE6IExhbmd1YWdlIGVuY29kaW5nIGZsYWcgKEVGUylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0IDEyOiBSZXNlcnZlZCBieSBQS1dBUkUgZm9yIGVuaGFuY2VkIGNvbXByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQgMTM6IGVuY3J5cHRlZCB0aGUgQ2VudHJhbCBEaXJlY3RvcnkgKHBhdGVudGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAxNC0xNTogUmVzZXJ2ZWQgYnkgUEtXQVJFLlxuICAgIEZMR19NU0sgICAgICAgICAgOiA0MDk2LCAvLyBtYXNrIGhlYWRlciB2YWx1ZXNcblxuICAgIC8qIExvYWQgdHlwZSAqL1xuICAgIEZJTEUgICAgICAgICAgICAgOiAyLFxuICAgIEJVRkZFUiAgICAgICAgICAgOiAxLFxuICAgIE5PTkUgICAgICAgICAgICAgOiAwLFxuXG4gICAgLyogNC41IEV4dGVuc2libGUgZGF0YSBmaWVsZHMgKi9cbiAgICBFRl9JRCAgICAgICAgICAgIDogMCxcbiAgICBFRl9TSVpFICAgICAgICAgIDogMixcblxuICAgIC8qIEhlYWRlciBJRHMgKi9cbiAgICBJRF9aSVA2NCAgICAgICAgIDogMHgwMDAxLFxuICAgIElEX0FWSU5GTyAgICAgICAgOiAweDAwMDcsXG4gICAgSURfUEZTICAgICAgICAgICA6IDB4MDAwOCxcbiAgICBJRF9PUzIgICAgICAgICAgIDogMHgwMDA5LFxuICAgIElEX05URlMgICAgICAgICAgOiAweDAwMGEsXG4gICAgSURfT1BFTlZNUyAgICAgICA6IDB4MDAwYyxcbiAgICBJRF9VTklYICAgICAgICAgIDogMHgwMDBkLFxuICAgIElEX0ZPUksgICAgICAgICAgOiAweDAwMGUsXG4gICAgSURfUEFUQ0ggICAgICAgICA6IDB4MDAwZixcbiAgICBJRF9YNTA5X1BLQ1M3ICAgIDogMHgwMDE0LFxuICAgIElEX1g1MDlfQ0VSVElEX0YgOiAweDAwMTUsXG4gICAgSURfWDUwOV9DRVJUSURfQyA6IDB4MDAxNixcbiAgICBJRF9TVFJPTkdFTkMgICAgIDogMHgwMDE3LFxuICAgIElEX1JFQ09SRF9NR1QgICAgOiAweDAwMTgsXG4gICAgSURfWDUwOV9QS0NTN19STCA6IDB4MDAxOSxcbiAgICBJRF9JQk0xICAgICAgICAgIDogMHgwMDY1LFxuICAgIElEX0lCTTIgICAgICAgICAgOiAweDAwNjYsXG4gICAgSURfUE9TWklQICAgICAgICA6IDB4NDY5MCxcblxuICAgIEVGX1pJUDY0X09SXzMyICAgOiAweGZmZmZmZmZmLFxuICAgIEVGX1pJUDY0X09SXzE2ICAgOiAweGZmZmYsXG4gICAgRUZfWklQNjRfU1VOQ09NUCA6IDAsXG4gICAgRUZfWklQNjRfU0NPTVAgICA6IDgsXG4gICAgRUZfWklQNjRfUkhPICAgICA6IDE2LFxuICAgIEVGX1pJUDY0X0RTTiAgICAgOiAyNFxufTtcbiIsICJjb25zdCBmc3lzdGVtID0gcmVxdWlyZShcIi4vZmlsZVN5c3RlbVwiKS5yZXF1aXJlKCk7XG5jb25zdCBwdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IENvbnN0YW50cyA9IHJlcXVpcmUoXCIuL2NvbnN0YW50c1wiKTtcbmNvbnN0IGlzV2luID0gdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgXCJ3aW4zMlwiID09PSBwcm9jZXNzLnBsYXRmb3JtO1xuXG5jb25zdCBpc19PYmogPSAob2JqKSA9PiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIjtcblxuLy8gZ2VuZXJhdGUgQ1JDMzIgbG9va3VwIHRhYmxlXG5jb25zdCBjcmNUYWJsZSA9IG5ldyBVaW50MzJBcnJheSgyNTYpLm1hcCgodCwgYykgPT4ge1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICAgIGlmICgoYyAmIDEpICE9PSAwKSB7XG4gICAgICAgICAgICBjID0gMHhlZGI4ODMyMCBeIChjID4+PiAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPj4+PSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4+PiAwO1xufSk7XG5cbi8vIFVUSUxTIGZ1bmN0aW9uc1xuXG5mdW5jdGlvbiBVdGlscyhvcHRzKSB7XG4gICAgdGhpcy5zZXAgPSBwdGguc2VwO1xuICAgIHRoaXMuZnMgPSBmc3lzdGVtO1xuXG4gICAgaWYgKGlzX09iaihvcHRzKSkge1xuICAgICAgICAvLyBjdXN0b20gZmlsZXN5c3RlbVxuICAgICAgICBpZiAoaXNfT2JqKG9wdHMuZnMpICYmIHR5cGVvZiBvcHRzLmZzLnN0YXRTeW5jID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZnMgPSBvcHRzLmZzO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuXG4vLyBJTlNUQU5DRUQgZnVuY3Rpb25zXG5cblV0aWxzLnByb3RvdHlwZS5tYWtlRGlyID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gZm9sZGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTeW5jIC0gbWFrZSBkaXJlY3RvcmllcyB0cmVlXG4gICAgZnVuY3Rpb24gbWtkaXJTeW5jKC8qU3RyaW5nKi8gZnBhdGgpIHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aCA9IGZwYXRoLnNwbGl0KHNlbGYuc2VwKVswXTtcbiAgICAgICAgZnBhdGguc3BsaXQoc2VsZi5zZXApLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGlmICghbmFtZSB8fCBuYW1lLnN1YnN0cigtMSwgMSkgPT09IFwiOlwiKSByZXR1cm47XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggKz0gc2VsZi5zZXAgKyBuYW1lO1xuICAgICAgICAgICAgdmFyIHN0YXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXQgPSBzZWxmLmZzLnN0YXRTeW5jKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5mcy5ta2RpclN5bmMocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ICYmIHN0YXQuaXNGaWxlKCkpIHRocm93IEVycm9ycy5GSUxFX0lOX1RIRV9XQVkucmVwbGFjZShcIiVzXCIsIHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1rZGlyU3luYyhmb2xkZXIpO1xufTtcblxuVXRpbHMucHJvdG90eXBlLndyaXRlRmlsZVRvID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gcGF0aCwgLypCdWZmZXIqLyBjb250ZW50LCAvKkJvb2xlYW4qLyBvdmVyd3JpdGUsIC8qTnVtYmVyKi8gYXR0cikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmZzLmV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHJldHVybiBmYWxzZTsgLy8gY2Fubm90IG92ZXJ3cml0ZVxuXG4gICAgICAgIHZhciBzdGF0ID0gc2VsZi5mcy5zdGF0U3luYyhwYXRoKTtcbiAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBmb2xkZXIgPSBwdGguZGlybmFtZShwYXRoKTtcbiAgICBpZiAoIXNlbGYuZnMuZXhpc3RzU3luYyhmb2xkZXIpKSB7XG4gICAgICAgIHNlbGYubWFrZURpcihmb2xkZXIpO1xuICAgIH1cblxuICAgIHZhciBmZDtcbiAgICB0cnkge1xuICAgICAgICBmZCA9IHNlbGYuZnMub3BlblN5bmMocGF0aCwgXCJ3XCIsIDQzOCk7IC8vIDA2NjZcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNlbGYuZnMuY2htb2RTeW5jKHBhdGgsIDQzOCk7XG4gICAgICAgIGZkID0gc2VsZi5mcy5vcGVuU3luYyhwYXRoLCBcIndcIiwgNDM4KTtcbiAgICB9XG4gICAgaWYgKGZkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWxmLmZzLndyaXRlU3luYyhmZCwgY29udGVudCwgMCwgY29udGVudC5sZW5ndGgsIDApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2VsZi5mcy5jbG9zZVN5bmMoZmQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbGYuZnMuY2htb2RTeW5jKHBhdGgsIGF0dHIgfHwgNDM4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cblV0aWxzLnByb3RvdHlwZS53cml0ZUZpbGVUb0FzeW5jID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gcGF0aCwgLypCdWZmZXIqLyBjb250ZW50LCAvKkJvb2xlYW4qLyBvdmVyd3JpdGUsIC8qTnVtYmVyKi8gYXR0ciwgLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBhdHRyO1xuICAgICAgICBhdHRyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgc2VsZi5mcy5leGlzdHMocGF0aCwgZnVuY3Rpb24gKGV4aXN0KSB7XG4gICAgICAgIGlmIChleGlzdCAmJiAhb3ZlcndyaXRlKSByZXR1cm4gY2FsbGJhY2soZmFsc2UpO1xuXG4gICAgICAgIHNlbGYuZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICAgICAgICBpZiAoZXhpc3QgJiYgc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGZvbGRlciA9IHB0aC5kaXJuYW1lKHBhdGgpO1xuICAgICAgICAgICAgc2VsZi5mcy5leGlzdHMoZm9sZGVyLCBmdW5jdGlvbiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHNlbGYubWFrZURpcihmb2xkZXIpO1xuXG4gICAgICAgICAgICAgICAgc2VsZi5mcy5vcGVuKHBhdGgsIFwid1wiLCA0MzgsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnMuY2htb2QocGF0aCwgNDM4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcy5vcGVuKHBhdGgsIFwid1wiLCA0MzgsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnMud3JpdGUoZmQsIGNvbnRlbnQsIDAsIGNvbnRlbnQubGVuZ3RoLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZzLmNsb3NlKGZkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcy5jaG1vZChwYXRoLCBhdHRyIHx8IDQzOCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZzLndyaXRlKGZkLCBjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnMuY2xvc2UoZmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcy5jaG1vZChwYXRoLCBhdHRyIHx8IDQzOCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZzLmNobW9kKHBhdGgsIGF0dHIgfHwgNDM4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuVXRpbHMucHJvdG90eXBlLmZpbmRGaWxlcyA9IGZ1bmN0aW9uICgvKlN0cmluZyovIHBhdGgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGZpbmRTeW5jKC8qU3RyaW5nKi8gZGlyLCAvKlJlZ0V4cCovIHBhdHRlcm4sIC8qQm9vbGVhbiovIHJlY3Vyc2l2ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZWN1cnNpdmUgPSBwYXR0ZXJuO1xuICAgICAgICAgICAgcGF0dGVybiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgc2VsZi5mcy5yZWFkZGlyU3luYyhkaXIpLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgIHZhciBwYXRoID0gcHRoLmpvaW4oZGlyLCBmaWxlKTtcblxuICAgICAgICAgICAgaWYgKHNlbGYuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKSAmJiByZWN1cnNpdmUpIGZpbGVzID0gZmlsZXMuY29uY2F0KGZpbmRTeW5jKHBhdGgsIHBhdHRlcm4sIHJlY3Vyc2l2ZSkpO1xuXG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4gfHwgcGF0dGVybi50ZXN0KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChwdGgubm9ybWFsaXplKHBhdGgpICsgKHNlbGYuZnMuc3RhdFN5bmMocGF0aCkuaXNEaXJlY3RvcnkoKSA/IHNlbGYuc2VwIDogXCJcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5kU3luYyhwYXRoLCB1bmRlZmluZWQsIHRydWUpO1xufTtcblxuVXRpbHMucHJvdG90eXBlLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7fTtcblxuVXRpbHMucHJvdG90eXBlLnNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gU1RBVElDIGZ1bmN0aW9uc1xuXG4vLyBjcmMzMiBzaW5nbGUgdXBkYXRlIChpdCBpcyBwYXJ0IG9mIGNyYzMyKVxuVXRpbHMuY3JjMzJ1cGRhdGUgPSBmdW5jdGlvbiAoY3JjLCBieXRlKSB7XG4gICAgcmV0dXJuIGNyY1RhYmxlWyhjcmMgXiBieXRlKSAmIDB4ZmZdIF4gKGNyYyA+Pj4gOCk7XG59O1xuXG5VdGlscy5jcmMzMiA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICBpZiAodHlwZW9mIGJ1ZiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYsIFwidXRmOFwiKTtcbiAgICB9XG4gICAgLy8gR2VuZXJhdGUgY3JjVGFibGVcbiAgICBpZiAoIWNyY1RhYmxlLmxlbmd0aCkgZ2VuQ1JDVGFibGUoKTtcblxuICAgIGxldCBsZW4gPSBidWYubGVuZ3RoO1xuICAgIGxldCBjcmMgPSB+MDtcbiAgICBmb3IgKGxldCBvZmYgPSAwOyBvZmYgPCBsZW47ICkgY3JjID0gVXRpbHMuY3JjMzJ1cGRhdGUoY3JjLCBidWZbb2ZmKytdKTtcbiAgICAvLyB4b3IgYW5kIGNhc3QgYXMgdWludDMyIG51bWJlclxuICAgIHJldHVybiB+Y3JjID4+PiAwO1xufTtcblxuVXRpbHMubWV0aG9kVG9TdHJpbmcgPSBmdW5jdGlvbiAoLypOdW1iZXIqLyBtZXRob2QpIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlIENvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICByZXR1cm4gXCJTVE9SRUQgKFwiICsgbWV0aG9kICsgXCIpXCI7XG4gICAgICAgIGNhc2UgQ29uc3RhbnRzLkRFRkxBVEVEOlxuICAgICAgICAgICAgcmV0dXJuIFwiREVGTEFURUQgKFwiICsgbWV0aG9kICsgXCIpXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gXCJVTlNVUFBPUlRFRCAoXCIgKyBtZXRob2QgKyBcIilcIjtcbiAgICB9XG59O1xuXG4vLyByZW1vdmVzIFwiLi5cIiBzdHlsZSBwYXRoIGVsZW1lbnRzXG5VdGlscy5jYW5vbmljYWwgPSBmdW5jdGlvbiAoLypzdHJpbmcqLyBwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gXCJcIjtcbiAgICAvLyB0cmljayBub3JtYWxpemUgdGhpbmsgcGF0aCBpcyBhYnNvbHV0ZVxuICAgIHZhciBzYWZlU3VmZml4ID0gcHRoLnBvc2l4Lm5vcm1hbGl6ZShcIi9cIiArIHBhdGguc3BsaXQoXCJcXFxcXCIpLmpvaW4oXCIvXCIpKTtcbiAgICByZXR1cm4gcHRoLmpvaW4oXCIuXCIsIHNhZmVTdWZmaXgpO1xufTtcblxuLy8gbWFrZSBhYm9sdXRlIHBhdGhzIHRha2luZyBwcmVmaXggYXMgcm9vdCBmb2xkZXJcblV0aWxzLnNhbml0aXplID0gZnVuY3Rpb24gKC8qc3RyaW5nKi8gcHJlZml4LCAvKnN0cmluZyovIG5hbWUpIHtcbiAgICBwcmVmaXggPSBwdGgucmVzb2x2ZShwdGgubm9ybWFsaXplKHByZWZpeCkpO1xuICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXRoID0gcHRoLm5vcm1hbGl6ZShwdGguam9pbihwcmVmaXgsIHBhcnRzLnNsaWNlKGksIGwpLmpvaW4ocHRoLnNlcCkpKTtcbiAgICAgICAgaWYgKHBhdGguaW5kZXhPZihwcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHRoLm5vcm1hbGl6ZShwdGguam9pbihwcmVmaXgsIHB0aC5iYXNlbmFtZShuYW1lKSkpO1xufTtcblxuLy8gY29udmVydHMgYnVmZmVyLCBVaW50OEFycmF5LCBzdHJpbmcgdHlwZXMgdG8gYnVmZmVyXG5VdGlscy50b0J1ZmZlciA9IGZ1bmN0aW9uIHRvQnVmZmVyKC8qYnVmZmVyLCBVaW50OEFycmF5LCBzdHJpbmcqLyBpbnB1dCkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oaW5wdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGV4cGVjdCBzdHJpbmcgYWxsIG90aGVyIHZhbHVlcyBhcmUgaW52YWxpZCBhbmQgcmV0dXJuIGVtcHR5IGJ1ZmZlclxuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20oaW5wdXQsIFwidXRmOFwiKSA6IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG59O1xuXG5VdGlscy5yZWFkQmlnVUludDY0TEUgPSBmdW5jdGlvbiAoLypCdWZmZXIqLyBidWZmZXIsIC8qaW50Ki8gaW5kZXgpIHtcbiAgICB2YXIgc2xpY2UgPSBCdWZmZXIuZnJvbShidWZmZXIuc2xpY2UoaW5kZXgsIGluZGV4ICsgOCkpO1xuICAgIHNsaWNlLnN3YXA2NCgpO1xuXG4gICAgcmV0dXJuIHBhcnNlSW50KGAweCR7c2xpY2UudG9TdHJpbmcoXCJoZXhcIil9YCk7XG59O1xuXG5VdGlscy5pc1dpbiA9IGlzV2luOyAvLyBEbyB3ZSBoYXZlIHdpbmRvd3Mgc3lzdGVtXG5VdGlscy5jcmNUYWJsZSA9IGNyY1RhYmxlO1xuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qIEhlYWRlciBlcnJvciBtZXNzYWdlcyAqL1xuICAgIElOVkFMSURfTE9DOiBcIkludmFsaWQgTE9DIGhlYWRlciAoYmFkIHNpZ25hdHVyZSlcIixcbiAgICBJTlZBTElEX0NFTjogXCJJbnZhbGlkIENFTiBoZWFkZXIgKGJhZCBzaWduYXR1cmUpXCIsXG4gICAgSU5WQUxJRF9FTkQ6IFwiSW52YWxpZCBFTkQgaGVhZGVyIChiYWQgc2lnbmF0dXJlKVwiLFxuXG4gICAgLyogWmlwRW50cnkgZXJyb3IgbWVzc2FnZXMqL1xuICAgIE5PX0RBVEE6IFwiTm90aGluZyB0byBkZWNvbXByZXNzXCIsXG4gICAgQkFEX0NSQzogXCJDUkMzMiBjaGVja3N1bSBmYWlsZWRcIixcbiAgICBGSUxFX0lOX1RIRV9XQVk6IFwiVGhlcmUgaXMgYSBmaWxlIGluIHRoZSB3YXk6ICVzXCIsXG4gICAgVU5LTk9XTl9NRVRIT0Q6IFwiSW52YWxpZC91bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2RcIixcblxuICAgIC8qIEluZmxhdGVyIGVycm9yIG1lc3NhZ2VzICovXG4gICAgQVZBSUxfREFUQTogXCJpbmZsYXRlOjpBdmFpbGFibGUgaW5mbGF0ZSBkYXRhIGRpZCBub3QgdGVybWluYXRlXCIsXG4gICAgSU5WQUxJRF9ESVNUQU5DRTogXCJpbmZsYXRlOjpJbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGUgaW4gZml4ZWQgb3IgZHluYW1pYyBibG9ja1wiLFxuICAgIFRPX01BTllfQ09ERVM6IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiB0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2UgY29kZXNcIixcbiAgICBJTlZBTElEX1JFUEVBVF9MRU46IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbW9yZSB0aGFuIHNwZWNpZmllZCBsZW5ndGhzXCIsXG4gICAgSU5WQUxJRF9SRVBFQVRfRklSU1Q6IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbGVuZ3RocyB3aXRoIG5vIGZpcnN0IGxlbmd0aFwiLFxuICAgIElOQ09NUExFVEVfQ09ERVM6IFwiaW5mbGF0ZTo6RHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiBjb2RlIGxlbmd0aHMgY29kZXMgaW5jb21wbGV0ZVwiLFxuICAgIElOVkFMSURfRFlOX0RJU1RBTkNFOiBcImluZmxhdGU6OkR5bmFtaWMgYmxvY2sgY29kZSBkZXNjcmlwdGlvbjogaW52YWxpZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHNcIixcbiAgICBJTlZBTElEX0NPREVTX0xFTjogXCJpbmZsYXRlOjpEeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzXCIsXG4gICAgSU5WQUxJRF9TVE9SRV9CTE9DSzogXCJpbmZsYXRlOjpTdG9yZWQgYmxvY2sgbGVuZ3RoIGRpZCBub3QgbWF0Y2ggb25lJ3MgY29tcGxlbWVudFwiLFxuICAgIElOVkFMSURfQkxPQ0tfVFlQRTogXCJpbmZsYXRlOjpJbnZhbGlkIGJsb2NrIHR5cGUgKHR5cGUgPT0gMylcIixcblxuICAgIC8qIEFETS1aSVAgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBDQU5UX0VYVFJBQ1RfRklMRTogXCJDb3VsZCBub3QgZXh0cmFjdCB0aGUgZmlsZVwiLFxuICAgIENBTlRfT1ZFUlJJREU6IFwiVGFyZ2V0IGZpbGUgYWxyZWFkeSBleGlzdHNcIixcbiAgICBOT19aSVA6IFwiTm8gemlwIGZpbGUgd2FzIGxvYWRlZFwiLFxuICAgIE5PX0VOVFJZOiBcIkVudHJ5IGRvZXNuJ3QgZXhpc3RcIixcbiAgICBESVJFQ1RPUllfQ09OVEVOVF9FUlJPUjogXCJBIGRpcmVjdG9yeSBjYW5ub3QgaGF2ZSBjb250ZW50XCIsXG4gICAgRklMRV9OT1RfRk9VTkQ6IFwiRmlsZSBub3QgZm91bmQ6ICVzXCIsXG4gICAgTk9UX0lNUExFTUVOVEVEOiBcIk5vdCBpbXBsZW1lbnRlZFwiLFxuICAgIElOVkFMSURfRklMRU5BTUU6IFwiSW52YWxpZCBmaWxlbmFtZVwiLFxuICAgIElOVkFMSURfRk9STUFUOiBcIkludmFsaWQgb3IgdW5zdXBwb3J0ZWQgemlwIGZvcm1hdC4gTm8gRU5EIGhlYWRlciBmb3VuZFwiXG59O1xuIiwgImNvbnN0IGZzID0gcmVxdWlyZShcIi4vZmlsZVN5c3RlbVwiKS5yZXF1aXJlKCk7XG5jb25zdCBwdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuZnMuZXhpc3RzU3luYyA9IGZzLmV4aXN0c1N5bmMgfHwgcHRoLmV4aXN0c1N5bmM7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qU3RyaW5nKi8gcGF0aCkge1xuICAgIHZhciBfcGF0aCA9IHBhdGggfHwgXCJcIixcbiAgICAgICAgX29iaiA9IG5ld0F0dHIoKSxcbiAgICAgICAgX3N0YXQgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gbmV3QXR0cigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogZmFsc2UsXG4gICAgICAgICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgICAgZXhlY3V0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtdGltZTogMCxcbiAgICAgICAgICAgIGF0aW1lOiAwXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKF9wYXRoICYmIGZzLmV4aXN0c1N5bmMoX3BhdGgpKSB7XG4gICAgICAgIF9zdGF0ID0gZnMuc3RhdFN5bmMoX3BhdGgpO1xuICAgICAgICBfb2JqLmRpcmVjdG9yeSA9IF9zdGF0LmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIF9vYmoubXRpbWUgPSBfc3RhdC5tdGltZTtcbiAgICAgICAgX29iai5hdGltZSA9IF9zdGF0LmF0aW1lO1xuICAgICAgICBfb2JqLmV4ZWN1dGFibGUgPSAoMG8xMTEgJiBfc3RhdC5tb2RlKSAhPT0gMDsgLy8gZmlsZSBpcyBleGVjdXRhYmxlIHdobyBldmVyIGhhciByaWdodCBub3QganVzdCBvd25lclxuICAgICAgICBfb2JqLnJlYWRvbmx5ID0gKDBvMjAwICYgX3N0YXQubW9kZSkgPT09IDA7IC8vIHJlYWRvbmx5IGlmIG93bmVyIGhhcyBubyB3cml0ZSByaWdodFxuICAgICAgICBfb2JqLmhpZGRlbiA9IHB0aC5iYXNlbmFtZShfcGF0aClbMF0gPT09IFwiLlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkludmFsaWQgcGF0aDogXCIgKyBfcGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0IGRpcmVjdG9yeSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqLmRpcmVjdG9yeTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgcmVhZE9ubHkoKSB7XG4gICAgICAgICAgICByZXR1cm4gX29iai5yZWFkb25seTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgaGlkZGVuKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYmouaGlkZGVuO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBtdGltZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqLm10aW1lO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBhdGltZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqLmF0aW1lO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBleGVjdXRhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYmouZXhlY3V0YWJsZTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWNvZGVBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgICAgICBlbmNvZGVBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgICAgICB0b0pTT046IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0aDogX3BhdGgsXG4gICAgICAgICAgICAgICAgaXNEaXJlY3Rvcnk6IF9vYmouZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGlzUmVhZE9ubHk6IF9vYmoucmVhZG9ubHksXG4gICAgICAgICAgICAgICAgaXNIaWRkZW46IF9vYmouaGlkZGVuLFxuICAgICAgICAgICAgICAgIGlzRXhlY3V0YWJsZTogX29iai5leGVjdXRhYmxlLFxuICAgICAgICAgICAgICAgIG1UaW1lOiBfb2JqLm10aW1lLFxuICAgICAgICAgICAgICAgIGFUaW1lOiBfb2JqLmF0aW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSwgbnVsbCwgXCJcXHRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xubW9kdWxlLmV4cG9ydHMuQ29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzXCIpO1xubW9kdWxlLmV4cG9ydHMuRXJyb3JzID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xubW9kdWxlLmV4cG9ydHMuRmlsZUF0dHIgPSByZXF1aXJlKFwiLi9mYXR0clwiKTtcbiIsICJ2YXIgVXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbFwiKSxcbiAgICBDb25zdGFudHMgPSBVdGlscy5Db25zdGFudHM7XG5cbi8qIFRoZSBjZW50cmFsIGRpcmVjdG9yeSBmaWxlIGhlYWRlciAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92ZXJNYWRlID0gMjAsIC8vIHYyLjBcbiAgICAgICAgX3ZlcnNpb24gPSAxMCwgLy8gdjEuMFxuICAgICAgICBfZmxhZ3MgPSAwLFxuICAgICAgICBfbWV0aG9kID0gMCxcbiAgICAgICAgX3RpbWUgPSAwLFxuICAgICAgICBfY3JjID0gMCxcbiAgICAgICAgX2NvbXByZXNzZWRTaXplID0gMCxcbiAgICAgICAgX3NpemUgPSAwLFxuICAgICAgICBfZm5hbWVMZW4gPSAwLFxuICAgICAgICBfZXh0cmFMZW4gPSAwLFxuICAgICAgICBfY29tTGVuID0gMCxcbiAgICAgICAgX2Rpc2tTdGFydCA9IDAsXG4gICAgICAgIF9pbmF0dHIgPSAwLFxuICAgICAgICBfYXR0ciA9IDAsXG4gICAgICAgIF9vZmZzZXQgPSAwO1xuXG4gICAgX3Zlck1hZGUgfD0gVXRpbHMuaXNXaW4gPyAweDBhMDAgOiAweDAzMDA7XG5cbiAgICAvLyBTZXQgRUZTIGZsYWcgc2luY2UgZmlsZW5hbWUgYW5kIGNvbW1lbnQgZmllbGRzIGFyZSBhbGwgYnkgZGVmYXVsdCBlbmNvZGVkIHVzaW5nIFVURi04LlxuICAgIC8vIFdpdGhvdXQgaXQgZmlsZSBuYW1lcyBtYXkgYmUgY29ycnVwdGVkIGZvciBvdGhlciBhcHBzIHdoZW4gZmlsZSBuYW1lcyB1c2UgdW5pY29kZSBjaGFyc1xuICAgIF9mbGFncyB8PSBDb25zdGFudHMuRkxHX0VGUztcblxuICAgIHZhciBfZGF0YUhlYWRlciA9IHt9O1xuXG4gICAgZnVuY3Rpb24gc2V0VGltZSh2YWwpIHtcbiAgICAgICAgdmFsID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgX3RpbWUgPVxuICAgICAgICAgICAgKCgodmFsLmdldEZ1bGxZZWFyKCkgLSAxOTgwKSAmIDB4N2YpIDw8IDI1KSB8IC8vIGIwOS0xNiB5ZWFycyBmcm9tIDE5ODBcbiAgICAgICAgICAgICgodmFsLmdldE1vbnRoKCkgKyAxKSA8PCAyMSkgfCAvLyBiMDUtMDggbW9udGhcbiAgICAgICAgICAgICh2YWwuZ2V0RGF0ZSgpIDw8IDE2KSB8IC8vIGIwMC0wNCBob3VyXG4gICAgICAgICAgICAvLyAyIGJ5dGVzIHRpbWVcbiAgICAgICAgICAgICh2YWwuZ2V0SG91cnMoKSA8PCAxMSkgfCAvLyBiMTEtMTUgaG91clxuICAgICAgICAgICAgKHZhbC5nZXRNaW51dGVzKCkgPDwgNSkgfCAvLyBiMDUtMTAgbWludXRlXG4gICAgICAgICAgICAodmFsLmdldFNlY29uZHMoKSA+PiAxKTsgLy8gYjAwLTA0IHNlY29uZHMgZGl2aWRlZCBieSAyXG4gICAgfVxuXG4gICAgc2V0VGltZSgrbmV3IERhdGUoKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgbWFkZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdmVyTWFkZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IG1hZGUodmFsKSB7XG4gICAgICAgICAgICBfdmVyTWFkZSA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBfdmVyc2lvbjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IHZlcnNpb24odmFsKSB7XG4gICAgICAgICAgICBfdmVyc2lvbiA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZmxhZ3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2ZsYWdzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgZmxhZ3ModmFsKSB7XG4gICAgICAgICAgICBfZmxhZ3MgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IG1ldGhvZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfbWV0aG9kO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgbWV0aG9kKHZhbCkge1xuICAgICAgICAgICAgc3dpdGNoICh2YWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IDEwO1xuICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkRFRkxBVEVEOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IDIwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX21ldGhvZCA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgdGltZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgoKF90aW1lID4+IDI1KSAmIDB4N2YpICsgMTk4MCwgKChfdGltZSA+PiAyMSkgJiAweDBmKSAtIDEsIChfdGltZSA+PiAxNikgJiAweDFmLCAoX3RpbWUgPj4gMTEpICYgMHgxZiwgKF90aW1lID4+IDUpICYgMHgzZiwgKF90aW1lICYgMHgxZikgPDwgMSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCB0aW1lKHZhbCkge1xuICAgICAgICAgICAgc2V0VGltZSh2YWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBjcmMoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NyYztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGNyYyh2YWwpIHtcbiAgICAgICAgICAgIF9jcmMgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBjb21wcmVzc2VkU2l6ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBfY29tcHJlc3NlZFNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjb21wcmVzc2VkU2l6ZSh2YWwpIHtcbiAgICAgICAgICAgIF9jb21wcmVzc2VkU2l6ZSA9IE1hdGgubWF4KDAsIHZhbCkgPj4+IDA7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBzaXplKHZhbCkge1xuICAgICAgICAgICAgX3NpemUgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBmaWxlTmFtZUxlbmd0aCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfZm5hbWVMZW47XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBmaWxlTmFtZUxlbmd0aCh2YWwpIHtcbiAgICAgICAgICAgIF9mbmFtZUxlbiA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZXh0cmFMZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2V4dHJhTGVuO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgZXh0cmFMZW5ndGgodmFsKSB7XG4gICAgICAgICAgICBfZXh0cmFMZW4gPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGNvbW1lbnRMZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NvbUxlbjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGNvbW1lbnRMZW5ndGgodmFsKSB7XG4gICAgICAgICAgICBfY29tTGVuID0gdmFsO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBkaXNrTnVtU3RhcnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2Rpc2tTdGFydDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGRpc2tOdW1TdGFydCh2YWwpIHtcbiAgICAgICAgICAgIF9kaXNrU3RhcnQgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBpbkF0dHIoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2luYXR0cjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGluQXR0cih2YWwpIHtcbiAgICAgICAgICAgIF9pbmF0dHIgPSBNYXRoLm1heCgwLCB2YWwpID4+PiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBhdHRyKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9hdHRyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgYXR0cih2YWwpIHtcbiAgICAgICAgICAgIF9hdHRyID0gTWF0aC5tYXgoMCwgdmFsKSA+Pj4gMDtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBnZXQgVW5peCBmaWxlIHBlcm1pc3Npb25zXG4gICAgICAgIGdldCBmaWxlQXR0cigpIHtcbiAgICAgICAgICAgIHJldHVybiBfYXR0ciA/ICgoKF9hdHRyID4+PiAwKSB8IDApID4+IDE2KSAmIDB4ZmZmIDogMDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgb2Zmc2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vZmZzZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBvZmZzZXQodmFsKSB7XG4gICAgICAgICAgICBfb2Zmc2V0ID0gTWF0aC5tYXgoMCwgdmFsKSA+Pj4gMDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZW5jcmlwdGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIChfZmxhZ3MgJiAxKSA9PT0gMTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZW50cnlIZWFkZXJTaXplKCkge1xuICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50cy5DRU5IRFIgKyBfZm5hbWVMZW4gKyBfZXh0cmFMZW4gKyBfY29tTGVuO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCByZWFsRGF0YU9mZnNldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2Zmc2V0ICsgQ29uc3RhbnRzLkxPQ0hEUiArIF9kYXRhSGVhZGVyLmZuYW1lTGVuICsgX2RhdGFIZWFkZXIuZXh0cmFMZW47XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGRhdGFIZWFkZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2RhdGFIZWFkZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbG9hZERhdGFIZWFkZXJGcm9tQmluYXJ5OiBmdW5jdGlvbiAoLypCdWZmZXIqLyBpbnB1dCkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBpbnB1dC5zbGljZShfb2Zmc2V0LCBfb2Zmc2V0ICsgQ29uc3RhbnRzLkxPQ0hEUik7XG4gICAgICAgICAgICAvLyAzMCBieXRlcyBhbmQgc2hvdWxkIHN0YXJ0IHdpdGggXCJQS1xcMDAzXFwwMDRcIlxuICAgICAgICAgICAgaWYgKGRhdGEucmVhZFVJbnQzMkxFKDApICE9PSBDb25zdGFudHMuTE9DU0lHKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5JTlZBTElEX0xPQyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZGF0YUhlYWRlciA9IHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkxPQ1ZFUiksXG4gICAgICAgICAgICAgICAgLy8gZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGRhdGEucmVhZFVJbnQxNkxFKENvbnN0YW50cy5MT0NGTEcpLFxuICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgICAgICAgICAgICAgIG1ldGhvZDogZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkxPQ0hPVyksXG4gICAgICAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgKDIgYnl0ZXMgdGltZSwgMiBieXRlcyBkYXRlKVxuICAgICAgICAgICAgICAgIHRpbWU6IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5MT0NUSU0pLFxuICAgICAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgICAgICAgICAgICAgIGNyYzogZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkxPQ0NSQyksXG4gICAgICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICAgICAgY29tcHJlc3NlZFNpemU6IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5MT0NTSVopLFxuICAgICAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICAgICAgc2l6ZTogZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkxPQ0xFTiksXG4gICAgICAgICAgICAgICAgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgZm5hbWVMZW46IGRhdGEucmVhZFVJbnQxNkxFKENvbnN0YW50cy5MT0NOQU0pLFxuICAgICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aFxuICAgICAgICAgICAgICAgIGV4dHJhTGVuOiBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuTE9DRVhUKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICBsb2FkRnJvbUJpbmFyeTogZnVuY3Rpb24gKC8qQnVmZmVyKi8gZGF0YSkge1xuICAgICAgICAgICAgLy8gZGF0YSBzaG91bGQgYmUgNDYgYnl0ZXMgYW5kIHN0YXJ0IHdpdGggXCJQSyAwMSAwMlwiXG4gICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT09IENvbnN0YW50cy5DRU5IRFIgfHwgZGF0YS5yZWFkVUludDMyTEUoMCkgIT09IENvbnN0YW50cy5DRU5TSUcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLklOVkFMSURfQ0VOKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHZlcnNpb24gbWFkZSBieVxuICAgICAgICAgICAgX3Zlck1hZGUgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VOVkVNKTtcbiAgICAgICAgICAgIC8vIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3RcbiAgICAgICAgICAgIF92ZXJzaW9uID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTlZFUik7XG4gICAgICAgICAgICAvLyBlbmNyeXB0LCBkZWNyeXB0IGZsYWdzXG4gICAgICAgICAgICBfZmxhZ3MgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VORkxHKTtcbiAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgICAgICAgICAgX21ldGhvZCA9IGRhdGEucmVhZFVJbnQxNkxFKENvbnN0YW50cy5DRU5IT1cpO1xuICAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgKDIgYnl0ZXMgdGltZSwgMiBieXRlcyBkYXRlKVxuICAgICAgICAgICAgX3RpbWUgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuQ0VOVElNKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgICAgICAgICAgX2NyYyA9IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5DRU5DUkMpO1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBfY29tcHJlc3NlZFNpemUgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuQ0VOU0laKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBfc2l6ZSA9IGRhdGEucmVhZFVJbnQzMkxFKENvbnN0YW50cy5DRU5MRU4pO1xuICAgICAgICAgICAgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgICAgICAgICBfZm5hbWVMZW4gPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VOTkFNKTtcbiAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aFxuICAgICAgICAgICAgX2V4dHJhTGVuID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTkVYVCk7XG4gICAgICAgICAgICAvLyBmaWxlIGNvbW1lbnQgbGVuZ3RoXG4gICAgICAgICAgICBfY29tTGVuID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTkNPTSk7XG4gICAgICAgICAgICAvLyB2b2x1bWUgbnVtYmVyIHN0YXJ0XG4gICAgICAgICAgICBfZGlza1N0YXJ0ID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkNFTkRTSyk7XG4gICAgICAgICAgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIF9pbmF0dHIgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuQ0VOQVRUKTtcbiAgICAgICAgICAgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgX2F0dHIgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuQ0VOQVRYKTtcbiAgICAgICAgICAgIC8vIExPQyBoZWFkZXIgb2Zmc2V0XG4gICAgICAgICAgICBfb2Zmc2V0ID0gZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkNFTk9GRik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YUhlYWRlclRvQmluYXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBMT0MgaGVhZGVyIHNpemUgKDMwIGJ5dGVzKVxuICAgICAgICAgICAgdmFyIGRhdGEgPSBCdWZmZXIuYWxsb2MoQ29uc3RhbnRzLkxPQ0hEUik7XG4gICAgICAgICAgICAvLyBcIlBLXFwwMDNcXDAwNFwiXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoQ29uc3RhbnRzLkxPQ1NJRywgMCk7XG4gICAgICAgICAgICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0XG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX3ZlcnNpb24sIENvbnN0YW50cy5MT0NWRVIpO1xuICAgICAgICAgICAgLy8gZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX2ZsYWdzLCBDb25zdGFudHMuTE9DRkxHKTtcbiAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIG1ldGhvZFxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF9tZXRob2QsIENvbnN0YW50cy5MT0NIT1cpO1xuICAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgKDIgYnl0ZXMgdGltZSwgMiBieXRlcyBkYXRlKVxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKF90aW1lLCBDb25zdGFudHMuTE9DVElNKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBmaWxlIGNyYy0zMiB2YWx1ZVxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKF9jcmMsIENvbnN0YW50cy5MT0NDUkMpO1xuICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX2NvbXByZXNzZWRTaXplLCBDb25zdGFudHMuTE9DU0laKTtcbiAgICAgICAgICAgIC8vIHVuY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX3NpemUsIENvbnN0YW50cy5MT0NMRU4pO1xuICAgICAgICAgICAgLy8gZmlsZW5hbWUgbGVuZ3RoXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX2ZuYW1lTGVuLCBDb25zdGFudHMuTE9DTkFNKTtcbiAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aFxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF9leHRyYUxlbiwgQ29uc3RhbnRzLkxPQ0VYVCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSxcblxuICAgICAgICBlbnRyeUhlYWRlclRvQmluYXJ5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBDRU4gaGVhZGVyIHNpemUgKDQ2IGJ5dGVzKVxuICAgICAgICAgICAgdmFyIGRhdGEgPSBCdWZmZXIuYWxsb2MoQ29uc3RhbnRzLkNFTkhEUiArIF9mbmFtZUxlbiArIF9leHRyYUxlbiArIF9jb21MZW4pO1xuICAgICAgICAgICAgLy8gXCJQS1xcMDAxXFwwMDJcIlxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKENvbnN0YW50cy5DRU5TSUcsIDApO1xuICAgICAgICAgICAgLy8gdmVyc2lvbiBtYWRlIGJ5XG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX3Zlck1hZGUsIENvbnN0YW50cy5DRU5WRU0pO1xuICAgICAgICAgICAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdFxuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF92ZXJzaW9uLCBDb25zdGFudHMuQ0VOVkVSKTtcbiAgICAgICAgICAgIC8vIGVuY3J5cHQsIGRlY3J5cHQgZmxhZ3NcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfZmxhZ3MsIENvbnN0YW50cy5DRU5GTEcpO1xuICAgICAgICAgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX21ldGhvZCwgQ29uc3RhbnRzLkNFTkhPVyk7XG4gICAgICAgICAgICAvLyBtb2RpZmljYXRpb24gdGltZSAoMiBieXRlcyB0aW1lLCAyIGJ5dGVzIGRhdGUpXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX3RpbWUsIENvbnN0YW50cy5DRU5USU0pO1xuICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIGZpbGUgY3JjLTMyIHZhbHVlXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX2NyYywgQ29uc3RhbnRzLkNFTkNSQyk7XG4gICAgICAgICAgICAvLyBjb21wcmVzc2VkIHNpemVcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MzJMRShfY29tcHJlc3NlZFNpemUsIENvbnN0YW50cy5DRU5TSVopO1xuICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIHNpemVcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MzJMRShfc2l6ZSwgQ29uc3RhbnRzLkNFTkxFTik7XG4gICAgICAgICAgICAvLyBmaWxlbmFtZSBsZW5ndGhcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfZm5hbWVMZW4sIENvbnN0YW50cy5DRU5OQU0pO1xuICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDE2TEUoX2V4dHJhTGVuLCBDb25zdGFudHMuQ0VORVhUKTtcbiAgICAgICAgICAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfY29tTGVuLCBDb25zdGFudHMuQ0VOQ09NKTtcbiAgICAgICAgICAgIC8vIHZvbHVtZSBudW1iZXIgc3RhcnRcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MTZMRShfZGlza1N0YXJ0LCBDb25zdGFudHMuQ0VORFNLKTtcbiAgICAgICAgICAgIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKF9pbmF0dHIsIENvbnN0YW50cy5DRU5BVFQpO1xuICAgICAgICAgICAgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBkYXRhLndyaXRlVUludDMyTEUoX2F0dHIsIENvbnN0YW50cy5DRU5BVFgpO1xuICAgICAgICAgICAgLy8gTE9DIGhlYWRlciBvZmZzZXRcbiAgICAgICAgICAgIGRhdGEud3JpdGVVSW50MzJMRShfb2Zmc2V0LCBDb25zdGFudHMuQ0VOT0ZGKTtcbiAgICAgICAgICAgIC8vIGZpbGwgYWxsIHdpdGhcbiAgICAgICAgICAgIGRhdGEuZmlsbCgweDAwLCBDb25zdGFudHMuQ0VOSERSKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvSlNPTjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBmdW5jdGlvbiAobnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnIgKyBcIiBieXRlc1wiO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtYWRlOiBfdmVyTWFkZSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBfdmVyc2lvbixcbiAgICAgICAgICAgICAgICBmbGFnczogX2ZsYWdzLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogVXRpbHMubWV0aG9kVG9TdHJpbmcoX21ldGhvZCksXG4gICAgICAgICAgICAgICAgdGltZTogdGhpcy50aW1lLFxuICAgICAgICAgICAgICAgIGNyYzogXCIweFwiICsgX2NyYy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2VkU2l6ZTogYnl0ZXMoX2NvbXByZXNzZWRTaXplKSxcbiAgICAgICAgICAgICAgICBzaXplOiBieXRlcyhfc2l6ZSksXG4gICAgICAgICAgICAgICAgZmlsZU5hbWVMZW5ndGg6IGJ5dGVzKF9mbmFtZUxlbiksXG4gICAgICAgICAgICAgICAgZXh0cmFMZW5ndGg6IGJ5dGVzKF9leHRyYUxlbiksXG4gICAgICAgICAgICAgICAgY29tbWVudExlbmd0aDogYnl0ZXMoX2NvbUxlbiksXG4gICAgICAgICAgICAgICAgZGlza051bVN0YXJ0OiBfZGlza1N0YXJ0LFxuICAgICAgICAgICAgICAgIGluQXR0cjogX2luYXR0cixcbiAgICAgICAgICAgICAgICBhdHRyOiBfYXR0cixcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IF9vZmZzZXQsXG4gICAgICAgICAgICAgICAgZW50cnlIZWFkZXJTaXplOiBieXRlcyhDb25zdGFudHMuQ0VOSERSICsgX2ZuYW1lTGVuICsgX2V4dHJhTGVuICsgX2NvbUxlbilcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpLCBudWxsLCBcIlxcdFwiKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgInZhciBVdGlscyA9IHJlcXVpcmUoXCIuLi91dGlsXCIpLFxuICAgIENvbnN0YW50cyA9IFV0aWxzLkNvbnN0YW50cztcblxuLyogVGhlIGVudHJpZXMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF92b2x1bWVFbnRyaWVzID0gMCxcbiAgICAgICAgX3RvdGFsRW50cmllcyA9IDAsXG4gICAgICAgIF9zaXplID0gMCxcbiAgICAgICAgX29mZnNldCA9IDAsXG4gICAgICAgIF9jb21tZW50TGVuZ3RoID0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldCBkaXNrRW50cmllcygpIHtcbiAgICAgICAgICAgIHJldHVybiBfdm9sdW1lRW50cmllcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGRpc2tFbnRyaWVzKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfdm9sdW1lRW50cmllcyA9IF90b3RhbEVudHJpZXMgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IHRvdGFsRW50cmllcygpIHtcbiAgICAgICAgICAgIHJldHVybiBfdG90YWxFbnRyaWVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgdG90YWxFbnRyaWVzKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfdG90YWxFbnRyaWVzID0gX3ZvbHVtZUVudHJpZXMgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBzaXplKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfc2l6ZSA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgb2Zmc2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vZmZzZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBvZmZzZXQoLypOdW1iZXIqLyB2YWwpIHtcbiAgICAgICAgICAgIF9vZmZzZXQgPSB2YWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGNvbW1lbnRMZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NvbW1lbnRMZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjb21tZW50TGVuZ3RoKC8qTnVtYmVyKi8gdmFsKSB7XG4gICAgICAgICAgICBfY29tbWVudExlbmd0aCA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgbWFpbkhlYWRlclNpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29uc3RhbnRzLkVOREhEUiArIF9jb21tZW50TGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIGxvYWRGcm9tQmluYXJ5OiBmdW5jdGlvbiAoLypCdWZmZXIqLyBkYXRhKSB7XG4gICAgICAgICAgICAvLyBkYXRhIHNob3VsZCBiZSAyMiBieXRlcyBhbmQgc3RhcnQgd2l0aCBcIlBLIDA1IDA2XCJcbiAgICAgICAgICAgIC8vIG9yIGJlIDU2KyBieXRlcyBhbmQgc3RhcnQgd2l0aCBcIlBLIDA2IDA2XCIgZm9yIFppcDY0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGRhdGEubGVuZ3RoICE9PSBDb25zdGFudHMuRU5ESERSIHx8IGRhdGEucmVhZFVJbnQzMkxFKDApICE9PSBDb25zdGFudHMuRU5EU0lHKSAmJlxuICAgICAgICAgICAgICAgIChkYXRhLmxlbmd0aCA8IENvbnN0YW50cy5aSVA2NEhEUiB8fCBkYXRhLnJlYWRVSW50MzJMRSgwKSAhPT0gQ29uc3RhbnRzLlpJUDY0U0lHKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5JTlZBTElEX0VORCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnJlYWRVSW50MzJMRSgwKSA9PT0gQ29uc3RhbnRzLkVORFNJRykge1xuICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgdm9sdW1lXG4gICAgICAgICAgICAgICAgX3ZvbHVtZUVudHJpZXMgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuRU5EU1VCKTtcbiAgICAgICAgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgICAgICAgICAgICAgIF90b3RhbEVudHJpZXMgPSBkYXRhLnJlYWRVSW50MTZMRShDb25zdGFudHMuRU5EVE9UKTtcbiAgICAgICAgICAgICAgICAvLyBjZW50cmFsIGRpcmVjdG9yeSBzaXplIGluIGJ5dGVzXG4gICAgICAgICAgICAgICAgX3NpemUgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuRU5EU0laKTtcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBkYXRhLnJlYWRVSW50MzJMRShDb25zdGFudHMuRU5ET0ZGKTtcbiAgICAgICAgICAgICAgICAvLyB6aXAgZmlsZSBjb21tZW50IGxlbmd0aFxuICAgICAgICAgICAgICAgIF9jb21tZW50TGVuZ3RoID0gZGF0YS5yZWFkVUludDE2TEUoQ29uc3RhbnRzLkVORENPTSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgdm9sdW1lXG4gICAgICAgICAgICAgICAgX3ZvbHVtZUVudHJpZXMgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0U1VCKTtcbiAgICAgICAgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgICAgICAgICAgICAgIF90b3RhbEVudHJpZXMgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0VE9UKTtcbiAgICAgICAgICAgICAgICAvLyBjZW50cmFsIGRpcmVjdG9yeSBzaXplIGluIGJ5dGVzXG4gICAgICAgICAgICAgICAgX3NpemUgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0U0laKTtcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBVdGlscy5yZWFkQmlnVUludDY0TEUoZGF0YSwgQ29uc3RhbnRzLlpJUDY0T0ZGKTtcblxuICAgICAgICAgICAgICAgIF9jb21tZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0b0JpbmFyeTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGIgPSBCdWZmZXIuYWxsb2MoQ29uc3RhbnRzLkVOREhEUiArIF9jb21tZW50TGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIFwiUEsgMDUgMDZcIiBzaWduYXR1cmVcbiAgICAgICAgICAgIGIud3JpdGVVSW50MzJMRShDb25zdGFudHMuRU5EU0lHLCAwKTtcbiAgICAgICAgICAgIGIud3JpdGVVSW50MzJMRSgwLCA0KTtcbiAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoaXMgdm9sdW1lXG4gICAgICAgICAgICBiLndyaXRlVUludDE2TEUoX3ZvbHVtZUVudHJpZXMsIENvbnN0YW50cy5FTkRTVUIpO1xuICAgICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGVudHJpZXNcbiAgICAgICAgICAgIGIud3JpdGVVSW50MTZMRShfdG90YWxFbnRyaWVzLCBDb25zdGFudHMuRU5EVE9UKTtcbiAgICAgICAgICAgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IHNpemUgaW4gYnl0ZXNcbiAgICAgICAgICAgIGIud3JpdGVVSW50MzJMRShfc2l6ZSwgQ29uc3RhbnRzLkVORFNJWik7XG4gICAgICAgICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICAgICAgYi53cml0ZVVJbnQzMkxFKF9vZmZzZXQsIENvbnN0YW50cy5FTkRPRkYpO1xuICAgICAgICAgICAgLy8gemlwIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgIGIud3JpdGVVSW50MTZMRShfY29tbWVudExlbmd0aCwgQ29uc3RhbnRzLkVORENPTSk7XG4gICAgICAgICAgICAvLyBmaWxsIGNvbW1lbnQgbWVtb3J5IHdpdGggc3BhY2VzIHNvIG5vIGdhcmJhZ2UgaXMgbGVmdCB0aGVyZVxuICAgICAgICAgICAgYi5maWxsKFwiIFwiLCBDb25zdGFudHMuRU5ESERSKTtcblxuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9KU09OOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGVzIDB4MDAwMCBzdHlsZSBvdXRwdXRcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGZ1bmN0aW9uIChuciwgbGVuKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9mZnMgPSBuci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAob2Zmcy5sZW5ndGggPCBsZW4pIG9mZnMgPSBcIjBcIiArIG9mZnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiMHhcIiArIG9mZnM7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRpc2tFbnRyaWVzOiBfdm9sdW1lRW50cmllcyxcbiAgICAgICAgICAgICAgICB0b3RhbEVudHJpZXM6IF90b3RhbEVudHJpZXMsXG4gICAgICAgICAgICAgICAgc2l6ZTogX3NpemUgKyBcIiBieXRlc1wiLFxuICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0KF9vZmZzZXQsIDQpLFxuICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGg6IF9jb21tZW50TGVuZ3RoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSwgbnVsbCwgXCJcXHRcIik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJleHBvcnRzLkVudHJ5SGVhZGVyID0gcmVxdWlyZShcIi4vZW50cnlIZWFkZXJcIik7XG5leHBvcnRzLk1haW5IZWFkZXIgPSByZXF1aXJlKFwiLi9tYWluSGVhZGVyXCIpO1xuIiwgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKC8qQnVmZmVyKi8gaW5idWYpIHtcbiAgICB2YXIgemxpYiA9IHJlcXVpcmUoXCJ6bGliXCIpO1xuXG4gICAgdmFyIG9wdHMgPSB7IGNodW5rU2l6ZTogKHBhcnNlSW50KGluYnVmLmxlbmd0aCAvIDEwMjQpICsgMSkgKiAxMDI0IH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZsYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gemxpYi5kZWZsYXRlUmF3U3luYyhpbmJ1Ziwgb3B0cyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVmbGF0ZUFzeW5jOiBmdW5jdGlvbiAoLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KG9wdHMpLFxuICAgICAgICAgICAgICAgIHBhcnRzID0gW10sXG4gICAgICAgICAgICAgICAgdG90YWwgPSAwO1xuICAgICAgICAgICAgdG1wLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdG90YWwgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRtcC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyh0b3RhbCksXG4gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSAwO1xuICAgICAgICAgICAgICAgIGJ1Zi5maWxsKDApO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgcGFydC5jb3B5KGJ1Ziwgd3JpdHRlbik7XG4gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gKz0gcGFydC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGJ1Zik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRtcC5lbmQoaW5idWYpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLypCdWZmZXIqLyBpbmJ1Zikge1xuICAgIHZhciB6bGliID0gcmVxdWlyZShcInpsaWJcIik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmZsYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gemxpYi5pbmZsYXRlUmF3U3luYyhpbmJ1Zik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5mbGF0ZUFzeW5jOiBmdW5jdGlvbiAoLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCksXG4gICAgICAgICAgICAgICAgcGFydHMgPSBbXSxcbiAgICAgICAgICAgICAgICB0b3RhbCA9IDA7XG4gICAgICAgICAgICB0bXAub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG1wLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKHRvdGFsKSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiA9IDA7XG4gICAgICAgICAgICAgICAgYnVmLmZpbGwoMCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0LmNvcHkoYnVmLCB3cml0dGVuKTtcbiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiArPSBwYXJ0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soYnVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdG1wLmVuZChpbmJ1Zik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gbm9kZSBjcnlwdCwgd2UgdXNlIGl0IGZvciBnZW5lcmF0ZSBzYWx0XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm9kZS9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zXG5jb25zdCB7IHJhbmRvbUZpbGxTeW5jIH0gPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuXG4vLyBnZW5lcmF0ZSBDUkMzMiBsb29rdXAgdGFibGVcbmNvbnN0IGNyY3RhYmxlID0gbmV3IFVpbnQzMkFycmF5KDI1NikubWFwKCh0LCBjcmMpID0+IHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xuICAgICAgICBpZiAoMCAhPT0gKGNyYyAmIDEpKSB7XG4gICAgICAgICAgICBjcmMgPSAoY3JjID4+PiAxKSBeIDB4ZWRiODgzMjA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmMgPj4+PSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmMgPj4+IDA7XG59KTtcblxuLy8gQy1zdHlsZSB1SW50MzIgTXVsdGlwbHkgKGRpc2NhcmRzIGhpZ2hlciBiaXRzLCB3aGVuIEpTIG11bHRpcGx5IGRpc2NhcmRzIGxvd2VyIGJpdHMpXG5jb25zdCB1TXVsID0gKGEsIGIpID0+IE1hdGguaW11bChhLCBiKSA+Pj4gMDtcblxuLy8gY3JjMzIgYnl0ZSBzaW5nbGUgdXBkYXRlIChhY3R1YWxseSBzYW1lIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdXRpbHMuY3JjMzIgZnVuY3Rpb24gOikgKVxuY29uc3QgY3JjMzJ1cGRhdGUgPSAocENyYzMyLCBidmFsKSA9PiB7XG4gICAgcmV0dXJuIGNyY3RhYmxlWyhwQ3JjMzIgXiBidmFsKSAmIDB4ZmZdIF4gKHBDcmMzMiA+Pj4gOCk7XG59O1xuXG4vLyBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBzYWx0IGZvciBlbmNyeXRpb24gaGVhZGVyXG5jb25zdCBnZW5TYWx0ID0gKCkgPT4ge1xuICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByYW5kb21GaWxsU3luYykge1xuICAgICAgICByZXR1cm4gcmFuZG9tRmlsbFN5bmMoQnVmZmVyLmFsbG9jKDEyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgaWYgZnVuY3Rpb24gaXMgbm90IGRlZmluZWRcbiAgICAgICAgcmV0dXJuIGdlblNhbHQubm9kZSgpO1xuICAgIH1cbn07XG5cbi8vIHNhbHQgZ2VuZXJhdGlvbiB3aXRoIG5vZGUgcmFuZG9tIGZ1bmN0aW9uIChtYWlubHkgYXMgZmFsbGJhY2spXG5nZW5TYWx0Lm5vZGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2FsdCA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgY29uc3QgbGVuID0gc2FsdC5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgc2FsdFtpXSA9IChNYXRoLnJhbmRvbSgpICogMjU2KSAmIDB4ZmY7XG4gICAgcmV0dXJuIHNhbHQ7XG59O1xuXG4vLyBnZW5lcmFsIGNvbmZpZ1xuY29uc3QgY29uZmlnID0ge1xuICAgIGdlblNhbHRcbn07XG5cbi8vIENsYXNzIEluaXRrZXlzIGhhbmRsZXMgc2FtZSBiYXNpYyBvcHMgd2l0aCBrZXlzXG5mdW5jdGlvbiBJbml0a2V5cyhwdykge1xuICAgIGNvbnN0IHBhc3MgPSBCdWZmZXIuaXNCdWZmZXIocHcpID8gcHcgOiBCdWZmZXIuZnJvbShwdyk7XG4gICAgdGhpcy5rZXlzID0gbmV3IFVpbnQzMkFycmF5KFsweDEyMzQ1Njc4LCAweDIzNDU2Nzg5LCAweDM0NTY3ODkwXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5cyhwYXNzW2ldKTtcbiAgICB9XG59XG5cbkluaXRrZXlzLnByb3RvdHlwZS51cGRhdGVLZXlzID0gZnVuY3Rpb24gKGJ5dGVWYWx1ZSkge1xuICAgIGNvbnN0IGtleXMgPSB0aGlzLmtleXM7XG4gICAga2V5c1swXSA9IGNyYzMydXBkYXRlKGtleXNbMF0sIGJ5dGVWYWx1ZSk7XG4gICAga2V5c1sxXSArPSBrZXlzWzBdICYgMHhmZjtcbiAgICBrZXlzWzFdID0gdU11bChrZXlzWzFdLCAxMzQ3NzU4MTMpICsgMTtcbiAgICBrZXlzWzJdID0gY3JjMzJ1cGRhdGUoa2V5c1syXSwga2V5c1sxXSA+Pj4gMjQpO1xuICAgIHJldHVybiBieXRlVmFsdWU7XG59O1xuXG5Jbml0a2V5cy5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBrID0gKHRoaXMua2V5c1syXSB8IDIpID4+PiAwOyAvLyBrZXlcbiAgICByZXR1cm4gKHVNdWwoaywgayBeIDEpID4+IDgpICYgMHhmZjsgLy8gZGVjb2RlXG59O1xuXG5mdW5jdGlvbiBtYWtlX2RlY3J5cHRlcigvKkJ1ZmZlciovIHB3ZCkge1xuICAgIC8vIDEuIFN0YWdlIGluaXRpYWxpemUga2V5XG4gICAgY29uc3Qga2V5cyA9IG5ldyBJbml0a2V5cyhwd2QpO1xuXG4gICAgLy8gcmV0dXJuIGRlY3J5cHRlciBmdW5jdGlvblxuICAgIHJldHVybiBmdW5jdGlvbiAoLypCdWZmZXIqLyBkYXRhKSB7XG4gICAgICAgIC8vIHJlc3VsdCAtIHdlIGNyZWF0ZSBuZXcgQnVmZmVyIGZvciByZXN1bHRzXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICAvLyBwcm9jZXNzIGlucHV0IGRhdGFcbiAgICAgICAgZm9yIChsZXQgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICAvL2MgXj0ga2V5cy5uZXh0KCk7XG4gICAgICAgICAgICAvL3Jlc3VsdFtwb3MrK10gPSBjOyAvLyBkZWNvZGUgJiBTYXZlIFZhbHVlXG4gICAgICAgICAgICByZXN1bHRbcG9zKytdID0ga2V5cy51cGRhdGVLZXlzKGMgXiBrZXlzLm5leHQoKSk7IC8vIHVwZGF0ZSBrZXlzIHdpdGggZGVjb2RlZCBieXRlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYWtlX2VuY3J5cHRlcigvKkJ1ZmZlciovIHB3ZCkge1xuICAgIC8vIDEuIFN0YWdlIGluaXRpYWxpemUga2V5XG4gICAgY29uc3Qga2V5cyA9IG5ldyBJbml0a2V5cyhwd2QpO1xuXG4gICAgLy8gcmV0dXJuIGVuY3J5cHRpbmcgZnVuY3Rpb24sIHJlc3VsdCBhbmQgcG9zIGlzIGhlcmUgc28gd2UgZG9udCBoYXZlIHRvIG1lcmdlIGJ1ZmZlcnMgbGF0ZXJcbiAgICByZXR1cm4gZnVuY3Rpb24gKC8qQnVmZmVyKi8gZGF0YSwgLypCdWZmZXIqLyByZXN1bHQsIC8qIE51bWJlciAqLyBwb3MgPSAwKSB7XG4gICAgICAgIC8vIHJlc3VsdCAtIHdlIGNyZWF0ZSBuZXcgQnVmZmVyIGZvciByZXN1bHRzXG4gICAgICAgIGlmICghcmVzdWx0KSByZXN1bHQgPSBCdWZmZXIuYWxsb2MoZGF0YS5sZW5ndGgpO1xuICAgICAgICAvLyBwcm9jZXNzIGlucHV0IGRhdGFcbiAgICAgICAgZm9yIChsZXQgYyBvZiBkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBrID0ga2V5cy5uZXh0KCk7IC8vIHNhdmUga2V5IGJ5dGVcbiAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSBjIF4gazsgLy8gc2F2ZSB2YWxcbiAgICAgICAgICAgIGtleXMudXBkYXRlS2V5cyhjKTsgLy8gdXBkYXRlIGtleXMgd2l0aCBkZWNvZGVkIGJ5dGVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGRlY3J5cHQoLypCdWZmZXIqLyBkYXRhLCAvKk9iamVjdCovIGhlYWRlciwgLypTdHJpbmcsIEJ1ZmZlciovIHB3ZCkge1xuICAgIGlmICghZGF0YSB8fCAhQnVmZmVyLmlzQnVmZmVyKGRhdGEpIHx8IGRhdGEubGVuZ3RoIDwgMTIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG5cbiAgICAvLyAxLiBXZSBJbml0aWFsaXplIGFuZCBnZW5lcmF0ZSBkZWNyeXB0aW5nIGZ1bmN0aW9uXG4gICAgY29uc3QgZGVjcnlwdGVyID0gbWFrZV9kZWNyeXB0ZXIocHdkKTtcblxuICAgIC8vIDIuIGRlY3J5cHQgc2FsdCB3aGF0IGlzIGFsd2F5cyAxMiBieXRlcyBhbmQgaXMgYSBwYXJ0IG9mIGZpbGUgY29udGVudFxuICAgIGNvbnN0IHNhbHQgPSBkZWNyeXB0ZXIoZGF0YS5zbGljZSgwLCAxMikpO1xuXG4gICAgLy8gMy4gZG9lcyBwYXNzd29yZCBtZWV0IGV4cGVjdGF0aW9uc1xuICAgIGlmIChzYWx0WzExXSAhPT0gaGVhZGVyLmNyYyA+Pj4gMjQpIHtcbiAgICAgICAgdGhyb3cgXCJBRE0tWklQOiBXcm9uZyBQYXNzd29yZFwiO1xuICAgIH1cblxuICAgIC8vIDQuIGRlY29kZSBjb250ZW50XG4gICAgcmV0dXJuIGRlY3J5cHRlcihkYXRhLnNsaWNlKDEyKSk7XG59XG5cbi8vIGxldHMgYWRkIHdheSB0byBwb3B1bGF0ZSBzYWx0LCBOT1QgUkVDT01NRU5ERUQgZm9yIHByb2R1Y3Rpb24gYnV0IG1heWJlIHVzZWZ1bCBmb3IgdGVzdGluZyBnZW5lcmFsIGZ1bmN0aW9uYWxpdHlcbmZ1bmN0aW9uIF9zYWx0ZXIoZGF0YSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoZGF0YSkgJiYgZGF0YS5sZW5ndGggPj0gMTIpIHtcbiAgICAgICAgLy8gYmUgYXdhcmUgLSBjdXJyZW50bHkgc2FsdGluZyBidWZmZXIgZGF0YSBpcyBtb2RpZmllZFxuICAgICAgICBjb25maWcuZ2VuU2FsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnNsaWNlKDAsIDEyKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFwibm9kZVwiKSB7XG4gICAgICAgIC8vIHRlc3Qgc2FsdCBnZW5lcmF0aW9uIHdpdGggbm9kZSByYW5kb20gZnVuY3Rpb25cbiAgICAgICAgY29uZmlnLmdlblNhbHQgPSBnZW5TYWx0Lm5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgbm90IGFjY2VwdGFibGUgY29uZmlnIGdldHMgcmVzZXQuXG4gICAgICAgIGNvbmZpZy5nZW5TYWx0ID0gZ2VuU2FsdDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuY3J5cHQoLypCdWZmZXIqLyBkYXRhLCAvKk9iamVjdCovIGhlYWRlciwgLypTdHJpbmcsIEJ1ZmZlciovIHB3ZCwgLypCb29sZWFuKi8gb2xkbGlrZSA9IGZhbHNlKSB7XG4gICAgLy8gMS4gdGVzdCBkYXRhIGlmIGRhdGEgaXMgbm90IEJ1ZmZlciB3ZSBtYWtlIGJ1ZmZlciBmcm9tIGl0XG4gICAgaWYgKGRhdGEgPT0gbnVsbCkgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICAvLyBpZiBkYXRhIGlzIG5vdCBidWZmZXIgYmUgbWFrZSBidWZmZXIgZnJvbSBpdFxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSBkYXRhID0gQnVmZmVyLmZyb20oZGF0YS50b1N0cmluZygpKTtcblxuICAgIC8vIDIuIFdlIEluaXRpYWxpemUgYW5kIGdlbmVyYXRlIGVuY3J5cHRpbmcgZnVuY3Rpb25cbiAgICBjb25zdCBlbmNyeXB0ZXIgPSBtYWtlX2VuY3J5cHRlcihwd2QpO1xuXG4gICAgLy8gMy4gZ2VuZXJhdGUgc2FsdCAoMTItYnl0ZXMgb2YgcmFuZG9tIGRhdGEpXG4gICAgY29uc3Qgc2FsdCA9IGNvbmZpZy5nZW5TYWx0KCk7XG4gICAgc2FsdFsxMV0gPSAoaGVhZGVyLmNyYyA+Pj4gMjQpICYgMHhmZjtcblxuICAgIC8vIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGJlZm9yZSBQS1ppcCAyLjA0ZykgdXNlZCB0d28gYnl0ZSBjaGVja1xuICAgIGlmIChvbGRsaWtlKSBzYWx0WzEwXSA9IChoZWFkZXIuY3JjID4+PiAxNikgJiAweGZmO1xuXG4gICAgLy8gNC4gY3JlYXRlIG91dHB1dFxuICAgIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyhkYXRhLmxlbmd0aCArIDEyKTtcbiAgICBlbmNyeXB0ZXIoc2FsdCwgcmVzdWx0KTtcblxuICAgIC8vIGZpbmFsbHkgZW5jb2RlIGNvbnRlbnRcbiAgICByZXR1cm4gZW5jcnlwdGVyKGRhdGEsIHJlc3VsdCwgMTIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZGVjcnlwdCwgZW5jcnlwdCwgX3NhbHRlciB9O1xuIiwgImV4cG9ydHMuRGVmbGF0ZXIgPSByZXF1aXJlKFwiLi9kZWZsYXRlclwiKTtcbmV4cG9ydHMuSW5mbGF0ZXIgPSByZXF1aXJlKFwiLi9pbmZsYXRlclwiKTtcbmV4cG9ydHMuWmlwQ3J5cHRvID0gcmVxdWlyZShcIi4vemlwY3J5cHRvXCIpO1xuIiwgInZhciBVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxcIiksXG4gICAgSGVhZGVycyA9IHJlcXVpcmUoXCIuL2hlYWRlcnNcIiksXG4gICAgQ29uc3RhbnRzID0gVXRpbHMuQ29uc3RhbnRzLFxuICAgIE1ldGhvZHMgPSByZXF1aXJlKFwiLi9tZXRob2RzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgvKkJ1ZmZlciovIGlucHV0KSB7XG4gICAgdmFyIF9lbnRyeUhlYWRlciA9IG5ldyBIZWFkZXJzLkVudHJ5SGVhZGVyKCksXG4gICAgICAgIF9lbnRyeU5hbWUgPSBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIF9jb21tZW50ID0gQnVmZmVyLmFsbG9jKDApLFxuICAgICAgICBfaXNEaXJlY3RvcnkgPSBmYWxzZSxcbiAgICAgICAgdW5jb21wcmVzc2VkRGF0YSA9IG51bGwsXG4gICAgICAgIF9leHRyYSA9IEJ1ZmZlci5hbGxvYygwKTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXByZXNzZWREYXRhRnJvbVppcCgpIHtcbiAgICAgICAgaWYgKCFpbnB1dCB8fCAhQnVmZmVyLmlzQnVmZmVyKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgfVxuICAgICAgICBfZW50cnlIZWFkZXIubG9hZERhdGFIZWFkZXJGcm9tQmluYXJ5KGlucHV0KTtcbiAgICAgICAgcmV0dXJuIGlucHV0LnNsaWNlKF9lbnRyeUhlYWRlci5yZWFsRGF0YU9mZnNldCwgX2VudHJ5SGVhZGVyLnJlYWxEYXRhT2Zmc2V0ICsgX2VudHJ5SGVhZGVyLmNvbXByZXNzZWRTaXplKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmMzMk9LKGRhdGEpIHtcbiAgICAgICAgLy8gaWYgYml0IDMgKDB4MDgpIG9mIHRoZSBnZW5lcmFsLXB1cnBvc2UgZmxhZ3MgZmllbGQgaXMgc2V0LCB0aGVuIHRoZSBDUkMtMzIgYW5kIGZpbGUgc2l6ZXMgYXJlIG5vdCBrbm93biB3aGVuIHRoZSBoZWFkZXIgaXMgd3JpdHRlblxuICAgICAgICBpZiAoKF9lbnRyeUhlYWRlci5mbGFncyAmIDB4OCkgIT09IDB4OCkge1xuICAgICAgICAgICAgaWYgKFV0aWxzLmNyYzMyKGRhdGEpICE9PSBfZW50cnlIZWFkZXIuZGF0YUhlYWRlci5jcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBAVE9ETzogbG9hZCBhbmQgY2hlY2sgZGF0YSBkZXNjcmlwdG9yIGhlYWRlclxuICAgICAgICAgICAgLy8gVGhlIGZpZWxkcyBpbiB0aGUgbG9jYWwgaGVhZGVyIGFyZSBmaWxsZWQgd2l0aCB6ZXJvLCBhbmQgdGhlIENSQy0zMiBhbmQgc2l6ZSBhcmUgYXBwZW5kZWQgaW4gYSAxMi1ieXRlIHN0cnVjdHVyZVxuICAgICAgICAgICAgLy8gKG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgYSA0LWJ5dGUgc2lnbmF0dXJlKSBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29tcHJlc3NlZCBkYXRhOlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlY29tcHJlc3MoLypCb29sZWFuKi8gYXN5bmMsIC8qRnVuY3Rpb24qLyBjYWxsYmFjaywgLypTdHJpbmcsIEJ1ZmZlciovIHBhc3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgYXN5bmMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhc3MgPSBhc3luYztcbiAgICAgICAgICAgIGFzeW5jID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGlmIChhc3luYyAmJiBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKEJ1ZmZlci5hbGxvYygwKSwgVXRpbHMuRXJyb3JzLkRJUkVDVE9SWV9DT05URU5UX0VSUk9SKTsgLy9zaSBhZGRlZCBlcnJvci5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29tcHJlc3NlZERhdGEgPSBnZXRDb21wcmVzc2VkRGF0YUZyb21aaXAoKTtcblxuICAgICAgICBpZiAoY29tcHJlc3NlZERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWxlIGlzIGVtcHR5LCBub3RoaW5nIHRvIGRlY29tcHJlc3MuXG4gICAgICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIGNhbGxiYWNrKGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2VkRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfZW50cnlIZWFkZXIuZW5jcmlwdGVkKSB7XG4gICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHBhc3MgJiYgIUJ1ZmZlci5pc0J1ZmZlcihwYXNzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFETS1aSVA6IEluY29tcGF0aWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wcmVzc2VkRGF0YSA9IE1ldGhvZHMuWmlwQ3J5cHRvLmRlY3J5cHQoY29tcHJlc3NlZERhdGEsIF9lbnRyeUhlYWRlciwgcGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF0YSA9IEJ1ZmZlci5hbGxvYyhfZW50cnlIZWFkZXIuc2l6ZSk7XG5cbiAgICAgICAgc3dpdGNoIChfZW50cnlIZWFkZXIubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGEuY29weShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNyYzMyT0soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhLCBVdGlscy5FcnJvcnMuQkFEX0NSQyk7IC8vc2kgYWRkZWQgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5CQURfQ1JDKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL3NpIGFkZGVkIG90aGVyd2lzZSBkaWQgbm90IHNlZW0gdG8gcmV0dXJuIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhc3luYyAmJiBjYWxsYmFjaykgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVXRpbHMuQ29uc3RhbnRzLkRFRkxBVEVEOlxuICAgICAgICAgICAgICAgIHZhciBpbmZsYXRlciA9IG5ldyBNZXRob2RzLkluZmxhdGVyKGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGluZmxhdGVyLmluZmxhdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb3B5KGRhdGEsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyYzMyT0soZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuQkFEX0NSQyArIFwiIFwiICsgX2VudHJ5TmFtZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlQXN5bmMoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvcHkocmVzdWx0LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3JjMzJPSyhyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCwgVXRpbHMuRXJyb3JzLkJBRF9DUkMpOyAvL3NpIGFkZGVkIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSBjYWxsYmFjayhCdWZmZXIuYWxsb2MoMCksIFV0aWxzLkVycm9ycy5VTktOT1dOX01FVEhPRCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5VTktOT1dOX01FVEhPRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wcmVzcygvKkJvb2xlYW4qLyBhc3luYywgLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICgoIXVuY29tcHJlc3NlZERhdGEgfHwgIXVuY29tcHJlc3NlZERhdGEubGVuZ3RoKSAmJiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBubyBkYXRhIHNldCBvciB0aGUgZGF0YSB3YXNuJ3QgY2hhbmdlZCB0byByZXF1aXJlIHJlY29tcHJlc3Npb25cbiAgICAgICAgICAgIGlmIChhc3luYyAmJiBjYWxsYmFjaykgY2FsbGJhY2soZ2V0Q29tcHJlc3NlZERhdGFGcm9tWmlwKCkpO1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXByZXNzZWREYXRhRnJvbVppcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVuY29tcHJlc3NlZERhdGEubGVuZ3RoICYmICFfaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIHZhciBjb21wcmVzc2VkRGF0YTtcbiAgICAgICAgICAgIC8vIExvY2FsIGZpbGUgaGVhZGVyXG4gICAgICAgICAgICBzd2l0Y2ggKF9lbnRyeUhlYWRlci5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFV0aWxzLkNvbnN0YW50cy5TVE9SRUQ6XG4gICAgICAgICAgICAgICAgICAgIF9lbnRyeUhlYWRlci5jb21wcmVzc2VkU2l6ZSA9IF9lbnRyeUhlYWRlci5zaXplO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhID0gQnVmZmVyLmFsbG9jKHVuY29tcHJlc3NlZERhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkRGF0YS5jb3B5KGNvbXByZXNzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIGNhbGxiYWNrKGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzZWREYXRhO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSBVdGlscy5Db25zdGFudHMuREVGTEFURUQ6XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWZsYXRlciA9IG5ldyBNZXRob2RzLkRlZmxhdGVyKHVuY29tcHJlc3NlZERhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVmbGF0ZWQgPSBkZWZsYXRlci5kZWZsYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIuY29tcHJlc3NlZFNpemUgPSBkZWZsYXRlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmbGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZsYXRlci5kZWZsYXRlQXN5bmMoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkRGF0YSA9IEJ1ZmZlci5hbGxvYyhkYXRhLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNvbXByZXNzZWRTaXplID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3B5KGNvbXByZXNzZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhjb21wcmVzc2VkRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZsYXRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFzeW5jICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhCdWZmZXIuYWxsb2MoMCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRVSW50NjRMRShidWZmZXIsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gKGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCkgPDwgNCkgKyBidWZmZXIucmVhZFVJbnQzMkxFKG9mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VFeHRyYShkYXRhKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgc2lnbmF0dXJlLCBzaXplLCBwYXJ0O1xuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZSA9IGRhdGEucmVhZFVJbnQxNkxFKG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICBwYXJ0ID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgICAgICBpZiAoQ29uc3RhbnRzLklEX1pJUDY0ID09PSBzaWduYXR1cmUpIHtcbiAgICAgICAgICAgICAgICBwYXJzZVppcDY0RXh0ZW5kZWRJbmZvcm1hdGlvbihwYXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vT3ZlcnJpZGUgaGVhZGVyIGZpZWxkIHZhbHVlcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBaSVA2NCBleHRyYSBmaWVsZFxuICAgIGZ1bmN0aW9uIHBhcnNlWmlwNjRFeHRlbmRlZEluZm9ybWF0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIHNpemUsIGNvbXByZXNzZWRTaXplLCBvZmZzZXQsIGRpc2tOdW1TdGFydDtcblxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPj0gQ29uc3RhbnRzLkVGX1pJUDY0X1NDT01QKSB7XG4gICAgICAgICAgICBzaXplID0gcmVhZFVJbnQ2NExFKGRhdGEsIENvbnN0YW50cy5FRl9aSVA2NF9TVU5DT01QKTtcbiAgICAgICAgICAgIGlmIChfZW50cnlIZWFkZXIuc2l6ZSA9PT0gQ29uc3RhbnRzLkVGX1pJUDY0X09SXzMyKSB7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLnNpemUgPSBzaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+PSBDb25zdGFudHMuRUZfWklQNjRfUkhPKSB7XG4gICAgICAgICAgICBjb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRShkYXRhLCBDb25zdGFudHMuRUZfWklQNjRfU0NPTVApO1xuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5jb21wcmVzc2VkU2l6ZSA9PT0gQ29uc3RhbnRzLkVGX1pJUDY0X09SXzMyKSB7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID49IENvbnN0YW50cy5FRl9aSVA2NF9EU04pIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHJlYWRVSW50NjRMRShkYXRhLCBDb25zdGFudHMuRUZfWklQNjRfUkhPKTtcbiAgICAgICAgICAgIGlmIChfZW50cnlIZWFkZXIub2Zmc2V0ID09PSBDb25zdGFudHMuRUZfWklQNjRfT1JfMzIpIHtcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+PSBDb25zdGFudHMuRUZfWklQNjRfRFNOICsgNCkge1xuICAgICAgICAgICAgZGlza051bVN0YXJ0ID0gZGF0YS5yZWFkVUludDMyTEUoQ29uc3RhbnRzLkVGX1pJUDY0X0RTTik7XG4gICAgICAgICAgICBpZiAoX2VudHJ5SGVhZGVyLmRpc2tOdW1TdGFydCA9PT0gQ29uc3RhbnRzLkVGX1pJUDY0X09SXzE2KSB7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmRpc2tOdW1TdGFydCA9IGRpc2tOdW1TdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldCBlbnRyeU5hbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2VudHJ5TmFtZS50b1N0cmluZygpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgcmF3RW50cnlOYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9lbnRyeU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBlbnRyeU5hbWUodmFsKSB7XG4gICAgICAgICAgICBfZW50cnlOYW1lID0gVXRpbHMudG9CdWZmZXIodmFsKTtcbiAgICAgICAgICAgIHZhciBsYXN0Q2hhciA9IF9lbnRyeU5hbWVbX2VudHJ5TmFtZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIF9pc0RpcmVjdG9yeSA9IGxhc3RDaGFyID09PSA0NyB8fCBsYXN0Q2hhciA9PT0gOTI7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIuZmlsZU5hbWVMZW5ndGggPSBfZW50cnlOYW1lLmxlbmd0aDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQgZXh0cmEoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2V4dHJhO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgZXh0cmEodmFsKSB7XG4gICAgICAgICAgICBfZXh0cmEgPSB2YWw7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIuZXh0cmFMZW5ndGggPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgcGFyc2VFeHRyYSh2YWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldCBjb21tZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9jb21tZW50LnRvU3RyaW5nKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjb21tZW50KHZhbCkge1xuICAgICAgICAgICAgX2NvbW1lbnQgPSBVdGlscy50b0J1ZmZlcih2YWwpO1xuICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNvbW1lbnRMZW5ndGggPSBfY29tbWVudC5sZW5ndGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgICAgICB2YXIgbiA9IF9lbnRyeU5hbWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHJldHVybiBfaXNEaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA/IG5cbiAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyKG4ubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgICAgICAgICAgICAgICAgLnBvcCgpXG4gICAgICAgICAgICAgICAgOiBuLnNwbGl0KFwiL1wiKS5wb3AoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGlzRGlyZWN0b3J5KCkge1xuICAgICAgICAgICAgcmV0dXJuIF9pc0RpcmVjdG9yeTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRDb21wcmVzc2VkRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXByZXNzKGZhbHNlLCBudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRDb21wcmVzc2VkRGF0YUFzeW5jOiBmdW5jdGlvbiAoLypGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb21wcmVzcyh0cnVlLCBjYWxsYmFjayk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RGF0YTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB1bmNvbXByZXNzZWREYXRhID0gVXRpbHMudG9CdWZmZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFfaXNEaXJlY3RvcnkgJiYgdW5jb21wcmVzc2VkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIuc2l6ZSA9IHVuY29tcHJlc3NlZERhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIF9lbnRyeUhlYWRlci5tZXRob2QgPSBVdGlscy5Db25zdGFudHMuREVGTEFURUQ7XG4gICAgICAgICAgICAgICAgX2VudHJ5SGVhZGVyLmNyYyA9IFV0aWxzLmNyYzMyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZvbGRlcnMgYW5kIGJsYW5rIGZpbGVzIHNob3VsZCBiZSBzdG9yZWRcbiAgICAgICAgICAgICAgICBfZW50cnlIZWFkZXIubWV0aG9kID0gVXRpbHMuQ29uc3RhbnRzLlNUT1JFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiAocGFzcykge1xuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5jaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuY29tcHJlc3NlZERhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvbXByZXNzKGZhbHNlLCBudWxsLCBwYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBnZXREYXRhQXN5bmM6IGZ1bmN0aW9uICgvKkZ1bmN0aW9uKi8gY2FsbGJhY2ssIHBhc3MpIHtcbiAgICAgICAgICAgIGlmIChfZW50cnlIZWFkZXIuY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuY29tcHJlc3NlZERhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWNvbXByZXNzKHRydWUsIGNhbGxiYWNrLCBwYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBzZXQgYXR0cihhdHRyKSB7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIuYXR0ciA9IGF0dHI7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBhdHRyKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9lbnRyeUhlYWRlci5hdHRyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldCBoZWFkZXIoLypCdWZmZXIqLyBkYXRhKSB7XG4gICAgICAgICAgICBfZW50cnlIZWFkZXIubG9hZEZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0IGhlYWRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiBfZW50cnlIZWFkZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFja0hlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gMS4gY3JlYXRlIGhlYWRlciAoYnVmZmVyKVxuICAgICAgICAgICAgdmFyIGhlYWRlciA9IF9lbnRyeUhlYWRlci5lbnRyeUhlYWRlclRvQmluYXJ5KCk7XG4gICAgICAgICAgICB2YXIgYWRkcG9zID0gVXRpbHMuQ29uc3RhbnRzLkNFTkhEUjtcbiAgICAgICAgICAgIC8vIDIuIGFkZCBmaWxlIG5hbWVcbiAgICAgICAgICAgIF9lbnRyeU5hbWUuY29weShoZWFkZXIsIGFkZHBvcyk7XG4gICAgICAgICAgICBhZGRwb3MgKz0gX2VudHJ5TmFtZS5sZW5ndGg7XG4gICAgICAgICAgICAvLyAzLiBhZGQgZXh0cmEgZGF0YVxuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5leHRyYUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIF9leHRyYS5jb3B5KGhlYWRlciwgYWRkcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRwb3MgKz0gX2VudHJ5SGVhZGVyLmV4dHJhTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNC4gYWRkIGZpbGUgY29tbWVudFxuICAgICAgICAgICAgaWYgKF9lbnRyeUhlYWRlci5jb21tZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgX2NvbW1lbnQuY29weShoZWFkZXIsIGFkZHBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvSlNPTjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBmdW5jdGlvbiAobnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI8XCIgKyAoKG5yICYmIG5yLmxlbmd0aCArIFwiIGJ5dGVzIGJ1ZmZlclwiKSB8fCBcIm51bGxcIikgKyBcIj5cIjtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW50cnlOYW1lOiB0aGlzLmVudHJ5TmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50LFxuICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5OiB0aGlzLmlzRGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGhlYWRlcjogX2VudHJ5SGVhZGVyLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzZWREYXRhOiBieXRlcyhpbnB1dCksXG4gICAgICAgICAgICAgICAgZGF0YTogYnl0ZXModW5jb21wcmVzc2VkRGF0YSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpLCBudWxsLCBcIlxcdFwiKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgImNvbnN0IFppcEVudHJ5ID0gcmVxdWlyZShcIi4vemlwRW50cnlcIik7XG5jb25zdCBIZWFkZXJzID0gcmVxdWlyZShcIi4vaGVhZGVyc1wiKTtcbmNvbnN0IFV0aWxzID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoLypCdWZmZXJ8bnVsbCovIGluQnVmZmVyLCAvKiogb2JqZWN0ICovIG9wdGlvbnMpIHtcbiAgICB2YXIgZW50cnlMaXN0ID0gW10sXG4gICAgICAgIGVudHJ5VGFibGUgPSB7fSxcbiAgICAgICAgX2NvbW1lbnQgPSBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG1haW5IZWFkZXIgPSBuZXcgSGVhZGVycy5NYWluSGVhZGVyKCksXG4gICAgICAgIGxvYWRlZEVudHJpZXMgPSBmYWxzZTtcblxuICAgIC8vIGFzc2lnbiBvcHRpb25zXG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCB7IG5vU29ydCB9ID0gb3B0cztcblxuICAgIGlmIChpbkJ1ZmZlcikge1xuICAgICAgICAvLyBpcyBhIG1lbW9yeSBidWZmZXJcbiAgICAgICAgcmVhZE1haW5IZWFkZXIob3B0cy5yZWFkRW50cmllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm9uZS4gaXMgYSBuZXcgZmlsZVxuICAgICAgICBsb2FkZWRFbnRyaWVzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB0b3RhbEVudHJpZXMgPSBtYWluSGVhZGVyLmRpc2tFbnRyaWVzOyAvLyB0b3RhbCBudW1iZXIgb2YgZW50cmllc1xuICAgICAgICBsZXQgaW5kZXggPSBtYWluSGVhZGVyLm9mZnNldDsgLy8gb2Zmc2V0IG9mIGZpcnN0IENFTiBoZWFkZXJcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsRW50cmllczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG1wID0gaW5kZXg7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBaaXBFbnRyeShpbkJ1ZmZlcik7XG5cbiAgICAgICAgICAgIGVudHJ5LmhlYWRlciA9IGluQnVmZmVyLnNsaWNlKHRtcCwgKHRtcCArPSBVdGlscy5Db25zdGFudHMuQ0VOSERSKSk7XG4gICAgICAgICAgICBlbnRyeS5lbnRyeU5hbWUgPSBpbkJ1ZmZlci5zbGljZSh0bXAsICh0bXAgKz0gZW50cnkuaGVhZGVyLmZpbGVOYW1lTGVuZ3RoKSk7XG5cbiAgICAgICAgICAgIGluZGV4ICs9IGVudHJ5LmhlYWRlci5lbnRyeUhlYWRlclNpemU7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRFbnRyaWVzKCkge1xuICAgICAgICBsb2FkZWRFbnRyaWVzID0gdHJ1ZTtcbiAgICAgICAgZW50cnlUYWJsZSA9IHt9O1xuICAgICAgICBlbnRyeUxpc3QgPSBuZXcgQXJyYXkobWFpbkhlYWRlci5kaXNrRW50cmllcyk7IC8vIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzXG4gICAgICAgIHZhciBpbmRleCA9IG1haW5IZWFkZXIub2Zmc2V0OyAvLyBvZmZzZXQgb2YgZmlyc3QgQ0VOIGhlYWRlclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJ5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRtcCA9IGluZGV4LFxuICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IFppcEVudHJ5KGluQnVmZmVyKTtcbiAgICAgICAgICAgIGVudHJ5LmhlYWRlciA9IGluQnVmZmVyLnNsaWNlKHRtcCwgKHRtcCArPSBVdGlscy5Db25zdGFudHMuQ0VOSERSKSk7XG5cbiAgICAgICAgICAgIGVudHJ5LmVudHJ5TmFtZSA9IGluQnVmZmVyLnNsaWNlKHRtcCwgKHRtcCArPSBlbnRyeS5oZWFkZXIuZmlsZU5hbWVMZW5ndGgpKTtcblxuICAgICAgICAgICAgaWYgKGVudHJ5LmhlYWRlci5leHRyYUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmV4dHJhID0gaW5CdWZmZXIuc2xpY2UodG1wLCAodG1wICs9IGVudHJ5LmhlYWRlci5leHRyYUxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW50cnkuaGVhZGVyLmNvbW1lbnRMZW5ndGgpIGVudHJ5LmNvbW1lbnQgPSBpbkJ1ZmZlci5zbGljZSh0bXAsIHRtcCArIGVudHJ5LmhlYWRlci5jb21tZW50TGVuZ3RoKTtcblxuICAgICAgICAgICAgaW5kZXggKz0gZW50cnkuaGVhZGVyLmVudHJ5SGVhZGVyU2l6ZTtcblxuICAgICAgICAgICAgZW50cnlMaXN0W2ldID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeVRhYmxlW2VudHJ5LmVudHJ5TmFtZV0gPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRNYWluSGVhZGVyKC8qQm9vbGVhbiovIHJlYWROb3cpIHtcbiAgICAgICAgdmFyIGkgPSBpbkJ1ZmZlci5sZW5ndGggLSBVdGlscy5Db25zdGFudHMuRU5ESERSLCAvLyBFTkQgaGVhZGVyIHNpemVcbiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIGkgLSAweGZmZmYpLCAvLyAweEZGRkYgaXMgdGhlIG1heCB6aXAgZmlsZSBjb21tZW50IGxlbmd0aFxuICAgICAgICAgICAgbiA9IG1heCxcbiAgICAgICAgICAgIGVuZFN0YXJ0ID0gaW5CdWZmZXIubGVuZ3RoLFxuICAgICAgICAgICAgZW5kT2Zmc2V0ID0gLTEsIC8vIFN0YXJ0IG9mZnNldCBvZiB0aGUgRU5EIGhlYWRlclxuICAgICAgICAgICAgY29tbWVudEVuZCA9IDA7XG5cbiAgICAgICAgZm9yIChpOyBpID49IG47IGktLSkge1xuICAgICAgICAgICAgaWYgKGluQnVmZmVyW2ldICE9PSAweDUwKSBjb250aW51ZTsgLy8gcXVpY2sgY2hlY2sgdGhhdCB0aGUgYnl0ZSBpcyAnUCdcbiAgICAgICAgICAgIGlmIChpbkJ1ZmZlci5yZWFkVUludDMyTEUoaSkgPT09IFV0aWxzLkNvbnN0YW50cy5FTkRTSUcpIHtcbiAgICAgICAgICAgICAgICAvLyBcIlBLXFwwMDVcXDAwNlwiXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gaTtcbiAgICAgICAgICAgICAgICBjb21tZW50RW5kID0gaTtcbiAgICAgICAgICAgICAgICBlbmRTdGFydCA9IGkgKyBVdGlscy5Db25zdGFudHMuRU5ESERSO1xuICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgZm91bmQgYSByZWd1bGFyIHNpZ25hdHVyZSwgbGV0J3MgbG9vayBqdXN0IGEgYml0IGZ1cnRoZXIgdG8gY2hlY2sgaWYgdGhlcmUncyBhbnkgemlwNjQgc2lnbmF0dXJlXG4gICAgICAgICAgICAgICAgbiA9IGkgLSBVdGlscy5Db25zdGFudHMuRU5ENjRIRFI7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbkJ1ZmZlci5yZWFkVUludDMyTEUoaSkgPT09IFV0aWxzLkNvbnN0YW50cy5FTkQ2NFNJRykge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgemlwNjQgc2lnbmF0dXJlLCBsZXQncyBjb250aW51ZSByZWFkaW5nIHRoZSB3aG9sZSB6aXA2NCByZWNvcmRcbiAgICAgICAgICAgICAgICBuID0gbWF4O1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5CdWZmZXIucmVhZFVJbnQzMkxFKGkpID09PSBVdGlscy5Db25zdGFudHMuWklQNjRTSUcpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgemlwNjQgcmVjb3JkLCBsZXQncyBkZXRlcm1pbmUgaXQncyBzaXplXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gaTtcbiAgICAgICAgICAgICAgICBlbmRTdGFydCA9IGkgKyBVdGlscy5yZWFkQmlnVUludDY0TEUoaW5CdWZmZXIsIGkgKyBVdGlscy5Db25zdGFudHMuWklQNjRTSVpFKSArIFV0aWxzLkNvbnN0YW50cy5aSVA2NExFQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIX5lbmRPZmZzZXQpIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuSU5WQUxJRF9GT1JNQVQpO1xuXG4gICAgICAgIG1haW5IZWFkZXIubG9hZEZyb21CaW5hcnkoaW5CdWZmZXIuc2xpY2UoZW5kT2Zmc2V0LCBlbmRTdGFydCkpO1xuICAgICAgICBpZiAobWFpbkhlYWRlci5jb21tZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICBfY29tbWVudCA9IGluQnVmZmVyLnNsaWNlKGNvbW1lbnRFbmQgKyBVdGlscy5Db25zdGFudHMuRU5ESERSKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVhZE5vdykgcmVhZEVudHJpZXMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzb3J0RW50cmllcygpIHtcbiAgICAgICAgaWYgKGVudHJ5TGlzdC5sZW5ndGggPiAxICYmICFub1NvcnQpIHtcbiAgICAgICAgICAgIGVudHJ5TGlzdC5zb3J0KChhLCBiKSA9PiBhLmVudHJ5TmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5lbnRyeU5hbWUudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgWmlwRW50cnkgb2JqZWN0cyBleGlzdGVudCBpbiB0aGUgY3VycmVudCBvcGVuZWQgYXJjaGl2ZVxuICAgICAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBnZXQgZW50cmllcygpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmNoaXZlIGNvbW1lbnRcbiAgICAgICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGNvbW1lbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NvbW1lbnQudG9TdHJpbmcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IGNvbW1lbnQodmFsKSB7XG4gICAgICAgICAgICBfY29tbWVudCA9IFV0aWxzLnRvQnVmZmVyKHZhbCk7XG4gICAgICAgICAgICBtYWluSGVhZGVyLmNvbW1lbnRMZW5ndGggPSBfY29tbWVudC5sZW5ndGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RW50cnlDb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1haW5IZWFkZXIuZGlza0VudHJpZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0ZUVudHJpZXMoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW50cnlMaXN0LmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgZW50cnkgaXMgaW5leGlzdGVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZW50cnlOYW1lXG4gICAgICAgICAqIEByZXR1cm4gWmlwRW50cnlcbiAgICAgICAgICovXG4gICAgICAgIGdldEVudHJ5OiBmdW5jdGlvbiAoLypTdHJpbmcqLyBlbnRyeU5hbWUpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50cnlUYWJsZVtlbnRyeU5hbWVdIHx8IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgdGhlIGdpdmVuIGVudHJ5IHRvIHRoZSBlbnRyeSBsaXN0XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKi9cbiAgICAgICAgc2V0RW50cnk6IGZ1bmN0aW9uICgvKlppcEVudHJ5Ki8gZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeUxpc3QucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeVRhYmxlW2VudHJ5LmVudHJ5TmFtZV0gPSBlbnRyeTtcbiAgICAgICAgICAgIG1haW5IZWFkZXIudG90YWxFbnRyaWVzID0gZW50cnlMaXN0Lmxlbmd0aDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlcyB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBlbnRyeSBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnksIHRoZW4gYWxsIG5lc3RlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2lsbCBiZSByZW1vdmVkXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeU5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGRlbGV0ZUVudHJ5OiBmdW5jdGlvbiAoLypTdHJpbmcqLyBlbnRyeU5hbWUpIHtcbiAgICAgICAgICAgIGlmICghbG9hZGVkRW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyeVRhYmxlW2VudHJ5TmFtZV07XG4gICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3NlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RW50cnlDaGlsZHJlbihlbnRyeSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmVudHJ5TmFtZSAhPT0gZW50cnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi5kZWxldGVFbnRyeShjaGlsZC5lbnRyeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeUxpc3Quc3BsaWNlKGVudHJ5TGlzdC5pbmRleE9mKGVudHJ5KSwgMSk7XG4gICAgICAgICAgICBkZWxldGUgZW50cnlUYWJsZVtlbnRyeU5hbWVdO1xuICAgICAgICAgICAgbWFpbkhlYWRlci50b3RhbEVudHJpZXMgPSBlbnRyeUxpc3QubGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgSXRlcmF0ZXMgYW5kIHJldHVybnMgYWxsIG5lc3RlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgb2YgdGhlIGdpdmVuIGVudHJ5XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbnRyeUNoaWxkcmVuOiBmdW5jdGlvbiAoLypaaXBFbnRyeSovIGVudHJ5KSB7XG4gICAgICAgICAgICBpZiAoIWxvYWRlZEVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbnRyeS5lbnRyeU5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbmFtZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBlbnRyeUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoemlwRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHppcEVudHJ5LmVudHJ5TmFtZS5zdWJzdHIoMCwgbGVuKSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHppcEVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSB6aXAgZmlsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIEJ1ZmZlclxuICAgICAgICAgKi9cbiAgICAgICAgY29tcHJlc3NUb0J1ZmZlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvcnRFbnRyaWVzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFCbG9jayA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZW50cnlIZWFkZXJzID0gW107XG4gICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICAgICAgICAgIGxldCBkaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBtYWluSGVhZGVyLnNpemUgPSAwO1xuICAgICAgICAgICAgbWFpbkhlYWRlci5vZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJ5TGlzdCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzIGRhdGEgYW5kIHNldCBsb2NhbCBhbmQgZW50cnkgaGVhZGVyIGFjY29yZGluZ2x5LiBSZWFzb24gd2h5IGlzIGNhbGxlZCBmaXJzdFxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhID0gZW50cnkuZ2V0Q29tcHJlc3NlZERhdGEoKTtcbiAgICAgICAgICAgICAgICAvLyAxLiBjb25zdHJ1Y3QgZGF0YSBoZWFkZXJcbiAgICAgICAgICAgICAgICBlbnRyeS5oZWFkZXIub2Zmc2V0ID0gZGluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFIZWFkZXIgPSBlbnRyeS5oZWFkZXIuZGF0YUhlYWRlclRvQmluYXJ5KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlOYW1lTGVuID0gZW50cnkucmF3RW50cnlOYW1lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAvLyAxLjIuIHBvc3RoZWFkZXIgLSBkYXRhIGFmdGVyIGRhdGEgaGVhZGVyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zdEhlYWRlciA9IEJ1ZmZlci5hbGxvYyhlbnRyeU5hbWVMZW4gKyBlbnRyeS5leHRyYS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGVudHJ5LnJhd0VudHJ5TmFtZS5jb3B5KHBvc3RIZWFkZXIsIDApO1xuICAgICAgICAgICAgICAgIHBvc3RIZWFkZXIuY29weShlbnRyeS5leHRyYSwgZW50cnlOYW1lTGVuKTtcblxuICAgICAgICAgICAgICAgIC8vIDIuIG9mZnNldHNcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YUhlYWRlci5sZW5ndGggKyBwb3N0SGVhZGVyLmxlbmd0aCArIGNvbXByZXNzZWREYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBkaW5kZXggKz0gZGF0YUxlbmd0aDtcblxuICAgICAgICAgICAgICAgIC8vIDMuIHN0b3JlIHZhbHVlcyBpbiBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGRhdGFCbG9jay5wdXNoKGRhdGFIZWFkZXIpO1xuICAgICAgICAgICAgICAgIGRhdGFCbG9jay5wdXNoKHBvc3RIZWFkZXIpO1xuICAgICAgICAgICAgICAgIGRhdGFCbG9jay5wdXNoKGNvbXByZXNzZWREYXRhKTtcblxuICAgICAgICAgICAgICAgIC8vIDQuIGNvbnN0cnVjdCBlbnRyeSBoZWFkZXJcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeUhlYWRlciA9IGVudHJ5LnBhY2tIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBlbnRyeUhlYWRlcnMucHVzaChlbnRyeUhlYWRlcik7XG4gICAgICAgICAgICAgICAgLy8gNS4gdXBkYXRlIG1haW4gaGVhZGVyXG4gICAgICAgICAgICAgICAgbWFpbkhlYWRlci5zaXplICs9IGVudHJ5SGVhZGVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gZGF0YUxlbmd0aCArIGVudHJ5SGVhZGVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG90YWxTaXplICs9IG1haW5IZWFkZXIubWFpbkhlYWRlclNpemU7IC8vIGFsc28gaW5jbHVkZXMgemlwIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgIC8vIHBvaW50IHRvIGVuZCBvZiBkYXRhIGFuZCBiZWdpbm5pbmcgb2YgY2VudHJhbCBkaXJlY3RvcnkgZmlyc3QgcmVjb3JkXG4gICAgICAgICAgICBtYWluSGVhZGVyLm9mZnNldCA9IGRpbmRleDtcblxuICAgICAgICAgICAgZGluZGV4ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IG91dEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyh0b3RhbFNpemUpO1xuICAgICAgICAgICAgLy8gd3JpdGUgZGF0YSBibG9ja3NcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBkYXRhQmxvY2spIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpO1xuICAgICAgICAgICAgICAgIGRpbmRleCArPSBjb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd3JpdGUgY2VudHJhbCBkaXJlY3RvcnkgZW50cmllc1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIGVudHJ5SGVhZGVycykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQuY29weShvdXRCdWZmZXIsIGRpbmRleCk7XG4gICAgICAgICAgICAgICAgZGluZGV4ICs9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3cml0ZSBtYWluIGhlYWRlclxuICAgICAgICAgICAgY29uc3QgbWggPSBtYWluSGVhZGVyLnRvQmluYXJ5KCk7XG4gICAgICAgICAgICBpZiAoX2NvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBfY29tbWVudC5jb3B5KG1oLCBVdGlscy5Db25zdGFudHMuRU5ESERSKTsgLy8gYWRkIHppcCBmaWxlIGNvbW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1oLmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3V0QnVmZmVyO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvQXN5bmNCdWZmZXI6IGZ1bmN0aW9uICgvKkZ1bmN0aW9uKi8gb25TdWNjZXNzLCAvKkZ1bmN0aW9uKi8gb25GYWlsLCAvKkZ1bmN0aW9uKi8gb25JdGVtU3RhcnQsIC8qRnVuY3Rpb24qLyBvbkl0ZW1FbmQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRFbnRyaWVzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvcnRFbnRyaWVzKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhQmxvY2sgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeUhlYWRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgZGluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIG1haW5IZWFkZXIuc2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgbWFpbkhlYWRlci5vZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcHJlc3MyQnVmZmVyID0gZnVuY3Rpb24gKGVudHJ5TGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TGlzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJ5TGlzdHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZW50cnkuZW50cnlOYW1lICsgZW50cnkuZXh0cmEudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkl0ZW1TdGFydCkgb25JdGVtU3RhcnQobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRDb21wcmVzc2VkRGF0YUFzeW5jKGZ1bmN0aW9uIChjb21wcmVzc2VkRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbkl0ZW1FbmQpIG9uSXRlbUVuZChuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmhlYWRlci5vZmZzZXQgPSBkaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhSGVhZGVyID0gZW50cnkuaGVhZGVyLmRhdGFIZWFkZXJUb0JpbmFyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc3RIZWFkZXIgPSBCdWZmZXIuYWxsb2MobmFtZS5sZW5ndGgsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhSGVhZGVyLmxlbmd0aCArIHBvc3RIZWFkZXIubGVuZ3RoICsgY29tcHJlc3NlZERhdGEubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGluZGV4ICs9IGRhdGFMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sucHVzaChkYXRhSGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sucHVzaChwb3N0SGVhZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sucHVzaChjb21wcmVzc2VkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeUhlYWRlciA9IGVudHJ5LnBhY2tIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeUhlYWRlcnMucHVzaChlbnRyeUhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkhlYWRlci5zaXplICs9IGVudHJ5SGVhZGVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gZGF0YUxlbmd0aCArIGVudHJ5SGVhZGVyLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzMkJ1ZmZlcihlbnRyeUxpc3RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplICs9IG1haW5IZWFkZXIubWFpbkhlYWRlclNpemU7IC8vIGFsc28gaW5jbHVkZXMgemlwIGZpbGUgY29tbWVudCBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHRvIGVuZCBvZiBkYXRhIGFuZCBiZWdpbm5pbmcgb2YgY2VudHJhbCBkaXJlY3RvcnkgZmlyc3QgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluSGVhZGVyLm9mZnNldCA9IGRpbmRleDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyh0b3RhbFNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUJsb2NrLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpOyAvLyB3cml0ZSBkYXRhIGJsb2Nrc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbmRleCArPSBjb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpOyAvLyB3cml0ZSBjZW50cmFsIGRpcmVjdG9yeSBlbnRyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGluZGV4ICs9IGNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1oID0gbWFpbkhlYWRlci50b0JpbmFyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbW1lbnQuY29weShtaCwgVXRpbHMuQ29uc3RhbnRzLkVOREhEUik7IC8vIGFkZCB6aXAgZmlsZSBjb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1oLmNvcHkob3V0QnVmZmVyLCBkaW5kZXgpOyAvLyB3cml0ZSBtYWluIGhlYWRlclxuXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3Mob3V0QnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb21wcmVzczJCdWZmZXIoZW50cnlMaXN0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBvbkZhaWwoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsICJjb25zdCBVdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5jb25zdCBwdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IFppcEVudHJ5ID0gcmVxdWlyZShcIi4vemlwRW50cnlcIik7XG5jb25zdCBaaXBGaWxlID0gcmVxdWlyZShcIi4vemlwRmlsZVwiKTtcblxuY29uc3QgZ2V0X0Jvb2wgPSAodmFsLCBkZWYpID0+ICh0eXBlb2YgdmFsID09PSBcImJvb2xlYW5cIiA/IHZhbCA6IGRlZik7XG5jb25zdCBnZXRfU3RyID0gKHZhbCwgZGVmKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IHZhbCA6IGRlZik7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIC8vIG9wdGlvbiBcIm5vU29ydFwiIDogaWYgdHJ1ZSBpdCBkaXNhYmxlcyBmaWxlcyBzb3J0aW5nXG4gICAgbm9Tb3J0OiBmYWxzZSxcbiAgICAvLyByZWFkIGVudHJpZXMgZHVyaW5nIGxvYWQgKGluaXRpYWwgbG9hZGluZyBtYXkgYmUgc2xvd2VyKVxuICAgIHJlYWRFbnRyaWVzOiBmYWxzZSxcbiAgICAvLyBkZWZhdWx0IG1ldGhvZCBpcyBub25lXG4gICAgbWV0aG9kOiBVdGlscy5Db25zdGFudHMuTk9ORSxcbiAgICAvLyBmaWxlIHN5c3RlbVxuICAgIGZzOiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgvKipTdHJpbmcqLyBpbnB1dCwgLyoqIG9iamVjdCAqLyBvcHRpb25zKSB7XG4gICAgbGV0IGluQnVmZmVyID0gbnVsbDtcblxuICAgIC8vIGNyZWF0ZSBvYmplY3QgYmFzZWQgZGVmYXVsdCBvcHRpb25zLCBhbGxvd2luZyB0aGVtIHRvIGJlIG92ZXJ3cml0dGVuXG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgZGVmYXVsdE9wdGlvbnMpO1xuXG4gICAgLy8gdGVzdCBpbnB1dCB2YXJpYWJsZVxuICAgIGlmIChpbnB1dCAmJiBcIm9iamVjdFwiID09PSB0eXBlb2YgaW5wdXQpIHtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgbm90IGJ1ZmZlciB3ZSBhY2NlcHQgaXQgdG8gYmUgb2JqZWN0IHdpdGggb3B0aW9uc1xuICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdHMsIGlucHV0KTtcbiAgICAgICAgICAgIGlucHV0ID0gb3B0cy5pbnB1dCA/IG9wdHMuaW5wdXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAob3B0cy5pbnB1dCkgZGVsZXRlIG9wdHMuaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBpbnB1dCBpcyBidWZmZXJcbiAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIGluQnVmZmVyID0gaW5wdXQ7XG4gICAgICAgICAgICBvcHRzLm1ldGhvZCA9IFV0aWxzLkNvbnN0YW50cy5CVUZGRVI7XG4gICAgICAgICAgICBpbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFzc2lnbiBvcHRpb25zXG4gICAgT2JqZWN0LmFzc2lnbihvcHRzLCBvcHRpb25zKTtcblxuICAgIC8vIGluc3RhbmNpYXRlIHV0aWxzIGZpbGVzeXN0ZW1cbiAgICBjb25zdCBmaWxldG9vbHMgPSBuZXcgVXRpbHMob3B0cyk7XG5cbiAgICAvLyBpZiBpbnB1dCBpcyBmaWxlIG5hbWUgd2UgcmV0cmlldmUgaXRzIGNvbnRlbnRcbiAgICBpZiAoaW5wdXQgJiYgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGlucHV0KSB7XG4gICAgICAgIC8vIGxvYWQgemlwIGZpbGVcbiAgICAgICAgaWYgKGZpbGV0b29scy5mcy5leGlzdHNTeW5jKGlucHV0KSkge1xuICAgICAgICAgICAgb3B0cy5tZXRob2QgPSBVdGlscy5Db25zdGFudHMuRklMRTtcbiAgICAgICAgICAgIG9wdHMuZmlsZW5hbWUgPSBpbnB1dDtcbiAgICAgICAgICAgIGluQnVmZmVyID0gZmlsZXRvb2xzLmZzLnJlYWRGaWxlU3luYyhpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLklOVkFMSURfRklMRU5BTUUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIHZhcmlhYmxlXG4gICAgY29uc3QgX3ppcCA9IG5ldyBaaXBGaWxlKGluQnVmZmVyLCBvcHRzKTtcblxuICAgIGNvbnN0IHsgY2Fub25pY2FsLCBzYW5pdGl6ZSB9ID0gVXRpbHM7XG5cbiAgICBmdW5jdGlvbiBnZXRFbnRyeSgvKipPYmplY3QqLyBlbnRyeSkge1xuICAgICAgICBpZiAoZW50cnkgJiYgX3ppcCkge1xuICAgICAgICAgICAgdmFyIGl0ZW07XG4gICAgICAgICAgICAvLyBJZiBlbnRyeSB3YXMgZ2l2ZW4gYXMgYSBmaWxlIG5hbWVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIGl0ZW0gPSBfemlwLmdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIC8vIGlmIGVudHJ5IHdhcyBnaXZlbiBhcyBhIFppcEVudHJ5IG9iamVjdFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZW50cnkuZW50cnlOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBlbnRyeS5oZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIGl0ZW0gPSBfemlwLmdldEVudHJ5KGVudHJ5LmVudHJ5TmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4UGF0aCh6aXBQYXRoKSB7XG4gICAgICAgIGNvbnN0IHsgam9pbiwgbm9ybWFsaXplLCBzZXAgfSA9IHB0aC5wb3NpeDtcbiAgICAgICAgLy8gY29udmVydCB3aW5kb3dzIGZpbGUgc2VwYXJhdG9ycyBhbmQgbm9ybWFsaXplXG4gICAgICAgIHJldHVybiBqb2luKFwiLlwiLCBub3JtYWxpemUoc2VwICsgemlwUGF0aC5zcGxpdChcIlxcXFxcIikuam9pbihzZXApICsgc2VwKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4dHJhY3RzIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBhcmNoaXZlIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGFzIGEgQnVmZmVyIG9iamVjdFxuICAgICAgICAgKiBAcGFyYW0gZW50cnkgWmlwRW50cnkgb2JqZWN0IG9yIFN0cmluZyB3aXRoIHRoZSBmdWxsIHBhdGggb2YgdGhlIGVudHJ5XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gQnVmZmVyIG9yIE51bGwgaW4gY2FzZSBvZiBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZEZpbGU6IGZ1bmN0aW9uICgvKipPYmplY3QqLyBlbnRyeSwgLypTdHJpbmcsIEJ1ZmZlciovIHBhc3MpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0RW50cnkoZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuIChpdGVtICYmIGl0ZW0uZ2V0RGF0YShwYXNzKSkgfHwgbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQXN5bmNocm9ub3VzIHJlYWRGaWxlXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeSBaaXBFbnRyeSBvYmplY3Qgb3IgU3RyaW5nIHdpdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnlcbiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gQnVmZmVyIG9yIE51bGwgaW4gY2FzZSBvZiBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZEZpbGVBc3luYzogZnVuY3Rpb24gKC8qKk9iamVjdCovIGVudHJ5LCAvKipGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5nZXREYXRhQXN5bmMoY2FsbGJhY2spO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBcImdldEVudHJ5IGZhaWxlZCBmb3I6XCIgKyBlbnRyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4dHJhY3RzIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBhcmNoaXZlIGFuZCByZXR1cm5zIHRoZSBjb250ZW50IGFzIHBsYWluIHRleHQgaW4gdGhlIGdpdmVuIGVuY29kaW5nXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeSBaaXBFbnRyeSBvYmplY3Qgb3IgU3RyaW5nIHdpdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnlcbiAgICAgICAgICogQHBhcmFtIGVuY29kaW5nIE9wdGlvbmFsLiBJZiBubyBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdXRmOCBpcyB1c2VkXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICByZWFkQXNUZXh0OiBmdW5jdGlvbiAoLyoqT2JqZWN0Ki8gZW50cnksIC8qKlN0cmluZz0qLyBlbmNvZGluZykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gaXRlbS5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoZW5jb2RpbmcgfHwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBc3luY2hyb25vdXMgcmVhZEFzVGV4dFxuICAgICAgICAgKiBAcGFyYW0gZW50cnkgWmlwRW50cnkgb2JqZWN0IG9yIFN0cmluZyB3aXRoIHRoZSBmdWxsIHBhdGggb2YgdGhlIGVudHJ5XG4gICAgICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAgICAgKiBAcGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwuIElmIG5vIGVuY29kaW5nIGlzIHNwZWNpZmllZCB1dGY4IGlzIHVzZWRcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiBTdHJpbmdcbiAgICAgICAgICovXG4gICAgICAgIHJlYWRBc1RleHRBc3luYzogZnVuY3Rpb24gKC8qKk9iamVjdCovIGVudHJ5LCAvKipGdW5jdGlvbiovIGNhbGxiYWNrLCAvKipTdHJpbmc9Ki8gZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0RW50cnkoZW50cnkpO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmdldERhdGFBc3luYyhmdW5jdGlvbiAoZGF0YSwgZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YS50b1N0cmluZyhlbmNvZGluZyB8fCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgZmlsZSBvciB0aGUgZW50cnkgYW5kIGFsbCBpdCdzIG5lc3RlZCBkaXJlY3RvcmllcyBhbmQgZmlsZXMgaWYgdGhlIGdpdmVuIGVudHJ5IGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKi9cbiAgICAgICAgZGVsZXRlRmlsZTogZnVuY3Rpb24gKC8qKk9iamVjdCovIGVudHJ5KSB7XG4gICAgICAgICAgICAvLyBAVE9ETzogdGVzdCBkZWxldGVGaWxlXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgX3ppcC5kZWxldGVFbnRyeShpdGVtLmVudHJ5TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBjb21tZW50IHRvIHRoZSB6aXAuIFRoZSB6aXAgbXVzdCBiZSByZXdyaXR0ZW4gYWZ0ZXIgYWRkaW5nIHRoZSBjb21tZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gY29tbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgYWRkWmlwQ29tbWVudDogZnVuY3Rpb24gKC8qKlN0cmluZyovIGNvbW1lbnQpIHtcbiAgICAgICAgICAgIC8vIEBUT0RPOiB0ZXN0IGFkZFppcENvbW1lbnRcbiAgICAgICAgICAgIF96aXAuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIHppcCBjb21tZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBnZXRaaXBDb21tZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcC5jb21tZW50IHx8IFwiXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBjb21tZW50IHRvIGEgc3BlY2lmaWVkIHppcEVudHJ5LiBUaGUgemlwIG11c3QgYmUgcmV3cml0dGVuIGFmdGVyIGFkZGluZyB0aGUgY29tbWVudFxuICAgICAgICAgKiBUaGUgY29tbWVudCBjYW5ub3QgZXhjZWVkIDY1NTM1IGNoYXJhY3RlcnMgaW4gbGVuZ3RoXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeVxuICAgICAgICAgKiBAcGFyYW0gY29tbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgYWRkWmlwRW50cnlDb21tZW50OiBmdW5jdGlvbiAoLyoqT2JqZWN0Ki8gZW50cnksIC8qKlN0cmluZyovIGNvbW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gZ2V0RW50cnkoZW50cnkpO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb21tZW50IG9mIHRoZSBzcGVjaWZpZWQgZW50cnlcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGVudHJ5XG4gICAgICAgICAqIEByZXR1cm4gU3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBnZXRaaXBFbnRyeUNvbW1lbnQ6IGZ1bmN0aW9uICgvKipPYmplY3QqLyBlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGVudHJ5IGluc2lkZSB0aGUgYXJjaGl2ZS4gVGhlIHppcCBtdXN0IGJlIHJld3JpdHRlbiBhZnRlciB1cGRhdGluZyB0aGUgY29udGVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZW50cnlcbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnRcbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZUZpbGU6IGZ1bmN0aW9uICgvKipPYmplY3QqLyBlbnRyeSwgLyoqQnVmZmVyKi8gY29udGVudCkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBnZXRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0RGF0YShjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyBhIGZpbGUgZnJvbSB0aGUgZGlzayB0byB0aGUgYXJjaGl2ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbG9jYWxQYXRoIEZpbGUgdG8gYWRkIHRvIHppcFxuICAgICAgICAgKiBAcGFyYW0gemlwUGF0aCBPcHRpb25hbCBwYXRoIGluc2lkZSB0aGUgemlwXG4gICAgICAgICAqIEBwYXJhbSB6aXBOYW1lIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBmaWxlXG4gICAgICAgICAqL1xuICAgICAgICBhZGRMb2NhbEZpbGU6IGZ1bmN0aW9uICgvKipTdHJpbmcqLyBsb2NhbFBhdGgsIC8qKlN0cmluZz0qLyB6aXBQYXRoLCAvKipTdHJpbmc9Ki8gemlwTmFtZSwgLyoqU3RyaW5nKi8gY29tbWVudCkge1xuICAgICAgICAgICAgaWYgKGZpbGV0b29scy5mcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAvLyBmaXggWmlwUGF0aFxuICAgICAgICAgICAgICAgIHppcFBhdGggPSB6aXBQYXRoID8gZml4UGF0aCh6aXBQYXRoKSA6IFwiXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBwIC0gbG9jYWwgZmlsZSBuYW1lXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBsb2NhbFBhdGguc3BsaXQoXCJcXFxcXCIpLmpvaW4oXCIvXCIpLnNwbGl0KFwiL1wiKS5wb3AoKTtcblxuICAgICAgICAgICAgICAgIC8vIGFkZCBmaWxlIG5hbWUgaW50byB6aXBwYXRoXG4gICAgICAgICAgICAgICAgemlwUGF0aCArPSB6aXBOYW1lID8gemlwTmFtZSA6IHA7XG5cbiAgICAgICAgICAgICAgICAvLyByZWFkIGZpbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGNvbnN0IF9hdHRyID0gZmlsZXRvb2xzLmZzLnN0YXRTeW5jKGxvY2FsUGF0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBhZGQgZmlsZSBpbnRvIHppcCBmaWxlXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlKHppcFBhdGgsIGZpbGV0b29scy5mcy5yZWFkRmlsZVN5bmMobG9jYWxQYXRoKSwgY29tbWVudCwgX2F0dHIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkZJTEVfTk9UX0ZPVU5ELnJlcGxhY2UoXCIlc1wiLCBsb2NhbFBhdGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyBhIGxvY2FsIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBuZXN0ZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIHRoZSBhcmNoaXZlXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBsb2NhbFBhdGhcbiAgICAgICAgICogQHBhcmFtIHppcFBhdGggb3B0aW9uYWwgcGF0aCBpbnNpZGUgemlwXG4gICAgICAgICAqIEBwYXJhbSBmaWx0ZXIgb3B0aW9uYWwgUmVnRXhwIG9yIEZ1bmN0aW9uIGlmIGZpbGVzIG1hdGNoIHdpbGxcbiAgICAgICAgICogICAgICAgICAgICAgICBiZSBpbmNsdWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGFkZExvY2FsRm9sZGVyOiBmdW5jdGlvbiAoLyoqU3RyaW5nKi8gbG9jYWxQYXRoLCAvKipTdHJpbmc9Ki8gemlwUGF0aCwgLyoqPVJlZ0V4cHxGdW5jdGlvbiovIGZpbHRlcikge1xuICAgICAgICAgICAgLy8gUHJlcGFyZSBmaWx0ZXJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBmaWx0ZXIgaXMgUmVnRXhwIHdyYXAgaXRcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSAoZnVuY3Rpb24gKHJ4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByeC50ZXN0KGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KShmaWx0ZXIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBmaWx0ZXIgaXMgbm90IGZ1bmN0aW9uIHdlIHdpbGwgcmVwbGFjZSBpdFxuICAgICAgICAgICAgICAgIGZpbHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZml4IFppcFBhdGhcbiAgICAgICAgICAgIHppcFBhdGggPSB6aXBQYXRoID8gZml4UGF0aCh6aXBQYXRoKSA6IFwiXCI7XG5cbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcGF0aCBmaXJzdFxuICAgICAgICAgICAgbG9jYWxQYXRoID0gcHRoLm5vcm1hbGl6ZShsb2NhbFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoZmlsZXRvb2xzLmZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZmlsZXRvb2xzLmZpbmRGaWxlcyhsb2NhbFBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlcGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBwdGgucmVsYXRpdmUobG9jYWxQYXRoLCBmaWxlcGF0aCkuc3BsaXQoXCJcXFxcXCIpLmpvaW4oXCIvXCIpOyAvL3dpbmRvd3MgZml4XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKHApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRzID0gZmlsZXRvb2xzLmZzLnN0YXRTeW5jKGZpbGVwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRGaWxlKHppcFBhdGggKyBwLCBmaWxldG9vbHMuZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoKSwgXCJcIiwgc3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZSh6aXBQYXRoICsgcCArIFwiL1wiLCBCdWZmZXIuYWxsb2MoMCksIFwiXCIsIHN0YXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5GSUxFX05PVF9GT1VORC5yZXBsYWNlKFwiJXNcIiwgbG9jYWxQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzeW5jaHJvbm91cyBhZGRMb2NhbEZpbGVcbiAgICAgICAgICogQHBhcmFtIGxvY2FsUGF0aFxuICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgICAgICogQHBhcmFtIHppcFBhdGggb3B0aW9uYWwgcGF0aCBpbnNpZGUgemlwXG4gICAgICAgICAqIEBwYXJhbSBmaWx0ZXIgb3B0aW9uYWwgUmVnRXhwIG9yIEZ1bmN0aW9uIGlmIGZpbGVzIG1hdGNoIHdpbGxcbiAgICAgICAgICogICAgICAgICAgICAgICBiZSBpbmNsdWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGFkZExvY2FsRm9sZGVyQXN5bmM6IGZ1bmN0aW9uICgvKlN0cmluZyovIGxvY2FsUGF0aCwgLypGdW5jdGlvbiovIGNhbGxiYWNrLCAvKlN0cmluZyovIHppcFBhdGgsIC8qUmVnRXhwfEZ1bmN0aW9uKi8gZmlsdGVyKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gKGZ1bmN0aW9uIChyeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcngudGVzdChmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkoZmlsdGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmaXggWmlwUGF0aFxuICAgICAgICAgICAgemlwUGF0aCA9IHppcFBhdGggPyBmaXhQYXRoKHppcFBhdGgpIDogXCJcIjtcblxuICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRoZSBwYXRoIGZpcnN0XG4gICAgICAgICAgICBsb2NhbFBhdGggPSBwdGgubm9ybWFsaXplKGxvY2FsUGF0aCk7XG5cbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIGZpbGV0b29scy5mcy5vcGVuKGxvY2FsUGF0aCwgXCJyXCIsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgVXRpbHMuRXJyb3JzLkZJTEVfTk9UX0ZPVU5ELnJlcGxhY2UoXCIlc1wiLCBsb2NhbFBhdGgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gZmlsZXRvb2xzLmZpbmRGaWxlcyhsb2NhbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZXBhdGggPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHB0aC5yZWxhdGl2ZShsb2NhbFBhdGgsIGZpbGVwYXRoKS5zcGxpdChcIlxcXFxcIikuam9pbihcIi9cIik7IC8vd2luZG93cyBmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKFwiTkZEXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW15cXHgyMC1cXHg3RV0vZywgXCJcIik7IC8vIGFjY2VudCBmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKHApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy5mcy5zdGF0KGZpbGVwYXRoLCBmdW5jdGlvbiAoZXIwLCBzdGF0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyMCkgY2FsbGJhY2sodW5kZWZpbmVkLCBlcjApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLmZzLnJlYWRGaWxlKGZpbGVwYXRoLCBmdW5jdGlvbiAoZXIxLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcjEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgZXIxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZSh6aXBQYXRoICsgcCwgZGF0YSwgXCJcIiwgc3RhdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkRmlsZSh6aXBQYXRoICsgcCArIFwiL1wiLCBCdWZmZXIuYWxsb2MoMCksIFwiXCIsIHN0YXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gcGF0aCB3aGVyZSBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZFxuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgLSBvcHRpb25hbCBwcm9wZXJ0aWVzXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wcy56aXBQYXRoIC0gb3B0aW9uYWwgcGF0aCBpbnNpZGUgemlwXG4gICAgICAgICAqIEBwYXJhbSB7cmVnZXhwLCBmdW5jdGlvbn0gcHJvcHMuZmlsdGVyIC0gUmVnRXhwIG9yIEZ1bmN0aW9uIGlmIGZpbGVzIG1hdGNoIHdpbGwgYmUgaW5jbHVkZWQuXG4gICAgICAgICAqL1xuICAgICAgICBhZGRMb2NhbEZvbGRlclByb21pc2U6IGZ1bmN0aW9uICgvKlN0cmluZyovIGxvY2FsUGF0aCwgLyogb2JqZWN0ICovIHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsdGVyLCB6aXBQYXRoIH0gPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRMb2NhbEZvbGRlckFzeW5jKFxuICAgICAgICAgICAgICAgICAgICBsb2NhbFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIChkb25lLCBlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHppcFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIHlvdSB0byBjcmVhdGUgYSBlbnRyeSAoZmlsZSBvciBkaXJlY3RvcnkpIGluIHRoZSB6aXAgZmlsZS5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IHRoZSBlbnRyeU5hbWUgbXVzdCBlbmQgaW4gLyBhbmQgYSBudWxsIGJ1ZmZlciBzaG91bGQgYmUgcHJvdmlkZWQuXG4gICAgICAgICAqIENvbW1lbnQgYW5kIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeU5hbWVcbiAgICAgICAgICogQHBhcmFtIHtCdWZmZXIgfCBzdHJpbmd9IGNvbnRlbnQgLSBmaWxlIGNvbnRlbnQgYXMgYnVmZmVyIG9yIHV0ZjggY29kZWQgc3RyaW5nXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50IC0gZmlsZSBjb21tZW50XG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgb2JqZWN0fSBhdHRyIC0gbnVtYmVyIGFzIHVuaXggZmlsZSBwZXJtaXNzaW9ucywgb2JqZWN0IGFzIGZpbGVzeXN0ZW0gU3RhdHMgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBhZGRGaWxlOiBmdW5jdGlvbiAoLyoqU3RyaW5nKi8gZW50cnlOYW1lLCAvKipCdWZmZXIqLyBjb250ZW50LCAvKipTdHJpbmcqLyBjb21tZW50LCAvKipOdW1iZXIqLyBhdHRyKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBnZXRFbnRyeShlbnRyeU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gZW50cnkgIT0gbnVsbDtcblxuICAgICAgICAgICAgLy8gcHJlcGFyZSBuZXcgZW50cnlcbiAgICAgICAgICAgIGlmICghdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgWmlwRW50cnkoKTtcbiAgICAgICAgICAgICAgICBlbnRyeS5lbnRyeU5hbWUgPSBlbnRyeU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5jb21tZW50ID0gY29tbWVudCB8fCBcIlwiO1xuXG4gICAgICAgICAgICBjb25zdCBpc1N0YXQgPSBcIm9iamVjdFwiID09PSB0eXBlb2YgYXR0ciAmJiBhdHRyIGluc3RhbmNlb2YgZmlsZXRvb2xzLmZzLlN0YXRzO1xuXG4gICAgICAgICAgICAvLyBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIGZyb20gZmlsZSBzdGF0c1xuICAgICAgICAgICAgaWYgKGlzU3RhdCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmhlYWRlci50aW1lID0gYXR0ci5tdGltZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGZpbGUgYXR0cmlidXRlXG4gICAgICAgICAgICB2YXIgZmlsZWF0dHIgPSBlbnRyeS5pc0RpcmVjdG9yeSA/IDB4MTAgOiAwOyAvLyAoTVMtRE9TIGRpcmVjdG9yeSBmbGFnKVxuXG4gICAgICAgICAgICAvLyBleHRlbmRlZCBhdHRyaWJ1dGVzIGZpZWxkIGZvciBVbml4XG4gICAgICAgICAgICBpZiAoIVV0aWxzLmlzV2luKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0IGZpbGUgdHlwZSBlaXRoZXIgU19JRkRJUiAvIFNfSUZSRUdcbiAgICAgICAgICAgICAgICBsZXQgdW5peCA9IGVudHJ5LmlzRGlyZWN0b3J5ID8gMHg0MDAwIDogMHg4MDAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzU3RhdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGF0dHJpYnV0ZXMgZnJvbSBmaWxlIHN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHVuaXggfD0gMHhmZmYgJiBhdHRyLm1vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcIm51bWJlclwiID09PSB0eXBlb2YgYXR0cikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhdHRyIGZyb20gZ2l2ZW4gYXR0ciB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgdW5peCB8PSAweGZmZiAmIGF0dHI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZXM6XG4gICAgICAgICAgICAgICAgICAgIHVuaXggfD0gZW50cnkuaXNEaXJlY3RvcnkgPyAwbzc1NSA6IDBvNjQ0OyAvLyBwZXJtaXNzaW9ucyAoZHJ3eHIteHIteCkgb3IgKC1yLXdyLS1yLS0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmlsZWF0dHIgPSAoZmlsZWF0dHIgfCAodW5peCA8PCAxNikpID4+PiAwOyAvLyBhZGQgYXR0cmlidXRlc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbnRyeS5hdHRyID0gZmlsZWF0dHI7XG5cbiAgICAgICAgICAgIGVudHJ5LnNldERhdGEoY29udGVudCk7XG4gICAgICAgICAgICBpZiAoIXVwZGF0ZSkgX3ppcC5zZXRFbnRyeShlbnRyeSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgWmlwRW50cnkgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIGluc2lkZSB0aGUgYXJjaGl2ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbnRyaWVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcCA/IF96aXAuZW50cmllcyA6IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgWmlwRW50cnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmlsZSBvciBmb2xkZXIgc3BlY2lmaWVkIGJ5IGBgbmFtZWBgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIFppcEVudHJ5XG4gICAgICAgICAqL1xuICAgICAgICBnZXRFbnRyeTogZnVuY3Rpb24gKC8qKlN0cmluZyovIG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFbnRyeShuYW1lKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRFbnRyeUNvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcC5nZXRFbnRyeUNvdW50KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gX3ppcC5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGdpdmVuIGVudHJ5IHRvIHRoZSBnaXZlbiB0YXJnZXRQYXRoXG4gICAgICAgICAqIElmIHRoZSBlbnRyeSBpcyBhIGRpcmVjdG9yeSBpbnNpZGUgdGhlIGFyY2hpdmUsIHRoZSBlbnRpcmUgZGlyZWN0b3J5IGFuZCBpdCdzIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUgZXh0cmFjdGVkXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbnRyeSBaaXBFbnRyeSBvYmplY3Qgb3IgU3RyaW5nIHdpdGggdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZW50cnlcbiAgICAgICAgICogQHBhcmFtIHRhcmdldFBhdGggVGFyZ2V0IGZvbGRlciB3aGVyZSB0byB3cml0ZSB0aGUgZmlsZVxuICAgICAgICAgKiBAcGFyYW0gbWFpbnRhaW5FbnRyeVBhdGggSWYgbWFpbnRhaW5FbnRyeVBhdGggaXMgdHJ1ZSBhbmQgdGhlIGVudHJ5IGlzIGluc2lkZSBhIGZvbGRlciwgdGhlIGVudHJ5IGZvbGRlclxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjcmVhdGVkIGluIHRhcmdldFBhdGggYXMgd2VsbC4gRGVmYXVsdCBpcyBUUlVFXG4gICAgICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHRhcmdldCBwYXRoLCB0aGUgZmlsZSB3aWxsIGJlIG92ZXJ3cml0ZW4gaWYgdGhpcyBpcyB0cnVlLlxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgRkFMU0VcbiAgICAgICAgICogQHBhcmFtIGtlZXBPcmlnaW5hbFBlcm1pc3Npb24gVGhlIGZpbGUgd2lsbCBiZSBzZXQgYXMgdGhlIHBlcm1pc3Npb24gZnJvbSB0aGUgZW50cnkgaWYgdGhpcyBpcyB0cnVlLlxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgRkFMU0VcbiAgICAgICAgICogQHBhcmFtIG91dEZpbGVOYW1lIFN0cmluZyBJZiBzZXQgd2lsbCBvdmVycmlkZSB0aGUgZmlsZW5hbWUgb2YgdGhlIGV4dHJhY3RlZCBmaWxlIChPbmx5IHdvcmtzIGlmIHRoZSBlbnRyeSBpcyBhIGZpbGUpXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm4gQm9vbGVhblxuICAgICAgICAgKi9cbiAgICAgICAgZXh0cmFjdEVudHJ5VG86IGZ1bmN0aW9uIChcbiAgICAgICAgICAgIC8qKk9iamVjdCovIGVudHJ5LFxuICAgICAgICAgICAgLyoqU3RyaW5nKi8gdGFyZ2V0UGF0aCxcbiAgICAgICAgICAgIC8qKkJvb2xlYW4qLyBtYWludGFpbkVudHJ5UGF0aCxcbiAgICAgICAgICAgIC8qKkJvb2xlYW4qLyBvdmVyd3JpdGUsXG4gICAgICAgICAgICAvKipCb29sZWFuKi8ga2VlcE9yaWdpbmFsUGVybWlzc2lvbixcbiAgICAgICAgICAgIC8qKlN0cmluZyoqLyBvdXRGaWxlTmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZSA9IGdldF9Cb29sKG92ZXJ3cml0ZSwgZmFsc2UpO1xuICAgICAgICAgICAga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9IGdldF9Cb29sKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIGZhbHNlKTtcbiAgICAgICAgICAgIG1haW50YWluRW50cnlQYXRoID0gZ2V0X0Jvb2wobWFpbnRhaW5FbnRyeVBhdGgsIHRydWUpO1xuICAgICAgICAgICAgb3V0RmlsZU5hbWUgPSBnZXRfU3RyKG91dEZpbGVOYW1lLCBnZXRfU3RyKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIHVuZGVmaW5lZCkpO1xuXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdldEVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuTk9fRU5UUlkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZW50cnlOYW1lID0gY2Fub25pY2FsKGl0ZW0uZW50cnlOYW1lKTtcblxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHNhbml0aXplKHRhcmdldFBhdGgsIG91dEZpbGVOYW1lICYmICFpdGVtLmlzRGlyZWN0b3J5ID8gb3V0RmlsZU5hbWUgOiBtYWludGFpbkVudHJ5UGF0aCA/IGVudHJ5TmFtZSA6IHB0aC5iYXNlbmFtZShlbnRyeU5hbWUpKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBfemlwLmdldEVudHJ5Q2hpbGRyZW4oaXRlbSk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzRGlyZWN0b3J5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gY2hpbGQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuQ0FOVF9FWFRSQUNUX0ZJTEUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gY2Fub25pY2FsKGNoaWxkLmVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZE5hbWUgPSBzYW5pdGl6ZSh0YXJnZXRQYXRoLCBtYWludGFpbkVudHJ5UGF0aCA/IG5hbWUgOiBwdGguYmFzZW5hbWUobmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gZm9yIGF0dHIgZGVwZW5kIG9uIG1ldGhvZCBhZGRGaWxlKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUF0dHIgPSBrZWVwT3JpZ2luYWxQZXJtaXNzaW9uID8gY2hpbGQuaGVhZGVyLmZpbGVBdHRyIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBmaWxldG9vbHMud3JpdGVGaWxlVG8oY2hpbGROYW1lLCBjb250ZW50LCBvdmVyd3JpdGUsIGZpbGVBdHRyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBpdGVtLmdldERhdGEoKTtcbiAgICAgICAgICAgIGlmICghY29udGVudCkgdGhyb3cgbmV3IEVycm9yKFV0aWxzLkVycm9ycy5DQU5UX0VYVFJBQ1RfRklMRSk7XG5cbiAgICAgICAgICAgIGlmIChmaWxldG9vbHMuZnMuZXhpc3RzU3luYyh0YXJnZXQpICYmICFvdmVyd3JpdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkNBTlRfT1ZFUlJJREUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJldmVyc2Ugb3BlcmF0aW9uIGZvciBhdHRyIGRlcGVuZCBvbiBtZXRob2QgYWRkRmlsZSgpXG4gICAgICAgICAgICBjb25zdCBmaWxlQXR0ciA9IGtlZXBPcmlnaW5hbFBlcm1pc3Npb24gPyBlbnRyeS5oZWFkZXIuZmlsZUF0dHIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaWxldG9vbHMud3JpdGVGaWxlVG8odGFyZ2V0LCBjb250ZW50LCBvdmVyd3JpdGUsIGZpbGVBdHRyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRlc3QgdGhlIGFyY2hpdmVcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHRlc3Q6IGZ1bmN0aW9uIChwYXNzKSB7XG4gICAgICAgICAgICBpZiAoIV96aXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGVudHJ5IGluIF96aXAuZW50cmllcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBfemlwLmVudHJpZXNbZW50cnldLmdldERhdGEocGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRXh0cmFjdHMgdGhlIGVudGlyZSBhcmNoaXZlIHRvIHRoZSBnaXZlbiBsb2NhdGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUYXJnZXQgbG9jYXRpb25cbiAgICAgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgdGFyZ2V0IHBhdGgsIHRoZSBmaWxlIHdpbGwgYmUgb3ZlcndyaXRlbiBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKiBAcGFyYW0ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiBUaGUgZmlsZSB3aWxsIGJlIHNldCBhcyB0aGUgcGVybWlzc2lvbiBmcm9tIHRoZSBlbnRyeSBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKi9cbiAgICAgICAgZXh0cmFjdEFsbFRvOiBmdW5jdGlvbiAoLyoqU3RyaW5nKi8gdGFyZ2V0UGF0aCwgLyoqQm9vbGVhbiovIG92ZXJ3cml0ZSwgLyoqQm9vbGVhbiovIGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIC8qU3RyaW5nLCBCdWZmZXIqLyBwYXNzKSB7XG4gICAgICAgICAgICBvdmVyd3JpdGUgPSBnZXRfQm9vbChvdmVyd3JpdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIHBhc3MgPSBnZXRfU3RyKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIHBhc3MpO1xuICAgICAgICAgICAga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9IGdldF9Cb29sKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghX3ppcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuTk9fWklQKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF96aXAuZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeU5hbWUgPSBzYW5pdGl6ZSh0YXJnZXRQYXRoLCBjYW5vbmljYWwoZW50cnkuZW50cnlOYW1lLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLm1ha2VEaXIoZW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGVudHJ5LmdldERhdGEocGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVdGlscy5FcnJvcnMuQ0FOVF9FWFRSQUNUX0ZJTEUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gZm9yIGF0dHIgZGVwZW5kIG9uIG1ldGhvZCBhZGRGaWxlKClcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQXR0ciA9IGtlZXBPcmlnaW5hbFBlcm1pc3Npb24gPyBlbnRyeS5oZWFkZXIuZmlsZUF0dHIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZmlsZXRvb2xzLndyaXRlRmlsZVRvKGVudHJ5TmFtZSwgY29udGVudCwgb3ZlcndyaXRlLCBmaWxlQXR0cik7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLmZzLnV0aW1lc1N5bmMoZW50cnlOYW1lLCBlbnRyeS5oZWFkZXIudGltZSwgZW50cnkuaGVhZGVyLnRpbWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkNBTlRfRVhUUkFDVF9GSUxFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQXN5bmNocm9ub3VzIGV4dHJhY3RBbGxUb1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUYXJnZXQgbG9jYXRpb25cbiAgICAgICAgICogQHBhcmFtIG92ZXJ3cml0ZSBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgdGFyZ2V0IHBhdGgsIHRoZSBmaWxlIHdpbGwgYmUgb3ZlcndyaXRlbiBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKiBAcGFyYW0ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiBUaGUgZmlsZSB3aWxsIGJlIHNldCBhcyB0aGUgcGVybWlzc2lvbiBmcm9tIHRoZSBlbnRyeSBpZiB0aGlzIGlzIHRydWUuXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgRGVmYXVsdCBpcyBGQUxTRVxuICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhbGwgZW50cmllcyBhcmUgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSBvciBhbnkgZXJyb3IgaXMgdGhyb3duLlxuICAgICAgICAgKi9cbiAgICAgICAgZXh0cmFjdEFsbFRvQXN5bmM6IGZ1bmN0aW9uICgvKipTdHJpbmcqLyB0YXJnZXRQYXRoLCAvKipCb29sZWFuKi8gb3ZlcndyaXRlLCAvKipCb29sZWFuKi8ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiwgLyoqRnVuY3Rpb24qLyBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdmVyd3JpdGUgPSBnZXRfQm9vbChvdmVyd3JpdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9PT0gXCJmdW5jdGlvblwiICYmICFjYWxsYmFjaykgY2FsbGJhY2sgPSBrZWVwT3JpZ2luYWxQZXJtaXNzaW9uO1xuICAgICAgICAgICAga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA9IGdldF9Cb29sKGtlZXBPcmlnaW5hbFBlcm1pc3Npb24sIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghX3ppcCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihVdGlscy5FcnJvcnMuTk9fWklQKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXJnZXRQYXRoID0gcHRoLnJlc29sdmUodGFyZ2V0UGF0aCk7XG4gICAgICAgICAgICAvLyBjb252ZXJ0IGVudHJ5TmFtZSB0b1xuICAgICAgICAgICAgY29uc3QgZ2V0UGF0aCA9IChlbnRyeSkgPT4gc2FuaXRpemUodGFyZ2V0UGF0aCwgcHRoLm5vcm1hbGl6ZShjYW5vbmljYWwoZW50cnkuZW50cnlOYW1lLnRvU3RyaW5nKCkpKSk7XG4gICAgICAgICAgICBjb25zdCBnZXRFcnJvciA9IChtc2csIGZpbGUpID0+IG5ldyBFcnJvcihtc2cgKyAnOiBcIicgKyBmaWxlICsgJ1wiJyk7XG5cbiAgICAgICAgICAgIC8vIHNlcGFyYXRlIGRpcmVjdG9yaWVzIGZyb20gZmlsZXNcbiAgICAgICAgICAgIGNvbnN0IGRpckVudHJpZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVFbnRyaWVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgX3ppcC5lbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJFbnRyaWVzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUVudHJpZXMuYWRkKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IGVudHJpZXMgZmlyc3Qgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgLy8gdGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbiBhbmQgYXNzdXJlcyBmb2xkZXJzIGFyZSB0aGVyZSBiZWZvcmUgd3JpdGluZyBmaWxlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBkaXJFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyUGF0aCA9IGdldFBhdGgoZW50cnkpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXZlcnNlIG9wZXJhdGlvbiBmb3IgYXR0ciBkZXBlbmQgb24gbWV0aG9kIGFkZEZpbGUoKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRpckF0dHIgPSBrZWVwT3JpZ2luYWxQZXJtaXNzaW9uID8gZW50cnkuaGVhZGVyLmZpbGVBdHRyIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy5tYWtlRGlyKGRpclBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyQXR0cikgZmlsZXRvb2xzLmZzLmNobW9kU3luYyhkaXJQYXRoLCBkaXJBdHRyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gdW5peCB0aW1lc3RhbXAgd2lsbCBjaGFuZ2UgaWYgZmlsZXMgYXJlIGxhdGVyIGFkZGVkIHRvIGZvbGRlciwgYnV0IHN0aWxsXG4gICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy5mcy51dGltZXNTeW5jKGRpclBhdGgsIGVudHJ5LmhlYWRlci50aW1lLCBlbnRyeS5oZWFkZXIudGltZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZ2V0RXJyb3IoXCJVbmFibGUgdG8gY3JlYXRlIGZvbGRlclwiLCBkaXJQYXRoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxsYmFjayB3cmFwcGVyLCBmb3Igc29tZSBob3VzZSBrZWVwaW5nXG4gICAgICAgICAgICBjb25zdCBkb25lID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlRW50cmllcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBmaWxlIGVudHJpZXMgYXN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsZUVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeU5hbWUgPSBwdGgubm9ybWFsaXplKGNhbm9uaWNhbChlbnRyeS5lbnRyeU5hbWUudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FuaXRpemUodGFyZ2V0UGF0aCwgZW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICBlbnRyeS5nZXREYXRhQXN5bmMoZnVuY3Rpb24gKGNvbnRlbnQsIGVycl8xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVycl8xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoVXRpbHMuRXJyb3JzLkNBTlRfRVhUUkFDVF9GSUxFKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gZm9yIGF0dHIgZGVwZW5kIG9uIG1ldGhvZCBhZGRGaWxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVBdHRyID0ga2VlcE9yaWdpbmFsUGVybWlzc2lvbiA/IGVudHJ5LmhlYWRlci5maWxlQXR0ciA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0b29scy53cml0ZUZpbGVUb0FzeW5jKGZpbGVQYXRoLCBjb250ZW50LCBvdmVyd3JpdGUsIGZpbGVBdHRyLCBmdW5jdGlvbiAoc3VjYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VjYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhnZXRFcnJvcihcIlVuYWJsZSB0byB3cml0ZSBmaWxlXCIsIGZpbGVQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLmZzLnV0aW1lcyhmaWxlUGF0aCwgZW50cnkuaGVhZGVyLnRpbWUsIGVudHJ5LmhlYWRlci50aW1lLCBmdW5jdGlvbiAoZXJyXzIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycl8yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhnZXRFcnJvcihcIlVuYWJsZSB0byBzZXQgdGltZXNcIiwgZmlsZVBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlRW50cmllcy5kZWxldGUoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBjYWxsYmFjayBpZiBpdCB3YXMgbGFzdCBlbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2FsbCB0aGUgY2FsbGJhY2sgaWYgZmlsZUVudHJpZXMgd2FzIGVtcHR5XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdyaXRlcyB0aGUgbmV3bHkgY3JlYXRlZCB6aXAgZmlsZSB0byBkaXNrIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gb3IgaWYgYSB6aXAgd2FzIG9wZW5lZCBhbmQgbm8gYGB0YXJnZXRGaWxlTmFtZWBgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIG92ZXJ3cml0ZSB0aGUgb3BlbmVkIHppcFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0RmlsZU5hbWVcbiAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAgICAgICAqL1xuICAgICAgICB3cml0ZVppcDogZnVuY3Rpb24gKC8qKlN0cmluZyovIHRhcmdldEZpbGVOYW1lLCAvKipGdW5jdGlvbiovIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0RmlsZU5hbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHRhcmdldEZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRGaWxlTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lICYmIG9wdHMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRGaWxlTmFtZSA9IG9wdHMuZmlsZW5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciB6aXBEYXRhID0gX3ppcC5jb21wcmVzc1RvQnVmZmVyKCk7XG4gICAgICAgICAgICBpZiAoemlwRGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBvayA9IGZpbGV0b29scy53cml0ZUZpbGVUbyh0YXJnZXRGaWxlTmFtZSwgemlwRGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSBjYWxsYmFjayghb2sgPyBuZXcgRXJyb3IoXCJmYWlsZWRcIikgOiBudWxsLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB3cml0ZVppcFByb21pc2U6IGZ1bmN0aW9uICgvKipTdHJpbmcqLyB0YXJnZXRGaWxlTmFtZSwgLyogb2JqZWN0ICovIHByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCB7IG92ZXJ3cml0ZSwgcGVybSB9ID0gT2JqZWN0LmFzc2lnbih7IG92ZXJ3cml0ZTogdHJ1ZSB9LCBwcm9wcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBmaWxlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lICYmIG9wdHMuZmlsZW5hbWUpIHRhcmdldEZpbGVOYW1lID0gb3B0cy5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEZpbGVOYW1lKSByZWplY3QoXCJBRE0tWklQOiBaSVAgRmlsZSBOYW1lIE1pc3NpbmdcIik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvQnVmZmVyUHJvbWlzZSgpLnRoZW4oKHppcERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gKGRvbmUpID0+IChkb25lID8gcmVzb2x2ZShkb25lKSA6IHJlamVjdChcIkFETS1aSVA6IFdhc24ndCBhYmxlIHRvIHdyaXRlIHppcCBmaWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXRvb2xzLndyaXRlRmlsZVRvQXN5bmModGFyZ2V0RmlsZU5hbWUsIHppcERhdGEsIG92ZXJ3cml0ZSwgcGVybSwgcmV0KTtcbiAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9CdWZmZXJQcm9taXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIF96aXAudG9Bc3luY0J1ZmZlcihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGlyZSB6aXAgZmlsZSBhcyBhIEJ1ZmZlciBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybiBCdWZmZXJcbiAgICAgICAgICovXG4gICAgICAgIHRvQnVmZmVyOiBmdW5jdGlvbiAoLyoqRnVuY3Rpb249Ki8gb25TdWNjZXNzLCAvKipGdW5jdGlvbj0qLyBvbkZhaWwsIC8qKkZ1bmN0aW9uPSovIG9uSXRlbVN0YXJ0LCAvKipGdW5jdGlvbj0qLyBvbkl0ZW1FbmQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVPZiA9IDI7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uU3VjY2VzcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgX3ppcC50b0FzeW5jQnVmZmVyKG9uU3VjY2Vzcywgb25GYWlsLCBvbkl0ZW1TdGFydCwgb25JdGVtRW5kKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfemlwLmNvbXByZXNzVG9CdWZmZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgaXNBcnJheSA9IGZ1bmN0aW9uIGlzQXJyYXkoYXJyKSB7XG5cdGlmICh0eXBlb2YgQXJyYXkuaXNBcnJheSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBBcnJheS5pc0FycmF5KGFycik7XG5cdH1cblxuXHRyZXR1cm4gdG9TdHIuY2FsbChhcnIpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxudmFyIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuXHRpZiAoIW9iaiB8fCB0b1N0ci5jYWxsKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dmFyIGhhc093bkNvbnN0cnVjdG9yID0gaGFzT3duLmNhbGwob2JqLCAnY29uc3RydWN0b3InKTtcblx0dmFyIGhhc0lzUHJvdG90eXBlT2YgPSBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJiBoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAnaXNQcm90b3R5cGVPZicpO1xuXHQvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0XG5cdGlmIChvYmouY29uc3RydWN0b3IgJiYgIWhhc093bkNvbnN0cnVjdG9yICYmICFoYXNJc1Byb3RvdHlwZU9mKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG5cdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxuXHR2YXIga2V5O1xuXHRmb3IgKGtleSBpbiBvYmopIHsgLyoqLyB9XG5cblx0cmV0dXJuIHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnIHx8IGhhc093bi5jYWxsKG9iaiwga2V5KTtcbn07XG5cbi8vIElmIG5hbWUgaXMgJ19fcHJvdG9fXycsIGFuZCBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgYXZhaWxhYmxlLCBkZWZpbmUgX19wcm90b19fIGFzIGFuIG93biBwcm9wZXJ0eSBvbiB0YXJnZXRcbnZhciBzZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIHNldFByb3BlcnR5KHRhcmdldCwgb3B0aW9ucykge1xuXHRpZiAoZGVmaW5lUHJvcGVydHkgJiYgb3B0aW9ucy5uYW1lID09PSAnX19wcm90b19fJykge1xuXHRcdGRlZmluZVByb3BlcnR5KHRhcmdldCwgb3B0aW9ucy5uYW1lLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IG9wdGlvbnMubmV3VmFsdWUsXG5cdFx0XHR3cml0YWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldFtvcHRpb25zLm5hbWVdID0gb3B0aW9ucy5uZXdWYWx1ZTtcblx0fVxufTtcblxuLy8gUmV0dXJuIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIF9fcHJvdG9fXyBpZiAnX19wcm90b19fJyBpcyBub3QgYW4gb3duIHByb3BlcnR5XG52YXIgZ2V0UHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0eShvYmosIG5hbWUpIHtcblx0aWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG5cdFx0aWYgKCFoYXNPd24uY2FsbChvYmosIG5hbWUpKSB7XG5cdFx0XHRyZXR1cm4gdm9pZCAwO1xuXHRcdH0gZWxzZSBpZiAoZ09QRCkge1xuXHRcdFx0Ly8gSW4gZWFybHkgdmVyc2lvbnMgb2Ygbm9kZSwgb2JqWydfX3Byb3RvX18nXSBpcyBidWdneSB3aGVuIG9iaiBoYXNcblx0XHRcdC8vIF9fcHJvdG9fXyBhcyBhbiBvd24gcHJvcGVydHkuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoKSB3b3Jrcy5cblx0XHRcdHJldHVybiBnT1BEKG9iaiwgbmFtZSkudmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9ialtuYW1lXTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0ZW5kKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmU7XG5cdHZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cdHZhciBpID0gMTtcblx0dmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdHZhciBkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Jvb2xlYW4nKSB7XG5cdFx0ZGVlcCA9IHRhcmdldDtcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMV0gfHwge307XG5cdFx0Ly8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdGkgPSAyO1xuXHR9XG5cdGlmICh0YXJnZXQgPT0gbnVsbCB8fCAodHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRvcHRpb25zID0gYXJndW1lbnRzW2ldO1xuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAob3B0aW9ucyAhPSBudWxsKSB7XG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKG5hbWUgaW4gb3B0aW9ucykge1xuXHRcdFx0XHRzcmMgPSBnZXRQcm9wZXJ0eSh0YXJnZXQsIG5hbWUpO1xuXHRcdFx0XHRjb3B5ID0gZ2V0UHJvcGVydHkob3B0aW9ucywgbmFtZSk7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAodGFyZ2V0ICE9PSBjb3B5KSB7XG5cdFx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdFx0aWYgKGRlZXAgJiYgY29weSAmJiAoaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSBpc0FycmF5KGNvcHkpKSkpIHtcblx0XHRcdFx0XHRcdGlmIChjb3B5SXNBcnJheSkge1xuXHRcdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBpc0FycmF5KHNyYykgPyBzcmMgOiBbXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGlzUGxhaW5PYmplY3Qoc3JjKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHRcdHNldFByb3BlcnR5KHRhcmdldCwgeyBuYW1lOiBuYW1lLCBuZXdWYWx1ZTogZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KSB9KTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb3B5ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0c2V0UHJvcGVydHkodGFyZ2V0LCB7IG5hbWU6IG5hbWUsIG5ld1ZhbHVlOiBjb3B5IH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuIiwgIi8qZXNsaW50IG5vLXZhcjowLCBwcmVmZXItYXJyb3ctY2FsbGJhY2s6IDAsIG9iamVjdC1zaG9ydGhhbmQ6IDAgKi9cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgUHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZScpO1xuXG5cbnZhciBpbnRlcm5hbHMgPSB7fTtcblxuXG4vL1xuLy8gUmVhZCBydWxlcyBmcm9tIGZpbGUuXG4vL1xuaW50ZXJuYWxzLnJ1bGVzID0gcmVxdWlyZSgnLi9kYXRhL3J1bGVzLmpzb24nKS5tYXAoZnVuY3Rpb24gKHJ1bGUpIHtcblxuICByZXR1cm4ge1xuICAgIHJ1bGU6IHJ1bGUsXG4gICAgc3VmZml4OiBydWxlLnJlcGxhY2UoL14oXFwqXFwufFxcISkvLCAnJyksXG4gICAgcHVueVN1ZmZpeDogLTEsXG4gICAgd2lsZGNhcmQ6IHJ1bGUuY2hhckF0KDApID09PSAnKicsXG4gICAgZXhjZXB0aW9uOiBydWxlLmNoYXJBdCgwKSA9PT0gJyEnXG4gIH07XG59KTtcblxuXG4vL1xuLy8gQ2hlY2sgaXMgZ2l2ZW4gc3RyaW5nIGVuZHMgd2l0aCBgc3VmZml4YC5cbi8vXG5pbnRlcm5hbHMuZW5kc1dpdGggPSBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcblxuICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xufTtcblxuXG4vL1xuLy8gRmluZCBydWxlIGZvciBhIGdpdmVuIGRvbWFpbi5cbi8vXG5pbnRlcm5hbHMuZmluZFJ1bGUgPSBmdW5jdGlvbiAoZG9tYWluKSB7XG5cbiAgdmFyIHB1bnlEb21haW4gPSBQdW55Y29kZS50b0FTQ0lJKGRvbWFpbik7XG4gIHJldHVybiBpbnRlcm5hbHMucnVsZXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBydWxlKSB7XG5cbiAgICBpZiAocnVsZS5wdW55U3VmZml4ID09PSAtMSl7XG4gICAgICBydWxlLnB1bnlTdWZmaXggPSBQdW55Y29kZS50b0FTQ0lJKHJ1bGUuc3VmZml4KTtcbiAgICB9XG4gICAgaWYgKCFpbnRlcm5hbHMuZW5kc1dpdGgocHVueURvbWFpbiwgJy4nICsgcnVsZS5wdW55U3VmZml4KSAmJiBwdW55RG9tYWluICE9PSBydWxlLnB1bnlTdWZmaXgpIHtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH1cbiAgICAvLyBUaGlzIGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQgYXMgaXQgbmV2ZXIgc2VlbXMgdG8gcnVuLiBUaGlzIGlzIGJlY2F1c2VcbiAgICAvLyBzdWIgdGxkcyBhbHdheXMgYXBwZWFyIGFmdGVyIHRoZWlyIHBhcmVudHMgYW5kIHdlIG5ldmVyIGZpbmQgYSBzaG9ydGVyXG4gICAgLy8gbWF0Y2guXG4gICAgLy9pZiAobWVtbykge1xuICAgIC8vICB2YXIgbWVtb1N1ZmZpeCA9IFB1bnljb2RlLnRvQVNDSUkobWVtby5zdWZmaXgpO1xuICAgIC8vICBpZiAobWVtb1N1ZmZpeC5sZW5ndGggPj0gcHVueVN1ZmZpeC5sZW5ndGgpIHtcbiAgICAvLyAgICByZXR1cm4gbWVtbztcbiAgICAvLyAgfVxuICAgIC8vfVxuICAgIHJldHVybiBydWxlO1xuICB9LCBudWxsKTtcbn07XG5cblxuLy9cbi8vIEVycm9yIGNvZGVzIGFuZCBtZXNzYWdlcy5cbi8vXG5leHBvcnRzLmVycm9yQ29kZXMgPSB7XG4gIERPTUFJTl9UT09fU0hPUlQ6ICdEb21haW4gbmFtZSB0b28gc2hvcnQuJyxcbiAgRE9NQUlOX1RPT19MT05HOiAnRG9tYWluIG5hbWUgdG9vIGxvbmcuIEl0IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gMjU1IGNoYXJzLicsXG4gIExBQkVMX1NUQVJUU19XSVRIX0RBU0g6ICdEb21haW4gbmFtZSBsYWJlbCBjYW4gbm90IHN0YXJ0IHdpdGggYSBkYXNoLicsXG4gIExBQkVMX0VORFNfV0lUSF9EQVNIOiAnRG9tYWluIG5hbWUgbGFiZWwgY2FuIG5vdCBlbmQgd2l0aCBhIGRhc2guJyxcbiAgTEFCRUxfVE9PX0xPTkc6ICdEb21haW4gbmFtZSBsYWJlbCBzaG91bGQgYmUgYXQgbW9zdCA2MyBjaGFycyBsb25nLicsXG4gIExBQkVMX1RPT19TSE9SVDogJ0RvbWFpbiBuYW1lIGxhYmVsIHNob3VsZCBiZSBhdCBsZWFzdCAxIGNoYXJhY3RlciBsb25nLicsXG4gIExBQkVMX0lOVkFMSURfQ0hBUlM6ICdEb21haW4gbmFtZSBsYWJlbCBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGRhc2hlcy4nXG59O1xuXG5cbi8vXG4vLyBWYWxpZGF0ZSBkb21haW4gbmFtZSBhbmQgdGhyb3cgaWYgbm90IHZhbGlkLlxuLy9cbi8vIEZyb20gd2lraXBlZGlhOlxuLy9cbi8vIEhvc3RuYW1lcyBhcmUgY29tcG9zZWQgb2Ygc2VyaWVzIG9mIGxhYmVscyBjb25jYXRlbmF0ZWQgd2l0aCBkb3RzLCBhcyBhcmUgYWxsXG4vLyBkb21haW4gbmFtZXMuIEVhY2ggbGFiZWwgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDYzIGNoYXJhY3RlcnMgbG9uZywgYW5kIHRoZVxuLy8gZW50aXJlIGhvc3RuYW1lIChpbmNsdWRpbmcgdGhlIGRlbGltaXRpbmcgZG90cykgaGFzIGEgbWF4aW11bSBvZiAyNTUgY2hhcnMuXG4vL1xuLy8gQWxsb3dlZCBjaGFyczpcbi8vXG4vLyAqIGBhLXpgXG4vLyAqIGAwLTlgXG4vLyAqIGAtYCBidXQgbm90IGFzIGEgc3RhcnRpbmcgb3IgZW5kaW5nIGNoYXJhY3RlclxuLy8gKiBgLmAgYXMgYSBzZXBhcmF0b3IgZm9yIHRoZSB0ZXh0dWFsIHBvcnRpb25zIG9mIGEgZG9tYWluIG5hbWVcbi8vXG4vLyAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRG9tYWluX25hbWVcbi8vICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ib3N0bmFtZVxuLy9cbmludGVybmFscy52YWxpZGF0ZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuXG4gIC8vIEJlZm9yZSB3ZSBjYW4gdmFsaWRhdGUgd2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgSUROcyB3aXRoIHVuaWNvZGUgY2hhcnMuXG4gIHZhciBhc2NpaSA9IFB1bnljb2RlLnRvQVNDSUkoaW5wdXQpO1xuXG4gIGlmIChhc2NpaS5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuICdET01BSU5fVE9PX1NIT1JUJztcbiAgfVxuICBpZiAoYXNjaWkubGVuZ3RoID4gMjU1KSB7XG4gICAgcmV0dXJuICdET01BSU5fVE9PX0xPTkcnO1xuICB9XG5cbiAgLy8gQ2hlY2sgZWFjaCBwYXJ0J3MgbGVuZ3RoIGFuZCBhbGxvd2VkIGNoYXJzLlxuICB2YXIgbGFiZWxzID0gYXNjaWkuc3BsaXQoJy4nKTtcbiAgdmFyIGxhYmVsO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgaWYgKCFsYWJlbC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnTEFCRUxfVE9PX1NIT1JUJztcbiAgICB9XG4gICAgaWYgKGxhYmVsLmxlbmd0aCA+IDYzKSB7XG4gICAgICByZXR1cm4gJ0xBQkVMX1RPT19MT05HJztcbiAgICB9XG4gICAgaWYgKGxhYmVsLmNoYXJBdCgwKSA9PT0gJy0nKSB7XG4gICAgICByZXR1cm4gJ0xBQkVMX1NUQVJUU19XSVRIX0RBU0gnO1xuICAgIH1cbiAgICBpZiAobGFiZWwuY2hhckF0KGxhYmVsLmxlbmd0aCAtIDEpID09PSAnLScpIHtcbiAgICAgIHJldHVybiAnTEFCRUxfRU5EU19XSVRIX0RBU0gnO1xuICAgIH1cbiAgICBpZiAoIS9eW2EtejAtOVxcLV0rJC8udGVzdChsYWJlbCkpIHtcbiAgICAgIHJldHVybiAnTEFCRUxfSU5WQUxJRF9DSEFSUyc7XG4gICAgfVxuICB9XG59O1xuXG5cbi8vXG4vLyBQdWJsaWMgQVBJXG4vL1xuXG5cbi8vXG4vLyBQYXJzZSBkb21haW4uXG4vL1xuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuXG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRG9tYWluIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgfVxuXG4gIC8vIEZvcmNlIGRvbWFpbiB0byBsb3dlcmNhc2UuXG4gIHZhciBkb21haW4gPSBpbnB1dC5zbGljZSgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEhhbmRsZSBGUUROLlxuICAvLyBUT0RPOiBTaW1wbHkgcmVtb3ZlIHRyYWlsaW5nIGRvdD9cbiAgaWYgKGRvbWFpbi5jaGFyQXQoZG9tYWluLmxlbmd0aCAtIDEpID09PSAnLicpIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoMCwgZG9tYWluLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXNlIGlucHV0LlxuICB2YXIgZXJyb3IgPSBpbnRlcm5hbHMudmFsaWRhdGUoZG9tYWluKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6IGV4cG9ydHMuZXJyb3JDb2Rlc1tlcnJvcl0sXG4gICAgICAgIGNvZGU6IGVycm9yXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHZhciBwYXJzZWQgPSB7XG4gICAgaW5wdXQ6IGlucHV0LFxuICAgIHRsZDogbnVsbCxcbiAgICBzbGQ6IG51bGwsXG4gICAgZG9tYWluOiBudWxsLFxuICAgIHN1YmRvbWFpbjogbnVsbCxcbiAgICBsaXN0ZWQ6IGZhbHNlXG4gIH07XG5cbiAgdmFyIGRvbWFpblBhcnRzID0gZG9tYWluLnNwbGl0KCcuJyk7XG5cbiAgLy8gTm9uLUludGVybmV0IFRMRFxuICBpZiAoZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0gPT09ICdsb2NhbCcpIHtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgdmFyIGhhbmRsZVB1bnljb2RlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgaWYgKCEveG4tLS8udGVzdChkb21haW4pKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLmRvbWFpbikge1xuICAgICAgcGFyc2VkLmRvbWFpbiA9IFB1bnljb2RlLnRvQVNDSUkocGFyc2VkLmRvbWFpbik7XG4gICAgfVxuICAgIGlmIChwYXJzZWQuc3ViZG9tYWluKSB7XG4gICAgICBwYXJzZWQuc3ViZG9tYWluID0gUHVueWNvZGUudG9BU0NJSShwYXJzZWQuc3ViZG9tYWluKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfTtcblxuICB2YXIgcnVsZSA9IGludGVybmFscy5maW5kUnVsZShkb21haW4pO1xuXG4gIC8vIFVubGlzdGVkIHRsZC5cbiAgaWYgKCFydWxlKSB7XG4gICAgaWYgKGRvbWFpblBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICAgIHBhcnNlZC50bGQgPSBkb21haW5QYXJ0cy5wb3AoKTtcbiAgICBwYXJzZWQuc2xkID0gZG9tYWluUGFydHMucG9wKCk7XG4gICAgcGFyc2VkLmRvbWFpbiA9IFtwYXJzZWQuc2xkLCBwYXJzZWQudGxkXS5qb2luKCcuJyk7XG4gICAgaWYgKGRvbWFpblBhcnRzLmxlbmd0aCkge1xuICAgICAgcGFyc2VkLnN1YmRvbWFpbiA9IGRvbWFpblBhcnRzLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlUHVueWNvZGUoKTtcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgcHVibGljIHN1ZmZpeCBpcyBsaXN0ZWQuXG4gIHBhcnNlZC5saXN0ZWQgPSB0cnVlO1xuXG4gIHZhciB0bGRQYXJ0cyA9IHJ1bGUuc3VmZml4LnNwbGl0KCcuJyk7XG4gIHZhciBwcml2YXRlUGFydHMgPSBkb21haW5QYXJ0cy5zbGljZSgwLCBkb21haW5QYXJ0cy5sZW5ndGggLSB0bGRQYXJ0cy5sZW5ndGgpO1xuXG4gIGlmIChydWxlLmV4Y2VwdGlvbikge1xuICAgIHByaXZhdGVQYXJ0cy5wdXNoKHRsZFBhcnRzLnNoaWZ0KCkpO1xuICB9XG5cbiAgcGFyc2VkLnRsZCA9IHRsZFBhcnRzLmpvaW4oJy4nKTtcblxuICBpZiAoIXByaXZhdGVQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGFuZGxlUHVueWNvZGUoKTtcbiAgfVxuXG4gIGlmIChydWxlLndpbGRjYXJkKSB7XG4gICAgdGxkUGFydHMudW5zaGlmdChwcml2YXRlUGFydHMucG9wKCkpO1xuICAgIHBhcnNlZC50bGQgPSB0bGRQYXJ0cy5qb2luKCcuJyk7XG4gIH1cblxuICBpZiAoIXByaXZhdGVQYXJ0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGFuZGxlUHVueWNvZGUoKTtcbiAgfVxuXG4gIHBhcnNlZC5zbGQgPSBwcml2YXRlUGFydHMucG9wKCk7XG4gIHBhcnNlZC5kb21haW4gPSBbcGFyc2VkLnNsZCwgIHBhcnNlZC50bGRdLmpvaW4oJy4nKTtcblxuICBpZiAocHJpdmF0ZVBhcnRzLmxlbmd0aCkge1xuICAgIHBhcnNlZC5zdWJkb21haW4gPSBwcml2YXRlUGFydHMuam9pbignLicpO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZVB1bnljb2RlKCk7XG59O1xuXG5cbi8vXG4vLyBHZXQgZG9tYWluLlxuLy9cbmV4cG9ydHMuZ2V0ID0gZnVuY3Rpb24gKGRvbWFpbikge1xuXG4gIGlmICghZG9tYWluKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHMucGFyc2UoZG9tYWluKS5kb21haW4gfHwgbnVsbDtcbn07XG5cblxuLy9cbi8vIENoZWNrIHdoZXRoZXIgZG9tYWluIGJlbG9uZ3MgdG8gYSBrbm93biBwdWJsaWMgc3VmZml4LlxuLy9cbmV4cG9ydHMuaXNWYWxpZCA9IGZ1bmN0aW9uIChkb21haW4pIHtcblxuICB2YXIgcGFyc2VkID0gZXhwb3J0cy5wYXJzZShkb21haW4pO1xuICByZXR1cm4gQm9vbGVhbihwYXJzZWQuZG9tYWluICYmIHBhcnNlZC5saXN0ZWQpO1xufTtcbiIsICIvKiFcbiAqIENvcHlyaWdodCAoYykgMjAxOCwgU2FsZXNmb3JjZS5jb20sIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU2FsZXNmb3JjZS5jb20gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heVxuICogYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbid1c2Ugc3RyaWN0JztcbnZhciBwc2wgPSByZXF1aXJlKCdwc2wnKTtcblxuZnVuY3Rpb24gZ2V0UHVibGljU3VmZml4KGRvbWFpbikge1xuICByZXR1cm4gcHNsLmdldChkb21haW4pO1xufVxuXG5leHBvcnRzLmdldFB1YmxpY1N1ZmZpeCA9IGdldFB1YmxpY1N1ZmZpeDtcbiIsICIvKiFcbiAqIENvcHlyaWdodCAoYykgMjAxNSwgU2FsZXNmb3JjZS5jb20sIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU2FsZXNmb3JjZS5jb20gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heVxuICogYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRVxuICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUlxuICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0ZcbiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTU1xuICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5cbiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpXG4gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVxuICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cbid1c2Ugc3RyaWN0Jztcbi8qanNoaW50IHVudXNlZDpmYWxzZSAqL1xuXG5mdW5jdGlvbiBTdG9yZSgpIHtcbn1cbmV4cG9ydHMuU3RvcmUgPSBTdG9yZTtcblxuLy8gU3RvcmVzIG1heSBiZSBzeW5jaHJvbm91cywgYnV0IGFyZSBzdGlsbCByZXF1aXJlZCB0byB1c2UgYVxuLy8gQ29udGludWF0aW9uLVBhc3NpbmcgU3R5bGUgQVBJLiAgVGhlIENvb2tpZUphciBpdHNlbGYgd2lsbCBleHBvc2UgYSBcIipTeW5jXCJcbi8vIEFQSSB0aGF0IGNvbnZlcnRzIGZyb20gc3luY2hyb25vdXMtY2FsbGJhY2tzIHRvIGltcGVyYXRpdmUgc3R5bGUuXG5TdG9yZS5wcm90b3R5cGUuc3luY2hyb25vdXMgPSBmYWxzZTtcblxuU3RvcmUucHJvdG90eXBlLmZpbmRDb29raWUgPSBmdW5jdGlvbihkb21haW4sIHBhdGgsIGtleSwgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdmaW5kQ29va2llIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLmZpbmRDb29raWVzID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbmRDb29raWVzIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnB1dENvb2tpZSA9IGZ1bmN0aW9uKGNvb2tpZSwgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdwdXRDb29raWUgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUudXBkYXRlQ29va2llID0gZnVuY3Rpb24ob2xkQ29va2llLCBuZXdDb29raWUsIGNiKSB7XG4gIC8vIHJlY29tbWVuZGVkIGRlZmF1bHQgaW1wbGVtZW50YXRpb246XG4gIC8vIHJldHVybiB0aGlzLnB1dENvb2tpZShuZXdDb29raWUsIGNiKTtcbiAgdGhyb3cgbmV3IEVycm9yKCd1cGRhdGVDb29raWUgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVtb3ZlQ29va2llID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBrZXksIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcigncmVtb3ZlQ29va2llIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLnJlbW92ZUNvb2tpZXMgPSBmdW5jdGlvbihkb21haW4sIHBhdGgsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcigncmVtb3ZlQ29va2llcyBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5yZW1vdmVBbGxDb29raWVzID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdyZW1vdmVBbGxDb29raWVzIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufVxuXG5TdG9yZS5wcm90b3R5cGUuZ2V0QWxsQ29va2llcyA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignZ2V0QWxsQ29va2llcyBpcyBub3QgaW1wbGVtZW50ZWQgKHRoZXJlZm9yZSBqYXIgY2Fubm90IGJlIHNlcmlhbGl6ZWQpJyk7XG59O1xuIiwgIi8qIVxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBTYWxlc2ZvcmNlLmNvbSwgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTYWxlc2ZvcmNlLmNvbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5XG4gKiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcHVic3VmZml4ID0gcmVxdWlyZSgnLi9wdWJzdWZmaXgtcHNsJyk7XG5cbi8vIEdpdmVzIHRoZSBwZXJtdXRhdGlvbiBvZiBhbGwgcG9zc2libGUgZG9tYWluTWF0Y2goKWVzIG9mIGEgZ2l2ZW4gZG9tYWluLiBUaGVcbi8vIGFycmF5IGlzIGluIHNob3J0ZXN0LXRvLWxvbmdlc3Qgb3JkZXIuICBIYW5keSBmb3IgaW5kZXhpbmcuXG5mdW5jdGlvbiBwZXJtdXRlRG9tYWluIChkb21haW4pIHtcbiAgdmFyIHB1YlN1ZiA9IHB1YnN1ZmZpeC5nZXRQdWJsaWNTdWZmaXgoZG9tYWluKTtcbiAgaWYgKCFwdWJTdWYpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocHViU3VmID09IGRvbWFpbikge1xuICAgIHJldHVybiBbZG9tYWluXTtcbiAgfVxuXG4gIHZhciBwcmVmaXggPSBkb21haW4uc2xpY2UoMCwgLShwdWJTdWYubGVuZ3RoICsgMSkpOyAvLyBcIi5leGFtcGxlLmNvbVwiXG4gIHZhciBwYXJ0cyA9IHByZWZpeC5zcGxpdCgnLicpLnJldmVyc2UoKTtcbiAgdmFyIGN1ciA9IHB1YlN1ZjtcbiAgdmFyIHBlcm11dGF0aW9ucyA9IFtjdXJdO1xuICB3aGlsZSAocGFydHMubGVuZ3RoKSB7XG4gICAgY3VyID0gcGFydHMuc2hpZnQoKSArICcuJyArIGN1cjtcbiAgICBwZXJtdXRhdGlvbnMucHVzaChjdXIpO1xuICB9XG4gIHJldHVybiBwZXJtdXRhdGlvbnM7XG59XG5cbmV4cG9ydHMucGVybXV0ZURvbWFpbiA9IHBlcm11dGVEb21haW47XG4iLCAiLyohXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNhbGVzZm9yY2UuY29tLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNhbGVzZm9yY2UuY29tIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXlcbiAqIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cInVzZSBzdHJpY3RcIjtcbi8qXG4gKiBcIkEgcmVxdWVzdC1wYXRoIHBhdGgtbWF0Y2hlcyBhIGdpdmVuIGNvb2tpZS1wYXRoIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVcbiAqIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGRzOlwiXG4gKi9cbmZ1bmN0aW9uIHBhdGhNYXRjaCAocmVxUGF0aCwgY29va2llUGF0aCkge1xuICAvLyBcIm8gIFRoZSBjb29raWUtcGF0aCBhbmQgdGhlIHJlcXVlc3QtcGF0aCBhcmUgaWRlbnRpY2FsLlwiXG4gIGlmIChjb29raWVQYXRoID09PSByZXFQYXRoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgaWR4ID0gcmVxUGF0aC5pbmRleE9mKGNvb2tpZVBhdGgpO1xuICBpZiAoaWR4ID09PSAwKSB7XG4gICAgLy8gXCJvICBUaGUgY29va2llLXBhdGggaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QtcGF0aCwgYW5kIHRoZSBsYXN0XG4gICAgLy8gY2hhcmFjdGVyIG9mIHRoZSBjb29raWUtcGF0aCBpcyAleDJGIChcIi9cIikuXCJcbiAgICBpZiAoY29va2llUGF0aC5zdWJzdHIoLTEpID09PSBcIi9cIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gXCIgbyAgVGhlIGNvb2tpZS1wYXRoIGlzIGEgcHJlZml4IG9mIHRoZSByZXF1ZXN0LXBhdGgsIGFuZCB0aGUgZmlyc3RcbiAgICAvLyBjaGFyYWN0ZXIgb2YgdGhlIHJlcXVlc3QtcGF0aCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY29va2llLSBwYXRoXG4gICAgLy8gaXMgYSAleDJGIChcIi9cIikgY2hhcmFjdGVyLlwiXG4gICAgaWYgKHJlcVBhdGguc3Vic3RyKGNvb2tpZVBhdGgubGVuZ3RoLCAxKSA9PT0gXCIvXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0cy5wYXRoTWF0Y2ggPSBwYXRoTWF0Y2g7XG4iLCAiLyohXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNhbGVzZm9yY2UuY29tLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNhbGVzZm9yY2UuY29tIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXlcbiAqIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkVcbiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GXG4gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1NcbiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOXG4gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKVxuICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEVcbiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG4ndXNlIHN0cmljdCc7XG52YXIgU3RvcmUgPSByZXF1aXJlKCcuL3N0b3JlJykuU3RvcmU7XG52YXIgcGVybXV0ZURvbWFpbiA9IHJlcXVpcmUoJy4vcGVybXV0ZURvbWFpbicpLnBlcm11dGVEb21haW47XG52YXIgcGF0aE1hdGNoID0gcmVxdWlyZSgnLi9wYXRoTWF0Y2gnKS5wYXRoTWF0Y2g7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gTWVtb3J5Q29va2llU3RvcmUoKSB7XG4gIFN0b3JlLmNhbGwodGhpcyk7XG4gIHRoaXMuaWR4ID0ge307XG59XG51dGlsLmluaGVyaXRzKE1lbW9yeUNvb2tpZVN0b3JlLCBTdG9yZSk7XG5leHBvcnRzLk1lbW9yeUNvb2tpZVN0b3JlID0gTWVtb3J5Q29va2llU3RvcmU7XG5NZW1vcnlDb29raWVTdG9yZS5wcm90b3R5cGUuaWR4ID0gbnVsbDtcblxuLy8gU2luY2UgaXQncyBqdXN0IGEgc3RydWN0IGluIFJBTSwgdGhpcyBTdG9yZSBpcyBzeW5jaHJvbm91c1xuTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLnN5bmNocm9ub3VzID0gdHJ1ZTtcblxuLy8gZm9yY2UgYSBkZWZhdWx0IGRlcHRoOlxuTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFwieyBpZHg6IFwiK3V0aWwuaW5zcGVjdCh0aGlzLmlkeCwgZmFsc2UsIDIpKycgfSc7XG59O1xuXG4vLyBVc2UgdGhlIG5ldyBjdXN0b20gaW5zcGVjdGlvbiBzeW1ib2wgdG8gYWRkIHRoZSBjdXN0b20gaW5zcGVjdCBmdW5jdGlvbiBpZlxuLy8gYXZhaWxhYmxlLlxuaWYgKHV0aWwuaW5zcGVjdC5jdXN0b20pIHtcbiAgTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLmluc3BlY3Q7XG59XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5maW5kQ29va2llID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBrZXksIGNiKSB7XG4gIGlmICghdGhpcy5pZHhbZG9tYWluXSkge1xuICAgIHJldHVybiBjYihudWxsLHVuZGVmaW5lZCk7XG4gIH1cbiAgaWYgKCF0aGlzLmlkeFtkb21haW5dW3BhdGhdKSB7XG4gICAgcmV0dXJuIGNiKG51bGwsdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gY2IobnVsbCx0aGlzLmlkeFtkb21haW5dW3BhdGhdW2tleV18fG51bGwpO1xufTtcblxuTWVtb3J5Q29va2llU3RvcmUucHJvdG90eXBlLmZpbmRDb29raWVzID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBjYikge1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICBpZiAoIWRvbWFpbikge1xuICAgIHJldHVybiBjYihudWxsLFtdKTtcbiAgfVxuXG4gIHZhciBwYXRoTWF0Y2hlcjtcbiAgaWYgKCFwYXRoKSB7XG4gICAgLy8gbnVsbCBtZWFucyBcImFsbCBwYXRoc1wiXG4gICAgcGF0aE1hdGNoZXIgPSBmdW5jdGlvbiBtYXRjaEFsbChkb21haW5JbmRleCkge1xuICAgICAgZm9yICh2YXIgY3VyUGF0aCBpbiBkb21haW5JbmRleCkge1xuICAgICAgICB2YXIgcGF0aEluZGV4ID0gZG9tYWluSW5kZXhbY3VyUGF0aF07XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwYXRoSW5kZXgpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocGF0aEluZGV4W2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICB9IGVsc2Uge1xuICAgIHBhdGhNYXRjaGVyID0gZnVuY3Rpb24gbWF0Y2hSRkMoZG9tYWluSW5kZXgpIHtcbiAgICAgICAvL05PVEU6IHdlIHNob3VsZCB1c2UgcGF0aC1tYXRjaCBhbGdvcml0aG0gZnJvbSBTNS4xLjQgaGVyZVxuICAgICAgIC8vKHNlZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9DaHJvbWl1bVdlYkFwcHMvY2hyb21pdW0vYmxvYi9iM2QzYjRkYThiYjk0YzFiMmUwNjE2MDBkZjEwNmQ1OTBmZGEzNjIwL25ldC9jb29raWVzL2Nhbm9uaWNhbF9jb29raWUuY2MjTDI5OSlcbiAgICAgICBPYmplY3Qua2V5cyhkb21haW5JbmRleCkuZm9yRWFjaChmdW5jdGlvbiAoY29va2llUGF0aCkge1xuICAgICAgICAgaWYgKHBhdGhNYXRjaChwYXRoLCBjb29raWVQYXRoKSkge1xuICAgICAgICAgICB2YXIgcGF0aEluZGV4ID0gZG9tYWluSW5kZXhbY29va2llUGF0aF07XG5cbiAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHBhdGhJbmRleCkge1xuICAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXRoSW5kZXhba2V5XSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICB9KTtcbiAgICAgfTtcbiAgfVxuXG4gIHZhciBkb21haW5zID0gcGVybXV0ZURvbWFpbihkb21haW4pIHx8IFtkb21haW5dO1xuICB2YXIgaWR4ID0gdGhpcy5pZHg7XG4gIGRvbWFpbnMuZm9yRWFjaChmdW5jdGlvbihjdXJEb21haW4pIHtcbiAgICB2YXIgZG9tYWluSW5kZXggPSBpZHhbY3VyRG9tYWluXTtcbiAgICBpZiAoIWRvbWFpbkluZGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBhdGhNYXRjaGVyKGRvbWFpbkluZGV4KTtcbiAgfSk7XG5cbiAgY2IobnVsbCxyZXN1bHRzKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5wdXRDb29raWUgPSBmdW5jdGlvbihjb29raWUsIGNiKSB7XG4gIGlmICghdGhpcy5pZHhbY29va2llLmRvbWFpbl0pIHtcbiAgICB0aGlzLmlkeFtjb29raWUuZG9tYWluXSA9IHt9O1xuICB9XG4gIGlmICghdGhpcy5pZHhbY29va2llLmRvbWFpbl1bY29va2llLnBhdGhdKSB7XG4gICAgdGhpcy5pZHhbY29va2llLmRvbWFpbl1bY29va2llLnBhdGhdID0ge307XG4gIH1cbiAgdGhpcy5pZHhbY29va2llLmRvbWFpbl1bY29va2llLnBhdGhdW2Nvb2tpZS5rZXldID0gY29va2llO1xuICBjYihudWxsKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS51cGRhdGVDb29raWUgPSBmdW5jdGlvbihvbGRDb29raWUsIG5ld0Nvb2tpZSwgY2IpIHtcbiAgLy8gdXBkYXRlQ29va2llKCkgbWF5IGF2b2lkIHVwZGF0aW5nIGNvb2tpZXMgdGhhdCBhcmUgaWRlbnRpY2FsLiAgRm9yIGV4YW1wbGUsXG4gIC8vIGxhc3RBY2Nlc3NlZCBtYXkgbm90IGJlIGltcG9ydGFudCB0byBzb21lIHN0b3JlcyBhbmQgYW4gZXF1YWxpdHlcbiAgLy8gY29tcGFyaXNvbiBjb3VsZCBleGNsdWRlIHRoYXQgZmllbGQuXG4gIHRoaXMucHV0Q29va2llKG5ld0Nvb2tpZSxjYik7XG59O1xuXG5NZW1vcnlDb29raWVTdG9yZS5wcm90b3R5cGUucmVtb3ZlQ29va2llID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBrZXksIGNiKSB7XG4gIGlmICh0aGlzLmlkeFtkb21haW5dICYmIHRoaXMuaWR4W2RvbWFpbl1bcGF0aF0gJiYgdGhpcy5pZHhbZG9tYWluXVtwYXRoXVtrZXldKSB7XG4gICAgZGVsZXRlIHRoaXMuaWR4W2RvbWFpbl1bcGF0aF1ba2V5XTtcbiAgfVxuICBjYihudWxsKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5yZW1vdmVDb29raWVzID0gZnVuY3Rpb24oZG9tYWluLCBwYXRoLCBjYikge1xuICBpZiAodGhpcy5pZHhbZG9tYWluXSkge1xuICAgIGlmIChwYXRoKSB7XG4gICAgICBkZWxldGUgdGhpcy5pZHhbZG9tYWluXVtwYXRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuaWR4W2RvbWFpbl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjYihudWxsKTtcbn07XG5cbk1lbW9yeUNvb2tpZVN0b3JlLnByb3RvdHlwZS5yZW1vdmVBbGxDb29raWVzID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhpcy5pZHggPSB7fTtcbiAgcmV0dXJuIGNiKG51bGwpO1xufVxuXG5NZW1vcnlDb29raWVTdG9yZS5wcm90b3R5cGUuZ2V0QWxsQ29va2llcyA9IGZ1bmN0aW9uKGNiKSB7XG4gIHZhciBjb29raWVzID0gW107XG4gIHZhciBpZHggPSB0aGlzLmlkeDtcblxuICB2YXIgZG9tYWlucyA9IE9iamVjdC5rZXlzKGlkeCk7XG4gIGRvbWFpbnMuZm9yRWFjaChmdW5jdGlvbihkb21haW4pIHtcbiAgICB2YXIgcGF0aHMgPSBPYmplY3Qua2V5cyhpZHhbZG9tYWluXSk7XG4gICAgcGF0aHMuZm9yRWFjaChmdW5jdGlvbihwYXRoKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGlkeFtkb21haW5dW3BhdGhdKTtcbiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvb2tpZXMucHVzaChpZHhbZG9tYWluXVtwYXRoXVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFNvcnQgYnkgY3JlYXRpb25JbmRleCBzbyBkZXNlcmlhbGl6aW5nIHJldGFpbnMgdGhlIGNyZWF0aW9uIG9yZGVyLlxuICAvLyBXaGVuIGltcGxlbWVudGluZyB5b3VyIG93biBzdG9yZSwgdGhpcyBTSE9VTEQgcmV0YWluIHRoZSBvcmRlciB0b29cbiAgY29va2llcy5zb3J0KGZ1bmN0aW9uKGEsYikge1xuICAgIHJldHVybiAoYS5jcmVhdGlvbkluZGV4fHwwKSAtIChiLmNyZWF0aW9uSW5kZXh8fDApO1xuICB9KTtcblxuICBjYihudWxsLCBjb29raWVzKTtcbn07XG4iLCAiLy8gZ2VuZXJhdGVkIGJ5IGdlbnZlcnNpb25cbm1vZHVsZS5leHBvcnRzID0gJzIuNS4wJ1xuIiwgIi8qIVxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBTYWxlc2ZvcmNlLmNvbSwgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTYWxlc2ZvcmNlLmNvbSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5XG4gKiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFXG4gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SXG4gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRlxuICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTXG4gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTlxuICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSlcbiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFXG4gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xudmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xudmFyIHVybFBhcnNlID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwdWJzdWZmaXggPSByZXF1aXJlKCcuL3B1YnN1ZmZpeC1wc2wnKTtcbnZhciBTdG9yZSA9IHJlcXVpcmUoJy4vc3RvcmUnKS5TdG9yZTtcbnZhciBNZW1vcnlDb29raWVTdG9yZSA9IHJlcXVpcmUoJy4vbWVtc3RvcmUnKS5NZW1vcnlDb29raWVTdG9yZTtcbnZhciBwYXRoTWF0Y2ggPSByZXF1aXJlKCcuL3BhdGhNYXRjaCcpLnBhdGhNYXRjaDtcbnZhciBWRVJTSU9OID0gcmVxdWlyZSgnLi92ZXJzaW9uJyk7XG5cbnZhciBwdW55Y29kZTtcbnRyeSB7XG4gIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbn0gY2F0Y2goZSkge1xuICBjb25zb2xlLndhcm4oXCJ0b3VnaC1jb29raWU6IGNhbid0IGxvYWQgcHVueWNvZGU7IHdvbid0IHVzZSBwdW55Y29kZSBmb3IgZG9tYWluIG5vcm1hbGl6YXRpb25cIik7XG59XG5cbi8vIEZyb20gUkZDNjI2NSBTNC4xLjFcbi8vIG5vdGUgdGhhdCBpdCBleGNsdWRlcyBcXHgzQiBcIjtcIlxudmFyIENPT0tJRV9PQ1RFVFMgPSAvXltcXHgyMVxceDIzLVxceDJCXFx4MkQtXFx4M0FcXHgzQy1cXHg1QlxceDVELVxceDdFXSskLztcblxudmFyIENPTlRST0xfQ0hBUlMgPSAvW1xceDAwLVxceDFGXS87XG5cbi8vIEZyb20gQ2hyb21pdW0gLy8gJ1xccicsICdcXG4nIGFuZCAnXFwwJyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHRlcm1pbmF0b3IgaW5cbi8vIHRoZSBcInJlbGF4ZWRcIiBtb2RlLCBzZWU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vQ2hyb21pdW1XZWJBcHBzL2Nocm9taXVtL2Jsb2IvYjNkM2I0ZGE4YmI5NGMxYjJlMDYxNjAwZGYxMDZkNTkwZmRhMzYyMC9uZXQvY29va2llcy9wYXJzZWRfY29va2llLmNjI0w2MFxudmFyIFRFUk1JTkFUT1JTID0gWydcXG4nLCAnXFxyJywgJ1xcMCddO1xuXG4vLyBSRkM2MjY1IFM0LjEuMSBkZWZpbmVzIHBhdGggdmFsdWUgYXMgJ2FueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiJ1xuLy8gTm90ZSAnOycgaXMgXFx4M0JcbnZhciBQQVRIX1ZBTFVFID0gL1tcXHgyMC1cXHgzQVxceDNDLVxceDdFXSsvO1xuXG4vLyBkYXRlLXRpbWUgcGFyc2luZyBjb25zdGFudHMgKFJGQzYyNjUgUzUuMS4xKVxuXG52YXIgREFURV9ERUxJTSA9IC9bXFx4MDlcXHgyMC1cXHgyRlxceDNCLVxceDQwXFx4NUItXFx4NjBcXHg3Qi1cXHg3RV0vO1xuXG52YXIgTU9OVEhfVE9fTlVNID0ge1xuICBqYW46MCwgZmViOjEsIG1hcjoyLCBhcHI6MywgbWF5OjQsIGp1bjo1LFxuICBqdWw6NiwgYXVnOjcsIHNlcDo4LCBvY3Q6OSwgbm92OjEwLCBkZWM6MTFcbn07XG52YXIgTlVNX1RPX01PTlRIID0gW1xuICAnSmFuJywnRmViJywnTWFyJywnQXByJywnTWF5JywnSnVuJywnSnVsJywnQXVnJywnU2VwJywnT2N0JywnTm92JywnRGVjJ1xuXTtcbnZhciBOVU1fVE9fREFZID0gW1xuICAnU3VuJywnTW9uJywnVHVlJywnV2VkJywnVGh1JywnRnJpJywnU2F0J1xuXTtcblxudmFyIE1BWF9USU1FID0gMjE0NzQ4MzY0NzAwMDsgLy8gMzEtYml0IG1heFxudmFyIE1JTl9USU1FID0gMDsgLy8gMzEtYml0IG1pblxuXG4vKlxuICogUGFyc2VzIGEgTmF0dXJhbCBudW1iZXIgKGkuZS4sIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyKSB3aXRoIGVpdGhlciB0aGVcbiAqICAgIDxtaW4+KjxtYXg+RElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcbiAqIG9yXG4gKiAgICA8bWluPio8bWF4PkRJR0lUXG4gKiBncmFtbWFyIChSRkM2MjY1IFM1LjEuMSkuXG4gKlxuICogVGhlIFwidHJhaWxpbmdPS1wiIGJvb2xlYW4gY29udHJvbHMgaWYgdGhlIGdyYW1tYXIgYWNjZXB0cyBhXG4gKiBcIiggbm9uLWRpZ2l0ICpPQ1RFVCApXCIgdHJhaWxlci5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEaWdpdHModG9rZW4sIG1pbkRpZ2l0cywgbWF4RGlnaXRzLCB0cmFpbGluZ09LKSB7XG4gIHZhciBjb3VudCA9IDA7XG4gIHdoaWxlIChjb3VudCA8IHRva2VuLmxlbmd0aCkge1xuICAgIHZhciBjID0gdG9rZW4uY2hhckNvZGVBdChjb3VudCk7XG4gICAgLy8gXCJub24tZGlnaXQgPSAleDAwLTJGIC8gJXgzQS1GRlwiXG4gICAgaWYgKGMgPD0gMHgyRiB8fCBjID49IDB4M0EpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb3VudCsrO1xuICB9XG5cbiAgLy8gY29uc3RyYWluIHRvIGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzLlxuICBpZiAoY291bnQgPCBtaW5EaWdpdHMgfHwgY291bnQgPiBtYXhEaWdpdHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghdHJhaWxpbmdPSyAmJiBjb3VudCAhPSB0b2tlbi5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZUludCh0b2tlbi5zdWJzdHIoMCxjb3VudCksIDEwKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lKHRva2VuKSB7XG4gIHZhciBwYXJ0cyA9IHRva2VuLnNwbGl0KCc6Jyk7XG4gIHZhciByZXN1bHQgPSBbMCwwLDBdO1xuXG4gIC8qIFJGNjI1NiBTNS4xLjE6XG4gICAqICAgICAgdGltZSAgICAgICAgICAgID0gaG1zLXRpbWUgKCBub24tZGlnaXQgKk9DVEVUIClcbiAgICogICAgICBobXMtdGltZSAgICAgICAgPSB0aW1lLWZpZWxkIFwiOlwiIHRpbWUtZmllbGQgXCI6XCIgdGltZS1maWVsZFxuICAgKiAgICAgIHRpbWUtZmllbGQgICAgICA9IDEqMkRJR0lUXG4gICAqL1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgLy8gXCJ0aW1lLWZpZWxkXCIgbXVzdCBiZSBzdHJpY3RseSBcIjEqMkRJR0lUXCIsIEhPV0VWRVIsIFwiaG1zLXRpbWVcIiBjYW4gYmVcbiAgICAvLyBmb2xsb3dlZCBieSBcIiggbm9uLWRpZ2l0ICpPQ1RFVCApXCIgc28gdGhlcmVmb3JlIHRoZSBsYXN0IHRpbWUtZmllbGQgY2FuXG4gICAgLy8gaGF2ZSBhIHRyYWlsZXJcbiAgICB2YXIgdHJhaWxpbmdPSyA9IChpID09IDIpO1xuICAgIHZhciBudW0gPSBwYXJzZURpZ2l0cyhwYXJ0c1tpXSwgMSwgMiwgdHJhaWxpbmdPSyk7XG4gICAgaWYgKG51bSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJlc3VsdFtpXSA9IG51bTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9udGgodG9rZW4pIHtcbiAgdG9rZW4gPSBTdHJpbmcodG9rZW4pLnN1YnN0cigwLDMpLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBudW0gPSBNT05USF9UT19OVU1bdG9rZW5dO1xuICByZXR1cm4gbnVtID49IDAgPyBudW0gOiBudWxsO1xufVxuXG4vKlxuICogUkZDNjI2NSBTNS4xLjEgZGF0ZSBwYXJzZXIgKHNlZSBSRkMgZm9yIGZ1bGwgZ3JhbW1hcilcbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRlKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIFJGQzYyNjUgUzUuMS4xOlxuICAgKiAyLiBQcm9jZXNzIGVhY2ggZGF0ZS10b2tlbiBzZXF1ZW50aWFsbHkgaW4gdGhlIG9yZGVyIHRoZSBkYXRlLXRva2Vuc1xuICAgKiBhcHBlYXIgaW4gdGhlIGNvb2tpZS1kYXRlXG4gICAqL1xuICB2YXIgdG9rZW5zID0gc3RyLnNwbGl0KERBVEVfREVMSU0pO1xuICBpZiAoIXRva2Vucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBob3VyID0gbnVsbDtcbiAgdmFyIG1pbnV0ZSA9IG51bGw7XG4gIHZhciBzZWNvbmQgPSBudWxsO1xuICB2YXIgZGF5T2ZNb250aCA9IG51bGw7XG4gIHZhciBtb250aCA9IG51bGw7XG4gIHZhciB5ZWFyID0gbnVsbDtcblxuICBmb3IgKHZhciBpPTA7IGk8dG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRva2VuID0gdG9rZW5zW2ldLnRyaW0oKTtcbiAgICBpZiAoIXRva2VuLmxlbmd0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdDtcblxuICAgIC8qIDIuMS4gSWYgdGhlIGZvdW5kLXRpbWUgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgdG9rZW4gbWF0Y2hlcyB0aGUgdGltZVxuICAgICAqIHByb2R1Y3Rpb24sIHNldCB0aGUgZm91bmQtdGltZSBmbGFnIGFuZCBzZXQgdGhlIGhvdXItIHZhbHVlLFxuICAgICAqIG1pbnV0ZS12YWx1ZSwgYW5kIHNlY29uZC12YWx1ZSB0byB0aGUgbnVtYmVycyBkZW5vdGVkIGJ5IHRoZSBkaWdpdHMgaW5cbiAgICAgKiB0aGUgZGF0ZS10b2tlbiwgcmVzcGVjdGl2ZWx5LiAgU2tpcCB0aGUgcmVtYWluaW5nIHN1Yi1zdGVwcyBhbmQgY29udGludWVcbiAgICAgKiB0byB0aGUgbmV4dCBkYXRlLXRva2VuLlxuICAgICAqL1xuICAgIGlmIChzZWNvbmQgPT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHBhcnNlVGltZSh0b2tlbik7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGhvdXIgPSByZXN1bHRbMF07XG4gICAgICAgIG1pbnV0ZSA9IHJlc3VsdFsxXTtcbiAgICAgICAgc2Vjb25kID0gcmVzdWx0WzJdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiAyLjIuIElmIHRoZSBmb3VuZC1kYXktb2YtbW9udGggZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzXG4gICAgICogdGhlIGRheS1vZi1tb250aCBwcm9kdWN0aW9uLCBzZXQgdGhlIGZvdW5kLWRheS1vZi0gbW9udGggZmxhZyBhbmQgc2V0XG4gICAgICogdGhlIGRheS1vZi1tb250aC12YWx1ZSB0byB0aGUgbnVtYmVyIGRlbm90ZWQgYnkgdGhlIGRhdGUtdG9rZW4uICBTa2lwXG4gICAgICogdGhlIHJlbWFpbmluZyBzdWItc3RlcHMgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGRhdGUtdG9rZW4uXG4gICAgICovXG4gICAgaWYgKGRheU9mTW9udGggPT09IG51bGwpIHtcbiAgICAgIC8vIFwiZGF5LW9mLW1vbnRoID0gMSoyRElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcIlxuICAgICAgcmVzdWx0ID0gcGFyc2VEaWdpdHModG9rZW4sIDEsIDIsIHRydWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBkYXlPZk1vbnRoID0gcmVzdWx0O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiAyLjMuIElmIHRoZSBmb3VuZC1tb250aCBmbGFnIGlzIG5vdCBzZXQgYW5kIHRoZSBkYXRlLXRva2VuIG1hdGNoZXMgdGhlXG4gICAgICogbW9udGggcHJvZHVjdGlvbiwgc2V0IHRoZSBmb3VuZC1tb250aCBmbGFnIGFuZCBzZXQgdGhlIG1vbnRoLXZhbHVlIHRvXG4gICAgICogdGhlIG1vbnRoIGRlbm90ZWQgYnkgdGhlIGRhdGUtdG9rZW4uICBTa2lwIHRoZSByZW1haW5pbmcgc3ViLXN0ZXBzIGFuZFxuICAgICAqIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGRhdGUtdG9rZW4uXG4gICAgICovXG4gICAgaWYgKG1vbnRoID09PSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBwYXJzZU1vbnRoKHRva2VuKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgbW9udGggPSByZXN1bHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIDIuNC4gSWYgdGhlIGZvdW5kLXllYXIgZmxhZyBpcyBub3Qgc2V0IGFuZCB0aGUgZGF0ZS10b2tlbiBtYXRjaGVzIHRoZVxuICAgICAqIHllYXIgcHJvZHVjdGlvbiwgc2V0IHRoZSBmb3VuZC15ZWFyIGZsYWcgYW5kIHNldCB0aGUgeWVhci12YWx1ZSB0byB0aGVcbiAgICAgKiBudW1iZXIgZGVub3RlZCBieSB0aGUgZGF0ZS10b2tlbi4gIFNraXAgdGhlIHJlbWFpbmluZyBzdWItc3RlcHMgYW5kXG4gICAgICogY29udGludWUgdG8gdGhlIG5leHQgZGF0ZS10b2tlbi5cbiAgICAgKi9cbiAgICBpZiAoeWVhciA9PT0gbnVsbCkge1xuICAgICAgLy8gXCJ5ZWFyID0gMio0RElHSVQgKCBub24tZGlnaXQgKk9DVEVUIClcIlxuICAgICAgcmVzdWx0ID0gcGFyc2VEaWdpdHModG9rZW4sIDIsIDQsIHRydWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICB5ZWFyID0gcmVzdWx0O1xuICAgICAgICAvKiBGcm9tIFM1LjEuMTpcbiAgICAgICAgICogMy4gIElmIHRoZSB5ZWFyLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA3MCBhbmQgbGVzc1xuICAgICAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIDk5LCBpbmNyZW1lbnQgdGhlIHllYXItdmFsdWUgYnkgMTkwMC5cbiAgICAgICAgICogNC4gIElmIHRoZSB5ZWFyLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzXG4gICAgICAgICAqIHRoYW4gb3IgZXF1YWwgdG8gNjksIGluY3JlbWVudCB0aGUgeWVhci12YWx1ZSBieSAyMDAwLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHllYXIgPj0gNzAgJiYgeWVhciA8PSA5OSkge1xuICAgICAgICAgIHllYXIgKz0gMTkwMDtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyID49IDAgJiYgeWVhciA8PSA2OSkge1xuICAgICAgICAgIHllYXIgKz0gMjAwMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qIFJGQyA2MjY1IFM1LjEuMVxuICAgKiBcIjUuIEFib3J0IHRoZXNlIHN0ZXBzIGFuZCBmYWlsIHRvIHBhcnNlIHRoZSBjb29raWUtZGF0ZSBpZjpcbiAgICogICAgICogIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm91bmQtZGF5LW9mLW1vbnRoLCBmb3VuZC1tb250aCwgZm91bmQtXG4gICAqICAgICAgICB5ZWFyLCBvciBmb3VuZC10aW1lIGZsYWdzIGlzIG5vdCBzZXQsXG4gICAqICAgICAqICB0aGUgZGF5LW9mLW1vbnRoLXZhbHVlIGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiAzMSxcbiAgICogICAgICogIHRoZSB5ZWFyLXZhbHVlIGlzIGxlc3MgdGhhbiAxNjAxLFxuICAgKiAgICAgKiAgdGhlIGhvdXItdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDIzLFxuICAgKiAgICAgKiAgdGhlIG1pbnV0ZS12YWx1ZSBpcyBncmVhdGVyIHRoYW4gNTksIG9yXG4gICAqICAgICAqICB0aGUgc2Vjb25kLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiA1OS5cbiAgICogICAgIChOb3RlIHRoYXQgbGVhcCBzZWNvbmRzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0aGlzIHN5bnRheC4pXCJcbiAgICpcbiAgICogU28sIGluIG9yZGVyIGFzIGFib3ZlOlxuICAgKi9cbiAgaWYgKFxuICAgIGRheU9mTW9udGggPT09IG51bGwgfHwgbW9udGggPT09IG51bGwgfHwgeWVhciA9PT0gbnVsbCB8fCBzZWNvbmQgPT09IG51bGwgfHxcbiAgICBkYXlPZk1vbnRoIDwgMSB8fCBkYXlPZk1vbnRoID4gMzEgfHxcbiAgICB5ZWFyIDwgMTYwMSB8fFxuICAgIGhvdXIgPiAyMyB8fFxuICAgIG1pbnV0ZSA+IDU5IHx8XG4gICAgc2Vjb25kID4gNTlcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXlPZk1vbnRoLCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHtcbiAgdmFyIGQgPSBkYXRlLmdldFVUQ0RhdGUoKTsgZCA9IGQgPj0gMTAgPyBkIDogJzAnK2Q7XG4gIHZhciBoID0gZGF0ZS5nZXRVVENIb3VycygpOyBoID0gaCA+PSAxMCA/IGggOiAnMCcraDtcbiAgdmFyIG0gPSBkYXRlLmdldFVUQ01pbnV0ZXMoKTsgbSA9IG0gPj0gMTAgPyBtIDogJzAnK207XG4gIHZhciBzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7IHMgPSBzID49IDEwID8gcyA6ICcwJytzO1xuICByZXR1cm4gTlVNX1RPX0RBWVtkYXRlLmdldFVUQ0RheSgpXSArICcsICcgK1xuICAgIGQrJyAnKyBOVU1fVE9fTU9OVEhbZGF0ZS5nZXRVVENNb250aCgpXSArJyAnKyBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKycgJytcbiAgICBoKyc6JyttKyc6JytzKycgR01UJztcbn1cblxuLy8gUzUuMS4yIENhbm9uaWNhbGl6ZWQgSG9zdCBOYW1lc1xuZnVuY3Rpb24gY2Fub25pY2FsRG9tYWluKHN0cikge1xuICBpZiAoc3RyID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL15cXC4vLCcnKTsgLy8gUzQuMS4yLjMgJiBTNS4yLjM6IGlnbm9yZSBsZWFkaW5nIC5cblxuICAvLyBjb252ZXJ0IHRvIElETiBpZiBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnNcbiAgaWYgKHB1bnljb2RlICYmIC9bXlxcdTAwMDEtXFx1MDA3Zl0vLnRlc3Qoc3RyKSkge1xuICAgIHN0ciA9IHB1bnljb2RlLnRvQVNDSUkoc3RyKTtcbiAgfVxuXG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbn1cblxuLy8gUzUuMS4zIERvbWFpbiBNYXRjaGluZ1xuZnVuY3Rpb24gZG9tYWluTWF0Y2goc3RyLCBkb21TdHIsIGNhbm9uaWNhbGl6ZSkge1xuICBpZiAoc3RyID09IG51bGwgfHwgZG9tU3RyID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoY2Fub25pY2FsaXplICE9PSBmYWxzZSkge1xuICAgIHN0ciA9IGNhbm9uaWNhbERvbWFpbihzdHIpO1xuICAgIGRvbVN0ciA9IGNhbm9uaWNhbERvbWFpbihkb21TdHIpO1xuICB9XG5cbiAgLypcbiAgICogXCJUaGUgZG9tYWluIHN0cmluZyBhbmQgdGhlIHN0cmluZyBhcmUgaWRlbnRpY2FsLiAoTm90ZSB0aGF0IGJvdGggdGhlXG4gICAqIGRvbWFpbiBzdHJpbmcgYW5kIHRoZSBzdHJpbmcgd2lsbCBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCB0byBsb3dlciBjYXNlIGF0XG4gICAqIHRoaXMgcG9pbnQpXCJcbiAgICovXG4gIGlmIChzdHIgPT0gZG9tU3RyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiBcIkFsbCBvZiB0aGUgZm9sbG93aW5nIFt0aHJlZV0gY29uZGl0aW9ucyBob2xkOlwiIChvcmRlciBhZGp1c3RlZCBmcm9tIHRoZSBSRkMpICovXG5cbiAgLyogXCIqIFRoZSBzdHJpbmcgaXMgYSBob3N0IG5hbWUgKGkuZS4sIG5vdCBhbiBJUCBhZGRyZXNzKS5cIiAqL1xuICBpZiAobmV0LmlzSVAoc3RyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIFwiKiBUaGUgZG9tYWluIHN0cmluZyBpcyBhIHN1ZmZpeCBvZiB0aGUgc3RyaW5nXCIgKi9cbiAgdmFyIGlkeCA9IHN0ci5pbmRleE9mKGRvbVN0cik7XG4gIGlmIChpZHggPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gaXQncyBhIG5vbi1tYXRjaCAoLTEpIG9yIHByZWZpeCAoMClcbiAgfVxuXG4gIC8vIGUuZyBcImEuYi5jXCIuaW5kZXhPZihcImIuY1wiKSA9PT0gMlxuICAvLyA1ID09PSAzKzJcbiAgaWYgKHN0ci5sZW5ndGggIT09IGRvbVN0ci5sZW5ndGggKyBpZHgpIHsgLy8gaXQncyBub3QgYSBzdWZmaXhcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiBcIiogVGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRvbWFpblxuICAqIHN0cmluZyBpcyBhICV4MkUgKFwiLlwiKSBjaGFyYWN0ZXIuXCIgKi9cbiAgaWYgKHN0ci5zdWJzdHIoaWR4LTEsMSkgIT09ICcuJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5cbi8vIFJGQzYyNjUgUzUuMS40IFBhdGhzIGFuZCBQYXRoLU1hdGNoXG5cbi8qXG4gKiBcIlRoZSB1c2VyIGFnZW50IE1VU1QgdXNlIGFuIGFsZ29yaXRobSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtXG4gKiB0byBjb21wdXRlIHRoZSBkZWZhdWx0LXBhdGggb2YgYSBjb29raWU6XCJcbiAqXG4gKiBBc3N1bXB0aW9uOiB0aGUgcGF0aCAoYW5kIG5vdCBxdWVyeSBwYXJ0IG9yIGFic29sdXRlIHVyaSkgaXMgcGFzc2VkIGluLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UGF0aChwYXRoKSB7XG4gIC8vIFwiMi4gSWYgdGhlIHVyaS1wYXRoIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHVyaS1wYXRoIGlzIG5vdFxuICAvLyBhICV4MkYgKFwiL1wiKSBjaGFyYWN0ZXIsIG91dHB1dCAleDJGIChcIi9cIikgYW5kIHNraXAgdGhlIHJlbWFpbmluZyBzdGVwcy5cbiAgaWYgKCFwYXRoIHx8IHBhdGguc3Vic3RyKDAsMSkgIT09IFwiL1wiKSB7XG4gICAgcmV0dXJuIFwiL1wiO1xuICB9XG5cbiAgLy8gXCIzLiBJZiB0aGUgdXJpLXBhdGggY29udGFpbnMgbm8gbW9yZSB0aGFuIG9uZSAleDJGIChcIi9cIikgY2hhcmFjdGVyLCBvdXRwdXRcbiAgLy8gJXgyRiAoXCIvXCIpIGFuZCBza2lwIHRoZSByZW1haW5pbmcgc3RlcC5cIlxuICBpZiAocGF0aCA9PT0gXCIvXCIpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIHZhciByaWdodFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG4gIGlmIChyaWdodFNsYXNoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiL1wiO1xuICB9XG5cbiAgLy8gXCI0LiBPdXRwdXQgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVyaS1wYXRoIGZyb20gdGhlIGZpcnN0IGNoYXJhY3RlciB1cCB0byxcbiAgLy8gYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSByaWdodC1tb3N0ICV4MkYgKFwiL1wiKS5cIlxuICByZXR1cm4gcGF0aC5zbGljZSgwLCByaWdodFNsYXNoKTtcbn1cblxuZnVuY3Rpb24gdHJpbVRlcm1pbmF0b3Ioc3RyKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgVEVSTUlOQVRPUlMubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgdGVybWluYXRvcklkeCA9IHN0ci5pbmRleE9mKFRFUk1JTkFUT1JTW3RdKTtcbiAgICBpZiAodGVybWluYXRvcklkeCAhPT0gLTEpIHtcbiAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCx0ZXJtaW5hdG9ySWR4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvb2tpZVBhaXIoY29va2llUGFpciwgbG9vc2VNb2RlKSB7XG4gIGNvb2tpZVBhaXIgPSB0cmltVGVybWluYXRvcihjb29raWVQYWlyKTtcblxuICB2YXIgZmlyc3RFcSA9IGNvb2tpZVBhaXIuaW5kZXhPZignPScpO1xuICBpZiAobG9vc2VNb2RlKSB7XG4gICAgaWYgKGZpcnN0RXEgPT09IDApIHsgLy8gJz0nIGlzIGltbWVkaWF0ZWx5IGF0IHN0YXJ0XG4gICAgICBjb29raWVQYWlyID0gY29va2llUGFpci5zdWJzdHIoMSk7XG4gICAgICBmaXJzdEVxID0gY29va2llUGFpci5pbmRleE9mKCc9Jyk7IC8vIG1pZ2h0IHN0aWxsIG5lZWQgdG8gc3BsaXQgb24gJz0nXG4gICAgfVxuICB9IGVsc2UgeyAvLyBub24tbG9vc2UgbW9kZVxuICAgIGlmIChmaXJzdEVxIDw9IDApIHsgLy8gbm8gJz0nIG9yIGlzIGF0IHN0YXJ0XG4gICAgICByZXR1cm47IC8vIG5lZWRzIHRvIGhhdmUgbm9uLWVtcHR5IFwiY29va2llLW5hbWVcIlxuICAgIH1cbiAgfVxuXG4gIHZhciBjb29raWVOYW1lLCBjb29raWVWYWx1ZTtcbiAgaWYgKGZpcnN0RXEgPD0gMCkge1xuICAgIGNvb2tpZU5hbWUgPSBcIlwiO1xuICAgIGNvb2tpZVZhbHVlID0gY29va2llUGFpci50cmltKCk7XG4gIH0gZWxzZSB7XG4gICAgY29va2llTmFtZSA9IGNvb2tpZVBhaXIuc3Vic3RyKDAsIGZpcnN0RXEpLnRyaW0oKTtcbiAgICBjb29raWVWYWx1ZSA9IGNvb2tpZVBhaXIuc3Vic3RyKGZpcnN0RXErMSkudHJpbSgpO1xuICB9XG5cbiAgaWYgKENPTlRST0xfQ0hBUlMudGVzdChjb29raWVOYW1lKSB8fCBDT05UUk9MX0NIQVJTLnRlc3QoY29va2llVmFsdWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGMgPSBuZXcgQ29va2llKCk7XG4gIGMua2V5ID0gY29va2llTmFtZTtcbiAgYy52YWx1ZSA9IGNvb2tpZVZhbHVlO1xuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgc3RyID0gc3RyLnRyaW0oKTtcblxuICAvLyBXZSB1c2UgYSByZWdleCB0byBwYXJzZSB0aGUgXCJuYW1lLXZhbHVlLXBhaXJcIiBwYXJ0IG9mIFM1LjJcbiAgdmFyIGZpcnN0U2VtaSA9IHN0ci5pbmRleE9mKCc7Jyk7IC8vIFM1LjIgc3RlcCAxXG4gIHZhciBjb29raWVQYWlyID0gKGZpcnN0U2VtaSA9PT0gLTEpID8gc3RyIDogc3RyLnN1YnN0cigwLCBmaXJzdFNlbWkpO1xuICB2YXIgYyA9IHBhcnNlQ29va2llUGFpcihjb29raWVQYWlyLCAhIW9wdGlvbnMubG9vc2UpO1xuICBpZiAoIWMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZmlyc3RTZW1pID09PSAtMSkge1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLy8gUzUuMi4zIFwidW5wYXJzZWQtYXR0cmlidXRlcyBjb25zaXN0IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHNldC1jb29raWUtc3RyaW5nXG4gIC8vIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXCIgcGx1cyBsYXRlciBvbiBpbiB0aGUgc2FtZSBzZWN0aW9uXG4gIC8vIFwiZGlzY2FyZCB0aGUgZmlyc3QgXCI7XCIgYW5kIHRyaW1cIi5cbiAgdmFyIHVucGFyc2VkID0gc3RyLnNsaWNlKGZpcnN0U2VtaSArIDEpLnRyaW0oKTtcblxuICAvLyBcIklmIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHN0cmluZyBpcyBlbXB0eSwgc2tpcCB0aGUgcmVzdCBvZiB0aGVzZVxuICAvLyBzdGVwcy5cIlxuICBpZiAodW5wYXJzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICAvKlxuICAgKiBTNS4yIHNheXMgdGhhdCB3aGVuIGxvb3Bpbmcgb3ZlciB0aGUgaXRlbXMgXCJbcF1yb2Nlc3MgdGhlIGF0dHJpYnV0ZS1uYW1lXG4gICAqIGFuZCBhdHRyaWJ1dGUtdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgaW4gdGhlIGZvbGxvd2luZ1xuICAgKiBzdWJzZWN0aW9uc1wiIGZvciBldmVyeSBpdGVtLiAgUGx1cywgZm9yIG1hbnkgb2YgdGhlIGluZGl2aWR1YWwgYXR0cmlidXRlc1xuICAgKiBpbiBTNS4zIGl0IHNheXMgdG8gdXNlIHRoZSBcImF0dHJpYnV0ZS12YWx1ZSBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgaW4gdGhlXG4gICAqIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFwiLiAgVGhlcmVmb3JlLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLCB3ZSBvdmVyd3JpdGVcbiAgICogdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgKi9cbiAgdmFyIGNvb2tpZV9hdnMgPSB1bnBhcnNlZC5zcGxpdCgnOycpO1xuICB3aGlsZSAoY29va2llX2F2cy5sZW5ndGgpIHtcbiAgICB2YXIgYXYgPSBjb29raWVfYXZzLnNoaWZ0KCkudHJpbSgpO1xuICAgIGlmIChhdi5sZW5ndGggPT09IDApIHsgLy8gaGFwcGVucyBpZiBcIjs7XCIgYXBwZWFyc1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBhdl9zZXAgPSBhdi5pbmRleE9mKCc9Jyk7XG4gICAgdmFyIGF2X2tleSwgYXZfdmFsdWU7XG5cbiAgICBpZiAoYXZfc2VwID09PSAtMSkge1xuICAgICAgYXZfa2V5ID0gYXY7XG4gICAgICBhdl92YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF2X2tleSA9IGF2LnN1YnN0cigwLGF2X3NlcCk7XG4gICAgICBhdl92YWx1ZSA9IGF2LnN1YnN0cihhdl9zZXArMSk7XG4gICAgfVxuXG4gICAgYXZfa2V5ID0gYXZfa2V5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICBhdl92YWx1ZSA9IGF2X3ZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICBzd2l0Y2goYXZfa2V5KSB7XG4gICAgY2FzZSAnZXhwaXJlcyc6IC8vIFM1LjIuMVxuICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgIHZhciBleHAgPSBwYXJzZURhdGUoYXZfdmFsdWUpO1xuICAgICAgICAvLyBcIklmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgZmFpbGVkIHRvIHBhcnNlIGFzIGEgY29va2llIGRhdGUsIGlnbm9yZSB0aGVcbiAgICAgICAgLy8gY29va2llLWF2LlwiXG4gICAgICAgIGlmIChleHApIHtcbiAgICAgICAgICAvLyBvdmVyIGFuZCB1bmRlcmZsb3cgbm90IHJlYWxpc3RpY2FsbHkgYSBjb25jZXJuOiBWOCdzIGdldFRpbWUoKSBzZWVtcyB0b1xuICAgICAgICAgIC8vIHN0b3JlIHNvbWV0aGluZyBsYXJnZXIgdGhhbiBhIDMyLWJpdCB0aW1lX3QgKGV2ZW4gd2l0aCAzMi1iaXQgbm9kZSlcbiAgICAgICAgICBjLmV4cGlyZXMgPSBleHA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbWF4LWFnZSc6IC8vIFM1LjIuMlxuICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgIC8vIFwiSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCBhIERJR0lUIG9yIGEgXCItXCJcbiAgICAgICAgLy8gY2hhcmFjdGVyIC4uLltvcl0uLi4gSWYgdGhlIHJlbWFpbmRlciBvZiBhdHRyaWJ1dGUtdmFsdWUgY29udGFpbnMgYVxuICAgICAgICAvLyBub24tRElHSVQgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cIlxuICAgICAgICBpZiAoL14tP1swLTldKyQvLnRlc3QoYXZfdmFsdWUpKSB7XG4gICAgICAgICAgdmFyIGRlbHRhID0gcGFyc2VJbnQoYXZfdmFsdWUsIDEwKTtcbiAgICAgICAgICAvLyBcIklmIGRlbHRhLXNlY29uZHMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gKDApLCBsZXQgZXhwaXJ5LXRpbWVcbiAgICAgICAgICAvLyBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSBkYXRlIGFuZCB0aW1lLlwiXG4gICAgICAgICAgYy5zZXRNYXhBZ2UoZGVsdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RvbWFpbic6IC8vIFM1LjIuM1xuICAgICAgLy8gXCJJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiAgSG93ZXZlcixcbiAgICAgIC8vIHRoZSB1c2VyIGFnZW50IFNIT1VMRCBpZ25vcmUgdGhlIGNvb2tpZS1hdiBlbnRpcmVseS5cIlxuICAgICAgaWYgKGF2X3ZhbHVlKSB7XG4gICAgICAgIC8vIFM1LjIuMyBcIkxldCBjb29raWUtZG9tYWluIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgd2l0aG91dCB0aGUgbGVhZGluZyAleDJFXG4gICAgICAgIC8vIChcIi5cIikgY2hhcmFjdGVyLlwiXG4gICAgICAgIHZhciBkb21haW4gPSBhdl92YWx1ZS50cmltKCkucmVwbGFjZSgvXlxcLi8sICcnKTtcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIC8vIFwiQ29udmVydCB0aGUgY29va2llLWRvbWFpbiB0byBsb3dlciBjYXNlLlwiXG4gICAgICAgICAgYy5kb21haW4gPSBkb21haW4udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwYXRoJzogLy8gUzUuMi40XG4gICAgICAvKlxuICAgICAgICogXCJJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgICAgKiBhdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYgKFwiL1wiKTpcbiAgICAgICAqICAgTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguXG4gICAgICAgKiBPdGhlcndpc2U6XG4gICAgICAgKiAgIExldCBjb29raWUtcGF0aCBiZSB0aGUgYXR0cmlidXRlLXZhbHVlLlwiXG4gICAgICAgKlxuICAgICAgICogV2UnbGwgcmVwcmVzZW50IHRoZSBkZWZhdWx0LXBhdGggYXMgbnVsbCBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZVxuICAgICAgICogY29udGV4dCBvZiB0aGUgcGFyc2luZy5cbiAgICAgICAqL1xuICAgICAgYy5wYXRoID0gYXZfdmFsdWUgJiYgYXZfdmFsdWVbMF0gPT09IFwiL1wiID8gYXZfdmFsdWUgOiBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWN1cmUnOiAvLyBTNS4yLjVcbiAgICAgIC8qXG4gICAgICAgKiBcIklmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiU2VjdXJlXCIsXG4gICAgICAgKiB0aGUgdXNlciBhZ2VudCBNVVNUIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdFxuICAgICAgICogd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBTZWN1cmUgYW5kIGFuIGVtcHR5IGF0dHJpYnV0ZS12YWx1ZS5cIlxuICAgICAgICovXG4gICAgICBjLnNlY3VyZSA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2h0dHBvbmx5JzogLy8gUzUuMi42IC0tIGVmZmVjdGl2ZWx5IHRoZSBzYW1lIGFzICdzZWN1cmUnXG4gICAgICBjLmh0dHBPbmx5ID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGMuZXh0ZW5zaW9ucyA9IGMuZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICAgIGMuZXh0ZW5zaW9ucy5wdXNoKGF2KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjO1xufVxuXG4vLyBhdm9pZCB0aGUgVjggZGVvcHRpbWl6YXRpb24gbW9uc3RlciFcbmZ1bmN0aW9uIGpzb25QYXJzZShzdHIpIHtcbiAgdmFyIG9iajtcbiAgdHJ5IHtcbiAgICBvYmogPSBKU09OLnBhcnNlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBmcm9tSlNPTihzdHIpIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvYmo7XG4gIGlmICh0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIG9iaiA9IGpzb25QYXJzZShzdHIpO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGFzc3VtZSBpdCdzIGFuIE9iamVjdFxuICAgIG9iaiA9IHN0cjtcbiAgfVxuXG4gIHZhciBjID0gbmV3IENvb2tpZSgpO1xuICBmb3IgKHZhciBpPTA7IGk8Q29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IENvb2tpZS5zZXJpYWxpemFibGVQcm9wZXJ0aWVzW2ldO1xuICAgIGlmIChvYmpbcHJvcF0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBvYmpbcHJvcF0gPT09IENvb2tpZS5wcm90b3R5cGVbcHJvcF0pXG4gICAge1xuICAgICAgY29udGludWU7IC8vIGxlYXZlIGFzIHByb3RvdHlwZSBkZWZhdWx0XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdleHBpcmVzJyB8fFxuICAgICAgICBwcm9wID09PSAnY3JlYXRpb24nIHx8XG4gICAgICAgIHByb3AgPT09ICdsYXN0QWNjZXNzZWQnKVxuICAgIHtcbiAgICAgIGlmIChvYmpbcHJvcF0gPT09IG51bGwpIHtcbiAgICAgICAgY1twcm9wXSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjW3Byb3BdID0gb2JqW3Byb3BdID09IFwiSW5maW5pdHlcIiA/XG4gICAgICAgICAgXCJJbmZpbml0eVwiIDogbmV3IERhdGUob2JqW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY1twcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuLyogU2VjdGlvbiA1LjQgcGFydCAyOlxuICogXCIqICBDb29raWVzIHdpdGggbG9uZ2VyIHBhdGhzIGFyZSBsaXN0ZWQgYmVmb3JlIGNvb2tpZXMgd2l0aFxuICogICAgIHNob3J0ZXIgcGF0aHMuXG4gKlxuICogICogIEFtb25nIGNvb2tpZXMgdGhhdCBoYXZlIGVxdWFsLWxlbmd0aCBwYXRoIGZpZWxkcywgY29va2llcyB3aXRoXG4gKiAgICAgZWFybGllciBjcmVhdGlvbi10aW1lcyBhcmUgbGlzdGVkIGJlZm9yZSBjb29raWVzIHdpdGggbGF0ZXJcbiAqICAgICBjcmVhdGlvbi10aW1lcy5cIlxuICovXG5cbmZ1bmN0aW9uIGNvb2tpZUNvbXBhcmUoYSxiKSB7XG4gIHZhciBjbXAgPSAwO1xuXG4gIC8vIGRlc2NlbmRpbmcgZm9yIGxlbmd0aDogYiBDTVAgYVxuICB2YXIgYVBhdGhMZW4gPSBhLnBhdGggPyBhLnBhdGgubGVuZ3RoIDogMDtcbiAgdmFyIGJQYXRoTGVuID0gYi5wYXRoID8gYi5wYXRoLmxlbmd0aCA6IDA7XG4gIGNtcCA9IGJQYXRoTGVuIC0gYVBhdGhMZW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgLy8gYXNjZW5kaW5nIGZvciB0aW1lOiBhIENNUCBiXG4gIHZhciBhVGltZSA9IGEuY3JlYXRpb24gPyBhLmNyZWF0aW9uLmdldFRpbWUoKSA6IE1BWF9USU1FO1xuICB2YXIgYlRpbWUgPSBiLmNyZWF0aW9uID8gYi5jcmVhdGlvbi5nZXRUaW1lKCkgOiBNQVhfVElNRTtcbiAgY21wID0gYVRpbWUgLSBiVGltZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICAvLyBicmVhayB0aWVzIGZvciB0aGUgc2FtZSBtaWxsaXNlY29uZCAocHJlY2lzaW9uIG9mIEphdmFTY3JpcHQncyBjbG9jaylcbiAgY21wID0gYS5jcmVhdGlvbkluZGV4IC0gYi5jcmVhdGlvbkluZGV4O1xuXG4gIHJldHVybiBjbXA7XG59XG5cbi8vIEdpdmVzIHRoZSBwZXJtdXRhdGlvbiBvZiBhbGwgcG9zc2libGUgcGF0aE1hdGNoKCllcyBvZiBhIGdpdmVuIHBhdGguIFRoZVxuLy8gYXJyYXkgaXMgaW4gbG9uZ2VzdC10by1zaG9ydGVzdCBvcmRlci4gIEhhbmR5IGZvciBpbmRleGluZy5cbmZ1bmN0aW9uIHBlcm11dGVQYXRoKHBhdGgpIHtcbiAgaWYgKHBhdGggPT09ICcvJykge1xuICAgIHJldHVybiBbJy8nXTtcbiAgfVxuICBpZiAocGF0aC5sYXN0SW5kZXhPZignLycpID09PSBwYXRoLmxlbmd0aC0xKSB7XG4gICAgcGF0aCA9IHBhdGguc3Vic3RyKDAscGF0aC5sZW5ndGgtMSk7XG4gIH1cbiAgdmFyIHBlcm11dGF0aW9ucyA9IFtwYXRoXTtcbiAgd2hpbGUgKHBhdGgubGVuZ3RoID4gMSkge1xuICAgIHZhciBsaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgaWYgKGxpbmRleCA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLGxpbmRleCk7XG4gICAgcGVybXV0YXRpb25zLnB1c2gocGF0aCk7XG4gIH1cbiAgcGVybXV0YXRpb25zLnB1c2goJy8nKTtcbiAgcmV0dXJuIHBlcm11dGF0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llQ29udGV4dCh1cmwpIHtcbiAgaWYgKHVybCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgLy8gTk9URTogZGVjb2RlVVJJIHdpbGwgdGhyb3cgb24gbWFsZm9ybWVkIFVSSXMgKHNlZSBHSC0zMikuXG4gIC8vIFRoZXJlZm9yZSwgd2Ugd2lsbCBqdXN0IHNraXAgZGVjb2RpbmcgZm9yIHN1Y2ggVVJJcy5cbiAgdHJ5IHtcbiAgICB1cmwgPSBkZWNvZGVVUkkodXJsKTtcbiAgfVxuICBjYXRjaChlcnIpIHtcbiAgICAvLyBTaWxlbnRseSBzd2FsbG93IGVycm9yXG4gIH1cblxuICByZXR1cm4gdXJsUGFyc2UodXJsKTtcbn1cblxuZnVuY3Rpb24gQ29va2llKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgaWYgKENvb2tpZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcCkgJiZcbiAgICAgICAgQ29va2llLnByb3RvdHlwZVtwcm9wXSAhPT0gb3B0aW9uc1twcm9wXSAmJlxuICAgICAgICBwcm9wLnN1YnN0cigwLDEpICE9PSAnXycpXG4gICAge1xuICAgICAgdGhpc1twcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9LCB0aGlzKTtcblxuICB0aGlzLmNyZWF0aW9uID0gdGhpcy5jcmVhdGlvbiB8fCBuZXcgRGF0ZSgpO1xuXG4gIC8vIHVzZWQgdG8gYnJlYWsgY3JlYXRpb24gdGllcyBpbiBjb29raWVDb21wYXJlKCk6XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY3JlYXRpb25JbmRleCcsIHtcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLCAvLyBpbXBvcnRhbnQgZm9yIGFzc2VydC5kZWVwRXF1YWwgY2hlY2tzXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6ICsrQ29va2llLmNvb2tpZXNDcmVhdGVkXG4gIH0pO1xufVxuXG5Db29raWUuY29va2llc0NyZWF0ZWQgPSAwOyAvLyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBjb29raWUgaXMgY3JlYXRlZFxuXG5Db29raWUucGFyc2UgPSBwYXJzZTtcbkNvb2tpZS5mcm9tSlNPTiA9IGZyb21KU09OO1xuXG5Db29raWUucHJvdG90eXBlLmtleSA9IFwiXCI7XG5Db29raWUucHJvdG90eXBlLnZhbHVlID0gXCJcIjtcblxuLy8gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBSRkMgaGFzIHRoZW06XG5Db29raWUucHJvdG90eXBlLmV4cGlyZXMgPSBcIkluZmluaXR5XCI7IC8vIGNvZXJjZXMgdG8gbGl0ZXJhbCBJbmZpbml0eVxuQ29va2llLnByb3RvdHlwZS5tYXhBZ2UgPSBudWxsOyAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXhwaXJlcyBmb3IgVFRMXG5Db29raWUucHJvdG90eXBlLmRvbWFpbiA9IG51bGw7XG5Db29raWUucHJvdG90eXBlLnBhdGggPSBudWxsO1xuQ29va2llLnByb3RvdHlwZS5zZWN1cmUgPSBmYWxzZTtcbkNvb2tpZS5wcm90b3R5cGUuaHR0cE9ubHkgPSBmYWxzZTtcbkNvb2tpZS5wcm90b3R5cGUuZXh0ZW5zaW9ucyA9IG51bGw7XG5cbi8vIHNldCBieSB0aGUgQ29va2llSmFyOlxuQ29va2llLnByb3RvdHlwZS5ob3N0T25seSA9IG51bGw7IC8vIGJvb2xlYW4gd2hlbiBzZXRcbkNvb2tpZS5wcm90b3R5cGUucGF0aElzRGVmYXVsdCA9IG51bGw7IC8vIGJvb2xlYW4gd2hlbiBzZXRcbkNvb2tpZS5wcm90b3R5cGUuY3JlYXRpb24gPSBudWxsOyAvLyBEYXRlIHdoZW4gc2V0OyBkZWZhdWx0ZWQgYnkgQ29va2llLnBhcnNlXG5Db29raWUucHJvdG90eXBlLmxhc3RBY2Nlc3NlZCA9IG51bGw7IC8vIERhdGUgd2hlbiBzZXRcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb29raWUucHJvdG90eXBlLCAnY3JlYXRpb25JbmRleCcsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiAwXG59KTtcblxuQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhDb29raWUucHJvdG90eXBlKVxuICAuZmlsdGVyKGZ1bmN0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gIShcbiAgICAgIENvb2tpZS5wcm90b3R5cGVbcHJvcF0gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuICAgICAgcHJvcCA9PT0gJ2NyZWF0aW9uSW5kZXgnIHx8XG4gICAgICBwcm9wLnN1YnN0cigwLDEpID09PSAnXydcbiAgICApO1xuICB9KTtcblxuQ29va2llLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiAnQ29va2llPVwiJyt0aGlzLnRvU3RyaW5nKCkgK1xuICAgICc7IGhvc3RPbmx5PScrKHRoaXMuaG9zdE9ubHkgIT0gbnVsbCA/IHRoaXMuaG9zdE9ubHkgOiAnPycpICtcbiAgICAnOyBhQWdlPScrKHRoaXMubGFzdEFjY2Vzc2VkID8gKG5vdy10aGlzLmxhc3RBY2Nlc3NlZC5nZXRUaW1lKCkpKydtcycgOiAnPycpICtcbiAgICAnOyBjQWdlPScrKHRoaXMuY3JlYXRpb24gPyAobm93LXRoaXMuY3JlYXRpb24uZ2V0VGltZSgpKSsnbXMnIDogJz8nKSArXG4gICAgJ1wiJztcbn07XG5cbi8vIFVzZSB0aGUgbmV3IGN1c3RvbSBpbnNwZWN0aW9uIHN5bWJvbCB0byBhZGQgdGhlIGN1c3RvbSBpbnNwZWN0IGZ1bmN0aW9uIGlmXG4vLyBhdmFpbGFibGUuXG5pZiAodXRpbC5pbnNwZWN0LmN1c3RvbSkge1xuICBDb29raWUucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gQ29va2llLnByb3RvdHlwZS5pbnNwZWN0O1xufVxuXG5Db29raWUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgb2JqID0ge307XG5cbiAgdmFyIHByb3BzID0gQ29va2llLnNlcmlhbGl6YWJsZVByb3BlcnRpZXM7XG4gIGZvciAodmFyIGk9MDsgaTxwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgaWYgKHRoaXNbcHJvcF0gPT09IENvb2tpZS5wcm90b3R5cGVbcHJvcF0pIHtcbiAgICAgIGNvbnRpbnVlOyAvLyBsZWF2ZSBhcyBwcm90b3R5cGUgZGVmYXVsdFxuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZXhwaXJlcycgfHxcbiAgICAgICAgcHJvcCA9PT0gJ2NyZWF0aW9uJyB8fFxuICAgICAgICBwcm9wID09PSAnbGFzdEFjY2Vzc2VkJylcbiAgICB7XG4gICAgICBpZiAodGhpc1twcm9wXSA9PT0gbnVsbCkge1xuICAgICAgICBvYmpbcHJvcF0gPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3Byb3BdID0gdGhpc1twcm9wXSA9PSBcIkluZmluaXR5XCIgPyAvLyBpbnRlbnRpb25hbGx5IG5vdCA9PT1cbiAgICAgICAgICBcIkluZmluaXR5XCIgOiB0aGlzW3Byb3BdLnRvSVNPU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSAnbWF4QWdlJykge1xuICAgICAgaWYgKHRoaXNbcHJvcF0gIT09IG51bGwpIHtcbiAgICAgICAgLy8gYWdhaW4sIGludGVudGlvbmFsbHkgbm90ID09PVxuICAgICAgICBvYmpbcHJvcF0gPSAodGhpc1twcm9wXSA9PSBJbmZpbml0eSB8fCB0aGlzW3Byb3BdID09IC1JbmZpbml0eSkgP1xuICAgICAgICAgIHRoaXNbcHJvcF0udG9TdHJpbmcoKSA6IHRoaXNbcHJvcF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzW3Byb3BdICE9PSBDb29raWUucHJvdG90eXBlW3Byb3BdKSB7XG4gICAgICAgIG9ialtwcm9wXSA9IHRoaXNbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbkNvb2tpZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZyb21KU09OKHRoaXMudG9KU09OKCkpO1xufTtcblxuQ29va2llLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICBpZiAoIUNPT0tJRV9PQ1RFVFMudGVzdCh0aGlzLnZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5leHBpcmVzICE9IEluZmluaXR5ICYmICEodGhpcy5leHBpcmVzIGluc3RhbmNlb2YgRGF0ZSkgJiYgIXBhcnNlRGF0ZSh0aGlzLmV4cGlyZXMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0aGlzLm1heEFnZSAhPSBudWxsICYmIHRoaXMubWF4QWdlIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgfVxuICBpZiAodGhpcy5wYXRoICE9IG51bGwgJiYgIVBBVEhfVkFMVUUudGVzdCh0aGlzLnBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNkb21haW4gPSB0aGlzLmNkb21haW4oKTtcbiAgaWYgKGNkb21haW4pIHtcbiAgICBpZiAoY2RvbWFpbi5tYXRjaCgvXFwuJC8pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIFM0LjEuMi4zIHN1Z2dlc3RzIHRoYXQgdGhpcyBpcyBiYWQuIGRvbWFpbk1hdGNoKCkgdGVzdHMgY29uZmlybSB0aGlzXG4gICAgfVxuICAgIHZhciBzdWZmaXggPSBwdWJzdWZmaXguZ2V0UHVibGljU3VmZml4KGNkb21haW4pO1xuICAgIGlmIChzdWZmaXggPT0gbnVsbCkgeyAvLyBpdCdzIGEgcHVibGljIHN1ZmZpeFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkNvb2tpZS5wcm90b3R5cGUuc2V0RXhwaXJlcyA9IGZ1bmN0aW9uIHNldEV4cGlyZXMoZXhwKSB7XG4gIGlmIChleHAgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgdGhpcy5leHBpcmVzID0gZXhwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZXhwaXJlcyA9IHBhcnNlRGF0ZShleHApIHx8IFwiSW5maW5pdHlcIjtcbiAgfVxufTtcblxuQ29va2llLnByb3RvdHlwZS5zZXRNYXhBZ2UgPSBmdW5jdGlvbiBzZXRNYXhBZ2UoYWdlKSB7XG4gIGlmIChhZ2UgPT09IEluZmluaXR5IHx8IGFnZSA9PT0gLUluZmluaXR5KSB7XG4gICAgdGhpcy5tYXhBZ2UgPSBhZ2UudG9TdHJpbmcoKTsgLy8gc28gSlNPTi5zdHJpbmdpZnkoKSB3b3Jrc1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWF4QWdlID0gYWdlO1xuICB9XG59O1xuXG4vLyBnaXZlcyBDb29raWUgaGVhZGVyIGZvcm1hdFxuQ29va2llLnByb3RvdHlwZS5jb29raWVTdHJpbmcgPSBmdW5jdGlvbiBjb29raWVTdHJpbmcoKSB7XG4gIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICBpZiAodmFsID09IG51bGwpIHtcbiAgICB2YWwgPSAnJztcbiAgfVxuICBpZiAodGhpcy5rZXkgPT09ICcnKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gdGhpcy5rZXkrJz0nK3ZhbDtcbn07XG5cbi8vIGdpdmVzIFNldC1Db29raWUgaGVhZGVyIGZvcm1hdFxuQ29va2llLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gdGhpcy5jb29raWVTdHJpbmcoKTtcblxuICBpZiAodGhpcy5leHBpcmVzICE9IEluZmluaXR5KSB7XG4gICAgaWYgKHRoaXMuZXhwaXJlcyBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHN0ciArPSAnOyBFeHBpcmVzPScrZm9ybWF0RGF0ZSh0aGlzLmV4cGlyZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJzsgRXhwaXJlcz0nK3RoaXMuZXhwaXJlcztcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5tYXhBZ2UgIT0gbnVsbCAmJiB0aGlzLm1heEFnZSAhPSBJbmZpbml0eSkge1xuICAgIHN0ciArPSAnOyBNYXgtQWdlPScrdGhpcy5tYXhBZ2U7XG4gIH1cblxuICBpZiAodGhpcy5kb21haW4gJiYgIXRoaXMuaG9zdE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgRG9tYWluPScrdGhpcy5kb21haW47XG4gIH1cbiAgaWYgKHRoaXMucGF0aCkge1xuICAgIHN0ciArPSAnOyBQYXRoPScrdGhpcy5wYXRoO1xuICB9XG5cbiAgaWYgKHRoaXMuc2VjdXJlKSB7XG4gICAgc3RyICs9ICc7IFNlY3VyZSc7XG4gIH1cbiAgaWYgKHRoaXMuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG4gIGlmICh0aGlzLmV4dGVuc2lvbnMpIHtcbiAgICB0aGlzLmV4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbihleHQpIHtcbiAgICAgIHN0ciArPSAnOyAnK2V4dDtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vLyBUVEwoKSBwYXJ0aWFsbHkgcmVwbGFjZXMgdGhlIFwiZXhwaXJ5LXRpbWVcIiBwYXJ0cyBvZiBTNS4zIHN0ZXAgMyAoc2V0Q29va2llKClcbi8vIGVsc2V3aGVyZSlcbi8vIFM1LjMgc2F5cyB0byBnaXZlIHRoZSBcImxhdGVzdCByZXByZXNlbnRhYmxlIGRhdGVcIiBmb3Igd2hpY2ggd2UgdXNlIEluZmluaXR5XG4vLyBGb3IgXCJleHBpcmVkXCIgd2UgdXNlIDBcbkNvb2tpZS5wcm90b3R5cGUuVFRMID0gZnVuY3Rpb24gVFRMKG5vdykge1xuICAvKiBSRkM2MjY1IFM0LjEuMi4yIElmIGEgY29va2llIGhhcyBib3RoIHRoZSBNYXgtQWdlIGFuZCB0aGUgRXhwaXJlc1xuICAgKiBhdHRyaWJ1dGUsIHRoZSBNYXgtQWdlIGF0dHJpYnV0ZSBoYXMgcHJlY2VkZW5jZSBhbmQgY29udHJvbHMgdGhlXG4gICAqIGV4cGlyYXRpb24gZGF0ZSBvZiB0aGUgY29va2llLlxuICAgKiAoQ29uY3VycyB3aXRoIFM1LjMgc3RlcCAzKVxuICAgKi9cbiAgaWYgKHRoaXMubWF4QWdlICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhBZ2U8PTAgPyAwIDogdGhpcy5tYXhBZ2UqMTAwMDtcbiAgfVxuXG4gIHZhciBleHBpcmVzID0gdGhpcy5leHBpcmVzO1xuICBpZiAoZXhwaXJlcyAhPSBJbmZpbml0eSkge1xuICAgIGlmICghKGV4cGlyZXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgZXhwaXJlcyA9IHBhcnNlRGF0ZShleHBpcmVzKSB8fCBJbmZpbml0eTtcbiAgICB9XG5cbiAgICBpZiAoZXhwaXJlcyA9PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgIH1cblxuICAgIHJldHVybiBleHBpcmVzLmdldFRpbWUoKSAtIChub3cgfHwgRGF0ZS5ub3coKSk7XG4gIH1cblxuICByZXR1cm4gSW5maW5pdHk7XG59O1xuXG4vLyBleHBpcnlUaW1lKCkgcmVwbGFjZXMgdGhlIFwiZXhwaXJ5LXRpbWVcIiBwYXJ0cyBvZiBTNS4zIHN0ZXAgMyAoc2V0Q29va2llKClcbi8vIGVsc2V3aGVyZSlcbkNvb2tpZS5wcm90b3R5cGUuZXhwaXJ5VGltZSA9IGZ1bmN0aW9uIGV4cGlyeVRpbWUobm93KSB7XG4gIGlmICh0aGlzLm1heEFnZSAhPSBudWxsKSB7XG4gICAgdmFyIHJlbGF0aXZlVG8gPSBub3cgfHwgdGhpcy5jcmVhdGlvbiB8fCBuZXcgRGF0ZSgpO1xuICAgIHZhciBhZ2UgPSAodGhpcy5tYXhBZ2UgPD0gMCkgPyAtSW5maW5pdHkgOiB0aGlzLm1heEFnZSoxMDAwO1xuICAgIHJldHVybiByZWxhdGl2ZVRvLmdldFRpbWUoKSArIGFnZTtcbiAgfVxuXG4gIGlmICh0aGlzLmV4cGlyZXMgPT0gSW5maW5pdHkpIHtcbiAgICByZXR1cm4gSW5maW5pdHk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZXhwaXJlcy5nZXRUaW1lKCk7XG59O1xuXG4vLyBleHBpcnlEYXRlKCkgcmVwbGFjZXMgdGhlIFwiZXhwaXJ5LXRpbWVcIiBwYXJ0cyBvZiBTNS4zIHN0ZXAgMyAoc2V0Q29va2llKClcbi8vIGVsc2V3aGVyZSksIGV4Y2VwdCBpdCByZXR1cm5zIGEgRGF0ZVxuQ29va2llLnByb3RvdHlwZS5leHBpcnlEYXRlID0gZnVuY3Rpb24gZXhwaXJ5RGF0ZShub3cpIHtcbiAgdmFyIG1pbGxpc2VjID0gdGhpcy5leHBpcnlUaW1lKG5vdyk7XG4gIGlmIChtaWxsaXNlYyA9PSBJbmZpbml0eSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShNQVhfVElNRSk7XG4gIH0gZWxzZSBpZiAobWlsbGlzZWMgPT0gLUluZmluaXR5KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE1JTl9USU1FKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IERhdGUobWlsbGlzZWMpO1xuICB9XG59O1xuXG4vLyBUaGlzIHJlcGxhY2VzIHRoZSBcInBlcnNpc3RlbnQtZmxhZ1wiIHBhcnRzIG9mIFM1LjMgc3RlcCAzXG5Db29raWUucHJvdG90eXBlLmlzUGVyc2lzdGVudCA9IGZ1bmN0aW9uIGlzUGVyc2lzdGVudCgpIHtcbiAgcmV0dXJuICh0aGlzLm1heEFnZSAhPSBudWxsIHx8IHRoaXMuZXhwaXJlcyAhPSBJbmZpbml0eSk7XG59O1xuXG4vLyBNb3N0bHkgUzUuMS4yIGFuZCBTNS4yLjM6XG5Db29raWUucHJvdG90eXBlLmNkb21haW4gPVxuQ29va2llLnByb3RvdHlwZS5jYW5vbmljYWxpemVkRG9tYWluID0gZnVuY3Rpb24gY2Fub25pY2FsaXplZERvbWFpbigpIHtcbiAgaWYgKHRoaXMuZG9tYWluID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gY2Fub25pY2FsRG9tYWluKHRoaXMuZG9tYWluKTtcbn07XG5cbmZ1bmN0aW9uIENvb2tpZUphcihzdG9yZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgb3B0aW9ucyA9IHtyZWplY3RQdWJsaWNTdWZmaXhlczogb3B0aW9uc307XG4gIH0gZWxzZSBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmIChvcHRpb25zLnJlamVjdFB1YmxpY1N1ZmZpeGVzICE9IG51bGwpIHtcbiAgICB0aGlzLnJlamVjdFB1YmxpY1N1ZmZpeGVzID0gb3B0aW9ucy5yZWplY3RQdWJsaWNTdWZmaXhlcztcbiAgfVxuICBpZiAob3B0aW9ucy5sb29zZU1vZGUgIT0gbnVsbCkge1xuICAgIHRoaXMuZW5hYmxlTG9vc2VNb2RlID0gb3B0aW9ucy5sb29zZU1vZGU7XG4gIH1cblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgTWVtb3J5Q29va2llU3RvcmUoKTtcbiAgfVxuICB0aGlzLnN0b3JlID0gc3RvcmU7XG59XG5Db29raWVKYXIucHJvdG90eXBlLnN0b3JlID0gbnVsbDtcbkNvb2tpZUphci5wcm90b3R5cGUucmVqZWN0UHVibGljU3VmZml4ZXMgPSB0cnVlO1xuQ29va2llSmFyLnByb3RvdHlwZS5lbmFibGVMb29zZU1vZGUgPSBmYWxzZTtcbnZhciBDQU5fQkVfU1lOQyA9IFtdO1xuXG5DQU5fQkVfU1lOQy5wdXNoKCdzZXRDb29raWUnKTtcbkNvb2tpZUphci5wcm90b3R5cGUuc2V0Q29va2llID0gZnVuY3Rpb24oY29va2llLCB1cmwsIG9wdGlvbnMsIGNiKSB7XG4gIHZhciBlcnI7XG4gIHZhciBjb250ZXh0ID0gZ2V0Q29va2llQ29udGV4dCh1cmwpO1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgY2IgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBob3N0ID0gY2Fub25pY2FsRG9tYWluKGNvbnRleHQuaG9zdG5hbWUpO1xuICB2YXIgbG9vc2UgPSB0aGlzLmVuYWJsZUxvb3NlTW9kZTtcbiAgaWYgKG9wdGlvbnMubG9vc2UgIT0gbnVsbCkge1xuICAgIGxvb3NlID0gb3B0aW9ucy5sb29zZTtcbiAgfVxuXG4gIC8vIFM1LjMgc3RlcCAxXG4gIGlmICghKGNvb2tpZSBpbnN0YW5jZW9mIENvb2tpZSkpIHtcbiAgICBjb29raWUgPSBDb29raWUucGFyc2UoY29va2llLCB7IGxvb3NlOiBsb29zZSB9KTtcbiAgfVxuICBpZiAoIWNvb2tpZSkge1xuICAgIGVyciA9IG5ldyBFcnJvcihcIkNvb2tpZSBmYWlsZWQgdG8gcGFyc2VcIik7XG4gICAgcmV0dXJuIGNiKG9wdGlvbnMuaWdub3JlRXJyb3IgPyBudWxsIDogZXJyKTtcbiAgfVxuXG4gIC8vIFM1LjMgc3RlcCAyXG4gIHZhciBub3cgPSBvcHRpb25zLm5vdyB8fCBuZXcgRGF0ZSgpOyAvLyB3aWxsIGFzc2lnbiBsYXRlciB0byBzYXZlIGVmZm9ydCBpbiB0aGUgZmFjZSBvZiBlcnJvcnNcblxuICAvLyBTNS4zIHN0ZXAgMzogTk9PUDsgcGVyc2lzdGVudC1mbGFnIGFuZCBleHBpcnktdGltZSBpcyBoYW5kbGVkIGJ5IGdldENvb2tpZSgpXG5cbiAgLy8gUzUuMyBzdGVwIDQ6IE5PT1A7IGRvbWFpbiBpcyBudWxsIGJ5IGRlZmF1bHRcblxuICAvLyBTNS4zIHN0ZXAgNTogcHVibGljIHN1ZmZpeGVzXG4gIGlmICh0aGlzLnJlamVjdFB1YmxpY1N1ZmZpeGVzICYmIGNvb2tpZS5kb21haW4pIHtcbiAgICB2YXIgc3VmZml4ID0gcHVic3VmZml4LmdldFB1YmxpY1N1ZmZpeChjb29raWUuY2RvbWFpbigpKTtcbiAgICBpZiAoc3VmZml4ID09IG51bGwpIHsgLy8gZS5nLiBcImNvbVwiXG4gICAgICBlcnIgPSBuZXcgRXJyb3IoXCJDb29raWUgaGFzIGRvbWFpbiBzZXQgdG8gYSBwdWJsaWMgc3VmZml4XCIpO1xuICAgICAgcmV0dXJuIGNiKG9wdGlvbnMuaWdub3JlRXJyb3IgPyBudWxsIDogZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBTNS4zIHN0ZXAgNjpcbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICBpZiAoIWRvbWFpbk1hdGNoKGhvc3QsIGNvb2tpZS5jZG9tYWluKCksIGZhbHNlKSkge1xuICAgICAgZXJyID0gbmV3IEVycm9yKFwiQ29va2llIG5vdCBpbiB0aGlzIGhvc3QncyBkb21haW4uIENvb2tpZTpcIitjb29raWUuY2RvbWFpbigpK1wiIFJlcXVlc3Q6XCIraG9zdCk7XG4gICAgICByZXR1cm4gY2Iob3B0aW9ucy5pZ25vcmVFcnJvciA/IG51bGwgOiBlcnIpO1xuICAgIH1cblxuICAgIGlmIChjb29raWUuaG9zdE9ubHkgPT0gbnVsbCkgeyAvLyBkb24ndCByZXNldCBpZiBhbHJlYWR5IHNldFxuICAgICAgY29va2llLmhvc3RPbmx5ID0gZmFsc2U7XG4gICAgfVxuXG4gIH0gZWxzZSB7XG4gICAgY29va2llLmhvc3RPbmx5ID0gdHJ1ZTtcbiAgICBjb29raWUuZG9tYWluID0gaG9zdDtcbiAgfVxuXG4gIC8vUzUuMi40IElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgZW1wdHkgb3IgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGVcbiAgLy9hdHRyaWJ1dGUtdmFsdWUgaXMgbm90ICV4MkYgKFwiL1wiKTpcbiAgLy9MZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC5cbiAgaWYgKCFjb29raWUucGF0aCB8fCBjb29raWUucGF0aFswXSAhPT0gJy8nKSB7XG4gICAgY29va2llLnBhdGggPSBkZWZhdWx0UGF0aChjb250ZXh0LnBhdGhuYW1lKTtcbiAgICBjb29raWUucGF0aElzRGVmYXVsdCA9IHRydWU7XG4gIH1cblxuICAvLyBTNS4zIHN0ZXAgODogTk9PUDsgc2VjdXJlIGF0dHJpYnV0ZVxuICAvLyBTNS4zIHN0ZXAgOTogTk9PUDsgaHR0cE9ubHkgYXR0cmlidXRlXG5cbiAgLy8gUzUuMyBzdGVwIDEwXG4gIGlmIChvcHRpb25zLmh0dHAgPT09IGZhbHNlICYmIGNvb2tpZS5odHRwT25seSkge1xuICAgIGVyciA9IG5ldyBFcnJvcihcIkNvb2tpZSBpcyBIdHRwT25seSBhbmQgdGhpcyBpc24ndCBhbiBIVFRQIEFQSVwiKTtcbiAgICByZXR1cm4gY2Iob3B0aW9ucy5pZ25vcmVFcnJvciA/IG51bGwgOiBlcnIpO1xuICB9XG5cbiAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcblxuICBpZiAoIXN0b3JlLnVwZGF0ZUNvb2tpZSkge1xuICAgIHN0b3JlLnVwZGF0ZUNvb2tpZSA9IGZ1bmN0aW9uKG9sZENvb2tpZSwgbmV3Q29va2llLCBjYikge1xuICAgICAgdGhpcy5wdXRDb29raWUobmV3Q29va2llLCBjYik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpdGhDb29raWUoZXJyLCBvbGRDb29raWUpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dCA9IGZ1bmN0aW9uKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNiKG51bGwsIGNvb2tpZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChvbGRDb29raWUpIHtcbiAgICAgIC8vIFM1LjMgc3RlcCAxMSAtIFwiSWYgdGhlIGNvb2tpZSBzdG9yZSBjb250YWlucyBhIGNvb2tpZSB3aXRoIHRoZSBzYW1lIG5hbWUsXG4gICAgICAvLyBkb21haW4sIGFuZCBwYXRoIGFzIHRoZSBuZXdseSBjcmVhdGVkIGNvb2tpZTpcIlxuICAgICAgaWYgKG9wdGlvbnMuaHR0cCA9PT0gZmFsc2UgJiYgb2xkQ29va2llLmh0dHBPbmx5KSB7IC8vIHN0ZXAgMTEuMlxuICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJvbGQgQ29va2llIGlzIEh0dHBPbmx5IGFuZCB0aGlzIGlzbid0IGFuIEhUVFAgQVBJXCIpO1xuICAgICAgICByZXR1cm4gY2Iob3B0aW9ucy5pZ25vcmVFcnJvciA/IG51bGwgOiBlcnIpO1xuICAgICAgfVxuICAgICAgY29va2llLmNyZWF0aW9uID0gb2xkQ29va2llLmNyZWF0aW9uOyAvLyBzdGVwIDExLjNcbiAgICAgIGNvb2tpZS5jcmVhdGlvbkluZGV4ID0gb2xkQ29va2llLmNyZWF0aW9uSW5kZXg7IC8vIHByZXNlcnZlIHRpZS1icmVha2VyXG4gICAgICBjb29raWUubGFzdEFjY2Vzc2VkID0gbm93O1xuICAgICAgLy8gU3RlcCAxMS40IChkZWxldGUgY29va2llKSBpcyBpbXBsaWVkIGJ5IGp1c3Qgc2V0dGluZyB0aGUgbmV3IG9uZTpcbiAgICAgIHN0b3JlLnVwZGF0ZUNvb2tpZShvbGRDb29raWUsIGNvb2tpZSwgbmV4dCk7IC8vIHN0ZXAgMTJcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb29raWUuY3JlYXRpb24gPSBjb29raWUubGFzdEFjY2Vzc2VkID0gbm93O1xuICAgICAgc3RvcmUucHV0Q29va2llKGNvb2tpZSwgbmV4dCk7IC8vIHN0ZXAgMTJcbiAgICB9XG4gIH1cblxuICBzdG9yZS5maW5kQ29va2llKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUua2V5LCB3aXRoQ29va2llKTtcbn07XG5cbi8vIFJGQzYzNjUgUzUuNFxuQ0FOX0JFX1NZTkMucHVzaCgnZ2V0Q29va2llcycpO1xuQ29va2llSmFyLnByb3RvdHlwZS5nZXRDb29raWVzID0gZnVuY3Rpb24odXJsLCBvcHRpb25zLCBjYikge1xuICB2YXIgY29udGV4dCA9IGdldENvb2tpZUNvbnRleHQodXJsKTtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgIGNiID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgaG9zdCA9IGNhbm9uaWNhbERvbWFpbihjb250ZXh0Lmhvc3RuYW1lKTtcbiAgdmFyIHBhdGggPSBjb250ZXh0LnBhdGhuYW1lIHx8ICcvJztcblxuICB2YXIgc2VjdXJlID0gb3B0aW9ucy5zZWN1cmU7XG4gIGlmIChzZWN1cmUgPT0gbnVsbCAmJiBjb250ZXh0LnByb3RvY29sICYmXG4gICAgICAoY29udGV4dC5wcm90b2NvbCA9PSAnaHR0cHM6JyB8fCBjb250ZXh0LnByb3RvY29sID09ICd3c3M6JykpXG4gIHtcbiAgICBzZWN1cmUgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGh0dHAgPSBvcHRpb25zLmh0dHA7XG4gIGlmIChodHRwID09IG51bGwpIHtcbiAgICBodHRwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBub3cgPSBvcHRpb25zLm5vdyB8fCBEYXRlLm5vdygpO1xuICB2YXIgZXhwaXJlQ2hlY2sgPSBvcHRpb25zLmV4cGlyZSAhPT0gZmFsc2U7XG4gIHZhciBhbGxQYXRocyA9ICEhb3B0aW9ucy5hbGxQYXRocztcbiAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcblxuICBmdW5jdGlvbiBtYXRjaGluZ0Nvb2tpZShjKSB7XG4gICAgLy8gXCJFaXRoZXI6XG4gICAgLy8gICBUaGUgY29va2llJ3MgaG9zdC1vbmx5LWZsYWcgaXMgdHJ1ZSBhbmQgdGhlIGNhbm9uaWNhbGl6ZWRcbiAgICAvLyAgIHJlcXVlc3QtaG9zdCBpcyBpZGVudGljYWwgdG8gdGhlIGNvb2tpZSdzIGRvbWFpbi5cbiAgICAvLyBPcjpcbiAgICAvLyAgIFRoZSBjb29raWUncyBob3N0LW9ubHktZmxhZyBpcyBmYWxzZSBhbmQgdGhlIGNhbm9uaWNhbGl6ZWRcbiAgICAvLyAgIHJlcXVlc3QtaG9zdCBkb21haW4tbWF0Y2hlcyB0aGUgY29va2llJ3MgZG9tYWluLlwiXG4gICAgaWYgKGMuaG9zdE9ubHkpIHtcbiAgICAgIGlmIChjLmRvbWFpbiAhPSBob3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFkb21haW5NYXRjaChob3N0LCBjLmRvbWFpbiwgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcIlRoZSByZXF1ZXN0LXVyaSdzIHBhdGggcGF0aC1tYXRjaGVzIHRoZSBjb29raWUncyBwYXRoLlwiXG4gICAgaWYgKCFhbGxQYXRocyAmJiAhcGF0aE1hdGNoKHBhdGgsIGMucGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBcIklmIHRoZSBjb29raWUncyBzZWN1cmUtb25seS1mbGFnIGlzIHRydWUsIHRoZW4gdGhlIHJlcXVlc3QtdXJpJ3NcbiAgICAvLyBzY2hlbWUgbXVzdCBkZW5vdGUgYSBcInNlY3VyZVwiIHByb3RvY29sXCJcbiAgICBpZiAoYy5zZWN1cmUgJiYgIXNlY3VyZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFwiSWYgdGhlIGNvb2tpZSdzIGh0dHAtb25seS1mbGFnIGlzIHRydWUsIHRoZW4gZXhjbHVkZSB0aGUgY29va2llIGlmIHRoZVxuICAgIC8vIGNvb2tpZS1zdHJpbmcgaXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBhIFwibm9uLUhUVFBcIiBBUElcIlxuICAgIGlmIChjLmh0dHBPbmx5ICYmICFodHRwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZGVmZXJyZWQgZnJvbSBTNS4zXG4gICAgLy8gbm9uLVJGQzogYWxsb3cgcmV0ZW50aW9uIG9mIGV4cGlyZWQgY29va2llcyBieSBjaG9pY2VcbiAgICBpZiAoZXhwaXJlQ2hlY2sgJiYgYy5leHBpcnlUaW1lKCkgPD0gbm93KSB7XG4gICAgICBzdG9yZS5yZW1vdmVDb29raWUoYy5kb21haW4sIGMucGF0aCwgYy5rZXksIGZ1bmN0aW9uKCl7fSk7IC8vIHJlc3VsdCBpZ25vcmVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdG9yZS5maW5kQ29va2llcyhob3N0LCBhbGxQYXRocyA/IG51bGwgOiBwYXRoLCBmdW5jdGlvbihlcnIsY29va2llcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIGNvb2tpZXMgPSBjb29raWVzLmZpbHRlcihtYXRjaGluZ0Nvb2tpZSk7XG5cbiAgICAvLyBzb3J0aW5nIG9mIFM1LjQgcGFydCAyXG4gICAgaWYgKG9wdGlvbnMuc29ydCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvb2tpZXMgPSBjb29raWVzLnNvcnQoY29va2llQ29tcGFyZSk7XG4gICAgfVxuXG4gICAgLy8gUzUuNCBwYXJ0IDNcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb29raWVzLmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgYy5sYXN0QWNjZXNzZWQgPSBub3c7XG4gICAgfSk7XG4gICAgLy8gVE9ETyBwZXJzaXN0IGxhc3RBY2Nlc3NlZFxuXG4gICAgY2IobnVsbCxjb29raWVzKTtcbiAgfSk7XG59O1xuXG5DQU5fQkVfU1lOQy5wdXNoKCdnZXRDb29raWVTdHJpbmcnKTtcbkNvb2tpZUphci5wcm90b3R5cGUuZ2V0Q29va2llU3RyaW5nID0gZnVuY3Rpb24oLyouLi4sIGNiKi8pIHtcbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7XG4gIHZhciBjYiA9IGFyZ3MucG9wKCk7XG4gIHZhciBuZXh0ID0gZnVuY3Rpb24oZXJyLGNvb2tpZXMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjYihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYihudWxsLCBjb29raWVzXG4gICAgICAgIC5zb3J0KGNvb2tpZUNvbXBhcmUpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24oYyl7XG4gICAgICAgICAgcmV0dXJuIGMuY29va2llU3RyaW5nKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCc7ICcpKTtcbiAgICB9XG4gIH07XG4gIGFyZ3MucHVzaChuZXh0KTtcbiAgdGhpcy5nZXRDb29raWVzLmFwcGx5KHRoaXMsYXJncyk7XG59O1xuXG5DQU5fQkVfU1lOQy5wdXNoKCdnZXRTZXRDb29raWVTdHJpbmdzJyk7XG5Db29raWVKYXIucHJvdG90eXBlLmdldFNldENvb2tpZVN0cmluZ3MgPSBmdW5jdGlvbigvKi4uLiwgY2IqLykge1xuICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtcbiAgdmFyIGNiID0gYXJncy5wb3AoKTtcbiAgdmFyIG5leHQgPSBmdW5jdGlvbihlcnIsY29va2llcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNiKG51bGwsIGNvb2tpZXMubWFwKGZ1bmN0aW9uKGMpe1xuICAgICAgICByZXR1cm4gYy50b1N0cmluZygpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcbiAgYXJncy5wdXNoKG5leHQpO1xuICB0aGlzLmdldENvb2tpZXMuYXBwbHkodGhpcyxhcmdzKTtcbn07XG5cbkNBTl9CRV9TWU5DLnB1c2goJ3NlcmlhbGl6ZScpO1xuQ29va2llSmFyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbihjYikge1xuICB2YXIgdHlwZSA9IHRoaXMuc3RvcmUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdHlwZSA9IG51bGw7XG4gIH1cblxuICAvLyB1cGRhdGUgUkVBRE1FLm1kIFwiU2VyaWFsaXphdGlvbiBGb3JtYXRcIiBpZiB5b3UgY2hhbmdlIHRoaXMsIHBsZWFzZSFcbiAgdmFyIHNlcmlhbGl6ZWQgPSB7XG4gICAgLy8gVGhlIHZlcnNpb24gb2YgdG91Z2gtY29va2llIHRoYXQgc2VyaWFsaXplZCB0aGlzIGphci4gR2VuZXJhbGx5IGEgZ29vZFxuICAgIC8vIHByYWN0aWNlIHNpbmNlIGZ1dHVyZSB2ZXJzaW9ucyBjYW4gbWFrZSBkYXRhIGltcG9ydCBkZWNpc2lvbnMgYmFzZWQgb25cbiAgICAvLyBrbm93biBwYXN0IGJlaGF2aW9yLiBXaGVuL2lmIHRoaXMgbWF0dGVycywgdXNlIGBzZW12ZXJgLlxuICAgIHZlcnNpb246ICd0b3VnaC1jb29raWVAJytWRVJTSU9OLFxuXG4gICAgLy8gYWRkIHRoZSBzdG9yZSB0eXBlLCB0byBtYWtlIGh1bWFucyBoYXBweTpcbiAgICBzdG9yZVR5cGU6IHR5cGUsXG5cbiAgICAvLyBDb29raWVKYXIgY29uZmlndXJhdGlvbjpcbiAgICByZWplY3RQdWJsaWNTdWZmaXhlczogISF0aGlzLnJlamVjdFB1YmxpY1N1ZmZpeGVzLFxuXG4gICAgLy8gdGhpcyBnZXRzIGZpbGxlZCBmcm9tIGdldEFsbENvb2tpZXM6XG4gICAgY29va2llczogW11cbiAgfTtcblxuICBpZiAoISh0aGlzLnN0b3JlLmdldEFsbENvb2tpZXMgJiZcbiAgICAgICAgdHlwZW9mIHRoaXMuc3RvcmUuZ2V0QWxsQ29va2llcyA9PT0gJ2Z1bmN0aW9uJykpXG4gIHtcbiAgICByZXR1cm4gY2IobmV3IEVycm9yKCdzdG9yZSBkb2VzIG5vdCBzdXBwb3J0IGdldEFsbENvb2tpZXMgYW5kIGNhbm5vdCBiZSBzZXJpYWxpemVkJykpO1xuICB9XG5cbiAgdGhpcy5zdG9yZS5nZXRBbGxDb29raWVzKGZ1bmN0aW9uKGVycixjb29raWVzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplZC5jb29raWVzID0gY29va2llcy5tYXAoZnVuY3Rpb24oY29va2llKSB7XG4gICAgICAvLyBjb252ZXJ0IHRvIHNlcmlhbGl6ZWQgJ3JhdycgY29va2llc1xuICAgICAgY29va2llID0gKGNvb2tpZSBpbnN0YW5jZW9mIENvb2tpZSkgPyBjb29raWUudG9KU09OKCkgOiBjb29raWU7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgaW5kZXggc28gbmV3IG9uZXMgZ2V0IGFzc2lnbmVkIGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICAgIGRlbGV0ZSBjb29raWUuY3JlYXRpb25JbmRleDtcblxuICAgICAgcmV0dXJuIGNvb2tpZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjYihudWxsLCBzZXJpYWxpemVkKTtcbiAgfSk7XG59O1xuXG4vLyB3ZWxsLWtub3duIG5hbWUgdGhhdCBKU09OLnN0cmluZ2lmeSBjYWxsc1xuQ29va2llSmFyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2VyaWFsaXplU3luYygpO1xufTtcblxuLy8gdXNlIHRoZSBjbGFzcyBtZXRob2QgQ29va2llSmFyLmRlc2VyaWFsaXplIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGRpcmVjdGx5XG5DQU5fQkVfU1lOQy5wdXNoKCdfaW1wb3J0Q29va2llcycpO1xuQ29va2llSmFyLnByb3RvdHlwZS5faW1wb3J0Q29va2llcyA9IGZ1bmN0aW9uKHNlcmlhbGl6ZWQsIGNiKSB7XG4gIHZhciBqYXIgPSB0aGlzO1xuICB2YXIgY29va2llcyA9IHNlcmlhbGl6ZWQuY29va2llcztcbiAgaWYgKCFjb29raWVzIHx8ICFBcnJheS5pc0FycmF5KGNvb2tpZXMpKSB7XG4gICAgcmV0dXJuIGNiKG5ldyBFcnJvcignc2VyaWFsaXplZCBqYXIgaGFzIG5vIGNvb2tpZXMgYXJyYXknKSk7XG4gIH1cbiAgY29va2llcyA9IGNvb2tpZXMuc2xpY2UoKTsgLy8gZG8gbm90IG1vZGlmeSB0aGUgb3JpZ2luYWxcblxuICBmdW5jdGlvbiBwdXROZXh0KGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIGlmICghY29va2llcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYihlcnIsIGphcik7XG4gICAgfVxuXG4gICAgdmFyIGNvb2tpZTtcbiAgICB0cnkge1xuICAgICAgY29va2llID0gZnJvbUpTT04oY29va2llcy5zaGlmdCgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gY2IoZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvb2tpZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHB1dE5leHQobnVsbCk7IC8vIHNraXAgdGhpcyBjb29raWVcbiAgICB9XG5cbiAgICBqYXIuc3RvcmUucHV0Q29va2llKGNvb2tpZSwgcHV0TmV4dCk7XG4gIH1cblxuICBwdXROZXh0KCk7XG59O1xuXG5Db29raWVKYXIuZGVzZXJpYWxpemUgPSBmdW5jdGlvbihzdHJPck9iaiwgc3RvcmUsIGNiKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7XG4gICAgLy8gc3RvcmUgaXMgb3B0aW9uYWxcbiAgICBjYiA9IHN0b3JlO1xuICAgIHN0b3JlID0gbnVsbDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkO1xuICBpZiAodHlwZW9mIHN0ck9yT2JqID09PSAnc3RyaW5nJykge1xuICAgIHNlcmlhbGl6ZWQgPSBqc29uUGFyc2Uoc3RyT3JPYmopO1xuICAgIGlmIChzZXJpYWxpemVkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBjYihzZXJpYWxpemVkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplZCA9IHN0ck9yT2JqO1xuICB9XG5cbiAgdmFyIGphciA9IG5ldyBDb29raWVKYXIoc3RvcmUsIHNlcmlhbGl6ZWQucmVqZWN0UHVibGljU3VmZml4ZXMpO1xuICBqYXIuX2ltcG9ydENvb2tpZXMoc2VyaWFsaXplZCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuICAgIGNiKG51bGwsIGphcik7XG4gIH0pO1xufTtcblxuQ29va2llSmFyLmRlc2VyaWFsaXplU3luYyA9IGZ1bmN0aW9uKHN0ck9yT2JqLCBzdG9yZSkge1xuICB2YXIgc2VyaWFsaXplZCA9IHR5cGVvZiBzdHJPck9iaiA9PT0gJ3N0cmluZycgP1xuICAgIEpTT04ucGFyc2Uoc3RyT3JPYmopIDogc3RyT3JPYmo7XG4gIHZhciBqYXIgPSBuZXcgQ29va2llSmFyKHN0b3JlLCBzZXJpYWxpemVkLnJlamVjdFB1YmxpY1N1ZmZpeGVzKTtcblxuICAvLyBjYXRjaCB0aGlzIG1pc3Rha2UgZWFybHk6XG4gIGlmICghamFyLnN0b3JlLnN5bmNocm9ub3VzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb29raWVKYXIgc3RvcmUgaXMgbm90IHN5bmNocm9ub3VzOyB1c2UgYXN5bmMgQVBJIGluc3RlYWQuJyk7XG4gIH1cblxuICBqYXIuX2ltcG9ydENvb2tpZXNTeW5jKHNlcmlhbGl6ZWQpO1xuICByZXR1cm4gamFyO1xufTtcbkNvb2tpZUphci5mcm9tSlNPTiA9IENvb2tpZUphci5kZXNlcmlhbGl6ZVN5bmM7XG5cbkNvb2tpZUphci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbihuZXdTdG9yZSwgY2IpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjYiA9IG5ld1N0b3JlO1xuICAgIG5ld1N0b3JlID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuc2VyaWFsaXplKGZ1bmN0aW9uKGVycixzZXJpYWxpemVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgfVxuICAgIENvb2tpZUphci5kZXNlcmlhbGl6ZShzZXJpYWxpemVkLCBuZXdTdG9yZSwgY2IpO1xuICB9KTtcbn07XG5cbkNBTl9CRV9TWU5DLnB1c2goJ3JlbW92ZUFsbENvb2tpZXMnKTtcbkNvb2tpZUphci5wcm90b3R5cGUucmVtb3ZlQWxsQ29va2llcyA9IGZ1bmN0aW9uKGNiKSB7XG4gIHZhciBzdG9yZSA9IHRoaXMuc3RvcmU7XG5cbiAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RvcmUgaW1wbGVtZW50cyBpdHMgb3duIHJlbW92ZUFsbENvb2tpZXMoKS4gVGhlIGRlZmF1bHRcbiAgLy8gaW1wbGVtZW50YXRpb24gaW4gU3RvcmUgd2lsbCBpbW1lZGlhdGVseSBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGEgXCJub3RcbiAgLy8gaW1wbGVtZW50ZWRcIiBFcnJvci5cbiAgaWYgKHN0b3JlLnJlbW92ZUFsbENvb2tpZXMgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJlxuICAgICAgc3RvcmUucmVtb3ZlQWxsQ29va2llcyAhPT0gU3RvcmUucHJvdG90eXBlLnJlbW92ZUFsbENvb2tpZXMpXG4gIHtcbiAgICByZXR1cm4gc3RvcmUucmVtb3ZlQWxsQ29va2llcyhjYik7XG4gIH1cblxuICBzdG9yZS5nZXRBbGxDb29raWVzKGZ1bmN0aW9uKGVyciwgY29va2llcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYihlcnIpO1xuICAgIH1cblxuICAgIGlmIChjb29raWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNiKG51bGwpO1xuICAgIH1cblxuICAgIHZhciBjb21wbGV0ZWRDb3VudCA9IDA7XG4gICAgdmFyIHJlbW92ZUVycm9ycyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlQ29va2llQ2IocmVtb3ZlRXJyKSB7XG4gICAgICBpZiAocmVtb3ZlRXJyKSB7XG4gICAgICAgIHJlbW92ZUVycm9ycy5wdXNoKHJlbW92ZUVycik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZENvdW50Kys7XG5cbiAgICAgIGlmIChjb21wbGV0ZWRDb3VudCA9PT0gY29va2llcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGNiKHJlbW92ZUVycm9ycy5sZW5ndGggPyByZW1vdmVFcnJvcnNbMF0gOiBudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb29raWVzLmZvckVhY2goZnVuY3Rpb24oY29va2llKSB7XG4gICAgICBzdG9yZS5yZW1vdmVDb29raWUoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5rZXksIHJlbW92ZUNvb2tpZUNiKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5Db29raWVKYXIucHJvdG90eXBlLl9jbG9uZVN5bmMgPSBzeW5jV3JhcCgnY2xvbmUnKTtcbkNvb2tpZUphci5wcm90b3R5cGUuY2xvbmVTeW5jID0gZnVuY3Rpb24obmV3U3RvcmUpIHtcbiAgaWYgKCFuZXdTdG9yZS5zeW5jaHJvbm91cykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29va2llSmFyIGNsb25lIGRlc3RpbmF0aW9uIHN0b3JlIGlzIG5vdCBzeW5jaHJvbm91czsgdXNlIGFzeW5jIEFQSSBpbnN0ZWFkLicpO1xuICB9XG4gIHJldHVybiB0aGlzLl9jbG9uZVN5bmMobmV3U3RvcmUpO1xufTtcblxuLy8gVXNlIGEgY2xvc3VyZSB0byBwcm92aWRlIGEgdHJ1ZSBpbXBlcmF0aXZlIEFQSSBmb3Igc3luY2hyb25vdXMgc3RvcmVzLlxuZnVuY3Rpb24gc3luY1dyYXAobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuc3luY2hyb25vdXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29va2llSmFyIHN0b3JlIGlzIG5vdCBzeW5jaHJvbm91czsgdXNlIGFzeW5jIEFQSSBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICB2YXIgc3luY0Vyciwgc3luY1Jlc3VsdDtcbiAgICBhcmdzLnB1c2goZnVuY3Rpb24gc3luY0NiKGVyciwgcmVzdWx0KSB7XG4gICAgICBzeW5jRXJyID0gZXJyO1xuICAgICAgc3luY1Jlc3VsdCA9IHJlc3VsdDtcbiAgICB9KTtcbiAgICB0aGlzW21ldGhvZF0uYXBwbHkodGhpcywgYXJncyk7XG5cbiAgICBpZiAoc3luY0Vycikge1xuICAgICAgdGhyb3cgc3luY0VycjtcbiAgICB9XG4gICAgcmV0dXJuIHN5bmNSZXN1bHQ7XG4gIH07XG59XG5cbi8vIHdyYXAgYWxsIGRlY2xhcmVkIENBTl9CRV9TWU5DIG1ldGhvZHMgaW4gdGhlIHN5bmMgd3JhcHBlclxuQ0FOX0JFX1NZTkMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgQ29va2llSmFyLnByb3RvdHlwZVttZXRob2QrJ1N5bmMnXSA9IHN5bmNXcmFwKG1ldGhvZCk7XG59KTtcblxuZXhwb3J0cy52ZXJzaW9uID0gVkVSU0lPTjtcbmV4cG9ydHMuQ29va2llSmFyID0gQ29va2llSmFyO1xuZXhwb3J0cy5Db29raWUgPSBDb29raWU7XG5leHBvcnRzLlN0b3JlID0gU3RvcmU7XG5leHBvcnRzLk1lbW9yeUNvb2tpZVN0b3JlID0gTWVtb3J5Q29va2llU3RvcmU7XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmV4cG9ydHMuZm9ybWF0RGF0ZSA9IGZvcm1hdERhdGU7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLmZyb21KU09OID0gZnJvbUpTT047XG5leHBvcnRzLmRvbWFpbk1hdGNoID0gZG9tYWluTWF0Y2g7XG5leHBvcnRzLmRlZmF1bHRQYXRoID0gZGVmYXVsdFBhdGg7XG5leHBvcnRzLnBhdGhNYXRjaCA9IHBhdGhNYXRjaDtcbmV4cG9ydHMuZ2V0UHVibGljU3VmZml4ID0gcHVic3VmZml4LmdldFB1YmxpY1N1ZmZpeDtcbmV4cG9ydHMuY29va2llQ29tcGFyZSA9IGNvb2tpZUNvbXBhcmU7XG5leHBvcnRzLnBlcm11dGVEb21haW4gPSByZXF1aXJlKCcuL3Blcm11dGVEb21haW4nKS5wZXJtdXRlRG9tYWluO1xuZXhwb3J0cy5wZXJtdXRlUGF0aCA9IHBlcm11dGVQYXRoO1xuZXhwb3J0cy5jYW5vbmljYWxEb21haW4gPSBjYW5vbmljYWxEb21haW47XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB0b3VnaCA9IHJlcXVpcmUoJ3RvdWdoLWNvb2tpZScpXG5cbnZhciBDb29raWUgPSB0b3VnaC5Db29raWVcbnZhciBDb29raWVKYXIgPSB0b3VnaC5Db29raWVKYXJcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgaWYgKHN0ciAmJiBzdHIudXJpKSB7XG4gICAgc3RyID0gc3RyLnVyaVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvb2tpZSBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgU1RSSU5HIGFzIHBhcmFtJylcbiAgfVxuICByZXR1cm4gQ29va2llLnBhcnNlKHN0ciwge2xvb3NlOiB0cnVlfSlcbn1cblxuLy8gQWRhcHQgdGhlIHNvbWV0aW1lcy1Bc3luYyBhcGkgb2YgdG91Z2guQ29va2llSmFyIHRvIG91ciByZXF1aXJlbWVudHNcbmZ1bmN0aW9uIFJlcXVlc3RKYXIgKHN0b3JlKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLl9qYXIgPSBuZXcgQ29va2llSmFyKHN0b3JlLCB7bG9vc2VNb2RlOiB0cnVlfSlcbn1cblJlcXVlc3RKYXIucHJvdG90eXBlLnNldENvb2tpZSA9IGZ1bmN0aW9uIChjb29raWVPclN0ciwgdXJpLCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICByZXR1cm4gc2VsZi5famFyLnNldENvb2tpZVN5bmMoY29va2llT3JTdHIsIHVyaSwgb3B0aW9ucyB8fCB7fSlcbn1cblJlcXVlc3RKYXIucHJvdG90eXBlLmdldENvb2tpZVN0cmluZyA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiBzZWxmLl9qYXIuZ2V0Q29va2llU3RyaW5nU3luYyh1cmkpXG59XG5SZXF1ZXN0SmFyLnByb3RvdHlwZS5nZXRDb29raWVzID0gZnVuY3Rpb24gKHVyaSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgcmV0dXJuIHNlbGYuX2phci5nZXRDb29raWVzU3luYyh1cmkpXG59XG5cbmV4cG9ydHMuamFyID0gZnVuY3Rpb24gKHN0b3JlKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdEphcihzdG9yZSlcbn1cbiIsICJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnlcbmV4cG9ydHMuZ2V0U2VyaWFsaXplID0gc2VyaWFsaXplclxuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2VzLCBjeWNsZVJlcGxhY2VyKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIHNlcmlhbGl6ZXIocmVwbGFjZXIsIGN5Y2xlUmVwbGFjZXIpLCBzcGFjZXMpXG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZXIocmVwbGFjZXIsIGN5Y2xlUmVwbGFjZXIpIHtcbiAgdmFyIHN0YWNrID0gW10sIGtleXMgPSBbXVxuXG4gIGlmIChjeWNsZVJlcGxhY2VyID09IG51bGwpIGN5Y2xlUmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgaWYgKHN0YWNrWzBdID09PSB2YWx1ZSkgcmV0dXJuIFwiW0NpcmN1bGFyIH5dXCJcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfi5cIiArIGtleXMuc2xpY2UoMCwgc3RhY2suaW5kZXhPZih2YWx1ZSkpLmpvaW4oXCIuXCIpICsgXCJdXCJcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0aGlzUG9zID0gc3RhY2suaW5kZXhPZih0aGlzKVxuICAgICAgfnRoaXNQb3MgPyBzdGFjay5zcGxpY2UodGhpc1BvcyArIDEpIDogc3RhY2sucHVzaCh0aGlzKVxuICAgICAgfnRoaXNQb3MgPyBrZXlzLnNwbGljZSh0aGlzUG9zLCBJbmZpbml0eSwga2V5KSA6IGtleXMucHVzaChrZXkpXG4gICAgICBpZiAofnN0YWNrLmluZGV4T2YodmFsdWUpKSB2YWx1ZSA9IGN5Y2xlUmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKVxuICAgIH1cbiAgICBlbHNlIHN0YWNrLnB1c2godmFsdWUpXG5cbiAgICByZXR1cm4gcmVwbGFjZXIgPT0gbnVsbCA/IHZhbHVlIDogcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKVxuICB9XG59XG4iLCAiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiIsICIndXNlIHN0cmljdCdcblxudmFyIGpzb25TYWZlU3RyaW5naWZ5ID0gcmVxdWlyZSgnanNvbi1zdHJpbmdpZnktc2FmZScpXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG52YXIgZGVmZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAndW5kZWZpbmVkJ1xuICA/IHByb2Nlc3MubmV4dFRpY2tcbiAgOiBzZXRJbW1lZGlhdGVcblxuZnVuY3Rpb24gcGFyYW1zSGF2ZVJlcXVlc3RCb2R5IChwYXJhbXMpIHtcbiAgcmV0dXJuIChcbiAgICBwYXJhbXMuYm9keSB8fFxuICAgIHBhcmFtcy5yZXF1ZXN0Qm9keVN0cmVhbSB8fFxuICAgIChwYXJhbXMuanNvbiAmJiB0eXBlb2YgcGFyYW1zLmpzb24gIT09ICdib29sZWFuJykgfHxcbiAgICBwYXJhbXMubXVsdGlwYXJ0XG4gIClcbn1cblxuZnVuY3Rpb24gc2FmZVN0cmluZ2lmeSAob2JqLCByZXBsYWNlcikge1xuICB2YXIgcmV0XG4gIHRyeSB7XG4gICAgcmV0ID0gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlcilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldCA9IGpzb25TYWZlU3RyaW5naWZ5KG9iaiwgcmVwbGFjZXIpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBtZDUgKHN0cikge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShzdHIpLmRpZ2VzdCgnaGV4Jylcbn1cblxuZnVuY3Rpb24gaXNSZWFkU3RyZWFtIChycykge1xuICByZXR1cm4gcnMucmVhZGFibGUgJiYgcnMucGF0aCAmJiBycy5tb2RlXG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0IChzdHIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciB8fCAnJywgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jylcbn1cblxuZnVuY3Rpb24gY29weSAob2JqKSB7XG4gIHZhciBvID0ge31cbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7XG4gICAgb1tpXSA9IG9ialtpXVxuICB9KVxuICByZXR1cm4gb1xufVxuXG5mdW5jdGlvbiB2ZXJzaW9uICgpIHtcbiAgdmFyIG51bWJlcnMgPSBwcm9jZXNzLnZlcnNpb24ucmVwbGFjZSgndicsICcnKS5zcGxpdCgnLicpXG4gIHJldHVybiB7XG4gICAgbWFqb3I6IHBhcnNlSW50KG51bWJlcnNbMF0sIDEwKSxcbiAgICBtaW5vcjogcGFyc2VJbnQobnVtYmVyc1sxXSwgMTApLFxuICAgIHBhdGNoOiBwYXJzZUludChudW1iZXJzWzJdLCAxMClcbiAgfVxufVxuXG5leHBvcnRzLnBhcmFtc0hhdmVSZXF1ZXN0Qm9keSA9IHBhcmFtc0hhdmVSZXF1ZXN0Qm9keVxuZXhwb3J0cy5zYWZlU3RyaW5naWZ5ID0gc2FmZVN0cmluZ2lmeVxuZXhwb3J0cy5tZDUgPSBtZDVcbmV4cG9ydHMuaXNSZWFkU3RyZWFtID0gaXNSZWFkU3RyZWFtXG5leHBvcnRzLnRvQmFzZTY0ID0gdG9CYXNlNjRcbmV4cG9ydHMuY29weSA9IGNvcHlcbmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb25cbmV4cG9ydHMuZGVmZXIgPSBkZWZlclxuIiwgIlxuLyohXG4gKiAgQ29weXJpZ2h0IDIwMTAgTGVhcm5Cb29zdCA8ZGV2QGxlYXJuYm9vc3QuY29tPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG4gICwgcGFyc2UgPSByZXF1aXJlKCd1cmwnKS5wYXJzZVxuICA7XG5cbi8qKlxuICogVmFsaWQga2V5cy5cbiAqL1xuXG52YXIga2V5cyA9IFxuICBbICdhY2wnXG4gICwgJ2xvY2F0aW9uJ1xuICAsICdsb2dnaW5nJ1xuICAsICdub3RpZmljYXRpb24nXG4gICwgJ3BhcnROdW1iZXInXG4gICwgJ3BvbGljeSdcbiAgLCAncmVxdWVzdFBheW1lbnQnXG4gICwgJ3RvcnJlbnQnXG4gICwgJ3VwbG9hZElkJ1xuICAsICd1cGxvYWRzJ1xuICAsICd2ZXJzaW9uSWQnXG4gICwgJ3ZlcnNpb25pbmcnXG4gICwgJ3ZlcnNpb25zJ1xuICAsICd3ZWJzaXRlJ1xuICBdXG5cbi8qKlxuICogUmV0dXJuIGFuIFwiQXV0aG9yaXphdGlvblwiIGhlYWRlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2BcbiAqIGluIHRoZSBmb3JtIG9mIFwiQVdTIDxrZXk+OjxzaWduYXR1cmU+XCJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXV0aG9yaXphdGlvbiAob3B0aW9ucykge1xuICByZXR1cm4gJ0FXUyAnICsgb3B0aW9ucy5rZXkgKyAnOicgKyBzaWduKG9wdGlvbnMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0aG9yaXphdGlvblxubW9kdWxlLmV4cG9ydHMuYXV0aG9yaXphdGlvbiA9IGF1dGhvcml6YXRpb25cblxuLyoqXG4gKiBTaW1wbGUgSE1BQy1TSEExIFdyYXBwZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gXG5cbmZ1bmN0aW9uIGhtYWNTaGExIChvcHRpb25zKSB7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIG9wdGlvbnMuc2VjcmV0KS51cGRhdGUob3B0aW9ucy5tZXNzYWdlKS5kaWdlc3QoJ2Jhc2U2NCcpXG59XG5cbm1vZHVsZS5leHBvcnRzLmhtYWNTaGExID0gaG1hY1NoYTFcblxuLyoqXG4gKiBDcmVhdGUgYSBiYXNlNjQgc2hhMSBITUFDIGZvciBgb3B0aW9uc2AuIFxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2lnbiAob3B0aW9ucykge1xuICBvcHRpb25zLm1lc3NhZ2UgPSBzdHJpbmdUb1NpZ24ob3B0aW9ucylcbiAgcmV0dXJuIGhtYWNTaGExKG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cy5zaWduID0gc2lnblxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2U2NCBzaGExIEhNQUMgZm9yIGBvcHRpb25zYC4gXG4gKlxuICogU3BlY2lmaWNhbGx5IHRvIGJlIHVzZWQgd2l0aCBTMyBwcmVzaWduZWQgVVJMc1xuICogXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2lnblF1ZXJ5IChvcHRpb25zKSB7XG4gIG9wdGlvbnMubWVzc2FnZSA9IHF1ZXJ5U3RyaW5nVG9TaWduKG9wdGlvbnMpXG4gIHJldHVybiBobWFjU2hhMShvcHRpb25zKVxufVxubW9kdWxlLmV4cG9ydHMuc2lnblF1ZXJ5PSBzaWduUXVlcnlcblxuLyoqXG4gKiBSZXR1cm4gYSBzdHJpbmcgZm9yIHNpZ24oKSB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogU3BlYzpcbiAqIFxuICogICAgPHZlcmI+XFxuXG4gKiAgICA8bWQ1PlxcblxuICogICAgPGNvbnRlbnQtdHlwZT5cXG5cbiAqICAgIDxkYXRlPlxcblxuICogICAgW2hlYWRlcnNcXG5dXG4gKiAgICA8cmVzb3VyY2U+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ1RvU2lnbiAob3B0aW9ucykge1xuICB2YXIgaGVhZGVycyA9IG9wdGlvbnMuYW1hem9uSGVhZGVycyB8fCAnJ1xuICBpZiAoaGVhZGVycykgaGVhZGVycyArPSAnXFxuJ1xuICB2YXIgciA9IFxuICAgIFsgb3B0aW9ucy52ZXJiXG4gICAgLCBvcHRpb25zLm1kNVxuICAgICwgb3B0aW9ucy5jb250ZW50VHlwZVxuICAgICwgb3B0aW9ucy5kYXRlID8gb3B0aW9ucy5kYXRlLnRvVVRDU3RyaW5nKCkgOiAnJ1xuICAgICwgaGVhZGVycyArIG9wdGlvbnMucmVzb3VyY2VcbiAgICBdXG4gIHJldHVybiByLmpvaW4oJ1xcbicpXG59XG5tb2R1bGUuZXhwb3J0cy5zdHJpbmdUb1NpZ24gPSBzdHJpbmdUb1NpZ25cblxuLyoqXG4gKiBSZXR1cm4gYSBzdHJpbmcgZm9yIHNpZ24oKSB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AsIGJ1dCBpcyBtZWFudCBleGNsdXNpdmVseVxuICogZm9yIFMzIHByZXNpZ25lZCBVUkxzXG4gKlxuICogU3BlYzpcbiAqIFxuICogICAgPGRhdGU+XFxuXG4gKiAgICA8cmVzb3VyY2U+XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHF1ZXJ5U3RyaW5nVG9TaWduIChvcHRpb25zKXtcbiAgcmV0dXJuICdHRVRcXG5cXG5cXG4nICsgb3B0aW9ucy5kYXRlICsgJ1xcbicgKyBvcHRpb25zLnJlc291cmNlXG59XG5tb2R1bGUuZXhwb3J0cy5xdWVyeVN0cmluZ1RvU2lnbiA9IHF1ZXJ5U3RyaW5nVG9TaWduXG5cbi8qKlxuICogUGVyZm9ybSB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAtIGlnbm9yZSBub24tYW1hem9uIGhlYWRlcnNcbiAqICAtIGxvd2VyY2FzZSBmaWVsZHNcbiAqICAtIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHlcbiAqICAtIHRyaW0gd2hpdGVzcGFjZSBiZXR3ZWVuIFwiOlwiXG4gKiAgLSBqb2luIHdpdGggbmV3bGluZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJzXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjYW5vbmljYWxpemVIZWFkZXJzIChoZWFkZXJzKSB7XG4gIHZhciBidWYgPSBbXVxuICAgICwgZmllbGRzID0gT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICA7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV1cbiAgICAgICwgdmFsID0gaGVhZGVyc1tmaWVsZF1cbiAgICAgICwgZmllbGQgPSBmaWVsZC50b0xvd2VyQ2FzZSgpXG4gICAgICA7XG4gICAgaWYgKDAgIT09IGZpZWxkLmluZGV4T2YoJ3gtYW16JykpIGNvbnRpbnVlXG4gICAgYnVmLnB1c2goZmllbGQgKyAnOicgKyB2YWwpXG4gIH1cbiAgcmV0dXJuIGJ1Zi5zb3J0KCkuam9pbignXFxuJylcbn1cbm1vZHVsZS5leHBvcnRzLmNhbm9uaWNhbGl6ZUhlYWRlcnMgPSBjYW5vbmljYWxpemVIZWFkZXJzXG5cbi8qKlxuICogUGVyZm9ybSB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAtIGlnbm9yZSBub24gc3ViLXJlc291cmNlc1xuICogIC0gc29ydCBsZXhpY29ncmFwaGljYWxseVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXNvdXJjZVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplUmVzb3VyY2UgKHJlc291cmNlKSB7XG4gIHZhciB1cmwgPSBwYXJzZShyZXNvdXJjZSwgdHJ1ZSlcbiAgICAsIHBhdGggPSB1cmwucGF0aG5hbWVcbiAgICAsIGJ1ZiA9IFtdXG4gICAgO1xuXG4gIE9iamVjdC5rZXlzKHVybC5xdWVyeSkuZm9yRWFjaChmdW5jdGlvbihrZXkpe1xuICAgIGlmICghfmtleXMuaW5kZXhPZihrZXkpKSByZXR1cm5cbiAgICB2YXIgdmFsID0gJycgPT0gdXJsLnF1ZXJ5W2tleV0gPyAnJyA6ICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwucXVlcnlba2V5XSlcbiAgICBidWYucHVzaChrZXkgKyB2YWwpXG4gIH0pXG5cbiAgcmV0dXJuIHBhdGggKyAoYnVmLmxlbmd0aCA/ICc/JyArIGJ1Zi5zb3J0KCkuam9pbignJicpIDogJycpXG59XG5tb2R1bGUuZXhwb3J0cy5jYW5vbmljYWxpemVSZXNvdXJjZSA9IGNhbm9uaWNhbGl6ZVJlc291cmNlXG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzaXplKSB7XG4gIHJldHVybiBuZXcgTHJ1Q2FjaGUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gTHJ1Q2FjaGUoc2l6ZSkge1xuICB0aGlzLmNhcGFjaXR5ID0gc2l6ZSB8IDBcbiAgdGhpcy5tYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHRoaXMubGlzdCA9IG5ldyBEb3VibHlMaW5rZWRMaXN0KClcbn1cblxuTHJ1Q2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgbm9kZSA9IHRoaXMubWFwW2tleV1cbiAgaWYgKG5vZGUgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICB0aGlzLnVzZWQobm9kZSlcbiAgcmV0dXJuIG5vZGUudmFsXG59XG5cbkxydUNhY2hlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihrZXksIHZhbCkge1xuICB2YXIgbm9kZSA9IHRoaXMubWFwW2tleV1cbiAgaWYgKG5vZGUgIT0gbnVsbCkge1xuICAgIG5vZGUudmFsID0gdmFsXG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0aGlzLmNhcGFjaXR5KSB0aGlzLnBydW5lKClcbiAgICBpZiAoIXRoaXMuY2FwYWNpdHkpIHJldHVybiBmYWxzZVxuICAgIG5vZGUgPSBuZXcgRG91Ymx5TGlua2VkTm9kZShrZXksIHZhbClcbiAgICB0aGlzLm1hcFtrZXldID0gbm9kZVxuICAgIHRoaXMuY2FwYWNpdHktLVxuICB9XG4gIHRoaXMudXNlZChub2RlKVxuICByZXR1cm4gdHJ1ZVxufVxuXG5McnVDYWNoZS5wcm90b3R5cGUudXNlZCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5saXN0Lm1vdmVUb0Zyb250KG5vZGUpXG59XG5cbkxydUNhY2hlLnByb3RvdHlwZS5wcnVuZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZSA9IHRoaXMubGlzdC5wb3AoKVxuICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgZGVsZXRlIHRoaXMubWFwW25vZGUua2V5XVxuICAgIHRoaXMuY2FwYWNpdHkrK1xuICB9XG59XG5cblxuZnVuY3Rpb24gRG91Ymx5TGlua2VkTGlzdCgpIHtcbiAgdGhpcy5maXJzdE5vZGUgPSBudWxsXG4gIHRoaXMubGFzdE5vZGUgPSBudWxsXG59XG5cbkRvdWJseUxpbmtlZExpc3QucHJvdG90eXBlLm1vdmVUb0Zyb250ID0gZnVuY3Rpb24obm9kZSkge1xuICBpZiAodGhpcy5maXJzdE5vZGUgPT0gbm9kZSkgcmV0dXJuXG5cbiAgdGhpcy5yZW1vdmUobm9kZSlcblxuICBpZiAodGhpcy5maXJzdE5vZGUgPT0gbnVsbCkge1xuICAgIHRoaXMuZmlyc3ROb2RlID0gbm9kZVxuICAgIHRoaXMubGFzdE5vZGUgPSBub2RlXG4gICAgbm9kZS5wcmV2ID0gbnVsbFxuICAgIG5vZGUubmV4dCA9IG51bGxcbiAgfSBlbHNlIHtcbiAgICBub2RlLnByZXYgPSBudWxsXG4gICAgbm9kZS5uZXh0ID0gdGhpcy5maXJzdE5vZGVcbiAgICBub2RlLm5leHQucHJldiA9IG5vZGVcbiAgICB0aGlzLmZpcnN0Tm9kZSA9IG5vZGVcbiAgfVxufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGxhc3ROb2RlID0gdGhpcy5sYXN0Tm9kZVxuICBpZiAobGFzdE5vZGUgIT0gbnVsbCkge1xuICAgIHRoaXMucmVtb3ZlKGxhc3ROb2RlKVxuICB9XG4gIHJldHVybiBsYXN0Tm9kZVxufVxuXG5Eb3VibHlMaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihub2RlKSB7XG4gIGlmICh0aGlzLmZpcnN0Tm9kZSA9PSBub2RlKSB7XG4gICAgdGhpcy5maXJzdE5vZGUgPSBub2RlLm5leHRcbiAgfSBlbHNlIGlmIChub2RlLnByZXYgIT0gbnVsbCkge1xuICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0XG4gIH1cbiAgaWYgKHRoaXMubGFzdE5vZGUgPT0gbm9kZSkge1xuICAgIHRoaXMubGFzdE5vZGUgPSBub2RlLnByZXZcbiAgfSBlbHNlIGlmIChub2RlLm5leHQgIT0gbnVsbCkge1xuICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBEb3VibHlMaW5rZWROb2RlKGtleSwgdmFsKSB7XG4gIHRoaXMua2V5ID0ga2V5XG4gIHRoaXMudmFsID0gdmFsXG4gIHRoaXMucHJldiA9IG51bGxcbiAgdGhpcy5uZXh0ID0gbnVsbFxufVxuIiwgInZhciBhd3M0ID0gZXhwb3J0cyxcbiAgICB1cmwgPSByZXF1aXJlKCd1cmwnKSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyksXG4gICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyksXG4gICAgbHJ1ID0gcmVxdWlyZSgnLi9scnUnKSxcbiAgICBjcmVkZW50aWFsc0NhY2hlID0gbHJ1KDEwMDApXG5cbi8vIGh0dHA6Ly9kb2NzLmFtYXpvbndlYnNlcnZpY2VzLmNvbS9nZW5lcmFsL2xhdGVzdC9nci9zaWduYXR1cmUtdmVyc2lvbi00Lmh0bWxcblxuZnVuY3Rpb24gaG1hYyhrZXksIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIbWFjKCdzaGEyNTYnLCBrZXkpLnVwZGF0ZShzdHJpbmcsICd1dGY4JykuZGlnZXN0KGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBoYXNoKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc3RyaW5nLCAndXRmOCcpLmRpZ2VzdChlbmNvZGluZylcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBzdHJpbmcgaGFzIGFscmVhZHkgYmVlbiBwZXJjZW50IGVuY29kZWRcbmZ1bmN0aW9uIGVuY29kZVJmYzM5ODYodXJsRW5jb2RlZFN0cmluZykge1xuICByZXR1cm4gdXJsRW5jb2RlZFN0cmluZy5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGVuY29kZVJmYzM5ODZGdWxsKHN0cikge1xuICByZXR1cm4gZW5jb2RlUmZjMzk4NihlbmNvZGVVUklDb21wb25lbnQoc3RyKSlcbn1cblxuLy8gQSBiaXQgb2YgYSBjb21iaW5hdGlvbiBvZjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qYXZhLXYyL2Jsb2IvZGM2OTVkZTZhYjQ5YWQwMzkzNGUxYjAyZTcyNjNhYmJkMjM1NGJlMC9jb3JlL2F1dGgvc3JjL21haW4vamF2YS9zb2Z0d2FyZS9hbWF6b24vYXdzc2RrL2F1dGgvc2lnbmVyL2ludGVybmFsL0Fic3RyYWN0QXdzNFNpZ25lci5qYXZhI0w1OVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzL2Jsb2IvMThjYjdlNWI0NjNiNDYyMzlmOWZkZDRhNjVlMmZmOGM4MTgzMWU4Zi9saWIvc2lnbmVycy92NC5qcyNMMTkxLUwxOTlcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taGFydC9hd3M0ZmV0Y2gvYmxvYi9iM2FlZDE2YjZmMTczODRjZjM2ZWEzM2JjYmEzYzFlOWYzYmRmZWZkL3NyYy9tYWluLmpzI0wyNS1MMzRcbnZhciBIRUFERVJTX1RPX0lHTk9SRSA9IHtcbiAgJ2F1dGhvcml6YXRpb24nOiB0cnVlLFxuICAnY29ubmVjdGlvbic6IHRydWUsXG4gICd4LWFtem4tdHJhY2UtaWQnOiB0cnVlLFxuICAndXNlci1hZ2VudCc6IHRydWUsXG4gICdleHBlY3QnOiB0cnVlLFxuICAncHJlc2lnbmVkLWV4cGlyZXMnOiB0cnVlLFxuICAncmFuZ2UnOiB0cnVlLFxufVxuXG4vLyByZXF1ZXN0OiB7IHBhdGggfCBib2R5LCBbaG9zdF0sIFttZXRob2RdLCBbaGVhZGVyc10sIFtzZXJ2aWNlXSwgW3JlZ2lvbl0gfVxuLy8gY3JlZGVudGlhbHM6IHsgYWNjZXNzS2V5SWQsIHNlY3JldEFjY2Vzc0tleSwgW3Nlc3Npb25Ub2tlbl0gfVxuZnVuY3Rpb24gUmVxdWVzdFNpZ25lcihyZXF1ZXN0LCBjcmVkZW50aWFscykge1xuXG4gIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHJlcXVlc3QgPSB1cmwucGFyc2UocmVxdWVzdClcblxuICB2YXIgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycyA9IChyZXF1ZXN0LmhlYWRlcnMgfHwge30pLFxuICAgICAgaG9zdFBhcnRzID0gKCF0aGlzLnNlcnZpY2UgfHwgIXRoaXMucmVnaW9uKSAmJiB0aGlzLm1hdGNoSG9zdChyZXF1ZXN0Lmhvc3RuYW1lIHx8IHJlcXVlc3QuaG9zdCB8fCBoZWFkZXJzLkhvc3QgfHwgaGVhZGVycy5ob3N0KVxuXG4gIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzIHx8IHRoaXMuZGVmYXVsdENyZWRlbnRpYWxzKClcblxuICB0aGlzLnNlcnZpY2UgPSByZXF1ZXN0LnNlcnZpY2UgfHwgaG9zdFBhcnRzWzBdIHx8ICcnXG4gIHRoaXMucmVnaW9uID0gcmVxdWVzdC5yZWdpb24gfHwgaG9zdFBhcnRzWzFdIHx8ICd1cy1lYXN0LTEnXG5cbiAgLy8gU0VTIHVzZXMgYSBkaWZmZXJlbnQgZG9tYWluIGZyb20gdGhlIHNlcnZpY2UgbmFtZVxuICBpZiAodGhpcy5zZXJ2aWNlID09PSAnZW1haWwnKSB0aGlzLnNlcnZpY2UgPSAnc2VzJ1xuXG4gIGlmICghcmVxdWVzdC5tZXRob2QgJiYgcmVxdWVzdC5ib2R5KVxuICAgIHJlcXVlc3QubWV0aG9kID0gJ1BPU1QnXG5cbiAgaWYgKCFoZWFkZXJzLkhvc3QgJiYgIWhlYWRlcnMuaG9zdCkge1xuICAgIGhlYWRlcnMuSG9zdCA9IHJlcXVlc3QuaG9zdG5hbWUgfHwgcmVxdWVzdC5ob3N0IHx8IHRoaXMuY3JlYXRlSG9zdCgpXG5cbiAgICAvLyBJZiBhIHBvcnQgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHVzZSBpdCBhcyBpc1xuICAgIGlmIChyZXF1ZXN0LnBvcnQpXG4gICAgICBoZWFkZXJzLkhvc3QgKz0gJzonICsgcmVxdWVzdC5wb3J0XG4gIH1cbiAgaWYgKCFyZXF1ZXN0Lmhvc3RuYW1lICYmICFyZXF1ZXN0Lmhvc3QpXG4gICAgcmVxdWVzdC5ob3N0bmFtZSA9IGhlYWRlcnMuSG9zdCB8fCBoZWFkZXJzLmhvc3RcblxuICB0aGlzLmlzQ29kZUNvbW1pdEdpdCA9IHRoaXMuc2VydmljZSA9PT0gJ2NvZGVjb21taXQnICYmIHJlcXVlc3QubWV0aG9kID09PSAnR0lUJ1xufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5tYXRjaEhvc3QgPSBmdW5jdGlvbihob3N0KSB7XG4gIHZhciBtYXRjaCA9IChob3N0IHx8ICcnKS5tYXRjaCgvKFteXFwuXSspXFwuKD86KFteXFwuXSopXFwuKT9hbWF6b25hd3NcXC5jb20oXFwuY24pPyQvKVxuICB2YXIgaG9zdFBhcnRzID0gKG1hdGNoIHx8IFtdKS5zbGljZSgxLCAzKVxuXG4gIC8vIEVTJ3MgaG9zdFBhcnRzIGFyZSBzb21ldGltZXMgdGhlIG90aGVyIHdheSByb3VuZCwgaWYgdGhlIHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWRcbiAgLy8gdG8gYmUgcmVnaW9uIGVxdWFscyBcdTIwMThlc1x1MjAxOSBzd2l0Y2ggdGhlbSBiYWNrXG4gIC8vIGUuZy4gc2VhcmNoLWNsdXN0ZXItbmFtZS1hYWFhMDBhYWFhMGFhYTBhYWFhYWFhMGFhYS51cy1lYXN0LTEuZXMuYW1hem9uYXdzLmNvbVxuICBpZiAoaG9zdFBhcnRzWzFdID09PSAnZXMnKVxuICAgIGhvc3RQYXJ0cyA9IGhvc3RQYXJ0cy5yZXZlcnNlKClcblxuICBpZiAoaG9zdFBhcnRzWzFdID09ICdzMycpIHtcbiAgICBob3N0UGFydHNbMF0gPSAnczMnXG4gICAgaG9zdFBhcnRzWzFdID0gJ3VzLWVhc3QtMSdcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgaWYgKC9eczMtLy50ZXN0KGhvc3RQYXJ0c1tpXSkpIHtcbiAgICAgICAgaG9zdFBhcnRzWzFdID0gaG9zdFBhcnRzW2ldLnNsaWNlKDMpXG4gICAgICAgIGhvc3RQYXJ0c1swXSA9ICdzMydcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaG9zdFBhcnRzXG59XG5cbi8vIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dlbmVyYWwvbGF0ZXN0L2dyL3JhbmRlLmh0bWxcblJlcXVlc3RTaWduZXIucHJvdG90eXBlLmlzU2luZ2xlUmVnaW9uID0gZnVuY3Rpb24oKSB7XG4gIC8vIFNwZWNpYWwgY2FzZSBmb3IgUzMgYW5kIFNpbXBsZURCIGluIHVzLWVhc3QtMVxuICBpZiAoWydzMycsICdzZGInXS5pbmRleE9mKHRoaXMuc2VydmljZSkgPj0gMCAmJiB0aGlzLnJlZ2lvbiA9PT0gJ3VzLWVhc3QtMScpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIFsnY2xvdWRmcm9udCcsICdscycsICdyb3V0ZTUzJywgJ2lhbScsICdpbXBvcnRleHBvcnQnLCAnc3RzJ11cbiAgICAuaW5kZXhPZih0aGlzLnNlcnZpY2UpID49IDBcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuY3JlYXRlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVnaW9uID0gdGhpcy5pc1NpbmdsZVJlZ2lvbigpID8gJycgOiAnLicgKyB0aGlzLnJlZ2lvbixcbiAgICAgIHN1YmRvbWFpbiA9IHRoaXMuc2VydmljZSA9PT0gJ3NlcycgPyAnZW1haWwnIDogdGhpcy5zZXJ2aWNlXG4gIHJldHVybiBzdWJkb21haW4gKyByZWdpb24gKyAnLmFtYXpvbmF3cy5jb20nXG59XG5cblJlcXVlc3RTaWduZXIucHJvdG90eXBlLnByZXBhcmVSZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyc2VQYXRoKClcblxuICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCwgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycywgcXVlcnlcblxuICBpZiAocmVxdWVzdC5zaWduUXVlcnkpIHtcblxuICAgIHRoaXMucGFyc2VkUGF0aC5xdWVyeSA9IHF1ZXJ5ID0gdGhpcy5wYXJzZWRQYXRoLnF1ZXJ5IHx8IHt9XG5cbiAgICBpZiAodGhpcy5jcmVkZW50aWFscy5zZXNzaW9uVG9rZW4pXG4gICAgICBxdWVyeVsnWC1BbXotU2VjdXJpdHktVG9rZW4nXSA9IHRoaXMuY3JlZGVudGlhbHMuc2Vzc2lvblRva2VuXG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlID09PSAnczMnICYmICFxdWVyeVsnWC1BbXotRXhwaXJlcyddKVxuICAgICAgcXVlcnlbJ1gtQW16LUV4cGlyZXMnXSA9IDg2NDAwXG5cbiAgICBpZiAocXVlcnlbJ1gtQW16LURhdGUnXSlcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBxdWVyeVsnWC1BbXotRGF0ZSddXG4gICAgZWxzZVxuICAgICAgcXVlcnlbJ1gtQW16LURhdGUnXSA9IHRoaXMuZ2V0RGF0ZVRpbWUoKVxuXG4gICAgcXVlcnlbJ1gtQW16LUFsZ29yaXRobSddID0gJ0FXUzQtSE1BQy1TSEEyNTYnXG4gICAgcXVlcnlbJ1gtQW16LUNyZWRlbnRpYWwnXSA9IHRoaXMuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQgKyAnLycgKyB0aGlzLmNyZWRlbnRpYWxTdHJpbmcoKVxuICAgIHF1ZXJ5WydYLUFtei1TaWduZWRIZWFkZXJzJ10gPSB0aGlzLnNpZ25lZEhlYWRlcnMoKVxuXG4gIH0gZWxzZSB7XG5cbiAgICBpZiAoIXJlcXVlc3QuZG9Ob3RNb2RpZnlIZWFkZXJzICYmICF0aGlzLmlzQ29kZUNvbW1pdEdpdCkge1xuICAgICAgaWYgKHJlcXVlc3QuYm9keSAmJiAhaGVhZGVyc1snQ29udGVudC1UeXBlJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgnXG5cbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkgJiYgIWhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gJiYgIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pXG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LmJvZHkpXG5cbiAgICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLnNlc3Npb25Ub2tlbiAmJiAhaGVhZGVyc1snWC1BbXotU2VjdXJpdHktVG9rZW4nXSAmJiAhaGVhZGVyc1sneC1hbXotc2VjdXJpdHktdG9rZW4nXSlcbiAgICAgICAgaGVhZGVyc1snWC1BbXotU2VjdXJpdHktVG9rZW4nXSA9IHRoaXMuY3JlZGVudGlhbHMuc2Vzc2lvblRva2VuXG5cbiAgICAgIGlmICh0aGlzLnNlcnZpY2UgPT09ICdzMycgJiYgIWhlYWRlcnNbJ1gtQW16LUNvbnRlbnQtU2hhMjU2J10gJiYgIWhlYWRlcnNbJ3gtYW16LWNvbnRlbnQtc2hhMjU2J10pXG4gICAgICAgIGhlYWRlcnNbJ1gtQW16LUNvbnRlbnQtU2hhMjU2J10gPSBoYXNoKHRoaXMucmVxdWVzdC5ib2R5IHx8ICcnLCAnaGV4JylcblxuICAgICAgaWYgKGhlYWRlcnNbJ1gtQW16LURhdGUnXSB8fCBoZWFkZXJzWyd4LWFtei1kYXRlJ10pXG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBoZWFkZXJzWydYLUFtei1EYXRlJ10gfHwgaGVhZGVyc1sneC1hbXotZGF0ZSddXG4gICAgICBlbHNlXG4gICAgICAgIGhlYWRlcnNbJ1gtQW16LURhdGUnXSA9IHRoaXMuZ2V0RGF0ZVRpbWUoKVxuICAgIH1cblxuICAgIGRlbGV0ZSBoZWFkZXJzLkF1dGhvcml6YXRpb25cbiAgICBkZWxldGUgaGVhZGVycy5hdXRob3JpemF0aW9uXG4gIH1cbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMucGFyc2VkUGF0aCkgdGhpcy5wcmVwYXJlUmVxdWVzdCgpXG5cbiAgaWYgKHRoaXMucmVxdWVzdC5zaWduUXVlcnkpIHtcbiAgICB0aGlzLnBhcnNlZFBhdGgucXVlcnlbJ1gtQW16LVNpZ25hdHVyZSddID0gdGhpcy5zaWduYXR1cmUoKVxuICB9IGVsc2Uge1xuICAgIHRoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSB0aGlzLmF1dGhIZWFkZXIoKVxuICB9XG5cbiAgdGhpcy5yZXF1ZXN0LnBhdGggPSB0aGlzLmZvcm1hdFBhdGgoKVxuXG4gIHJldHVybiB0aGlzLnJlcXVlc3Rcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuZ2V0RGF0ZVRpbWUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmRhdGV0aW1lKSB7XG4gICAgdmFyIGhlYWRlcnMgPSB0aGlzLnJlcXVlc3QuaGVhZGVycyxcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShoZWFkZXJzLkRhdGUgfHwgaGVhZGVycy5kYXRlIHx8IG5ldyBEYXRlKVxuXG4gICAgdGhpcy5kYXRldGltZSA9IGRhdGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOlxcLV18XFwuXFxkezN9L2csICcnKVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB0cmFpbGluZyAnWicgb24gdGhlIHRpbWVzdGFtcCBzdHJpbmcgZm9yIENvZGVDb21taXQgZ2l0IGFjY2Vzc1xuICAgIGlmICh0aGlzLmlzQ29kZUNvbW1pdEdpdCkgdGhpcy5kYXRldGltZSA9IHRoaXMuZGF0ZXRpbWUuc2xpY2UoMCwgLTEpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZGF0ZXRpbWVcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuZ2V0RGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5nZXREYXRlVGltZSgpLnN1YnN0cigwLCA4KVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5hdXRoSGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBbXG4gICAgJ0FXUzQtSE1BQy1TSEEyNTYgQ3JlZGVudGlhbD0nICsgdGhpcy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCArICcvJyArIHRoaXMuY3JlZGVudGlhbFN0cmluZygpLFxuICAgICdTaWduZWRIZWFkZXJzPScgKyB0aGlzLnNpZ25lZEhlYWRlcnMoKSxcbiAgICAnU2lnbmF0dXJlPScgKyB0aGlzLnNpZ25hdHVyZSgpLFxuICBdLmpvaW4oJywgJylcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuc2lnbmF0dXJlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBkYXRlID0gdGhpcy5nZXREYXRlKCksXG4gICAgICBjYWNoZUtleSA9IFt0aGlzLmNyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleSwgZGF0ZSwgdGhpcy5yZWdpb24sIHRoaXMuc2VydmljZV0uam9pbigpLFxuICAgICAga0RhdGUsIGtSZWdpb24sIGtTZXJ2aWNlLCBrQ3JlZGVudGlhbHMgPSBjcmVkZW50aWFsc0NhY2hlLmdldChjYWNoZUtleSlcbiAgaWYgKCFrQ3JlZGVudGlhbHMpIHtcbiAgICBrRGF0ZSA9IGhtYWMoJ0FXUzQnICsgdGhpcy5jcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXksIGRhdGUpXG4gICAga1JlZ2lvbiA9IGhtYWMoa0RhdGUsIHRoaXMucmVnaW9uKVxuICAgIGtTZXJ2aWNlID0gaG1hYyhrUmVnaW9uLCB0aGlzLnNlcnZpY2UpXG4gICAga0NyZWRlbnRpYWxzID0gaG1hYyhrU2VydmljZSwgJ2F3czRfcmVxdWVzdCcpXG4gICAgY3JlZGVudGlhbHNDYWNoZS5zZXQoY2FjaGVLZXksIGtDcmVkZW50aWFscylcbiAgfVxuICByZXR1cm4gaG1hYyhrQ3JlZGVudGlhbHMsIHRoaXMuc3RyaW5nVG9TaWduKCksICdoZXgnKVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5zdHJpbmdUb1NpZ24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFtcbiAgICAnQVdTNC1ITUFDLVNIQTI1NicsXG4gICAgdGhpcy5nZXREYXRlVGltZSgpLFxuICAgIHRoaXMuY3JlZGVudGlhbFN0cmluZygpLFxuICAgIGhhc2godGhpcy5jYW5vbmljYWxTdHJpbmcoKSwgJ2hleCcpLFxuICBdLmpvaW4oJ1xcbicpXG59XG5cblJlcXVlc3RTaWduZXIucHJvdG90eXBlLmNhbm9uaWNhbFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMucGFyc2VkUGF0aCkgdGhpcy5wcmVwYXJlUmVxdWVzdCgpXG5cbiAgdmFyIHBhdGhTdHIgPSB0aGlzLnBhcnNlZFBhdGgucGF0aCxcbiAgICAgIHF1ZXJ5ID0gdGhpcy5wYXJzZWRQYXRoLnF1ZXJ5LFxuICAgICAgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgcXVlcnlTdHIgPSAnJyxcbiAgICAgIG5vcm1hbGl6ZVBhdGggPSB0aGlzLnNlcnZpY2UgIT09ICdzMycsXG4gICAgICBkZWNvZGVQYXRoID0gdGhpcy5zZXJ2aWNlID09PSAnczMnIHx8IHRoaXMucmVxdWVzdC5kb05vdEVuY29kZVBhdGgsXG4gICAgICBkZWNvZGVTbGFzaGVzSW5QYXRoID0gdGhpcy5zZXJ2aWNlID09PSAnczMnLFxuICAgICAgZmlyc3RWYWxPbmx5ID0gdGhpcy5zZXJ2aWNlID09PSAnczMnLFxuICAgICAgYm9keUhhc2hcblxuICBpZiAodGhpcy5zZXJ2aWNlID09PSAnczMnICYmIHRoaXMucmVxdWVzdC5zaWduUXVlcnkpIHtcbiAgICBib2R5SGFzaCA9ICdVTlNJR05FRC1QQVlMT0FEJ1xuICB9IGVsc2UgaWYgKHRoaXMuaXNDb2RlQ29tbWl0R2l0KSB7XG4gICAgYm9keUhhc2ggPSAnJ1xuICB9IGVsc2Uge1xuICAgIGJvZHlIYXNoID0gaGVhZGVyc1snWC1BbXotQ29udGVudC1TaGEyNTYnXSB8fCBoZWFkZXJzWyd4LWFtei1jb250ZW50LXNoYTI1NiddIHx8XG4gICAgICBoYXNoKHRoaXMucmVxdWVzdC5ib2R5IHx8ICcnLCAnaGV4JylcbiAgfVxuXG4gIGlmIChxdWVyeSkge1xuICAgIHZhciByZWR1Y2VkUXVlcnkgPSBPYmplY3Qua2V5cyhxdWVyeSkucmVkdWNlKGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgICBpZiAoIWtleSkgcmV0dXJuIG9ialxuICAgICAgb2JqW2VuY29kZVJmYzM5ODZGdWxsKGtleSldID0gIUFycmF5LmlzQXJyYXkocXVlcnlba2V5XSkgPyBxdWVyeVtrZXldIDpcbiAgICAgICAgKGZpcnN0VmFsT25seSA/IHF1ZXJ5W2tleV1bMF0gOiBxdWVyeVtrZXldKVxuICAgICAgcmV0dXJuIG9ialxuICAgIH0sIHt9KVxuICAgIHZhciBlbmNvZGVkUXVlcnlQaWVjZXMgPSBbXVxuICAgIE9iamVjdC5rZXlzKHJlZHVjZWRRdWVyeSkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVkdWNlZFF1ZXJ5W2tleV0pKSB7XG4gICAgICAgIGVuY29kZWRRdWVyeVBpZWNlcy5wdXNoKGtleSArICc9JyArIGVuY29kZVJmYzM5ODZGdWxsKHJlZHVjZWRRdWVyeVtrZXldKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZHVjZWRRdWVyeVtrZXldLm1hcChlbmNvZGVSZmMzOTg2RnVsbCkuc29ydCgpXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24odmFsKSB7IGVuY29kZWRRdWVyeVBpZWNlcy5wdXNoKGtleSArICc9JyArIHZhbCkgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHF1ZXJ5U3RyID0gZW5jb2RlZFF1ZXJ5UGllY2VzLmpvaW4oJyYnKVxuICB9XG4gIGlmIChwYXRoU3RyICE9PSAnLycpIHtcbiAgICBpZiAobm9ybWFsaXplUGF0aCkgcGF0aFN0ciA9IHBhdGhTdHIucmVwbGFjZSgvXFwvezIsfS9nLCAnLycpXG4gICAgcGF0aFN0ciA9IHBhdGhTdHIuc3BsaXQoJy8nKS5yZWR1Y2UoZnVuY3Rpb24ocGF0aCwgcGllY2UpIHtcbiAgICAgIGlmIChub3JtYWxpemVQYXRoICYmIHBpZWNlID09PSAnLi4nKSB7XG4gICAgICAgIHBhdGgucG9wKClcbiAgICAgIH0gZWxzZSBpZiAoIW5vcm1hbGl6ZVBhdGggfHwgcGllY2UgIT09ICcuJykge1xuICAgICAgICBpZiAoZGVjb2RlUGF0aCkgcGllY2UgPSBkZWNvZGVVUklDb21wb25lbnQocGllY2UucmVwbGFjZSgvXFwrL2csICcgJykpXG4gICAgICAgIHBhdGgucHVzaChlbmNvZGVSZmMzOTg2RnVsbChwaWVjZSkpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0sIFtdKS5qb2luKCcvJylcbiAgICBpZiAocGF0aFN0clswXSAhPT0gJy8nKSBwYXRoU3RyID0gJy8nICsgcGF0aFN0clxuICAgIGlmIChkZWNvZGVTbGFzaGVzSW5QYXRoKSBwYXRoU3RyID0gcGF0aFN0ci5yZXBsYWNlKC8lMkYvZywgJy8nKVxuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB0aGlzLnJlcXVlc3QubWV0aG9kIHx8ICdHRVQnLFxuICAgIHBhdGhTdHIsXG4gICAgcXVlcnlTdHIsXG4gICAgdGhpcy5jYW5vbmljYWxIZWFkZXJzKCkgKyAnXFxuJyxcbiAgICB0aGlzLnNpZ25lZEhlYWRlcnMoKSxcbiAgICBib2R5SGFzaCxcbiAgXS5qb2luKCdcXG4nKVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5jYW5vbmljYWxIZWFkZXJzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBoZWFkZXJzID0gdGhpcy5yZXF1ZXN0LmhlYWRlcnNcbiAgZnVuY3Rpb24gdHJpbUFsbChoZWFkZXIpIHtcbiAgICByZXR1cm4gaGVhZGVyLnRvU3RyaW5nKCkudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBIRUFERVJTX1RPX0lHTk9SRVtrZXkudG9Mb3dlckNhc2UoKV0gPT0gbnVsbCB9KVxuICAgIC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEudG9Mb3dlckNhc2UoKSA8IGIudG9Mb3dlckNhc2UoKSA/IC0xIDogMSB9KVxuICAgIC5tYXAoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBrZXkudG9Mb3dlckNhc2UoKSArICc6JyArIHRyaW1BbGwoaGVhZGVyc1trZXldKSB9KVxuICAgIC5qb2luKCdcXG4nKVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5zaWduZWRIZWFkZXJzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlcXVlc3QuaGVhZGVycylcbiAgICAubWFwKGZ1bmN0aW9uKGtleSkgeyByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkgfSlcbiAgICAuZmlsdGVyKGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gSEVBREVSU19UT19JR05PUkVba2V5XSA9PSBudWxsIH0pXG4gICAgLnNvcnQoKVxuICAgIC5qb2luKCc7Jylcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuY3JlZGVudGlhbFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gW1xuICAgIHRoaXMuZ2V0RGF0ZSgpLFxuICAgIHRoaXMucmVnaW9uLFxuICAgIHRoaXMuc2VydmljZSxcbiAgICAnYXdzNF9yZXF1ZXN0JyxcbiAgXS5qb2luKCcvJylcbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUuZGVmYXVsdENyZWRlbnRpYWxzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBlbnYgPSBwcm9jZXNzLmVudlxuICByZXR1cm4ge1xuICAgIGFjY2Vzc0tleUlkOiBlbnYuQVdTX0FDQ0VTU19LRVlfSUQgfHwgZW52LkFXU19BQ0NFU1NfS0VZLFxuICAgIHNlY3JldEFjY2Vzc0tleTogZW52LkFXU19TRUNSRVRfQUNDRVNTX0tFWSB8fCBlbnYuQVdTX1NFQ1JFVF9LRVksXG4gICAgc2Vzc2lvblRva2VuOiBlbnYuQVdTX1NFU1NJT05fVE9LRU4sXG4gIH1cbn1cblxuUmVxdWVzdFNpZ25lci5wcm90b3R5cGUucGFyc2VQYXRoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGggfHwgJy8nXG5cbiAgLy8gUzMgZG9lc24ndCBhbHdheXMgZW5jb2RlIGNoYXJhY3RlcnMgPiAxMjcgY29ycmVjdGx5IGFuZFxuICAvLyBhbGwgc2VydmljZXMgZG9uJ3QgZW5jb2RlIGNoYXJhY3RlcnMgPiAyNTUgY29ycmVjdGx5XG4gIC8vIFNvIGlmIHRoZXJlIGFyZSBub24tcmVzZXJ2ZWQgY2hhcnMgKGFuZCBpdCdzIG5vdCBhbHJlYWR5IGFsbCAlIGVuY29kZWQpLCBqdXN0IGVuY29kZSB0aGVtIGFsbFxuICBpZiAoL1teMC05QS1aYS16OywvPzpAJj0rJFxcLV8uIX4qJygpIyVdLy50ZXN0KHBhdGgpKSB7XG4gICAgcGF0aCA9IGVuY29kZVVSSShkZWNvZGVVUkkocGF0aCkpXG4gIH1cblxuICB2YXIgcXVlcnlJeCA9IHBhdGguaW5kZXhPZignPycpLFxuICAgICAgcXVlcnkgPSBudWxsXG5cbiAgaWYgKHF1ZXJ5SXggPj0gMCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UocGF0aC5zbGljZShxdWVyeUl4ICsgMSkpXG4gICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgcXVlcnlJeClcbiAgfVxuXG4gIHRoaXMucGFyc2VkUGF0aCA9IHtcbiAgICBwYXRoOiBwYXRoLFxuICAgIHF1ZXJ5OiBxdWVyeSxcbiAgfVxufVxuXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5mb3JtYXRQYXRoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRoID0gdGhpcy5wYXJzZWRQYXRoLnBhdGgsXG4gICAgICBxdWVyeSA9IHRoaXMucGFyc2VkUGF0aC5xdWVyeVxuXG4gIGlmICghcXVlcnkpIHJldHVybiBwYXRoXG5cbiAgLy8gU2VydmljZXMgZG9uJ3Qgc3VwcG9ydCBlbXB0eSBxdWVyeSBzdHJpbmcga2V5c1xuICBpZiAocXVlcnlbJyddICE9IG51bGwpIGRlbGV0ZSBxdWVyeVsnJ11cblxuICByZXR1cm4gcGF0aCArICc/JyArIGVuY29kZVJmYzM5ODYocXVlcnlzdHJpbmcuc3RyaW5naWZ5KHF1ZXJ5KSlcbn1cblxuYXdzNC5SZXF1ZXN0U2lnbmVyID0gUmVxdWVzdFNpZ25lclxuXG5hd3M0LnNpZ24gPSBmdW5jdGlvbihyZXF1ZXN0LCBjcmVkZW50aWFscykge1xuICByZXR1cm4gbmV3IFJlcXVlc3RTaWduZXIocmVxdWVzdCwgY3JlZGVudGlhbHMpLnNpZ24oKVxufVxuIiwgIi8vIENvcHlyaWdodCAoYykgMjAxMiwgTWFyayBDYXZhZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5cbi8vLy0tLSBHbG9iYWxzXG5cbi8qIEpTU1RZTEVEICovXG52YXIgVVVJRF9SRUdFWFAgPSAvXlthLWZBLUYwLTldezh9LVthLWZBLUYwLTldezR9LVthLWZBLUYwLTldezR9LVthLWZBLUYwLTldezR9LVthLWZBLUYwLTldezEyfSQvO1xuXG5cbi8vLy0tLSBJbnRlcm5hbFxuXG5mdW5jdGlvbiBfY2FwaXRhbGl6ZShzdHIpIHtcbiAgICByZXR1cm4gKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSk7XG59XG5cbmZ1bmN0aW9uIF90b3NzKG5hbWUsIGV4cGVjdGVkLCBvcGVyLCBhcmcsIGFjdHVhbCkge1xuICAgIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlOiB1dGlsLmZvcm1hdCgnJXMgKCVzKSBpcyByZXF1aXJlZCcsIG5hbWUsIGV4cGVjdGVkKSxcbiAgICAgICAgYWN0dWFsOiAoYWN0dWFsID09PSB1bmRlZmluZWQpID8gdHlwZW9mIChhcmcpIDogYWN0dWFsKGFyZyksXG4gICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCxcbiAgICAgICAgb3BlcmF0b3I6IG9wZXIgfHwgJz09PScsXG4gICAgICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogX3Rvc3MuY2FsbGVyXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9nZXRDbGFzcyhhcmcpIHtcbiAgICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKSk7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgLy8gV2h5IGV2ZW4gYm90aGVyIHdpdGggYXNzZXJ0cz9cbn1cblxuXG4vLy8tLS0gRXhwb3J0c1xuXG52YXIgdHlwZXMgPSB7XG4gICAgYm9vbDoge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gdHlwZW9mIChhcmcpID09PSAnYm9vbGVhbic7IH1cbiAgICB9LFxuICAgIGZ1bmM6IHtcbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHR5cGVvZiAoYXJnKSA9PT0gJ2Z1bmN0aW9uJzsgfVxuICAgIH0sXG4gICAgc3RyaW5nOiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiB0eXBlb2YgKGFyZykgPT09ICdzdHJpbmcnOyB9XG4gICAgfSxcbiAgICBvYmplY3Q6IHtcbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgKGFyZykgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbnVtYmVyOiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIChhcmcpID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oYXJnKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZmluaXRlOiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIChhcmcpID09PSAnbnVtYmVyJyAmJiAhaXNOYU4oYXJnKSAmJiBpc0Zpbml0ZShhcmcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBidWZmZXI6IHtcbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihhcmcpOyB9LFxuICAgICAgICBvcGVyYXRvcjogJ0J1ZmZlci5pc0J1ZmZlcidcbiAgICB9LFxuICAgIGFycmF5OiB7XG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7IH0sXG4gICAgICAgIG9wZXJhdG9yOiAnQXJyYXkuaXNBcnJheSdcbiAgICB9LFxuICAgIHN0cmVhbToge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gYXJnIGluc3RhbmNlb2YgU3RyZWFtOyB9LFxuICAgICAgICBvcGVyYXRvcjogJ2luc3RhbmNlb2YnLFxuICAgICAgICBhY3R1YWw6IF9nZXRDbGFzc1xuICAgIH0sXG4gICAgZGF0ZToge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gYXJnIGluc3RhbmNlb2YgRGF0ZTsgfSxcbiAgICAgICAgb3BlcmF0b3I6ICdpbnN0YW5jZW9mJyxcbiAgICAgICAgYWN0dWFsOiBfZ2V0Q2xhc3NcbiAgICB9LFxuICAgIHJlZ2V4cDoge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gYXJnIGluc3RhbmNlb2YgUmVnRXhwOyB9LFxuICAgICAgICBvcGVyYXRvcjogJ2luc3RhbmNlb2YnLFxuICAgICAgICBhY3R1YWw6IF9nZXRDbGFzc1xuICAgIH0sXG4gICAgdXVpZDoge1xuICAgICAgICBjaGVjazogZnVuY3Rpb24gKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiAoYXJnKSA9PT0gJ3N0cmluZycgJiYgVVVJRF9SRUdFWFAudGVzdChhcmcpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRvcjogJ2lzVVVJRCdcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBfc2V0RXhwb3J0cyhuZGVidWcpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR5cGVzKTtcbiAgICB2YXIgb3V0O1xuXG4gICAgLyogcmUtZXhwb3J0IHN0YW5kYXJkIGFzc2VydCAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX05ERUJVRykge1xuICAgICAgICBvdXQgPSBub29wO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IGZ1bmN0aW9uIChhcmcsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgICAgICBfdG9zcyhtc2csICd0cnVlJywgYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBzdGFuZGFyZCBjaGVja3MgKi9cbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgaWYgKG5kZWJ1Zykge1xuICAgICAgICAgICAgb3V0W2tdID0gbm9vcDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2tdO1xuICAgICAgICBvdXRba10gPSBmdW5jdGlvbiAoYXJnLCBtc2cpIHtcbiAgICAgICAgICAgIGlmICghdHlwZS5jaGVjayhhcmcpKSB7XG4gICAgICAgICAgICAgICAgX3Rvc3MobXNnLCBrLCB0eXBlLm9wZXJhdG9yLCBhcmcsIHR5cGUuYWN0dWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qIG9wdGlvbmFsIGNoZWNrcyAqL1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICB2YXIgbmFtZSA9ICdvcHRpb25hbCcgKyBfY2FwaXRhbGl6ZShrKTtcbiAgICAgICAgaWYgKG5kZWJ1Zykge1xuICAgICAgICAgICAgb3V0W25hbWVdID0gbm9vcDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2tdO1xuICAgICAgICBvdXRbbmFtZV0gPSBmdW5jdGlvbiAoYXJnLCBtc2cpIHtcbiAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXR5cGUuY2hlY2soYXJnKSkge1xuICAgICAgICAgICAgICAgIF90b3NzKG1zZywgaywgdHlwZS5vcGVyYXRvciwgYXJnLCB0eXBlLmFjdHVhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiBhcnJheU9mIGNoZWNrcyAqL1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICB2YXIgbmFtZSA9ICdhcnJheU9mJyArIF9jYXBpdGFsaXplKGspO1xuICAgICAgICBpZiAobmRlYnVnKSB7XG4gICAgICAgICAgICBvdXRbbmFtZV0gPSBub29wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNba107XG4gICAgICAgIHZhciBleHBlY3RlZCA9ICdbJyArIGsgKyAnXSc7XG4gICAgICAgIG91dFtuYW1lXSA9IGZ1bmN0aW9uIChhcmcsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgICAgICAgICBfdG9zcyhtc2csIGV4cGVjdGVkLCB0eXBlLm9wZXJhdG9yLCBhcmcsIHR5cGUuYWN0dWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdHlwZS5jaGVjayhhcmdbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIF90b3NzKG1zZywgZXhwZWN0ZWQsIHR5cGUub3BlcmF0b3IsIGFyZywgdHlwZS5hY3R1YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qIG9wdGlvbmFsQXJyYXlPZiBjaGVja3MgKi9cbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgdmFyIG5hbWUgPSAnb3B0aW9uYWxBcnJheU9mJyArIF9jYXBpdGFsaXplKGspO1xuICAgICAgICBpZiAobmRlYnVnKSB7XG4gICAgICAgICAgICBvdXRbbmFtZV0gPSBub29wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNba107XG4gICAgICAgIHZhciBleHBlY3RlZCA9ICdbJyArIGsgKyAnXSc7XG4gICAgICAgIG91dFtuYW1lXSA9IGZ1bmN0aW9uIChhcmcsIG1zZykge1xuICAgICAgICAgICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8IGFyZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgICAgICAgX3Rvc3MobXNnLCBleHBlY3RlZCwgdHlwZS5vcGVyYXRvciwgYXJnLCB0eXBlLmFjdHVhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuY2hlY2soYXJnW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBfdG9zcyhtc2csIGV4cGVjdGVkLCB0eXBlLm9wZXJhdG9yLCBhcmcsIHR5cGUuYWN0dWFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKiByZS1leHBvcnQgYnVpbHQtaW4gYXNzZXJ0aW9ucyAqL1xuICAgIE9iamVjdC5rZXlzKGFzc2VydCkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICBpZiAoayA9PT0gJ0Fzc2VydGlvbkVycm9yJykge1xuICAgICAgICAgICAgb3V0W2tdID0gYXNzZXJ0W2tdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZGVidWcpIHtcbiAgICAgICAgICAgIG91dFtrXSA9IG5vb3A7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3V0W2tdID0gYXNzZXJ0W2tdO1xuICAgIH0pO1xuXG4gICAgLyogZXhwb3J0IG91cnNlbHZlcyAoZm9yIHVuaXQgdGVzdHMgX29ubHlfKSAqL1xuICAgIG91dC5fc2V0RXhwb3J0cyA9IF9zZXRFeHBvcnRzO1xuXG4gICAgcmV0dXJuIG91dDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2V0RXhwb3J0cyhwcm9jZXNzLmVudi5OT0RFX05ERUJVRyk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG52YXIgc2FmZXIgPSB7fVxuXG52YXIga2V5XG5cbmZvciAoa2V5IGluIGJ1ZmZlcikge1xuICBpZiAoIWJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnU2xvd0J1ZmZlcicgfHwga2V5ID09PSAnQnVmZmVyJykgY29udGludWVcbiAgc2FmZXJba2V5XSA9IGJ1ZmZlcltrZXldXG59XG5cbnZhciBTYWZlciA9IHNhZmVyLkJ1ZmZlciA9IHt9XG5mb3IgKGtleSBpbiBCdWZmZXIpIHtcbiAgaWYgKCFCdWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ2FsbG9jVW5zYWZlJyB8fCBrZXkgPT09ICdhbGxvY1Vuc2FmZVNsb3cnKSBjb250aW51ZVxuICBTYWZlcltrZXldID0gQnVmZmVyW2tleV1cbn1cblxuc2FmZXIuQnVmZmVyLnByb3RvdHlwZSA9IEJ1ZmZlci5wcm90b3R5cGVcblxuaWYgKCFTYWZlci5mcm9tIHx8IFNhZmVyLmZyb20gPT09IFVpbnQ4QXJyYXkuZnJvbSkge1xuICBTYWZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxufVxuXG5pZiAoIVNhZmVyLmFsbG9jKSB7XG4gIFNhZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzaXplKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSAyICogKDEgPDwgMzApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICAgIGlmICghZmlsbCB8fCBmaWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnVmLmZpbGwoMClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gYnVmXG4gIH1cbn1cblxuaWYgKCFzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gIHRyeSB7XG4gICAgc2FmZXIua1N0cmluZ01heExlbmd0aCA9IHByb2Nlc3MuYmluZGluZygnYnVmZmVyJykua1N0cmluZ01heExlbmd0aFxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gd2UgY2FuJ3QgZGV0ZXJtaW5lIGtTdHJpbmdNYXhMZW5ndGggaW4gZW52aXJvbm1lbnRzIHdoZXJlIHByb2Nlc3MuYmluZGluZ1xuICAgIC8vIGlzIHVuc3VwcG9ydGVkLCBzbyBsZXQncyBub3Qgc2V0IGl0XG4gIH1cbn1cblxuaWYgKCFzYWZlci5jb25zdGFudHMpIHtcbiAgc2FmZXIuY29uc3RhbnRzID0ge1xuICAgIE1BWF9MRU5HVEg6IHNhZmVyLmtNYXhMZW5ndGhcbiAgfVxuICBpZiAoc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICAgIHNhZmVyLmNvbnN0YW50cy5NQVhfU1RSSU5HX0xFTkdUSCA9IHNhZmVyLmtTdHJpbmdNYXhMZW5ndGhcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVyXG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbnZhciBhbGdJbmZvID0ge1xuXHQnZHNhJzoge1xuXHRcdHBhcnRzOiBbJ3AnLCAncScsICdnJywgJ3knXSxcblx0XHRzaXplUGFydDogJ3AnXG5cdH0sXG5cdCdyc2EnOiB7XG5cdFx0cGFydHM6IFsnZScsICduJ10sXG5cdFx0c2l6ZVBhcnQ6ICduJ1xuXHR9LFxuXHQnZWNkc2EnOiB7XG5cdFx0cGFydHM6IFsnY3VydmUnLCAnUSddLFxuXHRcdHNpemVQYXJ0OiAnUSdcblx0fSxcblx0J2VkMjU1MTknOiB7XG5cdFx0cGFydHM6IFsnQSddLFxuXHRcdHNpemVQYXJ0OiAnQSdcblx0fVxufTtcbmFsZ0luZm9bJ2N1cnZlMjU1MTknXSA9IGFsZ0luZm9bJ2VkMjU1MTknXTtcblxudmFyIGFsZ1ByaXZJbmZvID0ge1xuXHQnZHNhJzoge1xuXHRcdHBhcnRzOiBbJ3AnLCAncScsICdnJywgJ3knLCAneCddXG5cdH0sXG5cdCdyc2EnOiB7XG5cdFx0cGFydHM6IFsnbicsICdlJywgJ2QnLCAnaXFtcCcsICdwJywgJ3EnXVxuXHR9LFxuXHQnZWNkc2EnOiB7XG5cdFx0cGFydHM6IFsnY3VydmUnLCAnUScsICdkJ11cblx0fSxcblx0J2VkMjU1MTknOiB7XG5cdFx0cGFydHM6IFsnQScsICdrJ11cblx0fVxufTtcbmFsZ1ByaXZJbmZvWydjdXJ2ZTI1NTE5J10gPSBhbGdQcml2SW5mb1snZWQyNTUxOSddO1xuXG52YXIgaGFzaEFsZ3MgPSB7XG5cdCdtZDUnOiB0cnVlLFxuXHQnc2hhMSc6IHRydWUsXG5cdCdzaGEyNTYnOiB0cnVlLFxuXHQnc2hhMzg0JzogdHJ1ZSxcblx0J3NoYTUxMic6IHRydWVcbn07XG5cbi8qXG4gKiBUYWtlbiBmcm9tXG4gKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9ncm91cHMvU1QvdG9vbGtpdC9kb2N1bWVudHMvZHNzL05JU1RSZUN1ci5wZGZcbiAqL1xudmFyIGN1cnZlcyA9IHtcblx0J25pc3RwMjU2Jzoge1xuXHRcdHNpemU6IDI1Nixcblx0XHRwa2NzOG9pZDogJzEuMi44NDAuMTAwNDUuMy4xLjcnLFxuXHRcdHA6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwJyArXG5cdFx0ICAgICcwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGE6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ0ZGRkZGRkZGIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwJyArXG5cdFx0ICAgICcwMDAwMDAwMCBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGQycpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGI6IEJ1ZmZlci5mcm9tKChcblx0XHQgICAgJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjJyArXG5cdFx0ICAgICc2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdHM6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ2M0OWQzNjA4IDg2ZTcwNDkzIDZhNjY3OGUxIDEzOWQyNmI3JyArXG5cdFx0ICAgICc4MTlmN2U5MCcpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdG46IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmJyArXG5cdFx0ICAgICdiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdEc6IEJ1ZmZlci5mcm9tKCgnMDQnICtcblx0XHQgICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyJyArXG5cdFx0ICAgICc3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicgK1xuXHRcdCAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYnICtcblx0XHQgICAgJzJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1JykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4Jylcblx0fSxcblx0J25pc3RwMzg0Jzoge1xuXHRcdHNpemU6IDM4NCxcblx0XHRwa2NzOG9pZDogJzEuMy4xMzIuMC4zNCcsXG5cdFx0cDogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyArXG5cdFx0ICAgICdmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZicpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGE6IEJ1ZmZlci5mcm9tKCgnMDAnICtcblx0XHQgICAgJ0ZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGJyArXG5cdFx0ICAgICdGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRScgK1xuXHRcdCAgICAnRkZGRkZGRkYgMDAwMDAwMDAgMDAwMDAwMDAgRkZGRkZGRkMnKS5cblx0XHQgICAgcmVwbGFjZSgvIC9nLCAnJyksICdoZXgnKSxcblx0XHRiOiBCdWZmZXIuZnJvbSgoXG5cdFx0ICAgICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOScgK1xuXHRcdCAgICAnMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgNTAxMzg3NWEnICtcblx0XHQgICAgJ2M2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0czogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnYTMzNTkyNmEgYTMxOWEyN2EgMWQwMDg5NmEgNjc3M2E0ODInICtcblx0XHQgICAgJzdhY2RhYzczJykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0bjogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxIGY0MzcyZGRmJyArXG5cdFx0ICAgICc1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3MycpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdEc6IEJ1ZmZlci5mcm9tKCgnMDQnICtcblx0XHQgICAgJ2FhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0JyArXG5cdFx0ICAgICc2ZTFkM2I2MiA4YmE3OWI5OCA1OWY3NDFlMCA4MjU0MmEzOCcgK1xuXHRcdCAgICAnNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjcnICtcblx0XHQgICAgJzM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5JyArXG5cdFx0ICAgICdmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCcgK1xuXHRcdCAgICAnMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYnKS5cblx0XHQgICAgcmVwbGFjZSgvIC9nLCAnJyksICdoZXgnKVxuXHR9LFxuXHQnbmlzdHA1MjEnOiB7XG5cdFx0c2l6ZTogNTIxLFxuXHRcdHBrY3M4b2lkOiAnMS4zLjEzMi4wLjM1Jyxcblx0XHRwOiBCdWZmZXIuZnJvbSgoXG5cdFx0ICAgICcwMWZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicgK1xuXHRcdCAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyArXG5cdFx0ICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicgK1xuXHRcdCAgICAnZmZmZicpLnJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0YTogQnVmZmVyLmZyb20oKCcwMUZGJyArXG5cdFx0ICAgICdGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRicgK1xuXHRcdCAgICAnRkZGRkZGRkYgRkZGRkZGRkYgRkZGRkZGRkYgRkZGRkZGRkYnICtcblx0XHQgICAgJ0ZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGIEZGRkZGRkZGJyArXG5cdFx0ICAgICdGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGRiBGRkZGRkZGQycpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpLFxuXHRcdGI6IEJ1ZmZlci5mcm9tKCgnNTEnICtcblx0XHQgICAgJzk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlJyArXG5cdFx0ICAgICdhMmRhNzI1YiA5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMScgK1xuXHRcdCAgICAnNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgM2JiMWJmMDcnICtcblx0XHQgICAgJzM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwJykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0czogQnVmZmVyLmZyb20oKCcwMCcgK1xuXHRcdCAgICAnZDA5ZTg4MDAgMjkxY2I4NTMgOTZjYzY3MTcgMzkzMjg0YWEnICtcblx0XHQgICAgJ2EwZGE2NGJhJykucmVwbGFjZSgvIC9nLCAnJyksICdoZXgnKSxcblx0XHRuOiBCdWZmZXIuZnJvbSgoJzAxZmYnICtcblx0XHQgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyArXG5cdFx0ICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYScgK1xuXHRcdCAgICAnNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggZjcwOWE1ZDAnICtcblx0XHQgICAgJzNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5JykuXG5cdFx0ICAgIHJlcGxhY2UoLyAvZywgJycpLCAnaGV4JyksXG5cdFx0RzogQnVmZmVyLmZyb20oKCcwNCcgK1xuXHRcdCAgICAnMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MicgK1xuXHRcdCAgICAgICAgICc5YzY0ODEzOSAwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYScgK1xuXHRcdCAgICAgICAgICdhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyBhMmZmYThkZScgK1xuXHRcdCAgICAgICAgICczMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicgK1xuXHRcdCAgICAnMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOScgK1xuXHRcdCAgICAgICAgICc5OGY1NDQ0OSA1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYycgK1xuXHRcdCAgICAgICAgICc5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAzZmFkMDc2MScgK1xuXHRcdCAgICAgICAgICczNTNjNzA4NiBhMjcyYzI0MCA4OGJlOTQ3NiA5ZmQxNjY1MCcpLlxuXHRcdCAgICByZXBsYWNlKC8gL2csICcnKSwgJ2hleCcpXG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRpbmZvOiBhbGdJbmZvLFxuXHRwcml2SW5mbzogYWxnUHJpdkluZm8sXG5cdGhhc2hBbGdzOiBoYXNoQWxncyxcblx0Y3VydmVzOiBjdXJ2ZXNcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnAsIGZvcm1hdCkge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRmluZ2VycHJpbnRGb3JtYXRFcnJvcik7XG5cdHRoaXMubmFtZSA9ICdGaW5nZXJwcmludEZvcm1hdEVycm9yJztcblx0dGhpcy5maW5nZXJwcmludCA9IGZwO1xuXHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblx0dGhpcy5tZXNzYWdlID0gJ0ZpbmdlcnByaW50IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLCBvciBpcyBpbnZhbGlkOiAnO1xuXHRpZiAoZnAgIT09IHVuZGVmaW5lZClcblx0XHR0aGlzLm1lc3NhZ2UgKz0gJyBmaW5nZXJwcmludCA9ICcgKyBmcDtcblx0aWYgKGZvcm1hdCAhPT0gdW5kZWZpbmVkKVxuXHRcdHRoaXMubWVzc2FnZSArPSAnIGZvcm1hdCA9ICcgKyBmb3JtYXQ7XG59XG51dGlsLmluaGVyaXRzKEZpbmdlcnByaW50Rm9ybWF0RXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gSW52YWxpZEFsZ29yaXRobUVycm9yKGFsZykge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZEFsZ29yaXRobUVycm9yKTtcblx0dGhpcy5uYW1lID0gJ0ludmFsaWRBbGdvcml0aG1FcnJvcic7XG5cdHRoaXMuYWxnb3JpdGhtID0gYWxnO1xuXHR0aGlzLm1lc3NhZ2UgPSAnQWxnb3JpdGhtIFwiJyArIGFsZyArICdcIiBpcyBub3Qgc3VwcG9ydGVkJztcbn1cbnV0aWwuaW5oZXJpdHMoSW52YWxpZEFsZ29yaXRobUVycm9yLCBFcnJvcik7XG5cbmZ1bmN0aW9uIEtleVBhcnNlRXJyb3IobmFtZSwgZm9ybWF0LCBpbm5lckVycikge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgS2V5UGFyc2VFcnJvcik7XG5cdHRoaXMubmFtZSA9ICdLZXlQYXJzZUVycm9yJztcblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG5cdHRoaXMua2V5TmFtZSA9IG5hbWU7XG5cdHRoaXMuaW5uZXJFcnIgPSBpbm5lckVycjtcblx0dGhpcy5tZXNzYWdlID0gJ0ZhaWxlZCB0byBwYXJzZSAnICsgbmFtZSArICcgYXMgYSB2YWxpZCAnICsgZm9ybWF0ICtcblx0ICAgICcgZm9ybWF0IGtleTogJyArIGlubmVyRXJyLm1lc3NhZ2U7XG59XG51dGlsLmluaGVyaXRzKEtleVBhcnNlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gU2lnbmF0dXJlUGFyc2VFcnJvcih0eXBlLCBmb3JtYXQsIGlubmVyRXJyKSB7XG5cdGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTaWduYXR1cmVQYXJzZUVycm9yKTtcblx0dGhpcy5uYW1lID0gJ1NpZ25hdHVyZVBhcnNlRXJyb3InO1xuXHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblx0dGhpcy5pbm5lckVyciA9IGlubmVyRXJyO1xuXHR0aGlzLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHBhcnNlIHRoZSBnaXZlbiBkYXRhIGFzIGEgJyArIHR5cGUgK1xuXHQgICAgJyBzaWduYXR1cmUgaW4gJyArIGZvcm1hdCArICcgZm9ybWF0OiAnICsgaW5uZXJFcnIubWVzc2FnZTtcbn1cbnV0aWwuaW5oZXJpdHMoU2lnbmF0dXJlUGFyc2VFcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiBDZXJ0aWZpY2F0ZVBhcnNlRXJyb3IobmFtZSwgZm9ybWF0LCBpbm5lckVycikge1xuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG5cdFx0RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgQ2VydGlmaWNhdGVQYXJzZUVycm9yKTtcblx0dGhpcy5uYW1lID0gJ0NlcnRpZmljYXRlUGFyc2VFcnJvcic7XG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuXHR0aGlzLmNlcnROYW1lID0gbmFtZTtcblx0dGhpcy5pbm5lckVyciA9IGlubmVyRXJyO1xuXHR0aGlzLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIHBhcnNlICcgKyBuYW1lICsgJyBhcyBhIHZhbGlkICcgKyBmb3JtYXQgK1xuXHQgICAgJyBmb3JtYXQgY2VydGlmaWNhdGU6ICcgKyBpbm5lckVyci5tZXNzYWdlO1xufVxudXRpbC5pbmhlcml0cyhDZXJ0aWZpY2F0ZVBhcnNlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gS2V5RW5jcnlwdGVkRXJyb3IobmFtZSwgZm9ybWF0KSB7XG5cdGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBLZXlFbmNyeXB0ZWRFcnJvcik7XG5cdHRoaXMubmFtZSA9ICdLZXlFbmNyeXB0ZWRFcnJvcic7XG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuXHR0aGlzLmtleU5hbWUgPSBuYW1lO1xuXHR0aGlzLm1lc3NhZ2UgPSAnVGhlICcgKyBmb3JtYXQgKyAnIGZvcm1hdCBrZXkgJyArIG5hbWUgKyAnIGlzICcgK1xuXHQgICAgJ2VuY3J5cHRlZCAocGFzc3dvcmQtcHJvdGVjdGVkKSwgYW5kIG5vIHBhc3NwaHJhc2Ugd2FzICcgK1xuXHQgICAgJ3Byb3ZpZGVkIGluIGBvcHRpb25zYCc7XG59XG51dGlsLmluaGVyaXRzKEtleUVuY3J5cHRlZEVycm9yLCBFcnJvcik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRGaW5nZXJwcmludEZvcm1hdEVycm9yOiBGaW5nZXJwcmludEZvcm1hdEVycm9yLFxuXHRJbnZhbGlkQWxnb3JpdGhtRXJyb3I6IEludmFsaWRBbGdvcml0aG1FcnJvcixcblx0S2V5UGFyc2VFcnJvcjogS2V5UGFyc2VFcnJvcixcblx0U2lnbmF0dXJlUGFyc2VFcnJvcjogU2lnbmF0dXJlUGFyc2VFcnJvcixcblx0S2V5RW5jcnlwdGVkRXJyb3I6IEtleUVuY3J5cHRlZEVycm9yLFxuXHRDZXJ0aWZpY2F0ZVBhcnNlRXJyb3I6IENlcnRpZmljYXRlUGFyc2VFcnJvclxufTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxMSBNYXJrIENhdmFnZSA8bWNhdmFnZUBnbWFpbC5jb20+IEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgbmV3SW52YWxpZEFzbjFFcnJvcjogZnVuY3Rpb24gKG1zZykge1xuICAgIHZhciBlID0gbmV3IEVycm9yKCk7XG4gICAgZS5uYW1lID0gJ0ludmFsaWRBc24xRXJyb3InO1xuICAgIGUubWVzc2FnZSA9IG1zZyB8fCAnJztcbiAgICByZXR1cm4gZTtcbiAgfVxuXG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDExIE1hcmsgQ2F2YWdlIDxtY2F2YWdlQGdtYWlsLmNvbT4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRU9DOiAwLFxuICBCb29sZWFuOiAxLFxuICBJbnRlZ2VyOiAyLFxuICBCaXRTdHJpbmc6IDMsXG4gIE9jdGV0U3RyaW5nOiA0LFxuICBOdWxsOiA1LFxuICBPSUQ6IDYsXG4gIE9iamVjdERlc2NyaXB0b3I6IDcsXG4gIEV4dGVybmFsOiA4LFxuICBSZWFsOiA5LCAvLyBmbG9hdFxuICBFbnVtZXJhdGlvbjogMTAsXG4gIFBEVjogMTEsXG4gIFV0ZjhTdHJpbmc6IDEyLFxuICBSZWxhdGl2ZU9JRDogMTMsXG4gIFNlcXVlbmNlOiAxNixcbiAgU2V0OiAxNyxcbiAgTnVtZXJpY1N0cmluZzogMTgsXG4gIFByaW50YWJsZVN0cmluZzogMTksXG4gIFQ2MVN0cmluZzogMjAsXG4gIFZpZGVvdGV4U3RyaW5nOiAyMSxcbiAgSUE1U3RyaW5nOiAyMixcbiAgVVRDVGltZTogMjMsXG4gIEdlbmVyYWxpemVkVGltZTogMjQsXG4gIEdyYXBoaWNTdHJpbmc6IDI1LFxuICBWaXNpYmxlU3RyaW5nOiAyNixcbiAgR2VuZXJhbFN0cmluZzogMjgsXG4gIFVuaXZlcnNhbFN0cmluZzogMjksXG4gIENoYXJhY3RlclN0cmluZzogMzAsXG4gIEJNUFN0cmluZzogMzEsXG4gIENvbnN0cnVjdG9yOiAzMixcbiAgQ29udGV4dDogMTI4XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDExIE1hcmsgQ2F2YWdlIDxtY2F2YWdlQGdtYWlsLmNvbT4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIEFTTjEgPSByZXF1aXJlKCcuL3R5cGVzJyk7XG52YXIgZXJyb3JzID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcblxuXG4vLyAtLS0gR2xvYmFsc1xuXG52YXIgbmV3SW52YWxpZEFzbjFFcnJvciA9IGVycm9ycy5uZXdJbnZhbGlkQXNuMUVycm9yO1xuXG5cblxuLy8gLS0tIEFQSVxuXG5mdW5jdGlvbiBSZWFkZXIoZGF0YSkge1xuICBpZiAoIWRhdGEgfHwgIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYSBub2RlIEJ1ZmZlcicpO1xuXG4gIHRoaXMuX2J1ZiA9IGRhdGE7XG4gIHRoaXMuX3NpemUgPSBkYXRhLmxlbmd0aDtcblxuICAvLyBUaGVzZSBob2xkIHRoZSBcImN1cnJlbnRcIiBzdGF0ZVxuICB0aGlzLl9sZW4gPSAwO1xuICB0aGlzLl9vZmZzZXQgPSAwO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGVyLnByb3RvdHlwZSwgJ2xlbmd0aCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5fbGVuKTsgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkZXIucHJvdG90eXBlLCAnb2Zmc2V0Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLl9vZmZzZXQpOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRlci5wcm90b3R5cGUsICdyZW1haW4nLCB7XG4gIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX3NpemUgLSB0aGlzLl9vZmZzZXQpOyB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRlci5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuX2J1Zi5zbGljZSh0aGlzLl9vZmZzZXQpKTsgfVxufSk7XG5cblxuLyoqXG4gKiBSZWFkcyBhIHNpbmdsZSBieXRlIGFuZCBhZHZhbmNlcyBvZmZzZXQ7IHlvdSBjYW4gcGFzcyBpbiBgdHJ1ZWAgdG8gbWFrZSB0aGlzXG4gKiBhIFwicGVla1wiIG9wZXJhdGlvbiAoaS5lLiwgZ2V0IHRoZSBieXRlLCBidXQgZG9uJ3QgYWR2YW5jZSB0aGUgb2Zmc2V0KS5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHBlZWsgdHJ1ZSBtZWFucyBkb24ndCBtb3ZlIG9mZnNldC5cbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIG5leHQgYnl0ZSwgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEuXG4gKi9cblJlYWRlci5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbiAocGVlaykge1xuICBpZiAodGhpcy5fc2l6ZSAtIHRoaXMuX29mZnNldCA8IDEpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIGIgPSB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0XSAmIDB4ZmY7XG5cbiAgaWYgKCFwZWVrKVxuICAgIHRoaXMuX29mZnNldCArPSAxO1xuXG4gIHJldHVybiBiO1xufTtcblxuXG5SZWFkZXIucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlYWRCeXRlKHRydWUpO1xufTtcblxuXG4vKipcbiAqIFJlYWRzIGEgKHBvdGVudGlhbGx5KSB2YXJpYWJsZSBsZW5ndGggb2ZmIHRoZSBCRVIgYnVmZmVyLiAgVGhpcyBjYWxsIGlzXG4gKiBub3QgcmVhbGx5IG1lYW50IHRvIGJlIGNhbGxlZCBkaXJlY3RseSwgYXMgY2FsbGVycyBoYXZlIHRvIG1hbmlwdWxhdGVcbiAqIHRoZSBpbnRlcm5hbCBidWZmZXIgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBBcyBhIHJlc3VsdCBvZiB0aGlzIGNhbGwsIHlvdSBjYW4gY2FsbCBgUmVhZGVyLmxlbmd0aGAsIHVudGlsIHRoZVxuICogbmV4dCB0aGluZyBjYWxsZWQgdGhhdCBkb2VzIGEgcmVhZExlbmd0aC5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBhbW91bnQgb2Ygb2Zmc2V0IHRvIGFkdmFuY2UgdGhlIGJ1ZmZlci5cbiAqIEB0aHJvd3Mge0ludmFsaWRBc24xRXJyb3J9IG9uIGJhZCBBU04uMVxuICovXG5SZWFkZXIucHJvdG90eXBlLnJlYWRMZW5ndGggPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZClcbiAgICBvZmZzZXQgPSB0aGlzLl9vZmZzZXQ7XG5cbiAgaWYgKG9mZnNldCA+PSB0aGlzLl9zaXplKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBsZW5CID0gdGhpcy5fYnVmW29mZnNldCsrXSAmIDB4ZmY7XG4gIGlmIChsZW5CID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmICgobGVuQiAmIDB4ODApID09PSAweDgwKSB7XG4gICAgbGVuQiAmPSAweDdmO1xuXG4gICAgaWYgKGxlbkIgPT09IDApXG4gICAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdJbmRlZmluaXRlIGxlbmd0aCBub3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBpZiAobGVuQiA+IDQpXG4gICAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdlbmNvZGluZyB0b28gbG9uZycpO1xuXG4gICAgaWYgKHRoaXMuX3NpemUgLSBvZmZzZXQgPCBsZW5CKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLl9sZW4gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuQjsgaSsrKVxuICAgICAgdGhpcy5fbGVuID0gKHRoaXMuX2xlbiA8PCA4KSArICh0aGlzLl9idWZbb2Zmc2V0KytdICYgMHhmZik7XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBXYXNuJ3QgYSB2YXJpYWJsZSBsZW5ndGhcbiAgICB0aGlzLl9sZW4gPSBsZW5CO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG5leHQgc2VxdWVuY2UgaW4gdGhpcyBCRVIgYnVmZmVyLlxuICpcbiAqIFRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgY2FsbCBgUmVhZGVyLmxlbmd0aGAuXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgc2VxdWVuY2UncyB0YWcuXG4gKi9cblJlYWRlci5wcm90b3R5cGUucmVhZFNlcXVlbmNlID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc2VxID0gdGhpcy5wZWVrKCk7XG4gIGlmIChzZXEgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCAmJiB0YWcgIT09IHNlcSlcbiAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdFeHBlY3RlZCAweCcgKyB0YWcudG9TdHJpbmcoMTYpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc6IGdvdCAweCcgKyBzZXEudG9TdHJpbmcoMTYpKTtcblxuICB2YXIgbyA9IHRoaXMucmVhZExlbmd0aCh0aGlzLl9vZmZzZXQgKyAxKTsgLy8gc3RvcmVkIGluIGBsZW5ndGhgXG4gIGlmIChvID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHRoaXMuX29mZnNldCA9IG87XG4gIHJldHVybiBzZXE7XG59O1xuXG5cblJlYWRlci5wcm90b3R5cGUucmVhZEludCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRUYWcoQVNOMS5JbnRlZ2VyKTtcbn07XG5cblxuUmVhZGVyLnByb3RvdHlwZS5yZWFkQm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLl9yZWFkVGFnKEFTTjEuQm9vbGVhbikgPT09IDAgPyBmYWxzZSA6IHRydWUpO1xufTtcblxuXG5SZWFkZXIucHJvdG90eXBlLnJlYWRFbnVtZXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRUYWcoQVNOMS5FbnVtZXJhdGlvbik7XG59O1xuXG5cblJlYWRlci5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uICh0YWcsIHJldGJ1Zikge1xuICBpZiAoIXRhZylcbiAgICB0YWcgPSBBU04xLk9jdGV0U3RyaW5nO1xuXG4gIHZhciBiID0gdGhpcy5wZWVrKCk7XG4gIGlmIChiID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmIChiICE9PSB0YWcpXG4gICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcignRXhwZWN0ZWQgMHgnICsgdGFnLnRvU3RyaW5nKDE2KSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiBnb3QgMHgnICsgYi50b1N0cmluZygxNikpO1xuXG4gIHZhciBvID0gdGhpcy5yZWFkTGVuZ3RoKHRoaXMuX29mZnNldCArIDEpOyAvLyBzdG9yZWQgaW4gYGxlbmd0aGBcblxuICBpZiAobyA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAodGhpcy5sZW5ndGggPiB0aGlzLl9zaXplIC0gbylcbiAgICByZXR1cm4gbnVsbDtcblxuICB0aGlzLl9vZmZzZXQgPSBvO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gcmV0YnVmID8gQnVmZmVyLmFsbG9jKDApIDogJyc7XG5cbiAgdmFyIHN0ciA9IHRoaXMuX2J1Zi5zbGljZSh0aGlzLl9vZmZzZXQsIHRoaXMuX29mZnNldCArIHRoaXMubGVuZ3RoKTtcbiAgdGhpcy5fb2Zmc2V0ICs9IHRoaXMubGVuZ3RoO1xuXG4gIHJldHVybiByZXRidWYgPyBzdHIgOiBzdHIudG9TdHJpbmcoJ3V0ZjgnKTtcbn07XG5cblJlYWRlci5wcm90b3R5cGUucmVhZE9JRCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgaWYgKCF0YWcpXG4gICAgdGFnID0gQVNOMS5PSUQ7XG5cbiAgdmFyIGIgPSB0aGlzLnJlYWRTdHJpbmcodGFnLCB0cnVlKTtcbiAgaWYgKGIgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHZhbHVlcyA9IFtdO1xuICB2YXIgdmFsdWUgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBieXRlID0gYltpXSAmIDB4ZmY7XG5cbiAgICB2YWx1ZSA8PD0gNztcbiAgICB2YWx1ZSArPSBieXRlICYgMHg3ZjtcbiAgICBpZiAoKGJ5dGUgJiAweDgwKSA9PT0gMCkge1xuICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgdmFsdWUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHZhbHVlID0gdmFsdWVzLnNoaWZ0KCk7XG4gIHZhbHVlcy51bnNoaWZ0KHZhbHVlICUgNDApO1xuICB2YWx1ZXMudW5zaGlmdCgodmFsdWUgLyA0MCkgPj4gMCk7XG5cbiAgcmV0dXJuIHZhbHVlcy5qb2luKCcuJyk7XG59O1xuXG5cblJlYWRlci5wcm90b3R5cGUuX3JlYWRUYWcgPSBmdW5jdGlvbiAodGFnKSB7XG4gIGFzc2VydC5vayh0YWcgIT09IHVuZGVmaW5lZCk7XG5cbiAgdmFyIGIgPSB0aGlzLnBlZWsoKTtcblxuICBpZiAoYiA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcblxuICBpZiAoYiAhPT0gdGFnKVxuICAgIHRocm93IG5ld0ludmFsaWRBc24xRXJyb3IoJ0V4cGVjdGVkIDB4JyArIHRhZy50b1N0cmluZygxNikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogZ290IDB4JyArIGIudG9TdHJpbmcoMTYpKTtcblxuICB2YXIgbyA9IHRoaXMucmVhZExlbmd0aCh0aGlzLl9vZmZzZXQgKyAxKTsgLy8gc3RvcmVkIGluIGBsZW5ndGhgXG4gIGlmIChvID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA+IDQpXG4gICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcignSW50ZWdlciB0b28gbG9uZzogJyArIHRoaXMubGVuZ3RoKTtcblxuICBpZiAodGhpcy5sZW5ndGggPiB0aGlzLl9zaXplIC0gbylcbiAgICByZXR1cm4gbnVsbDtcbiAgdGhpcy5fb2Zmc2V0ID0gbztcblxuICB2YXIgZmIgPSB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0XTtcbiAgdmFyIHZhbHVlID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZSA8PD0gODtcbiAgICB2YWx1ZSB8PSAodGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSAmIDB4ZmYpO1xuICB9XG5cbiAgaWYgKChmYiAmIDB4ODApID09PSAweDgwICYmIGkgIT09IDQpXG4gICAgdmFsdWUgLT0gKDEgPDwgKGkgKiA4KSk7XG5cbiAgcmV0dXJuIHZhbHVlID4+IDA7XG59O1xuXG5cblxuLy8gLS0tIEV4cG9ydGVkIEFQSVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRlcjtcbiIsICIvLyBDb3B5cmlnaHQgMjAxMSBNYXJrIENhdmFnZSA8bWNhdmFnZUBnbWFpbC5jb20+IEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgQVNOMSA9IHJlcXVpcmUoJy4vdHlwZXMnKTtcbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG5cbi8vIC0tLSBHbG9iYWxzXG5cbnZhciBuZXdJbnZhbGlkQXNuMUVycm9yID0gZXJyb3JzLm5ld0ludmFsaWRBc24xRXJyb3I7XG5cbnZhciBERUZBVUxUX09QVFMgPSB7XG4gIHNpemU6IDEwMjQsXG4gIGdyb3d0aEZhY3RvcjogOFxufTtcblxuXG4vLyAtLS0gSGVscGVyc1xuXG5mdW5jdGlvbiBtZXJnZShmcm9tLCB0bykge1xuICBhc3NlcnQub2soZnJvbSk7XG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgKGZyb20pLCAnb2JqZWN0Jyk7XG4gIGFzc2VydC5vayh0byk7XG4gIGFzc2VydC5lcXVhbCh0eXBlb2YgKHRvKSwgJ29iamVjdCcpO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZnJvbSk7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKHRvW2tleV0pXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZyb20sIGtleSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBrZXksIHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRvO1xufVxuXG5cblxuLy8gLS0tIEFQSVxuXG5mdW5jdGlvbiBXcml0ZXIob3B0aW9ucykge1xuICBvcHRpb25zID0gbWVyZ2UoREVGQVVMVF9PUFRTLCBvcHRpb25zIHx8IHt9KTtcblxuICB0aGlzLl9idWYgPSBCdWZmZXIuYWxsb2Mob3B0aW9ucy5zaXplIHx8IDEwMjQpO1xuICB0aGlzLl9zaXplID0gdGhpcy5fYnVmLmxlbmd0aDtcbiAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgLy8gQSBsaXN0IG9mIG9mZnNldHMgaW4gdGhlIGJ1ZmZlciB3aGVyZSB3ZSBuZWVkIHRvIGluc2VydFxuICAvLyBzZXF1ZW5jZSB0YWcvbGVuIHBhaXJzLlxuICB0aGlzLl9zZXEgPSBbXTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRlci5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9zZXEubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcih0aGlzLl9zZXEubGVuZ3RoICsgJyB1bmVuZGVkIHNlcXVlbmNlKHMpJyk7XG5cbiAgICByZXR1cm4gKHRoaXMuX2J1Zi5zbGljZSgwLCB0aGlzLl9vZmZzZXQpKTtcbiAgfVxufSk7XG5cbldyaXRlci5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24gKGIpIHtcbiAgaWYgKHR5cGVvZiAoYikgIT09ICdudW1iZXInKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBOdW1iZXInKTtcblxuICB0aGlzLl9lbnN1cmUoMSk7XG4gIHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK10gPSBiO1xufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlSW50ID0gZnVuY3Rpb24gKGksIHRhZykge1xuICBpZiAodHlwZW9mIChpKSAhPT0gJ251bWJlcicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLkludGVnZXI7XG5cbiAgdmFyIHN6ID0gNDtcblxuICB3aGlsZSAoKCgoaSAmIDB4ZmY4MDAwMDApID09PSAwKSB8fCAoKGkgJiAweGZmODAwMDAwKSA9PT0gMHhmZjgwMDAwMCA+PiAwKSkgJiZcbiAgICAgICAgKHN6ID4gMSkpIHtcbiAgICBzei0tO1xuICAgIGkgPDw9IDg7XG4gIH1cblxuICBpZiAoc3ogPiA0KVxuICAgIHRocm93IG5ld0ludmFsaWRBc24xRXJyb3IoJ0JFUiBpbnRzIGNhbm5vdCBiZSA+IDB4ZmZmZmZmZmYnKTtcblxuICB0aGlzLl9lbnN1cmUoMiArIHN6KTtcbiAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IHRhZztcbiAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IHN6O1xuXG4gIHdoaWxlIChzei0tID4gMCkge1xuICAgIHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK10gPSAoKGkgJiAweGZmMDAwMDAwKSA+Pj4gMjQpO1xuICAgIGkgPDw9IDg7XG4gIH1cblxufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlTnVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy53cml0ZUJ5dGUoQVNOMS5OdWxsKTtcbiAgdGhpcy53cml0ZUJ5dGUoMHgwMCk7XG59O1xuXG5cbldyaXRlci5wcm90b3R5cGUud3JpdGVFbnVtZXJhdGlvbiA9IGZ1bmN0aW9uIChpLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAoaSkgIT09ICdudW1iZXInKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgaWYgKHR5cGVvZiAodGFnKSAhPT0gJ251bWJlcicpXG4gICAgdGFnID0gQVNOMS5FbnVtZXJhdGlvbjtcblxuICByZXR1cm4gdGhpcy53cml0ZUludChpLCB0YWcpO1xufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlQm9vbGVhbiA9IGZ1bmN0aW9uIChiLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAoYikgIT09ICdib29sZWFuJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBtdXN0IGJlIGEgQm9vbGVhbicpO1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLkJvb2xlYW47XG5cbiAgdGhpcy5fZW5zdXJlKDMpO1xuICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gdGFnO1xuICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gMHgwMTtcbiAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGIgPyAweGZmIDogMHgwMDtcbn07XG5cblxuV3JpdGVyLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uIChzLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAocykgIT09ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgKHdhczogJyArIHR5cGVvZiAocykgKyAnKScpO1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLk9jdGV0U3RyaW5nO1xuXG4gIHZhciBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChzKTtcbiAgdGhpcy53cml0ZUJ5dGUodGFnKTtcbiAgdGhpcy53cml0ZUxlbmd0aChsZW4pO1xuICBpZiAobGVuKSB7XG4gICAgdGhpcy5fZW5zdXJlKGxlbik7XG4gICAgdGhpcy5fYnVmLndyaXRlKHMsIHRoaXMuX29mZnNldCk7XG4gICAgdGhpcy5fb2Zmc2V0ICs9IGxlbjtcbiAgfVxufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLndyaXRlQnVmZmVyID0gZnVuY3Rpb24gKGJ1ZiwgdGFnKSB7XG4gIGlmICh0eXBlb2YgKHRhZykgIT09ICdudW1iZXInKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhZyBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbXVzdCBiZSBhIGJ1ZmZlcicpO1xuXG4gIHRoaXMud3JpdGVCeXRlKHRhZyk7XG4gIHRoaXMud3JpdGVMZW5ndGgoYnVmLmxlbmd0aCk7XG4gIHRoaXMuX2Vuc3VyZShidWYubGVuZ3RoKTtcbiAgYnVmLmNvcHkodGhpcy5fYnVmLCB0aGlzLl9vZmZzZXQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLl9vZmZzZXQgKz0gYnVmLmxlbmd0aDtcbn07XG5cblxuV3JpdGVyLnByb3RvdHlwZS53cml0ZVN0cmluZ0FycmF5ID0gZnVuY3Rpb24gKHN0cmluZ3MpIHtcbiAgaWYgKCghc3RyaW5ncyBpbnN0YW5jZW9mIEFycmF5KSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5W1N0cmluZ10nKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgIHNlbGYud3JpdGVTdHJpbmcocyk7XG4gIH0pO1xufTtcblxuLy8gVGhpcyBpcyByZWFsbHkgdG8gc29sdmUgREVSIGNhc2VzLCBidXQgd2hhdGV2ZXIgZm9yIG5vd1xuV3JpdGVyLnByb3RvdHlwZS53cml0ZU9JRCA9IGZ1bmN0aW9uIChzLCB0YWcpIHtcbiAgaWYgKHR5cGVvZiAocykgIT09ICdzdHJpbmcnKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgaWYgKHR5cGVvZiAodGFnKSAhPT0gJ251bWJlcicpXG4gICAgdGFnID0gQVNOMS5PSUQ7XG5cbiAgaWYgKCEvXihbMC05XStcXC4pezMsfVswLTldKyQvLnRlc3QocykpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBPSUQgc3RyaW5nJyk7XG5cbiAgZnVuY3Rpb24gZW5jb2RlT2N0ZXQoYnl0ZXMsIG9jdGV0KSB7XG4gICAgaWYgKG9jdGV0IDwgMTI4KSB7XG4gICAgICAgIGJ5dGVzLnB1c2gob2N0ZXQpO1xuICAgIH0gZWxzZSBpZiAob2N0ZXQgPCAxNjM4NCkge1xuICAgICAgICBieXRlcy5wdXNoKChvY3RldCA+Pj4gNykgfCAweDgwKTtcbiAgICAgICAgYnl0ZXMucHVzaChvY3RldCAmIDB4N0YpO1xuICAgIH0gZWxzZSBpZiAob2N0ZXQgPCAyMDk3MTUyKSB7XG4gICAgICBieXRlcy5wdXNoKChvY3RldCA+Pj4gMTQpIHwgMHg4MCk7XG4gICAgICBieXRlcy5wdXNoKCgob2N0ZXQgPj4+IDcpIHwgMHg4MCkgJiAweEZGKTtcbiAgICAgIGJ5dGVzLnB1c2gob2N0ZXQgJiAweDdGKTtcbiAgICB9IGVsc2UgaWYgKG9jdGV0IDwgMjY4NDM1NDU2KSB7XG4gICAgICBieXRlcy5wdXNoKChvY3RldCA+Pj4gMjEpIHwgMHg4MCk7XG4gICAgICBieXRlcy5wdXNoKCgob2N0ZXQgPj4+IDE0KSB8IDB4ODApICYgMHhGRik7XG4gICAgICBieXRlcy5wdXNoKCgob2N0ZXQgPj4+IDcpIHwgMHg4MCkgJiAweEZGKTtcbiAgICAgIGJ5dGVzLnB1c2gob2N0ZXQgJiAweDdGKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiAyOCkgfCAweDgwKSAmIDB4RkYpO1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiAyMSkgfCAweDgwKSAmIDB4RkYpO1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiAxNCkgfCAweDgwKSAmIDB4RkYpO1xuICAgICAgYnl0ZXMucHVzaCgoKG9jdGV0ID4+PiA3KSB8IDB4ODApICYgMHhGRik7XG4gICAgICBieXRlcy5wdXNoKG9jdGV0ICYgMHg3Rik7XG4gICAgfVxuICB9XG5cbiAgdmFyIHRtcCA9IHMuc3BsaXQoJy4nKTtcbiAgdmFyIGJ5dGVzID0gW107XG4gIGJ5dGVzLnB1c2gocGFyc2VJbnQodG1wWzBdLCAxMCkgKiA0MCArIHBhcnNlSW50KHRtcFsxXSwgMTApKTtcbiAgdG1wLnNsaWNlKDIpLmZvckVhY2goZnVuY3Rpb24gKGIpIHtcbiAgICBlbmNvZGVPY3RldChieXRlcywgcGFyc2VJbnQoYiwgMTApKTtcbiAgfSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9lbnN1cmUoMiArIGJ5dGVzLmxlbmd0aCk7XG4gIHRoaXMud3JpdGVCeXRlKHRhZyk7XG4gIHRoaXMud3JpdGVMZW5ndGgoYnl0ZXMubGVuZ3RoKTtcbiAgYnl0ZXMuZm9yRWFjaChmdW5jdGlvbiAoYikge1xuICAgIHNlbGYud3JpdGVCeXRlKGIpO1xuICB9KTtcbn07XG5cblxuV3JpdGVyLnByb3RvdHlwZS53cml0ZUxlbmd0aCA9IGZ1bmN0aW9uIChsZW4pIHtcbiAgaWYgKHR5cGVvZiAobGVuKSAhPT0gJ251bWJlcicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbXVzdCBiZSBhIE51bWJlcicpO1xuXG4gIHRoaXMuX2Vuc3VyZSg0KTtcblxuICBpZiAobGVuIDw9IDB4N2YpIHtcbiAgICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gbGVuO1xuICB9IGVsc2UgaWYgKGxlbiA8PSAweGZmKSB7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IDB4ODE7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbjtcbiAgfSBlbHNlIGlmIChsZW4gPD0gMHhmZmZmKSB7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IDB4ODI7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbiA+PiA4O1xuICAgIHRoaXMuX2J1Zlt0aGlzLl9vZmZzZXQrK10gPSBsZW47XG4gIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZmZmKSB7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IDB4ODM7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbiA+PiAxNjtcbiAgICB0aGlzLl9idWZbdGhpcy5fb2Zmc2V0KytdID0gbGVuID4+IDg7XG4gICAgdGhpcy5fYnVmW3RoaXMuX29mZnNldCsrXSA9IGxlbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXdJbnZhbGlkQXNuMUVycm9yKCdMZW5ndGggdG9vIGxvbmcgKD4gNCBieXRlcyknKTtcbiAgfVxufTtcblxuV3JpdGVyLnByb3RvdHlwZS5zdGFydFNlcXVlbmNlID0gZnVuY3Rpb24gKHRhZykge1xuICBpZiAodHlwZW9mICh0YWcpICE9PSAnbnVtYmVyJylcbiAgICB0YWcgPSBBU04xLlNlcXVlbmNlIHwgQVNOMS5Db25zdHJ1Y3RvcjtcblxuICB0aGlzLndyaXRlQnl0ZSh0YWcpO1xuICB0aGlzLl9zZXEucHVzaCh0aGlzLl9vZmZzZXQpO1xuICB0aGlzLl9lbnN1cmUoMyk7XG4gIHRoaXMuX29mZnNldCArPSAzO1xufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLmVuZFNlcXVlbmNlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VxID0gdGhpcy5fc2VxLnBvcCgpO1xuICB2YXIgc3RhcnQgPSBzZXEgKyAzO1xuICB2YXIgbGVuID0gdGhpcy5fb2Zmc2V0IC0gc3RhcnQ7XG5cbiAgaWYgKGxlbiA8PSAweDdmKSB7XG4gICAgdGhpcy5fc2hpZnQoc3RhcnQsIGxlbiwgLTIpO1xuICAgIHRoaXMuX2J1ZltzZXFdID0gbGVuO1xuICB9IGVsc2UgaWYgKGxlbiA8PSAweGZmKSB7XG4gICAgdGhpcy5fc2hpZnQoc3RhcnQsIGxlbiwgLTEpO1xuICAgIHRoaXMuX2J1ZltzZXFdID0gMHg4MTtcbiAgICB0aGlzLl9idWZbc2VxICsgMV0gPSBsZW47XG4gIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZikge1xuICAgIHRoaXMuX2J1ZltzZXFdID0gMHg4MjtcbiAgICB0aGlzLl9idWZbc2VxICsgMV0gPSBsZW4gPj4gODtcbiAgICB0aGlzLl9idWZbc2VxICsgMl0gPSBsZW47XG4gIH0gZWxzZSBpZiAobGVuIDw9IDB4ZmZmZmZmKSB7XG4gICAgdGhpcy5fc2hpZnQoc3RhcnQsIGxlbiwgMSk7XG4gICAgdGhpcy5fYnVmW3NlcV0gPSAweDgzO1xuICAgIHRoaXMuX2J1ZltzZXEgKyAxXSA9IGxlbiA+PiAxNjtcbiAgICB0aGlzLl9idWZbc2VxICsgMl0gPSBsZW4gPj4gODtcbiAgICB0aGlzLl9idWZbc2VxICsgM10gPSBsZW47XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3SW52YWxpZEFzbjFFcnJvcignU2VxdWVuY2UgdG9vIGxvbmcnKTtcbiAgfVxufTtcblxuXG5Xcml0ZXIucHJvdG90eXBlLl9zaGlmdCA9IGZ1bmN0aW9uIChzdGFydCwgbGVuLCBzaGlmdCkge1xuICBhc3NlcnQub2soc3RhcnQgIT09IHVuZGVmaW5lZCk7XG4gIGFzc2VydC5vayhsZW4gIT09IHVuZGVmaW5lZCk7XG4gIGFzc2VydC5vayhzaGlmdCk7XG5cbiAgdGhpcy5fYnVmLmNvcHkodGhpcy5fYnVmLCBzdGFydCArIHNoaWZ0LCBzdGFydCwgc3RhcnQgKyBsZW4pO1xuICB0aGlzLl9vZmZzZXQgKz0gc2hpZnQ7XG59O1xuXG5Xcml0ZXIucHJvdG90eXBlLl9lbnN1cmUgPSBmdW5jdGlvbiAobGVuKSB7XG4gIGFzc2VydC5vayhsZW4pO1xuXG4gIGlmICh0aGlzLl9zaXplIC0gdGhpcy5fb2Zmc2V0IDwgbGVuKSB7XG4gICAgdmFyIHN6ID0gdGhpcy5fc2l6ZSAqIHRoaXMuX29wdGlvbnMuZ3Jvd3RoRmFjdG9yO1xuICAgIGlmIChzeiAtIHRoaXMuX29mZnNldCA8IGxlbilcbiAgICAgIHN6ICs9IGxlbjtcblxuICAgIHZhciBidWYgPSBCdWZmZXIuYWxsb2Moc3opO1xuXG4gICAgdGhpcy5fYnVmLmNvcHkoYnVmLCAwLCAwLCB0aGlzLl9vZmZzZXQpO1xuICAgIHRoaXMuX2J1ZiA9IGJ1ZjtcbiAgICB0aGlzLl9zaXplID0gc3o7XG4gIH1cbn07XG5cblxuXG4vLyAtLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGVyO1xuIiwgIi8vIENvcHlyaWdodCAyMDExIE1hcmsgQ2F2YWdlIDxtY2F2YWdlQGdtYWlsLmNvbT4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgdHlwZXMgPSByZXF1aXJlKCcuL3R5cGVzJyk7XG5cbnZhciBSZWFkZXIgPSByZXF1aXJlKCcuL3JlYWRlcicpO1xudmFyIFdyaXRlciA9IHJlcXVpcmUoJy4vd3JpdGVyJyk7XG5cblxuLy8gLS0tIEV4cG9ydHNcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgUmVhZGVyOiBSZWFkZXIsXG5cbiAgV3JpdGVyOiBXcml0ZXJcblxufTtcblxuZm9yICh2YXIgdCBpbiB0eXBlcykge1xuICBpZiAodHlwZXMuaGFzT3duUHJvcGVydHkodCkpXG4gICAgbW9kdWxlLmV4cG9ydHNbdF0gPSB0eXBlc1t0XTtcbn1cbmZvciAodmFyIGUgaW4gZXJyb3JzKSB7XG4gIGlmIChlcnJvcnMuaGFzT3duUHJvcGVydHkoZSkpXG4gICAgbW9kdWxlLmV4cG9ydHNbZV0gPSBlcnJvcnNbZV07XG59XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTEgTWFyayBDYXZhZ2UgPG1jYXZhZ2VAZ21haWwuY29tPiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4vLyBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgQVNOLjEgb3IgQkVSIGlzLCBzZWUgdGhpczpcbi8vIGZ0cDovL2Z0cC5yc2EuY29tL3B1Yi9wa2NzL2FzY2lpL2xheW1hbi5hc2NcblxudmFyIEJlciA9IHJlcXVpcmUoJy4vYmVyL2luZGV4Jyk7XG5cblxuXG4vLyAtLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIEJlcjogQmVyLFxuXG4gIEJlclJlYWRlcjogQmVyLlJlYWRlcixcblxuICBCZXJXcml0ZXI6IEJlci5Xcml0ZXJcblxufTtcbiIsICIoZnVuY3Rpb24oKXtcblxuICAgIC8vIENvcHlyaWdodCAoYykgMjAwNSAgVG9tIFd1XG4gICAgLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAvLyBTZWUgXCJMSUNFTlNFXCIgZm9yIGRldGFpbHMuXG5cbiAgICAvLyBCYXNpYyBKYXZhU2NyaXB0IEJOIGxpYnJhcnkgLSBzdWJzZXQgdXNlZnVsIGZvciBSU0EgZW5jcnlwdGlvbi5cblxuICAgIC8vIEJpdHMgcGVyIGRpZ2l0XG4gICAgdmFyIGRiaXRzO1xuXG4gICAgLy8gSmF2YVNjcmlwdCBlbmdpbmUgYW5hbHlzaXNcbiAgICB2YXIgY2FuYXJ5ID0gMHhkZWFkYmVlZmNhZmU7XG4gICAgdmFyIGpfbG0gPSAoKGNhbmFyeSYweGZmZmZmZik9PTB4ZWZjYWZlKTtcblxuICAgIC8vIChwdWJsaWMpIENvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24gQmlnSW50ZWdlcihhLGIsYykge1xuICAgICAgaWYoYSAhPSBudWxsKVxuICAgICAgICBpZihcIm51bWJlclwiID09IHR5cGVvZiBhKSB0aGlzLmZyb21OdW1iZXIoYSxiLGMpO1xuICAgICAgICBlbHNlIGlmKGIgPT0gbnVsbCAmJiBcInN0cmluZ1wiICE9IHR5cGVvZiBhKSB0aGlzLmZyb21TdHJpbmcoYSwyNTYpO1xuICAgICAgICBlbHNlIHRoaXMuZnJvbVN0cmluZyhhLGIpO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBuZXcsIHVuc2V0IEJpZ0ludGVnZXJcbiAgICBmdW5jdGlvbiBuYmkoKSB7IHJldHVybiBuZXcgQmlnSW50ZWdlcihudWxsKTsgfVxuXG4gICAgLy8gYW06IENvbXB1dGUgd19qICs9ICh4KnRoaXNfaSksIHByb3BhZ2F0ZSBjYXJyaWVzLFxuICAgIC8vIGMgaXMgaW5pdGlhbCBjYXJyeSwgcmV0dXJucyBmaW5hbCBjYXJyeS5cbiAgICAvLyBjIDwgMypkdmFsdWUsIHggPCAyKmR2YWx1ZSwgdGhpc19pIDwgZHZhbHVlXG4gICAgLy8gV2UgbmVlZCB0byBzZWxlY3QgdGhlIGZhc3Rlc3Qgb25lIHRoYXQgd29ya3MgaW4gdGhpcyBlbnZpcm9ubWVudC5cblxuICAgIC8vIGFtMTogdXNlIGEgc2luZ2xlIG11bHQgYW5kIGRpdmlkZSB0byBnZXQgdGhlIGhpZ2ggYml0cyxcbiAgICAvLyBtYXggZGlnaXQgYml0cyBzaG91bGQgYmUgMjYgYmVjYXVzZVxuICAgIC8vIG1heCBpbnRlcm5hbCB2YWx1ZSA9IDIqZHZhbHVlXjItMipkdmFsdWUgKDwgMl41MylcbiAgICBmdW5jdGlvbiBhbTEoaSx4LHcsaixjLG4pIHtcbiAgICAgIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciB2ID0geCp0aGlzW2krK10rd1tqXStjO1xuICAgICAgICBjID0gTWF0aC5mbG9vcih2LzB4NDAwMDAwMCk7XG4gICAgICAgIHdbaisrXSA9IHYmMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICAgIC8vIGFtMiBhdm9pZHMgYSBiaWcgbXVsdC1hbmQtZXh0cmFjdCBjb21wbGV0ZWx5LlxuICAgIC8vIE1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSA8PSAzMCBiZWNhdXNlIHdlIGRvIGJpdHdpc2Ugb3BzXG4gICAgLy8gb24gdmFsdWVzIHVwIHRvIDIqaGR2YWx1ZV4yLWhkdmFsdWUtMSAoPCAyXjMxKVxuICAgIGZ1bmN0aW9uIGFtMihpLHgsdyxqLGMsbikge1xuICAgICAgdmFyIHhsID0geCYweDdmZmYsIHhoID0geD4+MTU7XG4gICAgICB3aGlsZSgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgbCA9IHRoaXNbaV0mMHg3ZmZmO1xuICAgICAgICB2YXIgaCA9IHRoaXNbaSsrXT4+MTU7XG4gICAgICAgIHZhciBtID0geGgqbCtoKnhsO1xuICAgICAgICBsID0geGwqbCsoKG0mMHg3ZmZmKTw8MTUpK3dbal0rKGMmMHgzZmZmZmZmZik7XG4gICAgICAgIGMgPSAobD4+PjMwKSsobT4+PjE1KSt4aCpoKyhjPj4+MzApO1xuICAgICAgICB3W2orK10gPSBsJjB4M2ZmZmZmZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgLy8gQWx0ZXJuYXRlbHksIHNldCBtYXggZGlnaXQgYml0cyB0byAyOCBzaW5jZSBzb21lXG4gICAgLy8gYnJvd3NlcnMgc2xvdyBkb3duIHdoZW4gZGVhbGluZyB3aXRoIDMyLWJpdCBudW1iZXJzLlxuICAgIGZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbikge1xuICAgICAgdmFyIHhsID0geCYweDNmZmYsIHhoID0geD4+MTQ7XG4gICAgICB3aGlsZSgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgbCA9IHRoaXNbaV0mMHgzZmZmO1xuICAgICAgICB2YXIgaCA9IHRoaXNbaSsrXT4+MTQ7XG4gICAgICAgIHZhciBtID0geGgqbCtoKnhsO1xuICAgICAgICBsID0geGwqbCsoKG0mMHgzZmZmKTw8MTQpK3dbal0rYztcbiAgICAgICAgYyA9IChsPj4yOCkrKG0+PjE0KSt4aCpoO1xuICAgICAgICB3W2orK10gPSBsJjB4ZmZmZmZmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICB2YXIgaW5Ccm93c2VyID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICBpZihpbkJyb3dzZXIgJiYgal9sbSAmJiAobmF2aWdhdG9yLmFwcE5hbWUgPT0gXCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpIHtcbiAgICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0yO1xuICAgICAgZGJpdHMgPSAzMDtcbiAgICB9XG4gICAgZWxzZSBpZihpbkJyb3dzZXIgJiYgal9sbSAmJiAobmF2aWdhdG9yLmFwcE5hbWUgIT0gXCJOZXRzY2FwZVwiKSkge1xuICAgICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTE7XG4gICAgICBkYml0cyA9IDI2O1xuICAgIH1cbiAgICBlbHNlIHsgLy8gTW96aWxsYS9OZXRzY2FwZSBzZWVtcyB0byBwcmVmZXIgYW0zXG4gICAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMztcbiAgICAgIGRiaXRzID0gMjg7XG4gICAgfVxuXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuREIgPSBkYml0cztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ETSA9ICgoMTw8ZGJpdHMpLTEpO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkRWID0gKDE8PGRiaXRzKTtcblxuICAgIHZhciBCSV9GUCA9IDUyO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkZWID0gTWF0aC5wb3coMixCSV9GUCk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRjEgPSBCSV9GUC1kYml0cztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMiA9IDIqZGJpdHMtQklfRlA7XG5cbiAgICAvLyBEaWdpdCBjb252ZXJzaW9uc1xuICAgIHZhciBCSV9STSA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgdmFyIEJJX1JDID0gbmV3IEFycmF5KCk7XG4gICAgdmFyIHJyLHZ2O1xuICAgIHJyID0gXCIwXCIuY2hhckNvZGVBdCgwKTtcbiAgICBmb3IodnYgPSAwOyB2diA8PSA5OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuICAgIHJyID0gXCJhXCIuY2hhckNvZGVBdCgwKTtcbiAgICBmb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbiAgICByciA9IFwiQVwiLmNoYXJDb2RlQXQoMCk7XG4gICAgZm9yKHZ2ID0gMTA7IHZ2IDwgMzY7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG5cbiAgICBmdW5jdGlvbiBpbnQyY2hhcihuKSB7IHJldHVybiBCSV9STS5jaGFyQXQobik7IH1cbiAgICBmdW5jdGlvbiBpbnRBdChzLGkpIHtcbiAgICAgIHZhciBjID0gQklfUkNbcy5jaGFyQ29kZUF0KGkpXTtcbiAgICAgIHJldHVybiAoYz09bnVsbCk/LTE6YztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjb3B5IHRoaXMgdG8gclxuICAgIGZ1bmN0aW9uIGJucENvcHlUbyhyKSB7XG4gICAgICBmb3IodmFyIGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSB0aGlzW2ldO1xuICAgICAgci50ID0gdGhpcy50O1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHNldCBmcm9tIGludGVnZXIgdmFsdWUgeCwgLURWIDw9IHggPCBEVlxuICAgIGZ1bmN0aW9uIGJucEZyb21JbnQoeCkge1xuICAgICAgdGhpcy50ID0gMTtcbiAgICAgIHRoaXMucyA9ICh4PDApPy0xOjA7XG4gICAgICBpZih4ID4gMCkgdGhpc1swXSA9IHg7XG4gICAgICBlbHNlIGlmKHggPCAtMSkgdGhpc1swXSA9IHgrdGhpcy5EVjtcbiAgICAgIGVsc2UgdGhpcy50ID0gMDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gYmlnaW50IGluaXRpYWxpemVkIHRvIHZhbHVlXG4gICAgZnVuY3Rpb24gbmJ2KGkpIHsgdmFyIHIgPSBuYmkoKTsgci5mcm9tSW50KGkpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gc3RyaW5nIGFuZCByYWRpeFxuICAgIGZ1bmN0aW9uIGJucEZyb21TdHJpbmcocyxiKSB7XG4gICAgICB2YXIgaztcbiAgICAgIGlmKGIgPT0gMTYpIGsgPSA0O1xuICAgICAgZWxzZSBpZihiID09IDgpIGsgPSAzO1xuICAgICAgZWxzZSBpZihiID09IDI1NikgayA9IDg7IC8vIGJ5dGUgYXJyYXlcbiAgICAgIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgICAgIGVsc2UgaWYoYiA9PSAzMikgayA9IDU7XG4gICAgICBlbHNlIGlmKGIgPT0gNCkgayA9IDI7XG4gICAgICBlbHNlIHsgdGhpcy5mcm9tUmFkaXgocyxiKTsgcmV0dXJuOyB9XG4gICAgICB0aGlzLnQgPSAwO1xuICAgICAgdGhpcy5zID0gMDtcbiAgICAgIHZhciBpID0gcy5sZW5ndGgsIG1pID0gZmFsc2UsIHNoID0gMDtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSB7XG4gICAgICAgIHZhciB4ID0gKGs9PTgpP3NbaV0mMHhmZjppbnRBdChzLGkpO1xuICAgICAgICBpZih4IDwgMCkge1xuICAgICAgICAgIGlmKHMuY2hhckF0KGkpID09IFwiLVwiKSBtaSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWkgPSBmYWxzZTtcbiAgICAgICAgaWYoc2ggPT0gMClcbiAgICAgICAgICB0aGlzW3RoaXMudCsrXSA9IHg7XG4gICAgICAgIGVsc2UgaWYoc2grayA+IHRoaXMuREIpIHtcbiAgICAgICAgICB0aGlzW3RoaXMudC0xXSB8PSAoeCYoKDE8PCh0aGlzLkRCLXNoKSktMSkpPDxzaDtcbiAgICAgICAgICB0aGlzW3RoaXMudCsrXSA9ICh4Pj4odGhpcy5EQi1zaCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzW3RoaXMudC0xXSB8PSB4PDxzaDtcbiAgICAgICAgc2ggKz0gaztcbiAgICAgICAgaWYoc2ggPj0gdGhpcy5EQikgc2ggLT0gdGhpcy5EQjtcbiAgICAgIH1cbiAgICAgIGlmKGsgPT0gOCAmJiAoc1swXSYweDgwKSAhPSAwKSB7XG4gICAgICAgIHRoaXMucyA9IC0xO1xuICAgICAgICBpZihzaCA+IDApIHRoaXNbdGhpcy50LTFdIHw9ICgoMTw8KHRoaXMuREItc2gpKS0xKTw8c2g7XG4gICAgICB9XG4gICAgICB0aGlzLmNsYW1wKCk7XG4gICAgICBpZihtaSkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY2xhbXAgb2ZmIGV4Y2VzcyBoaWdoIHdvcmRzXG4gICAgZnVuY3Rpb24gYm5wQ2xhbXAoKSB7XG4gICAgICB2YXIgYyA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgd2hpbGUodGhpcy50ID4gMCAmJiB0aGlzW3RoaXMudC0xXSA9PSBjKSAtLXRoaXMudDtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGdpdmVuIHJhZGl4XG4gICAgZnVuY3Rpb24gYm5Ub1N0cmluZyhiKSB7XG4gICAgICBpZih0aGlzLnMgPCAwKSByZXR1cm4gXCItXCIrdGhpcy5uZWdhdGUoKS50b1N0cmluZyhiKTtcbiAgICAgIHZhciBrO1xuICAgICAgaWYoYiA9PSAxNikgayA9IDQ7XG4gICAgICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gICAgICBlbHNlIGlmKGIgPT0gMikgayA9IDE7XG4gICAgICBlbHNlIGlmKGIgPT0gMzIpIGsgPSA1O1xuICAgICAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICAgICAgZWxzZSByZXR1cm4gdGhpcy50b1JhZGl4KGIpO1xuICAgICAgdmFyIGttID0gKDE8PGspLTEsIGQsIG0gPSBmYWxzZSwgciA9IFwiXCIsIGkgPSB0aGlzLnQ7XG4gICAgICB2YXIgcCA9IHRoaXMuREItKGkqdGhpcy5EQiklaztcbiAgICAgIGlmKGktLSA+IDApIHtcbiAgICAgICAgaWYocCA8IHRoaXMuREIgJiYgKGQgPSB0aGlzW2ldPj5wKSA+IDApIHsgbSA9IHRydWU7IHIgPSBpbnQyY2hhcihkKTsgfVxuICAgICAgICB3aGlsZShpID49IDApIHtcbiAgICAgICAgICBpZihwIDwgaykge1xuICAgICAgICAgICAgZCA9ICh0aGlzW2ldJigoMTw8cCktMSkpPDwoay1wKTtcbiAgICAgICAgICAgIGQgfD0gdGhpc1stLWldPj4ocCs9dGhpcy5EQi1rKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0+PihwLT1rKSkma207XG4gICAgICAgICAgICBpZihwIDw9IDApIHsgcCArPSB0aGlzLkRCOyAtLWk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZCA+IDApIG0gPSB0cnVlO1xuICAgICAgICAgIGlmKG0pIHIgKz0gaW50MmNoYXIoZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtP3I6XCIwXCI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgLXRoaXNcbiAgICBmdW5jdGlvbiBibk5lZ2F0ZSgpIHsgdmFyIHIgPSBuYmkoKTsgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB8dGhpc3xcbiAgICBmdW5jdGlvbiBibkFicygpIHsgcmV0dXJuICh0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzOyB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gKyBpZiB0aGlzID4gYSwgLSBpZiB0aGlzIDwgYSwgMCBpZiBlcXVhbFxuICAgIGZ1bmN0aW9uIGJuQ29tcGFyZVRvKGEpIHtcbiAgICAgIHZhciByID0gdGhpcy5zLWEucztcbiAgICAgIGlmKHIgIT0gMCkgcmV0dXJuIHI7XG4gICAgICB2YXIgaSA9IHRoaXMudDtcbiAgICAgIHIgPSBpLWEudDtcbiAgICAgIGlmKHIgIT0gMCkgcmV0dXJuICh0aGlzLnM8MCk/LXI6cjtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSBpZigocj10aGlzW2ldLWFbaV0pICE9IDApIHJldHVybiByO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBiaXQgbGVuZ3RoIG9mIHRoZSBpbnRlZ2VyIHhcbiAgICBmdW5jdGlvbiBuYml0cyh4KSB7XG4gICAgICB2YXIgciA9IDEsIHQ7XG4gICAgICBpZigodD14Pj4+MTYpICE9IDApIHsgeCA9IHQ7IHIgKz0gMTY7IH1cbiAgICAgIGlmKCh0PXg+PjgpICE9IDApIHsgeCA9IHQ7IHIgKz0gODsgfVxuICAgICAgaWYoKHQ9eD4+NCkgIT0gMCkgeyB4ID0gdDsgciArPSA0OyB9XG4gICAgICBpZigodD14Pj4yKSAhPSAwKSB7IHggPSB0OyByICs9IDI7IH1cbiAgICAgIGlmKCh0PXg+PjEpICE9IDApIHsgeCA9IHQ7IHIgKz0gMTsgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBcInRoaXNcIlxuICAgIGZ1bmN0aW9uIGJuQml0TGVuZ3RoKCkge1xuICAgICAgaWYodGhpcy50IDw9IDApIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHRoaXMuREIqKHRoaXMudC0xKStuYml0cyh0aGlzW3RoaXMudC0xXV4odGhpcy5zJnRoaXMuRE0pKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA8PCBuKkRCXG4gICAgZnVuY3Rpb24gYm5wRExTaGlmdFRvKG4scikge1xuICAgICAgdmFyIGk7XG4gICAgICBmb3IoaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgcltpK25dID0gdGhpc1tpXTtcbiAgICAgIGZvcihpID0gbi0xOyBpID49IDA7IC0taSkgcltpXSA9IDA7XG4gICAgICByLnQgPSB0aGlzLnQrbjtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuKkRCXG4gICAgZnVuY3Rpb24gYm5wRFJTaGlmdFRvKG4scikge1xuICAgICAgZm9yKHZhciBpID0gbjsgaSA8IHRoaXMudDsgKytpKSByW2ktbl0gPSB0aGlzW2ldO1xuICAgICAgci50ID0gTWF0aC5tYXgodGhpcy50LW4sMCk7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPDwgblxuICAgIGZ1bmN0aW9uIGJucExTaGlmdFRvKG4scikge1xuICAgICAgdmFyIGJzID0gbiV0aGlzLkRCO1xuICAgICAgdmFyIGNicyA9IHRoaXMuREItYnM7XG4gICAgICB2YXIgYm0gPSAoMTw8Y2JzKS0xO1xuICAgICAgdmFyIGRzID0gTWF0aC5mbG9vcihuL3RoaXMuREIpLCBjID0gKHRoaXMuczw8YnMpJnRoaXMuRE0sIGk7XG4gICAgICBmb3IoaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkge1xuICAgICAgICByW2krZHMrMV0gPSAodGhpc1tpXT4+Y2JzKXxjO1xuICAgICAgICBjID0gKHRoaXNbaV0mYm0pPDxicztcbiAgICAgIH1cbiAgICAgIGZvcihpID0gZHMtMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSAwO1xuICAgICAgcltkc10gPSBjO1xuICAgICAgci50ID0gdGhpcy50K2RzKzE7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPj4gblxuICAgIGZ1bmN0aW9uIGJucFJTaGlmdFRvKG4scikge1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgICAgdmFyIGRzID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICAgICAgaWYoZHMgPj0gdGhpcy50KSB7IHIudCA9IDA7IHJldHVybjsgfVxuICAgICAgdmFyIGJzID0gbiV0aGlzLkRCO1xuICAgICAgdmFyIGNicyA9IHRoaXMuREItYnM7XG4gICAgICB2YXIgYm0gPSAoMTw8YnMpLTE7XG4gICAgICByWzBdID0gdGhpc1tkc10+PmJzO1xuICAgICAgZm9yKHZhciBpID0gZHMrMTsgaSA8IHRoaXMudDsgKytpKSB7XG4gICAgICAgIHJbaS1kcy0xXSB8PSAodGhpc1tpXSZibSk8PGNicztcbiAgICAgICAgcltpLWRzXSA9IHRoaXNbaV0+PmJzO1xuICAgICAgfVxuICAgICAgaWYoYnMgPiAwKSByW3RoaXMudC1kcy0xXSB8PSAodGhpcy5zJmJtKTw8Y2JzO1xuICAgICAgci50ID0gdGhpcy50LWRzO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIC0gYVxuICAgIGZ1bmN0aW9uIGJucFN1YlRvKGEscikge1xuICAgICAgdmFyIGkgPSAwLCBjID0gMCwgbSA9IE1hdGgubWluKGEudCx0aGlzLnQpO1xuICAgICAgd2hpbGUoaSA8IG0pIHtcbiAgICAgICAgYyArPSB0aGlzW2ldLWFbaV07XG4gICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgIH1cbiAgICAgIGlmKGEudCA8IHRoaXMudCkge1xuICAgICAgICBjIC09IGEucztcbiAgICAgICAgd2hpbGUoaSA8IHRoaXMudCkge1xuICAgICAgICAgIGMgKz0gdGhpc1tpXTtcbiAgICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgfVxuICAgICAgICBjICs9IHRoaXMucztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjICs9IHRoaXMucztcbiAgICAgICAgd2hpbGUoaSA8IGEudCkge1xuICAgICAgICAgIGMgLT0gYVtpXTtcbiAgICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICAgICAgfVxuICAgICAgICBjIC09IGEucztcbiAgICAgIH1cbiAgICAgIHIucyA9IChjPDApPy0xOjA7XG4gICAgICBpZihjIDwgLTEpIHJbaSsrXSA9IHRoaXMuRFYrYztcbiAgICAgIGVsc2UgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gICAgICByLnQgPSBpO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzICogYSwgciAhPSB0aGlzLGEgKEhBQyAxNC4xMilcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlUbyhhLHIpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5hYnMoKSwgeSA9IGEuYWJzKCk7XG4gICAgICB2YXIgaSA9IHgudDtcbiAgICAgIHIudCA9IGkreS50O1xuICAgICAgd2hpbGUoLS1pID49IDApIHJbaV0gPSAwO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgeS50OyArK2kpIHJbaSt4LnRdID0geC5hbSgwLHlbaV0scixpLDAseC50KTtcbiAgICAgIHIucyA9IDA7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICBpZih0aGlzLnMgIT0gYS5zKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpc14yLCByICE9IHRoaXMgKEhBQyAxNC4xNilcbiAgICBmdW5jdGlvbiBibnBTcXVhcmVUbyhyKSB7XG4gICAgICB2YXIgeCA9IHRoaXMuYWJzKCk7XG4gICAgICB2YXIgaSA9IHIudCA9IDIqeC50O1xuICAgICAgd2hpbGUoLS1pID49IDApIHJbaV0gPSAwO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgeC50LTE7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHguYW0oaSx4W2ldLHIsMippLDAsMSk7XG4gICAgICAgIGlmKChyW2kreC50XSs9eC5hbShpKzEsMip4W2ldLHIsMippKzEsYyx4LnQtaS0xKSkgPj0geC5EVikge1xuICAgICAgICAgIHJbaSt4LnRdIC09IHguRFY7XG4gICAgICAgICAgcltpK3gudCsxXSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKHIudCA+IDApIHJbci50LTFdICs9IHguYW0oaSx4W2ldLHIsMippLDAsMSk7XG4gICAgICByLnMgPSAwO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGRpdmlkZSB0aGlzIGJ5IG0sIHF1b3RpZW50IGFuZCByZW1haW5kZXIgdG8gcSwgciAoSEFDIDE0LjIwKVxuICAgIC8vIHIgIT0gcSwgdGhpcyAhPSBtLiAgcSBvciByIG1heSBiZSBudWxsLlxuICAgIGZ1bmN0aW9uIGJucERpdlJlbVRvKG0scSxyKSB7XG4gICAgICB2YXIgcG0gPSBtLmFicygpO1xuICAgICAgaWYocG0udCA8PSAwKSByZXR1cm47XG4gICAgICB2YXIgcHQgPSB0aGlzLmFicygpO1xuICAgICAgaWYocHQudCA8IHBtLnQpIHtcbiAgICAgICAgaWYocSAhPSBudWxsKSBxLmZyb21JbnQoMCk7XG4gICAgICAgIGlmKHIgIT0gbnVsbCkgdGhpcy5jb3B5VG8ocik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmKHIgPT0gbnVsbCkgciA9IG5iaSgpO1xuICAgICAgdmFyIHkgPSBuYmkoKSwgdHMgPSB0aGlzLnMsIG1zID0gbS5zO1xuICAgICAgdmFyIG5zaCA9IHRoaXMuREItbmJpdHMocG1bcG0udC0xXSk7ICAgLy8gbm9ybWFsaXplIG1vZHVsdXNcbiAgICAgIGlmKG5zaCA+IDApIHsgcG0ubFNoaWZ0VG8obnNoLHkpOyBwdC5sU2hpZnRUbyhuc2gscik7IH1cbiAgICAgIGVsc2UgeyBwbS5jb3B5VG8oeSk7IHB0LmNvcHlUbyhyKTsgfVxuICAgICAgdmFyIHlzID0geS50O1xuICAgICAgdmFyIHkwID0geVt5cy0xXTtcbiAgICAgIGlmKHkwID09IDApIHJldHVybjtcbiAgICAgIHZhciB5dCA9IHkwKigxPDx0aGlzLkYxKSsoKHlzPjEpP3lbeXMtMl0+PnRoaXMuRjI6MCk7XG4gICAgICB2YXIgZDEgPSB0aGlzLkZWL3l0LCBkMiA9ICgxPDx0aGlzLkYxKS95dCwgZSA9IDE8PHRoaXMuRjI7XG4gICAgICB2YXIgaSA9IHIudCwgaiA9IGkteXMsIHQgPSAocT09bnVsbCk/bmJpKCk6cTtcbiAgICAgIHkuZGxTaGlmdFRvKGosdCk7XG4gICAgICBpZihyLmNvbXBhcmVUbyh0KSA+PSAwKSB7XG4gICAgICAgIHJbci50KytdID0gMTtcbiAgICAgICAgci5zdWJUbyh0LHIpO1xuICAgICAgfVxuICAgICAgQmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO1xuICAgICAgdC5zdWJUbyh5LHkpOyAgLy8gXCJuZWdhdGl2ZVwiIHkgc28gd2UgY2FuIHJlcGxhY2Ugc3ViIHdpdGggYW0gbGF0ZXJcbiAgICAgIHdoaWxlKHkudCA8IHlzKSB5W3kudCsrXSA9IDA7XG4gICAgICB3aGlsZSgtLWogPj0gMCkge1xuICAgICAgICAvLyBFc3RpbWF0ZSBxdW90aWVudCBkaWdpdFxuICAgICAgICB2YXIgcWQgPSAoclstLWldPT15MCk/dGhpcy5ETTpNYXRoLmZsb29yKHJbaV0qZDErKHJbaS0xXStlKSpkMik7XG4gICAgICAgIGlmKChyW2ldKz15LmFtKDAscWQscixqLDAseXMpKSA8IHFkKSB7ICAgLy8gVHJ5IGl0IG91dFxuICAgICAgICAgIHkuZGxTaGlmdFRvKGosdCk7XG4gICAgICAgICAgci5zdWJUbyh0LHIpO1xuICAgICAgICAgIHdoaWxlKHJbaV0gPCAtLXFkKSByLnN1YlRvKHQscik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKHEgIT0gbnVsbCkge1xuICAgICAgICByLmRyU2hpZnRUbyh5cyxxKTtcbiAgICAgICAgaWYodHMgIT0gbXMpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpO1xuICAgICAgfVxuICAgICAgci50ID0geXM7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICBpZihuc2ggPiAwKSByLnJTaGlmdFRvKG5zaCxyKTsgLy8gRGVub3JtYWxpemUgcmVtYWluZGVyXG4gICAgICBpZih0cyA8IDApIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgbW9kIGFcbiAgICBmdW5jdGlvbiBibk1vZChhKSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgdGhpcy5hYnMoKS5kaXZSZW1UbyhhLG51bGwscik7XG4gICAgICBpZih0aGlzLnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSBhLnN1YlRvKHIscik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyBNb2R1bGFyIHJlZHVjdGlvbiB1c2luZyBcImNsYXNzaWNcIiBhbGdvcml0aG1cbiAgICBmdW5jdGlvbiBDbGFzc2ljKG0pIHsgdGhpcy5tID0gbTsgfVxuICAgIGZ1bmN0aW9uIGNDb252ZXJ0KHgpIHtcbiAgICAgIGlmKHgucyA8IDAgfHwgeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgIGVsc2UgcmV0dXJuIHg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNSZXZlcnQoeCkgeyByZXR1cm4geDsgfVxuICAgIGZ1bmN0aW9uIGNSZWR1Y2UoeCkgeyB4LmRpdlJlbVRvKHRoaXMubSxudWxsLHgpOyB9XG4gICAgZnVuY3Rpb24gY011bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuICAgIGZ1bmN0aW9uIGNTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIENsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQgPSBjQ29udmVydDtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQgPSBjUmV2ZXJ0O1xuICAgIENsYXNzaWMucHJvdG90eXBlLnJlZHVjZSA9IGNSZWR1Y2U7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUubXVsVG8gPSBjTXVsVG87XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUuc3FyVG8gPSBjU3FyVG87XG5cbiAgICAvLyAocHJvdGVjdGVkKSByZXR1cm4gXCItMS90aGlzICUgMl5EQlwiOyB1c2VmdWwgZm9yIE1vbnQuIHJlZHVjdGlvblxuICAgIC8vIGp1c3RpZmljYXRpb246XG4gICAgLy8gICAgICAgICB4eSA9PSAxIChtb2QgbSlcbiAgICAvLyAgICAgICAgIHh5ID0gIDEra21cbiAgICAvLyAgIHh5KDIteHkpID0gKDEra20pKDEta20pXG4gICAgLy8geFt5KDIteHkpXSA9IDEta14ybV4yXG4gICAgLy8geFt5KDIteHkpXSA9PSAxIChtb2QgbV4yKVxuICAgIC8vIGlmIHkgaXMgMS94IG1vZCBtLCB0aGVuIHkoMi14eSkgaXMgMS94IG1vZCBtXjJcbiAgICAvLyBzaG91bGQgcmVkdWNlIHggYW5kIHkoMi14eSkgYnkgbV4yIGF0IGVhY2ggc3RlcCB0byBrZWVwIHNpemUgYm91bmRlZC5cbiAgICAvLyBKUyBtdWx0aXBseSBcIm92ZXJmbG93c1wiIGRpZmZlcmVudGx5IGZyb20gQy9DKyssIHNvIGNhcmUgaXMgbmVlZGVkIGhlcmUuXG4gICAgZnVuY3Rpb24gYm5wSW52RGlnaXQoKSB7XG4gICAgICBpZih0aGlzLnQgPCAxKSByZXR1cm4gMDtcbiAgICAgIHZhciB4ID0gdGhpc1swXTtcbiAgICAgIGlmKCh4JjEpID09IDApIHJldHVybiAwO1xuICAgICAgdmFyIHkgPSB4JjM7ICAgICAgIC8vIHkgPT0gMS94IG1vZCAyXjJcbiAgICAgIHkgPSAoeSooMi0oeCYweGYpKnkpKSYweGY7IC8vIHkgPT0gMS94IG1vZCAyXjRcbiAgICAgIHkgPSAoeSooMi0oeCYweGZmKSp5KSkmMHhmZjsgICAvLyB5ID09IDEveCBtb2QgMl44XG4gICAgICB5ID0gKHkqKDItKCgoeCYweGZmZmYpKnkpJjB4ZmZmZikpKSYweGZmZmY7ICAgIC8vIHkgPT0gMS94IG1vZCAyXjE2XG4gICAgICAvLyBsYXN0IHN0ZXAgLSBjYWxjdWxhdGUgaW52ZXJzZSBtb2QgRFYgZGlyZWN0bHk7XG4gICAgICAvLyBhc3N1bWVzIDE2IDwgREIgPD0gMzIgYW5kIGFzc3VtZXMgYWJpbGl0eSB0byBoYW5kbGUgNDgtYml0IGludHNcbiAgICAgIHkgPSAoeSooMi14KnkldGhpcy5EVikpJXRoaXMuRFY7ICAgICAgIC8vIHkgPT0gMS94IG1vZCAyXmRiaXRzXG4gICAgICAvLyB3ZSByZWFsbHkgd2FudCB0aGUgbmVnYXRpdmUgaW52ZXJzZSwgYW5kIC1EViA8IHkgPCBEVlxuICAgICAgcmV0dXJuICh5PjApP3RoaXMuRFYteToteTtcbiAgICB9XG5cbiAgICAvLyBNb250Z29tZXJ5IHJlZHVjdGlvblxuICAgIGZ1bmN0aW9uIE1vbnRnb21lcnkobSkge1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMubXAgPSBtLmludkRpZ2l0KCk7XG4gICAgICB0aGlzLm1wbCA9IHRoaXMubXAmMHg3ZmZmO1xuICAgICAgdGhpcy5tcGggPSB0aGlzLm1wPj4xNTtcbiAgICAgIHRoaXMudW0gPSAoMTw8KG0uREItMTUpKS0xO1xuICAgICAgdGhpcy5tdDIgPSAyKm0udDtcbiAgICB9XG5cbiAgICAvLyB4UiBtb2QgbVxuICAgIGZ1bmN0aW9uIG1vbnRDb252ZXJ0KHgpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICB4LmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxyKTtcbiAgICAgIHIuZGl2UmVtVG8odGhpcy5tLG51bGwscik7XG4gICAgICBpZih4LnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSB0aGlzLm0uc3ViVG8ocixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIHgvUiBtb2QgbVxuICAgIGZ1bmN0aW9uIG1vbnRSZXZlcnQoeCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIHguY29weVRvKHIpO1xuICAgICAgdGhpcy5yZWR1Y2Uocik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyB4ID0geC9SIG1vZCBtIChIQUMgMTQuMzIpXG4gICAgZnVuY3Rpb24gbW9udFJlZHVjZSh4KSB7XG4gICAgICB3aGlsZSh4LnQgPD0gdGhpcy5tdDIpIC8vIHBhZCB4IHNvIGFtIGhhcyBlbm91Z2ggcm9vbSBsYXRlclxuICAgICAgICB4W3gudCsrXSA9IDA7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5tLnQ7ICsraSkge1xuICAgICAgICAvLyBmYXN0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHUwID0geFtpXSptcCBtb2QgRFZcbiAgICAgICAgdmFyIGogPSB4W2ldJjB4N2ZmZjtcbiAgICAgICAgdmFyIHUwID0gKGoqdGhpcy5tcGwrKCgoaip0aGlzLm1waCsoeFtpXT4+MTUpKnRoaXMubXBsKSZ0aGlzLnVtKTw8MTUpKSZ4LkRNO1xuICAgICAgICAvLyB1c2UgYW0gdG8gY29tYmluZSB0aGUgbXVsdGlwbHktc2hpZnQtYWRkIGludG8gb25lIGNhbGxcbiAgICAgICAgaiA9IGkrdGhpcy5tLnQ7XG4gICAgICAgIHhbal0gKz0gdGhpcy5tLmFtKDAsdTAseCxpLDAsdGhpcy5tLnQpO1xuICAgICAgICAvLyBwcm9wYWdhdGUgY2FycnlcbiAgICAgICAgd2hpbGUoeFtqXSA+PSB4LkRWKSB7IHhbal0gLT0geC5EVjsgeFsrK2pdKys7IH1cbiAgICAgIH1cbiAgICAgIHguY2xhbXAoKTtcbiAgICAgIHguZHJTaGlmdFRvKHRoaXMubS50LHgpO1xuICAgICAgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSB4LnN1YlRvKHRoaXMubSx4KTtcbiAgICB9XG5cbiAgICAvLyByID0gXCJ4XjIvUiBtb2QgbVwiOyB4ICE9IHJcbiAgICBmdW5jdGlvbiBtb250U3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICAvLyByID0gXCJ4eS9SIG1vZCBtXCI7IHgseSAhPSByXG4gICAgZnVuY3Rpb24gbW9udE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydCA9IG1vbnRDb252ZXJ0O1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnJldmVydCA9IG1vbnRSZXZlcnQ7XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlID0gbW9udFJlZHVjZTtcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbyA9IG1vbnRNdWxUbztcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5zcXJUbyA9IG1vbnRTcXJUbztcblxuICAgIC8vIChwcm90ZWN0ZWQpIHRydWUgaWZmIHRoaXMgaXMgZXZlblxuICAgIGZ1bmN0aW9uIGJucElzRXZlbigpIHsgcmV0dXJuICgodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucykgPT0gMDsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdGhpc15lLCBlIDwgMl4zMiwgZG9pbmcgc3FyIGFuZCBtdWwgd2l0aCBcInJcIiAoSEFDIDE0Ljc5KVxuICAgIGZ1bmN0aW9uIGJucEV4cChlLHopIHtcbiAgICAgIGlmKGUgPiAweGZmZmZmZmZmIHx8IGUgPCAxKSByZXR1cm4gQmlnSW50ZWdlci5PTkU7XG4gICAgICB2YXIgciA9IG5iaSgpLCByMiA9IG5iaSgpLCBnID0gei5jb252ZXJ0KHRoaXMpLCBpID0gbmJpdHMoZSktMTtcbiAgICAgIGcuY29weVRvKHIpO1xuICAgICAgd2hpbGUoLS1pID49IDApIHtcbiAgICAgICAgei5zcXJUbyhyLHIyKTtcbiAgICAgICAgaWYoKGUmKDE8PGkpKSA+IDApIHoubXVsVG8ocjIsZyxyKTtcbiAgICAgICAgZWxzZSB7IHZhciB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzXmUgJSBtLCAwIDw9IGUgPCAyXjMyXG4gICAgZnVuY3Rpb24gYm5Nb2RQb3dJbnQoZSxtKSB7XG4gICAgICB2YXIgejtcbiAgICAgIGlmKGUgPCAyNTYgfHwgbS5pc0V2ZW4oKSkgeiA9IG5ldyBDbGFzc2ljKG0pOyBlbHNlIHogPSBuZXcgTW9udGdvbWVyeShtKTtcbiAgICAgIHJldHVybiB0aGlzLmV4cChlLHopO1xuICAgIH1cblxuICAgIC8vIHByb3RlY3RlZFxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvcHlUbyA9IGJucENvcHlUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50ID0gYm5wRnJvbUludDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tU3RyaW5nID0gYm5wRnJvbVN0cmluZztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGFtcCA9IGJucENsYW1wO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbyA9IGJucERMU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kclNoaWZ0VG8gPSBibnBEUlNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubFNoaWZ0VG8gPSBibnBMU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbyA9IGJucFJTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YlRvID0gYm5wU3ViVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlUbyA9IGJucE11bHRpcGx5VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG8gPSBibnBTcXVhcmVUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZSZW1UbyA9IGJucERpdlJlbVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0ID0gYm5wSW52RGlnaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuID0gYm5wSXNFdmVuO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmV4cCA9IGJucEV4cDtcblxuICAgIC8vIHB1YmxpY1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nID0gYm5Ub1N0cmluZztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdhdGUgPSBibk5lZ2F0ZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBibkFicztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG8gPSBibkNvbXBhcmVUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXRMZW5ndGggPSBibkJpdExlbmd0aDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2QgPSBibk1vZDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQgPSBibk1vZFBvd0ludDtcblxuICAgIC8vIFwiY29uc3RhbnRzXCJcbiAgICBCaWdJbnRlZ2VyLlpFUk8gPSBuYnYoMCk7XG4gICAgQmlnSW50ZWdlci5PTkUgPSBuYnYoMSk7XG5cbiAgICAvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSAgVG9tIFd1XG4gICAgLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAvLyBTZWUgXCJMSUNFTlNFXCIgZm9yIGRldGFpbHMuXG5cbiAgICAvLyBFeHRlbmRlZCBKYXZhU2NyaXB0IEJOIGZ1bmN0aW9ucywgcmVxdWlyZWQgZm9yIFJTQSBwcml2YXRlIG9wcy5cblxuICAgIC8vIFZlcnNpb24gMS4xOiBuZXcgQmlnSW50ZWdlcihcIjBcIiwgMTApIHJldHVybnMgXCJwcm9wZXJcIiB6ZXJvXG4gICAgLy8gVmVyc2lvbiAxLjI6IHNxdWFyZSgpIEFQSSwgaXNQcm9iYWJsZVByaW1lIGZpeFxuXG4gICAgLy8gKHB1YmxpYylcbiAgICBmdW5jdGlvbiBibkNsb25lKCkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmNvcHlUbyhyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBpbnRlZ2VyXG4gICAgZnVuY3Rpb24gYm5JbnRWYWx1ZSgpIHtcbiAgICAgIGlmKHRoaXMucyA8IDApIHtcbiAgICAgICAgaWYodGhpcy50ID09IDEpIHJldHVybiB0aGlzWzBdLXRoaXMuRFY7XG4gICAgICAgIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYodGhpcy50ID09IDEpIHJldHVybiB0aGlzWzBdO1xuICAgICAgZWxzZSBpZih0aGlzLnQgPT0gMCkgcmV0dXJuIDA7XG4gICAgICAvLyBhc3N1bWVzIDE2IDwgREIgPCAzMlxuICAgICAgcmV0dXJuICgodGhpc1sxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzWzBdO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBieXRlXG4gICAgZnVuY3Rpb24gYm5CeXRlVmFsdWUoKSB7IHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDI0KT4+MjQ7IH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBzaG9ydCAoYXNzdW1lcyBEQj49MTYpXG4gICAgZnVuY3Rpb24gYm5TaG9ydFZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwxNik+PjE2OyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByZXR1cm4geCBzLnQuIHJeeCA8IERWXG4gICAgZnVuY3Rpb24gYm5wQ2h1bmtTaXplKHIpIHsgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqdGhpcy5EQi9NYXRoLmxvZyhyKSk7IH1cblxuICAgIC8vIChwdWJsaWMpIDAgaWYgdGhpcyA9PSAwLCAxIGlmIHRoaXMgPiAwXG4gICAgZnVuY3Rpb24gYm5TaWdOdW0oKSB7XG4gICAgICBpZih0aGlzLnMgPCAwKSByZXR1cm4gLTE7XG4gICAgICBlbHNlIGlmKHRoaXMudCA8PSAwIHx8ICh0aGlzLnQgPT0gMSAmJiB0aGlzWzBdIDw9IDApKSByZXR1cm4gMDtcbiAgICAgIGVsc2UgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY29udmVydCB0byByYWRpeCBzdHJpbmdcbiAgICBmdW5jdGlvbiBibnBUb1JhZGl4KGIpIHtcbiAgICAgIGlmKGIgPT0gbnVsbCkgYiA9IDEwO1xuICAgICAgaWYodGhpcy5zaWdudW0oKSA9PSAwIHx8IGIgPCAyIHx8IGIgPiAzNikgcmV0dXJuIFwiMFwiO1xuICAgICAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gICAgICB2YXIgYSA9IE1hdGgucG93KGIsY3MpO1xuICAgICAgdmFyIGQgPSBuYnYoYSksIHkgPSBuYmkoKSwgeiA9IG5iaSgpLCByID0gXCJcIjtcbiAgICAgIHRoaXMuZGl2UmVtVG8oZCx5LHopO1xuICAgICAgd2hpbGUoeS5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgciA9IChhK3ouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpICsgcjtcbiAgICAgICAgeS5kaXZSZW1UbyhkLHkseik7XG4gICAgICB9XG4gICAgICByZXR1cm4gei5pbnRWYWx1ZSgpLnRvU3RyaW5nKGIpICsgcjtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjb252ZXJ0IGZyb20gcmFkaXggc3RyaW5nXG4gICAgZnVuY3Rpb24gYm5wRnJvbVJhZGl4KHMsYikge1xuICAgICAgdGhpcy5mcm9tSW50KDApO1xuICAgICAgaWYoYiA9PSBudWxsKSBiID0gMTA7XG4gICAgICB2YXIgY3MgPSB0aGlzLmNodW5rU2l6ZShiKTtcbiAgICAgIHZhciBkID0gTWF0aC5wb3coYixjcyksIG1pID0gZmFsc2UsIGogPSAwLCB3ID0gMDtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciB4ID0gaW50QXQocyxpKTtcbiAgICAgICAgaWYoeCA8IDApIHtcbiAgICAgICAgICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIiAmJiB0aGlzLnNpZ251bSgpID09IDApIG1pID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB3ID0gYip3K3g7XG4gICAgICAgIGlmKCsraiA+PSBjcykge1xuICAgICAgICAgIHRoaXMuZE11bHRpcGx5KGQpO1xuICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICAgICAgICAgIGogPSAwO1xuICAgICAgICAgIHcgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihqID4gMCkge1xuICAgICAgICB0aGlzLmRNdWx0aXBseShNYXRoLnBvdyhiLGopKTtcbiAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7XG4gICAgICB9XG4gICAgICBpZihtaSkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24gYm5wRnJvbU51bWJlcihhLGIsYykge1xuICAgICAgaWYoXCJudW1iZXJcIiA9PSB0eXBlb2YgYikge1xuICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsaW50LFJORylcbiAgICAgICAgaWYoYSA8IDIpIHRoaXMuZnJvbUludCgxKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5mcm9tTnVtYmVyKGEsYyk7XG4gICAgICAgICAgaWYoIXRoaXMudGVzdEJpdChhLTEpKVx0Ly8gZm9yY2UgTVNCIHNldFxuICAgICAgICAgICAgdGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksb3Bfb3IsdGhpcyk7XG4gICAgICAgICAgaWYodGhpcy5pc0V2ZW4oKSkgdGhpcy5kQWRkT2Zmc2V0KDEsMCk7IC8vIGZvcmNlIG9kZFxuICAgICAgICAgIHdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShiKSkge1xuICAgICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KDIsMCk7XG4gICAgICAgICAgICBpZih0aGlzLmJpdExlbmd0aCgpID4gYSkgdGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSx0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsUk5HKVxuICAgICAgICB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3O1xuICAgICAgICB4Lmxlbmd0aCA9IChhPj4zKSsxO1xuICAgICAgICBiLm5leHRCeXRlcyh4KTtcbiAgICAgICAgaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0xKTsgZWxzZSB4WzBdID0gMDtcbiAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHgsMjU2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBjb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5XG4gICAgZnVuY3Rpb24gYm5Ub0J5dGVBcnJheSgpIHtcbiAgICAgIHZhciBpID0gdGhpcy50LCByID0gbmV3IEFycmF5KCk7XG4gICAgICByWzBdID0gdGhpcy5zO1xuICAgICAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJTgsIGQsIGsgPSAwO1xuICAgICAgaWYoaS0tID4gMCkge1xuICAgICAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApICE9ICh0aGlzLnMmdGhpcy5ETSk+PnApXG4gICAgICAgICAgcltrKytdID0gZHwodGhpcy5zPDwodGhpcy5EQi1wKSk7XG4gICAgICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgICAgIGlmKHAgPCA4KSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PCg4LXApO1xuICAgICAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLTgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPTgpKSYweGZmO1xuICAgICAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKChkJjB4ODApICE9IDApIGQgfD0gLTI1NjtcbiAgICAgICAgICBpZihrID09IDAgJiYgKHRoaXMucyYweDgwKSAhPSAoZCYweDgwKSkgKytrO1xuICAgICAgICAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibkVxdWFscyhhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT09MCk7IH1cbiAgICBmdW5jdGlvbiBibk1pbihhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKTwwKT90aGlzOmE7IH1cbiAgICBmdW5jdGlvbiBibk1heChhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT4wKT90aGlzOmE7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIG9wIGEgKGJpdHdpc2UpXG4gICAgZnVuY3Rpb24gYm5wQml0d2lzZVRvKGEsb3Ascikge1xuICAgICAgdmFyIGksIGYsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIGZvcihpID0gMDsgaSA8IG07ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sYVtpXSk7XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgZiA9IGEucyZ0aGlzLkRNO1xuICAgICAgICBmb3IoaSA9IG07IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sZik7XG4gICAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmID0gdGhpcy5zJnRoaXMuRE07XG4gICAgICAgIGZvcihpID0gbTsgaSA8IGEudDsgKytpKSByW2ldID0gb3AoZixhW2ldKTtcbiAgICAgICAgci50ID0gYS50O1xuICAgICAgfVxuICAgICAgci5zID0gb3AodGhpcy5zLGEucyk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIGFcbiAgICBmdW5jdGlvbiBvcF9hbmQoeCx5KSB7IHJldHVybiB4Jnk7IH1cbiAgICBmdW5jdGlvbiBibkFuZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyB8IGFcbiAgICBmdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0dXJuIHh8eTsgfVxuICAgIGZ1bmN0aW9uIGJuT3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX29yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyBeIGFcbiAgICBmdW5jdGlvbiBvcF94b3IoeCx5KSB7IHJldHVybiB4Xnk7IH1cbiAgICBmdW5jdGlvbiBiblhvcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfeG9yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIH5hXG4gICAgZnVuY3Rpb24gb3BfYW5kbm90KHgseSkgeyByZXR1cm4geCZ+eTsgfVxuICAgIGZ1bmN0aW9uIGJuQW5kTm90KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmRub3Qscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB+dGhpc1xuICAgIGZ1bmN0aW9uIGJuTm90KCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IHRoaXMuRE0mfnRoaXNbaV07XG4gICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICByLnMgPSB+dGhpcy5zO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyA8PCBuXG4gICAgZnVuY3Rpb24gYm5TaGlmdExlZnQobikge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGlmKG4gPCAwKSB0aGlzLnJTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMubFNoaWZ0VG8obixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgPj4gblxuICAgIGZ1bmN0aW9uIGJuU2hpZnRSaWdodChuKSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgaWYobiA8IDApIHRoaXMubFNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5yU2hpZnRUbyhuLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGluZGV4IG9mIGxvd2VzdCAxLWJpdCBpbiB4LCB4IDwgMl4zMVxuICAgIGZ1bmN0aW9uIGxiaXQoeCkge1xuICAgICAgaWYoeCA9PSAwKSByZXR1cm4gLTE7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZigoeCYweGZmZmYpID09IDApIHsgeCA+Pj0gMTY7IHIgKz0gMTY7IH1cbiAgICAgIGlmKCh4JjB4ZmYpID09IDApIHsgeCA+Pj0gODsgciArPSA4OyB9XG4gICAgICBpZigoeCYweGYpID09IDApIHsgeCA+Pj0gNDsgciArPSA0OyB9XG4gICAgICBpZigoeCYzKSA9PSAwKSB7IHggPj49IDI7IHIgKz0gMjsgfVxuICAgICAgaWYoKHgmMSkgPT0gMCkgKytyO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJucyBpbmRleCBvZiBsb3dlc3QgMS1iaXQgKG9yIC0xIGlmIG5vbmUpXG4gICAgZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpXG4gICAgICAgIGlmKHRoaXNbaV0gIT0gMCkgcmV0dXJuIGkqdGhpcy5EQitsYml0KHRoaXNbaV0pO1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCp0aGlzLkRCO1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHhcbiAgICBmdW5jdGlvbiBjYml0KHgpIHtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHdoaWxlKHggIT0gMCkgeyB4ICY9IHgtMTsgKytyOyB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gbnVtYmVyIG9mIHNldCBiaXRzXG4gICAgZnVuY3Rpb24gYm5CaXRDb3VudCgpIHtcbiAgICAgIHZhciByID0gMCwgeCA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByICs9IGNiaXQodGhpc1tpXV54KTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRydWUgaWZmIG50aCBiaXQgaXMgc2V0XG4gICAgZnVuY3Rpb24gYm5UZXN0Qml0KG4pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICAgICAgaWYoaiA+PSB0aGlzLnQpIHJldHVybih0aGlzLnMhPTApO1xuICAgICAgcmV0dXJuKCh0aGlzW2pdJigxPDwobiV0aGlzLkRCKSkpIT0wKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzIG9wICgxPDxuKVxuICAgIGZ1bmN0aW9uIGJucENoYW5nZUJpdChuLG9wKSB7XG4gICAgICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbiAgICAgIHRoaXMuYml0d2lzZVRvKHIsb3Ascik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIHwgKDE8PG4pXG4gICAgZnVuY3Rpb24gYm5TZXRCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF9vcik7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiB+KDE8PG4pXG4gICAgZnVuY3Rpb24gYm5DbGVhckJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX2FuZG5vdCk7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgXiAoMTw8bilcbiAgICBmdW5jdGlvbiBibkZsaXBCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF94b3IpOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyArIGFcbiAgICBmdW5jdGlvbiBibnBBZGRUbyhhLHIpIHtcbiAgICAgIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIHdoaWxlKGkgPCBtKSB7XG4gICAgICAgIGMgKz0gdGhpc1tpXSthW2ldO1xuICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgYyArPSBhLnM7XG4gICAgICAgIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgICAgICBjICs9IGFbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSBhLnM7XG4gICAgICB9XG4gICAgICByLnMgPSAoYzwwKT8tMTowO1xuICAgICAgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gICAgICBlbHNlIGlmKGMgPCAtMSkgcltpKytdID0gdGhpcy5EVitjO1xuICAgICAgci50ID0gaTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICsgYVxuICAgIGZ1bmN0aW9uIGJuQWRkKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5hZGRUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAtIGFcbiAgICBmdW5jdGlvbiBiblN1YnRyYWN0KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zdWJUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAqIGFcbiAgICBmdW5jdGlvbiBibk11bHRpcGx5KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5tdWx0aXBseVRvKGEscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzXjJcbiAgICBmdW5jdGlvbiBiblNxdWFyZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zcXVhcmVUbyhyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgLyBhXG4gICAgZnVuY3Rpb24gYm5EaXZpZGUoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEscixudWxsKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJSBhXG4gICAgZnVuY3Rpb24gYm5SZW1haW5kZXIoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEsbnVsbCxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuICAgIGZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGEpIHtcbiAgICAgIHZhciBxID0gbmJpKCksIHIgPSBuYmkoKTtcbiAgICAgIHRoaXMuZGl2UmVtVG8oYSxxLHIpO1xuICAgICAgcmV0dXJuIG5ldyBBcnJheShxLHIpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKj0gbiwgdGhpcyA+PSAwLCAxIDwgbiA8IERWXG4gICAgZnVuY3Rpb24gYm5wRE11bHRpcGx5KG4pIHtcbiAgICAgIHRoaXNbdGhpcy50XSA9IHRoaXMuYW0oMCxuLTEsdGhpcywwLDAsdGhpcy50KTtcbiAgICAgICsrdGhpcy50O1xuICAgICAgdGhpcy5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKz0gbiA8PCB3IHdvcmRzLCB0aGlzID49IDBcbiAgICBmdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdykge1xuICAgICAgaWYobiA9PSAwKSByZXR1cm47XG4gICAgICB3aGlsZSh0aGlzLnQgPD0gdykgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgdGhpc1t3XSArPSBuO1xuICAgICAgd2hpbGUodGhpc1t3XSA+PSB0aGlzLkRWKSB7XG4gICAgICAgIHRoaXNbd10gLT0gdGhpcy5EVjtcbiAgICAgICAgaWYoKyt3ID49IHRoaXMudCkgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgICArK3RoaXNbd107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBcIm51bGxcIiByZWR1Y2VyXG4gICAgZnVuY3Rpb24gTnVsbEV4cCgpIHt9XG4gICAgZnVuY3Rpb24gbk5vcCh4KSB7IHJldHVybiB4OyB9XG4gICAgZnVuY3Rpb24gbk11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB9XG4gICAgZnVuY3Rpb24gblNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB9XG5cbiAgICBOdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQgPSBuTm9wO1xuICAgIE51bGxFeHAucHJvdG90eXBlLm11bFRvID0gbk11bFRvO1xuICAgIE51bGxFeHAucHJvdG90eXBlLnNxclRvID0gblNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lXG4gICAgZnVuY3Rpb24gYm5Qb3coZSkgeyByZXR1cm4gdGhpcy5leHAoZSxuZXcgTnVsbEV4cCgpKTsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IGxvd2VyIG4gd29yZHMgb2YgXCJ0aGlzICogYVwiLCBhLnQgPD0gblxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBmdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYSxuLHIpIHtcbiAgICAgIHZhciBpID0gTWF0aC5taW4odGhpcy50K2EudCxuKTtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHIudCA9IGk7XG4gICAgICB3aGlsZShpID4gMCkgclstLWldID0gMDtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yKGogPSByLnQtdGhpcy50OyBpIDwgajsgKytpKSByW2krdGhpcy50XSA9IHRoaXMuYW0oMCxhW2ldLHIsaSwwLHRoaXMudCk7XG4gICAgICBmb3IoaiA9IE1hdGgubWluKGEudCxuKTsgaSA8IGo7ICsraSkgdGhpcy5hbSgwLGFbaV0scixpLDAsbi1pKTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7XG4gICAgICAtLW47XG4gICAgICB2YXIgaSA9IHIudCA9IHRoaXMudCthLnQtbjtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gTWF0aC5tYXgobi10aGlzLnQsMCk7IGkgPCBhLnQ7ICsraSlcbiAgICAgICAgclt0aGlzLnQraS1uXSA9IHRoaXMuYW0obi1pLGFbaV0sciwwLDAsdGhpcy50K2ktbik7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICByLmRyU2hpZnRUbygxLHIpO1xuICAgIH1cblxuICAgIC8vIEJhcnJldHQgbW9kdWxhciByZWR1Y3Rpb25cbiAgICBmdW5jdGlvbiBCYXJyZXR0KG0pIHtcbiAgICAgIC8vIHNldHVwIEJhcnJldHRcbiAgICAgIHRoaXMucjIgPSBuYmkoKTtcbiAgICAgIHRoaXMucTMgPSBuYmkoKTtcbiAgICAgIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKm0udCx0aGlzLnIyKTtcbiAgICAgIHRoaXMubXUgPSB0aGlzLnIyLmRpdmlkZShtKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoeCkge1xuICAgICAgaWYoeC5zIDwgMCB8fCB4LnQgPiAyKnRoaXMubS50KSByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgIGVsc2UgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA8IDApIHJldHVybiB4O1xuICAgICAgZWxzZSB7IHZhciByID0gbmJpKCk7IHguY29weVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgcmV0dXJuIHI7IH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cblxuICAgIC8vIHggPSB4IG1vZCBtIChIQUMgMTQuNDIpXG4gICAgZnVuY3Rpb24gYmFycmV0dFJlZHVjZSh4KSB7XG4gICAgICB4LmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO1xuICAgICAgaWYoeC50ID4gdGhpcy5tLnQrMSkgeyB4LnQgPSB0aGlzLm0udCsxOyB4LmNsYW1wKCk7IH1cbiAgICAgIHRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTtcbiAgICAgIHRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO1xuICAgICAgd2hpbGUoeC5jb21wYXJlVG8odGhpcy5yMikgPCAwKSB4LmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKTtcbiAgICAgIHguc3ViVG8odGhpcy5yMix4KTtcbiAgICAgIHdoaWxlKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG4gICAgfVxuXG4gICAgLy8gciA9IHheMiBtb2QgbTsgeCAhPSByXG4gICAgZnVuY3Rpb24gYmFycmV0dFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbiAgICBmdW5jdGlvbiBiYXJyZXR0TXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBCYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0ID0gYmFycmV0dENvbnZlcnQ7XG4gICAgQmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0ID0gYmFycmV0dFJldmVydDtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2UgPSBiYXJyZXR0UmVkdWNlO1xuICAgIEJhcnJldHQucHJvdG90eXBlLm11bFRvID0gYmFycmV0dE11bFRvO1xuICAgIEJhcnJldHQucHJvdG90eXBlLnNxclRvID0gYmFycmV0dFNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lICUgbSAoSEFDIDE0Ljg1KVxuICAgIGZ1bmN0aW9uIGJuTW9kUG93KGUsbSkge1xuICAgICAgdmFyIGkgPSBlLmJpdExlbmd0aCgpLCBrLCByID0gbmJ2KDEpLCB6O1xuICAgICAgaWYoaSA8PSAwKSByZXR1cm4gcjtcbiAgICAgIGVsc2UgaWYoaSA8IDE4KSBrID0gMTtcbiAgICAgIGVsc2UgaWYoaSA8IDQ4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoaSA8IDE0NCkgayA9IDQ7XG4gICAgICBlbHNlIGlmKGkgPCA3NjgpIGsgPSA1O1xuICAgICAgZWxzZSBrID0gNjtcbiAgICAgIGlmKGkgPCA4KVxuICAgICAgICB6ID0gbmV3IENsYXNzaWMobSk7XG4gICAgICBlbHNlIGlmKG0uaXNFdmVuKCkpXG4gICAgICAgIHogPSBuZXcgQmFycmV0dChtKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuXG4gICAgICAvLyBwcmVjb21wdXRhdGlvblxuICAgICAgdmFyIGcgPSBuZXcgQXJyYXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xO1xuICAgICAgZ1sxXSA9IHouY29udmVydCh0aGlzKTtcbiAgICAgIGlmKGsgPiAxKSB7XG4gICAgICAgIHZhciBnMiA9IG5iaSgpO1xuICAgICAgICB6LnNxclRvKGdbMV0sZzIpO1xuICAgICAgICB3aGlsZShuIDw9IGttKSB7XG4gICAgICAgICAgZ1tuXSA9IG5iaSgpO1xuICAgICAgICAgIHoubXVsVG8oZzIsZ1tuLTJdLGdbbl0pO1xuICAgICAgICAgIG4gKz0gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaiA9IGUudC0xLCB3LCBpczEgPSB0cnVlLCByMiA9IG5iaSgpLCB0O1xuICAgICAgaSA9IG5iaXRzKGVbal0pLTE7XG4gICAgICB3aGlsZShqID49IDApIHtcbiAgICAgICAgaWYoaSA+PSBrMSkgdyA9IChlW2pdPj4oaS1rMSkpJmttO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3ID0gKGVbal0mKCgxPDwoaSsxKSktMSkpPDwoazEtaSk7XG4gICAgICAgICAgaWYoaiA+IDApIHcgfD0gZVtqLTFdPj4odGhpcy5EQitpLWsxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG4gPSBrO1xuICAgICAgICB3aGlsZSgodyYxKSA9PSAwKSB7IHcgPj49IDE7IC0tbjsgfVxuICAgICAgICBpZigoaSAtPSBuKSA8IDApIHsgaSArPSB0aGlzLkRCOyAtLWo7IH1cbiAgICAgICAgaWYoaXMxKSB7XHQvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0XG4gICAgICAgICAgZ1t3XS5jb3B5VG8ocik7XG4gICAgICAgICAgaXMxID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUobiA+IDEpIHsgei5zcXJUbyhyLHIyKTsgei5zcXJUbyhyMixyKTsgbiAtPSAyOyB9XG4gICAgICAgICAgaWYobiA+IDApIHouc3FyVG8ocixyMik7IGVsc2UgeyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgICAgICB6Lm11bFRvKHIyLGdbd10scik7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZShqID49IDAgJiYgKGVbal0mKDE8PGkpKSA9PSAwKSB7XG4gICAgICAgICAgei5zcXJUbyhyLHIyKTsgdCA9IHI7IHIgPSByMjsgcjIgPSB0O1xuICAgICAgICAgIGlmKC0taSA8IDApIHsgaSA9IHRoaXMuREItMTsgLS1qOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBnY2QodGhpcyxhKSAoSEFDIDE0LjU0KVxuICAgIGZ1bmN0aW9uIGJuR0NEKGEpIHtcbiAgICAgIHZhciB4ID0gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciB5ID0gKGEuczwwKT9hLm5lZ2F0ZSgpOmEuY2xvbmUoKTtcbiAgICAgIGlmKHguY29tcGFyZVRvKHkpIDwgMCkgeyB2YXIgdCA9IHg7IHggPSB5OyB5ID0gdDsgfVxuICAgICAgdmFyIGkgPSB4LmdldExvd2VzdFNldEJpdCgpLCBnID0geS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgIGlmKGcgPCAwKSByZXR1cm4geDtcbiAgICAgIGlmKGkgPCBnKSBnID0gaTtcbiAgICAgIGlmKGcgPiAwKSB7XG4gICAgICAgIHguclNoaWZ0VG8oZyx4KTtcbiAgICAgICAgeS5yU2hpZnRUbyhnLHkpO1xuICAgICAgfVxuICAgICAgd2hpbGUoeC5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgaWYoKGkgPSB4LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHguclNoaWZ0VG8oaSx4KTtcbiAgICAgICAgaWYoKGkgPSB5LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHkuclNoaWZ0VG8oaSx5KTtcbiAgICAgICAgaWYoeC5jb21wYXJlVG8oeSkgPj0gMCkge1xuICAgICAgICAgIHguc3ViVG8oeSx4KTtcbiAgICAgICAgICB4LnJTaGlmdFRvKDEseCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgeS5zdWJUbyh4LHkpO1xuICAgICAgICAgIHkuclNoaWZ0VG8oMSx5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoZyA+IDApIHkubFNoaWZ0VG8oZyx5KTtcbiAgICAgIHJldHVybiB5O1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgJSBuLCBuIDwgMl4yNlxuICAgIGZ1bmN0aW9uIGJucE1vZEludChuKSB7XG4gICAgICBpZihuIDw9IDApIHJldHVybiAwO1xuICAgICAgdmFyIGQgPSB0aGlzLkRWJW4sIHIgPSAodGhpcy5zPDApP24tMTowO1xuICAgICAgaWYodGhpcy50ID4gMClcbiAgICAgICAgaWYoZCA9PSAwKSByID0gdGhpc1swXSVuO1xuICAgICAgICBlbHNlIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgciA9IChkKnIrdGhpc1tpXSklbjtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIDEvdGhpcyAlIG0gKEhBQyAxNC42MSlcbiAgICBmdW5jdGlvbiBibk1vZEludmVyc2UobSkge1xuICAgICAgdmFyIGFjID0gbS5pc0V2ZW4oKTtcbiAgICAgIGlmKCh0aGlzLmlzRXZlbigpICYmIGFjKSB8fCBtLnNpZ251bSgpID09IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICB2YXIgdSA9IG0uY2xvbmUoKSwgdiA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciBhID0gbmJ2KDEpLCBiID0gbmJ2KDApLCBjID0gbmJ2KDApLCBkID0gbmJ2KDEpO1xuICAgICAgd2hpbGUodS5zaWdudW0oKSAhPSAwKSB7XG4gICAgICAgIHdoaWxlKHUuaXNFdmVuKCkpIHtcbiAgICAgICAgICB1LnJTaGlmdFRvKDEsdSk7XG4gICAgICAgICAgaWYoYWMpIHtcbiAgICAgICAgICAgIGlmKCFhLmlzRXZlbigpIHx8ICFiLmlzRXZlbigpKSB7IGEuYWRkVG8odGhpcyxhKTsgYi5zdWJUbyhtLGIpOyB9XG4gICAgICAgICAgICBhLnJTaGlmdFRvKDEsYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoIWIuaXNFdmVuKCkpIGIuc3ViVG8obSxiKTtcbiAgICAgICAgICBiLnJTaGlmdFRvKDEsYik7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUodi5pc0V2ZW4oKSkge1xuICAgICAgICAgIHYuclNoaWZ0VG8oMSx2KTtcbiAgICAgICAgICBpZihhYykge1xuICAgICAgICAgICAgaWYoIWMuaXNFdmVuKCkgfHwgIWQuaXNFdmVuKCkpIHsgYy5hZGRUbyh0aGlzLGMpOyBkLnN1YlRvKG0sZCk7IH1cbiAgICAgICAgICAgIGMuclNoaWZ0VG8oMSxjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighZC5pc0V2ZW4oKSkgZC5zdWJUbyhtLGQpO1xuICAgICAgICAgIGQuclNoaWZ0VG8oMSxkKTtcbiAgICAgICAgfVxuICAgICAgICBpZih1LmNvbXBhcmVUbyh2KSA+PSAwKSB7XG4gICAgICAgICAgdS5zdWJUbyh2LHUpO1xuICAgICAgICAgIGlmKGFjKSBhLnN1YlRvKGMsYSk7XG4gICAgICAgICAgYi5zdWJUbyhkLGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHYuc3ViVG8odSx2KTtcbiAgICAgICAgICBpZihhYykgYy5zdWJUbyhhLGMpO1xuICAgICAgICAgIGQuc3ViVG8oYixkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICBpZihkLmNvbXBhcmVUbyhtKSA+PSAwKSByZXR1cm4gZC5zdWJ0cmFjdChtKTtcbiAgICAgIGlmKGQuc2lnbnVtKCkgPCAwKSBkLmFkZFRvKG0sZCk7IGVsc2UgcmV0dXJuIGQ7XG4gICAgICBpZihkLnNpZ251bSgpIDwgMCkgcmV0dXJuIGQuYWRkKG0pOyBlbHNlIHJldHVybiBkO1xuICAgIH1cblxuICAgIHZhciBsb3dwcmltZXMgPSBbMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTtcbiAgICB2YXIgbHBsaW0gPSAoMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO1xuXG4gICAgLy8gKHB1YmxpYykgdGVzdCBwcmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50XG4gICAgZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUodCkge1xuICAgICAgdmFyIGksIHggPSB0aGlzLmFicygpO1xuICAgICAgaWYoeC50ID09IDEgJiYgeFswXSA8PSBsb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsb3dwcmltZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgaWYoeFswXSA9PSBsb3dwcmltZXNbaV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZih4LmlzRXZlbigpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpID0gMTtcbiAgICAgIHdoaWxlKGkgPCBsb3dwcmltZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtID0gbG93cHJpbWVzW2ldLCBqID0gaSsxO1xuICAgICAgICB3aGlsZShqIDwgbG93cHJpbWVzLmxlbmd0aCAmJiBtIDwgbHBsaW0pIG0gKj0gbG93cHJpbWVzW2orK107XG4gICAgICAgIG0gPSB4Lm1vZEludChtKTtcbiAgICAgICAgd2hpbGUoaSA8IGopIGlmKG0lbG93cHJpbWVzW2krK10gPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgubWlsbGVyUmFiaW4odCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQsIE1pbGxlci1SYWJpbilcbiAgICBmdW5jdGlvbiBibnBNaWxsZXJSYWJpbih0KSB7XG4gICAgICB2YXIgbjEgPSB0aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgIHZhciBrID0gbjEuZ2V0TG93ZXN0U2V0Qml0KCk7XG4gICAgICBpZihrIDw9IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciByID0gbjEuc2hpZnRSaWdodChrKTtcbiAgICAgIHQgPSAodCsxKT4+MTtcbiAgICAgIGlmKHQgPiBsb3dwcmltZXMubGVuZ3RoKSB0ID0gbG93cHJpbWVzLmxlbmd0aDtcbiAgICAgIHZhciBhID0gbmJpKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdDsgKytpKSB7XG4gICAgICAgIC8vUGljayBiYXNlcyBhdCByYW5kb20sIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgMlxuICAgICAgICBhLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO1xuICAgICAgICB2YXIgeSA9IGEubW9kUG93KHIsdGhpcyk7XG4gICAgICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICAgIHdoaWxlKGorKyA8IGsgJiYgeS5jb21wYXJlVG8objEpICE9IDApIHtcbiAgICAgICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpO1xuICAgICAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvdGVjdGVkXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplID0gYm5wQ2h1bmtTaXplO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBibnBUb1JhZGl4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeCA9IGJucEZyb21SYWRpeDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyID0gYm5wRnJvbU51bWJlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0ID0gYm5wQ2hhbmdlQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvID0gYm5wQWRkVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQgPSBibnBEQWRkT2Zmc2V0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbyA9IGJucE11bHRpcGx5TG93ZXJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50ID0gYm5wTW9kSW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluID0gYm5wTWlsbGVyUmFiaW47XG5cbiAgICAvLyBwdWJsaWNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZSA9IGJuQ2xvbmU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZSA9IGJuQnl0ZVZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWUgPSBiblNob3J0VmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gYm5TaWdOdW07XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBiblRvQnl0ZUFycmF5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscyA9IGJuRXF1YWxzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1heCA9IGJuTWF4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZCA9IGJuQW5kO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBiblhvcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3QgPSBibkFuZE5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBibk5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQgPSBiblNoaWZ0TGVmdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gYm5TaGlmdFJpZ2h0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdCA9IGJuR2V0TG93ZXN0U2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50ID0gYm5CaXRDb3VudDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0ID0gYm5UZXN0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGJuU2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0ID0gYm5DbGVhckJpdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0ID0gYm5GbGlwQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZCA9IGJuQWRkO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gYm5TdWJ0cmFjdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGJuTXVsdGlwbHk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlID0gYm5EaXZpZGU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gYm5SZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyID0gYm5EaXZpZGVBbmRSZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gYm5Nb2RQb3c7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZSA9IGJuTW9kSW52ZXJzZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBiblBvdztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWUgPSBibklzUHJvYmFibGVQcmltZTtcblxuICAgIC8vIEpTQk4tc3BlY2lmaWMgZXh0ZW5zaW9uXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlID0gYm5TcXVhcmU7XG5cbiAgICAvLyBFeHBvc2UgdGhlIEJhcnJldHQgZnVuY3Rpb25cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5CYXJyZXR0ID0gQmFycmV0dFxuXG4gICAgLy8gQmlnSW50ZWdlciBpbnRlcmZhY2VzIG5vdCBpbXBsZW1lbnRlZCBpbiBqc2JuOlxuXG4gICAgLy8gQmlnSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKVxuICAgIC8vIGRvdWJsZSBkb3VibGVWYWx1ZSgpXG4gICAgLy8gZmxvYXQgZmxvYXRWYWx1ZSgpXG4gICAgLy8gaW50IGhhc2hDb2RlKClcbiAgICAvLyBsb25nIGxvbmdWYWx1ZSgpXG4gICAgLy8gc3RhdGljIEJpZ0ludGVnZXIgdmFsdWVPZihsb25nIHZhbClcblxuXHQvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciAtIHJlcXVpcmVzIGEgUFJORyBiYWNrZW5kLCBlLmcuIHBybmc0LmpzXG5cblx0Ly8gRm9yIGJlc3QgcmVzdWx0cywgcHV0IGNvZGUgbGlrZVxuXHQvLyA8Ym9keSBvbkNsaWNrPSdybmdfc2VlZF90aW1lKCk7JyBvbktleVByZXNzPSdybmdfc2VlZF90aW1lKCk7Jz5cblx0Ly8gaW4geW91ciBtYWluIEhUTUwgZG9jdW1lbnQuXG5cblx0dmFyIHJuZ19zdGF0ZTtcblx0dmFyIHJuZ19wb29sO1xuXHR2YXIgcm5nX3BwdHI7XG5cblx0Ly8gTWl4IGluIGEgMzItYml0IGludGVnZXIgaW50byB0aGUgcG9vbFxuXHRmdW5jdGlvbiBybmdfc2VlZF9pbnQoeCkge1xuXHQgIHJuZ19wb29sW3JuZ19wcHRyKytdIF49IHggJiAyNTU7XG5cdCAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gOCkgJiAyNTU7XG5cdCAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gMTYpICYgMjU1O1xuXHQgIHJuZ19wb29sW3JuZ19wcHRyKytdIF49ICh4ID4+IDI0KSAmIDI1NTtcblx0ICBpZihybmdfcHB0ciA+PSBybmdfcHNpemUpIHJuZ19wcHRyIC09IHJuZ19wc2l6ZTtcblx0fVxuXG5cdC8vIE1peCBpbiB0aGUgY3VycmVudCB0aW1lICh3L21pbGxpc2Vjb25kcykgaW50byB0aGUgcG9vbFxuXHRmdW5jdGlvbiBybmdfc2VlZF90aW1lKCkge1xuXHQgIHJuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cdH1cblxuXHQvLyBJbml0aWFsaXplIHRoZSBwb29sIHdpdGgganVuayBpZiBuZWVkZWQuXG5cdGlmKHJuZ19wb29sID09IG51bGwpIHtcblx0ICBybmdfcG9vbCA9IG5ldyBBcnJheSgpO1xuXHQgIHJuZ19wcHRyID0gMDtcblx0ICB2YXIgdDtcblx0ICBpZih0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5jcnlwdG8pIHtcblx0XHRpZiAod2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcblx0XHQgIC8vIFVzZSB3ZWJjcnlwdG8gaWYgYXZhaWxhYmxlXG5cdFx0ICB2YXIgdWEgPSBuZXcgVWludDhBcnJheSgzMik7XG5cdFx0ICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7XG5cdFx0ICBmb3IodCA9IDA7IHQgPCAzMjsgKyt0KVxuXHRcdFx0cm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB1YVt0XTtcblx0XHR9XG5cdFx0ZWxzZSBpZihuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk5ldHNjYXBlXCIgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24gPCBcIjVcIikge1xuXHRcdCAgLy8gRXh0cmFjdCBlbnRyb3B5ICgyNTYgYml0cykgZnJvbSBOUzQgUk5HIGlmIGF2YWlsYWJsZVxuXHRcdCAgdmFyIHogPSB3aW5kb3cuY3J5cHRvLnJhbmRvbSgzMik7XG5cdFx0ICBmb3IodCA9IDA7IHQgPCB6Lmxlbmd0aDsgKyt0KVxuXHRcdFx0cm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB6LmNoYXJDb2RlQXQodCkgJiAyNTU7XG5cdFx0fVxuXHQgIH1cblx0ICB3aGlsZShybmdfcHB0ciA8IHJuZ19wc2l6ZSkgeyAgLy8gZXh0cmFjdCBzb21lIHJhbmRvbW5lc3MgZnJvbSBNYXRoLnJhbmRvbSgpXG5cdFx0dCA9IE1hdGguZmxvb3IoNjU1MzYgKiBNYXRoLnJhbmRvbSgpKTtcblx0XHRybmdfcG9vbFtybmdfcHB0cisrXSA9IHQgPj4+IDg7XG5cdFx0cm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB0ICYgMjU1O1xuXHQgIH1cblx0ICBybmdfcHB0ciA9IDA7XG5cdCAgcm5nX3NlZWRfdGltZSgpO1xuXHQgIC8vcm5nX3NlZWRfaW50KHdpbmRvdy5zY3JlZW5YKTtcblx0ICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWSk7XG5cdH1cblxuXHRmdW5jdGlvbiBybmdfZ2V0X2J5dGUoKSB7XG5cdCAgaWYocm5nX3N0YXRlID09IG51bGwpIHtcblx0XHRybmdfc2VlZF90aW1lKCk7XG5cdFx0cm5nX3N0YXRlID0gcHJuZ19uZXdzdGF0ZSgpO1xuXHRcdHJuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTtcblx0XHRmb3Iocm5nX3BwdHIgPSAwOyBybmdfcHB0ciA8IHJuZ19wb29sLmxlbmd0aDsgKytybmdfcHB0cilcblx0XHQgIHJuZ19wb29sW3JuZ19wcHRyXSA9IDA7XG5cdFx0cm5nX3BwdHIgPSAwO1xuXHRcdC8vcm5nX3Bvb2wgPSBudWxsO1xuXHQgIH1cblx0ICAvLyBUT0RPOiBhbGxvdyByZXNlZWRpbmcgYWZ0ZXIgZmlyc3QgcmVxdWVzdFxuXHQgIHJldHVybiBybmdfc3RhdGUubmV4dCgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcm5nX2dldF9ieXRlcyhiYSkge1xuXHQgIHZhciBpO1xuXHQgIGZvcihpID0gMDsgaSA8IGJhLmxlbmd0aDsgKytpKSBiYVtpXSA9IHJuZ19nZXRfYnl0ZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCkge31cblxuXHRTZWN1cmVSYW5kb20ucHJvdG90eXBlLm5leHRCeXRlcyA9IHJuZ19nZXRfYnl0ZXM7XG5cblx0Ly8gcHJuZzQuanMgLSB1c2VzIEFyY2ZvdXIgYXMgYSBQUk5HXG5cblx0ZnVuY3Rpb24gQXJjZm91cigpIHtcblx0ICB0aGlzLmkgPSAwO1xuXHQgIHRoaXMuaiA9IDA7XG5cdCAgdGhpcy5TID0gbmV3IEFycmF5KCk7XG5cdH1cblxuXHQvLyBJbml0aWFsaXplIGFyY2ZvdXIgY29udGV4dCBmcm9tIGtleSwgYW4gYXJyYXkgb2YgaW50cywgZWFjaCBmcm9tIFswLi4yNTVdXG5cdGZ1bmN0aW9uIEFSQzRpbml0KGtleSkge1xuXHQgIHZhciBpLCBqLCB0O1xuXHQgIGZvcihpID0gMDsgaSA8IDI1NjsgKytpKVxuXHRcdHRoaXMuU1tpXSA9IGk7XG5cdCAgaiA9IDA7XG5cdCAgZm9yKGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcblx0XHRqID0gKGogKyB0aGlzLlNbaV0gKyBrZXlbaSAlIGtleS5sZW5ndGhdKSAmIDI1NTtcblx0XHR0ID0gdGhpcy5TW2ldO1xuXHRcdHRoaXMuU1tpXSA9IHRoaXMuU1tqXTtcblx0XHR0aGlzLlNbal0gPSB0O1xuXHQgIH1cblx0ICB0aGlzLmkgPSAwO1xuXHQgIHRoaXMuaiA9IDA7XG5cdH1cblxuXHRmdW5jdGlvbiBBUkM0bmV4dCgpIHtcblx0ICB2YXIgdDtcblx0ICB0aGlzLmkgPSAodGhpcy5pICsgMSkgJiAyNTU7XG5cdCAgdGhpcy5qID0gKHRoaXMuaiArIHRoaXMuU1t0aGlzLmldKSAmIDI1NTtcblx0ICB0ID0gdGhpcy5TW3RoaXMuaV07XG5cdCAgdGhpcy5TW3RoaXMuaV0gPSB0aGlzLlNbdGhpcy5qXTtcblx0ICB0aGlzLlNbdGhpcy5qXSA9IHQ7XG5cdCAgcmV0dXJuIHRoaXMuU1sodCArIHRoaXMuU1t0aGlzLmldKSAmIDI1NV07XG5cdH1cblxuXHRBcmNmb3VyLnByb3RvdHlwZS5pbml0ID0gQVJDNGluaXQ7XG5cdEFyY2ZvdXIucHJvdG90eXBlLm5leHQgPSBBUkM0bmV4dDtcblxuXHQvLyBQbHVnIGluIHlvdXIgUk5HIGNvbnN0cnVjdG9yIGhlcmVcblx0ZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpIHtcblx0ICByZXR1cm4gbmV3IEFyY2ZvdXIoKTtcblx0fVxuXG5cdC8vIFBvb2wgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgZ3JlYXRlciB0aGFuIDMyLlxuXHQvLyBBbiBhcnJheSBvZiBieXRlcyB0aGUgc2l6ZSBvZiB0aGUgcG9vbCB3aWxsIGJlIHBhc3NlZCB0byBpbml0KClcblx0dmFyIHJuZ19wc2l6ZSA9IDI1NjtcblxuICBCaWdJbnRlZ2VyLlNlY3VyZVJhbmRvbSA9IFNlY3VyZVJhbmRvbTtcbiAgQmlnSW50ZWdlci5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEJpZ0ludGVnZXI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcbiAgICB0aGlzLlNlY3VyZVJhbmRvbSA9IFNlY3VyZVJhbmRvbTtcbiAgfVxuXG59KS5jYWxsKHRoaXMpO1xuIiwgIi8vIEJhc2ljIEphdmFzY3JpcHQgRWxsaXB0aWMgQ3VydmUgaW1wbGVtZW50YXRpb25cbi8vIFBvcnRlZCBsb29zZWx5IGZyb20gQm91bmN5Q2FzdGxlJ3MgSmF2YSBFQyBjb2RlXG4vLyBPbmx5IEZwIGN1cnZlcyBpbXBsZW1lbnRlZCBmb3Igbm93XG5cbi8vIFJlcXVpcmVzIGpzYm4uanMgYW5kIGpzYm4yLmpzXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJ2pzYm4nKS5CaWdJbnRlZ2VyXG52YXIgQmFycmV0dCA9IEJpZ0ludGVnZXIucHJvdG90eXBlLkJhcnJldHRcblxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gRUNGaWVsZEVsZW1lbnRGcFxuXG4vLyBjb25zdHJ1Y3RvclxuZnVuY3Rpb24gRUNGaWVsZEVsZW1lbnRGcChxLHgpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIC8vIFRPRE8gaWYoeC5jb21wYXJlVG8ocSkgPj0gMCkgZXJyb3JcbiAgICB0aGlzLnEgPSBxO1xufVxuXG5mdW5jdGlvbiBmZUZwRXF1YWxzKG90aGVyKSB7XG4gICAgaWYob3RoZXIgPT0gdGhpcykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICh0aGlzLnEuZXF1YWxzKG90aGVyLnEpICYmIHRoaXMueC5lcXVhbHMob3RoZXIueCkpO1xufVxuXG5mdW5jdGlvbiBmZUZwVG9CaWdJbnRlZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLng7XG59XG5cbmZ1bmN0aW9uIGZlRnBOZWdhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSwgdGhpcy54Lm5lZ2F0ZSgpLm1vZCh0aGlzLnEpKTtcbn1cblxuZnVuY3Rpb24gZmVGcEFkZChiKSB7XG4gICAgcmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSwgdGhpcy54LmFkZChiLnRvQmlnSW50ZWdlcigpKS5tb2QodGhpcy5xKSk7XG59XG5cbmZ1bmN0aW9uIGZlRnBTdWJ0cmFjdChiKSB7XG4gICAgcmV0dXJuIG5ldyBFQ0ZpZWxkRWxlbWVudEZwKHRoaXMucSwgdGhpcy54LnN1YnRyYWN0KGIudG9CaWdJbnRlZ2VyKCkpLm1vZCh0aGlzLnEpKTtcbn1cblxuZnVuY3Rpb24gZmVGcE11bHRpcGx5KGIpIHtcbiAgICByZXR1cm4gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLCB0aGlzLngubXVsdGlwbHkoYi50b0JpZ0ludGVnZXIoKSkubW9kKHRoaXMucSkpO1xufVxuXG5mdW5jdGlvbiBmZUZwU3F1YXJlKCkge1xuICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsIHRoaXMueC5zcXVhcmUoKS5tb2QodGhpcy5xKSk7XG59XG5cbmZ1bmN0aW9uIGZlRnBEaXZpZGUoYikge1xuICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsIHRoaXMueC5tdWx0aXBseShiLnRvQmlnSW50ZWdlcigpLm1vZEludmVyc2UodGhpcy5xKSkubW9kKHRoaXMucSkpO1xufVxuXG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5lcXVhbHMgPSBmZUZwRXF1YWxzO1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUudG9CaWdJbnRlZ2VyID0gZmVGcFRvQmlnSW50ZWdlcjtcbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLm5lZ2F0ZSA9IGZlRnBOZWdhdGU7XG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5hZGQgPSBmZUZwQWRkO1xuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUuc3VidHJhY3QgPSBmZUZwU3VidHJhY3Q7XG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5tdWx0aXBseSA9IGZlRnBNdWx0aXBseTtcbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnNxdWFyZSA9IGZlRnBTcXVhcmU7XG5FQ0ZpZWxkRWxlbWVudEZwLnByb3RvdHlwZS5kaXZpZGUgPSBmZUZwRGl2aWRlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tXG4vLyBFQ1BvaW50RnBcblxuLy8gY29uc3RydWN0b3JcbmZ1bmN0aW9uIEVDUG9pbnRGcChjdXJ2ZSx4LHkseikge1xuICAgIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgLy8gUHJvamVjdGl2ZSBjb29yZGluYXRlczogZWl0aGVyIHppbnYgPT0gbnVsbCBvciB6ICogemludiA9PSAxXG4gICAgLy8geiBhbmQgemludiBhcmUganVzdCBCaWdJbnRlZ2Vycywgbm90IGZpZWxkRWxlbWVudHNcbiAgICBpZih6ID09IG51bGwpIHtcbiAgICAgIHRoaXMueiA9IEJpZ0ludGVnZXIuT05FO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMueiA9IHo7XG4gICAgfVxuICAgIHRoaXMuemludiA9IG51bGw7XG4gICAgLy9UT0RPOiBjb21wcmVzc2lvbiBmbGFnXG59XG5cbmZ1bmN0aW9uIHBvaW50RnBHZXRYKCkge1xuICAgIGlmKHRoaXMuemludiA9PSBudWxsKSB7XG4gICAgICB0aGlzLnppbnYgPSB0aGlzLnoubW9kSW52ZXJzZSh0aGlzLmN1cnZlLnEpO1xuICAgIH1cbiAgICB2YXIgciA9IHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnppbnYpO1xuICAgIHRoaXMuY3VydmUucmVkdWNlKHIpO1xuICAgIHJldHVybiB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHIpO1xufVxuXG5mdW5jdGlvbiBwb2ludEZwR2V0WSgpIHtcbiAgICBpZih0aGlzLnppbnYgPT0gbnVsbCkge1xuICAgICAgdGhpcy56aW52ID0gdGhpcy56Lm1vZEludmVyc2UodGhpcy5jdXJ2ZS5xKTtcbiAgICB9XG4gICAgdmFyIHIgPSB0aGlzLnkudG9CaWdJbnRlZ2VyKCkubXVsdGlwbHkodGhpcy56aW52KTtcbiAgICB0aGlzLmN1cnZlLnJlZHVjZShyKTtcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcihyKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRGcEVxdWFscyhvdGhlcikge1xuICAgIGlmKG90aGVyID09IHRoaXMpIHJldHVybiB0cnVlO1xuICAgIGlmKHRoaXMuaXNJbmZpbml0eSgpKSByZXR1cm4gb3RoZXIuaXNJbmZpbml0eSgpO1xuICAgIGlmKG90aGVyLmlzSW5maW5pdHkoKSkgcmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpO1xuICAgIHZhciB1LCB2O1xuICAgIC8vIHUgPSBZMiAqIFoxIC0gWTEgKiBaMlxuICAgIHUgPSBvdGhlci55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy55LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KG90aGVyLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICBpZighdS5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIHYgPSBYMiAqIFoxIC0gWDEgKiBaMlxuICAgIHYgPSBvdGhlci54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KHRoaXMueikuc3VidHJhY3QodGhpcy54LnRvQmlnSW50ZWdlcigpLm11bHRpcGx5KG90aGVyLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICByZXR1cm4gdi5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRGcElzSW5maW5pdHkoKSB7XG4gICAgaWYoKHRoaXMueCA9PSBudWxsKSAmJiAodGhpcy55ID09IG51bGwpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy56LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pICYmICF0aGlzLnkudG9CaWdJbnRlZ2VyKCkuZXF1YWxzKEJpZ0ludGVnZXIuWkVSTyk7XG59XG5cbmZ1bmN0aW9uIHBvaW50RnBOZWdhdGUoKSB7XG4gICAgcmV0dXJuIG5ldyBFQ1BvaW50RnAodGhpcy5jdXJ2ZSwgdGhpcy54LCB0aGlzLnkubmVnYXRlKCksIHRoaXMueik7XG59XG5cbmZ1bmN0aW9uIHBvaW50RnBBZGQoYikge1xuICAgIGlmKHRoaXMuaXNJbmZpbml0eSgpKSByZXR1cm4gYjtcbiAgICBpZihiLmlzSW5maW5pdHkoKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyB1ID0gWTIgKiBaMSAtIFkxICogWjJcbiAgICB2YXIgdSA9IGIueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueS50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShiLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvLyB2ID0gWDIgKiBaMSAtIFgxICogWjJcbiAgICB2YXIgdiA9IGIueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseSh0aGlzLnopLnN1YnRyYWN0KHRoaXMueC50b0JpZ0ludGVnZXIoKS5tdWx0aXBseShiLnopKS5tb2QodGhpcy5jdXJ2ZS5xKTtcblxuICAgIGlmKEJpZ0ludGVnZXIuWkVSTy5lcXVhbHModikpIHtcbiAgICAgICAgaWYoQmlnSW50ZWdlci5aRVJPLmVxdWFscyh1KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHdpY2UoKTsgLy8gdGhpcyA9PSBiLCBzbyBkb3VibGVcbiAgICAgICAgfVxuXHRyZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpOyAvLyB0aGlzID0gLWIsIHNvIGluZmluaXR5XG4gICAgfVxuXG4gICAgdmFyIFRIUkVFID0gbmV3IEJpZ0ludGVnZXIoXCIzXCIpO1xuICAgIHZhciB4MSA9IHRoaXMueC50b0JpZ0ludGVnZXIoKTtcbiAgICB2YXIgeTEgPSB0aGlzLnkudG9CaWdJbnRlZ2VyKCk7XG4gICAgdmFyIHgyID0gYi54LnRvQmlnSW50ZWdlcigpO1xuICAgIHZhciB5MiA9IGIueS50b0JpZ0ludGVnZXIoKTtcblxuICAgIHZhciB2MiA9IHYuc3F1YXJlKCk7XG4gICAgdmFyIHYzID0gdjIubXVsdGlwbHkodik7XG4gICAgdmFyIHgxdjIgPSB4MS5tdWx0aXBseSh2Mik7XG4gICAgdmFyIHp1MiA9IHUuc3F1YXJlKCkubXVsdGlwbHkodGhpcy56KTtcblxuICAgIC8vIHgzID0gdiAqICh6MiAqICh6MSAqIHVeMiAtIDIgKiB4MSAqIHZeMikgLSB2XjMpXG4gICAgdmFyIHgzID0genUyLnN1YnRyYWN0KHgxdjIuc2hpZnRMZWZ0KDEpKS5tdWx0aXBseShiLnopLnN1YnRyYWN0KHYzKS5tdWx0aXBseSh2KS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvLyB5MyA9IHoyICogKDMgKiB4MSAqIHUgKiB2XjIgLSB5MSAqIHZeMyAtIHoxICogdV4zKSArIHUgKiB2XjNcbiAgICB2YXIgeTMgPSB4MXYyLm11bHRpcGx5KFRIUkVFKS5tdWx0aXBseSh1KS5zdWJ0cmFjdCh5MS5tdWx0aXBseSh2MykpLnN1YnRyYWN0KHp1Mi5tdWx0aXBseSh1KSkubXVsdGlwbHkoYi56KS5hZGQodS5tdWx0aXBseSh2MykpLm1vZCh0aGlzLmN1cnZlLnEpO1xuICAgIC8vIHozID0gdl4zICogejEgKiB6MlxuICAgIHZhciB6MyA9IHYzLm11bHRpcGx5KHRoaXMueikubXVsdGlwbHkoYi56KS5tb2QodGhpcy5jdXJ2ZS5xKTtcblxuICAgIHJldHVybiBuZXcgRUNQb2ludEZwKHRoaXMuY3VydmUsIHRoaXMuY3VydmUuZnJvbUJpZ0ludGVnZXIoeDMpLCB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHkzKSwgejMpO1xufVxuXG5mdW5jdGlvbiBwb2ludEZwVHdpY2UoKSB7XG4gICAgaWYodGhpcy5pc0luZmluaXR5KCkpIHJldHVybiB0aGlzO1xuICAgIGlmKHRoaXMueS50b0JpZ0ludGVnZXIoKS5zaWdudW0oKSA9PSAwKSByZXR1cm4gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpO1xuXG4gICAgLy8gVE9ETzogb3B0aW1pemVkIGhhbmRsaW5nIG9mIGNvbnN0YW50c1xuICAgIHZhciBUSFJFRSA9IG5ldyBCaWdJbnRlZ2VyKFwiM1wiKTtcbiAgICB2YXIgeDEgPSB0aGlzLngudG9CaWdJbnRlZ2VyKCk7XG4gICAgdmFyIHkxID0gdGhpcy55LnRvQmlnSW50ZWdlcigpO1xuXG4gICAgdmFyIHkxejEgPSB5MS5tdWx0aXBseSh0aGlzLnopO1xuICAgIHZhciB5MXNxejEgPSB5MXoxLm11bHRpcGx5KHkxKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICB2YXIgYSA9IHRoaXMuY3VydmUuYS50b0JpZ0ludGVnZXIoKTtcblxuICAgIC8vIHcgPSAzICogeDFeMiArIGEgKiB6MV4yXG4gICAgdmFyIHcgPSB4MS5zcXVhcmUoKS5tdWx0aXBseShUSFJFRSk7XG4gICAgaWYoIUJpZ0ludGVnZXIuWkVSTy5lcXVhbHMoYSkpIHtcbiAgICAgIHcgPSB3LmFkZCh0aGlzLnouc3F1YXJlKCkubXVsdGlwbHkoYSkpO1xuICAgIH1cbiAgICB3ID0gdy5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvL3RoaXMuY3VydmUucmVkdWNlKHcpO1xuICAgIC8vIHgzID0gMiAqIHkxICogejEgKiAod14yIC0gOCAqIHgxICogeTFeMiAqIHoxKVxuICAgIHZhciB4MyA9IHcuc3F1YXJlKCkuc3VidHJhY3QoeDEuc2hpZnRMZWZ0KDMpLm11bHRpcGx5KHkxc3F6MSkpLnNoaWZ0TGVmdCgxKS5tdWx0aXBseSh5MXoxKS5tb2QodGhpcy5jdXJ2ZS5xKTtcbiAgICAvLyB5MyA9IDQgKiB5MV4yICogejEgKiAoMyAqIHcgKiB4MSAtIDIgKiB5MV4yICogejEpIC0gd14zXG4gICAgdmFyIHkzID0gdy5tdWx0aXBseShUSFJFRSkubXVsdGlwbHkoeDEpLnN1YnRyYWN0KHkxc3F6MS5zaGlmdExlZnQoMSkpLnNoaWZ0TGVmdCgyKS5tdWx0aXBseSh5MXNxejEpLnN1YnRyYWN0KHcuc3F1YXJlKCkubXVsdGlwbHkodykpLm1vZCh0aGlzLmN1cnZlLnEpO1xuICAgIC8vIHozID0gOCAqICh5MSAqIHoxKV4zXG4gICAgdmFyIHozID0geTF6MS5zcXVhcmUoKS5tdWx0aXBseSh5MXoxKS5zaGlmdExlZnQoMykubW9kKHRoaXMuY3VydmUucSk7XG5cbiAgICByZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLmN1cnZlLCB0aGlzLmN1cnZlLmZyb21CaWdJbnRlZ2VyKHgzKSwgdGhpcy5jdXJ2ZS5mcm9tQmlnSW50ZWdlcih5MyksIHozKTtcbn1cblxuLy8gU2ltcGxlIE5BRiAoTm9uLUFkamFjZW50IEZvcm0pIG11bHRpcGxpY2F0aW9uIGFsZ29yaXRobVxuLy8gVE9ETzogbW9kdWxhcml6ZSB0aGUgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtXG5mdW5jdGlvbiBwb2ludEZwTXVsdGlwbHkoaykge1xuICAgIGlmKHRoaXMuaXNJbmZpbml0eSgpKSByZXR1cm4gdGhpcztcbiAgICBpZihrLnNpZ251bSgpID09IDApIHJldHVybiB0aGlzLmN1cnZlLmdldEluZmluaXR5KCk7XG5cbiAgICB2YXIgZSA9IGs7XG4gICAgdmFyIGggPSBlLm11bHRpcGx5KG5ldyBCaWdJbnRlZ2VyKFwiM1wiKSk7XG5cbiAgICB2YXIgbmVnID0gdGhpcy5uZWdhdGUoKTtcbiAgICB2YXIgUiA9IHRoaXM7XG5cbiAgICB2YXIgaTtcbiAgICBmb3IoaSA9IGguYml0TGVuZ3RoKCkgLSAyOyBpID4gMDsgLS1pKSB7XG5cdFIgPSBSLnR3aWNlKCk7XG5cblx0dmFyIGhCaXQgPSBoLnRlc3RCaXQoaSk7XG5cdHZhciBlQml0ID0gZS50ZXN0Qml0KGkpO1xuXG5cdGlmIChoQml0ICE9IGVCaXQpIHtcblx0ICAgIFIgPSBSLmFkZChoQml0ID8gdGhpcyA6IG5lZyk7XG5cdH1cbiAgICB9XG5cbiAgICByZXR1cm4gUjtcbn1cblxuLy8gQ29tcHV0ZSB0aGlzKmogKyB4KmsgKHNpbXVsdGFuZW91cyBtdWx0aXBsaWNhdGlvbilcbmZ1bmN0aW9uIHBvaW50RnBNdWx0aXBseVR3byhqLHgsaykge1xuICB2YXIgaTtcbiAgaWYoai5iaXRMZW5ndGgoKSA+IGsuYml0TGVuZ3RoKCkpXG4gICAgaSA9IGouYml0TGVuZ3RoKCkgLSAxO1xuICBlbHNlXG4gICAgaSA9IGsuYml0TGVuZ3RoKCkgLSAxO1xuXG4gIHZhciBSID0gdGhpcy5jdXJ2ZS5nZXRJbmZpbml0eSgpO1xuICB2YXIgYm90aCA9IHRoaXMuYWRkKHgpO1xuICB3aGlsZShpID49IDApIHtcbiAgICBSID0gUi50d2ljZSgpO1xuICAgIGlmKGoudGVzdEJpdChpKSkge1xuICAgICAgaWYoay50ZXN0Qml0KGkpKSB7XG4gICAgICAgIFIgPSBSLmFkZChib3RoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBSID0gUi5hZGQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYoay50ZXN0Qml0KGkpKSB7XG4gICAgICAgIFIgPSBSLmFkZCh4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLS1pO1xuICB9XG5cbiAgcmV0dXJuIFI7XG59XG5cbkVDUG9pbnRGcC5wcm90b3R5cGUuZ2V0WCA9IHBvaW50RnBHZXRYO1xuRUNQb2ludEZwLnByb3RvdHlwZS5nZXRZID0gcG9pbnRGcEdldFk7XG5FQ1BvaW50RnAucHJvdG90eXBlLmVxdWFscyA9IHBvaW50RnBFcXVhbHM7XG5FQ1BvaW50RnAucHJvdG90eXBlLmlzSW5maW5pdHkgPSBwb2ludEZwSXNJbmZpbml0eTtcbkVDUG9pbnRGcC5wcm90b3R5cGUubmVnYXRlID0gcG9pbnRGcE5lZ2F0ZTtcbkVDUG9pbnRGcC5wcm90b3R5cGUuYWRkID0gcG9pbnRGcEFkZDtcbkVDUG9pbnRGcC5wcm90b3R5cGUudHdpY2UgPSBwb2ludEZwVHdpY2U7XG5FQ1BvaW50RnAucHJvdG90eXBlLm11bHRpcGx5ID0gcG9pbnRGcE11bHRpcGx5O1xuRUNQb2ludEZwLnByb3RvdHlwZS5tdWx0aXBseVR3byA9IHBvaW50RnBNdWx0aXBseVR3bztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gRUNDdXJ2ZUZwXG5cbi8vIGNvbnN0cnVjdG9yXG5mdW5jdGlvbiBFQ0N1cnZlRnAocSxhLGIpIHtcbiAgICB0aGlzLnEgPSBxO1xuICAgIHRoaXMuYSA9IHRoaXMuZnJvbUJpZ0ludGVnZXIoYSk7XG4gICAgdGhpcy5iID0gdGhpcy5mcm9tQmlnSW50ZWdlcihiKTtcbiAgICB0aGlzLmluZmluaXR5ID0gbmV3IEVDUG9pbnRGcCh0aGlzLCBudWxsLCBudWxsKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgQmFycmV0dCh0aGlzLnEpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwR2V0USgpIHtcbiAgICByZXR1cm4gdGhpcy5xO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwR2V0QSgpIHtcbiAgICByZXR1cm4gdGhpcy5hO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwR2V0QigpIHtcbiAgICByZXR1cm4gdGhpcy5iO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwRXF1YWxzKG90aGVyKSB7XG4gICAgaWYob3RoZXIgPT0gdGhpcykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuKHRoaXMucS5lcXVhbHMob3RoZXIucSkgJiYgdGhpcy5hLmVxdWFscyhvdGhlci5hKSAmJiB0aGlzLmIuZXF1YWxzKG90aGVyLmIpKTtcbn1cblxuZnVuY3Rpb24gY3VydmVGcEdldEluZmluaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmluZmluaXR5O1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUZwRnJvbUJpZ0ludGVnZXIoeCkge1xuICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcCh0aGlzLnEsIHgpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZVJlZHVjZSh4KSB7XG4gICAgdGhpcy5yZWR1Y2VyLnJlZHVjZSh4KTtcbn1cblxuLy8gZm9yIG5vdywgd29yayB3aXRoIGhleCBzdHJpbmdzIGJlY2F1c2UgdGhleSdyZSBlYXNpZXIgaW4gSlNcbmZ1bmN0aW9uIGN1cnZlRnBEZWNvZGVQb2ludEhleChzKSB7XG4gICAgc3dpdGNoKHBhcnNlSW50KHMuc3Vic3RyKDAsMiksIDE2KSkgeyAvLyBmaXJzdCBieXRlXG4gICAgY2FzZSAwOlxuXHRyZXR1cm4gdGhpcy5pbmZpbml0eTtcbiAgICBjYXNlIDI6XG4gICAgY2FzZSAzOlxuXHQvLyBwb2ludCBjb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkIHlldFxuXHRyZXR1cm4gbnVsbDtcbiAgICBjYXNlIDQ6XG4gICAgY2FzZSA2OlxuICAgIGNhc2UgNzpcblx0dmFyIGxlbiA9IChzLmxlbmd0aCAtIDIpIC8gMjtcblx0dmFyIHhIZXggPSBzLnN1YnN0cigyLCBsZW4pO1xuXHR2YXIgeUhleCA9IHMuc3Vic3RyKGxlbisyLCBsZW4pO1xuXG5cdHJldHVybiBuZXcgRUNQb2ludEZwKHRoaXMsXG5cdFx0XHQgICAgIHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeEhleCwgMTYpKSxcblx0XHRcdCAgICAgdGhpcy5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcih5SGV4LCAxNikpKTtcblxuICAgIGRlZmF1bHQ6IC8vIHVuc3VwcG9ydGVkXG5cdHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3VydmVGcEVuY29kZVBvaW50SGV4KHApIHtcblx0aWYgKHAuaXNJbmZpbml0eSgpKSByZXR1cm4gXCIwMFwiO1xuXHR2YXIgeEhleCA9IHAuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KTtcblx0dmFyIHlIZXggPSBwLmdldFkoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygxNik7XG5cdHZhciBvTGVuID0gdGhpcy5nZXRRKCkudG9TdHJpbmcoMTYpLmxlbmd0aDtcblx0aWYgKChvTGVuICUgMikgIT0gMCkgb0xlbisrO1xuXHR3aGlsZSAoeEhleC5sZW5ndGggPCBvTGVuKSB7XG5cdFx0eEhleCA9IFwiMFwiICsgeEhleDtcblx0fVxuXHR3aGlsZSAoeUhleC5sZW5ndGggPCBvTGVuKSB7XG5cdFx0eUhleCA9IFwiMFwiICsgeUhleDtcblx0fVxuXHRyZXR1cm4gXCIwNFwiICsgeEhleCArIHlIZXg7XG59XG5cbkVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0USA9IGN1cnZlRnBHZXRRO1xuRUNDdXJ2ZUZwLnByb3RvdHlwZS5nZXRBID0gY3VydmVGcEdldEE7XG5FQ0N1cnZlRnAucHJvdG90eXBlLmdldEIgPSBjdXJ2ZUZwR2V0QjtcbkVDQ3VydmVGcC5wcm90b3R5cGUuZXF1YWxzID0gY3VydmVGcEVxdWFscztcbkVDQ3VydmVGcC5wcm90b3R5cGUuZ2V0SW5maW5pdHkgPSBjdXJ2ZUZwR2V0SW5maW5pdHk7XG5FQ0N1cnZlRnAucHJvdG90eXBlLmZyb21CaWdJbnRlZ2VyID0gY3VydmVGcEZyb21CaWdJbnRlZ2VyO1xuRUNDdXJ2ZUZwLnByb3RvdHlwZS5yZWR1Y2UgPSBjdXJ2ZVJlZHVjZTtcbi8vRUNDdXJ2ZUZwLnByb3RvdHlwZS5kZWNvZGVQb2ludEhleCA9IGN1cnZlRnBEZWNvZGVQb2ludEhleDtcbkVDQ3VydmVGcC5wcm90b3R5cGUuZW5jb2RlUG9pbnRIZXggPSBjdXJ2ZUZwRW5jb2RlUG9pbnRIZXg7XG5cbi8vIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9rYWllbHZpbi9qc2JuLWVjLXBvaW50LWNvbXByZXNzaW9uXG5FQ0N1cnZlRnAucHJvdG90eXBlLmRlY29kZVBvaW50SGV4ID0gZnVuY3Rpb24ocylcbntcblx0dmFyIHlJc0V2ZW47XG4gICAgc3dpdGNoKHBhcnNlSW50KHMuc3Vic3RyKDAsMiksIDE2KSkgeyAvLyBmaXJzdCBieXRlXG4gICAgY2FzZSAwOlxuXHRyZXR1cm4gdGhpcy5pbmZpbml0eTtcbiAgICBjYXNlIDI6XG5cdHlJc0V2ZW4gPSBmYWxzZTtcbiAgICBjYXNlIDM6XG5cdGlmKHlJc0V2ZW4gPT0gdW5kZWZpbmVkKSB5SXNFdmVuID0gdHJ1ZTtcblx0dmFyIGxlbiA9IHMubGVuZ3RoIC0gMjtcblx0dmFyIHhIZXggPSBzLnN1YnN0cigyLCBsZW4pO1xuXHR2YXIgeCA9IHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeEhleCwxNikpO1xuXHR2YXIgYWxwaGEgPSB4Lm11bHRpcGx5KHguc3F1YXJlKCkuYWRkKHRoaXMuZ2V0QSgpKSkuYWRkKHRoaXMuZ2V0QigpKTtcblx0dmFyIGJldGEgPSBhbHBoYS5zcXJ0KCk7XG5cbiAgICBpZiAoYmV0YSA9PSBudWxsKSB0aHJvdyBcIkludmFsaWQgcG9pbnQgY29tcHJlc3Npb25cIjtcblxuICAgIHZhciBiZXRhVmFsdWUgPSBiZXRhLnRvQmlnSW50ZWdlcigpO1xuICAgIGlmIChiZXRhVmFsdWUudGVzdEJpdCgwKSAhPSB5SXNFdmVuKVxuICAgIHtcbiAgICAgICAgLy8gVXNlIHRoZSBvdGhlciByb290XG4gICAgICAgIGJldGEgPSB0aGlzLmZyb21CaWdJbnRlZ2VyKHRoaXMuZ2V0USgpLnN1YnRyYWN0KGJldGFWYWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLHgsYmV0YSk7XG4gICAgY2FzZSA0OlxuICAgIGNhc2UgNjpcbiAgICBjYXNlIDc6XG5cdHZhciBsZW4gPSAocy5sZW5ndGggLSAyKSAvIDI7XG5cdHZhciB4SGV4ID0gcy5zdWJzdHIoMiwgbGVuKTtcblx0dmFyIHlIZXggPSBzLnN1YnN0cihsZW4rMiwgbGVuKTtcblxuXHRyZXR1cm4gbmV3IEVDUG9pbnRGcCh0aGlzLFxuXHRcdFx0ICAgICB0aGlzLmZyb21CaWdJbnRlZ2VyKG5ldyBCaWdJbnRlZ2VyKHhIZXgsIDE2KSksXG5cdFx0XHQgICAgIHRoaXMuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeUhleCwgMTYpKSk7XG5cbiAgICBkZWZhdWx0OiAvLyB1bnN1cHBvcnRlZFxuXHRyZXR1cm4gbnVsbDtcbiAgICB9XG59XG5FQ0N1cnZlRnAucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWRQb2ludEhleCA9IGZ1bmN0aW9uKHApXG57XG5cdGlmIChwLmlzSW5maW5pdHkoKSkgcmV0dXJuIFwiMDBcIjtcblx0dmFyIHhIZXggPSBwLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b1N0cmluZygxNik7XG5cdHZhciBvTGVuID0gdGhpcy5nZXRRKCkudG9TdHJpbmcoMTYpLmxlbmd0aDtcblx0aWYgKChvTGVuICUgMikgIT0gMCkgb0xlbisrO1xuXHR3aGlsZSAoeEhleC5sZW5ndGggPCBvTGVuKVxuXHRcdHhIZXggPSBcIjBcIiArIHhIZXg7XG5cdHZhciB5UHJlZml4O1xuXHRpZihwLmdldFkoKS50b0JpZ0ludGVnZXIoKS5pc0V2ZW4oKSkgeVByZWZpeCA9IFwiMDJcIjtcblx0ZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQcmVmaXggPSBcIjAzXCI7XG5cblx0cmV0dXJuIHlQcmVmaXggKyB4SGV4O1xufVxuXG5cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmdldFIgPSBmdW5jdGlvbigpXG57XG5cdGlmKHRoaXMuciAhPSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnI7XG5cbiAgICB0aGlzLnIgPSBudWxsO1xuICAgIHZhciBiaXRMZW5ndGggPSB0aGlzLnEuYml0TGVuZ3RoKCk7XG4gICAgaWYgKGJpdExlbmd0aCA+IDEyOClcbiAgICB7XG4gICAgICAgIHZhciBmaXJzdFdvcmQgPSB0aGlzLnEuc2hpZnRSaWdodChiaXRMZW5ndGggLSA2NCk7XG4gICAgICAgIGlmIChmaXJzdFdvcmQuaW50VmFsdWUoKSA9PSAtMSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5yID0gQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGJpdExlbmd0aCkuc3VidHJhY3QodGhpcy5xKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yO1xufVxuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubW9kTXVsdCA9IGZ1bmN0aW9uKHgxLHgyKVxue1xuICAgIHJldHVybiB0aGlzLm1vZFJlZHVjZSh4MS5tdWx0aXBseSh4MikpO1xufVxuRUNGaWVsZEVsZW1lbnRGcC5wcm90b3R5cGUubW9kUmVkdWNlID0gZnVuY3Rpb24oeClcbntcbiAgICBpZiAodGhpcy5nZXRSKCkgIT0gbnVsbClcbiAgICB7XG4gICAgICAgIHZhciBxTGVuID0gcS5iaXRMZW5ndGgoKTtcbiAgICAgICAgd2hpbGUgKHguYml0TGVuZ3RoKCkgPiAocUxlbiArIDEpKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgdSA9IHguc2hpZnRSaWdodChxTGVuKTtcbiAgICAgICAgICAgIHZhciB2ID0geC5zdWJ0cmFjdCh1LnNoaWZ0TGVmdChxTGVuKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0UigpLmVxdWFscyhCaWdJbnRlZ2VyLk9ORSkpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdSA9IHUubXVsdGlwbHkodGhpcy5nZXRSKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeCA9IHUuYWRkKHYpOyBcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoeC5jb21wYXJlVG8ocSkgPj0gMClcbiAgICAgICAge1xuICAgICAgICAgICAgeCA9IHguc3VidHJhY3QocSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgeCA9IHgubW9kKHEpO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn1cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbigpXG57XG4gICAgaWYgKCF0aGlzLnEudGVzdEJpdCgwKSkgdGhyb3cgXCJ1bnN1cHBvcnRlZFwiO1xuXG4gICAgLy8gcCBtb2QgNCA9PSAzXG4gICAgaWYgKHRoaXMucS50ZXN0Qml0KDEpKVxuICAgIHtcbiAgICBcdHZhciB6ID0gbmV3IEVDRmllbGRFbGVtZW50RnAodGhpcy5xLHRoaXMueC5tb2RQb3codGhpcy5xLnNoaWZ0UmlnaHQoMikuYWRkKEJpZ0ludGVnZXIuT05FKSx0aGlzLnEpKTtcbiAgICBcdHJldHVybiB6LnNxdWFyZSgpLmVxdWFscyh0aGlzKSA/IHogOiBudWxsO1xuICAgIH1cblxuICAgIC8vIHAgbW9kIDQgPT0gMVxuICAgIHZhciBxTWludXNPbmUgPSB0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuXG4gICAgdmFyIGxlZ2VuZHJlRXhwb25lbnQgPSBxTWludXNPbmUuc2hpZnRSaWdodCgxKTtcbiAgICBpZiAoISh0aGlzLngubW9kUG93KGxlZ2VuZHJlRXhwb25lbnQsIHRoaXMucSkuZXF1YWxzKEJpZ0ludGVnZXIuT05FKSkpXG4gICAge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdSA9IHFNaW51c09uZS5zaGlmdFJpZ2h0KDIpO1xuICAgIHZhciBrID0gdS5zaGlmdExlZnQoMSkuYWRkKEJpZ0ludGVnZXIuT05FKTtcblxuICAgIHZhciBRID0gdGhpcy54O1xuICAgIHZhciBmb3VyUSA9IG1vZERvdWJsZShtb2REb3VibGUoUSkpO1xuXG4gICAgdmFyIFUsIFY7XG4gICAgZG9cbiAgICB7XG4gICAgICAgIHZhciBQO1xuICAgICAgICBkb1xuICAgICAgICB7XG4gICAgICAgICAgICBQID0gbmV3IEJpZ0ludGVnZXIodGhpcy5xLmJpdExlbmd0aCgpLCBuZXcgU2VjdXJlUmFuZG9tKCkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChQLmNvbXBhcmVUbyh0aGlzLnEpID49IDBcbiAgICAgICAgICAgIHx8ICEoUC5tdWx0aXBseShQKS5zdWJ0cmFjdChmb3VyUSkubW9kUG93KGxlZ2VuZHJlRXhwb25lbnQsIHRoaXMucSkuZXF1YWxzKHFNaW51c09uZSkpKTtcblxuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5sdWNhc1NlcXVlbmNlKFAsIFEsIGspO1xuICAgICAgICBVID0gcmVzdWx0WzBdO1xuICAgICAgICBWID0gcmVzdWx0WzFdO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZE11bHQoViwgVikuZXF1YWxzKGZvdXJRKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gSW50ZWdlciBkaXZpc2lvbiBieSAyLCBtb2QgcVxuICAgICAgICAgICAgaWYgKFYudGVzdEJpdCgwKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBWID0gVi5hZGQocSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFYgPSBWLnNoaWZ0UmlnaHQoMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgRUNGaWVsZEVsZW1lbnRGcChxLFYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChVLmVxdWFscyhCaWdJbnRlZ2VyLk9ORSkgfHwgVS5lcXVhbHMocU1pbnVzT25lKSk7XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cbkVDRmllbGRFbGVtZW50RnAucHJvdG90eXBlLmx1Y2FzU2VxdWVuY2UgPSBmdW5jdGlvbihQLFEsaylcbntcbiAgICB2YXIgbiA9IGsuYml0TGVuZ3RoKCk7XG4gICAgdmFyIHMgPSBrLmdldExvd2VzdFNldEJpdCgpO1xuXG4gICAgdmFyIFVoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIFZsID0gQmlnSW50ZWdlci5UV087XG4gICAgdmFyIFZoID0gUDtcbiAgICB2YXIgUWwgPSBCaWdJbnRlZ2VyLk9ORTtcbiAgICB2YXIgUWggPSBCaWdJbnRlZ2VyLk9ORTtcblxuICAgIGZvciAodmFyIGogPSBuIC0gMTsgaiA+PSBzICsgMTsgLS1qKVxuICAgIHtcbiAgICAgICAgUWwgPSB0aGlzLm1vZE11bHQoUWwsIFFoKTtcblxuICAgICAgICBpZiAoay50ZXN0Qml0KGopKVxuICAgICAgICB7XG4gICAgICAgICAgICBRaCA9IHRoaXMubW9kTXVsdChRbCwgUSk7XG4gICAgICAgICAgICBVaCA9IHRoaXMubW9kTXVsdChVaCwgVmgpO1xuICAgICAgICAgICAgVmwgPSB0aGlzLm1vZFJlZHVjZShWaC5tdWx0aXBseShWbCkuc3VidHJhY3QoUC5tdWx0aXBseShRbCkpKTtcbiAgICAgICAgICAgIFZoID0gdGhpcy5tb2RSZWR1Y2UoVmgubXVsdGlwbHkoVmgpLnN1YnRyYWN0KFFoLnNoaWZ0TGVmdCgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgUWggPSBRbDtcbiAgICAgICAgICAgIFVoID0gdGhpcy5tb2RSZWR1Y2UoVWgubXVsdGlwbHkoVmwpLnN1YnRyYWN0KFFsKSk7XG4gICAgICAgICAgICBWaCA9IHRoaXMubW9kUmVkdWNlKFZoLm11bHRpcGx5KFZsKS5zdWJ0cmFjdChQLm11bHRpcGx5KFFsKSkpO1xuICAgICAgICAgICAgVmwgPSB0aGlzLm1vZFJlZHVjZShWbC5tdWx0aXBseShWbCkuc3VidHJhY3QoUWwuc2hpZnRMZWZ0KDEpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBRbCA9IHRoaXMubW9kTXVsdChRbCwgUWgpO1xuICAgIFFoID0gdGhpcy5tb2RNdWx0KFFsLCBRKTtcbiAgICBVaCA9IHRoaXMubW9kUmVkdWNlKFVoLm11bHRpcGx5KFZsKS5zdWJ0cmFjdChRbCkpO1xuICAgIFZsID0gdGhpcy5tb2RSZWR1Y2UoVmgubXVsdGlwbHkoVmwpLnN1YnRyYWN0KFAubXVsdGlwbHkoUWwpKSk7XG4gICAgUWwgPSB0aGlzLm1vZE11bHQoUWwsIFFoKTtcblxuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IHM7ICsrailcbiAgICB7XG4gICAgICAgIFVoID0gdGhpcy5tb2RNdWx0KFVoLCBWbCk7XG4gICAgICAgIFZsID0gdGhpcy5tb2RSZWR1Y2UoVmwubXVsdGlwbHkoVmwpLnN1YnRyYWN0KFFsLnNoaWZ0TGVmdCgxKSkpO1xuICAgICAgICBRbCA9IHRoaXMubW9kTXVsdChRbCwgUWwpO1xuICAgIH1cblxuICAgIHJldHVybiBbIFVoLCBWbCBdO1xufVxuXG52YXIgZXhwb3J0cyA9IHtcbiAgRUNDdXJ2ZUZwOiBFQ0N1cnZlRnAsXG4gIEVDUG9pbnRGcDogRUNQb2ludEZwLFxuICBFQ0ZpZWxkRWxlbWVudEZwOiBFQ0ZpZWxkRWxlbWVudEZwXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1xuIiwgIihmdW5jdGlvbihuYWNsKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFBvcnRlZCBpbiAyMDE0IGJ5IERtaXRyeSBDaGVzdG55a2ggYW5kIERldmkgTWFuZGlyaS5cbi8vIFB1YmxpYyBkb21haW4uXG4vL1xuLy8gSW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tIFR3ZWV0TmFDbCB2ZXJzaW9uIDIwMTQwNDI3LlxuLy8gU2VlIGZvciBkZXRhaWxzOiBodHRwOi8vdHdlZXRuYWNsLmNyLnlwLnRvL1xuXG52YXIgZ2YgPSBmdW5jdGlvbihpbml0KSB7XG4gIHZhciBpLCByID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gIGlmIChpbml0KSBmb3IgKGkgPSAwOyBpIDwgaW5pdC5sZW5ndGg7IGkrKykgcltpXSA9IGluaXRbaV07XG4gIHJldHVybiByO1xufTtcblxuLy8gIFBsdWdnYWJsZSwgaW5pdGlhbGl6ZWQgaW4gaGlnaC1sZXZlbCBBUEkgYmVsb3cuXG52YXIgcmFuZG9tYnl0ZXMgPSBmdW5jdGlvbigvKiB4LCBuICovKSB7IHRocm93IG5ldyBFcnJvcignbm8gUFJORycpOyB9O1xuXG52YXIgXzAgPSBuZXcgVWludDhBcnJheSgxNik7XG52YXIgXzkgPSBuZXcgVWludDhBcnJheSgzMik7IF85WzBdID0gOTtcblxudmFyIGdmMCA9IGdmKCksXG4gICAgZ2YxID0gZ2YoWzFdKSxcbiAgICBfMTIxNjY1ID0gZ2YoWzB4ZGI0MSwgMV0pLFxuICAgIEQgPSBnZihbMHg3OGEzLCAweDEzNTksIDB4NGRjYSwgMHg3NWViLCAweGQ4YWIsIDB4NDE0MSwgMHgwYTRkLCAweDAwNzAsIDB4ZTg5OCwgMHg3Nzc5LCAweDQwNzksIDB4OGNjNywgMHhmZTczLCAweDJiNmYsIDB4NmNlZSwgMHg1MjAzXSksXG4gICAgRDIgPSBnZihbMHhmMTU5LCAweDI2YjIsIDB4OWI5NCwgMHhlYmQ2LCAweGIxNTYsIDB4ODI4MywgMHgxNDlhLCAweDAwZTAsIDB4ZDEzMCwgMHhlZWYzLCAweDgwZjIsIDB4MTk4ZSwgMHhmY2U3LCAweDU2ZGYsIDB4ZDlkYywgMHgyNDA2XSksXG4gICAgWCA9IGdmKFsweGQ1MWEsIDB4OGYyNSwgMHgyZDYwLCAweGM5NTYsIDB4YTdiMiwgMHg5NTI1LCAweGM3NjAsIDB4NjkyYywgMHhkYzVjLCAweGZkZDYsIDB4ZTIzMSwgMHhjMGE0LCAweDUzZmUsIDB4Y2Q2ZSwgMHgzNmQzLCAweDIxNjldKSxcbiAgICBZID0gZ2YoWzB4NjY1OCwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2Nl0pLFxuICAgIEkgPSBnZihbMHhhMGIwLCAweDRhMGUsIDB4MWIyNywgMHhjNGVlLCAweGU0NzgsIDB4YWQyZiwgMHgxODA2LCAweDJmNDMsIDB4ZDdhNywgMHgzZGZiLCAweDAwOTksIDB4MmI0ZCwgMHhkZjBiLCAweDRmYzEsIDB4MjQ4MCwgMHgyYjgzXSk7XG5cbmZ1bmN0aW9uIHRzNjQoeCwgaSwgaCwgbCkge1xuICB4W2ldICAgPSAoaCA+PiAyNCkgJiAweGZmO1xuICB4W2krMV0gPSAoaCA+PiAxNikgJiAweGZmO1xuICB4W2krMl0gPSAoaCA+PiAgOCkgJiAweGZmO1xuICB4W2krM10gPSBoICYgMHhmZjtcbiAgeFtpKzRdID0gKGwgPj4gMjQpICAmIDB4ZmY7XG4gIHhbaSs1XSA9IChsID4+IDE2KSAgJiAweGZmO1xuICB4W2krNl0gPSAobCA+PiAgOCkgICYgMHhmZjtcbiAgeFtpKzddID0gbCAmIDB4ZmY7XG59XG5cbmZ1bmN0aW9uIHZuKHgsIHhpLCB5LCB5aSwgbikge1xuICB2YXIgaSxkID0gMDtcbiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZCB8PSB4W3hpK2ldXnlbeWkraV07XG4gIHJldHVybiAoMSAmICgoZCAtIDEpID4+PiA4KSkgLSAxO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fdmVyaWZ5XzE2KHgsIHhpLCB5LCB5aSkge1xuICByZXR1cm4gdm4oeCx4aSx5LHlpLDE2KTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3ZlcmlmeV8zMih4LCB4aSwgeSwgeWkpIHtcbiAgcmV0dXJuIHZuKHgseGkseSx5aSwzMik7XG59XG5cbmZ1bmN0aW9uIGNvcmVfc2Fsc2EyMChvLCBwLCBrLCBjKSB7XG4gIHZhciBqMCAgPSBjWyAwXSAmIDB4ZmYgfCAoY1sgMV0gJiAweGZmKTw8OCB8IChjWyAyXSAmIDB4ZmYpPDwxNiB8IChjWyAzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxICA9IGtbIDBdICYgMHhmZiB8IChrWyAxXSAmIDB4ZmYpPDw4IHwgKGtbIDJdICYgMHhmZik8PDE2IHwgKGtbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajIgID0ga1sgNF0gJiAweGZmIHwgKGtbIDVdICYgMHhmZik8PDggfCAoa1sgNl0gJiAweGZmKTw8MTYgfCAoa1sgN10gJiAweGZmKTw8MjQsXG4gICAgICBqMyAgPSBrWyA4XSAmIDB4ZmYgfCAoa1sgOV0gJiAweGZmKTw8OCB8IChrWzEwXSAmIDB4ZmYpPDwxNiB8IChrWzExXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo0ICA9IGtbMTJdICYgMHhmZiB8IChrWzEzXSAmIDB4ZmYpPDw4IHwgKGtbMTRdICYgMHhmZik8PDE2IHwgKGtbMTVdICYgMHhmZik8PDI0LFxuICAgICAgajUgID0gY1sgNF0gJiAweGZmIHwgKGNbIDVdICYgMHhmZik8PDggfCAoY1sgNl0gJiAweGZmKTw8MTYgfCAoY1sgN10gJiAweGZmKTw8MjQsXG4gICAgICBqNiAgPSBwWyAwXSAmIDB4ZmYgfCAocFsgMV0gJiAweGZmKTw8OCB8IChwWyAyXSAmIDB4ZmYpPDwxNiB8IChwWyAzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo3ICA9IHBbIDRdICYgMHhmZiB8IChwWyA1XSAmIDB4ZmYpPDw4IHwgKHBbIDZdICYgMHhmZik8PDE2IHwgKHBbIDddICYgMHhmZik8PDI0LFxuICAgICAgajggID0gcFsgOF0gJiAweGZmIHwgKHBbIDldICYgMHhmZik8PDggfCAocFsxMF0gJiAweGZmKTw8MTYgfCAocFsxMV0gJiAweGZmKTw8MjQsXG4gICAgICBqOSAgPSBwWzEyXSAmIDB4ZmYgfCAocFsxM10gJiAweGZmKTw8OCB8IChwWzE0XSAmIDB4ZmYpPDwxNiB8IChwWzE1XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMCA9IGNbIDhdICYgMHhmZiB8IChjWyA5XSAmIDB4ZmYpPDw4IHwgKGNbMTBdICYgMHhmZik8PDE2IHwgKGNbMTFdICYgMHhmZik8PDI0LFxuICAgICAgajExID0ga1sxNl0gJiAweGZmIHwgKGtbMTddICYgMHhmZik8PDggfCAoa1sxOF0gJiAweGZmKTw8MTYgfCAoa1sxOV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTIgPSBrWzIwXSAmIDB4ZmYgfCAoa1syMV0gJiAweGZmKTw8OCB8IChrWzIyXSAmIDB4ZmYpPDwxNiB8IChrWzIzXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMyA9IGtbMjRdICYgMHhmZiB8IChrWzI1XSAmIDB4ZmYpPDw4IHwgKGtbMjZdICYgMHhmZik8PDE2IHwgKGtbMjddICYgMHhmZik8PDI0LFxuICAgICAgajE0ID0ga1syOF0gJiAweGZmIHwgKGtbMjldICYgMHhmZik8PDggfCAoa1szMF0gJiAweGZmKTw8MTYgfCAoa1szMV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTUgPSBjWzEyXSAmIDB4ZmYgfCAoY1sxM10gJiAweGZmKTw8OCB8IChjWzE0XSAmIDB4ZmYpPDwxNiB8IChjWzE1XSAmIDB4ZmYpPDwyNDtcblxuICB2YXIgeDAgPSBqMCwgeDEgPSBqMSwgeDIgPSBqMiwgeDMgPSBqMywgeDQgPSBqNCwgeDUgPSBqNSwgeDYgPSBqNiwgeDcgPSBqNyxcbiAgICAgIHg4ID0gajgsIHg5ID0gajksIHgxMCA9IGoxMCwgeDExID0gajExLCB4MTIgPSBqMTIsIHgxMyA9IGoxMywgeDE0ID0gajE0LFxuICAgICAgeDE1ID0gajE1LCB1O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMjA7IGkgKz0gMikge1xuICAgIHUgPSB4MCArIHgxMiB8IDA7XG4gICAgeDQgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg0ICsgeDAgfCAwO1xuICAgIHg4IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4OCArIHg0IHwgMDtcbiAgICB4MTIgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDEyICsgeDggfCAwO1xuICAgIHgwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDUgKyB4MSB8IDA7XG4gICAgeDkgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg5ICsgeDUgfCAwO1xuICAgIHgxMyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDEzICsgeDkgfCAwO1xuICAgIHgxIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxICsgeDEzIHwgMDtcbiAgICB4NSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxMCArIHg2IHwgMDtcbiAgICB4MTQgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxNCArIHgxMCB8IDA7XG4gICAgeDIgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgyICsgeDE0IHwgMDtcbiAgICB4NiBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4NiArIHgyIHwgMDtcbiAgICB4MTAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTUgKyB4MTEgfCAwO1xuICAgIHgzIF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MyArIHgxNSB8IDA7XG4gICAgeDcgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg3ICsgeDMgfCAwO1xuICAgIHgxMSBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTEgKyB4NyB8IDA7XG4gICAgeDE1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDAgKyB4MyB8IDA7XG4gICAgeDEgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxICsgeDAgfCAwO1xuICAgIHgyIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MiArIHgxIHwgMDtcbiAgICB4MyBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MyArIHgyIHwgMDtcbiAgICB4MCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHg1ICsgeDQgfCAwO1xuICAgIHg2IF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4NiArIHg1IHwgMDtcbiAgICB4NyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDcgKyB4NiB8IDA7XG4gICAgeDQgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDQgKyB4NyB8IDA7XG4gICAgeDUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTAgKyB4OSB8IDA7XG4gICAgeDExIF49IHU8PDcgfCB1Pj4+KDMyLTcpO1xuICAgIHUgPSB4MTEgKyB4MTAgfCAwO1xuICAgIHg4IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4OCArIHgxMSB8IDA7XG4gICAgeDkgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDkgKyB4OCB8IDA7XG4gICAgeDEwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDE1ICsgeDE0IHwgMDtcbiAgICB4MTIgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxMiArIHgxNSB8IDA7XG4gICAgeDEzIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MTMgKyB4MTIgfCAwO1xuICAgIHgxNCBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTQgKyB4MTMgfCAwO1xuICAgIHgxNSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuICB9XG4gICB4MCA9ICB4MCArICBqMCB8IDA7XG4gICB4MSA9ICB4MSArICBqMSB8IDA7XG4gICB4MiA9ICB4MiArICBqMiB8IDA7XG4gICB4MyA9ICB4MyArICBqMyB8IDA7XG4gICB4NCA9ICB4NCArICBqNCB8IDA7XG4gICB4NSA9ICB4NSArICBqNSB8IDA7XG4gICB4NiA9ICB4NiArICBqNiB8IDA7XG4gICB4NyA9ICB4NyArICBqNyB8IDA7XG4gICB4OCA9ICB4OCArICBqOCB8IDA7XG4gICB4OSA9ICB4OSArICBqOSB8IDA7XG4gIHgxMCA9IHgxMCArIGoxMCB8IDA7XG4gIHgxMSA9IHgxMSArIGoxMSB8IDA7XG4gIHgxMiA9IHgxMiArIGoxMiB8IDA7XG4gIHgxMyA9IHgxMyArIGoxMyB8IDA7XG4gIHgxNCA9IHgxNCArIGoxNCB8IDA7XG4gIHgxNSA9IHgxNSArIGoxNSB8IDA7XG5cbiAgb1sgMF0gPSB4MCA+Pj4gIDAgJiAweGZmO1xuICBvWyAxXSA9IHgwID4+PiAgOCAmIDB4ZmY7XG4gIG9bIDJdID0geDAgPj4+IDE2ICYgMHhmZjtcbiAgb1sgM10gPSB4MCA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bIDRdID0geDEgPj4+ICAwICYgMHhmZjtcbiAgb1sgNV0gPSB4MSA+Pj4gIDggJiAweGZmO1xuICBvWyA2XSA9IHgxID4+PiAxNiAmIDB4ZmY7XG4gIG9bIDddID0geDEgPj4+IDI0ICYgMHhmZjtcblxuICBvWyA4XSA9IHgyID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDldID0geDIgPj4+ICA4ICYgMHhmZjtcbiAgb1sxMF0gPSB4MiA+Pj4gMTYgJiAweGZmO1xuICBvWzExXSA9IHgyID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sxMl0gPSB4MyA+Pj4gIDAgJiAweGZmO1xuICBvWzEzXSA9IHgzID4+PiAgOCAmIDB4ZmY7XG4gIG9bMTRdID0geDMgPj4+IDE2ICYgMHhmZjtcbiAgb1sxNV0gPSB4MyA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMTZdID0geDQgPj4+ICAwICYgMHhmZjtcbiAgb1sxN10gPSB4NCA+Pj4gIDggJiAweGZmO1xuICBvWzE4XSA9IHg0ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMTldID0geDQgPj4+IDI0ICYgMHhmZjtcblxuICBvWzIwXSA9IHg1ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMjFdID0geDUgPj4+ICA4ICYgMHhmZjtcbiAgb1syMl0gPSB4NSA+Pj4gMTYgJiAweGZmO1xuICBvWzIzXSA9IHg1ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1syNF0gPSB4NiA+Pj4gIDAgJiAweGZmO1xuICBvWzI1XSA9IHg2ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMjZdID0geDYgPj4+IDE2ICYgMHhmZjtcbiAgb1syN10gPSB4NiA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMjhdID0geDcgPj4+ICAwICYgMHhmZjtcbiAgb1syOV0gPSB4NyA+Pj4gIDggJiAweGZmO1xuICBvWzMwXSA9IHg3ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMzFdID0geDcgPj4+IDI0ICYgMHhmZjtcblxuICBvWzMyXSA9IHg4ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMzNdID0geDggPj4+ICA4ICYgMHhmZjtcbiAgb1szNF0gPSB4OCA+Pj4gMTYgJiAweGZmO1xuICBvWzM1XSA9IHg4ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1szNl0gPSB4OSA+Pj4gIDAgJiAweGZmO1xuICBvWzM3XSA9IHg5ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMzhdID0geDkgPj4+IDE2ICYgMHhmZjtcbiAgb1szOV0gPSB4OSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bNDBdID0geDEwID4+PiAgMCAmIDB4ZmY7XG4gIG9bNDFdID0geDEwID4+PiAgOCAmIDB4ZmY7XG4gIG9bNDJdID0geDEwID4+PiAxNiAmIDB4ZmY7XG4gIG9bNDNdID0geDEwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1s0NF0gPSB4MTEgPj4+ICAwICYgMHhmZjtcbiAgb1s0NV0gPSB4MTEgPj4+ICA4ICYgMHhmZjtcbiAgb1s0Nl0gPSB4MTEgPj4+IDE2ICYgMHhmZjtcbiAgb1s0N10gPSB4MTEgPj4+IDI0ICYgMHhmZjtcblxuICBvWzQ4XSA9IHgxMiA+Pj4gIDAgJiAweGZmO1xuICBvWzQ5XSA9IHgxMiA+Pj4gIDggJiAweGZmO1xuICBvWzUwXSA9IHgxMiA+Pj4gMTYgJiAweGZmO1xuICBvWzUxXSA9IHgxMiA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bNTJdID0geDEzID4+PiAgMCAmIDB4ZmY7XG4gIG9bNTNdID0geDEzID4+PiAgOCAmIDB4ZmY7XG4gIG9bNTRdID0geDEzID4+PiAxNiAmIDB4ZmY7XG4gIG9bNTVdID0geDEzID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1s1Nl0gPSB4MTQgPj4+ICAwICYgMHhmZjtcbiAgb1s1N10gPSB4MTQgPj4+ICA4ICYgMHhmZjtcbiAgb1s1OF0gPSB4MTQgPj4+IDE2ICYgMHhmZjtcbiAgb1s1OV0gPSB4MTQgPj4+IDI0ICYgMHhmZjtcblxuICBvWzYwXSA9IHgxNSA+Pj4gIDAgJiAweGZmO1xuICBvWzYxXSA9IHgxNSA+Pj4gIDggJiAweGZmO1xuICBvWzYyXSA9IHgxNSA+Pj4gMTYgJiAweGZmO1xuICBvWzYzXSA9IHgxNSA+Pj4gMjQgJiAweGZmO1xufVxuXG5mdW5jdGlvbiBjb3JlX2hzYWxzYTIwKG8scCxrLGMpIHtcbiAgdmFyIGowICA9IGNbIDBdICYgMHhmZiB8IChjWyAxXSAmIDB4ZmYpPDw4IHwgKGNbIDJdICYgMHhmZik8PDE2IHwgKGNbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajEgID0ga1sgMF0gJiAweGZmIHwgKGtbIDFdICYgMHhmZik8PDggfCAoa1sgMl0gJiAweGZmKTw8MTYgfCAoa1sgM10gJiAweGZmKTw8MjQsXG4gICAgICBqMiAgPSBrWyA0XSAmIDB4ZmYgfCAoa1sgNV0gJiAweGZmKTw8OCB8IChrWyA2XSAmIDB4ZmYpPDwxNiB8IChrWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGozICA9IGtbIDhdICYgMHhmZiB8IChrWyA5XSAmIDB4ZmYpPDw4IHwgKGtbMTBdICYgMHhmZik8PDE2IHwgKGtbMTFdICYgMHhmZik8PDI0LFxuICAgICAgajQgID0ga1sxMl0gJiAweGZmIHwgKGtbMTNdICYgMHhmZik8PDggfCAoa1sxNF0gJiAweGZmKTw8MTYgfCAoa1sxNV0gJiAweGZmKTw8MjQsXG4gICAgICBqNSAgPSBjWyA0XSAmIDB4ZmYgfCAoY1sgNV0gJiAweGZmKTw8OCB8IChjWyA2XSAmIDB4ZmYpPDwxNiB8IChjWyA3XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo2ICA9IHBbIDBdICYgMHhmZiB8IChwWyAxXSAmIDB4ZmYpPDw4IHwgKHBbIDJdICYgMHhmZik8PDE2IHwgKHBbIDNdICYgMHhmZik8PDI0LFxuICAgICAgajcgID0gcFsgNF0gJiAweGZmIHwgKHBbIDVdICYgMHhmZik8PDggfCAocFsgNl0gJiAweGZmKTw8MTYgfCAocFsgN10gJiAweGZmKTw8MjQsXG4gICAgICBqOCAgPSBwWyA4XSAmIDB4ZmYgfCAocFsgOV0gJiAweGZmKTw8OCB8IChwWzEwXSAmIDB4ZmYpPDwxNiB8IChwWzExXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGo5ICA9IHBbMTJdICYgMHhmZiB8IChwWzEzXSAmIDB4ZmYpPDw4IHwgKHBbMTRdICYgMHhmZik8PDE2IHwgKHBbMTVdICYgMHhmZik8PDI0LFxuICAgICAgajEwID0gY1sgOF0gJiAweGZmIHwgKGNbIDldICYgMHhmZik8PDggfCAoY1sxMF0gJiAweGZmKTw8MTYgfCAoY1sxMV0gJiAweGZmKTw8MjQsXG4gICAgICBqMTEgPSBrWzE2XSAmIDB4ZmYgfCAoa1sxN10gJiAweGZmKTw8OCB8IChrWzE4XSAmIDB4ZmYpPDwxNiB8IChrWzE5XSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxMiA9IGtbMjBdICYgMHhmZiB8IChrWzIxXSAmIDB4ZmYpPDw4IHwgKGtbMjJdICYgMHhmZik8PDE2IHwgKGtbMjNdICYgMHhmZik8PDI0LFxuICAgICAgajEzID0ga1syNF0gJiAweGZmIHwgKGtbMjVdICYgMHhmZik8PDggfCAoa1syNl0gJiAweGZmKTw8MTYgfCAoa1syN10gJiAweGZmKTw8MjQsXG4gICAgICBqMTQgPSBrWzI4XSAmIDB4ZmYgfCAoa1syOV0gJiAweGZmKTw8OCB8IChrWzMwXSAmIDB4ZmYpPDwxNiB8IChrWzMxXSAmIDB4ZmYpPDwyNCxcbiAgICAgIGoxNSA9IGNbMTJdICYgMHhmZiB8IChjWzEzXSAmIDB4ZmYpPDw4IHwgKGNbMTRdICYgMHhmZik8PDE2IHwgKGNbMTVdICYgMHhmZik8PDI0O1xuXG4gIHZhciB4MCA9IGowLCB4MSA9IGoxLCB4MiA9IGoyLCB4MyA9IGozLCB4NCA9IGo0LCB4NSA9IGo1LCB4NiA9IGo2LCB4NyA9IGo3LFxuICAgICAgeDggPSBqOCwgeDkgPSBqOSwgeDEwID0gajEwLCB4MTEgPSBqMTEsIHgxMiA9IGoxMiwgeDEzID0gajEzLCB4MTQgPSBqMTQsXG4gICAgICB4MTUgPSBqMTUsIHU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDsgaSArPSAyKSB7XG4gICAgdSA9IHgwICsgeDEyIHwgMDtcbiAgICB4NCBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDQgKyB4MCB8IDA7XG4gICAgeDggXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg4ICsgeDQgfCAwO1xuICAgIHgxMiBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4MTIgKyB4OCB8IDA7XG4gICAgeDAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4NSArIHgxIHwgMDtcbiAgICB4OSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDkgKyB4NSB8IDA7XG4gICAgeDEzIF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4MTMgKyB4OSB8IDA7XG4gICAgeDEgXj0gdTw8MTMgfCB1Pj4+KDMyLTEzKTtcbiAgICB1ID0geDEgKyB4MTMgfCAwO1xuICAgIHg1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDEwICsgeDYgfCAwO1xuICAgIHgxNCBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDE0ICsgeDEwIHwgMDtcbiAgICB4MiBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDIgKyB4MTQgfCAwO1xuICAgIHg2IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHg2ICsgeDIgfCAwO1xuICAgIHgxMCBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxNSArIHgxMSB8IDA7XG4gICAgeDMgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgzICsgeDE1IHwgMDtcbiAgICB4NyBePSB1PDw5IHwgdT4+PigzMi05KTtcbiAgICB1ID0geDcgKyB4MyB8IDA7XG4gICAgeDExIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxMSArIHg3IHwgMDtcbiAgICB4MTUgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MCArIHgzIHwgMDtcbiAgICB4MSBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDEgKyB4MCB8IDA7XG4gICAgeDIgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgyICsgeDEgfCAwO1xuICAgIHgzIF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgzICsgeDIgfCAwO1xuICAgIHgwIF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG5cbiAgICB1ID0geDUgKyB4NCB8IDA7XG4gICAgeDYgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHg2ICsgeDUgfCAwO1xuICAgIHg3IF49IHU8PDkgfCB1Pj4+KDMyLTkpO1xuICAgIHUgPSB4NyArIHg2IHwgMDtcbiAgICB4NCBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4NCArIHg3IHwgMDtcbiAgICB4NSBePSB1PDwxOCB8IHU+Pj4oMzItMTgpO1xuXG4gICAgdSA9IHgxMCArIHg5IHwgMDtcbiAgICB4MTEgXj0gdTw8NyB8IHU+Pj4oMzItNyk7XG4gICAgdSA9IHgxMSArIHgxMCB8IDA7XG4gICAgeDggXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHg4ICsgeDExIHwgMDtcbiAgICB4OSBePSB1PDwxMyB8IHU+Pj4oMzItMTMpO1xuICAgIHUgPSB4OSArIHg4IHwgMDtcbiAgICB4MTAgXj0gdTw8MTggfCB1Pj4+KDMyLTE4KTtcblxuICAgIHUgPSB4MTUgKyB4MTQgfCAwO1xuICAgIHgxMiBePSB1PDw3IHwgdT4+PigzMi03KTtcbiAgICB1ID0geDEyICsgeDE1IHwgMDtcbiAgICB4MTMgXj0gdTw8OSB8IHU+Pj4oMzItOSk7XG4gICAgdSA9IHgxMyArIHgxMiB8IDA7XG4gICAgeDE0IF49IHU8PDEzIHwgdT4+PigzMi0xMyk7XG4gICAgdSA9IHgxNCArIHgxMyB8IDA7XG4gICAgeDE1IF49IHU8PDE4IHwgdT4+PigzMi0xOCk7XG4gIH1cblxuICBvWyAwXSA9IHgwID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDFdID0geDAgPj4+ICA4ICYgMHhmZjtcbiAgb1sgMl0gPSB4MCA+Pj4gMTYgJiAweGZmO1xuICBvWyAzXSA9IHgwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sgNF0gPSB4NSA+Pj4gIDAgJiAweGZmO1xuICBvWyA1XSA9IHg1ID4+PiAgOCAmIDB4ZmY7XG4gIG9bIDZdID0geDUgPj4+IDE2ICYgMHhmZjtcbiAgb1sgN10gPSB4NSA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bIDhdID0geDEwID4+PiAgMCAmIDB4ZmY7XG4gIG9bIDldID0geDEwID4+PiAgOCAmIDB4ZmY7XG4gIG9bMTBdID0geDEwID4+PiAxNiAmIDB4ZmY7XG4gIG9bMTFdID0geDEwID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1sxMl0gPSB4MTUgPj4+ICAwICYgMHhmZjtcbiAgb1sxM10gPSB4MTUgPj4+ICA4ICYgMHhmZjtcbiAgb1sxNF0gPSB4MTUgPj4+IDE2ICYgMHhmZjtcbiAgb1sxNV0gPSB4MTUgPj4+IDI0ICYgMHhmZjtcblxuICBvWzE2XSA9IHg2ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMTddID0geDYgPj4+ICA4ICYgMHhmZjtcbiAgb1sxOF0gPSB4NiA+Pj4gMTYgJiAweGZmO1xuICBvWzE5XSA9IHg2ID4+PiAyNCAmIDB4ZmY7XG5cbiAgb1syMF0gPSB4NyA+Pj4gIDAgJiAweGZmO1xuICBvWzIxXSA9IHg3ID4+PiAgOCAmIDB4ZmY7XG4gIG9bMjJdID0geDcgPj4+IDE2ICYgMHhmZjtcbiAgb1syM10gPSB4NyA+Pj4gMjQgJiAweGZmO1xuXG4gIG9bMjRdID0geDggPj4+ICAwICYgMHhmZjtcbiAgb1syNV0gPSB4OCA+Pj4gIDggJiAweGZmO1xuICBvWzI2XSA9IHg4ID4+PiAxNiAmIDB4ZmY7XG4gIG9bMjddID0geDggPj4+IDI0ICYgMHhmZjtcblxuICBvWzI4XSA9IHg5ID4+PiAgMCAmIDB4ZmY7XG4gIG9bMjldID0geDkgPj4+ICA4ICYgMHhmZjtcbiAgb1szMF0gPSB4OSA+Pj4gMTYgJiAweGZmO1xuICBvWzMxXSA9IHg5ID4+PiAyNCAmIDB4ZmY7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19jb3JlX3NhbHNhMjAob3V0LGlucCxrLGMpIHtcbiAgY29yZV9zYWxzYTIwKG91dCxpbnAsayxjKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX2NvcmVfaHNhbHNhMjAob3V0LGlucCxrLGMpIHtcbiAgY29yZV9oc2Fsc2EyMChvdXQsaW5wLGssYyk7XG59XG5cbnZhciBzaWdtYSA9IG5ldyBVaW50OEFycmF5KFsxMDEsIDEyMCwgMTEyLCA5NywgMTEwLCAxMDAsIDMyLCA1MSwgNTAsIDQ1LCA5OCwgMTIxLCAxMTYsIDEwMSwgMzIsIDEwN10pO1xuICAgICAgICAgICAgLy8gXCJleHBhbmQgMzItYnl0ZSBrXCJcblxuZnVuY3Rpb24gY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcihjLGNwb3MsbSxtcG9zLGIsbixrKSB7XG4gIHZhciB6ID0gbmV3IFVpbnQ4QXJyYXkoMTYpLCB4ID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgdSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHpbaV0gPSAwO1xuICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB6W2ldID0gbltpXTtcbiAgd2hpbGUgKGIgPj0gNjQpIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgY1tjcG9zK2ldID0gbVttcG9zK2ldIF4geFtpXTtcbiAgICB1ID0gMTtcbiAgICBmb3IgKGkgPSA4OyBpIDwgMTY7IGkrKykge1xuICAgICAgdSA9IHUgKyAoeltpXSAmIDB4ZmYpIHwgMDtcbiAgICAgIHpbaV0gPSB1ICYgMHhmZjtcbiAgICAgIHUgPj4+PSA4O1xuICAgIH1cbiAgICBiIC09IDY0O1xuICAgIGNwb3MgKz0gNjQ7XG4gICAgbXBvcyArPSA2NDtcbiAgfVxuICBpZiAoYiA+IDApIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYjsgaSsrKSBjW2Nwb3MraV0gPSBtW21wb3MraV0gXiB4W2ldO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc3RyZWFtX3NhbHNhMjAoYyxjcG9zLGIsbixrKSB7XG4gIHZhciB6ID0gbmV3IFVpbnQ4QXJyYXkoMTYpLCB4ID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgdSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHpbaV0gPSAwO1xuICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB6W2ldID0gbltpXTtcbiAgd2hpbGUgKGIgPj0gNjQpIHtcbiAgICBjcnlwdG9fY29yZV9zYWxzYTIwKHgseixrLHNpZ21hKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgY1tjcG9zK2ldID0geFtpXTtcbiAgICB1ID0gMTtcbiAgICBmb3IgKGkgPSA4OyBpIDwgMTY7IGkrKykge1xuICAgICAgdSA9IHUgKyAoeltpXSAmIDB4ZmYpIHwgMDtcbiAgICAgIHpbaV0gPSB1ICYgMHhmZjtcbiAgICAgIHUgPj4+PSA4O1xuICAgIH1cbiAgICBiIC09IDY0O1xuICAgIGNwb3MgKz0gNjQ7XG4gIH1cbiAgaWYgKGIgPiAwKSB7XG4gICAgY3J5cHRvX2NvcmVfc2Fsc2EyMCh4LHosayxzaWdtYSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGI7IGkrKykgY1tjcG9zK2ldID0geFtpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3N0cmVhbShjLGNwb3MsZCxuLGspIHtcbiAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19jb3JlX2hzYWxzYTIwKHMsbixrLHNpZ21hKTtcbiAgdmFyIHNuID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSBzbltpXSA9IG5baSsxNl07XG4gIHJldHVybiBjcnlwdG9fc3RyZWFtX3NhbHNhMjAoYyxjcG9zLGQsc24scyk7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zdHJlYW1feG9yKGMsY3BvcyxtLG1wb3MsZCxuLGspIHtcbiAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19jb3JlX2hzYWxzYTIwKHMsbixrLHNpZ21hKTtcbiAgdmFyIHNuID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSBzbltpXSA9IG5baSsxNl07XG4gIHJldHVybiBjcnlwdG9fc3RyZWFtX3NhbHNhMjBfeG9yKGMsY3BvcyxtLG1wb3MsZCxzbixzKTtcbn1cblxuLypcbiogUG9ydCBvZiBBbmRyZXcgTW9vbidzIFBvbHkxMzA1LWRvbm5hLTE2LiBQdWJsaWMgZG9tYWluLlxuKiBodHRwczovL2dpdGh1Yi5jb20vZmxvb2R5YmVycnkvcG9seTEzMDUtZG9ubmFcbiovXG5cbnZhciBwb2x5MTMwNSA9IGZ1bmN0aW9uKGtleSkge1xuICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgdGhpcy5yID0gbmV3IFVpbnQxNkFycmF5KDEwKTtcbiAgdGhpcy5oID0gbmV3IFVpbnQxNkFycmF5KDEwKTtcbiAgdGhpcy5wYWQgPSBuZXcgVWludDE2QXJyYXkoOCk7XG4gIHRoaXMubGVmdG92ZXIgPSAwO1xuICB0aGlzLmZpbiA9IDA7XG5cbiAgdmFyIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NztcblxuICB0MCA9IGtleVsgMF0gJiAweGZmIHwgKGtleVsgMV0gJiAweGZmKSA8PCA4OyB0aGlzLnJbMF0gPSAoIHQwICAgICAgICAgICAgICAgICAgICAgKSAmIDB4MWZmZjtcbiAgdDEgPSBrZXlbIDJdICYgMHhmZiB8IChrZXlbIDNdICYgMHhmZikgPDwgODsgdGhpcy5yWzFdID0gKCh0MCA+Pj4gMTMpIHwgKHQxIDw8ICAzKSkgJiAweDFmZmY7XG4gIHQyID0ga2V5WyA0XSAmIDB4ZmYgfCAoa2V5WyA1XSAmIDB4ZmYpIDw8IDg7IHRoaXMuclsyXSA9ICgodDEgPj4+IDEwKSB8ICh0MiA8PCAgNikpICYgMHgxZjAzO1xuICB0MyA9IGtleVsgNl0gJiAweGZmIHwgKGtleVsgN10gJiAweGZmKSA8PCA4OyB0aGlzLnJbM10gPSAoKHQyID4+PiAgNykgfCAodDMgPDwgIDkpKSAmIDB4MWZmZjtcbiAgdDQgPSBrZXlbIDhdICYgMHhmZiB8IChrZXlbIDldICYgMHhmZikgPDwgODsgdGhpcy5yWzRdID0gKCh0MyA+Pj4gIDQpIHwgKHQ0IDw8IDEyKSkgJiAweDAwZmY7XG4gIHRoaXMucls1XSA9ICgodDQgPj4+ICAxKSkgJiAweDFmZmU7XG4gIHQ1ID0ga2V5WzEwXSAmIDB4ZmYgfCAoa2V5WzExXSAmIDB4ZmYpIDw8IDg7IHRoaXMucls2XSA9ICgodDQgPj4+IDE0KSB8ICh0NSA8PCAgMikpICYgMHgxZmZmO1xuICB0NiA9IGtleVsxMl0gJiAweGZmIHwgKGtleVsxM10gJiAweGZmKSA8PCA4OyB0aGlzLnJbN10gPSAoKHQ1ID4+PiAxMSkgfCAodDYgPDwgIDUpKSAmIDB4MWY4MTtcbiAgdDcgPSBrZXlbMTRdICYgMHhmZiB8IChrZXlbMTVdICYgMHhmZikgPDwgODsgdGhpcy5yWzhdID0gKCh0NiA+Pj4gIDgpIHwgKHQ3IDw8ICA4KSkgJiAweDFmZmY7XG4gIHRoaXMucls5XSA9ICgodDcgPj4+ICA1KSkgJiAweDAwN2Y7XG5cbiAgdGhpcy5wYWRbMF0gPSBrZXlbMTZdICYgMHhmZiB8IChrZXlbMTddICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbMV0gPSBrZXlbMThdICYgMHhmZiB8IChrZXlbMTldICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbMl0gPSBrZXlbMjBdICYgMHhmZiB8IChrZXlbMjFdICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbM10gPSBrZXlbMjJdICYgMHhmZiB8IChrZXlbMjNdICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbNF0gPSBrZXlbMjRdICYgMHhmZiB8IChrZXlbMjVdICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbNV0gPSBrZXlbMjZdICYgMHhmZiB8IChrZXlbMjddICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbNl0gPSBrZXlbMjhdICYgMHhmZiB8IChrZXlbMjldICYgMHhmZikgPDwgODtcbiAgdGhpcy5wYWRbN10gPSBrZXlbMzBdICYgMHhmZiB8IChrZXlbMzFdICYgMHhmZikgPDwgODtcbn07XG5cbnBvbHkxMzA1LnByb3RvdHlwZS5ibG9ja3MgPSBmdW5jdGlvbihtLCBtcG9zLCBieXRlcykge1xuICB2YXIgaGliaXQgPSB0aGlzLmZpbiA/IDAgOiAoMSA8PCAxMSk7XG4gIHZhciB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIGM7XG4gIHZhciBkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOTtcblxuICB2YXIgaDAgPSB0aGlzLmhbMF0sXG4gICAgICBoMSA9IHRoaXMuaFsxXSxcbiAgICAgIGgyID0gdGhpcy5oWzJdLFxuICAgICAgaDMgPSB0aGlzLmhbM10sXG4gICAgICBoNCA9IHRoaXMuaFs0XSxcbiAgICAgIGg1ID0gdGhpcy5oWzVdLFxuICAgICAgaDYgPSB0aGlzLmhbNl0sXG4gICAgICBoNyA9IHRoaXMuaFs3XSxcbiAgICAgIGg4ID0gdGhpcy5oWzhdLFxuICAgICAgaDkgPSB0aGlzLmhbOV07XG5cbiAgdmFyIHIwID0gdGhpcy5yWzBdLFxuICAgICAgcjEgPSB0aGlzLnJbMV0sXG4gICAgICByMiA9IHRoaXMuclsyXSxcbiAgICAgIHIzID0gdGhpcy5yWzNdLFxuICAgICAgcjQgPSB0aGlzLnJbNF0sXG4gICAgICByNSA9IHRoaXMucls1XSxcbiAgICAgIHI2ID0gdGhpcy5yWzZdLFxuICAgICAgcjcgPSB0aGlzLnJbN10sXG4gICAgICByOCA9IHRoaXMucls4XSxcbiAgICAgIHI5ID0gdGhpcy5yWzldO1xuXG4gIHdoaWxlIChieXRlcyA+PSAxNikge1xuICAgIHQwID0gbVttcG9zKyAwXSAmIDB4ZmYgfCAobVttcG9zKyAxXSAmIDB4ZmYpIDw8IDg7IGgwICs9ICggdDAgICAgICAgICAgICAgICAgICAgICApICYgMHgxZmZmO1xuICAgIHQxID0gbVttcG9zKyAyXSAmIDB4ZmYgfCAobVttcG9zKyAzXSAmIDB4ZmYpIDw8IDg7IGgxICs9ICgodDAgPj4+IDEzKSB8ICh0MSA8PCAgMykpICYgMHgxZmZmO1xuICAgIHQyID0gbVttcG9zKyA0XSAmIDB4ZmYgfCAobVttcG9zKyA1XSAmIDB4ZmYpIDw8IDg7IGgyICs9ICgodDEgPj4+IDEwKSB8ICh0MiA8PCAgNikpICYgMHgxZmZmO1xuICAgIHQzID0gbVttcG9zKyA2XSAmIDB4ZmYgfCAobVttcG9zKyA3XSAmIDB4ZmYpIDw8IDg7IGgzICs9ICgodDIgPj4+ICA3KSB8ICh0MyA8PCAgOSkpICYgMHgxZmZmO1xuICAgIHQ0ID0gbVttcG9zKyA4XSAmIDB4ZmYgfCAobVttcG9zKyA5XSAmIDB4ZmYpIDw8IDg7IGg0ICs9ICgodDMgPj4+ICA0KSB8ICh0NCA8PCAxMikpICYgMHgxZmZmO1xuICAgIGg1ICs9ICgodDQgPj4+ICAxKSkgJiAweDFmZmY7XG4gICAgdDUgPSBtW21wb3MrMTBdICYgMHhmZiB8IChtW21wb3MrMTFdICYgMHhmZikgPDwgODsgaDYgKz0gKCh0NCA+Pj4gMTQpIHwgKHQ1IDw8ICAyKSkgJiAweDFmZmY7XG4gICAgdDYgPSBtW21wb3MrMTJdICYgMHhmZiB8IChtW21wb3MrMTNdICYgMHhmZikgPDwgODsgaDcgKz0gKCh0NSA+Pj4gMTEpIHwgKHQ2IDw8ICA1KSkgJiAweDFmZmY7XG4gICAgdDcgPSBtW21wb3MrMTRdICYgMHhmZiB8IChtW21wb3MrMTVdICYgMHhmZikgPDwgODsgaDggKz0gKCh0NiA+Pj4gIDgpIHwgKHQ3IDw8ICA4KSkgJiAweDFmZmY7XG4gICAgaDkgKz0gKCh0NyA+Pj4gNSkpIHwgaGliaXQ7XG5cbiAgICBjID0gMDtcblxuICAgIGQwID0gYztcbiAgICBkMCArPSBoMCAqIHIwO1xuICAgIGQwICs9IGgxICogKDUgKiByOSk7XG4gICAgZDAgKz0gaDIgKiAoNSAqIHI4KTtcbiAgICBkMCArPSBoMyAqICg1ICogcjcpO1xuICAgIGQwICs9IGg0ICogKDUgKiByNik7XG4gICAgYyA9IChkMCA+Pj4gMTMpOyBkMCAmPSAweDFmZmY7XG4gICAgZDAgKz0gaDUgKiAoNSAqIHI1KTtcbiAgICBkMCArPSBoNiAqICg1ICogcjQpO1xuICAgIGQwICs9IGg3ICogKDUgKiByMyk7XG4gICAgZDAgKz0gaDggKiAoNSAqIHIyKTtcbiAgICBkMCArPSBoOSAqICg1ICogcjEpO1xuICAgIGMgKz0gKGQwID4+PiAxMyk7IGQwICY9IDB4MWZmZjtcblxuICAgIGQxID0gYztcbiAgICBkMSArPSBoMCAqIHIxO1xuICAgIGQxICs9IGgxICogcjA7XG4gICAgZDEgKz0gaDIgKiAoNSAqIHI5KTtcbiAgICBkMSArPSBoMyAqICg1ICogcjgpO1xuICAgIGQxICs9IGg0ICogKDUgKiByNyk7XG4gICAgYyA9IChkMSA+Pj4gMTMpOyBkMSAmPSAweDFmZmY7XG4gICAgZDEgKz0gaDUgKiAoNSAqIHI2KTtcbiAgICBkMSArPSBoNiAqICg1ICogcjUpO1xuICAgIGQxICs9IGg3ICogKDUgKiByNCk7XG4gICAgZDEgKz0gaDggKiAoNSAqIHIzKTtcbiAgICBkMSArPSBoOSAqICg1ICogcjIpO1xuICAgIGMgKz0gKGQxID4+PiAxMyk7IGQxICY9IDB4MWZmZjtcblxuICAgIGQyID0gYztcbiAgICBkMiArPSBoMCAqIHIyO1xuICAgIGQyICs9IGgxICogcjE7XG4gICAgZDIgKz0gaDIgKiByMDtcbiAgICBkMiArPSBoMyAqICg1ICogcjkpO1xuICAgIGQyICs9IGg0ICogKDUgKiByOCk7XG4gICAgYyA9IChkMiA+Pj4gMTMpOyBkMiAmPSAweDFmZmY7XG4gICAgZDIgKz0gaDUgKiAoNSAqIHI3KTtcbiAgICBkMiArPSBoNiAqICg1ICogcjYpO1xuICAgIGQyICs9IGg3ICogKDUgKiByNSk7XG4gICAgZDIgKz0gaDggKiAoNSAqIHI0KTtcbiAgICBkMiArPSBoOSAqICg1ICogcjMpO1xuICAgIGMgKz0gKGQyID4+PiAxMyk7IGQyICY9IDB4MWZmZjtcblxuICAgIGQzID0gYztcbiAgICBkMyArPSBoMCAqIHIzO1xuICAgIGQzICs9IGgxICogcjI7XG4gICAgZDMgKz0gaDIgKiByMTtcbiAgICBkMyArPSBoMyAqIHIwO1xuICAgIGQzICs9IGg0ICogKDUgKiByOSk7XG4gICAgYyA9IChkMyA+Pj4gMTMpOyBkMyAmPSAweDFmZmY7XG4gICAgZDMgKz0gaDUgKiAoNSAqIHI4KTtcbiAgICBkMyArPSBoNiAqICg1ICogcjcpO1xuICAgIGQzICs9IGg3ICogKDUgKiByNik7XG4gICAgZDMgKz0gaDggKiAoNSAqIHI1KTtcbiAgICBkMyArPSBoOSAqICg1ICogcjQpO1xuICAgIGMgKz0gKGQzID4+PiAxMyk7IGQzICY9IDB4MWZmZjtcblxuICAgIGQ0ID0gYztcbiAgICBkNCArPSBoMCAqIHI0O1xuICAgIGQ0ICs9IGgxICogcjM7XG4gICAgZDQgKz0gaDIgKiByMjtcbiAgICBkNCArPSBoMyAqIHIxO1xuICAgIGQ0ICs9IGg0ICogcjA7XG4gICAgYyA9IChkNCA+Pj4gMTMpOyBkNCAmPSAweDFmZmY7XG4gICAgZDQgKz0gaDUgKiAoNSAqIHI5KTtcbiAgICBkNCArPSBoNiAqICg1ICogcjgpO1xuICAgIGQ0ICs9IGg3ICogKDUgKiByNyk7XG4gICAgZDQgKz0gaDggKiAoNSAqIHI2KTtcbiAgICBkNCArPSBoOSAqICg1ICogcjUpO1xuICAgIGMgKz0gKGQ0ID4+PiAxMyk7IGQ0ICY9IDB4MWZmZjtcblxuICAgIGQ1ID0gYztcbiAgICBkNSArPSBoMCAqIHI1O1xuICAgIGQ1ICs9IGgxICogcjQ7XG4gICAgZDUgKz0gaDIgKiByMztcbiAgICBkNSArPSBoMyAqIHIyO1xuICAgIGQ1ICs9IGg0ICogcjE7XG4gICAgYyA9IChkNSA+Pj4gMTMpOyBkNSAmPSAweDFmZmY7XG4gICAgZDUgKz0gaDUgKiByMDtcbiAgICBkNSArPSBoNiAqICg1ICogcjkpO1xuICAgIGQ1ICs9IGg3ICogKDUgKiByOCk7XG4gICAgZDUgKz0gaDggKiAoNSAqIHI3KTtcbiAgICBkNSArPSBoOSAqICg1ICogcjYpO1xuICAgIGMgKz0gKGQ1ID4+PiAxMyk7IGQ1ICY9IDB4MWZmZjtcblxuICAgIGQ2ID0gYztcbiAgICBkNiArPSBoMCAqIHI2O1xuICAgIGQ2ICs9IGgxICogcjU7XG4gICAgZDYgKz0gaDIgKiByNDtcbiAgICBkNiArPSBoMyAqIHIzO1xuICAgIGQ2ICs9IGg0ICogcjI7XG4gICAgYyA9IChkNiA+Pj4gMTMpOyBkNiAmPSAweDFmZmY7XG4gICAgZDYgKz0gaDUgKiByMTtcbiAgICBkNiArPSBoNiAqIHIwO1xuICAgIGQ2ICs9IGg3ICogKDUgKiByOSk7XG4gICAgZDYgKz0gaDggKiAoNSAqIHI4KTtcbiAgICBkNiArPSBoOSAqICg1ICogcjcpO1xuICAgIGMgKz0gKGQ2ID4+PiAxMyk7IGQ2ICY9IDB4MWZmZjtcblxuICAgIGQ3ID0gYztcbiAgICBkNyArPSBoMCAqIHI3O1xuICAgIGQ3ICs9IGgxICogcjY7XG4gICAgZDcgKz0gaDIgKiByNTtcbiAgICBkNyArPSBoMyAqIHI0O1xuICAgIGQ3ICs9IGg0ICogcjM7XG4gICAgYyA9IChkNyA+Pj4gMTMpOyBkNyAmPSAweDFmZmY7XG4gICAgZDcgKz0gaDUgKiByMjtcbiAgICBkNyArPSBoNiAqIHIxO1xuICAgIGQ3ICs9IGg3ICogcjA7XG4gICAgZDcgKz0gaDggKiAoNSAqIHI5KTtcbiAgICBkNyArPSBoOSAqICg1ICogcjgpO1xuICAgIGMgKz0gKGQ3ID4+PiAxMyk7IGQ3ICY9IDB4MWZmZjtcblxuICAgIGQ4ID0gYztcbiAgICBkOCArPSBoMCAqIHI4O1xuICAgIGQ4ICs9IGgxICogcjc7XG4gICAgZDggKz0gaDIgKiByNjtcbiAgICBkOCArPSBoMyAqIHI1O1xuICAgIGQ4ICs9IGg0ICogcjQ7XG4gICAgYyA9IChkOCA+Pj4gMTMpOyBkOCAmPSAweDFmZmY7XG4gICAgZDggKz0gaDUgKiByMztcbiAgICBkOCArPSBoNiAqIHIyO1xuICAgIGQ4ICs9IGg3ICogcjE7XG4gICAgZDggKz0gaDggKiByMDtcbiAgICBkOCArPSBoOSAqICg1ICogcjkpO1xuICAgIGMgKz0gKGQ4ID4+PiAxMyk7IGQ4ICY9IDB4MWZmZjtcblxuICAgIGQ5ID0gYztcbiAgICBkOSArPSBoMCAqIHI5O1xuICAgIGQ5ICs9IGgxICogcjg7XG4gICAgZDkgKz0gaDIgKiByNztcbiAgICBkOSArPSBoMyAqIHI2O1xuICAgIGQ5ICs9IGg0ICogcjU7XG4gICAgYyA9IChkOSA+Pj4gMTMpOyBkOSAmPSAweDFmZmY7XG4gICAgZDkgKz0gaDUgKiByNDtcbiAgICBkOSArPSBoNiAqIHIzO1xuICAgIGQ5ICs9IGg3ICogcjI7XG4gICAgZDkgKz0gaDggKiByMTtcbiAgICBkOSArPSBoOSAqIHIwO1xuICAgIGMgKz0gKGQ5ID4+PiAxMyk7IGQ5ICY9IDB4MWZmZjtcblxuICAgIGMgPSAoKChjIDw8IDIpICsgYykpIHwgMDtcbiAgICBjID0gKGMgKyBkMCkgfCAwO1xuICAgIGQwID0gYyAmIDB4MWZmZjtcbiAgICBjID0gKGMgPj4+IDEzKTtcbiAgICBkMSArPSBjO1xuXG4gICAgaDAgPSBkMDtcbiAgICBoMSA9IGQxO1xuICAgIGgyID0gZDI7XG4gICAgaDMgPSBkMztcbiAgICBoNCA9IGQ0O1xuICAgIGg1ID0gZDU7XG4gICAgaDYgPSBkNjtcbiAgICBoNyA9IGQ3O1xuICAgIGg4ID0gZDg7XG4gICAgaDkgPSBkOTtcblxuICAgIG1wb3MgKz0gMTY7XG4gICAgYnl0ZXMgLT0gMTY7XG4gIH1cbiAgdGhpcy5oWzBdID0gaDA7XG4gIHRoaXMuaFsxXSA9IGgxO1xuICB0aGlzLmhbMl0gPSBoMjtcbiAgdGhpcy5oWzNdID0gaDM7XG4gIHRoaXMuaFs0XSA9IGg0O1xuICB0aGlzLmhbNV0gPSBoNTtcbiAgdGhpcy5oWzZdID0gaDY7XG4gIHRoaXMuaFs3XSA9IGg3O1xuICB0aGlzLmhbOF0gPSBoODtcbiAgdGhpcy5oWzldID0gaDk7XG59O1xuXG5wb2x5MTMwNS5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24obWFjLCBtYWNwb3MpIHtcbiAgdmFyIGcgPSBuZXcgVWludDE2QXJyYXkoMTApO1xuICB2YXIgYywgbWFzaywgZiwgaTtcblxuICBpZiAodGhpcy5sZWZ0b3Zlcikge1xuICAgIGkgPSB0aGlzLmxlZnRvdmVyO1xuICAgIHRoaXMuYnVmZmVyW2krK10gPSAxO1xuICAgIGZvciAoOyBpIDwgMTY7IGkrKykgdGhpcy5idWZmZXJbaV0gPSAwO1xuICAgIHRoaXMuZmluID0gMTtcbiAgICB0aGlzLmJsb2Nrcyh0aGlzLmJ1ZmZlciwgMCwgMTYpO1xuICB9XG5cbiAgYyA9IHRoaXMuaFsxXSA+Pj4gMTM7XG4gIHRoaXMuaFsxXSAmPSAweDFmZmY7XG4gIGZvciAoaSA9IDI7IGkgPCAxMDsgaSsrKSB7XG4gICAgdGhpcy5oW2ldICs9IGM7XG4gICAgYyA9IHRoaXMuaFtpXSA+Pj4gMTM7XG4gICAgdGhpcy5oW2ldICY9IDB4MWZmZjtcbiAgfVxuICB0aGlzLmhbMF0gKz0gKGMgKiA1KTtcbiAgYyA9IHRoaXMuaFswXSA+Pj4gMTM7XG4gIHRoaXMuaFswXSAmPSAweDFmZmY7XG4gIHRoaXMuaFsxXSArPSBjO1xuICBjID0gdGhpcy5oWzFdID4+PiAxMztcbiAgdGhpcy5oWzFdICY9IDB4MWZmZjtcbiAgdGhpcy5oWzJdICs9IGM7XG5cbiAgZ1swXSA9IHRoaXMuaFswXSArIDU7XG4gIGMgPSBnWzBdID4+PiAxMztcbiAgZ1swXSAmPSAweDFmZmY7XG4gIGZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKSB7XG4gICAgZ1tpXSA9IHRoaXMuaFtpXSArIGM7XG4gICAgYyA9IGdbaV0gPj4+IDEzO1xuICAgIGdbaV0gJj0gMHgxZmZmO1xuICB9XG4gIGdbOV0gLT0gKDEgPDwgMTMpO1xuXG4gIG1hc2sgPSAoYyBeIDEpIC0gMTtcbiAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIGdbaV0gJj0gbWFzaztcbiAgbWFzayA9IH5tYXNrO1xuICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgdGhpcy5oW2ldID0gKHRoaXMuaFtpXSAmIG1hc2spIHwgZ1tpXTtcblxuICB0aGlzLmhbMF0gPSAoKHRoaXMuaFswXSAgICAgICApIHwgKHRoaXMuaFsxXSA8PCAxMykgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFsxXSA9ICgodGhpcy5oWzFdID4+PiAgMykgfCAodGhpcy5oWzJdIDw8IDEwKSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzJdID0gKCh0aGlzLmhbMl0gPj4+ICA2KSB8ICh0aGlzLmhbM10gPDwgIDcpICAgICAgICAgICAgICAgICAgICApICYgMHhmZmZmO1xuICB0aGlzLmhbM10gPSAoKHRoaXMuaFszXSA+Pj4gIDkpIHwgKHRoaXMuaFs0XSA8PCAgNCkgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFs0XSA9ICgodGhpcy5oWzRdID4+PiAxMikgfCAodGhpcy5oWzVdIDw8ICAxKSB8ICh0aGlzLmhbNl0gPDwgMTQpKSAmIDB4ZmZmZjtcbiAgdGhpcy5oWzVdID0gKCh0aGlzLmhbNl0gPj4+ICAyKSB8ICh0aGlzLmhbN10gPDwgMTEpICAgICAgICAgICAgICAgICAgICApICYgMHhmZmZmO1xuICB0aGlzLmhbNl0gPSAoKHRoaXMuaFs3XSA+Pj4gIDUpIHwgKHRoaXMuaFs4XSA8PCAgOCkgICAgICAgICAgICAgICAgICAgICkgJiAweGZmZmY7XG4gIHRoaXMuaFs3XSA9ICgodGhpcy5oWzhdID4+PiAgOCkgfCAodGhpcy5oWzldIDw8ICA1KSAgICAgICAgICAgICAgICAgICAgKSAmIDB4ZmZmZjtcblxuICBmID0gdGhpcy5oWzBdICsgdGhpcy5wYWRbMF07XG4gIHRoaXMuaFswXSA9IGYgJiAweGZmZmY7XG4gIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspIHtcbiAgICBmID0gKCgodGhpcy5oW2ldICsgdGhpcy5wYWRbaV0pIHwgMCkgKyAoZiA+Pj4gMTYpKSB8IDA7XG4gICAgdGhpcy5oW2ldID0gZiAmIDB4ZmZmZjtcbiAgfVxuXG4gIG1hY1ttYWNwb3MrIDBdID0gKHRoaXMuaFswXSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyAxXSA9ICh0aGlzLmhbMF0gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysgMl0gPSAodGhpcy5oWzFdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDNdID0gKHRoaXMuaFsxXSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyA0XSA9ICh0aGlzLmhbMl0gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysgNV0gPSAodGhpcy5oWzJdID4+PiA4KSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDZdID0gKHRoaXMuaFszXSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKyA3XSA9ICh0aGlzLmhbM10gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysgOF0gPSAodGhpcy5oWzRdID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrIDldID0gKHRoaXMuaFs0XSA+Pj4gOCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKzEwXSA9ICh0aGlzLmhbNV0gPj4+IDApICYgMHhmZjtcbiAgbWFjW21hY3BvcysxMV0gPSAodGhpcy5oWzVdID4+PiA4KSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrMTJdID0gKHRoaXMuaFs2XSA+Pj4gMCkgJiAweGZmO1xuICBtYWNbbWFjcG9zKzEzXSA9ICh0aGlzLmhbNl0gPj4+IDgpICYgMHhmZjtcbiAgbWFjW21hY3BvcysxNF0gPSAodGhpcy5oWzddID4+PiAwKSAmIDB4ZmY7XG4gIG1hY1ttYWNwb3MrMTVdID0gKHRoaXMuaFs3XSA+Pj4gOCkgJiAweGZmO1xufTtcblxucG9seTEzMDUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG0sIG1wb3MsIGJ5dGVzKSB7XG4gIHZhciBpLCB3YW50O1xuXG4gIGlmICh0aGlzLmxlZnRvdmVyKSB7XG4gICAgd2FudCA9ICgxNiAtIHRoaXMubGVmdG92ZXIpO1xuICAgIGlmICh3YW50ID4gYnl0ZXMpXG4gICAgICB3YW50ID0gYnl0ZXM7XG4gICAgZm9yIChpID0gMDsgaSA8IHdhbnQ7IGkrKylcbiAgICAgIHRoaXMuYnVmZmVyW3RoaXMubGVmdG92ZXIgKyBpXSA9IG1bbXBvcytpXTtcbiAgICBieXRlcyAtPSB3YW50O1xuICAgIG1wb3MgKz0gd2FudDtcbiAgICB0aGlzLmxlZnRvdmVyICs9IHdhbnQ7XG4gICAgaWYgKHRoaXMubGVmdG92ZXIgPCAxNilcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmJsb2Nrcyh0aGlzLmJ1ZmZlciwgMCwgMTYpO1xuICAgIHRoaXMubGVmdG92ZXIgPSAwO1xuICB9XG5cbiAgaWYgKGJ5dGVzID49IDE2KSB7XG4gICAgd2FudCA9IGJ5dGVzIC0gKGJ5dGVzICUgMTYpO1xuICAgIHRoaXMuYmxvY2tzKG0sIG1wb3MsIHdhbnQpO1xuICAgIG1wb3MgKz0gd2FudDtcbiAgICBieXRlcyAtPSB3YW50O1xuICB9XG5cbiAgaWYgKGJ5dGVzKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspXG4gICAgICB0aGlzLmJ1ZmZlclt0aGlzLmxlZnRvdmVyICsgaV0gPSBtW21wb3MraV07XG4gICAgdGhpcy5sZWZ0b3ZlciArPSBieXRlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gY3J5cHRvX29uZXRpbWVhdXRoKG91dCwgb3V0cG9zLCBtLCBtcG9zLCBuLCBrKSB7XG4gIHZhciBzID0gbmV3IHBvbHkxMzA1KGspO1xuICBzLnVwZGF0ZShtLCBtcG9zLCBuKTtcbiAgcy5maW5pc2gob3V0LCBvdXRwb3MpO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX29uZXRpbWVhdXRoX3ZlcmlmeShoLCBocG9zLCBtLCBtcG9zLCBuLCBrKSB7XG4gIHZhciB4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICBjcnlwdG9fb25ldGltZWF1dGgoeCwwLG0sbXBvcyxuLGspO1xuICByZXR1cm4gY3J5cHRvX3ZlcmlmeV8xNihoLGhwb3MseCwwKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NlY3JldGJveChjLG0sZCxuLGspIHtcbiAgdmFyIGk7XG4gIGlmIChkIDwgMzIpIHJldHVybiAtMTtcbiAgY3J5cHRvX3N0cmVhbV94b3IoYywwLG0sMCxkLG4sayk7XG4gIGNyeXB0b19vbmV0aW1lYXV0aChjLCAxNiwgYywgMzIsIGQgLSAzMiwgYyk7XG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSBjW2ldID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zZWNyZXRib3hfb3BlbihtLGMsZCxuLGspIHtcbiAgdmFyIGk7XG4gIHZhciB4ID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBpZiAoZCA8IDMyKSByZXR1cm4gLTE7XG4gIGNyeXB0b19zdHJlYW0oeCwwLDMyLG4sayk7XG4gIGlmIChjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5KGMsIDE2LGMsIDMyLGQgLSAzMix4KSAhPT0gMCkgcmV0dXJuIC0xO1xuICBjcnlwdG9fc3RyZWFtX3hvcihtLDAsYywwLGQsbixrKTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIG1baV0gPSAwO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gc2V0MjU1MTkociwgYSkge1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHJbaV0gPSBhW2ldfDA7XG59XG5cbmZ1bmN0aW9uIGNhcjI1NTE5KG8pIHtcbiAgdmFyIGksIHYsIGMgPSAxO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHYgPSBvW2ldICsgYyArIDY1NTM1O1xuICAgIGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7XG4gICAgb1tpXSA9IHYgLSBjICogNjU1MzY7XG4gIH1cbiAgb1swXSArPSBjLTEgKyAzNyAqIChjLTEpO1xufVxuXG5mdW5jdGlvbiBzZWwyNTUxOShwLCBxLCBiKSB7XG4gIHZhciB0LCBjID0gfihiLTEpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICB0ID0gYyAmIChwW2ldIF4gcVtpXSk7XG4gICAgcFtpXSBePSB0O1xuICAgIHFbaV0gXj0gdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYWNrMjU1MTkobywgbikge1xuICB2YXIgaSwgaiwgYjtcbiAgdmFyIG0gPSBnZigpLCB0ID0gZ2YoKTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHRbaV0gPSBuW2ldO1xuICBjYXIyNTUxOSh0KTtcbiAgY2FyMjU1MTkodCk7XG4gIGNhcjI1NTE5KHQpO1xuICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7XG4gICAgbVswXSA9IHRbMF0gLSAweGZmZWQ7XG4gICAgZm9yIChpID0gMTsgaSA8IDE1OyBpKyspIHtcbiAgICAgIG1baV0gPSB0W2ldIC0gMHhmZmZmIC0gKChtW2ktMV0+PjE2KSAmIDEpO1xuICAgICAgbVtpLTFdICY9IDB4ZmZmZjtcbiAgICB9XG4gICAgbVsxNV0gPSB0WzE1XSAtIDB4N2ZmZiAtICgobVsxNF0+PjE2KSAmIDEpO1xuICAgIGIgPSAobVsxNV0+PjE2KSAmIDE7XG4gICAgbVsxNF0gJj0gMHhmZmZmO1xuICAgIHNlbDI1NTE5KHQsIG0sIDEtYik7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICBvWzIqaV0gPSB0W2ldICYgMHhmZjtcbiAgICBvWzIqaSsxXSA9IHRbaV0+Pjg7XG4gIH1cbn1cblxuZnVuY3Rpb24gbmVxMjU1MTkoYSwgYikge1xuICB2YXIgYyA9IG5ldyBVaW50OEFycmF5KDMyKSwgZCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgcGFjazI1NTE5KGMsIGEpO1xuICBwYWNrMjU1MTkoZCwgYik7XG4gIHJldHVybiBjcnlwdG9fdmVyaWZ5XzMyKGMsIDAsIGQsIDApO1xufVxuXG5mdW5jdGlvbiBwYXIyNTUxOShhKSB7XG4gIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBwYWNrMjU1MTkoZCwgYSk7XG4gIHJldHVybiBkWzBdICYgMTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrMjU1MTkobywgbikge1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIG9baV0gPSBuWzIqaV0gKyAoblsyKmkrMV0gPDwgOCk7XG4gIG9bMTVdICY9IDB4N2ZmZjtcbn1cblxuZnVuY3Rpb24gQShvLCBhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgb1tpXSA9IGFbaV0gKyBiW2ldO1xufVxuXG5mdW5jdGlvbiBaKG8sIGEsIGIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSBvW2ldID0gYVtpXSAtIGJbaV07XG59XG5cbmZ1bmN0aW9uIE0obywgYSwgYikge1xuICB2YXIgdiwgYyxcbiAgICAgdDAgPSAwLCAgdDEgPSAwLCAgdDIgPSAwLCAgdDMgPSAwLCAgdDQgPSAwLCAgdDUgPSAwLCAgdDYgPSAwLCAgdDcgPSAwLFxuICAgICB0OCA9IDAsICB0OSA9IDAsIHQxMCA9IDAsIHQxMSA9IDAsIHQxMiA9IDAsIHQxMyA9IDAsIHQxNCA9IDAsIHQxNSA9IDAsXG4gICAgdDE2ID0gMCwgdDE3ID0gMCwgdDE4ID0gMCwgdDE5ID0gMCwgdDIwID0gMCwgdDIxID0gMCwgdDIyID0gMCwgdDIzID0gMCxcbiAgICB0MjQgPSAwLCB0MjUgPSAwLCB0MjYgPSAwLCB0MjcgPSAwLCB0MjggPSAwLCB0MjkgPSAwLCB0MzAgPSAwLFxuICAgIGIwID0gYlswXSxcbiAgICBiMSA9IGJbMV0sXG4gICAgYjIgPSBiWzJdLFxuICAgIGIzID0gYlszXSxcbiAgICBiNCA9IGJbNF0sXG4gICAgYjUgPSBiWzVdLFxuICAgIGI2ID0gYls2XSxcbiAgICBiNyA9IGJbN10sXG4gICAgYjggPSBiWzhdLFxuICAgIGI5ID0gYls5XSxcbiAgICBiMTAgPSBiWzEwXSxcbiAgICBiMTEgPSBiWzExXSxcbiAgICBiMTIgPSBiWzEyXSxcbiAgICBiMTMgPSBiWzEzXSxcbiAgICBiMTQgPSBiWzE0XSxcbiAgICBiMTUgPSBiWzE1XTtcblxuICB2ID0gYVswXTtcbiAgdDAgKz0gdiAqIGIwO1xuICB0MSArPSB2ICogYjE7XG4gIHQyICs9IHYgKiBiMjtcbiAgdDMgKz0gdiAqIGIzO1xuICB0NCArPSB2ICogYjQ7XG4gIHQ1ICs9IHYgKiBiNTtcbiAgdDYgKz0gdiAqIGI2O1xuICB0NyArPSB2ICogYjc7XG4gIHQ4ICs9IHYgKiBiODtcbiAgdDkgKz0gdiAqIGI5O1xuICB0MTAgKz0gdiAqIGIxMDtcbiAgdDExICs9IHYgKiBiMTE7XG4gIHQxMiArPSB2ICogYjEyO1xuICB0MTMgKz0gdiAqIGIxMztcbiAgdDE0ICs9IHYgKiBiMTQ7XG4gIHQxNSArPSB2ICogYjE1O1xuICB2ID0gYVsxXTtcbiAgdDEgKz0gdiAqIGIwO1xuICB0MiArPSB2ICogYjE7XG4gIHQzICs9IHYgKiBiMjtcbiAgdDQgKz0gdiAqIGIzO1xuICB0NSArPSB2ICogYjQ7XG4gIHQ2ICs9IHYgKiBiNTtcbiAgdDcgKz0gdiAqIGI2O1xuICB0OCArPSB2ICogYjc7XG4gIHQ5ICs9IHYgKiBiODtcbiAgdDEwICs9IHYgKiBiOTtcbiAgdDExICs9IHYgKiBiMTA7XG4gIHQxMiArPSB2ICogYjExO1xuICB0MTMgKz0gdiAqIGIxMjtcbiAgdDE0ICs9IHYgKiBiMTM7XG4gIHQxNSArPSB2ICogYjE0O1xuICB0MTYgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMl07XG4gIHQyICs9IHYgKiBiMDtcbiAgdDMgKz0gdiAqIGIxO1xuICB0NCArPSB2ICogYjI7XG4gIHQ1ICs9IHYgKiBiMztcbiAgdDYgKz0gdiAqIGI0O1xuICB0NyArPSB2ICogYjU7XG4gIHQ4ICs9IHYgKiBiNjtcbiAgdDkgKz0gdiAqIGI3O1xuICB0MTAgKz0gdiAqIGI4O1xuICB0MTEgKz0gdiAqIGI5O1xuICB0MTIgKz0gdiAqIGIxMDtcbiAgdDEzICs9IHYgKiBiMTE7XG4gIHQxNCArPSB2ICogYjEyO1xuICB0MTUgKz0gdiAqIGIxMztcbiAgdDE2ICs9IHYgKiBiMTQ7XG4gIHQxNyArPSB2ICogYjE1O1xuICB2ID0gYVszXTtcbiAgdDMgKz0gdiAqIGIwO1xuICB0NCArPSB2ICogYjE7XG4gIHQ1ICs9IHYgKiBiMjtcbiAgdDYgKz0gdiAqIGIzO1xuICB0NyArPSB2ICogYjQ7XG4gIHQ4ICs9IHYgKiBiNTtcbiAgdDkgKz0gdiAqIGI2O1xuICB0MTAgKz0gdiAqIGI3O1xuICB0MTEgKz0gdiAqIGI4O1xuICB0MTIgKz0gdiAqIGI5O1xuICB0MTMgKz0gdiAqIGIxMDtcbiAgdDE0ICs9IHYgKiBiMTE7XG4gIHQxNSArPSB2ICogYjEyO1xuICB0MTYgKz0gdiAqIGIxMztcbiAgdDE3ICs9IHYgKiBiMTQ7XG4gIHQxOCArPSB2ICogYjE1O1xuICB2ID0gYVs0XTtcbiAgdDQgKz0gdiAqIGIwO1xuICB0NSArPSB2ICogYjE7XG4gIHQ2ICs9IHYgKiBiMjtcbiAgdDcgKz0gdiAqIGIzO1xuICB0OCArPSB2ICogYjQ7XG4gIHQ5ICs9IHYgKiBiNTtcbiAgdDEwICs9IHYgKiBiNjtcbiAgdDExICs9IHYgKiBiNztcbiAgdDEyICs9IHYgKiBiODtcbiAgdDEzICs9IHYgKiBiOTtcbiAgdDE0ICs9IHYgKiBiMTA7XG4gIHQxNSArPSB2ICogYjExO1xuICB0MTYgKz0gdiAqIGIxMjtcbiAgdDE3ICs9IHYgKiBiMTM7XG4gIHQxOCArPSB2ICogYjE0O1xuICB0MTkgKz0gdiAqIGIxNTtcbiAgdiA9IGFbNV07XG4gIHQ1ICs9IHYgKiBiMDtcbiAgdDYgKz0gdiAqIGIxO1xuICB0NyArPSB2ICogYjI7XG4gIHQ4ICs9IHYgKiBiMztcbiAgdDkgKz0gdiAqIGI0O1xuICB0MTAgKz0gdiAqIGI1O1xuICB0MTEgKz0gdiAqIGI2O1xuICB0MTIgKz0gdiAqIGI3O1xuICB0MTMgKz0gdiAqIGI4O1xuICB0MTQgKz0gdiAqIGI5O1xuICB0MTUgKz0gdiAqIGIxMDtcbiAgdDE2ICs9IHYgKiBiMTE7XG4gIHQxNyArPSB2ICogYjEyO1xuICB0MTggKz0gdiAqIGIxMztcbiAgdDE5ICs9IHYgKiBiMTQ7XG4gIHQyMCArPSB2ICogYjE1O1xuICB2ID0gYVs2XTtcbiAgdDYgKz0gdiAqIGIwO1xuICB0NyArPSB2ICogYjE7XG4gIHQ4ICs9IHYgKiBiMjtcbiAgdDkgKz0gdiAqIGIzO1xuICB0MTAgKz0gdiAqIGI0O1xuICB0MTEgKz0gdiAqIGI1O1xuICB0MTIgKz0gdiAqIGI2O1xuICB0MTMgKz0gdiAqIGI3O1xuICB0MTQgKz0gdiAqIGI4O1xuICB0MTUgKz0gdiAqIGI5O1xuICB0MTYgKz0gdiAqIGIxMDtcbiAgdDE3ICs9IHYgKiBiMTE7XG4gIHQxOCArPSB2ICogYjEyO1xuICB0MTkgKz0gdiAqIGIxMztcbiAgdDIwICs9IHYgKiBiMTQ7XG4gIHQyMSArPSB2ICogYjE1O1xuICB2ID0gYVs3XTtcbiAgdDcgKz0gdiAqIGIwO1xuICB0OCArPSB2ICogYjE7XG4gIHQ5ICs9IHYgKiBiMjtcbiAgdDEwICs9IHYgKiBiMztcbiAgdDExICs9IHYgKiBiNDtcbiAgdDEyICs9IHYgKiBiNTtcbiAgdDEzICs9IHYgKiBiNjtcbiAgdDE0ICs9IHYgKiBiNztcbiAgdDE1ICs9IHYgKiBiODtcbiAgdDE2ICs9IHYgKiBiOTtcbiAgdDE3ICs9IHYgKiBiMTA7XG4gIHQxOCArPSB2ICogYjExO1xuICB0MTkgKz0gdiAqIGIxMjtcbiAgdDIwICs9IHYgKiBiMTM7XG4gIHQyMSArPSB2ICogYjE0O1xuICB0MjIgKz0gdiAqIGIxNTtcbiAgdiA9IGFbOF07XG4gIHQ4ICs9IHYgKiBiMDtcbiAgdDkgKz0gdiAqIGIxO1xuICB0MTAgKz0gdiAqIGIyO1xuICB0MTEgKz0gdiAqIGIzO1xuICB0MTIgKz0gdiAqIGI0O1xuICB0MTMgKz0gdiAqIGI1O1xuICB0MTQgKz0gdiAqIGI2O1xuICB0MTUgKz0gdiAqIGI3O1xuICB0MTYgKz0gdiAqIGI4O1xuICB0MTcgKz0gdiAqIGI5O1xuICB0MTggKz0gdiAqIGIxMDtcbiAgdDE5ICs9IHYgKiBiMTE7XG4gIHQyMCArPSB2ICogYjEyO1xuICB0MjEgKz0gdiAqIGIxMztcbiAgdDIyICs9IHYgKiBiMTQ7XG4gIHQyMyArPSB2ICogYjE1O1xuICB2ID0gYVs5XTtcbiAgdDkgKz0gdiAqIGIwO1xuICB0MTAgKz0gdiAqIGIxO1xuICB0MTEgKz0gdiAqIGIyO1xuICB0MTIgKz0gdiAqIGIzO1xuICB0MTMgKz0gdiAqIGI0O1xuICB0MTQgKz0gdiAqIGI1O1xuICB0MTUgKz0gdiAqIGI2O1xuICB0MTYgKz0gdiAqIGI3O1xuICB0MTcgKz0gdiAqIGI4O1xuICB0MTggKz0gdiAqIGI5O1xuICB0MTkgKz0gdiAqIGIxMDtcbiAgdDIwICs9IHYgKiBiMTE7XG4gIHQyMSArPSB2ICogYjEyO1xuICB0MjIgKz0gdiAqIGIxMztcbiAgdDIzICs9IHYgKiBiMTQ7XG4gIHQyNCArPSB2ICogYjE1O1xuICB2ID0gYVsxMF07XG4gIHQxMCArPSB2ICogYjA7XG4gIHQxMSArPSB2ICogYjE7XG4gIHQxMiArPSB2ICogYjI7XG4gIHQxMyArPSB2ICogYjM7XG4gIHQxNCArPSB2ICogYjQ7XG4gIHQxNSArPSB2ICogYjU7XG4gIHQxNiArPSB2ICogYjY7XG4gIHQxNyArPSB2ICogYjc7XG4gIHQxOCArPSB2ICogYjg7XG4gIHQxOSArPSB2ICogYjk7XG4gIHQyMCArPSB2ICogYjEwO1xuICB0MjEgKz0gdiAqIGIxMTtcbiAgdDIyICs9IHYgKiBiMTI7XG4gIHQyMyArPSB2ICogYjEzO1xuICB0MjQgKz0gdiAqIGIxNDtcbiAgdDI1ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzExXTtcbiAgdDExICs9IHYgKiBiMDtcbiAgdDEyICs9IHYgKiBiMTtcbiAgdDEzICs9IHYgKiBiMjtcbiAgdDE0ICs9IHYgKiBiMztcbiAgdDE1ICs9IHYgKiBiNDtcbiAgdDE2ICs9IHYgKiBiNTtcbiAgdDE3ICs9IHYgKiBiNjtcbiAgdDE4ICs9IHYgKiBiNztcbiAgdDE5ICs9IHYgKiBiODtcbiAgdDIwICs9IHYgKiBiOTtcbiAgdDIxICs9IHYgKiBiMTA7XG4gIHQyMiArPSB2ICogYjExO1xuICB0MjMgKz0gdiAqIGIxMjtcbiAgdDI0ICs9IHYgKiBiMTM7XG4gIHQyNSArPSB2ICogYjE0O1xuICB0MjYgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTJdO1xuICB0MTIgKz0gdiAqIGIwO1xuICB0MTMgKz0gdiAqIGIxO1xuICB0MTQgKz0gdiAqIGIyO1xuICB0MTUgKz0gdiAqIGIzO1xuICB0MTYgKz0gdiAqIGI0O1xuICB0MTcgKz0gdiAqIGI1O1xuICB0MTggKz0gdiAqIGI2O1xuICB0MTkgKz0gdiAqIGI3O1xuICB0MjAgKz0gdiAqIGI4O1xuICB0MjEgKz0gdiAqIGI5O1xuICB0MjIgKz0gdiAqIGIxMDtcbiAgdDIzICs9IHYgKiBiMTE7XG4gIHQyNCArPSB2ICogYjEyO1xuICB0MjUgKz0gdiAqIGIxMztcbiAgdDI2ICs9IHYgKiBiMTQ7XG4gIHQyNyArPSB2ICogYjE1O1xuICB2ID0gYVsxM107XG4gIHQxMyArPSB2ICogYjA7XG4gIHQxNCArPSB2ICogYjE7XG4gIHQxNSArPSB2ICogYjI7XG4gIHQxNiArPSB2ICogYjM7XG4gIHQxNyArPSB2ICogYjQ7XG4gIHQxOCArPSB2ICogYjU7XG4gIHQxOSArPSB2ICogYjY7XG4gIHQyMCArPSB2ICogYjc7XG4gIHQyMSArPSB2ICogYjg7XG4gIHQyMiArPSB2ICogYjk7XG4gIHQyMyArPSB2ICogYjEwO1xuICB0MjQgKz0gdiAqIGIxMTtcbiAgdDI1ICs9IHYgKiBiMTI7XG4gIHQyNiArPSB2ICogYjEzO1xuICB0MjcgKz0gdiAqIGIxNDtcbiAgdDI4ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzE0XTtcbiAgdDE0ICs9IHYgKiBiMDtcbiAgdDE1ICs9IHYgKiBiMTtcbiAgdDE2ICs9IHYgKiBiMjtcbiAgdDE3ICs9IHYgKiBiMztcbiAgdDE4ICs9IHYgKiBiNDtcbiAgdDE5ICs9IHYgKiBiNTtcbiAgdDIwICs9IHYgKiBiNjtcbiAgdDIxICs9IHYgKiBiNztcbiAgdDIyICs9IHYgKiBiODtcbiAgdDIzICs9IHYgKiBiOTtcbiAgdDI0ICs9IHYgKiBiMTA7XG4gIHQyNSArPSB2ICogYjExO1xuICB0MjYgKz0gdiAqIGIxMjtcbiAgdDI3ICs9IHYgKiBiMTM7XG4gIHQyOCArPSB2ICogYjE0O1xuICB0MjkgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTVdO1xuICB0MTUgKz0gdiAqIGIwO1xuICB0MTYgKz0gdiAqIGIxO1xuICB0MTcgKz0gdiAqIGIyO1xuICB0MTggKz0gdiAqIGIzO1xuICB0MTkgKz0gdiAqIGI0O1xuICB0MjAgKz0gdiAqIGI1O1xuICB0MjEgKz0gdiAqIGI2O1xuICB0MjIgKz0gdiAqIGI3O1xuICB0MjMgKz0gdiAqIGI4O1xuICB0MjQgKz0gdiAqIGI5O1xuICB0MjUgKz0gdiAqIGIxMDtcbiAgdDI2ICs9IHYgKiBiMTE7XG4gIHQyNyArPSB2ICogYjEyO1xuICB0MjggKz0gdiAqIGIxMztcbiAgdDI5ICs9IHYgKiBiMTQ7XG4gIHQzMCArPSB2ICogYjE1O1xuXG4gIHQwICArPSAzOCAqIHQxNjtcbiAgdDEgICs9IDM4ICogdDE3O1xuICB0MiAgKz0gMzggKiB0MTg7XG4gIHQzICArPSAzOCAqIHQxOTtcbiAgdDQgICs9IDM4ICogdDIwO1xuICB0NSAgKz0gMzggKiB0MjE7XG4gIHQ2ICArPSAzOCAqIHQyMjtcbiAgdDcgICs9IDM4ICogdDIzO1xuICB0OCAgKz0gMzggKiB0MjQ7XG4gIHQ5ICArPSAzOCAqIHQyNTtcbiAgdDEwICs9IDM4ICogdDI2O1xuICB0MTEgKz0gMzggKiB0Mjc7XG4gIHQxMiArPSAzOCAqIHQyODtcbiAgdDEzICs9IDM4ICogdDI5O1xuICB0MTQgKz0gMzggKiB0MzA7XG4gIC8vIHQxNSBsZWZ0IGFzIGlzXG5cbiAgLy8gZmlyc3QgY2FyXG4gIGMgPSAxO1xuICB2ID0gIHQwICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDAgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQxICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDEgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQyICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDIgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQzICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDMgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ0ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDQgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ1ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDUgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ2ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDYgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ3ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDcgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ4ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDggPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ5ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDkgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEwICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTAgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDExICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTEgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEyICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTIgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEzICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTMgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDE0ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTQgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDE1ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTUgPSB2IC0gYyAqIDY1NTM2O1xuICB0MCArPSBjLTEgKyAzNyAqIChjLTEpO1xuXG4gIC8vIHNlY29uZCBjYXJcbiAgYyA9IDE7XG4gIHYgPSAgdDAgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDEgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDIgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDMgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0MyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDQgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDUgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDYgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDcgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0NyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDggKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0OCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSAgdDkgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7ICB0OSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTAgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTEgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMSA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTIgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMiA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTMgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxMyA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTQgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxNCA9IHYgLSBjICogNjU1MzY7XG4gIHYgPSB0MTUgKyBjICsgNjU1MzU7IGMgPSBNYXRoLmZsb29yKHYgLyA2NTUzNik7IHQxNSA9IHYgLSBjICogNjU1MzY7XG4gIHQwICs9IGMtMSArIDM3ICogKGMtMSk7XG5cbiAgb1sgMF0gPSB0MDtcbiAgb1sgMV0gPSB0MTtcbiAgb1sgMl0gPSB0MjtcbiAgb1sgM10gPSB0MztcbiAgb1sgNF0gPSB0NDtcbiAgb1sgNV0gPSB0NTtcbiAgb1sgNl0gPSB0NjtcbiAgb1sgN10gPSB0NztcbiAgb1sgOF0gPSB0ODtcbiAgb1sgOV0gPSB0OTtcbiAgb1sxMF0gPSB0MTA7XG4gIG9bMTFdID0gdDExO1xuICBvWzEyXSA9IHQxMjtcbiAgb1sxM10gPSB0MTM7XG4gIG9bMTRdID0gdDE0O1xuICBvWzE1XSA9IHQxNTtcbn1cblxuZnVuY3Rpb24gUyhvLCBhKSB7XG4gIE0obywgYSwgYSk7XG59XG5cbmZ1bmN0aW9uIGludjI1NTE5KG8sIGkpIHtcbiAgdmFyIGMgPSBnZigpO1xuICB2YXIgYTtcbiAgZm9yIChhID0gMDsgYSA8IDE2OyBhKyspIGNbYV0gPSBpW2FdO1xuICBmb3IgKGEgPSAyNTM7IGEgPj0gMDsgYS0tKSB7XG4gICAgUyhjLCBjKTtcbiAgICBpZihhICE9PSAyICYmIGEgIT09IDQpIE0oYywgYywgaSk7XG4gIH1cbiAgZm9yIChhID0gMDsgYSA8IDE2OyBhKyspIG9bYV0gPSBjW2FdO1xufVxuXG5mdW5jdGlvbiBwb3cyNTIzKG8sIGkpIHtcbiAgdmFyIGMgPSBnZigpO1xuICB2YXIgYTtcbiAgZm9yIChhID0gMDsgYSA8IDE2OyBhKyspIGNbYV0gPSBpW2FdO1xuICBmb3IgKGEgPSAyNTA7IGEgPj0gMDsgYS0tKSB7XG4gICAgICBTKGMsIGMpO1xuICAgICAgaWYoYSAhPT0gMSkgTShjLCBjLCBpKTtcbiAgfVxuICBmb3IgKGEgPSAwOyBhIDwgMTY7IGErKykgb1thXSA9IGNbYV07XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zY2FsYXJtdWx0KHEsIG4sIHApIHtcbiAgdmFyIHogPSBuZXcgVWludDhBcnJheSgzMik7XG4gIHZhciB4ID0gbmV3IEZsb2F0NjRBcnJheSg4MCksIHIsIGk7XG4gIHZhciBhID0gZ2YoKSwgYiA9IGdmKCksIGMgPSBnZigpLFxuICAgICAgZCA9IGdmKCksIGUgPSBnZigpLCBmID0gZ2YoKTtcbiAgZm9yIChpID0gMDsgaSA8IDMxOyBpKyspIHpbaV0gPSBuW2ldO1xuICB6WzMxXT0oblszMV0mMTI3KXw2NDtcbiAgelswXSY9MjQ4O1xuICB1bnBhY2syNTUxOSh4LHApO1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIGJbaV09eFtpXTtcbiAgICBkW2ldPWFbaV09Y1tpXT0wO1xuICB9XG4gIGFbMF09ZFswXT0xO1xuICBmb3IgKGk9MjU0OyBpPj0wOyAtLWkpIHtcbiAgICByPSh6W2k+Pj4zXT4+PihpJjcpKSYxO1xuICAgIHNlbDI1NTE5KGEsYixyKTtcbiAgICBzZWwyNTUxOShjLGQscik7XG4gICAgQShlLGEsYyk7XG4gICAgWihhLGEsYyk7XG4gICAgQShjLGIsZCk7XG4gICAgWihiLGIsZCk7XG4gICAgUyhkLGUpO1xuICAgIFMoZixhKTtcbiAgICBNKGEsYyxhKTtcbiAgICBNKGMsYixlKTtcbiAgICBBKGUsYSxjKTtcbiAgICBaKGEsYSxjKTtcbiAgICBTKGIsYSk7XG4gICAgWihjLGQsZik7XG4gICAgTShhLGMsXzEyMTY2NSk7XG4gICAgQShhLGEsZCk7XG4gICAgTShjLGMsYSk7XG4gICAgTShhLGQsZik7XG4gICAgTShkLGIseCk7XG4gICAgUyhiLGUpO1xuICAgIHNlbDI1NTE5KGEsYixyKTtcbiAgICBzZWwyNTUxOShjLGQscik7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICB4W2krMTZdPWFbaV07XG4gICAgeFtpKzMyXT1jW2ldO1xuICAgIHhbaSs0OF09YltpXTtcbiAgICB4W2krNjRdPWRbaV07XG4gIH1cbiAgdmFyIHgzMiA9IHguc3ViYXJyYXkoMzIpO1xuICB2YXIgeDE2ID0geC5zdWJhcnJheSgxNik7XG4gIGludjI1NTE5KHgzMix4MzIpO1xuICBNKHgxNix4MTYseDMyKTtcbiAgcGFjazI1NTE5KHEseDE2KTtcbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zY2FsYXJtdWx0X2Jhc2UocSwgbikge1xuICByZXR1cm4gY3J5cHRvX3NjYWxhcm11bHQocSwgbiwgXzkpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fYm94X2tleXBhaXIoeSwgeCkge1xuICByYW5kb21ieXRlcyh4LCAzMik7XG4gIHJldHVybiBjcnlwdG9fc2NhbGFybXVsdF9iYXNlKHksIHgpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fYm94X2JlZm9yZW5tKGssIHksIHgpIHtcbiAgdmFyIHMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19zY2FsYXJtdWx0KHMsIHgsIHkpO1xuICByZXR1cm4gY3J5cHRvX2NvcmVfaHNhbHNhMjAoaywgXzAsIHMsIHNpZ21hKTtcbn1cblxudmFyIGNyeXB0b19ib3hfYWZ0ZXJubSA9IGNyeXB0b19zZWNyZXRib3g7XG52YXIgY3J5cHRvX2JveF9vcGVuX2FmdGVybm0gPSBjcnlwdG9fc2VjcmV0Ym94X29wZW47XG5cbmZ1bmN0aW9uIGNyeXB0b19ib3goYywgbSwgZCwgbiwgeSwgeCkge1xuICB2YXIgayA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgY3J5cHRvX2JveF9iZWZvcmVubShrLCB5LCB4KTtcbiAgcmV0dXJuIGNyeXB0b19ib3hfYWZ0ZXJubShjLCBtLCBkLCBuLCBrKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX2JveF9vcGVuKG0sIGMsIGQsIG4sIHksIHgpIHtcbiAgdmFyIGsgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGNyeXB0b19ib3hfYmVmb3Jlbm0oaywgeSwgeCk7XG4gIHJldHVybiBjcnlwdG9fYm94X29wZW5fYWZ0ZXJubShtLCBjLCBkLCBuLCBrKTtcbn1cblxudmFyIEsgPSBbXG4gIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsXG4gIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMsXG4gIDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsIDB4YjYwNWQwMTksXG4gIDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgsXG4gIDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsXG4gIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsXG4gIDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEsXG4gIDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQsXG4gIDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMsXG4gIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsXG4gIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMsXG4gIDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUsXG4gIDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsIDB4MmRiNDMyMTAsXG4gIDB4YjAwMzI3YzgsIDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsXG4gIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsXG4gIDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsIDB4MGEwZTZlNzAsXG4gIDB4MjdiNzBhODUsIDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYsXG4gIDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYsXG4gIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsXG4gIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IsXG4gIDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEsXG4gIDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzAsXG4gIDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsXG4gIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsXG4gIDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMsXG4gIDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgsXG4gIDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IsXG4gIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsXG4gIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsIDB4NDMxNzJmNjAsXG4gIDB4ODRjODc4MTQsIDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMsXG4gIDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTksXG4gIDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsXG4gIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsXG4gIDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgsXG4gIDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsIDB4YTJjODk4YTYsXG4gIDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIsXG4gIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsXG4gIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMsXG4gIDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEsXG4gIDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsIDB4NGE0NzU4MTdcbl07XG5cbmZ1bmN0aW9uIGNyeXB0b19oYXNoYmxvY2tzX2hsKGhoLCBobCwgbSwgbikge1xuICB2YXIgd2ggPSBuZXcgSW50MzJBcnJheSgxNiksIHdsID0gbmV3IEludDMyQXJyYXkoMTYpLFxuICAgICAgYmgwLCBiaDEsIGJoMiwgYmgzLCBiaDQsIGJoNSwgYmg2LCBiaDcsXG4gICAgICBibDAsIGJsMSwgYmwyLCBibDMsIGJsNCwgYmw1LCBibDYsIGJsNyxcbiAgICAgIHRoLCB0bCwgaSwgaiwgaCwgbCwgYSwgYiwgYywgZDtcblxuICB2YXIgYWgwID0gaGhbMF0sXG4gICAgICBhaDEgPSBoaFsxXSxcbiAgICAgIGFoMiA9IGhoWzJdLFxuICAgICAgYWgzID0gaGhbM10sXG4gICAgICBhaDQgPSBoaFs0XSxcbiAgICAgIGFoNSA9IGhoWzVdLFxuICAgICAgYWg2ID0gaGhbNl0sXG4gICAgICBhaDcgPSBoaFs3XSxcblxuICAgICAgYWwwID0gaGxbMF0sXG4gICAgICBhbDEgPSBobFsxXSxcbiAgICAgIGFsMiA9IGhsWzJdLFxuICAgICAgYWwzID0gaGxbM10sXG4gICAgICBhbDQgPSBobFs0XSxcbiAgICAgIGFsNSA9IGhsWzVdLFxuICAgICAgYWw2ID0gaGxbNl0sXG4gICAgICBhbDcgPSBobFs3XTtcblxuICB2YXIgcG9zID0gMDtcbiAgd2hpbGUgKG4gPj0gMTI4KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGogPSA4ICogaSArIHBvcztcbiAgICAgIHdoW2ldID0gKG1baiswXSA8PCAyNCkgfCAobVtqKzFdIDw8IDE2KSB8IChtW2orMl0gPDwgOCkgfCBtW2orM107XG4gICAgICB3bFtpXSA9IChtW2orNF0gPDwgMjQpIHwgKG1bais1XSA8PCAxNikgfCAobVtqKzZdIDw8IDgpIHwgbVtqKzddO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykge1xuICAgICAgYmgwID0gYWgwO1xuICAgICAgYmgxID0gYWgxO1xuICAgICAgYmgyID0gYWgyO1xuICAgICAgYmgzID0gYWgzO1xuICAgICAgYmg0ID0gYWg0O1xuICAgICAgYmg1ID0gYWg1O1xuICAgICAgYmg2ID0gYWg2O1xuICAgICAgYmg3ID0gYWg3O1xuXG4gICAgICBibDAgPSBhbDA7XG4gICAgICBibDEgPSBhbDE7XG4gICAgICBibDIgPSBhbDI7XG4gICAgICBibDMgPSBhbDM7XG4gICAgICBibDQgPSBhbDQ7XG4gICAgICBibDUgPSBhbDU7XG4gICAgICBibDYgPSBhbDY7XG4gICAgICBibDcgPSBhbDc7XG5cbiAgICAgIC8vIGFkZFxuICAgICAgaCA9IGFoNztcbiAgICAgIGwgPSBhbDc7XG5cbiAgICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgICBjID0gaCAmIDB4ZmZmZjsgZCA9IGggPj4+IDE2O1xuXG4gICAgICAvLyBTaWdtYTFcbiAgICAgIGggPSAoKGFoNCA+Pj4gMTQpIHwgKGFsNCA8PCAoMzItMTQpKSkgXiAoKGFoNCA+Pj4gMTgpIHwgKGFsNCA8PCAoMzItMTgpKSkgXiAoKGFsNCA+Pj4gKDQxLTMyKSkgfCAoYWg0IDw8ICgzMi0oNDEtMzIpKSkpO1xuICAgICAgbCA9ICgoYWw0ID4+PiAxNCkgfCAoYWg0IDw8ICgzMi0xNCkpKSBeICgoYWw0ID4+PiAxOCkgfCAoYWg0IDw8ICgzMi0xOCkpKSBeICgoYWg0ID4+PiAoNDEtMzIpKSB8IChhbDQgPDwgKDMyLSg0MS0zMikpKSk7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgLy8gQ2hcbiAgICAgIGggPSAoYWg0ICYgYWg1KSBeICh+YWg0ICYgYWg2KTtcbiAgICAgIGwgPSAoYWw0ICYgYWw1KSBeICh+YWw0ICYgYWw2KTtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICAvLyBLXG4gICAgICBoID0gS1tpKjJdO1xuICAgICAgbCA9IEtbaSoyKzFdO1xuXG4gICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICBjICs9IGggJiAweGZmZmY7IGQgKz0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIHdcbiAgICAgIGggPSB3aFtpJTE2XTtcbiAgICAgIGwgPSB3bFtpJTE2XTtcblxuICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgYyArPSBoICYgMHhmZmZmOyBkICs9IGggPj4+IDE2O1xuXG4gICAgICBiICs9IGEgPj4+IDE2O1xuICAgICAgYyArPSBiID4+PiAxNjtcbiAgICAgIGQgKz0gYyA+Pj4gMTY7XG5cbiAgICAgIHRoID0gYyAmIDB4ZmZmZiB8IGQgPDwgMTY7XG4gICAgICB0bCA9IGEgJiAweGZmZmYgfCBiIDw8IDE2O1xuXG4gICAgICAvLyBhZGRcbiAgICAgIGggPSB0aDtcbiAgICAgIGwgPSB0bDtcblxuICAgICAgYSA9IGwgJiAweGZmZmY7IGIgPSBsID4+PiAxNjtcbiAgICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIFNpZ21hMFxuICAgICAgaCA9ICgoYWgwID4+PiAyOCkgfCAoYWwwIDw8ICgzMi0yOCkpKSBeICgoYWwwID4+PiAoMzQtMzIpKSB8IChhaDAgPDwgKDMyLSgzNC0zMikpKSkgXiAoKGFsMCA+Pj4gKDM5LTMyKSkgfCAoYWgwIDw8ICgzMi0oMzktMzIpKSkpO1xuICAgICAgbCA9ICgoYWwwID4+PiAyOCkgfCAoYWgwIDw8ICgzMi0yOCkpKSBeICgoYWgwID4+PiAoMzQtMzIpKSB8IChhbDAgPDwgKDMyLSgzNC0zMikpKSkgXiAoKGFoMCA+Pj4gKDM5LTMyKSkgfCAoYWwwIDw8ICgzMi0oMzktMzIpKSkpO1xuXG4gICAgICBhICs9IGwgJiAweGZmZmY7IGIgKz0gbCA+Pj4gMTY7XG4gICAgICBjICs9IGggJiAweGZmZmY7IGQgKz0gaCA+Pj4gMTY7XG5cbiAgICAgIC8vIE1halxuICAgICAgaCA9IChhaDAgJiBhaDEpIF4gKGFoMCAmIGFoMikgXiAoYWgxICYgYWgyKTtcbiAgICAgIGwgPSAoYWwwICYgYWwxKSBeIChhbDAgJiBhbDIpIF4gKGFsMSAmIGFsMik7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgYiArPSBhID4+PiAxNjtcbiAgICAgIGMgKz0gYiA+Pj4gMTY7XG4gICAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgICBiaDcgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgICBibDcgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICAgIC8vIGFkZFxuICAgICAgaCA9IGJoMztcbiAgICAgIGwgPSBibDM7XG5cbiAgICAgIGEgPSBsICYgMHhmZmZmOyBiID0gbCA+Pj4gMTY7XG4gICAgICBjID0gaCAmIDB4ZmZmZjsgZCA9IGggPj4+IDE2O1xuXG4gICAgICBoID0gdGg7XG4gICAgICBsID0gdGw7XG5cbiAgICAgIGEgKz0gbCAmIDB4ZmZmZjsgYiArPSBsID4+PiAxNjtcbiAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgYiArPSBhID4+PiAxNjtcbiAgICAgIGMgKz0gYiA+Pj4gMTY7XG4gICAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgICBiaDMgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgICBibDMgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICAgIGFoMSA9IGJoMDtcbiAgICAgIGFoMiA9IGJoMTtcbiAgICAgIGFoMyA9IGJoMjtcbiAgICAgIGFoNCA9IGJoMztcbiAgICAgIGFoNSA9IGJoNDtcbiAgICAgIGFoNiA9IGJoNTtcbiAgICAgIGFoNyA9IGJoNjtcbiAgICAgIGFoMCA9IGJoNztcblxuICAgICAgYWwxID0gYmwwO1xuICAgICAgYWwyID0gYmwxO1xuICAgICAgYWwzID0gYmwyO1xuICAgICAgYWw0ID0gYmwzO1xuICAgICAgYWw1ID0gYmw0O1xuICAgICAgYWw2ID0gYmw1O1xuICAgICAgYWw3ID0gYmw2O1xuICAgICAgYWwwID0gYmw3O1xuXG4gICAgICBpZiAoaSUxNiA9PT0gMTUpIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHtcbiAgICAgICAgICAvLyBhZGRcbiAgICAgICAgICBoID0gd2hbal07XG4gICAgICAgICAgbCA9IHdsW2pdO1xuXG4gICAgICAgICAgYSA9IGwgJiAweGZmZmY7IGIgPSBsID4+PiAxNjtcbiAgICAgICAgICBjID0gaCAmIDB4ZmZmZjsgZCA9IGggPj4+IDE2O1xuXG4gICAgICAgICAgaCA9IHdoWyhqKzkpJTE2XTtcbiAgICAgICAgICBsID0gd2xbKGorOSklMTZdO1xuXG4gICAgICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgICAgIC8vIHNpZ21hMFxuICAgICAgICAgIHRoID0gd2hbKGorMSklMTZdO1xuICAgICAgICAgIHRsID0gd2xbKGorMSklMTZdO1xuICAgICAgICAgIGggPSAoKHRoID4+PiAxKSB8ICh0bCA8PCAoMzItMSkpKSBeICgodGggPj4+IDgpIHwgKHRsIDw8ICgzMi04KSkpIF4gKHRoID4+PiA3KTtcbiAgICAgICAgICBsID0gKCh0bCA+Pj4gMSkgfCAodGggPDwgKDMyLTEpKSkgXiAoKHRsID4+PiA4KSB8ICh0aCA8PCAoMzItOCkpKSBeICgodGwgPj4+IDcpIHwgKHRoIDw8ICgzMi03KSkpO1xuXG4gICAgICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgICAgIC8vIHNpZ21hMVxuICAgICAgICAgIHRoID0gd2hbKGorMTQpJTE2XTtcbiAgICAgICAgICB0bCA9IHdsWyhqKzE0KSUxNl07XG4gICAgICAgICAgaCA9ICgodGggPj4+IDE5KSB8ICh0bCA8PCAoMzItMTkpKSkgXiAoKHRsID4+PiAoNjEtMzIpKSB8ICh0aCA8PCAoMzItKDYxLTMyKSkpKSBeICh0aCA+Pj4gNik7XG4gICAgICAgICAgbCA9ICgodGwgPj4+IDE5KSB8ICh0aCA8PCAoMzItMTkpKSkgXiAoKHRoID4+PiAoNjEtMzIpKSB8ICh0bCA8PCAoMzItKDYxLTMyKSkpKSBeICgodGwgPj4+IDYpIHwgKHRoIDw8ICgzMi02KSkpO1xuXG4gICAgICAgICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgICAgICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgICAgICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgICAgICAgYyArPSBiID4+PiAxNjtcbiAgICAgICAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgICAgICAgd2hbal0gPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgICAgICAgd2xbal0gPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGRcbiAgICBoID0gYWgwO1xuICAgIGwgPSBhbDA7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbMF07XG4gICAgbCA9IGhsWzBdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbMF0gPSBhaDAgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbMF0gPSBhbDAgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWgxO1xuICAgIGwgPSBhbDE7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbMV07XG4gICAgbCA9IGhsWzFdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbMV0gPSBhaDEgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbMV0gPSBhbDEgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWgyO1xuICAgIGwgPSBhbDI7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbMl07XG4gICAgbCA9IGhsWzJdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbMl0gPSBhaDIgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbMl0gPSBhbDIgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWgzO1xuICAgIGwgPSBhbDM7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbM107XG4gICAgbCA9IGhsWzNdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbM10gPSBhaDMgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbM10gPSBhbDMgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg0O1xuICAgIGwgPSBhbDQ7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbNF07XG4gICAgbCA9IGhsWzRdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbNF0gPSBhaDQgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbNF0gPSBhbDQgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg1O1xuICAgIGwgPSBhbDU7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbNV07XG4gICAgbCA9IGhsWzVdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbNV0gPSBhaDUgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbNV0gPSBhbDUgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg2O1xuICAgIGwgPSBhbDY7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbNl07XG4gICAgbCA9IGhsWzZdO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbNl0gPSBhaDYgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbNl0gPSBhbDYgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBoID0gYWg3O1xuICAgIGwgPSBhbDc7XG5cbiAgICBhID0gbCAmIDB4ZmZmZjsgYiA9IGwgPj4+IDE2O1xuICAgIGMgPSBoICYgMHhmZmZmOyBkID0gaCA+Pj4gMTY7XG5cbiAgICBoID0gaGhbN107XG4gICAgbCA9IGhsWzddO1xuXG4gICAgYSArPSBsICYgMHhmZmZmOyBiICs9IGwgPj4+IDE2O1xuICAgIGMgKz0gaCAmIDB4ZmZmZjsgZCArPSBoID4+PiAxNjtcblxuICAgIGIgKz0gYSA+Pj4gMTY7XG4gICAgYyArPSBiID4+PiAxNjtcbiAgICBkICs9IGMgPj4+IDE2O1xuXG4gICAgaGhbN10gPSBhaDcgPSAoYyAmIDB4ZmZmZikgfCAoZCA8PCAxNik7XG4gICAgaGxbN10gPSBhbDcgPSAoYSAmIDB4ZmZmZikgfCAoYiA8PCAxNik7XG5cbiAgICBwb3MgKz0gMTI4O1xuICAgIG4gLT0gMTI4O1xuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19oYXNoKG91dCwgbSwgbikge1xuICB2YXIgaGggPSBuZXcgSW50MzJBcnJheSg4KSxcbiAgICAgIGhsID0gbmV3IEludDMyQXJyYXkoOCksXG4gICAgICB4ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KSxcbiAgICAgIGksIGIgPSBuO1xuXG4gIGhoWzBdID0gMHg2YTA5ZTY2NztcbiAgaGhbMV0gPSAweGJiNjdhZTg1O1xuICBoaFsyXSA9IDB4M2M2ZWYzNzI7XG4gIGhoWzNdID0gMHhhNTRmZjUzYTtcbiAgaGhbNF0gPSAweDUxMGU1MjdmO1xuICBoaFs1XSA9IDB4OWIwNTY4OGM7XG4gIGhoWzZdID0gMHgxZjgzZDlhYjtcbiAgaGhbN10gPSAweDViZTBjZDE5O1xuXG4gIGhsWzBdID0gMHhmM2JjYzkwODtcbiAgaGxbMV0gPSAweDg0Y2FhNzNiO1xuICBobFsyXSA9IDB4ZmU5NGY4MmI7XG4gIGhsWzNdID0gMHg1ZjFkMzZmMTtcbiAgaGxbNF0gPSAweGFkZTY4MmQxO1xuICBobFs1XSA9IDB4MmIzZTZjMWY7XG4gIGhsWzZdID0gMHhmYjQxYmQ2YjtcbiAgaGxbN10gPSAweDEzN2UyMTc5O1xuXG4gIGNyeXB0b19oYXNoYmxvY2tzX2hsKGhoLCBobCwgbSwgbik7XG4gIG4gJT0gMTI4O1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHhbaV0gPSBtW2ItbitpXTtcbiAgeFtuXSA9IDEyODtcblxuICBuID0gMjU2LTEyOCoobjwxMTI/MTowKTtcbiAgeFtuLTldID0gMDtcbiAgdHM2NCh4LCBuLTgsICAoYiAvIDB4MjAwMDAwMDApIHwgMCwgYiA8PCAzKTtcbiAgY3J5cHRvX2hhc2hibG9ja3NfaGwoaGgsIGhsLCB4LCBuKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB0czY0KG91dCwgOCppLCBoaFtpXSwgaGxbaV0pO1xuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBhZGQocCwgcSkge1xuICB2YXIgYSA9IGdmKCksIGIgPSBnZigpLCBjID0gZ2YoKSxcbiAgICAgIGQgPSBnZigpLCBlID0gZ2YoKSwgZiA9IGdmKCksXG4gICAgICBnID0gZ2YoKSwgaCA9IGdmKCksIHQgPSBnZigpO1xuXG4gIFooYSwgcFsxXSwgcFswXSk7XG4gIFoodCwgcVsxXSwgcVswXSk7XG4gIE0oYSwgYSwgdCk7XG4gIEEoYiwgcFswXSwgcFsxXSk7XG4gIEEodCwgcVswXSwgcVsxXSk7XG4gIE0oYiwgYiwgdCk7XG4gIE0oYywgcFszXSwgcVszXSk7XG4gIE0oYywgYywgRDIpO1xuICBNKGQsIHBbMl0sIHFbMl0pO1xuICBBKGQsIGQsIGQpO1xuICBaKGUsIGIsIGEpO1xuICBaKGYsIGQsIGMpO1xuICBBKGcsIGQsIGMpO1xuICBBKGgsIGIsIGEpO1xuXG4gIE0ocFswXSwgZSwgZik7XG4gIE0ocFsxXSwgaCwgZyk7XG4gIE0ocFsyXSwgZywgZik7XG4gIE0ocFszXSwgZSwgaCk7XG59XG5cbmZ1bmN0aW9uIGNzd2FwKHAsIHEsIGIpIHtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBzZWwyNTUxOShwW2ldLCBxW2ldLCBiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYWNrKHIsIHApIHtcbiAgdmFyIHR4ID0gZ2YoKSwgdHkgPSBnZigpLCB6aSA9IGdmKCk7XG4gIGludjI1NTE5KHppLCBwWzJdKTtcbiAgTSh0eCwgcFswXSwgemkpO1xuICBNKHR5LCBwWzFdLCB6aSk7XG4gIHBhY2syNTUxOShyLCB0eSk7XG4gIHJbMzFdIF49IHBhcjI1NTE5KHR4KSA8PCA3O1xufVxuXG5mdW5jdGlvbiBzY2FsYXJtdWx0KHAsIHEsIHMpIHtcbiAgdmFyIGIsIGk7XG4gIHNldDI1NTE5KHBbMF0sIGdmMCk7XG4gIHNldDI1NTE5KHBbMV0sIGdmMSk7XG4gIHNldDI1NTE5KHBbMl0sIGdmMSk7XG4gIHNldDI1NTE5KHBbM10sIGdmMCk7XG4gIGZvciAoaSA9IDI1NTsgaSA+PSAwOyAtLWkpIHtcbiAgICBiID0gKHNbKGkvOCl8MF0gPj4gKGkmNykpICYgMTtcbiAgICBjc3dhcChwLCBxLCBiKTtcbiAgICBhZGQocSwgcCk7XG4gICAgYWRkKHAsIHApO1xuICAgIGNzd2FwKHAsIHEsIGIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjYWxhcmJhc2UocCwgcykge1xuICB2YXIgcSA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcbiAgc2V0MjU1MTkocVswXSwgWCk7XG4gIHNldDI1NTE5KHFbMV0sIFkpO1xuICBzZXQyNTUxOShxWzJdLCBnZjEpO1xuICBNKHFbM10sIFgsIFkpO1xuICBzY2FsYXJtdWx0KHAsIHEsIHMpO1xufVxuXG5mdW5jdGlvbiBjcnlwdG9fc2lnbl9rZXlwYWlyKHBrLCBzaywgc2VlZGVkKSB7XG4gIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcbiAgdmFyIGk7XG5cbiAgaWYgKCFzZWVkZWQpIHJhbmRvbWJ5dGVzKHNrLCAzMik7XG4gIGNyeXB0b19oYXNoKGQsIHNrLCAzMik7XG4gIGRbMF0gJj0gMjQ4O1xuICBkWzMxXSAmPSAxMjc7XG4gIGRbMzFdIHw9IDY0O1xuXG4gIHNjYWxhcmJhc2UocCwgZCk7XG4gIHBhY2socGssIHApO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSBza1tpKzMyXSA9IHBrW2ldO1xuICByZXR1cm4gMDtcbn1cblxudmFyIEwgPSBuZXcgRmxvYXQ2NEFycmF5KFsweGVkLCAweGQzLCAweGY1LCAweDVjLCAweDFhLCAweDYzLCAweDEyLCAweDU4LCAweGQ2LCAweDljLCAweGY3LCAweGEyLCAweGRlLCAweGY5LCAweGRlLCAweDE0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDEwXSk7XG5cbmZ1bmN0aW9uIG1vZEwociwgeCkge1xuICB2YXIgY2FycnksIGksIGosIGs7XG4gIGZvciAoaSA9IDYzOyBpID49IDMyOyAtLWkpIHtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yIChqID0gaSAtIDMyLCBrID0gaSAtIDEyOyBqIDwgazsgKytqKSB7XG4gICAgICB4W2pdICs9IGNhcnJ5IC0gMTYgKiB4W2ldICogTFtqIC0gKGkgLSAzMildO1xuICAgICAgY2FycnkgPSAoeFtqXSArIDEyOCkgPj4gODtcbiAgICAgIHhbal0gLT0gY2FycnkgKiAyNTY7XG4gICAgfVxuICAgIHhbal0gKz0gY2Fycnk7XG4gICAgeFtpXSA9IDA7XG4gIH1cbiAgY2FycnkgPSAwO1xuICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgIHhbal0gKz0gY2FycnkgLSAoeFszMV0gPj4gNCkgKiBMW2pdO1xuICAgIGNhcnJ5ID0geFtqXSA+PiA4O1xuICAgIHhbal0gJj0gMjU1O1xuICB9XG4gIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB4W2pdIC09IGNhcnJ5ICogTFtqXTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICB4W2krMV0gKz0geFtpXSA+PiA4O1xuICAgIHJbaV0gPSB4W2ldICYgMjU1O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZShyKSB7XG4gIHZhciB4ID0gbmV3IEZsb2F0NjRBcnJheSg2NCksIGk7XG4gIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB4W2ldID0gcltpXTtcbiAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHJbaV0gPSAwO1xuICBtb2RMKHIsIHgpO1xufVxuXG4vLyBOb3RlOiBkaWZmZXJlbmNlIGZyb20gQyAtIHNtbGVuIHJldHVybmVkLCBub3QgcGFzc2VkIGFzIGFyZ3VtZW50LlxuZnVuY3Rpb24gY3J5cHRvX3NpZ24oc20sIG0sIG4sIHNrKSB7XG4gIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkoNjQpLCBoID0gbmV3IFVpbnQ4QXJyYXkoNjQpLCByID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgaSwgaiwgeCA9IG5ldyBGbG9hdDY0QXJyYXkoNjQpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXTtcblxuICBjcnlwdG9faGFzaChkLCBzaywgMzIpO1xuICBkWzBdICY9IDI0ODtcbiAgZFszMV0gJj0gMTI3O1xuICBkWzMxXSB8PSA2NDtcblxuICB2YXIgc21sZW4gPSBuICsgNjQ7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHNtWzY0ICsgaV0gPSBtW2ldO1xuICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgc21bMzIgKyBpXSA9IGRbMzIgKyBpXTtcblxuICBjcnlwdG9faGFzaChyLCBzbS5zdWJhcnJheSgzMiksIG4rMzIpO1xuICByZWR1Y2Uocik7XG4gIHNjYWxhcmJhc2UocCwgcik7XG4gIHBhY2soc20sIHApO1xuXG4gIGZvciAoaSA9IDMyOyBpIDwgNjQ7IGkrKykgc21baV0gPSBza1tpXTtcbiAgY3J5cHRvX2hhc2goaCwgc20sIG4gKyA2NCk7XG4gIHJlZHVjZShoKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeFtpXSA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB4W2ldID0gcltpXTtcbiAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgICAgeFtpK2pdICs9IGhbaV0gKiBkW2pdO1xuICAgIH1cbiAgfVxuXG4gIG1vZEwoc20uc3ViYXJyYXkoMzIpLCB4KTtcbiAgcmV0dXJuIHNtbGVuO1xufVxuXG5mdW5jdGlvbiB1bnBhY2tuZWcociwgcCkge1xuICB2YXIgdCA9IGdmKCksIGNoayA9IGdmKCksIG51bSA9IGdmKCksXG4gICAgICBkZW4gPSBnZigpLCBkZW4yID0gZ2YoKSwgZGVuNCA9IGdmKCksXG4gICAgICBkZW42ID0gZ2YoKTtcblxuICBzZXQyNTUxOShyWzJdLCBnZjEpO1xuICB1bnBhY2syNTUxOShyWzFdLCBwKTtcbiAgUyhudW0sIHJbMV0pO1xuICBNKGRlbiwgbnVtLCBEKTtcbiAgWihudW0sIG51bSwgclsyXSk7XG4gIEEoZGVuLCByWzJdLCBkZW4pO1xuXG4gIFMoZGVuMiwgZGVuKTtcbiAgUyhkZW40LCBkZW4yKTtcbiAgTShkZW42LCBkZW40LCBkZW4yKTtcbiAgTSh0LCBkZW42LCBudW0pO1xuICBNKHQsIHQsIGRlbik7XG5cbiAgcG93MjUyMyh0LCB0KTtcbiAgTSh0LCB0LCBudW0pO1xuICBNKHQsIHQsIGRlbik7XG4gIE0odCwgdCwgZGVuKTtcbiAgTShyWzBdLCB0LCBkZW4pO1xuXG4gIFMoY2hrLCByWzBdKTtcbiAgTShjaGssIGNoaywgZGVuKTtcbiAgaWYgKG5lcTI1NTE5KGNoaywgbnVtKSkgTShyWzBdLCByWzBdLCBJKTtcblxuICBTKGNoaywgclswXSk7XG4gIE0oY2hrLCBjaGssIGRlbik7XG4gIGlmIChuZXEyNTUxOShjaGssIG51bSkpIHJldHVybiAtMTtcblxuICBpZiAocGFyMjU1MTkoclswXSkgPT09IChwWzMxXT4+NykpIFooclswXSwgZ2YwLCByWzBdKTtcblxuICBNKHJbM10sIHJbMF0sIHJbMV0pO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NpZ25fb3BlbihtLCBzbSwgbiwgcGspIHtcbiAgdmFyIGksIG1sZW47XG4gIHZhciB0ID0gbmV3IFVpbnQ4QXJyYXkoMzIpLCBoID0gbmV3IFVpbnQ4QXJyYXkoNjQpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXSxcbiAgICAgIHEgPSBbZ2YoKSwgZ2YoKSwgZ2YoKSwgZ2YoKV07XG5cbiAgbWxlbiA9IC0xO1xuICBpZiAobiA8IDY0KSByZXR1cm4gLTE7XG5cbiAgaWYgKHVucGFja25lZyhxLCBwaykpIHJldHVybiAtMTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBtW2ldID0gc21baV07XG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSBtW2krMzJdID0gcGtbaV07XG4gIGNyeXB0b19oYXNoKGgsIG0sIG4pO1xuICByZWR1Y2UoaCk7XG4gIHNjYWxhcm11bHQocCwgcSwgaCk7XG5cbiAgc2NhbGFyYmFzZShxLCBzbS5zdWJhcnJheSgzMikpO1xuICBhZGQocCwgcSk7XG4gIHBhY2sodCwgcCk7XG5cbiAgbiAtPSA2NDtcbiAgaWYgKGNyeXB0b192ZXJpZnlfMzIoc20sIDAsIHQsIDApKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgbVtpXSA9IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgbVtpXSA9IHNtW2kgKyA2NF07XG4gIG1sZW4gPSBuO1xuICByZXR1cm4gbWxlbjtcbn1cblxudmFyIGNyeXB0b19zZWNyZXRib3hfS0VZQllURVMgPSAzMixcbiAgICBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVMgPSAyNCxcbiAgICBjcnlwdG9fc2VjcmV0Ym94X1pFUk9CWVRFUyA9IDMyLFxuICAgIGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTID0gMTYsXG4gICAgY3J5cHRvX3NjYWxhcm11bHRfQllURVMgPSAzMixcbiAgICBjcnlwdG9fc2NhbGFybXVsdF9TQ0FMQVJCWVRFUyA9IDMyLFxuICAgIGNyeXB0b19ib3hfUFVCTElDS0VZQllURVMgPSAzMixcbiAgICBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTID0gMzIsXG4gICAgY3J5cHRvX2JveF9CRUZPUkVOTUJZVEVTID0gMzIsXG4gICAgY3J5cHRvX2JveF9OT05DRUJZVEVTID0gY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTLFxuICAgIGNyeXB0b19ib3hfWkVST0JZVEVTID0gY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMsXG4gICAgY3J5cHRvX2JveF9CT1haRVJPQllURVMgPSBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUyxcbiAgICBjcnlwdG9fc2lnbl9CWVRFUyA9IDY0LFxuICAgIGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTID0gMzIsXG4gICAgY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMgPSA2NCxcbiAgICBjcnlwdG9fc2lnbl9TRUVEQllURVMgPSAzMixcbiAgICBjcnlwdG9faGFzaF9CWVRFUyA9IDY0O1xuXG5uYWNsLmxvd2xldmVsID0ge1xuICBjcnlwdG9fY29yZV9oc2Fsc2EyMDogY3J5cHRvX2NvcmVfaHNhbHNhMjAsXG4gIGNyeXB0b19zdHJlYW1feG9yOiBjcnlwdG9fc3RyZWFtX3hvcixcbiAgY3J5cHRvX3N0cmVhbTogY3J5cHRvX3N0cmVhbSxcbiAgY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcjogY3J5cHRvX3N0cmVhbV9zYWxzYTIwX3hvcixcbiAgY3J5cHRvX3N0cmVhbV9zYWxzYTIwOiBjcnlwdG9fc3RyZWFtX3NhbHNhMjAsXG4gIGNyeXB0b19vbmV0aW1lYXV0aDogY3J5cHRvX29uZXRpbWVhdXRoLFxuICBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5OiBjcnlwdG9fb25ldGltZWF1dGhfdmVyaWZ5LFxuICBjcnlwdG9fdmVyaWZ5XzE2OiBjcnlwdG9fdmVyaWZ5XzE2LFxuICBjcnlwdG9fdmVyaWZ5XzMyOiBjcnlwdG9fdmVyaWZ5XzMyLFxuICBjcnlwdG9fc2VjcmV0Ym94OiBjcnlwdG9fc2VjcmV0Ym94LFxuICBjcnlwdG9fc2VjcmV0Ym94X29wZW46IGNyeXB0b19zZWNyZXRib3hfb3BlbixcbiAgY3J5cHRvX3NjYWxhcm11bHQ6IGNyeXB0b19zY2FsYXJtdWx0LFxuICBjcnlwdG9fc2NhbGFybXVsdF9iYXNlOiBjcnlwdG9fc2NhbGFybXVsdF9iYXNlLFxuICBjcnlwdG9fYm94X2JlZm9yZW5tOiBjcnlwdG9fYm94X2JlZm9yZW5tLFxuICBjcnlwdG9fYm94X2FmdGVybm06IGNyeXB0b19ib3hfYWZ0ZXJubSxcbiAgY3J5cHRvX2JveDogY3J5cHRvX2JveCxcbiAgY3J5cHRvX2JveF9vcGVuOiBjcnlwdG9fYm94X29wZW4sXG4gIGNyeXB0b19ib3hfa2V5cGFpcjogY3J5cHRvX2JveF9rZXlwYWlyLFxuICBjcnlwdG9faGFzaDogY3J5cHRvX2hhc2gsXG4gIGNyeXB0b19zaWduOiBjcnlwdG9fc2lnbixcbiAgY3J5cHRvX3NpZ25fa2V5cGFpcjogY3J5cHRvX3NpZ25fa2V5cGFpcixcbiAgY3J5cHRvX3NpZ25fb3BlbjogY3J5cHRvX3NpZ25fb3BlbixcblxuICBjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTOiBjcnlwdG9fc2VjcmV0Ym94X0tFWUJZVEVTLFxuICBjcnlwdG9fc2VjcmV0Ym94X05PTkNFQllURVM6IGNyeXB0b19zZWNyZXRib3hfTk9OQ0VCWVRFUyxcbiAgY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVM6IGNyeXB0b19zZWNyZXRib3hfWkVST0JZVEVTLFxuICBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUzogY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVMsXG4gIGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTOiBjcnlwdG9fc2NhbGFybXVsdF9CWVRFUyxcbiAgY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVM6IGNyeXB0b19zY2FsYXJtdWx0X1NDQUxBUkJZVEVTLFxuICBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTOiBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTLFxuICBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTOiBjcnlwdG9fYm94X1NFQ1JFVEtFWUJZVEVTLFxuICBjcnlwdG9fYm94X0JFRk9SRU5NQllURVM6IGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUyxcbiAgY3J5cHRvX2JveF9OT05DRUJZVEVTOiBjcnlwdG9fYm94X05PTkNFQllURVMsXG4gIGNyeXB0b19ib3hfWkVST0JZVEVTOiBjcnlwdG9fYm94X1pFUk9CWVRFUyxcbiAgY3J5cHRvX2JveF9CT1haRVJPQllURVM6IGNyeXB0b19ib3hfQk9YWkVST0JZVEVTLFxuICBjcnlwdG9fc2lnbl9CWVRFUzogY3J5cHRvX3NpZ25fQllURVMsXG4gIGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTOiBjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUyxcbiAgY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVM6IGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTLFxuICBjcnlwdG9fc2lnbl9TRUVEQllURVM6IGNyeXB0b19zaWduX1NFRURCWVRFUyxcbiAgY3J5cHRvX2hhc2hfQllURVM6IGNyeXB0b19oYXNoX0JZVEVTXG59O1xuXG4vKiBIaWdoLWxldmVsIEFQSSAqL1xuXG5mdW5jdGlvbiBjaGVja0xlbmd0aHMoaywgbikge1xuICBpZiAoay5sZW5ndGggIT09IGNyeXB0b19zZWNyZXRib3hfS0VZQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIGtleSBzaXplJyk7XG4gIGlmIChuLmxlbmd0aCAhPT0gY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBub25jZSBzaXplJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQm94TGVuZ3Rocyhwaywgc2spIHtcbiAgaWYgKHBrLmxlbmd0aCAhPT0gY3J5cHRvX2JveF9QVUJMSUNLRVlCWVRFUykgdGhyb3cgbmV3IEVycm9yKCdiYWQgcHVibGljIGtleSBzaXplJyk7XG4gIGlmIChzay5sZW5ndGggIT09IGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIHNlY3JldCBrZXkgc2l6ZScpO1xufVxuXG5mdW5jdGlvbiBjaGVja0FycmF5VHlwZXMoKSB7XG4gIHZhciB0LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgIGlmICgodCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudHNbaV0pKSAhPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKVxuICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZXhwZWN0ZWQgdHlwZSAnICsgdCArICcsIHVzZSBVaW50OEFycmF5Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW51cChhcnIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycltpXSA9IDA7XG59XG5cbi8vIFRPRE86IENvbXBsZXRlbHkgcmVtb3ZlIHRoaXMgaW4gdjAuMTUuXG5pZiAoIW5hY2wudXRpbCkge1xuICBuYWNsLnV0aWwgPSB7fTtcbiAgbmFjbC51dGlsLmRlY29kZVVURjggPSBuYWNsLnV0aWwuZW5jb2RlVVRGOCA9IG5hY2wudXRpbC5lbmNvZGVCYXNlNjQgPSBuYWNsLnV0aWwuZGVjb2RlQmFzZTY0ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCduYWNsLnV0aWwgbW92ZWQgaW50byBzZXBhcmF0ZSBwYWNrYWdlOiBodHRwczovL2dpdGh1Yi5jb20vZGNoZXN0L3R3ZWV0bmFjbC11dGlsLWpzJyk7XG4gIH07XG59XG5cbm5hY2wucmFuZG9tQnl0ZXMgPSBmdW5jdGlvbihuKSB7XG4gIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIHJhbmRvbWJ5dGVzKGIsIG4pO1xuICByZXR1cm4gYjtcbn07XG5cbm5hY2wuc2VjcmV0Ym94ID0gZnVuY3Rpb24obXNnLCBub25jZSwga2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhtc2csIG5vbmNlLCBrZXkpO1xuICBjaGVja0xlbmd0aHMoa2V5LCBub25jZSk7XG4gIHZhciBtID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMgKyBtc2cubGVuZ3RoKTtcbiAgdmFyIGMgPSBuZXcgVWludDhBcnJheShtLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSBtW2krY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVNdID0gbXNnW2ldO1xuICBjcnlwdG9fc2VjcmV0Ym94KGMsIG0sIG0ubGVuZ3RoLCBub25jZSwga2V5KTtcbiAgcmV0dXJuIGMuc3ViYXJyYXkoY3J5cHRvX3NlY3JldGJveF9CT1haRVJPQllURVMpO1xufTtcblxubmFjbC5zZWNyZXRib3gub3BlbiA9IGZ1bmN0aW9uKGJveCwgbm9uY2UsIGtleSkge1xuICBjaGVja0FycmF5VHlwZXMoYm94LCBub25jZSwga2V5KTtcbiAgY2hlY2tMZW5ndGhzKGtleSwgbm9uY2UpO1xuICB2YXIgYyA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTICsgYm94Lmxlbmd0aCk7XG4gIHZhciBtID0gbmV3IFVpbnQ4QXJyYXkoYy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJveC5sZW5ndGg7IGkrKykgY1tpK2NyeXB0b19zZWNyZXRib3hfQk9YWkVST0JZVEVTXSA9IGJveFtpXTtcbiAgaWYgKGMubGVuZ3RoIDwgMzIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGNyeXB0b19zZWNyZXRib3hfb3BlbihtLCBjLCBjLmxlbmd0aCwgbm9uY2UsIGtleSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG0uc3ViYXJyYXkoY3J5cHRvX3NlY3JldGJveF9aRVJPQllURVMpO1xufTtcblxubmFjbC5zZWNyZXRib3gua2V5TGVuZ3RoID0gY3J5cHRvX3NlY3JldGJveF9LRVlCWVRFUztcbm5hY2wuc2VjcmV0Ym94Lm5vbmNlTGVuZ3RoID0gY3J5cHRvX3NlY3JldGJveF9OT05DRUJZVEVTO1xubmFjbC5zZWNyZXRib3gub3ZlcmhlYWRMZW5ndGggPSBjcnlwdG9fc2VjcmV0Ym94X0JPWFpFUk9CWVRFUztcblxubmFjbC5zY2FsYXJNdWx0ID0gZnVuY3Rpb24obiwgcCkge1xuICBjaGVja0FycmF5VHlwZXMobiwgcCk7XG4gIGlmIChuLmxlbmd0aCAhPT0gY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIG4gc2l6ZScpO1xuICBpZiAocC5sZW5ndGggIT09IGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTKSB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwIHNpemUnKTtcbiAgdmFyIHEgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2NhbGFybXVsdF9CWVRFUyk7XG4gIGNyeXB0b19zY2FsYXJtdWx0KHEsIG4sIHApO1xuICByZXR1cm4gcTtcbn07XG5cbm5hY2wuc2NhbGFyTXVsdC5iYXNlID0gZnVuY3Rpb24obikge1xuICBjaGVja0FycmF5VHlwZXMobik7XG4gIGlmIChuLmxlbmd0aCAhPT0gY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVMpIHRocm93IG5ldyBFcnJvcignYmFkIG4gc2l6ZScpO1xuICB2YXIgcSA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zY2FsYXJtdWx0X0JZVEVTKTtcbiAgY3J5cHRvX3NjYWxhcm11bHRfYmFzZShxLCBuKTtcbiAgcmV0dXJuIHE7XG59O1xuXG5uYWNsLnNjYWxhck11bHQuc2NhbGFyTGVuZ3RoID0gY3J5cHRvX3NjYWxhcm11bHRfU0NBTEFSQllURVM7XG5uYWNsLnNjYWxhck11bHQuZ3JvdXBFbGVtZW50TGVuZ3RoID0gY3J5cHRvX3NjYWxhcm11bHRfQllURVM7XG5cbm5hY2wuYm94ID0gZnVuY3Rpb24obXNnLCBub25jZSwgcHVibGljS2V5LCBzZWNyZXRLZXkpIHtcbiAgdmFyIGsgPSBuYWNsLmJveC5iZWZvcmUocHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICByZXR1cm4gbmFjbC5zZWNyZXRib3gobXNnLCBub25jZSwgayk7XG59O1xuXG5uYWNsLmJveC5iZWZvcmUgPSBmdW5jdGlvbihwdWJsaWNLZXksIHNlY3JldEtleSkge1xuICBjaGVja0FycmF5VHlwZXMocHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICBjaGVja0JveExlbmd0aHMocHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICB2YXIgayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUyk7XG4gIGNyeXB0b19ib3hfYmVmb3Jlbm0oaywgcHVibGljS2V5LCBzZWNyZXRLZXkpO1xuICByZXR1cm4gaztcbn07XG5cbm5hY2wuYm94LmFmdGVyID0gbmFjbC5zZWNyZXRib3g7XG5cbm5hY2wuYm94Lm9wZW4gPSBmdW5jdGlvbihtc2csIG5vbmNlLCBwdWJsaWNLZXksIHNlY3JldEtleSkge1xuICB2YXIgayA9IG5hY2wuYm94LmJlZm9yZShwdWJsaWNLZXksIHNlY3JldEtleSk7XG4gIHJldHVybiBuYWNsLnNlY3JldGJveC5vcGVuKG1zZywgbm9uY2UsIGspO1xufTtcblxubmFjbC5ib3gub3Blbi5hZnRlciA9IG5hY2wuc2VjcmV0Ym94Lm9wZW47XG5cbm5hY2wuYm94LmtleVBhaXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2JveF9QVUJMSUNLRVlCWVRFUyk7XG4gIHZhciBzayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMpO1xuICBjcnlwdG9fYm94X2tleXBhaXIocGssIHNrKTtcbiAgcmV0dXJuIHtwdWJsaWNLZXk6IHBrLCBzZWNyZXRLZXk6IHNrfTtcbn07XG5cbm5hY2wuYm94LmtleVBhaXIuZnJvbVNlY3JldEtleSA9IGZ1bmN0aW9uKHNlY3JldEtleSkge1xuICBjaGVja0FycmF5VHlwZXMoc2VjcmV0S2V5KTtcbiAgaWYgKHNlY3JldEtleS5sZW5ndGggIT09IGNyeXB0b19ib3hfU0VDUkVUS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19ib3hfUFVCTElDS0VZQllURVMpO1xuICBjcnlwdG9fc2NhbGFybXVsdF9iYXNlKHBrLCBzZWNyZXRLZXkpO1xuICByZXR1cm4ge3B1YmxpY0tleTogcGssIHNlY3JldEtleTogbmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5KX07XG59O1xuXG5uYWNsLmJveC5wdWJsaWNLZXlMZW5ndGggPSBjcnlwdG9fYm94X1BVQkxJQ0tFWUJZVEVTO1xubmFjbC5ib3guc2VjcmV0S2V5TGVuZ3RoID0gY3J5cHRvX2JveF9TRUNSRVRLRVlCWVRFUztcbm5hY2wuYm94LnNoYXJlZEtleUxlbmd0aCA9IGNyeXB0b19ib3hfQkVGT1JFTk1CWVRFUztcbm5hY2wuYm94Lm5vbmNlTGVuZ3RoID0gY3J5cHRvX2JveF9OT05DRUJZVEVTO1xubmFjbC5ib3gub3ZlcmhlYWRMZW5ndGggPSBuYWNsLnNlY3JldGJveC5vdmVyaGVhZExlbmd0aDtcblxubmFjbC5zaWduID0gZnVuY3Rpb24obXNnLCBzZWNyZXRLZXkpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZywgc2VjcmV0S2V5KTtcbiAgaWYgKHNlY3JldEtleS5sZW5ndGggIT09IGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHNlY3JldCBrZXkgc2l6ZScpO1xuICB2YXIgc2lnbmVkTXNnID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fQllURVMrbXNnLmxlbmd0aCk7XG4gIGNyeXB0b19zaWduKHNpZ25lZE1zZywgbXNnLCBtc2cubGVuZ3RoLCBzZWNyZXRLZXkpO1xuICByZXR1cm4gc2lnbmVkTXNnO1xufTtcblxubmFjbC5zaWduLm9wZW4gPSBmdW5jdGlvbihzaWduZWRNc2csIHB1YmxpY0tleSkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25hY2wuc2lnbi5vcGVuIGFjY2VwdHMgMiBhcmd1bWVudHM7IGRpZCB5b3UgbWVhbiB0byB1c2UgbmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeT8nKTtcbiAgY2hlY2tBcnJheVR5cGVzKHNpZ25lZE1zZywgcHVibGljS2V5KTtcbiAgaWYgKHB1YmxpY0tleS5sZW5ndGggIT09IGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHB1YmxpYyBrZXkgc2l6ZScpO1xuICB2YXIgdG1wID0gbmV3IFVpbnQ4QXJyYXkoc2lnbmVkTXNnLmxlbmd0aCk7XG4gIHZhciBtbGVuID0gY3J5cHRvX3NpZ25fb3Blbih0bXAsIHNpZ25lZE1zZywgc2lnbmVkTXNnLmxlbmd0aCwgcHVibGljS2V5KTtcbiAgaWYgKG1sZW4gPCAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIG0gPSBuZXcgVWludDhBcnJheShtbGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSBtW2ldID0gdG1wW2ldO1xuICByZXR1cm4gbTtcbn07XG5cbm5hY2wuc2lnbi5kZXRhY2hlZCA9IGZ1bmN0aW9uKG1zZywgc2VjcmV0S2V5KSB7XG4gIHZhciBzaWduZWRNc2cgPSBuYWNsLnNpZ24obXNnLCBzZWNyZXRLZXkpO1xuICB2YXIgc2lnID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fQllURVMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZy5sZW5ndGg7IGkrKykgc2lnW2ldID0gc2lnbmVkTXNnW2ldO1xuICByZXR1cm4gc2lnO1xufTtcblxubmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeSA9IGZ1bmN0aW9uKG1zZywgc2lnLCBwdWJsaWNLZXkpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZywgc2lnLCBwdWJsaWNLZXkpO1xuICBpZiAoc2lnLmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2lnbmF0dXJlIHNpemUnKTtcbiAgaWYgKHB1YmxpY0tleS5sZW5ndGggIT09IGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHB1YmxpYyBrZXkgc2l6ZScpO1xuICB2YXIgc20gPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9CWVRFUyArIG1zZy5sZW5ndGgpO1xuICB2YXIgbSA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX0JZVEVTICsgbXNnLmxlbmd0aCk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX3NpZ25fQllURVM7IGkrKykgc21baV0gPSBzaWdbaV07XG4gIGZvciAoaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHNtW2krY3J5cHRvX3NpZ25fQllURVNdID0gbXNnW2ldO1xuICByZXR1cm4gKGNyeXB0b19zaWduX29wZW4obSwgc20sIHNtLmxlbmd0aCwgcHVibGljS2V5KSA+PSAwKTtcbn07XG5cbm5hY2wuc2lnbi5rZXlQYWlyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKTtcbiAgdmFyIHNrID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMpO1xuICBjcnlwdG9fc2lnbl9rZXlwYWlyKHBrLCBzayk7XG4gIHJldHVybiB7cHVibGljS2V5OiBwaywgc2VjcmV0S2V5OiBza307XG59O1xuXG5uYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VjcmV0S2V5ID0gZnVuY3Rpb24oc2VjcmV0S2V5KSB7XG4gIGNoZWNrQXJyYXlUeXBlcyhzZWNyZXRLZXkpO1xuICBpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fU0VDUkVUS0VZQllURVMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG4gIHZhciBwayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1BVQkxJQ0tFWUJZVEVTKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBway5sZW5ndGg7IGkrKykgcGtbaV0gPSBzZWNyZXRLZXlbMzIraV07XG4gIHJldHVybiB7cHVibGljS2V5OiBwaywgc2VjcmV0S2V5OiBuZXcgVWludDhBcnJheShzZWNyZXRLZXkpfTtcbn07XG5cbm5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkID0gZnVuY3Rpb24oc2VlZCkge1xuICBjaGVja0FycmF5VHlwZXMoc2VlZCk7XG4gIGlmIChzZWVkLmxlbmd0aCAhPT0gY3J5cHRvX3NpZ25fU0VFREJZVEVTKVxuICAgIHRocm93IG5ldyBFcnJvcignYmFkIHNlZWQgc2l6ZScpO1xuICB2YXIgcGsgPSBuZXcgVWludDhBcnJheShjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUyk7XG4gIHZhciBzayA9IG5ldyBVaW50OEFycmF5KGNyeXB0b19zaWduX1NFQ1JFVEtFWUJZVEVTKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSBza1tpXSA9IHNlZWRbaV07XG4gIGNyeXB0b19zaWduX2tleXBhaXIocGssIHNrLCB0cnVlKTtcbiAgcmV0dXJuIHtwdWJsaWNLZXk6IHBrLCBzZWNyZXRLZXk6IHNrfTtcbn07XG5cbm5hY2wuc2lnbi5wdWJsaWNLZXlMZW5ndGggPSBjcnlwdG9fc2lnbl9QVUJMSUNLRVlCWVRFUztcbm5hY2wuc2lnbi5zZWNyZXRLZXlMZW5ndGggPSBjcnlwdG9fc2lnbl9TRUNSRVRLRVlCWVRFUztcbm5hY2wuc2lnbi5zZWVkTGVuZ3RoID0gY3J5cHRvX3NpZ25fU0VFREJZVEVTO1xubmFjbC5zaWduLnNpZ25hdHVyZUxlbmd0aCA9IGNyeXB0b19zaWduX0JZVEVTO1xuXG5uYWNsLmhhc2ggPSBmdW5jdGlvbihtc2cpIHtcbiAgY2hlY2tBcnJheVR5cGVzKG1zZyk7XG4gIHZhciBoID0gbmV3IFVpbnQ4QXJyYXkoY3J5cHRvX2hhc2hfQllURVMpO1xuICBjcnlwdG9faGFzaChoLCBtc2csIG1zZy5sZW5ndGgpO1xuICByZXR1cm4gaDtcbn07XG5cbm5hY2wuaGFzaC5oYXNoTGVuZ3RoID0gY3J5cHRvX2hhc2hfQllURVM7XG5cbm5hY2wudmVyaWZ5ID0gZnVuY3Rpb24oeCwgeSkge1xuICBjaGVja0FycmF5VHlwZXMoeCwgeSk7XG4gIC8vIFplcm8gbGVuZ3RoIGFyZ3VtZW50cyBhcmUgY29uc2lkZXJlZCBub3QgZXF1YWwuXG4gIGlmICh4Lmxlbmd0aCA9PT0gMCB8fCB5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAodm4oeCwgMCwgeSwgMCwgeC5sZW5ndGgpID09PSAwKSA/IHRydWUgOiBmYWxzZTtcbn07XG5cbm5hY2wuc2V0UFJORyA9IGZ1bmN0aW9uKGZuKSB7XG4gIHJhbmRvbWJ5dGVzID0gZm47XG59O1xuXG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluaXRpYWxpemUgUFJORyBpZiBlbnZpcm9ubWVudCBwcm92aWRlcyBDU1BSTkcuXG4gIC8vIElmIG5vdCwgbWV0aG9kcyBjYWxsaW5nIHJhbmRvbWJ5dGVzIHdpbGwgdGhyb3cuXG4gIHZhciBjcnlwdG8gPSB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyAoc2VsZi5jcnlwdG8gfHwgc2VsZi5tc0NyeXB0bykgOiBudWxsO1xuICBpZiAoY3J5cHRvICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBCcm93c2Vycy5cbiAgICB2YXIgUVVPVEEgPSA2NTUzNjtcbiAgICBuYWNsLnNldFBSTkcoZnVuY3Rpb24oeCwgbikge1xuICAgICAgdmFyIGksIHYgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IFFVT1RBKSB7XG4gICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXModi5zdWJhcnJheShpLCBpICsgTWF0aC5taW4obiAtIGksIFFVT1RBKSkpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeFtpXSA9IHZbaV07XG4gICAgICBjbGVhbnVwKHYpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE5vZGUuanMuXG4gICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKGNyeXB0byAmJiBjcnlwdG8ucmFuZG9tQnl0ZXMpIHtcbiAgICAgIG5hY2wuc2V0UFJORyhmdW5jdGlvbih4LCBuKSB7XG4gICAgICAgIHZhciBpLCB2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKG4pO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB4W2ldID0gdltpXTtcbiAgICAgICAgY2xlYW51cCh2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSkoKTtcblxufSkodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMgPyBtb2R1bGUuZXhwb3J0cyA6IChzZWxmLm5hY2wgPSBzZWxmLm5hY2wgfHwge30pKTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGJ1ZmZlclNwbGl0OiBidWZmZXJTcGxpdCxcblx0YWRkUlNBTWlzc2luZzogYWRkUlNBTWlzc2luZyxcblx0Y2FsY3VsYXRlRFNBUHVibGljOiBjYWxjdWxhdGVEU0FQdWJsaWMsXG5cdGNhbGN1bGF0ZUVEMjU1MTlQdWJsaWM6IGNhbGN1bGF0ZUVEMjU1MTlQdWJsaWMsXG5cdGNhbGN1bGF0ZVgyNTUxOVB1YmxpYzogY2FsY3VsYXRlWDI1NTE5UHVibGljLFxuXHRtcE5vcm1hbGl6ZTogbXBOb3JtYWxpemUsXG5cdG1wRGVub3JtYWxpemU6IG1wRGVub3JtYWxpemUsXG5cdGVjTm9ybWFsaXplOiBlY05vcm1hbGl6ZSxcblx0Y291bnRaZXJvczogY291bnRaZXJvcyxcblx0YXNzZXJ0Q29tcGF0aWJsZTogYXNzZXJ0Q29tcGF0aWJsZSxcblx0aXNDb21wYXRpYmxlOiBpc0NvbXBhdGlibGUsXG5cdG9wZW5zc2xLZXlEZXJpdjogb3BlbnNzbEtleURlcml2LFxuXHRvcGVuc3NoQ2lwaGVySW5mbzogb3BlbnNzaENpcGhlckluZm8sXG5cdHB1YmxpY0Zyb21Qcml2YXRlRUNEU0E6IHB1YmxpY0Zyb21Qcml2YXRlRUNEU0EsXG5cdHplcm9QYWRUb0xlbmd0aDogemVyb1BhZFRvTGVuZ3RoLFxuXHR3cml0ZUJpdFN0cmluZzogd3JpdGVCaXRTdHJpbmcsXG5cdHJlYWRCaXRTdHJpbmc6IHJlYWRCaXRTdHJpbmcsXG5cdHBia2RmMjogcGJrZGYyXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4vcHJpdmF0ZS1rZXknKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuL2tleScpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xuXG52YXIgZWMgPSByZXF1aXJlKCdlY2MtanNibi9saWIvZWMnKTtcbnZhciBqc2JuID0gcmVxdWlyZSgnanNibicpLkJpZ0ludGVnZXI7XG52YXIgbmFjbCA9IHJlcXVpcmUoJ3R3ZWV0bmFjbCcpO1xuXG52YXIgTUFYX0NMQVNTX0RFUFRIID0gMztcblxuZnVuY3Rpb24gaXNDb21wYXRpYmxlKG9iaiwga2xhc3MsIG5lZWRWZXIpIHtcblx0aWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2YgKG9iaikgIT09ICdvYmplY3QnKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRpZiAobmVlZFZlciA9PT0gdW5kZWZpbmVkKVxuXHRcdG5lZWRWZXIgPSBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbjtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIGtsYXNzICYmXG5cdCAgICBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvblswXSA9PSBuZWVkVmVyWzBdKVxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuXHR2YXIgZGVwdGggPSAwO1xuXHR3aGlsZSAocHJvdG8uY29uc3RydWN0b3IubmFtZSAhPT0ga2xhc3MubmFtZSkge1xuXHRcdHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0XHRpZiAoIXByb3RvIHx8ICsrZGVwdGggPiBNQVhfQ0xBU1NfREVQVEgpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXHRpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSAhPT0ga2xhc3MubmFtZSlcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0dmFyIHZlciA9IHByb3RvLl9zc2hwa0FwaVZlcnNpb247XG5cdGlmICh2ZXIgPT09IHVuZGVmaW5lZClcblx0XHR2ZXIgPSBrbGFzcy5fb2xkVmVyc2lvbkRldGVjdChvYmopO1xuXHRpZiAodmVyWzBdICE9IG5lZWRWZXJbMF0gfHwgdmVyWzFdIDwgbmVlZFZlclsxXSlcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0cmV0dXJuICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29tcGF0aWJsZShvYmosIGtsYXNzLCBuZWVkVmVyLCBuYW1lKSB7XG5cdGlmIChuYW1lID09PSB1bmRlZmluZWQpXG5cdFx0bmFtZSA9ICdvYmplY3QnO1xuXHRhc3NlcnQub2sob2JqLCBuYW1lICsgJyBtdXN0IG5vdCBiZSBudWxsJyk7XG5cdGFzc2VydC5vYmplY3Qob2JqLCBuYW1lICsgJyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXHRpZiAobmVlZFZlciA9PT0gdW5kZWZpbmVkKVxuXHRcdG5lZWRWZXIgPSBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbjtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIGtsYXNzICYmXG5cdCAgICBrbGFzcy5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvblswXSA9PSBuZWVkVmVyWzBdKVxuXHRcdHJldHVybjtcblx0dmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cdHZhciBkZXB0aCA9IDA7XG5cdHdoaWxlIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lICE9PSBrbGFzcy5uYW1lKSB7XG5cdFx0cHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHRcdGFzc2VydC5vayhwcm90byAmJiArK2RlcHRoIDw9IE1BWF9DTEFTU19ERVBUSCxcblx0XHQgICAgbmFtZSArICcgbXVzdCBiZSBhICcgKyBrbGFzcy5uYW1lICsgJyBpbnN0YW5jZScpO1xuXHR9XG5cdGFzc2VydC5zdHJpY3RFcXVhbChwcm90by5jb25zdHJ1Y3Rvci5uYW1lLCBrbGFzcy5uYW1lLFxuXHQgICAgbmFtZSArICcgbXVzdCBiZSBhICcgKyBrbGFzcy5uYW1lICsgJyBpbnN0YW5jZScpO1xuXHR2YXIgdmVyID0gcHJvdG8uX3NzaHBrQXBpVmVyc2lvbjtcblx0aWYgKHZlciA9PT0gdW5kZWZpbmVkKVxuXHRcdHZlciA9IGtsYXNzLl9vbGRWZXJzaW9uRGV0ZWN0KG9iaik7XG5cdGFzc2VydC5vayh2ZXJbMF0gPT0gbmVlZFZlclswXSAmJiB2ZXJbMV0gPj0gbmVlZFZlclsxXSxcblx0ICAgIG5hbWUgKyAnIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoICcgKyBrbGFzcy5uYW1lICsgJyBrbGFzcyAnICtcblx0ICAgICd2ZXJzaW9uICcgKyBuZWVkVmVyWzBdICsgJy4nICsgbmVlZFZlclsxXSk7XG59XG5cbnZhciBDSVBIRVJfTEVOID0ge1xuXHQnZGVzLWVkZTMtY2JjJzogeyBrZXk6IDI0LCBpdjogOCB9LFxuXHQnYWVzLTEyOC1jYmMnOiB7IGtleTogMTYsIGl2OiAxNiB9LFxuXHQnYWVzLTI1Ni1jYmMnOiB7IGtleTogMzIsIGl2OiAxNiB9XG59O1xudmFyIFBLQ1M1X1NBTFRfTEVOID0gODtcblxuZnVuY3Rpb24gb3BlbnNzbEtleURlcml2KGNpcGhlciwgc2FsdCwgcGFzc3BocmFzZSwgY291bnQpIHtcblx0YXNzZXJ0LmJ1ZmZlcihzYWx0LCAnc2FsdCcpO1xuXHRhc3NlcnQuYnVmZmVyKHBhc3NwaHJhc2UsICdwYXNzcGhyYXNlJyk7XG5cdGFzc2VydC5udW1iZXIoY291bnQsICdpdGVyYXRpb24gY291bnQnKTtcblxuXHR2YXIgY2xlbiA9IENJUEhFUl9MRU5bY2lwaGVyXTtcblx0YXNzZXJ0Lm9iamVjdChjbGVuLCAnc3VwcG9ydGVkIGNpcGhlcicpO1xuXG5cdHNhbHQgPSBzYWx0LnNsaWNlKDAsIFBLQ1M1X1NBTFRfTEVOKTtcblxuXHR2YXIgRCwgRF9wcmV2LCBidWZzO1xuXHR2YXIgbWF0ZXJpYWwgPSBCdWZmZXIuYWxsb2MoMCk7XG5cdHdoaWxlIChtYXRlcmlhbC5sZW5ndGggPCBjbGVuLmtleSArIGNsZW4uaXYpIHtcblx0XHRidWZzID0gW107XG5cdFx0aWYgKERfcHJldilcblx0XHRcdGJ1ZnMucHVzaChEX3ByZXYpO1xuXHRcdGJ1ZnMucHVzaChwYXNzcGhyYXNlKTtcblx0XHRidWZzLnB1c2goc2FsdCk7XG5cdFx0RCA9IEJ1ZmZlci5jb25jYXQoYnVmcyk7XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjb3VudDsgKytqKVxuXHRcdFx0RCA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoRCkuZGlnZXN0KCk7XG5cdFx0bWF0ZXJpYWwgPSBCdWZmZXIuY29uY2F0KFttYXRlcmlhbCwgRF0pO1xuXHRcdERfcHJldiA9IEQ7XG5cdH1cblxuXHRyZXR1cm4gKHtcblx0ICAgIGtleTogbWF0ZXJpYWwuc2xpY2UoMCwgY2xlbi5rZXkpLFxuXHQgICAgaXY6IG1hdGVyaWFsLnNsaWNlKGNsZW4ua2V5LCBjbGVuLmtleSArIGNsZW4uaXYpXG5cdH0pO1xufVxuXG4vKiBTZWU6IFJGQzI4OTggKi9cbmZ1bmN0aW9uIHBia2RmMihoYXNoQWxnLCBzYWx0LCBpdGVyYXRpb25zLCBzaXplLCBwYXNzcGhyYXNlKSB7XG5cdHZhciBoa2V5ID0gQnVmZmVyLmFsbG9jKHNhbHQubGVuZ3RoICsgNCk7XG5cdHNhbHQuY29weShoa2V5KTtcblxuXHR2YXIgZ2VuID0gMCwgdHMgPSBbXTtcblx0dmFyIGkgPSAxO1xuXHR3aGlsZSAoZ2VuIDwgc2l6ZSkge1xuXHRcdHZhciB0ID0gVChpKyspO1xuXHRcdGdlbiArPSB0Lmxlbmd0aDtcblx0XHR0cy5wdXNoKHQpO1xuXHR9XG5cdHJldHVybiAoQnVmZmVyLmNvbmNhdCh0cykuc2xpY2UoMCwgc2l6ZSkpO1xuXG5cdGZ1bmN0aW9uIFQoSSkge1xuXHRcdGhrZXkud3JpdGVVSW50MzJCRShJLCBoa2V5Lmxlbmd0aCAtIDQpO1xuXG5cdFx0dmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYyhoYXNoQWxnLCBwYXNzcGhyYXNlKTtcblx0XHRobWFjLnVwZGF0ZShoa2V5KTtcblxuXHRcdHZhciBUaSA9IGhtYWMuZGlnZXN0KCk7XG5cdFx0dmFyIFVjID0gVGk7XG5cdFx0dmFyIGMgPSAxO1xuXHRcdHdoaWxlIChjKysgPCBpdGVyYXRpb25zKSB7XG5cdFx0XHRobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoaGFzaEFsZywgcGFzc3BocmFzZSk7XG5cdFx0XHRobWFjLnVwZGF0ZShVYyk7XG5cdFx0XHRVYyA9IGhtYWMuZGlnZXN0KCk7XG5cdFx0XHRmb3IgKHZhciB4ID0gMDsgeCA8IFRpLmxlbmd0aDsgKyt4KVxuXHRcdFx0XHRUaVt4XSBePSBVY1t4XTtcblx0XHR9XG5cdFx0cmV0dXJuIChUaSk7XG5cdH1cbn1cblxuLyogQ291bnQgbGVhZGluZyB6ZXJvIGJpdHMgb24gYSBidWZmZXIgKi9cbmZ1bmN0aW9uIGNvdW50WmVyb3MoYnVmKSB7XG5cdHZhciBvID0gMCwgb2JpdCA9IDg7XG5cdHdoaWxlIChvIDwgYnVmLmxlbmd0aCkge1xuXHRcdHZhciBtYXNrID0gKDEgPDwgb2JpdCk7XG5cdFx0aWYgKChidWZbb10gJiBtYXNrKSA9PT0gbWFzaylcblx0XHRcdGJyZWFrO1xuXHRcdG9iaXQtLTtcblx0XHRpZiAob2JpdCA8IDApIHtcblx0XHRcdG8rKztcblx0XHRcdG9iaXQgPSA4O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gKG8qOCArICg4IC0gb2JpdCkgLSAxKTtcbn1cblxuZnVuY3Rpb24gYnVmZmVyU3BsaXQoYnVmLCBjaHIpIHtcblx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHRhc3NlcnQuc3RyaW5nKGNocik7XG5cblx0dmFyIHBhcnRzID0gW107XG5cdHZhciBsYXN0UGFydCA9IDA7XG5cdHZhciBtYXRjaGVzID0gMDtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpIHtcblx0XHRpZiAoYnVmW2ldID09PSBjaHIuY2hhckNvZGVBdChtYXRjaGVzKSlcblx0XHRcdCsrbWF0Y2hlcztcblx0XHRlbHNlIGlmIChidWZbaV0gPT09IGNoci5jaGFyQ29kZUF0KDApKVxuXHRcdFx0bWF0Y2hlcyA9IDE7XG5cdFx0ZWxzZVxuXHRcdFx0bWF0Y2hlcyA9IDA7XG5cblx0XHRpZiAobWF0Y2hlcyA+PSBjaHIubGVuZ3RoKSB7XG5cdFx0XHR2YXIgbmV3UGFydCA9IGkgKyAxO1xuXHRcdFx0cGFydHMucHVzaChidWYuc2xpY2UobGFzdFBhcnQsIG5ld1BhcnQgLSBtYXRjaGVzKSk7XG5cdFx0XHRsYXN0UGFydCA9IG5ld1BhcnQ7XG5cdFx0XHRtYXRjaGVzID0gMDtcblx0XHR9XG5cdH1cblx0aWYgKGxhc3RQYXJ0IDw9IGJ1Zi5sZW5ndGgpXG5cdFx0cGFydHMucHVzaChidWYuc2xpY2UobGFzdFBhcnQsIGJ1Zi5sZW5ndGgpKTtcblxuXHRyZXR1cm4gKHBhcnRzKTtcbn1cblxuZnVuY3Rpb24gZWNOb3JtYWxpemUoYnVmLCBhZGRaZXJvKSB7XG5cdGFzc2VydC5idWZmZXIoYnVmKTtcblx0aWYgKGJ1ZlswXSA9PT0gMHgwMCAmJiBidWZbMV0gPT09IDB4MDQpIHtcblx0XHRpZiAoYWRkWmVybylcblx0XHRcdHJldHVybiAoYnVmKTtcblx0XHRyZXR1cm4gKGJ1Zi5zbGljZSgxKSk7XG5cdH0gZWxzZSBpZiAoYnVmWzBdID09PSAweDA0KSB7XG5cdFx0aWYgKCFhZGRaZXJvKVxuXHRcdFx0cmV0dXJuIChidWYpO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlIChidWZbMF0gPT09IDB4MDApXG5cdFx0XHRidWYgPSBidWYuc2xpY2UoMSk7XG5cdFx0aWYgKGJ1ZlswXSA9PT0gMHgwMiB8fCBidWZbMF0gPT09IDB4MDMpXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdDb21wcmVzc2VkIGVsbGlwdGljIGN1cnZlIHBvaW50cyAnICtcblx0XHRcdCAgICAnYXJlIG5vdCBzdXBwb3J0ZWQnKSk7XG5cdFx0aWYgKGJ1ZlswXSAhPT0gMHgwNClcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIGVsbGlwdGljIGN1cnZlIHBvaW50JykpO1xuXHRcdGlmICghYWRkWmVybylcblx0XHRcdHJldHVybiAoYnVmKTtcblx0fVxuXHR2YXIgYiA9IEJ1ZmZlci5hbGxvYyhidWYubGVuZ3RoICsgMSk7XG5cdGJbMF0gPSAweDA7XG5cdGJ1Zi5jb3B5KGIsIDEpO1xuXHRyZXR1cm4gKGIpO1xufVxuXG5mdW5jdGlvbiByZWFkQml0U3RyaW5nKGRlciwgdGFnKSB7XG5cdGlmICh0YWcgPT09IHVuZGVmaW5lZClcblx0XHR0YWcgPSBhc24xLkJlci5CaXRTdHJpbmc7XG5cdHZhciBidWYgPSBkZXIucmVhZFN0cmluZyh0YWcsIHRydWUpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwoYnVmWzBdLCAweDAwLCAnYml0IHN0cmluZ3Mgd2l0aCB1bnVzZWQgYml0cyBhcmUgJyArXG5cdCAgICAnbm90IHN1cHBvcnRlZCAoMHgnICsgYnVmWzBdLnRvU3RyaW5nKDE2KSArICcpJyk7XG5cdHJldHVybiAoYnVmLnNsaWNlKDEpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaXRTdHJpbmcoZGVyLCBidWYsIHRhZykge1xuXHRpZiAodGFnID09PSB1bmRlZmluZWQpXG5cdFx0dGFnID0gYXNuMS5CZXIuQml0U3RyaW5nO1xuXHR2YXIgYiA9IEJ1ZmZlci5hbGxvYyhidWYubGVuZ3RoICsgMSk7XG5cdGJbMF0gPSAweDAwO1xuXHRidWYuY29weShiLCAxKTtcblx0ZGVyLndyaXRlQnVmZmVyKGIsIHRhZyk7XG59XG5cbmZ1bmN0aW9uIG1wTm9ybWFsaXplKGJ1Zikge1xuXHRhc3NlcnQuYnVmZmVyKGJ1Zik7XG5cdHdoaWxlIChidWYubGVuZ3RoID4gMSAmJiBidWZbMF0gPT09IDB4MDAgJiYgKGJ1ZlsxXSAmIDB4ODApID09PSAweDAwKVxuXHRcdGJ1ZiA9IGJ1Zi5zbGljZSgxKTtcblx0aWYgKChidWZbMF0gJiAweDgwKSA9PT0gMHg4MCkge1xuXHRcdHZhciBiID0gQnVmZmVyLmFsbG9jKGJ1Zi5sZW5ndGggKyAxKTtcblx0XHRiWzBdID0gMHgwMDtcblx0XHRidWYuY29weShiLCAxKTtcblx0XHRidWYgPSBiO1xuXHR9XG5cdHJldHVybiAoYnVmKTtcbn1cblxuZnVuY3Rpb24gbXBEZW5vcm1hbGl6ZShidWYpIHtcblx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHR3aGlsZSAoYnVmLmxlbmd0aCA+IDEgJiYgYnVmWzBdID09PSAweDAwKVxuXHRcdGJ1ZiA9IGJ1Zi5zbGljZSgxKTtcblx0cmV0dXJuIChidWYpO1xufVxuXG5mdW5jdGlvbiB6ZXJvUGFkVG9MZW5ndGgoYnVmLCBsZW4pIHtcblx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHRhc3NlcnQubnVtYmVyKGxlbik7XG5cdHdoaWxlIChidWYubGVuZ3RoID4gbGVuKSB7XG5cdFx0YXNzZXJ0LmVxdWFsKGJ1ZlswXSwgMHgwMCk7XG5cdFx0YnVmID0gYnVmLnNsaWNlKDEpO1xuXHR9XG5cdHdoaWxlIChidWYubGVuZ3RoIDwgbGVuKSB7XG5cdFx0dmFyIGIgPSBCdWZmZXIuYWxsb2MoYnVmLmxlbmd0aCArIDEpO1xuXHRcdGJbMF0gPSAweDAwO1xuXHRcdGJ1Zi5jb3B5KGIsIDEpO1xuXHRcdGJ1ZiA9IGI7XG5cdH1cblx0cmV0dXJuIChidWYpO1xufVxuXG5mdW5jdGlvbiBiaWdpbnRUb01wQnVmKGJpZ2ludCkge1xuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20oYmlnaW50LnRvQnl0ZUFycmF5KCkpO1xuXHRidWYgPSBtcE5vcm1hbGl6ZShidWYpO1xuXHRyZXR1cm4gKGJ1Zik7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZURTQVB1YmxpYyhnLCBwLCB4KSB7XG5cdGFzc2VydC5idWZmZXIoZyk7XG5cdGFzc2VydC5idWZmZXIocCk7XG5cdGFzc2VydC5idWZmZXIoeCk7XG5cdGcgPSBuZXcganNibihnKTtcblx0cCA9IG5ldyBqc2JuKHApO1xuXHR4ID0gbmV3IGpzYm4oeCk7XG5cdHZhciB5ID0gZy5tb2RQb3coeCwgcCk7XG5cdHZhciB5YnVmID0gYmlnaW50VG9NcEJ1Zih5KTtcblx0cmV0dXJuICh5YnVmKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlRUQyNTUxOVB1YmxpYyhrKSB7XG5cdGFzc2VydC5idWZmZXIoayk7XG5cblx0dmFyIGtwID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQobmV3IFVpbnQ4QXJyYXkoaykpO1xuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKGtwLnB1YmxpY0tleSkpO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVYMjU1MTlQdWJsaWMoaykge1xuXHRhc3NlcnQuYnVmZmVyKGspO1xuXG5cdHZhciBrcCA9IG5hY2wuYm94LmtleVBhaXIuZnJvbVNlZWQobmV3IFVpbnQ4QXJyYXkoaykpO1xuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKGtwLnB1YmxpY0tleSkpO1xufVxuXG5mdW5jdGlvbiBhZGRSU0FNaXNzaW5nKGtleSkge1xuXHRhc3NlcnQub2JqZWN0KGtleSk7XG5cdGFzc2VydENvbXBhdGlibGUoa2V5LCBQcml2YXRlS2V5LCBbMSwgMV0pO1xuXG5cdHZhciBkID0gbmV3IGpzYm4oa2V5LnBhcnQuZC5kYXRhKTtcblx0dmFyIGJ1ZjtcblxuXHRpZiAoIWtleS5wYXJ0LmRtb2RwKSB7XG5cdFx0dmFyIHAgPSBuZXcganNibihrZXkucGFydC5wLmRhdGEpO1xuXHRcdHZhciBkbW9kcCA9IGQubW9kKHAuc3VidHJhY3QoMSkpO1xuXG5cdFx0YnVmID0gYmlnaW50VG9NcEJ1ZihkbW9kcCk7XG5cdFx0a2V5LnBhcnQuZG1vZHAgPSB7bmFtZTogJ2Rtb2RwJywgZGF0YTogYnVmfTtcblx0XHRrZXkucGFydHMucHVzaChrZXkucGFydC5kbW9kcCk7XG5cdH1cblx0aWYgKCFrZXkucGFydC5kbW9kcSkge1xuXHRcdHZhciBxID0gbmV3IGpzYm4oa2V5LnBhcnQucS5kYXRhKTtcblx0XHR2YXIgZG1vZHEgPSBkLm1vZChxLnN1YnRyYWN0KDEpKTtcblxuXHRcdGJ1ZiA9IGJpZ2ludFRvTXBCdWYoZG1vZHEpO1xuXHRcdGtleS5wYXJ0LmRtb2RxID0ge25hbWU6ICdkbW9kcScsIGRhdGE6IGJ1Zn07XG5cdFx0a2V5LnBhcnRzLnB1c2goa2V5LnBhcnQuZG1vZHEpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHB1YmxpY0Zyb21Qcml2YXRlRUNEU0EoY3VydmVOYW1lLCBwcml2KSB7XG5cdGFzc2VydC5zdHJpbmcoY3VydmVOYW1lLCAnY3VydmVOYW1lJyk7XG5cdGFzc2VydC5idWZmZXIocHJpdik7XG5cdHZhciBwYXJhbXMgPSBhbGdzLmN1cnZlc1tjdXJ2ZU5hbWVdO1xuXHR2YXIgcCA9IG5ldyBqc2JuKHBhcmFtcy5wKTtcblx0dmFyIGEgPSBuZXcganNibihwYXJhbXMuYSk7XG5cdHZhciBiID0gbmV3IGpzYm4ocGFyYW1zLmIpO1xuXHR2YXIgY3VydmUgPSBuZXcgZWMuRUNDdXJ2ZUZwKHAsIGEsIGIpO1xuXHR2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KHBhcmFtcy5HLnRvU3RyaW5nKCdoZXgnKSk7XG5cblx0dmFyIGQgPSBuZXcganNibihtcE5vcm1hbGl6ZShwcml2KSk7XG5cdHZhciBwdWIgPSBHLm11bHRpcGx5KGQpO1xuXHRwdWIgPSBCdWZmZXIuZnJvbShjdXJ2ZS5lbmNvZGVQb2ludEhleChwdWIpLCAnaGV4Jyk7XG5cblx0dmFyIHBhcnRzID0gW107XG5cdHBhcnRzLnB1c2goe25hbWU6ICdjdXJ2ZScsIGRhdGE6IEJ1ZmZlci5mcm9tKGN1cnZlTmFtZSl9KTtcblx0cGFydHMucHVzaCh7bmFtZTogJ1EnLCBkYXRhOiBwdWJ9KTtcblxuXHR2YXIga2V5ID0gbmV3IEtleSh7dHlwZTogJ2VjZHNhJywgY3VydmU6IGN1cnZlLCBwYXJ0czogcGFydHN9KTtcblx0cmV0dXJuIChrZXkpO1xufVxuXG5mdW5jdGlvbiBvcGVuc3NoQ2lwaGVySW5mbyhjaXBoZXIpIHtcblx0dmFyIGluZiA9IHt9O1xuXHRzd2l0Y2ggKGNpcGhlcikge1xuXHRjYXNlICczZGVzLWNiYyc6XG5cdFx0aW5mLmtleVNpemUgPSAyNDtcblx0XHRpbmYuYmxvY2tTaXplID0gODtcblx0XHRpbmYub3BlbnNzbE5hbWUgPSAnZGVzLWVkZTMtY2JjJztcblx0XHRicmVhaztcblx0Y2FzZSAnYmxvd2Zpc2gtY2JjJzpcblx0XHRpbmYua2V5U2l6ZSA9IDE2O1xuXHRcdGluZi5ibG9ja1NpemUgPSA4O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdiZi1jYmMnO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdhZXMxMjgtY2JjJzpcblx0Y2FzZSAnYWVzMTI4LWN0cic6XG5cdGNhc2UgJ2FlczEyOC1nY21Ab3BlbnNzaC5jb20nOlxuXHRcdGluZi5rZXlTaXplID0gMTY7XG5cdFx0aW5mLmJsb2NrU2l6ZSA9IDE2O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdhZXMtMTI4LScgKyBjaXBoZXIuc2xpY2UoNywgMTApO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdhZXMxOTItY2JjJzpcblx0Y2FzZSAnYWVzMTkyLWN0cic6XG5cdGNhc2UgJ2FlczE5Mi1nY21Ab3BlbnNzaC5jb20nOlxuXHRcdGluZi5rZXlTaXplID0gMjQ7XG5cdFx0aW5mLmJsb2NrU2l6ZSA9IDE2O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdhZXMtMTkyLScgKyBjaXBoZXIuc2xpY2UoNywgMTApO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdhZXMyNTYtY2JjJzpcblx0Y2FzZSAnYWVzMjU2LWN0cic6XG5cdGNhc2UgJ2FlczI1Ni1nY21Ab3BlbnNzaC5jb20nOlxuXHRcdGluZi5rZXlTaXplID0gMzI7XG5cdFx0aW5mLmJsb2NrU2l6ZSA9IDE2O1xuXHRcdGluZi5vcGVuc3NsTmFtZSA9ICdhZXMtMjU2LScgKyBjaXBoZXIuc2xpY2UoNywgMTApO1xuXHRcdGJyZWFrO1xuXHRkZWZhdWx0OlxuXHRcdHRocm93IChuZXcgRXJyb3IoXG5cdFx0ICAgICdVbnN1cHBvcnRlZCBvcGVuc3NsIGNpcGhlciBcIicgKyBjaXBoZXIgKyAnXCInKSk7XG5cdH1cblx0cmV0dXJuIChpbmYpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFNTSEJ1ZmZlcjtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBTU0hCdWZmZXIob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKVxuXHRcdGFzc2VydC5idWZmZXIob3B0cy5idWZmZXIsICdvcHRpb25zLmJ1ZmZlcicpO1xuXG5cdHRoaXMuX3NpemUgPSBvcHRzLmJ1ZmZlciA/IG9wdHMuYnVmZmVyLmxlbmd0aCA6IDEwMjQ7XG5cdHRoaXMuX2J1ZmZlciA9IG9wdHMuYnVmZmVyIHx8IEJ1ZmZlci5hbGxvYyh0aGlzLl9zaXplKTtcblx0dGhpcy5fb2Zmc2V0ID0gMDtcbn1cblxuU1NIQnVmZmVyLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh0aGlzLl9idWZmZXIuc2xpY2UoMCwgdGhpcy5fb2Zmc2V0KSk7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLmF0RW5kID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gKHRoaXMuX29mZnNldCA+PSB0aGlzLl9idWZmZXIubGVuZ3RoKTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUucmVtYWluZGVyID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gKHRoaXMuX2J1ZmZlci5zbGljZSh0aGlzLl9vZmZzZXQpKTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIChuKSB7XG5cdHRoaXMuX29mZnNldCArPSBuO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuX3NpemUgKj0gMjtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyh0aGlzLl9zaXplKTtcblx0dGhpcy5fYnVmZmVyLmNvcHkoYnVmLCAwKTtcblx0dGhpcy5fYnVmZmVyID0gYnVmO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS5yZWFkUGFydCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh7ZGF0YTogdGhpcy5yZWFkQnVmZmVyKCl9KTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUucmVhZEJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGxlbiA9IHRoaXMuX2J1ZmZlci5yZWFkVUludDMyQkUodGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IDQ7XG5cdGFzc2VydC5vayh0aGlzLl9vZmZzZXQgKyBsZW4gPD0gdGhpcy5fYnVmZmVyLmxlbmd0aCxcblx0ICAgICdsZW5ndGggb3V0IG9mIGJvdW5kcyBhdCArMHgnICsgdGhpcy5fb2Zmc2V0LnRvU3RyaW5nKDE2KSArXG5cdCAgICAnIChkYXRhIHRydW5jYXRlZD8pJyk7XG5cdHZhciBidWYgPSB0aGlzLl9idWZmZXIuc2xpY2UodGhpcy5fb2Zmc2V0LCB0aGlzLl9vZmZzZXQgKyBsZW4pO1xuXHR0aGlzLl9vZmZzZXQgKz0gbGVuO1xuXHRyZXR1cm4gKGJ1Zik7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiAodGhpcy5yZWFkQnVmZmVyKCkudG9TdHJpbmcoKSk7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLnJlYWRDU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuXHR3aGlsZSAob2Zmc2V0IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCAmJlxuXHQgICAgdGhpcy5fYnVmZmVyW29mZnNldF0gIT09IDB4MDApXG5cdFx0b2Zmc2V0Kys7XG5cdGFzc2VydC5vayhvZmZzZXQgPCB0aGlzLl9idWZmZXIubGVuZ3RoLCAnYyBzdHJpbmcgZG9lcyBub3QgdGVybWluYXRlJyk7XG5cdHZhciBzdHIgPSB0aGlzLl9idWZmZXIuc2xpY2UodGhpcy5fb2Zmc2V0LCBvZmZzZXQpLnRvU3RyaW5nKCk7XG5cdHRoaXMuX29mZnNldCA9IG9mZnNldCArIDE7XG5cdHJldHVybiAoc3RyKTtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUucmVhZEludCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHYgPSB0aGlzLl9idWZmZXIucmVhZFVJbnQzMkJFKHRoaXMuX29mZnNldCk7XG5cdHRoaXMuX29mZnNldCArPSA0O1xuXHRyZXR1cm4gKHYpO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50NjQgPSBmdW5jdGlvbiAoKSB7XG5cdGFzc2VydC5vayh0aGlzLl9vZmZzZXQgKyA4IDwgdGhpcy5fYnVmZmVyLmxlbmd0aCxcblx0ICAgICdidWZmZXIgbm90IGxvbmcgZW5vdWdoIHRvIHJlYWQgSW50NjQnKTtcblx0dmFyIHYgPSB0aGlzLl9idWZmZXIuc2xpY2UodGhpcy5fb2Zmc2V0LCB0aGlzLl9vZmZzZXQgKyA4KTtcblx0dGhpcy5fb2Zmc2V0ICs9IDg7XG5cdHJldHVybiAodik7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLnJlYWRDaGFyID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgdiA9IHRoaXMuX2J1ZmZlclt0aGlzLl9vZmZzZXQrK107XG5cdHJldHVybiAodik7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLndyaXRlQnVmZmVyID0gZnVuY3Rpb24gKGJ1Zikge1xuXHR3aGlsZSAodGhpcy5fb2Zmc2V0ICsgNCArIGJ1Zi5sZW5ndGggPiB0aGlzLl9zaXplKVxuXHRcdHRoaXMuZXhwYW5kKCk7XG5cdHRoaXMuX2J1ZmZlci53cml0ZVVJbnQzMkJFKGJ1Zi5sZW5ndGgsIHRoaXMuX29mZnNldCk7XG5cdHRoaXMuX29mZnNldCArPSA0O1xuXHRidWYuY29weSh0aGlzLl9idWZmZXIsIHRoaXMuX29mZnNldCk7XG5cdHRoaXMuX29mZnNldCArPSBidWYubGVuZ3RoO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uIChzdHIpIHtcblx0dGhpcy53cml0ZUJ1ZmZlcihCdWZmZXIuZnJvbShzdHIsICd1dGY4JykpO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZUNTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdHdoaWxlICh0aGlzLl9vZmZzZXQgKyAxICsgc3RyLmxlbmd0aCA+IHRoaXMuX3NpemUpXG5cdFx0dGhpcy5leHBhbmQoKTtcblx0dGhpcy5fYnVmZmVyLndyaXRlKHN0ciwgdGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IHN0ci5sZW5ndGg7XG5cdHRoaXMuX2J1ZmZlclt0aGlzLl9vZmZzZXQrK10gPSAwO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZUludCA9IGZ1bmN0aW9uICh2KSB7XG5cdHdoaWxlICh0aGlzLl9vZmZzZXQgKyA0ID4gdGhpcy5fc2l6ZSlcblx0XHR0aGlzLmV4cGFuZCgpO1xuXHR0aGlzLl9idWZmZXIud3JpdGVVSW50MzJCRSh2LCB0aGlzLl9vZmZzZXQpO1xuXHR0aGlzLl9vZmZzZXQgKz0gNDtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ2NCA9IGZ1bmN0aW9uICh2KSB7XG5cdGFzc2VydC5idWZmZXIodiwgJ3ZhbHVlJyk7XG5cdGlmICh2Lmxlbmd0aCA+IDgpIHtcblx0XHR2YXIgbGVhZCA9IHYuc2xpY2UoMCwgdi5sZW5ndGggLSA4KTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlYWQubGVuZ3RoOyArK2kpIHtcblx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbChsZWFkW2ldLCAwLFxuXHRcdFx0ICAgICdtdXN0IGZpdCBpbiA2NCBiaXRzIG9mIHByZWNpc2lvbicpO1xuXHRcdH1cblx0XHR2ID0gdi5zbGljZSh2Lmxlbmd0aCAtIDgsIHYubGVuZ3RoKTtcblx0fVxuXHR3aGlsZSAodGhpcy5fb2Zmc2V0ICsgOCA+IHRoaXMuX3NpemUpXG5cdFx0dGhpcy5leHBhbmQoKTtcblx0di5jb3B5KHRoaXMuX2J1ZmZlciwgdGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IDg7XG59O1xuXG5TU0hCdWZmZXIucHJvdG90eXBlLndyaXRlQ2hhciA9IGZ1bmN0aW9uICh2KSB7XG5cdHdoaWxlICh0aGlzLl9vZmZzZXQgKyAxID4gdGhpcy5fc2l6ZSlcblx0XHR0aGlzLmV4cGFuZCgpO1xuXHR0aGlzLl9idWZmZXJbdGhpcy5fb2Zmc2V0KytdID0gdjtcbn07XG5cblNTSEJ1ZmZlci5wcm90b3R5cGUud3JpdGVQYXJ0ID0gZnVuY3Rpb24gKHApIHtcblx0dGhpcy53cml0ZUJ1ZmZlcihwLmRhdGEpO1xufTtcblxuU1NIQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcblx0d2hpbGUgKHRoaXMuX29mZnNldCArIGJ1Zi5sZW5ndGggPiB0aGlzLl9zaXplKVxuXHRcdHRoaXMuZXhwYW5kKCk7XG5cdGJ1Zi5jb3B5KHRoaXMuX2J1ZmZlciwgdGhpcy5fb2Zmc2V0KTtcblx0dGhpcy5fb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBlcnJzID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xudmFyIFNTSEJ1ZmZlciA9IHJlcXVpcmUoJy4vc3NoLWJ1ZmZlcicpO1xuXG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gZXJycy5JbnZhbGlkQWxnb3JpdGhtRXJyb3I7XG52YXIgU2lnbmF0dXJlUGFyc2VFcnJvciA9IGVycnMuU2lnbmF0dXJlUGFyc2VFcnJvcjtcblxuZnVuY3Rpb24gU2lnbmF0dXJlKG9wdHMpIHtcblx0YXNzZXJ0Lm9iamVjdChvcHRzLCAnb3B0aW9ucycpO1xuXHRhc3NlcnQuYXJyYXlPZk9iamVjdChvcHRzLnBhcnRzLCAnb3B0aW9ucy5wYXJ0cycpO1xuXHRhc3NlcnQuc3RyaW5nKG9wdHMudHlwZSwgJ29wdGlvbnMudHlwZScpO1xuXG5cdHZhciBwYXJ0TG9va3VwID0ge307XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgb3B0cy5wYXJ0cy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBwYXJ0ID0gb3B0cy5wYXJ0c1tpXTtcblx0XHRwYXJ0TG9va3VwW3BhcnQubmFtZV0gPSBwYXJ0O1xuXHR9XG5cblx0dGhpcy50eXBlID0gb3B0cy50eXBlO1xuXHR0aGlzLmhhc2hBbGdvcml0aG0gPSBvcHRzLmhhc2hBbGdvO1xuXHR0aGlzLmN1cnZlID0gb3B0cy5jdXJ2ZTtcblx0dGhpcy5wYXJ0cyA9IG9wdHMucGFydHM7XG5cdHRoaXMucGFydCA9IHBhcnRMb29rdXA7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG5cdGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZClcblx0XHRmb3JtYXQgPSAnYXNuMSc7XG5cdGFzc2VydC5zdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cblx0dmFyIGJ1Zjtcblx0dmFyIHN0eXBlID0gJ3NzaC0nICsgdGhpcy50eXBlO1xuXG5cdHN3aXRjaCAodGhpcy50eXBlKSB7XG5cdGNhc2UgJ3JzYSc6XG5cdFx0c3dpdGNoICh0aGlzLmhhc2hBbGdvcml0aG0pIHtcblx0XHRjYXNlICdzaGEyNTYnOlxuXHRcdFx0c3R5cGUgPSAncnNhLXNoYTItMjU2Jztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ3NoYTUxMic6XG5cdFx0XHRzdHlwZSA9ICdyc2Etc2hhMi01MTInO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnc2hhMSc6XG5cdFx0Y2FzZSB1bmRlZmluZWQ6XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignU1NIIHNpZ25hdHVyZSAnICtcblx0XHRcdCAgICAnZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgaGFzaCAnICtcblx0XHRcdCAgICAnYWxnb3JpdGhtICcgKyB0aGlzLmhhc2hBbGdvcml0aG0pKTtcblx0XHR9XG5cdFx0aWYgKGZvcm1hdCA9PT0gJ3NzaCcpIHtcblx0XHRcdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe30pO1xuXHRcdFx0YnVmLndyaXRlU3RyaW5nKHN0eXBlKTtcblx0XHRcdGJ1Zi53cml0ZVBhcnQodGhpcy5wYXJ0LnNpZyk7XG5cdFx0XHRyZXR1cm4gKGJ1Zi50b0J1ZmZlcigpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuICh0aGlzLnBhcnQuc2lnLmRhdGEpO1xuXHRcdH1cblx0XHRicmVhaztcblxuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRpZiAoZm9ybWF0ID09PSAnc3NoJykge1xuXHRcdFx0YnVmID0gbmV3IFNTSEJ1ZmZlcih7fSk7XG5cdFx0XHRidWYud3JpdGVTdHJpbmcoc3R5cGUpO1xuXHRcdFx0YnVmLndyaXRlUGFydCh0aGlzLnBhcnQuc2lnKTtcblx0XHRcdHJldHVybiAoYnVmLnRvQnVmZmVyKCkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gKHRoaXMucGFydC5zaWcuZGF0YSk7XG5cdFx0fVxuXHRcdGJyZWFrO1xuXG5cdGNhc2UgJ2RzYSc6XG5cdGNhc2UgJ2VjZHNhJzpcblx0XHR2YXIgciwgcztcblx0XHRpZiAoZm9ybWF0ID09PSAnYXNuMScpIHtcblx0XHRcdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRyID0gdXRpbHMubXBOb3JtYWxpemUodGhpcy5wYXJ0LnIuZGF0YSk7XG5cdFx0XHRzID0gdXRpbHMubXBOb3JtYWxpemUodGhpcy5wYXJ0LnMuZGF0YSk7XG5cdFx0XHRkZXIud3JpdGVCdWZmZXIociwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdFx0XHRkZXIud3JpdGVCdWZmZXIocywgYXNuMS5CZXIuSW50ZWdlcik7XG5cdFx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRcdHJldHVybiAoZGVyLmJ1ZmZlcik7XG5cdFx0fSBlbHNlIGlmIChmb3JtYXQgPT09ICdzc2gnICYmIHRoaXMudHlwZSA9PT0gJ2RzYScpIHtcblx0XHRcdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe30pO1xuXHRcdFx0YnVmLndyaXRlU3RyaW5nKCdzc2gtZHNzJyk7XG5cdFx0XHRyID0gdGhpcy5wYXJ0LnIuZGF0YTtcblx0XHRcdGlmIChyLmxlbmd0aCA+IDIwICYmIHJbMF0gPT09IDB4MDApXG5cdFx0XHRcdHIgPSByLnNsaWNlKDEpO1xuXHRcdFx0cyA9IHRoaXMucGFydC5zLmRhdGE7XG5cdFx0XHRpZiAocy5sZW5ndGggPiAyMCAmJiBzWzBdID09PSAweDAwKVxuXHRcdFx0XHRzID0gcy5zbGljZSgxKTtcblx0XHRcdGlmICgodGhpcy5oYXNoQWxnb3JpdGhtICYmXG5cdFx0XHQgICAgdGhpcy5oYXNoQWxnb3JpdGhtICE9PSAnc2hhMScpIHx8XG5cdFx0XHQgICAgci5sZW5ndGggKyBzLmxlbmd0aCAhPT0gNDApIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBFcnJvcignT3BlblNTSCBvbmx5IHN1cHBvcnRzICcgK1xuXHRcdFx0XHQgICAgJ0RTQSBzaWduYXR1cmVzIHdpdGggU0hBMSBoYXNoJykpO1xuXHRcdFx0fVxuXHRcdFx0YnVmLndyaXRlQnVmZmVyKEJ1ZmZlci5jb25jYXQoW3IsIHNdKSk7XG5cdFx0XHRyZXR1cm4gKGJ1Zi50b0J1ZmZlcigpKTtcblx0XHR9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ3NzaCcgJiYgdGhpcy50eXBlID09PSAnZWNkc2EnKSB7XG5cdFx0XHR2YXIgaW5uZXIgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0XHRcdHIgPSB0aGlzLnBhcnQuci5kYXRhO1xuXHRcdFx0aW5uZXIud3JpdGVCdWZmZXIocik7XG5cdFx0XHRpbm5lci53cml0ZVBhcnQodGhpcy5wYXJ0LnMpO1xuXG5cdFx0XHRidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0XHRcdC8qIFhYWDogZmluZCBhIG1vcmUgcHJvcGVyIHdheSB0byBkbyB0aGlzPyAqL1xuXHRcdFx0dmFyIGN1cnZlO1xuXHRcdFx0aWYgKHJbMF0gPT09IDB4MDApXG5cdFx0XHRcdHIgPSByLnNsaWNlKDEpO1xuXHRcdFx0dmFyIHN6ID0gci5sZW5ndGggKiA4O1xuXHRcdFx0aWYgKHN6ID09PSAyNTYpXG5cdFx0XHRcdGN1cnZlID0gJ25pc3RwMjU2Jztcblx0XHRcdGVsc2UgaWYgKHN6ID09PSAzODQpXG5cdFx0XHRcdGN1cnZlID0gJ25pc3RwMzg0Jztcblx0XHRcdGVsc2UgaWYgKHN6ID09PSA1MjgpXG5cdFx0XHRcdGN1cnZlID0gJ25pc3RwNTIxJztcblx0XHRcdGJ1Zi53cml0ZVN0cmluZygnZWNkc2Etc2hhMi0nICsgY3VydmUpO1xuXHRcdFx0YnVmLndyaXRlQnVmZmVyKGlubmVyLnRvQnVmZmVyKCkpO1xuXHRcdFx0cmV0dXJuIChidWYudG9CdWZmZXIoKSk7XG5cdFx0fVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIGZvcm1hdCcpKTtcblx0ZGVmYXVsdDpcblx0XHR0aHJvdyAobmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBkYXRhJykpO1xuXHR9XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cdHJldHVybiAodGhpcy50b0J1ZmZlcihmb3JtYXQpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG59O1xuXG5TaWduYXR1cmUucGFyc2UgPSBmdW5jdGlvbiAoZGF0YSwgdHlwZSwgZm9ybWF0KSB7XG5cdGlmICh0eXBlb2YgKGRhdGEpID09PSAnc3RyaW5nJylcblx0XHRkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpO1xuXHRhc3NlcnQuYnVmZmVyKGRhdGEsICdkYXRhJyk7XG5cdGFzc2VydC5zdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cdGFzc2VydC5zdHJpbmcodHlwZSwgJ3R5cGUnKTtcblxuXHR2YXIgb3B0cyA9IHt9O1xuXHRvcHRzLnR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG5cdG9wdHMucGFydHMgPSBbXTtcblxuXHR0cnkge1xuXHRcdGFzc2VydC5vayhkYXRhLmxlbmd0aCA+IDAsICdzaWduYXR1cmUgbXVzdCBub3QgYmUgZW1wdHknKTtcblx0XHRzd2l0Y2ggKG9wdHMudHlwZSkge1xuXHRcdGNhc2UgJ3JzYSc6XG5cdFx0XHRyZXR1cm4gKHBhcnNlT25lTnVtKGRhdGEsIHR5cGUsIGZvcm1hdCwgb3B0cykpO1xuXHRcdGNhc2UgJ2VkMjU1MTknOlxuXHRcdFx0cmV0dXJuIChwYXJzZU9uZU51bShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpKTtcblxuXHRcdGNhc2UgJ2RzYSc6XG5cdFx0Y2FzZSAnZWNkc2EnOlxuXHRcdFx0aWYgKGZvcm1hdCA9PT0gJ2FzbjEnKVxuXHRcdFx0XHRyZXR1cm4gKHBhcnNlRFNBYXNuMShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpKTtcblx0XHRcdGVsc2UgaWYgKG9wdHMudHlwZSA9PT0gJ2RzYScpXG5cdFx0XHRcdHJldHVybiAocGFyc2VEU0EoZGF0YSwgdHlwZSwgZm9ybWF0LCBvcHRzKSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiAocGFyc2VFQ0RTQShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpKTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcih0eXBlKSk7XG5cdFx0fVxuXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAoZSBpbnN0YW5jZW9mIEludmFsaWRBbGdvcml0aG1FcnJvcilcblx0XHRcdHRocm93IChlKTtcblx0XHR0aHJvdyAobmV3IFNpZ25hdHVyZVBhcnNlRXJyb3IodHlwZSwgZm9ybWF0LCBlKSk7XG5cdH1cbn07XG5cbmZ1bmN0aW9uIHBhcnNlT25lTnVtKGRhdGEsIHR5cGUsIGZvcm1hdCwgb3B0cykge1xuXHRpZiAoZm9ybWF0ID09PSAnc3NoJykge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgYnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBkYXRhfSk7XG5cdFx0XHR2YXIgaGVhZCA9IGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0LyogZmFsbCB0aHJvdWdoICovXG5cdFx0fVxuXHRcdGlmIChidWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFyIG1zZyA9ICdTU0ggc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICcgK1xuXHRcdFx0ICAgICd0eXBlIChleHBlY3RlZCAnICsgdHlwZSArICcsIGdvdCAnICsgaGVhZCArICcpJztcblx0XHRcdHN3aXRjaCAoaGVhZCkge1xuXHRcdFx0Y2FzZSAnc3NoLXJzYSc6XG5cdFx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCAncnNhJywgbXNnKTtcblx0XHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGExJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyc2Etc2hhMi0yNTYnOlxuXHRcdFx0XHRhc3NlcnQuc3RyaWN0RXF1YWwodHlwZSwgJ3JzYScsIG1zZyk7XG5cdFx0XHRcdG9wdHMuaGFzaEFsZ28gPSAnc2hhMjU2Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdyc2Etc2hhMi01MTInOlxuXHRcdFx0XHRhc3NlcnQuc3RyaWN0RXF1YWwodHlwZSwgJ3JzYScsIG1zZyk7XG5cdFx0XHRcdG9wdHMuaGFzaEFsZ28gPSAnc2hhNTEyJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzc2gtZWQyNTUxOSc6XG5cdFx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCAnZWQyNTUxOScsIG1zZyk7XG5cdFx0XHRcdG9wdHMuaGFzaEFsZ28gPSAnc2hhNTEyJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIFNTSCBzaWduYXR1cmUgJyArXG5cdFx0XHRcdCAgICAndHlwZTogJyArIGhlYWQpKTtcblx0XHRcdH1cblx0XHRcdHZhciBzaWcgPSBidWYucmVhZFBhcnQoKTtcblx0XHRcdGFzc2VydC5vayhidWYuYXRFbmQoKSwgJ2V4dHJhIHRyYWlsaW5nIGJ5dGVzJyk7XG5cdFx0XHRzaWcubmFtZSA9ICdzaWcnO1xuXHRcdFx0b3B0cy5wYXJ0cy5wdXNoKHNpZyk7XG5cdFx0XHRyZXR1cm4gKG5ldyBTaWduYXR1cmUob3B0cykpO1xuXHRcdH1cblx0fVxuXHRvcHRzLnBhcnRzLnB1c2goe25hbWU6ICdzaWcnLCBkYXRhOiBkYXRhfSk7XG5cdHJldHVybiAobmV3IFNpZ25hdHVyZShvcHRzKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRFNBYXNuMShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpIHtcblx0dmFyIGRlciA9IG5ldyBhc24xLkJlclJlYWRlcihkYXRhKTtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHR2YXIgciA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkludGVnZXIsIHRydWUpO1xuXHR2YXIgcyA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkludGVnZXIsIHRydWUpO1xuXG5cdG9wdHMucGFydHMucHVzaCh7bmFtZTogJ3InLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShyKX0pO1xuXHRvcHRzLnBhcnRzLnB1c2goe25hbWU6ICdzJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocyl9KTtcblxuXHRyZXR1cm4gKG5ldyBTaWduYXR1cmUob3B0cykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZURTQShkYXRhLCB0eXBlLCBmb3JtYXQsIG9wdHMpIHtcblx0aWYgKGRhdGEubGVuZ3RoICE9IDQwKSB7XG5cdFx0dmFyIGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogZGF0YX0pO1xuXHRcdHZhciBkID0gYnVmLnJlYWRCdWZmZXIoKTtcblx0XHRpZiAoZC50b1N0cmluZygnYXNjaWknKSA9PT0gJ3NzaC1kc3MnKVxuXHRcdFx0ZCA9IGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdFx0YXNzZXJ0Lm9rKGJ1Zi5hdEVuZCgpLCAnZXh0cmEgdHJhaWxpbmcgYnl0ZXMnKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwoZC5sZW5ndGgsIDQwLCAnaW52YWxpZCBpbm5lciBsZW5ndGgnKTtcblx0XHRkYXRhID0gZDtcblx0fVxuXHRvcHRzLnBhcnRzLnB1c2goe25hbWU6ICdyJywgZGF0YTogZGF0YS5zbGljZSgwLCAyMCl9KTtcblx0b3B0cy5wYXJ0cy5wdXNoKHtuYW1lOiAncycsIGRhdGE6IGRhdGEuc2xpY2UoMjAsIDQwKX0pO1xuXHRyZXR1cm4gKG5ldyBTaWduYXR1cmUob3B0cykpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVDRFNBKGRhdGEsIHR5cGUsIGZvcm1hdCwgb3B0cykge1xuXHR2YXIgYnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBkYXRhfSk7XG5cblx0dmFyIHIsIHM7XG5cdHZhciBpbm5lciA9IGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdHZhciBzdHlwZSA9IGlubmVyLnRvU3RyaW5nKCdhc2NpaScpO1xuXHRpZiAoc3R5cGUuc2xpY2UoMCwgNikgPT09ICdlY2RzYS0nKSB7XG5cdFx0dmFyIHBhcnRzID0gc3R5cGUuc3BsaXQoJy0nKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocGFydHNbMF0sICdlY2RzYScpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChwYXJ0c1sxXSwgJ3NoYTInKTtcblx0XHRvcHRzLmN1cnZlID0gcGFydHNbMl07XG5cdFx0c3dpdGNoIChvcHRzLmN1cnZlKSB7XG5cdFx0Y2FzZSAnbmlzdHAyNTYnOlxuXHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGEyNTYnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbmlzdHAzODQnOlxuXHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGEzODQnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnbmlzdHA1MjEnOlxuXHRcdFx0b3B0cy5oYXNoQWxnbyA9ICdzaGE1MTInO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIEVDRFNBIGN1cnZlOiAnICtcblx0XHRcdCAgICBvcHRzLmN1cnZlKSk7XG5cdFx0fVxuXHRcdGlubmVyID0gYnVmLnJlYWRCdWZmZXIoKTtcblx0XHRhc3NlcnQub2soYnVmLmF0RW5kKCksICdleHRyYSB0cmFpbGluZyBieXRlcyBvbiBvdXRlcicpO1xuXHRcdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogaW5uZXJ9KTtcblx0XHRyID0gYnVmLnJlYWRQYXJ0KCk7XG5cdH0gZWxzZSB7XG5cdFx0ciA9IHtkYXRhOiBpbm5lcn07XG5cdH1cblxuXHRzID0gYnVmLnJlYWRQYXJ0KCk7XG5cdGFzc2VydC5vayhidWYuYXRFbmQoKSwgJ2V4dHJhIHRyYWlsaW5nIGJ5dGVzJyk7XG5cblx0ci5uYW1lID0gJ3InO1xuXHRzLm5hbWUgPSAncyc7XG5cblx0b3B0cy5wYXJ0cy5wdXNoKHIpO1xuXHRvcHRzLnBhcnRzLnB1c2gocyk7XG5cdHJldHVybiAobmV3IFNpZ25hdHVyZShvcHRzKSk7XG59XG5cblNpZ25hdHVyZS5pc1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChvYmosIHZlcikge1xuXHRyZXR1cm4gKHV0aWxzLmlzQ29tcGF0aWJsZShvYmosIFNpZ25hdHVyZSwgdmVyKSk7XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBTaWduYXR1cmU6XG4gKiBbMSwwXSAtLSBpbml0aWFsIHZlclxuICogWzIsMF0gLS0gc3VwcG9ydCBmb3IgcnNhIGluIGZ1bGwgc3NoIGZvcm1hdCwgY29tcGF0IHdpdGggc3NocGstYWdlbnRcbiAqICAgICAgICAgIGhhc2hBbGdvcml0aG0gcHJvcGVydHlcbiAqIFsyLDFdIC0tIGZpcnN0IHRhZ2dlZCB2ZXJzaW9uXG4gKi9cblNpZ25hdHVyZS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsyLCAxXTtcblxuU2lnbmF0dXJlLl9vbGRWZXJzaW9uRGV0ZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuXHRhc3NlcnQuZnVuYyhvYmoudG9CdWZmZXIpO1xuXHRpZiAob2JqLmhhc093blByb3BlcnR5KCdoYXNoQWxnb3JpdGhtJykpXG5cdFx0cmV0dXJuIChbMiwgMF0pO1xuXHRyZXR1cm4gKFsxLCAwXSk7XG59O1xuIiwgIi8vIE5hbWVkIEVDIGN1cnZlc1xuXG4vLyBSZXF1aXJlcyBlYy5qcywganNibi5qcywgYW5kIGpzYm4yLmpzXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJ2pzYm4nKS5CaWdJbnRlZ2VyXG52YXIgRUNDdXJ2ZUZwID0gcmVxdWlyZSgnLi9lYy5qcycpLkVDQ3VydmVGcFxuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS1cbi8vIFg5RUNQYXJhbWV0ZXJzXG5cbi8vIGNvbnN0cnVjdG9yXG5mdW5jdGlvbiBYOUVDUGFyYW1ldGVycyhjdXJ2ZSxnLG4saCkge1xuICAgIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgICB0aGlzLmcgPSBnO1xuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy5oID0gaDtcbn1cblxuZnVuY3Rpb24geDlnZXRDdXJ2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZTtcbn1cblxuZnVuY3Rpb24geDlnZXRHKCkge1xuICAgIHJldHVybiB0aGlzLmc7XG59XG5cbmZ1bmN0aW9uIHg5Z2V0TigpIHtcbiAgICByZXR1cm4gdGhpcy5uO1xufVxuXG5mdW5jdGlvbiB4OWdldEgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaDtcbn1cblxuWDlFQ1BhcmFtZXRlcnMucHJvdG90eXBlLmdldEN1cnZlID0geDlnZXRDdXJ2ZTtcblg5RUNQYXJhbWV0ZXJzLnByb3RvdHlwZS5nZXRHID0geDlnZXRHO1xuWDlFQ1BhcmFtZXRlcnMucHJvdG90eXBlLmdldE4gPSB4OWdldE47XG5YOUVDUGFyYW1ldGVycy5wcm90b3R5cGUuZ2V0SCA9IHg5Z2V0SDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLVxuLy8gU0VDTmFtZWRDdXJ2ZXNcblxuZnVuY3Rpb24gZnJvbUhleChzKSB7IHJldHVybiBuZXcgQmlnSW50ZWdlcihzLCAxNik7IH1cblxuZnVuY3Rpb24gc2VjcDEyOHIxKCkge1xuICAgIC8vIHAgPSAyXjEyOCAtIDJeOTcgLSAxXG4gICAgdmFyIHAgPSBmcm9tSGV4KFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIik7XG4gICAgdmFyIGEgPSBmcm9tSGV4KFwiRkZGRkZGRkRGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkNcIik7XG4gICAgdmFyIGIgPSBmcm9tSGV4KFwiRTg3NTc5QzExMDc5RjQzREQ4MjQ5OTNDMkNFRTVFRDNcIik7XG4gICAgLy9ieXRlW10gUyA9IEhleC5kZWNvZGUoXCIwMDBFMEQ0RDY5NkU2NzY4NzU2MTUxNzUwQ0MwM0E0NDczRDAzNjc5XCIpO1xuICAgIHZhciBuID0gZnJvbUhleChcIkZGRkZGRkZFMDAwMDAwMDA3NUEzMEQxQjkwMzhBMTE1XCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuICAgICAgICAgICAgICAgICsgXCIxNjFGRjc1MjhCODk5QjJEMEMyODYwN0NBNTJDNUI4NlwiXG5cdFx0KyBcIkNGNUFDODM5NUJBRkVCMTNDMDJEQTI5MkRERUQ3QTgzXCIpO1xuICAgIHJldHVybiBuZXcgWDlFQ1BhcmFtZXRlcnMoY3VydmUsIEcsIG4sIGgpO1xufVxuXG5mdW5jdGlvbiBzZWNwMTYwazEoKSB7XG4gICAgLy8gcCA9IDJeMTYwIC0gMl4zMiAtIDJeMTQgLSAyXjEyIC0gMl45IC0gMl44IC0gMl43IC0gMl4zIC0gMl4yIC0gMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkFDNzNcIik7XG4gICAgdmFyIGEgPSBCaWdJbnRlZ2VyLlpFUk87XG4gICAgdmFyIGIgPSBmcm9tSGV4KFwiN1wiKTtcbiAgICAvL2J5dGVbXSBTID0gbnVsbDtcbiAgICB2YXIgbiA9IGZyb21IZXgoXCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAxQjhGQTE2REZBQjlBQ0ExNkI2QjNcIik7XG4gICAgdmFyIGggPSBCaWdJbnRlZ2VyLk9ORTtcbiAgICB2YXIgY3VydmUgPSBuZXcgRUNDdXJ2ZUZwKHAsIGEsIGIpO1xuICAgIHZhciBHID0gY3VydmUuZGVjb2RlUG9pbnRIZXgoXCIwNFwiXG4gICAgICAgICAgICAgICAgKyBcIjNCNEMzODJDRTM3QUExOTJBNDAxOUU3NjMwMzZGNEY1REQ0RDdFQkJcIlxuICAgICAgICAgICAgICAgICsgXCI5MzhDRjkzNTMxOEZEQ0VENkJDMjgyODY1MzE3MzNDM0YwM0M0RkVFXCIpO1xuICAgIHJldHVybiBuZXcgWDlFQ1BhcmFtZXRlcnMoY3VydmUsIEcsIG4sIGgpO1xufVxuXG5mdW5jdGlvbiBzZWNwMTYwcjEoKSB7XG4gICAgLy8gcCA9IDJeMTYwIC0gMl4zMSAtIDFcbiAgICB2YXIgcCA9IGZyb21IZXgoXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZGXCIpO1xuICAgIHZhciBhID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGN0ZGRkZGRkNcIik7XG4gICAgdmFyIGIgPSBmcm9tSGV4KFwiMUM5N0JFRkM1NEJEN0E4QjY1QUNGODlGODFENEQ0QURDNTY1RkE0NVwiKTtcbiAgICAvL2J5dGVbXSBTID0gSGV4LmRlY29kZShcIjEwNTNDREU0MkMxNEQ2OTZFNjc2ODc1NjE1MTc1MzNCRjNGODMzNDVcIik7XG4gICAgdmFyIG4gPSBmcm9tSGV4KFwiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMUY0QzhGOTI3QUVEM0NBNzUyMjU3XCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuXHRcdCsgXCI0QTk2QjU2ODhFRjU3MzI4NDY2NDY5ODk2OEMzOEJCOTEzQ0JGQzgyXCJcblx0XHQrIFwiMjNBNjI4NTUzMTY4OTQ3RDU5RENDOTEyMDQyMzUxMzc3QUM1RkIzMlwiKTtcbiAgICByZXR1cm4gbmV3IFg5RUNQYXJhbWV0ZXJzKGN1cnZlLCBHLCBuLCBoKTtcbn1cblxuZnVuY3Rpb24gc2VjcDE5MmsxKCkge1xuICAgIC8vIHAgPSAyXjE5MiAtIDJeMzIgLSAyXjEyIC0gMl44IC0gMl43IC0gMl42IC0gMl4zIC0gMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRUUzN1wiKTtcbiAgICB2YXIgYSA9IEJpZ0ludGVnZXIuWkVSTztcbiAgICB2YXIgYiA9IGZyb21IZXgoXCIzXCIpO1xuICAgIC8vYnl0ZVtdIFMgPSBudWxsO1xuICAgIHZhciBuID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRTI2RjJGQzE3MEY2OTQ2NkE3NERFRkQ4RFwiKTtcbiAgICB2YXIgaCA9IEJpZ0ludGVnZXIuT05FO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBFQ0N1cnZlRnAocCwgYSwgYik7XG4gICAgdmFyIEcgPSBjdXJ2ZS5kZWNvZGVQb2ludEhleChcIjA0XCJcbiAgICAgICAgICAgICAgICArIFwiREI0RkYxMEVDMDU3RTlBRTI2QjA3RDAyODBCN0Y0MzQxREE1RDFCMUVBRTA2QzdEXCJcbiAgICAgICAgICAgICAgICArIFwiOUIyRjJGNkQ5QzU2MjhBNzg0NDE2M0QwMTVCRTg2MzQ0MDgyQUE4OEQ5NUUyRjlEXCIpO1xuICAgIHJldHVybiBuZXcgWDlFQ1BhcmFtZXRlcnMoY3VydmUsIEcsIG4sIGgpO1xufVxuXG5mdW5jdGlvbiBzZWNwMTkycjEoKSB7XG4gICAgLy8gcCA9IDJeMTkyIC0gMl42NCAtIDFcbiAgICB2YXIgcCA9IGZyb21IZXgoXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZcIik7XG4gICAgdmFyIGEgPSBmcm9tSGV4KFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZDXCIpO1xuICAgIHZhciBiID0gZnJvbUhleChcIjY0MjEwNTE5RTU5QzgwRTcwRkE3RTlBQjcyMjQzMDQ5RkVCOERFRUNDMTQ2QjlCMVwiKTtcbiAgICAvL2J5dGVbXSBTID0gSGV4LmRlY29kZShcIjMwNDVBRTZGQzg0MjJGNjRFRDU3OTUyOEQzODEyMEVBRTEyMTk2RDVcIik7XG4gICAgdmFyIG4gPSBmcm9tSGV4KFwiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGOTlERUY4MzYxNDZCQzlCMUI0RDIyODMxXCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuICAgICAgICAgICAgICAgICsgXCIxODhEQTgwRUIwMzA5MEY2N0NCRjIwRUI0M0ExODgwMEY0RkYwQUZEODJGRjEwMTJcIlxuICAgICAgICAgICAgICAgICsgXCIwNzE5MkI5NUZGQzhEQTc4NjMxMDExRUQ2QjI0Q0RENTczRjk3N0ExMUU3OTQ4MTFcIik7XG4gICAgcmV0dXJuIG5ldyBYOUVDUGFyYW1ldGVycyhjdXJ2ZSwgRywgbiwgaCk7XG59XG5cbmZ1bmN0aW9uIHNlY3AyMjRyMSgpIHtcbiAgICAvLyBwID0gMl4yMjQgLSAyXjk2ICsgMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxXCIpO1xuICAgIHZhciBhID0gZnJvbUhleChcIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFXCIpO1xuICAgIHZhciBiID0gZnJvbUhleChcIkI0MDUwQTg1MEMwNEIzQUJGNTQxMzI1NjUwNDRCMEI3RDdCRkQ4QkEyNzBCMzk0MzIzNTVGRkI0XCIpO1xuICAgIC8vYnl0ZVtdIFMgPSBIZXguZGVjb2RlKFwiQkQ3MTM0NDc5OUQ1QzdGQ0RDNDVCNTlGQTNCOUFCOEY2QTk0OEJDNVwiKTtcbiAgICB2YXIgbiA9IGZyb21IZXgoXCJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMTZBMkUwQjhGMDNFMTNERDI5NDU1QzVDMkEzRFwiKTtcbiAgICB2YXIgaCA9IEJpZ0ludGVnZXIuT05FO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBFQ0N1cnZlRnAocCwgYSwgYik7XG4gICAgdmFyIEcgPSBjdXJ2ZS5kZWNvZGVQb2ludEhleChcIjA0XCJcbiAgICAgICAgICAgICAgICArIFwiQjcwRTBDQkQ2QkI0QkY3RjMyMTM5MEI5NEEwM0MxRDM1NkMyMTEyMjM0MzI4MEQ2MTE1QzFEMjFcIlxuICAgICAgICAgICAgICAgICsgXCJCRDM3NjM4OEI1RjcyM0ZCNEMyMkRGRTZDRDQzNzVBMDVBMDc0NzY0NDRENTgxOTk4NTAwN0UzNFwiKTtcbiAgICByZXR1cm4gbmV3IFg5RUNQYXJhbWV0ZXJzKGN1cnZlLCBHLCBuLCBoKTtcbn1cblxuZnVuY3Rpb24gc2VjcDI1NnIxKCkge1xuICAgIC8vIHAgPSAyXjIyNCAoMl4zMiAtIDEpICsgMl4xOTIgKyAyXjk2IC0gMVxuICAgIHZhciBwID0gZnJvbUhleChcIkZGRkZGRkZGMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZcIik7XG4gICAgdmFyIGEgPSBmcm9tSGV4KFwiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ1wiKTtcbiAgICB2YXIgYiA9IGZyb21IZXgoXCI1QUM2MzVEOEFBM0E5M0U3QjNFQkJENTU3Njk4ODZCQzY1MUQwNkIwQ0M1M0IwRjYzQkNFM0MzRTI3RDI2MDRCXCIpO1xuICAgIC8vYnl0ZVtdIFMgPSBIZXguZGVjb2RlKFwiQzQ5RDM2MDg4NkU3MDQ5MzZBNjY3OEUxMTM5RDI2Qjc4MTlGN0U5MFwiKTtcbiAgICB2YXIgbiA9IGZyb21IZXgoXCJGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkJDRTZGQUFEQTcxNzlFODRGM0I5Q0FDMkZDNjMyNTUxXCIpO1xuICAgIHZhciBoID0gQmlnSW50ZWdlci5PTkU7XG4gICAgdmFyIGN1cnZlID0gbmV3IEVDQ3VydmVGcChwLCBhLCBiKTtcbiAgICB2YXIgRyA9IGN1cnZlLmRlY29kZVBvaW50SGV4KFwiMDRcIlxuICAgICAgICAgICAgICAgICsgXCI2QjE3RDFGMkUxMkM0MjQ3RjhCQ0U2RTU2M0E0NDBGMjc3MDM3RDgxMkRFQjMzQTBGNEExMzk0NUQ4OThDMjk2XCJcblx0XHQrIFwiNEZFMzQyRTJGRTFBN0Y5QjhFRTdFQjRBN0MwRjlFMTYyQkNFMzM1NzZCMzE1RUNFQ0JCNjQwNjgzN0JGNTFGNVwiKTtcbiAgICByZXR1cm4gbmV3IFg5RUNQYXJhbWV0ZXJzKGN1cnZlLCBHLCBuLCBoKTtcbn1cblxuLy8gVE9ETzogbWFrZSB0aGlzIGludG8gYSBwcm9wZXIgaGFzaHRhYmxlXG5mdW5jdGlvbiBnZXRTRUNDdXJ2ZUJ5TmFtZShuYW1lKSB7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxMjhyMVwiKSByZXR1cm4gc2VjcDEyOHIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxNjBrMVwiKSByZXR1cm4gc2VjcDE2MGsxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxNjByMVwiKSByZXR1cm4gc2VjcDE2MHIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxOTJrMVwiKSByZXR1cm4gc2VjcDE5MmsxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AxOTJyMVwiKSByZXR1cm4gc2VjcDE5MnIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AyMjRyMVwiKSByZXR1cm4gc2VjcDIyNHIxKCk7XG4gICAgaWYobmFtZSA9PSBcInNlY3AyNTZyMVwiKSByZXR1cm4gc2VjcDI1NnIxKCk7XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcInNlY3AxMjhyMVwiOnNlY3AxMjhyMSxcbiAgXCJzZWNwMTYwazFcIjpzZWNwMTYwazEsXG4gIFwic2VjcDE2MHIxXCI6c2VjcDE2MHIxLFxuICBcInNlY3AxOTJrMVwiOnNlY3AxOTJrMSxcbiAgXCJzZWNwMTkycjFcIjpzZWNwMTkycjEsXG4gIFwic2VjcDIyNHIxXCI6c2VjcDIyNHIxLFxuICBcInNlY3AyNTZyMVwiOnNlY3AyNTZyMVxufVxuIiwgInZhciBjcnlwdG8gPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xudmFyIEJpZ0ludGVnZXIgPSByZXF1aXJlKFwianNiblwiKS5CaWdJbnRlZ2VyO1xudmFyIEVDUG9pbnRGcCA9IHJlcXVpcmUoXCIuL2xpYi9lYy5qc1wiKS5FQ1BvaW50RnA7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcInNhZmVyLWJ1ZmZlclwiKS5CdWZmZXI7XG5leHBvcnRzLkVDQ3VydmVzID0gcmVxdWlyZShcIi4vbGliL3NlYy5qc1wiKTtcblxuLy8gemVybyBwcmVwYWRcbmZ1bmN0aW9uIHVuc3R1cGlkKGhleCxsZW4pXG57XG5cdHJldHVybiAoaGV4Lmxlbmd0aCA+PSBsZW4pID8gaGV4IDogdW5zdHVwaWQoXCIwXCIraGV4LGxlbik7XG59XG5cbmV4cG9ydHMuRUNLZXkgPSBmdW5jdGlvbihjdXJ2ZSwga2V5LCBpc1B1YmxpYylcbntcbiAgdmFyIHByaXY7XG5cdHZhciBjID0gY3VydmUoKTtcblx0dmFyIG4gPSBjLmdldE4oKTtcbiAgdmFyIGJ5dGVzID0gTWF0aC5mbG9vcihuLmJpdExlbmd0aCgpLzgpO1xuXG4gIGlmKGtleSlcbiAge1xuICAgIGlmKGlzUHVibGljKVxuICAgIHtcbiAgICAgIHZhciBjdXJ2ZSA9IGMuZ2V0Q3VydmUoKTtcbi8vICAgICAgdmFyIHggPSBrZXkuc2xpY2UoMSxieXRlcysxKTsgLy8gc2tpcCB0aGUgMDQgZm9yIHVuY29tcHJlc3NlZCBmb3JtYXRcbi8vICAgICAgdmFyIHkgPSBrZXkuc2xpY2UoYnl0ZXMrMSk7XG4vLyAgICAgIHRoaXMuUCA9IG5ldyBFQ1BvaW50RnAoY3VydmUsXG4vLyAgICAgICAgY3VydmUuZnJvbUJpZ0ludGVnZXIobmV3IEJpZ0ludGVnZXIoeC50b1N0cmluZyhcImhleFwiKSwgMTYpKSxcbi8vICAgICAgICBjdXJ2ZS5mcm9tQmlnSW50ZWdlcihuZXcgQmlnSW50ZWdlcih5LnRvU3RyaW5nKFwiaGV4XCIpLCAxNikpKTsgICAgICBcbiAgICAgIHRoaXMuUCA9IGN1cnZlLmRlY29kZVBvaW50SGV4KGtleS50b1N0cmluZyhcImhleFwiKSk7XG4gICAgfWVsc2V7XG4gICAgICBpZihrZXkubGVuZ3RoICE9IGJ5dGVzKSByZXR1cm4gZmFsc2U7XG4gICAgICBwcml2ID0gbmV3IEJpZ0ludGVnZXIoa2V5LnRvU3RyaW5nKFwiaGV4XCIpLCAxNik7ICAgICAgXG4gICAgfVxuICB9ZWxzZXtcbiAgICB2YXIgbjEgPSBuLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICB2YXIgciA9IG5ldyBCaWdJbnRlZ2VyKGNyeXB0by5yYW5kb21CeXRlcyhuLmJpdExlbmd0aCgpKSk7XG4gICAgcHJpdiA9IHIubW9kKG4xKS5hZGQoQmlnSW50ZWdlci5PTkUpO1xuICAgIHRoaXMuUCA9IGMuZ2V0RygpLm11bHRpcGx5KHByaXYpO1xuICB9XG4gIGlmKHRoaXMuUClcbiAge1xuLy8gIHZhciBwdWJoZXggPSB1bnN0dXBpZCh0aGlzLlAuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KSxieXRlcyoyKSt1bnN0dXBpZCh0aGlzLlAuZ2V0WSgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KSxieXRlcyoyKTtcbi8vICB0aGlzLlB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKFwiMDRcIitwdWJoZXgsXCJoZXhcIik7XG4gICAgdGhpcy5QdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShjLmdldEN1cnZlKCkuZW5jb2RlQ29tcHJlc3NlZFBvaW50SGV4KHRoaXMuUCksXCJoZXhcIik7XG4gIH1cbiAgaWYocHJpdilcbiAge1xuICAgIHRoaXMuUHJpdmF0ZUtleSA9IEJ1ZmZlci5mcm9tKHVuc3R1cGlkKHByaXYudG9TdHJpbmcoMTYpLGJ5dGVzKjIpLFwiaGV4XCIpO1xuICAgIHRoaXMuZGVyaXZlU2hhcmVkU2VjcmV0ID0gZnVuY3Rpb24oa2V5KVxuICAgIHtcbiAgICAgIGlmKCFrZXkgfHwgIWtleS5QKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgUyA9IGtleS5QLm11bHRpcGx5KHByaXYpO1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHVuc3R1cGlkKFMuZ2V0WCgpLnRvQmlnSW50ZWdlcigpLnRvU3RyaW5nKDE2KSxieXRlcyoyKSxcImhleFwiKTtcbiAgIH0gICAgIFxuICB9XG59XG5cbiIsICIvLyBDb3B5cmlnaHQgMjAxNyBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdERpZmZpZUhlbGxtYW46IERpZmZpZUhlbGxtYW4sXG5cdGdlbmVyYXRlRUNEU0E6IGdlbmVyYXRlRUNEU0EsXG5cdGdlbmVyYXRlRUQyNTUxOTogZ2VuZXJhdGVFRDI1NTE5XG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIG5hY2wgPSByZXF1aXJlKCd0d2VldG5hY2wnKTtcblxudmFyIEtleSA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4vcHJpdmF0ZS1rZXknKTtcblxudmFyIENSWVBUT19IQVZFX0VDREggPSAoY3J5cHRvLmNyZWF0ZUVDREggIT09IHVuZGVmaW5lZCk7XG5cbnZhciBlY2RoID0gcmVxdWlyZSgnZWNjLWpzYm4nKTtcbnZhciBlYyA9IHJlcXVpcmUoJ2VjYy1qc2JuL2xpYi9lYycpO1xudmFyIGpzYm4gPSByZXF1aXJlKCdqc2JuJykuQmlnSW50ZWdlcjtcblxuZnVuY3Rpb24gRGlmZmllSGVsbG1hbihrZXkpIHtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShrZXksIEtleSwgWzEsIDRdLCAna2V5Jyk7XG5cdHRoaXMuX2lzUHJpdiA9IFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSwgWzEsIDNdKTtcblx0dGhpcy5fYWxnbyA9IGtleS50eXBlO1xuXHR0aGlzLl9jdXJ2ZSA9IGtleS5jdXJ2ZTtcblx0dGhpcy5fa2V5ID0ga2V5O1xuXHRpZiAoa2V5LnR5cGUgPT09ICdkc2EnKSB7XG5cdFx0aWYgKCFDUllQVE9fSEFWRV9FQ0RIKSB7XG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdEdWUgdG8gYnVncyBpbiB0aGUgbm9kZSAwLjEwICcgK1xuXHRcdFx0ICAgICdjcnlwdG8gQVBJLCBub2RlIDAuMTIueCBvciBsYXRlciBpcyByZXF1aXJlZCAnICtcblx0XHRcdCAgICAndG8gdXNlIERIJykpO1xuXHRcdH1cblx0XHR0aGlzLl9kaCA9IGNyeXB0by5jcmVhdGVEaWZmaWVIZWxsbWFuKFxuXHRcdCAgICBrZXkucGFydC5wLmRhdGEsIHVuZGVmaW5lZCxcblx0XHQgICAga2V5LnBhcnQuZy5kYXRhLCB1bmRlZmluZWQpO1xuXHRcdHRoaXMuX3AgPSBrZXkucGFydC5wO1xuXHRcdHRoaXMuX2cgPSBrZXkucGFydC5nO1xuXHRcdGlmICh0aGlzLl9pc1ByaXYpXG5cdFx0XHR0aGlzLl9kaC5zZXRQcml2YXRlS2V5KGtleS5wYXJ0LnguZGF0YSk7XG5cdFx0dGhpcy5fZGguc2V0UHVibGljS2V5KGtleS5wYXJ0LnkuZGF0YSk7XG5cblx0fSBlbHNlIGlmIChrZXkudHlwZSA9PT0gJ2VjZHNhJykge1xuXHRcdGlmICghQ1JZUFRPX0hBVkVfRUNESCkge1xuXHRcdFx0dGhpcy5fZWNQYXJhbXMgPSBuZXcgWDlFQ1BhcmFtZXRlcnModGhpcy5fY3VydmUpO1xuXG5cdFx0XHRpZiAodGhpcy5faXNQcml2KSB7XG5cdFx0XHRcdHRoaXMuX3ByaXYgPSBuZXcgRUNQcml2YXRlKFxuXHRcdFx0XHQgICAgdGhpcy5fZWNQYXJhbXMsIGtleS5wYXJ0LmQuZGF0YSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGN1cnZlID0ge1xuXHRcdFx0J25pc3RwMjU2JzogJ3ByaW1lMjU2djEnLFxuXHRcdFx0J25pc3RwMzg0JzogJ3NlY3AzODRyMScsXG5cdFx0XHQnbmlzdHA1MjEnOiAnc2VjcDUyMXIxJ1xuXHRcdH1ba2V5LmN1cnZlXTtcblx0XHR0aGlzLl9kaCA9IGNyeXB0by5jcmVhdGVFQ0RIKGN1cnZlKTtcblx0XHRpZiAodHlwZW9mICh0aGlzLl9kaCkgIT09ICdvYmplY3QnIHx8XG5cdFx0ICAgIHR5cGVvZiAodGhpcy5fZGguc2V0UHJpdmF0ZUtleSkgIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdENSWVBUT19IQVZFX0VDREggPSBmYWxzZTtcblx0XHRcdERpZmZpZUhlbGxtYW4uY2FsbCh0aGlzLCBrZXkpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5faXNQcml2KVxuXHRcdFx0dGhpcy5fZGguc2V0UHJpdmF0ZUtleShrZXkucGFydC5kLmRhdGEpO1xuXHRcdHRoaXMuX2RoLnNldFB1YmxpY0tleShrZXkucGFydC5RLmRhdGEpO1xuXG5cdH0gZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdjdXJ2ZTI1NTE5Jykge1xuXHRcdGlmICh0aGlzLl9pc1ByaXYpIHtcblx0XHRcdHV0aWxzLmFzc2VydENvbXBhdGlibGUoa2V5LCBQcml2YXRlS2V5LCBbMSwgNV0sICdrZXknKTtcblx0XHRcdHRoaXMuX3ByaXYgPSBrZXkucGFydC5rLmRhdGE7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignREggbm90IHN1cHBvcnRlZCBmb3IgJyArIGtleS50eXBlICsgJyBrZXlzJykpO1xuXHR9XG59XG5cbkRpZmZpZUhlbGxtYW4ucHJvdG90eXBlLmdldFB1YmxpY0tleSA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKHRoaXMuX2lzUHJpdilcblx0XHRyZXR1cm4gKHRoaXMuX2tleS50b1B1YmxpYygpKTtcblx0cmV0dXJuICh0aGlzLl9rZXkpO1xufTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleSA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKHRoaXMuX2lzUHJpdilcblx0XHRyZXR1cm4gKHRoaXMuX2tleSk7XG5cdGVsc2Vcblx0XHRyZXR1cm4gKHVuZGVmaW5lZCk7XG59O1xuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuZ2V0S2V5ID0gRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuX2tleUNoZWNrID0gZnVuY3Rpb24gKHBrLCBpc1B1Yikge1xuXHRhc3NlcnQub2JqZWN0KHBrLCAna2V5Jyk7XG5cdGlmICghaXNQdWIpXG5cdFx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShwaywgUHJpdmF0ZUtleSwgWzEsIDNdLCAna2V5Jyk7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUocGssIEtleSwgWzEsIDRdLCAna2V5Jyk7XG5cblx0aWYgKHBrLnR5cGUgIT09IHRoaXMuX2FsZ28pIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdBICcgKyBway50eXBlICsgJyBrZXkgY2Fubm90IGJlIHVzZWQgaW4gJyArXG5cdFx0ICAgIHRoaXMuX2FsZ28gKyAnIERpZmZpZS1IZWxsbWFuJykpO1xuXHR9XG5cblx0aWYgKHBrLmN1cnZlICE9PSB0aGlzLl9jdXJ2ZSkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0Ega2V5IGZyb20gdGhlICcgKyBway5jdXJ2ZSArICcgY3VydmUgJyArXG5cdFx0ICAgICdjYW5ub3QgYmUgdXNlZCB3aXRoIGEgJyArIHRoaXMuX2N1cnZlICtcblx0XHQgICAgJyBEaWZmaWUtSGVsbG1hbicpKTtcblx0fVxuXG5cdGlmIChway50eXBlID09PSAnZHNhJykge1xuXHRcdGFzc2VydC5kZWVwRXF1YWwocGsucGFydC5wLCB0aGlzLl9wLFxuXHRcdCAgICAnRFNBIGtleSBwcmltZSBkb2VzIG5vdCBtYXRjaCcpO1xuXHRcdGFzc2VydC5kZWVwRXF1YWwocGsucGFydC5nLCB0aGlzLl9nLFxuXHRcdCAgICAnRFNBIGtleSBnZW5lcmF0b3IgZG9lcyBub3QgbWF0Y2gnKTtcblx0fVxufTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuc2V0S2V5ID0gZnVuY3Rpb24gKHBrKSB7XG5cdHRoaXMuX2tleUNoZWNrKHBrKTtcblxuXHRpZiAocGsudHlwZSA9PT0gJ2RzYScpIHtcblx0XHR0aGlzLl9kaC5zZXRQcml2YXRlS2V5KHBrLnBhcnQueC5kYXRhKTtcblx0XHR0aGlzLl9kaC5zZXRQdWJsaWNLZXkocGsucGFydC55LmRhdGEpO1xuXG5cdH0gZWxzZSBpZiAocGsudHlwZSA9PT0gJ2VjZHNhJykge1xuXHRcdGlmIChDUllQVE9fSEFWRV9FQ0RIKSB7XG5cdFx0XHR0aGlzLl9kaC5zZXRQcml2YXRlS2V5KHBrLnBhcnQuZC5kYXRhKTtcblx0XHRcdHRoaXMuX2RoLnNldFB1YmxpY0tleShway5wYXJ0LlEuZGF0YSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX3ByaXYgPSBuZXcgRUNQcml2YXRlKFxuXHRcdFx0ICAgIHRoaXMuX2VjUGFyYW1zLCBway5wYXJ0LmQuZGF0YSk7XG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAocGsudHlwZSA9PT0gJ2N1cnZlMjU1MTknKSB7XG5cdFx0dmFyIGsgPSBway5wYXJ0Lms7XG5cdFx0aWYgKCFway5wYXJ0LmspXG5cdFx0XHRrID0gcGsucGFydC5yO1xuXHRcdHRoaXMuX3ByaXYgPSBrLmRhdGE7XG5cdFx0aWYgKHRoaXMuX3ByaXZbMF0gPT09IDB4MDApXG5cdFx0XHR0aGlzLl9wcml2ID0gdGhpcy5fcHJpdi5zbGljZSgxKTtcblx0XHR0aGlzLl9wcml2ID0gdGhpcy5fcHJpdi5zbGljZSgwLCAzMik7XG5cdH1cblx0dGhpcy5fa2V5ID0gcGs7XG5cdHRoaXMuX2lzUHJpdiA9IHRydWU7XG59O1xuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuc2V0UHJpdmF0ZUtleSA9IERpZmZpZUhlbGxtYW4ucHJvdG90eXBlLnNldEtleTtcblxuRGlmZmllSGVsbG1hbi5wcm90b3R5cGUuY29tcHV0ZVNlY3JldCA9IGZ1bmN0aW9uIChvdGhlcnBrKSB7XG5cdHRoaXMuX2tleUNoZWNrKG90aGVycGssIHRydWUpO1xuXHRpZiAoIXRoaXMuX2lzUHJpdilcblx0XHR0aHJvdyAobmV3IEVycm9yKCdESCBleGNoYW5nZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCAnICtcblx0XHQgICAgJ2EgcHJpdmF0ZSBrZXkgeWV0JykpO1xuXG5cdHZhciBwdWI7XG5cdGlmICh0aGlzLl9hbGdvID09PSAnZHNhJykge1xuXHRcdHJldHVybiAodGhpcy5fZGguY29tcHV0ZVNlY3JldChcblx0XHQgICAgb3RoZXJway5wYXJ0LnkuZGF0YSkpO1xuXG5cdH0gZWxzZSBpZiAodGhpcy5fYWxnbyA9PT0gJ2VjZHNhJykge1xuXHRcdGlmIChDUllQVE9fSEFWRV9FQ0RIKSB7XG5cdFx0XHRyZXR1cm4gKHRoaXMuX2RoLmNvbXB1dGVTZWNyZXQoXG5cdFx0XHQgICAgb3RoZXJway5wYXJ0LlEuZGF0YSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwdWIgPSBuZXcgRUNQdWJsaWMoXG5cdFx0XHQgICAgdGhpcy5fZWNQYXJhbXMsIG90aGVycGsucGFydC5RLmRhdGEpO1xuXHRcdFx0cmV0dXJuICh0aGlzLl9wcml2LmRlcml2ZVNoYXJlZFNlY3JldChwdWIpKTtcblx0XHR9XG5cblx0fSBlbHNlIGlmICh0aGlzLl9hbGdvID09PSAnY3VydmUyNTUxOScpIHtcblx0XHRwdWIgPSBvdGhlcnBrLnBhcnQuQS5kYXRhO1xuXHRcdHdoaWxlIChwdWJbMF0gPT09IDB4MDAgJiYgcHViLmxlbmd0aCA+IDMyKVxuXHRcdFx0cHViID0gcHViLnNsaWNlKDEpO1xuXHRcdHZhciBwcml2ID0gdGhpcy5fcHJpdjtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocHViLmxlbmd0aCwgMzIpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChwcml2Lmxlbmd0aCwgMzIpO1xuXG5cdFx0dmFyIHNlY3JldCA9IG5hY2wuYm94LmJlZm9yZShuZXcgVWludDhBcnJheShwdWIpLFxuXHRcdCAgICBuZXcgVWludDhBcnJheShwcml2KSk7XG5cblx0XHRyZXR1cm4gKEJ1ZmZlci5mcm9tKHNlY3JldCkpO1xuXHR9XG5cblx0dGhyb3cgKG5ldyBFcnJvcignSW52YWxpZCBhbGdvcml0aG06ICcgKyB0aGlzLl9hbGdvKSk7XG59O1xuXG5EaWZmaWVIZWxsbWFuLnByb3RvdHlwZS5nZW5lcmF0ZUtleSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHBhcnRzID0gW107XG5cdHZhciBwcml2LCBwdWI7XG5cdGlmICh0aGlzLl9hbGdvID09PSAnZHNhJykge1xuXHRcdHRoaXMuX2RoLmdlbmVyYXRlS2V5cygpO1xuXG5cdFx0cGFydHMucHVzaCh7bmFtZTogJ3AnLCBkYXRhOiB0aGlzLl9wLmRhdGF9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAncScsIGRhdGE6IHRoaXMuX2tleS5wYXJ0LnEuZGF0YX0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdnJywgZGF0YTogdGhpcy5fZy5kYXRhfSk7XG5cdFx0cGFydHMucHVzaCh7bmFtZTogJ3knLCBkYXRhOiB0aGlzLl9kaC5nZXRQdWJsaWNLZXkoKX0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICd4JywgZGF0YTogdGhpcy5fZGguZ2V0UHJpdmF0ZUtleSgpfSk7XG5cdFx0dGhpcy5fa2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0dHlwZTogJ2RzYScsXG5cdFx0XHRwYXJ0czogcGFydHNcblx0XHR9KTtcblx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdHJldHVybiAodGhpcy5fa2V5KTtcblxuXHR9IGVsc2UgaWYgKHRoaXMuX2FsZ28gPT09ICdlY2RzYScpIHtcblx0XHRpZiAoQ1JZUFRPX0hBVkVfRUNESCkge1xuXHRcdFx0dGhpcy5fZGguZ2VuZXJhdGVLZXlzKCk7XG5cblx0XHRcdHBhcnRzLnB1c2goe25hbWU6ICdjdXJ2ZScsXG5cdFx0XHQgICAgZGF0YTogQnVmZmVyLmZyb20odGhpcy5fY3VydmUpfSk7XG5cdFx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnUScsIGRhdGE6IHRoaXMuX2RoLmdldFB1YmxpY0tleSgpfSk7XG5cdFx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnZCcsIGRhdGE6IHRoaXMuX2RoLmdldFByaXZhdGVLZXkoKX0pO1xuXHRcdFx0dGhpcy5fa2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0XHR0eXBlOiAnZWNkc2EnLFxuXHRcdFx0XHRjdXJ2ZTogdGhpcy5fY3VydmUsXG5cdFx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdFx0cmV0dXJuICh0aGlzLl9rZXkpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBuID0gdGhpcy5fZWNQYXJhbXMuZ2V0TigpO1xuXHRcdFx0dmFyIHIgPSBuZXcganNibihjcnlwdG8ucmFuZG9tQnl0ZXMobi5iaXRMZW5ndGgoKSkpO1xuXHRcdFx0dmFyIG4xID0gbi5zdWJ0cmFjdChqc2JuLk9ORSk7XG5cdFx0XHRwcml2ID0gci5tb2QobjEpLmFkZChqc2JuLk9ORSk7XG5cdFx0XHRwdWIgPSB0aGlzLl9lY1BhcmFtcy5nZXRHKCkubXVsdGlwbHkocHJpdik7XG5cblx0XHRcdHByaXYgPSBCdWZmZXIuZnJvbShwcml2LnRvQnl0ZUFycmF5KCkpO1xuXHRcdFx0cHViID0gQnVmZmVyLmZyb20odGhpcy5fZWNQYXJhbXMuZ2V0Q3VydmUoKS5cblx0XHRcdCAgICBlbmNvZGVQb2ludEhleChwdWIpLCAnaGV4Jyk7XG5cblx0XHRcdHRoaXMuX3ByaXYgPSBuZXcgRUNQcml2YXRlKHRoaXMuX2VjUGFyYW1zLCBwcml2KTtcblxuXHRcdFx0cGFydHMucHVzaCh7bmFtZTogJ2N1cnZlJyxcblx0XHRcdCAgICBkYXRhOiBCdWZmZXIuZnJvbSh0aGlzLl9jdXJ2ZSl9KTtcblx0XHRcdHBhcnRzLnB1c2goe25hbWU6ICdRJywgZGF0YTogcHVifSk7XG5cdFx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnZCcsIGRhdGE6IHByaXZ9KTtcblxuXHRcdFx0dGhpcy5fa2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0XHR0eXBlOiAnZWNkc2EnLFxuXHRcdFx0XHRjdXJ2ZTogdGhpcy5fY3VydmUsXG5cdFx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdFx0cmV0dXJuICh0aGlzLl9rZXkpO1xuXHRcdH1cblxuXHR9IGVsc2UgaWYgKHRoaXMuX2FsZ28gPT09ICdjdXJ2ZTI1NTE5Jykge1xuXHRcdHZhciBwYWlyID0gbmFjbC5ib3gua2V5UGFpcigpO1xuXHRcdHByaXYgPSBCdWZmZXIuZnJvbShwYWlyLnNlY3JldEtleSk7XG5cdFx0cHViID0gQnVmZmVyLmZyb20ocGFpci5wdWJsaWNLZXkpO1xuXHRcdHByaXYgPSBCdWZmZXIuY29uY2F0KFtwcml2LCBwdWJdKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocHJpdi5sZW5ndGgsIDY0KTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocHViLmxlbmd0aCwgMzIpO1xuXG5cdFx0cGFydHMucHVzaCh7bmFtZTogJ0EnLCBkYXRhOiBwdWJ9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnaycsIGRhdGE6IHByaXZ9KTtcblx0XHR0aGlzLl9rZXkgPSBuZXcgUHJpdmF0ZUtleSh7XG5cdFx0XHR0eXBlOiAnY3VydmUyNTUxOScsXG5cdFx0XHRwYXJ0czogcGFydHNcblx0XHR9KTtcblx0XHR0aGlzLl9pc1ByaXYgPSB0cnVlO1xuXHRcdHJldHVybiAodGhpcy5fa2V5KTtcblx0fVxuXG5cdHRocm93IChuZXcgRXJyb3IoJ0ludmFsaWQgYWxnb3JpdGhtOiAnICsgdGhpcy5fYWxnbykpO1xufTtcbkRpZmZpZUhlbGxtYW4ucHJvdG90eXBlLmdlbmVyYXRlS2V5cyA9IERpZmZpZUhlbGxtYW4ucHJvdG90eXBlLmdlbmVyYXRlS2V5O1xuXG4vKiBUaGVzZSBhcmUgaGVscGVycyBmb3IgdXNpbmcgZWNjLWpzYm4gKGZvciBub2RlIDAuMTAgY29tcGF0aWJpbGl0eSkuICovXG5cbmZ1bmN0aW9uIFg5RUNQYXJhbWV0ZXJzKG5hbWUpIHtcblx0dmFyIHBhcmFtcyA9IGFsZ3MuY3VydmVzW25hbWVdO1xuXHRhc3NlcnQub2JqZWN0KHBhcmFtcyk7XG5cblx0dmFyIHAgPSBuZXcganNibihwYXJhbXMucCk7XG5cdHZhciBhID0gbmV3IGpzYm4ocGFyYW1zLmEpO1xuXHR2YXIgYiA9IG5ldyBqc2JuKHBhcmFtcy5iKTtcblx0dmFyIG4gPSBuZXcganNibihwYXJhbXMubik7XG5cdHZhciBoID0ganNibi5PTkU7XG5cdHZhciBjdXJ2ZSA9IG5ldyBlYy5FQ0N1cnZlRnAocCwgYSwgYik7XG5cdHZhciBHID0gY3VydmUuZGVjb2RlUG9pbnRIZXgocGFyYW1zLkcudG9TdHJpbmcoJ2hleCcpKTtcblxuXHR0aGlzLmN1cnZlID0gY3VydmU7XG5cdHRoaXMuZyA9IEc7XG5cdHRoaXMubiA9IG47XG5cdHRoaXMuaCA9IGg7XG59XG5YOUVDUGFyYW1ldGVycy5wcm90b3R5cGUuZ2V0Q3VydmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJ2ZSk7IH07XG5YOUVDUGFyYW1ldGVycy5wcm90b3R5cGUuZ2V0RyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmcpOyB9O1xuWDlFQ1BhcmFtZXRlcnMucHJvdG90eXBlLmdldE4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5uKTsgfTtcblg5RUNQYXJhbWV0ZXJzLnByb3RvdHlwZS5nZXRIID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMuaCk7IH07XG5cbmZ1bmN0aW9uIEVDUHVibGljKHBhcmFtcywgYnVmZmVyKSB7XG5cdHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcblx0aWYgKGJ1ZmZlclswXSA9PT0gMHgwMClcblx0XHRidWZmZXIgPSBidWZmZXIuc2xpY2UoMSk7XG5cdHRoaXMuX3B1YiA9IHBhcmFtcy5nZXRDdXJ2ZSgpLmRlY29kZVBvaW50SGV4KGJ1ZmZlci50b1N0cmluZygnaGV4JykpO1xufVxuXG5mdW5jdGlvbiBFQ1ByaXZhdGUocGFyYW1zLCBidWZmZXIpIHtcblx0dGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuXHR0aGlzLl9wcml2ID0gbmV3IGpzYm4odXRpbHMubXBOb3JtYWxpemUoYnVmZmVyKSk7XG59XG5FQ1ByaXZhdGUucHJvdG90eXBlLmRlcml2ZVNoYXJlZFNlY3JldCA9IGZ1bmN0aW9uIChwdWJLZXkpIHtcblx0YXNzZXJ0Lm9rKHB1YktleSBpbnN0YW5jZW9mIEVDUHVibGljKTtcblx0dmFyIFMgPSBwdWJLZXkuX3B1Yi5tdWx0aXBseSh0aGlzLl9wcml2KTtcblx0cmV0dXJuIChCdWZmZXIuZnJvbShTLmdldFgoKS50b0JpZ0ludGVnZXIoKS50b0J5dGVBcnJheSgpKSk7XG59O1xuXG5mdW5jdGlvbiBnZW5lcmF0ZUVEMjU1MTkoKSB7XG5cdHZhciBwYWlyID0gbmFjbC5zaWduLmtleVBhaXIoKTtcblx0dmFyIHByaXYgPSBCdWZmZXIuZnJvbShwYWlyLnNlY3JldEtleSk7XG5cdHZhciBwdWIgPSBCdWZmZXIuZnJvbShwYWlyLnB1YmxpY0tleSk7XG5cdGFzc2VydC5zdHJpY3RFcXVhbChwcml2Lmxlbmd0aCwgNjQpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwocHViLmxlbmd0aCwgMzIpO1xuXG5cdHZhciBwYXJ0cyA9IFtdO1xuXHRwYXJ0cy5wdXNoKHtuYW1lOiAnQScsIGRhdGE6IHB1Yn0pO1xuXHRwYXJ0cy5wdXNoKHtuYW1lOiAnaycsIGRhdGE6IHByaXYuc2xpY2UoMCwgMzIpfSk7XG5cdHZhciBrZXkgPSBuZXcgUHJpdmF0ZUtleSh7XG5cdFx0dHlwZTogJ2VkMjU1MTknLFxuXHRcdHBhcnRzOiBwYXJ0c1xuXHR9KTtcblx0cmV0dXJuIChrZXkpO1xufVxuXG4vKiBHZW5lcmF0ZXMgYSBuZXcgRUNEU0EgcHJpdmF0ZSBrZXkgb24gYSBnaXZlbiBjdXJ2ZS4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRUNEU0EoY3VydmUpIHtcblx0dmFyIHBhcnRzID0gW107XG5cdHZhciBrZXk7XG5cblx0aWYgKENSWVBUT19IQVZFX0VDREgpIHtcblx0XHQvKlxuXHRcdCAqIE5vZGUgY3J5cHRvIGRvZXNuJ3QgZXhwb3NlIGtleSBnZW5lcmF0aW9uIGRpcmVjdGx5LCBidXQgdGhlXG5cdFx0ICogRUNESCBpbnN0YW5jZXMgY2FuIGdlbmVyYXRlIGtleXMuIEl0IHR1cm5zIG91dCB0aGlzIGp1c3Rcblx0XHQgKiBjYWxscyBpbnRvIHRoZSBPcGVuU1NMIGdlbmVyaWMga2V5IGdlbmVyYXRvciwgYW5kIHdlIGNhblxuXHRcdCAqIHJlYWQgaXRzIG91dHB1dCBoYXBwaWx5IHdpdGhvdXQgZG9pbmcgYW4gYWN0dWFsIERILiBTbyB3ZVxuXHRcdCAqIHVzZSB0aGF0IGhlcmUuXG5cdFx0ICovXG5cdFx0dmFyIG9zQ3VydmUgPSB7XG5cdFx0XHQnbmlzdHAyNTYnOiAncHJpbWUyNTZ2MScsXG5cdFx0XHQnbmlzdHAzODQnOiAnc2VjcDM4NHIxJyxcblx0XHRcdCduaXN0cDUyMSc6ICdzZWNwNTIxcjEnXG5cdFx0fVtjdXJ2ZV07XG5cblx0XHR2YXIgZGggPSBjcnlwdG8uY3JlYXRlRUNESChvc0N1cnZlKTtcblx0XHRkaC5nZW5lcmF0ZUtleXMoKTtcblxuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdjdXJ2ZScsXG5cdFx0ICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGN1cnZlKX0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdRJywgZGF0YTogZGguZ2V0UHVibGljS2V5KCl9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnZCcsIGRhdGE6IGRoLmdldFByaXZhdGVLZXkoKX0pO1xuXG5cdFx0a2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRcdGN1cnZlOiBjdXJ2ZSxcblx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdH0pO1xuXHRcdHJldHVybiAoa2V5KTtcblx0fSBlbHNlIHtcblxuXHRcdHZhciBlY1BhcmFtcyA9IG5ldyBYOUVDUGFyYW1ldGVycyhjdXJ2ZSk7XG5cblx0XHQvKiBUaGlzIGFsZ29yaXRobSB0YWtlbiBmcm9tIEZJUFMgUFVCIDE4Ni00IChzZWN0aW9uIEIuNC4xKSAqL1xuXHRcdHZhciBuID0gZWNQYXJhbXMuZ2V0TigpO1xuXHRcdC8qXG5cdFx0ICogVGhlIGNyeXB0by5yYW5kb21CeXRlcygpIGZ1bmN0aW9uIGNhbiBvbmx5IGdpdmUgdXMgd2hvbGVcblx0XHQgKiBieXRlcywgc28gdGFraW5nIGEgbm9kIGZyb20gWDkuNjIsIHdlIHJvdW5kIHVwLlxuXHRcdCAqL1xuXHRcdHZhciBjQnl0ZUxlbiA9IE1hdGguY2VpbCgobi5iaXRMZW5ndGgoKSArIDY0KSAvIDgpO1xuXHRcdHZhciBjID0gbmV3IGpzYm4oY3J5cHRvLnJhbmRvbUJ5dGVzKGNCeXRlTGVuKSk7XG5cblx0XHR2YXIgbjEgPSBuLnN1YnRyYWN0KGpzYm4uT05FKTtcblx0XHR2YXIgcHJpdiA9IGMubW9kKG4xKS5hZGQoanNibi5PTkUpO1xuXHRcdHZhciBwdWIgPSBlY1BhcmFtcy5nZXRHKCkubXVsdGlwbHkocHJpdik7XG5cblx0XHRwcml2ID0gQnVmZmVyLmZyb20ocHJpdi50b0J5dGVBcnJheSgpKTtcblx0XHRwdWIgPSBCdWZmZXIuZnJvbShlY1BhcmFtcy5nZXRDdXJ2ZSgpLlxuXHRcdCAgICBlbmNvZGVQb2ludEhleChwdWIpLCAnaGV4Jyk7XG5cblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnY3VydmUnLCBkYXRhOiBCdWZmZXIuZnJvbShjdXJ2ZSl9KTtcblx0XHRwYXJ0cy5wdXNoKHtuYW1lOiAnUScsIGRhdGE6IHB1Yn0pO1xuXHRcdHBhcnRzLnB1c2goe25hbWU6ICdkJywgZGF0YTogcHJpdn0pO1xuXG5cdFx0a2V5ID0gbmV3IFByaXZhdGVLZXkoe1xuXHRcdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRcdGN1cnZlOiBjdXJ2ZSxcblx0XHRcdHBhcnRzOiBwYXJ0c1xuXHRcdH0pO1xuXHRcdHJldHVybiAoa2V5KTtcblx0fVxufVxuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0VmVyaWZpZXI6IFZlcmlmaWVyLFxuXHRTaWduZXI6IFNpZ25lclxufTtcblxudmFyIG5hY2wgPSByZXF1aXJlKCd0d2VldG5hY2wnKTtcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG5cbmZ1bmN0aW9uIFZlcmlmaWVyKGtleSwgaGFzaEFsZ28pIHtcblx0aWYgKGhhc2hBbGdvLnRvTG93ZXJDYXNlKCkgIT09ICdzaGE1MTInKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ0VEMjU1MTkgb25seSBzdXBwb3J0cyB0aGUgdXNlIG9mICcgK1xuXHRcdCAgICAnU0hBLTUxMiBoYXNoZXMnKSk7XG5cblx0dGhpcy5rZXkgPSBrZXk7XG5cdHRoaXMuY2h1bmtzID0gW107XG5cblx0c3RyZWFtLldyaXRhYmxlLmNhbGwodGhpcywge30pO1xufVxudXRpbC5pbmhlcml0cyhWZXJpZmllciwgc3RyZWFtLldyaXRhYmxlKTtcblxuVmVyaWZpZXIucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jLCBjYikge1xuXHR0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcblx0Y2IoKTtcbn07XG5cblZlcmlmaWVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2h1bmspIHtcblx0aWYgKHR5cGVvZiAoY2h1bmspID09PSAnc3RyaW5nJylcblx0XHRjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCAnYmluYXJ5Jyk7XG5cdHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuVmVyaWZpZXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIChzaWduYXR1cmUsIGZtdCkge1xuXHR2YXIgc2lnO1xuXHRpZiAoU2lnbmF0dXJlLmlzU2lnbmF0dXJlKHNpZ25hdHVyZSwgWzIsIDBdKSkge1xuXHRcdGlmIChzaWduYXR1cmUudHlwZSAhPT0gJ2VkMjU1MTknKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cdFx0c2lnID0gc2lnbmF0dXJlLnRvQnVmZmVyKCdyYXcnKTtcblxuXHR9IGVsc2UgaWYgKHR5cGVvZiAoc2lnbmF0dXJlKSA9PT0gJ3N0cmluZycpIHtcblx0XHRzaWcgPSBCdWZmZXIuZnJvbShzaWduYXR1cmUsICdiYXNlNjQnKTtcblxuXHR9IGVsc2UgaWYgKFNpZ25hdHVyZS5pc1NpZ25hdHVyZShzaWduYXR1cmUsIFsxLCAwXSkpIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdzaWduYXR1cmUgd2FzIGNyZWF0ZWQgYnkgdG9vIG9sZCAnICtcblx0XHQgICAgJ2EgdmVyc2lvbiBvZiBzc2hwayBhbmQgY2Fubm90IGJlIHZlcmlmaWVkJykpO1xuXHR9XG5cblx0YXNzZXJ0LmJ1ZmZlcihzaWcpO1xuXHRyZXR1cm4gKG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkoXG5cdCAgICBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzKSksXG5cdCAgICBuZXcgVWludDhBcnJheShzaWcpLFxuXHQgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5rZXkucGFydC5BLmRhdGEpKSk7XG59O1xuXG5mdW5jdGlvbiBTaWduZXIoa2V5LCBoYXNoQWxnbykge1xuXHRpZiAoaGFzaEFsZ28udG9Mb3dlckNhc2UoKSAhPT0gJ3NoYTUxMicpXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignRUQyNTUxOSBvbmx5IHN1cHBvcnRzIHRoZSB1c2Ugb2YgJyArXG5cdFx0ICAgICdTSEEtNTEyIGhhc2hlcycpKTtcblxuXHR0aGlzLmtleSA9IGtleTtcblx0dGhpcy5jaHVua3MgPSBbXTtcblxuXHRzdHJlYW0uV3JpdGFibGUuY2FsbCh0aGlzLCB7fSk7XG59XG51dGlsLmluaGVyaXRzKFNpZ25lciwgc3RyZWFtLldyaXRhYmxlKTtcblxuU2lnbmVyLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcblx0dGhpcy5jaHVua3MucHVzaChjaHVuayk7XG5cdGNiKCk7XG59O1xuXG5TaWduZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChjaHVuaykge1xuXHRpZiAodHlwZW9mIChjaHVuaykgPT09ICdzdHJpbmcnKVxuXHRcdGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssICdiaW5hcnknKTtcblx0dGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5TaWduZXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzaWcgPSBuYWNsLnNpZ24uZGV0YWNoZWQoXG5cdCAgICBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzKSksXG5cdCAgICBuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KFtcblx0XHR0aGlzLmtleS5wYXJ0LmsuZGF0YSwgdGhpcy5rZXkucGFydC5BLmRhdGFdKSkpO1xuXHR2YXIgc2lnQnVmID0gQnVmZmVyLmZyb20oc2lnKTtcblx0dmFyIHNpZ09iaiA9IFNpZ25hdHVyZS5wYXJzZShzaWdCdWYsICdlZDI1NTE5JywgJ3JhdycpO1xuXHRzaWdPYmouaGFzaEFsZ29yaXRobSA9ICdzaGE1MTInO1xuXHRyZXR1cm4gKHNpZ09iaik7XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE4IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0cmVhZFBrY3M4OiByZWFkUGtjczgsXG5cdHdyaXRlOiB3cml0ZSxcblx0d3JpdGVQa2NzODogd3JpdGVQa2NzOCxcblx0cGtjczhUb0J1ZmZlcjogcGtjczhUb0J1ZmZlcixcblxuXHRyZWFkRUNEU0FDdXJ2ZTogcmVhZEVDRFNBQ3VydmUsXG5cdHdyaXRlRUNEU0FDdXJ2ZTogd3JpdGVFQ0RTQUN1cnZlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcbnZhciBwZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHBlbS5yZWFkKGJ1Ziwgb3B0aW9ucywgJ3BrY3M4JykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0cmV0dXJuIChwZW0ud3JpdGUoa2V5LCBvcHRpb25zLCAncGtjczgnKSk7XG59XG5cbi8qIEhlbHBlciB0byByZWFkIGluIGEgc2luZ2xlIG1waW50ICovXG5mdW5jdGlvbiByZWFkTVBJbnQoZGVyLCBubSkge1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwoZGVyLnBlZWsoKSwgYXNuMS5CZXIuSW50ZWdlcixcblx0ICAgIG5tICsgJyBpcyBub3QgYW4gSW50ZWdlcicpO1xuXHRyZXR1cm4gKHV0aWxzLm1wTm9ybWFsaXplKGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkludGVnZXIsIHRydWUpKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzOChhbGcsIHR5cGUsIGRlcikge1xuXHQvKiBQcml2YXRlIGtleXMgaW4gcGtjcyM4IGZvcm1hdCBoYXZlIGEgd2VpcmQgZXh0cmEgaW50ICovXG5cdGlmIChkZXIucGVlaygpID09PSBhc24xLkJlci5JbnRlZ2VyKSB7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKHR5cGUsICdwcml2YXRlJyxcblx0XHQgICAgJ3VuZXhwZWN0ZWQgSW50ZWdlciBhdCBzdGFydCBvZiBwdWJsaWMga2V5Jyk7XG5cdFx0ZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSk7XG5cdH1cblxuXHRkZXIucmVhZFNlcXVlbmNlKCk7XG5cdHZhciBuZXh0ID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cblx0dmFyIG9pZCA9IGRlci5yZWFkT0lEKCk7XG5cdHN3aXRjaCAob2lkKSB7XG5cdGNhc2UgJzEuMi44NDAuMTEzNTQ5LjEuMS4xJzpcblx0XHRkZXIuX29mZnNldCA9IG5leHQ7XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhSU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhSU0FQcml2YXRlKGRlcikpO1xuXHRjYXNlICcxLjIuODQwLjEwMDQwLjQuMSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhEU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhEU0FQcml2YXRlKGRlcikpO1xuXHRjYXNlICcxLjIuODQwLjEwMDQ1LjIuMSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhFQ0RTQVB1YmxpYyhkZXIpKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gKHJlYWRQa2NzOEVDRFNBUHJpdmF0ZShkZXIpKTtcblx0Y2FzZSAnMS4zLjEwMS4xMTInOlxuXHRcdGlmICh0eXBlID09PSAncHVibGljJykge1xuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhFZERTQVB1YmxpYyhkZXIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhFZERTQVByaXZhdGUoZGVyKSk7XG5cdFx0fVxuXHRjYXNlICcxLjMuMTAxLjExMCc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKSB7XG5cdFx0XHRyZXR1cm4gKHJlYWRQa2NzOFgyNTUxOVB1YmxpYyhkZXIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIChyZWFkUGtjczhYMjU1MTlQcml2YXRlKGRlcikpO1xuXHRcdH1cblx0ZGVmYXVsdDpcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIGtleSB0eXBlIE9JRCAnICsgb2lkKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4UlNBUHVibGljKGRlcikge1xuXHQvLyBiaXQgc3RyaW5nIHNlcXVlbmNlXG5cdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLnJlYWRCeXRlKCk7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHQvLyBtb2R1bHVzXG5cdHZhciBuID0gcmVhZE1QSW50KGRlciwgJ21vZHVsdXMnKTtcblx0dmFyIGUgPSByZWFkTVBJbnQoZGVyLCAnZXhwb25lbnQnKTtcblxuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdyc2EnLFxuXHRcdHNvdXJjZTogZGVyLm9yaWdpbmFsSW5wdXQsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2UnLCBkYXRhOiBlIH0sXG5cdFx0XHR7IG5hbWU6ICduJywgZGF0YTogbiB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4UlNBUHJpdmF0ZShkZXIpIHtcblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHR2YXIgdmVyID0gcmVhZE1QSW50KGRlciwgJ3ZlcnNpb24nKTtcblx0YXNzZXJ0LmVxdWFsKHZlclswXSwgMHgwLCAndW5rbm93biBSU0EgcHJpdmF0ZSBrZXkgdmVyc2lvbicpO1xuXG5cdC8vIG1vZHVsdXMgdGhlbiBwdWJsaWMgZXhwb25lbnRcblx0dmFyIG4gPSByZWFkTVBJbnQoZGVyLCAnbW9kdWx1cycpO1xuXHR2YXIgZSA9IHJlYWRNUEludChkZXIsICdwdWJsaWMgZXhwb25lbnQnKTtcblx0dmFyIGQgPSByZWFkTVBJbnQoZGVyLCAncHJpdmF0ZSBleHBvbmVudCcpO1xuXHR2YXIgcCA9IHJlYWRNUEludChkZXIsICdwcmltZTEnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncHJpbWUyJyk7XG5cdHZhciBkbW9kcCA9IHJlYWRNUEludChkZXIsICdleHBvbmVudDEnKTtcblx0dmFyIGRtb2RxID0gcmVhZE1QSW50KGRlciwgJ2V4cG9uZW50MicpO1xuXHR2YXIgaXFtcCA9IHJlYWRNUEludChkZXIsICdpcW1wJyk7XG5cblx0Ly8gbm93LCBtYWtlIHRoZSBrZXlcblx0dmFyIGtleSA9IHtcblx0XHR0eXBlOiAncnNhJyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnbicsIGRhdGE6IG4gfSxcblx0XHRcdHsgbmFtZTogJ2UnLCBkYXRhOiBlIH0sXG5cdFx0XHR7IG5hbWU6ICdkJywgZGF0YTogZCB9LFxuXHRcdFx0eyBuYW1lOiAnaXFtcCcsIGRhdGE6IGlxbXAgfSxcblx0XHRcdHsgbmFtZTogJ3AnLCBkYXRhOiBwIH0sXG5cdFx0XHR7IG5hbWU6ICdxJywgZGF0YTogcSB9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHAnLCBkYXRhOiBkbW9kcCB9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHEnLCBkYXRhOiBkbW9kcSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IFByaXZhdGVLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzOERTQVB1YmxpYyhkZXIpIHtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3AnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncScpO1xuXHR2YXIgZyA9IHJlYWRNUEludChkZXIsICdnJyk7XG5cblx0Ly8gYml0IHN0cmluZyBzZXF1ZW5jZVxuXHRkZXIucmVhZFNlcXVlbmNlKGFzbjEuQmVyLkJpdFN0cmluZyk7XG5cdGRlci5yZWFkQnl0ZSgpO1xuXG5cdHZhciB5ID0gcmVhZE1QSW50KGRlciwgJ3knKTtcblxuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdkc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdwJywgZGF0YTogcCB9LFxuXHRcdFx0eyBuYW1lOiAncScsIGRhdGE6IHEgfSxcblx0XHRcdHsgbmFtZTogJ2cnLCBkYXRhOiBnIH0sXG5cdFx0XHR7IG5hbWU6ICd5JywgZGF0YTogeSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4RFNBUHJpdmF0ZShkZXIpIHtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3AnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncScpO1xuXHR2YXIgZyA9IHJlYWRNUEludChkZXIsICdnJyk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdHZhciB4ID0gcmVhZE1QSW50KGRlciwgJ3gnKTtcblxuXHQvKiBUaGUgcGtjcyM4IGZvcm1hdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwdWJsaWMga2V5ICovXG5cdHZhciB5ID0gdXRpbHMuY2FsY3VsYXRlRFNBUHVibGljKGcsIHAsIHgpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ3AnLCBkYXRhOiBwIH0sXG5cdFx0XHR7IG5hbWU6ICdxJywgZGF0YTogcSB9LFxuXHRcdFx0eyBuYW1lOiAnZycsIGRhdGE6IGcgfSxcblx0XHRcdHsgbmFtZTogJ3knLCBkYXRhOiB5IH0sXG5cdFx0XHR7IG5hbWU6ICd4JywgZGF0YTogeCB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IFByaXZhdGVLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRFQ0RTQUN1cnZlKGRlcikge1xuXHR2YXIgY3VydmVOYW1lLCBjdXJ2ZU5hbWVzO1xuXHR2YXIgaiwgYywgY2Q7XG5cblx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLk9JRCkge1xuXHRcdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXG5cdFx0Y3VydmVOYW1lcyA9IE9iamVjdC5rZXlzKGFsZ3MuY3VydmVzKTtcblx0XHRmb3IgKGogPSAwOyBqIDwgY3VydmVOYW1lcy5sZW5ndGg7ICsraikge1xuXHRcdFx0YyA9IGN1cnZlTmFtZXNbal07XG5cdFx0XHRjZCA9IGFsZ3MuY3VydmVzW2NdO1xuXHRcdFx0aWYgKGNkLnBrY3M4b2lkID09PSBvaWQpIHtcblx0XHRcdFx0Y3VydmVOYW1lID0gYztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cdFx0Ly8gRUNQYXJhbWV0ZXJzIHNlcXVlbmNlXG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHZhciB2ZXJzaW9uID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSk7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKHZlcnNpb25bMF0sIDEsICdFQ0RTQSBrZXkgbm90IHZlcnNpb24gMScpO1xuXG5cdFx0dmFyIGN1cnZlID0ge307XG5cblx0XHQvLyBGaWVsZElEIHNlcXVlbmNlXG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHZhciBmaWVsZFR5cGVPaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChmaWVsZFR5cGVPaWQsICcxLjIuODQwLjEwMDQ1LjEuMScsXG5cdFx0ICAgICdFQ0RTQSBrZXkgaXMgbm90IGZyb20gYSBwcmltZS1maWVsZCcpO1xuXHRcdHZhciBwID0gY3VydmUucCA9IHV0aWxzLm1wTm9ybWFsaXplKFxuXHRcdCAgICBkZXIucmVhZFN0cmluZyhhc24xLkJlci5JbnRlZ2VyLCB0cnVlKSk7XG5cdFx0Lypcblx0XHQgKiBwIGFsd2F5cyBzdGFydHMgd2l0aCBhIDEgYml0LCBzbyBjb3VudCB0aGUgemVyb3MgdG8gZ2V0IGl0c1xuXHRcdCAqIHJlYWwgc2l6ZS5cblx0XHQgKi9cblx0XHRjdXJ2ZS5zaXplID0gcC5sZW5ndGggKiA4IC0gdXRpbHMuY291bnRaZXJvcyhwKTtcblxuXHRcdC8vIEN1cnZlIHNlcXVlbmNlXG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdGN1cnZlLmEgPSB1dGlscy5tcE5vcm1hbGl6ZShcblx0XHQgICAgZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpKTtcblx0XHRjdXJ2ZS5iID0gdXRpbHMubXBOb3JtYWxpemUoXG5cdFx0ICAgIGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKSk7XG5cdFx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLkJpdFN0cmluZylcblx0XHRcdGN1cnZlLnMgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5CaXRTdHJpbmcsIHRydWUpO1xuXG5cdFx0Ly8gQ29tYmluZWQgR3ggYW5kIEd5XG5cdFx0Y3VydmUuRyA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwoY3VydmUuR1swXSwgMHg0LFxuXHRcdCAgICAndW5jb21wcmVzc2VkIEcgaXMgcmVxdWlyZWQnKTtcblxuXHRcdGN1cnZlLm4gPSB1dGlscy5tcE5vcm1hbGl6ZShcblx0XHQgICAgZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpO1xuXHRcdGN1cnZlLmggPSB1dGlscy5tcE5vcm1hbGl6ZShcblx0XHQgICAgZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpO1xuXHRcdGFzc2VydC5zdHJpY3RFcXVhbChjdXJ2ZS5oWzBdLCAweDEsICdhIGNvZmFjdG9yPTEgY3VydmUgaXMgJyArXG5cdFx0ICAgICdyZXF1aXJlZCcpO1xuXG5cdFx0Y3VydmVOYW1lcyA9IE9iamVjdC5rZXlzKGFsZ3MuY3VydmVzKTtcblx0XHR2YXIga3MgPSBPYmplY3Qua2V5cyhjdXJ2ZSk7XG5cdFx0Zm9yIChqID0gMDsgaiA8IGN1cnZlTmFtZXMubGVuZ3RoOyArK2opIHtcblx0XHRcdGMgPSBjdXJ2ZU5hbWVzW2pdO1xuXHRcdFx0Y2QgPSBhbGdzLmN1cnZlc1tjXTtcblx0XHRcdHZhciBlcXVhbCA9IHRydWU7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGtzLmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHZhciBrID0ga3NbaV07XG5cdFx0XHRcdGlmIChjZFtrXSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRpZiAodHlwZW9mIChjZFtrXSkgPT09ICdvYmplY3QnICYmXG5cdFx0XHRcdCAgICBjZFtrXS5lcXVhbHMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmICghY2Rba10uZXF1YWxzKGN1cnZlW2tdKSkge1xuXHRcdFx0XHRcdFx0ZXF1YWwgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoY2Rba10pKSB7XG5cdFx0XHRcdFx0aWYgKGNkW2tdLnRvU3RyaW5nKCdiaW5hcnknKVxuXHRcdFx0XHRcdCAgICAhPT0gY3VydmVba10udG9TdHJpbmcoJ2JpbmFyeScpKSB7XG5cdFx0XHRcdFx0XHRlcXVhbCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChjZFtrXSAhPT0gY3VydmVba10pIHtcblx0XHRcdFx0XHRcdGVxdWFsID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChlcXVhbCkge1xuXHRcdFx0XHRjdXJ2ZU5hbWUgPSBjO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIChjdXJ2ZU5hbWUpO1xufVxuXG5mdW5jdGlvbiByZWFkUGtjczhFQ0RTQVByaXZhdGUoZGVyKSB7XG5cdHZhciBjdXJ2ZU5hbWUgPSByZWFkRUNEU0FDdXJ2ZShkZXIpO1xuXHRhc3NlcnQuc3RyaW5nKGN1cnZlTmFtZSwgJ2Ega25vd24gZWxsaXB0aWMgY3VydmUnKTtcblxuXHRkZXIucmVhZFNlcXVlbmNlKGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdHZhciB2ZXJzaW9uID0gcmVhZE1QSW50KGRlciwgJ3ZlcnNpb24nKTtcblx0YXNzZXJ0LmVxdWFsKHZlcnNpb25bMF0sIDEsICd1bmtub3duIHZlcnNpb24gb2YgRUNEU0Ega2V5Jyk7XG5cblx0dmFyIGQgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5PY3RldFN0cmluZywgdHJ1ZSk7XG5cdHZhciBRO1xuXG5cdGlmIChkZXIucGVlaygpID09IDB4YTApIHtcblx0XHRkZXIucmVhZFNlcXVlbmNlKDB4YTApO1xuXHRcdGRlci5fb2Zmc2V0ICs9IGRlci5sZW5ndGg7XG5cdH1cblx0aWYgKGRlci5wZWVrKCkgPT0gMHhhMSkge1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoMHhhMSk7XG5cdFx0USA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFx0USA9IHV0aWxzLmVjTm9ybWFsaXplKFEpO1xuXHR9XG5cblx0aWYgKFEgPT09IHVuZGVmaW5lZCkge1xuXHRcdHZhciBwdWIgPSB1dGlscy5wdWJsaWNGcm9tUHJpdmF0ZUVDRFNBKGN1cnZlTmFtZSwgZCk7XG5cdFx0USA9IHB1Yi5wYXJ0LlEuZGF0YTtcblx0fVxuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnY3VydmUnLCBkYXRhOiBCdWZmZXIuZnJvbShjdXJ2ZU5hbWUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9LFxuXHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IGQgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGtleSkpO1xufVxuXG5mdW5jdGlvbiByZWFkUGtjczhFQ0RTQVB1YmxpYyhkZXIpIHtcblx0dmFyIGN1cnZlTmFtZSA9IHJlYWRFQ0RTQUN1cnZlKGRlcik7XG5cdGFzc2VydC5zdHJpbmcoY3VydmVOYW1lLCAnYSBrbm93biBlbGxpcHRpYyBjdXJ2ZScpO1xuXG5cdHZhciBRID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuQml0U3RyaW5nLCB0cnVlKTtcblx0USA9IHV0aWxzLmVjTm9ybWFsaXplKFEpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnY3VydmUnLCBkYXRhOiBCdWZmZXIuZnJvbShjdXJ2ZU5hbWUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4RWREU0FQdWJsaWMoZGVyKSB7XG5cdGlmIChkZXIucGVlaygpID09PSAweDAwKVxuXHRcdGRlci5yZWFkQnl0ZSgpO1xuXG5cdHZhciBBID0gdXRpbHMucmVhZEJpdFN0cmluZyhkZXIpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VkMjU1MTknLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdBJywgZGF0YTogdXRpbHMuemVyb1BhZFRvTGVuZ3RoKEEsIDMyKSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4WDI1NTE5UHVibGljKGRlcikge1xuXHR2YXIgQSA9IHV0aWxzLnJlYWRCaXRTdHJpbmcoZGVyKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdjdXJ2ZTI1NTE5Jyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnQScsIGRhdGE6IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMikgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzOEVkRFNBUHJpdmF0ZShkZXIpIHtcblx0aWYgKGRlci5wZWVrKCkgPT09IDB4MDApXG5cdFx0ZGVyLnJlYWRCeXRlKCk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdHZhciBrID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpO1xuXHRrID0gdXRpbHMuemVyb1BhZFRvTGVuZ3RoKGssIDMyKTtcblxuXHR2YXIgQTtcblx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLkJpdFN0cmluZykge1xuXHRcdEEgPSB1dGlscy5yZWFkQml0U3RyaW5nKGRlcik7XG5cdFx0QSA9IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMik7XG5cdH0gZWxzZSB7XG5cdFx0QSA9IHV0aWxzLmNhbGN1bGF0ZUVEMjU1MTlQdWJsaWMoayk7XG5cdH1cblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdlZDI1NTE5Jyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnQScsIGRhdGE6IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMikgfSxcblx0XHRcdHsgbmFtZTogJ2snLCBkYXRhOiB1dGlscy56ZXJvUGFkVG9MZW5ndGgoaywgMzIpIH1cblx0XHRdXG5cdH07XG5cblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3M4WDI1NTE5UHJpdmF0ZShkZXIpIHtcblx0aWYgKGRlci5wZWVrKCkgPT09IDB4MDApXG5cdFx0ZGVyLnJlYWRCeXRlKCk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdHZhciBrID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpO1xuXHRrID0gdXRpbHMuemVyb1BhZFRvTGVuZ3RoKGssIDMyKTtcblxuXHR2YXIgQSA9IHV0aWxzLmNhbGN1bGF0ZVgyNTUxOVB1YmxpYyhrKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdjdXJ2ZTI1NTE5Jyxcblx0XHRwYXJ0czogW1xuXHRcdFx0eyBuYW1lOiAnQScsIGRhdGE6IHV0aWxzLnplcm9QYWRUb0xlbmd0aChBLCAzMikgfSxcblx0XHRcdHsgbmFtZTogJ2snLCBkYXRhOiB1dGlscy56ZXJvUGFkVG9MZW5ndGgoaywgMzIpIH1cblx0XHRdXG5cdH07XG5cblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcGtjczhUb0J1ZmZlcihrZXkpIHtcblx0dmFyIGRlciA9IG5ldyBhc24xLkJlcldyaXRlcigpO1xuXHR3cml0ZVBrY3M4KGRlciwga2V5KTtcblx0cmV0dXJuIChkZXIuYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzOChkZXIsIGtleSkge1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdGlmIChQcml2YXRlS2V5LmlzUHJpdmF0ZUtleShrZXkpKSB7XG5cdFx0dmFyIHNpbGx5SW50ID0gQnVmZmVyLmZyb20oWzBdKTtcblx0XHRkZXIud3JpdGVCdWZmZXIoc2lsbHlJbnQsIGFzbjEuQmVyLkludGVnZXIpO1xuXHR9XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblx0c3dpdGNoIChrZXkudHlwZSkge1xuXHRjYXNlICdyc2EnOlxuXHRcdGRlci53cml0ZU9JRCgnMS4yLjg0MC4xMTM1NDkuMS4xLjEnKTtcblx0XHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRcdHdyaXRlUGtjczhSU0FQcml2YXRlKGtleSwgZGVyKTtcblx0XHRlbHNlXG5cdFx0XHR3cml0ZVBrY3M4UlNBUHVibGljKGtleSwgZGVyKTtcblx0XHRicmVhaztcblx0Y2FzZSAnZHNhJzpcblx0XHRkZXIud3JpdGVPSUQoJzEuMi44NDAuMTAwNDAuNC4xJyk7XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR3cml0ZVBrY3M4RFNBUHJpdmF0ZShrZXksIGRlcik7XG5cdFx0ZWxzZVxuXHRcdFx0d3JpdGVQa2NzOERTQVB1YmxpYyhrZXksIGRlcik7XG5cdFx0YnJlYWs7XG5cdGNhc2UgJ2VjZHNhJzpcblx0XHRkZXIud3JpdGVPSUQoJzEuMi44NDAuMTAwNDUuMi4xJyk7XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR3cml0ZVBrY3M4RUNEU0FQcml2YXRlKGtleSwgZGVyKTtcblx0XHRlbHNlXG5cdFx0XHR3cml0ZVBrY3M4RUNEU0FQdWJsaWMoa2V5LCBkZXIpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRkZXIud3JpdGVPSUQoJzEuMy4xMDEuMTEyJyk7XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdFZDI1NTE5IHByaXZhdGUga2V5cyBpbiBwa2NzOCAnICtcblx0XHRcdCAgICAnZm9ybWF0IGFyZSBub3Qgc3VwcG9ydGVkJykpO1xuXHRcdHdyaXRlUGtjczhFZERTQVB1YmxpYyhrZXksIGRlcik7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2V5IHR5cGU6ICcgKyBrZXkudHlwZSkpO1xuXHR9XG5cblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczhSU0FQcml2YXRlKGtleSwgZGVyKSB7XG5cdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdHZhciB2ZXJzaW9uID0gQnVmZmVyLmZyb20oWzBdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlcnNpb24sIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5uLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZS5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmQuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5wLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucS5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0aWYgKCFrZXkucGFydC5kbW9kcCB8fCAha2V5LnBhcnQuZG1vZHEpXG5cdFx0dXRpbHMuYWRkUlNBTWlzc2luZyhrZXkpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZG1vZHAuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kbW9kcS5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmlxbXAuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4UlNBUHVibGljKGtleSwgZGVyKSB7XG5cdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLndyaXRlQnl0ZSgweDAwKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQubi5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmUuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4RFNBUHJpdmF0ZShrZXksIGRlcikge1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5nLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC54LmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzOERTQVB1YmxpYyhrZXksIGRlcikge1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5nLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLndyaXRlQnl0ZSgweDAwKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnkuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVDRFNBQ3VydmUoa2V5LCBkZXIpIHtcblx0dmFyIGN1cnZlID0gYWxncy5jdXJ2ZXNba2V5LmN1cnZlXTtcblx0aWYgKGN1cnZlLnBrY3M4b2lkKSB7XG5cdFx0LyogVGhpcyBvbmUgaGFzIGEgbmFtZSBpbiBwa2NzIzgsIHNvIGp1c3Qgd3JpdGUgdGhlIG9pZCAqL1xuXHRcdGRlci53cml0ZU9JRChjdXJ2ZS5wa2NzOG9pZCk7XG5cblx0fSBlbHNlIHtcblx0XHQvLyBFQ1BhcmFtZXRlcnMgc2VxdWVuY2Vcblx0XHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdFx0dmFyIHZlcnNpb24gPSBCdWZmZXIuZnJvbShbMV0pO1xuXHRcdGRlci53cml0ZUJ1ZmZlcih2ZXJzaW9uLCBhc24xLkJlci5JbnRlZ2VyKTtcblxuXHRcdC8vIEZpZWxkSUQgc2VxdWVuY2Vcblx0XHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXHRcdGRlci53cml0ZU9JRCgnMS4yLjg0MC4xMDA0NS4xLjEnKTsgLy8gcHJpbWUtZmllbGRcblx0XHRkZXIud3JpdGVCdWZmZXIoY3VydmUucCwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0XHQvLyBDdXJ2ZSBzZXF1ZW5jZVxuXHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0dmFyIGEgPSBjdXJ2ZS5wO1xuXHRcdGlmIChhWzBdID09PSAweDApXG5cdFx0XHRhID0gYS5zbGljZSgxKTtcblx0XHRkZXIud3JpdGVCdWZmZXIoYSwgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci53cml0ZUJ1ZmZlcihjdXJ2ZS5iLCBhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0ZGVyLndyaXRlQnVmZmVyKGN1cnZlLnMsIGFzbjEuQmVyLkJpdFN0cmluZyk7XG5cdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0XHRkZXIud3JpdGVCdWZmZXIoY3VydmUuRywgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci53cml0ZUJ1ZmZlcihjdXJ2ZS5uLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0XHR2YXIgaCA9IGN1cnZlLmg7XG5cdFx0aWYgKCFoKSB7XG5cdFx0XHRoID0gQnVmZmVyLmZyb20oWzFdKTtcblx0XHR9XG5cdFx0ZGVyLndyaXRlQnVmZmVyKGgsIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdFx0Ly8gRUNQYXJhbWV0ZXJzXG5cdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzOEVDRFNBUHVibGljKGtleSwgZGVyKSB7XG5cdHdyaXRlRUNEU0FDdXJ2ZShrZXksIGRlcik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdHZhciBRID0gdXRpbHMuZWNOb3JtYWxpemUoa2V5LnBhcnQuUS5kYXRhLCB0cnVlKTtcblx0ZGVyLndyaXRlQnVmZmVyKFEsIGFzbjEuQmVyLkJpdFN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczhFQ0RTQVByaXZhdGUoa2V5LCBkZXIpIHtcblx0d3JpdGVFQ0RTQUN1cnZlKGtleSwgZGVyKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdHZhciB2ZXJzaW9uID0gQnVmZmVyLmZyb20oWzFdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlcnNpb24sIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kLmRhdGEsIGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZSgweGExKTtcblx0dmFyIFEgPSB1dGlscy5lY05vcm1hbGl6ZShrZXkucGFydC5RLmRhdGEsIHRydWUpO1xuXHRkZXIud3JpdGVCdWZmZXIoUSwgYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4RWREU0FQdWJsaWMoa2V5LCBkZXIpIHtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0dXRpbHMud3JpdGVCaXRTdHJpbmcoZGVyLCBrZXkucGFydC5BLmRhdGEpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3M4RWREU0FQcml2YXRlKGtleSwgZGVyKSB7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdHZhciBrID0gdXRpbHMubXBOb3JtYWxpemUoa2V5LnBhcnQuay5kYXRhLCB0cnVlKTtcblx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIud3JpdGVCdWZmZXIoaywgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHJlYWRQa2NzMTogcmVhZFBrY3MxLFxuXHR3cml0ZTogd3JpdGUsXG5cdHdyaXRlUGtjczE6IHdyaXRlUGtjczFcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuLi9hbGdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG52YXIgcGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcblxudmFyIHBrY3M4ID0gcmVxdWlyZSgnLi9wa2NzOCcpO1xudmFyIHJlYWRFQ0RTQUN1cnZlID0gcGtjczgucmVhZEVDRFNBQ3VydmU7XG5cbmZ1bmN0aW9uIHJlYWQoYnVmLCBvcHRpb25zKSB7XG5cdHJldHVybiAocGVtLnJlYWQoYnVmLCBvcHRpb25zLCAncGtjczEnKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKGtleSwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHBlbS53cml0ZShrZXksIG9wdGlvbnMsICdwa2NzMScpKTtcbn1cblxuLyogSGVscGVyIHRvIHJlYWQgaW4gYSBzaW5nbGUgbXBpbnQgKi9cbmZ1bmN0aW9uIHJlYWRNUEludChkZXIsIG5tKSB7XG5cdGFzc2VydC5zdHJpY3RFcXVhbChkZXIucGVlaygpLCBhc24xLkJlci5JbnRlZ2VyLFxuXHQgICAgbm0gKyAnIGlzIG5vdCBhbiBJbnRlZ2VyJyk7XG5cdHJldHVybiAodXRpbHMubXBOb3JtYWxpemUoZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxKGFsZywgdHlwZSwgZGVyKSB7XG5cdHN3aXRjaCAoYWxnKSB7XG5cdGNhc2UgJ1JTQSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFSU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gJ3ByaXZhdGUnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFSU0FQcml2YXRlKGRlcikpO1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24ga2V5IHR5cGU6ICcgKyB0eXBlKSk7XG5cdGNhc2UgJ0RTQSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFEU0FQdWJsaWMoZGVyKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gJ3ByaXZhdGUnKVxuXHRcdFx0cmV0dXJuIChyZWFkUGtjczFEU0FQcml2YXRlKGRlcikpO1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24ga2V5IHR5cGU6ICcgKyB0eXBlKSk7XG5cdGNhc2UgJ0VDJzpcblx0Y2FzZSAnRUNEU0EnOlxuXHRcdGlmICh0eXBlID09PSAncHJpdmF0ZScpXG5cdFx0XHRyZXR1cm4gKHJlYWRQa2NzMUVDRFNBUHJpdmF0ZShkZXIpKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSAncHVibGljJylcblx0XHRcdHJldHVybiAocmVhZFBrY3MxRUNEU0FQdWJsaWMoZGVyKSk7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBrZXkgdHlwZTogJyArIHR5cGUpKTtcblx0Y2FzZSAnRUREU0EnOlxuXHRjYXNlICdFZERTQSc6XG5cdFx0aWYgKHR5cGUgPT09ICdwcml2YXRlJylcblx0XHRcdHJldHVybiAocmVhZFBrY3MxRWREU0FQcml2YXRlKGRlcikpO1xuXHRcdHRocm93IChuZXcgRXJyb3IodHlwZSArICcga2V5cyBub3Qgc3VwcG9ydGVkIHdpdGggRWREU0EnKSk7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBrZXkgYWxnbzogJyArIGFsZykpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzMVJTQVB1YmxpYyhkZXIpIHtcblx0Ly8gbW9kdWx1cyBhbmQgZXhwb25lbnRcblx0dmFyIG4gPSByZWFkTVBJbnQoZGVyLCAnbW9kdWx1cycpO1xuXHR2YXIgZSA9IHJlYWRNUEludChkZXIsICdleHBvbmVudCcpO1xuXG5cdC8vIG5vdywgbWFrZSB0aGUga2V5XG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ3JzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2UnLCBkYXRhOiBlIH0sXG5cdFx0XHR7IG5hbWU6ICduJywgZGF0YTogbiB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxUlNBUHJpdmF0ZShkZXIpIHtcblx0dmFyIHZlcnNpb24gPSByZWFkTVBJbnQoZGVyLCAndmVyc2lvbicpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwodmVyc2lvblswXSwgMCk7XG5cblx0Ly8gbW9kdWx1cyB0aGVuIHB1YmxpYyBleHBvbmVudFxuXHR2YXIgbiA9IHJlYWRNUEludChkZXIsICdtb2R1bHVzJyk7XG5cdHZhciBlID0gcmVhZE1QSW50KGRlciwgJ3B1YmxpYyBleHBvbmVudCcpO1xuXHR2YXIgZCA9IHJlYWRNUEludChkZXIsICdwcml2YXRlIGV4cG9uZW50Jyk7XG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3ByaW1lMScpO1xuXHR2YXIgcSA9IHJlYWRNUEludChkZXIsICdwcmltZTInKTtcblx0dmFyIGRtb2RwID0gcmVhZE1QSW50KGRlciwgJ2V4cG9uZW50MScpO1xuXHR2YXIgZG1vZHEgPSByZWFkTVBJbnQoZGVyLCAnZXhwb25lbnQyJyk7XG5cdHZhciBpcW1wID0gcmVhZE1QSW50KGRlciwgJ2lxbXAnKTtcblxuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdyc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICduJywgZGF0YTogbiB9LFxuXHRcdFx0eyBuYW1lOiAnZScsIGRhdGE6IGUgfSxcblx0XHRcdHsgbmFtZTogJ2QnLCBkYXRhOiBkIH0sXG5cdFx0XHR7IG5hbWU6ICdpcW1wJywgZGF0YTogaXFtcCB9LFxuXHRcdFx0eyBuYW1lOiAncCcsIGRhdGE6IHAgfSxcblx0XHRcdHsgbmFtZTogJ3EnLCBkYXRhOiBxIH0sXG5cdFx0XHR7IG5hbWU6ICdkbW9kcCcsIGRhdGE6IGRtb2RwIH0sXG5cdFx0XHR7IG5hbWU6ICdkbW9kcScsIGRhdGE6IGRtb2RxIH1cblx0XHRdXG5cdH07XG5cblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxRFNBUHJpdmF0ZShkZXIpIHtcblx0dmFyIHZlcnNpb24gPSByZWFkTVBJbnQoZGVyLCAndmVyc2lvbicpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwodmVyc2lvbi5yZWFkVUludDgoMCksIDApO1xuXG5cdHZhciBwID0gcmVhZE1QSW50KGRlciwgJ3AnKTtcblx0dmFyIHEgPSByZWFkTVBJbnQoZGVyLCAncScpO1xuXHR2YXIgZyA9IHJlYWRNUEludChkZXIsICdnJyk7XG5cdHZhciB5ID0gcmVhZE1QSW50KGRlciwgJ3knKTtcblx0dmFyIHggPSByZWFkTVBJbnQoZGVyLCAneCcpO1xuXG5cdC8vIG5vdywgbWFrZSB0aGUga2V5XG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ3AnLCBkYXRhOiBwIH0sXG5cdFx0XHR7IG5hbWU6ICdxJywgZGF0YTogcSB9LFxuXHRcdFx0eyBuYW1lOiAnZycsIGRhdGE6IGcgfSxcblx0XHRcdHsgbmFtZTogJ3knLCBkYXRhOiB5IH0sXG5cdFx0XHR7IG5hbWU6ICd4JywgZGF0YTogeCB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IFByaXZhdGVLZXkoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQa2NzMUVkRFNBUHJpdmF0ZShkZXIpIHtcblx0dmFyIHZlcnNpb24gPSByZWFkTVBJbnQoZGVyLCAndmVyc2lvbicpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwodmVyc2lvbi5yZWFkVUludDgoMCksIDEpO1xuXG5cdC8vIHByaXZhdGUga2V5XG5cdHZhciBrID0gZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuT2N0ZXRTdHJpbmcsIHRydWUpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoMHhhMCk7XG5cdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRhc3NlcnQuc3RyaWN0RXF1YWwob2lkLCAnMS4zLjEwMS4xMTInLCAndGhlIGVkMjU1MTkgY3VydmUgaWRlbnRpZmllcicpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoMHhhMSk7XG5cdHZhciBBID0gdXRpbHMucmVhZEJpdFN0cmluZyhkZXIpO1xuXG5cdHZhciBrZXkgPSB7XG5cdFx0dHlwZTogJ2VkMjU1MTknLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdBJywgZGF0YTogdXRpbHMuemVyb1BhZFRvTGVuZ3RoKEEsIDMyKSB9LFxuXHRcdFx0eyBuYW1lOiAnaycsIGRhdGE6IGsgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGtleSkpO1xufVxuXG5mdW5jdGlvbiByZWFkUGtjczFEU0FQdWJsaWMoZGVyKSB7XG5cdHZhciB5ID0gcmVhZE1QSW50KGRlciwgJ3knKTtcblx0dmFyIHAgPSByZWFkTVBJbnQoZGVyLCAncCcpO1xuXHR2YXIgcSA9IHJlYWRNUEludChkZXIsICdxJyk7XG5cdHZhciBnID0gcmVhZE1QSW50KGRlciwgJ2cnKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdkc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICd5JywgZGF0YTogeSB9LFxuXHRcdFx0eyBuYW1lOiAncCcsIGRhdGE6IHAgfSxcblx0XHRcdHsgbmFtZTogJ3EnLCBkYXRhOiBxIH0sXG5cdFx0XHR7IG5hbWU6ICdnJywgZGF0YTogZyB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxRUNEU0FQdWJsaWMoZGVyKSB7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHR2YXIgb2lkID0gZGVyLnJlYWRPSUQoKTtcblx0YXNzZXJ0LnN0cmljdEVxdWFsKG9pZCwgJzEuMi44NDAuMTAwNDUuMi4xJywgJ211c3QgYmUgZWNQdWJsaWNLZXknKTtcblxuXHR2YXIgY3VydmVPaWQgPSBkZXIucmVhZE9JRCgpO1xuXG5cdHZhciBjdXJ2ZTtcblx0dmFyIGN1cnZlcyA9IE9iamVjdC5rZXlzKGFsZ3MuY3VydmVzKTtcblx0Zm9yICh2YXIgaiA9IDA7IGogPCBjdXJ2ZXMubGVuZ3RoOyArK2opIHtcblx0XHR2YXIgYyA9IGN1cnZlc1tqXTtcblx0XHR2YXIgY2QgPSBhbGdzLmN1cnZlc1tjXTtcblx0XHRpZiAoY2QucGtjczhvaWQgPT09IGN1cnZlT2lkKSB7XG5cdFx0XHRjdXJ2ZSA9IGM7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblx0YXNzZXJ0LnN0cmluZyhjdXJ2ZSwgJ2Ega25vd24gRUNEU0EgbmFtZWQgY3VydmUnKTtcblxuXHR2YXIgUSA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFEgPSB1dGlscy5lY05vcm1hbGl6ZShRKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdlY2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2N1cnZlJywgZGF0YTogQnVmZmVyLmZyb20oY3VydmUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9XG5cdFx0XVxuXHR9O1xuXG5cdHJldHVybiAobmV3IEtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBrY3MxRUNEU0FQcml2YXRlKGRlcikge1xuXHR2YXIgdmVyc2lvbiA9IHJlYWRNUEludChkZXIsICd2ZXJzaW9uJyk7XG5cdGFzc2VydC5zdHJpY3RFcXVhbCh2ZXJzaW9uLnJlYWRVSW50OCgwKSwgMSk7XG5cblx0Ly8gcHJpdmF0ZSBrZXlcblx0dmFyIGQgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5PY3RldFN0cmluZywgdHJ1ZSk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZSgweGEwKTtcblx0dmFyIGN1cnZlID0gcmVhZEVDRFNBQ3VydmUoZGVyKTtcblx0YXNzZXJ0LnN0cmluZyhjdXJ2ZSwgJ2Ega25vd24gZWxsaXB0aWMgY3VydmUnKTtcblxuXHRkZXIucmVhZFNlcXVlbmNlKDB4YTEpO1xuXHR2YXIgUSA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFEgPSB1dGlscy5lY05vcm1hbGl6ZShRKTtcblxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdlY2RzYScsXG5cdFx0cGFydHM6IFtcblx0XHRcdHsgbmFtZTogJ2N1cnZlJywgZGF0YTogQnVmZmVyLmZyb20oY3VydmUpIH0sXG5cdFx0XHR7IG5hbWU6ICdRJywgZGF0YTogUSB9LFxuXHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IGQgfVxuXHRcdF1cblx0fTtcblxuXHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGtleSkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxKGRlciwga2V5KSB7XG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cblx0c3dpdGNoIChrZXkudHlwZSkge1xuXHRjYXNlICdyc2EnOlxuXHRcdGlmIChQcml2YXRlS2V5LmlzUHJpdmF0ZUtleShrZXkpKVxuXHRcdFx0d3JpdGVQa2NzMVJTQVByaXZhdGUoZGVyLCBrZXkpO1xuXHRcdGVsc2Vcblx0XHRcdHdyaXRlUGtjczFSU0FQdWJsaWMoZGVyLCBrZXkpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdkc2EnOlxuXHRcdGlmIChQcml2YXRlS2V5LmlzUHJpdmF0ZUtleShrZXkpKVxuXHRcdFx0d3JpdGVQa2NzMURTQVByaXZhdGUoZGVyLCBrZXkpO1xuXHRcdGVsc2Vcblx0XHRcdHdyaXRlUGtjczFEU0FQdWJsaWMoZGVyLCBrZXkpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdlY2RzYSc6XG5cdFx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0XHR3cml0ZVBrY3MxRUNEU0FQcml2YXRlKGRlciwga2V5KTtcblx0XHRlbHNlXG5cdFx0XHR3cml0ZVBrY3MxRUNEU0FQdWJsaWMoZGVyLCBrZXkpO1xuXHRcdGJyZWFrO1xuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRcdHdyaXRlUGtjczFFZERTQVByaXZhdGUoZGVyLCBrZXkpO1xuXHRcdGVsc2Vcblx0XHRcdHdyaXRlUGtjczFFZERTQVB1YmxpYyhkZXIsIGtleSk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBrZXkgYWxnbzogJyArIGtleS50eXBlKSk7XG5cdH1cblxuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzMVJTQVB1YmxpYyhkZXIsIGtleSkge1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQubi5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmUuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczFSU0FQcml2YXRlKGRlciwga2V5KSB7XG5cdHZhciB2ZXIgPSBCdWZmZXIuZnJvbShbMF0pO1xuXHRkZXIud3JpdGVCdWZmZXIodmVyLCBhc24xLkJlci5JbnRlZ2VyKTtcblxuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQubi5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmUuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGlmICgha2V5LnBhcnQuZG1vZHAgfHwgIWtleS5wYXJ0LmRtb2RxKVxuXHRcdHV0aWxzLmFkZFJTQU1pc3Npbmcoa2V5KTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmRtb2RwLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZG1vZHEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5pcW1wLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRFNBUHJpdmF0ZShkZXIsIGtleSkge1xuXHR2YXIgdmVyID0gQnVmZmVyLmZyb20oWzBdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlciwgYXNuMS5CZXIuSW50ZWdlcik7XG5cblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnAuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5xLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQuZy5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnkuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC54LmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRFNBUHVibGljKGRlciwga2V5KSB7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC55LmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xuXHRkZXIud3JpdGVCdWZmZXIoa2V5LnBhcnQucC5kYXRhLCBhc24xLkJlci5JbnRlZ2VyKTtcblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LnEuZGF0YSwgYXNuMS5CZXIuSW50ZWdlcik7XG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5nLmRhdGEsIGFzbjEuQmVyLkludGVnZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRUNEU0FQdWJsaWMoZGVyLCBrZXkpIHtcblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblxuXHRkZXIud3JpdGVPSUQoJzEuMi44NDAuMTAwNDUuMi4xJyk7IC8qIGVjUHVibGljS2V5ICovXG5cdHZhciBjdXJ2ZSA9IGtleS5wYXJ0LmN1cnZlLmRhdGEudG9TdHJpbmcoKTtcblx0dmFyIGN1cnZlT2lkID0gYWxncy5jdXJ2ZXNbY3VydmVdLnBrY3M4b2lkO1xuXHRhc3NlcnQuc3RyaW5nKGN1cnZlT2lkLCAnYSBrbm93biBFQ0RTQSBuYW1lZCBjdXJ2ZScpO1xuXHRkZXIud3JpdGVPSUQoY3VydmVPaWQpO1xuXG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdHZhciBRID0gdXRpbHMuZWNOb3JtYWxpemUoa2V5LnBhcnQuUS5kYXRhLCB0cnVlKTtcblx0ZGVyLndyaXRlQnVmZmVyKFEsIGFzbjEuQmVyLkJpdFN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGtjczFFQ0RTQVByaXZhdGUoZGVyLCBrZXkpIHtcblx0dmFyIHZlciA9IEJ1ZmZlci5mcm9tKFsxXSk7XG5cdGRlci53cml0ZUJ1ZmZlcih2ZXIsIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcihrZXkucGFydC5kLmRhdGEsIGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblxuXHRkZXIuc3RhcnRTZXF1ZW5jZSgweGEwKTtcblx0dmFyIGN1cnZlID0ga2V5LnBhcnQuY3VydmUuZGF0YS50b1N0cmluZygpO1xuXHR2YXIgY3VydmVPaWQgPSBhbGdzLmN1cnZlc1tjdXJ2ZV0ucGtjczhvaWQ7XG5cdGFzc2VydC5zdHJpbmcoY3VydmVPaWQsICdhIGtub3duIEVDRFNBIG5hbWVkIGN1cnZlJyk7XG5cdGRlci53cml0ZU9JRChjdXJ2ZU9pZCk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKDB4YTEpO1xuXHR2YXIgUSA9IHV0aWxzLmVjTm9ybWFsaXplKGtleS5wYXJ0LlEuZGF0YSwgdHJ1ZSk7XG5cdGRlci53cml0ZUJ1ZmZlcihRLCBhc24xLkJlci5CaXRTdHJpbmcpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQa2NzMUVkRFNBUHJpdmF0ZShkZXIsIGtleSkge1xuXHR2YXIgdmVyID0gQnVmZmVyLmZyb20oWzFdKTtcblx0ZGVyLndyaXRlQnVmZmVyKHZlciwgYXNuMS5CZXIuSW50ZWdlcik7XG5cblx0ZGVyLndyaXRlQnVmZmVyKGtleS5wYXJ0LmsuZGF0YSwgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKDB4YTApO1xuXHRkZXIud3JpdGVPSUQoJzEuMy4xMDEuMTEyJyk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKDB4YTEpO1xuXHR1dGlscy53cml0ZUJpdFN0cmluZyhkZXIsIGtleS5wYXJ0LkEuZGF0YSk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBrY3MxRWREU0FQdWJsaWMoZGVyLCBrZXkpIHtcblx0dGhyb3cgKG5ldyBFcnJvcignUHVibGljIGtleXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIEVkRFNBIFBLQ1MjMScpKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQuYmluZCh1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQpLFxuXHRyZWFkVHlwZTogcmVhZC5iaW5kKHVuZGVmaW5lZCwgZmFsc2UpLFxuXHR3cml0ZTogd3JpdGUsXG5cdC8qIHNlbWktcHJpdmF0ZSBhcGksIHVzZWQgYnkgc3NocGstYWdlbnQgKi9cblx0cmVhZFBhcnRpYWw6IHJlYWQuYmluZCh1bmRlZmluZWQsIHRydWUpLFxuXG5cdC8qIHNoYXJlZCB3aXRoIHNzaCBmb3JtYXQgKi9cblx0cmVhZEludGVybmFsOiByZWFkLFxuXHRrZXlUeXBlVG9BbGc6IGtleVR5cGVUb0FsZyxcblx0YWxnVG9LZXlUeXBlOiBhbGdUb0tleVR5cGVcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcbnZhciBTU0hCdWZmZXIgPSByZXF1aXJlKCcuLi9zc2gtYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIGFsZ1RvS2V5VHlwZShhbGcpIHtcblx0YXNzZXJ0LnN0cmluZyhhbGcpO1xuXHRpZiAoYWxnID09PSAnc3NoLWRzcycpXG5cdFx0cmV0dXJuICgnZHNhJyk7XG5cdGVsc2UgaWYgKGFsZyA9PT0gJ3NzaC1yc2EnKVxuXHRcdHJldHVybiAoJ3JzYScpO1xuXHRlbHNlIGlmIChhbGcgPT09ICdzc2gtZWQyNTUxOScpXG5cdFx0cmV0dXJuICgnZWQyNTUxOScpO1xuXHRlbHNlIGlmIChhbGcgPT09ICdzc2gtY3VydmUyNTUxOScpXG5cdFx0cmV0dXJuICgnY3VydmUyNTUxOScpO1xuXHRlbHNlIGlmIChhbGcubWF0Y2goL15lY2RzYS1zaGEyLS8pKVxuXHRcdHJldHVybiAoJ2VjZHNhJyk7XG5cdGVsc2Vcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIGFsZ29yaXRobSAnICsgYWxnKSk7XG59XG5cbmZ1bmN0aW9uIGtleVR5cGVUb0FsZyhrZXkpIHtcblx0YXNzZXJ0Lm9iamVjdChrZXkpO1xuXHRpZiAoa2V5LnR5cGUgPT09ICdkc2EnKVxuXHRcdHJldHVybiAoJ3NzaC1kc3MnKTtcblx0ZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdyc2EnKVxuXHRcdHJldHVybiAoJ3NzaC1yc2EnKTtcblx0ZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdlZDI1NTE5Jylcblx0XHRyZXR1cm4gKCdzc2gtZWQyNTUxOScpO1xuXHRlbHNlIGlmIChrZXkudHlwZSA9PT0gJ2N1cnZlMjU1MTknKVxuXHRcdHJldHVybiAoJ3NzaC1jdXJ2ZTI1NTE5Jyk7XG5cdGVsc2UgaWYgKGtleS50eXBlID09PSAnZWNkc2EnKVxuXHRcdHJldHVybiAoJ2VjZHNhLXNoYTItJyArIGtleS5wYXJ0LmN1cnZlLmRhdGEudG9TdHJpbmcoKSk7XG5cdGVsc2Vcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIGtleSB0eXBlICcgKyBrZXkudHlwZSkpO1xufVxuXG5mdW5jdGlvbiByZWFkKHBhcnRpYWwsIHR5cGUsIGJ1Ziwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChidWYpID09PSAnc3RyaW5nJylcblx0XHRidWYgPSBCdWZmZXIuZnJvbShidWYpO1xuXHRhc3NlcnQuYnVmZmVyKGJ1ZiwgJ2J1ZicpO1xuXG5cdHZhciBrZXkgPSB7fTtcblxuXHR2YXIgcGFydHMgPSBrZXkucGFydHMgPSBbXTtcblx0dmFyIHNzaGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogYnVmfSk7XG5cblx0dmFyIGFsZyA9IHNzaGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdGFzc2VydC5vayghc3NoYnVmLmF0RW5kKCksICdrZXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJ0Jyk7XG5cblx0a2V5LnR5cGUgPSBhbGdUb0tleVR5cGUoYWxnKTtcblxuXHR2YXIgcGFydENvdW50ID0gYWxncy5pbmZvW2tleS50eXBlXS5wYXJ0cy5sZW5ndGg7XG5cdGlmICh0eXBlICYmIHR5cGUgPT09ICdwcml2YXRlJylcblx0XHRwYXJ0Q291bnQgPSBhbGdzLnByaXZJbmZvW2tleS50eXBlXS5wYXJ0cy5sZW5ndGg7XG5cblx0d2hpbGUgKCFzc2hidWYuYXRFbmQoKSAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpXG5cdFx0cGFydHMucHVzaChzc2hidWYucmVhZFBhcnQoKSk7XG5cdHdoaWxlICghcGFydGlhbCAmJiAhc3NoYnVmLmF0RW5kKCkpXG5cdFx0cGFydHMucHVzaChzc2hidWYucmVhZFBhcnQoKSk7XG5cblx0YXNzZXJ0Lm9rKHBhcnRzLmxlbmd0aCA+PSAxLFxuXHQgICAgJ2tleSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBhcnQnKTtcblx0YXNzZXJ0Lm9rKHBhcnRpYWwgfHwgc3NoYnVmLmF0RW5kKCksXG5cdCAgICAnbGVmdG92ZXIgYnl0ZXMgYXQgZW5kIG9mIGtleScpO1xuXG5cdHZhciBDb25zdHJ1Y3RvciA9IEtleTtcblx0dmFyIGFsZ0luZm8gPSBhbGdzLmluZm9ba2V5LnR5cGVdO1xuXHRpZiAodHlwZSA9PT0gJ3ByaXZhdGUnIHx8IGFsZ0luZm8ucGFydHMubGVuZ3RoICE9PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRhbGdJbmZvID0gYWxncy5wcml2SW5mb1trZXkudHlwZV07XG5cdFx0Q29uc3RydWN0b3IgPSBQcml2YXRlS2V5O1xuXHR9XG5cdGFzc2VydC5zdHJpY3RFcXVhbChhbGdJbmZvLnBhcnRzLmxlbmd0aCwgcGFydHMubGVuZ3RoKTtcblxuXHRpZiAoa2V5LnR5cGUgPT09ICdlY2RzYScpIHtcblx0XHR2YXIgcmVzID0gL15lY2RzYS1zaGEyLSguKykkLy5leGVjKGFsZyk7XG5cdFx0YXNzZXJ0Lm9rKHJlcyAhPT0gbnVsbCk7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKHJlc1sxXSwgcGFydHNbMF0uZGF0YS50b1N0cmluZygpKTtcblx0fVxuXG5cdHZhciBub3JtYWxpemVkID0gdHJ1ZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhbGdJbmZvLnBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHAgPSBwYXJ0c1tpXTtcblx0XHRwLm5hbWUgPSBhbGdJbmZvLnBhcnRzW2ldO1xuXHRcdC8qXG5cdFx0ICogT3BlblNTSCBzdG9yZXMgZWQyNTUxOSBcInByaXZhdGVcIiBrZXlzIGFzIHNlZWQgKyBwdWJsaWMga2V5XG5cdFx0ICogY29uY2F0J2QgdG9nZXRoZXIgKGsgZm9sbG93ZWQgYnkgQSkuIFdlIHdhbnQgdG8ga2VlcCB0aGVtXG5cdFx0ICogc2VwYXJhdGUgZm9yIG90aGVyIGZvcm1hdHMgdGhhdCBkb24ndCBkbyB0aGlzLlxuXHRcdCAqL1xuXHRcdGlmIChrZXkudHlwZSA9PT0gJ2VkMjU1MTknICYmIHAubmFtZSA9PT0gJ2snKVxuXHRcdFx0cC5kYXRhID0gcC5kYXRhLnNsaWNlKDAsIDMyKTtcblxuXHRcdGlmIChwLm5hbWUgIT09ICdjdXJ2ZScgJiYgYWxnSW5mby5ub3JtYWxpemUgIT09IGZhbHNlKSB7XG5cdFx0XHR2YXIgbmQ7XG5cdFx0XHRpZiAoa2V5LnR5cGUgPT09ICdlZDI1NTE5Jykge1xuXHRcdFx0XHRuZCA9IHV0aWxzLnplcm9QYWRUb0xlbmd0aChwLmRhdGEsIDMyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5kID0gdXRpbHMubXBOb3JtYWxpemUocC5kYXRhKTtcblx0XHRcdH1cblx0XHRcdGlmIChuZC50b1N0cmluZygnYmluYXJ5JykgIT09XG5cdFx0XHQgICAgcC5kYXRhLnRvU3RyaW5nKCdiaW5hcnknKSkge1xuXHRcdFx0XHRwLmRhdGEgPSBuZDtcblx0XHRcdFx0bm9ybWFsaXplZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChub3JtYWxpemVkKVxuXHRcdGtleS5fcmZjNDI1M0NhY2hlID0gc3NoYnVmLnRvQnVmZmVyKCk7XG5cblx0aWYgKHBhcnRpYWwgJiYgdHlwZW9mIChwYXJ0aWFsKSA9PT0gJ29iamVjdCcpIHtcblx0XHRwYXJ0aWFsLnJlbWFpbmRlciA9IHNzaGJ1Zi5yZW1haW5kZXIoKTtcblx0XHRwYXJ0aWFsLmNvbnN1bWVkID0gc3NoYnVmLl9vZmZzZXQ7XG5cdH1cblxuXHRyZXR1cm4gKG5ldyBDb25zdHJ1Y3RvcihrZXkpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGUoa2V5LCBvcHRpb25zKSB7XG5cdGFzc2VydC5vYmplY3Qoa2V5KTtcblxuXHR2YXIgYWxnID0ga2V5VHlwZVRvQWxnKGtleSk7XG5cdHZhciBpO1xuXG5cdHZhciBhbGdJbmZvID0gYWxncy5pbmZvW2tleS50eXBlXTtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0YWxnSW5mbyA9IGFsZ3MucHJpdkluZm9ba2V5LnR5cGVdO1xuXHR2YXIgcGFydHMgPSBhbGdJbmZvLnBhcnRzO1xuXG5cdHZhciBidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblxuXHRidWYud3JpdGVTdHJpbmcoYWxnKTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgZGF0YSA9IGtleS5wYXJ0W3BhcnRzW2ldXS5kYXRhO1xuXHRcdGlmIChhbGdJbmZvLm5vcm1hbGl6ZSAhPT0gZmFsc2UpIHtcblx0XHRcdGlmIChrZXkudHlwZSA9PT0gJ2VkMjU1MTknKVxuXHRcdFx0XHRkYXRhID0gdXRpbHMuemVyb1BhZFRvTGVuZ3RoKGRhdGEsIDMyKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGF0YSA9IHV0aWxzLm1wTm9ybWFsaXplKGRhdGEpO1xuXHRcdH1cblx0XHRpZiAoa2V5LnR5cGUgPT09ICdlZDI1NTE5JyAmJiBwYXJ0c1tpXSA9PT0gJ2snKVxuXHRcdFx0ZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGtleS5wYXJ0LkEuZGF0YV0pO1xuXHRcdGJ1Zi53cml0ZUJ1ZmZlcihkYXRhKTtcblx0fVxuXG5cdHJldHVybiAoYnVmLnRvQnVmZmVyKCkpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNyeXB0b19oYXNoX3NoYTUxMiA9IHJlcXVpcmUoJ3R3ZWV0bmFjbCcpLmxvd2xldmVsLmNyeXB0b19oYXNoO1xuXG4vKlxuICogVGhpcyBmaWxlIGlzIGEgMToxIHBvcnQgZnJvbSB0aGUgT3BlbkJTRCBibG93ZmlzaC5jIGFuZCBiY3J5cHRfcGJrZGYuYy4gQXMgYVxuICogcmVzdWx0LCBpdCByZXRhaW5zIHRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuIFRoZSB0d28gZmlsZXMgYXJlXG4gKiB1bmRlciBzbGlnaHRseSBkaWZmZXJlbnQgKGJ1dCBjb21wYXRpYmxlKSBsaWNlbnNlcywgYW5kIGFyZSBoZXJlIGNvbWJpbmVkIGluXG4gKiBvbmUgZmlsZS5cbiAqXG4gKiBDcmVkaXQgZm9yIHRoZSBhY3R1YWwgcG9ydGluZyB3b3JrIGdvZXMgdG86XG4gKiAgRGV2aSBNYW5kaXJpIDxtZUBkZXZpLndlYi5pZD5cbiAqL1xuXG4vKlxuICogVGhlIEJsb3dmaXNoIHBvcnRpb25zIGFyZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQmxvd2Zpc2ggYmxvY2sgY2lwaGVyIGZvciBPcGVuQlNEXG4gKiBDb3B5cmlnaHQgMTk5NyBOaWVscyBQcm92b3MgPHByb3Zvc0BwaHlzbmV0LnVuaS1oYW1idXJnLmRlPlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBhZHZpY2UgYnkgRGF2aWQgTWF6aWVyZXMgPGRtQGxjcy5taXQuZWR1Pi5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1JcbiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVNcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVRcbiAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbi8qXG4gKiBUaGUgYmNyeXB0X3Bia2RmIHBvcnRpb25zIGFyZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzIFRlZCBVbmFuZ3N0IDx0ZWR1QG9wZW5ic2Qub3JnPlxuICpcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxuICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZVxuICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFU1xuICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRlxuICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1JcbiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVNcbiAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTlxuICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0ZcbiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4gKi9cblxuLypcbiAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyAoSmF2YXNjcmlwdC1zcGVjaWZpYyk6XG4gKlxuICogQ29weXJpZ2h0IDIwMTYsIEpveWVudCBJbmNcbiAqIEF1dGhvcjogQWxleCBXaWxzb24gPGFsZXgud2lsc29uQGpveWVudC5jb20+XG4gKlxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG4gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlXG4gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTXG4gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUlxuICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFU1xuICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOXG4gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRlxuICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbiAqL1xuXG4vLyBQb3J0ZWQgZnJvbSBPcGVuQlNEIGJjcnlwdF9wYmtkZi5jIHYxLjlcblxudmFyIEJMRl9KID0gMDtcblxudmFyIEJsb3dmaXNoID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuUyA9IFtcbiAgICBuZXcgVWludDMyQXJyYXkoW1xuICAgICAgMHhkMTMxMGJhNiwgMHg5OGRmYjVhYywgMHgyZmZkNzJkYiwgMHhkMDFhZGZiNyxcbiAgICAgIDB4YjhlMWFmZWQsIDB4NmEyNjdlOTYsIDB4YmE3YzkwNDUsIDB4ZjEyYzdmOTksXG4gICAgICAweDI0YTE5OTQ3LCAweGIzOTE2Y2Y3LCAweDA4MDFmMmUyLCAweDg1OGVmYzE2LFxuICAgICAgMHg2MzY5MjBkOCwgMHg3MTU3NGU2OSwgMHhhNDU4ZmVhMywgMHhmNDkzM2Q3ZSxcbiAgICAgIDB4MGQ5NTc0OGYsIDB4NzI4ZWI2NTgsIDB4NzE4YmNkNTgsIDB4ODIxNTRhZWUsXG4gICAgICAweDdiNTRhNDFkLCAweGMyNWE1OWI1LCAweDljMzBkNTM5LCAweDJhZjI2MDEzLFxuICAgICAgMHhjNWQxYjAyMywgMHgyODYwODVmMCwgMHhjYTQxNzkxOCwgMHhiOGRiMzhlZixcbiAgICAgIDB4OGU3OWRjYjAsIDB4NjAzYTE4MGUsIDB4NmM5ZTBlOGIsIDB4YjAxZThhM2UsXG4gICAgICAweGQ3MTU3N2MxLCAweGJkMzE0YjI3LCAweDc4YWYyZmRhLCAweDU1NjA1YzYwLFxuICAgICAgMHhlNjU1MjVmMywgMHhhYTU1YWI5NCwgMHg1NzQ4OTg2MiwgMHg2M2U4MTQ0MCxcbiAgICAgIDB4NTVjYTM5NmEsIDB4MmFhYjEwYjYsIDB4YjRjYzVjMzQsIDB4MTE0MWU4Y2UsXG4gICAgICAweGExNTQ4NmFmLCAweDdjNzJlOTkzLCAweGIzZWUxNDExLCAweDYzNmZiYzJhLFxuICAgICAgMHgyYmE5YzU1ZCwgMHg3NDE4MzFmNiwgMHhjZTVjM2UxNiwgMHg5Yjg3OTMxZSxcbiAgICAgIDB4YWZkNmJhMzMsIDB4NmMyNGNmNWMsIDB4N2EzMjUzODEsIDB4Mjg5NTg2NzcsXG4gICAgICAweDNiOGY0ODk4LCAweDZiNGJiOWFmLCAweGM0YmZlODFiLCAweDY2MjgyMTkzLFxuICAgICAgMHg2MWQ4MDljYywgMHhmYjIxYTk5MSwgMHg0ODdjYWM2MCwgMHg1ZGVjODAzMixcbiAgICAgIDB4ZWY4NDVkNWQsIDB4ZTk4NTc1YjEsIDB4ZGMyNjIzMDIsIDB4ZWI2NTFiODgsXG4gICAgICAweDIzODkzZTgxLCAweGQzOTZhY2M1LCAweDBmNmQ2ZmYzLCAweDgzZjQ0MjM5LFxuICAgICAgMHgyZTBiNDQ4MiwgMHhhNDg0MjAwNCwgMHg2OWM4ZjA0YSwgMHg5ZTFmOWI1ZSxcbiAgICAgIDB4MjFjNjY4NDIsIDB4ZjZlOTZjOWEsIDB4NjcwYzljNjEsIDB4YWJkMzg4ZjAsXG4gICAgICAweDZhNTFhMGQyLCAweGQ4NTQyZjY4LCAweDk2MGZhNzI4LCAweGFiNTEzM2EzLFxuICAgICAgMHg2ZWVmMGI2YywgMHgxMzdhM2JlNCwgMHhiYTNiZjA1MCwgMHg3ZWZiMmE5OCxcbiAgICAgIDB4YTFmMTY1MWQsIDB4MzlhZjAxNzYsIDB4NjZjYTU5M2UsIDB4ODI0MzBlODgsXG4gICAgICAweDhjZWU4NjE5LCAweDQ1NmY5ZmI0LCAweDdkODRhNWMzLCAweDNiOGI1ZWJlLFxuICAgICAgMHhlMDZmNzVkOCwgMHg4NWMxMjA3MywgMHg0MDFhNDQ5ZiwgMHg1NmMxNmFhNixcbiAgICAgIDB4NGVkM2FhNjIsIDB4MzYzZjc3MDYsIDB4MWJmZWRmNzIsIDB4NDI5YjAyM2QsXG4gICAgICAweDM3ZDBkNzI0LCAweGQwMGExMjQ4LCAweGRiMGZlYWQzLCAweDQ5ZjFjMDliLFxuICAgICAgMHgwNzUzNzJjOSwgMHg4MDk5MWI3YiwgMHgyNWQ0NzlkOCwgMHhmNmU4ZGVmNyxcbiAgICAgIDB4ZTNmZTUwMWEsIDB4YjY3OTRjM2IsIDB4OTc2Y2UwYmQsIDB4MDRjMDA2YmEsXG4gICAgICAweGMxYTk0ZmI2LCAweDQwOWY2MGM0LCAweDVlNWM5ZWMyLCAweDE5NmEyNDYzLFxuICAgICAgMHg2OGZiNmZhZiwgMHgzZTZjNTNiNSwgMHgxMzM5YjJlYiwgMHgzYjUyZWM2ZixcbiAgICAgIDB4NmRmYzUxMWYsIDB4OWIzMDk1MmMsIDB4Y2M4MTQ1NDQsIDB4YWY1ZWJkMDksXG4gICAgICAweGJlZTNkMDA0LCAweGRlMzM0YWZkLCAweDY2MGYyODA3LCAweDE5MmU0YmIzLFxuICAgICAgMHhjMGNiYTg1NywgMHg0NWM4NzQwZiwgMHhkMjBiNWYzOSwgMHhiOWQzZmJkYixcbiAgICAgIDB4NTU3OWMwYmQsIDB4MWE2MDMyMGEsIDB4ZDZhMTAwYzYsIDB4NDAyYzcyNzksXG4gICAgICAweDY3OWYyNWZlLCAweGZiMWZhM2NjLCAweDhlYTVlOWY4LCAweGRiMzIyMmY4LFxuICAgICAgMHgzYzc1MTZkZiwgMHhmZDYxNmIxNSwgMHgyZjUwMWVjOCwgMHhhZDA1NTJhYixcbiAgICAgIDB4MzIzZGI1ZmEsIDB4ZmQyMzg3NjAsIDB4NTMzMTdiNDgsIDB4M2UwMGRmODIsXG4gICAgICAweDllNWM1N2JiLCAweGNhNmY4Y2EwLCAweDFhODc1NjJlLCAweGRmMTc2OWRiLFxuICAgICAgMHhkNTQyYThmNiwgMHgyODdlZmZjMywgMHhhYzY3MzJjNiwgMHg4YzRmNTU3MyxcbiAgICAgIDB4Njk1YjI3YjAsIDB4YmJjYTU4YzgsIDB4ZTFmZmEzNWQsIDB4YjhmMDExYTAsXG4gICAgICAweDEwZmEzZDk4LCAweGZkMjE4M2I4LCAweDRhZmNiNTZjLCAweDJkZDFkMzViLFxuICAgICAgMHg5YTUzZTQ3OSwgMHhiNmY4NDU2NSwgMHhkMjhlNDliYywgMHg0YmZiOTc5MCxcbiAgICAgIDB4ZTFkZGYyZGEsIDB4YTRjYjdlMzMsIDB4NjJmYjEzNDEsIDB4Y2VlNGM2ZTgsXG4gICAgICAweGVmMjBjYWRhLCAweDM2Nzc0YzAxLCAweGQwN2U5ZWZlLCAweDJiZjExZmI0LFxuICAgICAgMHg5NWRiZGE0ZCwgMHhhZTkwOTE5OCwgMHhlYWFkOGU3MSwgMHg2YjkzZDVhMCxcbiAgICAgIDB4ZDA4ZWQxZDAsIDB4YWZjNzI1ZTAsIDB4OGUzYzViMmYsIDB4OGU3NTk0YjcsXG4gICAgICAweDhmZjZlMmZiLCAweGYyMTIyYjY0LCAweDg4ODhiODEyLCAweDkwMGRmMDFjLFxuICAgICAgMHg0ZmFkNWVhMCwgMHg2ODhmYzMxYywgMHhkMWNmZjE5MSwgMHhiM2E4YzFhZCxcbiAgICAgIDB4MmYyZjIyMTgsIDB4YmUwZTE3NzcsIDB4ZWE3NTJkZmUsIDB4OGIwMjFmYTEsXG4gICAgICAweGU1YTBjYzBmLCAweGI1NmY3NGU4LCAweDE4YWNmM2Q2LCAweGNlODllMjk5LFxuICAgICAgMHhiNGE4NGZlMCwgMHhmZDEzZTBiNywgMHg3Y2M0M2I4MSwgMHhkMmFkYThkOSxcbiAgICAgIDB4MTY1ZmEyNjYsIDB4ODA5NTc3MDUsIDB4OTNjYzczMTQsIDB4MjExYTE0NzcsXG4gICAgICAweGU2YWQyMDY1LCAweDc3YjVmYTg2LCAweGM3NTQ0MmY1LCAweGZiOWQzNWNmLFxuICAgICAgMHhlYmNkYWYwYywgMHg3YjNlODlhMCwgMHhkNjQxMWJkMywgMHhhZTFlN2U0OSxcbiAgICAgIDB4MDAyNTBlMmQsIDB4MjA3MWIzNWUsIDB4MjI2ODAwYmIsIDB4NTdiOGUwYWYsXG4gICAgICAweDI0NjQzNjliLCAweGYwMDliOTFlLCAweDU1NjM5MTFkLCAweDU5ZGZhNmFhLFxuICAgICAgMHg3OGMxNDM4OSwgMHhkOTVhNTM3ZiwgMHgyMDdkNWJhMiwgMHgwMmU1YjljNSxcbiAgICAgIDB4ODMyNjAzNzYsIDB4NjI5NWNmYTksIDB4MTFjODE5NjgsIDB4NGU3MzRhNDEsXG4gICAgICAweGIzNDcyZGNhLCAweDdiMTRhOTRhLCAweDFiNTEwMDUyLCAweDlhNTMyOTE1LFxuICAgICAgMHhkNjBmNTczZiwgMHhiYzliYzZlNCwgMHgyYjYwYTQ3NiwgMHg4MWU2NzQwMCxcbiAgICAgIDB4MDhiYTZmYjUsIDB4NTcxYmU5MWYsIDB4ZjI5NmVjNmIsIDB4MmEwZGQ5MTUsXG4gICAgICAweGI2NjM2NTIxLCAweGU3YjlmOWI2LCAweGZmMzQwNTJlLCAweGM1ODU1NjY0LFxuICAgICAgMHg1M2IwMmQ1ZCwgMHhhOTlmOGZhMSwgMHgwOGJhNDc5OSwgMHg2ZTg1MDc2YV0pLFxuICAgIG5ldyBVaW50MzJBcnJheShbXG4gICAgICAweDRiN2E3MGU5LCAweGI1YjMyOTQ0LCAweGRiNzUwOTJlLCAweGM0MTkyNjIzLFxuICAgICAgMHhhZDZlYTZiMCwgMHg0OWE3ZGY3ZCwgMHg5Y2VlNjBiOCwgMHg4ZmVkYjI2NixcbiAgICAgIDB4ZWNhYThjNzEsIDB4Njk5YTE3ZmYsIDB4NTY2NDUyNmMsIDB4YzJiMTllZTEsXG4gICAgICAweDE5MzYwMmE1LCAweDc1MDk0YzI5LCAweGEwNTkxMzQwLCAweGU0MTgzYTNlLFxuICAgICAgMHgzZjU0OTg5YSwgMHg1YjQyOWQ2NSwgMHg2YjhmZTRkNiwgMHg5OWY3M2ZkNixcbiAgICAgIDB4YTFkMjljMDcsIDB4ZWZlODMwZjUsIDB4NGQyZDM4ZTYsIDB4ZjAyNTVkYzEsXG4gICAgICAweDRjZGQyMDg2LCAweDg0NzBlYjI2LCAweDYzODJlOWM2LCAweDAyMWVjYzVlLFxuICAgICAgMHgwOTY4NmIzZiwgMHgzZWJhZWZjOSwgMHgzYzk3MTgxNCwgMHg2YjZhNzBhMSxcbiAgICAgIDB4Njg3ZjM1ODQsIDB4NTJhMGUyODYsIDB4Yjc5YzUzMDUsIDB4YWE1MDA3MzcsXG4gICAgICAweDNlMDc4NDFjLCAweDdmZGVhZTVjLCAweDhlN2Q0NGVjLCAweDU3MTZmMmI4LFxuICAgICAgMHhiMDNhZGEzNywgMHhmMDUwMGMwZCwgMHhmMDFjMWYwNCwgMHgwMjAwYjNmZixcbiAgICAgIDB4YWUwY2Y1MWEsIDB4M2NiNTc0YjIsIDB4MjU4MzdhNTgsIDB4ZGMwOTIxYmQsXG4gICAgICAweGQxOTExM2Y5LCAweDdjYTkyZmY2LCAweDk0MzI0NzczLCAweDIyZjU0NzAxLFxuICAgICAgMHgzYWU1ZTU4MSwgMHgzN2MyZGFkYywgMHhjOGI1NzYzNCwgMHg5YWYzZGRhNyxcbiAgICAgIDB4YTk0NDYxNDYsIDB4MGZkMDAzMGUsIDB4ZWNjOGM3M2UsIDB4YTQ3NTFlNDEsXG4gICAgICAweGUyMzhjZDk5LCAweDNiZWEwZTJmLCAweDMyODBiYmExLCAweDE4M2ViMzMxLFxuICAgICAgMHg0ZTU0OGIzOCwgMHg0ZjZkYjkwOCwgMHg2ZjQyMGQwMywgMHhmNjBhMDRiZixcbiAgICAgIDB4MmNiODEyOTAsIDB4MjQ5NzdjNzksIDB4NTY3OWIwNzIsIDB4YmNhZjg5YWYsXG4gICAgICAweGRlOWE3NzFmLCAweGQ5OTMwODEwLCAweGIzOGJhZTEyLCAweGRjY2YzZjJlLFxuICAgICAgMHg1NTEyNzIxZiwgMHgyZTZiNzEyNCwgMHg1MDFhZGRlNiwgMHg5Zjg0Y2Q4NyxcbiAgICAgIDB4N2E1ODQ3MTgsIDB4NzQwOGRhMTcsIDB4YmM5ZjlhYmMsIDB4ZTk0YjdkOGMsXG4gICAgICAweGVjN2FlYzNhLCAweGRiODUxZGZhLCAweDYzMDk0MzY2LCAweGM0NjRjM2QyLFxuICAgICAgMHhlZjFjMTg0NywgMHgzMjE1ZDkwOCwgMHhkZDQzM2IzNywgMHgyNGMyYmExNixcbiAgICAgIDB4MTJhMTRkNDMsIDB4MmE2NWM0NTEsIDB4NTA5NDAwMDIsIDB4MTMzYWU0ZGQsXG4gICAgICAweDcxZGZmODllLCAweDEwMzE0ZTU1LCAweDgxYWM3N2Q2LCAweDVmMTExOTliLFxuICAgICAgMHgwNDM1NTZmMSwgMHhkN2EzYzc2YiwgMHgzYzExMTgzYiwgMHg1OTI0YTUwOSxcbiAgICAgIDB4ZjI4ZmU2ZWQsIDB4OTdmMWZiZmEsIDB4OWViYWJmMmMsIDB4MWUxNTNjNmUsXG4gICAgICAweDg2ZTM0NTcwLCAweGVhZTk2ZmIxLCAweDg2MGU1ZTBhLCAweDVhM2UyYWIzLFxuICAgICAgMHg3NzFmZTcxYywgMHg0ZTNkMDZmYSwgMHgyOTY1ZGNiOSwgMHg5OWU3MWQwZixcbiAgICAgIDB4ODAzZTg5ZDYsIDB4NTI2NmM4MjUsIDB4MmU0Y2M5NzgsIDB4OWMxMGIzNmEsXG4gICAgICAweGM2MTUwZWJhLCAweDk0ZTJlYTc4LCAweGE1ZmMzYzUzLCAweDFlMGEyZGY0LFxuICAgICAgMHhmMmY3NGVhNywgMHgzNjFkMmIzZCwgMHgxOTM5MjYwZiwgMHgxOWMyNzk2MCxcbiAgICAgIDB4NTIyM2E3MDgsIDB4ZjcxMzEyYjYsIDB4ZWJhZGZlNmUsIDB4ZWFjMzFmNjYsXG4gICAgICAweGUzYmM0NTk1LCAweGE2N2JjODgzLCAweGIxN2YzN2QxLCAweDAxOGNmZjI4LFxuICAgICAgMHhjMzMyZGRlZiwgMHhiZTZjNWFhNSwgMHg2NTU4MjE4NSwgMHg2OGFiOTgwMixcbiAgICAgIDB4ZWVjZWE1MGYsIDB4ZGIyZjk1M2IsIDB4MmFlZjdkYWQsIDB4NWI2ZTJmODQsXG4gICAgICAweDE1MjFiNjI4LCAweDI5MDc2MTcwLCAweGVjZGQ0Nzc1LCAweDYxOWYxNTEwLFxuICAgICAgMHgxM2NjYTgzMCwgMHhlYjYxYmQ5NiwgMHgwMzM0ZmUxZSwgMHhhYTAzNjNjZixcbiAgICAgIDB4YjU3MzVjOTAsIDB4NGM3MGEyMzksIDB4ZDU5ZTllMGIsIDB4Y2JhYWRlMTQsXG4gICAgICAweGVlY2M4NmJjLCAweDYwNjIyY2E3LCAweDljYWI1Y2FiLCAweGIyZjM4NDZlLFxuICAgICAgMHg2NDhiMWVhZiwgMHgxOWJkZjBjYSwgMHhhMDIzNjliOSwgMHg2NTVhYmI1MCxcbiAgICAgIDB4NDA2ODVhMzIsIDB4M2MyYWI0YjMsIDB4MzE5ZWU5ZDUsIDB4YzAyMWI4ZjcsXG4gICAgICAweDliNTQwYjE5LCAweDg3NWZhMDk5LCAweDk1Zjc5OTdlLCAweDYyM2Q3ZGE4LFxuICAgICAgMHhmODM3ODg5YSwgMHg5N2UzMmQ3NywgMHgxMWVkOTM1ZiwgMHgxNjY4MTI4MSxcbiAgICAgIDB4MGUzNTg4MjksIDB4YzdlNjFmZDYsIDB4OTZkZWRmYTEsIDB4Nzg1OGJhOTksXG4gICAgICAweDU3ZjU4NGE1LCAweDFiMjI3MjYzLCAweDliODNjM2ZmLCAweDFhYzI0Njk2LFxuICAgICAgMHhjZGIzMGFlYiwgMHg1MzJlMzA1NCwgMHg4ZmQ5NDhlNCwgMHg2ZGJjMzEyOCxcbiAgICAgIDB4NThlYmYyZWYsIDB4MzRjNmZmZWEsIDB4ZmUyOGVkNjEsIDB4ZWU3YzNjNzMsXG4gICAgICAweDVkNGExNGQ5LCAweGU4NjRiN2UzLCAweDQyMTA1ZDE0LCAweDIwM2UxM2UwLFxuICAgICAgMHg0NWVlZTJiNiwgMHhhM2FhYWJlYSwgMHhkYjZjNGYxNSwgMHhmYWNiNGZkMCxcbiAgICAgIDB4Yzc0MmY0NDIsIDB4ZWY2YWJiYjUsIDB4NjU0ZjNiMWQsIDB4NDFjZDIxMDUsXG4gICAgICAweGQ4MWU3OTllLCAweDg2ODU0ZGM3LCAweGU0NGI0NzZhLCAweDNkODE2MjUwLFxuICAgICAgMHhjZjYyYTFmMiwgMHg1YjhkMjY0NiwgMHhmYzg4ODNhMCwgMHhjMWM3YjZhMyxcbiAgICAgIDB4N2YxNTI0YzMsIDB4NjljYjc0OTIsIDB4NDc4NDhhMGIsIDB4NTY5MmIyODUsXG4gICAgICAweDA5NWJiZjAwLCAweGFkMTk0ODlkLCAweDE0NjJiMTc0LCAweDIzODIwZTAwLFxuICAgICAgMHg1ODQyOGQyYSwgMHgwYzU1ZjVlYSwgMHgxZGFkZjQzZSwgMHgyMzNmNzA2MSxcbiAgICAgIDB4MzM3MmYwOTIsIDB4OGQ5MzdlNDEsIDB4ZDY1ZmVjZjEsIDB4NmMyMjNiZGIsXG4gICAgICAweDdjZGUzNzU5LCAweGNiZWU3NDYwLCAweDQwODVmMmE3LCAweGNlNzczMjZlLFxuICAgICAgMHhhNjA3ODA4NCwgMHgxOWY4NTA5ZSwgMHhlOGVmZDg1NSwgMHg2MWQ5OTczNSxcbiAgICAgIDB4YTk2OWE3YWEsIDB4YzUwYzA2YzIsIDB4NWEwNGFiZmMsIDB4ODAwYmNhZGMsXG4gICAgICAweDllNDQ3YTJlLCAweGMzNDUzNDg0LCAweGZkZDU2NzA1LCAweDBlMWU5ZWM5LFxuICAgICAgMHhkYjczZGJkMywgMHgxMDU1ODhjZCwgMHg2NzVmZGE3OSwgMHhlMzY3NDM0MCxcbiAgICAgIDB4YzVjNDM0NjUsIDB4NzEzZTM4ZDgsIDB4M2QyOGY4OWUsIDB4ZjE2ZGZmMjAsXG4gICAgICAweDE1M2UyMWU3LCAweDhmYjAzZDRhLCAweGU2ZTM5ZjJiLCAweGRiODNhZGY3XSksXG4gICAgbmV3IFVpbnQzMkFycmF5KFtcbiAgICAgIDB4ZTkzZDVhNjgsIDB4OTQ4MTQwZjcsIDB4ZjY0YzI2MWMsIDB4OTQ2OTI5MzQsXG4gICAgICAweDQxMTUyMGY3LCAweDc2MDJkNGY3LCAweGJjZjQ2YjJlLCAweGQ0YTIwMDY4LFxuICAgICAgMHhkNDA4MjQ3MSwgMHgzMzIwZjQ2YSwgMHg0M2I3ZDRiNywgMHg1MDAwNjFhZixcbiAgICAgIDB4MWUzOWY2MmUsIDB4OTcyNDQ1NDYsIDB4MTQyMTRmNzQsIDB4YmY4Yjg4NDAsXG4gICAgICAweDRkOTVmYzFkLCAweDk2YjU5MWFmLCAweDcwZjRkZGQzLCAweDY2YTAyZjQ1LFxuICAgICAgMHhiZmJjMDllYywgMHgwM2JkOTc4NSwgMHg3ZmFjNmRkMCwgMHgzMWNiODUwNCxcbiAgICAgIDB4OTZlYjI3YjMsIDB4NTVmZDM5NDEsIDB4ZGEyNTQ3ZTYsIDB4YWJjYTBhOWEsXG4gICAgICAweDI4NTA3ODI1LCAweDUzMDQyOWY0LCAweDBhMmM4NmRhLCAweGU5YjY2ZGZiLFxuICAgICAgMHg2OGRjMTQ2MiwgMHhkNzQ4NjkwMCwgMHg2ODBlYzBhNCwgMHgyN2ExOGRlZSxcbiAgICAgIDB4NGYzZmZlYTIsIDB4ZTg4N2FkOGMsIDB4YjU4Y2UwMDYsIDB4N2FmNGQ2YjYsXG4gICAgICAweGFhY2UxZTdjLCAweGQzMzc1ZmVjLCAweGNlNzhhMzk5LCAweDQwNmIyYTQyLFxuICAgICAgMHgyMGZlOWUzNSwgMHhkOWYzODViOSwgMHhlZTM5ZDdhYiwgMHgzYjEyNGU4YixcbiAgICAgIDB4MWRjOWZhZjcsIDB4NGI2ZDE4NTYsIDB4MjZhMzY2MzEsIDB4ZWFlMzk3YjIsXG4gICAgICAweDNhNmVmYTc0LCAweGRkNWI0MzMyLCAweDY4NDFlN2Y3LCAweGNhNzgyMGZiLFxuICAgICAgMHhmYjBhZjU0ZSwgMHhkOGZlYjM5NywgMHg0NTQwNTZhYywgMHhiYTQ4OTUyNyxcbiAgICAgIDB4NTU1MzNhM2EsIDB4MjA4MzhkODcsIDB4ZmU2YmE5YjcsIDB4ZDA5Njk1NGIsXG4gICAgICAweDU1YTg2N2JjLCAweGExMTU5YTU4LCAweGNjYTkyOTYzLCAweDk5ZTFkYjMzLFxuICAgICAgMHhhNjJhNGE1NiwgMHgzZjMxMjVmOSwgMHg1ZWY0N2UxYywgMHg5MDI5MzE3YyxcbiAgICAgIDB4ZmRmOGU4MDIsIDB4MDQyNzJmNzAsIDB4ODBiYjE1NWMsIDB4MDUyODJjZTMsXG4gICAgICAweDk1YzExNTQ4LCAweGU0YzY2ZDIyLCAweDQ4YzExMzNmLCAweGM3MGY4NmRjLFxuICAgICAgMHgwN2Y5YzllZSwgMHg0MTA0MWYwZiwgMHg0MDQ3NzlhNCwgMHg1ZDg4NmUxNyxcbiAgICAgIDB4MzI1ZjUxZWIsIDB4ZDU5YmMwZDEsIDB4ZjJiY2MxOGYsIDB4NDExMTM1NjQsXG4gICAgICAweDI1N2I3ODM0LCAweDYwMmE5YzYwLCAweGRmZjhlOGEzLCAweDFmNjM2YzFiLFxuICAgICAgMHgwZTEyYjRjMiwgMHgwMmUxMzI5ZSwgMHhhZjY2NGZkMSwgMHhjYWQxODExNSxcbiAgICAgIDB4NmIyMzk1ZTAsIDB4MzMzZTkyZTEsIDB4M2IyNDBiNjIsIDB4ZWViZWI5MjIsXG4gICAgICAweDg1YjJhMjBlLCAweGU2YmEwZDk5LCAweGRlNzIwYzhjLCAweDJkYTJmNzI4LFxuICAgICAgMHhkMDEyNzg0NSwgMHg5NWI3OTRmZCwgMHg2NDdkMDg2MiwgMHhlN2NjZjVmMCxcbiAgICAgIDB4NTQ0OWEzNmYsIDB4ODc3ZDQ4ZmEsIDB4YzM5ZGZkMjcsIDB4ZjMzZThkMWUsXG4gICAgICAweDBhNDc2MzQxLCAweDk5MmVmZjc0LCAweDNhNmY2ZWFiLCAweGY0ZjhmZDM3LFxuICAgICAgMHhhODEyZGM2MCwgMHhhMWViZGRmOCwgMHg5OTFiZTE0YywgMHhkYjZlNmIwZCxcbiAgICAgIDB4YzY3YjU1MTAsIDB4NmQ2NzJjMzcsIDB4Mjc2NWQ0M2IsIDB4ZGNkMGU4MDQsXG4gICAgICAweGYxMjkwZGM3LCAweGNjMDBmZmEzLCAweGI1MzkwZjkyLCAweDY5MGZlZDBiLFxuICAgICAgMHg2NjdiOWZmYiwgMHhjZWRiN2Q5YywgMHhhMDkxY2YwYiwgMHhkOTE1NWVhMyxcbiAgICAgIDB4YmIxMzJmODgsIDB4NTE1YmFkMjQsIDB4N2I5NDc5YmYsIDB4NzYzYmQ2ZWIsXG4gICAgICAweDM3MzkyZWIzLCAweGNjMTE1OTc5LCAweDgwMjZlMjk3LCAweGY0MmUzMTJkLFxuICAgICAgMHg2ODQyYWRhNywgMHhjNjZhMmIzYiwgMHgxMjc1NGNjYywgMHg3ODJlZjExYyxcbiAgICAgIDB4NmExMjQyMzcsIDB4Yjc5MjUxZTcsIDB4MDZhMWJiZTYsIDB4NGJmYjYzNTAsXG4gICAgICAweDFhNmIxMDE4LCAweDExY2FlZGZhLCAweDNkMjViZGQ4LCAweGUyZTFjM2M5LFxuICAgICAgMHg0NDQyMTY1OSwgMHgwYTEyMTM4NiwgMHhkOTBjZWM2ZSwgMHhkNWFiZWEyYSxcbiAgICAgIDB4NjRhZjY3NGUsIDB4ZGE4NmE4NWYsIDB4YmViZmU5ODgsIDB4NjRlNGMzZmUsXG4gICAgICAweDlkYmM4MDU3LCAweGYwZjdjMDg2LCAweDYwNzg3YmY4LCAweDYwMDM2MDRkLFxuICAgICAgMHhkMWZkODM0NiwgMHhmNjM4MWZiMCwgMHg3NzQ1YWUwNCwgMHhkNzM2ZmNjYyxcbiAgICAgIDB4ODM0MjZiMzMsIDB4ZjAxZWFiNzEsIDB4YjA4MDQxODcsIDB4M2MwMDVlNWYsXG4gICAgICAweDc3YTA1N2JlLCAweGJkZThhZTI0LCAweDU1NDY0Mjk5LCAweGJmNTgyZTYxLFxuICAgICAgMHg0ZTU4ZjQ4ZiwgMHhmMmRkZmRhMiwgMHhmNDc0ZWYzOCwgMHg4Nzg5YmRjMixcbiAgICAgIDB4NTM2NmY5YzMsIDB4YzhiMzhlNzQsIDB4YjQ3NWYyNTUsIDB4NDZmY2Q5YjksXG4gICAgICAweDdhZWIyNjYxLCAweDhiMWRkZjg0LCAweDg0NmEwZTc5LCAweDkxNWY5NWUyLFxuICAgICAgMHg0NjZlNTk4ZSwgMHgyMGI0NTc3MCwgMHg4Y2Q1NTU5MSwgMHhjOTAyZGU0YyxcbiAgICAgIDB4YjkwYmFjZTEsIDB4YmI4MjA1ZDAsIDB4MTFhODYyNDgsIDB4NzU3NGE5OWUsXG4gICAgICAweGI3N2YxOWI2LCAweGUwYTlkYzA5LCAweDY2MmQwOWExLCAweGM0MzI0NjMzLFxuICAgICAgMHhlODVhMWYwMiwgMHgwOWYwYmU4YywgMHg0YTk5YTAyNSwgMHgxZDZlZmUxMCxcbiAgICAgIDB4MWFiOTNkMWQsIDB4MGJhNWE0ZGYsIDB4YTE4NmYyMGYsIDB4Mjg2OGYxNjksXG4gICAgICAweGRjYjdkYTgzLCAweDU3MzkwNmZlLCAweGExZTJjZTliLCAweDRmY2Q3ZjUyLFxuICAgICAgMHg1MDExNWUwMSwgMHhhNzA2ODNmYSwgMHhhMDAyYjVjNCwgMHgwZGU2ZDAyNyxcbiAgICAgIDB4OWFmODhjMjcsIDB4NzczZjg2NDEsIDB4YzM2MDRjMDYsIDB4NjFhODA2YjUsXG4gICAgICAweGYwMTc3YTI4LCAweGMwZjU4NmUwLCAweDAwNjA1OGFhLCAweDMwZGM3ZDYyLFxuICAgICAgMHgxMWU2OWVkNywgMHgyMzM4ZWE2MywgMHg1M2MyZGQ5NCwgMHhjMmMyMTYzNCxcbiAgICAgIDB4YmJjYmVlNTYsIDB4OTBiY2I2ZGUsIDB4ZWJmYzdkYTEsIDB4Y2U1OTFkNzYsXG4gICAgICAweDZmMDVlNDA5LCAweDRiN2MwMTg4LCAweDM5NzIwYTNkLCAweDdjOTI3YzI0LFxuICAgICAgMHg4NmUzNzI1ZiwgMHg3MjRkOWRiOSwgMHgxYWMxNWJiNCwgMHhkMzllYjhmYyxcbiAgICAgIDB4ZWQ1NDU1NzgsIDB4MDhmY2E1YjUsIDB4ZDgzZDdjZDMsIDB4NGRhZDBmYzQsXG4gICAgICAweDFlNTBlZjVlLCAweGIxNjFlNmY4LCAweGEyODUxNGQ5LCAweDZjNTExMzNjLFxuICAgICAgMHg2ZmQ1YzdlNywgMHg1NmUxNGVjNCwgMHgzNjJhYmZjZSwgMHhkZGM2YzgzNyxcbiAgICAgIDB4ZDc5YTMyMzQsIDB4OTI2MzgyMTIsIDB4NjcwZWZhOGUsIDB4NDA2MDAwZTBdKSxcbiAgICBuZXcgVWludDMyQXJyYXkoW1xuICAgICAgMHgzYTM5Y2UzNywgMHhkM2ZhZjVjZiwgMHhhYmMyNzczNywgMHg1YWM1MmQxYixcbiAgICAgIDB4NWNiMDY3OWUsIDB4NGZhMzM3NDIsIDB4ZDM4MjI3NDAsIDB4OTliYzliYmUsXG4gICAgICAweGQ1MTE4ZTlkLCAweGJmMGY3MzE1LCAweGQ2MmQxYzdlLCAweGM3MDBjNDdiLFxuICAgICAgMHhiNzhjMWI2YiwgMHgyMWExOTA0NSwgMHhiMjZlYjFiZSwgMHg2YTM2NmViNCxcbiAgICAgIDB4NTc0OGFiMmYsIDB4YmM5NDZlNzksIDB4YzZhMzc2ZDIsIDB4NjU0OWMyYzgsXG4gICAgICAweDUzMGZmOGVlLCAweDQ2OGRkZTdkLCAweGQ1NzMwYTFkLCAweDRjZDA0ZGM2LFxuICAgICAgMHgyOTM5YmJkYiwgMHhhOWJhNDY1MCwgMHhhYzk1MjZlOCwgMHhiZTVlZTMwNCxcbiAgICAgIDB4YTFmYWQ1ZjAsIDB4NmEyZDUxOWEsIDB4NjNlZjhjZTIsIDB4OWE4NmVlMjIsXG4gICAgICAweGMwODljMmI4LCAweDQzMjQyZWY2LCAweGE1MWUwM2FhLCAweDljZjJkMGE0LFxuICAgICAgMHg4M2MwNjFiYSwgMHg5YmU5NmE0ZCwgMHg4ZmU1MTU1MCwgMHhiYTY0NWJkNixcbiAgICAgIDB4MjgyNmEyZjksIDB4YTczYTNhZTEsIDB4NGJhOTk1ODYsIDB4ZWY1NTYyZTksXG4gICAgICAweGM3MmZlZmQzLCAweGY3NTJmN2RhLCAweDNmMDQ2ZjY5LCAweDc3ZmEwYTU5LFxuICAgICAgMHg4MGU0YTkxNSwgMHg4N2IwODYwMSwgMHg5YjA5ZTZhZCwgMHgzYjNlZTU5MyxcbiAgICAgIDB4ZTk5MGZkNWEsIDB4OWUzNGQ3OTcsIDB4MmNmMGI3ZDksIDB4MDIyYjhiNTEsXG4gICAgICAweDk2ZDVhYzNhLCAweDAxN2RhNjdkLCAweGQxY2YzZWQ2LCAweDdjN2QyZDI4LFxuICAgICAgMHgxZjlmMjVjZiwgMHhhZGYyYjg5YiwgMHg1YWQ2YjQ3MiwgMHg1YTg4ZjU0YyxcbiAgICAgIDB4ZTAyOWFjNzEsIDB4ZTAxOWE1ZTYsIDB4NDdiMGFjZmQsIDB4ZWQ5M2ZhOWIsXG4gICAgICAweGU4ZDNjNDhkLCAweDI4M2I1N2NjLCAweGY4ZDU2NjI5LCAweDc5MTMyZTI4LFxuICAgICAgMHg3ODVmMDE5MSwgMHhlZDc1NjA1NSwgMHhmNzk2MGU0NCwgMHhlM2QzNWU4YyxcbiAgICAgIDB4MTUwNTZkZDQsIDB4ODhmNDZkYmEsIDB4MDNhMTYxMjUsIDB4MDU2NGYwYmQsXG4gICAgICAweGMzZWI5ZTE1LCAweDNjOTA1N2EyLCAweDk3MjcxYWVjLCAweGE5M2EwNzJhLFxuICAgICAgMHgxYjNmNmQ5YiwgMHgxZTYzMjFmNSwgMHhmNTljNjZmYiwgMHgyNmRjZjMxOSxcbiAgICAgIDB4NzUzM2Q5MjgsIDB4YjE1NWZkZjUsIDB4MDM1NjM0ODIsIDB4OGFiYTNjYmIsXG4gICAgICAweDI4NTE3NzExLCAweGMyMGFkOWY4LCAweGFiY2M1MTY3LCAweGNjYWQ5MjVmLFxuICAgICAgMHg0ZGU4MTc1MSwgMHgzODMwZGM4ZSwgMHgzNzlkNTg2MiwgMHg5MzIwZjk5MSxcbiAgICAgIDB4ZWE3YTkwYzIsIDB4ZmIzZTdiY2UsIDB4NTEyMWNlNjQsIDB4Nzc0ZmJlMzIsXG4gICAgICAweGE4YjZlMzdlLCAweGMzMjkzZDQ2LCAweDQ4ZGU1MzY5LCAweDY0MTNlNjgwLFxuICAgICAgMHhhMmFlMDgxMCwgMHhkZDZkYjIyNCwgMHg2OTg1MmRmZCwgMHgwOTA3MjE2NixcbiAgICAgIDB4YjM5YTQ2MGEsIDB4NjQ0NWMwZGQsIDB4NTg2Y2RlY2YsIDB4MWMyMGM4YWUsXG4gICAgICAweDViYmVmN2RkLCAweDFiNTg4ZDQwLCAweGNjZDIwMTdmLCAweDZiYjRlM2JiLFxuICAgICAgMHhkZGEyNmE3ZSwgMHgzYTU5ZmY0NSwgMHgzZTM1MGE0NCwgMHhiY2I0Y2RkNSxcbiAgICAgIDB4NzJlYWNlYTgsIDB4ZmE2NDg0YmIsIDB4OGQ2NjEyYWUsIDB4YmYzYzZmNDcsXG4gICAgICAweGQyOWJlNDYzLCAweDU0MmY1ZDllLCAweGFlYzI3NzFiLCAweGY2NGU2MzcwLFxuICAgICAgMHg3NDBlMGQ4ZCwgMHhlNzViMTM1NywgMHhmODcyMTY3MSwgMHhhZjUzN2Q1ZCxcbiAgICAgIDB4NDA0MGNiMDgsIDB4NGViNGUyY2MsIDB4MzRkMjQ2NmEsIDB4MDExNWFmODQsXG4gICAgICAweGUxYjAwNDI4LCAweDk1OTgzYTFkLCAweDA2Yjg5ZmI0LCAweGNlNmVhMDQ4LFxuICAgICAgMHg2ZjNmM2I4MiwgMHgzNTIwYWI4MiwgMHgwMTFhMWQ0YiwgMHgyNzcyMjdmOCxcbiAgICAgIDB4NjExNTYwYjEsIDB4ZTc5MzNmZGMsIDB4YmIzYTc5MmIsIDB4MzQ0NTI1YmQsXG4gICAgICAweGEwODgzOWUxLCAweDUxY2U3OTRiLCAweDJmMzJjOWI3LCAweGEwMWZiYWM5LFxuICAgICAgMHhlMDFjYzg3ZSwgMHhiY2M3ZDFmNiwgMHhjZjAxMTFjMywgMHhhMWU4YWFjNyxcbiAgICAgIDB4MWE5MDg3NDksIDB4ZDQ0ZmJkOWEsIDB4ZDBkYWRlY2IsIDB4ZDUwYWRhMzgsXG4gICAgICAweDAzMzljMzJhLCAweGM2OTEzNjY3LCAweDhkZjkzMTdjLCAweGUwYjEyYjRmLFxuICAgICAgMHhmNzllNTliNywgMHg0M2Y1YmIzYSwgMHhmMmQ1MTlmZiwgMHgyN2Q5NDU5YyxcbiAgICAgIDB4YmY5NzIyMmMsIDB4MTVlNmZjMmEsIDB4MGY5MWZjNzEsIDB4OWI5NDE1MjUsXG4gICAgICAweGZhZTU5MzYxLCAweGNlYjY5Y2ViLCAweGMyYTg2NDU5LCAweDEyYmFhOGQxLFxuICAgICAgMHhiNmMxMDc1ZSwgMHhlMzA1NmEwYywgMHgxMGQyNTA2NSwgMHhjYjAzYTQ0MixcbiAgICAgIDB4ZTBlYzZlMGUsIDB4MTY5OGRiM2IsIDB4NGM5OGEwYmUsIDB4MzI3OGU5NjQsXG4gICAgICAweDlmMWY5NTMyLCAweGUwZDM5MmRmLCAweGQzYTAzNDJiLCAweDg5NzFmMjFlLFxuICAgICAgMHgxYjBhNzQ0MSwgMHg0YmEzMzQ4YywgMHhjNWJlNzEyMCwgMHhjMzc2MzJkOCxcbiAgICAgIDB4ZGYzNTlmOGQsIDB4OWI5OTJmMmUsIDB4ZTYwYjZmNDcsIDB4MGZlM2YxMWQsXG4gICAgICAweGU1NGNkYTU0LCAweDFlZGFkODkxLCAweGNlNjI3OWNmLCAweGNkM2U3ZTZmLFxuICAgICAgMHgxNjE4YjE2NiwgMHhmZDJjMWQwNSwgMHg4NDhmZDJjNSwgMHhmNmZiMjI5OSxcbiAgICAgIDB4ZjUyM2YzNTcsIDB4YTYzMjc2MjMsIDB4OTNhODM1MzEsIDB4NTZjY2NkMDIsXG4gICAgICAweGFjZjA4MTYyLCAweDVhNzVlYmI1LCAweDZlMTYzNjk3LCAweDg4ZDI3M2NjLFxuICAgICAgMHhkZTk2NjI5MiwgMHg4MWI5NDlkMCwgMHg0YzUwOTAxYiwgMHg3MWM2NTYxNCxcbiAgICAgIDB4ZTZjNmM3YmQsIDB4MzI3YTE0MGEsIDB4NDVlMWQwMDYsIDB4YzNmMjdiOWEsXG4gICAgICAweGM5YWE1M2ZkLCAweDYyYTgwZjAwLCAweGJiMjViZmUyLCAweDM1YmRkMmY2LFxuICAgICAgMHg3MTEyNjkwNSwgMHhiMjA0MDIyMiwgMHhiNmNiY2Y3YywgMHhjZDc2OWMyYixcbiAgICAgIDB4NTMxMTNlYzAsIDB4MTY0MGUzZDMsIDB4MzhhYmJkNjAsIDB4MjU0N2FkZjAsXG4gICAgICAweGJhMzgyMDljLCAweGY3NDZjZTc2LCAweDc3YWZhMWM1LCAweDIwNzU2MDYwLFxuICAgICAgMHg4NWNiZmU0ZSwgMHg4YWU4OGRkOCwgMHg3YWFhZjliMCwgMHg0Y2Y5YWE3ZSxcbiAgICAgIDB4MTk0OGMyNWMsIDB4MDJmYjhhOGMsIDB4MDFjMzZhZTQsIDB4ZDZlYmUxZjksXG4gICAgICAweDkwZDRmODY5LCAweGE2NWNkZWEwLCAweDNmMDkyNTJkLCAweGMyMDhlNjlmLFxuICAgICAgMHhiNzRlNjEzMiwgMHhjZTc3ZTI1YiwgMHg1NzhmZGZlMywgMHgzYWMzNzJlNl0pXG4gICAgXTtcbiAgdGhpcy5QID0gbmV3IFVpbnQzMkFycmF5KFtcbiAgICAweDI0M2Y2YTg4LCAweDg1YTMwOGQzLCAweDEzMTk4YTJlLCAweDAzNzA3MzQ0LFxuICAgIDB4YTQwOTM4MjIsIDB4Mjk5ZjMxZDAsIDB4MDgyZWZhOTgsIDB4ZWM0ZTZjODksXG4gICAgMHg0NTI4MjFlNiwgMHgzOGQwMTM3NywgMHhiZTU0NjZjZiwgMHgzNGU5MGM2YyxcbiAgICAweGMwYWMyOWI3LCAweGM5N2M1MGRkLCAweDNmODRkNWI1LCAweGI1NDcwOTE3LFxuICAgIDB4OTIxNmQ1ZDksIDB4ODk3OWZiMWJdKTtcbn07XG5cbmZ1bmN0aW9uIEYoUywgeDgsIGkpIHtcbiAgcmV0dXJuICgoKFNbMF1beDhbaSszXV0gK1xuICAgICAgICAgICAgU1sxXVt4OFtpKzJdXSkgXlxuICAgICAgICAgICAgU1syXVt4OFtpKzFdXSkgK1xuICAgICAgICAgICAgU1szXVt4OFtpXV0pO1xufTtcblxuQmxvd2Zpc2gucHJvdG90eXBlLmVuY2lwaGVyID0gZnVuY3Rpb24oeCwgeDgpIHtcbiAgaWYgKHg4ID09PSB1bmRlZmluZWQpIHtcbiAgICB4OCA9IG5ldyBVaW50OEFycmF5KHguYnVmZmVyKTtcbiAgICBpZiAoeC5ieXRlT2Zmc2V0ICE9PSAwKVxuICAgICAgeDggPSB4OC5zdWJhcnJheSh4LmJ5dGVPZmZzZXQpO1xuICB9XG4gIHhbMF0gXj0gdGhpcy5QWzBdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IDE2OyBpICs9IDIpIHtcbiAgICB4WzFdIF49IEYodGhpcy5TLCB4OCwgMCkgXiB0aGlzLlBbaV07XG4gICAgeFswXSBePSBGKHRoaXMuUywgeDgsIDQpIF4gdGhpcy5QW2krMV07XG4gIH1cbiAgdmFyIHQgPSB4WzBdO1xuICB4WzBdID0geFsxXSBeIHRoaXMuUFsxN107XG4gIHhbMV0gPSB0O1xufTtcblxuQmxvd2Zpc2gucHJvdG90eXBlLmRlY2lwaGVyID0gZnVuY3Rpb24oeCkge1xuICB2YXIgeDggPSBuZXcgVWludDhBcnJheSh4LmJ1ZmZlcik7XG4gIGlmICh4LmJ5dGVPZmZzZXQgIT09IDApXG4gICAgeDggPSB4OC5zdWJhcnJheSh4LmJ5dGVPZmZzZXQpO1xuICB4WzBdIF49IHRoaXMuUFsxN107XG4gIGZvciAodmFyIGkgPSAxNjsgaSA+IDA7IGkgLT0gMikge1xuICAgIHhbMV0gXj0gRih0aGlzLlMsIHg4LCAwKSBeIHRoaXMuUFtpXTtcbiAgICB4WzBdIF49IEYodGhpcy5TLCB4OCwgNCkgXiB0aGlzLlBbaS0xXTtcbiAgfVxuICB2YXIgdCA9IHhbMF07XG4gIHhbMF0gPSB4WzFdIF4gdGhpcy5QWzBdO1xuICB4WzFdID0gdDtcbn07XG5cbmZ1bmN0aW9uIHN0cmVhbTJ3b3JkKGRhdGEsIGRhdGFieXRlcyl7XG4gIHZhciBpLCB0ZW1wID0gMDtcbiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgQkxGX0orKykge1xuICAgIGlmIChCTEZfSiA+PSBkYXRhYnl0ZXMpIEJMRl9KID0gMDtcbiAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBkYXRhW0JMRl9KXTtcbiAgfVxuICByZXR1cm4gdGVtcDtcbn07XG5cbkJsb3dmaXNoLnByb3RvdHlwZS5leHBhbmQwc3RhdGUgPSBmdW5jdGlvbihrZXksIGtleWJ5dGVzKSB7XG4gIHZhciBkID0gbmV3IFVpbnQzMkFycmF5KDIpLCBpLCBrO1xuICB2YXIgZDggPSBuZXcgVWludDhBcnJheShkLmJ1ZmZlcik7XG5cbiAgZm9yIChpID0gMCwgQkxGX0ogPSAwOyBpIDwgMTg7IGkrKykge1xuICAgIHRoaXMuUFtpXSBePSBzdHJlYW0yd29yZChrZXksIGtleWJ5dGVzKTtcbiAgfVxuICBCTEZfSiA9IDA7XG5cbiAgZm9yIChpID0gMDsgaSA8IDE4OyBpICs9IDIpIHtcbiAgICB0aGlzLmVuY2lwaGVyKGQsIGQ4KTtcbiAgICB0aGlzLlBbaV0gICA9IGRbMF07XG4gICAgdGhpcy5QW2krMV0gPSBkWzFdO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIGZvciAoayA9IDA7IGsgPCAyNTY7IGsgKz0gMikge1xuICAgICAgdGhpcy5lbmNpcGhlcihkLCBkOCk7XG4gICAgICB0aGlzLlNbaV1ba10gICA9IGRbMF07XG4gICAgICB0aGlzLlNbaV1baysxXSA9IGRbMV07XG4gICAgfVxuICB9XG59O1xuXG5CbG93ZmlzaC5wcm90b3R5cGUuZXhwYW5kc3RhdGUgPSBmdW5jdGlvbihkYXRhLCBkYXRhYnl0ZXMsIGtleSwga2V5Ynl0ZXMpIHtcbiAgdmFyIGQgPSBuZXcgVWludDMyQXJyYXkoMiksIGksIGs7XG5cbiAgZm9yIChpID0gMCwgQkxGX0ogPSAwOyBpIDwgMTg7IGkrKykge1xuICAgIHRoaXMuUFtpXSBePSBzdHJlYW0yd29yZChrZXksIGtleWJ5dGVzKTtcbiAgfVxuXG4gIGZvciAoaSA9IDAsIEJMRl9KID0gMDsgaSA8IDE4OyBpICs9IDIpIHtcbiAgICBkWzBdIF49IHN0cmVhbTJ3b3JkKGRhdGEsIGRhdGFieXRlcyk7XG4gICAgZFsxXSBePSBzdHJlYW0yd29yZChkYXRhLCBkYXRhYnl0ZXMpO1xuICAgIHRoaXMuZW5jaXBoZXIoZCk7XG4gICAgdGhpcy5QW2ldICAgPSBkWzBdO1xuICAgIHRoaXMuUFtpKzFdID0gZFsxXTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrICs9IDIpIHtcbiAgICAgIGRbMF0gXj0gc3RyZWFtMndvcmQoZGF0YSwgZGF0YWJ5dGVzKTtcbiAgICAgIGRbMV0gXj0gc3RyZWFtMndvcmQoZGF0YSwgZGF0YWJ5dGVzKTtcbiAgICAgIHRoaXMuZW5jaXBoZXIoZCk7XG4gICAgICB0aGlzLlNbaV1ba10gICA9IGRbMF07XG4gICAgICB0aGlzLlNbaV1baysxXSA9IGRbMV07XG4gICAgfVxuICB9XG4gIEJMRl9KID0gMDtcbn07XG5cbkJsb3dmaXNoLnByb3RvdHlwZS5lbmMgPSBmdW5jdGlvbihkYXRhLCBibG9ja3MpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3M7IGkrKykge1xuICAgIHRoaXMuZW5jaXBoZXIoZGF0YS5zdWJhcnJheShpKjIpKTtcbiAgfVxufTtcblxuQmxvd2Zpc2gucHJvdG90eXBlLmRlYyA9IGZ1bmN0aW9uKGRhdGEsIGJsb2Nrcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrczsgaSsrKSB7XG4gICAgdGhpcy5kZWNpcGhlcihkYXRhLnN1YmFycmF5KGkqMikpO1xuICB9XG59O1xuXG52YXIgQkNSWVBUX0JMT0NLUyA9IDgsXG4gICAgQkNSWVBUX0hBU0hTSVpFID0gMzI7XG5cbmZ1bmN0aW9uIGJjcnlwdF9oYXNoKHNoYTJwYXNzLCBzaGEyc2FsdCwgb3V0KSB7XG4gIHZhciBzdGF0ZSA9IG5ldyBCbG93ZmlzaCgpLFxuICAgICAgY2RhdGEgPSBuZXcgVWludDMyQXJyYXkoQkNSWVBUX0JMT0NLUyksIGksXG4gICAgICBjaXBoZXJ0ZXh0ID0gbmV3IFVpbnQ4QXJyYXkoWzc5LDEyMCwxMjEsOTksMTA0LDExNCwxMTEsMTA5LDk3LDExNiwxMDUsXG4gICAgICAgICAgICA5OSw2NiwxMDgsMTExLDExOSwxMDIsMTA1LDExNSwxMDQsODMsMTE5LDk3LDExNiw2OCwxMjEsMTEwLDk3LDEwOSxcbiAgICAgICAgICAgIDEwNSwxMTYsMTAxXSk7IC8vXCJPeHljaHJvbWF0aWNCbG93ZmlzaFN3YXREeW5hbWl0ZVwiXG5cbiAgc3RhdGUuZXhwYW5kc3RhdGUoc2hhMnNhbHQsIDY0LCBzaGEycGFzcywgNjQpO1xuICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgIHN0YXRlLmV4cGFuZDBzdGF0ZShzaGEyc2FsdCwgNjQpO1xuICAgIHN0YXRlLmV4cGFuZDBzdGF0ZShzaGEycGFzcywgNjQpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IEJDUllQVF9CTE9DS1M7IGkrKylcbiAgICBjZGF0YVtpXSA9IHN0cmVhbTJ3b3JkKGNpcGhlcnRleHQsIGNpcGhlcnRleHQuYnl0ZUxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKVxuICAgIHN0YXRlLmVuYyhjZGF0YSwgY2RhdGEuYnl0ZUxlbmd0aCAvIDgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBCQ1JZUFRfQkxPQ0tTOyBpKyspIHtcbiAgICBvdXRbNCppKzNdID0gY2RhdGFbaV0gPj4+IDI0O1xuICAgIG91dFs0KmkrMl0gPSBjZGF0YVtpXSA+Pj4gMTY7XG4gICAgb3V0WzQqaSsxXSA9IGNkYXRhW2ldID4+PiA4O1xuICAgIG91dFs0KmkrMF0gPSBjZGF0YVtpXTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYmNyeXB0X3Bia2RmKHBhc3MsIHBhc3NsZW4sIHNhbHQsIHNhbHRsZW4sIGtleSwga2V5bGVuLCByb3VuZHMpIHtcbiAgdmFyIHNoYTJwYXNzID0gbmV3IFVpbnQ4QXJyYXkoNjQpLFxuICAgICAgc2hhMnNhbHQgPSBuZXcgVWludDhBcnJheSg2NCksXG4gICAgICBvdXQgPSBuZXcgVWludDhBcnJheShCQ1JZUFRfSEFTSFNJWkUpLFxuICAgICAgdG1wb3V0ID0gbmV3IFVpbnQ4QXJyYXkoQkNSWVBUX0hBU0hTSVpFKSxcbiAgICAgIGNvdW50c2FsdCA9IG5ldyBVaW50OEFycmF5KHNhbHRsZW4rNCksXG4gICAgICBpLCBqLCBhbXQsIHN0cmlkZSwgZGVzdCwgY291bnQsXG4gICAgICBvcmlna2V5bGVuID0ga2V5bGVuO1xuXG4gIGlmIChyb3VuZHMgPCAxKVxuICAgIHJldHVybiAtMTtcbiAgaWYgKHBhc3NsZW4gPT09IDAgfHwgc2FsdGxlbiA9PT0gMCB8fCBrZXlsZW4gPT09IDAgfHxcbiAgICAgIGtleWxlbiA+IChvdXQuYnl0ZUxlbmd0aCAqIG91dC5ieXRlTGVuZ3RoKSB8fCBzYWx0bGVuID4gKDE8PDIwKSlcbiAgICByZXR1cm4gLTE7XG5cbiAgc3RyaWRlID0gTWF0aC5mbG9vcigoa2V5bGVuICsgb3V0LmJ5dGVMZW5ndGggLSAxKSAvIG91dC5ieXRlTGVuZ3RoKTtcbiAgYW10ID0gTWF0aC5mbG9vcigoa2V5bGVuICsgc3RyaWRlIC0gMSkgLyBzdHJpZGUpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzYWx0bGVuOyBpKyspXG4gICAgY291bnRzYWx0W2ldID0gc2FsdFtpXTtcblxuICBjcnlwdG9faGFzaF9zaGE1MTIoc2hhMnBhc3MsIHBhc3MsIHBhc3NsZW4pO1xuXG4gIGZvciAoY291bnQgPSAxOyBrZXlsZW4gPiAwOyBjb3VudCsrKSB7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rMF0gPSBjb3VudCA+Pj4gMjQ7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rMV0gPSBjb3VudCA+Pj4gMTY7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rMl0gPSBjb3VudCA+Pj4gIDg7XG4gICAgY291bnRzYWx0W3NhbHRsZW4rM10gPSBjb3VudDtcblxuICAgIGNyeXB0b19oYXNoX3NoYTUxMihzaGEyc2FsdCwgY291bnRzYWx0LCBzYWx0bGVuICsgNCk7XG4gICAgYmNyeXB0X2hhc2goc2hhMnBhc3MsIHNoYTJzYWx0LCB0bXBvdXQpO1xuICAgIGZvciAoaSA9IG91dC5ieXRlTGVuZ3RoOyBpLS07KVxuICAgICAgb3V0W2ldID0gdG1wb3V0W2ldO1xuXG4gICAgZm9yIChpID0gMTsgaSA8IHJvdW5kczsgaSsrKSB7XG4gICAgICBjcnlwdG9faGFzaF9zaGE1MTIoc2hhMnNhbHQsIHRtcG91dCwgdG1wb3V0LmJ5dGVMZW5ndGgpO1xuICAgICAgYmNyeXB0X2hhc2goc2hhMnBhc3MsIHNoYTJzYWx0LCB0bXBvdXQpO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG91dC5ieXRlTGVuZ3RoOyBqKyspXG4gICAgICAgIG91dFtqXSBePSB0bXBvdXRbal07XG4gICAgfVxuXG4gICAgYW10ID0gTWF0aC5taW4oYW10LCBrZXlsZW4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhbXQ7IGkrKykge1xuICAgICAgZGVzdCA9IGkgKiBzdHJpZGUgKyAoY291bnQgLSAxKTtcbiAgICAgIGlmIChkZXN0ID49IG9yaWdrZXlsZW4pXG4gICAgICAgIGJyZWFrO1xuICAgICAga2V5W2Rlc3RdID0gb3V0W2ldO1xuICAgIH1cbiAgICBrZXlsZW4gLT0gaTtcbiAgfVxuXG4gIHJldHVybiAwO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICBCTE9DS1M6IEJDUllQVF9CTE9DS1MsXG4gICAgICBIQVNIU0laRTogQkNSWVBUX0hBU0hTSVpFLFxuICAgICAgaGFzaDogYmNyeXB0X2hhc2gsXG4gICAgICBwYmtkZjogYmNyeXB0X3Bia2RmXG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0cmVhZFNTSFByaXZhdGU6IHJlYWRTU0hQcml2YXRlLFxuXHR3cml0ZTogd3JpdGVcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuLi9hbGdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG52YXIgcGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbnZhciByZmM0MjUzID0gcmVxdWlyZSgnLi9yZmM0MjUzJyk7XG52YXIgU1NIQnVmZmVyID0gcmVxdWlyZSgnLi4vc3NoLWJ1ZmZlcicpO1xudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpO1xuXG52YXIgYmNyeXB0O1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHBlbS5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xufVxuXG52YXIgTUFHSUMgPSAnb3BlbnNzaC1rZXktdjEnO1xuXG5mdW5jdGlvbiByZWFkU1NIUHJpdmF0ZSh0eXBlLCBidWYsIG9wdGlvbnMpIHtcblx0YnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBidWZ9KTtcblxuXHR2YXIgbWFnaWMgPSBidWYucmVhZENTdHJpbmcoKTtcblx0YXNzZXJ0LnN0cmljdEVxdWFsKG1hZ2ljLCBNQUdJQywgJ2JhZCBtYWdpYyBzdHJpbmcnKTtcblxuXHR2YXIgY2lwaGVyID0gYnVmLnJlYWRTdHJpbmcoKTtcblx0dmFyIGtkZiA9IGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdHZhciBrZGZPcHRzID0gYnVmLnJlYWRCdWZmZXIoKTtcblxuXHR2YXIgbmtleXMgPSBidWYucmVhZEludCgpO1xuXHRpZiAobmtleXMgIT09IDEpIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdPcGVuU1NILWZvcm1hdCBrZXkgZmlsZSBjb250YWlucyAnICtcblx0XHQgICAgJ211bHRpcGxlIGtleXM6IHRoaXMgaXMgdW5zdXBwb3J0ZWQuJykpO1xuXHR9XG5cblx0dmFyIHB1YktleSA9IGJ1Zi5yZWFkQnVmZmVyKCk7XG5cblx0aWYgKHR5cGUgPT09ICdwdWJsaWMnKSB7XG5cdFx0YXNzZXJ0Lm9rKGJ1Zi5hdEVuZCgpLCAnZXhjZXNzIGJ5dGVzIGxlZnQgYWZ0ZXIga2V5Jyk7XG5cdFx0cmV0dXJuIChyZmM0MjUzLnJlYWQocHViS2V5KSk7XG5cdH1cblxuXHR2YXIgcHJpdktleUJsb2IgPSBidWYucmVhZEJ1ZmZlcigpO1xuXHRhc3NlcnQub2soYnVmLmF0RW5kKCksICdleGNlc3MgYnl0ZXMgbGVmdCBhZnRlciBrZXknKTtcblxuXHR2YXIga2RmT3B0c0J1ZiA9IG5ldyBTU0hCdWZmZXIoeyBidWZmZXI6IGtkZk9wdHMgfSk7XG5cdHN3aXRjaCAoa2RmKSB7XG5cdGNhc2UgJ25vbmUnOlxuXHRcdGlmIChjaXBoZXIgIT09ICdub25lJykge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignT3BlblNTSC1mb3JtYXQga2V5IHVzZXMgS0RGIFwibm9uZVwiICcgK1xuXHRcdFx0ICAgICAnYnV0IHNwZWNpZmllcyBhIGNpcGhlciBvdGhlciB0aGFuIFwibm9uZVwiJykpO1xuXHRcdH1cblx0XHRicmVhaztcblx0Y2FzZSAnYmNyeXB0Jzpcblx0XHR2YXIgc2FsdCA9IGtkZk9wdHNCdWYucmVhZEJ1ZmZlcigpO1xuXHRcdHZhciByb3VuZHMgPSBrZGZPcHRzQnVmLnJlYWRJbnQoKTtcblx0XHR2YXIgY2luZiA9IHV0aWxzLm9wZW5zc2hDaXBoZXJJbmZvKGNpcGhlcik7XG5cdFx0aWYgKGJjcnlwdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQtcGJrZGYnKTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIChvcHRpb25zLnBhc3NwaHJhc2UpID09PSAnc3RyaW5nJykge1xuXHRcdFx0b3B0aW9ucy5wYXNzcGhyYXNlID0gQnVmZmVyLmZyb20ob3B0aW9ucy5wYXNzcGhyYXNlLFxuXHRcdFx0ICAgICd1dGYtOCcpO1xuXHRcdH1cblx0XHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLnBhc3NwaHJhc2UpKSB7XG5cdFx0XHR0aHJvdyAobmV3IGVycm9ycy5LZXlFbmNyeXB0ZWRFcnJvcihcblx0XHRcdCAgICBvcHRpb25zLmZpbGVuYW1lLCAnT3BlblNTSCcpKTtcblx0XHR9XG5cblx0XHR2YXIgcGFzcyA9IG5ldyBVaW50OEFycmF5KG9wdGlvbnMucGFzc3BocmFzZSk7XG5cdFx0dmFyIHNhbHRpID0gbmV3IFVpbnQ4QXJyYXkoc2FsdCk7XG5cdFx0LyogVXNlIHRoZSBwYmtkZiB0byBkZXJpdmUgYm90aCB0aGUga2V5IGFuZCB0aGUgSVYuICovXG5cdFx0dmFyIG91dCA9IG5ldyBVaW50OEFycmF5KGNpbmYua2V5U2l6ZSArIGNpbmYuYmxvY2tTaXplKTtcblx0XHR2YXIgcmVzID0gYmNyeXB0LnBia2RmKHBhc3MsIHBhc3MubGVuZ3RoLCBzYWx0aSwgc2FsdGkubGVuZ3RoLFxuXHRcdCAgICBvdXQsIG91dC5sZW5ndGgsIHJvdW5kcyk7XG5cdFx0aWYgKHJlcyAhPT0gMCkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignYmNyeXB0X3Bia2RmIGZ1bmN0aW9uIHJldHVybmVkICcgK1xuXHRcdFx0ICAgICdmYWlsdXJlLCBwYXJhbWV0ZXJzIGludmFsaWQnKSk7XG5cdFx0fVxuXHRcdG91dCA9IEJ1ZmZlci5mcm9tKG91dCk7XG5cdFx0dmFyIGNrZXkgPSBvdXQuc2xpY2UoMCwgY2luZi5rZXlTaXplKTtcblx0XHR2YXIgaXYgPSBvdXQuc2xpY2UoY2luZi5rZXlTaXplLCBjaW5mLmtleVNpemUgKyBjaW5mLmJsb2NrU2l6ZSk7XG5cdFx0dmFyIGNpcGhlclN0cmVhbSA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KGNpbmYub3BlbnNzbE5hbWUsXG5cdFx0ICAgIGNrZXksIGl2KTtcblx0XHRjaXBoZXJTdHJlYW0uc2V0QXV0b1BhZGRpbmcoZmFsc2UpO1xuXHRcdHZhciBjaHVuaywgY2h1bmtzID0gW107XG5cdFx0Y2lwaGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGlmIChlLnRvU3RyaW5nKCkuaW5kZXhPZignYmFkIGRlY3J5cHQnKSAhPT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3NwaHJhc2UgJyArXG5cdFx0XHRcdCAgICAnc3VwcGxpZWQsIGNvdWxkIG5vdCBkZWNyeXB0IGtleScpKTtcblx0XHRcdH1cblx0XHRcdHRocm93IChlKTtcblx0XHR9KTtcblx0XHRjaXBoZXJTdHJlYW0ud3JpdGUocHJpdktleUJsb2IpO1xuXHRcdGNpcGhlclN0cmVhbS5lbmQoKTtcblx0XHR3aGlsZSAoKGNodW5rID0gY2lwaGVyU3RyZWFtLnJlYWQoKSkgIT09IG51bGwpXG5cdFx0XHRjaHVua3MucHVzaChjaHVuayk7XG5cdFx0cHJpdktleUJsb2IgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcihcblx0XHQgICAgJ09wZW5TU0gtZm9ybWF0IGtleSB1c2VzIHVua25vd24gS0RGIFwiJyArIGtkZiArICdcIicpKTtcblx0fVxuXG5cdGJ1ZiA9IG5ldyBTU0hCdWZmZXIoe2J1ZmZlcjogcHJpdktleUJsb2J9KTtcblxuXHR2YXIgY2hlY2tJbnQxID0gYnVmLnJlYWRJbnQoKTtcblx0dmFyIGNoZWNrSW50MiA9IGJ1Zi5yZWFkSW50KCk7XG5cdGlmIChjaGVja0ludDEgIT09IGNoZWNrSW50Mikge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzcGhyYXNlIHN1cHBsaWVkLCBjb3VsZCBub3QgJyArXG5cdFx0ICAgICdkZWNyeXB0IGtleScpKTtcblx0fVxuXG5cdHZhciByZXQgPSB7fTtcblx0dmFyIGtleSA9IHJmYzQyNTMucmVhZEludGVybmFsKHJldCwgJ3ByaXZhdGUnLCBidWYucmVtYWluZGVyKCkpO1xuXG5cdGJ1Zi5za2lwKHJldC5jb25zdW1lZCk7XG5cblx0dmFyIGNvbW1lbnQgPSBidWYucmVhZFN0cmluZygpO1xuXHRrZXkuY29tbWVudCA9IGNvbW1lbnQ7XG5cblx0cmV0dXJuIChrZXkpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0dmFyIHB1YktleTtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpXG5cdFx0cHViS2V5ID0ga2V5LnRvUHVibGljKCk7XG5cdGVsc2Vcblx0XHRwdWJLZXkgPSBrZXk7XG5cblx0dmFyIGNpcGhlciA9ICdub25lJztcblx0dmFyIGtkZiA9ICdub25lJztcblx0dmFyIGtkZm9wdHMgPSBCdWZmZXIuYWxsb2MoMCk7XG5cdHZhciBjaW5mID0geyBibG9ja1NpemU6IDggfTtcblx0dmFyIHBhc3NwaHJhc2U7XG5cdGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXNzcGhyYXNlID0gb3B0aW9ucy5wYXNzcGhyYXNlO1xuXHRcdGlmICh0eXBlb2YgKHBhc3NwaHJhc2UpID09PSAnc3RyaW5nJylcblx0XHRcdHBhc3NwaHJhc2UgPSBCdWZmZXIuZnJvbShwYXNzcGhyYXNlLCAndXRmLTgnKTtcblx0XHRpZiAocGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRhc3NlcnQuYnVmZmVyKHBhc3NwaHJhc2UsICdvcHRpb25zLnBhc3NwaHJhc2UnKTtcblx0XHRcdGFzc2VydC5vcHRpb25hbFN0cmluZyhvcHRpb25zLmNpcGhlciwgJ29wdGlvbnMuY2lwaGVyJyk7XG5cdFx0XHRjaXBoZXIgPSBvcHRpb25zLmNpcGhlcjtcblx0XHRcdGlmIChjaXBoZXIgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0Y2lwaGVyID0gJ2FlczEyOC1jdHInO1xuXHRcdFx0Y2luZiA9IHV0aWxzLm9wZW5zc2hDaXBoZXJJbmZvKGNpcGhlcik7XG5cdFx0XHRrZGYgPSAnYmNyeXB0Jztcblx0XHR9XG5cdH1cblxuXHR2YXIgcHJpdkJ1Zjtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpIHtcblx0XHRwcml2QnVmID0gbmV3IFNTSEJ1ZmZlcih7fSk7XG5cdFx0dmFyIGNoZWNrSW50ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRVSW50MzJCRSgwKTtcblx0XHRwcml2QnVmLndyaXRlSW50KGNoZWNrSW50KTtcblx0XHRwcml2QnVmLndyaXRlSW50KGNoZWNrSW50KTtcblx0XHRwcml2QnVmLndyaXRlKGtleS50b0J1ZmZlcigncmZjNDI1MycpKTtcblx0XHRwcml2QnVmLndyaXRlU3RyaW5nKGtleS5jb21tZW50IHx8ICcnKTtcblxuXHRcdHZhciBuID0gMTtcblx0XHR3aGlsZSAocHJpdkJ1Zi5fb2Zmc2V0ICUgY2luZi5ibG9ja1NpemUgIT09IDApXG5cdFx0XHRwcml2QnVmLndyaXRlQ2hhcihuKyspO1xuXHRcdHByaXZCdWYgPSBwcml2QnVmLnRvQnVmZmVyKCk7XG5cdH1cblxuXHRzd2l0Y2ggKGtkZikge1xuXHRjYXNlICdub25lJzpcblx0XHRicmVhaztcblx0Y2FzZSAnYmNyeXB0Jzpcblx0XHR2YXIgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcygxNik7XG5cdFx0dmFyIHJvdW5kcyA9IDE2O1xuXHRcdHZhciBrZGZzc2ggPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0XHRrZGZzc2gud3JpdGVCdWZmZXIoc2FsdCk7XG5cdFx0a2Rmc3NoLndyaXRlSW50KHJvdW5kcyk7XG5cdFx0a2Rmb3B0cyA9IGtkZnNzaC50b0J1ZmZlcigpO1xuXG5cdFx0aWYgKGJjcnlwdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRiY3J5cHQgPSByZXF1aXJlKCdiY3J5cHQtcGJrZGYnKTtcblx0XHR9XG5cdFx0dmFyIHBhc3MgPSBuZXcgVWludDhBcnJheShwYXNzcGhyYXNlKTtcblx0XHR2YXIgc2FsdGkgPSBuZXcgVWludDhBcnJheShzYWx0KTtcblx0XHQvKiBVc2UgdGhlIHBia2RmIHRvIGRlcml2ZSBib3RoIHRoZSBrZXkgYW5kIHRoZSBJVi4gKi9cblx0XHR2YXIgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoY2luZi5rZXlTaXplICsgY2luZi5ibG9ja1NpemUpO1xuXHRcdHZhciByZXMgPSBiY3J5cHQucGJrZGYocGFzcywgcGFzcy5sZW5ndGgsIHNhbHRpLCBzYWx0aS5sZW5ndGgsXG5cdFx0ICAgIG91dCwgb3V0Lmxlbmd0aCwgcm91bmRzKTtcblx0XHRpZiAocmVzICE9PSAwKSB7XG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdiY3J5cHRfcGJrZGYgZnVuY3Rpb24gcmV0dXJuZWQgJyArXG5cdFx0XHQgICAgJ2ZhaWx1cmUsIHBhcmFtZXRlcnMgaW52YWxpZCcpKTtcblx0XHR9XG5cdFx0b3V0ID0gQnVmZmVyLmZyb20ob3V0KTtcblx0XHR2YXIgY2tleSA9IG91dC5zbGljZSgwLCBjaW5mLmtleVNpemUpO1xuXHRcdHZhciBpdiA9IG91dC5zbGljZShjaW5mLmtleVNpemUsIGNpbmYua2V5U2l6ZSArIGNpbmYuYmxvY2tTaXplKTtcblxuXHRcdHZhciBjaXBoZXJTdHJlYW0gPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoY2luZi5vcGVuc3NsTmFtZSxcblx0XHQgICAgY2tleSwgaXYpO1xuXHRcdGNpcGhlclN0cmVhbS5zZXRBdXRvUGFkZGluZyhmYWxzZSk7XG5cdFx0dmFyIGNodW5rLCBjaHVua3MgPSBbXTtcblx0XHRjaXBoZXJTdHJlYW0ub25jZSgnZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dGhyb3cgKGUpO1xuXHRcdH0pO1xuXHRcdGNpcGhlclN0cmVhbS53cml0ZShwcml2QnVmKTtcblx0XHRjaXBoZXJTdHJlYW0uZW5kKCk7XG5cdFx0d2hpbGUgKChjaHVuayA9IGNpcGhlclN0cmVhbS5yZWFkKCkpICE9PSBudWxsKVxuXHRcdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXHRcdHByaXZCdWYgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2RmICcgKyBrZGYpKTtcblx0fVxuXG5cdHZhciBidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblxuXHRidWYud3JpdGVDU3RyaW5nKE1BR0lDKTtcblx0YnVmLndyaXRlU3RyaW5nKGNpcGhlcik7XHQvKiBjaXBoZXIgKi9cblx0YnVmLndyaXRlU3RyaW5nKGtkZik7XHRcdC8qIGtkZiAqL1xuXHRidWYud3JpdGVCdWZmZXIoa2Rmb3B0cyk7XHQvKiBrZGZvcHRpb25zICovXG5cblx0YnVmLndyaXRlSW50KDEpO1x0XHQvKiBua2V5cyAqL1xuXHRidWYud3JpdGVCdWZmZXIocHViS2V5LnRvQnVmZmVyKCdyZmM0MjUzJykpO1xuXG5cdGlmIChwcml2QnVmKVxuXHRcdGJ1Zi53cml0ZUJ1ZmZlcihwcml2QnVmKTtcblxuXHRidWYgPSBidWYudG9CdWZmZXIoKTtcblxuXHR2YXIgaGVhZGVyO1xuXHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRoZWFkZXIgPSAnT1BFTlNTSCBQUklWQVRFIEtFWSc7XG5cdGVsc2Vcblx0XHRoZWFkZXIgPSAnT1BFTlNTSCBQVUJMSUMgS0VZJztcblxuXHR2YXIgdG1wID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0dmFyIGxlbiA9IHRtcC5sZW5ndGggKyAodG1wLmxlbmd0aCAvIDcwKSArXG5cdCAgICAxOCArIDE2ICsgaGVhZGVyLmxlbmd0aCoyICsgMTA7XG5cdGJ1ZiA9IEJ1ZmZlci5hbGxvYyhsZW4pO1xuXHR2YXIgbyA9IDA7XG5cdG8gKz0gYnVmLndyaXRlKCctLS0tLUJFR0lOICcgKyBoZWFkZXIgKyAnLS0tLS1cXG4nLCBvKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyApIHtcblx0XHR2YXIgbGltaXQgPSBpICsgNzA7XG5cdFx0aWYgKGxpbWl0ID4gdG1wLmxlbmd0aClcblx0XHRcdGxpbWl0ID0gdG1wLmxlbmd0aDtcblx0XHRvICs9IGJ1Zi53cml0ZSh0bXAuc2xpY2UoaSwgbGltaXQpLCBvKTtcblx0XHRidWZbbysrXSA9IDEwO1xuXHRcdGkgPSBsaW1pdDtcblx0fVxuXHRvICs9IGJ1Zi53cml0ZSgnLS0tLS1FTkQgJyArIGhlYWRlciArICctLS0tLVxcbicsIG8pO1xuXG5cdHJldHVybiAoYnVmLnNsaWNlKDAsIG8pKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxOCBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHdyaXRlOiB3cml0ZVxufTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4uL2FsZ3MnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG5cbnZhciBwa2NzMSA9IHJlcXVpcmUoJy4vcGtjczEnKTtcbnZhciBwa2NzOCA9IHJlcXVpcmUoJy4vcGtjczgnKTtcbnZhciBzc2hwcml2ID0gcmVxdWlyZSgnLi9zc2gtcHJpdmF0ZScpO1xudmFyIHJmYzQyNTMgPSByZXF1aXJlKCcuL3JmYzQyNTMnKTtcblxudmFyIGVycm9ycyA9IHJlcXVpcmUoJy4uL2Vycm9ycycpO1xuXG52YXIgT0lEX1BCRVMyID0gJzEuMi44NDAuMTEzNTQ5LjEuNS4xMyc7XG52YXIgT0lEX1BCS0RGMiA9ICcxLjIuODQwLjExMzU0OS4xLjUuMTInO1xuXG52YXIgT0lEX1RPX0NJUEhFUiA9IHtcblx0JzEuMi44NDAuMTEzNTQ5LjMuNyc6ICczZGVzLWNiYycsXG5cdCcyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yJzogJ2FlczEyOC1jYmMnLFxuXHQnMi4xNi44NDAuMS4xMDEuMy40LjEuNDInOiAnYWVzMjU2LWNiYydcbn07XG52YXIgQ0lQSEVSX1RPX09JRCA9IHt9O1xuT2JqZWN0LmtleXMoT0lEX1RPX0NJUEhFUikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHRDSVBIRVJfVE9fT0lEW09JRF9UT19DSVBIRVJba11dID0gaztcbn0pO1xuXG52YXIgT0lEX1RPX0hBU0ggPSB7XG5cdCcxLjIuODQwLjExMzU0OS4yLjcnOiAnc2hhMScsXG5cdCcxLjIuODQwLjExMzU0OS4yLjknOiAnc2hhMjU2Jyxcblx0JzEuMi44NDAuMTEzNTQ5LjIuMTEnOiAnc2hhNTEyJ1xufTtcbnZhciBIQVNIX1RPX09JRCA9IHt9O1xuT2JqZWN0LmtleXMoT0lEX1RPX0hBU0gpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0SEFTSF9UT19PSURbT0lEX1RPX0hBU0hba11dID0gaztcbn0pO1xuXG4vKlxuICogRm9yIHJlYWRpbmcgd2Ugc3VwcG9ydCBib3RoIFBLQ1MjMSBhbmQgUEtDUyM4LiBJZiB3ZSBmaW5kIGEgcHJpdmF0ZSBrZXksXG4gKiB3ZSBqdXN0IHRha2UgdGhlIHB1YmxpYyBjb21wb25lbnQgb2YgaXQgYW5kIHVzZSB0aGF0LlxuICovXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucywgZm9yY2VUeXBlKSB7XG5cdHZhciBpbnB1dCA9IGJ1Zjtcblx0aWYgKHR5cGVvZiAoYnVmKSAhPT0gJ3N0cmluZycpIHtcblx0XHRhc3NlcnQuYnVmZmVyKGJ1ZiwgJ2J1ZicpO1xuXHRcdGJ1ZiA9IGJ1Zi50b1N0cmluZygnYXNjaWknKTtcblx0fVxuXG5cdHZhciBsaW5lcyA9IGJ1Zi50cmltKCkuc3BsaXQoL1tcXHJcXG5dKy9nKTtcblxuXHR2YXIgbTtcblx0dmFyIHNpID0gLTE7XG5cdHdoaWxlICghbSAmJiBzaSA8IGxpbmVzLmxlbmd0aCkge1xuXHRcdG0gPSBsaW5lc1srK3NpXS5tYXRjaCgvKkpTU1RZTEVEKi9cblx0XHQgICAgL1stXStbIF0qQkVHSU4gKFtBLVowLTldW0EtWmEtejAtOV0rICk/KFBVQkxJQ3xQUklWQVRFKSBLRVlbIF0qWy1dKy8pO1xuXHR9XG5cdGFzc2VydC5vayhtLCAnaW52YWxpZCBQRU0gaGVhZGVyJyk7XG5cblx0dmFyIG0yO1xuXHR2YXIgZWkgPSBsaW5lcy5sZW5ndGg7XG5cdHdoaWxlICghbTIgJiYgZWkgPiAwKSB7XG5cdFx0bTIgPSBsaW5lc1stLWVpXS5tYXRjaCgvKkpTU1RZTEVEKi9cblx0XHQgICAgL1stXStbIF0qRU5EIChbQS1aMC05XVtBLVphLXowLTldKyApPyhQVUJMSUN8UFJJVkFURSkgS0VZWyBdKlstXSsvKTtcblx0fVxuXHRhc3NlcnQub2sobTIsICdpbnZhbGlkIFBFTSBmb290ZXInKTtcblxuXHQvKiBCZWdpbiBhbmQgZW5kIGJhbm5lcnMgbXVzdCBtYXRjaCBrZXkgdHlwZSAqL1xuXHRhc3NlcnQuZXF1YWwobVsyXSwgbTJbMl0pO1xuXHR2YXIgdHlwZSA9IG1bMl0udG9Mb3dlckNhc2UoKTtcblxuXHR2YXIgYWxnO1xuXHRpZiAobVsxXSkge1xuXHRcdC8qIFRoZXkgYWxzbyBtdXN0IG1hdGNoIGFsZ29yaXRobXMsIGlmIGdpdmVuICovXG5cdFx0YXNzZXJ0LmVxdWFsKG1bMV0sIG0yWzFdLCAnUEVNIGhlYWRlciBhbmQgZm9vdGVyIG1pc21hdGNoJyk7XG5cdFx0YWxnID0gbVsxXS50cmltKCk7XG5cdH1cblxuXHRsaW5lcyA9IGxpbmVzLnNsaWNlKHNpLCBlaSArIDEpO1xuXG5cdHZhciBoZWFkZXJzID0ge307XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0bGluZXMgPSBsaW5lcy5zbGljZSgxKTtcblx0XHRtID0gbGluZXNbMF0ubWF0Y2goLypKU1NUWUxFRCovXG5cdFx0ICAgIC9eKFtBLVphLXowLTktXSspOiAoLispJC8pO1xuXHRcdGlmICghbSlcblx0XHRcdGJyZWFrO1xuXHRcdGhlYWRlcnNbbVsxXS50b0xvd2VyQ2FzZSgpXSA9IG1bMl07XG5cdH1cblxuXHQvKiBDaG9wIG9mZiB0aGUgZmlyc3QgYW5kIGxhc3QgbGluZXMgKi9cblx0bGluZXMgPSBsaW5lcy5zbGljZSgwLCAtMSkuam9pbignJyk7XG5cdGJ1ZiA9IEJ1ZmZlci5mcm9tKGxpbmVzLCAnYmFzZTY0Jyk7XG5cblx0dmFyIGNpcGhlciwga2V5LCBpdjtcblx0aWYgKGhlYWRlcnNbJ3Byb2MtdHlwZSddKSB7XG5cdFx0dmFyIHBhcnRzID0gaGVhZGVyc1sncHJvYy10eXBlJ10uc3BsaXQoJywnKTtcblx0XHRpZiAocGFydHNbMF0gPT09ICc0JyAmJiBwYXJ0c1sxXSA9PT0gJ0VOQ1JZUFRFRCcpIHtcblx0XHRcdGlmICh0eXBlb2YgKG9wdGlvbnMucGFzc3BocmFzZSkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdG9wdGlvbnMucGFzc3BocmFzZSA9IEJ1ZmZlci5mcm9tKFxuXHRcdFx0XHQgICAgb3B0aW9ucy5wYXNzcGhyYXNlLCAndXRmLTgnKTtcblx0XHRcdH1cblx0XHRcdGlmICghQnVmZmVyLmlzQnVmZmVyKG9wdGlvbnMucGFzc3BocmFzZSkpIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBlcnJvcnMuS2V5RW5jcnlwdGVkRXJyb3IoXG5cdFx0XHRcdCAgICBvcHRpb25zLmZpbGVuYW1lLCAnUEVNJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cGFydHMgPSBoZWFkZXJzWydkZWstaW5mbyddLnNwbGl0KCcsJyk7XG5cdFx0XHRcdGFzc2VydC5vayhwYXJ0cy5sZW5ndGggPT09IDIpO1xuXHRcdFx0XHRjaXBoZXIgPSBwYXJ0c1swXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRpdiA9IEJ1ZmZlci5mcm9tKHBhcnRzWzFdLCAnaGV4Jyk7XG5cdFx0XHRcdGtleSA9IHV0aWxzLm9wZW5zc2xLZXlEZXJpdihjaXBoZXIsIGl2LFxuXHRcdFx0XHQgICAgb3B0aW9ucy5wYXNzcGhyYXNlLCAxKS5rZXk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFsZyAmJiBhbGcudG9Mb3dlckNhc2UoKSA9PT0gJ2VuY3J5cHRlZCcpIHtcblx0XHR2YXIgZWRlciA9IG5ldyBhc24xLkJlclJlYWRlcihidWYpO1xuXHRcdHZhciBwYmVzRW5kO1xuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XG5cblx0XHRlZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHBiZXNFbmQgPSBlZGVyLm9mZnNldCArIGVkZXIubGVuZ3RoO1xuXG5cdFx0dmFyIG1ldGhvZCA9IGVkZXIucmVhZE9JRCgpO1xuXHRcdGlmIChtZXRob2QgIT09IE9JRF9QQkVTMikge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUEVNL1BLQ1M4IGVuY3J5cHRpb24gJyArXG5cdFx0XHQgICAgJ3NjaGVtZTogJyArIG1ldGhvZCkpO1xuXHRcdH1cblxuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XHQvKiBQQkVTMi1wYXJhbXMgKi9cblxuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XHQvKiBrZXlEZXJpdmF0aW9uRnVuYyAqL1xuXHRcdHZhciBrZGZFbmQgPSBlZGVyLm9mZnNldCArIGVkZXIubGVuZ3RoO1xuXHRcdHZhciBrZGZPaWQgPSBlZGVyLnJlYWRPSUQoKTtcblx0XHRpZiAoa2RmT2lkICE9PSBPSURfUEJLREYyKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUEJFUzIgS0RGOiAnICsga2RmT2lkKSk7XG5cdFx0ZWRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHR2YXIgc2FsdCA9IGVkZXIucmVhZFN0cmluZyhhc24xLkJlci5PY3RldFN0cmluZywgdHJ1ZSk7XG5cdFx0dmFyIGl0ZXJhdGlvbnMgPSBlZGVyLnJlYWRJbnQoKTtcblx0XHR2YXIgaGFzaEFsZyA9ICdzaGExJztcblx0XHRpZiAoZWRlci5vZmZzZXQgPCBrZGZFbmQpIHtcblx0XHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XG5cdFx0XHR2YXIgaGFzaEFsZ09pZCA9IGVkZXIucmVhZE9JRCgpO1xuXHRcdFx0aGFzaEFsZyA9IE9JRF9UT19IQVNIW2hhc2hBbGdPaWRdO1xuXHRcdFx0aWYgKGhhc2hBbGcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBQQktERjIgaGFzaDogJyArXG5cdFx0XHRcdCAgICBoYXNoQWxnT2lkKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVkZXIuX29mZnNldCA9IGtkZkVuZDtcblxuXHRcdGVkZXIucmVhZFNlcXVlbmNlKCk7XHQvKiBlbmNyeXB0aW9uU2NoZW1lICovXG5cdFx0dmFyIGNpcGhlck9pZCA9IGVkZXIucmVhZE9JRCgpO1xuXHRcdGNpcGhlciA9IE9JRF9UT19DSVBIRVJbY2lwaGVyT2lkXTtcblx0XHRpZiAoY2lwaGVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIFBCRVMyIGNpcGhlcjogJyArXG5cdFx0XHQgICAgY2lwaGVyT2lkKSk7XG5cdFx0fVxuXHRcdGl2ID0gZWRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKTtcblxuXHRcdGVkZXIuX29mZnNldCA9IHBiZXNFbmQ7XG5cdFx0YnVmID0gZWRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKTtcblxuXHRcdGlmICh0eXBlb2YgKG9wdGlvbnMucGFzc3BocmFzZSkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRvcHRpb25zLnBhc3NwaHJhc2UgPSBCdWZmZXIuZnJvbShcblx0XHRcdCAgICBvcHRpb25zLnBhc3NwaHJhc2UsICd1dGYtOCcpO1xuXHRcdH1cblx0XHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLnBhc3NwaHJhc2UpKSB7XG5cdFx0XHR0aHJvdyAobmV3IGVycm9ycy5LZXlFbmNyeXB0ZWRFcnJvcihcblx0XHRcdCAgICBvcHRpb25zLmZpbGVuYW1lLCAnUEVNJykpO1xuXHRcdH1cblxuXHRcdHZhciBjaW5mbyA9IHV0aWxzLm9wZW5zc2hDaXBoZXJJbmZvKGNpcGhlcik7XG5cblx0XHRjaXBoZXIgPSBjaW5mby5vcGVuc3NsTmFtZTtcblx0XHRrZXkgPSB1dGlscy5wYmtkZjIoaGFzaEFsZywgc2FsdCwgaXRlcmF0aW9ucywgY2luZm8ua2V5U2l6ZSxcblx0XHQgICAgb3B0aW9ucy5wYXNzcGhyYXNlKTtcblx0XHRhbGcgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoY2lwaGVyICYmIGtleSAmJiBpdikge1xuXHRcdHZhciBjaXBoZXJTdHJlYW0gPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihjaXBoZXIsIGtleSwgaXYpO1xuXHRcdHZhciBjaHVuaywgY2h1bmtzID0gW107XG5cdFx0Y2lwaGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGlmIChlLnRvU3RyaW5nKCkuaW5kZXhPZignYmFkIGRlY3J5cHQnKSAhPT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgKG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3NwaHJhc2UgJyArXG5cdFx0XHRcdCAgICAnc3VwcGxpZWQsIGNvdWxkIG5vdCBkZWNyeXB0IGtleScpKTtcblx0XHRcdH1cblx0XHRcdHRocm93IChlKTtcblx0XHR9KTtcblx0XHRjaXBoZXJTdHJlYW0ud3JpdGUoYnVmKTtcblx0XHRjaXBoZXJTdHJlYW0uZW5kKCk7XG5cdFx0d2hpbGUgKChjaHVuayA9IGNpcGhlclN0cmVhbS5yZWFkKCkpICE9PSBudWxsKVxuXHRcdFx0Y2h1bmtzLnB1c2goY2h1bmspO1xuXHRcdGJ1ZiA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcblx0fVxuXG5cdC8qIFRoZSBuZXcgT3BlblNTSCBpbnRlcm5hbCBmb3JtYXQgYWJ1c2VzIFBFTSBoZWFkZXJzICovXG5cdGlmIChhbGcgJiYgYWxnLnRvTG93ZXJDYXNlKCkgPT09ICdvcGVuc3NoJylcblx0XHRyZXR1cm4gKHNzaHByaXYucmVhZFNTSFByaXZhdGUodHlwZSwgYnVmLCBvcHRpb25zKSk7XG5cdGlmIChhbGcgJiYgYWxnLnRvTG93ZXJDYXNlKCkgPT09ICdzc2gyJylcblx0XHRyZXR1cm4gKHJmYzQyNTMucmVhZFR5cGUodHlwZSwgYnVmLCBvcHRpb25zKSk7XG5cblx0dmFyIGRlciA9IG5ldyBhc24xLkJlclJlYWRlcihidWYpO1xuXHRkZXIub3JpZ2luYWxJbnB1dCA9IGlucHV0O1xuXG5cdC8qXG5cdCAqIEFsbCBvZiB0aGUgUEVNIGZpbGUgdHlwZXMgc3RhcnQgd2l0aCBhIHNlcXVlbmNlIHRhZywgc28gY2hvcCBpdFxuXHQgKiBvZmYgaGVyZVxuXHQgKi9cblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXG5cdC8qIFBLQ1MjMSB0eXBlIGtleXMgbmFtZSBhbiBhbGdvcml0aG0gaW4gdGhlIGJhbm5lciBleHBsaWNpdGx5ICovXG5cdGlmIChhbGcpIHtcblx0XHRpZiAoZm9yY2VUeXBlKVxuXHRcdFx0YXNzZXJ0LnN0cmljdEVxdWFsKGZvcmNlVHlwZSwgJ3BrY3MxJyk7XG5cdFx0cmV0dXJuIChwa2NzMS5yZWFkUGtjczEoYWxnLCB0eXBlLCBkZXIpKTtcblx0fSBlbHNlIHtcblx0XHRpZiAoZm9yY2VUeXBlKVxuXHRcdFx0YXNzZXJ0LnN0cmljdEVxdWFsKGZvcmNlVHlwZSwgJ3BrY3M4Jyk7XG5cdFx0cmV0dXJuIChwa2NzOC5yZWFkUGtjczgoYWxnLCB0eXBlLCBkZXIpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMsIHR5cGUpIHtcblx0YXNzZXJ0Lm9iamVjdChrZXkpO1xuXG5cdHZhciBhbGcgPSB7XG5cdCAgICAnZWNkc2EnOiAnRUMnLFxuXHQgICAgJ3JzYSc6ICdSU0EnLFxuXHQgICAgJ2RzYSc6ICdEU0EnLFxuXHQgICAgJ2VkMjU1MTknOiAnRWREU0EnXG5cdH1ba2V5LnR5cGVdO1xuXHR2YXIgaGVhZGVyO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblxuXHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSkge1xuXHRcdGlmICh0eXBlICYmIHR5cGUgPT09ICdwa2NzOCcpIHtcblx0XHRcdGhlYWRlciA9ICdQUklWQVRFIEtFWSc7XG5cdFx0XHRwa2NzOC53cml0ZVBrY3M4KGRlciwga2V5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGUpXG5cdFx0XHRcdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCAncGtjczEnKTtcblx0XHRcdGhlYWRlciA9IGFsZyArICcgUFJJVkFURSBLRVknO1xuXHRcdFx0cGtjczEud3JpdGVQa2NzMShkZXIsIGtleSk7XG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoS2V5LmlzS2V5KGtleSkpIHtcblx0XHRpZiAodHlwZSAmJiB0eXBlID09PSAncGtjczEnKSB7XG5cdFx0XHRoZWFkZXIgPSBhbGcgKyAnIFBVQkxJQyBLRVknO1xuXHRcdFx0cGtjczEud3JpdGVQa2NzMShkZXIsIGtleSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0eXBlKVxuXHRcdFx0XHRhc3NlcnQuc3RyaWN0RXF1YWwodHlwZSwgJ3BrY3M4Jyk7XG5cdFx0XHRoZWFkZXIgPSAnUFVCTElDIEtFWSc7XG5cdFx0XHRwa2NzOC53cml0ZVBrY3M4KGRlciwga2V5KTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdrZXkgaXMgbm90IGEgS2V5IG9yIFByaXZhdGVLZXknKSk7XG5cdH1cblxuXHR2YXIgdG1wID0gZGVyLmJ1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG5cdHZhciBsZW4gPSB0bXAubGVuZ3RoICsgKHRtcC5sZW5ndGggLyA2NCkgK1xuXHQgICAgMTggKyAxNiArIGhlYWRlci5sZW5ndGgqMiArIDEwO1xuXHR2YXIgYnVmID0gQnVmZmVyLmFsbG9jKGxlbik7XG5cdHZhciBvID0gMDtcblx0byArPSBidWYud3JpdGUoJy0tLS0tQkVHSU4gJyArIGhlYWRlciArICctLS0tLVxcbicsIG8pO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7ICkge1xuXHRcdHZhciBsaW1pdCA9IGkgKyA2NDtcblx0XHRpZiAobGltaXQgPiB0bXAubGVuZ3RoKVxuXHRcdFx0bGltaXQgPSB0bXAubGVuZ3RoO1xuXHRcdG8gKz0gYnVmLndyaXRlKHRtcC5zbGljZShpLCBsaW1pdCksIG8pO1xuXHRcdGJ1ZltvKytdID0gMTA7XG5cdFx0aSA9IGxpbWl0O1xuXHR9XG5cdG8gKz0gYnVmLndyaXRlKCctLS0tLUVORCAnICsgaGVhZGVyICsgJy0tLS0tXFxuJywgbyk7XG5cblx0cmV0dXJuIChidWYuc2xpY2UoMCwgbykpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE1IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgcmZjNDI1MyA9IHJlcXVpcmUoJy4vcmZjNDI1MycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcblxudmFyIHNzaHByaXYgPSByZXF1aXJlKCcuL3NzaC1wcml2YXRlJyk7XG5cbi8qSlNTVFlMRUQqL1xudmFyIFNTSEtFWV9SRSA9IC9eKFthLXowLTktXSspWyBcXHRdKyhbYS16QS1aMC05K1xcL10rWz1dKikoWyBcXHRdKyhbXiBcXHRdW15cXG5dKltcXG5dKik/KT8kLztcbi8qSlNTVFlMRUQqL1xudmFyIFNTSEtFWV9SRTIgPSAvXihbYS16MC05LV0rKVsgXFx0XFxuXSsoW2EtekEtWjAtOStcXC9dW2EtekEtWjAtOStcXC8gXFx0XFxuPV0qKShbXmEtekEtWjAtOStcXC8gXFx0XFxuPV0uKik/JC87XG5cbmZ1bmN0aW9uIHJlYWQoYnVmLCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgKGJ1ZikgIT09ICdzdHJpbmcnKSB7XG5cdFx0YXNzZXJ0LmJ1ZmZlcihidWYsICdidWYnKTtcblx0XHRidWYgPSBidWYudG9TdHJpbmcoJ2FzY2lpJyk7XG5cdH1cblxuXHR2YXIgdHJpbW1lZCA9IGJ1Zi50cmltKCkucmVwbGFjZSgvW1xcXFxcXHJdL2csICcnKTtcblx0dmFyIG0gPSB0cmltbWVkLm1hdGNoKFNTSEtFWV9SRSk7XG5cdGlmICghbSlcblx0XHRtID0gdHJpbW1lZC5tYXRjaChTU0hLRVlfUkUyKTtcblx0YXNzZXJ0Lm9rKG0sICdrZXkgbXVzdCBtYXRjaCByZWdleCcpO1xuXG5cdHZhciB0eXBlID0gcmZjNDI1My5hbGdUb0tleVR5cGUobVsxXSk7XG5cdHZhciBrYnVmID0gQnVmZmVyLmZyb20obVsyXSwgJ2Jhc2U2NCcpO1xuXG5cdC8qXG5cdCAqIFRoaXMgaXMgYSBiaXQgdHJpY2t5LiBJZiB3ZSBtYW5hZ2VkIHRvIHBhcnNlIHRoZSBrZXkgYW5kIGxvY2F0ZSB0aGVcblx0ICoga2V5IGNvbW1lbnQgd2l0aCB0aGUgcmVnZXgsIHRoZW4gZG8gYSBub24tcGFydGlhbCByZWFkIGFuZCBhc3NlcnRcblx0ICogdGhhdCB3ZSBoYXZlIGNvbnN1bWVkIGFsbCBieXRlcy4gSWYgd2UgY291bGRuJ3QgbG9jYXRlIHRoZSBrZXlcblx0ICogY29tbWVudCwgdGhvdWdoLCB0aGVyZSBtYXkgYmUgd2hpdGVzcGFjZSBzaGVuYW5pZ2FucyBnb2luZyBvbiB0aGF0XG5cdCAqIGhhdmUgY29uam9pbmVkIHRoZSBjb21tZW50IHRvIHRoZSByZXN0IG9mIHRoZSBrZXkuIFdlIGRvIGEgcGFydGlhbFxuXHQgKiByZWFkIGluIHRoaXMgY2FzZSB0byB0cnkgdG8gbWFrZSB0aGUgYmVzdCBvdXQgb2YgYSBzb3JyeSBzaXR1YXRpb24uXG5cdCAqL1xuXHR2YXIga2V5O1xuXHR2YXIgcmV0ID0ge307XG5cdGlmIChtWzRdKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGtleSA9IHJmYzQyNTMucmVhZChrYnVmKTtcblxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG0gPSB0cmltbWVkLm1hdGNoKFNTSEtFWV9SRTIpO1xuXHRcdFx0YXNzZXJ0Lm9rKG0sICdrZXkgbXVzdCBtYXRjaCByZWdleCcpO1xuXHRcdFx0a2J1ZiA9IEJ1ZmZlci5mcm9tKG1bMl0sICdiYXNlNjQnKTtcblx0XHRcdGtleSA9IHJmYzQyNTMucmVhZEludGVybmFsKHJldCwgJ3B1YmxpYycsIGtidWYpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRrZXkgPSByZmM0MjUzLnJlYWRJbnRlcm5hbChyZXQsICdwdWJsaWMnLCBrYnVmKTtcblx0fVxuXG5cdGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlLCBrZXkudHlwZSk7XG5cblx0aWYgKG1bNF0gJiYgbVs0XS5sZW5ndGggPiAwKSB7XG5cdFx0a2V5LmNvbW1lbnQgPSBtWzRdO1xuXG5cdH0gZWxzZSBpZiAocmV0LmNvbnN1bWVkKSB7XG5cdFx0Lypcblx0XHQgKiBOb3cgdGhlIG1hZ2ljOiB0cnlpbmcgdG8gcmVjb3ZlciB0aGUga2V5IGNvbW1lbnQgd2hlbiBpdCdzXG5cdFx0ICogZ290dGVuIGNvbmpvaW5lZCB0byB0aGUga2V5IG9yIG90aGVyd2lzZSBzaGVuYW5pZ2FuJ2QuXG5cdFx0ICpcblx0XHQgKiBXb3JrIG91dCBob3cgbXVjaCBiYXNlNjQgd2UgdXNlZCwgdGhlbiBkcm9wIGFsbCBub24tYmFzZTY0XG5cdFx0ICogY2hhcnMgZnJvbSB0aGUgYmVnaW5uaW5nIHVwIHRvIHRoaXMgcG9pbnQgaW4gdGhlIHRoZSBzdHJpbmcuXG5cdFx0ICogVGhlbiBvZmZzZXQgaW4gdGhpcyBhbmQgdHJ5IHRvIG1ha2UgdXAgZm9yIG1pc3NpbmcgPSBjaGFycy5cblx0XHQgKi9cblx0XHR2YXIgZGF0YSA9IG1bMl0gKyAobVszXSA/IG1bM10gOiAnJyk7XG5cdFx0dmFyIHJlYWxPZmZzZXQgPSBNYXRoLmNlaWwocmV0LmNvbnN1bWVkIC8gMykgKiA0O1xuXHRcdGRhdGEgPSBkYXRhLnNsaWNlKDAsIHJlYWxPZmZzZXQgLSAyKS4gLypKU1NUWUxFRCovXG5cdFx0ICAgIHJlcGxhY2UoL1teYS16QS1aMC05K1xcLz1dL2csICcnKSArXG5cdFx0ICAgIGRhdGEuc2xpY2UocmVhbE9mZnNldCAtIDIpO1xuXG5cdFx0dmFyIHBhZGRpbmcgPSByZXQuY29uc3VtZWQgJSAzO1xuXHRcdGlmIChwYWRkaW5nID4gMCAmJlxuXHRcdCAgICBkYXRhLnNsaWNlKHJlYWxPZmZzZXQgLSAxLCByZWFsT2Zmc2V0KSAhPT0gJz0nKVxuXHRcdFx0cmVhbE9mZnNldC0tO1xuXHRcdHdoaWxlIChkYXRhLnNsaWNlKHJlYWxPZmZzZXQsIHJlYWxPZmZzZXQgKyAxKSA9PT0gJz0nKVxuXHRcdFx0cmVhbE9mZnNldCsrO1xuXG5cdFx0LyogRmluYWxseSwgZ3JhYiB3aGF0IHdlIHRoaW5rIGlzIHRoZSBjb21tZW50ICYgY2xlYW4gaXQgdXAuICovXG5cdFx0dmFyIHRyYWlsZXIgPSBkYXRhLnNsaWNlKHJlYWxPZmZzZXQpO1xuXHRcdHRyYWlsZXIgPSB0cmFpbGVyLnJlcGxhY2UoL1tcXHJcXG5dL2csICcgJykuXG5cdFx0ICAgIHJlcGxhY2UoL15cXHMrLywgJycpO1xuXHRcdGlmICh0cmFpbGVyLm1hdGNoKC9eW2EtekEtWjAtOV0vKSlcblx0XHRcdGtleS5jb21tZW50ID0gdHJhaWxlcjtcblx0fVxuXG5cdHJldHVybiAoa2V5KTtcbn1cblxuZnVuY3Rpb24gd3JpdGUoa2V5LCBvcHRpb25zKSB7XG5cdGFzc2VydC5vYmplY3Qoa2V5KTtcblx0aWYgKCFLZXkuaXNLZXkoa2V5KSlcblx0XHR0aHJvdyAobmV3IEVycm9yKCdNdXN0IGJlIGEgcHVibGljIGtleScpKTtcblxuXHR2YXIgcGFydHMgPSBbXTtcblx0dmFyIGFsZyA9IHJmYzQyNTMua2V5VHlwZVRvQWxnKGtleSk7XG5cdHBhcnRzLnB1c2goYWxnKTtcblxuXHR2YXIgYnVmID0gcmZjNDI1My53cml0ZShrZXkpO1xuXHRwYXJ0cy5wdXNoKGJ1Zi50b1N0cmluZygnYmFzZTY0JykpO1xuXG5cdGlmIChrZXkuY29tbWVudClcblx0XHRwYXJ0cy5wdXNoKGtleS5jb21tZW50KTtcblxuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKHBhcnRzLmpvaW4oJyAnKSkpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE3IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi4va2V5Jyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIFNTSEJ1ZmZlciA9IHJlcXVpcmUoJy4uL3NzaC1idWZmZXInKTtcbnZhciBEaGUgPSByZXF1aXJlKCcuLi9kaGUnKTtcblxudmFyIHN1cHBvcnRlZEFsZ29zID0ge1xuXHQncnNhLXNoYTEnIDogNSxcblx0J3JzYS1zaGEyNTYnIDogOCxcblx0J3JzYS1zaGE1MTInIDogMTAsXG5cdCdlY2RzYS1wMjU2LXNoYTI1NicgOiAxMyxcblx0J2VjZHNhLXAzODQtc2hhMzg0JyA6IDE0XG5cdC8qXG5cdCAqIGVkMjU1MTkgaXMgaHlwb3RoZXRpY2FsbHkgc3VwcG9ydGVkIHdpdGggaWQgMTVcblx0ICogYnV0IHRoZSBjb21tb24gdG9vbHMgYXZhaWxhYmxlIGRvbid0IGFwcGVhciB0byBiZVxuXHQgKiBjYXBhYmxlIG9mIGdlbmVyYXRpbmcvdXNpbmcgZWQyNTUxOSBrZXlzXG5cdCAqL1xufTtcblxudmFyIHN1cHBvcnRlZEFsZ29zQnlJZCA9IHt9O1xuT2JqZWN0LmtleXMoc3VwcG9ydGVkQWxnb3MpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0c3VwcG9ydGVkQWxnb3NCeUlkW3N1cHBvcnRlZEFsZ29zW2tdXSA9IGsudG9VcHBlckNhc2UoKTtcbn0pO1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChidWYpICE9PSAnc3RyaW5nJykge1xuXHRcdGFzc2VydC5idWZmZXIoYnVmLCAnYnVmJyk7XG5cdFx0YnVmID0gYnVmLnRvU3RyaW5nKCdhc2NpaScpO1xuXHR9XG5cdHZhciBsaW5lcyA9IGJ1Zi5zcGxpdCgnXFxuJyk7XG5cdGlmIChsaW5lc1swXS5tYXRjaCgvXlByaXZhdGUta2V5LWZvcm1hdFxcOiB2MS8pKSB7XG5cdFx0dmFyIGFsZ0VsZW1zID0gbGluZXNbMV0uc3BsaXQoJyAnKTtcblx0XHR2YXIgYWxnb051bSA9IHBhcnNlSW50KGFsZ0VsZW1zWzFdLCAxMCk7XG5cdFx0dmFyIGFsZ29OYW1lID0gYWxnRWxlbXNbMl07XG5cdFx0aWYgKCFzdXBwb3J0ZWRBbGdvc0J5SWRbYWxnb051bV0pXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBhbGdvcml0aG06ICcgKyBhbGdvTmFtZSkpO1xuXHRcdHJldHVybiAocmVhZEROU1NFQ1ByaXZhdGVLZXkoYWxnb051bSwgbGluZXMuc2xpY2UoMikpKTtcblx0fVxuXG5cdC8vIHNraXAgYW55IGNvbW1lbnQtbGluZXNcblx0dmFyIGxpbmUgPSAwO1xuXHQvKiBKU1NUWUxFRCAqL1xuXHR3aGlsZSAobGluZXNbbGluZV0ubWF0Y2goL15cXDsvKSlcblx0XHRsaW5lKys7XG5cdC8vIHdlIHNob3VsZCBub3cgaGF2ZSAqb25lIHNpbmdsZSogbGluZSBsZWZ0IHdpdGggb3VyIEtFWSBvbiBpdC5cblx0aWYgKChsaW5lc1tsaW5lXS5tYXRjaCgvXFwuIElOIEtFWSAvKSB8fFxuXHQgICAgbGluZXNbbGluZV0ubWF0Y2goL1xcLiBJTiBETlNLRVkgLykpICYmIGxpbmVzW2xpbmUrMV0ubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIChyZWFkUkZDMzExMChsaW5lc1tsaW5lXSkpO1xuXHR9XG5cdHRocm93IChuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSBkbnNzZWMga2V5JykpO1xufVxuXG5mdW5jdGlvbiByZWFkUkZDMzExMChrZXlTdHJpbmcpIHtcblx0dmFyIGVsZW1zID0ga2V5U3RyaW5nLnNwbGl0KCcgJyk7XG5cdC8vdW51c2VkIHZhciBmbGFncyA9IHBhcnNlSW50KGVsZW1zWzNdLCAxMCk7XG5cdC8vdW51c2VkIHZhciBwcm90b2NvbCA9IHBhcnNlSW50KGVsZW1zWzRdLCAxMCk7XG5cdHZhciBhbGdvcml0aG0gPSBwYXJzZUludChlbGVtc1s1XSwgMTApO1xuXHRpZiAoIXN1cHBvcnRlZEFsZ29zQnlJZFthbGdvcml0aG1dKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFsZ29yaXRobTogJyArIGFsZ29yaXRobSkpO1xuXHR2YXIgYmFzZTY0a2V5ID0gZWxlbXMuc2xpY2UoNiwgZWxlbXMubGVuZ3RoKS5qb2luKCk7XG5cdHZhciBrZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjRrZXksICdiYXNlNjQnKTtcblx0aWYgKHN1cHBvcnRlZEFsZ29zQnlJZFthbGdvcml0aG1dLm1hdGNoKC9eUlNBLS8pKSB7XG5cdFx0Ly8gam9pbiB0aGUgcmVzdCBvZiB0aGUgYm9keSBpbnRvIGEgc2luZ2xlIGJhc2U2NC1ibG9iXG5cdFx0dmFyIHB1YmxpY0V4cG9uZW50TGVuID0ga2V5QnVmZmVyLnJlYWRVSW50OCgwKTtcblx0XHRpZiAocHVibGljRXhwb25lbnRMZW4gIT0gMyAmJiBwdWJsaWNFeHBvbmVudExlbiAhPSAxKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGRuc3NlYyBrZXk6ICcgK1xuXHRcdFx0ICAgICd1bnN1cHBvcnRlZCBleHBvbmVudCBsZW5ndGgnKSk7XG5cblx0XHR2YXIgcHVibGljRXhwb25lbnQgPSBrZXlCdWZmZXIuc2xpY2UoMSwgcHVibGljRXhwb25lbnRMZW4rMSk7XG5cdFx0cHVibGljRXhwb25lbnQgPSB1dGlscy5tcE5vcm1hbGl6ZShwdWJsaWNFeHBvbmVudCk7XG5cdFx0dmFyIG1vZHVsdXMgPSBrZXlCdWZmZXIuc2xpY2UoMStwdWJsaWNFeHBvbmVudExlbik7XG5cdFx0bW9kdWx1cyA9IHV0aWxzLm1wTm9ybWFsaXplKG1vZHVsdXMpO1xuXHRcdC8vIG5vdywgbWFrZSB0aGUga2V5XG5cdFx0dmFyIHJzYUtleSA9IHtcblx0XHRcdHR5cGU6ICdyc2EnLFxuXHRcdFx0cGFydHM6IFtdXG5cdFx0fTtcblx0XHRyc2FLZXkucGFydHMucHVzaCh7IG5hbWU6ICdlJywgZGF0YTogcHVibGljRXhwb25lbnR9KTtcblx0XHRyc2FLZXkucGFydHMucHVzaCh7IG5hbWU6ICduJywgZGF0YTogbW9kdWx1c30pO1xuXHRcdHJldHVybiAobmV3IEtleShyc2FLZXkpKTtcblx0fVxuXHRpZiAoc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ29yaXRobV0gPT09ICdFQ0RTQS1QMzg0LVNIQTM4NCcgfHxcblx0ICAgIHN1cHBvcnRlZEFsZ29zQnlJZFthbGdvcml0aG1dID09PSAnRUNEU0EtUDI1Ni1TSEEyNTYnKSB7XG5cdFx0dmFyIGN1cnZlID0gJ25pc3RwMzg0Jztcblx0XHR2YXIgc2l6ZSA9IDM4NDtcblx0XHRpZiAoc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ29yaXRobV0ubWF0Y2goL15FQ0RTQS1QMjU2LVNIQTI1Ni8pKSB7XG5cdFx0XHRjdXJ2ZSA9ICduaXN0cDI1Nic7XG5cdFx0XHRzaXplID0gMjU2O1xuXHRcdH1cblxuXHRcdHZhciBlY2RzYUtleSA9IHtcblx0XHRcdHR5cGU6ICdlY2RzYScsXG5cdFx0XHRjdXJ2ZTogY3VydmUsXG5cdFx0XHRzaXplOiBzaXplLFxuXHRcdFx0cGFydHM6IFtcblx0XHRcdFx0e25hbWU6ICdjdXJ2ZScsIGRhdGE6IEJ1ZmZlci5mcm9tKGN1cnZlKSB9LFxuXHRcdFx0XHR7bmFtZTogJ1EnLCBkYXRhOiB1dGlscy5lY05vcm1hbGl6ZShrZXlCdWZmZXIpIH1cblx0XHRcdF1cblx0XHR9O1xuXHRcdHJldHVybiAobmV3IEtleShlY2RzYUtleSkpO1xuXHR9XG5cdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFsZ29yaXRobTogJyArXG5cdCAgICBzdXBwb3J0ZWRBbGdvc0J5SWRbYWxnb3JpdGhtXSkpO1xufVxuXG5mdW5jdGlvbiBlbGVtZW50VG9CdWYoZSkge1xuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKGUuc3BsaXQoJyAnKVsxXSwgJ2Jhc2U2NCcpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEROU1NFQ1JTQVByaXZhdGVLZXkoZWxlbWVudHMpIHtcblx0dmFyIHJzYVBhcmFtcyA9IHt9O1xuXHRlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cdFx0aWYgKGVsZW1lbnQuc3BsaXQoJyAnKVswXSA9PT0gJ01vZHVsdXM6Jylcblx0XHRcdHJzYVBhcmFtc1snbiddID0gZWxlbWVudFRvQnVmKGVsZW1lbnQpO1xuXHRcdGVsc2UgaWYgKGVsZW1lbnQuc3BsaXQoJyAnKVswXSA9PT0gJ1B1YmxpY0V4cG9uZW50OicpXG5cdFx0XHRyc2FQYXJhbXNbJ2UnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdQcml2YXRlRXhwb25lbnQ6Jylcblx0XHRcdHJzYVBhcmFtc1snZCddID0gZWxlbWVudFRvQnVmKGVsZW1lbnQpO1xuXHRcdGVsc2UgaWYgKGVsZW1lbnQuc3BsaXQoJyAnKVswXSA9PT0gJ1ByaW1lMTonKVxuXHRcdFx0cnNhUGFyYW1zWydwJ10gPSBlbGVtZW50VG9CdWYoZWxlbWVudCk7XG5cdFx0ZWxzZSBpZiAoZWxlbWVudC5zcGxpdCgnICcpWzBdID09PSAnUHJpbWUyOicpXG5cdFx0XHRyc2FQYXJhbXNbJ3EnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdFeHBvbmVudDE6Jylcblx0XHRcdHJzYVBhcmFtc1snZG1vZHAnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdFeHBvbmVudDI6Jylcblx0XHRcdHJzYVBhcmFtc1snZG1vZHEnXSA9IGVsZW1lbnRUb0J1ZihlbGVtZW50KTtcblx0XHRlbHNlIGlmIChlbGVtZW50LnNwbGl0KCcgJylbMF0gPT09ICdDb2VmZmljaWVudDonKVxuXHRcdFx0cnNhUGFyYW1zWydpcW1wJ10gPSBlbGVtZW50VG9CdWYoZWxlbWVudCk7XG5cdH0pO1xuXHQvLyBub3csIG1ha2UgdGhlIGtleVxuXHR2YXIga2V5ID0ge1xuXHRcdHR5cGU6ICdyc2EnLFxuXHRcdHBhcnRzOiBbXG5cdFx0XHR7IG5hbWU6ICdlJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocnNhUGFyYW1zWydlJ10pfSxcblx0XHRcdHsgbmFtZTogJ24nLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShyc2FQYXJhbXNbJ24nXSl9LFxuXHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IHV0aWxzLm1wTm9ybWFsaXplKHJzYVBhcmFtc1snZCddKX0sXG5cdFx0XHR7IG5hbWU6ICdwJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocnNhUGFyYW1zWydwJ10pfSxcblx0XHRcdHsgbmFtZTogJ3EnLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShyc2FQYXJhbXNbJ3EnXSl9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHAnLFxuXHRcdFx0ICAgIGRhdGE6IHV0aWxzLm1wTm9ybWFsaXplKHJzYVBhcmFtc1snZG1vZHAnXSl9LFxuXHRcdFx0eyBuYW1lOiAnZG1vZHEnLFxuXHRcdFx0ICAgIGRhdGE6IHV0aWxzLm1wTm9ybWFsaXplKHJzYVBhcmFtc1snZG1vZHEnXSl9LFxuXHRcdFx0eyBuYW1lOiAnaXFtcCcsXG5cdFx0XHQgICAgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocnNhUGFyYW1zWydpcW1wJ10pfVxuXHRcdF1cblx0fTtcblx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleShrZXkpKTtcbn1cblxuZnVuY3Rpb24gcmVhZEROU1NFQ1ByaXZhdGVLZXkoYWxnLCBlbGVtZW50cykge1xuXHRpZiAoc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ10ubWF0Y2goL15SU0EtLykpIHtcblx0XHRyZXR1cm4gKHJlYWRETlNTRUNSU0FQcml2YXRlS2V5KGVsZW1lbnRzKSk7XG5cdH1cblx0aWYgKHN1cHBvcnRlZEFsZ29zQnlJZFthbGddID09PSAnRUNEU0EtUDM4NC1TSEEzODQnIHx8XG5cdCAgICBzdXBwb3J0ZWRBbGdvc0J5SWRbYWxnXSA9PT0gJ0VDRFNBLVAyNTYtU0hBMjU2Jykge1xuXHRcdHZhciBkID0gQnVmZmVyLmZyb20oZWxlbWVudHNbMF0uc3BsaXQoJyAnKVsxXSwgJ2Jhc2U2NCcpO1xuXHRcdHZhciBjdXJ2ZSA9ICduaXN0cDM4NCc7XG5cdFx0dmFyIHNpemUgPSAzODQ7XG5cdFx0aWYgKHN1cHBvcnRlZEFsZ29zQnlJZFthbGddID09PSAnRUNEU0EtUDI1Ni1TSEEyNTYnKSB7XG5cdFx0XHRjdXJ2ZSA9ICduaXN0cDI1Nic7XG5cdFx0XHRzaXplID0gMjU2O1xuXHRcdH1cblx0XHQvLyBETlNTRUMgZ2VuZXJhdGVzIHRoZSBwdWJsaWMta2V5IG9uIHRoZSBmbHkgKGdvIGNhbGN1bGF0ZSBpdClcblx0XHR2YXIgcHVibGljS2V5ID0gdXRpbHMucHVibGljRnJvbVByaXZhdGVFQ0RTQShjdXJ2ZSwgZCk7XG5cdFx0dmFyIFEgPSBwdWJsaWNLZXkucGFydFsnUSddLmRhdGE7XG5cdFx0dmFyIGVjZHNhS2V5ID0ge1xuXHRcdFx0dHlwZTogJ2VjZHNhJyxcblx0XHRcdGN1cnZlOiBjdXJ2ZSxcblx0XHRcdHNpemU6IHNpemUsXG5cdFx0XHRwYXJ0czogW1xuXHRcdFx0XHR7bmFtZTogJ2N1cnZlJywgZGF0YTogQnVmZmVyLmZyb20oY3VydmUpIH0sXG5cdFx0XHRcdHtuYW1lOiAnZCcsIGRhdGE6IGQgfSxcblx0XHRcdFx0e25hbWU6ICdRJywgZGF0YTogUSB9XG5cdFx0XHRdXG5cdFx0fTtcblx0XHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KGVjZHNhS2V5KSk7XG5cdH1cblx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiAnICsgc3VwcG9ydGVkQWxnb3NCeUlkW2FsZ10pKTtcbn1cblxuZnVuY3Rpb24gZG5zc2VjVGltZXN0YW1wKGRhdGUpIHtcblx0dmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyAnJzsgLy9zdHJpbmdpZnlcblx0dmFyIG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuXHR2YXIgdGltZXN0YW1wU3RyID0geWVhciArIG1vbnRoICsgZGF0ZS5nZXRVVENEYXRlKCk7XG5cdHRpbWVzdGFtcFN0ciArPSAnJyArIGRhdGUuZ2V0VVRDSG91cnMoKSArIGRhdGUuZ2V0VVRDTWludXRlcygpO1xuXHR0aW1lc3RhbXBTdHIgKz0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7XG5cdHJldHVybiAodGltZXN0YW1wU3RyKTtcbn1cblxuZnVuY3Rpb24gcnNhQWxnRnJvbU9wdGlvbnMob3B0cykge1xuXHRpZiAoIW9wdHMgfHwgIW9wdHMuaGFzaEFsZ28gfHwgb3B0cy5oYXNoQWxnbyA9PT0gJ3NoYTEnKVxuXHRcdHJldHVybiAoJzUgKFJTQVNIQTEpJyk7XG5cdGVsc2UgaWYgKG9wdHMuaGFzaEFsZ28gPT09ICdzaGEyNTYnKVxuXHRcdHJldHVybiAoJzggKFJTQVNIQTI1NiknKTtcblx0ZWxzZSBpZiAob3B0cy5oYXNoQWxnbyA9PT0gJ3NoYTUxMicpXG5cdFx0cmV0dXJuICgnMTAgKFJTQVNIQTUxMiknKTtcblx0ZWxzZVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24gb3IgdW5zdXBwb3J0ZWQgaGFzaDogJyArXG5cdFx0ICAgIG9wdHMuaGFzaEFsZ28pKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVSU0Eoa2V5LCBvcHRpb25zKSB7XG5cdC8vIGlmIHdlJ3JlIG1pc3NpbmcgcGFydHMsIGFkZCB0aGVtLlxuXHRpZiAoIWtleS5wYXJ0LmRtb2RwIHx8ICFrZXkucGFydC5kbW9kcSkge1xuXHRcdHV0aWxzLmFkZFJTQU1pc3Npbmcoa2V5KTtcblx0fVxuXG5cdHZhciBvdXQgPSAnJztcblx0b3V0ICs9ICdQcml2YXRlLWtleS1mb3JtYXQ6IHYxLjNcXG4nO1xuXHRvdXQgKz0gJ0FsZ29yaXRobTogJyArIHJzYUFsZ0Zyb21PcHRpb25zKG9wdGlvbnMpICsgJ1xcbic7XG5cdHZhciBuID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsnbiddLmRhdGEpO1xuXHRvdXQgKz0gJ01vZHVsdXM6ICcgKyBuLnRvU3RyaW5nKCdiYXNlNjQnKSArICdcXG4nO1xuXHR2YXIgZSA9IHV0aWxzLm1wRGVub3JtYWxpemUoa2V5LnBhcnRbJ2UnXS5kYXRhKTtcblx0b3V0ICs9ICdQdWJsaWNFeHBvbmVudDogJyArIGUudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBkID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsnZCddLmRhdGEpO1xuXHRvdXQgKz0gJ1ByaXZhdGVFeHBvbmVudDogJyArIGQudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBwID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsncCddLmRhdGEpO1xuXHRvdXQgKz0gJ1ByaW1lMTogJyArIHAudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBxID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsncSddLmRhdGEpO1xuXHRvdXQgKz0gJ1ByaW1lMjogJyArIHEudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBkbW9kcCA9IHV0aWxzLm1wRGVub3JtYWxpemUoa2V5LnBhcnRbJ2Rtb2RwJ10uZGF0YSk7XG5cdG91dCArPSAnRXhwb25lbnQxOiAnICsgZG1vZHAudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBkbW9kcSA9IHV0aWxzLm1wRGVub3JtYWxpemUoa2V5LnBhcnRbJ2Rtb2RxJ10uZGF0YSk7XG5cdG91dCArPSAnRXhwb25lbnQyOiAnICsgZG1vZHEudG9TdHJpbmcoJ2Jhc2U2NCcpICsgJ1xcbic7XG5cdHZhciBpcW1wID0gdXRpbHMubXBEZW5vcm1hbGl6ZShrZXkucGFydFsnaXFtcCddLmRhdGEpO1xuXHRvdXQgKz0gJ0NvZWZmaWNpZW50OiAnICsgaXFtcC50b1N0cmluZygnYmFzZTY0JykgKyAnXFxuJztcblx0Ly8gQXNzdW1lIHRoYXQgd2UncmUgdmFsaWQgYXMtb2Ygbm93XG5cdHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXHRvdXQgKz0gJ0NyZWF0ZWQ6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ1B1Ymxpc2g6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ0FjdGl2YXRlOiAnICsgZG5zc2VjVGltZXN0YW1wKHRpbWVzdGFtcCkgKyAnXFxuJztcblx0cmV0dXJuIChCdWZmZXIuZnJvbShvdXQsICdhc2NpaScpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVFQ0RTQShrZXksIG9wdGlvbnMpIHtcblx0dmFyIG91dCA9ICcnO1xuXHRvdXQgKz0gJ1ByaXZhdGUta2V5LWZvcm1hdDogdjEuM1xcbic7XG5cblx0aWYgKGtleS5jdXJ2ZSA9PT0gJ25pc3RwMjU2Jykge1xuXHRcdG91dCArPSAnQWxnb3JpdGhtOiAxMyAoRUNEU0FQMjU2U0hBMjU2KVxcbic7XG5cdH0gZWxzZSBpZiAoa2V5LmN1cnZlID09PSAnbmlzdHAzODQnKSB7XG5cdFx0b3V0ICs9ICdBbGdvcml0aG06IDE0IChFQ0RTQVAzODRTSEEzODQpXFxuJztcblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjdXJ2ZScpKTtcblx0fVxuXHR2YXIgYmFzZTY0S2V5ID0ga2V5LnBhcnRbJ2QnXS5kYXRhLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0b3V0ICs9ICdQcml2YXRlS2V5OiAnICsgYmFzZTY0S2V5ICsgJ1xcbic7XG5cblx0Ly8gQXNzdW1lIHRoYXQgd2UncmUgdmFsaWQgYXMtb2Ygbm93XG5cdHZhciB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuXHRvdXQgKz0gJ0NyZWF0ZWQ6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ1B1Ymxpc2g6ICcgKyBkbnNzZWNUaW1lc3RhbXAodGltZXN0YW1wKSArICdcXG4nO1xuXHRvdXQgKz0gJ0FjdGl2YXRlOiAnICsgZG5zc2VjVGltZXN0YW1wKHRpbWVzdGFtcCkgKyAnXFxuJztcblxuXHRyZXR1cm4gKEJ1ZmZlci5mcm9tKG91dCwgJ2FzY2lpJykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0aWYgKFByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSkpIHtcblx0XHRpZiAoa2V5LnR5cGUgPT09ICdyc2EnKSB7XG5cdFx0XHRyZXR1cm4gKHdyaXRlUlNBKGtleSwgb3B0aW9ucykpO1xuXHRcdH0gZWxzZSBpZiAoa2V5LnR5cGUgPT09ICdlY2RzYScpIHtcblx0XHRcdHJldHVybiAod3JpdGVFQ0RTQShrZXksIG9wdGlvbnMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYWxnb3JpdGhtOiAnICsga2V5LnR5cGUpKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoS2V5LmlzS2V5KGtleSkpIHtcblx0XHQvKlxuXHRcdCAqIFJGQzMxMTAgcmVxdWlyZXMgYSBrZXluYW1lLCBhbmQgYSBrZXl0eXBlLCB3aGljaCB3ZVxuXHRcdCAqIGRvbid0IHJlYWxseSBoYXZlIGEgbWVjaGFuaXNtIGZvciBzcGVjaWZ5aW5nIHN1Y2hcblx0XHQgKiBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuXHRcdCAqL1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0Zvcm1hdCBcImRuc3NlY1wiIG9ubHkgc3VwcG9ydHMgJyArXG5cdFx0ICAgICd3cml0aW5nIHByaXZhdGUga2V5cycpKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdrZXkgaXMgbm90IGEgS2V5IG9yIFByaXZhdGVLZXknKSk7XG5cdH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxOCBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHdyaXRlOiB3cml0ZVxufTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIHJmYzQyNTMgPSByZXF1aXJlKCcuL3JmYzQyNTMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBTU0hCdWZmZXIgPSByZXF1aXJlKCcuLi9zc2gtYnVmZmVyJyk7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgUHJpdmF0ZUtleSA9IHJlcXVpcmUoJy4uL3ByaXZhdGUta2V5Jyk7XG5cbnZhciBlcnJvcnMgPSByZXF1aXJlKCcuLi9lcnJvcnMnKTtcblxuLy8gaHR0cHM6Ly90YXJ0YXJ1cy5vcmcvfnNpbW9uL3B1dHR5LXByZXJlbC1zbmFwc2hvdHMvaHRtbGRvYy9BcHBlbmRpeEMuaHRtbFxuZnVuY3Rpb24gcmVhZChidWYsIG9wdGlvbnMpIHtcblx0dmFyIGxpbmVzID0gYnVmLnRvU3RyaW5nKCdhc2NpaScpLnNwbGl0KC9bXFxyXFxuXSsvKTtcblx0dmFyIGZvdW5kID0gZmFsc2U7XG5cdHZhciBwYXJ0cztcblx0dmFyIHNpID0gMDtcblx0dmFyIGZvcm1hdFZlcnNpb247XG5cdHdoaWxlIChzaSA8IGxpbmVzLmxlbmd0aCkge1xuXHRcdHBhcnRzID0gc3BsaXRIZWFkZXIobGluZXNbc2krK10pO1xuXHRcdGlmIChwYXJ0cykge1xuXHRcdFx0Zm9ybWF0VmVyc2lvbiA9IHtcblx0XHRcdFx0J3B1dHR5LXVzZXIta2V5LWZpbGUtMic6IDIsXG5cdFx0XHRcdCdwdXR0eS11c2VyLWtleS1maWxlLTMnOiAzXG5cdFx0XHR9W3BhcnRzWzBdLnRvTG93ZXJDYXNlKCldO1xuXHRcdFx0aWYgKGZvcm1hdFZlcnNpb24pIHtcblx0XHRcdFx0Zm91bmQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0aWYgKCFmb3VuZCkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ05vIFB1VFRZIGZvcm1hdCBmaXJzdCBsaW5lIGZvdW5kJykpO1xuXHR9XG5cdHZhciBhbGcgPSBwYXJ0c1sxXTtcblxuXHRwYXJ0cyA9IHNwbGl0SGVhZGVyKGxpbmVzW3NpKytdKTtcblx0YXNzZXJ0LmVxdWFsKHBhcnRzWzBdLnRvTG93ZXJDYXNlKCksICdlbmNyeXB0aW9uJyk7XG5cdHZhciBlbmNyeXB0aW9uID0gcGFydHNbMV07XG5cblx0cGFydHMgPSBzcGxpdEhlYWRlcihsaW5lc1tzaSsrXSk7XG5cdGFzc2VydC5lcXVhbChwYXJ0c1swXS50b0xvd2VyQ2FzZSgpLCAnY29tbWVudCcpO1xuXHR2YXIgY29tbWVudCA9IHBhcnRzWzFdO1xuXG5cdHBhcnRzID0gc3BsaXRIZWFkZXIobGluZXNbc2krK10pO1xuXHRhc3NlcnQuZXF1YWwocGFydHNbMF0udG9Mb3dlckNhc2UoKSwgJ3B1YmxpYy1saW5lcycpO1xuXHR2YXIgcHVibGljTGluZXMgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuXHRpZiAoIWlzRmluaXRlKHB1YmxpY0xpbmVzKSB8fCBwdWJsaWNMaW5lcyA8IDAgfHxcblx0ICAgIHB1YmxpY0xpbmVzID4gbGluZXMubGVuZ3RoKSB7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMtbGluZXMgY291bnQnKSk7XG5cdH1cblxuXHR2YXIgcHVibGljQnVmID0gQnVmZmVyLmZyb20oXG5cdCAgICBsaW5lcy5zbGljZShzaSwgc2kgKyBwdWJsaWNMaW5lcykuam9pbignJyksICdiYXNlNjQnKTtcblx0dmFyIGtleVR5cGUgPSByZmM0MjUzLmFsZ1RvS2V5VHlwZShhbGcpO1xuXHR2YXIga2V5ID0gcmZjNDI1My5yZWFkKHB1YmxpY0J1Zik7XG5cdGlmIChrZXkudHlwZSAhPT0ga2V5VHlwZSkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ091dGVyIGtleSBhbGdvcml0aG0gbWlzbWF0Y2gnKSk7XG5cdH1cblxuXHRzaSArPSBwdWJsaWNMaW5lcztcblx0aWYgKGxpbmVzW3NpXSkge1xuXHRcdHBhcnRzID0gc3BsaXRIZWFkZXIobGluZXNbc2krK10pO1xuXHRcdGFzc2VydC5lcXVhbChwYXJ0c1swXS50b0xvd2VyQ2FzZSgpLCAncHJpdmF0ZS1saW5lcycpO1xuXHRcdHZhciBwcml2YXRlTGluZXMgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuXHRcdGlmICghaXNGaW5pdGUocHJpdmF0ZUxpbmVzKSB8fCBwcml2YXRlTGluZXMgPCAwIHx8XG5cdFx0ICAgIHByaXZhdGVMaW5lcyA+IGxpbmVzLmxlbmd0aCkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignSW52YWxpZCBwcml2YXRlLWxpbmVzIGNvdW50JykpO1xuXHRcdH1cblxuXHRcdHZhciBwcml2YXRlQnVmID0gQnVmZmVyLmZyb20oXG5cdFx0XHRsaW5lcy5zbGljZShzaSwgc2kgKyBwcml2YXRlTGluZXMpLmpvaW4oJycpLCAnYmFzZTY0Jyk7XG5cblx0XHRpZiAoZW5jcnlwdGlvbiAhPT0gJ25vbmUnICYmIGZvcm1hdFZlcnNpb24gPT09IDMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIGtleXMgYXJlbm90IHN1cHBvcnRlZCBmb3InICtcblx0XHRcdCcgUHVUVFkgZm9ybWF0IHZlcnNpb24gMycpO1xuXHRcdH1cblxuXHRcdGlmIChlbmNyeXB0aW9uID09PSAnYWVzMjU2LWNiYycpIHtcblx0XHRcdGlmICghb3B0aW9ucy5wYXNzcGhyYXNlKSB7XG5cdFx0XHRcdHRocm93IChuZXcgZXJyb3JzLktleUVuY3J5cHRlZEVycm9yKFxuXHRcdFx0XHRcdG9wdGlvbnMuZmlsZW5hbWUsICdQRU0nKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpdiA9IEJ1ZmZlci5hbGxvYygxNiwgMCk7XG5cdFx0XHR2YXIgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihcblx0XHRcdFx0J2Flcy0yNTYtY2JjJyxcblx0XHRcdFx0ZGVyaXZlUFBLMkVuY3J5cHRpb25LZXkob3B0aW9ucy5wYXNzcGhyYXNlKSxcblx0XHRcdFx0aXYpO1xuXHRcdFx0ZGVjaXBoZXIuc2V0QXV0b1BhZGRpbmcoZmFsc2UpO1xuXHRcdFx0cHJpdmF0ZUJ1ZiA9IEJ1ZmZlci5jb25jYXQoW1xuXHRcdFx0XHRkZWNpcGhlci51cGRhdGUocHJpdmF0ZUJ1ZiksIGRlY2lwaGVyLmZpbmFsKCldKTtcblx0XHR9XG5cblx0XHRrZXkgPSBuZXcgUHJpdmF0ZUtleShrZXkpO1xuXHRcdGlmIChrZXkudHlwZSAhPT0ga2V5VHlwZSkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignT3V0ZXIga2V5IGFsZ29yaXRobSBtaXNtYXRjaCcpKTtcblx0XHR9XG5cblx0XHR2YXIgc3NoYnVmID0gbmV3IFNTSEJ1ZmZlcih7YnVmZmVyOiBwcml2YXRlQnVmfSk7XG5cdFx0dmFyIHByaXZhdGVLZXlQYXJ0cztcblx0XHRpZiAoYWxnID09PSAnc3NoLWRzcycpIHtcblx0XHRcdHByaXZhdGVLZXlQYXJ0cyA9IFsge1xuXHRcdFx0XHRuYW1lOiAneCcsXG5cdFx0XHRcdGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKClcblx0XHRcdH1dO1xuXHRcdH0gZWxzZSBpZiAoYWxnID09PSAnc3NoLXJzYScpIHtcblx0XHRcdHByaXZhdGVLZXlQYXJ0cyA9IFtcblx0XHRcdFx0eyBuYW1lOiAnZCcsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSxcblx0XHRcdFx0eyBuYW1lOiAncCcsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSxcblx0XHRcdFx0eyBuYW1lOiAncScsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSxcblx0XHRcdFx0eyBuYW1lOiAnaXFtcCcsIGRhdGE6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfVxuXHRcdFx0XTtcblx0XHR9IGVsc2UgaWYgKGFsZy5tYXRjaCgvXmVjZHNhLXNoYTItbmlzdHAvKSkge1xuXHRcdFx0cHJpdmF0ZUtleVBhcnRzID0gWyB7XG5cdFx0XHRcdG5hbWU6ICdkJywgZGF0YTogc3NoYnVmLnJlYWRCdWZmZXIoKVxuXHRcdFx0fSBdO1xuXHRcdH0gZWxzZSBpZiAoYWxnID09PSAnc3NoLWVkMjU1MTknKSB7XG5cdFx0XHRwcml2YXRlS2V5UGFydHMgPSBbIHtcblx0XHRcdFx0bmFtZTogJ2snLCBkYXRhOiBzc2hidWYucmVhZEJ1ZmZlcigpXG5cdFx0XHR9IF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUFBLIGtleSB0eXBlOiAnICsgYWxnKTtcblx0XHR9XG5cblx0XHRrZXkgPSBuZXcgUHJpdmF0ZUtleSh7XG5cdFx0XHR0eXBlOiBrZXkudHlwZSxcblx0XHRcdHBhcnRzOiBrZXkucGFydHMuY29uY2F0KHByaXZhdGVLZXlQYXJ0cylcblx0XHR9KTtcblx0fVxuXG5cdGtleS5jb21tZW50ID0gY29tbWVudDtcblx0cmV0dXJuIChrZXkpO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVQUEsyRW5jcnlwdGlvbktleShwYXNzcGhyYXNlKSB7XG5cdHZhciBoYXNoMSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKEJ1ZmZlci5jb25jYXQoW1xuXHRcdEJ1ZmZlci5mcm9tKFswLCAwLCAwLCAwXSksXG5cdFx0QnVmZmVyLmZyb20ocGFzc3BocmFzZSlcblx0XSkpLmRpZ2VzdCgpO1xuXHR2YXIgaGFzaDIgPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShCdWZmZXIuY29uY2F0KFtcblx0XHRCdWZmZXIuZnJvbShbMCwgMCwgMCwgMV0pLFxuXHRcdEJ1ZmZlci5mcm9tKHBhc3NwaHJhc2UpXG5cdF0pKS5kaWdlc3QoKTtcblx0cmV0dXJuIChCdWZmZXIuY29uY2F0KFtoYXNoMSwgaGFzaDJdKS5zbGljZSgwLCAzMikpO1xufVxuXG5mdW5jdGlvbiBzcGxpdEhlYWRlcihsaW5lKSB7XG5cdHZhciBpZHggPSBsaW5lLmluZGV4T2YoJzonKTtcblx0aWYgKGlkeCA9PT0gLTEpXG5cdFx0cmV0dXJuIChudWxsKTtcblx0dmFyIGhlYWRlciA9IGxpbmUuc2xpY2UoMCwgaWR4KTtcblx0KytpZHg7XG5cdHdoaWxlIChsaW5lW2lkeF0gPT09ICcgJylcblx0XHQrK2lkeDtcblx0dmFyIHJlc3QgPSBsaW5lLnNsaWNlKGlkeCk7XG5cdHJldHVybiAoW2hlYWRlciwgcmVzdF0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZShrZXksIG9wdGlvbnMpIHtcblx0YXNzZXJ0Lm9iamVjdChrZXkpO1xuXHRpZiAoIUtleS5pc0tleShrZXkpKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ011c3QgYmUgYSBwdWJsaWMga2V5JykpO1xuXG5cdHZhciBhbGcgPSByZmM0MjUzLmtleVR5cGVUb0FsZyhrZXkpO1xuXHR2YXIgYnVmID0gcmZjNDI1My53cml0ZShrZXkpO1xuXHR2YXIgY29tbWVudCA9IGtleS5jb21tZW50IHx8ICcnO1xuXG5cdHZhciBiNjQgPSBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHR2YXIgbGluZXMgPSB3cmFwKGI2NCwgNjQpO1xuXG5cdGxpbmVzLnVuc2hpZnQoJ1B1YmxpYy1MaW5lczogJyArIGxpbmVzLmxlbmd0aCk7XG5cdGxpbmVzLnVuc2hpZnQoJ0NvbW1lbnQ6ICcgKyBjb21tZW50KTtcblx0bGluZXMudW5zaGlmdCgnRW5jcnlwdGlvbjogbm9uZScpO1xuXHRsaW5lcy51bnNoaWZ0KCdQdVRUWS1Vc2VyLUtleS1GaWxlLTI6ICcgKyBhbGcpO1xuXG5cdHJldHVybiAoQnVmZmVyLmZyb20obGluZXMuam9pbignXFxuJykgKyAnXFxuJykpO1xufVxuXG5mdW5jdGlvbiB3cmFwKHR4dCwgbGVuKSB7XG5cdHZhciBsaW5lcyA9IFtdO1xuXHR2YXIgcG9zID0gMDtcblx0d2hpbGUgKHBvcyA8IHR4dC5sZW5ndGgpIHtcblx0XHRsaW5lcy5wdXNoKHR4dC5zbGljZShwb3MsIHBvcyArIDY0KSk7XG5cdFx0cG9zICs9IDY0O1xuXHR9XG5cdHJldHVybiAobGluZXMpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE4IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEtleSA9IHJlcXVpcmUoJy4uL2tleScpO1xudmFyIFByaXZhdGVLZXkgPSByZXF1aXJlKCcuLi9wcml2YXRlLWtleScpO1xuXG52YXIgcGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbnZhciBzc2ggPSByZXF1aXJlKCcuL3NzaCcpO1xudmFyIHJmYzQyNTMgPSByZXF1aXJlKCcuL3JmYzQyNTMnKTtcbnZhciBkbnNzZWMgPSByZXF1aXJlKCcuL2Ruc3NlYycpO1xudmFyIHB1dHR5ID0gcmVxdWlyZSgnLi9wdXR0eScpO1xuXG52YXIgRE5TU0VDX1BSSVZLRVlfSEVBREVSX1BSRUZJWCA9ICdQcml2YXRlLWtleS1mb3JtYXQ6IHYxJztcblxuZnVuY3Rpb24gcmVhZChidWYsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiAoYnVmKSA9PT0gJ3N0cmluZycpIHtcblx0XHRpZiAoYnVmLnRyaW0oKS5tYXRjaCgvXlstXStbIF0qQkVHSU4vKSlcblx0XHRcdHJldHVybiAocGVtLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGJ1Zi5tYXRjaCgvXlxccypzc2gtW2Etel0vKSlcblx0XHRcdHJldHVybiAoc3NoLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGJ1Zi5tYXRjaCgvXlxccyplY2RzYS0vKSlcblx0XHRcdHJldHVybiAoc3NoLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGJ1Zi5tYXRjaCgvXnB1dHR5LXVzZXIta2V5LWZpbGUtMjovaSkpXG5cdFx0XHRyZXR1cm4gKHB1dHR5LnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0aWYgKGZpbmRETlNTRUNIZWFkZXIoYnVmKSlcblx0XHRcdHJldHVybiAoZG5zc2VjLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdFx0YnVmID0gQnVmZmVyLmZyb20oYnVmLCAnYmluYXJ5Jyk7XG5cdH0gZWxzZSB7XG5cdFx0YXNzZXJ0LmJ1ZmZlcihidWYpO1xuXHRcdGlmIChmaW5kUEVNSGVhZGVyKGJ1ZikpXG5cdFx0XHRyZXR1cm4gKHBlbS5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xuXHRcdGlmIChmaW5kU1NISGVhZGVyKGJ1ZikpXG5cdFx0XHRyZXR1cm4gKHNzaC5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xuXHRcdGlmIChmaW5kUHVUVFlIZWFkZXIoYnVmKSlcblx0XHRcdHJldHVybiAocHV0dHkucmVhZChidWYsIG9wdGlvbnMpKTtcblx0XHRpZiAoZmluZEROU1NFQ0hlYWRlcihidWYpKVxuXHRcdFx0cmV0dXJuIChkbnNzZWMucmVhZChidWYsIG9wdGlvbnMpKTtcblx0fVxuXHRpZiAoYnVmLnJlYWRVSW50MzJCRSgwKSA8IGJ1Zi5sZW5ndGgpXG5cdFx0cmV0dXJuIChyZmM0MjUzLnJlYWQoYnVmLCBvcHRpb25zKSk7XG5cdHRocm93IChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBhdXRvLWRldGVjdCBmb3JtYXQgb2Yga2V5JykpO1xufVxuXG5mdW5jdGlvbiBmaW5kUHVUVFlIZWFkZXIoYnVmKSB7XG5cdHZhciBvZmZzZXQgPSAwO1xuXHR3aGlsZSAob2Zmc2V0IDwgYnVmLmxlbmd0aCAmJlxuXHQgICAgKGJ1ZltvZmZzZXRdID09PSAzMiB8fCBidWZbb2Zmc2V0XSA9PT0gMTAgfHwgYnVmW29mZnNldF0gPT09IDkpKVxuXHRcdCsrb2Zmc2V0O1xuXHRpZiAob2Zmc2V0ICsgMjIgPD0gYnVmLmxlbmd0aCAmJlxuXHQgICAgYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMjIpLnRvU3RyaW5nKCdhc2NpaScpLnRvTG93ZXJDYXNlKCkgPT09XG5cdCAgICAncHV0dHktdXNlci1rZXktZmlsZS0yOicpXG5cdFx0cmV0dXJuICh0cnVlKTtcblx0cmV0dXJuIChmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTU0hIZWFkZXIoYnVmKSB7XG5cdHZhciBvZmZzZXQgPSAwO1xuXHR3aGlsZSAob2Zmc2V0IDwgYnVmLmxlbmd0aCAmJlxuXHQgICAgKGJ1ZltvZmZzZXRdID09PSAzMiB8fCBidWZbb2Zmc2V0XSA9PT0gMTAgfHwgYnVmW29mZnNldF0gPT09IDkpKVxuXHRcdCsrb2Zmc2V0O1xuXHRpZiAob2Zmc2V0ICsgNCA8PSBidWYubGVuZ3RoICYmXG5cdCAgICBidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyA0KS50b1N0cmluZygnYXNjaWknKSA9PT0gJ3NzaC0nKVxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdGlmIChvZmZzZXQgKyA2IDw9IGJ1Zi5sZW5ndGggJiZcblx0ICAgIGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIDYpLnRvU3RyaW5nKCdhc2NpaScpID09PSAnZWNkc2EtJylcblx0XHRyZXR1cm4gKHRydWUpO1xuXHRyZXR1cm4gKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gZmluZFBFTUhlYWRlcihidWYpIHtcblx0dmFyIG9mZnNldCA9IDA7XG5cdHdoaWxlIChvZmZzZXQgPCBidWYubGVuZ3RoICYmXG5cdCAgICAoYnVmW29mZnNldF0gPT09IDMyIHx8IGJ1ZltvZmZzZXRdID09PSAxMCkpXG5cdFx0KytvZmZzZXQ7XG5cdGlmIChidWZbb2Zmc2V0XSAhPT0gNDUpXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdHdoaWxlIChvZmZzZXQgPCBidWYubGVuZ3RoICYmXG5cdCAgICAoYnVmW29mZnNldF0gPT09IDQ1KSlcblx0XHQrK29mZnNldDtcblx0d2hpbGUgKG9mZnNldCA8IGJ1Zi5sZW5ndGggJiZcblx0ICAgIChidWZbb2Zmc2V0XSA9PT0gMzIpKVxuXHRcdCsrb2Zmc2V0O1xuXHRpZiAob2Zmc2V0ICsgNSA+IGJ1Zi5sZW5ndGggfHxcblx0ICAgIGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIDUpLnRvU3RyaW5nKCdhc2NpaScpICE9PSAnQkVHSU4nKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRyZXR1cm4gKHRydWUpO1xufVxuXG5mdW5jdGlvbiBmaW5kRE5TU0VDSGVhZGVyKGJ1Zikge1xuXHQvLyBwcml2YXRlIGNhc2UgZmlyc3Rcblx0aWYgKGJ1Zi5sZW5ndGggPD0gRE5TU0VDX1BSSVZLRVlfSEVBREVSX1BSRUZJWC5sZW5ndGgpXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdHZhciBoZWFkZXJDaGVjayA9IGJ1Zi5zbGljZSgwLCBETlNTRUNfUFJJVktFWV9IRUFERVJfUFJFRklYLmxlbmd0aCk7XG5cdGlmIChoZWFkZXJDaGVjay50b1N0cmluZygnYXNjaWknKSA9PT0gRE5TU0VDX1BSSVZLRVlfSEVBREVSX1BSRUZJWClcblx0XHRyZXR1cm4gKHRydWUpO1xuXG5cdC8vIHB1YmxpYy1rZXkgUkZDMzExMCA/XG5cdC8vICdkb21haW4uY29tLiBJTiBLRVkgLi4uJyBvciAnZG9tYWluLmNvbS4gSU4gRE5TS0VZIC4uLidcblx0Ly8gc2tpcCBhbnkgY29tbWVudC1saW5lc1xuXHRpZiAodHlwZW9mIChidWYpICE9PSAnc3RyaW5nJykge1xuXHRcdGJ1ZiA9IGJ1Zi50b1N0cmluZygnYXNjaWknKTtcblx0fVxuXHR2YXIgbGluZXMgPSBidWYuc3BsaXQoJ1xcbicpO1xuXHR2YXIgbGluZSA9IDA7XG5cdC8qIEpTU1RZTEVEICovXG5cdHdoaWxlIChsaW5lc1tsaW5lXS5tYXRjaCgvXlxcOy8pKVxuXHRcdGxpbmUrKztcblx0aWYgKGxpbmVzW2xpbmVdLnRvU3RyaW5nKCdhc2NpaScpLm1hdGNoKC9cXC4gSU4gS0VZIC8pKVxuXHRcdHJldHVybiAodHJ1ZSk7XG5cdGlmIChsaW5lc1tsaW5lXS50b1N0cmluZygnYXNjaWknKS5tYXRjaCgvXFwuIElOIEROU0tFWSAvKSlcblx0XHRyZXR1cm4gKHRydWUpO1xuXHRyZXR1cm4gKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gd3JpdGUoa2V5LCBvcHRpb25zKSB7XG5cdHRocm93IChuZXcgRXJyb3IoJ1wiYXV0b1wiIGZvcm1hdCBjYW5ub3QgYmUgdXNlZCBmb3Igd3JpdGluZycpKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNyBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSBQcml2YXRlS2V5O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4vYWxncycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIEZpbmdlcnByaW50ID0gcmVxdWlyZSgnLi9maW5nZXJwcmludCcpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgZXJycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBkaGUgPSByZXF1aXJlKCcuL2RoZScpO1xudmFyIGdlbmVyYXRlRUNEU0EgPSBkaGUuZ2VuZXJhdGVFQ0RTQTtcbnZhciBnZW5lcmF0ZUVEMjU1MTkgPSBkaGUuZ2VuZXJhdGVFRDI1NTE5O1xudmFyIGVkQ29tcGF0ID0gcmVxdWlyZSgnLi9lZC1jb21wYXQnKTtcbnZhciBuYWNsID0gcmVxdWlyZSgndHdlZXRuYWNsJyk7XG5cbnZhciBLZXkgPSByZXF1aXJlKCcuL2tleScpO1xuXG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gZXJycy5JbnZhbGlkQWxnb3JpdGhtRXJyb3I7XG52YXIgS2V5UGFyc2VFcnJvciA9IGVycnMuS2V5UGFyc2VFcnJvcjtcbnZhciBLZXlFbmNyeXB0ZWRFcnJvciA9IGVycnMuS2V5RW5jcnlwdGVkRXJyb3I7XG5cbnZhciBmb3JtYXRzID0ge307XG5mb3JtYXRzWydhdXRvJ10gPSByZXF1aXJlKCcuL2Zvcm1hdHMvYXV0bycpO1xuZm9ybWF0c1sncGVtJ10gPSByZXF1aXJlKCcuL2Zvcm1hdHMvcGVtJyk7XG5mb3JtYXRzWydwa2NzMSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3BrY3MxJyk7XG5mb3JtYXRzWydwa2NzOCddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3BrY3M4Jyk7XG5mb3JtYXRzWydyZmM0MjUzJ10gPSByZXF1aXJlKCcuL2Zvcm1hdHMvcmZjNDI1MycpO1xuZm9ybWF0c1snc3NoLXByaXZhdGUnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9zc2gtcHJpdmF0ZScpO1xuZm9ybWF0c1snb3BlbnNzaCddID0gZm9ybWF0c1snc3NoLXByaXZhdGUnXTtcbmZvcm1hdHNbJ3NzaCddID0gZm9ybWF0c1snc3NoLXByaXZhdGUnXTtcbmZvcm1hdHNbJ2Ruc3NlYyddID0gcmVxdWlyZSgnLi9mb3JtYXRzL2Ruc3NlYycpO1xuZm9ybWF0c1sncHV0dHknXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wdXR0eScpO1xuXG5mdW5jdGlvbiBQcml2YXRlS2V5KG9wdHMpIHtcblx0YXNzZXJ0Lm9iamVjdChvcHRzLCAnb3B0aW9ucycpO1xuXHRLZXkuY2FsbCh0aGlzLCBvcHRzKTtcblxuXHR0aGlzLl9wdWJDYWNoZSA9IHVuZGVmaW5lZDtcbn1cbnV0aWwuaW5oZXJpdHMoUHJpdmF0ZUtleSwgS2V5KTtcblxuUHJpdmF0ZUtleS5mb3JtYXRzID0gZm9ybWF0cztcblxuUHJpdmF0ZUtleS5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiAoZm9ybWF0LCBvcHRpb25zKSB7XG5cdGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZClcblx0XHRmb3JtYXQgPSAncGtjczEnO1xuXHRhc3NlcnQuc3RyaW5nKGZvcm1hdCwgJ2Zvcm1hdCcpO1xuXHRhc3NlcnQub2JqZWN0KGZvcm1hdHNbZm9ybWF0XSwgJ2Zvcm1hdHNbZm9ybWF0XScpO1xuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKTtcblxuXHRyZXR1cm4gKGZvcm1hdHNbZm9ybWF0XS53cml0ZSh0aGlzLCBvcHRpb25zKSk7XG59O1xuXG5Qcml2YXRlS2V5LnByb3RvdHlwZS5oYXNoID0gZnVuY3Rpb24gKGFsZ28sIHR5cGUpIHtcblx0cmV0dXJuICh0aGlzLnRvUHVibGljKCkuaGFzaChhbGdvLCB0eXBlKSk7XG59O1xuXG5Qcml2YXRlS2V5LnByb3RvdHlwZS5maW5nZXJwcmludCA9IGZ1bmN0aW9uIChhbGdvLCB0eXBlKSB7XG5cdHJldHVybiAodGhpcy50b1B1YmxpYygpLmZpbmdlcnByaW50KGFsZ28sIHR5cGUpKTtcbn07XG5cblByaXZhdGVLZXkucHJvdG90eXBlLnRvUHVibGljID0gZnVuY3Rpb24gKCkge1xuXHRpZiAodGhpcy5fcHViQ2FjaGUpXG5cdFx0cmV0dXJuICh0aGlzLl9wdWJDYWNoZSk7XG5cblx0dmFyIGFsZ0luZm8gPSBhbGdzLmluZm9bdGhpcy50eXBlXTtcblx0dmFyIHB1YlBhcnRzID0gW107XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxnSW5mby5wYXJ0cy5sZW5ndGg7ICsraSkge1xuXHRcdHZhciBwID0gYWxnSW5mby5wYXJ0c1tpXTtcblx0XHRwdWJQYXJ0cy5wdXNoKHRoaXMucGFydFtwXSk7XG5cdH1cblxuXHR0aGlzLl9wdWJDYWNoZSA9IG5ldyBLZXkoe1xuXHRcdHR5cGU6IHRoaXMudHlwZSxcblx0XHRzb3VyY2U6IHRoaXMsXG5cdFx0cGFydHM6IHB1YlBhcnRzXG5cdH0pO1xuXHRpZiAodGhpcy5jb21tZW50KVxuXHRcdHRoaXMuX3B1YkNhY2hlLmNvbW1lbnQgPSB0aGlzLmNvbW1lbnQ7XG5cdHJldHVybiAodGhpcy5fcHViQ2FjaGUpO1xufTtcblxuUHJpdmF0ZUtleS5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gKG5ld1R5cGUpIHtcblx0YXNzZXJ0LnN0cmluZyhuZXdUeXBlLCAndHlwZScpO1xuXHR2YXIgcHJpdiwgcHViLCBwYWlyO1xuXG5cdGlmICh0aGlzLnR5cGUgPT09ICdlZDI1NTE5JyAmJiBuZXdUeXBlID09PSAnY3VydmUyNTUxOScpIHtcblx0XHRwcml2ID0gdGhpcy5wYXJ0LmsuZGF0YTtcblx0XHRpZiAocHJpdlswXSA9PT0gMHgwMClcblx0XHRcdHByaXYgPSBwcml2LnNsaWNlKDEpO1xuXG5cdFx0cGFpciA9IG5hY2wuYm94LmtleVBhaXIuZnJvbVNlY3JldEtleShuZXcgVWludDhBcnJheShwcml2KSk7XG5cdFx0cHViID0gQnVmZmVyLmZyb20ocGFpci5wdWJsaWNLZXkpO1xuXG5cdFx0cmV0dXJuIChuZXcgUHJpdmF0ZUtleSh7XG5cdFx0XHR0eXBlOiAnY3VydmUyNTUxOScsXG5cdFx0XHRwYXJ0czogW1xuXHRcdFx0XHR7IG5hbWU6ICdBJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocHViKSB9LFxuXHRcdFx0XHR7IG5hbWU6ICdrJywgZGF0YTogdXRpbHMubXBOb3JtYWxpemUocHJpdikgfVxuXHRcdFx0XVxuXHRcdH0pKTtcblx0fSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdjdXJ2ZTI1NTE5JyAmJiBuZXdUeXBlID09PSAnZWQyNTUxOScpIHtcblx0XHRwcml2ID0gdGhpcy5wYXJ0LmsuZGF0YTtcblx0XHRpZiAocHJpdlswXSA9PT0gMHgwMClcblx0XHRcdHByaXYgPSBwcml2LnNsaWNlKDEpO1xuXG5cdFx0cGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKG5ldyBVaW50OEFycmF5KHByaXYpKTtcblx0XHRwdWIgPSBCdWZmZXIuZnJvbShwYWlyLnB1YmxpY0tleSk7XG5cblx0XHRyZXR1cm4gKG5ldyBQcml2YXRlS2V5KHtcblx0XHRcdHR5cGU6ICdlZDI1NTE5Jyxcblx0XHRcdHBhcnRzOiBbXG5cdFx0XHRcdHsgbmFtZTogJ0EnLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShwdWIpIH0sXG5cdFx0XHRcdHsgbmFtZTogJ2snLCBkYXRhOiB1dGlscy5tcE5vcm1hbGl6ZShwcml2KSB9XG5cdFx0XHRdXG5cdFx0fSkpO1xuXHR9XG5cdHRocm93IChuZXcgRXJyb3IoJ0tleSBkZXJpdmF0aW9uIG5vdCBzdXBwb3J0ZWQgZnJvbSAnICsgdGhpcy50eXBlICtcblx0ICAgICcgdG8gJyArIG5ld1R5cGUpKTtcbn07XG5cblByaXZhdGVLZXkucHJvdG90eXBlLmNyZWF0ZVZlcmlmeSA9IGZ1bmN0aW9uIChoYXNoQWxnbykge1xuXHRyZXR1cm4gKHRoaXMudG9QdWJsaWMoKS5jcmVhdGVWZXJpZnkoaGFzaEFsZ28pKTtcbn07XG5cblByaXZhdGVLZXkucHJvdG90eXBlLmNyZWF0ZVNpZ24gPSBmdW5jdGlvbiAoaGFzaEFsZ28pIHtcblx0aWYgKGhhc2hBbGdvID09PSB1bmRlZmluZWQpXG5cdFx0aGFzaEFsZ28gPSB0aGlzLmRlZmF1bHRIYXNoQWxnb3JpdGhtKCk7XG5cdGFzc2VydC5zdHJpbmcoaGFzaEFsZ28sICdoYXNoIGFsZ29yaXRobScpO1xuXG5cdC8qIEVEMjU1MTkgaXMgbm90IHN1cHBvcnRlZCBieSBPcGVuU1NMLCB1c2UgYSBqYXZhc2NyaXB0IGltcGwuICovXG5cdGlmICh0aGlzLnR5cGUgPT09ICdlZDI1NTE5JyAmJiBlZENvbXBhdCAhPT0gdW5kZWZpbmVkKVxuXHRcdHJldHVybiAobmV3IGVkQ29tcGF0LlNpZ25lcih0aGlzLCBoYXNoQWxnbykpO1xuXHRpZiAodGhpcy50eXBlID09PSAnY3VydmUyNTUxOScpXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignQ3VydmUyNTUxOSBrZXlzIGFyZSBub3Qgc3VpdGFibGUgZm9yICcgK1xuXHRcdCAgICAnc2lnbmluZyBvciB2ZXJpZmljYXRpb24nKSk7XG5cblx0dmFyIHYsIG5tLCBlcnI7XG5cdHRyeSB7XG5cdFx0bm0gPSBoYXNoQWxnby50b1VwcGVyQ2FzZSgpO1xuXHRcdHYgPSBjcnlwdG8uY3JlYXRlU2lnbihubSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRlcnIgPSBlO1xuXHR9XG5cdGlmICh2ID09PSB1bmRlZmluZWQgfHwgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmXG5cdCAgICBlcnIubWVzc2FnZS5tYXRjaCgvVW5rbm93biBtZXNzYWdlIGRpZ2VzdC8pKSkge1xuXHRcdG5tID0gJ1JTQS0nO1xuXHRcdG5tICs9IGhhc2hBbGdvLnRvVXBwZXJDYXNlKCk7XG5cdFx0diA9IGNyeXB0by5jcmVhdGVTaWduKG5tKTtcblx0fVxuXHRhc3NlcnQub2sodiwgJ2ZhaWxlZCB0byBjcmVhdGUgdmVyaWZpZXInKTtcblx0dmFyIG9sZFNpZ24gPSB2LnNpZ24uYmluZCh2KTtcblx0dmFyIGtleSA9IHRoaXMudG9CdWZmZXIoJ3BrY3MxJyk7XG5cdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlO1xuXHR2LnNpZ24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHNpZyA9IG9sZFNpZ24oa2V5KTtcblx0XHRpZiAodHlwZW9mIChzaWcpID09PSAnc3RyaW5nJylcblx0XHRcdHNpZyA9IEJ1ZmZlci5mcm9tKHNpZywgJ2JpbmFyeScpO1xuXHRcdHNpZyA9IFNpZ25hdHVyZS5wYXJzZShzaWcsIHR5cGUsICdhc24xJyk7XG5cdFx0c2lnLmhhc2hBbGdvcml0aG0gPSBoYXNoQWxnbztcblx0XHRzaWcuY3VydmUgPSBjdXJ2ZTtcblx0XHRyZXR1cm4gKHNpZyk7XG5cdH07XG5cdHJldHVybiAodik7XG59O1xuXG5Qcml2YXRlS2V5LnBhcnNlID0gZnVuY3Rpb24gKGRhdGEsIGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChkYXRhKSAhPT0gJ3N0cmluZycpXG5cdFx0YXNzZXJ0LmJ1ZmZlcihkYXRhLCAnZGF0YScpO1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ2F1dG8nO1xuXHRhc3NlcnQuc3RyaW5nKGZvcm1hdCwgJ2Zvcm1hdCcpO1xuXHRpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpXG5cdFx0b3B0aW9ucyA9IHsgZmlsZW5hbWU6IG9wdGlvbnMgfTtcblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0aW9ucy5maWxlbmFtZSwgJ29wdGlvbnMuZmlsZW5hbWUnKTtcblx0aWYgKG9wdGlvbnMuZmlsZW5hbWUgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zLmZpbGVuYW1lID0gJyh1bm5hbWVkKSc7XG5cblx0YXNzZXJ0Lm9iamVjdChmb3JtYXRzW2Zvcm1hdF0sICdmb3JtYXRzW2Zvcm1hdF0nKTtcblxuXHR0cnkge1xuXHRcdHZhciBrID0gZm9ybWF0c1tmb3JtYXRdLnJlYWQoZGF0YSwgb3B0aW9ucyk7XG5cdFx0YXNzZXJ0Lm9rKGsgaW5zdGFuY2VvZiBQcml2YXRlS2V5LCAna2V5IGlzIG5vdCBhIHByaXZhdGUga2V5Jyk7XG5cdFx0aWYgKCFrLmNvbW1lbnQpXG5cdFx0XHRrLmNvbW1lbnQgPSBvcHRpb25zLmZpbGVuYW1lO1xuXHRcdHJldHVybiAoayk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAoZS5uYW1lID09PSAnS2V5RW5jcnlwdGVkRXJyb3InKVxuXHRcdFx0dGhyb3cgKGUpO1xuXHRcdHRocm93IChuZXcgS2V5UGFyc2VFcnJvcihvcHRpb25zLmZpbGVuYW1lLCBmb3JtYXQsIGUpKTtcblx0fVxufTtcblxuUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkgPSBmdW5jdGlvbiAob2JqLCB2ZXIpIHtcblx0cmV0dXJuICh1dGlscy5pc0NvbXBhdGlibGUob2JqLCBQcml2YXRlS2V5LCB2ZXIpKTtcbn07XG5cblByaXZhdGVLZXkuZ2VuZXJhdGUgPSBmdW5jdGlvbiAodHlwZSwgb3B0aW9ucykge1xuXHRpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKVxuXHRcdG9wdGlvbnMgPSB7fTtcblx0YXNzZXJ0Lm9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXG5cdHN3aXRjaCAodHlwZSkge1xuXHRjYXNlICdlY2RzYSc6XG5cdFx0aWYgKG9wdGlvbnMuY3VydmUgPT09IHVuZGVmaW5lZClcblx0XHRcdG9wdGlvbnMuY3VydmUgPSAnbmlzdHAyNTYnO1xuXHRcdGFzc2VydC5zdHJpbmcob3B0aW9ucy5jdXJ2ZSwgJ29wdGlvbnMuY3VydmUnKTtcblx0XHRyZXR1cm4gKGdlbmVyYXRlRUNEU0Eob3B0aW9ucy5jdXJ2ZSkpO1xuXHRjYXNlICdlZDI1NTE5Jzpcblx0XHRyZXR1cm4gKGdlbmVyYXRlRUQyNTUxOSgpKTtcblx0ZGVmYXVsdDpcblx0XHR0aHJvdyAobmV3IEVycm9yKCdLZXkgZ2VuZXJhdGlvbiBub3Qgc3VwcG9ydGVkIHdpdGgga2V5ICcgK1xuXHRcdCAgICAndHlwZSBcIicgKyB0eXBlICsgJ1wiJykpO1xuXHR9XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBQcml2YXRlS2V5OlxuICogWzEsMF0gLS0gaW5pdGlhbCB2ZXJcbiAqIFsxLDFdIC0tIGFkZGVkIGF1dG8sIHBrY3NbMThdLCBvcGVuc3NoL3NzaC1wcml2YXRlIGZvcm1hdHNcbiAqIFsxLDJdIC0tIGFkZGVkIGRlZmF1bHRIYXNoQWxnb3JpdGhtXG4gKiBbMSwzXSAtLSBhZGRlZCBkZXJpdmUsIGVkLCBjcmVhdGVESFxuICogWzEsNF0gLS0gZmlyc3QgdGFnZ2VkIHZlcnNpb25cbiAqIFsxLDVdIC0tIGNoYW5nZWQgZWQyNTUxOSBwYXJ0IG5hbWVzIGFuZCBmb3JtYXRcbiAqIFsxLDZdIC0tIHR5cGUgYXJndW1lbnRzIGZvciBoYXNoKCkgYW5kIGZpbmdlcnByaW50KClcbiAqL1xuUHJpdmF0ZUtleS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsxLCA2XTtcblxuUHJpdmF0ZUtleS5fb2xkVmVyc2lvbkRldGVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0YXNzZXJ0LmZ1bmMob2JqLnRvUHVibGljKTtcblx0YXNzZXJ0LmZ1bmMob2JqLmNyZWF0ZVNpZ24pO1xuXHRpZiAob2JqLmRlcml2ZSlcblx0XHRyZXR1cm4gKFsxLCAzXSk7XG5cdGlmIChvYmouZGVmYXVsdEhhc2hBbGdvcml0aG0pXG5cdFx0cmV0dXJuIChbMSwgMl0pO1xuXHRpZiAob2JqLmZvcm1hdHNbJ2F1dG8nXSlcblx0XHRyZXR1cm4gKFsxLCAxXSk7XG5cdHJldHVybiAoWzEsIDBdKTtcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTcgSm95ZW50LCBJbmMuXG5cbm1vZHVsZS5leHBvcnRzID0gSWRlbnRpdHk7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBGaW5nZXJwcmludCA9IHJlcXVpcmUoJy4vZmluZ2VycHJpbnQnKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xudmFyIGVycnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEnKTtcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbi8qSlNTVFlMRUQqL1xudmFyIEROU19OQU1FX1JFID0gL14oWypdfFthLXowLTldW2EtejAtOVxcLV17MCw2Mn0pKD86XFwuKFsqXXxbYS16MC05XVthLXowLTlcXC1dezAsNjJ9KSkqJC9pO1xuXG52YXIgb2lkcyA9IHt9O1xub2lkcy5jbiA9ICcyLjUuNC4zJztcbm9pZHMubyA9ICcyLjUuNC4xMCc7XG5vaWRzLm91ID0gJzIuNS40LjExJztcbm9pZHMubCA9ICcyLjUuNC43Jztcbm9pZHMucyA9ICcyLjUuNC44Jztcbm9pZHMuYyA9ICcyLjUuNC42Jztcbm9pZHMuc24gPSAnMi41LjQuNCc7XG5vaWRzLnBvc3RhbENvZGUgPSAnMi41LjQuMTcnO1xub2lkcy5zZXJpYWxOdW1iZXIgPSAnMi41LjQuNSc7XG5vaWRzLnN0cmVldCA9ICcyLjUuNC45Jztcbm9pZHMueDUwMFVuaXF1ZUlkZW50aWZpZXIgPSAnMi41LjQuNDUnO1xub2lkcy5yb2xlID0gJzIuNS40LjcyJztcbm9pZHMudGVsZXBob25lTnVtYmVyID0gJzIuNS40LjIwJztcbm9pZHMuZGVzY3JpcHRpb24gPSAnMi41LjQuMTMnO1xub2lkcy5kYyA9ICcwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4yNSc7XG5vaWRzLnVpZCA9ICcwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4xJztcbm9pZHMubWFpbCA9ICcwLjkuMjM0Mi4xOTIwMDMwMC4xMDAuMS4zJztcbm9pZHMudGl0bGUgPSAnMi41LjQuMTInO1xub2lkcy5nbiA9ICcyLjUuNC40Mic7XG5vaWRzLmluaXRpYWxzID0gJzIuNS40LjQzJztcbm9pZHMucHNldWRvbnltID0gJzIuNS40LjY1Jztcbm9pZHMuZW1haWxBZGRyZXNzID0gJzEuMi44NDAuMTEzNTQ5LjEuOS4xJztcblxudmFyIHVub2lkcyA9IHt9O1xuT2JqZWN0LmtleXMob2lkcykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHR1bm9pZHNbb2lkc1trXV0gPSBrO1xufSk7XG5cbmZ1bmN0aW9uIElkZW50aXR5KG9wdHMpIHtcblx0dmFyIHNlbGYgPSB0aGlzO1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KG9wdHMuY29tcG9uZW50cywgJ29wdGlvbnMuY29tcG9uZW50cycpO1xuXHR0aGlzLmNvbXBvbmVudHMgPSBvcHRzLmNvbXBvbmVudHM7XG5cdHRoaXMuY29tcG9uZW50TG9va3VwID0ge307XG5cdHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG5cdFx0aWYgKGMubmFtZSAmJiAhYy5vaWQpXG5cdFx0XHRjLm9pZCA9IG9pZHNbYy5uYW1lXTtcblx0XHRpZiAoYy5vaWQgJiYgIWMubmFtZSlcblx0XHRcdGMubmFtZSA9IHVub2lkc1tjLm9pZF07XG5cdFx0aWYgKHNlbGYuY29tcG9uZW50TG9va3VwW2MubmFtZV0gPT09IHVuZGVmaW5lZClcblx0XHRcdHNlbGYuY29tcG9uZW50TG9va3VwW2MubmFtZV0gPSBbXTtcblx0XHRzZWxmLmNvbXBvbmVudExvb2t1cFtjLm5hbWVdLnB1c2goYyk7XG5cdH0pO1xuXHRpZiAodGhpcy5jb21wb25lbnRMb29rdXAuY24gJiYgdGhpcy5jb21wb25lbnRMb29rdXAuY24ubGVuZ3RoID4gMCkge1xuXHRcdHRoaXMuY24gPSB0aGlzLmNvbXBvbmVudExvb2t1cC5jblswXS52YWx1ZTtcblx0fVxuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0cy50eXBlLCAnb3B0aW9ucy50eXBlJyk7XG5cdGlmIChvcHRzLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLmNvbXBvbmVudHMubGVuZ3RoID09PSAxICYmXG5cdFx0ICAgIHRoaXMuY29tcG9uZW50TG9va3VwLmNuICYmXG5cdFx0ICAgIHRoaXMuY29tcG9uZW50TG9va3VwLmNuLmxlbmd0aCA9PT0gMSAmJlxuXHRcdCAgICB0aGlzLmNvbXBvbmVudExvb2t1cC5jblswXS52YWx1ZS5tYXRjaChETlNfTkFNRV9SRSkpIHtcblx0XHRcdHRoaXMudHlwZSA9ICdob3N0Jztcblx0XHRcdHRoaXMuaG9zdG5hbWUgPSB0aGlzLmNvbXBvbmVudExvb2t1cC5jblswXS52YWx1ZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRMb29rdXAuZGMgJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRzLmxlbmd0aCA9PT0gdGhpcy5jb21wb25lbnRMb29rdXAuZGMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLnR5cGUgPSAnaG9zdCc7XG5cdFx0XHR0aGlzLmhvc3RuYW1lID0gdGhpcy5jb21wb25lbnRMb29rdXAuZGMubWFwKFxuXHRcdFx0ICAgIGZ1bmN0aW9uIChjKSB7XG5cdFx0XHRcdHJldHVybiAoYy52YWx1ZSk7XG5cdFx0XHR9KS5qb2luKCcuJyk7XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50TG9va3VwLnVpZCAmJlxuXHRcdCAgICB0aGlzLmNvbXBvbmVudHMubGVuZ3RoID09PVxuXHRcdCAgICB0aGlzLmNvbXBvbmVudExvb2t1cC51aWQubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLnR5cGUgPSAndXNlcic7XG5cdFx0XHR0aGlzLnVpZCA9IHRoaXMuY29tcG9uZW50TG9va3VwLnVpZFswXS52YWx1ZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRMb29rdXAuY24gJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAuY24ubGVuZ3RoID09PSAxICYmXG5cdFx0ICAgIHRoaXMuY29tcG9uZW50TG9va3VwLmNuWzBdLnZhbHVlLm1hdGNoKEROU19OQU1FX1JFKSkge1xuXHRcdFx0dGhpcy50eXBlID0gJ2hvc3QnO1xuXHRcdFx0dGhpcy5ob3N0bmFtZSA9IHRoaXMuY29tcG9uZW50TG9va3VwLmNuWzBdLnZhbHVlO1xuXG5cdFx0fSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudExvb2t1cC51aWQgJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAudWlkLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0dGhpcy50eXBlID0gJ3VzZXInO1xuXHRcdFx0dGhpcy51aWQgPSB0aGlzLmNvbXBvbmVudExvb2t1cC51aWRbMF0udmFsdWU7XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50TG9va3VwLm1haWwgJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAubWFpbC5sZW5ndGggPT09IDEpIHtcblx0XHRcdHRoaXMudHlwZSA9ICdlbWFpbCc7XG5cdFx0XHR0aGlzLmVtYWlsID0gdGhpcy5jb21wb25lbnRMb29rdXAubWFpbFswXS52YWx1ZTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRMb29rdXAuY24gJiZcblx0XHQgICAgdGhpcy5jb21wb25lbnRMb29rdXAuY24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHR0aGlzLnR5cGUgPSAndXNlcic7XG5cdFx0XHR0aGlzLnVpZCA9IHRoaXMuY29tcG9uZW50TG9va3VwLmNuWzBdLnZhbHVlO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudHlwZSA9ICd1bmtub3duJztcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gb3B0cy50eXBlO1xuXHRcdGlmICh0aGlzLnR5cGUgPT09ICdob3N0Jylcblx0XHRcdHRoaXMuaG9zdG5hbWUgPSBvcHRzLmhvc3RuYW1lO1xuXHRcdGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ3VzZXInKVxuXHRcdFx0dGhpcy51aWQgPSBvcHRzLnVpZDtcblx0XHRlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdlbWFpbCcpXG5cdFx0XHR0aGlzLmVtYWlsID0gb3B0cy5lbWFpbDtcblx0XHRlbHNlXG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdVbmtub3duIHR5cGUgJyArIHRoaXMudHlwZSkpO1xuXHR9XG59XG5cbklkZW50aXR5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICh0aGlzLmNvbXBvbmVudHMubWFwKGZ1bmN0aW9uIChjKSB7XG5cdFx0dmFyIG4gPSBjLm5hbWUudG9VcHBlckNhc2UoKTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHRuID0gbi5yZXBsYWNlKC89L2csICdcXFxcPScpO1xuXHRcdHZhciB2ID0gYy52YWx1ZTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHR2ID0gdi5yZXBsYWNlKC8sL2csICdcXFxcLCcpO1xuXHRcdHJldHVybiAobiArICc9JyArIHYpO1xuXHR9KS5qb2luKCcsICcpKTtcbn07XG5cbklkZW50aXR5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSwgYXNBcnJheSkge1xuXHRhc3NlcnQuc3RyaW5nKG5hbWUsICduYW1lJyk7XG5cdHZhciBhcnIgPSB0aGlzLmNvbXBvbmVudExvb2t1cFtuYW1lXTtcblx0aWYgKGFyciA9PT0gdW5kZWZpbmVkIHx8IGFyci5sZW5ndGggPT09IDApXG5cdFx0cmV0dXJuICh1bmRlZmluZWQpO1xuXHRpZiAoIWFzQXJyYXkgJiYgYXJyLmxlbmd0aCA+IDEpXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignTXVsdGlwbGUgdmFsdWVzIGZvciBhdHRyaWJ1dGUgJyArIG5hbWUpKTtcblx0aWYgKCFhc0FycmF5KVxuXHRcdHJldHVybiAoYXJyWzBdLnZhbHVlKTtcblx0cmV0dXJuIChhcnIubWFwKGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuIChjLnZhbHVlKTtcblx0fSkpO1xufTtcblxuSWRlbnRpdHkucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoaWR4KSB7XG5cdHJldHVybiAodGhpcy5jb21wb25lbnRzLm1hcChmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAoe1xuXHRcdFx0bmFtZTogYy5uYW1lLFxuXHRcdFx0dmFsdWU6IGMudmFsdWVcblx0XHR9KTtcblx0fSkpO1xufTtcblxuLypcbiAqIFRoZXNlIGFyZSBmcm9tIFguNjgwIC0tIFByaW50YWJsZVN0cmluZyBhbGxvd2VkIGNoYXJzIGFyZSBpbiBzZWN0aW9uIDM3LjRcbiAqIHRhYmxlIDguIFNwZWMgZm9yIElBNVN0cmluZ3MgaXMgXCIxLDYgKyBTUEFDRSArIERFTFwiIHdoZXJlIDEgcmVmZXJzIHRvXG4gKiBJU08gSVIgIzAwMSAoc3RhbmRhcmQgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzKSBhbmQgNiByZWZlcnMgdG8gSVNPIElSICMwMDZcbiAqICh0aGUgYmFzaWMgQVNDSUkgY2hhcmFjdGVyIHNldCkuXG4gKi9cbi8qIEpTU1RZTEVEICovXG52YXIgTk9UX1BSSU5UQUJMRSA9IC9bXmEtekEtWjAtOSAnKCksKy5cXC86PT8tXS87XG4vKiBKU1NUWUxFRCAqL1xudmFyIE5PVF9JQTUgPSAvW15cXHgwMC1cXHg3Zl0vO1xuXG5JZGVudGl0eS5wcm90b3R5cGUudG9Bc24xID0gZnVuY3Rpb24gKGRlciwgdGFnKSB7XG5cdGRlci5zdGFydFNlcXVlbmNlKHRhZyk7XG5cdHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG5cdFx0ZGVyLnN0YXJ0U2VxdWVuY2UoYXNuMS5CZXIuQ29uc3RydWN0b3IgfCBhc24xLkJlci5TZXQpO1xuXHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0ZGVyLndyaXRlT0lEKGMub2lkKTtcblx0XHQvKlxuXHRcdCAqIElmIHdlIGZpdCBpbiBhIFByaW50YWJsZVN0cmluZywgdXNlIHRoYXQuIE90aGVyd2lzZSB1c2UgYW5cblx0XHQgKiBJQTVTdHJpbmcgb3IgVVRGOFN0cmluZy5cblx0XHQgKlxuXHRcdCAqIElmIHRoaXMgaWRlbnRpdHkgd2FzIHBhcnNlZCBmcm9tIGEgRE4sIHVzZSB0aGUgQVNOLjEgdHlwZXNcblx0XHQgKiBmcm9tIHRoZSBvcmlnaW5hbCByZXByZXNlbnRhdGlvbiAob3RoZXJ3aXNlIHRoaXMgbWlnaHQgbm90XG5cdFx0ICogYmUgYSBmdWxsIG1hdGNoIGZvciB0aGUgb3JpZ2luYWwgaW4gc29tZSB2YWxpZGF0b3JzKS5cblx0XHQgKi9cblx0XHRpZiAoYy5hc24xdHlwZSA9PT0gYXNuMS5CZXIuVXRmOFN0cmluZyB8fFxuXHRcdCAgICBjLnZhbHVlLm1hdGNoKE5PVF9JQTUpKSB7XG5cdFx0XHR2YXIgdiA9IEJ1ZmZlci5mcm9tKGMudmFsdWUsICd1dGY4Jyk7XG5cdFx0XHRkZXIud3JpdGVCdWZmZXIodiwgYXNuMS5CZXIuVXRmOFN0cmluZyk7XG5cblx0XHR9IGVsc2UgaWYgKGMuYXNuMXR5cGUgPT09IGFzbjEuQmVyLklBNVN0cmluZyB8fFxuXHRcdCAgICBjLnZhbHVlLm1hdGNoKE5PVF9QUklOVEFCTEUpKSB7XG5cdFx0XHRkZXIud3JpdGVTdHJpbmcoYy52YWx1ZSwgYXNuMS5CZXIuSUE1U3RyaW5nKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgdHlwZSA9IGFzbjEuQmVyLlByaW50YWJsZVN0cmluZztcblx0XHRcdGlmIChjLmFzbjF0eXBlICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdHR5cGUgPSBjLmFzbjF0eXBlO1xuXHRcdFx0ZGVyLndyaXRlU3RyaW5nKGMudmFsdWUsIHR5cGUpO1xuXHRcdH1cblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0fSk7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufTtcblxuZnVuY3Rpb24gZ2xvYk1hdGNoKGEsIGIpIHtcblx0aWYgKGEgPT09ICcqKicgfHwgYiA9PT0gJyoqJylcblx0XHRyZXR1cm4gKHRydWUpO1xuXHR2YXIgYVBhcnRzID0gYS5zcGxpdCgnLicpO1xuXHR2YXIgYlBhcnRzID0gYi5zcGxpdCgnLicpO1xuXHRpZiAoYVBhcnRzLmxlbmd0aCAhPT0gYlBhcnRzLmxlbmd0aClcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhUGFydHMubGVuZ3RoOyArK2kpIHtcblx0XHRpZiAoYVBhcnRzW2ldID09PSAnKicgfHwgYlBhcnRzW2ldID09PSAnKicpXG5cdFx0XHRjb250aW51ZTtcblx0XHRpZiAoYVBhcnRzW2ldICE9PSBiUGFydHNbaV0pXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXHRyZXR1cm4gKHRydWUpO1xufVxuXG5JZGVudGl0eS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdGlmICghSWRlbnRpdHkuaXNJZGVudGl0eShvdGhlciwgWzEsIDBdKSlcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0aWYgKG90aGVyLmNvbXBvbmVudHMubGVuZ3RoICE9PSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7ICsraSkge1xuXHRcdGlmICh0aGlzLmNvbXBvbmVudHNbaV0ub2lkICE9PSBvdGhlci5jb21wb25lbnRzW2ldLm9pZClcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHRcdGlmICghZ2xvYk1hdGNoKHRoaXMuY29tcG9uZW50c1tpXS52YWx1ZSxcblx0XHQgICAgb3RoZXIuY29tcG9uZW50c1tpXS52YWx1ZSkpIHtcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gKHRydWUpO1xufTtcblxuSWRlbnRpdHkuZm9ySG9zdCA9IGZ1bmN0aW9uIChob3N0bmFtZSkge1xuXHRhc3NlcnQuc3RyaW5nKGhvc3RuYW1lLCAnaG9zdG5hbWUnKTtcblx0cmV0dXJuIChuZXcgSWRlbnRpdHkoe1xuXHRcdHR5cGU6ICdob3N0Jyxcblx0XHRob3N0bmFtZTogaG9zdG5hbWUsXG5cdFx0Y29tcG9uZW50czogWyB7IG5hbWU6ICdjbicsIHZhbHVlOiBob3N0bmFtZSB9IF1cblx0fSkpO1xufTtcblxuSWRlbnRpdHkuZm9yVXNlciA9IGZ1bmN0aW9uICh1aWQpIHtcblx0YXNzZXJ0LnN0cmluZyh1aWQsICd1aWQnKTtcblx0cmV0dXJuIChuZXcgSWRlbnRpdHkoe1xuXHRcdHR5cGU6ICd1c2VyJyxcblx0XHR1aWQ6IHVpZCxcblx0XHRjb21wb25lbnRzOiBbIHsgbmFtZTogJ3VpZCcsIHZhbHVlOiB1aWQgfSBdXG5cdH0pKTtcbn07XG5cbklkZW50aXR5LmZvckVtYWlsID0gZnVuY3Rpb24gKGVtYWlsKSB7XG5cdGFzc2VydC5zdHJpbmcoZW1haWwsICdlbWFpbCcpO1xuXHRyZXR1cm4gKG5ldyBJZGVudGl0eSh7XG5cdFx0dHlwZTogJ2VtYWlsJyxcblx0XHRlbWFpbDogZW1haWwsXG5cdFx0Y29tcG9uZW50czogWyB7IG5hbWU6ICdtYWlsJywgdmFsdWU6IGVtYWlsIH0gXVxuXHR9KSk7XG59O1xuXG5JZGVudGl0eS5wYXJzZUROID0gZnVuY3Rpb24gKGRuKSB7XG5cdGFzc2VydC5zdHJpbmcoZG4sICdkbicpO1xuXHR2YXIgcGFydHMgPSBbJyddO1xuXHR2YXIgaWR4ID0gMDtcblx0dmFyIHJlbSA9IGRuO1xuXHR3aGlsZSAocmVtLmxlbmd0aCA+IDApIHtcblx0XHR2YXIgbTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHRpZiAoKG0gPSAvXiwvLmV4ZWMocmVtKSkgIT09IG51bGwpIHtcblx0XHRcdHBhcnRzWysraWR4XSA9ICcnO1xuXHRcdFx0cmVtID0gcmVtLnNsaWNlKG1bMF0ubGVuZ3RoKTtcblx0XHQvKkpTU1RZTEVEKi9cblx0XHR9IGVsc2UgaWYgKChtID0gL15cXFxcLC8uZXhlYyhyZW0pKSAhPT0gbnVsbCkge1xuXHRcdFx0cGFydHNbaWR4XSArPSAnLCc7XG5cdFx0XHRyZW0gPSByZW0uc2xpY2UobVswXS5sZW5ndGgpO1xuXHRcdC8qSlNTVFlMRUQqL1xuXHRcdH0gZWxzZSBpZiAoKG0gPSAvXlxcXFwuLy5leGVjKHJlbSkpICE9PSBudWxsKSB7XG5cdFx0XHRwYXJ0c1tpZHhdICs9IG1bMF07XG5cdFx0XHRyZW0gPSByZW0uc2xpY2UobVswXS5sZW5ndGgpO1xuXHRcdC8qSlNTVFlMRUQqL1xuXHRcdH0gZWxzZSBpZiAoKG0gPSAvXlteXFxcXCxdKy8uZXhlYyhyZW0pKSAhPT0gbnVsbCkge1xuXHRcdFx0cGFydHNbaWR4XSArPSBtWzBdO1xuXHRcdFx0cmVtID0gcmVtLnNsaWNlKG1bMF0ubGVuZ3RoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIEROJykpO1xuXHRcdH1cblx0fVxuXHR2YXIgY21wcyA9IHBhcnRzLm1hcChmdW5jdGlvbiAoYykge1xuXHRcdGMgPSBjLnRyaW0oKTtcblx0XHR2YXIgZXFQb3MgPSBjLmluZGV4T2YoJz0nKTtcblx0XHR3aGlsZSAoZXFQb3MgPiAwICYmIGMuY2hhckF0KGVxUG9zIC0gMSkgPT09ICdcXFxcJylcblx0XHRcdGVxUG9zID0gYy5pbmRleE9mKCc9JywgZXFQb3MgKyAxKTtcblx0XHRpZiAoZXFQb3MgPT09IC0xKSB7XG5cdFx0XHR0aHJvdyAobmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgRE4nKSk7XG5cdFx0fVxuXHRcdC8qSlNTVFlMRUQqL1xuXHRcdHZhciBuYW1lID0gYy5zbGljZSgwLCBlcVBvcykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcPS9nLCAnPScpO1xuXHRcdHZhciB2YWx1ZSA9IGMuc2xpY2UoZXFQb3MgKyAxKTtcblx0XHRyZXR1cm4gKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pO1xuXHR9KTtcblx0cmV0dXJuIChuZXcgSWRlbnRpdHkoeyBjb21wb25lbnRzOiBjbXBzIH0pKTtcbn07XG5cbklkZW50aXR5LmZyb21BcnJheSA9IGZ1bmN0aW9uIChjb21wb25lbnRzKSB7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KGNvbXBvbmVudHMsICdjb21wb25lbnRzJyk7XG5cdGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY21wKSB7XG5cdFx0YXNzZXJ0Lm9iamVjdChjbXAsICdjb21wb25lbnQnKTtcblx0XHRhc3NlcnQuc3RyaW5nKGNtcC5uYW1lLCAnY29tcG9uZW50Lm5hbWUnKTtcblx0XHRpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjbXAudmFsdWUpICYmXG5cdFx0ICAgICEodHlwZW9mIChjbXAudmFsdWUpID09PSAnc3RyaW5nJykpIHtcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ0ludmFsaWQgY29tcG9uZW50IHZhbHVlJykpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiAobmV3IElkZW50aXR5KHsgY29tcG9uZW50czogY29tcG9uZW50cyB9KSk7XG59O1xuXG5JZGVudGl0eS5wYXJzZUFzbjEgPSBmdW5jdGlvbiAoZGVyLCB0b3ApIHtcblx0dmFyIGNvbXBvbmVudHMgPSBbXTtcblx0ZGVyLnJlYWRTZXF1ZW5jZSh0b3ApO1xuXHR2YXIgZW5kID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cdHdoaWxlIChkZXIub2Zmc2V0IDwgZW5kKSB7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZShhc24xLkJlci5Db25zdHJ1Y3RvciB8IGFzbjEuQmVyLlNldCk7XG5cdFx0dmFyIGFmdGVyID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHRcdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRcdHZhciB0eXBlID0gZGVyLnBlZWsoKTtcblx0XHR2YXIgdmFsdWU7XG5cdFx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Y2FzZSBhc24xLkJlci5QcmludGFibGVTdHJpbmc6XG5cdFx0Y2FzZSBhc24xLkJlci5JQTVTdHJpbmc6XG5cdFx0Y2FzZSBhc24xLkJlci5PY3RldFN0cmluZzpcblx0XHRjYXNlIGFzbjEuQmVyLlQ2MVN0cmluZzpcblx0XHRcdHZhbHVlID0gZGVyLnJlYWRTdHJpbmcodHlwZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIGFzbjEuQmVyLlV0ZjhTdHJpbmc6XG5cdFx0XHR2YWx1ZSA9IGRlci5yZWFkU3RyaW5nKHR5cGUsIHRydWUpO1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50b1N0cmluZygndXRmOCcpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBhc24xLkJlci5DaGFyYWN0ZXJTdHJpbmc6XG5cdFx0Y2FzZSBhc24xLkJlci5CTVBTdHJpbmc6XG5cdFx0XHR2YWx1ZSA9IGRlci5yZWFkU3RyaW5nKHR5cGUsIHRydWUpO1xuXHRcdFx0dmFsdWUgPSB2YWx1ZS50b1N0cmluZygndXRmMTZsZScpO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ1Vua25vd24gYXNuMSB0eXBlICcgKyB0eXBlKSk7XG5cdFx0fVxuXHRcdGNvbXBvbmVudHMucHVzaCh7IG9pZDogb2lkLCBhc24xdHlwZTogdHlwZSwgdmFsdWU6IHZhbHVlIH0pO1xuXHRcdGRlci5fb2Zmc2V0ID0gYWZ0ZXI7XG5cdH1cblx0ZGVyLl9vZmZzZXQgPSBlbmQ7XG5cdHJldHVybiAobmV3IElkZW50aXR5KHtcblx0XHRjb21wb25lbnRzOiBjb21wb25lbnRzXG5cdH0pKTtcbn07XG5cbklkZW50aXR5LmlzSWRlbnRpdHkgPSBmdW5jdGlvbiAob2JqLCB2ZXIpIHtcblx0cmV0dXJuICh1dGlscy5pc0NvbXBhdGlibGUob2JqLCBJZGVudGl0eSwgdmVyKSk7XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBJZGVudGl0eTpcbiAqIFsxLDBdIC0tIGluaXRpYWwgdmVyXG4gKi9cbklkZW50aXR5LnByb3RvdHlwZS5fc3NocGtBcGlWZXJzaW9uID0gWzEsIDBdO1xuXG5JZGVudGl0eS5fb2xkVmVyc2lvbkRldGVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0cmV0dXJuIChbMSwgMF0pO1xufTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxNyBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHZlcmlmeTogdmVyaWZ5LFxuXHRzaWduOiBzaWduLFxuXHRzaWduQXN5bmM6IHNpZ25Bc3luYyxcblx0d3JpdGU6IHdyaXRlLFxuXG5cdC8qIEludGVybmFsIHByaXZhdGUgQVBJICovXG5cdGZyb21CdWZmZXI6IGZyb21CdWZmZXIsXG5cdHRvQnVmZmVyOiB0b0J1ZmZlclxufTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgU1NIQnVmZmVyID0gcmVxdWlyZSgnLi4vc3NoLWJ1ZmZlcicpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIEtleSA9IHJlcXVpcmUoJy4uL2tleScpO1xudmFyIFByaXZhdGVLZXkgPSByZXF1aXJlKCcuLi9wcml2YXRlLWtleScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi4vaWRlbnRpdHknKTtcbnZhciByZmM0MjUzID0gcmVxdWlyZSgnLi9yZmM0MjUzJyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi4vc2lnbmF0dXJlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi4vY2VydGlmaWNhdGUnKTtcblxuZnVuY3Rpb24gdmVyaWZ5KGNlcnQsIGtleSkge1xuXHQvKlxuXHQgKiBXZSBhbHdheXMgZ2l2ZSBhbiBpc3N1ZXJLZXksIHNvIGlmIG91ciB2ZXJpZnkoKSBpcyBiZWluZyBjYWxsZWQgdGhlblxuXHQgKiB0aGVyZSB3YXMgbm8gc2lnbmF0dXJlLiBSZXR1cm4gZmFsc2UuXG5cdCAqL1xuXHRyZXR1cm4gKGZhbHNlKTtcbn1cblxudmFyIFRZUEVTID0ge1xuXHQndXNlcic6IDEsXG5cdCdob3N0JzogMlxufTtcbk9iamVjdC5rZXlzKFRZUEVTKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IFRZUEVTW1RZUEVTW2tdXSA9IGs7IH0pO1xuXG52YXIgRUNEU0FfQUxHTyA9IC9eZWNkc2Etc2hhMi0oW15ALV0rKS1jZXJ0LXYwMUBvcGVuc3NoLmNvbSQvO1xuXG5mdW5jdGlvbiByZWFkKGJ1Ziwgb3B0aW9ucykge1xuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKGJ1ZikpXG5cdFx0YnVmID0gYnVmLnRvU3RyaW5nKCdhc2NpaScpO1xuXHR2YXIgcGFydHMgPSBidWYudHJpbSgpLnNwbGl0KC9bIFxcdFxcbl0rL2cpO1xuXHRpZiAocGFydHMubGVuZ3RoIDwgMiB8fCBwYXJ0cy5sZW5ndGggPiAzKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIFNTSCBjZXJ0aWZpY2F0ZSBsaW5lJykpO1xuXG5cdHZhciBhbGdvID0gcGFydHNbMF07XG5cdHZhciBkYXRhID0gcGFydHNbMV07XG5cblx0ZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKTtcblx0cmV0dXJuIChmcm9tQnVmZmVyKGRhdGEsIGFsZ28pKTtcbn1cblxuZnVuY3Rpb24gZnJvbUJ1ZmZlcihkYXRhLCBhbGdvLCBwYXJ0aWFsKSB7XG5cdHZhciBzc2hidWYgPSBuZXcgU1NIQnVmZmVyKHsgYnVmZmVyOiBkYXRhIH0pO1xuXHR2YXIgaW5uZXJBbGdvID0gc3NoYnVmLnJlYWRTdHJpbmcoKTtcblx0aWYgKGFsZ28gIT09IHVuZGVmaW5lZCAmJiBpbm5lckFsZ28gIT09IGFsZ28pXG5cdFx0dGhyb3cgKG5ldyBFcnJvcignU1NIIGNlcnRpZmljYXRlIGFsZ29yaXRobSBtaXNtYXRjaCcpKTtcblx0aWYgKGFsZ28gPT09IHVuZGVmaW5lZClcblx0XHRhbGdvID0gaW5uZXJBbGdvO1xuXG5cdHZhciBjZXJ0ID0ge307XG5cdGNlcnQuc2lnbmF0dXJlcyA9IHt9O1xuXHRjZXJ0LnNpZ25hdHVyZXMub3BlbnNzaCA9IHt9O1xuXG5cdGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoLm5vbmNlID0gc3NoYnVmLnJlYWRCdWZmZXIoKTtcblxuXHR2YXIga2V5ID0ge307XG5cdHZhciBwYXJ0cyA9IChrZXkucGFydHMgPSBbXSk7XG5cdGtleS50eXBlID0gZ2V0QWxnKGFsZ28pO1xuXG5cdHZhciBwYXJ0Q291bnQgPSBhbGdzLmluZm9ba2V5LnR5cGVdLnBhcnRzLmxlbmd0aDtcblx0d2hpbGUgKHBhcnRzLmxlbmd0aCA8IHBhcnRDb3VudClcblx0XHRwYXJ0cy5wdXNoKHNzaGJ1Zi5yZWFkUGFydCgpKTtcblx0YXNzZXJ0Lm9rKHBhcnRzLmxlbmd0aCA+PSAxLCAna2V5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcGFydCcpO1xuXG5cdHZhciBhbGdJbmZvID0gYWxncy5pbmZvW2tleS50eXBlXTtcblx0aWYgKGtleS50eXBlID09PSAnZWNkc2EnKSB7XG5cdFx0dmFyIHJlcyA9IEVDRFNBX0FMR08uZXhlYyhhbGdvKTtcblx0XHRhc3NlcnQub2socmVzICE9PSBudWxsKTtcblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwocmVzWzFdLCBwYXJ0c1swXS5kYXRhLnRvU3RyaW5nKCkpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhbGdJbmZvLnBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0cGFydHNbaV0ubmFtZSA9IGFsZ0luZm8ucGFydHNbaV07XG5cdFx0aWYgKHBhcnRzW2ldLm5hbWUgIT09ICdjdXJ2ZScgJiZcblx0XHQgICAgYWxnSW5mby5ub3JtYWxpemUgIT09IGZhbHNlKSB7XG5cdFx0XHR2YXIgcCA9IHBhcnRzW2ldO1xuXHRcdFx0cC5kYXRhID0gdXRpbHMubXBOb3JtYWxpemUocC5kYXRhKTtcblx0XHR9XG5cdH1cblxuXHRjZXJ0LnN1YmplY3RLZXkgPSBuZXcgS2V5KGtleSk7XG5cblx0Y2VydC5zZXJpYWwgPSBzc2hidWYucmVhZEludDY0KCk7XG5cblx0dmFyIHR5cGUgPSBUWVBFU1tzc2hidWYucmVhZEludCgpXTtcblx0YXNzZXJ0LnN0cmluZyh0eXBlLCAndmFsaWQgY2VydCB0eXBlJyk7XG5cblx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2gua2V5SWQgPSBzc2hidWYucmVhZFN0cmluZygpO1xuXG5cdHZhciBwcmluY2lwYWxzID0gW107XG5cdHZhciBwYnVmID0gc3NoYnVmLnJlYWRCdWZmZXIoKTtcblx0dmFyIHBzc2hidWYgPSBuZXcgU1NIQnVmZmVyKHsgYnVmZmVyOiBwYnVmIH0pO1xuXHR3aGlsZSAoIXBzc2hidWYuYXRFbmQoKSlcblx0XHRwcmluY2lwYWxzLnB1c2gocHNzaGJ1Zi5yZWFkU3RyaW5nKCkpO1xuXHRpZiAocHJpbmNpcGFscy5sZW5ndGggPT09IDApXG5cdFx0cHJpbmNpcGFscyA9IFsnKiddO1xuXG5cdGNlcnQuc3ViamVjdHMgPSBwcmluY2lwYWxzLm1hcChmdW5jdGlvbiAocHIpIHtcblx0XHRpZiAodHlwZSA9PT0gJ3VzZXInKVxuXHRcdFx0cmV0dXJuIChJZGVudGl0eS5mb3JVc2VyKHByKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gJ2hvc3QnKVxuXHRcdFx0cmV0dXJuIChJZGVudGl0eS5mb3JIb3N0KHByKSk7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignVW5rbm93biBpZGVudGl0eSB0eXBlICcgKyB0eXBlKSk7XG5cdH0pO1xuXG5cdGNlcnQudmFsaWRGcm9tID0gaW50NjRUb0RhdGUoc3NoYnVmLnJlYWRJbnQ2NCgpKTtcblx0Y2VydC52YWxpZFVudGlsID0gaW50NjRUb0RhdGUoc3NoYnVmLnJlYWRJbnQ2NCgpKTtcblxuXHR2YXIgZXh0cyA9IFtdO1xuXHR2YXIgZXh0YnVmID0gbmV3IFNTSEJ1ZmZlcih7IGJ1ZmZlcjogc3NoYnVmLnJlYWRCdWZmZXIoKSB9KTtcblx0dmFyIGV4dDtcblx0d2hpbGUgKCFleHRidWYuYXRFbmQoKSkge1xuXHRcdGV4dCA9IHsgY3JpdGljYWw6IHRydWUgfTtcblx0XHRleHQubmFtZSA9IGV4dGJ1Zi5yZWFkU3RyaW5nKCk7XG5cdFx0ZXh0LmRhdGEgPSBleHRidWYucmVhZEJ1ZmZlcigpO1xuXHRcdGV4dHMucHVzaChleHQpO1xuXHR9XG5cdGV4dGJ1ZiA9IG5ldyBTU0hCdWZmZXIoeyBidWZmZXI6IHNzaGJ1Zi5yZWFkQnVmZmVyKCkgfSk7XG5cdHdoaWxlICghZXh0YnVmLmF0RW5kKCkpIHtcblx0XHRleHQgPSB7IGNyaXRpY2FsOiBmYWxzZSB9O1xuXHRcdGV4dC5uYW1lID0gZXh0YnVmLnJlYWRTdHJpbmcoKTtcblx0XHRleHQuZGF0YSA9IGV4dGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdFx0ZXh0cy5wdXNoKGV4dCk7XG5cdH1cblx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2guZXh0cyA9IGV4dHM7XG5cblx0LyogcmVzZXJ2ZWQgKi9cblx0c3NoYnVmLnJlYWRCdWZmZXIoKTtcblxuXHR2YXIgc2lnbmluZ0tleUJ1ZiA9IHNzaGJ1Zi5yZWFkQnVmZmVyKCk7XG5cdGNlcnQuaXNzdWVyS2V5ID0gcmZjNDI1My5yZWFkKHNpZ25pbmdLZXlCdWYpO1xuXG5cdC8qXG5cdCAqIE9wZW5TU0ggY2VydHMgZG9uJ3QgZ2l2ZSB0aGUgaWRlbnRpdHkgb2YgdGhlIGlzc3VlciwganVzdCB0aGVpclxuXHQgKiBwdWJsaWMga2V5LiBTbywgd2UgdXNlIGFuIElkZW50aXR5IHRoYXQgbWF0Y2hlcyBhbnl0aGluZy4gVGhlXG5cdCAqIGlzU2lnbmVkQnkoKSBmdW5jdGlvbiB3aWxsIGxhdGVyIHRlbGwgeW91IGlmIHRoZSBrZXkgbWF0Y2hlcy5cblx0ICovXG5cdGNlcnQuaXNzdWVyID0gSWRlbnRpdHkuZm9ySG9zdCgnKionKTtcblxuXHR2YXIgc2lnQnVmID0gc3NoYnVmLnJlYWRCdWZmZXIoKTtcblx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2guc2lnbmF0dXJlID1cblx0ICAgIFNpZ25hdHVyZS5wYXJzZShzaWdCdWYsIGNlcnQuaXNzdWVyS2V5LnR5cGUsICdzc2gnKTtcblxuXHRpZiAocGFydGlhbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFydGlhbC5yZW1haW5kZXIgPSBzc2hidWYucmVtYWluZGVyKCk7XG5cdFx0cGFydGlhbC5jb25zdW1lZCA9IHNzaGJ1Zi5fb2Zmc2V0O1xuXHR9XG5cblx0cmV0dXJuIChuZXcgQ2VydGlmaWNhdGUoY2VydCkpO1xufVxuXG5mdW5jdGlvbiBpbnQ2NFRvRGF0ZShidWYpIHtcblx0dmFyIGkgPSBidWYucmVhZFVJbnQzMkJFKDApICogNDI5NDk2NzI5Njtcblx0aSArPSBidWYucmVhZFVJbnQzMkJFKDQpO1xuXHR2YXIgZCA9IG5ldyBEYXRlKCk7XG5cdGQuc2V0VGltZShpICogMTAwMCk7XG5cdGQuc291cmNlSW50NjQgPSBidWY7XG5cdHJldHVybiAoZCk7XG59XG5cbmZ1bmN0aW9uIGRhdGVUb0ludDY0KGRhdGUpIHtcblx0aWYgKGRhdGUuc291cmNlSW50NjQgIT09IHVuZGVmaW5lZClcblx0XHRyZXR1cm4gKGRhdGUuc291cmNlSW50NjQpO1xuXHR2YXIgaSA9IE1hdGgucm91bmQoZGF0ZS5nZXRUaW1lKCkgLyAxMDAwKTtcblx0dmFyIHVwcGVyID0gTWF0aC5mbG9vcihpIC8gNDI5NDk2NzI5Nik7XG5cdHZhciBsb3dlciA9IE1hdGguZmxvb3IoaSAlIDQyOTQ5NjcyOTYpO1xuXHR2YXIgYnVmID0gQnVmZmVyLmFsbG9jKDgpO1xuXHRidWYud3JpdGVVSW50MzJCRSh1cHBlciwgMCk7XG5cdGJ1Zi53cml0ZVVJbnQzMkJFKGxvd2VyLCA0KTtcblx0cmV0dXJuIChidWYpO1xufVxuXG5mdW5jdGlvbiBzaWduKGNlcnQsIGtleSkge1xuXHRpZiAoY2VydC5zaWduYXR1cmVzLm9wZW5zc2ggPT09IHVuZGVmaW5lZClcblx0XHRjZXJ0LnNpZ25hdHVyZXMub3BlbnNzaCA9IHt9O1xuXHR0cnkge1xuXHRcdHZhciBibG9iID0gdG9CdWZmZXIoY2VydCwgdHJ1ZSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRkZWxldGUgKGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoKTtcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLm9wZW5zc2g7XG5cdHZhciBoYXNoQWxnbyA9IHVuZGVmaW5lZDtcblx0aWYgKGtleS50eXBlID09PSAncnNhJyB8fCBrZXkudHlwZSA9PT0gJ2RzYScpXG5cdFx0aGFzaEFsZ28gPSAnc2hhMSc7XG5cdHZhciBzaWduZXIgPSBrZXkuY3JlYXRlU2lnbihoYXNoQWxnbyk7XG5cdHNpZ25lci53cml0ZShibG9iKTtcblx0c2lnLnNpZ25hdHVyZSA9IHNpZ25lci5zaWduKCk7XG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25Bc3luYyhjZXJ0LCBzaWduZXIsIGRvbmUpIHtcblx0aWYgKGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoID09PSB1bmRlZmluZWQpXG5cdFx0Y2VydC5zaWduYXR1cmVzLm9wZW5zc2ggPSB7fTtcblx0dHJ5IHtcblx0XHR2YXIgYmxvYiA9IHRvQnVmZmVyKGNlcnQsIHRydWUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0ZGVsZXRlIChjZXJ0LnNpZ25hdHVyZXMub3BlbnNzaCk7XG5cdFx0ZG9uZShlKTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIHNpZyA9IGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoO1xuXG5cdHNpZ25lcihibG9iLCBmdW5jdGlvbiAoZXJyLCBzaWduYXR1cmUpIHtcblx0XHRpZiAoZXJyKSB7XG5cdFx0XHRkb25lKGVycik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHQvKlxuXHRcdFx0ICogVGhpcyB3aWxsIHRocm93IGlmIHRoZSBzaWduYXR1cmUgaXNuJ3Qgb2YgYVxuXHRcdFx0ICogdHlwZS9hbGdvIHRoYXQgY2FuIGJlIHVzZWQgZm9yIFNTSC5cblx0XHRcdCAqL1xuXHRcdFx0c2lnbmF0dXJlLnRvQnVmZmVyKCdzc2gnKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRkb25lKGUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRzaWcuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXHRcdGRvbmUoKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlKGNlcnQsIG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zID0ge307XG5cblx0dmFyIGJsb2IgPSB0b0J1ZmZlcihjZXJ0KTtcblx0dmFyIG91dCA9IGdldENlcnRUeXBlKGNlcnQuc3ViamVjdEtleSkgKyAnICcgKyBibG9iLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0aWYgKG9wdGlvbnMuY29tbWVudClcblx0XHRvdXQgPSBvdXQgKyAnICcgKyBvcHRpb25zLmNvbW1lbnQ7XG5cdHJldHVybiAob3V0KTtcbn1cblxuXG5mdW5jdGlvbiB0b0J1ZmZlcihjZXJ0LCBub1NpZykge1xuXHRhc3NlcnQub2JqZWN0KGNlcnQuc2lnbmF0dXJlcy5vcGVuc3NoLCAnc2lnbmF0dXJlIGZvciBvcGVuc3NoIGZvcm1hdCcpO1xuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLm9wZW5zc2g7XG5cblx0aWYgKHNpZy5ub25jZSA9PT0gdW5kZWZpbmVkKVxuXHRcdHNpZy5ub25jZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNik7XG5cdHZhciBidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0YnVmLndyaXRlU3RyaW5nKGdldENlcnRUeXBlKGNlcnQuc3ViamVjdEtleSkpO1xuXHRidWYud3JpdGVCdWZmZXIoc2lnLm5vbmNlKTtcblxuXHR2YXIga2V5ID0gY2VydC5zdWJqZWN0S2V5O1xuXHR2YXIgYWxnSW5mbyA9IGFsZ3MuaW5mb1trZXkudHlwZV07XG5cdGFsZ0luZm8ucGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuXHRcdGJ1Zi53cml0ZVBhcnQoa2V5LnBhcnRbcGFydF0pO1xuXHR9KTtcblxuXHRidWYud3JpdGVJbnQ2NChjZXJ0LnNlcmlhbCk7XG5cblx0dmFyIHR5cGUgPSBjZXJ0LnN1YmplY3RzWzBdLnR5cGU7XG5cdGFzc2VydC5ub3RTdHJpY3RFcXVhbCh0eXBlLCAndW5rbm93bicpO1xuXHRjZXJ0LnN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG5cdFx0YXNzZXJ0LnN0cmljdEVxdWFsKGlkLnR5cGUsIHR5cGUpO1xuXHR9KTtcblx0dHlwZSA9IFRZUEVTW3R5cGVdO1xuXHRidWYud3JpdGVJbnQodHlwZSk7XG5cblx0aWYgKHNpZy5rZXlJZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0c2lnLmtleUlkID0gY2VydC5zdWJqZWN0c1swXS50eXBlICsgJ18nICtcblx0XHQgICAgKGNlcnQuc3ViamVjdHNbMF0udWlkIHx8IGNlcnQuc3ViamVjdHNbMF0uaG9zdG5hbWUpO1xuXHR9XG5cdGJ1Zi53cml0ZVN0cmluZyhzaWcua2V5SWQpO1xuXG5cdHZhciBzdWIgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0Y2VydC5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuXHRcdGlmICh0eXBlID09PSBUWVBFUy5ob3N0KVxuXHRcdFx0c3ViLndyaXRlU3RyaW5nKGlkLmhvc3RuYW1lKTtcblx0XHRlbHNlIGlmICh0eXBlID09PSBUWVBFUy51c2VyKVxuXHRcdFx0c3ViLndyaXRlU3RyaW5nKGlkLnVpZCk7XG5cdH0pO1xuXHRidWYud3JpdGVCdWZmZXIoc3ViLnRvQnVmZmVyKCkpO1xuXG5cdGJ1Zi53cml0ZUludDY0KGRhdGVUb0ludDY0KGNlcnQudmFsaWRGcm9tKSk7XG5cdGJ1Zi53cml0ZUludDY0KGRhdGVUb0ludDY0KGNlcnQudmFsaWRVbnRpbCkpO1xuXG5cdHZhciBleHRzID0gc2lnLmV4dHM7XG5cdGlmIChleHRzID09PSB1bmRlZmluZWQpXG5cdFx0ZXh0cyA9IFtdO1xuXG5cdHZhciBleHRidWYgPSBuZXcgU1NIQnVmZmVyKHt9KTtcblx0ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcblx0XHRpZiAoZXh0LmNyaXRpY2FsICE9PSB0cnVlKVxuXHRcdFx0cmV0dXJuO1xuXHRcdGV4dGJ1Zi53cml0ZVN0cmluZyhleHQubmFtZSk7XG5cdFx0ZXh0YnVmLndyaXRlQnVmZmVyKGV4dC5kYXRhKTtcblx0fSk7XG5cdGJ1Zi53cml0ZUJ1ZmZlcihleHRidWYudG9CdWZmZXIoKSk7XG5cblx0ZXh0YnVmID0gbmV3IFNTSEJ1ZmZlcih7fSk7XG5cdGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoZXh0KSB7XG5cdFx0aWYgKGV4dC5jcml0aWNhbCA9PT0gdHJ1ZSlcblx0XHRcdHJldHVybjtcblx0XHRleHRidWYud3JpdGVTdHJpbmcoZXh0Lm5hbWUpO1xuXHRcdGV4dGJ1Zi53cml0ZUJ1ZmZlcihleHQuZGF0YSk7XG5cdH0pO1xuXHRidWYud3JpdGVCdWZmZXIoZXh0YnVmLnRvQnVmZmVyKCkpO1xuXG5cdC8qIHJlc2VydmVkICovXG5cdGJ1Zi53cml0ZUJ1ZmZlcihCdWZmZXIuYWxsb2MoMCkpO1xuXG5cdHN1YiA9IHJmYzQyNTMud3JpdGUoY2VydC5pc3N1ZXJLZXkpO1xuXHRidWYud3JpdGVCdWZmZXIoc3ViKTtcblxuXHRpZiAoIW5vU2lnKVxuXHRcdGJ1Zi53cml0ZUJ1ZmZlcihzaWcuc2lnbmF0dXJlLnRvQnVmZmVyKCdzc2gnKSk7XG5cblx0cmV0dXJuIChidWYudG9CdWZmZXIoKSk7XG59XG5cbmZ1bmN0aW9uIGdldEFsZyhjZXJ0VHlwZSkge1xuXHRpZiAoY2VydFR5cGUgPT09ICdzc2gtcnNhLWNlcnQtdjAxQG9wZW5zc2guY29tJylcblx0XHRyZXR1cm4gKCdyc2EnKTtcblx0aWYgKGNlcnRUeXBlID09PSAnc3NoLWRzcy1jZXJ0LXYwMUBvcGVuc3NoLmNvbScpXG5cdFx0cmV0dXJuICgnZHNhJyk7XG5cdGlmIChjZXJ0VHlwZS5tYXRjaChFQ0RTQV9BTEdPKSlcblx0XHRyZXR1cm4gKCdlY2RzYScpO1xuXHRpZiAoY2VydFR5cGUgPT09ICdzc2gtZWQyNTUxOS1jZXJ0LXYwMUBvcGVuc3NoLmNvbScpXG5cdFx0cmV0dXJuICgnZWQyNTUxOScpO1xuXHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjZXJ0IHR5cGUgJyArIGNlcnRUeXBlKSk7XG59XG5cbmZ1bmN0aW9uIGdldENlcnRUeXBlKGtleSkge1xuXHRpZiAoa2V5LnR5cGUgPT09ICdyc2EnKVxuXHRcdHJldHVybiAoJ3NzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20nKTtcblx0aWYgKGtleS50eXBlID09PSAnZHNhJylcblx0XHRyZXR1cm4gKCdzc2gtZHNzLWNlcnQtdjAxQG9wZW5zc2guY29tJyk7XG5cdGlmIChrZXkudHlwZSA9PT0gJ2VjZHNhJylcblx0XHRyZXR1cm4gKCdlY2RzYS1zaGEyLScgKyBrZXkuY3VydmUgKyAnLWNlcnQtdjAxQG9wZW5zc2guY29tJyk7XG5cdGlmIChrZXkudHlwZSA9PT0gJ2VkMjU1MTknKVxuXHRcdHJldHVybiAoJ3NzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tJyk7XG5cdHRocm93IChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGtleSB0eXBlICcgKyBrZXkudHlwZSkpO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDE3IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZDogcmVhZCxcblx0dmVyaWZ5OiB2ZXJpZnksXG5cdHNpZ246IHNpZ24sXG5cdHNpZ25Bc3luYzogc2lnbkFzeW5jLFxuXHR3cml0ZTogd3JpdGVcbn07XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuLi9hbGdzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEtleSA9IHJlcXVpcmUoJy4uL2tleScpO1xudmFyIFByaXZhdGVLZXkgPSByZXF1aXJlKCcuLi9wcml2YXRlLWtleScpO1xudmFyIHBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG52YXIgSWRlbnRpdHkgPSByZXF1aXJlKCcuLi9pZGVudGl0eScpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4uL3NpZ25hdHVyZScpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi4vY2VydGlmaWNhdGUnKTtcbnZhciBwa2NzOCA9IHJlcXVpcmUoJy4vcGtjczgnKTtcblxuLypcbiAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBSRkM1MjgwIChYLjUwOSkuXG4gKi9cblxuLyogSGVscGVyIHRvIHJlYWQgaW4gYSBzaW5nbGUgbXBpbnQgKi9cbmZ1bmN0aW9uIHJlYWRNUEludChkZXIsIG5tKSB7XG5cdGFzc2VydC5zdHJpY3RFcXVhbChkZXIucGVlaygpLCBhc24xLkJlci5JbnRlZ2VyLFxuXHQgICAgbm0gKyAnIGlzIG5vdCBhbiBJbnRlZ2VyJyk7XG5cdHJldHVybiAodXRpbHMubXBOb3JtYWxpemUoZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuSW50ZWdlciwgdHJ1ZSkpKTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5KGNlcnQsIGtleSkge1xuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLng1MDk7XG5cdGFzc2VydC5vYmplY3Qoc2lnLCAneDUwOSBzaWduYXR1cmUnKTtcblxuXHR2YXIgYWxnUGFydHMgPSBzaWcuYWxnby5zcGxpdCgnLScpO1xuXHRpZiAoYWxnUGFydHNbMF0gIT09IGtleS50eXBlKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdHZhciBibG9iID0gc2lnLmNhY2hlO1xuXHRpZiAoYmxvYiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFyIGRlciA9IG5ldyBhc24xLkJlcldyaXRlcigpO1xuXHRcdHdyaXRlVEJTQ2VydChjZXJ0LCBkZXIpO1xuXHRcdGJsb2IgPSBkZXIuYnVmZmVyO1xuXHR9XG5cblx0dmFyIHZlcmlmaWVyID0ga2V5LmNyZWF0ZVZlcmlmeShhbGdQYXJ0c1sxXSk7XG5cdHZlcmlmaWVyLndyaXRlKGJsb2IpO1xuXHRyZXR1cm4gKHZlcmlmaWVyLnZlcmlmeShzaWcuc2lnbmF0dXJlKSk7XG59XG5cbmZ1bmN0aW9uIExvY2FsKGkpIHtcblx0cmV0dXJuIChhc24xLkJlci5Db250ZXh0IHwgYXNuMS5CZXIuQ29uc3RydWN0b3IgfCBpKTtcbn1cblxuZnVuY3Rpb24gQ29udGV4dChpKSB7XG5cdHJldHVybiAoYXNuMS5CZXIuQ29udGV4dCB8IGkpO1xufVxuXG52YXIgU0lHTl9BTEdTID0ge1xuXHQncnNhLW1kNSc6ICcxLjIuODQwLjExMzU0OS4xLjEuNCcsXG5cdCdyc2Etc2hhMSc6ICcxLjIuODQwLjExMzU0OS4xLjEuNScsXG5cdCdyc2Etc2hhMjU2JzogJzEuMi44NDAuMTEzNTQ5LjEuMS4xMScsXG5cdCdyc2Etc2hhMzg0JzogJzEuMi44NDAuMTEzNTQ5LjEuMS4xMicsXG5cdCdyc2Etc2hhNTEyJzogJzEuMi44NDAuMTEzNTQ5LjEuMS4xMycsXG5cdCdkc2Etc2hhMSc6ICcxLjIuODQwLjEwMDQwLjQuMycsXG5cdCdkc2Etc2hhMjU2JzogJzIuMTYuODQwLjEuMTAxLjMuNC4zLjInLFxuXHQnZWNkc2Etc2hhMSc6ICcxLjIuODQwLjEwMDQ1LjQuMScsXG5cdCdlY2RzYS1zaGEyNTYnOiAnMS4yLjg0MC4xMDA0NS40LjMuMicsXG5cdCdlY2RzYS1zaGEzODQnOiAnMS4yLjg0MC4xMDA0NS40LjMuMycsXG5cdCdlY2RzYS1zaGE1MTInOiAnMS4yLjg0MC4xMDA0NS40LjMuNCcsXG5cdCdlZDI1NTE5LXNoYTUxMic6ICcxLjMuMTAxLjExMidcbn07XG5PYmplY3Qua2V5cyhTSUdOX0FMR1MpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0U0lHTl9BTEdTW1NJR05fQUxHU1trXV0gPSBrO1xufSk7XG5TSUdOX0FMR1NbJzEuMy4xNC4zLjIuMyddID0gJ3JzYS1tZDUnO1xuU0lHTl9BTEdTWycxLjMuMTQuMy4yLjI5J10gPSAncnNhLXNoYTEnO1xuXG52YXIgRVhUUyA9IHtcblx0J2lzc3VlcktleUlkJzogJzIuNS4yOS4zNScsXG5cdCdhbHROYW1lJzogJzIuNS4yOS4xNycsXG5cdCdiYXNpY0NvbnN0cmFpbnRzJzogJzIuNS4yOS4xOScsXG5cdCdrZXlVc2FnZSc6ICcyLjUuMjkuMTUnLFxuXHQnZXh0S2V5VXNhZ2UnOiAnMi41LjI5LjM3J1xufTtcblxuZnVuY3Rpb24gcmVhZChidWYsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiAoYnVmKSA9PT0gJ3N0cmluZycpIHtcblx0XHRidWYgPSBCdWZmZXIuZnJvbShidWYsICdiaW5hcnknKTtcblx0fVxuXHRhc3NlcnQuYnVmZmVyKGJ1ZiwgJ2J1ZicpO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJSZWFkZXIoYnVmKTtcblxuXHRkZXIucmVhZFNlcXVlbmNlKCk7XG5cdGlmIChNYXRoLmFicyhkZXIubGVuZ3RoIC0gZGVyLnJlbWFpbikgPiAxKSB7XG5cdFx0dGhyb3cgKG5ldyBFcnJvcignREVSIHNlcXVlbmNlIGRvZXMgbm90IGNvbnRhaW4gd2hvbGUgYnl0ZSAnICtcblx0XHQgICAgJ3N0cmVhbScpKTtcblx0fVxuXG5cdHZhciB0YnNTdGFydCA9IGRlci5vZmZzZXQ7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0dmFyIHNpZ09mZnNldCA9IGRlci5vZmZzZXQgKyBkZXIubGVuZ3RoO1xuXHR2YXIgdGJzRW5kID0gc2lnT2Zmc2V0O1xuXG5cdGlmIChkZXIucGVlaygpID09PSBMb2NhbCgwKSkge1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoTG9jYWwoMCkpO1xuXHRcdHZhciB2ZXJzaW9uID0gZGVyLnJlYWRJbnQoKTtcblx0XHRhc3NlcnQub2sodmVyc2lvbiA8PSAzLFxuXHRcdCAgICAnb25seSB4LjUwOSB2ZXJzaW9ucyB1cCB0byB2MyBzdXBwb3J0ZWQnKTtcblx0fVxuXG5cdHZhciBjZXJ0ID0ge307XG5cdGNlcnQuc2lnbmF0dXJlcyA9IHt9O1xuXHR2YXIgc2lnID0gKGNlcnQuc2lnbmF0dXJlcy54NTA5ID0ge30pO1xuXHRzaWcuZXh0cmFzID0ge307XG5cblx0Y2VydC5zZXJpYWwgPSByZWFkTVBJbnQoZGVyLCAnc2VyaWFsJyk7XG5cblx0ZGVyLnJlYWRTZXF1ZW5jZSgpO1xuXHR2YXIgYWZ0ZXIgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0dmFyIGNlcnRBbGdPaWQgPSBkZXIucmVhZE9JRCgpO1xuXHR2YXIgY2VydEFsZyA9IFNJR05fQUxHU1tjZXJ0QWxnT2lkXTtcblx0aWYgKGNlcnRBbGcgPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyAobmV3IEVycm9yKCd1bmtub3duIHNpZ25hdHVyZSBhbGdvcml0aG0gJyArIGNlcnRBbGdPaWQpKTtcblxuXHRkZXIuX29mZnNldCA9IGFmdGVyO1xuXHRjZXJ0Lmlzc3VlciA9IElkZW50aXR5LnBhcnNlQXNuMShkZXIpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0Y2VydC52YWxpZEZyb20gPSByZWFkRGF0ZShkZXIpO1xuXHRjZXJ0LnZhbGlkVW50aWwgPSByZWFkRGF0ZShkZXIpO1xuXG5cdGNlcnQuc3ViamVjdHMgPSBbSWRlbnRpdHkucGFyc2VBc24xKGRlcildO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0YWZ0ZXIgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0Y2VydC5zdWJqZWN0S2V5ID0gcGtjczgucmVhZFBrY3M4KHVuZGVmaW5lZCwgJ3B1YmxpYycsIGRlcik7XG5cdGRlci5fb2Zmc2V0ID0gYWZ0ZXI7XG5cblx0LyogaXNzdWVyVW5pcXVlSUQgKi9cblx0aWYgKGRlci5wZWVrKCkgPT09IExvY2FsKDEpKSB7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZShMb2NhbCgxKSk7XG5cdFx0c2lnLmV4dHJhcy5pc3N1ZXJVbmlxdWVJRCA9XG5cdFx0ICAgIGJ1Zi5zbGljZShkZXIub2Zmc2V0LCBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aCk7XG5cdFx0ZGVyLl9vZmZzZXQgKz0gZGVyLmxlbmd0aDtcblx0fVxuXG5cdC8qIHN1YmplY3RVbmlxdWVJRCAqL1xuXHRpZiAoZGVyLnBlZWsoKSA9PT0gTG9jYWwoMikpIHtcblx0XHRkZXIucmVhZFNlcXVlbmNlKExvY2FsKDIpKTtcblx0XHRzaWcuZXh0cmFzLnN1YmplY3RVbmlxdWVJRCA9XG5cdFx0ICAgIGJ1Zi5zbGljZShkZXIub2Zmc2V0LCBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aCk7XG5cdFx0ZGVyLl9vZmZzZXQgKz0gZGVyLmxlbmd0aDtcblx0fVxuXG5cdC8qIGV4dGVuc2lvbnMgKi9cblx0aWYgKGRlci5wZWVrKCkgPT09IExvY2FsKDMpKSB7XG5cdFx0ZGVyLnJlYWRTZXF1ZW5jZShMb2NhbCgzKSk7XG5cdFx0dmFyIGV4dEVuZCA9IGRlci5vZmZzZXQgKyBkZXIubGVuZ3RoO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblxuXHRcdHdoaWxlIChkZXIub2Zmc2V0IDwgZXh0RW5kKVxuXHRcdFx0cmVhZEV4dGVuc2lvbihjZXJ0LCBidWYsIGRlcik7XG5cblx0XHRhc3NlcnQuc3RyaWN0RXF1YWwoZGVyLm9mZnNldCwgZXh0RW5kKTtcblx0fVxuXG5cdGFzc2VydC5zdHJpY3RFcXVhbChkZXIub2Zmc2V0LCBzaWdPZmZzZXQpO1xuXG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0YWZ0ZXIgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0dmFyIHNpZ0FsZ09pZCA9IGRlci5yZWFkT0lEKCk7XG5cdHZhciBzaWdBbGcgPSBTSUdOX0FMR1Nbc2lnQWxnT2lkXTtcblx0aWYgKHNpZ0FsZyA9PT0gdW5kZWZpbmVkKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ3Vua25vd24gc2lnbmF0dXJlIGFsZ29yaXRobSAnICsgc2lnQWxnT2lkKSk7XG5cdGRlci5fb2Zmc2V0ID0gYWZ0ZXI7XG5cblx0dmFyIHNpZ0RhdGEgPSBkZXIucmVhZFN0cmluZyhhc24xLkJlci5CaXRTdHJpbmcsIHRydWUpO1xuXHRpZiAoc2lnRGF0YVswXSA9PT0gMClcblx0XHRzaWdEYXRhID0gc2lnRGF0YS5zbGljZSgxKTtcblx0dmFyIGFsZ1BhcnRzID0gc2lnQWxnLnNwbGl0KCctJyk7XG5cblx0c2lnLnNpZ25hdHVyZSA9IFNpZ25hdHVyZS5wYXJzZShzaWdEYXRhLCBhbGdQYXJ0c1swXSwgJ2FzbjEnKTtcblx0c2lnLnNpZ25hdHVyZS5oYXNoQWxnb3JpdGhtID0gYWxnUGFydHNbMV07XG5cdHNpZy5hbGdvID0gc2lnQWxnO1xuXHRzaWcuY2FjaGUgPSBidWYuc2xpY2UodGJzU3RhcnQsIHRic0VuZCk7XG5cblx0cmV0dXJuIChuZXcgQ2VydGlmaWNhdGUoY2VydCkpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZShkZXIpIHtcblx0aWYgKGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLlVUQ1RpbWUpIHtcblx0XHRyZXR1cm4gKHV0Y1RpbWVUb0RhdGUoZGVyLnJlYWRTdHJpbmcoYXNuMS5CZXIuVVRDVGltZSkpKTtcblx0fSBlbHNlIGlmIChkZXIucGVlaygpID09PSBhc24xLkJlci5HZW5lcmFsaXplZFRpbWUpIHtcblx0XHRyZXR1cm4gKGdUaW1lVG9EYXRlKGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkdlbmVyYWxpemVkVGltZSkpKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyAobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRlIGZvcm1hdCcpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB3cml0ZURhdGUoZGVyLCBkYXRlKSB7XG5cdGlmIChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgPj0gMjA1MCB8fCBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgPCAxOTUwKSB7XG5cdFx0ZGVyLndyaXRlU3RyaW5nKGRhdGVUb0dUaW1lKGRhdGUpLCBhc24xLkJlci5HZW5lcmFsaXplZFRpbWUpO1xuXHR9IGVsc2Uge1xuXHRcdGRlci53cml0ZVN0cmluZyhkYXRlVG9VVENUaW1lKGRhdGUpLCBhc24xLkJlci5VVENUaW1lKTtcblx0fVxufVxuXG4vKiBSRkM1MjgwLCBzZWN0aW9uIDQuMi4xLjYgKEdlbmVyYWxOYW1lIHR5cGUpICovXG52YXIgQUxUTkFNRSA9IHtcblx0T3RoZXJOYW1lOiBMb2NhbCgwKSxcblx0UkZDODIyTmFtZTogQ29udGV4dCgxKSxcblx0RE5TTmFtZTogQ29udGV4dCgyKSxcblx0WDQwMEFkZHJlc3M6IExvY2FsKDMpLFxuXHREaXJlY3RvcnlOYW1lOiBMb2NhbCg0KSxcblx0RURJUGFydHlOYW1lOiBMb2NhbCg1KSxcblx0VVJJOiBDb250ZXh0KDYpLFxuXHRJUEFkZHJlc3M6IENvbnRleHQoNyksXG5cdE9JRDogQ29udGV4dCg4KVxufTtcblxuLyogUkZDNTI4MCwgc2VjdGlvbiA0LjIuMS4xMiAoS2V5UHVycG9zZUlkKSAqL1xudmFyIEVYVFBVUlBPU0UgPSB7XG5cdCdzZXJ2ZXJBdXRoJzogJzEuMy42LjEuNS41LjcuMy4xJyxcblx0J2NsaWVudEF1dGgnOiAnMS4zLjYuMS41LjUuNy4zLjInLFxuXHQnY29kZVNpZ25pbmcnOiAnMS4zLjYuMS41LjUuNy4zLjMnLFxuXG5cdC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L29pZC1kb2NzL2Jsb2IvbWFzdGVyL3Jvb3QubWQgKi9cblx0J2pveWVudERvY2tlcic6ICcxLjMuNi4xLjQuMS4zODY3OC4xLjQuMScsXG5cdCdqb3llbnRDbW9uJzogJzEuMy42LjEuNC4xLjM4Njc4LjEuNC4yJ1xufTtcbnZhciBFWFRQVVJQT1NFX1JFViA9IHt9O1xuT2JqZWN0LmtleXMoRVhUUFVSUE9TRSkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHRFWFRQVVJQT1NFX1JFVltFWFRQVVJQT1NFW2tdXSA9IGs7XG59KTtcblxudmFyIEtFWVVTRUJJVFMgPSBbXG5cdCdzaWduYXR1cmUnLCAnaWRlbnRpdHknLCAna2V5RW5jcnlwdGlvbicsXG5cdCdlbmNyeXB0aW9uJywgJ2tleUFncmVlbWVudCcsICdjYScsICdjcmwnXG5dO1xuXG5mdW5jdGlvbiByZWFkRXh0ZW5zaW9uKGNlcnQsIGJ1ZiwgZGVyKSB7XG5cdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0dmFyIGFmdGVyID0gZGVyLm9mZnNldCArIGRlci5sZW5ndGg7XG5cdHZhciBleHRJZCA9IGRlci5yZWFkT0lEKCk7XG5cdHZhciBpZDtcblx0dmFyIHNpZyA9IGNlcnQuc2lnbmF0dXJlcy54NTA5O1xuXHRpZiAoIXNpZy5leHRyYXMuZXh0cylcblx0XHRzaWcuZXh0cmFzLmV4dHMgPSBbXTtcblxuXHR2YXIgY3JpdGljYWw7XG5cdGlmIChkZXIucGVlaygpID09PSBhc24xLkJlci5Cb29sZWFuKVxuXHRcdGNyaXRpY2FsID0gZGVyLnJlYWRCb29sZWFuKCk7XG5cblx0c3dpdGNoIChleHRJZCkge1xuXHRjYXNlIChFWFRTLmJhc2ljQ29uc3RyYWludHMpOlxuXHRcdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHR2YXIgYmNFbmQgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0XHR2YXIgY2EgPSBmYWxzZTtcblx0XHRpZiAoZGVyLnBlZWsoKSA9PT0gYXNuMS5CZXIuQm9vbGVhbilcblx0XHRcdGNhID0gZGVyLnJlYWRCb29sZWFuKCk7XG5cdFx0aWYgKGNlcnQucHVycG9zZXMgPT09IHVuZGVmaW5lZClcblx0XHRcdGNlcnQucHVycG9zZXMgPSBbXTtcblx0XHRpZiAoY2EgPT09IHRydWUpXG5cdFx0XHRjZXJ0LnB1cnBvc2VzLnB1c2goJ2NhJyk7XG5cdFx0dmFyIGJjID0geyBvaWQ6IGV4dElkLCBjcml0aWNhbDogY3JpdGljYWwgfTtcblx0XHRpZiAoZGVyLm9mZnNldCA8IGJjRW5kICYmIGRlci5wZWVrKCkgPT09IGFzbjEuQmVyLkludGVnZXIpXG5cdFx0XHRiYy5wYXRoTGVuID0gZGVyLnJlYWRJbnQoKTtcblx0XHRzaWcuZXh0cmFzLmV4dHMucHVzaChiYyk7XG5cdFx0YnJlYWs7XG5cdGNhc2UgKEVYVFMuZXh0S2V5VXNhZ2UpOlxuXHRcdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHRpZiAoY2VydC5wdXJwb3NlcyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0Y2VydC5wdXJwb3NlcyA9IFtdO1xuXHRcdHZhciBla0VuZCA9IGRlci5vZmZzZXQgKyBkZXIubGVuZ3RoO1xuXHRcdHdoaWxlIChkZXIub2Zmc2V0IDwgZWtFbmQpIHtcblx0XHRcdHZhciBvaWQgPSBkZXIucmVhZE9JRCgpO1xuXHRcdFx0Y2VydC5wdXJwb3Nlcy5wdXNoKEVYVFBVUlBPU0VfUkVWW29pZF0gfHwgb2lkKTtcblx0XHR9XG5cdFx0Lypcblx0XHQgKiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjazogaW4gdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGNlcnRcblx0XHQgKiB0aGF0J3Mgb25seSBhbGxvd2VkIHRvIGRvIHNlcnZlckF1dGggb3IgY2xpZW50QXV0aCAoYW5kIG5vdFxuXHRcdCAqIHRoZSBvdGhlciksIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGFsbCBvdXIgU3ViamVjdHMgYXJlIG9mXG5cdFx0ICogdGhlIHJpZ2h0IHR5cGUuIEJ1dCB3ZSBhbHJlYWR5IHBhcnNlZCBvdXIgU3ViamVjdHMgYW5kXG5cdFx0ICogZGVjaWRlZCBpZiB0aGV5IHdlcmUgaG9zdHMgb3IgdXNlcnMgZWFybGllciAoc2luY2UgaXQgYXBwZWFyc1xuXHRcdCAqIGZpcnN0IGluIHRoZSBjZXJ0KS5cblx0XHQgKlxuXHRcdCAqIFNvIHdlIGdvIHRocm91Z2ggYW5kIG11dGF0ZSB0aGVtIGludG8gdGhlIHJpZ2h0IGtpbmQgaGVyZSBpZlxuXHRcdCAqIGl0IGRvZXNuJ3QgbWF0Y2guIFRoaXMgbWlnaHQgbm90IGJlIGh1Z2VseSBiZW5lZmljaWFsLCBhcyBpdFxuXHRcdCAqIHNlZW1zIHRoYXQgc2luZ2xlLXB1cnBvc2UgY2VydHMgYXJlIG5vdCBvZnRlbiBzZWVuIGluIHRoZVxuXHRcdCAqIHdpbGQuXG5cdFx0ICovXG5cdFx0aWYgKGNlcnQucHVycG9zZXMuaW5kZXhPZignc2VydmVyQXV0aCcpICE9PSAtMSAmJlxuXHRcdCAgICBjZXJ0LnB1cnBvc2VzLmluZGV4T2YoJ2NsaWVudEF1dGgnKSA9PT0gLTEpIHtcblx0XHRcdGNlcnQuc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoaWRlKSB7XG5cdFx0XHRcdGlmIChpZGUudHlwZSAhPT0gJ2hvc3QnKSB7XG5cdFx0XHRcdFx0aWRlLnR5cGUgPSAnaG9zdCc7XG5cdFx0XHRcdFx0aWRlLmhvc3RuYW1lID0gaWRlLnVpZCB8fFxuXHRcdFx0XHRcdCAgICBpZGUuZW1haWwgfHxcblx0XHRcdFx0XHQgICAgaWRlLmNvbXBvbmVudHNbMF0udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoY2VydC5wdXJwb3Nlcy5pbmRleE9mKCdjbGllbnRBdXRoJykgIT09IC0xICYmXG5cdFx0ICAgIGNlcnQucHVycG9zZXMuaW5kZXhPZignc2VydmVyQXV0aCcpID09PSAtMSkge1xuXHRcdFx0Y2VydC5zdWJqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChpZGUpIHtcblx0XHRcdFx0aWYgKGlkZS50eXBlICE9PSAndXNlcicpIHtcblx0XHRcdFx0XHRpZGUudHlwZSA9ICd1c2VyJztcblx0XHRcdFx0XHRpZGUudWlkID0gaWRlLmhvc3RuYW1lIHx8XG5cdFx0XHRcdFx0ICAgIGlkZS5lbWFpbCB8fFxuXHRcdFx0XHRcdCAgICBpZGUuY29tcG9uZW50c1swXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHNpZy5leHRyYXMuZXh0cy5wdXNoKHsgb2lkOiBleHRJZCwgY3JpdGljYWw6IGNyaXRpY2FsIH0pO1xuXHRcdGJyZWFrO1xuXHRjYXNlIChFWFRTLmtleVVzYWdlKTpcblx0XHRkZXIucmVhZFNlcXVlbmNlKGFzbjEuQmVyLk9jdGV0U3RyaW5nKTtcblx0XHR2YXIgYml0cyA9IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLkJpdFN0cmluZywgdHJ1ZSk7XG5cdFx0dmFyIHNldEJpdHMgPSByZWFkQml0RmllbGQoYml0cywgS0VZVVNFQklUUyk7XG5cdFx0c2V0Qml0cy5mb3JFYWNoKGZ1bmN0aW9uIChiaXQpIHtcblx0XHRcdGlmIChjZXJ0LnB1cnBvc2VzID09PSB1bmRlZmluZWQpXG5cdFx0XHRcdGNlcnQucHVycG9zZXMgPSBbXTtcblx0XHRcdGlmIChjZXJ0LnB1cnBvc2VzLmluZGV4T2YoYml0KSA9PT0gLTEpXG5cdFx0XHRcdGNlcnQucHVycG9zZXMucHVzaChiaXQpO1xuXHRcdH0pO1xuXHRcdHNpZy5leHRyYXMuZXh0cy5wdXNoKHsgb2lkOiBleHRJZCwgY3JpdGljYWw6IGNyaXRpY2FsLFxuXHRcdCAgICBiaXRzOiBiaXRzIH0pO1xuXHRcdGJyZWFrO1xuXHRjYXNlIChFWFRTLmFsdE5hbWUpOlxuXHRcdGRlci5yZWFkU2VxdWVuY2UoYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdGRlci5yZWFkU2VxdWVuY2UoKTtcblx0XHR2YXIgYWVFbmQgPSBkZXIub2Zmc2V0ICsgZGVyLmxlbmd0aDtcblx0XHR3aGlsZSAoZGVyLm9mZnNldCA8IGFlRW5kKSB7XG5cdFx0XHRzd2l0Y2ggKGRlci5wZWVrKCkpIHtcblx0XHRcdGNhc2UgQUxUTkFNRS5PdGhlck5hbWU6XG5cdFx0XHRjYXNlIEFMVE5BTUUuRURJUGFydHlOYW1lOlxuXHRcdFx0XHRkZXIucmVhZFNlcXVlbmNlKCk7XG5cdFx0XHRcdGRlci5fb2Zmc2V0ICs9IGRlci5sZW5ndGg7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBBTFROQU1FLk9JRDpcblx0XHRcdFx0ZGVyLnJlYWRPSUQoQUxUTkFNRS5PSUQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgQUxUTkFNRS5SRkM4MjJOYW1lOlxuXHRcdFx0XHQvKiBSRkM4MjIgc3BlY2lmaWVzIGVtYWlsIGFkZHJlc3NlcyAqL1xuXHRcdFx0XHR2YXIgZW1haWwgPSBkZXIucmVhZFN0cmluZyhBTFROQU1FLlJGQzgyMk5hbWUpO1xuXHRcdFx0XHRpZCA9IElkZW50aXR5LmZvckVtYWlsKGVtYWlsKTtcblx0XHRcdFx0aWYgKCFjZXJ0LnN1YmplY3RzWzBdLmVxdWFscyhpZCkpXG5cdFx0XHRcdFx0Y2VydC5zdWJqZWN0cy5wdXNoKGlkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIEFMVE5BTUUuRGlyZWN0b3J5TmFtZTpcblx0XHRcdFx0ZGVyLnJlYWRTZXF1ZW5jZShBTFROQU1FLkRpcmVjdG9yeU5hbWUpO1xuXHRcdFx0XHRpZCA9IElkZW50aXR5LnBhcnNlQXNuMShkZXIpO1xuXHRcdFx0XHRpZiAoIWNlcnQuc3ViamVjdHNbMF0uZXF1YWxzKGlkKSlcblx0XHRcdFx0XHRjZXJ0LnN1YmplY3RzLnB1c2goaWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgQUxUTkFNRS5ETlNOYW1lOlxuXHRcdFx0XHR2YXIgaG9zdCA9IGRlci5yZWFkU3RyaW5nKFxuXHRcdFx0XHQgICAgQUxUTkFNRS5ETlNOYW1lKTtcblx0XHRcdFx0aWQgPSBJZGVudGl0eS5mb3JIb3N0KGhvc3QpO1xuXHRcdFx0XHRpZiAoIWNlcnQuc3ViamVjdHNbMF0uZXF1YWxzKGlkKSlcblx0XHRcdFx0XHRjZXJ0LnN1YmplY3RzLnB1c2goaWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGRlci5yZWFkU3RyaW5nKGRlci5wZWVrKCkpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0c2lnLmV4dHJhcy5leHRzLnB1c2goeyBvaWQ6IGV4dElkLCBjcml0aWNhbDogY3JpdGljYWwgfSk7XG5cdFx0YnJlYWs7XG5cdGRlZmF1bHQ6XG5cdFx0c2lnLmV4dHJhcy5leHRzLnB1c2goe1xuXHRcdFx0b2lkOiBleHRJZCxcblx0XHRcdGNyaXRpY2FsOiBjcml0aWNhbCxcblx0XHRcdGRhdGE6IGRlci5yZWFkU3RyaW5nKGFzbjEuQmVyLk9jdGV0U3RyaW5nLCB0cnVlKVxuXHRcdH0pO1xuXHRcdGJyZWFrO1xuXHR9XG5cblx0ZGVyLl9vZmZzZXQgPSBhZnRlcjtcbn1cblxudmFyIFVUQ1RJTUVfUkUgPVxuICAgIC9eKFswLTldezJ9KShbMC05XXsyfSkoWzAtOV17Mn0pKFswLTldezJ9KShbMC05XXsyfSkoWzAtOV17Mn0pP1okLztcbmZ1bmN0aW9uIHV0Y1RpbWVUb0RhdGUodCkge1xuXHR2YXIgbSA9IHQubWF0Y2goVVRDVElNRV9SRSk7XG5cdGFzc2VydC5vayhtLCAndGltZXN0YW1wcyBtdXN0IGJlIGluIFVUQycpO1xuXHR2YXIgZCA9IG5ldyBEYXRlKCk7XG5cblx0dmFyIHRoaXNZZWFyID0gZC5nZXRVVENGdWxsWWVhcigpO1xuXHR2YXIgY2VudHVyeSA9IE1hdGguZmxvb3IodGhpc1llYXIgLyAxMDApICogMTAwO1xuXG5cdHZhciB5ZWFyID0gcGFyc2VJbnQobVsxXSwgMTApO1xuXHRpZiAodGhpc1llYXIgJSAxMDAgPCA1MCAmJiB5ZWFyID49IDYwKVxuXHRcdHllYXIgKz0gKGNlbnR1cnkgLSAxKTtcblx0ZWxzZVxuXHRcdHllYXIgKz0gY2VudHVyeTtcblx0ZC5zZXRVVENGdWxsWWVhcih5ZWFyLCBwYXJzZUludChtWzJdLCAxMCkgLSAxLCBwYXJzZUludChtWzNdLCAxMCkpO1xuXHRkLnNldFVUQ0hvdXJzKHBhcnNlSW50KG1bNF0sIDEwKSwgcGFyc2VJbnQobVs1XSwgMTApKTtcblx0aWYgKG1bNl0gJiYgbVs2XS5sZW5ndGggPiAwKVxuXHRcdGQuc2V0VVRDU2Vjb25kcyhwYXJzZUludChtWzZdLCAxMCkpO1xuXHRyZXR1cm4gKGQpO1xufVxuXG52YXIgR1RJTUVfUkUgPVxuICAgIC9eKFswLTldezR9KShbMC05XXsyfSkoWzAtOV17Mn0pKFswLTldezJ9KShbMC05XXsyfSkoWzAtOV17Mn0pP1okLztcbmZ1bmN0aW9uIGdUaW1lVG9EYXRlKHQpIHtcblx0dmFyIG0gPSB0Lm1hdGNoKEdUSU1FX1JFKTtcblx0YXNzZXJ0Lm9rKG0pO1xuXHR2YXIgZCA9IG5ldyBEYXRlKCk7XG5cblx0ZC5zZXRVVENGdWxsWWVhcihwYXJzZUludChtWzFdLCAxMCksIHBhcnNlSW50KG1bMl0sIDEwKSAtIDEsXG5cdCAgICBwYXJzZUludChtWzNdLCAxMCkpO1xuXHRkLnNldFVUQ0hvdXJzKHBhcnNlSW50KG1bNF0sIDEwKSwgcGFyc2VJbnQobVs1XSwgMTApKTtcblx0aWYgKG1bNl0gJiYgbVs2XS5sZW5ndGggPiAwKVxuXHRcdGQuc2V0VVRDU2Vjb25kcyhwYXJzZUludChtWzZdLCAxMCkpO1xuXHRyZXR1cm4gKGQpO1xufVxuXG5mdW5jdGlvbiB6ZXJvUGFkKG4sIG0pIHtcblx0aWYgKG0gPT09IHVuZGVmaW5lZClcblx0XHRtID0gMjtcblx0dmFyIHMgPSAnJyArIG47XG5cdHdoaWxlIChzLmxlbmd0aCA8IG0pXG5cdFx0cyA9ICcwJyArIHM7XG5cdHJldHVybiAocyk7XG59XG5cbmZ1bmN0aW9uIGRhdGVUb1VUQ1RpbWUoZCkge1xuXHR2YXIgcyA9ICcnO1xuXHRzICs9IHplcm9QYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpO1xuXHRzICs9IHplcm9QYWQoZC5nZXRVVENEYXRlKCkpO1xuXHRzICs9IHplcm9QYWQoZC5nZXRVVENIb3VycygpKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDTWludXRlcygpKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDU2Vjb25kcygpKTtcblx0cyArPSAnWic7XG5cdHJldHVybiAocyk7XG59XG5cbmZ1bmN0aW9uIGRhdGVUb0dUaW1lKGQpIHtcblx0dmFyIHMgPSAnJztcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDRnVsbFllYXIoKSwgNCk7XG5cdHMgKz0gemVyb1BhZChkLmdldFVUQ01vbnRoKCkgKyAxKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDRGF0ZSgpKTtcblx0cyArPSB6ZXJvUGFkKGQuZ2V0VVRDSG91cnMoKSk7XG5cdHMgKz0gemVyb1BhZChkLmdldFVUQ01pbnV0ZXMoKSk7XG5cdHMgKz0gemVyb1BhZChkLmdldFVUQ1NlY29uZHMoKSk7XG5cdHMgKz0gJ1onO1xuXHRyZXR1cm4gKHMpO1xufVxuXG5mdW5jdGlvbiBzaWduKGNlcnQsIGtleSkge1xuXHRpZiAoY2VydC5zaWduYXR1cmVzLng1MDkgPT09IHVuZGVmaW5lZClcblx0XHRjZXJ0LnNpZ25hdHVyZXMueDUwOSA9IHt9O1xuXHR2YXIgc2lnID0gY2VydC5zaWduYXR1cmVzLng1MDk7XG5cblx0c2lnLmFsZ28gPSBrZXkudHlwZSArICctJyArIGtleS5kZWZhdWx0SGFzaEFsZ29yaXRobSgpO1xuXHRpZiAoU0lHTl9BTEdTW3NpZy5hbGdvXSA9PT0gdW5kZWZpbmVkKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0d3JpdGVUQlNDZXJ0KGNlcnQsIGRlcik7XG5cdHZhciBibG9iID0gZGVyLmJ1ZmZlcjtcblx0c2lnLmNhY2hlID0gYmxvYjtcblxuXHR2YXIgc2lnbmVyID0ga2V5LmNyZWF0ZVNpZ24oKTtcblx0c2lnbmVyLndyaXRlKGJsb2IpO1xuXHRjZXJ0LnNpZ25hdHVyZXMueDUwOS5zaWduYXR1cmUgPSBzaWduZXIuc2lnbigpO1xuXG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNpZ25Bc3luYyhjZXJ0LCBzaWduZXIsIGRvbmUpIHtcblx0aWYgKGNlcnQuc2lnbmF0dXJlcy54NTA5ID09PSB1bmRlZmluZWQpXG5cdFx0Y2VydC5zaWduYXR1cmVzLng1MDkgPSB7fTtcblx0dmFyIHNpZyA9IGNlcnQuc2lnbmF0dXJlcy54NTA5O1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0d3JpdGVUQlNDZXJ0KGNlcnQsIGRlcik7XG5cdHZhciBibG9iID0gZGVyLmJ1ZmZlcjtcblx0c2lnLmNhY2hlID0gYmxvYjtcblxuXHRzaWduZXIoYmxvYiwgZnVuY3Rpb24gKGVyciwgc2lnbmF0dXJlKSB7XG5cdFx0aWYgKGVycikge1xuXHRcdFx0ZG9uZShlcnIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRzaWcuYWxnbyA9IHNpZ25hdHVyZS50eXBlICsgJy0nICsgc2lnbmF0dXJlLmhhc2hBbGdvcml0aG07XG5cdFx0aWYgKFNJR05fQUxHU1tzaWcuYWxnb10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZG9uZShuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmluZyBhbGdvcml0aG0gXCInICtcblx0XHRcdCAgICBzaWcuYWxnbyArICdcIicpKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0c2lnLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcblx0XHRkb25lKCk7XG5cdH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZShjZXJ0LCBvcHRpb25zKSB7XG5cdHZhciBzaWcgPSBjZXJ0LnNpZ25hdHVyZXMueDUwOTtcblx0YXNzZXJ0Lm9iamVjdChzaWcsICd4NTA5IHNpZ25hdHVyZScpO1xuXG5cdHZhciBkZXIgPSBuZXcgYXNuMS5CZXJXcml0ZXIoKTtcblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblx0aWYgKHNpZy5jYWNoZSkge1xuXHRcdGRlci5fZW5zdXJlKHNpZy5jYWNoZS5sZW5ndGgpO1xuXHRcdHNpZy5jYWNoZS5jb3B5KGRlci5fYnVmLCBkZXIuX29mZnNldCk7XG5cdFx0ZGVyLl9vZmZzZXQgKz0gc2lnLmNhY2hlLmxlbmd0aDtcblx0fSBlbHNlIHtcblx0XHR3cml0ZVRCU0NlcnQoY2VydCwgZGVyKTtcblx0fVxuXG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdGRlci53cml0ZU9JRChTSUdOX0FMR1Nbc2lnLmFsZ29dKTtcblx0aWYgKHNpZy5hbGdvLm1hdGNoKC9ecnNhLS8pKVxuXHRcdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0dmFyIHNpZ0RhdGEgPSBzaWcuc2lnbmF0dXJlLnRvQnVmZmVyKCdhc24xJyk7XG5cdHZhciBkYXRhID0gQnVmZmVyLmFsbG9jKHNpZ0RhdGEubGVuZ3RoICsgMSk7XG5cdGRhdGFbMF0gPSAwO1xuXHRzaWdEYXRhLmNvcHkoZGF0YSwgMSk7XG5cdGRlci53cml0ZUJ1ZmZlcihkYXRhLCBhc24xLkJlci5CaXRTdHJpbmcpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHRyZXR1cm4gKGRlci5idWZmZXIpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVRCU0NlcnQoY2VydCwgZGVyKSB7XG5cdHZhciBzaWcgPSBjZXJ0LnNpZ25hdHVyZXMueDUwOTtcblx0YXNzZXJ0Lm9iamVjdChzaWcsICd4NTA5IHNpZ25hdHVyZScpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoTG9jYWwoMCkpO1xuXHRkZXIud3JpdGVJbnQoMik7XG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xuXG5cdGRlci53cml0ZUJ1ZmZlcih1dGlscy5tcE5vcm1hbGl6ZShjZXJ0LnNlcmlhbCksIGFzbjEuQmVyLkludGVnZXIpO1xuXG5cdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdGRlci53cml0ZU9JRChTSUdOX0FMR1Nbc2lnLmFsZ29dKTtcblx0aWYgKHNpZy5hbGdvLm1hdGNoKC9ecnNhLS8pKVxuXHRcdGRlci53cml0ZU51bGwoKTtcblx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cblx0Y2VydC5pc3N1ZXIudG9Bc24xKGRlcik7XG5cblx0ZGVyLnN0YXJ0U2VxdWVuY2UoKTtcblx0d3JpdGVEYXRlKGRlciwgY2VydC52YWxpZEZyb20pO1xuXHR3cml0ZURhdGUoZGVyLCBjZXJ0LnZhbGlkVW50aWwpO1xuXHRkZXIuZW5kU2VxdWVuY2UoKTtcblxuXHR2YXIgc3ViamVjdCA9IGNlcnQuc3ViamVjdHNbMF07XG5cdHZhciBhbHROYW1lcyA9IGNlcnQuc3ViamVjdHMuc2xpY2UoMSk7XG5cdHN1YmplY3QudG9Bc24xKGRlcik7XG5cblx0cGtjczgud3JpdGVQa2NzOChkZXIsIGNlcnQuc3ViamVjdEtleSk7XG5cblx0aWYgKHNpZy5leHRyYXMgJiYgc2lnLmV4dHJhcy5pc3N1ZXJVbmlxdWVJRCkge1xuXHRcdGRlci53cml0ZUJ1ZmZlcihzaWcuZXh0cmFzLmlzc3VlclVuaXF1ZUlELCBMb2NhbCgxKSk7XG5cdH1cblxuXHRpZiAoc2lnLmV4dHJhcyAmJiBzaWcuZXh0cmFzLnN1YmplY3RVbmlxdWVJRCkge1xuXHRcdGRlci53cml0ZUJ1ZmZlcihzaWcuZXh0cmFzLnN1YmplY3RVbmlxdWVJRCwgTG9jYWwoMikpO1xuXHR9XG5cblx0aWYgKGFsdE5hbWVzLmxlbmd0aCA+IDAgfHwgc3ViamVjdC50eXBlID09PSAnaG9zdCcgfHxcblx0ICAgIChjZXJ0LnB1cnBvc2VzICE9PSB1bmRlZmluZWQgJiYgY2VydC5wdXJwb3Nlcy5sZW5ndGggPiAwKSB8fFxuXHQgICAgKHNpZy5leHRyYXMgJiYgc2lnLmV4dHJhcy5leHRzKSkge1xuXHRcdGRlci5zdGFydFNlcXVlbmNlKExvY2FsKDMpKTtcblx0XHRkZXIuc3RhcnRTZXF1ZW5jZSgpO1xuXG5cdFx0dmFyIGV4dHMgPSBbXTtcblx0XHRpZiAoY2VydC5wdXJwb3NlcyAhPT0gdW5kZWZpbmVkICYmIGNlcnQucHVycG9zZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0ZXh0cy5wdXNoKHtcblx0XHRcdFx0b2lkOiBFWFRTLmJhc2ljQ29uc3RyYWludHMsXG5cdFx0XHRcdGNyaXRpY2FsOiB0cnVlXG5cdFx0XHR9KTtcblx0XHRcdGV4dHMucHVzaCh7XG5cdFx0XHRcdG9pZDogRVhUUy5rZXlVc2FnZSxcblx0XHRcdFx0Y3JpdGljYWw6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0ZXh0cy5wdXNoKHtcblx0XHRcdFx0b2lkOiBFWFRTLmV4dEtleVVzYWdlLFxuXHRcdFx0XHRjcml0aWNhbDogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGV4dHMucHVzaCh7IG9pZDogRVhUUy5hbHROYW1lIH0pO1xuXHRcdGlmIChzaWcuZXh0cmFzICYmIHNpZy5leHRyYXMuZXh0cylcblx0XHRcdGV4dHMgPSBzaWcuZXh0cmFzLmV4dHM7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyArK2kpIHtcblx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRkZXIud3JpdGVPSUQoZXh0c1tpXS5vaWQpO1xuXG5cdFx0XHRpZiAoZXh0c1tpXS5jcml0aWNhbCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRkZXIud3JpdGVCb29sZWFuKGV4dHNbaV0uY3JpdGljYWwpO1xuXG5cdFx0XHRpZiAoZXh0c1tpXS5vaWQgPT09IEVYVFMuYWx0TmFtZSkge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRcdGlmIChzdWJqZWN0LnR5cGUgPT09ICdob3N0Jykge1xuXHRcdFx0XHRcdGRlci53cml0ZVN0cmluZyhzdWJqZWN0Lmhvc3RuYW1lLFxuXHRcdFx0XHRcdCAgICBDb250ZXh0KDIpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGFsdE5hbWVzLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdFx0aWYgKGFsdE5hbWVzW2pdLnR5cGUgPT09ICdob3N0Jykge1xuXHRcdFx0XHRcdFx0ZGVyLndyaXRlU3RyaW5nKFxuXHRcdFx0XHRcdFx0ICAgIGFsdE5hbWVzW2pdLmhvc3RuYW1lLFxuXHRcdFx0XHRcdFx0ICAgIEFMVE5BTUUuRE5TTmFtZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbHROYW1lc1tqXS50eXBlID09PVxuXHRcdFx0XHRcdCAgICAnZW1haWwnKSB7XG5cdFx0XHRcdFx0XHRkZXIud3JpdGVTdHJpbmcoXG5cdFx0XHRcdFx0XHQgICAgYWx0TmFtZXNbal0uZW1haWwsXG5cdFx0XHRcdFx0XHQgICAgQUxUTkFNRS5SRkM4MjJOYW1lKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdCAqIEVuY29kZSBhbnl0aGluZyBlbHNlIGFzIGFcblx0XHRcdFx0XHRcdCAqIEROIHN0eWxlIG5hbWUgZm9yIG5vdy5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0ZGVyLnN0YXJ0U2VxdWVuY2UoXG5cdFx0XHRcdFx0XHQgICAgQUxUTkFNRS5EaXJlY3RvcnlOYW1lKTtcblx0XHRcdFx0XHRcdGFsdE5hbWVzW2pdLnRvQXNuMShkZXIpO1xuXHRcdFx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGRlci5lbmRTZXF1ZW5jZSgpO1xuXHRcdFx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRcdH0gZWxzZSBpZiAoZXh0c1tpXS5vaWQgPT09IEVYVFMuYmFzaWNDb25zdHJhaW50cykge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRcdHZhciBjYSA9IChjZXJ0LnB1cnBvc2VzLmluZGV4T2YoJ2NhJykgIT09IC0xKTtcblx0XHRcdFx0dmFyIHBhdGhMZW4gPSBleHRzW2ldLnBhdGhMZW47XG5cdFx0XHRcdGRlci53cml0ZUJvb2xlYW4oY2EpO1xuXHRcdFx0XHRpZiAocGF0aExlbiAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRcdGRlci53cml0ZUludChwYXRoTGVuKTtcblx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHRcdGRlci5lbmRTZXF1ZW5jZSgpO1xuXHRcdFx0fSBlbHNlIGlmIChleHRzW2ldLm9pZCA9PT0gRVhUUy5leHRLZXlVc2FnZSkge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdGRlci5zdGFydFNlcXVlbmNlKCk7XG5cdFx0XHRcdGNlcnQucHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAocHVycG9zZSkge1xuXHRcdFx0XHRcdGlmIChwdXJwb3NlID09PSAnY2EnKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdGlmIChLRVlVU0VCSVRTLmluZGV4T2YocHVycG9zZSkgIT09IC0xKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdHZhciBvaWQgPSBwdXJwb3NlO1xuXHRcdFx0XHRcdGlmIChFWFRQVVJQT1NFW3B1cnBvc2VdICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRvaWQgPSBFWFRQVVJQT1NFW3B1cnBvc2VdO1xuXHRcdFx0XHRcdGRlci53cml0ZU9JRChvaWQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHRcdGRlci5lbmRTZXF1ZW5jZSgpO1xuXHRcdFx0fSBlbHNlIGlmIChleHRzW2ldLm9pZCA9PT0gRVhUUy5rZXlVc2FnZSkge1xuXHRcdFx0XHRkZXIuc3RhcnRTZXF1ZW5jZShhc24xLkJlci5PY3RldFN0cmluZyk7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdCAqIElmIHdlIHBhcnNlZCB0aGlzIGNlcnRpZmljYXRlIGZyb20gYSBieXRlXG5cdFx0XHRcdCAqIHN0cmVhbSAoaS5lLiB3ZSBkaWRuJ3QgZ2VuZXJhdGUgaXQgaW4gc3NocGspXG5cdFx0XHRcdCAqIHRoZW4gd2UnbGwgaGF2ZSBhIFwiLmJpdHNcIiBwcm9wZXJ0eSBvbiB0aGVcblx0XHRcdFx0ICogZXh0IHdpdGggdGhlIG9yaWdpbmFsIHJhdyBieXRlIGNvbnRlbnRzLlxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKiBJZiB3ZSBoYXZlIHRoaXMsIHVzZSBpdCBoZXJlIGluc3RlYWQgb2Zcblx0XHRcdFx0ICogcmVnZW5lcmF0aW5nIGl0LiBUaGlzIGd1YXJhbnRlZXMgd2Ugb3V0cHV0XG5cdFx0XHRcdCAqIHRoZSBzYW1lIGRhdGEgd2UgcGFyc2VkLCBzbyBzaWduYXR1cmVzIHN0aWxsXG5cdFx0XHRcdCAqIHZhbGlkYXRlLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKGV4dHNbaV0uYml0cyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0ZGVyLndyaXRlQnVmZmVyKGV4dHNbaV0uYml0cyxcblx0XHRcdFx0XHQgICAgYXNuMS5CZXIuQml0U3RyaW5nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgYml0cyA9IHdyaXRlQml0RmllbGQoY2VydC5wdXJwb3Nlcyxcblx0XHRcdFx0XHQgICAgS0VZVVNFQklUUyk7XG5cdFx0XHRcdFx0ZGVyLndyaXRlQnVmZmVyKGJpdHMsXG5cdFx0XHRcdFx0ICAgIGFzbjEuQmVyLkJpdFN0cmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVyLmVuZFNlcXVlbmNlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZXIud3JpdGVCdWZmZXIoZXh0c1tpXS5kYXRhLFxuXHRcdFx0XHQgICAgYXNuMS5CZXIuT2N0ZXRTdHJpbmcpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHR9XG5cblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0XHRkZXIuZW5kU2VxdWVuY2UoKTtcblx0fVxuXG5cdGRlci5lbmRTZXF1ZW5jZSgpO1xufVxuXG4vKlxuICogUmVhZHMgYW4gQVNOLjEgQkVSIGJpdGZpZWxkIG91dCBvZiB0aGUgQnVmZmVyIHByb2R1Y2VkIGJ5IGRvaW5nXG4gKiBgQmVyUmVhZGVyI3JlYWRTdHJpbmcoYXNuMS5CZXIuQml0U3RyaW5nKWAuIFRoYXQgZnVuY3Rpb24gZ2l2ZXMgdXMgdGhlIHJhd1xuICogY29udGVudHMgb2YgdGhlIEJpdFN0cmluZyB0YWcsIHdoaWNoIGlzIGEgY291bnQgb2YgdW51c2VkIGJpdHMgZm9sbG93ZWQgYnlcbiAqIHRoZSBiaXRzIGFzIGEgcmlnaHQtcGFkZGVkIGJ5dGUgc3RyaW5nLlxuICpcbiAqIGBiaXRzYCBpcyB0aGUgQnVmZmVyLCBgYml0SW5kZXhgIHNob3VsZCBjb250YWluIGFuIGFycmF5IG9mIHN0cmluZyBuYW1lc1xuICogZm9yIHRoZSBiaXRzIGluIHRoZSBzdHJpbmcsIG9yZGVyZWQgc3RhcnRpbmcgd2l0aCBiaXQgIzAgaW4gdGhlIEFTTi4xIHNwZWMuXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBTdHJpbmdzLCB0aGUgbmFtZXMgb2YgdGhlIGJpdHMgdGhhdCB3ZXJlIHNldCB0byAxLlxuICovXG5mdW5jdGlvbiByZWFkQml0RmllbGQoYml0cywgYml0SW5kZXgpIHtcblx0dmFyIGJpdExlbiA9IDggKiAoYml0cy5sZW5ndGggLSAxKSAtIGJpdHNbMF07XG5cdHZhciBzZXRCaXRzID0ge307XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYml0TGVuOyArK2kpIHtcblx0XHR2YXIgYnl0ZU4gPSAxICsgTWF0aC5mbG9vcihpIC8gOCk7XG5cdFx0dmFyIGJpdCA9IDcgLSAoaSAlIDgpO1xuXHRcdHZhciBtYXNrID0gMSA8PCBiaXQ7XG5cdFx0dmFyIGJpdFZhbCA9ICgoYml0c1tieXRlTl0gJiBtYXNrKSAhPT0gMCk7XG5cdFx0dmFyIG5hbWUgPSBiaXRJbmRleFtpXTtcblx0XHRpZiAoYml0VmFsICYmIHR5cGVvZiAobmFtZSkgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRzZXRCaXRzW25hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIChPYmplY3Qua2V5cyhzZXRCaXRzKSk7XG59XG5cbi8qXG4gKiBgc2V0Qml0c2AgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgY29udGFpbmluZyB0aGUgbmFtZXMgZm9yIGVhY2ggYml0IHRoYXRcbiAqIHNvdWxkIGJlIHNldCB0byAxLiBgYml0SW5kZXhgIGlzIHNhbWUgYXMgaW4gYHJlYWRCaXRGaWVsZCgpYC5cbiAqXG4gKiBSZXR1cm5zIGEgQnVmZmVyLCByZWFkeSB0byBiZSB3cml0dGVuIG91dCB3aXRoIGBCZXJXcml0ZXIjd3JpdGVTdHJpbmcoKWAuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQml0RmllbGQoc2V0Qml0cywgYml0SW5kZXgpIHtcblx0dmFyIGJpdExlbiA9IGJpdEluZGV4Lmxlbmd0aDtcblx0dmFyIGJsZW4gPSBNYXRoLmNlaWwoYml0TGVuIC8gOCk7XG5cdHZhciB1bnVzZWQgPSBibGVuICogOCAtIGJpdExlbjtcblx0dmFyIGJpdHMgPSBCdWZmZXIuYWxsb2MoMSArIGJsZW4pOyAvLyB6ZXJvLWZpbGxlZFxuXHRiaXRzWzBdID0gdW51c2VkO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGJpdExlbjsgKytpKSB7XG5cdFx0dmFyIGJ5dGVOID0gMSArIE1hdGguZmxvb3IoaSAvIDgpO1xuXHRcdHZhciBiaXQgPSA3IC0gKGkgJSA4KTtcblx0XHR2YXIgbWFzayA9IDEgPDwgYml0O1xuXHRcdHZhciBuYW1lID0gYml0SW5kZXhbaV07XG5cdFx0aWYgKG5hbWUgPT09IHVuZGVmaW5lZClcblx0XHRcdGNvbnRpbnVlO1xuXHRcdHZhciBiaXRWYWwgPSAoc2V0Qml0cy5pbmRleE9mKG5hbWUpICE9PSAtMSk7XG5cdFx0aWYgKGJpdFZhbCkge1xuXHRcdFx0Yml0c1tieXRlTl0gfD0gbWFzaztcblx0XHR9XG5cdH1cblx0cmV0dXJuIChiaXRzKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNiBKb3llbnQsIEluYy5cblxudmFyIHg1MDkgPSByZXF1aXJlKCcuL3g1MDknKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJlYWQ6IHJlYWQsXG5cdHZlcmlmeTogeDUwOS52ZXJpZnksXG5cdHNpZ246IHg1MDkuc2lnbixcblx0d3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0LXBsdXMnKTtcbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMScpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi4vYWxncycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBLZXkgPSByZXF1aXJlKCcuLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi4vcHJpdmF0ZS1rZXknKTtcbnZhciBwZW0gPSByZXF1aXJlKCcuL3BlbScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi4vaWRlbnRpdHknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuLi9zaWduYXR1cmUnKTtcbnZhciBDZXJ0aWZpY2F0ZSA9IHJlcXVpcmUoJy4uL2NlcnRpZmljYXRlJyk7XG5cbmZ1bmN0aW9uIHJlYWQoYnVmLCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgKGJ1ZikgIT09ICdzdHJpbmcnKSB7XG5cdFx0YXNzZXJ0LmJ1ZmZlcihidWYsICdidWYnKTtcblx0XHRidWYgPSBidWYudG9TdHJpbmcoJ2FzY2lpJyk7XG5cdH1cblxuXHR2YXIgbGluZXMgPSBidWYudHJpbSgpLnNwbGl0KC9bXFxyXFxuXSsvZyk7XG5cblx0dmFyIG07XG5cdHZhciBzaSA9IC0xO1xuXHR3aGlsZSAoIW0gJiYgc2kgPCBsaW5lcy5sZW5ndGgpIHtcblx0XHRtID0gbGluZXNbKytzaV0ubWF0Y2goLypKU1NUWUxFRCovXG5cdFx0ICAgIC9bLV0rWyBdKkJFR0lOIENFUlRJRklDQVRFWyBdKlstXSsvKTtcblx0fVxuXHRhc3NlcnQub2sobSwgJ2ludmFsaWQgUEVNIGhlYWRlcicpO1xuXG5cdHZhciBtMjtcblx0dmFyIGVpID0gbGluZXMubGVuZ3RoO1xuXHR3aGlsZSAoIW0yICYmIGVpID4gMCkge1xuXHRcdG0yID0gbGluZXNbLS1laV0ubWF0Y2goLypKU1NUWUxFRCovXG5cdFx0ICAgIC9bLV0rWyBdKkVORCBDRVJUSUZJQ0FURVsgXSpbLV0rLyk7XG5cdH1cblx0YXNzZXJ0Lm9rKG0yLCAnaW52YWxpZCBQRU0gZm9vdGVyJyk7XG5cblx0bGluZXMgPSBsaW5lcy5zbGljZShzaSwgZWkgKyAxKTtcblxuXHR2YXIgaGVhZGVycyA9IHt9O1xuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdGxpbmVzID0gbGluZXMuc2xpY2UoMSk7XG5cdFx0bSA9IGxpbmVzWzBdLm1hdGNoKC8qSlNTVFlMRUQqL1xuXHRcdCAgICAvXihbQS1aYS16MC05LV0rKTogKC4rKSQvKTtcblx0XHRpZiAoIW0pXG5cdFx0XHRicmVhaztcblx0XHRoZWFkZXJzW21bMV0udG9Mb3dlckNhc2UoKV0gPSBtWzJdO1xuXHR9XG5cblx0LyogQ2hvcCBvZmYgdGhlIGZpcnN0IGFuZCBsYXN0IGxpbmVzICovXG5cdGxpbmVzID0gbGluZXMuc2xpY2UoMCwgLTEpLmpvaW4oJycpO1xuXHRidWYgPSBCdWZmZXIuZnJvbShsaW5lcywgJ2Jhc2U2NCcpO1xuXG5cdHJldHVybiAoeDUwOS5yZWFkKGJ1Ziwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiB3cml0ZShjZXJ0LCBvcHRpb25zKSB7XG5cdHZhciBkYnVmID0geDUwOS53cml0ZShjZXJ0LCBvcHRpb25zKTtcblxuXHR2YXIgaGVhZGVyID0gJ0NFUlRJRklDQVRFJztcblx0dmFyIHRtcCA9IGRidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHR2YXIgbGVuID0gdG1wLmxlbmd0aCArICh0bXAubGVuZ3RoIC8gNjQpICtcblx0ICAgIDE4ICsgMTYgKyBoZWFkZXIubGVuZ3RoKjIgKyAxMDtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyhsZW4pO1xuXHR2YXIgbyA9IDA7XG5cdG8gKz0gYnVmLndyaXRlKCctLS0tLUJFR0lOICcgKyBoZWFkZXIgKyAnLS0tLS1cXG4nLCBvKTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyApIHtcblx0XHR2YXIgbGltaXQgPSBpICsgNjQ7XG5cdFx0aWYgKGxpbWl0ID4gdG1wLmxlbmd0aClcblx0XHRcdGxpbWl0ID0gdG1wLmxlbmd0aDtcblx0XHRvICs9IGJ1Zi53cml0ZSh0bXAuc2xpY2UoaSwgbGltaXQpLCBvKTtcblx0XHRidWZbbysrXSA9IDEwO1xuXHRcdGkgPSBsaW1pdDtcblx0fVxuXHRvICs9IGJ1Zi53cml0ZSgnLS0tLS1FTkQgJyArIGhlYWRlciArICctLS0tLVxcbicsIG8pO1xuXG5cdHJldHVybiAoYnVmLnNsaWNlKDAsIG8pKTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxNiBKb3llbnQsIEluYy5cblxubW9kdWxlLmV4cG9ydHMgPSBDZXJ0aWZpY2F0ZTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xudmFyIGFsZ3MgPSByZXF1aXJlKCcuL2FsZ3MnKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBGaW5nZXJwcmludCA9IHJlcXVpcmUoJy4vZmluZ2VycHJpbnQnKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xudmFyIGVycnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG52YXIgZm9ybWF0cyA9IHt9O1xuZm9ybWF0c1snb3BlbnNzaCddID0gcmVxdWlyZSgnLi9mb3JtYXRzL29wZW5zc2gtY2VydCcpO1xuZm9ybWF0c1sneDUwOSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3g1MDknKTtcbmZvcm1hdHNbJ3BlbSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3g1MDktcGVtJyk7XG5cbnZhciBDZXJ0aWZpY2F0ZVBhcnNlRXJyb3IgPSBlcnJzLkNlcnRpZmljYXRlUGFyc2VFcnJvcjtcbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcjtcblxuZnVuY3Rpb24gQ2VydGlmaWNhdGUob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KG9wdHMuc3ViamVjdHMsICdvcHRpb25zLnN1YmplY3RzJyk7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUob3B0cy5zdWJqZWN0c1swXSwgSWRlbnRpdHksIFsxLCAwXSxcblx0ICAgICdvcHRpb25zLnN1YmplY3RzJyk7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUob3B0cy5zdWJqZWN0S2V5LCBLZXksIFsxLCAwXSxcblx0ICAgICdvcHRpb25zLnN1YmplY3RLZXknKTtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShvcHRzLmlzc3VlciwgSWRlbnRpdHksIFsxLCAwXSwgJ29wdGlvbnMuaXNzdWVyJyk7XG5cdGlmIChvcHRzLmlzc3VlcktleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShvcHRzLmlzc3VlcktleSwgS2V5LCBbMSwgMF0sXG5cdFx0ICAgICdvcHRpb25zLmlzc3VlcktleScpO1xuXHR9XG5cdGFzc2VydC5vYmplY3Qob3B0cy5zaWduYXR1cmVzLCAnb3B0aW9ucy5zaWduYXR1cmVzJyk7XG5cdGFzc2VydC5idWZmZXIob3B0cy5zZXJpYWwsICdvcHRpb25zLnNlcmlhbCcpO1xuXHRhc3NlcnQuZGF0ZShvcHRzLnZhbGlkRnJvbSwgJ29wdGlvbnMudmFsaWRGcm9tJyk7XG5cdGFzc2VydC5kYXRlKG9wdHMudmFsaWRVbnRpbCwgJ29wdG9ucy52YWxpZFVudGlsJyk7XG5cblx0YXNzZXJ0Lm9wdGlvbmFsQXJyYXlPZlN0cmluZyhvcHRzLnB1cnBvc2VzLCAnb3B0aW9ucy5wdXJwb3NlcycpO1xuXG5cdHRoaXMuX2hhc2hDYWNoZSA9IHt9O1xuXG5cdHRoaXMuc3ViamVjdHMgPSBvcHRzLnN1YmplY3RzO1xuXHR0aGlzLmlzc3VlciA9IG9wdHMuaXNzdWVyO1xuXHR0aGlzLnN1YmplY3RLZXkgPSBvcHRzLnN1YmplY3RLZXk7XG5cdHRoaXMuaXNzdWVyS2V5ID0gb3B0cy5pc3N1ZXJLZXk7XG5cdHRoaXMuc2lnbmF0dXJlcyA9IG9wdHMuc2lnbmF0dXJlcztcblx0dGhpcy5zZXJpYWwgPSBvcHRzLnNlcmlhbDtcblx0dGhpcy52YWxpZEZyb20gPSBvcHRzLnZhbGlkRnJvbTtcblx0dGhpcy52YWxpZFVudGlsID0gb3B0cy52YWxpZFVudGlsO1xuXHR0aGlzLnB1cnBvc2VzID0gb3B0cy5wdXJwb3Nlcztcbn1cblxuQ2VydGlmaWNhdGUuZm9ybWF0cyA9IGZvcm1hdHM7XG5cbkNlcnRpZmljYXRlLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uIChmb3JtYXQsIG9wdGlvbnMpIHtcblx0aWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKVxuXHRcdGZvcm1hdCA9ICd4NTA5Jztcblx0YXNzZXJ0LnN0cmluZyhmb3JtYXQsICdmb3JtYXQnKTtcblx0YXNzZXJ0Lm9iamVjdChmb3JtYXRzW2Zvcm1hdF0sICdmb3JtYXRzW2Zvcm1hdF0nKTtcblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cblx0cmV0dXJuIChmb3JtYXRzW2Zvcm1hdF0ud3JpdGUodGhpcywgb3B0aW9ucykpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ3BlbSc7XG5cdHJldHVybiAodGhpcy50b0J1ZmZlcihmb3JtYXQsIG9wdGlvbnMpLnRvU3RyaW5nKCkpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmZpbmdlcnByaW50ID0gZnVuY3Rpb24gKGFsZ28pIHtcblx0aWYgKGFsZ28gPT09IHVuZGVmaW5lZClcblx0XHRhbGdvID0gJ3NoYTI1Nic7XG5cdGFzc2VydC5zdHJpbmcoYWxnbywgJ2FsZ29yaXRobScpO1xuXHR2YXIgb3B0cyA9IHtcblx0XHR0eXBlOiAnY2VydGlmaWNhdGUnLFxuXHRcdGhhc2g6IHRoaXMuaGFzaChhbGdvKSxcblx0XHRhbGdvcml0aG06IGFsZ29cblx0fTtcblx0cmV0dXJuIChuZXcgRmluZ2VycHJpbnQob3B0cykpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoYWxnbykge1xuXHRhc3NlcnQuc3RyaW5nKGFsZ28sICdhbGdvcml0aG0nKTtcblx0YWxnbyA9IGFsZ28udG9Mb3dlckNhc2UoKTtcblx0aWYgKGFsZ3MuaGFzaEFsZ3NbYWxnb10gPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcihhbGdvKSk7XG5cblx0aWYgKHRoaXMuX2hhc2hDYWNoZVthbGdvXSlcblx0XHRyZXR1cm4gKHRoaXMuX2hhc2hDYWNoZVthbGdvXSk7XG5cblx0dmFyIGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvKS5cblx0ICAgIHVwZGF0ZSh0aGlzLnRvQnVmZmVyKCd4NTA5JykpLmRpZ2VzdCgpO1xuXHR0aGlzLl9oYXNoQ2FjaGVbYWxnb10gPSBoYXNoO1xuXHRyZXR1cm4gKGhhc2gpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmlzRXhwaXJlZCA9IGZ1bmN0aW9uICh3aGVuKSB7XG5cdGlmICh3aGVuID09PSB1bmRlZmluZWQpXG5cdFx0d2hlbiA9IG5ldyBEYXRlKCk7XG5cdHJldHVybiAoISgod2hlbi5nZXRUaW1lKCkgPj0gdGhpcy52YWxpZEZyb20uZ2V0VGltZSgpKSAmJlxuXHRcdCh3aGVuLmdldFRpbWUoKSA8IHRoaXMudmFsaWRVbnRpbC5nZXRUaW1lKCkpKSk7XG59O1xuXG5DZXJ0aWZpY2F0ZS5wcm90b3R5cGUuaXNTaWduZWRCeSA9IGZ1bmN0aW9uIChpc3N1ZXJDZXJ0KSB7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUoaXNzdWVyQ2VydCwgQ2VydGlmaWNhdGUsIFsxLCAwXSwgJ2lzc3VlcicpO1xuXG5cdGlmICghdGhpcy5pc3N1ZXIuZXF1YWxzKGlzc3VlckNlcnQuc3ViamVjdHNbMF0pKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXHRpZiAodGhpcy5pc3N1ZXIucHVycG9zZXMgJiYgdGhpcy5pc3N1ZXIucHVycG9zZXMubGVuZ3RoID4gMCAmJlxuXHQgICAgdGhpcy5pc3N1ZXIucHVycG9zZXMuaW5kZXhPZignY2EnKSA9PT0gLTEpIHtcblx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdHJldHVybiAodGhpcy5pc1NpZ25lZEJ5S2V5KGlzc3VlckNlcnQuc3ViamVjdEtleSkpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmdldEV4dGVuc2lvbiA9IGZ1bmN0aW9uIChrZXlPck9pZCkge1xuXHRhc3NlcnQuc3RyaW5nKGtleU9yT2lkLCAna2V5T3JPaWQnKTtcblx0dmFyIGV4dCA9IHRoaXMuZ2V0RXh0ZW5zaW9ucygpLmZpbHRlcihmdW5jdGlvbiAobWF5YmVFeHQpIHtcblx0XHRpZiAobWF5YmVFeHQuZm9ybWF0ID09PSAneDUwOScpXG5cdFx0XHRyZXR1cm4gKG1heWJlRXh0Lm9pZCA9PT0ga2V5T3JPaWQpO1xuXHRcdGlmIChtYXliZUV4dC5mb3JtYXQgPT09ICdvcGVuc3NoJylcblx0XHRcdHJldHVybiAobWF5YmVFeHQubmFtZSA9PT0ga2V5T3JPaWQpO1xuXHRcdHJldHVybiAoZmFsc2UpO1xuXHR9KVswXTtcblx0cmV0dXJuIChleHQpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmdldEV4dGVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBleHRzID0gW107XG5cdHZhciB4NTA5ID0gdGhpcy5zaWduYXR1cmVzLng1MDk7XG5cdGlmICh4NTA5ICYmIHg1MDkuZXh0cmFzICYmIHg1MDkuZXh0cmFzLmV4dHMpIHtcblx0XHR4NTA5LmV4dHJhcy5leHRzLmZvckVhY2goZnVuY3Rpb24gKGV4dCkge1xuXHRcdFx0ZXh0LmZvcm1hdCA9ICd4NTA5Jztcblx0XHRcdGV4dHMucHVzaChleHQpO1xuXHRcdH0pO1xuXHR9XG5cdHZhciBvcGVuc3NoID0gdGhpcy5zaWduYXR1cmVzLm9wZW5zc2g7XG5cdGlmIChvcGVuc3NoICYmIG9wZW5zc2guZXh0cykge1xuXHRcdG9wZW5zc2guZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChleHQpIHtcblx0XHRcdGV4dC5mb3JtYXQgPSAnb3BlbnNzaCc7XG5cdFx0XHRleHRzLnB1c2goZXh0KTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gKGV4dHMpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLmlzU2lnbmVkQnlLZXkgPSBmdW5jdGlvbiAoaXNzdWVyS2V5KSB7XG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUoaXNzdWVyS2V5LCBLZXksIFsxLCAyXSwgJ2lzc3VlcktleScpO1xuXG5cdGlmICh0aGlzLmlzc3VlcktleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuICh0aGlzLmlzc3VlcktleS5cblx0XHQgICAgZmluZ2VycHJpbnQoJ3NoYTUxMicpLm1hdGNoZXMoaXNzdWVyS2V5KSk7XG5cdH1cblxuXHR2YXIgZm10ID0gT2JqZWN0LmtleXModGhpcy5zaWduYXR1cmVzKVswXTtcblx0dmFyIHZhbGlkID0gZm9ybWF0c1tmbXRdLnZlcmlmeSh0aGlzLCBpc3N1ZXJLZXkpO1xuXHRpZiAodmFsaWQpXG5cdFx0dGhpcy5pc3N1ZXJLZXkgPSBpc3N1ZXJLZXk7XG5cdHJldHVybiAodmFsaWQpO1xufTtcblxuQ2VydGlmaWNhdGUucHJvdG90eXBlLnNpZ25XaXRoID0gZnVuY3Rpb24gKGtleSkge1xuXHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKGtleSwgUHJpdmF0ZUtleSwgWzEsIDJdLCAna2V5Jyk7XG5cdHZhciBmbXRzID0gT2JqZWN0LmtleXMoZm9ybWF0cyk7XG5cdHZhciBkaWRPbmUgPSBmYWxzZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBmbXRzLmxlbmd0aDsgKytpKSB7XG5cdFx0aWYgKGZtdHNbaV0gIT09ICdwZW0nKSB7XG5cdFx0XHR2YXIgcmV0ID0gZm9ybWF0c1tmbXRzW2ldXS5zaWduKHRoaXMsIGtleSk7XG5cdFx0XHRpZiAocmV0ID09PSB0cnVlKVxuXHRcdFx0XHRkaWRPbmUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRpZiAoIWRpZE9uZSkge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzaWduIHRoZSBjZXJ0aWZpY2F0ZSBmb3IgYW55ICcgK1xuXHRcdCAgICAnYXZhaWxhYmxlIGNlcnRpZmljYXRlIGZvcm1hdHMnKSk7XG5cdH1cbn07XG5cbkNlcnRpZmljYXRlLmNyZWF0ZVNlbGZTaWduZWQgPSBmdW5jdGlvbiAoc3ViamVjdE9yU3ViamVjdHMsIGtleSwgb3B0aW9ucykge1xuXHR2YXIgc3ViamVjdHM7XG5cdGlmIChBcnJheS5pc0FycmF5KHN1YmplY3RPclN1YmplY3RzKSlcblx0XHRzdWJqZWN0cyA9IHN1YmplY3RPclN1YmplY3RzO1xuXHRlbHNlXG5cdFx0c3ViamVjdHMgPSBbc3ViamVjdE9yU3ViamVjdHNdO1xuXG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KHN1YmplY3RzKTtcblx0c3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoc3ViamVjdCkge1xuXHRcdHV0aWxzLmFzc2VydENvbXBhdGlibGUoc3ViamVjdCwgSWRlbnRpdHksIFsxLCAwXSwgJ3N1YmplY3QnKTtcblx0fSk7XG5cblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShrZXksIFByaXZhdGVLZXksIFsxLCAyXSwgJ3ByaXZhdGUga2V5Jyk7XG5cblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucy52YWxpZEZyb20sICdvcHRpb25zLnZhbGlkRnJvbScpO1xuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucy52YWxpZFVudGlsLCAnb3B0aW9ucy52YWxpZFVudGlsJyk7XG5cdHZhciB2YWxpZEZyb20gPSBvcHRpb25zLnZhbGlkRnJvbTtcblx0dmFyIHZhbGlkVW50aWwgPSBvcHRpb25zLnZhbGlkVW50aWw7XG5cdGlmICh2YWxpZEZyb20gPT09IHVuZGVmaW5lZClcblx0XHR2YWxpZEZyb20gPSBuZXcgRGF0ZSgpO1xuXHRpZiAodmFsaWRVbnRpbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YXNzZXJ0Lm9wdGlvbmFsTnVtYmVyKG9wdGlvbnMubGlmZXRpbWUsICdvcHRpb25zLmxpZmV0aW1lJyk7XG5cdFx0dmFyIGxpZmV0aW1lID0gb3B0aW9ucy5saWZldGltZTtcblx0XHRpZiAobGlmZXRpbWUgPT09IHVuZGVmaW5lZClcblx0XHRcdGxpZmV0aW1lID0gMTAqMzY1KjI0KjM2MDA7XG5cdFx0dmFsaWRVbnRpbCA9IG5ldyBEYXRlKCk7XG5cdFx0dmFsaWRVbnRpbC5zZXRUaW1lKHZhbGlkVW50aWwuZ2V0VGltZSgpICsgbGlmZXRpbWUqMTAwMCk7XG5cdH1cblx0YXNzZXJ0Lm9wdGlvbmFsQnVmZmVyKG9wdGlvbnMuc2VyaWFsLCAnb3B0aW9ucy5zZXJpYWwnKTtcblx0dmFyIHNlcmlhbCA9IG9wdGlvbnMuc2VyaWFsO1xuXHRpZiAoc2VyaWFsID09PSB1bmRlZmluZWQpXG5cdFx0c2VyaWFsID0gQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDEnLCAnaGV4Jyk7XG5cblx0dmFyIHB1cnBvc2VzID0gb3B0aW9ucy5wdXJwb3Nlcztcblx0aWYgKHB1cnBvc2VzID09PSB1bmRlZmluZWQpXG5cdFx0cHVycG9zZXMgPSBbXTtcblxuXHRpZiAocHVycG9zZXMuaW5kZXhPZignc2lnbmF0dXJlJykgPT09IC0xKVxuXHRcdHB1cnBvc2VzLnB1c2goJ3NpZ25hdHVyZScpO1xuXG5cdC8qIFNlbGYtc2lnbmVkIGNlcnRzIGFyZSBhbHdheXMgQ0FzLiAqL1xuXHRpZiAocHVycG9zZXMuaW5kZXhPZignY2EnKSA9PT0gLTEpXG5cdFx0cHVycG9zZXMucHVzaCgnY2EnKTtcblx0aWYgKHB1cnBvc2VzLmluZGV4T2YoJ2NybCcpID09PSAtMSlcblx0XHRwdXJwb3Nlcy5wdXNoKCdjcmwnKTtcblxuXHQvKlxuXHQgKiBJZiB3ZSB3ZXJlbid0IGV4cGxpY2l0bHkgZ2l2ZW4gYW55IG90aGVyIHB1cnBvc2VzLCBkbyB0aGUgc2Vuc2libGVcblx0ICogdGhpbmcgYW5kIGFkZCBzb21lIGJhc2ljIG9uZXMgZGVwZW5kaW5nIG9uIHRoZSBzdWJqZWN0IHR5cGUuXG5cdCAqL1xuXHRpZiAocHVycG9zZXMubGVuZ3RoIDw9IDMpIHtcblx0XHR2YXIgaG9zdFN1YmplY3RzID0gc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG5cdFx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ2hvc3QnKTtcblx0XHR9KTtcblx0XHR2YXIgdXNlclN1YmplY3RzID0gc3ViamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChzdWJqZWN0KSB7XG5cdFx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ3VzZXInKTtcblx0XHR9KTtcblx0XHRpZiAoaG9zdFN1YmplY3RzLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdzZXJ2ZXJBdXRoJykgPT09IC0xKVxuXHRcdFx0XHRwdXJwb3Nlcy5wdXNoKCdzZXJ2ZXJBdXRoJyk7XG5cdFx0fVxuXHRcdGlmICh1c2VyU3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHB1cnBvc2VzLmluZGV4T2YoJ2NsaWVudEF1dGgnKSA9PT0gLTEpXG5cdFx0XHRcdHB1cnBvc2VzLnB1c2goJ2NsaWVudEF1dGgnKTtcblx0XHR9XG5cdFx0aWYgKHVzZXJTdWJqZWN0cy5sZW5ndGggPiAwIHx8IGhvc3RTdWJqZWN0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAocHVycG9zZXMuaW5kZXhPZigna2V5QWdyZWVtZW50JykgPT09IC0xKVxuXHRcdFx0XHRwdXJwb3Nlcy5wdXNoKCdrZXlBZ3JlZW1lbnQnKTtcblx0XHRcdGlmIChrZXkudHlwZSA9PT0gJ3JzYScgJiZcblx0XHRcdCAgICBwdXJwb3Nlcy5pbmRleE9mKCdlbmNyeXB0aW9uJykgPT09IC0xKVxuXHRcdFx0XHRwdXJwb3Nlcy5wdXNoKCdlbmNyeXB0aW9uJyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIGNlcnQgPSBuZXcgQ2VydGlmaWNhdGUoe1xuXHRcdHN1YmplY3RzOiBzdWJqZWN0cyxcblx0XHRpc3N1ZXI6IHN1YmplY3RzWzBdLFxuXHRcdHN1YmplY3RLZXk6IGtleS50b1B1YmxpYygpLFxuXHRcdGlzc3VlcktleToga2V5LnRvUHVibGljKCksXG5cdFx0c2lnbmF0dXJlczoge30sXG5cdFx0c2VyaWFsOiBzZXJpYWwsXG5cdFx0dmFsaWRGcm9tOiB2YWxpZEZyb20sXG5cdFx0dmFsaWRVbnRpbDogdmFsaWRVbnRpbCxcblx0XHRwdXJwb3NlczogcHVycG9zZXNcblx0fSk7XG5cdGNlcnQuc2lnbldpdGgoa2V5KTtcblxuXHRyZXR1cm4gKGNlcnQpO1xufTtcblxuQ2VydGlmaWNhdGUuY3JlYXRlID1cbiAgICBmdW5jdGlvbiAoc3ViamVjdE9yU3ViamVjdHMsIGtleSwgaXNzdWVyLCBpc3N1ZXJLZXksIG9wdGlvbnMpIHtcblx0dmFyIHN1YmplY3RzO1xuXHRpZiAoQXJyYXkuaXNBcnJheShzdWJqZWN0T3JTdWJqZWN0cykpXG5cdFx0c3ViamVjdHMgPSBzdWJqZWN0T3JTdWJqZWN0cztcblx0ZWxzZVxuXHRcdHN1YmplY3RzID0gW3N1YmplY3RPclN1YmplY3RzXTtcblxuXHRhc3NlcnQuYXJyYXlPZk9iamVjdChzdWJqZWN0cyk7XG5cdHN1YmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHN1YmplY3QpIHtcblx0XHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKHN1YmplY3QsIElkZW50aXR5LCBbMSwgMF0sICdzdWJqZWN0Jyk7XG5cdH0pO1xuXG5cdHV0aWxzLmFzc2VydENvbXBhdGlibGUoa2V5LCBLZXksIFsxLCAwXSwgJ2tleScpO1xuXHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkoa2V5KSlcblx0XHRrZXkgPSBrZXkudG9QdWJsaWMoKTtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShpc3N1ZXIsIElkZW50aXR5LCBbMSwgMF0sICdpc3N1ZXInKTtcblx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShpc3N1ZXJLZXksIFByaXZhdGVLZXksIFsxLCAyXSwgJ2lzc3VlciBrZXknKTtcblxuXHRhc3NlcnQub3B0aW9uYWxPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKTtcblx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zID0ge307XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLnZhbGlkRnJvbSwgJ29wdGlvbnMudmFsaWRGcm9tJyk7XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLnZhbGlkVW50aWwsICdvcHRpb25zLnZhbGlkVW50aWwnKTtcblx0dmFyIHZhbGlkRnJvbSA9IG9wdGlvbnMudmFsaWRGcm9tO1xuXHR2YXIgdmFsaWRVbnRpbCA9IG9wdGlvbnMudmFsaWRVbnRpbDtcblx0aWYgKHZhbGlkRnJvbSA9PT0gdW5kZWZpbmVkKVxuXHRcdHZhbGlkRnJvbSA9IG5ldyBEYXRlKCk7XG5cdGlmICh2YWxpZFVudGlsID09PSB1bmRlZmluZWQpIHtcblx0XHRhc3NlcnQub3B0aW9uYWxOdW1iZXIob3B0aW9ucy5saWZldGltZSwgJ29wdGlvbnMubGlmZXRpbWUnKTtcblx0XHR2YXIgbGlmZXRpbWUgPSBvcHRpb25zLmxpZmV0aW1lO1xuXHRcdGlmIChsaWZldGltZSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0bGlmZXRpbWUgPSAxMCozNjUqMjQqMzYwMDtcblx0XHR2YWxpZFVudGlsID0gbmV3IERhdGUoKTtcblx0XHR2YWxpZFVudGlsLnNldFRpbWUodmFsaWRVbnRpbC5nZXRUaW1lKCkgKyBsaWZldGltZSoxMDAwKTtcblx0fVxuXHRhc3NlcnQub3B0aW9uYWxCdWZmZXIob3B0aW9ucy5zZXJpYWwsICdvcHRpb25zLnNlcmlhbCcpO1xuXHR2YXIgc2VyaWFsID0gb3B0aW9ucy5zZXJpYWw7XG5cdGlmIChzZXJpYWwgPT09IHVuZGVmaW5lZClcblx0XHRzZXJpYWwgPSBCdWZmZXIuZnJvbSgnMDAwMDAwMDAwMDAwMDAwMScsICdoZXgnKTtcblxuXHR2YXIgcHVycG9zZXMgPSBvcHRpb25zLnB1cnBvc2VzO1xuXHRpZiAocHVycG9zZXMgPT09IHVuZGVmaW5lZClcblx0XHRwdXJwb3NlcyA9IFtdO1xuXG5cdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdzaWduYXR1cmUnKSA9PT0gLTEpXG5cdFx0cHVycG9zZXMucHVzaCgnc2lnbmF0dXJlJyk7XG5cblx0aWYgKG9wdGlvbnMuY2EgPT09IHRydWUpIHtcblx0XHRpZiAocHVycG9zZXMuaW5kZXhPZignY2EnKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdjYScpO1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdjcmwnKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdjcmwnKTtcblx0fVxuXG5cdHZhciBob3N0U3ViamVjdHMgPSBzdWJqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHN1YmplY3QpIHtcblx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ2hvc3QnKTtcblx0fSk7XG5cdHZhciB1c2VyU3ViamVjdHMgPSBzdWJqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKHN1YmplY3QpIHtcblx0XHRyZXR1cm4gKHN1YmplY3QudHlwZSA9PT0gJ3VzZXInKTtcblx0fSk7XG5cdGlmIChob3N0U3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdzZXJ2ZXJBdXRoJykgPT09IC0xKVxuXHRcdFx0cHVycG9zZXMucHVzaCgnc2VydmVyQXV0aCcpO1xuXHR9XG5cdGlmICh1c2VyU3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdjbGllbnRBdXRoJykgPT09IC0xKVxuXHRcdFx0cHVycG9zZXMucHVzaCgnY2xpZW50QXV0aCcpO1xuXHR9XG5cdGlmICh1c2VyU3ViamVjdHMubGVuZ3RoID4gMCB8fCBob3N0U3ViamVjdHMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwdXJwb3Nlcy5pbmRleE9mKCdrZXlBZ3JlZW1lbnQnKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdrZXlBZ3JlZW1lbnQnKTtcblx0XHRpZiAoa2V5LnR5cGUgPT09ICdyc2EnICYmXG5cdFx0ICAgIHB1cnBvc2VzLmluZGV4T2YoJ2VuY3J5cHRpb24nKSA9PT0gLTEpXG5cdFx0XHRwdXJwb3Nlcy5wdXNoKCdlbmNyeXB0aW9uJyk7XG5cdH1cblxuXHR2YXIgY2VydCA9IG5ldyBDZXJ0aWZpY2F0ZSh7XG5cdFx0c3ViamVjdHM6IHN1YmplY3RzLFxuXHRcdGlzc3VlcjogaXNzdWVyLFxuXHRcdHN1YmplY3RLZXk6IGtleSxcblx0XHRpc3N1ZXJLZXk6IGlzc3VlcktleS50b1B1YmxpYygpLFxuXHRcdHNpZ25hdHVyZXM6IHt9LFxuXHRcdHNlcmlhbDogc2VyaWFsLFxuXHRcdHZhbGlkRnJvbTogdmFsaWRGcm9tLFxuXHRcdHZhbGlkVW50aWw6IHZhbGlkVW50aWwsXG5cdFx0cHVycG9zZXM6IHB1cnBvc2VzXG5cdH0pO1xuXHRjZXJ0LnNpZ25XaXRoKGlzc3VlcktleSk7XG5cblx0cmV0dXJuIChjZXJ0KTtcbn07XG5cbkNlcnRpZmljYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRhdGEsIGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIChkYXRhKSAhPT0gJ3N0cmluZycpXG5cdFx0YXNzZXJ0LmJ1ZmZlcihkYXRhLCAnZGF0YScpO1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ2F1dG8nO1xuXHRhc3NlcnQuc3RyaW5nKGZvcm1hdCwgJ2Zvcm1hdCcpO1xuXHRpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpXG5cdFx0b3B0aW9ucyA9IHsgZmlsZW5hbWU6IG9wdGlvbnMgfTtcblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0aW9ucy5maWxlbmFtZSwgJ29wdGlvbnMuZmlsZW5hbWUnKTtcblx0aWYgKG9wdGlvbnMuZmlsZW5hbWUgPT09IHVuZGVmaW5lZClcblx0XHRvcHRpb25zLmZpbGVuYW1lID0gJyh1bm5hbWVkKSc7XG5cblx0YXNzZXJ0Lm9iamVjdChmb3JtYXRzW2Zvcm1hdF0sICdmb3JtYXRzW2Zvcm1hdF0nKTtcblxuXHR0cnkge1xuXHRcdHZhciBrID0gZm9ybWF0c1tmb3JtYXRdLnJlYWQoZGF0YSwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIChrKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHRocm93IChuZXcgQ2VydGlmaWNhdGVQYXJzZUVycm9yKG9wdGlvbnMuZmlsZW5hbWUsIGZvcm1hdCwgZSkpO1xuXHR9XG59O1xuXG5DZXJ0aWZpY2F0ZS5pc0NlcnRpZmljYXRlID0gZnVuY3Rpb24gKG9iaiwgdmVyKSB7XG5cdHJldHVybiAodXRpbHMuaXNDb21wYXRpYmxlKG9iaiwgQ2VydGlmaWNhdGUsIHZlcikpO1xufTtcblxuLypcbiAqIEFQSSB2ZXJzaW9ucyBmb3IgQ2VydGlmaWNhdGU6XG4gKiBbMSwwXSAtLSBpbml0aWFsIHZlclxuICogWzEsMV0gLS0gb3BlbnNzaCBmb3JtYXQgbm93IHVucGFja3MgZXh0ZW5zaW9uc1xuICovXG5DZXJ0aWZpY2F0ZS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsxLCAxXTtcblxuQ2VydGlmaWNhdGUuX29sZFZlcnNpb25EZXRlY3QgPSBmdW5jdGlvbiAob2JqKSB7XG5cdHJldHVybiAoWzEsIDBdKTtcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTggSm95ZW50LCBJbmMuXG5cbm1vZHVsZS5leHBvcnRzID0gRmluZ2VycHJpbnQ7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBhbGdzID0gcmVxdWlyZSgnLi9hbGdzJyk7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgZXJycyA9IHJlcXVpcmUoJy4vZXJyb3JzJyk7XG52YXIgS2V5ID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgRmluZ2VycHJpbnRGb3JtYXRFcnJvciA9IGVycnMuRmluZ2VycHJpbnRGb3JtYXRFcnJvcjtcbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcjtcblxuZnVuY3Rpb24gRmluZ2VycHJpbnQob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5zdHJpbmcob3B0cy50eXBlLCAnb3B0aW9ucy50eXBlJyk7XG5cdGFzc2VydC5idWZmZXIob3B0cy5oYXNoLCAnb3B0aW9ucy5oYXNoJyk7XG5cdGFzc2VydC5zdHJpbmcob3B0cy5hbGdvcml0aG0sICdvcHRpb25zLmFsZ29yaXRobScpO1xuXG5cdHRoaXMuYWxnb3JpdGhtID0gb3B0cy5hbGdvcml0aG0udG9Mb3dlckNhc2UoKTtcblx0aWYgKGFsZ3MuaGFzaEFsZ3NbdGhpcy5hbGdvcml0aG1dICE9PSB0cnVlKVxuXHRcdHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKHRoaXMuYWxnb3JpdGhtKSk7XG5cblx0dGhpcy5oYXNoID0gb3B0cy5oYXNoO1xuXHR0aGlzLnR5cGUgPSBvcHRzLnR5cGU7XG5cdHRoaXMuaGFzaFR5cGUgPSBvcHRzLmhhc2hUeXBlO1xufVxuXG5GaW5nZXJwcmludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoZm9ybWF0KSB7XG5cdGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuXHRcdGlmICh0aGlzLmFsZ29yaXRobSA9PT0gJ21kNScgfHwgdGhpcy5oYXNoVHlwZSA9PT0gJ3Nwa2knKVxuXHRcdFx0Zm9ybWF0ID0gJ2hleCc7XG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybWF0ID0gJ2Jhc2U2NCc7XG5cdH1cblx0YXNzZXJ0LnN0cmluZyhmb3JtYXQpO1xuXG5cdHN3aXRjaCAoZm9ybWF0KSB7XG5cdGNhc2UgJ2hleCc6XG5cdFx0aWYgKHRoaXMuaGFzaFR5cGUgPT09ICdzcGtpJylcblx0XHRcdHJldHVybiAodGhpcy5oYXNoLnRvU3RyaW5nKCdoZXgnKSk7XG5cdFx0cmV0dXJuIChhZGRDb2xvbnModGhpcy5oYXNoLnRvU3RyaW5nKCdoZXgnKSkpO1xuXHRjYXNlICdiYXNlNjQnOlxuXHRcdGlmICh0aGlzLmhhc2hUeXBlID09PSAnc3BraScpXG5cdFx0XHRyZXR1cm4gKHRoaXMuaGFzaC50b1N0cmluZygnYmFzZTY0JykpO1xuXHRcdHJldHVybiAoc3NoQmFzZTY0Rm9ybWF0KHRoaXMuYWxnb3JpdGhtLFxuXHRcdCAgICB0aGlzLmhhc2gudG9TdHJpbmcoJ2Jhc2U2NCcpKSk7XG5cdGRlZmF1bHQ6XG5cdFx0dGhyb3cgKG5ldyBGaW5nZXJwcmludEZvcm1hdEVycm9yKHVuZGVmaW5lZCwgZm9ybWF0KSk7XG5cdH1cbn07XG5cbkZpbmdlcnByaW50LnByb3RvdHlwZS5tYXRjaGVzID0gZnVuY3Rpb24gKG90aGVyKSB7XG5cdGFzc2VydC5vYmplY3Qob3RoZXIsICdrZXkgb3IgY2VydGlmaWNhdGUnKTtcblx0aWYgKHRoaXMudHlwZSA9PT0gJ2tleScgJiYgdGhpcy5oYXNoVHlwZSAhPT0gJ3NzaCcpIHtcblx0XHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKG90aGVyLCBLZXksIFsxLCA3XSwgJ2tleSB3aXRoIHNwa2knKTtcblx0XHRpZiAoUHJpdmF0ZUtleS5pc1ByaXZhdGVLZXkob3RoZXIpKSB7XG5cdFx0XHR1dGlscy5hc3NlcnRDb21wYXRpYmxlKG90aGVyLCBQcml2YXRlS2V5LCBbMSwgNl0sXG5cdFx0XHQgICAgJ3ByaXZhdGVrZXkgd2l0aCBzcGtpIHN1cHBvcnQnKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAna2V5Jykge1xuXHRcdHV0aWxzLmFzc2VydENvbXBhdGlibGUob3RoZXIsIEtleSwgWzEsIDBdLCAna2V5Jyk7XG5cdH0gZWxzZSB7XG5cdFx0dXRpbHMuYXNzZXJ0Q29tcGF0aWJsZShvdGhlciwgQ2VydGlmaWNhdGUsIFsxLCAwXSxcblx0XHQgICAgJ2NlcnRpZmljYXRlJyk7XG5cdH1cblxuXHR2YXIgdGhlaXJIYXNoID0gb3RoZXIuaGFzaCh0aGlzLmFsZ29yaXRobSwgdGhpcy5oYXNoVHlwZSk7XG5cdHZhciB0aGVpckhhc2gyID0gY3J5cHRvLmNyZWF0ZUhhc2godGhpcy5hbGdvcml0aG0pLlxuXHQgICAgdXBkYXRlKHRoZWlySGFzaCkuZGlnZXN0KCdiYXNlNjQnKTtcblxuXHRpZiAodGhpcy5oYXNoMiA9PT0gdW5kZWZpbmVkKVxuXHRcdHRoaXMuaGFzaDIgPSBjcnlwdG8uY3JlYXRlSGFzaCh0aGlzLmFsZ29yaXRobSkuXG5cdFx0ICAgIHVwZGF0ZSh0aGlzLmhhc2gpLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cblx0cmV0dXJuICh0aGlzLmhhc2gyID09PSB0aGVpckhhc2gyKTtcbn07XG5cbi8qSlNTVFlMRUQqL1xudmFyIGJhc2U2NFJFID0gL15bQS1aYS16MC05K1xcLz1dKyQvO1xuLypKU1NUWUxFRCovXG52YXIgaGV4UkUgPSAvXlthLWZBLUYwLTldKyQvO1xuXG5GaW5nZXJwcmludC5wYXJzZSA9IGZ1bmN0aW9uIChmcCwgb3B0aW9ucykge1xuXHRhc3NlcnQuc3RyaW5nKGZwLCAnZmluZ2VycHJpbnQnKTtcblxuXHR2YXIgYWxnLCBoYXNoLCBlbkFsZ3M7XG5cdGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7XG5cdFx0ZW5BbGdzID0gb3B0aW9ucztcblx0XHRvcHRpb25zID0ge307XG5cdH1cblx0YXNzZXJ0Lm9wdGlvbmFsT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG5cdGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRpZiAob3B0aW9ucy5lbkFsZ3MgIT09IHVuZGVmaW5lZClcblx0XHRlbkFsZ3MgPSBvcHRpb25zLmVuQWxncztcblx0aWYgKG9wdGlvbnMuYWxnb3JpdGhtcyAhPT0gdW5kZWZpbmVkKVxuXHRcdGVuQWxncyA9IG9wdGlvbnMuYWxnb3JpdGhtcztcblx0YXNzZXJ0Lm9wdGlvbmFsQXJyYXlPZlN0cmluZyhlbkFsZ3MsICdhbGdvcml0aG1zJyk7XG5cblx0dmFyIGhhc2hUeXBlID0gJ3NzaCc7XG5cdGlmIChvcHRpb25zLmhhc2hUeXBlICE9PSB1bmRlZmluZWQpXG5cdFx0aGFzaFR5cGUgPSBvcHRpb25zLmhhc2hUeXBlO1xuXHRhc3NlcnQuc3RyaW5nKGhhc2hUeXBlLCAnb3B0aW9ucy5oYXNoVHlwZScpO1xuXG5cdHZhciBwYXJ0cyA9IGZwLnNwbGl0KCc6Jyk7XG5cdGlmIChwYXJ0cy5sZW5ndGggPT0gMikge1xuXHRcdGFsZyA9IHBhcnRzWzBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKCFiYXNlNjRSRS50ZXN0KHBhcnRzWzFdKSlcblx0XHRcdHRocm93IChuZXcgRmluZ2VycHJpbnRGb3JtYXRFcnJvcihmcCkpO1xuXHRcdHRyeSB7XG5cdFx0XHRoYXNoID0gQnVmZmVyLmZyb20ocGFydHNbMV0sICdiYXNlNjQnKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHR0aHJvdyAobmV3IEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnApKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID4gMikge1xuXHRcdGFsZyA9ICdtZDUnO1xuXHRcdGlmIChwYXJ0c1swXS50b0xvd2VyQ2FzZSgpID09PSAnbWQ1Jylcblx0XHRcdHBhcnRzID0gcGFydHMuc2xpY2UoMSk7XG5cdFx0cGFydHMgPSBwYXJ0cy5tYXAoZnVuY3Rpb24gKHApIHtcblx0XHRcdHdoaWxlIChwLmxlbmd0aCA8IDIpXG5cdFx0XHRcdHAgPSAnMCcgKyBwO1xuXHRcdFx0aWYgKHAubGVuZ3RoID4gMilcblx0XHRcdFx0dGhyb3cgKG5ldyBGaW5nZXJwcmludEZvcm1hdEVycm9yKGZwKSk7XG5cdFx0XHRyZXR1cm4gKHApO1xuXHRcdH0pO1xuXHRcdHBhcnRzID0gcGFydHMuam9pbignJyk7XG5cdFx0aWYgKCFoZXhSRS50ZXN0KHBhcnRzKSB8fCBwYXJ0cy5sZW5ndGggJSAyICE9PSAwKVxuXHRcdFx0dGhyb3cgKG5ldyBGaW5nZXJwcmludEZvcm1hdEVycm9yKGZwKSk7XG5cdFx0dHJ5IHtcblx0XHRcdGhhc2ggPSBCdWZmZXIuZnJvbShwYXJ0cywgJ2hleCcpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRocm93IChuZXcgRmluZ2VycHJpbnRGb3JtYXRFcnJvcihmcCkpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoaGV4UkUudGVzdChmcCkpIHtcblx0XHRcdGhhc2ggPSBCdWZmZXIuZnJvbShmcCwgJ2hleCcpO1xuXHRcdH0gZWxzZSBpZiAoYmFzZTY0UkUudGVzdChmcCkpIHtcblx0XHRcdGhhc2ggPSBCdWZmZXIuZnJvbShmcCwgJ2Jhc2U2NCcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyAobmV3IEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnApKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGhhc2gubGVuZ3RoKSB7XG5cdFx0Y2FzZSAzMjpcblx0XHRcdGFsZyA9ICdzaGEyNTYnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAxNjpcblx0XHRcdGFsZyA9ICdtZDUnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMDpcblx0XHRcdGFsZyA9ICdzaGExJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgNjQ6XG5cdFx0XHRhbGcgPSAnc2hhNTEyJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyAobmV3IEZpbmdlcnByaW50Rm9ybWF0RXJyb3IoZnApKTtcblx0XHR9XG5cblx0XHQvKiBQbGFpbiBoZXgvYmFzZTY0OiBndWVzcyBpdCdzIHByb2JhYmx5IFNQS0kgdW5sZXNzIHRvbGQuICovXG5cdFx0aWYgKG9wdGlvbnMuaGFzaFR5cGUgPT09IHVuZGVmaW5lZClcblx0XHRcdGhhc2hUeXBlID0gJ3Nwa2knO1xuXHR9XG5cblx0aWYgKGFsZyA9PT0gdW5kZWZpbmVkKVxuXHRcdHRocm93IChuZXcgRmluZ2VycHJpbnRGb3JtYXRFcnJvcihmcCkpO1xuXG5cdGlmIChhbGdzLmhhc2hBbGdzW2FsZ10gPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcihhbGcpKTtcblxuXHRpZiAoZW5BbGdzICE9PSB1bmRlZmluZWQpIHtcblx0XHRlbkFsZ3MgPSBlbkFsZ3MubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLnRvTG93ZXJDYXNlKCk7IH0pO1xuXHRcdGlmIChlbkFsZ3MuaW5kZXhPZihhbGcpID09PSAtMSlcblx0XHRcdHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKGFsZykpO1xuXHR9XG5cblx0cmV0dXJuIChuZXcgRmluZ2VycHJpbnQoe1xuXHRcdGFsZ29yaXRobTogYWxnLFxuXHRcdGhhc2g6IGhhc2gsXG5cdFx0dHlwZTogb3B0aW9ucy50eXBlIHx8ICdrZXknLFxuXHRcdGhhc2hUeXBlOiBoYXNoVHlwZVxuXHR9KSk7XG59O1xuXG5mdW5jdGlvbiBhZGRDb2xvbnMocykge1xuXHQvKkpTU1RZTEVEKi9cblx0cmV0dXJuIChzLnJlcGxhY2UoLyguezJ9KSg/PS4pL2csICckMTonKSk7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFN0cmlwKHMpIHtcblx0LypKU1NUWUxFRCovXG5cdHJldHVybiAocy5yZXBsYWNlKC89KiQvLCAnJykpO1xufVxuXG5mdW5jdGlvbiBzc2hCYXNlNjRGb3JtYXQoYWxnLCBoKSB7XG5cdHJldHVybiAoYWxnLnRvVXBwZXJDYXNlKCkgKyAnOicgKyBiYXNlNjRTdHJpcChoKSk7XG59XG5cbkZpbmdlcnByaW50LmlzRmluZ2VycHJpbnQgPSBmdW5jdGlvbiAob2JqLCB2ZXIpIHtcblx0cmV0dXJuICh1dGlscy5pc0NvbXBhdGlibGUob2JqLCBGaW5nZXJwcmludCwgdmVyKSk7XG59O1xuXG4vKlxuICogQVBJIHZlcnNpb25zIGZvciBGaW5nZXJwcmludDpcbiAqIFsxLDBdIC0tIGluaXRpYWwgdmVyXG4gKiBbMSwxXSAtLSBmaXJzdCB0YWdnZWQgdmVyXG4gKiBbMSwyXSAtLSBoYXNoVHlwZSBhbmQgc3BraSBzdXBwb3J0XG4gKi9cbkZpbmdlcnByaW50LnByb3RvdHlwZS5fc3NocGtBcGlWZXJzaW9uID0gWzEsIDJdO1xuXG5GaW5nZXJwcmludC5fb2xkVmVyc2lvbkRldGVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0YXNzZXJ0LmZ1bmMob2JqLnRvU3RyaW5nKTtcblx0YXNzZXJ0LmZ1bmMob2JqLm1hdGNoZXMpO1xuXHRyZXR1cm4gKFsxLCAwXSk7XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDE4IEpveWVudCwgSW5jLlxuXG5tb2R1bGUuZXhwb3J0cyA9IEtleTtcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgYWxncyA9IHJlcXVpcmUoJy4vYWxncycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIEZpbmdlcnByaW50ID0gcmVxdWlyZSgnLi9maW5nZXJwcmludCcpO1xudmFyIFNpZ25hdHVyZSA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgRGlmZmllSGVsbG1hbiA9IHJlcXVpcmUoJy4vZGhlJykuRGlmZmllSGVsbG1hbjtcbnZhciBlcnJzID0gcmVxdWlyZSgnLi9lcnJvcnMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIGVkQ29tcGF0O1xuXG50cnkge1xuXHRlZENvbXBhdCA9IHJlcXVpcmUoJy4vZWQtY29tcGF0Jyk7XG59IGNhdGNoIChlKSB7XG5cdC8qIEp1c3QgY29udGludWUgdGhyb3VnaCwgYW5kIGJhaWwgb3V0IGlmIHdlIHRyeSB0byB1c2UgaXQuICovXG59XG5cbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcjtcbnZhciBLZXlQYXJzZUVycm9yID0gZXJycy5LZXlQYXJzZUVycm9yO1xuXG52YXIgZm9ybWF0cyA9IHt9O1xuZm9ybWF0c1snYXV0byddID0gcmVxdWlyZSgnLi9mb3JtYXRzL2F1dG8nKTtcbmZvcm1hdHNbJ3BlbSddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3BlbScpO1xuZm9ybWF0c1sncGtjczEnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wa2NzMScpO1xuZm9ybWF0c1sncGtjczgnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wa2NzOCcpO1xuZm9ybWF0c1sncmZjNDI1MyddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3JmYzQyNTMnKTtcbmZvcm1hdHNbJ3NzaCddID0gcmVxdWlyZSgnLi9mb3JtYXRzL3NzaCcpO1xuZm9ybWF0c1snc3NoLXByaXZhdGUnXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9zc2gtcHJpdmF0ZScpO1xuZm9ybWF0c1snb3BlbnNzaCddID0gZm9ybWF0c1snc3NoLXByaXZhdGUnXTtcbmZvcm1hdHNbJ2Ruc3NlYyddID0gcmVxdWlyZSgnLi9mb3JtYXRzL2Ruc3NlYycpO1xuZm9ybWF0c1sncHV0dHknXSA9IHJlcXVpcmUoJy4vZm9ybWF0cy9wdXR0eScpO1xuZm9ybWF0c1sncHBrJ10gPSBmb3JtYXRzWydwdXR0eSddO1xuXG5mdW5jdGlvbiBLZXkob3B0cykge1xuXHRhc3NlcnQub2JqZWN0KG9wdHMsICdvcHRpb25zJyk7XG5cdGFzc2VydC5hcnJheU9mT2JqZWN0KG9wdHMucGFydHMsICdvcHRpb25zLnBhcnRzJyk7XG5cdGFzc2VydC5zdHJpbmcob3B0cy50eXBlLCAnb3B0aW9ucy50eXBlJyk7XG5cdGFzc2VydC5vcHRpb25hbFN0cmluZyhvcHRzLmNvbW1lbnQsICdvcHRpb25zLmNvbW1lbnQnKTtcblxuXHR2YXIgYWxnSW5mbyA9IGFsZ3MuaW5mb1tvcHRzLnR5cGVdO1xuXHRpZiAodHlwZW9mIChhbGdJbmZvKSAhPT0gJ29iamVjdCcpXG5cdFx0dGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3Iob3B0cy50eXBlKSk7XG5cblx0dmFyIHBhcnRMb29rdXAgPSB7fTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBvcHRzLnBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdFx0dmFyIHBhcnQgPSBvcHRzLnBhcnRzW2ldO1xuXHRcdHBhcnRMb29rdXBbcGFydC5uYW1lXSA9IHBhcnQ7XG5cdH1cblxuXHR0aGlzLnR5cGUgPSBvcHRzLnR5cGU7XG5cdHRoaXMucGFydHMgPSBvcHRzLnBhcnRzO1xuXHR0aGlzLnBhcnQgPSBwYXJ0TG9va3VwO1xuXHR0aGlzLmNvbW1lbnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMuc291cmNlID0gb3B0cy5zb3VyY2U7XG5cblx0LyogZm9yIHNwZWVkaW5nIHVwIGhhc2hpbmcvZmluZ2VycHJpbnQgb3BlcmF0aW9ucyAqL1xuXHR0aGlzLl9yZmM0MjUzQ2FjaGUgPSBvcHRzLl9yZmM0MjUzQ2FjaGU7XG5cdHRoaXMuX2hhc2hDYWNoZSA9IHt9O1xuXG5cdHZhciBzejtcblx0dGhpcy5jdXJ2ZSA9IHVuZGVmaW5lZDtcblx0aWYgKHRoaXMudHlwZSA9PT0gJ2VjZHNhJykge1xuXHRcdHZhciBjdXJ2ZSA9IHRoaXMucGFydC5jdXJ2ZS5kYXRhLnRvU3RyaW5nKCk7XG5cdFx0dGhpcy5jdXJ2ZSA9IGN1cnZlO1xuXHRcdHN6ID0gYWxncy5jdXJ2ZXNbY3VydmVdLnNpemU7XG5cdH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnZWQyNTUxOScgfHwgdGhpcy50eXBlID09PSAnY3VydmUyNTUxOScpIHtcblx0XHRzeiA9IDI1Njtcblx0XHR0aGlzLmN1cnZlID0gJ2N1cnZlMjU1MTknO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBzelBhcnQgPSB0aGlzLnBhcnRbYWxnSW5mby5zaXplUGFydF07XG5cdFx0c3ogPSBzelBhcnQuZGF0YS5sZW5ndGg7XG5cdFx0c3ogPSBzeiAqIDggLSB1dGlscy5jb3VudFplcm9zKHN6UGFydC5kYXRhKTtcblx0fVxuXHR0aGlzLnNpemUgPSBzejtcbn1cblxuS2V5LmZvcm1hdHMgPSBmb3JtYXRzO1xuXG5LZXkucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gKGZvcm1hdCwgb3B0aW9ucykge1xuXHRpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpXG5cdFx0Zm9ybWF0ID0gJ3NzaCc7XG5cdGFzc2VydC5zdHJpbmcoZm9ybWF0LCAnZm9ybWF0Jyk7XG5cdGFzc2VydC5vYmplY3QoZm9ybWF0c1tmb3JtYXRdLCAnZm9ybWF0c1tmb3JtYXRdJyk7XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXG5cdGlmIChmb3JtYXQgPT09ICdyZmM0MjUzJykge1xuXHRcdGlmICh0aGlzLl9yZmM0MjUzQ2FjaGUgPT09IHVuZGVmaW5lZClcblx0XHRcdHRoaXMuX3JmYzQyNTNDYWNoZSA9IGZvcm1hdHNbJ3JmYzQyNTMnXS53cml0ZSh0aGlzKTtcblx0XHRyZXR1cm4gKHRoaXMuX3JmYzQyNTNDYWNoZSk7XG5cdH1cblxuXHRyZXR1cm4gKGZvcm1hdHNbZm9ybWF0XS53cml0ZSh0aGlzLCBvcHRpb25zKSk7XG59O1xuXG5LZXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGZvcm1hdCwgb3B0aW9ucykge1xuXHRyZXR1cm4gKHRoaXMudG9CdWZmZXIoZm9ybWF0LCBvcHRpb25zKS50b1N0cmluZygpKTtcbn07XG5cbktleS5wcm90b3R5cGUuaGFzaCA9IGZ1bmN0aW9uIChhbGdvLCB0eXBlKSB7XG5cdGFzc2VydC5zdHJpbmcoYWxnbywgJ2FsZ29yaXRobScpO1xuXHRhc3NlcnQub3B0aW9uYWxTdHJpbmcodHlwZSwgJ3R5cGUnKTtcblx0aWYgKHR5cGUgPT09IHVuZGVmaW5lZClcblx0XHR0eXBlID0gJ3NzaCc7XG5cdGFsZ28gPSBhbGdvLnRvTG93ZXJDYXNlKCk7XG5cdGlmIChhbGdzLmhhc2hBbGdzW2FsZ29dID09PSB1bmRlZmluZWQpXG5cdFx0dGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3IoYWxnbykpO1xuXG5cdHZhciBjYWNoZUtleSA9IGFsZ28gKyAnfHwnICsgdHlwZTtcblx0aWYgKHRoaXMuX2hhc2hDYWNoZVtjYWNoZUtleV0pXG5cdFx0cmV0dXJuICh0aGlzLl9oYXNoQ2FjaGVbY2FjaGVLZXldKTtcblxuXHR2YXIgYnVmO1xuXHRpZiAodHlwZSA9PT0gJ3NzaCcpIHtcblx0XHRidWYgPSB0aGlzLnRvQnVmZmVyKCdyZmM0MjUzJyk7XG5cdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Nwa2knKSB7XG5cdFx0YnVmID0gZm9ybWF0cy5wa2NzOC5wa2NzOFRvQnVmZmVyKHRoaXMpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IChuZXcgRXJyb3IoJ0hhc2ggdHlwZSAnICsgdHlwZSArICcgbm90IHN1cHBvcnRlZCcpKTtcblx0fVxuXHR2YXIgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ28pLnVwZGF0ZShidWYpLmRpZ2VzdCgpO1xuXHR0aGlzLl9oYXNoQ2FjaGVbY2FjaGVLZXldID0gaGFzaDtcblx0cmV0dXJuIChoYXNoKTtcbn07XG5cbktleS5wcm90b3R5cGUuZmluZ2VycHJpbnQgPSBmdW5jdGlvbiAoYWxnbywgdHlwZSkge1xuXHRpZiAoYWxnbyA9PT0gdW5kZWZpbmVkKVxuXHRcdGFsZ28gPSAnc2hhMjU2Jztcblx0aWYgKHR5cGUgPT09IHVuZGVmaW5lZClcblx0XHR0eXBlID0gJ3NzaCc7XG5cdGFzc2VydC5zdHJpbmcoYWxnbywgJ2FsZ29yaXRobScpO1xuXHRhc3NlcnQuc3RyaW5nKHR5cGUsICd0eXBlJyk7XG5cdHZhciBvcHRzID0ge1xuXHRcdHR5cGU6ICdrZXknLFxuXHRcdGhhc2g6IHRoaXMuaGFzaChhbGdvLCB0eXBlKSxcblx0XHRhbGdvcml0aG06IGFsZ28sXG5cdFx0aGFzaFR5cGU6IHR5cGVcblx0fTtcblx0cmV0dXJuIChuZXcgRmluZ2VycHJpbnQob3B0cykpO1xufTtcblxuS2V5LnByb3RvdHlwZS5kZWZhdWx0SGFzaEFsZ29yaXRobSA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhhc2hBbGdvID0gJ3NoYTEnO1xuXHRpZiAodGhpcy50eXBlID09PSAncnNhJylcblx0XHRoYXNoQWxnbyA9ICdzaGEyNTYnO1xuXHRpZiAodGhpcy50eXBlID09PSAnZHNhJyAmJiB0aGlzLnNpemUgPiAxMDI0KVxuXHRcdGhhc2hBbGdvID0gJ3NoYTI1Nic7XG5cdGlmICh0aGlzLnR5cGUgPT09ICdlZDI1NTE5Jylcblx0XHRoYXNoQWxnbyA9ICdzaGE1MTInO1xuXHRpZiAodGhpcy50eXBlID09PSAnZWNkc2EnKSB7XG5cdFx0aWYgKHRoaXMuc2l6ZSA8PSAyNTYpXG5cdFx0XHRoYXNoQWxnbyA9ICdzaGEyNTYnO1xuXHRcdGVsc2UgaWYgKHRoaXMuc2l6ZSA8PSAzODQpXG5cdFx0XHRoYXNoQWxnbyA9ICdzaGEzODQnO1xuXHRcdGVsc2Vcblx0XHRcdGhhc2hBbGdvID0gJ3NoYTUxMic7XG5cdH1cblx0cmV0dXJuIChoYXNoQWxnbyk7XG59O1xuXG5LZXkucHJvdG90eXBlLmNyZWF0ZVZlcmlmeSA9IGZ1bmN0aW9uIChoYXNoQWxnbykge1xuXHRpZiAoaGFzaEFsZ28gPT09IHVuZGVmaW5lZClcblx0XHRoYXNoQWxnbyA9IHRoaXMuZGVmYXVsdEhhc2hBbGdvcml0aG0oKTtcblx0YXNzZXJ0LnN0cmluZyhoYXNoQWxnbywgJ2hhc2ggYWxnb3JpdGhtJyk7XG5cblx0LyogRUQyNTUxOSBpcyBub3Qgc3VwcG9ydGVkIGJ5IE9wZW5TU0wsIHVzZSBhIGphdmFzY3JpcHQgaW1wbC4gKi9cblx0aWYgKHRoaXMudHlwZSA9PT0gJ2VkMjU1MTknICYmIGVkQ29tcGF0ICE9PSB1bmRlZmluZWQpXG5cdFx0cmV0dXJuIChuZXcgZWRDb21wYXQuVmVyaWZpZXIodGhpcywgaGFzaEFsZ28pKTtcblx0aWYgKHRoaXMudHlwZSA9PT0gJ2N1cnZlMjU1MTknKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ0N1cnZlMjU1MTkga2V5cyBhcmUgbm90IHN1aXRhYmxlIGZvciAnICtcblx0XHQgICAgJ3NpZ25pbmcgb3IgdmVyaWZpY2F0aW9uJykpO1xuXG5cdHZhciB2LCBubSwgZXJyO1xuXHR0cnkge1xuXHRcdG5tID0gaGFzaEFsZ28udG9VcHBlckNhc2UoKTtcblx0XHR2ID0gY3J5cHRvLmNyZWF0ZVZlcmlmeShubSk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRlcnIgPSBlO1xuXHR9XG5cdGlmICh2ID09PSB1bmRlZmluZWQgfHwgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmXG5cdCAgICBlcnIubWVzc2FnZS5tYXRjaCgvVW5rbm93biBtZXNzYWdlIGRpZ2VzdC8pKSkge1xuXHRcdG5tID0gJ1JTQS0nO1xuXHRcdG5tICs9IGhhc2hBbGdvLnRvVXBwZXJDYXNlKCk7XG5cdFx0diA9IGNyeXB0by5jcmVhdGVWZXJpZnkobm0pO1xuXHR9XG5cdGFzc2VydC5vayh2LCAnZmFpbGVkIHRvIGNyZWF0ZSB2ZXJpZmllcicpO1xuXHR2YXIgb2xkVmVyaWZ5ID0gdi52ZXJpZnkuYmluZCh2KTtcblx0dmFyIGtleSA9IHRoaXMudG9CdWZmZXIoJ3BrY3M4Jyk7XG5cdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG5cdHZhciBzZWxmID0gdGhpcztcblx0di52ZXJpZnkgPSBmdW5jdGlvbiAoc2lnbmF0dXJlLCBmbXQpIHtcblx0XHRpZiAoU2lnbmF0dXJlLmlzU2lnbmF0dXJlKHNpZ25hdHVyZSwgWzIsIDBdKSkge1xuXHRcdFx0aWYgKHNpZ25hdHVyZS50eXBlICE9PSBzZWxmLnR5cGUpXG5cdFx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHRcdFx0aWYgKHNpZ25hdHVyZS5oYXNoQWxnb3JpdGhtICYmXG5cdFx0XHQgICAgc2lnbmF0dXJlLmhhc2hBbGdvcml0aG0gIT09IGhhc2hBbGdvKVxuXHRcdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0XHRcdGlmIChzaWduYXR1cmUuY3VydmUgJiYgc2VsZi50eXBlID09PSAnZWNkc2EnICYmXG5cdFx0XHQgICAgc2lnbmF0dXJlLmN1cnZlICE9PSBjdXJ2ZSlcblx0XHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cdFx0XHRyZXR1cm4gKG9sZFZlcmlmeShrZXksIHNpZ25hdHVyZS50b0J1ZmZlcignYXNuMScpKSk7XG5cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiAoc2lnbmF0dXJlKSA9PT0gJ3N0cmluZycgfHxcblx0XHQgICAgQnVmZmVyLmlzQnVmZmVyKHNpZ25hdHVyZSkpIHtcblx0XHRcdHJldHVybiAob2xkVmVyaWZ5KGtleSwgc2lnbmF0dXJlLCBmbXQpKTtcblxuXHRcdC8qXG5cdFx0ICogQXZvaWQgZG9pbmcgdGhpcyBvbiB2YWxpZCBhcmd1bWVudHMsIHdhbGtpbmcgdGhlIHByb3RvdHlwZVxuXHRcdCAqIGNoYWluIGNhbiBiZSBxdWl0ZSBzbG93LlxuXHRcdCAqL1xuXHRcdH0gZWxzZSBpZiAoU2lnbmF0dXJlLmlzU2lnbmF0dXJlKHNpZ25hdHVyZSwgWzEsIDBdKSkge1xuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcignc2lnbmF0dXJlIHdhcyBjcmVhdGVkIGJ5IHRvbyBvbGQgJyArXG5cdFx0XHQgICAgJ2EgdmVyc2lvbiBvZiBzc2hwayBhbmQgY2Fubm90IGJlIHZlcmlmaWVkJykpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IChuZXcgVHlwZUVycm9yKCdzaWduYXR1cmUgbXVzdCBiZSBhIHN0cmluZywgJyArXG5cdFx0XHQgICAgJ0J1ZmZlciwgb3IgU2lnbmF0dXJlIG9iamVjdCcpKTtcblx0XHR9XG5cdH07XG5cdHJldHVybiAodik7XG59O1xuXG5LZXkucHJvdG90eXBlLmNyZWF0ZURpZmZpZUhlbGxtYW4gPSBmdW5jdGlvbiAoKSB7XG5cdGlmICh0aGlzLnR5cGUgPT09ICdyc2EnKVxuXHRcdHRocm93IChuZXcgRXJyb3IoJ1JTQSBrZXlzIGRvIG5vdCBzdXBwb3J0IERpZmZpZS1IZWxsbWFuJykpO1xuXG5cdHJldHVybiAobmV3IERpZmZpZUhlbGxtYW4odGhpcykpO1xufTtcbktleS5wcm90b3R5cGUuY3JlYXRlREggPSBLZXkucHJvdG90eXBlLmNyZWF0ZURpZmZpZUhlbGxtYW47XG5cbktleS5wYXJzZSA9IGZ1bmN0aW9uIChkYXRhLCBmb3JtYXQsIG9wdGlvbnMpIHtcblx0aWYgKHR5cGVvZiAoZGF0YSkgIT09ICdzdHJpbmcnKVxuXHRcdGFzc2VydC5idWZmZXIoZGF0YSwgJ2RhdGEnKTtcblx0aWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKVxuXHRcdGZvcm1hdCA9ICdhdXRvJztcblx0YXNzZXJ0LnN0cmluZyhmb3JtYXQsICdmb3JtYXQnKTtcblx0aWYgKHR5cGVvZiAob3B0aW9ucykgPT09ICdzdHJpbmcnKVxuXHRcdG9wdGlvbnMgPSB7IGZpbGVuYW1lOiBvcHRpb25zIH07XG5cdGFzc2VydC5vcHRpb25hbE9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXHRpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKVxuXHRcdG9wdGlvbnMgPSB7fTtcblx0YXNzZXJ0Lm9wdGlvbmFsU3RyaW5nKG9wdGlvbnMuZmlsZW5hbWUsICdvcHRpb25zLmZpbGVuYW1lJyk7XG5cdGlmIChvcHRpb25zLmZpbGVuYW1lID09PSB1bmRlZmluZWQpXG5cdFx0b3B0aW9ucy5maWxlbmFtZSA9ICcodW5uYW1lZCknO1xuXG5cdGFzc2VydC5vYmplY3QoZm9ybWF0c1tmb3JtYXRdLCAnZm9ybWF0c1tmb3JtYXRdJyk7XG5cblx0dHJ5IHtcblx0XHR2YXIgayA9IGZvcm1hdHNbZm9ybWF0XS5yZWFkKGRhdGEsIG9wdGlvbnMpO1xuXHRcdGlmIChrIGluc3RhbmNlb2YgUHJpdmF0ZUtleSlcblx0XHRcdGsgPSBrLnRvUHVibGljKCk7XG5cdFx0aWYgKCFrLmNvbW1lbnQpXG5cdFx0XHRrLmNvbW1lbnQgPSBvcHRpb25zLmZpbGVuYW1lO1xuXHRcdHJldHVybiAoayk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAoZS5uYW1lID09PSAnS2V5RW5jcnlwdGVkRXJyb3InKVxuXHRcdFx0dGhyb3cgKGUpO1xuXHRcdHRocm93IChuZXcgS2V5UGFyc2VFcnJvcihvcHRpb25zLmZpbGVuYW1lLCBmb3JtYXQsIGUpKTtcblx0fVxufTtcblxuS2V5LmlzS2V5ID0gZnVuY3Rpb24gKG9iaiwgdmVyKSB7XG5cdHJldHVybiAodXRpbHMuaXNDb21wYXRpYmxlKG9iaiwgS2V5LCB2ZXIpKTtcbn07XG5cbi8qXG4gKiBBUEkgdmVyc2lvbnMgZm9yIEtleTpcbiAqIFsxLDBdIC0tIGluaXRpYWwgdmVyLCBtYXkgdGFrZSBTaWduYXR1cmUgZm9yIGNyZWF0ZVZlcmlmeSBvciBtYXkgbm90XG4gKiBbMSwxXSAtLSBhZGRlZCBwa2NzMSwgcGtjczggZm9ybWF0c1xuICogWzEsMl0gLS0gYWRkZWQgYXV0bywgc3NoLXByaXZhdGUsIG9wZW5zc2ggZm9ybWF0c1xuICogWzEsM10gLS0gYWRkZWQgZGVmYXVsdEhhc2hBbGdvcml0aG1cbiAqIFsxLDRdIC0tIGFkZGVkIGVkIHN1cHBvcnQsIGNyZWF0ZURIXG4gKiBbMSw1XSAtLSBmaXJzdCBleHBsaWNpdGx5IHRhZ2dlZCB2ZXJzaW9uXG4gKiBbMSw2XSAtLSBjaGFuZ2VkIGVkMjU1MTkgcGFydCBuYW1lc1xuICogWzEsN10gLS0gc3BraSBoYXNoIHR5cGVzXG4gKi9cbktleS5wcm90b3R5cGUuX3NzaHBrQXBpVmVyc2lvbiA9IFsxLCA3XTtcblxuS2V5Ll9vbGRWZXJzaW9uRGV0ZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuXHRhc3NlcnQuZnVuYyhvYmoudG9CdWZmZXIpO1xuXHRhc3NlcnQuZnVuYyhvYmouZmluZ2VycHJpbnQpO1xuXHRpZiAob2JqLmNyZWF0ZURIKVxuXHRcdHJldHVybiAoWzEsIDRdKTtcblx0aWYgKG9iai5kZWZhdWx0SGFzaEFsZ29yaXRobSlcblx0XHRyZXR1cm4gKFsxLCAzXSk7XG5cdGlmIChvYmouZm9ybWF0c1snYXV0byddKVxuXHRcdHJldHVybiAoWzEsIDJdKTtcblx0aWYgKG9iai5mb3JtYXRzWydwa2NzMSddKVxuXHRcdHJldHVybiAoWzEsIDFdKTtcblx0cmV0dXJuIChbMSwgMF0pO1xufTtcbiIsICIvLyBDb3B5cmlnaHQgMjAxNSBKb3llbnQsIEluYy5cblxudmFyIEtleSA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgRmluZ2VycHJpbnQgPSByZXF1aXJlKCcuL2ZpbmdlcnByaW50Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcbnZhciBQcml2YXRlS2V5ID0gcmVxdWlyZSgnLi9wcml2YXRlLWtleScpO1xudmFyIENlcnRpZmljYXRlID0gcmVxdWlyZSgnLi9jZXJ0aWZpY2F0ZScpO1xudmFyIElkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xudmFyIGVycnMgPSByZXF1aXJlKCcuL2Vycm9ycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyogdG9wLWxldmVsIGNsYXNzZXMgKi9cblx0S2V5OiBLZXksXG5cdHBhcnNlS2V5OiBLZXkucGFyc2UsXG5cdEZpbmdlcnByaW50OiBGaW5nZXJwcmludCxcblx0cGFyc2VGaW5nZXJwcmludDogRmluZ2VycHJpbnQucGFyc2UsXG5cdFNpZ25hdHVyZTogU2lnbmF0dXJlLFxuXHRwYXJzZVNpZ25hdHVyZTogU2lnbmF0dXJlLnBhcnNlLFxuXHRQcml2YXRlS2V5OiBQcml2YXRlS2V5LFxuXHRwYXJzZVByaXZhdGVLZXk6IFByaXZhdGVLZXkucGFyc2UsXG5cdGdlbmVyYXRlUHJpdmF0ZUtleTogUHJpdmF0ZUtleS5nZW5lcmF0ZSxcblx0Q2VydGlmaWNhdGU6IENlcnRpZmljYXRlLFxuXHRwYXJzZUNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5wYXJzZSxcblx0Y3JlYXRlU2VsZlNpZ25lZENlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5jcmVhdGVTZWxmU2lnbmVkLFxuXHRjcmVhdGVDZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuY3JlYXRlLFxuXHRJZGVudGl0eTogSWRlbnRpdHksXG5cdGlkZW50aXR5RnJvbUROOiBJZGVudGl0eS5wYXJzZUROLFxuXHRpZGVudGl0eUZvckhvc3Q6IElkZW50aXR5LmZvckhvc3QsXG5cdGlkZW50aXR5Rm9yVXNlcjogSWRlbnRpdHkuZm9yVXNlcixcblx0aWRlbnRpdHlGb3JFbWFpbDogSWRlbnRpdHkuZm9yRW1haWwsXG5cdGlkZW50aXR5RnJvbUFycmF5OiBJZGVudGl0eS5mcm9tQXJyYXksXG5cblx0LyogZXJyb3JzICovXG5cdEZpbmdlcnByaW50Rm9ybWF0RXJyb3I6IGVycnMuRmluZ2VycHJpbnRGb3JtYXRFcnJvcixcblx0SW52YWxpZEFsZ29yaXRobUVycm9yOiBlcnJzLkludmFsaWRBbGdvcml0aG1FcnJvcixcblx0S2V5UGFyc2VFcnJvcjogZXJycy5LZXlQYXJzZUVycm9yLFxuXHRTaWduYXR1cmVQYXJzZUVycm9yOiBlcnJzLlNpZ25hdHVyZVBhcnNlRXJyb3IsXG5cdEtleUVuY3J5cHRlZEVycm9yOiBlcnJzLktleUVuY3J5cHRlZEVycm9yLFxuXHRDZXJ0aWZpY2F0ZVBhcnNlRXJyb3I6IGVycnMuQ2VydGlmaWNhdGVQYXJzZUVycm9yXG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDEyIEpveWVudCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgc3NocGsgPSByZXF1aXJlKCdzc2hwaycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbnZhciBIQVNIX0FMR09TID0ge1xuICAnc2hhMSc6IHRydWUsXG4gICdzaGEyNTYnOiB0cnVlLFxuICAnc2hhNTEyJzogdHJ1ZVxufTtcblxudmFyIFBLX0FMR09TID0ge1xuICAncnNhJzogdHJ1ZSxcbiAgJ2RzYSc6IHRydWUsXG4gICdlY2RzYSc6IHRydWVcbn07XG5cbmZ1bmN0aW9uIEh0dHBTaWduYXR1cmVFcnJvcihtZXNzYWdlLCBjYWxsZXIpIHtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGNhbGxlciB8fCBIdHRwU2lnbmF0dXJlRXJyb3IpO1xuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9IGNhbGxlci5uYW1lO1xufVxudXRpbC5pbmhlcml0cyhIdHRwU2lnbmF0dXJlRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gSW52YWxpZEFsZ29yaXRobUVycm9yKG1lc3NhZ2UpIHtcbiAgSHR0cFNpZ25hdHVyZUVycm9yLmNhbGwodGhpcywgbWVzc2FnZSwgSW52YWxpZEFsZ29yaXRobUVycm9yKTtcbn1cbnV0aWwuaW5oZXJpdHMoSW52YWxpZEFsZ29yaXRobUVycm9yLCBIdHRwU2lnbmF0dXJlRXJyb3IpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUFsZ29yaXRobShhbGdvcml0aG0pIHtcbiAgdmFyIGFsZyA9IGFsZ29yaXRobS50b0xvd2VyQ2FzZSgpLnNwbGl0KCctJyk7XG5cbiAgaWYgKGFsZy5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcihhbGdbMF0udG9VcHBlckNhc2UoKSArICcgaXMgbm90IGEgJyArXG4gICAgICAndmFsaWQgYWxnb3JpdGhtJykpO1xuICB9XG5cbiAgaWYgKGFsZ1swXSAhPT0gJ2htYWMnICYmICFQS19BTEdPU1thbGdbMF1dKSB7XG4gICAgdGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3IoYWxnWzBdLnRvVXBwZXJDYXNlKCkgKyAnIHR5cGUga2V5cyAnICtcbiAgICAgICdhcmUgbm90IHN1cHBvcnRlZCcpKTtcbiAgfVxuXG4gIGlmICghSEFTSF9BTEdPU1thbGdbMV1dKSB7XG4gICAgdGhyb3cgKG5ldyBJbnZhbGlkQWxnb3JpdGhtRXJyb3IoYWxnWzFdLnRvVXBwZXJDYXNlKCkgKyAnIGlzIG5vdCBhICcgK1xuICAgICAgJ3N1cHBvcnRlZCBoYXNoIGFsZ29yaXRobScpKTtcbiAgfVxuXG4gIHJldHVybiAoYWxnKTtcbn1cblxuLy8vLS0tIEFQSVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICBIQVNIX0FMR09TOiBIQVNIX0FMR09TLFxuICBQS19BTEdPUzogUEtfQUxHT1MsXG5cbiAgSHR0cFNpZ25hdHVyZUVycm9yOiBIdHRwU2lnbmF0dXJlRXJyb3IsXG4gIEludmFsaWRBbGdvcml0aG1FcnJvcjogSW52YWxpZEFsZ29yaXRobUVycm9yLFxuXG4gIHZhbGlkYXRlQWxnb3JpdGhtOiB2YWxpZGF0ZUFsZ29yaXRobSxcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gT3BlblNTSCBwdWJsaWMga2V5IChyc2Egb25seSkgdG8gYSBQS0NTIzggUEVNIGZpbGUuXG4gICAqXG4gICAqIFRoZSBpbnRlbnQgb2YgdGhpcyBtb2R1bGUgaXMgdG8gaW50ZXJvcGVyYXRlIHdpdGggT3BlblNTTCBvbmx5LFxuICAgKiBzcGVjaWZpY2FsbHkgdGhlIG5vZGUgY3J5cHRvIG1vZHVsZSdzIGB2ZXJpZnlgIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBhbiBPcGVuU1NIIHB1YmxpYyBrZXkuXG4gICAqIEByZXR1cm4ge1N0cmluZ30gUEVNIGVuY29kZWQgZm9ybSBvZiB0aGUgUlNBIHB1YmxpYyBrZXkuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gb24gYmFkIGlucHV0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gb24gaW52YWxpZCBzc2gga2V5IGZvcm1hdHRlZCBkYXRhLlxuICAgKi9cbiAgc3NoS2V5VG9QRU06IGZ1bmN0aW9uIHNzaEtleVRvUEVNKGtleSkge1xuICAgIGFzc2VydC5zdHJpbmcoa2V5LCAnc3NoX2tleScpO1xuXG4gICAgdmFyIGsgPSBzc2hway5wYXJzZUtleShrZXksICdzc2gnKTtcbiAgICByZXR1cm4gKGsudG9TdHJpbmcoJ3BlbScpKTtcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gT3BlblNTSCBmaW5nZXJwcmludCBmcm9tIGFuIHNzaCBwdWJsaWMga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IGFuIE9wZW5TU0ggcHVibGljIGtleS5cbiAgICogQHJldHVybiB7U3RyaW5nfSBrZXkgZmluZ2VycHJpbnQuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gb24gYmFkIGlucHV0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgd2hhdCB5b3UgcGFzc2VkIGRvZXNuJ3QgbG9vayBsaWtlIGFuIHNzaCBwdWJsaWMga2V5LlxuICAgKi9cbiAgZmluZ2VycHJpbnQ6IGZ1bmN0aW9uIGZpbmdlcnByaW50KGtleSkge1xuICAgIGFzc2VydC5zdHJpbmcoa2V5LCAnc3NoX2tleScpO1xuXG4gICAgdmFyIGsgPSBzc2hway5wYXJzZUtleShrZXksICdzc2gnKTtcbiAgICByZXR1cm4gKGsuZmluZ2VycHJpbnQoJ21kNScpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgUEtHQ1MjOCBQRU0gZmlsZSB0byBhbiBPcGVuU1NIIHB1YmxpYyBrZXkgKHJzYSlcbiAgICpcbiAgICogVGhlIHJldmVyc2Ugb2YgdGhlIGFib3ZlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcGVtVG9Sc2FTU0hLZXk6IGZ1bmN0aW9uIHBlbVRvUnNhU1NIS2V5KHBlbSwgY29tbWVudCkge1xuICAgIGFzc2VydC5lcXVhbCgnc3RyaW5nJywgdHlwZW9mIChwZW0pLCAndHlwZW9mIHBlbScpO1xuXG4gICAgdmFyIGsgPSBzc2hway5wYXJzZUtleShwZW0sICdwZW0nKTtcbiAgICBrLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiAoay50b1N0cmluZygnc3NoJykpO1xuICB9XG59O1xuIiwgIi8vIENvcHlyaWdodCAyMDEyIEpveWVudCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG5cbi8vLy0tLSBHbG9iYWxzXG5cbnZhciBIQVNIX0FMR09TID0gdXRpbHMuSEFTSF9BTEdPUztcbnZhciBQS19BTEdPUyA9IHV0aWxzLlBLX0FMR09TO1xudmFyIEh0dHBTaWduYXR1cmVFcnJvciA9IHV0aWxzLkh0dHBTaWduYXR1cmVFcnJvcjtcbnZhciBJbnZhbGlkQWxnb3JpdGhtRXJyb3IgPSB1dGlscy5JbnZhbGlkQWxnb3JpdGhtRXJyb3I7XG52YXIgdmFsaWRhdGVBbGdvcml0aG0gPSB1dGlscy52YWxpZGF0ZUFsZ29yaXRobTtcblxudmFyIFN0YXRlID0ge1xuICBOZXc6IDAsXG4gIFBhcmFtczogMVxufTtcblxudmFyIFBhcmFtc1N0YXRlID0ge1xuICBOYW1lOiAwLFxuICBRdW90ZTogMSxcbiAgVmFsdWU6IDIsXG4gIENvbW1hOiAzXG59O1xuXG5cbi8vLy0tLSBTcGVjaWZpYyBFcnJvcnNcblxuXG5mdW5jdGlvbiBFeHBpcmVkUmVxdWVzdEVycm9yKG1lc3NhZ2UpIHtcbiAgSHR0cFNpZ25hdHVyZUVycm9yLmNhbGwodGhpcywgbWVzc2FnZSwgRXhwaXJlZFJlcXVlc3RFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKEV4cGlyZWRSZXF1ZXN0RXJyb3IsIEh0dHBTaWduYXR1cmVFcnJvcik7XG5cblxuZnVuY3Rpb24gSW52YWxpZEhlYWRlckVycm9yKG1lc3NhZ2UpIHtcbiAgSHR0cFNpZ25hdHVyZUVycm9yLmNhbGwodGhpcywgbWVzc2FnZSwgSW52YWxpZEhlYWRlckVycm9yKTtcbn1cbnV0aWwuaW5oZXJpdHMoSW52YWxpZEhlYWRlckVycm9yLCBIdHRwU2lnbmF0dXJlRXJyb3IpO1xuXG5cbmZ1bmN0aW9uIEludmFsaWRQYXJhbXNFcnJvcihtZXNzYWdlKSB7XG4gIEh0dHBTaWduYXR1cmVFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UsIEludmFsaWRQYXJhbXNFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKEludmFsaWRQYXJhbXNFcnJvciwgSHR0cFNpZ25hdHVyZUVycm9yKTtcblxuXG5mdW5jdGlvbiBNaXNzaW5nSGVhZGVyRXJyb3IobWVzc2FnZSkge1xuICBIdHRwU2lnbmF0dXJlRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlLCBNaXNzaW5nSGVhZGVyRXJyb3IpO1xufVxudXRpbC5pbmhlcml0cyhNaXNzaW5nSGVhZGVyRXJyb3IsIEh0dHBTaWduYXR1cmVFcnJvcik7XG5cbmZ1bmN0aW9uIFN0cmljdFBhcnNpbmdFcnJvcihtZXNzYWdlKSB7XG4gIEh0dHBTaWduYXR1cmVFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UsIFN0cmljdFBhcnNpbmdFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKFN0cmljdFBhcnNpbmdFcnJvciwgSHR0cFNpZ25hdHVyZUVycm9yKTtcblxuLy8vLS0tIEV4cG9ydGVkIEFQSVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKipcbiAgICogUGFyc2VzIHRoZSAnQXV0aG9yaXphdGlvbicgaGVhZGVyIG91dCBvZiBhbiBodHRwLlNlcnZlclJlcXVlc3Qgb2JqZWN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBBUEkgd2lsbCBmdWxseSB2YWxpZGF0ZSB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIsIGFuZCB0aHJvd1xuICAgKiBvbiBhbnkgZXJyb3IuICBJdCB3aWxsIG5vdCBob3dldmVyIGNoZWNrIHRoZSBzaWduYXR1cmUsIG9yIHRoZSBrZXlJZCBmb3JtYXRcbiAgICogYXMgdGhvc2UgYXJlIHNwZWNpZmljIHRvIHlvdXIgZW52aXJvbm1lbnQuICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9ucyBvYmplY3RcbiAgICogdG8gcGFzcyBpbiBleHRyYSBjb25zdHJhaW50cy5cbiAgICpcbiAgICogQXMgYSByZXNwb25zZSBvYmplY3QgeW91IGNhbiBleHBlY3QgdGhpczpcbiAgICpcbiAgICogICAgIHtcbiAgICogICAgICAgXCJzY2hlbWVcIjogXCJTaWduYXR1cmVcIixcbiAgICogICAgICAgXCJwYXJhbXNcIjoge1xuICAgKiAgICAgICAgIFwia2V5SWRcIjogXCJmb29cIixcbiAgICogICAgICAgICBcImFsZ29yaXRobVwiOiBcInJzYS1zaGEyNTZcIixcbiAgICogICAgICAgICBcImhlYWRlcnNcIjogW1xuICAgKiAgICAgICAgICAgXCJkYXRlXCIgb3IgXCJ4LWRhdGVcIixcbiAgICogICAgICAgICAgIFwiZGlnZXN0XCJcbiAgICogICAgICAgICBdLFxuICAgKiAgICAgICAgIFwic2lnbmF0dXJlXCI6IFwiYmFzZTY0XCJcbiAgICogICAgICAgfSxcbiAgICogICAgICAgXCJzaWduaW5nU3RyaW5nXCI6IFwicmVhZHkgdG8gYmUgcGFzc2VkIHRvIGNyeXB0by52ZXJpZnkoKVwiXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0IGFuIGh0dHAuU2VydmVyUmVxdWVzdC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgd2l0aDpcbiAgICogICAgICAgICAgICAgICAgICAgLSBjbG9ja1NrZXc6IGFsbG93ZWQgY2xvY2sgc2tldyBpbiBzZWNvbmRzIChkZWZhdWx0IDMwMCkuXG4gICAqICAgICAgICAgICAgICAgICAgIC0gaGVhZGVyczogcmVxdWlyZWQgaGVhZGVyIG5hbWVzIChkZWY6IGRhdGUgb3IgeC1kYXRlKVxuICAgKiAgICAgICAgICAgICAgICAgICAtIGFsZ29yaXRobXM6IGFsZ29yaXRobXMgdG8gc3VwcG9ydCAoZGVmYXVsdDogYWxsKS5cbiAgICogICAgICAgICAgICAgICAgICAgLSBzdHJpY3Q6IHNob3VsZCBlbmZvcmNlIGxhdGVzdCBzcGVjIHBhcnNpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBmYWxzZSkuXG4gICAqIEByZXR1cm4ge09iamVjdH0gcGFyc2VkIG91dCBvYmplY3QgKHNlZSBhYm92ZSkuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gb24gaW52YWxpZCBpbnB1dC5cbiAgICogQHRocm93cyB7SW52YWxpZEhlYWRlckVycm9yfSBvbiBhbiBpbnZhbGlkIEF1dGhvcml6YXRpb24gaGVhZGVyIGVycm9yLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkUGFyYW1zRXJyb3J9IGlmIHRoZSBwYXJhbXMgaW4gdGhlIHNjaGVtZSBhcmUgaW52YWxpZC5cbiAgICogQHRocm93cyB7TWlzc2luZ0hlYWRlckVycm9yfSBpZiB0aGUgcGFyYW1zIGluZGljYXRlIGEgaGVhZGVyIG5vdCBwcmVzZW50LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciBpbiB0aGUgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhlIHBhcmFtcyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBub3QgaW4gdGhlIHBhcmFtcyBmcm9tIGEgcmVxdWlyZWQgaGVhZGVyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gb3B0aW9ucy5cbiAgICogQHRocm93cyB7U3RyaWN0UGFyc2luZ0Vycm9yfSBpZiBvbGQgYXR0cmlidXRlcyBhcmUgdXNlZCBpbiBzdHJpY3QgcGFyc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuXG4gICAqIEB0aHJvd3Mge0V4cGlyZWRSZXF1ZXN0RXJyb3J9IGlmIHRoZSB2YWx1ZSBvZiBkYXRlIG9yIHgtZGF0ZSBleGNlZWRzIHNrZXcuXG4gICAqL1xuICBwYXJzZVJlcXVlc3Q6IGZ1bmN0aW9uIHBhcnNlUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zKSB7XG4gICAgYXNzZXJ0Lm9iamVjdChyZXF1ZXN0LCAncmVxdWVzdCcpO1xuICAgIGFzc2VydC5vYmplY3QocmVxdWVzdC5oZWFkZXJzLCAncmVxdWVzdC5oZWFkZXJzJyk7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IFtyZXF1ZXN0LmhlYWRlcnNbJ3gtZGF0ZSddID8gJ3gtZGF0ZScgOiAnZGF0ZSddO1xuICAgIH1cbiAgICBhc3NlcnQub2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgYXNzZXJ0LmFycmF5T2ZTdHJpbmcob3B0aW9ucy5oZWFkZXJzLCAnb3B0aW9ucy5oZWFkZXJzJyk7XG4gICAgYXNzZXJ0Lm9wdGlvbmFsRmluaXRlKG9wdGlvbnMuY2xvY2tTa2V3LCAnb3B0aW9ucy5jbG9ja1NrZXcnKTtcblxuICAgIHZhciBhdXRoekhlYWRlck5hbWUgPSBvcHRpb25zLmF1dGhvcml6YXRpb25IZWFkZXJOYW1lIHx8ICdhdXRob3JpemF0aW9uJztcblxuICAgIGlmICghcmVxdWVzdC5oZWFkZXJzW2F1dGh6SGVhZGVyTmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nSGVhZGVyRXJyb3IoJ25vICcgKyBhdXRoekhlYWRlck5hbWUgKyAnIGhlYWRlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXNlbnQgaW4gdGhlIHJlcXVlc3QnKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmNsb2NrU2tldyA9IG9wdGlvbnMuY2xvY2tTa2V3IHx8IDMwMDtcblxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBzdGF0ZSA9IFN0YXRlLk5ldztcbiAgICB2YXIgc3Vic3RhdGUgPSBQYXJhbXNTdGF0ZS5OYW1lO1xuICAgIHZhciB0bXBOYW1lID0gJyc7XG4gICAgdmFyIHRtcFZhbHVlID0gJyc7XG5cbiAgICB2YXIgcGFyc2VkID0ge1xuICAgICAgc2NoZW1lOiAnJyxcbiAgICAgIHBhcmFtczoge30sXG4gICAgICBzaWduaW5nU3RyaW5nOiAnJ1xuICAgIH07XG5cbiAgICB2YXIgYXV0aHogPSByZXF1ZXN0LmhlYWRlcnNbYXV0aHpIZWFkZXJOYW1lXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXV0aHoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gYXV0aHouY2hhckF0KGkpO1xuXG4gICAgICBzd2l0Y2ggKE51bWJlcihzdGF0ZSkpIHtcblxuICAgICAgY2FzZSBTdGF0ZS5OZXc6XG4gICAgICAgIGlmIChjICE9PSAnICcpIHBhcnNlZC5zY2hlbWUgKz0gYztcbiAgICAgICAgZWxzZSBzdGF0ZSA9IFN0YXRlLlBhcmFtcztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU3RhdGUuUGFyYW1zOlxuICAgICAgICBzd2l0Y2ggKE51bWJlcihzdWJzdGF0ZSkpIHtcblxuICAgICAgICBjYXNlIFBhcmFtc1N0YXRlLk5hbWU6XG4gICAgICAgICAgdmFyIGNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgLy8gcmVzdHJpY3RlZCBuYW1lIG9mIEEtWiAvIGEtelxuICAgICAgICAgIGlmICgoY29kZSA+PSAweDQxICYmIGNvZGUgPD0gMHg1YSkgfHwgLy8gQS1aXG4gICAgICAgICAgICAgIChjb2RlID49IDB4NjEgJiYgY29kZSA8PSAweDdhKSkgeyAvLyBhLXpcbiAgICAgICAgICAgIHRtcE5hbWUgKz0gYztcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc9Jykge1xuICAgICAgICAgICAgaWYgKHRtcE5hbWUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgICBzdWJzdGF0ZSA9IFBhcmFtc1N0YXRlLlF1b3RlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGFyYW1zU3RhdGUuUXVvdGU6XG4gICAgICAgICAgaWYgKGMgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHRtcFZhbHVlID0gJyc7XG4gICAgICAgICAgICBzdWJzdGF0ZSA9IFBhcmFtc1N0YXRlLlZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGFyYW1zU3RhdGUuVmFsdWU6XG4gICAgICAgICAgaWYgKGMgPT09ICdcIicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wYXJhbXNbdG1wTmFtZV0gPSB0bXBWYWx1ZTtcbiAgICAgICAgICAgIHN1YnN0YXRlID0gUGFyYW1zU3RhdGUuQ29tbWE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRtcFZhbHVlICs9IGM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUGFyYW1zU3RhdGUuQ29tbWE6XG4gICAgICAgICAgaWYgKGMgPT09ICcsJykge1xuICAgICAgICAgICAgdG1wTmFtZSA9ICcnO1xuICAgICAgICAgICAgc3Vic3RhdGUgPSBQYXJhbXNTdGF0ZS5OYW1lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdiYWQgcGFyYW0gZm9ybWF0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN1YnN0YXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdWJzdGF0ZScpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKCFwYXJzZWQucGFyYW1zLmhlYWRlcnMgfHwgcGFyc2VkLnBhcmFtcy5oZWFkZXJzID09PSAnJykge1xuICAgICAgaWYgKHJlcXVlc3QuaGVhZGVyc1sneC1kYXRlJ10pIHtcbiAgICAgICAgcGFyc2VkLnBhcmFtcy5oZWFkZXJzID0gWyd4LWRhdGUnXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZC5wYXJhbXMuaGVhZGVycyA9IFsnZGF0ZSddO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWQucGFyYW1zLmhlYWRlcnMgPSBwYXJzZWQucGFyYW1zLmhlYWRlcnMuc3BsaXQoJyAnKTtcbiAgICB9XG5cbiAgICAvLyBNaW5pbWFsbHkgdmFsaWRhdGUgdGhlIHBhcnNlZCBvYmplY3RcbiAgICBpZiAoIXBhcnNlZC5zY2hlbWUgfHwgcGFyc2VkLnNjaGVtZSAhPT0gJ1NpZ25hdHVyZScpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdzY2hlbWUgd2FzIG5vdCBcIlNpZ25hdHVyZVwiJyk7XG5cbiAgICBpZiAoIXBhcnNlZC5wYXJhbXMua2V5SWQpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEhlYWRlckVycm9yKCdrZXlJZCB3YXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgaWYgKCFwYXJzZWQucGFyYW1zLmFsZ29yaXRobSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSGVhZGVyRXJyb3IoJ2FsZ29yaXRobSB3YXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgaWYgKCFwYXJzZWQucGFyYW1zLnNpZ25hdHVyZSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSGVhZGVyRXJyb3IoJ3NpZ25hdHVyZSB3YXMgbm90IHNwZWNpZmllZCcpO1xuXG4gICAgLy8gQ2hlY2sgdGhlIGFsZ29yaXRobSBhZ2FpbnN0IHRoZSBvZmZpY2lhbCBsaXN0XG4gICAgcGFyc2VkLnBhcmFtcy5hbGdvcml0aG0gPSBwYXJzZWQucGFyYW1zLmFsZ29yaXRobS50b0xvd2VyQ2FzZSgpO1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUFsZ29yaXRobShwYXJzZWQucGFyYW1zLmFsZ29yaXRobSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnZhbGlkQWxnb3JpdGhtRXJyb3IpXG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZFBhcmFtc0Vycm9yKHBhcnNlZC5wYXJhbXMuYWxnb3JpdGhtICsgJyBpcyBub3QgJyArXG4gICAgICAgICAgJ3N1cHBvcnRlZCcpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgKGUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHRoZSBzaWduaW5nU3RyaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IHBhcnNlZC5wYXJhbXMuaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGggPSBwYXJzZWQucGFyYW1zLmhlYWRlcnNbaV0udG9Mb3dlckNhc2UoKTtcbiAgICAgIHBhcnNlZC5wYXJhbXMuaGVhZGVyc1tpXSA9IGg7XG5cbiAgICAgIGlmIChoID09PSAncmVxdWVzdC1saW5lJykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBXZSBhbGxvdyBoZWFkZXJzIGZyb20gdGhlIG9sZGVyIHNwZWMgZHJhZnRzIGlmIHN0cmljdCBwYXJzaW5nIGlzbid0XG4gICAgICAgICAgICogc3BlY2lmaWVkIGluIG9wdGlvbnMuXG4gICAgICAgICAgICovXG4gICAgICAgICAgcGFyc2VkLnNpZ25pbmdTdHJpbmcgKz1cbiAgICAgICAgICAgIHJlcXVlc3QubWV0aG9kICsgJyAnICsgcmVxdWVzdC51cmwgKyAnIEhUVFAvJyArIHJlcXVlc3QuaHR0cFZlcnNpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogU3RyaWN0IHBhcnNpbmcgZG9lc24ndCBhbGxvdyBvbGRlciBkcmFmdCBoZWFkZXJzLiAqL1xuICAgICAgICAgIHRocm93IChuZXcgU3RyaWN0UGFyc2luZ0Vycm9yKCdyZXF1ZXN0LWxpbmUgaXMgbm90IGEgdmFsaWQgaGVhZGVyICcgK1xuICAgICAgICAgICAgJ3dpdGggc3RyaWN0IHBhcnNpbmcgZW5hYmxlZC4nKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaCA9PT0gJyhyZXF1ZXN0LXRhcmdldCknKSB7XG4gICAgICAgIHBhcnNlZC5zaWduaW5nU3RyaW5nICs9XG4gICAgICAgICAgJyhyZXF1ZXN0LXRhcmdldCk6ICcgKyByZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpICsgJyAnICtcbiAgICAgICAgICByZXF1ZXN0LnVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlcXVlc3QuaGVhZGVyc1toXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdIZWFkZXJFcnJvcihoICsgJyB3YXMgbm90IGluIHRoZSByZXF1ZXN0Jyk7XG4gICAgICAgIHBhcnNlZC5zaWduaW5nU3RyaW5nICs9IGggKyAnOiAnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaSArIDEpIDwgcGFyc2VkLnBhcmFtcy5oZWFkZXJzLmxlbmd0aClcbiAgICAgICAgcGFyc2VkLnNpZ25pbmdTdHJpbmcgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgY29uc3RyYWludHNcbiAgICB2YXIgZGF0ZTtcbiAgICBpZiAocmVxdWVzdC5oZWFkZXJzLmRhdGUgfHwgcmVxdWVzdC5oZWFkZXJzWyd4LWRhdGUnXSkge1xuICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzWyd4LWRhdGUnXSkge1xuICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShyZXF1ZXN0LmhlYWRlcnNbJ3gtZGF0ZSddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRlID0gbmV3IERhdGUocmVxdWVzdC5oZWFkZXJzLmRhdGUpO1xuICAgICAgICB9XG4gICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIHZhciBza2V3ID0gTWF0aC5hYnMobm93LmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZSgpKTtcblxuICAgICAgaWYgKHNrZXcgPiBvcHRpb25zLmNsb2NrU2tldyAqIDEwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4cGlyZWRSZXF1ZXN0RXJyb3IoJ2Nsb2NrIHNrZXcgb2YgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2V3IC8gMTAwMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncyB3YXMgZ3JlYXRlciB0aGFuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNsb2NrU2tldyArICdzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3B0aW9ucy5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhkcikge1xuICAgICAgLy8gUmVtZW1iZXIgdGhhdCB3ZSBhbHJlYWR5IGNoZWNrZWQgYW55IGhlYWRlcnMgaW4gdGhlIHBhcmFtc1xuICAgICAgLy8gd2VyZSBpbiB0aGUgcmVxdWVzdCwgc28gaWYgdGhpcyBwYXNzZXMgd2UncmUgZ29vZC5cbiAgICAgIGlmIChwYXJzZWQucGFyYW1zLmhlYWRlcnMuaW5kZXhPZihoZHIudG9Mb3dlckNhc2UoKSkgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0hlYWRlckVycm9yKGhkciArICcgd2FzIG5vdCBhIHNpZ25lZCBoZWFkZXInKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmFsZ29yaXRobXMpIHtcbiAgICAgIGlmIChvcHRpb25zLmFsZ29yaXRobXMuaW5kZXhPZihwYXJzZWQucGFyYW1zLmFsZ29yaXRobSkgPT09IC0xKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtc0Vycm9yKHBhcnNlZC5wYXJhbXMuYWxnb3JpdGhtICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGlzIG5vdCBhIHN1cHBvcnRlZCBhbGdvcml0aG0nKTtcbiAgICB9XG5cbiAgICBwYXJzZWQuYWxnb3JpdGhtID0gcGFyc2VkLnBhcmFtcy5hbGdvcml0aG0udG9VcHBlckNhc2UoKTtcbiAgICBwYXJzZWQua2V5SWQgPSBwYXJzZWQucGFyYW1zLmtleUlkO1xuICAgIHJldHVybiBwYXJzZWQ7XG4gIH1cblxufTtcbiIsICIvKlxuICogZXh0c3ByaW50Zi5qczogZXh0ZW5kZWQgUE9TSVgtc3R5bGUgc3ByaW50ZlxuICovXG5cbnZhciBtb2RfYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgbW9kX3V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qXG4gKiBQdWJsaWMgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydHMuc3ByaW50ZiA9IGpzU3ByaW50ZjtcbmV4cG9ydHMucHJpbnRmID0ganNQcmludGY7XG5leHBvcnRzLmZwcmludGYgPSBqc0ZwcmludGY7XG5cbi8qXG4gKiBTdHJpcHBlZCBkb3duIHZlcnNpb24gb2Ygc1tuXXByaW50ZigzYykuICBXZSBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdGhyb3cgYW5cbiAqIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIGEgZm9ybWF0IHN0cmluZyB3ZSBkb24ndCB1bmRlcnN0YW5kLCByYXRoZXIgdGhhblxuICogaWdub3JpbmcgaXQsIHNvIHRoYXQgd2Ugd29uJ3QgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgaWYvd2hlbiB3ZSBnbyBpbXBsZW1lbnRcbiAqIHRoZSByZXN0IG9mIHRoaXMuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgc3VwcG9ydHMgc3BlY2lmeWluZ1xuICpcdC0gZmllbGQgYWxpZ25tZW50ICgnLScgZmxhZyksXG4gKiBcdC0gemVyby1wYWQgKCcwJyBmbGFnKVxuICpcdC0gYWx3YXlzIHNob3cgbnVtZXJpYyBzaWduICgnKycgZmxhZyksXG4gKlx0LSBmaWVsZCB3aWR0aFxuICpcdC0gY29udmVyc2lvbnMgZm9yIHN0cmluZ3MsIGRlY2ltYWwgaW50ZWdlcnMsIGFuZCBmbG9hdHMgKG51bWJlcnMpLlxuICpcdC0gYXJndW1lbnQgc2l6ZSBzcGVjaWZpZXJzLiAgVGhlc2UgYXJlIGFsbCBhY2NlcHRlZCBidXQgaWdub3JlZCwgc2luY2VcbiAqXHQgIEphdmFzY3JpcHQgaGFzIG5vIG5vdGlvbiBvZiB0aGUgcGh5c2ljYWwgc2l6ZSBvZiBhbiBhcmd1bWVudC5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLCBtb3N0IG5vdGFibHkgcHJlY2lzaW9uLCB1bnNpZ25lZFxuICogbnVtYmVycywgbm9uLWRlY2ltYWwgbnVtYmVycywgYW5kIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIGpzU3ByaW50ZihmbXQpXG57XG5cdHZhciByZWdleCA9IFtcblx0ICAgICcoW14lXSopJyxcdFx0XHRcdC8qIG5vcm1hbCB0ZXh0ICovXG5cdCAgICAnJScsXHRcdFx0XHQvKiBzdGFydCBvZiBmb3JtYXQgKi9cblx0ICAgICcoW1xcJ1xcXFwtKyAjMF0qPyknLFx0XHRcdC8qIGZsYWdzIChvcHRpb25hbCkgKi9cblx0ICAgICcoWzEtOV1cXFxcZCopPycsXHRcdFx0Lyogd2lkdGggKG9wdGlvbmFsKSAqL1xuXHQgICAgJyhcXFxcLihbMS05XVxcXFxkKikpPycsXHRcdC8qIHByZWNpc2lvbiAob3B0aW9uYWwpICovXG5cdCAgICAnW2xoanp0TF0qPycsXHRcdFx0LyogbGVuZ3RoIG1vZHMgKGlnbm9yZWQpICovXG5cdCAgICAnKFtkaW91eFhmRmVFZ0dhQWNDc1NwJWpyXSknXHQvKiBjb252ZXJzaW9uICovXG5cdF0uam9pbignJyk7XG5cblx0dmFyIHJlID0gbmV3IFJlZ0V4cChyZWdleCk7XG5cdHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblx0dmFyIGZsYWdzLCB3aWR0aCwgcHJlY2lzaW9uLCBjb252ZXJzaW9uO1xuXHR2YXIgbGVmdCwgcGFkLCBzaWduLCBhcmcsIG1hdGNoO1xuXHR2YXIgcmV0ID0gJyc7XG5cdHZhciBhcmduID0gMTtcblxuXHRtb2RfYXNzZXJ0LmVxdWFsKCdzdHJpbmcnLCB0eXBlb2YgKGZtdCkpO1xuXG5cdHdoaWxlICgobWF0Y2ggPSByZS5leGVjKGZtdCkpICE9PSBudWxsKSB7XG5cdFx0cmV0ICs9IG1hdGNoWzFdO1xuXHRcdGZtdCA9IGZtdC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcblxuXHRcdGZsYWdzID0gbWF0Y2hbMl0gfHwgJyc7XG5cdFx0d2lkdGggPSBtYXRjaFszXSB8fCAwO1xuXHRcdHByZWNpc2lvbiA9IG1hdGNoWzRdIHx8ICcnO1xuXHRcdGNvbnZlcnNpb24gPSBtYXRjaFs2XTtcblx0XHRsZWZ0ID0gZmFsc2U7XG5cdFx0c2lnbiA9IGZhbHNlO1xuXHRcdHBhZCA9ICcgJztcblxuXHRcdGlmIChjb252ZXJzaW9uID09ICclJykge1xuXHRcdFx0cmV0ICs9ICclJztcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChhcmdzLmxlbmd0aCA9PT0gMClcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ3RvbyBmZXcgYXJncyB0byBzcHJpbnRmJykpO1xuXG5cdFx0YXJnID0gYXJncy5zaGlmdCgpO1xuXHRcdGFyZ24rKztcblxuXHRcdGlmIChmbGFncy5tYXRjaCgvW1xcJyAjXS8pKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcihcblx0XHRcdCAgICAndW5zdXBwb3J0ZWQgZmxhZ3M6ICcgKyBmbGFncykpO1xuXG5cdFx0aWYgKHByZWNpc2lvbi5sZW5ndGggPiAwKVxuXHRcdFx0dGhyb3cgKG5ldyBFcnJvcihcblx0XHRcdCAgICAnbm9uLXplcm8gcHJlY2lzaW9uIG5vdCBzdXBwb3J0ZWQnKSk7XG5cblx0XHRpZiAoZmxhZ3MubWF0Y2goLy0vKSlcblx0XHRcdGxlZnQgPSB0cnVlO1xuXG5cdFx0aWYgKGZsYWdzLm1hdGNoKC8wLykpXG5cdFx0XHRwYWQgPSAnMCc7XG5cblx0XHRpZiAoZmxhZ3MubWF0Y2goL1xcKy8pKVxuXHRcdFx0c2lnbiA9IHRydWU7XG5cblx0XHRzd2l0Y2ggKGNvbnZlcnNpb24pIHtcblx0XHRjYXNlICdzJzpcblx0XHRcdGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpXG5cdFx0XHRcdHRocm93IChuZXcgRXJyb3IoJ2FyZ3VtZW50ICcgKyBhcmduICtcblx0XHRcdFx0ICAgICc6IGF0dGVtcHRlZCB0byBwcmludCB1bmRlZmluZWQgb3IgbnVsbCAnICtcblx0XHRcdFx0ICAgICdhcyBhIHN0cmluZycpKTtcblx0XHRcdHJldCArPSBkb1BhZChwYWQsIHdpZHRoLCBsZWZ0LCBhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2QnOlxuXHRcdFx0YXJnID0gTWF0aC5mbG9vcihhcmcpO1xuXHRcdFx0Lypqc2w6ZmFsbHRocnUqL1xuXHRcdGNhc2UgJ2YnOlxuXHRcdFx0c2lnbiA9IHNpZ24gJiYgYXJnID4gMCA/ICcrJyA6ICcnO1xuXHRcdFx0cmV0ICs9IHNpZ24gKyBkb1BhZChwYWQsIHdpZHRoLCBsZWZ0LFxuXHRcdFx0ICAgIGFyZy50b1N0cmluZygpKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAneCc6XG5cdFx0XHRyZXQgKz0gZG9QYWQocGFkLCB3aWR0aCwgbGVmdCwgYXJnLnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2onOiAvKiBub24tc3RhbmRhcmQgKi9cblx0XHRcdGlmICh3aWR0aCA9PT0gMClcblx0XHRcdFx0d2lkdGggPSAxMDtcblx0XHRcdHJldCArPSBtb2RfdXRpbC5pbnNwZWN0KGFyZywgZmFsc2UsIHdpZHRoKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAncic6IC8qIG5vbi1zdGFuZGFyZCAqL1xuXHRcdFx0cmV0ICs9IGR1bXBFeGNlcHRpb24oYXJnKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IChuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGNvbnZlcnNpb246ICcgK1xuXHRcdFx0ICAgIGNvbnZlcnNpb24pKTtcblx0XHR9XG5cdH1cblxuXHRyZXQgKz0gZm10O1xuXHRyZXR1cm4gKHJldCk7XG59XG5cbmZ1bmN0aW9uIGpzUHJpbnRmKCkge1xuXHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdGFyZ3MudW5zaGlmdChwcm9jZXNzLnN0ZG91dCk7XG5cdGpzRnByaW50Zi5hcHBseShudWxsLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24ganNGcHJpbnRmKHN0cmVhbSkge1xuXHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cdHJldHVybiAoc3RyZWFtLndyaXRlKGpzU3ByaW50Zi5hcHBseSh0aGlzLCBhcmdzKSkpO1xufVxuXG5mdW5jdGlvbiBkb1BhZChjaHIsIHdpZHRoLCBsZWZ0LCBzdHIpXG57XG5cdHZhciByZXQgPSBzdHI7XG5cblx0d2hpbGUgKHJldC5sZW5ndGggPCB3aWR0aCkge1xuXHRcdGlmIChsZWZ0KVxuXHRcdFx0cmV0ICs9IGNocjtcblx0XHRlbHNlXG5cdFx0XHRyZXQgPSBjaHIgKyByZXQ7XG5cdH1cblxuXHRyZXR1cm4gKHJldCk7XG59XG5cbi8qXG4gKiBUaGlzIGZ1bmN0aW9uIGR1bXBzIGxvbmcgc3RhY2sgdHJhY2VzIGZvciBleGNlcHRpb25zIGhhdmluZyBhIGNhdXNlKCkgbWV0aG9kLlxuICogU2VlIG5vZGUtdmVycm9yIGZvciBhbiBleGFtcGxlLlxuICovXG5mdW5jdGlvbiBkdW1wRXhjZXB0aW9uKGV4KVxue1xuXHR2YXIgcmV0O1xuXG5cdGlmICghKGV4IGluc3RhbmNlb2YgRXJyb3IpKVxuXHRcdHRocm93IChuZXcgRXJyb3IoanNTcHJpbnRmKCdpbnZhbGlkIHR5cGUgZm9yICUlcjogJWonLCBleCkpKTtcblxuXHQvKiBOb3RlIHRoYXQgVjggcHJlcGVuZHMgXCJleC5zdGFja1wiIHdpdGggZXgudG9TdHJpbmcoKS4gKi9cblx0cmV0ID0gJ0VYQ0VQVElPTjogJyArIGV4LmNvbnN0cnVjdG9yLm5hbWUgKyAnOiAnICsgZXguc3RhY2s7XG5cblx0aWYgKGV4LmNhdXNlICYmIHR5cGVvZiAoZXguY2F1c2UpID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGNleCA9IGV4LmNhdXNlKCk7XG5cdFx0aWYgKGNleCkge1xuXHRcdFx0cmV0ICs9ICdcXG5DYXVzZWQgYnk6ICcgKyBkdW1wRXhjZXB0aW9uKGNleCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIChyZXQpO1xufVxuIiwgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsICIvKlxuICogdmVycm9yLmpzOiByaWNoZXIgSmF2YVNjcmlwdCBlcnJvcnNcbiAqL1xuXG52YXIgbW9kX2Fzc2VydHBsdXMgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIG1vZF91dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgbW9kX2V4dHNwcmludGYgPSByZXF1aXJlKCdleHRzcHJpbnRmJyk7XG52YXIgbW9kX2lzRXJyb3IgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKS5pc0Vycm9yO1xudmFyIHNwcmludGYgPSBtb2RfZXh0c3ByaW50Zi5zcHJpbnRmO1xuXG4vKlxuICogUHVibGljIGludGVyZmFjZVxuICovXG5cbi8qIFNvIHlvdSBjYW4gJ3ZhciBWRXJyb3IgPSByZXF1aXJlKCd2ZXJyb3InKScgKi9cbm1vZHVsZS5leHBvcnRzID0gVkVycm9yO1xuLyogRm9yIGNvbXBhdGliaWxpdHkgKi9cblZFcnJvci5WRXJyb3IgPSBWRXJyb3I7XG4vKiBPdGhlciBleHBvcnRlZCBjbGFzc2VzICovXG5WRXJyb3IuU0Vycm9yID0gU0Vycm9yO1xuVkVycm9yLldFcnJvciA9IFdFcnJvcjtcblZFcnJvci5NdWx0aUVycm9yID0gTXVsdGlFcnJvcjtcblxuLypcbiAqIENvbW1vbiBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgVkVycm9yLCBXRXJyb3IsIGFuZFxuICogU0Vycm9yLiAgTmFtZWQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb246XG4gKlxuICogICAgIHN0cmljdFx0XHRmb3JjZSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2Ygc3ByaW50ZiBhcmd1bWVudHMsIGV2ZW5cbiAqICAgICBcdFx0XHRpZiB0aGUgb3B0aW9ucyBpbiBcImFyZ3ZcIiBkb24ndCBzYXkgc29cbiAqXG4gKiAgICAgYXJndlx0XHRlcnJvcidzIGNvbnN0cnVjdG9yIGFyZ3VtZW50cywgd2hpY2ggYXJlIHRvIGJlXG4gKiAgICAgXHRcdFx0aW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFJFQURNRS5tZC4gIEZvciBxdWlja1xuICogICAgIFx0XHRcdHJlZmVyZW5jZSwgXCJhcmd2XCIgaGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOlxuICpcbiAqICAgICAgICAgIFsgc3ByaW50Zl9hcmdzLi4uIF0gICAgICAgICAgIChhcmd2WzBdIGlzIGEgc3RyaW5nKVxuICogICAgICAgICAgWyBjYXVzZSwgc3ByaW50Zl9hcmdzLi4uIF0gICAgKGFyZ3ZbMF0gaXMgYW4gRXJyb3IpXG4gKiAgICAgICAgICBbIG9wdGlvbnMsIHNwcmludGZfYXJncy4uLiBdICAoYXJndlswXSBpcyBhbiBvYmplY3QpXG4gKlxuICogVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIHRoZXNlIGZvcm1zLCBwcm9kdWNpbmcgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAgICBvcHRpb25zICAgICAgICAgICBlcXVpdmFsZW50IHRvIFwib3B0aW9uc1wiIGluIHRoaXJkIGZvcm0uICBUaGlzIHdpbGwgbmV2ZXJcbiAqICAgIFx0XHRcdGJlIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB3aGF0IHRoZSBjYWxsZXIgcGFzc2VkIGluXG4gKiAgICBcdFx0XHQoaS5lLiwgaXQgbWF5IGJlIGEgc2hhbGxvdyBjb3B5KSwgc28gaXQgY2FuIGJlIGZyZWVseVxuICogICAgXHRcdFx0bW9kaWZpZWQuXG4gKlxuICogICAgc2hvcnRtZXNzYWdlICAgICAgcmVzdWx0IG9mIHNwcmludGYoc3ByaW50Zl9hcmdzKSwgdGFraW5nIG9wdGlvbnMuc3RyaWN0XG4gKiAgICBcdFx0XHRpbnRvIGFjY291bnQgYXMgZGVzY3JpYmVkIGluIFJFQURNRS5tZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb25zdHJ1Y3RvckFyZ3VtZW50cyhhcmdzKVxue1xuXHR2YXIgYXJndiwgb3B0aW9ucywgc3ByaW50Zl9hcmdzLCBzaG9ydG1lc3NhZ2UsIGs7XG5cblx0bW9kX2Fzc2VydHBsdXMub2JqZWN0KGFyZ3MsICdhcmdzJyk7XG5cdG1vZF9hc3NlcnRwbHVzLmJvb2woYXJncy5zdHJpY3QsICdhcmdzLnN0cmljdCcpO1xuXHRtb2RfYXNzZXJ0cGx1cy5hcnJheShhcmdzLmFyZ3YsICdhcmdzLmFyZ3YnKTtcblx0YXJndiA9IGFyZ3MuYXJndjtcblxuXHQvKlxuXHQgKiBGaXJzdCwgZmlndXJlIG91dCB3aGljaCBmb3JtIG9mIGludm9jYXRpb24gd2UndmUgYmVlbiBnaXZlbi5cblx0ICovXG5cdGlmIChhcmd2Lmxlbmd0aCA9PT0gMCkge1xuXHRcdG9wdGlvbnMgPSB7fTtcblx0XHRzcHJpbnRmX2FyZ3MgPSBbXTtcblx0fSBlbHNlIGlmIChtb2RfaXNFcnJvcihhcmd2WzBdKSkge1xuXHRcdG9wdGlvbnMgPSB7ICdjYXVzZSc6IGFyZ3ZbMF0gfTtcblx0XHRzcHJpbnRmX2FyZ3MgPSBhcmd2LnNsaWNlKDEpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiAoYXJndlswXSkgPT09ICdvYmplY3QnKSB7XG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRcdGZvciAoayBpbiBhcmd2WzBdKSB7XG5cdFx0XHRvcHRpb25zW2tdID0gYXJndlswXVtrXTtcblx0XHR9XG5cdFx0c3ByaW50Zl9hcmdzID0gYXJndi5zbGljZSgxKTtcblx0fSBlbHNlIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5zdHJpbmcoYXJndlswXSxcblx0XHQgICAgJ2ZpcnN0IGFyZ3VtZW50IHRvIFZFcnJvciwgU0Vycm9yLCBvciBXRXJyb3IgJyArXG5cdFx0ICAgICdjb25zdHJ1Y3RvciBtdXN0IGJlIGEgc3RyaW5nLCBvYmplY3QsIG9yIEVycm9yJyk7XG5cdFx0b3B0aW9ucyA9IHt9O1xuXHRcdHNwcmludGZfYXJncyA9IGFyZ3Y7XG5cdH1cblxuXHQvKlxuXHQgKiBOb3cgY29uc3RydWN0IHRoZSBlcnJvcidzIG1lc3NhZ2UuXG5cdCAqXG5cdCAqIGV4dHNwcmludGYgKHdoaWNoIHdlIGludm9rZSBoZXJlIHdpdGggb3VyIGNhbGxlcidzIGFyZ3VtZW50cyBpbiBvcmRlclxuXHQgKiB0byBjb25zdHJ1Y3QgdGhpcyBFcnJvcidzIG1lc3NhZ2UpIGlzIHN0cmljdCBpbiBpdHMgaW50ZXJwcmV0YXRpb24gb2Zcblx0ICogdmFsdWVzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgXCIlc1wiIHNwZWNpZmllci4gIFRoZSB2YWx1ZSBwYXNzZWQgdG9cblx0ICogZXh0c3ByaW50ZiBtdXN0IGFjdHVhbGx5IGJlIGEgc3RyaW5nIG9yIHNvbWV0aGluZyBjb252ZXJ0aWJsZSB0byBhXG5cdCAqIFN0cmluZyB1c2luZyAudG9TdHJpbmcoKS4gIFBhc3Npbmcgb3RoZXIgdmFsdWVzIChub3RhYmx5IFwibnVsbFwiIGFuZFxuXHQgKiBcInVuZGVmaW5lZFwiKSBpcyBjb25zaWRlcmVkIGEgcHJvZ3JhbW1lciBlcnJvci4gIFRoZSBhc3N1bXB0aW9uIGlzXG5cdCAqIHRoYXQgaWYgeW91IGFjdHVhbGx5IHdhbnQgdG8gcHJpbnQgdGhlIHN0cmluZyBcIm51bGxcIiBvciBcInVuZGVmaW5lZFwiLFxuXHQgKiB0aGVuIHRoYXQncyBlYXN5IHRvIGRvIHRoYXQgd2hlbiB5b3UncmUgY2FsbGluZyBleHRzcHJpbnRmOyBvbiB0aGVcblx0ICogb3RoZXIgaGFuZCwgaWYgeW91IGRpZCBOT1Qgd2FudCB0aGF0IChpLmUuLCB0aGVyZSdzIGFjdHVhbGx5IGEgYnVnXG5cdCAqIHdoZXJlIHRoZSBwcm9ncmFtIGFzc3VtZXMgc29tZSB2YXJpYWJsZSBpcyBub24tbnVsbCBhbmQgdHJpZXMgdG9cblx0ICogcHJpbnQgaXQsIHdoaWNoIG1pZ2h0IGhhcHBlbiB3aGVuIGNvbnN0cnVjdGluZyBhIHBhY2tldCBvciBmaWxlIGluXG5cdCAqIHNvbWUgc3BlY2lmaWMgZm9ybWF0KSwgdGhlbiBpdCdzIGJldHRlciB0byBzdG9wIGltbWVkaWF0ZWx5IHRoYW5cblx0ICogcHJvZHVjZSBib2d1cyBvdXRwdXQuXG5cdCAqXG5cdCAqIEhvd2V2ZXIsIHNvbWV0aW1lcyB0aGUgYnVnIGlzIG9ubHkgaW4gdGhlIGNvZGUgY2FsbGluZyBWRXJyb3IsIGFuZCBhXG5cdCAqIHByb2dyYW1tZXIgbWlnaHQgcHJlZmVyIHRvIGhhdmUgdGhlIGVycm9yIG1lc3NhZ2UgY29udGFpbiBcIm51bGxcIiBvclxuXHQgKiBcInVuZGVmaW5lZFwiIHJhdGhlciB0aGFuIGhhdmUgdGhlIGJ1ZyBpbiB0aGUgZXJyb3IgcGF0aCBjcmFzaCB0aGVcblx0ICogcHJvZ3JhbSAobWFraW5nIHRoZSBmaXJzdCBidWcgaGFyZGVyIHRvIGlkZW50aWZ5KS4gIEZvciB0aGF0IHJlYXNvbixcblx0ICogYnkgZGVmYXVsdCBWRXJyb3IgY29udmVydHMgXCJudWxsXCIgb3IgXCJ1bmRlZmluZWRcIiBhcmd1bWVudHMgdG8gdGhlaXJcblx0ICogc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBhbmQgcGFzc2VzIHRob3NlIHRvIGV4dHNwcmludGYuICBQcm9ncmFtbWVyc1xuXHQgKiBkZXNpcmluZyB0aGUgc3RyaWN0IGJlaGF2aW9yIGNhbiB1c2UgdGhlIFNFcnJvciBjbGFzcyBvciBwYXNzIHRoZVxuXHQgKiBcInN0cmljdFwiIG9wdGlvbiB0byB0aGUgVkVycm9yIGNvbnN0cnVjdG9yLlxuXHQgKi9cblx0bW9kX2Fzc2VydHBsdXMub2JqZWN0KG9wdGlvbnMpO1xuXHRpZiAoIW9wdGlvbnMuc3RyaWN0ICYmICFhcmdzLnN0cmljdCkge1xuXHRcdHNwcmludGZfYXJncyA9IHNwcmludGZfYXJncy5tYXAoZnVuY3Rpb24gKGEpIHtcblx0XHRcdHJldHVybiAoYSA9PT0gbnVsbCA/ICdudWxsJyA6XG5cdFx0XHQgICAgYSA9PT0gdW5kZWZpbmVkID8gJ3VuZGVmaW5lZCcgOiBhKTtcblx0XHR9KTtcblx0fVxuXG5cdGlmIChzcHJpbnRmX2FyZ3MubGVuZ3RoID09PSAwKSB7XG5cdFx0c2hvcnRtZXNzYWdlID0gJyc7XG5cdH0gZWxzZSB7XG5cdFx0c2hvcnRtZXNzYWdlID0gc3ByaW50Zi5hcHBseShudWxsLCBzcHJpbnRmX2FyZ3MpO1xuXHR9XG5cblx0cmV0dXJuICh7XG5cdCAgICAnb3B0aW9ucyc6IG9wdGlvbnMsXG5cdCAgICAnc2hvcnRtZXNzYWdlJzogc2hvcnRtZXNzYWdlXG5cdH0pO1xufVxuXG4vKlxuICogU2VlIFJFQURNRS5tZCBmb3IgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIFZFcnJvcigpXG57XG5cdHZhciBhcmdzLCBvYmosIHBhcnNlZCwgY2F1c2UsIGN0b3IsIG1lc3NhZ2UsIGs7XG5cblx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cblx0Lypcblx0ICogVGhpcyBpcyBhIHJlZ3JldHRhYmxlIHBhdHRlcm4sIGJ1dCBKYXZhU2NyaXB0J3MgYnVpbHQtaW4gRXJyb3IgY2xhc3Ncblx0ICogaXMgZGVmaW5lZCB0byB3b3JrIHRoaXMgd2F5LCBzbyB3ZSBhbGxvdyB0aGUgY29uc3RydWN0b3IgdG8gYmUgY2FsbGVkXG5cdCAqIHdpdGhvdXQgXCJuZXdcIi5cblx0ICovXG5cdGlmICghKHRoaXMgaW5zdGFuY2VvZiBWRXJyb3IpKSB7XG5cdFx0b2JqID0gT2JqZWN0LmNyZWF0ZShWRXJyb3IucHJvdG90eXBlKTtcblx0XHRWRXJyb3IuYXBwbHkob2JqLCBhcmd1bWVudHMpO1xuXHRcdHJldHVybiAob2JqKTtcblx0fVxuXG5cdC8qXG5cdCAqIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHN1cHBvcnQgc2V2ZXJhbFxuXHQgKiBkaWZmZXJlbnQgY2FsbGluZyBmb3Jtcy4gIE5vcm1hbGl6ZSB0aGVtIGhlcmUuXG5cdCAqL1xuXHRwYXJzZWQgPSBwYXJzZUNvbnN0cnVjdG9yQXJndW1lbnRzKHtcblx0ICAgICdhcmd2JzogYXJncyxcblx0ICAgICdzdHJpY3QnOiBmYWxzZVxuXHR9KTtcblxuXHQvKlxuXHQgKiBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbmFtZSwgYXBwbHkgaXQgbm93LlxuXHQgKi9cblx0aWYgKHBhcnNlZC5vcHRpb25zLm5hbWUpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5zdHJpbmcocGFyc2VkLm9wdGlvbnMubmFtZSxcblx0XHQgICAgJ2Vycm9yXFwncyBcIm5hbWVcIiBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cdFx0dGhpcy5uYW1lID0gcGFyc2VkLm9wdGlvbnMubmFtZTtcblx0fVxuXG5cdC8qXG5cdCAqIEZvciBkZWJ1Z2dpbmcsIHdlIGtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIHNob3J0IG1lc3NhZ2UgKGF0dGFjaGVkXG5cdCAqIHRoaXMgRXJyb3IgcGFydGljdWxhcmx5KSBzZXBhcmF0ZWx5IGZyb20gdGhlIGNvbXBsZXRlIG1lc3NhZ2UgKHdoaWNoXG5cdCAqIGluY2x1ZGVzIHRoZSBtZXNzYWdlcyBvZiBvdXIgY2F1c2UgY2hhaW4pLlxuXHQgKi9cblx0dGhpcy5qc2Vfc2hvcnRtc2cgPSBwYXJzZWQuc2hvcnRtZXNzYWdlO1xuXHRtZXNzYWdlID0gcGFyc2VkLnNob3J0bWVzc2FnZTtcblxuXHQvKlxuXHQgKiBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGEgY2F1c2UsIHJlY29yZCBhIHJlZmVyZW5jZSB0byBpdCBhbmQgdXBkYXRlIG91clxuXHQgKiBtZXNzYWdlIGFwcHJvcHJpYXRlbHkuXG5cdCAqL1xuXHRjYXVzZSA9IHBhcnNlZC5vcHRpb25zLmNhdXNlO1xuXHRpZiAoY2F1c2UpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihjYXVzZSksICdjYXVzZSBpcyBub3QgYW4gRXJyb3InKTtcblx0XHR0aGlzLmpzZV9jYXVzZSA9IGNhdXNlO1xuXG5cdFx0aWYgKCFwYXJzZWQub3B0aW9ucy5za2lwQ2F1c2VNZXNzYWdlKSB7XG5cdFx0XHRtZXNzYWdlICs9ICc6ICcgKyBjYXVzZS5tZXNzYWdlO1xuXHRcdH1cblx0fVxuXG5cdC8qXG5cdCAqIElmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcywgc2hhbGxvdy1jb3B5IHRoYXRcblx0ICogaGVyZS4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGEgZGVlcCBjb3B5IGluIGNhc2UgdGhlcmUgYXJlIG5vbi1wbGFpblxuXHQgKiBvYmplY3RzIGhlcmUsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aGUgb3JpZ2luYWwgb2JqZWN0IGluIGNhc2Vcblx0ICogdGhlIGNhbGxlciBtb2RpZmllcyBpdCBsYXRlci5cblx0ICovXG5cdHRoaXMuanNlX2luZm8gPSB7fTtcblx0aWYgKHBhcnNlZC5vcHRpb25zLmluZm8pIHtcblx0XHRmb3IgKGsgaW4gcGFyc2VkLm9wdGlvbnMuaW5mbykge1xuXHRcdFx0dGhpcy5qc2VfaW5mb1trXSA9IHBhcnNlZC5vcHRpb25zLmluZm9ba107XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0RXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuXHRpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcblx0XHRjdG9yID0gcGFyc2VkLm9wdGlvbnMuY29uc3RydWN0b3JPcHQgfHwgdGhpcy5jb25zdHJ1Y3Rvcjtcblx0XHRFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBjdG9yKTtcblx0fVxuXG5cdHJldHVybiAodGhpcyk7XG59XG5cbm1vZF91dGlsLmluaGVyaXRzKFZFcnJvciwgRXJyb3IpO1xuVkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ1ZFcnJvcic7XG5cblZFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB2ZV90b1N0cmluZygpXG57XG5cdHZhciBzdHIgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpICYmIHRoaXMubmFtZSB8fFxuXHRcdHRoaXMuY29uc3RydWN0b3IubmFtZSB8fCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lKTtcblx0aWYgKHRoaXMubWVzc2FnZSlcblx0XHRzdHIgKz0gJzogJyArIHRoaXMubWVzc2FnZTtcblxuXHRyZXR1cm4gKHN0cik7XG59O1xuXG4vKlxuICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkuICBOZXcgY2FsbGVycyBzaG91bGQgdXNlXG4gKiBWRXJyb3IuY2F1c2UoKSBpbnN0ZWFkLiAgVGhhdCBtZXRob2QgYWxzbyB1c2VzIHRoZSBzYW5lciBgbnVsbGAgcmV0dXJuIHZhbHVlXG4gKiB3aGVuIHRoZXJlIGlzIG5vIGNhdXNlLlxuICovXG5WRXJyb3IucHJvdG90eXBlLmNhdXNlID0gZnVuY3Rpb24gdmVfY2F1c2UoKVxue1xuXHR2YXIgY2F1c2UgPSBWRXJyb3IuY2F1c2UodGhpcyk7XG5cdHJldHVybiAoY2F1c2UgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjYXVzZSk7XG59O1xuXG4vKlxuICogU3RhdGljIG1ldGhvZHNcbiAqXG4gKiBUaGVzZSBjbGFzcy1sZXZlbCBtZXRob2RzIGFyZSBwcm92aWRlZCBzbyB0aGF0IGNhbGxlcnMgY2FuIHVzZSB0aGVtIG9uXG4gKiBpbnN0YW5jZXMgb2YgRXJyb3JzIHRoYXQgYXJlIG5vdCBWRXJyb3JzLiAgTmV3IGludGVyZmFjZXMgc2hvdWxkIGJlIHByb3ZpZGVkXG4gKiBvbmx5IHVzaW5nIHN0YXRpYyBtZXRob2RzIHRvIGVsaW1pbmF0ZSB0aGUgY2xhc3Mgb2YgcHJvZ3JhbW1pbmcgbWlzdGFrZSB3aGVyZVxuICogcGVvcGxlIGZhaWwgdG8gY2hlY2sgd2hldGhlciB0aGUgRXJyb3Igb2JqZWN0IGhhcyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzLlxuICovXG5cblZFcnJvci5jYXVzZSA9IGZ1bmN0aW9uIChlcnIpXG57XG5cdG1vZF9hc3NlcnRwbHVzLm9rKG1vZF9pc0Vycm9yKGVyciksICdlcnIgbXVzdCBiZSBhbiBFcnJvcicpO1xuXHRyZXR1cm4gKG1vZF9pc0Vycm9yKGVyci5qc2VfY2F1c2UpID8gZXJyLmpzZV9jYXVzZSA6IG51bGwpO1xufTtcblxuVkVycm9yLmluZm8gPSBmdW5jdGlvbiAoZXJyKVxue1xuXHR2YXIgcnYsIGNhdXNlLCBrO1xuXG5cdG1vZF9hc3NlcnRwbHVzLm9rKG1vZF9pc0Vycm9yKGVyciksICdlcnIgbXVzdCBiZSBhbiBFcnJvcicpO1xuXHRjYXVzZSA9IFZFcnJvci5jYXVzZShlcnIpO1xuXHRpZiAoY2F1c2UgIT09IG51bGwpIHtcblx0XHRydiA9IFZFcnJvci5pbmZvKGNhdXNlKTtcblx0fSBlbHNlIHtcblx0XHRydiA9IHt9O1xuXHR9XG5cblx0aWYgKHR5cGVvZiAoZXJyLmpzZV9pbmZvKSA9PSAnb2JqZWN0JyAmJiBlcnIuanNlX2luZm8gIT09IG51bGwpIHtcblx0XHRmb3IgKGsgaW4gZXJyLmpzZV9pbmZvKSB7XG5cdFx0XHRydltrXSA9IGVyci5qc2VfaW5mb1trXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gKHJ2KTtcbn07XG5cblZFcnJvci5maW5kQ2F1c2VCeU5hbWUgPSBmdW5jdGlvbiAoZXJyLCBuYW1lKVxue1xuXHR2YXIgY2F1c2U7XG5cblx0bW9kX2Fzc2VydHBsdXMub2sobW9kX2lzRXJyb3IoZXJyKSwgJ2VyciBtdXN0IGJlIGFuIEVycm9yJyk7XG5cdG1vZF9hc3NlcnRwbHVzLnN0cmluZyhuYW1lLCAnbmFtZScpO1xuXHRtb2RfYXNzZXJ0cGx1cy5vayhuYW1lLmxlbmd0aCA+IDAsICduYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuXG5cdGZvciAoY2F1c2UgPSBlcnI7IGNhdXNlICE9PSBudWxsOyBjYXVzZSA9IFZFcnJvci5jYXVzZShjYXVzZSkpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihjYXVzZSkpO1xuXHRcdGlmIChjYXVzZS5uYW1lID09IG5hbWUpIHtcblx0XHRcdHJldHVybiAoY2F1c2UpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiAobnVsbCk7XG59O1xuXG5WRXJyb3IuaGFzQ2F1c2VXaXRoTmFtZSA9IGZ1bmN0aW9uIChlcnIsIG5hbWUpXG57XG5cdHJldHVybiAoVkVycm9yLmZpbmRDYXVzZUJ5TmFtZShlcnIsIG5hbWUpICE9PSBudWxsKTtcbn07XG5cblZFcnJvci5mdWxsU3RhY2sgPSBmdW5jdGlvbiAoZXJyKVxue1xuXHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihlcnIpLCAnZXJyIG11c3QgYmUgYW4gRXJyb3InKTtcblxuXHR2YXIgY2F1c2UgPSBWRXJyb3IuY2F1c2UoZXJyKTtcblxuXHRpZiAoY2F1c2UpIHtcblx0XHRyZXR1cm4gKGVyci5zdGFjayArICdcXG5jYXVzZWQgYnk6ICcgKyBWRXJyb3IuZnVsbFN0YWNrKGNhdXNlKSk7XG5cdH1cblxuXHRyZXR1cm4gKGVyci5zdGFjayk7XG59O1xuXG5WRXJyb3IuZXJyb3JGcm9tTGlzdCA9IGZ1bmN0aW9uIChlcnJvcnMpXG57XG5cdG1vZF9hc3NlcnRwbHVzLmFycmF5T2ZPYmplY3QoZXJyb3JzLCAnZXJyb3JzJyk7XG5cblx0aWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gKG51bGwpO1xuXHR9XG5cblx0ZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0XHRtb2RfYXNzZXJ0cGx1cy5vayhtb2RfaXNFcnJvcihlKSk7XG5cdH0pO1xuXG5cdGlmIChlcnJvcnMubGVuZ3RoID09IDEpIHtcblx0XHRyZXR1cm4gKGVycm9yc1swXSk7XG5cdH1cblxuXHRyZXR1cm4gKG5ldyBNdWx0aUVycm9yKGVycm9ycykpO1xufTtcblxuVkVycm9yLmVycm9yRm9yRWFjaCA9IGZ1bmN0aW9uIChlcnIsIGZ1bmMpXG57XG5cdG1vZF9hc3NlcnRwbHVzLm9rKG1vZF9pc0Vycm9yKGVyciksICdlcnIgbXVzdCBiZSBhbiBFcnJvcicpO1xuXHRtb2RfYXNzZXJ0cGx1cy5mdW5jKGZ1bmMsICdmdW5jJyk7XG5cblx0aWYgKGVyciBpbnN0YW5jZW9mIE11bHRpRXJyb3IpIHtcblx0XHRlcnIuZXJyb3JzKCkuZm9yRWFjaChmdW5jdGlvbiBpdGVyRXJyb3IoZSkgeyBmdW5jKGUpOyB9KTtcblx0fSBlbHNlIHtcblx0XHRmdW5jKGVycik7XG5cdH1cbn07XG5cblxuLypcbiAqIFNFcnJvciBpcyBsaWtlIFZFcnJvciwgYnV0IHN0cmljdGVyIGFib3V0IHR5cGVzLiAgWW91IGNhbm5vdCBwYXNzIFwibnVsbFwiIG9yXG4gKiBcInVuZGVmaW5lZFwiIGFzIHN0cmluZyBhcmd1bWVudHMgdG8gdGhlIGZvcm1hdHRlci5cbiAqL1xuZnVuY3Rpb24gU0Vycm9yKClcbntcblx0dmFyIGFyZ3MsIG9iaiwgcGFyc2VkLCBvcHRpb25zO1xuXG5cdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgU0Vycm9yKSkge1xuXHRcdG9iaiA9IE9iamVjdC5jcmVhdGUoU0Vycm9yLnByb3RvdHlwZSk7XG5cdFx0U0Vycm9yLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcblx0XHRyZXR1cm4gKG9iaik7XG5cdH1cblxuXHRwYXJzZWQgPSBwYXJzZUNvbnN0cnVjdG9yQXJndW1lbnRzKHtcblx0ICAgICdhcmd2JzogYXJncyxcblx0ICAgICdzdHJpY3QnOiB0cnVlXG5cdH0pO1xuXG5cdG9wdGlvbnMgPSBwYXJzZWQub3B0aW9ucztcblx0VkVycm9yLmNhbGwodGhpcywgb3B0aW9ucywgJyVzJywgcGFyc2VkLnNob3J0bWVzc2FnZSk7XG5cblx0cmV0dXJuICh0aGlzKTtcbn1cblxuLypcbiAqIFdlIGRvbid0IGJvdGhlciBzZXR0aW5nIFNFcnJvci5wcm90b3R5cGUubmFtZSBiZWNhdXNlIG9uY2UgY29uc3RydWN0ZWQsXG4gKiBTRXJyb3JzIGFyZSBqdXN0IGxpa2UgVkVycm9ycy5cbiAqL1xubW9kX3V0aWwuaW5oZXJpdHMoU0Vycm9yLCBWRXJyb3IpO1xuXG5cbi8qXG4gKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBlcnJvcnMgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbnN1bWVycyB0aGF0IGdlbmVyYWxseVxuICogb25seSBkZWFsIHdpdGggb25lIGVycm9yLiAgQ2FsbGVycyBjYW4gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbCBlcnJvcnNcbiAqIGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdCwgYnV0IG1heSBhbHNvIGp1c3QgdHJlYXQgaXQgYXMgYSBub3JtYWwgc2luZ2xlXG4gKiBlcnJvciwgaW4gd2hpY2ggY2FzZSBhIHN1bW1hcnkgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQuXG4gKi9cbmZ1bmN0aW9uIE11bHRpRXJyb3IoZXJyb3JzKVxue1xuXHRtb2RfYXNzZXJ0cGx1cy5hcnJheShlcnJvcnMsICdsaXN0IG9mIGVycm9ycycpO1xuXHRtb2RfYXNzZXJ0cGx1cy5vayhlcnJvcnMubGVuZ3RoID4gMCwgJ211c3QgYmUgYXQgbGVhc3Qgb25lIGVycm9yJyk7XG5cdHRoaXMuYXNlX2Vycm9ycyA9IGVycm9ycztcblxuXHRWRXJyb3IuY2FsbCh0aGlzLCB7XG5cdCAgICAnY2F1c2UnOiBlcnJvcnNbMF1cblx0fSwgJ2ZpcnN0IG9mICVkIGVycm9yJXMnLCBlcnJvcnMubGVuZ3RoLCBlcnJvcnMubGVuZ3RoID09IDEgPyAnJyA6ICdzJyk7XG59XG5cbm1vZF91dGlsLmluaGVyaXRzKE11bHRpRXJyb3IsIFZFcnJvcik7XG5NdWx0aUVycm9yLnByb3RvdHlwZS5uYW1lID0gJ011bHRpRXJyb3InO1xuXG5NdWx0aUVycm9yLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbiBtZV9lcnJvcnMoKVxue1xuXHRyZXR1cm4gKHRoaXMuYXNlX2Vycm9ycy5zbGljZSgwKSk7XG59O1xuXG5cbi8qXG4gKiBTZWUgUkVBRE1FLm1kIGZvciByZWZlcmVuY2UgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gV0Vycm9yKClcbntcblx0dmFyIGFyZ3MsIG9iaiwgcGFyc2VkLCBvcHRpb25zO1xuXG5cdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgV0Vycm9yKSkge1xuXHRcdG9iaiA9IE9iamVjdC5jcmVhdGUoV0Vycm9yLnByb3RvdHlwZSk7XG5cdFx0V0Vycm9yLmFwcGx5KG9iaiwgYXJncyk7XG5cdFx0cmV0dXJuIChvYmopO1xuXHR9XG5cblx0cGFyc2VkID0gcGFyc2VDb25zdHJ1Y3RvckFyZ3VtZW50cyh7XG5cdCAgICAnYXJndic6IGFyZ3MsXG5cdCAgICAnc3RyaWN0JzogZmFsc2Vcblx0fSk7XG5cblx0b3B0aW9ucyA9IHBhcnNlZC5vcHRpb25zO1xuXHRvcHRpb25zWydza2lwQ2F1c2VNZXNzYWdlJ10gPSB0cnVlO1xuXHRWRXJyb3IuY2FsbCh0aGlzLCBvcHRpb25zLCAnJXMnLCBwYXJzZWQuc2hvcnRtZXNzYWdlKTtcblxuXHRyZXR1cm4gKHRoaXMpO1xufVxuXG5tb2RfdXRpbC5pbmhlcml0cyhXRXJyb3IsIFZFcnJvcik7XG5XRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnV0Vycm9yJztcblxuV0Vycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHdlX3RvU3RyaW5nKClcbntcblx0dmFyIHN0ciA9ICh0aGlzLmhhc093blByb3BlcnR5KCduYW1lJykgJiYgdGhpcy5uYW1lIHx8XG5cdFx0dGhpcy5jb25zdHJ1Y3Rvci5uYW1lIHx8IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLm5hbWUpO1xuXHRpZiAodGhpcy5tZXNzYWdlKVxuXHRcdHN0ciArPSAnOiAnICsgdGhpcy5tZXNzYWdlO1xuXHRpZiAodGhpcy5qc2VfY2F1c2UgJiYgdGhpcy5qc2VfY2F1c2UubWVzc2FnZSlcblx0XHRzdHIgKz0gJzsgY2F1c2VkIGJ5ICcgKyB0aGlzLmpzZV9jYXVzZS50b1N0cmluZygpO1xuXG5cdHJldHVybiAoc3RyKTtcbn07XG5cbi8qXG4gKiBGb3IgcHVyZWx5IGhpc3RvcmljYWwgcmVhc29ucywgV0Vycm9yJ3MgY2F1c2UoKSBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldFxuICogdGhlIGNhdXNlLlxuICovXG5XRXJyb3IucHJvdG90eXBlLmNhdXNlID0gZnVuY3Rpb24gd2VfY2F1c2UoYylcbntcblx0aWYgKG1vZF9pc0Vycm9yKGMpKVxuXHRcdHRoaXMuanNlX2NhdXNlID0gYztcblxuXHRyZXR1cm4gKHRoaXMuanNlX2NhdXNlKTtcbn07XG4iLCAiLyoqXHJcbiAqIEpTT05TY2hlbWEgVmFsaWRhdG9yIC0gVmFsaWRhdGVzIEphdmFTY3JpcHQgb2JqZWN0cyB1c2luZyBKU09OIFNjaGVtYXNcclxuICpcdChodHRwOi8vd3d3Lmpzb24uY29tL2pzb24tc2NoZW1hLXByb3Bvc2FsLylcclxuICogTGljZW5zZWQgdW5kZXIgQUZMLTIuMSBPUiBCU0QtMy1DbGF1c2VcclxuVG8gdXNlIHRoZSB2YWxpZGF0b3IgY2FsbCB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gd2l0aCBhbiBpbnN0YW5jZSBvYmplY3QgYW5kIGFuIG9wdGlvbmFsIHNjaGVtYSBvYmplY3QuXHJcbklmIGEgc2NoZW1hIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUuIElmIHRoZSBpbnN0YW5jZSBvYmplY3QgcmVmZXJzIHRvIGEgc2NoZW1hIChzZWxmLXZhbGlkYXRpbmcpLFxyXG50aGF0IHNjaGVtYSB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW5kIHRoZSBzY2hlbWEgcGFyYW1ldGVyIGlzIG5vdCBuZWNlc3NhcnkgKGlmIGJvdGggZXhpc3QsXHJcbmJvdGggdmFsaWRhdGlvbnMgd2lsbCBvY2N1cikuXHJcblRoZSB2YWxpZGF0ZSBtZXRob2Qgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvcnMuIElmIHRoZXJlIGFyZSBubyBlcnJvcnMsIHRoZW4gYW5cclxuZW1wdHkgbGlzdCB3aWxsIGJlIHJldHVybmVkLiBBIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBoYXZlIHR3byBwcm9wZXJ0aWVzOlxyXG5cInByb3BlcnR5XCIgd2hpY2ggaW5kaWNhdGVzIHdoaWNoIHByb3BlcnR5IGhhZCB0aGUgZXJyb3JcclxuXCJtZXNzYWdlXCIgd2hpY2ggaW5kaWNhdGVzIHdoYXQgdGhlIGVycm9yIHdhc1xyXG4gKi9cclxuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxyXG4gICAgICAgIGRlZmluZShbXSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xyXG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxyXG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxyXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cclxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzXHJcbiAgICAgICAgcm9vdC5qc29uU2NoZW1hID0gZmFjdG9yeSgpO1xyXG4gICAgfVxyXG59KHRoaXMsIGZ1bmN0aW9uICgpIHsvLyBzZXR1cCBwcmltaXRpdmUgY2xhc3NlcyB0byBiZSBKU09OIFNjaGVtYSB0eXBlc1xyXG52YXIgZXhwb3J0cyA9IHZhbGlkYXRlXHJcbmV4cG9ydHMuSW50ZWdlciA9IHt0eXBlOlwiaW50ZWdlclwifTtcclxudmFyIHByaW1pdGl2ZUNvbnN0cnVjdG9ycyA9IHtcclxuXHRTdHJpbmc6IFN0cmluZyxcclxuXHRCb29sZWFuOiBCb29sZWFuLFxyXG5cdE51bWJlcjogTnVtYmVyLFxyXG5cdE9iamVjdDogT2JqZWN0LFxyXG5cdEFycmF5OiBBcnJheSxcclxuXHREYXRlOiBEYXRlXHJcbn1cclxuZXhwb3J0cy52YWxpZGF0ZSA9IHZhbGlkYXRlO1xyXG5mdW5jdGlvbiB2YWxpZGF0ZSgvKkFueSovaW5zdGFuY2UsLypPYmplY3QqL3NjaGVtYSkge1xyXG5cdFx0Ly8gU3VtbWFyeTpcclxuXHRcdC8vICBcdFRvIHVzZSB0aGUgdmFsaWRhdG9yIGNhbGwgSlNPTlNjaGVtYS52YWxpZGF0ZSB3aXRoIGFuIGluc3RhbmNlIG9iamVjdCBhbmQgYW4gb3B0aW9uYWwgc2NoZW1hIG9iamVjdC5cclxuXHRcdC8vIFx0XHRJZiBhIHNjaGVtYSBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlLiBJZiB0aGUgaW5zdGFuY2Ugb2JqZWN0IHJlZmVycyB0byBhIHNjaGVtYSAoc2VsZi12YWxpZGF0aW5nKSxcclxuXHRcdC8vIFx0XHR0aGF0IHNjaGVtYSB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW5kIHRoZSBzY2hlbWEgcGFyYW1ldGVyIGlzIG5vdCBuZWNlc3NhcnkgKGlmIGJvdGggZXhpc3QsXHJcblx0XHQvLyBcdFx0Ym90aCB2YWxpZGF0aW9ucyB3aWxsIG9jY3VyKS5cclxuXHRcdC8vIFx0XHRUaGUgdmFsaWRhdGUgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHR3byBwcm9wZXJ0aWVzOlxyXG5cdFx0Ly8gXHRcdFx0dmFsaWQ6IEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBpbnN0YW5jZSBpcyB2YWxpZCBieSB0aGUgc2NoZW1hXHJcblx0XHQvLyBcdFx0XHRlcnJvcnM6IEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3JzLiBJZiB0aGVyZSBhcmUgbm8gZXJyb3JzLCB0aGVuIGFuXHJcblx0XHQvLyBcdFx0XHRcdFx0ZW1wdHkgbGlzdCB3aWxsIGJlIHJldHVybmVkLiBBIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBoYXZlIHR3byBwcm9wZXJ0aWVzOlxyXG5cdFx0Ly8gXHRcdFx0XHRcdFx0cHJvcGVydHk6IHdoaWNoIGluZGljYXRlcyB3aGljaCBwcm9wZXJ0eSBoYWQgdGhlIGVycm9yXHJcblx0XHQvLyBcdFx0XHRcdFx0XHRtZXNzYWdlOiB3aGljaCBpbmRpY2F0ZXMgd2hhdCB0aGUgZXJyb3Igd2FzXHJcblx0XHQvL1xyXG5cdFx0cmV0dXJuIHZhbGlkYXRlKGluc3RhbmNlLCBzY2hlbWEsIHtjaGFuZ2luZzogZmFsc2V9KTsvLywgY29lcmNlOiBmYWxzZSwgZXhpc3RpbmdPbmx5OiBmYWxzZX0pO1xyXG5cdH07XHJcbmV4cG9ydHMuY2hlY2tQcm9wZXJ0eUNoYW5nZSA9IGZ1bmN0aW9uKC8qQW55Ki92YWx1ZSwvKk9iamVjdCovc2NoZW1hLCAvKlN0cmluZyovcHJvcGVydHkpIHtcclxuXHRcdC8vIFN1bW1hcnk6XHJcblx0XHQvLyBcdFx0VGhlIGNoZWNrUHJvcGVydHlDaGFuZ2UgbWV0aG9kIHdpbGwgY2hlY2sgdG8gc2VlIGlmIGFuIHZhbHVlIGNhbiBsZWdhbGx5IGJlIGluIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIHNjaGVtYVxyXG5cdFx0Ly8gXHRcdFRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIHZhbGlkYXRlIG1ldGhvZCBpbiB0aGF0IGl0IHdpbGwgZmFpbCBpZiB0aGUgc2NoZW1hIGlzIHJlYWRvbmx5IGFuZCBpdCB3aWxsXHJcblx0XHQvLyBcdFx0bm90IGNoZWNrIGZvciBzZWxmLXZhbGlkYXRpb24sIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIGFscmVhZHkgaW50ZXJuYWxseSB2YWxpZC5cclxuXHRcdC8vIFx0XHRUaGUgY2hlY2tQcm9wZXJ0eUNoYW5nZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHR5cGUgYXMgdmFsaWRhdGUsIHNlZSBKU09OU2NoZW1hLnZhbGlkYXRlIGZvclxyXG5cdFx0Ly8gXHRcdGluZm9ybWF0aW9uLlxyXG5cdFx0Ly9cclxuXHRcdHJldHVybiB2YWxpZGF0ZSh2YWx1ZSwgc2NoZW1hLCB7Y2hhbmdpbmc6IHByb3BlcnR5IHx8IFwicHJvcGVydHlcIn0pO1xyXG5cdH07XHJcbnZhciB2YWxpZGF0ZSA9IGV4cG9ydHMuX3ZhbGlkYXRlID0gZnVuY3Rpb24oLypBbnkqL2luc3RhbmNlLC8qT2JqZWN0Ki9zY2hlbWEsLypPYmplY3QqL29wdGlvbnMpIHtcclxuXHJcblx0aWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XHJcblx0dmFyIF9jaGFuZ2luZyA9IG9wdGlvbnMuY2hhbmdpbmc7XHJcblxyXG5cdGZ1bmN0aW9uIGdldFR5cGUoc2NoZW1hKXtcclxuXHRcdHJldHVybiBzY2hlbWEudHlwZSB8fCAocHJpbWl0aXZlQ29uc3RydWN0b3JzW3NjaGVtYS5uYW1lXSA9PSBzY2hlbWEgJiYgc2NoZW1hLm5hbWUudG9Mb3dlckNhc2UoKSk7XHJcblx0fVxyXG5cdHZhciBlcnJvcnMgPSBbXTtcclxuXHQvLyB2YWxpZGF0ZSBhIHZhbHVlIGFnYWluc3QgYSBwcm9wZXJ0eSBkZWZpbml0aW9uXHJcblx0ZnVuY3Rpb24gY2hlY2tQcm9wKHZhbHVlLCBzY2hlbWEsIHBhdGgsaSl7XHJcblxyXG5cdFx0dmFyIGw7XHJcblx0XHRwYXRoICs9IHBhdGggPyB0eXBlb2YgaSA9PSAnbnVtYmVyJyA/ICdbJyArIGkgKyAnXScgOiB0eXBlb2YgaSA9PSAndW5kZWZpbmVkJyA/ICcnIDogJy4nICsgaSA6IGk7XHJcblx0XHRmdW5jdGlvbiBhZGRFcnJvcihtZXNzYWdlKXtcclxuXHRcdFx0ZXJyb3JzLnB1c2goe3Byb3BlcnR5OnBhdGgsbWVzc2FnZTptZXNzYWdlfSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYoKHR5cGVvZiBzY2hlbWEgIT0gJ29iamVjdCcgfHwgc2NoZW1hIGluc3RhbmNlb2YgQXJyYXkpICYmIChwYXRoIHx8IHR5cGVvZiBzY2hlbWEgIT0gJ2Z1bmN0aW9uJykgJiYgIShzY2hlbWEgJiYgZ2V0VHlwZShzY2hlbWEpKSl7XHJcblx0XHRcdGlmKHR5cGVvZiBzY2hlbWEgPT0gJ2Z1bmN0aW9uJyl7XHJcblx0XHRcdFx0aWYoISh2YWx1ZSBpbnN0YW5jZW9mIHNjaGVtYSkpe1xyXG5cdFx0XHRcdFx0YWRkRXJyb3IoXCJpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzL2NvbnN0cnVjdG9yIFwiICsgc2NoZW1hLm5hbWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fWVsc2UgaWYoc2NoZW1hKXtcclxuXHRcdFx0XHRhZGRFcnJvcihcIkludmFsaWQgc2NoZW1hL3Byb3BlcnR5IGRlZmluaXRpb24gXCIgKyBzY2hlbWEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdFx0aWYoX2NoYW5naW5nICYmIHNjaGVtYS5yZWFkb25seSl7XHJcblx0XHRcdGFkZEVycm9yKFwiaXMgYSByZWFkb25seSBmaWVsZCwgaXQgY2FuIG5vdCBiZSBjaGFuZ2VkXCIpO1xyXG5cdFx0fVxyXG5cdFx0aWYoc2NoZW1hWydleHRlbmRzJ10peyAvLyBpZiBpdCBleHRlbmRzIGFub3RoZXIgc2NoZW1hLCBpdCBtdXN0IHBhc3MgdGhhdCBzY2hlbWEgYXMgd2VsbFxyXG5cdFx0XHRjaGVja1Byb3AodmFsdWUsc2NoZW1hWydleHRlbmRzJ10scGF0aCxpKTtcclxuXHRcdH1cclxuXHRcdC8vIHZhbGlkYXRlIGEgdmFsdWUgYWdhaW5zdCBhIHR5cGUgZGVmaW5pdGlvblxyXG5cdFx0ZnVuY3Rpb24gY2hlY2tUeXBlKHR5cGUsdmFsdWUpe1xyXG5cdFx0XHRpZih0eXBlKXtcclxuXHRcdFx0XHRpZih0eXBlb2YgdHlwZSA9PSAnc3RyaW5nJyAmJiB0eXBlICE9ICdhbnknICYmXHJcblx0XHRcdFx0XHRcdCh0eXBlID09ICdudWxsJyA/IHZhbHVlICE9PSBudWxsIDogdHlwZW9mIHZhbHVlICE9IHR5cGUpICYmXHJcblx0XHRcdFx0XHRcdCEodmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiB0eXBlID09ICdhcnJheScpICYmXHJcblx0XHRcdFx0XHRcdCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmIHR5cGUgPT0gJ2RhdGUnKSAmJlxyXG5cdFx0XHRcdFx0XHQhKHR5cGUgPT0gJ2ludGVnZXInICYmIHZhbHVlJTE9PT0wKSl7XHJcblx0XHRcdFx0XHRyZXR1cm4gW3twcm9wZXJ0eTpwYXRoLG1lc3NhZ2U6dmFsdWUgKyBcIiAtIFwiICsgKHR5cGVvZiB2YWx1ZSkgKyBcIiB2YWx1ZSBmb3VuZCwgYnV0IGEgXCIgKyB0eXBlICsgXCIgaXMgcmVxdWlyZWRcIn1dO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0eXBlIGluc3RhbmNlb2YgQXJyYXkpe1xyXG5cdFx0XHRcdFx0dmFyIHVuaW9uRXJyb3JzPVtdO1xyXG5cdFx0XHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IHR5cGUubGVuZ3RoOyBqKyspeyAvLyBhIHVuaW9uIHR5cGVcclxuXHRcdFx0XHRcdFx0aWYoISh1bmlvbkVycm9ycz1jaGVja1R5cGUodHlwZVtqXSx2YWx1ZSkpLmxlbmd0aCl7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHVuaW9uRXJyb3JzLmxlbmd0aCl7XHJcblx0XHRcdFx0XHRcdHJldHVybiB1bmlvbkVycm9ycztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ZWxzZSBpZih0eXBlb2YgdHlwZSA9PSAnb2JqZWN0Jyl7XHJcblx0XHRcdFx0XHR2YXIgcHJpb3JFcnJvcnMgPSBlcnJvcnM7XHJcblx0XHRcdFx0XHRlcnJvcnMgPSBbXTtcclxuXHRcdFx0XHRcdGNoZWNrUHJvcCh2YWx1ZSx0eXBlLHBhdGgpO1xyXG5cdFx0XHRcdFx0dmFyIHRoZXNlRXJyb3JzID0gZXJyb3JzO1xyXG5cdFx0XHRcdFx0ZXJyb3JzID0gcHJpb3JFcnJvcnM7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhlc2VFcnJvcnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdGlmKHZhbHVlID09PSB1bmRlZmluZWQpe1xyXG5cdFx0XHRpZihzY2hlbWEucmVxdWlyZWQpe1xyXG5cdFx0XHRcdGFkZEVycm9yKFwiaXMgbWlzc2luZyBhbmQgaXQgaXMgcmVxdWlyZWRcIik7XHJcblx0XHRcdH1cclxuXHRcdH1lbHNle1xyXG5cdFx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KGNoZWNrVHlwZShnZXRUeXBlKHNjaGVtYSksdmFsdWUpKTtcclxuXHRcdFx0aWYoc2NoZW1hLmRpc2FsbG93ICYmICFjaGVja1R5cGUoc2NoZW1hLmRpc2FsbG93LHZhbHVlKS5sZW5ndGgpe1xyXG5cdFx0XHRcdGFkZEVycm9yKFwiIGRpc2FsbG93ZWQgdmFsdWUgd2FzIG1hdGNoZWRcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYodmFsdWUgIT09IG51bGwpe1xyXG5cdFx0XHRcdGlmKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpe1xyXG5cdFx0XHRcdFx0aWYoc2NoZW1hLml0ZW1zKXtcclxuXHRcdFx0XHRcdFx0dmFyIGl0ZW1zSXNBcnJheSA9IHNjaGVtYS5pdGVtcyBpbnN0YW5jZW9mIEFycmF5O1xyXG5cdFx0XHRcdFx0XHR2YXIgcHJvcERlZiA9IHNjaGVtYS5pdGVtcztcclxuXHRcdFx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkgKz0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChpdGVtc0lzQXJyYXkpXHJcblx0XHRcdFx0XHRcdFx0XHRwcm9wRGVmID0gc2NoZW1hLml0ZW1zW2ldO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLmNvZXJjZSlcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlW2ldID0gb3B0aW9ucy5jb2VyY2UodmFsdWVbaV0sIHByb3BEZWYpO1xyXG5cdFx0XHRcdFx0XHRcdGVycm9ycy5jb25jYXQoY2hlY2tQcm9wKHZhbHVlW2ldLHByb3BEZWYscGF0aCxpKSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHNjaGVtYS5taW5JdGVtcyAmJiB2YWx1ZS5sZW5ndGggPCBzY2hlbWEubWluSXRlbXMpe1xyXG5cdFx0XHRcdFx0XHRhZGRFcnJvcihcIlRoZXJlIG11c3QgYmUgYSBtaW5pbXVtIG9mIFwiICsgc2NoZW1hLm1pbkl0ZW1zICsgXCIgaW4gdGhlIGFycmF5XCIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYoc2NoZW1hLm1heEl0ZW1zICYmIHZhbHVlLmxlbmd0aCA+IHNjaGVtYS5tYXhJdGVtcyl7XHJcblx0XHRcdFx0XHRcdGFkZEVycm9yKFwiVGhlcmUgbXVzdCBiZSBhIG1heGltdW0gb2YgXCIgKyBzY2hlbWEubWF4SXRlbXMgKyBcIiBpbiB0aGUgYXJyYXlcIik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fWVsc2UgaWYoc2NoZW1hLnByb3BlcnRpZXMgfHwgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKXtcclxuXHRcdFx0XHRcdGVycm9ycy5jb25jYXQoY2hlY2tPYmoodmFsdWUsIHNjaGVtYS5wcm9wZXJ0aWVzLCBwYXRoLCBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hLnBhdHRlcm4gJiYgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmICF2YWx1ZS5tYXRjaChzY2hlbWEucGF0dGVybikpe1xyXG5cdFx0XHRcdFx0YWRkRXJyb3IoXCJkb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXggcGF0dGVybiBcIiArIHNjaGVtYS5wYXR0ZXJuKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hLm1heExlbmd0aCAmJiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gc2NoZW1hLm1heExlbmd0aCl7XHJcblx0XHRcdFx0XHRhZGRFcnJvcihcIm1heSBvbmx5IGJlIFwiICsgc2NoZW1hLm1heExlbmd0aCArIFwiIGNoYXJhY3RlcnMgbG9uZ1wiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hLm1pbkxlbmd0aCAmJiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoIDwgc2NoZW1hLm1pbkxlbmd0aCl7XHJcblx0XHRcdFx0XHRhZGRFcnJvcihcIm11c3QgYmUgYXQgbGVhc3QgXCIgKyBzY2hlbWEubWluTGVuZ3RoICsgXCIgY2hhcmFjdGVycyBsb25nXCIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0eXBlb2Ygc2NoZW1hLm1pbmltdW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB2YWx1ZSA9PSB0eXBlb2Ygc2NoZW1hLm1pbmltdW0gJiZcclxuXHRcdFx0XHRcdFx0c2NoZW1hLm1pbmltdW0gPiB2YWx1ZSl7XHJcblx0XHRcdFx0XHRhZGRFcnJvcihcIm11c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgb2YgXCIgKyBzY2hlbWEubWluaW11bSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmKHR5cGVvZiBzY2hlbWEubWF4aW11bSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHZhbHVlID09IHR5cGVvZiBzY2hlbWEubWF4aW11bSAmJlxyXG5cdFx0XHRcdFx0XHRzY2hlbWEubWF4aW11bSA8IHZhbHVlKXtcclxuXHRcdFx0XHRcdGFkZEVycm9yKFwibXVzdCBoYXZlIGEgbWF4aW11bSB2YWx1ZSBvZiBcIiArIHNjaGVtYS5tYXhpbXVtKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYoc2NoZW1hWydlbnVtJ10pe1xyXG5cdFx0XHRcdFx0dmFyIGVudW1lciA9IHNjaGVtYVsnZW51bSddO1xyXG5cdFx0XHRcdFx0bCA9IGVudW1lci5sZW5ndGg7XHJcblx0XHRcdFx0XHR2YXIgZm91bmQ7XHJcblx0XHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgbDsgaisrKXtcclxuXHRcdFx0XHRcdFx0aWYoZW51bWVyW2pdPT09dmFsdWUpe1xyXG5cdFx0XHRcdFx0XHRcdGZvdW5kPTE7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKCFmb3VuZCl7XHJcblx0XHRcdFx0XHRcdGFkZEVycm9yKFwiZG9lcyBub3QgaGF2ZSBhIHZhbHVlIGluIHRoZSBlbnVtZXJhdGlvbiBcIiArIGVudW1lci5qb2luKFwiLCBcIikpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZih0eXBlb2Ygc2NoZW1hLm1heERlY2ltYWwgPT0gJ251bWJlcicgJiZcclxuXHRcdFx0XHRcdCh2YWx1ZS50b1N0cmluZygpLm1hdGNoKG5ldyBSZWdFeHAoXCJcXFxcLlswLTlde1wiICsgKHNjaGVtYS5tYXhEZWNpbWFsICsgMSkgKyBcIix9XCIpKSkpe1xyXG5cdFx0XHRcdFx0YWRkRXJyb3IoXCJtYXkgb25seSBoYXZlIFwiICsgc2NoZW1hLm1heERlY2ltYWwgKyBcIiBkaWdpdHMgb2YgZGVjaW1hbCBwbGFjZXNcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0Ly8gdmFsaWRhdGUgYW4gb2JqZWN0IGFnYWluc3QgYSBzY2hlbWFcclxuXHRmdW5jdGlvbiBjaGVja09iaihpbnN0YW5jZSxvYmpUeXBlRGVmLHBhdGgsYWRkaXRpb25hbFByb3Ape1xyXG5cclxuXHRcdGlmKHR5cGVvZiBvYmpUeXBlRGVmID09J29iamVjdCcpe1xyXG5cdFx0XHRpZih0eXBlb2YgaW5zdGFuY2UgIT0gJ29iamVjdCcgfHwgaW5zdGFuY2UgaW5zdGFuY2VvZiBBcnJheSl7XHJcblx0XHRcdFx0ZXJyb3JzLnB1c2goe3Byb3BlcnR5OnBhdGgsbWVzc2FnZTpcImFuIG9iamVjdCBpcyByZXF1aXJlZFwifSk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdGZvcih2YXIgaSBpbiBvYmpUeXBlRGVmKXsgXHJcblx0XHRcdFx0aWYob2JqVHlwZURlZi5oYXNPd25Qcm9wZXJ0eShpKSAmJiBpICE9ICdfX3Byb3RvX18nICYmIGkgIT0gJ2NvbnN0cnVjdG9yJyl7XHJcblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBpbnN0YW5jZS5oYXNPd25Qcm9wZXJ0eShpKSA/IGluc3RhbmNlW2ldIDogdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0Ly8gc2tpcCBfbm90XyBzcGVjaWZpZWQgcHJvcGVydGllc1xyXG5cdFx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5leGlzdGluZ09ubHkpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0dmFyIHByb3BEZWYgPSBvYmpUeXBlRGVmW2ldO1xyXG5cdFx0XHRcdFx0Ly8gc2V0IGRlZmF1bHRcclxuXHRcdFx0XHRcdGlmKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcHJvcERlZltcImRlZmF1bHRcIl0pe1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGluc3RhbmNlW2ldID0gcHJvcERlZltcImRlZmF1bHRcIl07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZihvcHRpb25zLmNvZXJjZSAmJiBpIGluIGluc3RhbmNlKXtcclxuXHRcdFx0XHRcdFx0dmFsdWUgPSBpbnN0YW5jZVtpXSA9IG9wdGlvbnMuY29lcmNlKHZhbHVlLCBwcm9wRGVmKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNoZWNrUHJvcCh2YWx1ZSxwcm9wRGVmLHBhdGgsaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRmb3IoaSBpbiBpbnN0YW5jZSl7XHJcblx0XHRcdGlmKGluc3RhbmNlLmhhc093blByb3BlcnR5KGkpICYmICEoaS5jaGFyQXQoMCkgPT0gJ18nICYmIGkuY2hhckF0KDEpID09ICdfJykgJiYgb2JqVHlwZURlZiAmJiAhb2JqVHlwZURlZltpXSAmJiBhZGRpdGlvbmFsUHJvcD09PWZhbHNlKXtcclxuXHRcdFx0XHRpZiAob3B0aW9ucy5maWx0ZXIpIHtcclxuXHRcdFx0XHRcdGRlbGV0ZSBpbnN0YW5jZVtpXTtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRlcnJvcnMucHVzaCh7cHJvcGVydHk6cGF0aCxtZXNzYWdlOlwiVGhlIHByb3BlcnR5IFwiICsgaSArXHJcblx0XHRcdFx0XHRcdFwiIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzY2hlbWEgYW5kIHRoZSBzY2hlbWEgZG9lcyBub3QgYWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXCJ9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dmFyIHJlcXVpcmVzID0gb2JqVHlwZURlZiAmJiBvYmpUeXBlRGVmW2ldICYmIG9ialR5cGVEZWZbaV0ucmVxdWlyZXM7XHJcblx0XHRcdGlmKHJlcXVpcmVzICYmICEocmVxdWlyZXMgaW4gaW5zdGFuY2UpKXtcclxuXHRcdFx0XHRlcnJvcnMucHVzaCh7cHJvcGVydHk6cGF0aCxtZXNzYWdlOlwidGhlIHByZXNlbmNlIG9mIHRoZSBwcm9wZXJ0eSBcIiArIGkgKyBcIiByZXF1aXJlcyB0aGF0IFwiICsgcmVxdWlyZXMgKyBcIiBhbHNvIGJlIHByZXNlbnRcIn0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlID0gaW5zdGFuY2VbaV07XHJcblx0XHRcdGlmKGFkZGl0aW9uYWxQcm9wICYmICghKG9ialR5cGVEZWYgJiYgdHlwZW9mIG9ialR5cGVEZWYgPT0gJ29iamVjdCcpIHx8ICEoaSBpbiBvYmpUeXBlRGVmKSkpe1xyXG5cdFx0XHRcdGlmKG9wdGlvbnMuY29lcmNlKXtcclxuXHRcdFx0XHRcdHZhbHVlID0gaW5zdGFuY2VbaV0gPSBvcHRpb25zLmNvZXJjZSh2YWx1ZSwgYWRkaXRpb25hbFByb3ApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjaGVja1Byb3AodmFsdWUsYWRkaXRpb25hbFByb3AscGF0aCxpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZighX2NoYW5naW5nICYmIHZhbHVlICYmIHZhbHVlLiRzY2hlbWEpe1xyXG5cdFx0XHRcdGVycm9ycyA9IGVycm9ycy5jb25jYXQoY2hlY2tQcm9wKHZhbHVlLHZhbHVlLiRzY2hlbWEscGF0aCxpKSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBlcnJvcnM7XHJcblx0fVxyXG5cdGlmKHNjaGVtYSl7XHJcblx0XHRjaGVja1Byb3AoaW5zdGFuY2Usc2NoZW1hLCcnLF9jaGFuZ2luZyB8fCAnJyk7XHJcblx0fVxyXG5cdGlmKCFfY2hhbmdpbmcgJiYgaW5zdGFuY2UgJiYgaW5zdGFuY2UuJHNjaGVtYSl7XHJcblx0XHRjaGVja1Byb3AoaW5zdGFuY2UsaW5zdGFuY2UuJHNjaGVtYSwnJywnJyk7XHJcblx0fVxyXG5cdHJldHVybiB7dmFsaWQ6IWVycm9ycy5sZW5ndGgsZXJyb3JzOmVycm9yc307XHJcbn07XHJcbmV4cG9ydHMubXVzdEJlVmFsaWQgPSBmdW5jdGlvbihyZXN1bHQpe1xyXG5cdC8vXHRzdW1tYXJ5OlxyXG5cdC8vXHRcdFRoaXMgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgdmFsaWQgYW5kIHdpbGwgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZSBpZiBpdCBpcyBub3RcclxuXHQvLyByZXN1bHQ6IHRoZSByZXN1bHQgcmV0dXJuZWQgZnJvbSBjaGVja1Byb3BlcnR5Q2hhbmdlIG9yIHZhbGlkYXRlXHJcblx0aWYoIXJlc3VsdC52YWxpZCl7XHJcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKHJlc3VsdC5lcnJvcnMubWFwKGZ1bmN0aW9uKGVycm9yKXtyZXR1cm4gXCJmb3IgcHJvcGVydHkgXCIgKyBlcnJvci5wcm9wZXJ0eSArICc6ICcgKyBlcnJvci5tZXNzYWdlO30pLmpvaW4oXCIsIFxcblwiKSk7XHJcblx0fVxyXG59XHJcblxyXG5yZXR1cm4gZXhwb3J0cztcclxufSkpO1xyXG4iLCAiLypcbiAqIGxpYi9qc3ByaW0uanM6IHV0aWxpdGllcyBmb3IgcHJpbWl0aXZlIEphdmFTY3JpcHQgdHlwZXNcbiAqL1xuXG52YXIgbW9kX2Fzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydC1wbHVzJyk7XG52YXIgbW9kX3V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbnZhciBtb2RfZXh0c3ByaW50ZiA9IHJlcXVpcmUoJ2V4dHNwcmludGYnKTtcbnZhciBtb2RfdmVycm9yID0gcmVxdWlyZSgndmVycm9yJyk7XG52YXIgbW9kX2pzb25zY2hlbWEgPSByZXF1aXJlKCdqc29uLXNjaGVtYScpO1xuXG4vKlxuICogUHVibGljIGludGVyZmFjZVxuICovXG5leHBvcnRzLmRlZXBDb3B5ID0gZGVlcENvcHk7XG5leHBvcnRzLmRlZXBFcXVhbCA9IGRlZXBFcXVhbDtcbmV4cG9ydHMuaXNFbXB0eSA9IGlzRW1wdHk7XG5leHBvcnRzLmhhc0tleSA9IGhhc0tleTtcbmV4cG9ydHMuZm9yRWFjaEtleSA9IGZvckVhY2hLZXk7XG5leHBvcnRzLnBsdWNrID0gcGx1Y2s7XG5leHBvcnRzLmZsYXR0ZW5PYmplY3QgPSBmbGF0dGVuT2JqZWN0O1xuZXhwb3J0cy5mbGF0dGVuSXRlciA9IGZsYXR0ZW5JdGVyO1xuZXhwb3J0cy52YWxpZGF0ZUpzb25PYmplY3QgPSB2YWxpZGF0ZUpzb25PYmplY3RKUztcbmV4cG9ydHMudmFsaWRhdGVKc29uT2JqZWN0SlMgPSB2YWxpZGF0ZUpzb25PYmplY3RKUztcbmV4cG9ydHMucmFuZEVsdCA9IHJhbmRFbHQ7XG5leHBvcnRzLmV4dHJhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllcztcbmV4cG9ydHMubWVyZ2VPYmplY3RzID0gbWVyZ2VPYmplY3RzO1xuXG5leHBvcnRzLnN0YXJ0c1dpdGggPSBzdGFydHNXaXRoO1xuZXhwb3J0cy5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuXG5leHBvcnRzLnBhcnNlSW50ZWdlciA9IHBhcnNlSW50ZWdlcjtcblxuZXhwb3J0cy5pc284NjAxID0gaXNvODYwMTtcbmV4cG9ydHMucmZjMTEyMyA9IHJmYzExMjM7XG5leHBvcnRzLnBhcnNlRGF0ZVRpbWUgPSBwYXJzZURhdGVUaW1lO1xuXG5leHBvcnRzLmhydGltZWRpZmYgPSBocnRpbWVEaWZmO1xuZXhwb3J0cy5ocnRpbWVEaWZmID0gaHJ0aW1lRGlmZjtcbmV4cG9ydHMuaHJ0aW1lQWNjdW0gPSBocnRpbWVBY2N1bTtcbmV4cG9ydHMuaHJ0aW1lQWRkID0gaHJ0aW1lQWRkO1xuZXhwb3J0cy5ocnRpbWVOYW5vc2VjID0gaHJ0aW1lTmFub3NlYztcbmV4cG9ydHMuaHJ0aW1lTWljcm9zZWMgPSBocnRpbWVNaWNyb3NlYztcbmV4cG9ydHMuaHJ0aW1lTWlsbGlzZWMgPSBocnRpbWVNaWxsaXNlYztcblxuXG4vKlxuICogRGVlcCBjb3B5IGFuIGFjeWNsaWMgKmJhc2ljKiBKYXZhc2NyaXB0IG9iamVjdC4gIFRoaXMgb25seSBoYW5kbGVzIGJhc2ljXG4gKiBzY2FsYXJzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucykgYW5kIGFyYml0cmFyaWx5IGRlZXAgYXJyYXlzIGFuZCBvYmplY3RzXG4gKiBjb250YWluaW5nIHRoZXNlLiAgVGhpcyBkb2VzICpub3QqIGhhbmRsZSBpbnN0YW5jZXMgb2Ygb3RoZXIgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gZGVlcENvcHkob2JqKVxue1xuXHR2YXIgcmV0LCBrZXk7XG5cdHZhciBtYXJrZXIgPSAnX19kZWVwQ29weSc7XG5cblx0aWYgKG9iaiAmJiBvYmpbbWFya2VyXSlcblx0XHR0aHJvdyAobmV3IEVycm9yKCdhdHRlbXB0ZWQgZGVlcCBjb3B5IG9mIGN5Y2xpYyBvYmplY3QnKSk7XG5cblx0aWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XG5cdFx0cmV0ID0ge307XG5cdFx0b2JqW21hcmtlcl0gPSB0cnVlO1xuXG5cdFx0Zm9yIChrZXkgaW4gb2JqKSB7XG5cdFx0XHRpZiAoa2V5ID09IG1hcmtlcilcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdHJldFtrZXldID0gZGVlcENvcHkob2JqW2tleV0pO1xuXHRcdH1cblxuXHRcdGRlbGV0ZSAob2JqW21hcmtlcl0pO1xuXHRcdHJldHVybiAocmV0KTtcblx0fVxuXG5cdGlmIChvYmogJiYgb2JqLmNvbnN0cnVjdG9yID09IEFycmF5KSB7XG5cdFx0cmV0ID0gW107XG5cdFx0b2JqW21hcmtlcl0gPSB0cnVlO1xuXG5cdFx0Zm9yIChrZXkgPSAwOyBrZXkgPCBvYmoubGVuZ3RoOyBrZXkrKylcblx0XHRcdHJldC5wdXNoKGRlZXBDb3B5KG9ialtrZXldKSk7XG5cblx0XHRkZWxldGUgKG9ialttYXJrZXJdKTtcblx0XHRyZXR1cm4gKHJldCk7XG5cdH1cblxuXHQvKlxuXHQgKiBJdCBtdXN0IGJlIGEgcHJpbWl0aXZlIHR5cGUgLS0ganVzdCByZXR1cm4gaXQuXG5cdCAqL1xuXHRyZXR1cm4gKG9iaik7XG59XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbChvYmoxLCBvYmoyKVxue1xuXHRpZiAodHlwZW9mIChvYmoxKSAhPSB0eXBlb2YgKG9iajIpKVxuXHRcdHJldHVybiAoZmFsc2UpO1xuXG5cdGlmIChvYmoxID09PSBudWxsIHx8IG9iajIgPT09IG51bGwgfHwgdHlwZW9mIChvYmoxKSAhPSAnb2JqZWN0Jylcblx0XHRyZXR1cm4gKG9iajEgPT09IG9iajIpO1xuXG5cdGlmIChvYmoxLmNvbnN0cnVjdG9yICE9IG9iajIuY29uc3RydWN0b3IpXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0dmFyIGs7XG5cdGZvciAoayBpbiBvYmoxKSB7XG5cdFx0aWYgKCFvYmoyLmhhc093blByb3BlcnR5KGspKVxuXHRcdFx0cmV0dXJuIChmYWxzZSk7XG5cblx0XHRpZiAoIWRlZXBFcXVhbChvYmoxW2tdLCBvYmoyW2tdKSlcblx0XHRcdHJldHVybiAoZmFsc2UpO1xuXHR9XG5cblx0Zm9yIChrIGluIG9iajIpIHtcblx0XHRpZiAoIW9iajEuaGFzT3duUHJvcGVydHkoaykpXG5cdFx0XHRyZXR1cm4gKGZhbHNlKTtcblx0fVxuXG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKVxue1xuXHR2YXIga2V5O1xuXHRmb3IgKGtleSBpbiBvYmopXG5cdFx0cmV0dXJuIChmYWxzZSk7XG5cdHJldHVybiAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGhhc0tleShvYmosIGtleSlcbntcblx0bW9kX2Fzc2VydC5lcXVhbCh0eXBlb2YgKGtleSksICdzdHJpbmcnKTtcblx0cmV0dXJuIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaEtleShvYmosIGNhbGxiYWNrKVxue1xuXHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0aWYgKGhhc0tleShvYmosIGtleSkpIHtcblx0XHRcdGNhbGxiYWNrKGtleSwgb2JqW2tleV0pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwbHVjayhvYmosIGtleSlcbntcblx0bW9kX2Fzc2VydC5lcXVhbCh0eXBlb2YgKGtleSksICdzdHJpbmcnKTtcblx0cmV0dXJuIChwbHVja3Yob2JqLCBrZXkpKTtcbn1cblxuZnVuY3Rpb24gcGx1Y2t2KG9iaiwga2V5KVxue1xuXHRpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiAob2JqKSAhPT0gJ29iamVjdCcpXG5cdFx0cmV0dXJuICh1bmRlZmluZWQpO1xuXG5cdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSlcblx0XHRyZXR1cm4gKG9ialtrZXldKTtcblxuXHR2YXIgaSA9IGtleS5pbmRleE9mKCcuJyk7XG5cdGlmIChpID09IC0xKVxuXHRcdHJldHVybiAodW5kZWZpbmVkKTtcblxuXHR2YXIga2V5MSA9IGtleS5zdWJzdHIoMCwgaSk7XG5cdGlmICghb2JqLmhhc093blByb3BlcnR5KGtleTEpKVxuXHRcdHJldHVybiAodW5kZWZpbmVkKTtcblxuXHRyZXR1cm4gKHBsdWNrdihvYmpba2V5MV0sIGtleS5zdWJzdHIoaSArIDEpKSk7XG59XG5cbi8qXG4gKiBJbnZva2UgY2FsbGJhY2socm93KSBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieVxuICogZmxhdHRlbk9iamVjdChkYXRhLCBkZXB0aCkuICBUaGlzIGlzIGp1c3QgbGlrZSBmbGF0dGVuT2JqZWN0KGRhdGEsXG4gKiBkZXB0aCkuZm9yRWFjaChjYWxsYmFjayksIGV4Y2VwdCB0aGF0IHRoZSBpbnRlcm1lZGlhdGUgYXJyYXkgaXMgbmV2ZXJcbiAqIGNyZWF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5JdGVyKGRhdGEsIGRlcHRoLCBjYWxsYmFjaylcbntcblx0ZG9GbGF0dGVuSXRlcihkYXRhLCBkZXB0aCwgW10sIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZG9GbGF0dGVuSXRlcihkYXRhLCBkZXB0aCwgYWNjdW0sIGNhbGxiYWNrKVxue1xuXHR2YXIgZWFjaDtcblx0dmFyIGtleTtcblxuXHRpZiAoZGVwdGggPT09IDApIHtcblx0XHRlYWNoID0gYWNjdW0uc2xpY2UoMCk7XG5cdFx0ZWFjaC5wdXNoKGRhdGEpO1xuXHRcdGNhbGxiYWNrKGVhY2gpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdG1vZF9hc3NlcnQub2soZGF0YSAhPT0gbnVsbCk7XG5cdG1vZF9hc3NlcnQuZXF1YWwodHlwZW9mIChkYXRhKSwgJ29iamVjdCcpO1xuXHRtb2RfYXNzZXJ0LmVxdWFsKHR5cGVvZiAoZGVwdGgpLCAnbnVtYmVyJyk7XG5cdG1vZF9hc3NlcnQub2soZGVwdGggPj0gMCk7XG5cblx0Zm9yIChrZXkgaW4gZGF0YSkge1xuXHRcdGVhY2ggPSBhY2N1bS5zbGljZSgwKTtcblx0XHRlYWNoLnB1c2goa2V5KTtcblx0XHRkb0ZsYXR0ZW5JdGVyKGRhdGFba2V5XSwgZGVwdGggLSAxLCBlYWNoLCBjYWxsYmFjayk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZmxhdHRlbk9iamVjdChkYXRhLCBkZXB0aClcbntcblx0aWYgKGRlcHRoID09PSAwKVxuXHRcdHJldHVybiAoWyBkYXRhIF0pO1xuXG5cdG1vZF9hc3NlcnQub2soZGF0YSAhPT0gbnVsbCk7XG5cdG1vZF9hc3NlcnQuZXF1YWwodHlwZW9mIChkYXRhKSwgJ29iamVjdCcpO1xuXHRtb2RfYXNzZXJ0LmVxdWFsKHR5cGVvZiAoZGVwdGgpLCAnbnVtYmVyJyk7XG5cdG1vZF9hc3NlcnQub2soZGVwdGggPj0gMCk7XG5cblx0dmFyIHJ2ID0gW107XG5cdHZhciBrZXk7XG5cblx0Zm9yIChrZXkgaW4gZGF0YSkge1xuXHRcdGZsYXR0ZW5PYmplY3QoZGF0YVtrZXldLCBkZXB0aCAtIDEpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcblx0XHRcdHJ2LnB1c2goWyBrZXkgXS5jb25jYXQocCkpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIChydik7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpXG57XG5cdHJldHVybiAoc3RyLnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKSA9PSBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeClcbntcblx0cmV0dXJuIChzdHIuc3Vic3RyKFxuXHQgICAgc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgsIHN1ZmZpeC5sZW5ndGgpID09IHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGlzbzg2MDEoZClcbntcblx0aWYgKHR5cGVvZiAoZCkgPT0gJ251bWJlcicpXG5cdFx0ZCA9IG5ldyBEYXRlKGQpO1xuXHRtb2RfYXNzZXJ0Lm9rKGQuY29uc3RydWN0b3IgPT09IERhdGUpO1xuXHRyZXR1cm4gKG1vZF9leHRzcHJpbnRmLnNwcmludGYoJyU0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQuJTAzZFonLFxuXHQgICAgZC5nZXRVVENGdWxsWWVhcigpLCBkLmdldFVUQ01vbnRoKCkgKyAxLCBkLmdldFVUQ0RhdGUoKSxcblx0ICAgIGQuZ2V0VVRDSG91cnMoKSwgZC5nZXRVVENNaW51dGVzKCksIGQuZ2V0VVRDU2Vjb25kcygpLFxuXHQgICAgZC5nZXRVVENNaWxsaXNlY29uZHMoKSkpO1xufVxuXG52YXIgUkZDMTEyM19NT05USFMgPSBbXG4gICAgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJyxcbiAgICAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbnZhciBSRkMxMTIzX0RBWVMgPSBbXG4gICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddO1xuXG5mdW5jdGlvbiByZmMxMTIzKGRhdGUpIHtcblx0cmV0dXJuIChtb2RfZXh0c3ByaW50Zi5zcHJpbnRmKCclcywgJTAyZCAlcyAlMDRkICUwMmQ6JTAyZDolMDJkIEdNVCcsXG5cdCAgICBSRkMxMTIzX0RBWVNbZGF0ZS5nZXRVVENEYXkoKV0sIGRhdGUuZ2V0VVRDRGF0ZSgpLFxuXHQgICAgUkZDMTEyM19NT05USFNbZGF0ZS5nZXRVVENNb250aCgpXSwgZGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuXHQgICAgZGF0ZS5nZXRVVENIb3VycygpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcblx0ICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpKSk7XG59XG5cbi8qXG4gKiBQYXJzZXMgYSBkYXRlIGV4cHJlc3NlZCBhcyBhIHN0cmluZywgYXMgZWl0aGVyIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZVxuICogdGhlIGVwb2NoIG9yIGFueSBzdHJpbmcgZm9ybWF0IHRoYXQgRGF0ZSBhY2NlcHRzLCBnaXZpbmcgcHJlZmVyZW5jZSB0byB0aGVcbiAqIGZvcm1lciB3aGVyZSB0aGVzZSB0d28gc2V0cyBvdmVybGFwIChlLmcuLCBzbWFsbCBudW1iZXJzKS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRlVGltZShzdHIpXG57XG5cdC8qXG5cdCAqIFRoaXMgaXMgaXJyaXRhdGluZ2x5IGltcGxpY2l0LCBidXQgc2lnbmlmaWNhbnRseSBtb3JlIGNvbmNpc2UgdGhhblxuXHQgKiBhbHRlcm5hdGl2ZXMuICBUaGUgXCIrc3RyXCIgd2lsbCBjb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgb25seSBhXG5cdCAqIG51bWJlciBkaXJlY3RseSB0byBhIE51bWJlciwgb3IgTmFOIGZvciBvdGhlciBzdHJpbmdzLiAgVGh1cywgaWYgdGhlXG5cdCAqIGNvbnZlcnNpb24gc3VjY2VlZHMsIHdlIHVzZSBpdCAodGhpcyBpcyB0aGUgbWlsbGlzZWNvbmRzLXNpbmNlLWVwb2NoXG5cdCAqIGNhc2UpLiAgT3RoZXJ3aXNlLCB3ZSBwYXNzIHRoZSBzdHJpbmcgZGlyZWN0bHkgdG8gdGhlIERhdGVcblx0ICogY29uc3RydWN0b3IgdG8gcGFyc2UuXG5cdCAqL1xuXHR2YXIgbnVtZXJpYyA9ICtzdHI7XG5cdGlmICghaXNOYU4obnVtZXJpYykpIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKG51bWVyaWMpKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKHN0cikpO1xuXHR9XG59XG5cblxuLypcbiAqIE51bWJlci4qX1NBRkVfSU5URUdFUiBpc24ndCBwcmVzZW50IGJlZm9yZSBub2RlIHYwLjEyLCBzbyB3ZSBoYXJkY29kZVxuICogdGhlIEVTNiBkZWZpbml0aW9ucyBoZXJlLCB3aGlsZSBhbGxvd2luZyBmb3IgdGhlbSB0byBzb21lZGF5IGJlIGhpZ2hlci5cbiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIE1JTl9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCAtOTAwNzE5OTI1NDc0MDk5MTtcblxuXG4vKlxuICogRGVmYXVsdCBvcHRpb25zIGZvciBwYXJzZUludGVnZXIoKS5cbiAqL1xudmFyIFBJX0RFRkFVTFRTID0ge1xuXHRiYXNlOiAxMCxcblx0YWxsb3dTaWduOiB0cnVlLFxuXHRhbGxvd1ByZWZpeDogZmFsc2UsXG5cdGFsbG93VHJhaWxpbmc6IGZhbHNlLFxuXHRhbGxvd0ltcHJlY2lzZTogZmFsc2UsXG5cdHRyaW1XaGl0ZXNwYWNlOiBmYWxzZSxcblx0bGVhZGluZ1plcm9Jc09jdGFsOiBmYWxzZVxufTtcblxudmFyIENQXzAgPSAweDMwO1xudmFyIENQXzkgPSAweDM5O1xuXG52YXIgQ1BfQSA9IDB4NDE7XG52YXIgQ1BfQiA9IDB4NDI7XG52YXIgQ1BfTyA9IDB4NGY7XG52YXIgQ1BfVCA9IDB4NTQ7XG52YXIgQ1BfWCA9IDB4NTg7XG52YXIgQ1BfWiA9IDB4NWE7XG5cbnZhciBDUF9hID0gMHg2MTtcbnZhciBDUF9iID0gMHg2MjtcbnZhciBDUF9vID0gMHg2ZjtcbnZhciBDUF90ID0gMHg3NDtcbnZhciBDUF94ID0gMHg3ODtcbnZhciBDUF96ID0gMHg3YTtcblxudmFyIFBJX0NPTlZfREVDID0gMHgzMDtcbnZhciBQSV9DT05WX1VDID0gMHgzNztcbnZhciBQSV9DT05WX0xDID0gMHg1NztcblxuXG4vKlxuICogQSBzdHJpY3RlciB2ZXJzaW9uIG9mIHBhcnNlSW50KCkgdGhhdCBwcm92aWRlcyBvcHRpb25zIGZvciBjaGFuZ2luZyB3aGF0XG4gKiBpcyBhbiBhY2NlcHRhYmxlIHN0cmluZyAoZm9yIGV4YW1wbGUsIGRpc2FsbG93aW5nIHRyYWlsaW5nIGNoYXJhY3RlcnMpLlxuICovXG5mdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyLCB1b3B0cylcbntcblx0bW9kX2Fzc2VydC5zdHJpbmcoc3RyLCAnc3RyJyk7XG5cdG1vZF9hc3NlcnQub3B0aW9uYWxPYmplY3QodW9wdHMsICdvcHRpb25zJyk7XG5cblx0dmFyIGJhc2VPdmVycmlkZSA9IGZhbHNlO1xuXHR2YXIgb3B0aW9ucyA9IFBJX0RFRkFVTFRTO1xuXG5cdGlmICh1b3B0cykge1xuXHRcdGJhc2VPdmVycmlkZSA9IGhhc0tleSh1b3B0cywgJ2Jhc2UnKTtcblx0XHRvcHRpb25zID0gbWVyZ2VPYmplY3RzKG9wdGlvbnMsIHVvcHRzKTtcblx0XHRtb2RfYXNzZXJ0Lm51bWJlcihvcHRpb25zLmJhc2UsICdvcHRpb25zLmJhc2UnKTtcblx0XHRtb2RfYXNzZXJ0Lm9rKG9wdGlvbnMuYmFzZSA+PSAyLCAnb3B0aW9ucy5iYXNlID49IDInKTtcblx0XHRtb2RfYXNzZXJ0Lm9rKG9wdGlvbnMuYmFzZSA8PSAzNiwgJ29wdGlvbnMuYmFzZSA8PSAzNicpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLmFsbG93U2lnbiwgJ29wdGlvbnMuYWxsb3dTaWduJyk7XG5cdFx0bW9kX2Fzc2VydC5ib29sKG9wdGlvbnMuYWxsb3dQcmVmaXgsICdvcHRpb25zLmFsbG93UHJlZml4Jyk7XG5cdFx0bW9kX2Fzc2VydC5ib29sKG9wdGlvbnMuYWxsb3dUcmFpbGluZyxcblx0XHQgICAgJ29wdGlvbnMuYWxsb3dUcmFpbGluZycpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLmFsbG93SW1wcmVjaXNlLFxuXHRcdCAgICAnb3B0aW9ucy5hbGxvd0ltcHJlY2lzZScpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLnRyaW1XaGl0ZXNwYWNlLFxuXHRcdCAgICAnb3B0aW9ucy50cmltV2hpdGVzcGFjZScpO1xuXHRcdG1vZF9hc3NlcnQuYm9vbChvcHRpb25zLmxlYWRpbmdaZXJvSXNPY3RhbCxcblx0XHQgICAgJ29wdGlvbnMubGVhZGluZ1plcm9Jc09jdGFsJyk7XG5cblx0XHRpZiAob3B0aW9ucy5sZWFkaW5nWmVyb0lzT2N0YWwpIHtcblx0XHRcdG1vZF9hc3NlcnQub2soIWJhc2VPdmVycmlkZSxcblx0XHRcdCAgICAnXCJiYXNlXCIgYW5kIFwibGVhZGluZ1plcm9Jc09jdGFsXCIgYXJlICcgK1xuXHRcdFx0ICAgICdtdXR1YWxseSBleGNsdXNpdmUnKTtcblx0XHR9XG5cdH1cblxuXHR2YXIgYztcblx0dmFyIHBiYXNlID0gLTE7XG5cdHZhciBiYXNlID0gb3B0aW9ucy5iYXNlO1xuXHR2YXIgc3RhcnQ7XG5cdHZhciBtdWx0ID0gMTtcblx0dmFyIHZhbHVlID0gMDtcblx0dmFyIGlkeCA9IDA7XG5cdHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuXG5cdC8qIFRyaW0gYW55IHdoaXRlc3BhY2Ugb24gdGhlIGxlZnQgc2lkZS4gKi9cblx0aWYgKG9wdGlvbnMudHJpbVdoaXRlc3BhY2UpIHtcblx0XHR3aGlsZSAoaWR4IDwgbGVuICYmIGlzU3BhY2Uoc3RyLmNoYXJDb2RlQXQoaWR4KSkpIHtcblx0XHRcdCsraWR4O1xuXHRcdH1cblx0fVxuXG5cdC8qIENoZWNrIHRoZSBudW1iZXIgZm9yIGEgbGVhZGluZyBzaWduLiAqL1xuXHRpZiAob3B0aW9ucy5hbGxvd1NpZ24pIHtcblx0XHRpZiAoc3RyW2lkeF0gPT09ICctJykge1xuXHRcdFx0aWR4ICs9IDE7XG5cdFx0XHRtdWx0ID0gLTE7XG5cdFx0fSBlbHNlIGlmIChzdHJbaWR4XSA9PT0gJysnKSB7XG5cdFx0XHRpZHggKz0gMTtcblx0XHR9XG5cdH1cblxuXHQvKiBQYXJzZSB0aGUgYmFzZS1pbmRpY2F0aW5nIHByZWZpeCBpZiB0aGVyZSBpcyBvbmUuICovXG5cdGlmIChzdHJbaWR4XSA9PT0gJzAnKSB7XG5cdFx0aWYgKG9wdGlvbnMuYWxsb3dQcmVmaXgpIHtcblx0XHRcdHBiYXNlID0gcHJlZml4VG9CYXNlKHN0ci5jaGFyQ29kZUF0KGlkeCArIDEpKTtcblx0XHRcdGlmIChwYmFzZSAhPT0gLTEgJiYgKCFiYXNlT3ZlcnJpZGUgfHwgcGJhc2UgPT09IGJhc2UpKSB7XG5cdFx0XHRcdGJhc2UgPSBwYmFzZTtcblx0XHRcdFx0aWR4ICs9IDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBiYXNlID09PSAtMSAmJiBvcHRpb25zLmxlYWRpbmdaZXJvSXNPY3RhbCkge1xuXHRcdFx0YmFzZSA9IDg7XG5cdFx0fVxuXHR9XG5cblx0LyogUGFyc2UgdGhlIGFjdHVhbCBkaWdpdHMuICovXG5cdGZvciAoc3RhcnQgPSBpZHg7IGlkeCA8IGxlbjsgKytpZHgpIHtcblx0XHRjID0gdHJhbnNsYXRlRGlnaXQoc3RyLmNoYXJDb2RlQXQoaWR4KSk7XG5cdFx0aWYgKGMgIT09IC0xICYmIGMgPCBiYXNlKSB7XG5cdFx0XHR2YWx1ZSAqPSBiYXNlO1xuXHRcdFx0dmFsdWUgKz0gYztcblx0XHR9IGVsc2Uge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyogSWYgd2UgZGlkbid0IHBhcnNlIGFueSBkaWdpdHMsIHdlIGhhdmUgYW4gaW52YWxpZCBudW1iZXIuICovXG5cdGlmIChzdGFydCA9PT0gaWR4KSB7XG5cdFx0cmV0dXJuIChuZXcgRXJyb3IoJ2ludmFsaWQgbnVtYmVyOiAnICsgSlNPTi5zdHJpbmdpZnkoc3RyKSkpO1xuXHR9XG5cblx0LyogVHJpbSBhbnkgd2hpdGVzcGFjZSBvbiB0aGUgcmlnaHQgc2lkZS4gKi9cblx0aWYgKG9wdGlvbnMudHJpbVdoaXRlc3BhY2UpIHtcblx0XHR3aGlsZSAoaWR4IDwgbGVuICYmIGlzU3BhY2Uoc3RyLmNoYXJDb2RlQXQoaWR4KSkpIHtcblx0XHRcdCsraWR4O1xuXHRcdH1cblx0fVxuXG5cdC8qIENoZWNrIGZvciB0cmFpbGluZyBjaGFyYWN0ZXJzLiAqL1xuXHRpZiAoaWR4IDwgbGVuICYmICFvcHRpb25zLmFsbG93VHJhaWxpbmcpIHtcblx0XHRyZXR1cm4gKG5ldyBFcnJvcigndHJhaWxpbmcgY2hhcmFjdGVycyBhZnRlciBudW1iZXI6ICcgK1xuXHRcdCAgICBKU09OLnN0cmluZ2lmeShzdHIuc2xpY2UoaWR4KSkpKTtcblx0fVxuXG5cdC8qIElmIG91ciB2YWx1ZSBpcyAwLCB3ZSByZXR1cm4gbm93LCB0byBhdm9pZCByZXR1cm5pbmcgLTAuICovXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAoMCk7XG5cdH1cblxuXHQvKiBDYWxjdWxhdGUgb3VyIGZpbmFsIHZhbHVlLiAqL1xuXHR2YXIgcmVzdWx0ID0gdmFsdWUgKiBtdWx0O1xuXG5cdC8qXG5cdCAqIElmIHRoZSBzdHJpbmcgcmVwcmVzZW50cyBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIHByZWNpc2VseSByZXByZXNlbnRlZFxuXHQgKiBieSBKYXZhU2NyaXB0LCB0aGVuIHdlIHdhbnQgdG8gY2hlY2sgdGhhdDpcblx0ICpcblx0ICogLSBXZSBuZXZlciBpbmNyZWFzZWQgdGhlIHZhbHVlIHBhc3QgTUFYX1NBRkVfSU5URUdFUlxuXHQgKiAtIFdlIGRvbid0IG1ha2UgdGhlIHJlc3VsdCBuZWdhdGl2ZSBhbmQgYmVsb3cgTUlOX1NBRkVfSU5URUdFUlxuXHQgKlxuXHQgKiBCZWNhdXNlIHdlIG9ubHkgZXZlciBpbmNyZW1lbnQgdGhlIHZhbHVlIGR1cmluZyBwYXJzaW5nLCB0aGVyZSdzIG5vXG5cdCAqIGNoYW5jZSBvZiBtb3ZpbmcgcGFzdCBNQVhfU0FGRV9JTlRFR0VSIGFuZCB0aGVuIGRyb3BwaW5nIGJlbG93IGl0XG5cdCAqIGFnYWluLCBsb3NpbmcgcHJlY2lzaW9uIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1lYW5zIHRoYXQgd2Ugb25seSBuZWVkXG5cdCAqIHRvIGRvIG91ciBjaGVja3MgaGVyZSwgYXQgdGhlIGVuZC5cblx0ICovXG5cdGlmICghb3B0aW9ucy5hbGxvd0ltcHJlY2lzZSAmJlxuXHQgICAgKHZhbHVlID4gTUFYX1NBRkVfSU5URUdFUiB8fCByZXN1bHQgPCBNSU5fU0FGRV9JTlRFR0VSKSkge1xuXHRcdHJldHVybiAobmV3IEVycm9yKCdudW1iZXIgaXMgb3V0c2lkZSBvZiB0aGUgc3VwcG9ydGVkIHJhbmdlOiAnICtcblx0XHQgICAgSlNPTi5zdHJpbmdpZnkoc3RyLnNsaWNlKHN0YXJ0LCBpZHgpKSkpO1xuXHR9XG5cblx0cmV0dXJuIChyZXN1bHQpO1xufVxuXG5cbi8qXG4gKiBJbnRlcnByZXQgYSBjaGFyYWN0ZXIgY29kZSBhcyBhIGJhc2UtMzYgZGlnaXQuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZURpZ2l0KGQpXG57XG5cdGlmIChkID49IENQXzAgJiYgZCA8PSBDUF85KSB7XG5cdFx0LyogJzAnIHRvICc5JyAtPiAwIHRvIDkgKi9cblx0XHRyZXR1cm4gKGQgLSBQSV9DT05WX0RFQyk7XG5cdH0gZWxzZSBpZiAoZCA+PSBDUF9BICYmIGQgPD0gQ1BfWikge1xuXHRcdC8qICdBJyAtICdaJyAtPiAxMCB0byAzNSAqL1xuXHRcdHJldHVybiAoZCAtIFBJX0NPTlZfVUMpO1xuXHR9IGVsc2UgaWYgKGQgPj0gQ1BfYSAmJiBkIDw9IENQX3opIHtcblx0XHQvKiAnYScgLSAneicgLT4gMTAgdG8gMzUgKi9cblx0XHRyZXR1cm4gKGQgLSBQSV9DT05WX0xDKTtcblx0fSBlbHNlIHtcblx0XHQvKiBJbnZhbGlkIGNoYXJhY3RlciBjb2RlICovXG5cdFx0cmV0dXJuICgtMSk7XG5cdH1cbn1cblxuXG4vKlxuICogVGVzdCBpZiBhIHZhbHVlIG1hdGNoZXMgdGhlIEVDTUFTY3JpcHQgZGVmaW5pdGlvbiBvZiB0cmltbWFibGUgd2hpdGVzcGFjZS5cbiAqL1xuZnVuY3Rpb24gaXNTcGFjZShjKVxue1xuXHRyZXR1cm4gKGMgPT09IDB4MjApIHx8XG5cdCAgICAoYyA+PSAweDAwMDkgJiYgYyA8PSAweDAwMGQpIHx8XG5cdCAgICAoYyA9PT0gMHgwMGEwKSB8fFxuXHQgICAgKGMgPT09IDB4MTY4MCkgfHxcblx0ICAgIChjID09PSAweDE4MGUpIHx8XG5cdCAgICAoYyA+PSAweDIwMDAgJiYgYyA8PSAweDIwMGEpIHx8XG5cdCAgICAoYyA9PT0gMHgyMDI4KSB8fFxuXHQgICAgKGMgPT09IDB4MjAyOSkgfHxcblx0ICAgIChjID09PSAweDIwMmYpIHx8XG5cdCAgICAoYyA9PT0gMHgyMDVmKSB8fFxuXHQgICAgKGMgPT09IDB4MzAwMCkgfHxcblx0ICAgIChjID09PSAweGZlZmYpO1xufVxuXG5cbi8qXG4gKiBEZXRlcm1pbmUgd2hpY2ggYmFzZSBhIGNoYXJhY3RlciBpbmRpY2F0ZXMgKGUuZy4sICd4JyBpbmRpY2F0ZXMgaGV4KS5cbiAqL1xuZnVuY3Rpb24gcHJlZml4VG9CYXNlKGMpXG57XG5cdGlmIChjID09PSBDUF9iIHx8IGMgPT09IENQX0IpIHtcblx0XHQvKiAwYi8wQiAoYmluYXJ5KSAqL1xuXHRcdHJldHVybiAoMik7XG5cdH0gZWxzZSBpZiAoYyA9PT0gQ1BfbyB8fCBjID09PSBDUF9PKSB7XG5cdFx0LyogMG8vME8gKG9jdGFsKSAqL1xuXHRcdHJldHVybiAoOCk7XG5cdH0gZWxzZSBpZiAoYyA9PT0gQ1BfdCB8fCBjID09PSBDUF9UKSB7XG5cdFx0LyogMHQvMFQgKGRlY2ltYWwpICovXG5cdFx0cmV0dXJuICgxMCk7XG5cdH0gZWxzZSBpZiAoYyA9PT0gQ1BfeCB8fCBjID09PSBDUF9YKSB7XG5cdFx0LyogMHgvMFggKGhleGFkZWNpbWFsKSAqL1xuXHRcdHJldHVybiAoMTYpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIE5vdCBhIG1lYW5pbmdmdWwgY2hhcmFjdGVyICovXG5cdFx0cmV0dXJuICgtMSk7XG5cdH1cbn1cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpzb25PYmplY3RKUyhzY2hlbWEsIGlucHV0KVxue1xuXHR2YXIgcmVwb3J0ID0gbW9kX2pzb25zY2hlbWEudmFsaWRhdGUoaW5wdXQsIHNjaGVtYSk7XG5cblx0aWYgKHJlcG9ydC5lcnJvcnMubGVuZ3RoID09PSAwKVxuXHRcdHJldHVybiAobnVsbCk7XG5cblx0LyogQ3VycmVudGx5LCB3ZSBvbmx5IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoIHRoZSBmaXJzdCBlcnJvci4gKi9cblx0dmFyIGVycm9yID0gcmVwb3J0LmVycm9yc1swXTtcblxuXHQvKiBUaGUgZmFpbGVkIHByb3BlcnR5IGlzIGdpdmVuIGJ5IGEgVVJJIHdpdGggYW4gaXJyZWxldmFudCBwcmVmaXguICovXG5cdHZhciBwcm9wbmFtZSA9IGVycm9yWydwcm9wZXJ0eSddO1xuXHR2YXIgcmVhc29uID0gZXJyb3JbJ21lc3NhZ2UnXS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgaSwgajtcblxuXHQvKlxuXHQgKiBUaGVyZSdzIGF0IGxlYXN0IG9uZSBjYXNlIHdoZXJlIHRoZSBwcm9wZXJ0eSBlcnJvciBtZXNzYWdlIGlzXG5cdCAqIGNvbmZ1c2luZyBhdCBiZXN0LiAgV2Ugd29yayBhcm91bmQgdGhpcyBoZXJlLlxuXHQgKi9cblx0aWYgKChpID0gcmVhc29uLmluZGV4T2YoJ3RoZSBwcm9wZXJ0eSAnKSkgIT0gLTEgJiZcblx0ICAgIChqID0gcmVhc29uLmluZGV4T2YoJyBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc2NoZW1hIGFuZCB0aGUgJyArXG5cdCAgICAnc2NoZW1hIGRvZXMgbm90IGFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllcycpKSAhPSAtMSkge1xuXHRcdGkgKz0gJ3RoZSBwcm9wZXJ0eSAnLmxlbmd0aDtcblx0XHRpZiAocHJvcG5hbWUgPT09ICcnKVxuXHRcdFx0cHJvcG5hbWUgPSByZWFzb24uc3Vic3RyKGksIGogLSBpKTtcblx0XHRlbHNlXG5cdFx0XHRwcm9wbmFtZSA9IHByb3BuYW1lICsgJy4nICsgcmVhc29uLnN1YnN0cihpLCBqIC0gaSk7XG5cblx0XHRyZWFzb24gPSAndW5zdXBwb3J0ZWQgcHJvcGVydHknO1xuXHR9XG5cblx0dmFyIHJ2ID0gbmV3IG1vZF92ZXJyb3IuVkVycm9yKCdwcm9wZXJ0eSBcIiVzXCI6ICVzJywgcHJvcG5hbWUsIHJlYXNvbik7XG5cdHJ2Lmpzdl9kZXRhaWxzID0gZXJyb3I7XG5cdHJldHVybiAocnYpO1xufVxuXG5mdW5jdGlvbiByYW5kRWx0KGFycilcbntcblx0bW9kX2Fzc2VydC5vayhBcnJheS5pc0FycmF5KGFycikgJiYgYXJyLmxlbmd0aCA+IDAsXG5cdCAgICAncmFuZEVsdCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5Jyk7XG5cblx0cmV0dXJuIChhcnJbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCldKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SHJ0aW1lKGEpXG57XG5cdG1vZF9hc3NlcnQub2soYVswXSA+PSAwICYmIGFbMV0gPj0gMCxcblx0ICAgICduZWdhdGl2ZSBudW1iZXJzIG5vdCBhbGxvd2VkIGluIGhydGltZXMnKTtcblx0bW9kX2Fzc2VydC5vayhhWzFdIDwgMWU5LCAnbmFub3NlY29uZHMgY29sdW1uIG92ZXJmbG93Jyk7XG59XG5cbi8qXG4gKiBDb21wdXRlIHRoZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBocnRpbWUgcmVhZGluZ3MgQSBhbmQgQiwgd2hlcmUgQSBpcyBsYXRlclxuICogdGhhbiBCLiAgaHJ0aW1lIHJlYWRpbmdzIGNvbWUgZnJvbSBOb2RlJ3MgcHJvY2Vzcy5ocnRpbWUoKS4gIFRoZXJlIGlzIG5vXG4gKiBkZWZpbmVkIHdheSB0byByZXByZXNlbnQgbmVnYXRpdmUgZGVsdGFzLCBzbyBpdCdzIGlsbGVnYWwgdG8gZGlmZiBCIGZyb20gQVxuICogd2hlcmUgdGhlIHRpbWUgZGVub3RlZCBieSBCIGlzIGxhdGVyIHRoYW4gdGhlIHRpbWUgZGVub3RlZCBieSBBLiAgSWYgdGhpc1xuICogYmVjb21lcyB2YWx1YWJsZSwgd2UgY2FuIGRlZmluZSBhIHJlcHJlc2VudGF0aW9uIGFuZCBleHRlbmQgdGhlXG4gKiBpbXBsZW1lbnRhdGlvbiB0byBzdXBwb3J0IGl0LlxuICovXG5mdW5jdGlvbiBocnRpbWVEaWZmKGEsIGIpXG57XG5cdGFzc2VydEhydGltZShhKTtcblx0YXNzZXJ0SHJ0aW1lKGIpO1xuXHRtb2RfYXNzZXJ0Lm9rKGFbMF0gPiBiWzBdIHx8IChhWzBdID09IGJbMF0gJiYgYVsxXSA+PSBiWzFdKSxcblx0ICAgICduZWdhdGl2ZSBkaWZmZXJlbmNlcyBub3QgYWxsb3dlZCcpO1xuXG5cdHZhciBydiA9IFsgYVswXSAtIGJbMF0sIDAgXTtcblxuXHRpZiAoYVsxXSA+PSBiWzFdKSB7XG5cdFx0cnZbMV0gPSBhWzFdIC0gYlsxXTtcblx0fSBlbHNlIHtcblx0XHRydlswXS0tO1xuXHRcdHJ2WzFdID0gMWU5IC0gKGJbMV0gLSBhWzFdKTtcblx0fVxuXG5cdHJldHVybiAocnYpO1xufVxuXG4vKlxuICogQ29udmVydCBhIGhydGltZSByZWFkaW5nIGZyb20gdGhlIGFycmF5IGZvcm1hdCByZXR1cm5lZCBieSBOb2RlJ3NcbiAqIHByb2Nlc3MuaHJ0aW1lKCkgaW50byBhIHNjYWxhciBudW1iZXIgb2YgbmFub3NlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIGhydGltZU5hbm9zZWMoYSlcbntcblx0YXNzZXJ0SHJ0aW1lKGEpO1xuXG5cdHJldHVybiAoTWF0aC5mbG9vcihhWzBdICogMWU5ICsgYVsxXSkpO1xufVxuXG4vKlxuICogQ29udmVydCBhIGhydGltZSByZWFkaW5nIGZyb20gdGhlIGFycmF5IGZvcm1hdCByZXR1cm5lZCBieSBOb2RlJ3NcbiAqIHByb2Nlc3MuaHJ0aW1lKCkgaW50byBhIHNjYWxhciBudW1iZXIgb2YgbWljcm9zZWNvbmRzLlxuICovXG5mdW5jdGlvbiBocnRpbWVNaWNyb3NlYyhhKVxue1xuXHRhc3NlcnRIcnRpbWUoYSk7XG5cblx0cmV0dXJuIChNYXRoLmZsb29yKGFbMF0gKiAxZTYgKyBhWzFdIC8gMWUzKSk7XG59XG5cbi8qXG4gKiBDb252ZXJ0IGEgaHJ0aW1lIHJlYWRpbmcgZnJvbSB0aGUgYXJyYXkgZm9ybWF0IHJldHVybmVkIGJ5IE5vZGUnc1xuICogcHJvY2Vzcy5ocnRpbWUoKSBpbnRvIGEgc2NhbGFyIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIGhydGltZU1pbGxpc2VjKGEpXG57XG5cdGFzc2VydEhydGltZShhKTtcblxuXHRyZXR1cm4gKE1hdGguZmxvb3IoYVswXSAqIDFlMyArIGFbMV0gLyAxZTYpKTtcbn1cblxuLypcbiAqIEFkZCB0d28gaHJ0aW1lIHJlYWRpbmdzIEEgYW5kIEIsIG92ZXJ3cml0aW5nIEEgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZVxuICogYWRkaXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgYWNjdW11bGF0aW5nIHNldmVyYWwgaHJ0aW1lIGludGVydmFsc1xuICogaW50byBhIGNvdW50ZXIuICBSZXR1cm5zIEEuXG4gKi9cbmZ1bmN0aW9uIGhydGltZUFjY3VtKGEsIGIpXG57XG5cdGFzc2VydEhydGltZShhKTtcblx0YXNzZXJ0SHJ0aW1lKGIpO1xuXG5cdC8qXG5cdCAqIEFjY3VtdWxhdGUgdGhlIG5hbm9zZWNvbmQgY29tcG9uZW50LlxuXHQgKi9cblx0YVsxXSArPSBiWzFdO1xuXHRpZiAoYVsxXSA+PSAxZTkpIHtcblx0XHQvKlxuXHRcdCAqIFRoZSBuYW5vc2Vjb25kIGNvbXBvbmVudCBvdmVyZmxvd2VkLCBzbyBjYXJyeSB0byB0aGUgc2Vjb25kc1xuXHRcdCAqIGZpZWxkLlxuXHRcdCAqL1xuXHRcdGFbMF0rKztcblx0XHRhWzFdIC09IDFlOTtcblx0fVxuXG5cdC8qXG5cdCAqIEFjY3VtdWxhdGUgdGhlIHNlY29uZHMgY29tcG9uZW50LlxuXHQgKi9cblx0YVswXSArPSBiWzBdO1xuXG5cdHJldHVybiAoYSk7XG59XG5cbi8qXG4gKiBBZGQgdHdvIGhydGltZSByZWFkaW5ncyBBIGFuZCBCLCByZXR1cm5pbmcgdGhlIHJlc3VsdCBhcyBhIG5ldyBocnRpbWUgYXJyYXkuXG4gKiBEb2VzIG5vdCBtb2RpZnkgZWl0aGVyIGlucHV0IGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBocnRpbWVBZGQoYSwgYilcbntcblx0YXNzZXJ0SHJ0aW1lKGEpO1xuXG5cdHZhciBydiA9IFsgYVswXSwgYVsxXSBdO1xuXG5cdHJldHVybiAoaHJ0aW1lQWNjdW0ocnYsIGIpKTtcbn1cblxuXG4vKlxuICogQ2hlY2sgYW4gb2JqZWN0IGZvciB1bmV4cGVjdGVkIHByb3BlcnRpZXMuICBBY2NlcHRzIHRoZSBvYmplY3QgdG8gY2hlY2ssIGFuZFxuICogYW4gYXJyYXkgb2YgYWxsb3dlZCBwcm9wZXJ0eSBuYW1lcyAoc3RyaW5ncykuICBSZXR1cm5zIGFuIGFycmF5IG9mIGtleSBuYW1lc1xuICogdGhhdCB3ZXJlIGZvdW5kIG9uIHRoZSBvYmplY3QsIGJ1dCBkaWQgbm90IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkXG4gKiBwcm9wZXJ0aWVzLiAgSWYgbm8gcHJvcGVydGllcyB3ZXJlIGZvdW5kLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBvZlxuICogemVybyBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGV4dHJhUHJvcGVydGllcyhvYmosIGFsbG93ZWQpXG57XG5cdG1vZF9hc3NlcnQub2sodHlwZW9mIChvYmopID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwsXG5cdCAgICAnb2JqIGFyZ3VtZW50IG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QnKTtcblx0bW9kX2Fzc2VydC5vayhBcnJheS5pc0FycmF5KGFsbG93ZWQpLFxuXHQgICAgJ2FsbG93ZWQgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZC5sZW5ndGg7IGkrKykge1xuXHRcdG1vZF9hc3NlcnQub2sodHlwZW9mIChhbGxvd2VkW2ldKSA9PT0gJ3N0cmluZycsXG5cdFx0ICAgICdhbGxvd2VkIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuXHR9XG5cblx0cmV0dXJuIChPYmplY3Qua2V5cyhvYmopLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG5cdFx0cmV0dXJuIChhbGxvd2VkLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuXHR9KSk7XG59XG5cbi8qXG4gKiBHaXZlbiB0aHJlZSBzZXRzIG9mIHByb3BlcnRpZXMgXCJwcm92aWRlZFwiIChtYXkgYmUgdW5kZWZpbmVkKSwgXCJvdmVycmlkZXNcIlxuICogKHJlcXVpcmVkKSwgYW5kIFwiZGVmYXVsdHNcIiAobWF5IGJlIHVuZGVmaW5lZCksIGNvbnN0cnVjdCBhbiBvYmplY3QgY29udGFpbmluZ1xuICogdGhlIHVuaW9uIG9mIHRoZXNlIHNldHMgd2l0aCBcIm92ZXJyaWRlc1wiIG92ZXJyaWRpbmcgXCJwcm92aWRlZFwiLCBhbmRcbiAqIFwicHJvdmlkZWRcIiBvdmVycmlkaW5nIFwiZGVmYXVsdHNcIi4gIE5vbmUgb2YgdGhlIGlucHV0IG9iamVjdHMgYXJlIG1vZGlmaWVkLlxuICovXG5mdW5jdGlvbiBtZXJnZU9iamVjdHMocHJvdmlkZWQsIG92ZXJyaWRlcywgZGVmYXVsdHMpXG57XG5cdHZhciBydiwgaztcblxuXHRydiA9IHt9O1xuXHRpZiAoZGVmYXVsdHMpIHtcblx0XHRmb3IgKGsgaW4gZGVmYXVsdHMpXG5cdFx0XHRydltrXSA9IGRlZmF1bHRzW2tdO1xuXHR9XG5cblx0aWYgKHByb3ZpZGVkKSB7XG5cdFx0Zm9yIChrIGluIHByb3ZpZGVkKVxuXHRcdFx0cnZba10gPSBwcm92aWRlZFtrXTtcblx0fVxuXG5cdGlmIChvdmVycmlkZXMpIHtcblx0XHRmb3IgKGsgaW4gb3ZlcnJpZGVzKVxuXHRcdFx0cnZba10gPSBvdmVycmlkZXNba107XG5cdH1cblxuXHRyZXR1cm4gKHJ2KTtcbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAxMiBKb3llbnQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBzc2hwayA9IHJlcXVpcmUoJ3NzaHBrJyk7XG52YXIganNwcmltID0gcmVxdWlyZSgnanNwcmltJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBzcHJpbnRmID0gcmVxdWlyZSgndXRpbCcpLmZvcm1hdDtcblxudmFyIEhBU0hfQUxHT1MgPSB1dGlscy5IQVNIX0FMR09TO1xudmFyIFBLX0FMR09TID0gdXRpbHMuUEtfQUxHT1M7XG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gdXRpbHMuSW52YWxpZEFsZ29yaXRobUVycm9yO1xudmFyIEh0dHBTaWduYXR1cmVFcnJvciA9IHV0aWxzLkh0dHBTaWduYXR1cmVFcnJvcjtcbnZhciB2YWxpZGF0ZUFsZ29yaXRobSA9IHV0aWxzLnZhbGlkYXRlQWxnb3JpdGhtO1xuXG4vLy8tLS0gR2xvYmFsc1xuXG52YXIgQVVUSFpfRk1UID1cbiAgJ1NpZ25hdHVyZSBrZXlJZD1cIiVzXCIsYWxnb3JpdGhtPVwiJXNcIixoZWFkZXJzPVwiJXNcIixzaWduYXR1cmU9XCIlc1wiJztcblxuLy8vLS0tIFNwZWNpZmljIEVycm9yc1xuXG5mdW5jdGlvbiBNaXNzaW5nSGVhZGVyRXJyb3IobWVzc2FnZSkge1xuICBIdHRwU2lnbmF0dXJlRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlLCBNaXNzaW5nSGVhZGVyRXJyb3IpO1xufVxudXRpbC5pbmhlcml0cyhNaXNzaW5nSGVhZGVyRXJyb3IsIEh0dHBTaWduYXR1cmVFcnJvcik7XG5cbmZ1bmN0aW9uIFN0cmljdFBhcnNpbmdFcnJvcihtZXNzYWdlKSB7XG4gIEh0dHBTaWduYXR1cmVFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UsIFN0cmljdFBhcnNpbmdFcnJvcik7XG59XG51dGlsLmluaGVyaXRzKFN0cmljdFBhcnNpbmdFcnJvciwgSHR0cFNpZ25hdHVyZUVycm9yKTtcblxuLyogU2VlIGNyZWF0ZVNpZ25lcigpICovXG5mdW5jdGlvbiBSZXF1ZXN0U2lnbmVyKG9wdGlvbnMpIHtcbiAgYXNzZXJ0Lm9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpO1xuXG4gIHZhciBhbGcgPSBbXTtcbiAgaWYgKG9wdGlvbnMuYWxnb3JpdGhtICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuc3RyaW5nKG9wdGlvbnMuYWxnb3JpdGhtLCAnb3B0aW9ucy5hbGdvcml0aG0nKTtcbiAgICBhbGcgPSB2YWxpZGF0ZUFsZ29yaXRobShvcHRpb25zLmFsZ29yaXRobSk7XG4gIH1cbiAgdGhpcy5yc19hbGcgPSBhbGc7XG5cbiAgLypcbiAgICogUmVxdWVzdFNpZ25lcnMgY29tZSBpbiB0d28gdmFyaWV0aWVzOiBvbmVzIHdpdGggYW4gcnNfc2lnbkZ1bmMsIGFuZCBvbmVzXG4gICAqIHdpdGggYW4gcnNfc2lnbmVyLlxuICAgKlxuICAgKiByc19zaWduRnVuYy1iYXNlZCBSZXF1ZXN0U2lnbmVycyBoYXZlIHRvIGJ1aWxkIHVwIHRoZWlyIGVudGlyZSBzaWduaW5nXG4gICAqIHN0cmluZyB3aXRoaW4gdGhlIHJzX2xpbmVzIGFycmF5IGFuZCBnaXZlIGl0IHRvIHJzX3NpZ25GdW5jIGFzIGEgc2luZ2xlXG4gICAqIGNvbmNhdCdkIGJsb2IuIHJzX3NpZ25lci1iYXNlZCBSZXF1ZXN0U2lnbmVycyBjYW4gYWRkIGEgbGluZSBhdCBhIHRpbWUgdG9cbiAgICogdGhlaXIgc2lnbmluZyBzdGF0ZSBieSB1c2luZyByc19zaWduZXIudXBkYXRlKCksIHRodXMgb25seSBuZWVkaW5nIHRvXG4gICAqIGJ1ZmZlciB0aGUgaGFzaCBmdW5jdGlvbiBzdGF0ZSBhbmQgb25lIGxpbmUgYXQgYSB0aW1lLlxuICAgKi9cbiAgaWYgKG9wdGlvbnMuc2lnbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZ1bmMob3B0aW9ucy5zaWduLCAnb3B0aW9ucy5zaWduJyk7XG4gICAgdGhpcy5yc19zaWduRnVuYyA9IG9wdGlvbnMuc2lnbjtcblxuICB9IGVsc2UgaWYgKGFsZ1swXSA9PT0gJ2htYWMnICYmIG9wdGlvbnMua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuc3RyaW5nKG9wdGlvbnMua2V5SWQsICdvcHRpb25zLmtleUlkJyk7XG4gICAgdGhpcy5yc19rZXlJZCA9IG9wdGlvbnMua2V5SWQ7XG5cbiAgICBpZiAodHlwZW9mIChvcHRpb25zLmtleSkgIT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNCdWZmZXIob3B0aW9ucy5rZXkpKVxuICAgICAgdGhyb3cgKG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMua2V5IGZvciBITUFDIG11c3QgYmUgYSBzdHJpbmcgb3IgQnVmZmVyJykpO1xuXG4gICAgLypcbiAgICAgKiBNYWtlIGFuIHJzX3NpZ25lciBmb3IgSE1BQ3MsIG5vdCBhIHJzX3NpZ25GdW5jIC0tIEhNQUNzIGRpZ2VzdCB0aGVpclxuICAgICAqIGRhdGEgaW4gY2h1bmtzIHJhdGhlciB0aGFuIHJlcXVpcmluZyBpdCBhbGwgdG8gYmUgZ2l2ZW4gaW4gb25lIGdvXG4gICAgICogYXQgdGhlIGVuZCwgc28gdGhleSBhcmUgbW9yZSBzaW1pbGFyIHRvIHNpZ25lcnMgdGhhbiBzaWduRnVuY3MuXG4gICAgICovXG4gICAgdGhpcy5yc19zaWduZXIgPSBjcnlwdG8uY3JlYXRlSG1hYyhhbGdbMV0udG9VcHBlckNhc2UoKSwgb3B0aW9ucy5rZXkpO1xuICAgIHRoaXMucnNfc2lnbmVyLnNpZ24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZGlnZXN0ID0gdGhpcy5kaWdlc3QoJ2Jhc2U2NCcpO1xuICAgICAgcmV0dXJuICh7XG4gICAgICAgIGhhc2hBbGdvcml0aG06IGFsZ1sxXSxcbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChkaWdlc3QpOyB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gIH0gZWxzZSBpZiAob3B0aW9ucy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBpZiAodHlwZW9mIChrZXkpID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIoa2V5KSlcbiAgICAgIGtleSA9IHNzaHBrLnBhcnNlUHJpdmF0ZUtleShrZXkpO1xuXG4gICAgYXNzZXJ0Lm9rKHNzaHBrLlByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSwgWzEsIDJdKSxcbiAgICAgICdvcHRpb25zLmtleSBtdXN0IGJlIGEgc3NocGsuUHJpdmF0ZUtleScpO1xuICAgIHRoaXMucnNfa2V5ID0ga2V5O1xuXG4gICAgYXNzZXJ0LnN0cmluZyhvcHRpb25zLmtleUlkLCAnb3B0aW9ucy5rZXlJZCcpO1xuICAgIHRoaXMucnNfa2V5SWQgPSBvcHRpb25zLmtleUlkO1xuXG4gICAgaWYgKCFQS19BTEdPU1trZXkudHlwZV0pIHtcbiAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKGtleS50eXBlLnRvVXBwZXJDYXNlKCkgKyAnIHR5cGUgJyArXG4gICAgICAgICdrZXlzIGFyZSBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChhbGdbMF0gIT09IHVuZGVmaW5lZCAmJiBrZXkudHlwZSAhPT0gYWxnWzBdKSB7XG4gICAgICB0aHJvdyAobmV3IEludmFsaWRBbGdvcml0aG1FcnJvcignb3B0aW9ucy5rZXkgbXVzdCBiZSBhICcgK1xuICAgICAgICBhbGdbMF0udG9VcHBlckNhc2UoKSArICcga2V5LCB3YXMgZ2l2ZW4gYSAnICtcbiAgICAgICAga2V5LnR5cGUudG9VcHBlckNhc2UoKSArICcga2V5IGluc3RlYWQnKSk7XG4gICAgfVxuXG4gICAgdGhpcy5yc19zaWduZXIgPSBrZXkuY3JlYXRlU2lnbihhbGdbMV0pO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgKG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuc2lnbiAoZnVuYykgb3Igb3B0aW9ucy5rZXkgaXMgcmVxdWlyZWQnKSk7XG4gIH1cblxuICB0aGlzLnJzX2hlYWRlcnMgPSBbXTtcbiAgdGhpcy5yc19saW5lcyA9IFtdO1xufVxuXG4vKipcbiAqIEFkZHMgYSBoZWFkZXIgdG8gYmUgc2lnbmVkLCB3aXRoIGl0cyB2YWx1ZSwgaW50byB0aGlzIHNpZ25lci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ30gdmFsdWUgd3JpdHRlblxuICovXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS53cml0ZUhlYWRlciA9IGZ1bmN0aW9uIChoZWFkZXIsIHZhbHVlKSB7XG4gIGFzc2VydC5zdHJpbmcoaGVhZGVyLCAnaGVhZGVyJyk7XG4gIGhlYWRlciA9IGhlYWRlci50b0xvd2VyQ2FzZSgpO1xuICBhc3NlcnQuc3RyaW5nKHZhbHVlLCAndmFsdWUnKTtcblxuICB0aGlzLnJzX2hlYWRlcnMucHVzaChoZWFkZXIpO1xuXG4gIGlmICh0aGlzLnJzX3NpZ25GdW5jKSB7XG4gICAgdGhpcy5yc19saW5lcy5wdXNoKGhlYWRlciArICc6ICcgKyB2YWx1ZSk7XG5cbiAgfSBlbHNlIHtcbiAgICB2YXIgbGluZSA9IGhlYWRlciArICc6ICcgKyB2YWx1ZTtcbiAgICBpZiAodGhpcy5yc19oZWFkZXJzLmxlbmd0aCA+IDApXG4gICAgICBsaW5lID0gJ1xcbicgKyBsaW5lO1xuICAgIHRoaXMucnNfc2lnbmVyLnVwZGF0ZShsaW5lKTtcbiAgfVxuXG4gIHJldHVybiAodmFsdWUpO1xufTtcblxuLyoqXG4gKiBBZGRzIGEgZGVmYXVsdCBEYXRlIGhlYWRlciwgcmV0dXJuaW5nIGl0cyB2YWx1ZS5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cblJlcXVlc3RTaWduZXIucHJvdG90eXBlLndyaXRlRGF0ZUhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLndyaXRlSGVhZGVyKCdkYXRlJywganNwcmltLnJmYzExMjMobmV3IERhdGUoKSkpKTtcbn07XG5cbi8qKlxuICogQWRkcyB0aGUgcmVxdWVzdCB0YXJnZXQgbGluZSB0byBiZSBzaWduZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCwgSFRUUCBtZXRob2QgKGUuZy4gJ2dldCcsICdwb3N0JywgJ3B1dCcpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICovXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS53cml0ZVRhcmdldCA9IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgpIHtcbiAgYXNzZXJ0LnN0cmluZyhtZXRob2QsICdtZXRob2QnKTtcbiAgYXNzZXJ0LnN0cmluZyhwYXRoLCAncGF0aCcpO1xuICBtZXRob2QgPSBtZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgdGhpcy53cml0ZUhlYWRlcignKHJlcXVlc3QtdGFyZ2V0KScsIG1ldGhvZCArICcgJyArIHBhdGgpO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHZhbHVlIGZvciB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgb24gdGhpcyByZXF1ZXN0XG4gKiBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN9IGNhbGxiYWNrIChlcnIsIGF1dGh6KVxuICovXG5SZXF1ZXN0U2lnbmVyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gKGNiKSB7XG4gIGFzc2VydC5mdW5jKGNiLCAnY2FsbGJhY2snKTtcblxuICBpZiAodGhpcy5yc19oZWFkZXJzLmxlbmd0aCA8IDEpXG4gICAgdGhyb3cgKG5ldyBFcnJvcignQXQgbGVhc3Qgb25lIGhlYWRlciBtdXN0IGJlIHNpZ25lZCcpKTtcblxuICB2YXIgYWxnLCBhdXRoejtcbiAgaWYgKHRoaXMucnNfc2lnbkZ1bmMpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucnNfbGluZXMuam9pbignXFxuJyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucnNfc2lnbkZ1bmMoZGF0YSwgZnVuY3Rpb24gKGVyciwgc2lnKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNiKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGFzc2VydC5vYmplY3Qoc2lnLCAnc2lnbmF0dXJlJyk7XG4gICAgICAgIGFzc2VydC5zdHJpbmcoc2lnLmtleUlkLCAnc2lnbmF0dXJlLmtleUlkJyk7XG4gICAgICAgIGFzc2VydC5zdHJpbmcoc2lnLmFsZ29yaXRobSwgJ3NpZ25hdHVyZS5hbGdvcml0aG0nKTtcbiAgICAgICAgYXNzZXJ0LnN0cmluZyhzaWcuc2lnbmF0dXJlLCAnc2lnbmF0dXJlLnNpZ25hdHVyZScpO1xuICAgICAgICBhbGcgPSB2YWxpZGF0ZUFsZ29yaXRobShzaWcuYWxnb3JpdGhtKTtcblxuICAgICAgICBhdXRoeiA9IHNwcmludGYoQVVUSFpfRk1ULFxuICAgICAgICAgIHNpZy5rZXlJZCxcbiAgICAgICAgICBzaWcuYWxnb3JpdGhtLFxuICAgICAgICAgIHNlbGYucnNfaGVhZGVycy5qb2luKCcgJyksXG4gICAgICAgICAgc2lnLnNpZ25hdHVyZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNiKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYihudWxsLCBhdXRoeik7XG4gICAgfSk7XG5cbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHNpZ09iaiA9IHRoaXMucnNfc2lnbmVyLnNpZ24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWxnID0gKHRoaXMucnNfYWxnWzBdIHx8IHRoaXMucnNfa2V5LnR5cGUpICsgJy0nICsgc2lnT2JqLmhhc2hBbGdvcml0aG07XG4gICAgdmFyIHNpZ25hdHVyZSA9IHNpZ09iai50b1N0cmluZygpO1xuICAgIGF1dGh6ID0gc3ByaW50ZihBVVRIWl9GTVQsXG4gICAgICB0aGlzLnJzX2tleUlkLFxuICAgICAgYWxnLFxuICAgICAgdGhpcy5yc19oZWFkZXJzLmpvaW4oJyAnKSxcbiAgICAgIHNpZ25hdHVyZSk7XG4gICAgY2IobnVsbCwgYXV0aHopO1xuICB9XG59O1xuXG4vLy8tLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogSWRlbnRpZmllcyB3aGV0aGVyIGEgZ2l2ZW4gb2JqZWN0IGlzIGEgcmVxdWVzdCBzaWduZXIgb3Igbm90LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0LCB0aGUgb2JqZWN0IHRvIGlkZW50aWZ5XG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cbiAgaXNTaWduZXI6IGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAodHlwZW9mIChvYmopID09PSAnb2JqZWN0JyAmJiBvYmogaW5zdGFuY2VvZiBSZXF1ZXN0U2lnbmVyKVxuICAgICAgcmV0dXJuICh0cnVlKTtcbiAgICByZXR1cm4gKGZhbHNlKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlcXVlc3Qgc2lnbmVyLCB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IGJ1aWxkIGEgc2lnbmF0dXJlXG4gICAqIGZvciBhIHJlcXVlc3QgKGRvZXMgbm90IGhhdmUgdG8gYmUgYW4gaHR0cC5DbGllbnRSZXF1ZXN0KS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMsIGVpdGhlcjpcbiAgICogICAgICAgICAgICAgICAgICAgLSB7U3RyaW5nfSBrZXlJZFxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtTdHJpbmd8QnVmZmVyfSBrZXlcbiAgICogICAgICAgICAgICAgICAgICAgLSB7U3RyaW5nfSBhbGdvcml0aG0gKG9wdGlvbmFsLCByZXF1aXJlZCBmb3IgSE1BQylcbiAgICogICAgICAgICAgICAgICAgIG9yOlxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtGdW5jfSBzaWduIChkYXRhLCBjYilcbiAgICogQHJldHVybiB7UmVxdWVzdFNpZ25lcn1cbiAgICovXG4gIGNyZWF0ZVNpZ25lcjogZnVuY3Rpb24gY3JlYXRlU2lnbmVyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKG5ldyBSZXF1ZXN0U2lnbmVyKG9wdGlvbnMpKTtcbiAgfSxcblxuICAvKipcbiAgICogQWRkcyBhbiAnQXV0aG9yaXphdGlvbicgaGVhZGVyIHRvIGFuIGh0dHAuQ2xpZW50UmVxdWVzdCBvYmplY3QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIEFQSSB3aWxsIGFkZCBhIERhdGUgaGVhZGVyIGlmIGl0J3Mgbm90IGFscmVhZHkgc2V0LiBBbnlcbiAgICogb3RoZXIgaGVhZGVycyBpbiB0aGUgb3B0aW9ucy5oZWFkZXJzIGFycmF5IE1VU1QgYmUgcHJlc2VudCwgb3IgdGhpc1xuICAgKiB3aWxsIHRocm93LlxuICAgKlxuICAgKiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB0eXBlOyBpdCdzIGp1c3QgdGhlcmUgaWYgeW91IHdhbnRcbiAgICogdG8gYmUgcGVkYW50aWMuXG4gICAqXG4gICAqIFRoZSBvcHRpb25hbCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHBhcnNpbmcgc2hvdWxkIHVzZSBzdHJpY3QgZW5mb3JjZW1lbnRcbiAgICogb2YgdGhlIHZlcnNpb24gZHJhZnQtY2F2YWdlLWh0dHAtc2lnbmF0dXJlcy0wNCBvZiB0aGUgc3BlYyBvciBiZXlvbmQuXG4gICAqIFRoZSBkZWZhdWx0IGlzIHRvIGJlIGxvb3NlIGFuZCBzdXBwb3J0XG4gICAqIG9sZGVyIHZlcnNpb25zIGZvciBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBhbiBpbnN0YW5jZSBvZiBodHRwLkNsaWVudFJlcXVlc3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHNpZ25pbmcgcGFyYW1ldGVycyBvYmplY3Q6XG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30ga2V5SWQgcmVxdWlyZWQuXG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30ga2V5IHJlcXVpcmVkIChlaXRoZXIgYSBQRU0gb3IgSE1BQyBrZXkpLlxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtBcnJheX0gaGVhZGVycyBvcHRpb25hbDsgZGVmYXVsdHMgdG8gWydkYXRlJ10uXG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30gYWxnb3JpdGhtIG9wdGlvbmFsICh1bmxlc3Mga2V5IGlzIEhNQUMpO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIHNzaHBrIGRlZmF1bHRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduaW5nIGFsZ29yaXRobSBmb3IgdGhlIHR5cGUgb2Yga2V5IGdpdmVuXG4gICAqICAgICAgICAgICAgICAgICAgIC0ge1N0cmluZ30gaHR0cFZlcnNpb24gb3B0aW9uYWw7IGRlZmF1bHRzIHRvICcxLjEnLlxuICAgKiAgICAgICAgICAgICAgICAgICAtIHtCb29sZWFufSBzdHJpY3Qgb3B0aW9uYWw7IGRlZmF1bHRzIHRvICdmYWxzZScuXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgQXV0aG9yaXphdGlvbiAoYW5kIG9wdGlvbmFsbHkgRGF0ZSkgd2VyZSBhZGRlZC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBvbiBiYWQgcGFyYW1ldGVyIHR5cGVzIChpbnB1dCkuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRBbGdvcml0aG1FcnJvcn0gaWYgYWxnb3JpdGhtIHdhcyBiYWQgb3IgaW5jb21wYXRpYmxlIHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4ga2V5LlxuICAgKiBAdGhyb3dzIHtzc2hway5LZXlQYXJzZUVycm9yfSBpZiBrZXkgd2FzIGJhZC5cbiAgICogQHRocm93cyB7TWlzc2luZ0hlYWRlckVycm9yfSBpZiBhIGhlYWRlciB0byBiZSBzaWduZWQgd2FzIHNwZWNpZmllZCBidXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgbm90IHByZXNlbnQuXG4gICAqL1xuICBzaWduUmVxdWVzdDogZnVuY3Rpb24gc2lnblJlcXVlc3QocmVxdWVzdCwgb3B0aW9ucykge1xuICAgIGFzc2VydC5vYmplY3QocmVxdWVzdCwgJ3JlcXVlc3QnKTtcbiAgICBhc3NlcnQub2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJyk7XG4gICAgYXNzZXJ0Lm9wdGlvbmFsU3RyaW5nKG9wdGlvbnMuYWxnb3JpdGhtLCAnb3B0aW9ucy5hbGdvcml0aG0nKTtcbiAgICBhc3NlcnQuc3RyaW5nKG9wdGlvbnMua2V5SWQsICdvcHRpb25zLmtleUlkJyk7XG4gICAgYXNzZXJ0Lm9wdGlvbmFsQXJyYXlPZlN0cmluZyhvcHRpb25zLmhlYWRlcnMsICdvcHRpb25zLmhlYWRlcnMnKTtcbiAgICBhc3NlcnQub3B0aW9uYWxTdHJpbmcob3B0aW9ucy5odHRwVmVyc2lvbiwgJ29wdGlvbnMuaHR0cFZlcnNpb24nKTtcblxuICAgIGlmICghcmVxdWVzdC5nZXRIZWFkZXIoJ0RhdGUnKSlcbiAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCdEYXRlJywganNwcmltLnJmYzExMjMobmV3IERhdGUoKSkpO1xuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKVxuICAgICAgb3B0aW9ucy5oZWFkZXJzID0gWydkYXRlJ107XG4gICAgaWYgKCFvcHRpb25zLmh0dHBWZXJzaW9uKVxuICAgICAgb3B0aW9ucy5odHRwVmVyc2lvbiA9ICcxLjEnO1xuXG4gICAgdmFyIGFsZyA9IFtdO1xuICAgIGlmIChvcHRpb25zLmFsZ29yaXRobSkge1xuICAgICAgb3B0aW9ucy5hbGdvcml0aG0gPSBvcHRpb25zLmFsZ29yaXRobS50b0xvd2VyQ2FzZSgpO1xuICAgICAgYWxnID0gdmFsaWRhdGVBbGdvcml0aG0ob3B0aW9ucy5hbGdvcml0aG0pO1xuICAgIH1cblxuICAgIHZhciBpO1xuICAgIHZhciBzdHJpbmdUb1NpZ24gPSAnJztcbiAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5oZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIChvcHRpb25zLmhlYWRlcnNbaV0pICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5oZWFkZXJzIG11c3QgYmUgYW4gYXJyYXkgb2YgU3RyaW5ncycpO1xuXG4gICAgICB2YXIgaCA9IG9wdGlvbnMuaGVhZGVyc1tpXS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAoaCA9PT0gJ3JlcXVlc3QtbGluZScpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFdlIGFsbG93IGhlYWRlcnMgZnJvbSB0aGUgb2xkZXIgc3BlYyBkcmFmdHMgaWYgc3RyaWN0IHBhcnNpbmcgaXNuJ3RcbiAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gb3B0aW9ucy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBzdHJpbmdUb1NpZ24gKz1cbiAgICAgICAgICAgIHJlcXVlc3QubWV0aG9kICsgJyAnICsgcmVxdWVzdC5wYXRoICsgJyBIVFRQLycgK1xuICAgICAgICAgICAgb3B0aW9ucy5odHRwVmVyc2lvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBTdHJpY3QgcGFyc2luZyBkb2Vzbid0IGFsbG93IG9sZGVyIGRyYWZ0IGhlYWRlcnMuICovXG4gICAgICAgICAgdGhyb3cgKG5ldyBTdHJpY3RQYXJzaW5nRXJyb3IoJ3JlcXVlc3QtbGluZSBpcyBub3QgYSB2YWxpZCBoZWFkZXIgJyArXG4gICAgICAgICAgICAnd2l0aCBzdHJpY3QgcGFyc2luZyBlbmFibGVkLicpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoID09PSAnKHJlcXVlc3QtdGFyZ2V0KScpIHtcbiAgICAgICAgc3RyaW5nVG9TaWduICs9XG4gICAgICAgICAgJyhyZXF1ZXN0LXRhcmdldCk6ICcgKyByZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpICsgJyAnICtcbiAgICAgICAgICByZXF1ZXN0LnBhdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdIZWFkZXJFcnJvcihoICsgJyB3YXMgbm90IGluIHRoZSByZXF1ZXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyaW5nVG9TaWduICs9IGggKyAnOiAnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaSArIDEpIDwgb3B0aW9ucy5oZWFkZXJzLmxlbmd0aClcbiAgICAgICAgc3RyaW5nVG9TaWduICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8qIFRoaXMgaXMganVzdCBmb3IgdW5pdCB0ZXN0cy4gKi9cbiAgICBpZiAocmVxdWVzdC5oYXNPd25Qcm9wZXJ0eSgnX3N0cmluZ1RvU2lnbicpKSB7XG4gICAgICByZXF1ZXN0Ll9zdHJpbmdUb1NpZ24gPSBzdHJpbmdUb1NpZ247XG4gICAgfVxuXG4gICAgdmFyIHNpZ25hdHVyZTtcbiAgICBpZiAoYWxnWzBdID09PSAnaG1hYycpIHtcbiAgICAgIGlmICh0eXBlb2YgKG9wdGlvbnMua2V5KSAhPT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLmtleSkpXG4gICAgICAgIHRocm93IChuZXcgVHlwZUVycm9yKCdvcHRpb25zLmtleSBtdXN0IGJlIGEgc3RyaW5nIG9yIEJ1ZmZlcicpKTtcblxuICAgICAgdmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYyhhbGdbMV0udG9VcHBlckNhc2UoKSwgb3B0aW9ucy5rZXkpO1xuICAgICAgaG1hYy51cGRhdGUoc3RyaW5nVG9TaWduKTtcbiAgICAgIHNpZ25hdHVyZSA9IGhtYWMuZGlnZXN0KCdiYXNlNjQnKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgICBpZiAodHlwZW9mIChrZXkpID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIoa2V5KSlcbiAgICAgICAga2V5ID0gc3NocGsucGFyc2VQcml2YXRlS2V5KG9wdGlvbnMua2V5KTtcblxuICAgICAgYXNzZXJ0Lm9rKHNzaHBrLlByaXZhdGVLZXkuaXNQcml2YXRlS2V5KGtleSwgWzEsIDJdKSxcbiAgICAgICAgJ29wdGlvbnMua2V5IG11c3QgYmUgYSBzc2hway5Qcml2YXRlS2V5Jyk7XG5cbiAgICAgIGlmICghUEtfQUxHT1Nba2V5LnR5cGVdKSB7XG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKGtleS50eXBlLnRvVXBwZXJDYXNlKCkgKyAnIHR5cGUgJyArXG4gICAgICAgICAgJ2tleXMgYXJlIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGdbMF0gIT09IHVuZGVmaW5lZCAmJiBrZXkudHlwZSAhPT0gYWxnWzBdKSB7XG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKCdvcHRpb25zLmtleSBtdXN0IGJlIGEgJyArXG4gICAgICAgICAgYWxnWzBdLnRvVXBwZXJDYXNlKCkgKyAnIGtleSwgd2FzIGdpdmVuIGEgJyArXG4gICAgICAgICAga2V5LnR5cGUudG9VcHBlckNhc2UoKSArICcga2V5IGluc3RlYWQnKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaWduZXIgPSBrZXkuY3JlYXRlU2lnbihhbGdbMV0pO1xuICAgICAgc2lnbmVyLnVwZGF0ZShzdHJpbmdUb1NpZ24pO1xuICAgICAgdmFyIHNpZ09iaiA9IHNpZ25lci5zaWduKCk7XG4gICAgICBpZiAoIUhBU0hfQUxHT1Nbc2lnT2JqLmhhc2hBbGdvcml0aG1dKSB7XG4gICAgICAgIHRocm93IChuZXcgSW52YWxpZEFsZ29yaXRobUVycm9yKHNpZ09iai5oYXNoQWxnb3JpdGhtLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICcgaXMgbm90IGEgc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtJykpO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5hbGdvcml0aG0gPSBrZXkudHlwZSArICctJyArIHNpZ09iai5oYXNoQWxnb3JpdGhtO1xuICAgICAgc2lnbmF0dXJlID0gc2lnT2JqLnRvU3RyaW5nKCk7XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoc2lnbmF0dXJlLCAnJywgJ2VtcHR5IHNpZ25hdHVyZSBwcm9kdWNlZCcpO1xuICAgIH1cblxuICAgIHZhciBhdXRoekhlYWRlck5hbWUgPSBvcHRpb25zLmF1dGhvcml6YXRpb25IZWFkZXJOYW1lIHx8ICdBdXRob3JpemF0aW9uJztcblxuICAgIHJlcXVlc3Quc2V0SGVhZGVyKGF1dGh6SGVhZGVyTmFtZSwgc3ByaW50ZihBVVRIWl9GTVQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMua2V5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMuam9pbignICcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUpKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQtcGx1cycpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xudmFyIHNzaHBrID0gcmVxdWlyZSgnc3NocGsnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIEhBU0hfQUxHT1MgPSB1dGlscy5IQVNIX0FMR09TO1xudmFyIFBLX0FMR09TID0gdXRpbHMuUEtfQUxHT1M7XG52YXIgSW52YWxpZEFsZ29yaXRobUVycm9yID0gdXRpbHMuSW52YWxpZEFsZ29yaXRobUVycm9yO1xudmFyIEh0dHBTaWduYXR1cmVFcnJvciA9IHV0aWxzLkh0dHBTaWduYXR1cmVFcnJvcjtcbnZhciB2YWxpZGF0ZUFsZ29yaXRobSA9IHV0aWxzLnZhbGlkYXRlQWxnb3JpdGhtO1xuXG4vLy8tLS0gRXhwb3J0ZWQgQVBJXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogVmVyaWZ5IFJTQS9EU0Egc2lnbmF0dXJlIGFnYWluc3QgcHVibGljIGtleS4gIFlvdSBhcmUgZXhwZWN0ZWQgdG8gcGFzcyBpblxuICAgKiBhbiBvYmplY3QgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBgcGFyc2UoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWRTaWduYXR1cmUgdGhlIG9iamVjdCB5b3UgZ290IGZyb20gYHBhcnNlYC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YmtleSBSU0EvRFNBIHByaXZhdGUga2V5IFBFTS5cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IGlmIHlvdSBwYXNzIGluIGJhZCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRBbGdvcml0aG1FcnJvcn1cbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZTogZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHBhcnNlZFNpZ25hdHVyZSwgcHVia2V5KSB7XG4gICAgYXNzZXJ0Lm9iamVjdChwYXJzZWRTaWduYXR1cmUsICdwYXJzZWRTaWduYXR1cmUnKTtcbiAgICBpZiAodHlwZW9mIChwdWJrZXkpID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIocHVia2V5KSlcbiAgICAgIHB1YmtleSA9IHNzaHBrLnBhcnNlS2V5KHB1YmtleSk7XG4gICAgYXNzZXJ0Lm9rKHNzaHBrLktleS5pc0tleShwdWJrZXksIFsxLCAxXSksICdwdWJrZXkgbXVzdCBiZSBhIHNzaHBrLktleScpO1xuXG4gICAgdmFyIGFsZyA9IHZhbGlkYXRlQWxnb3JpdGhtKHBhcnNlZFNpZ25hdHVyZS5hbGdvcml0aG0pO1xuICAgIGlmIChhbGdbMF0gPT09ICdobWFjJyB8fCBhbGdbMF0gIT09IHB1YmtleS50eXBlKVxuICAgICAgcmV0dXJuIChmYWxzZSk7XG5cbiAgICB2YXIgdiA9IHB1YmtleS5jcmVhdGVWZXJpZnkoYWxnWzFdKTtcbiAgICB2LnVwZGF0ZShwYXJzZWRTaWduYXR1cmUuc2lnbmluZ1N0cmluZyk7XG4gICAgcmV0dXJuICh2LnZlcmlmeShwYXJzZWRTaWduYXR1cmUucGFyYW1zLnNpZ25hdHVyZSwgJ2Jhc2U2NCcpKTtcbiAgfSxcblxuICAvKipcbiAgICogVmVyaWZ5IEhNQUMgYWdhaW5zdCBzaGFyZWQgc2VjcmV0LiAgWW91IGFyZSBleHBlY3RlZCB0byBwYXNzIGluIGFuIG9iamVjdFxuICAgKiB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIGBwYXJzZSgpYC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcnNlZFNpZ25hdHVyZSB0aGUgb2JqZWN0IHlvdSBnb3QgZnJvbSBgcGFyc2VgLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc2VjcmV0IEhNQUMgc2hhcmVkIHNlY3JldC5cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IGlmIHlvdSBwYXNzIGluIGJhZCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRBbGdvcml0aG1FcnJvcn1cbiAgICovXG4gIHZlcmlmeUhNQUM6IGZ1bmN0aW9uIHZlcmlmeUhNQUMocGFyc2VkU2lnbmF0dXJlLCBzZWNyZXQpIHtcbiAgICBhc3NlcnQub2JqZWN0KHBhcnNlZFNpZ25hdHVyZSwgJ3BhcnNlZEhNQUMnKTtcbiAgICBhc3NlcnQuc3RyaW5nKHNlY3JldCwgJ3NlY3JldCcpO1xuXG4gICAgdmFyIGFsZyA9IHZhbGlkYXRlQWxnb3JpdGhtKHBhcnNlZFNpZ25hdHVyZS5hbGdvcml0aG0pO1xuICAgIGlmIChhbGdbMF0gIT09ICdobWFjJylcbiAgICAgIHJldHVybiAoZmFsc2UpO1xuXG4gICAgdmFyIGhhc2hBbGcgPSBhbGdbMV0udG9VcHBlckNhc2UoKTtcblxuICAgIHZhciBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoaGFzaEFsZywgc2VjcmV0KTtcbiAgICBobWFjLnVwZGF0ZShwYXJzZWRTaWduYXR1cmUuc2lnbmluZ1N0cmluZyk7XG5cbiAgICAvKlxuICAgICAqIE5vdyBkb3VibGUtaGFzaCB0byBhdm9pZCBsZWFraW5nIHRpbWluZyBpbmZvcm1hdGlvbiAtIHRoZXJlJ3NcbiAgICAgKiBubyBlYXN5IGNvbnN0YW50LXRpbWUgY29tcGFyZSBpbiBKUywgc28gd2UgdXNlIHRoaXMgYXBwcm9hY2hcbiAgICAgKiBpbnN0ZWFkLiBTZWUgZm9yIG1vcmUgaW5mbzpcbiAgICAgKiBodHRwczovL3d3dy5pc2VjcGFydG5lcnMuY29tL2Jsb2cvMjAxMS9mZWJydWFyeS9kb3VibGUtaG1hYy1cbiAgICAgKiB2ZXJpZmljYXRpb24uYXNweFxuICAgICAqL1xuICAgIHZhciBoMSA9IGNyeXB0by5jcmVhdGVIbWFjKGhhc2hBbGcsIHNlY3JldCk7XG4gICAgaDEudXBkYXRlKGhtYWMuZGlnZXN0KCkpO1xuICAgIGgxID0gaDEuZGlnZXN0KCk7XG4gICAgdmFyIGgyID0gY3J5cHRvLmNyZWF0ZUhtYWMoaGFzaEFsZywgc2VjcmV0KTtcbiAgICBoMi51cGRhdGUobmV3IEJ1ZmZlcihwYXJzZWRTaWduYXR1cmUucGFyYW1zLnNpZ25hdHVyZSwgJ2Jhc2U2NCcpKTtcbiAgICBoMiA9IGgyLmRpZ2VzdCgpO1xuXG4gICAgLyogTm9kZSAwLjggcmV0dXJucyBzdHJpbmdzIGZyb20gLmRpZ2VzdCgpLiAqL1xuICAgIGlmICh0eXBlb2YgKGgxKSA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gKGgxID09PSBoMik7XG4gICAgLyogQW5kIG5vZGUgMC4xMCBsYWNrcyB0aGUgLmVxdWFscygpIG1ldGhvZCBvbiBCdWZmZXJzLiAqL1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoaDEpICYmICFoMS5lcXVhbHMpXG4gICAgICByZXR1cm4gKGgxLnRvU3RyaW5nKCdiaW5hcnknKSA9PT0gaDIudG9TdHJpbmcoJ2JpbmFyeScpKTtcblxuICAgIHJldHVybiAoaDEuZXF1YWxzKGgyKSk7XG4gIH1cbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMTUgSm95ZW50LCBJbmMuXG5cbnZhciBwYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xudmFyIHNpZ25lciA9IHJlcXVpcmUoJy4vc2lnbmVyJyk7XG52YXIgdmVyaWZ5ID0gcmVxdWlyZSgnLi92ZXJpZnknKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuXG5cbi8vLy0tLSBBUElcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgcGFyc2U6IHBhcnNlci5wYXJzZVJlcXVlc3QsXG4gIHBhcnNlUmVxdWVzdDogcGFyc2VyLnBhcnNlUmVxdWVzdCxcblxuICBzaWduOiBzaWduZXIuc2lnblJlcXVlc3QsXG4gIHNpZ25SZXF1ZXN0OiBzaWduZXIuc2lnblJlcXVlc3QsXG4gIGNyZWF0ZVNpZ25lcjogc2lnbmVyLmNyZWF0ZVNpZ25lcixcbiAgaXNTaWduZXI6IHNpZ25lci5pc1NpZ25lcixcblxuICBzc2hLZXlUb1BFTTogdXRpbHMuc3NoS2V5VG9QRU0sXG4gIHNzaEtleUZpbmdlcnByaW50OiB1dGlscy5maW5nZXJwcmludCxcbiAgcGVtVG9Sc2FTU0hLZXk6IHV0aWxzLnBlbVRvUnNhU1NIS2V5LFxuXG4gIHZlcmlmeTogdmVyaWZ5LnZlcmlmeVNpZ25hdHVyZSxcbiAgdmVyaWZ5U2lnbmF0dXJlOiB2ZXJpZnkudmVyaWZ5U2lnbmF0dXJlLFxuICB2ZXJpZnlITUFDOiB2ZXJpZnkudmVyaWZ5SE1BQ1xufTtcbiIsICIvKiFcbiAqIG1pbWUtZGJcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGIuanNvbicpXG4iLCAiLyohXG4gKiBtaW1lLXR5cGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGIgPSByZXF1aXJlKCdtaW1lLWRiJylcbnZhciBleHRuYW1lID0gcmVxdWlyZSgncGF0aCcpLmV4dG5hbWVcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUUkFDVF9UWVBFX1JFR0VYUCA9IC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS9cbnZhciBURVhUX1RZUEVfUkVHRVhQID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0ICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiBURVhUX1RZUEVfUkVHRVhQLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bGwgQ29udGVudC1UeXBlIGhlYWRlciBnaXZlbiBhIE1JTUUgdHlwZSBvciBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29udGVudFR5cGUgKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbiAodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgbWVkaWEtdHlwZXJcbiAgdmFyIG1hdGNoID0gRVhUUkFDVF9UWVBFX1JFR0VYUC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAocGF0aCkge1xuICBpZiAoIXBhdGggfHwgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBnZXQgdGhlIGV4dGVuc2lvbiAoXCJleHRcIiBvciBcIi5leHRcIiBvciBmdWxsIHBhdGgpXG4gIHZhciBleHRlbnNpb24gPSBleHRuYW1lKCd4LicgKyBwYXRoKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnN1YnN0cigxKVxuXG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy50eXBlc1tleHRlbnNpb25dIHx8IGZhbHNlXG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMgYW5kIHR5cGVzIG1hcHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlTWFwcyAoZXh0ZW5zaW9ucywgdHlwZXMpIHtcbiAgLy8gc291cmNlIHByZWZlcmVuY2UgKGxlYXN0IC0+IG1vc3QpXG4gIHZhciBwcmVmZXJlbmNlID0gWyduZ2lueCcsICdhcGFjaGUnLCB1bmRlZmluZWQsICdpYW5hJ11cblxuICBPYmplY3Qua2V5cyhkYikuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoTWltZVR5cGUgKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nICYmXG4gICAgICAgICAgKGZyb20gPiB0byB8fCAoZnJvbSA9PT0gdG8gJiYgdHlwZXNbZXh0ZW5zaW9uXS5zdWJzdHIoMCwgMTIpID09PSAnYXBwbGljYXRpb24vJykpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgcmVtYXBwaW5nXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgICB0eXBlc1tleHRlbnNpb25dID0gdHlwZVxuICAgIH1cbiAgfSlcbn1cbiIsICJmdW5jdGlvbiBDYXNlbGVzcyAoZGljdCkge1xuICB0aGlzLmRpY3QgPSBkaWN0IHx8IHt9XG59XG5DYXNlbGVzcy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBjbG9iYmVyKSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBpIGluIG5hbWUpIHtcbiAgICAgIHRoaXMuc2V0KGksIG5hbWVbaV0sIHZhbHVlKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGNsb2JiZXIgPT09ICd1bmRlZmluZWQnKSBjbG9iYmVyID0gdHJ1ZVxuICAgIHZhciBoYXMgPSB0aGlzLmhhcyhuYW1lKVxuXG4gICAgaWYgKCFjbG9iYmVyICYmIGhhcykgdGhpcy5kaWN0W2hhc10gPSB0aGlzLmRpY3RbaGFzXSArICcsJyArIHZhbHVlXG4gICAgZWxzZSB0aGlzLmRpY3RbaGFzIHx8IG5hbWVdID0gdmFsdWVcbiAgICByZXR1cm4gaGFzXG4gIH1cbn1cbkNhc2VsZXNzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZGljdClcbiAgICAsIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICA7XG4gIGZvciAodmFyIGk9MDtpPGtleXMubGVuZ3RoO2krKykge1xuICAgIGlmIChrZXlzW2ldLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpIHJldHVybiBrZXlzW2ldXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5DYXNlbGVzcy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuICB2YXIgcmVzdWx0LCBfa2V5XG4gIHZhciBoZWFkZXJzID0gdGhpcy5kaWN0XG4gIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIF9rZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgIGlmIChuYW1lID09PSBfa2V5KSByZXN1bHQgPSBoZWFkZXJzW2tleV1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuQ2FzZWxlc3MucHJvdG90eXBlLnN3YXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgaGFzID0gdGhpcy5oYXMobmFtZSlcbiAgaWYgKGhhcyA9PT0gbmFtZSkgcmV0dXJuXG4gIGlmICghaGFzKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIGhlYWRlciB0aGFuIG1hdGNoZXMgXCInK25hbWUrJ1wiJylcbiAgdGhpcy5kaWN0W25hbWVdID0gdGhpcy5kaWN0W2hhc11cbiAgZGVsZXRlIHRoaXMuZGljdFtoYXNdXG59XG5DYXNlbGVzcy5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIGhhcyA9IHRoaXMuaGFzKG5hbWUpXG4gIHJldHVybiBkZWxldGUgdGhpcy5kaWN0W2hhcyB8fCBuYW1lXVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkaWN0KSB7cmV0dXJuIG5ldyBDYXNlbGVzcyhkaWN0KX1cbm1vZHVsZS5leHBvcnRzLmh0dHBpZnkgPSBmdW5jdGlvbiAocmVzcCwgaGVhZGVycykge1xuICB2YXIgYyA9IG5ldyBDYXNlbGVzcyhoZWFkZXJzKVxuICByZXNwLnNldEhlYWRlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBjbG9iYmVyKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVyblxuICAgIHJldHVybiBjLnNldChrZXksIHZhbHVlLCBjbG9iYmVyKVxuICB9XG4gIHJlc3AuaGFzSGVhZGVyID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBjLmhhcyhrZXkpXG4gIH1cbiAgcmVzcC5nZXRIZWFkZXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGMuZ2V0KGtleSlcbiAgfVxuICByZXNwLnJlbW92ZUhlYWRlciA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gYy5kZWwoa2V5KVxuICB9XG4gIHJlc3AuaGVhZGVycyA9IGMuZGljdFxuICByZXR1cm4gY1xufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gRm9yZXZlckFnZW50XG5Gb3JldmVyQWdlbnQuU1NMID0gRm9yZXZlckFnZW50U1NMXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG4gICwgQWdlbnQgPSByZXF1aXJlKCdodHRwJykuQWdlbnRcbiAgLCBuZXQgPSByZXF1aXJlKCduZXQnKVxuICAsIHRscyA9IHJlcXVpcmUoJ3RscycpXG4gICwgQWdlbnRTU0wgPSByZXF1aXJlKCdodHRwcycpLkFnZW50XG4gIFxuZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbk5hbWUoaG9zdCwgcG9ydCkgeyAgXG4gIHZhciBuYW1lID0gJydcbiAgaWYgKHR5cGVvZiBob3N0ID09PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBob3N0ICsgJzonICsgcG9ydFxuICB9IGVsc2Uge1xuICAgIC8vIEZvciBub2RlLmpzIHYwMTIuMCBhbmQgaW9qcy12MS41LjEsIGhvc3QgaXMgYW4gb2JqZWN0LiBBbmQgYW55IGV4aXN0aW5nIGxvY2FsQWRkcmVzcyBpcyBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIG5hbWUuXG4gICAgbmFtZSA9IGhvc3QuaG9zdCArICc6JyArIGhvc3QucG9ydCArICc6JyArIChob3N0LmxvY2FsQWRkcmVzcyA/IChob3N0LmxvY2FsQWRkcmVzcyArICc6JykgOiAnOicpXG4gIH1cbiAgcmV0dXJuIG5hbWVcbn0gICAgXG5cbmZ1bmN0aW9uIEZvcmV2ZXJBZ2VudChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHNlbGYucmVxdWVzdHMgPSB7fVxuICBzZWxmLnNvY2tldHMgPSB7fVxuICBzZWxmLmZyZWVTb2NrZXRzID0ge31cbiAgc2VsZi5tYXhTb2NrZXRzID0gc2VsZi5vcHRpb25zLm1heFNvY2tldHMgfHwgQWdlbnQuZGVmYXVsdE1heFNvY2tldHNcbiAgc2VsZi5taW5Tb2NrZXRzID0gc2VsZi5vcHRpb25zLm1pblNvY2tldHMgfHwgRm9yZXZlckFnZW50LmRlZmF1bHRNaW5Tb2NrZXRzXG4gIHNlbGYub24oJ2ZyZWUnLCBmdW5jdGlvbihzb2NrZXQsIGhvc3QsIHBvcnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbm5lY3Rpb25OYW1lKGhvc3QsIHBvcnQpXG5cbiAgICBpZiAoc2VsZi5yZXF1ZXN0c1tuYW1lXSAmJiBzZWxmLnJlcXVlc3RzW25hbWVdLmxlbmd0aCkge1xuICAgICAgc2VsZi5yZXF1ZXN0c1tuYW1lXS5zaGlmdCgpLm9uU29ja2V0KHNvY2tldClcbiAgICB9IGVsc2UgaWYgKHNlbGYuc29ja2V0c1tuYW1lXS5sZW5ndGggPCBzZWxmLm1pblNvY2tldHMpIHtcbiAgICAgIGlmICghc2VsZi5mcmVlU29ja2V0c1tuYW1lXSkgc2VsZi5mcmVlU29ja2V0c1tuYW1lXSA9IFtdXG4gICAgICBzZWxmLmZyZWVTb2NrZXRzW25hbWVdLnB1c2goc29ja2V0KVxuICAgICAgXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdlIGRvbid0IHVzZSB0aGUgc29ja2V0IGFueXdheSwgbWVoLCB0aHJvdyB0aGUgc29ja2V0IGF3YXlcbiAgICAgIHZhciBvbklkbGVFcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzb2NrZXQuZGVzdHJveSgpXG4gICAgICB9XG4gICAgICBzb2NrZXQuX29uSWRsZUVycm9yID0gb25JZGxlRXJyb3JcbiAgICAgIHNvY2tldC5vbignZXJyb3InLCBvbklkbGVFcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVxdWVzdHMganVzdCBkZXN0cm95IHRoZVxuICAgICAgLy8gc29ja2V0IGFuZCBpdCB3aWxsIGdldCByZW1vdmVkIGZyb20gdGhlIHBvb2wuIFRoaXNcbiAgICAgIC8vIGdldHMgdXMgb3V0IG9mIHRpbWVvdXQgaXNzdWVzIGFuZCBhbGxvd3MgdXMgdG9cbiAgICAgIC8vIGRlZmF1bHQgdG8gQ29ubmVjdGlvbjprZWVwLWFsaXZlLlxuICAgICAgc29ja2V0LmRlc3Ryb3koKVxuICAgIH1cbiAgfSlcblxufVxudXRpbC5pbmhlcml0cyhGb3JldmVyQWdlbnQsIEFnZW50KVxuXG5Gb3JldmVyQWdlbnQuZGVmYXVsdE1pblNvY2tldHMgPSA1XG5cblxuRm9yZXZlckFnZW50LnByb3RvdHlwZS5jcmVhdGVDb25uZWN0aW9uID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb25cbkZvcmV2ZXJBZ2VudC5wcm90b3R5cGUuYWRkUmVxdWVzdE5vcmV1c2UgPSBBZ2VudC5wcm90b3R5cGUuYWRkUmVxdWVzdFxuRm9yZXZlckFnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24ocmVxLCBob3N0LCBwb3J0KSB7XG4gIHZhciBuYW1lID0gZ2V0Q29ubmVjdGlvbk5hbWUoaG9zdCwgcG9ydClcbiAgXG4gIGlmICh0eXBlb2YgaG9zdCAhPT0gJ3N0cmluZycpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGhvc3RcbiAgICBwb3J0ID0gb3B0aW9ucy5wb3J0XG4gICAgaG9zdCA9IG9wdGlvbnMuaG9zdFxuICB9XG5cbiAgaWYgKHRoaXMuZnJlZVNvY2tldHNbbmFtZV0gJiYgdGhpcy5mcmVlU29ja2V0c1tuYW1lXS5sZW5ndGggPiAwICYmICFyZXEudXNlQ2h1bmtlZEVuY29kaW5nQnlEZWZhdWx0KSB7XG4gICAgdmFyIGlkbGVTb2NrZXQgPSB0aGlzLmZyZWVTb2NrZXRzW25hbWVdLnBvcCgpXG4gICAgaWRsZVNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBpZGxlU29ja2V0Ll9vbklkbGVFcnJvcilcbiAgICBkZWxldGUgaWRsZVNvY2tldC5fb25JZGxlRXJyb3JcbiAgICByZXEuX3JldXNlZFNvY2tldCA9IHRydWVcbiAgICByZXEub25Tb2NrZXQoaWRsZVNvY2tldClcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFkZFJlcXVlc3ROb3JldXNlKHJlcSwgaG9zdCwgcG9ydClcbiAgfVxufVxuXG5Gb3JldmVyQWdlbnQucHJvdG90eXBlLnJlbW92ZVNvY2tldCA9IGZ1bmN0aW9uKHMsIG5hbWUsIGhvc3QsIHBvcnQpIHtcbiAgaWYgKHRoaXMuc29ja2V0c1tuYW1lXSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuc29ja2V0c1tuYW1lXS5pbmRleE9mKHMpXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5zb2NrZXRzW25hbWVdLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodGhpcy5zb2NrZXRzW25hbWVdICYmIHRoaXMuc29ja2V0c1tuYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBkb24ndCBsZWFrXG4gICAgZGVsZXRlIHRoaXMuc29ja2V0c1tuYW1lXVxuICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RzW25hbWVdXG4gIH1cbiAgXG4gIGlmICh0aGlzLmZyZWVTb2NrZXRzW25hbWVdKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5mcmVlU29ja2V0c1tuYW1lXS5pbmRleE9mKHMpXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5mcmVlU29ja2V0c1tuYW1lXS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICBpZiAodGhpcy5mcmVlU29ja2V0c1tuYW1lXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZnJlZVNvY2tldHNbbmFtZV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5yZXF1ZXN0c1tuYW1lXSAmJiB0aGlzLnJlcXVlc3RzW25hbWVdLmxlbmd0aCkge1xuICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyByZXF1ZXN0cyBhbmQgYSBzb2NrZXQgZ2V0cyBjbG9zZWQgYSBuZXcgb25lXG4gICAgLy8gbmVlZHMgdG8gYmUgY3JlYXRlZCB0byB0YWtlIG92ZXIgaW4gdGhlIHBvb2wgZm9yIHRoZSBvbmUgdGhhdCBjbG9zZWQuXG4gICAgdGhpcy5jcmVhdGVTb2NrZXQobmFtZSwgaG9zdCwgcG9ydCkuZW1pdCgnZnJlZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gRm9yZXZlckFnZW50U1NMIChvcHRpb25zKSB7XG4gIEZvcmV2ZXJBZ2VudC5jYWxsKHRoaXMsIG9wdGlvbnMpXG59XG51dGlsLmluaGVyaXRzKEZvcmV2ZXJBZ2VudFNTTCwgRm9yZXZlckFnZW50KVxuXG5Gb3JldmVyQWdlbnRTU0wucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uU1NMXG5Gb3JldmVyQWdlbnRTU0wucHJvdG90eXBlLmFkZFJlcXVlc3ROb3JldXNlID0gQWdlbnRTU0wucHJvdG90eXBlLmFkZFJlcXVlc3RcblxuZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvblNTTCAocG9ydCwgaG9zdCwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHBvcnQgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHBvcnQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IGhvc3Q7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwb3J0ID09PSAnbnVtYmVyJykge1xuICAgIG9wdGlvbnMucG9ydCA9IHBvcnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5ob3N0ID0gaG9zdDtcbiAgfVxuXG4gIHJldHVybiB0bHMuY29ubmVjdChvcHRpb25zKTtcbn1cbiIsICIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgPyBzZWxmLkZvcm1EYXRhIDogd2luZG93LkZvcm1EYXRhO1xuIiwgInZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG5cbmZ1bmN0aW9uIGlzU3RyZWFtIChvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHN0cmVhbS5TdHJlYW1cbn1cblxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlIChvYmopIHtcbiAgcmV0dXJuIGlzU3RyZWFtKG9iaikgJiYgdHlwZW9mIG9iai5fcmVhZCA9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouX3JlYWRhYmxlU3RhdGUgPT0gJ29iamVjdCdcbn1cblxuXG5mdW5jdGlvbiBpc1dyaXRhYmxlIChvYmopIHtcbiAgcmV0dXJuIGlzU3RyZWFtKG9iaikgJiYgdHlwZW9mIG9iai5fd3JpdGUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLl93cml0YWJsZVN0YXRlID09ICdvYmplY3QnXG59XG5cblxuZnVuY3Rpb24gaXNEdXBsZXggKG9iaikge1xuICByZXR1cm4gaXNSZWFkYWJsZShvYmopICYmIGlzV3JpdGFibGUob2JqKVxufVxuXG5cbm1vZHVsZS5leHBvcnRzICAgICAgICAgICAgPSBpc1N0cmVhbVxubW9kdWxlLmV4cG9ydHMuaXNSZWFkYWJsZSA9IGlzUmVhZGFibGVcbm1vZHVsZS5leHBvcnRzLmlzV3JpdGFibGUgPSBpc1dyaXRhYmxlXG5tb2R1bGUuZXhwb3J0cy5pc0R1cGxleCAgID0gaXNEdXBsZXhcbiIsICJtb2R1bGUuZXhwb3J0cyAgICAgID0gaXNUeXBlZEFycmF5XG5pc1R5cGVkQXJyYXkuc3RyaWN0ID0gaXNTdHJpY3RUeXBlZEFycmF5XG5pc1R5cGVkQXJyYXkubG9vc2UgID0gaXNMb29zZVR5cGVkQXJyYXlcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xudmFyIG5hbWVzID0ge1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgSW50MTZBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgSW50MzJBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgVWludDhBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJzogdHJ1ZVxuICAsICdbb2JqZWN0IFVpbnQxNkFycmF5XSc6IHRydWVcbiAgLCAnW29iamVjdCBVaW50MzJBcnJheV0nOiB0cnVlXG4gICwgJ1tvYmplY3QgRmxvYXQzMkFycmF5XSc6IHRydWVcbiAgLCAnW29iamVjdCBGbG9hdDY0QXJyYXldJzogdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkoYXJyKSB7XG4gIHJldHVybiAoXG4gICAgICAgaXNTdHJpY3RUeXBlZEFycmF5KGFycilcbiAgICB8fCBpc0xvb3NlVHlwZWRBcnJheShhcnIpXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdHJpY3RUeXBlZEFycmF5KGFycikge1xuICByZXR1cm4gKFxuICAgICAgIGFyciBpbnN0YW5jZW9mIEludDhBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIEludDE2QXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBJbnQzMkFycmF5XG4gICAgfHwgYXJyIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5XG4gICAgfHwgYXJyIGluc3RhbmNlb2YgVWludDE2QXJyYXlcbiAgICB8fCBhcnIgaW5zdGFuY2VvZiBVaW50MzJBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheVxuICAgIHx8IGFyciBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheVxuICApXG59XG5cbmZ1bmN0aW9uIGlzTG9vc2VUeXBlZEFycmF5KGFycikge1xuICByZXR1cm4gbmFtZXNbdG9TdHJpbmcuY2FsbChhcnIpXVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBmb3JtYXRIb3N0bmFtZSAoaG9zdG5hbWUpIHtcbiAgLy8gY2Fub25pY2FsaXplIHRoZSBob3N0bmFtZSwgc28gdGhhdCAnb29nbGUuY29tJyB3b24ndCBtYXRjaCAnZ29vZ2xlLmNvbSdcbiAgcmV0dXJuIGhvc3RuYW1lLnJlcGxhY2UoL15cXC4qLywgJy4nKS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9Qcm94eVpvbmUgKHpvbmUpIHtcbiAgem9uZSA9IHpvbmUudHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICB2YXIgem9uZVBhcnRzID0gem9uZS5zcGxpdCgnOicsIDIpXG4gIHZhciB6b25lSG9zdCA9IGZvcm1hdEhvc3RuYW1lKHpvbmVQYXJ0c1swXSlcbiAgdmFyIHpvbmVQb3J0ID0gem9uZVBhcnRzWzFdXG4gIHZhciBoYXNQb3J0ID0gem9uZS5pbmRleE9mKCc6JykgPiAtMVxuXG4gIHJldHVybiB7aG9zdG5hbWU6IHpvbmVIb3N0LCBwb3J0OiB6b25lUG9ydCwgaGFzUG9ydDogaGFzUG9ydH1cbn1cblxuZnVuY3Rpb24gdXJpSW5Ob1Byb3h5ICh1cmksIG5vUHJveHkpIHtcbiAgdmFyIHBvcnQgPSB1cmkucG9ydCB8fCAodXJpLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICc0NDMnIDogJzgwJylcbiAgdmFyIGhvc3RuYW1lID0gZm9ybWF0SG9zdG5hbWUodXJpLmhvc3RuYW1lKVxuICB2YXIgbm9Qcm94eUxpc3QgPSBub1Byb3h5LnNwbGl0KCcsJylcblxuICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIG5vUHJveHlMaXN0IHVudGlsIGl0IGZpbmRzIGEgbWF0Y2guXG4gIHJldHVybiBub1Byb3h5TGlzdC5tYXAocGFyc2VOb1Byb3h5Wm9uZSkuc29tZShmdW5jdGlvbiAobm9Qcm94eVpvbmUpIHtcbiAgICB2YXIgaXNNYXRjaGVkQXQgPSBob3N0bmFtZS5pbmRleE9mKG5vUHJveHlab25lLmhvc3RuYW1lKVxuICAgIHZhciBob3N0bmFtZU1hdGNoZWQgPSAoXG4gICAgICBpc01hdGNoZWRBdCA+IC0xICYmXG4gICAgICAgIChpc01hdGNoZWRBdCA9PT0gaG9zdG5hbWUubGVuZ3RoIC0gbm9Qcm94eVpvbmUuaG9zdG5hbWUubGVuZ3RoKVxuICAgIClcblxuICAgIGlmIChub1Byb3h5Wm9uZS5oYXNQb3J0KSB7XG4gICAgICByZXR1cm4gKHBvcnQgPT09IG5vUHJveHlab25lLnBvcnQpICYmIGhvc3RuYW1lTWF0Y2hlZFxuICAgIH1cblxuICAgIHJldHVybiBob3N0bmFtZU1hdGNoZWRcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0UHJveHlGcm9tVVJJICh1cmkpIHtcbiAgLy8gRGVjaWRlIHRoZSBwcm9wZXIgcmVxdWVzdCBwcm94eSB0byB1c2UgYmFzZWQgb24gdGhlIHJlcXVlc3QgVVJJIG9iamVjdCBhbmQgdGhlXG4gIC8vIGVudmlyb25tZW50YWwgdmFyaWFibGVzIChOT19QUk9YWSwgSFRUUF9QUk9YWSwgZXRjLilcbiAgLy8gcmVzcGVjdCBOT19QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKHNlZTogaHR0cHM6Ly9seW54LmludmlzaWJsZS1pc2xhbmQubmV0L2x5bngyLjguNy9icmVha291dC9seW54X2hlbHAva2V5c3Ryb2tlcy9lbnZpcm9ubWVudHMuaHRtbClcblxuICB2YXIgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZIHx8IHByb2Nlc3MuZW52Lm5vX3Byb3h5IHx8ICcnXG5cbiAgLy8gaWYgdGhlIG5vUHJveHkgaXMgYSB3aWxkY2FyZCB0aGVuIHJldHVybiBudWxsXG5cbiAgaWYgKG5vUHJveHkgPT09ICcqJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBpZiB0aGUgbm9Qcm94eSBpcyBub3QgZW1wdHkgYW5kIHRoZSB1cmkgaXMgZm91bmQgcmV0dXJuIG51bGxcblxuICBpZiAobm9Qcm94eSAhPT0gJycgJiYgdXJpSW5Ob1Byb3h5KHVyaSwgbm9Qcm94eSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgb3IgSFRUUFMgUHJveHkgaW4gZW52aXJvbm1lbnQgRWxzZSBkZWZhdWx0IHRvIG51bGxcblxuICBpZiAodXJpLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lmh0dHBfcHJveHkgfHwgbnVsbFxuICB9XG5cbiAgaWYgKHVyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lmh0dHBzX3Byb3h5IHx8XG4gICAgICBwcm9jZXNzLmVudi5IVFRQX1BST1hZIHx8XG4gICAgICBwcm9jZXNzLmVudi5odHRwX3Byb3h5IHx8IG51bGxcbiAgfVxuXG4gIC8vIGlmIG5vbmUgb2YgdGhhdCB3b3JrcywgcmV0dXJuIG51bGxcbiAgLy8gKFdoYXQgdXJpIHByb3RvY29sIGFyZSB5b3UgdXNpbmcgdGhlbj8pXG5cbiAgcmV0dXJuIG51bGxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm94eUZyb21VUklcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgdmFyIG9iajtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmICFBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbn07XG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHN0ciA6IFN0cmluZyhzdHIpO1xuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgIHx8IGMgPT09IDB4NUYgLy8gX1xuICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICB8fCAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgLy8gYS16XG4gICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICkge1xuICAgICAgICAgICAgb3V0ICs9IHN0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgaGV4VGFibGVbY107XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIChoZXhUYWJsZVsweEMwIHwgKGMgPj4gNildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+PSAweEUwMDApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIChoZXhUYWJsZVsweEUwIHwgKGMgPj4gMTIpXSArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpICs9IDE7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweDNGRikpO1xuICAgICAgICAvKiBlc2xpbnQgb3BlcmF0b3ItbGluZWJyZWFrOiBbMiwgXCJiZWZvcmVcIl0gKi9cbiAgICAgICAgb3V0ICs9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFjdFF1ZXVlKHF1ZXVlKTtcbn07XG5cbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG52YXIgaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtZXJnZTogbWVyZ2Vcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkZWZhdWx0JzogJ1JGQzM5ODYnLFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJGQzE3Mzg6ICdSRkMxNzM4JyxcbiAgICBSRkMzOTg2OiAnUkZDMzk4Nidcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seVxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSBmaWx0ZXIocHJlZml4LCBvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmogPSBzZXJpYWxpemVEYXRlKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlcikpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgocHJlZml4LCBrZXkpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBrZXkgOiAnWycgKyBrZXkgKyAnXScpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gb3B0cyA/IHV0aWxzLmFzc2lnbih7fSwgb3B0cykgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBkZWxpbWl0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0aW9ucy5kZWxpbWl0ZXI7XG4gICAgdmFyIHN0cmljdE51bGxIYW5kbGluZyA9IHR5cGVvZiBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmc7XG4gICAgdmFyIHNraXBOdWxscyA9IHR5cGVvZiBvcHRpb25zLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHM7XG4gICAgdmFyIGVuY29kZSA9IHR5cGVvZiBvcHRpb25zLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGU7XG4gICAgdmFyIGVuY29kZXIgPSB0eXBlb2Ygb3B0aW9ucy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcjtcbiAgICB2YXIgc29ydCA9IHR5cGVvZiBvcHRpb25zLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNvcnQgOiBudWxsO1xuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiBvcHRpb25zLmFsbG93RG90cztcbiAgICB2YXIgc2VyaWFsaXplRGF0ZSA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlO1xuICAgIHZhciBlbmNvZGVWYWx1ZXNPbmx5ID0gdHlwZW9mIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zLmZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICB9IGVsc2UgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRpb25zLmZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW29wdGlvbnMuZm9ybWF0XTtcbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0aW9ucy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9ICdpbmRpY2VzJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1thcnJheUZvcm1hdF07XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KHNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoVG9BcnJheShrZXlzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGUgPyBlbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKGRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIHBhcnNlVmFsdWVzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyKTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZShwb3MgKyAxKSwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhcy5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBbXS5jb25jYXQob2JqW2tleV0pLmNvbmNhdCh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIHBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKGNoYWluLCB2YWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgbGVhZiA9IHZhbDtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgY2xlYW5Sb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGVhblJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXNcbiAgICAgICAgLy8gdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlICgoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG9wdHMgPyB1dGlscy5hc3NpZ24oe30sIG9wdHMpIDoge307XG5cbiAgICBpZiAob3B0aW9ucy5kZWNvZGVyICE9PSBudWxsICYmIG9wdGlvbnMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZTtcbiAgICBvcHRpb25zLmRlbGltaXRlciA9IHR5cGVvZiBvcHRpb25zLmRlbGltaXRlciA9PT0gJ3N0cmluZycgfHwgdXRpbHMuaXNSZWdFeHAob3B0aW9ucy5kZWxpbWl0ZXIpID8gb3B0aW9ucy5kZWxpbWl0ZXIgOiBkZWZhdWx0cy5kZWxpbWl0ZXI7XG4gICAgb3B0aW9ucy5kZXB0aCA9IHR5cGVvZiBvcHRpb25zLmRlcHRoID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aDtcbiAgICBvcHRpb25zLmFycmF5TGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQ7XG4gICAgb3B0aW9ucy5wYXJzZUFycmF5cyA9IG9wdGlvbnMucGFyc2VBcnJheXMgIT09IGZhbHNlO1xuICAgIG9wdGlvbnMuZGVjb2RlciA9IHR5cGVvZiBvcHRpb25zLmRlY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmRlY29kZXIgOiBkZWZhdWx0cy5kZWNvZGVyO1xuICAgIG9wdGlvbnMuYWxsb3dEb3RzID0gdHlwZW9mIG9wdGlvbnMuYWxsb3dEb3RzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmFsbG93RG90cyA6IGRlZmF1bHRzLmFsbG93RG90cztcbiAgICBvcHRpb25zLnBsYWluT2JqZWN0cyA9IHR5cGVvZiBvcHRpb25zLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHM7XG4gICAgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzO1xuICAgIG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnBhcmFtZXRlckxpbWl0IDogZGVmYXVsdHMucGFyYW1ldGVyTGltaXQ7XG4gICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPSB0eXBlb2Ygb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucyk7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBxcyA9IHJlcXVpcmUoJ3FzJylcbnZhciBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJylcblxuZnVuY3Rpb24gUXVlcnlzdHJpbmcgKHJlcXVlc3QpIHtcbiAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICB0aGlzLmxpYiA9IG51bGxcbiAgdGhpcy51c2VRdWVyeXN0cmluZyA9IG51bGxcbiAgdGhpcy5wYXJzZU9wdGlvbnMgPSBudWxsXG4gIHRoaXMuc3RyaW5naWZ5T3B0aW9ucyA9IG51bGxcbn1cblxuUXVlcnlzdHJpbmcucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAodGhpcy5saWIpIHsgcmV0dXJuIH1cblxuICB0aGlzLnVzZVF1ZXJ5c3RyaW5nID0gb3B0aW9ucy51c2VRdWVyeXN0cmluZ1xuICB0aGlzLmxpYiA9ICh0aGlzLnVzZVF1ZXJ5c3RyaW5nID8gcXVlcnlzdHJpbmcgOiBxcylcblxuICB0aGlzLnBhcnNlT3B0aW9ucyA9IG9wdGlvbnMucXNQYXJzZU9wdGlvbnMgfHwge31cbiAgdGhpcy5zdHJpbmdpZnlPcHRpb25zID0gb3B0aW9ucy5xc1N0cmluZ2lmeU9wdGlvbnMgfHwge31cbn1cblxuUXVlcnlzdHJpbmcucHJvdG90eXBlLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuICh0aGlzLnVzZVF1ZXJ5c3RyaW5nKVxuICAgID8gdGhpcy5yZmMzOTg2KHRoaXMubGliLnN0cmluZ2lmeShvYmosXG4gICAgICB0aGlzLnN0cmluZ2lmeU9wdGlvbnMuc2VwIHx8IG51bGwsXG4gICAgICB0aGlzLnN0cmluZ2lmeU9wdGlvbnMuZXEgfHwgbnVsbCxcbiAgICAgIHRoaXMuc3RyaW5naWZ5T3B0aW9ucykpXG4gICAgOiB0aGlzLmxpYi5zdHJpbmdpZnkob2JqLCB0aGlzLnN0cmluZ2lmeU9wdGlvbnMpXG59XG5cblF1ZXJ5c3RyaW5nLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuICh0aGlzLnVzZVF1ZXJ5c3RyaW5nKVxuICAgID8gdGhpcy5saWIucGFyc2Uoc3RyLFxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnMuc2VwIHx8IG51bGwsXG4gICAgICB0aGlzLnBhcnNlT3B0aW9ucy5lcSB8fCBudWxsLFxuICAgICAgdGhpcy5wYXJzZU9wdGlvbnMpXG4gICAgOiB0aGlzLmxpYi5wYXJzZShzdHIsIHRoaXMucGFyc2VPcHRpb25zKVxufVxuXG5RdWVyeXN0cmluZy5wcm90b3R5cGUucmZjMzk4NiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG5RdWVyeXN0cmluZy5wcm90b3R5cGUudW5lc2NhcGUgPSBxdWVyeXN0cmluZy51bmVzY2FwZVxuXG5leHBvcnRzLlF1ZXJ5c3RyaW5nID0gUXVlcnlzdHJpbmdcbiIsICJpbXBvcnQgeyBTQ0hFTUVTIH0gZnJvbSBcIi4vdXJpXCI7XG5cbmltcG9ydCBodHRwIGZyb20gXCIuL3NjaGVtZXMvaHR0cFwiO1xuU0NIRU1FU1todHRwLnNjaGVtZV0gPSBodHRwO1xuXG5pbXBvcnQgaHR0cHMgZnJvbSBcIi4vc2NoZW1lcy9odHRwc1wiO1xuU0NIRU1FU1todHRwcy5zY2hlbWVdID0gaHR0cHM7XG5cbmltcG9ydCB3cyBmcm9tIFwiLi9zY2hlbWVzL3dzXCI7XG5TQ0hFTUVTW3dzLnNjaGVtZV0gPSB3cztcblxuaW1wb3J0IHdzcyBmcm9tIFwiLi9zY2hlbWVzL3dzc1wiO1xuU0NIRU1FU1t3c3Muc2NoZW1lXSA9IHdzcztcblxuaW1wb3J0IG1haWx0byBmcm9tIFwiLi9zY2hlbWVzL21haWx0b1wiO1xuU0NIRU1FU1ttYWlsdG8uc2NoZW1lXSA9IG1haWx0bztcblxuaW1wb3J0IHVybiBmcm9tIFwiLi9zY2hlbWVzL3VyblwiO1xuU0NIRU1FU1t1cm4uc2NoZW1lXSA9IHVybjtcblxuaW1wb3J0IHV1aWQgZnJvbSBcIi4vc2NoZW1lcy91cm4tdXVpZFwiO1xuU0NIRU1FU1t1dWlkLnNjaGVtZV0gPSB1dWlkO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91cmlcIjtcbiIsICJpbXBvcnQgeyBVUklTY2hlbWVIYW5kbGVyLCBVUklDb21wb25lbnRzLCBVUklPcHRpb25zIH0gZnJvbSBcIi4uL3VyaVwiO1xuaW1wb3J0IHsgVVJOQ29tcG9uZW50cyB9IGZyb20gXCIuL3VyblwiO1xuaW1wb3J0IHsgU0NIRU1FUyB9IGZyb20gXCIuLi91cmlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVVUlEQ29tcG9uZW50cyBleHRlbmRzIFVSTkNvbXBvbmVudHMge1xuXHR1dWlkPzogc3RyaW5nO1xufVxuXG5jb25zdCBVVUlEID0gL15bMC05QS1GYS1mXXs4fSg/OlxcLVswLTlBLUZhLWZdezR9KXszfVxcLVswLTlBLUZhLWZdezEyfSQvO1xuY29uc3QgVVVJRF9QQVJTRSA9IC9eWzAtOUEtRmEtZlxcLV17MzZ9LztcblxuLy9SRkMgNDEyMlxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyPFVVSURDb21wb25lbnRzLCBVUklPcHRpb25zLCBVUk5Db21wb25lbnRzPiA9IHtcblx0c2NoZW1lIDogXCJ1cm46dXVpZFwiLFxuXG5cdHBhcnNlIDogZnVuY3Rpb24gKHVybkNvbXBvbmVudHM6VVJOQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpVVUlEQ29tcG9uZW50cyB7XG5cdFx0Y29uc3QgdXVpZENvbXBvbmVudHMgPSB1cm5Db21wb25lbnRzIGFzIFVVSURDb21wb25lbnRzO1xuXHRcdHV1aWRDb21wb25lbnRzLnV1aWQgPSB1dWlkQ29tcG9uZW50cy5uc3M7XG5cdFx0dXVpZENvbXBvbmVudHMubnNzID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCFvcHRpb25zLnRvbGVyYW50ICYmICghdXVpZENvbXBvbmVudHMudXVpZCB8fCAhdXVpZENvbXBvbmVudHMudXVpZC5tYXRjaChVVUlEKSkpIHtcblx0XHRcdHV1aWRDb21wb25lbnRzLmVycm9yID0gdXVpZENvbXBvbmVudHMuZXJyb3IgfHwgXCJVVUlEIGlzIG5vdCB2YWxpZC5cIjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdXVpZENvbXBvbmVudHM7XG5cdH0sXG5cblx0c2VyaWFsaXplIDogZnVuY3Rpb24gKHV1aWRDb21wb25lbnRzOlVVSURDb21wb25lbnRzLCBvcHRpb25zOlVSSU9wdGlvbnMpOlVSTkNvbXBvbmVudHMge1xuXHRcdGNvbnN0IHVybkNvbXBvbmVudHMgPSB1dWlkQ29tcG9uZW50cyBhcyBVUk5Db21wb25lbnRzO1xuXHRcdC8vbm9ybWFsaXplIFVVSURcblx0XHR1cm5Db21wb25lbnRzLm5zcyA9ICh1dWlkQ29tcG9uZW50cy51dWlkIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIHVybkNvbXBvbmVudHM7XG5cdH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBoYW5kbGVyOyIsICJpbXBvcnQgeyBVUklTY2hlbWVIYW5kbGVyLCBVUklDb21wb25lbnRzLCBVUklPcHRpb25zIH0gZnJvbSBcIi4uL3VyaVwiO1xuaW1wb3J0IHsgcGN0RW5jQ2hhciwgU0NIRU1FUyB9IGZyb20gXCIuLi91cmlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVUk5Db21wb25lbnRzIGV4dGVuZHMgVVJJQ29tcG9uZW50cyB7XG5cdG5pZD86c3RyaW5nO1xuXHRuc3M/OnN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVUk5PcHRpb25zIGV4dGVuZHMgVVJJT3B0aW9ucyB7XG5cdG5pZD86c3RyaW5nO1xufVxuXG5jb25zdCBOSUQkID0gXCIoPzpbMC05QS1aYS16XVswLTlBLVphLXpcXFxcLV17MSwzMX0pXCI7XG5jb25zdCBQQ1RfRU5DT0RFRCQgPSBcIig/OlxcXFwlWzAtOUEtRmEtZl17Mn0pXCI7XG5jb25zdCBUUkFOUyQkID0gXCJbMC05QS1aYS16XFxcXChcXFxcKVxcXFwrXFxcXCxcXFxcLVxcXFwuXFxcXDpcXFxcPVxcXFxAXFxcXDtcXFxcJFxcXFxfXFxcXCFcXFxcKlxcXFwnXFxcXC9cXFxcP1xcXFwjXVwiO1xuY29uc3QgTlNTJCA9IFwiKD86KD86XCIgKyBQQ1RfRU5DT0RFRCQgKyBcInxcIiArIFRSQU5TJCQgKyBcIikrKVwiO1xuY29uc3QgVVJOX1NDSEVNRSA9IG5ldyBSZWdFeHAoXCJedXJuXFxcXDooXCIgKyBOSUQkICsgXCIpJFwiKTtcbmNvbnN0IFVSTl9QQVRIID0gbmV3IFJlZ0V4cChcIl4oXCIgKyBOSUQkICsgXCIpXFxcXDooXCIgKyBOU1MkICsgXCIpJFwiKTtcbmNvbnN0IFVSTl9QQVJTRSA9IC9eKFteXFw6XSspXFw6KC4qKS87XG5jb25zdCBVUk5fRVhDTFVERUQgPSAvW1xceDAwLVxceDIwXFxcXFxcXCJcXCZcXDxcXD5cXFtcXF1cXF5cXGBcXHtcXHxcXH1cXH5cXHg3Ri1cXHhGRl0vZztcblxuLy9SRkMgMjE0MVxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyPFVSTkNvbXBvbmVudHMsVVJOT3B0aW9ucz4gPSB7XG5cdHNjaGVtZSA6IFwidXJuXCIsXG5cblx0cGFyc2UgOiBmdW5jdGlvbiAoY29tcG9uZW50czpVUklDb21wb25lbnRzLCBvcHRpb25zOlVSTk9wdGlvbnMpOlVSTkNvbXBvbmVudHMge1xuXHRcdGNvbnN0IG1hdGNoZXMgPSBjb21wb25lbnRzLnBhdGggJiYgY29tcG9uZW50cy5wYXRoLm1hdGNoKFVSTl9QQVJTRSk7XG5cdFx0bGV0IHVybkNvbXBvbmVudHMgPSBjb21wb25lbnRzIGFzIFVSTkNvbXBvbmVudHM7XG5cblx0XHRpZiAobWF0Y2hlcykge1xuXHRcdFx0Y29uc3Qgc2NoZW1lID0gb3B0aW9ucy5zY2hlbWUgfHwgdXJuQ29tcG9uZW50cy5zY2hlbWUgfHwgXCJ1cm5cIjtcblx0XHRcdGNvbnN0IG5pZCA9IG1hdGNoZXNbMV0udG9Mb3dlckNhc2UoKTtcblx0XHRcdGNvbnN0IG5zcyA9IG1hdGNoZXNbMl07XG5cdFx0XHRjb25zdCB1cm5TY2hlbWUgPSBgJHtzY2hlbWV9OiR7b3B0aW9ucy5uaWQgfHwgbmlkfWA7XG5cdFx0XHRjb25zdCBzY2hlbWVIYW5kbGVyID0gU0NIRU1FU1t1cm5TY2hlbWVdO1xuXG5cdFx0XHR1cm5Db21wb25lbnRzLm5pZCA9IG5pZDtcblx0XHRcdHVybkNvbXBvbmVudHMubnNzID0gbnNzO1xuXHRcdFx0dXJuQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoc2NoZW1lSGFuZGxlcikge1xuXHRcdFx0XHR1cm5Db21wb25lbnRzID0gc2NoZW1lSGFuZGxlci5wYXJzZSh1cm5Db21wb25lbnRzLCBvcHRpb25zKSBhcyBVUk5Db21wb25lbnRzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR1cm5Db21wb25lbnRzLmVycm9yID0gdXJuQ29tcG9uZW50cy5lcnJvciB8fCBcIlVSTiBjYW4gbm90IGJlIHBhcnNlZC5cIjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdXJuQ29tcG9uZW50cztcblx0fSxcblxuXHRzZXJpYWxpemUgOiBmdW5jdGlvbiAodXJuQ29tcG9uZW50czpVUk5Db21wb25lbnRzLCBvcHRpb25zOlVSTk9wdGlvbnMpOlVSSUNvbXBvbmVudHMge1xuXHRcdGNvbnN0IHNjaGVtZSA9IG9wdGlvbnMuc2NoZW1lIHx8IHVybkNvbXBvbmVudHMuc2NoZW1lIHx8IFwidXJuXCI7XG5cdFx0Y29uc3QgbmlkID0gdXJuQ29tcG9uZW50cy5uaWQ7XG5cdFx0Y29uc3QgdXJuU2NoZW1lID0gYCR7c2NoZW1lfToke29wdGlvbnMubmlkIHx8IG5pZH1gO1xuXHRcdGNvbnN0IHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTW3VyblNjaGVtZV07XG5cblx0XHRpZiAoc2NoZW1lSGFuZGxlcikge1xuXHRcdFx0dXJuQ29tcG9uZW50cyA9IHNjaGVtZUhhbmRsZXIuc2VyaWFsaXplKHVybkNvbXBvbmVudHMsIG9wdGlvbnMpIGFzIFVSTkNvbXBvbmVudHM7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdXJpQ29tcG9uZW50cyA9IHVybkNvbXBvbmVudHMgYXMgVVJJQ29tcG9uZW50cztcblx0XHRjb25zdCBuc3MgPSB1cm5Db21wb25lbnRzLm5zcztcblx0XHR1cmlDb21wb25lbnRzLnBhdGggPSBgJHtuaWQgfHwgb3B0aW9ucy5uaWR9OiR7bnNzfWA7XG5cblx0XHRyZXR1cm4gdXJpQ29tcG9uZW50cztcblx0fSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZXI7IiwgImltcG9ydCB7IFVSSVNjaGVtZUhhbmRsZXIsIFVSSUNvbXBvbmVudHMsIFVSSU9wdGlvbnMgfSBmcm9tIFwiLi4vdXJpXCI7XG5pbXBvcnQgeyBwY3RFbmNDaGFyLCBwY3REZWNDaGFycywgdW5lc2NhcGVDb21wb25lbnQgfSBmcm9tIFwiLi4vdXJpXCI7XG5pbXBvcnQgcHVueWNvZGUgZnJvbSBcInB1bnljb2RlXCI7XG5pbXBvcnQgeyBtZXJnZSwgc3ViZXhwLCB0b1VwcGVyQ2FzZSwgdG9BcnJheSB9IGZyb20gXCIuLi91dGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFpbHRvSGVhZGVycyB7XG5cdFtoZm5hbWU6c3RyaW5nXTpzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYWlsdG9Db21wb25lbnRzIGV4dGVuZHMgVVJJQ29tcG9uZW50cyB7XG5cdHRvOkFycmF5PHN0cmluZz4sXG5cdGhlYWRlcnM/Ok1haWx0b0hlYWRlcnMsXG5cdHN1YmplY3Q/OnN0cmluZyxcblx0Ym9keT86c3RyaW5nXG59XG5cbmNvbnN0IE86TWFpbHRvSGVhZGVycyA9IHt9O1xuY29uc3QgaXNJUkkgPSB0cnVlO1xuXG4vL1JGQyAzOTg2XG5jb25zdCBVTlJFU0VSVkVEJCQgPSBcIltBLVphLXowLTlcXFxcLVxcXFwuXFxcXF9cXFxcflwiICsgKGlzSVJJID8gXCJcXFxceEEwLVxcXFx1MjAwRFxcXFx1MjAxMC1cXFxcdTIwMjlcXFxcdTIwMkYtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRUZcIiA6IFwiXCIpICsgXCJdXCI7XG5jb25zdCBIRVhESUckJCA9IFwiWzAtOUEtRmEtZl1cIjsgIC8vY2FzZS1pbnNlbnNpdGl2ZVxuY29uc3QgUENUX0VOQ09ERUQkID0gc3ViZXhwKHN1YmV4cChcIiVbRUZlZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVs4OUEtRmEtZl1cIiArIEhFWERJRyQkICsgXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSArIFwifFwiICsgc3ViZXhwKFwiJVwiICsgSEVYRElHJCQgKyBIRVhESUckJCkpOyAgLy9leHBhbmRlZFxuXG4vL1JGQyA1MzIyLCBleGNlcHQgdGhlc2Ugc3ltYm9scyBhcyBwZXIgUkZDIDYwNjg6IEAgOiAvID8gIyBbIF0gJiA7ID1cbi8vY29uc3QgQVRFWFQkJCA9IFwiW0EtWmEtejAtOVxcXFwhXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcJ1xcXFwqXFxcXCtcXFxcLVxcXFwvXFxcXD1cXFxcP1xcXFxeXFxcXF9cXFxcYFxcXFx7XFxcXHxcXFxcfVxcXFx+XVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVRFWFQkJCA9IFwiW1xcXFx4MDEtXFxcXHgwOFxcXFx4MEJcXFxceDBDXFxcXHgwRS1cXFxceDFGXFxcXHg3Rl1cIjsgIC8vKCVkMS04IC8gJWQxMS0xMiAvICVkMTQtMzEgLyAlZDEyNylcbi8vY29uc3QgUVRFWFQkJCA9IG1lcmdlKFwiW1xcXFx4MjFcXFxceDIzLVxcXFx4NUJcXFxceDVELVxcXFx4N0VdXCIsIE9CU19RVEVYVCQkKTsgIC8vJWQzMyAvICVkMzUtOTEgLyAlZDkzLTEyNiAvIG9icy1xdGV4dFxuLy9jb25zdCBWQ0hBUiQkID0gXCJbXFxcXHgyMS1cXFxceDdFXVwiO1xuLy9jb25zdCBXU1AkJCA9IFwiW1xcXFx4MjBcXFxceDA5XVwiO1xuLy9jb25zdCBPQlNfUVAkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIG1lcmdlKFwiW1xcXFx4MDBcXFxceDBEXFxcXHgwQV1cIiwgT0JTX1FURVhUJCQpKTsgIC8vJWQwIC8gQ1IgLyBMRiAvIG9icy1xdGV4dFxuLy9jb25zdCBGV1MkID0gc3ViZXhwKHN1YmV4cChXU1AkJCArIFwiKlwiICsgXCJcXFxceDBEXFxcXHgwQVwiKSArIFwiP1wiICsgV1NQJCQgKyBcIitcIik7XG4vL2NvbnN0IFFVT1RFRF9QQUlSJCA9IHN1YmV4cChzdWJleHAoXCJcXFxcXFxcXFwiICsgc3ViZXhwKFZDSEFSJCQgKyBcInxcIiArIFdTUCQkKSkgKyBcInxcIiArIE9CU19RUCQpO1xuLy9jb25zdCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIHN1YmV4cChGV1MkICsgXCI/XCIgKyBRQ09OVEVOVCQpICsgXCIqXCIgKyBGV1MkICsgXCI/XCIgKyAnXFxcXFwiJyk7XG5jb25zdCBBVEVYVCQkID0gXCJbQS1aYS16MC05XFxcXCFcXFxcJFxcXFwlXFxcXCdcXFxcKlxcXFwrXFxcXC1cXFxcXlxcXFxfXFxcXGBcXFxce1xcXFx8XFxcXH1cXFxcfl1cIjtcbmNvbnN0IFFURVhUJCQgPSBcIltcXFxcIVxcXFwkXFxcXCVcXFxcJ1xcXFwoXFxcXClcXFxcKlxcXFwrXFxcXCxcXFxcLVxcXFwuMC05XFxcXDxcXFxcPkEtWlxcXFx4NUUtXFxcXHg3RV1cIjtcbmNvbnN0IFZDSEFSJCQgPSBtZXJnZShRVEVYVCQkLCBcIltcXFxcXFxcIlxcXFxcXFxcXVwiKTtcbmNvbnN0IERPVF9BVE9NX1RFWFQkID0gc3ViZXhwKEFURVhUJCQgKyBcIitcIiArIHN1YmV4cChcIlxcXFwuXCIgKyBBVEVYVCQkICsgXCIrXCIpICsgXCIqXCIpO1xuY29uc3QgUVVPVEVEX1BBSVIkID0gc3ViZXhwKFwiXFxcXFxcXFxcIiArIFZDSEFSJCQpO1xuY29uc3QgUUNPTlRFTlQkID0gc3ViZXhwKFFURVhUJCQgKyBcInxcIiArIFFVT1RFRF9QQUlSJCk7XG5jb25zdCBRVU9URURfU1RSSU5HJCA9IHN1YmV4cCgnXFxcXFwiJyArIFFDT05URU5UJCArIFwiKlwiICsgJ1xcXFxcIicpO1xuXG4vL1JGQyA2MDY4XG5jb25zdCBEVEVYVF9OT19PQlMkJCA9IFwiW1xcXFx4MjEtXFxcXHg1QVxcXFx4NUUtXFxcXHg3RV1cIjsgIC8vJWQzMy05MCAvICVkOTQtMTI2XG5jb25zdCBTT01FX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFw7XFxcXDpcXFxcQF1cIjtcbmNvbnN0IFFDSEFSJCA9IHN1YmV4cChVTlJFU0VSVkVEJCQgKyBcInxcIiArIFBDVF9FTkNPREVEJCArIFwifFwiICsgU09NRV9ERUxJTVMkJCk7XG5jb25zdCBET01BSU4kID0gc3ViZXhwKERPVF9BVE9NX1RFWFQkICsgXCJ8XCIgKyBcIlxcXFxbXCIgKyBEVEVYVF9OT19PQlMkJCArIFwiKlwiICsgXCJcXFxcXVwiKTtcbmNvbnN0IExPQ0FMX1BBUlQkID0gc3ViZXhwKERPVF9BVE9NX1RFWFQkICsgXCJ8XCIgKyBRVU9URURfU1RSSU5HJCk7XG5jb25zdCBBRERSX1NQRUMkID0gc3ViZXhwKExPQ0FMX1BBUlQkICsgXCJcXFxcQFwiICsgRE9NQUlOJCk7XG5jb25zdCBUTyQgPSBzdWJleHAoQUREUl9TUEVDJCArIHN1YmV4cChcIlxcXFwsXCIgKyBBRERSX1NQRUMkKSArIFwiKlwiKTtcbmNvbnN0IEhGTkFNRSQgPSBzdWJleHAoUUNIQVIkICsgXCIqXCIpO1xuY29uc3QgSEZWQUxVRSQgPSBIRk5BTUUkO1xuY29uc3QgSEZJRUxEJCA9IHN1YmV4cChIRk5BTUUkICsgXCJcXFxcPVwiICsgSEZWQUxVRSQpO1xuY29uc3QgSEZJRUxEUzIkID0gc3ViZXhwKEhGSUVMRCQgKyBzdWJleHAoXCJcXFxcJlwiICsgSEZJRUxEJCkgKyBcIipcIik7XG5jb25zdCBIRklFTERTJCA9IHN1YmV4cChcIlxcXFw/XCIgKyBIRklFTERTMiQpO1xuY29uc3QgTUFJTFRPX1VSSSA9IG5ldyBSZWdFeHAoXCJebWFpbHRvXFxcXDpcIiArIFRPJCArIFwiP1wiICsgSEZJRUxEUyQgKyBcIj8kXCIpO1xuXG5jb25zdCBVTlJFU0VSVkVEID0gbmV3IFJlZ0V4cChVTlJFU0VSVkVEJCQsIFwiZ1wiKTtcbmNvbnN0IFBDVF9FTkNPREVEID0gbmV3IFJlZ0V4cChQQ1RfRU5DT0RFRCQsIFwiZ1wiKTtcbmNvbnN0IE5PVF9MT0NBTF9QQVJUID0gbmV3IFJlZ0V4cChtZXJnZShcIlteXVwiLCBBVEVYVCQkLCBcIltcXFxcLl1cIiwgJ1tcXFxcXCJdJywgVkNIQVIkJCksIFwiZ1wiKTtcbmNvbnN0IE5PVF9ET01BSU4gPSBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFURVhUJCQsIFwiW1xcXFwuXVwiLCBcIltcXFxcW11cIiwgRFRFWFRfTk9fT0JTJCQsIFwiW1xcXFxdXVwiKSwgXCJnXCIpO1xuY29uc3QgTk9UX0hGTkFNRSA9IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgVU5SRVNFUlZFRCQkLCBTT01FX0RFTElNUyQkKSwgXCJnXCIpO1xuY29uc3QgTk9UX0hGVkFMVUUgPSBOT1RfSEZOQU1FO1xuY29uc3QgVE8gPSBuZXcgUmVnRXhwKFwiXlwiICsgVE8kICsgXCIkXCIpO1xuY29uc3QgSEZJRUxEUyA9IG5ldyBSZWdFeHAoXCJeXCIgKyBIRklFTERTMiQgKyBcIiRcIik7XG5cbmZ1bmN0aW9uIGRlY29kZVVucmVzZXJ2ZWQoc3RyOnN0cmluZyk6c3RyaW5nIHtcblx0Y29uc3QgZGVjU3RyID0gcGN0RGVjQ2hhcnMoc3RyKTtcblx0cmV0dXJuICghZGVjU3RyLm1hdGNoKFVOUkVTRVJWRUQpID8gc3RyIDogZGVjU3RyKTtcbn1cblxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyPE1haWx0b0NvbXBvbmVudHM+ID0gIHtcblx0c2NoZW1lIDogXCJtYWlsdG9cIixcblxuXHRwYXJzZSA6IGZ1bmN0aW9uIChjb21wb25lbnRzOlVSSUNvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyk6TWFpbHRvQ29tcG9uZW50cyB7XG5cdFx0Y29uc3QgbWFpbHRvQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgYXMgTWFpbHRvQ29tcG9uZW50cztcblx0XHRjb25zdCB0byA9IG1haWx0b0NvbXBvbmVudHMudG8gPSAobWFpbHRvQ29tcG9uZW50cy5wYXRoID8gbWFpbHRvQ29tcG9uZW50cy5wYXRoLnNwbGl0KFwiLFwiKSA6IFtdKTtcblx0XHRtYWlsdG9Db21wb25lbnRzLnBhdGggPSB1bmRlZmluZWQ7XG5cblx0XHRpZiAobWFpbHRvQ29tcG9uZW50cy5xdWVyeSkge1xuXHRcdFx0bGV0IHVua25vd25IZWFkZXJzID0gZmFsc2Vcblx0XHRcdGNvbnN0IGhlYWRlcnM6TWFpbHRvSGVhZGVycyA9IHt9O1xuXHRcdFx0Y29uc3QgaGZpZWxkcyA9IG1haWx0b0NvbXBvbmVudHMucXVlcnkuc3BsaXQoXCImXCIpO1xuXG5cdFx0XHRmb3IgKGxldCB4ID0gMCwgeGwgPSBoZmllbGRzLmxlbmd0aDsgeCA8IHhsOyArK3gpIHtcblx0XHRcdFx0Y29uc3QgaGZpZWxkID0gaGZpZWxkc1t4XS5zcGxpdChcIj1cIik7XG5cblx0XHRcdFx0c3dpdGNoIChoZmllbGRbMF0pIHtcblx0XHRcdFx0XHRjYXNlIFwidG9cIjpcblx0XHRcdFx0XHRcdGNvbnN0IHRvQWRkcnMgPSBoZmllbGRbMV0uc3BsaXQoXCIsXCIpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgeCA9IDAsIHhsID0gdG9BZGRycy5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG5cdFx0XHRcdFx0XHRcdHRvLnB1c2godG9BZGRyc1t4XSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwic3ViamVjdFwiOlxuXHRcdFx0XHRcdFx0bWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0ID0gdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzFdLCBvcHRpb25zKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJib2R5XCI6XG5cdFx0XHRcdFx0XHRtYWlsdG9Db21wb25lbnRzLmJvZHkgPSB1bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMV0sIG9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHVua25vd25IZWFkZXJzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGhlYWRlcnNbdW5lc2NhcGVDb21wb25lbnQoaGZpZWxkWzBdLCBvcHRpb25zKV0gPSB1bmVzY2FwZUNvbXBvbmVudChoZmllbGRbMV0sIG9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHVua25vd25IZWFkZXJzKSBtYWlsdG9Db21wb25lbnRzLmhlYWRlcnMgPSBoZWFkZXJzO1xuXHRcdH1cblxuXHRcdG1haWx0b0NvbXBvbmVudHMucXVlcnkgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKGxldCB4ID0gMCwgeGwgPSB0by5sZW5ndGg7IHggPCB4bDsgKyt4KSB7XG5cdFx0XHRjb25zdCBhZGRyID0gdG9beF0uc3BsaXQoXCJAXCIpO1xuXG5cdFx0XHRhZGRyWzBdID0gdW5lc2NhcGVDb21wb25lbnQoYWRkclswXSk7XG5cblx0XHRcdGlmICghb3B0aW9ucy51bmljb2RlU3VwcG9ydCkge1xuXHRcdFx0XHQvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YWRkclsxXSA9IHB1bnljb2RlLnRvQVNDSUkodW5lc2NhcGVDb21wb25lbnQoYWRkclsxXSwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRtYWlsdG9Db21wb25lbnRzLmVycm9yID0gbWFpbHRvQ29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6IFwiICsgZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YWRkclsxXSA9IHVuZXNjYXBlQ29tcG9uZW50KGFkZHJbMV0sIG9wdGlvbnMpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRvW3hdID0gYWRkci5qb2luKFwiQFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFpbHRvQ29tcG9uZW50cztcblx0fSxcblxuXHRzZXJpYWxpemUgOiBmdW5jdGlvbiAobWFpbHRvQ29tcG9uZW50czpNYWlsdG9Db21wb25lbnRzLCBvcHRpb25zOlVSSU9wdGlvbnMpOlVSSUNvbXBvbmVudHMge1xuXHRcdGNvbnN0IGNvbXBvbmVudHMgPSBtYWlsdG9Db21wb25lbnRzIGFzIFVSSUNvbXBvbmVudHM7XG5cdFx0Y29uc3QgdG8gPSB0b0FycmF5KG1haWx0b0NvbXBvbmVudHMudG8pO1xuXHRcdGlmICh0bykge1xuXHRcdFx0Zm9yIChsZXQgeCA9IDAsIHhsID0gdG8ubGVuZ3RoOyB4IDwgeGw7ICsreCkge1xuXHRcdFx0XHRjb25zdCB0b0FkZHIgPSBTdHJpbmcodG9beF0pO1xuXHRcdFx0XHRjb25zdCBhdElkeCA9IHRvQWRkci5sYXN0SW5kZXhPZihcIkBcIik7XG5cdFx0XHRcdGNvbnN0IGxvY2FsUGFydCA9ICh0b0FkZHIuc2xpY2UoMCwgYXRJZHgpKS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfTE9DQUxfUEFSVCwgcGN0RW5jQ2hhcik7XG5cdFx0XHRcdGxldCBkb21haW4gPSB0b0FkZHIuc2xpY2UoYXRJZHggKyAxKTtcblxuXHRcdFx0XHQvL2NvbnZlcnQgSUROIHZpYSBwdW55Y29kZVxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGRvbWFpbiA9ICghb3B0aW9ucy5pcmkgPyBwdW55Y29kZS50b0FTQ0lJKHVuZXNjYXBlQ29tcG9uZW50KGRvbWFpbiwgb3B0aW9ucykudG9Mb3dlckNhc2UoKSkgOiBwdW55Y29kZS50b1VuaWNvZGUoZG9tYWluKSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb21wb25lbnRzLmVycm9yID0gY29tcG9uZW50cy5lcnJvciB8fCBcIkVtYWlsIGFkZHJlc3MncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBcIiArICghb3B0aW9ucy5pcmkgPyBcIkFTQ0lJXCIgOiBcIlVuaWNvZGVcIikgKyBcIiB2aWEgcHVueWNvZGU6IFwiICsgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRvW3hdID0gbG9jYWxQYXJ0ICsgXCJAXCIgKyBkb21haW47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBvbmVudHMucGF0aCA9IHRvLmpvaW4oXCIsXCIpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhlYWRlcnMgPSBtYWlsdG9Db21wb25lbnRzLmhlYWRlcnMgPSBtYWlsdG9Db21wb25lbnRzLmhlYWRlcnMgfHwge307XG5cblx0XHRpZiAobWFpbHRvQ29tcG9uZW50cy5zdWJqZWN0KSBoZWFkZXJzW1wic3ViamVjdFwiXSA9IG1haWx0b0NvbXBvbmVudHMuc3ViamVjdDtcblx0XHRpZiAobWFpbHRvQ29tcG9uZW50cy5ib2R5KSBoZWFkZXJzW1wiYm9keVwiXSA9IG1haWx0b0NvbXBvbmVudHMuYm9keTtcblxuXHRcdGNvbnN0IGZpZWxkcyA9IFtdO1xuXHRcdGZvciAoY29uc3QgbmFtZSBpbiBoZWFkZXJzKSB7XG5cdFx0XHRpZiAoaGVhZGVyc1tuYW1lXSAhPT0gT1tuYW1lXSkge1xuXHRcdFx0XHRmaWVsZHMucHVzaChcblx0XHRcdFx0XHRuYW1lLnJlcGxhY2UoUENUX0VOQ09ERUQsIGRlY29kZVVucmVzZXJ2ZWQpLnJlcGxhY2UoUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKS5yZXBsYWNlKE5PVF9IRk5BTUUsIHBjdEVuY0NoYXIpICtcblx0XHRcdFx0XHRcIj1cIiArXG5cdFx0XHRcdFx0aGVhZGVyc1tuYW1lXS5yZXBsYWNlKFBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKFBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSkucmVwbGFjZShOT1RfSEZWQUxVRSwgcGN0RW5jQ2hhcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGZpZWxkcy5sZW5ndGgpIHtcblx0XHRcdGNvbXBvbmVudHMucXVlcnkgPSBmaWVsZHMuam9pbihcIiZcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcbmltcG9ydCB3cyBmcm9tIFwiLi93c1wiO1xuXG5jb25zdCBoYW5kbGVyOlVSSVNjaGVtZUhhbmRsZXIgPSB7XG5cdHNjaGVtZSA6IFwid3NzXCIsXG5cdGRvbWFpbkhvc3QgOiB3cy5kb21haW5Ib3N0LFxuXHRwYXJzZSA6IHdzLnBhcnNlLFxuXHRzZXJpYWxpemUgOiB3cy5zZXJpYWxpemVcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBXU0NvbXBvbmVudHMgZXh0ZW5kcyBVUklDb21wb25lbnRzIHtcblx0cmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuXHRzZWN1cmU/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc1NlY3VyZSh3c0NvbXBvbmVudHM6V1NDb21wb25lbnRzKTpib29sZWFuIHtcblx0cmV0dXJuIHR5cGVvZiB3c0NvbXBvbmVudHMuc2VjdXJlID09PSAnYm9vbGVhbicgPyB3c0NvbXBvbmVudHMuc2VjdXJlIDogU3RyaW5nKHdzQ29tcG9uZW50cy5zY2hlbWUpLnRvTG93ZXJDYXNlKCkgPT09IFwid3NzXCI7XG59XG5cbi8vUkZDIDY0NTVcbmNvbnN0IGhhbmRsZXI6VVJJU2NoZW1lSGFuZGxlciA9IHtcblx0c2NoZW1lIDogXCJ3c1wiLFxuXG5cdGRvbWFpbkhvc3QgOiB0cnVlLFxuXG5cdHBhcnNlIDogZnVuY3Rpb24gKGNvbXBvbmVudHM6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpXU0NvbXBvbmVudHMge1xuXHRcdGNvbnN0IHdzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgYXMgV1NDb21wb25lbnRzO1xuXG5cdFx0Ly9pbmRpY2F0ZSBpZiB0aGUgc2VjdXJlIGZsYWcgaXMgc2V0XG5cdFx0d3NDb21wb25lbnRzLnNlY3VyZSA9IGlzU2VjdXJlKHdzQ29tcG9uZW50cyk7XG5cblx0XHQvL2NvbnN0cnVjdCByZXNvdWNlIG5hbWVcblx0XHR3c0NvbXBvbmVudHMucmVzb3VyY2VOYW1lID0gKHdzQ29tcG9uZW50cy5wYXRoIHx8ICcvJykgKyAod3NDb21wb25lbnRzLnF1ZXJ5ID8gJz8nICsgd3NDb21wb25lbnRzLnF1ZXJ5IDogJycpO1xuXHRcdHdzQ29tcG9uZW50cy5wYXRoID0gdW5kZWZpbmVkO1xuXHRcdHdzQ29tcG9uZW50cy5xdWVyeSA9IHVuZGVmaW5lZDtcblxuXHRcdHJldHVybiB3c0NvbXBvbmVudHM7XG5cdH0sXG5cblx0c2VyaWFsaXplIDogZnVuY3Rpb24gKHdzQ29tcG9uZW50czpXU0NvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyk6VVJJQ29tcG9uZW50cyB7XG5cdFx0Ly9ub3JtYWxpemUgdGhlIGRlZmF1bHQgcG9ydFxuXHRcdGlmICh3c0NvbXBvbmVudHMucG9ydCA9PT0gKGlzU2VjdXJlKHdzQ29tcG9uZW50cykgPyA0NDMgOiA4MCkgfHwgd3NDb21wb25lbnRzLnBvcnQgPT09IFwiXCIpIHtcblx0XHRcdHdzQ29tcG9uZW50cy5wb3J0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vZW5zdXJlIHNjaGVtZSBtYXRjaGVzIHNlY3VyZSBmbGFnXG5cdFx0aWYgKHR5cGVvZiB3c0NvbXBvbmVudHMuc2VjdXJlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHdzQ29tcG9uZW50cy5zY2hlbWUgPSAod3NDb21wb25lbnRzLnNlY3VyZSA/ICd3c3MnIDogJ3dzJyk7XG5cdFx0XHR3c0NvbXBvbmVudHMuc2VjdXJlID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vcmVjb25zdHJ1Y3QgcGF0aCBmcm9tIHJlc291cmNlIG5hbWVcblx0XHRpZiAod3NDb21wb25lbnRzLnJlc291cmNlTmFtZSkge1xuXHRcdFx0Y29uc3QgW3BhdGgsIHF1ZXJ5XSA9IHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUuc3BsaXQoJz8nKTtcblx0XHRcdHdzQ29tcG9uZW50cy5wYXRoID0gKHBhdGggJiYgcGF0aCAhPT0gJy8nID8gcGF0aCA6IHVuZGVmaW5lZCk7XG5cdFx0XHR3c0NvbXBvbmVudHMucXVlcnkgPSBxdWVyeTtcblx0XHRcdHdzQ29tcG9uZW50cy5yZXNvdXJjZU5hbWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly9mb3JiaWQgZnJhZ21lbnQgY29tcG9uZW50XG5cdFx0d3NDb21wb25lbnRzLmZyYWdtZW50ID0gdW5kZWZpbmVkO1xuXG5cdFx0cmV0dXJuIHdzQ29tcG9uZW50cztcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcbmltcG9ydCBodHRwIGZyb20gXCIuL2h0dHBcIjtcblxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyID0ge1xuXHRzY2hlbWUgOiBcImh0dHBzXCIsXG5cdGRvbWFpbkhvc3QgOiBodHRwLmRvbWFpbkhvc3QsXG5cdHBhcnNlIDogaHR0cC5wYXJzZSxcblx0c2VyaWFsaXplIDogaHR0cC5zZXJpYWxpemVcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFuZGxlcjsiLCAiaW1wb3J0IHsgVVJJU2NoZW1lSGFuZGxlciwgVVJJQ29tcG9uZW50cywgVVJJT3B0aW9ucyB9IGZyb20gXCIuLi91cmlcIjtcblxuY29uc3QgaGFuZGxlcjpVUklTY2hlbWVIYW5kbGVyID0ge1xuXHRzY2hlbWUgOiBcImh0dHBcIixcblxuXHRkb21haW5Ib3N0IDogdHJ1ZSxcblxuXHRwYXJzZSA6IGZ1bmN0aW9uIChjb21wb25lbnRzOlVSSUNvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyk6VVJJQ29tcG9uZW50cyB7XG5cdFx0Ly9yZXBvcnQgbWlzc2luZyBob3N0XG5cdFx0aWYgKCFjb21wb25lbnRzLmhvc3QpIHtcblx0XHRcdGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiSFRUUCBVUklzIG11c3QgaGF2ZSBhIGhvc3QuXCI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XG5cdH0sXG5cblx0c2VyaWFsaXplIDogZnVuY3Rpb24gKGNvbXBvbmVudHM6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpVUklDb21wb25lbnRzIHtcblx0XHRjb25zdCBzZWN1cmUgPSBTdHJpbmcoY29tcG9uZW50cy5zY2hlbWUpLnRvTG93ZXJDYXNlKCkgPT09IFwiaHR0cHNcIjtcblxuXHRcdC8vbm9ybWFsaXplIHRoZSBkZWZhdWx0IHBvcnRcblx0XHRpZiAoY29tcG9uZW50cy5wb3J0ID09PSAoc2VjdXJlID8gNDQzIDogODApIHx8IGNvbXBvbmVudHMucG9ydCA9PT0gXCJcIikge1xuXHRcdFx0Y29tcG9uZW50cy5wb3J0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRcblx0XHQvL25vcm1hbGl6ZSB0aGUgZW1wdHkgcGF0aFxuXHRcdGlmICghY29tcG9uZW50cy5wYXRoKSB7XG5cdFx0XHRjb21wb25lbnRzLnBhdGggPSBcIi9cIjtcblx0XHR9XG5cblx0XHQvL05PVEU6IFdlIGRvIG5vdCBwYXJzZSBxdWVyeSBzdHJpbmdzIGZvciBIVFRQIFVSSXNcblx0XHQvL2FzIFdXVyBGb3JtIFVybCBFbmNvZGVkIHF1ZXJ5IHN0cmluZ3MgYXJlIHBhcnQgb2YgdGhlIEhUTUw0KyBzcGVjLFxuXHRcdC8vYW5kIG5vdCB0aGUgSFRUUCBzcGVjLlxuXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XG5cdH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhhbmRsZXI7IiwgIi8qKlxuICogVVJJLmpzXG4gKlxuICogQGZpbGVvdmVydmlldyBBbiBSRkMgMzk4NiBjb21wbGlhbnQsIHNjaGVtZSBleHRlbmRhYmxlIFVSSSBwYXJzaW5nL3ZhbGlkYXRpbmcvcmVzb2x2aW5nIGxpYnJhcnkgZm9yIEphdmFTY3JpcHQuXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86Z2FyeS5jb3VydEBnbWFpbC5jb21cIj5HYXJ5IENvdXJ0PC9hPlxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvdXJpLWpzXG4gKi9cblxuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMSBHYXJ5IENvdXJ0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZVxuICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2ZcbiAqICAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdFxuICogICAgICAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHNcbiAqICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEdBUlkgQ09VUlQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEXG4gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR0FSWSBDT1VSVCBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1JcbiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkdcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRlxuICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKlxuICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9ucyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZSB0aG9zZSBvZiB0aGVcbiAqIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkXG4gKiBvciBpbXBsaWVkLCBvZiBHYXJ5IENvdXJ0LlxuICovXG5cbmltcG9ydCBVUklfUFJPVE9DT0wgZnJvbSBcIi4vcmVnZXhwcy11cmlcIjtcbmltcG9ydCBJUklfUFJPVE9DT0wgZnJvbSBcIi4vcmVnZXhwcy1pcmlcIjtcbmltcG9ydCBwdW55Y29kZSBmcm9tIFwicHVueWNvZGVcIjtcbmltcG9ydCB7IHRvVXBwZXJDYXNlLCB0eXBlT2YsIGFzc2lnbiB9IGZyb20gXCIuL3V0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVUklDb21wb25lbnRzIHtcblx0c2NoZW1lPzpzdHJpbmc7XG5cdHVzZXJpbmZvPzpzdHJpbmc7XG5cdGhvc3Q/OnN0cmluZztcblx0cG9ydD86bnVtYmVyfHN0cmluZztcblx0cGF0aD86c3RyaW5nO1xuXHRxdWVyeT86c3RyaW5nO1xuXHRmcmFnbWVudD86c3RyaW5nO1xuXHRyZWZlcmVuY2U/OnN0cmluZztcblx0ZXJyb3I/OnN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVUklPcHRpb25zIHtcblx0c2NoZW1lPzpzdHJpbmc7XG5cdHJlZmVyZW5jZT86c3RyaW5nO1xuXHR0b2xlcmFudD86Ym9vbGVhbjtcblx0YWJzb2x1dGVQYXRoPzpib29sZWFuO1xuXHRpcmk/OmJvb2xlYW47XG5cdHVuaWNvZGVTdXBwb3J0Pzpib29sZWFuO1xuXHRkb21haW5Ib3N0Pzpib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVSSVNjaGVtZUhhbmRsZXI8Q29tcG9uZW50cyBleHRlbmRzIFVSSUNvbXBvbmVudHMgPSBVUklDb21wb25lbnRzLCBPcHRpb25zIGV4dGVuZHMgVVJJT3B0aW9ucyA9IFVSSU9wdGlvbnMsIFBhcmVudENvbXBvbmVudHMgZXh0ZW5kcyBVUklDb21wb25lbnRzID0gVVJJQ29tcG9uZW50cz4ge1xuXHRzY2hlbWU6c3RyaW5nO1xuXHRwYXJzZShjb21wb25lbnRzOlBhcmVudENvbXBvbmVudHMsIG9wdGlvbnM6T3B0aW9ucyk6Q29tcG9uZW50cztcblx0c2VyaWFsaXplKGNvbXBvbmVudHM6Q29tcG9uZW50cywgb3B0aW9uczpPcHRpb25zKTpQYXJlbnRDb21wb25lbnRzO1xuXHR1bmljb2RlU3VwcG9ydD86Ym9vbGVhbjtcblx0ZG9tYWluSG9zdD86Ym9vbGVhbjtcblx0YWJzb2x1dGVQYXRoPzpib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVSSVJlZ0V4cHMge1xuXHROT1RfU0NIRU1FIDogUmVnRXhwLFxuXHROT1RfVVNFUklORk8gOiBSZWdFeHAsXG5cdE5PVF9IT1NUIDogUmVnRXhwLFxuXHROT1RfUEFUSCA6IFJlZ0V4cCxcblx0Tk9UX1BBVEhfTk9TQ0hFTUUgOiBSZWdFeHAsXG5cdE5PVF9RVUVSWSA6IFJlZ0V4cCxcblx0Tk9UX0ZSQUdNRU5UIDogUmVnRXhwLFxuXHRFU0NBUEUgOiBSZWdFeHAsXG5cdFVOUkVTRVJWRUQgOiBSZWdFeHAsXG5cdE9USEVSX0NIQVJTIDogUmVnRXhwLFxuXHRQQ1RfRU5DT0RFRCA6IFJlZ0V4cCxcblx0SVBWNEFERFJFU1MgOiBSZWdFeHAsXG5cdElQVjZBRERSRVNTIDogUmVnRXhwLFxufVxuXG5leHBvcnQgY29uc3QgU0NIRU1FUzp7W3NjaGVtZTpzdHJpbmddOlVSSVNjaGVtZUhhbmRsZXJ9ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBwY3RFbmNDaGFyKGNocjpzdHJpbmcpOnN0cmluZyB7XG5cdGNvbnN0IGMgPSBjaHIuY2hhckNvZGVBdCgwKTtcblx0bGV0IGU6c3RyaW5nO1xuXG5cdGlmIChjIDwgMTYpIGUgPSBcIiUwXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRlbHNlIGlmIChjIDwgMTI4KSBlID0gXCIlXCIgKyBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRlbHNlIGlmIChjIDwgMjA0OCkgZSA9IFwiJVwiICsgKChjID4+IDYpIHwgMTkyKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKChjICYgNjMpIHwgMTI4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0ZWxzZSBlID0gXCIlXCIgKyAoKGMgPj4gMTIpIHwgMjI0KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIFwiJVwiICsgKCgoYyA+PiA2KSAmIDYzKSB8IDEyOCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkgKyBcIiVcIiArICgoYyAmIDYzKSB8IDEyOCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cblx0cmV0dXJuIGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwY3REZWNDaGFycyhzdHI6c3RyaW5nKTpzdHJpbmcge1xuXHRsZXQgbmV3U3RyID0gXCJcIjtcblx0bGV0IGkgPSAwO1xuXHRjb25zdCBpbCA9IHN0ci5sZW5ndGg7XG5cblx0d2hpbGUgKGkgPCBpbCkge1xuXHRcdGNvbnN0IGMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyAxLCAyKSwgMTYpO1xuXG5cdFx0aWYgKGMgPCAxMjgpIHtcblx0XHRcdG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuXHRcdFx0aSArPSAzO1xuXHRcdH1cblx0XHRlbHNlIGlmIChjID49IDE5NCAmJiBjIDwgMjI0KSB7XG5cdFx0XHRpZiAoKGlsIC0gaSkgPj0gNikge1xuXHRcdFx0XHRjb25zdCBjMiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoaSArIDQsIDIpLCAxNik7XG5cdFx0XHRcdG5ld1N0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCA2KTtcblx0XHRcdH1cblx0XHRcdGkgKz0gNjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoYyA+PSAyMjQpIHtcblx0XHRcdGlmICgoaWwgLSBpKSA+PSA5KSB7XG5cdFx0XHRcdGNvbnN0IGMyID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpICsgNCwgMiksIDE2KTtcblx0XHRcdFx0Y29uc3QgYzMgPSBwYXJzZUludChzdHIuc3Vic3RyKGkgKyA3LCAyKSwgMTYpO1xuXHRcdFx0XHRuZXdTdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAxNSkgPDwgMTIpIHwgKChjMiAmIDYzKSA8PCA2KSB8IChjMyAmIDYzKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCA5KTtcblx0XHRcdH1cblx0XHRcdGkgKz0gOTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRuZXdTdHIgKz0gc3RyLnN1YnN0cihpLCAzKTtcblx0XHRcdGkgKz0gMztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3U3RyO1xufVxuXG5mdW5jdGlvbiBfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50czpVUklDb21wb25lbnRzLCBwcm90b2NvbDpVUklSZWdFeHBzKSB7XG5cdGZ1bmN0aW9uIGRlY29kZVVucmVzZXJ2ZWQoc3RyOnN0cmluZyk6c3RyaW5nIHtcblx0XHRjb25zdCBkZWNTdHIgPSBwY3REZWNDaGFycyhzdHIpO1xuXHRcdHJldHVybiAoIWRlY1N0ci5tYXRjaChwcm90b2NvbC5VTlJFU0VSVkVEKSA/IHN0ciA6IGRlY1N0cik7XG5cdH1cblxuXHRpZiAoY29tcG9uZW50cy5zY2hlbWUpIGNvbXBvbmVudHMuc2NoZW1lID0gU3RyaW5nKGNvbXBvbmVudHMuc2NoZW1lKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX1NDSEVNRSwgXCJcIik7XG5cdGlmIChjb21wb25lbnRzLnVzZXJpbmZvICE9PSB1bmRlZmluZWQpIGNvbXBvbmVudHMudXNlcmluZm8gPSBTdHJpbmcoY29tcG9uZW50cy51c2VyaW5mbykucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfVVNFUklORk8sIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcblx0aWYgKGNvbXBvbmVudHMuaG9zdCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLmhvc3QgPSBTdHJpbmcoY29tcG9uZW50cy5ob3N0KS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UocHJvdG9jb2wuTk9UX0hPU1QsIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcblx0aWYgKGNvbXBvbmVudHMucGF0aCAhPT0gdW5kZWZpbmVkKSBjb21wb25lbnRzLnBhdGggPSBTdHJpbmcoY29tcG9uZW50cy5wYXRoKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKChjb21wb25lbnRzLnNjaGVtZSA/IHByb3RvY29sLk5PVF9QQVRIIDogcHJvdG9jb2wuTk9UX1BBVEhfTk9TQ0hFTUUpLCBwY3RFbmNDaGFyKS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCB0b1VwcGVyQ2FzZSk7XG5cdGlmIChjb21wb25lbnRzLnF1ZXJ5ICE9PSB1bmRlZmluZWQpIGNvbXBvbmVudHMucXVlcnkgPSBTdHJpbmcoY29tcG9uZW50cy5xdWVyeSkucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgZGVjb2RlVW5yZXNlcnZlZCkucmVwbGFjZShwcm90b2NvbC5OT1RfUVVFUlksIHBjdEVuY0NoYXIpLnJlcGxhY2UocHJvdG9jb2wuUENUX0VOQ09ERUQsIHRvVXBwZXJDYXNlKTtcblx0aWYgKGNvbXBvbmVudHMuZnJhZ21lbnQgIT09IHVuZGVmaW5lZCkgY29tcG9uZW50cy5mcmFnbWVudCA9IFN0cmluZyhjb21wb25lbnRzLmZyYWdtZW50KS5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBkZWNvZGVVbnJlc2VydmVkKS5yZXBsYWNlKHByb3RvY29sLk5PVF9GUkFHTUVOVCwgcGN0RW5jQ2hhcikucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgdG9VcHBlckNhc2UpO1xuXG5cdHJldHVybiBjb21wb25lbnRzO1xufTtcblxuZnVuY3Rpb24gX3N0cmlwTGVhZGluZ1plcm9zKHN0cjpzdHJpbmcpOnN0cmluZyB7XG5cdHJldHVybiBzdHIucmVwbGFjZSgvXjAqKC4qKS8sIFwiJDFcIikgfHwgXCIwXCI7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVJUHY0KGhvc3Q6c3RyaW5nLCBwcm90b2NvbDpVUklSZWdFeHBzKTpzdHJpbmcge1xuXHRjb25zdCBtYXRjaGVzID0gaG9zdC5tYXRjaChwcm90b2NvbC5JUFY0QUREUkVTUykgfHwgW107XG5cdGNvbnN0IFssIGFkZHJlc3NdID0gbWF0Y2hlcztcblx0XG5cdGlmIChhZGRyZXNzKSB7XG5cdFx0cmV0dXJuIGFkZHJlc3Muc3BsaXQoXCIuXCIpLm1hcChfc3RyaXBMZWFkaW5nWmVyb3MpLmpvaW4oXCIuXCIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBob3N0O1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVJUHY2KGhvc3Q6c3RyaW5nLCBwcm90b2NvbDpVUklSZWdFeHBzKTpzdHJpbmcge1xuXHRjb25zdCBtYXRjaGVzID0gaG9zdC5tYXRjaChwcm90b2NvbC5JUFY2QUREUkVTUykgfHwgW107XG5cdGNvbnN0IFssIGFkZHJlc3MsIHpvbmVdID0gbWF0Y2hlcztcblxuXHRpZiAoYWRkcmVzcykge1xuXHRcdGNvbnN0IFtsYXN0LCBmaXJzdF0gPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCkuc3BsaXQoJzo6JykucmV2ZXJzZSgpO1xuXHRcdGNvbnN0IGZpcnN0RmllbGRzID0gZmlyc3QgPyBmaXJzdC5zcGxpdChcIjpcIikubWFwKF9zdHJpcExlYWRpbmdaZXJvcykgOiBbXTtcblx0XHRjb25zdCBsYXN0RmllbGRzID0gbGFzdC5zcGxpdChcIjpcIikubWFwKF9zdHJpcExlYWRpbmdaZXJvcyk7XG5cdFx0Y29uc3QgaXNMYXN0RmllbGRJUHY0QWRkcmVzcyA9IHByb3RvY29sLklQVjRBRERSRVNTLnRlc3QobGFzdEZpZWxkc1tsYXN0RmllbGRzLmxlbmd0aCAtIDFdKTtcblx0XHRjb25zdCBmaWVsZENvdW50ID0gaXNMYXN0RmllbGRJUHY0QWRkcmVzcyA/IDcgOiA4O1xuXHRcdGNvbnN0IGxhc3RGaWVsZHNTdGFydCA9IGxhc3RGaWVsZHMubGVuZ3RoIC0gZmllbGRDb3VudDtcblx0XHRjb25zdCBmaWVsZHMgPSBBcnJheTxzdHJpbmc+KGZpZWxkQ291bnQpO1xuXG5cdFx0Zm9yIChsZXQgeCA9IDA7IHggPCBmaWVsZENvdW50OyArK3gpIHtcblx0XHRcdGZpZWxkc1t4XSA9IGZpcnN0RmllbGRzW3hdIHx8IGxhc3RGaWVsZHNbbGFzdEZpZWxkc1N0YXJ0ICsgeF0gfHwgJyc7XG5cdFx0fVxuXG5cdFx0aWYgKGlzTGFzdEZpZWxkSVB2NEFkZHJlc3MpIHtcblx0XHRcdGZpZWxkc1tmaWVsZENvdW50IC0gMV0gPSBfbm9ybWFsaXplSVB2NChmaWVsZHNbZmllbGRDb3VudCAtIDFdLCBwcm90b2NvbCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWxsWmVyb0ZpZWxkcyA9IGZpZWxkcy5yZWR1Y2U8QXJyYXk8e2luZGV4Om51bWJlcixsZW5ndGg6bnVtYmVyfT4+KChhY2MsIGZpZWxkLCBpbmRleCkgPT4ge1xuXHRcdFx0aWYgKCFmaWVsZCB8fCBmaWVsZCA9PT0gXCIwXCIpIHtcblx0XHRcdFx0Y29uc3QgbGFzdExvbmdlc3QgPSBhY2NbYWNjLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRpZiAobGFzdExvbmdlc3QgJiYgbGFzdExvbmdlc3QuaW5kZXggKyBsYXN0TG9uZ2VzdC5sZW5ndGggPT09IGluZGV4KSB7XG5cdFx0XHRcdFx0bGFzdExvbmdlc3QubGVuZ3RoKys7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YWNjLnB1c2goeyBpbmRleCwgbGVuZ3RoIDogMSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGFjYztcblx0XHR9LCBbXSk7XG5cblx0XHRjb25zdCBsb25nZXN0WmVyb0ZpZWxkcyA9IGFsbFplcm9GaWVsZHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClbMF07XG5cblx0XHRsZXQgbmV3SG9zdDpzdHJpbmc7XG5cdFx0aWYgKGxvbmdlc3RaZXJvRmllbGRzICYmIGxvbmdlc3RaZXJvRmllbGRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGNvbnN0IG5ld0ZpcnN0ID0gZmllbGRzLnNsaWNlKDAsIGxvbmdlc3RaZXJvRmllbGRzLmluZGV4KSA7XG5cdFx0XHRjb25zdCBuZXdMYXN0ID0gZmllbGRzLnNsaWNlKGxvbmdlc3RaZXJvRmllbGRzLmluZGV4ICsgbG9uZ2VzdFplcm9GaWVsZHMubGVuZ3RoKTtcblx0XHRcdG5ld0hvc3QgPSBuZXdGaXJzdC5qb2luKFwiOlwiKSArIFwiOjpcIiArIG5ld0xhc3Quam9pbihcIjpcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ld0hvc3QgPSBmaWVsZHMuam9pbihcIjpcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHpvbmUpIHtcblx0XHRcdG5ld0hvc3QgKz0gXCIlXCIgKyB6b25lO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXdIb3N0O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBob3N0O1xuXHR9XG59XG5cbmNvbnN0IFVSSV9QQVJTRSA9IC9eKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKCg/OihbXlxcLz8jQF0qKUApPyhcXFtbXlxcLz8jXFxdXStcXF18W15cXC8/IzpdKikoPzpcXDooXFxkKikpPykpPyhbXj8jXSopKD86XFw/KFteI10qKSk/KD86IygoPzoufFxcbnxcXHIpKikpPy9pO1xuY29uc3QgTk9fTUFUQ0hfSVNfVU5ERUZJTkVEID0gKDxSZWdFeHBNYXRjaEFycmF5PihcIlwiKS5tYXRjaCgvKCl7MH0vKSlbMV0gPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHVyaVN0cmluZzpzdHJpbmcsIG9wdGlvbnM6VVJJT3B0aW9ucyA9IHt9KTpVUklDb21wb25lbnRzIHtcblx0Y29uc3QgY29tcG9uZW50czpVUklDb21wb25lbnRzID0ge307XG5cdGNvbnN0IHByb3RvY29sID0gKG9wdGlvbnMuaXJpICE9PSBmYWxzZSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTCk7XG5cblx0aWYgKG9wdGlvbnMucmVmZXJlbmNlID09PSBcInN1ZmZpeFwiKSB1cmlTdHJpbmcgPSAob3B0aW9ucy5zY2hlbWUgPyBvcHRpb25zLnNjaGVtZSArIFwiOlwiIDogXCJcIikgKyBcIi8vXCIgKyB1cmlTdHJpbmc7XG5cblx0Y29uc3QgbWF0Y2hlcyA9IHVyaVN0cmluZy5tYXRjaChVUklfUEFSU0UpO1xuXG5cdGlmIChtYXRjaGVzKSB7XG5cdFx0aWYgKE5PX01BVENIX0lTX1VOREVGSU5FRCkge1xuXHRcdFx0Ly9zdG9yZSBlYWNoIGNvbXBvbmVudFxuXHRcdFx0Y29tcG9uZW50cy5zY2hlbWUgPSBtYXRjaGVzWzFdO1xuXHRcdFx0Y29tcG9uZW50cy51c2VyaW5mbyA9IG1hdGNoZXNbM107XG5cdFx0XHRjb21wb25lbnRzLmhvc3QgPSBtYXRjaGVzWzRdO1xuXHRcdFx0Y29tcG9uZW50cy5wb3J0ID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuXHRcdFx0Y29tcG9uZW50cy5wYXRoID0gbWF0Y2hlc1s2XSB8fCBcIlwiO1xuXHRcdFx0Y29tcG9uZW50cy5xdWVyeSA9IG1hdGNoZXNbN107XG5cdFx0XHRjb21wb25lbnRzLmZyYWdtZW50ID0gbWF0Y2hlc1s4XTtcblxuXHRcdFx0Ly9maXggcG9ydCBudW1iZXJcblx0XHRcdGlmIChpc05hTihjb21wb25lbnRzLnBvcnQpKSB7XG5cdFx0XHRcdGNvbXBvbmVudHMucG9ydCA9IG1hdGNoZXNbNV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHsgIC8vSUUgRklYIGZvciBpbXByb3BlciBSZWdFeHAgbWF0Y2hpbmdcblx0XHRcdC8vc3RvcmUgZWFjaCBjb21wb25lbnRcblx0XHRcdGNvbXBvbmVudHMuc2NoZW1lID0gbWF0Y2hlc1sxXSB8fCB1bmRlZmluZWQ7XG5cdFx0XHRjb21wb25lbnRzLnVzZXJpbmZvID0gKHVyaVN0cmluZy5pbmRleE9mKFwiQFwiKSAhPT0gLTEgPyBtYXRjaGVzWzNdIDogdW5kZWZpbmVkKTtcblx0XHRcdGNvbXBvbmVudHMuaG9zdCA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIi8vXCIpICE9PSAtMSA/IG1hdGNoZXNbNF0gOiB1bmRlZmluZWQpO1xuXHRcdFx0Y29tcG9uZW50cy5wb3J0ID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuXHRcdFx0Y29tcG9uZW50cy5wYXRoID0gbWF0Y2hlc1s2XSB8fCBcIlwiO1xuXHRcdFx0Y29tcG9uZW50cy5xdWVyeSA9ICh1cmlTdHJpbmcuaW5kZXhPZihcIj9cIikgIT09IC0xID8gbWF0Y2hlc1s3XSA6IHVuZGVmaW5lZCk7XG5cdFx0XHRjb21wb25lbnRzLmZyYWdtZW50ID0gKHVyaVN0cmluZy5pbmRleE9mKFwiI1wiKSAhPT0gLTEgPyBtYXRjaGVzWzhdIDogdW5kZWZpbmVkKTtcblxuXHRcdFx0Ly9maXggcG9ydCBudW1iZXJcblx0XHRcdGlmIChpc05hTihjb21wb25lbnRzLnBvcnQpKSB7XG5cdFx0XHRcdGNvbXBvbmVudHMucG9ydCA9ICh1cmlTdHJpbmcubWF0Y2goL1xcL1xcLyg/Oi58XFxuKSpcXDooPzpcXC98XFw/fFxcI3wkKS8pID8gbWF0Y2hlc1s0XSA6IHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNvbXBvbmVudHMuaG9zdCkge1xuXHRcdFx0Ly9ub3JtYWxpemUgSVAgaG9zdHNcblx0XHRcdGNvbXBvbmVudHMuaG9zdCA9IF9ub3JtYWxpemVJUHY2KF9ub3JtYWxpemVJUHY0KGNvbXBvbmVudHMuaG9zdCwgcHJvdG9jb2wpLCBwcm90b2NvbCk7XG5cdFx0fVxuXG5cdFx0Ly9kZXRlcm1pbmUgcmVmZXJlbmNlIHR5cGVcblx0XHRpZiAoY29tcG9uZW50cy5zY2hlbWUgPT09IHVuZGVmaW5lZCAmJiBjb21wb25lbnRzLnVzZXJpbmZvID09PSB1bmRlZmluZWQgJiYgY29tcG9uZW50cy5ob3N0ID09PSB1bmRlZmluZWQgJiYgY29tcG9uZW50cy5wb3J0ID09PSB1bmRlZmluZWQgJiYgIWNvbXBvbmVudHMucGF0aCAmJiBjb21wb25lbnRzLnF1ZXJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJzYW1lLWRvY3VtZW50XCI7XG5cdFx0fSBlbHNlIGlmIChjb21wb25lbnRzLnNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb21wb25lbnRzLnJlZmVyZW5jZSA9IFwicmVsYXRpdmVcIjtcblx0XHR9IGVsc2UgaWYgKGNvbXBvbmVudHMuZnJhZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29tcG9uZW50cy5yZWZlcmVuY2UgPSBcImFic29sdXRlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbXBvbmVudHMucmVmZXJlbmNlID0gXCJ1cmlcIjtcblx0XHR9XG5cblx0XHQvL2NoZWNrIGZvciByZWZlcmVuY2UgZXJyb3JzXG5cdFx0aWYgKG9wdGlvbnMucmVmZXJlbmNlICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIG9wdGlvbnMucmVmZXJlbmNlICE9PSBjb21wb25lbnRzLnJlZmVyZW5jZSkge1xuXHRcdFx0Y29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJVUkkgaXMgbm90IGEgXCIgKyBvcHRpb25zLnJlZmVyZW5jZSArIFwiIHJlZmVyZW5jZS5cIjtcblx0XHR9XG5cblx0XHQvL2ZpbmQgc2NoZW1lIGhhbmRsZXJcblx0XHRjb25zdCBzY2hlbWVIYW5kbGVyID0gU0NIRU1FU1sob3B0aW9ucy5zY2hlbWUgfHwgY29tcG9uZW50cy5zY2hlbWUgfHwgXCJcIikudG9Mb3dlckNhc2UoKV07XG5cblx0XHQvL2NoZWNrIGlmIHNjaGVtZSBjYW4ndCBoYW5kbGUgSVJJc1xuXHRcdGlmICghb3B0aW9ucy51bmljb2RlU3VwcG9ydCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIudW5pY29kZVN1cHBvcnQpKSB7XG5cdFx0XHQvL2lmIGhvc3QgY29tcG9uZW50IGlzIGEgZG9tYWluIG5hbWVcblx0XHRcdGlmIChjb21wb25lbnRzLmhvc3QgJiYgKG9wdGlvbnMuZG9tYWluSG9zdCB8fCAoc2NoZW1lSGFuZGxlciAmJiBzY2hlbWVIYW5kbGVyLmRvbWFpbkhvc3QpKSkge1xuXHRcdFx0XHQvL2NvbnZlcnQgVW5pY29kZSBJRE4gLT4gQVNDSUkgSUROXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50cy5ob3N0ID0gcHVueWNvZGUudG9BU0NJSShjb21wb25lbnRzLmhvc3QucmVwbGFjZShwcm90b2NvbC5QQ1RfRU5DT0RFRCwgcGN0RGVjQ2hhcnMpLnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50cy5lcnJvciA9IGNvbXBvbmVudHMuZXJyb3IgfHwgXCJIb3N0J3MgZG9tYWluIG5hbWUgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gQVNDSUkgdmlhIHB1bnljb2RlOiBcIiArIGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vY29udmVydCBJUkkgLT4gVVJJXG5cdFx0XHRfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50cywgVVJJX1BST1RPQ09MKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9ub3JtYWxpemUgZW5jb2RpbmdzXG5cdFx0XHRfbm9ybWFsaXplQ29tcG9uZW50RW5jb2RpbmcoY29tcG9uZW50cywgcHJvdG9jb2wpO1xuXHRcdH1cblxuXHRcdC8vcGVyZm9ybSBzY2hlbWUgc3BlY2lmaWMgcGFyc2luZ1xuXHRcdGlmIChzY2hlbWVIYW5kbGVyICYmIHNjaGVtZUhhbmRsZXIucGFyc2UpIHtcblx0XHRcdHNjaGVtZUhhbmRsZXIucGFyc2UoY29tcG9uZW50cywgb3B0aW9ucyk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiVVJJIGNhbiBub3QgYmUgcGFyc2VkLlwiO1xuXHR9XG5cblx0cmV0dXJuIGNvbXBvbmVudHM7XG59O1xuXG5mdW5jdGlvbiBfcmVjb21wb3NlQXV0aG9yaXR5KGNvbXBvbmVudHM6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zKTpzdHJpbmd8dW5kZWZpbmVkIHtcblx0Y29uc3QgcHJvdG9jb2wgPSAob3B0aW9ucy5pcmkgIT09IGZhbHNlID8gSVJJX1BST1RPQ09MIDogVVJJX1BST1RPQ09MKTtcblx0Y29uc3QgdXJpVG9rZW5zOkFycmF5PHN0cmluZz4gPSBbXTtcblxuXHRpZiAoY29tcG9uZW50cy51c2VyaW5mbyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy51c2VyaW5mbyk7XG5cdFx0dXJpVG9rZW5zLnB1c2goXCJAXCIpO1xuXHR9XG5cblx0aWYgKGNvbXBvbmVudHMuaG9zdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly9ub3JtYWxpemUgSVAgaG9zdHMsIGFkZCBicmFja2V0cyBhbmQgZXNjYXBlIHpvbmUgc2VwYXJhdG9yIGZvciBJUHY2XG5cdFx0dXJpVG9rZW5zLnB1c2goX25vcm1hbGl6ZUlQdjYoX25vcm1hbGl6ZUlQdjQoU3RyaW5nKGNvbXBvbmVudHMuaG9zdCksIHByb3RvY29sKSwgcHJvdG9jb2wpLnJlcGxhY2UocHJvdG9jb2wuSVBWNkFERFJFU1MsIChfLCAkMSwgJDIpID0+IFwiW1wiICsgJDEgKyAoJDIgPyBcIiUyNVwiICsgJDIgOiBcIlwiKSArIFwiXVwiKSk7XG5cdH1cblxuXHRpZiAodHlwZW9mIGNvbXBvbmVudHMucG9ydCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgY29tcG9uZW50cy5wb3J0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goXCI6XCIpO1xuXHRcdHVyaVRva2Vucy5wdXNoKFN0cmluZyhjb21wb25lbnRzLnBvcnQpKTtcblx0fVxuXG5cdHJldHVybiB1cmlUb2tlbnMubGVuZ3RoID8gdXJpVG9rZW5zLmpvaW4oXCJcIikgOiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBSRFMxID0gL15cXC5cXC4/XFwvLztcbmNvbnN0IFJEUzIgPSAvXlxcL1xcLihcXC98JCkvO1xuY29uc3QgUkRTMyA9IC9eXFwvXFwuXFwuKFxcL3wkKS87XG5jb25zdCBSRFM0ID0gL15cXC5cXC4/JC87XG5jb25zdCBSRFM1ID0gL15cXC8/KD86LnxcXG4pKj8oPz1cXC98JCkvO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG90U2VnbWVudHMoaW5wdXQ6c3RyaW5nKTpzdHJpbmcge1xuXHRjb25zdCBvdXRwdXQ6QXJyYXk8c3RyaW5nPiA9IFtdO1xuXG5cdHdoaWxlIChpbnB1dC5sZW5ndGgpIHtcblx0XHRpZiAoaW5wdXQubWF0Y2goUkRTMSkpIHtcblx0XHRcdGlucHV0ID0gaW5wdXQucmVwbGFjZShSRFMxLCBcIlwiKTtcblx0XHR9IGVsc2UgaWYgKGlucHV0Lm1hdGNoKFJEUzIpKSB7XG5cdFx0XHRpbnB1dCA9IGlucHV0LnJlcGxhY2UoUkRTMiwgXCIvXCIpO1xuXHRcdH0gZWxzZSBpZiAoaW5wdXQubWF0Y2goUkRTMykpIHtcblx0XHRcdGlucHV0ID0gaW5wdXQucmVwbGFjZShSRFMzLCBcIi9cIik7XG5cdFx0XHRvdXRwdXQucG9wKCk7XG5cdFx0fSBlbHNlIGlmIChpbnB1dCA9PT0gXCIuXCIgfHwgaW5wdXQgPT09IFwiLi5cIikge1xuXHRcdFx0aW5wdXQgPSBcIlwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbSA9IGlucHV0Lm1hdGNoKFJEUzUpO1xuXHRcdFx0aWYgKGltKSB7XG5cdFx0XHRcdGNvbnN0IHMgPSBpbVswXTtcblx0XHRcdFx0aW5wdXQgPSBpbnB1dC5zbGljZShzLmxlbmd0aCk7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBkb3Qgc2VnbWVudCBjb25kaXRpb25cIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG91dHB1dC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShjb21wb25lbnRzOlVSSUNvbXBvbmVudHMsIG9wdGlvbnM6VVJJT3B0aW9ucyA9IHt9KTpzdHJpbmcge1xuXHRjb25zdCBwcm90b2NvbCA9IChvcHRpb25zLmlyaSA/IElSSV9QUk9UT0NPTCA6IFVSSV9QUk9UT0NPTCk7XG5cdGNvbnN0IHVyaVRva2VuczpBcnJheTxzdHJpbmc+ID0gW107XG5cblx0Ly9maW5kIHNjaGVtZSBoYW5kbGVyXG5cdGNvbnN0IHNjaGVtZUhhbmRsZXIgPSBTQ0hFTUVTWyhvcHRpb25zLnNjaGVtZSB8fCBjb21wb25lbnRzLnNjaGVtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpXTtcblxuXHQvL3BlcmZvcm0gc2NoZW1lIHNwZWNpZmljIHNlcmlhbGl6YXRpb25cblx0aWYgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5zZXJpYWxpemUpIHNjaGVtZUhhbmRsZXIuc2VyaWFsaXplKGNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG5cdGlmIChjb21wb25lbnRzLmhvc3QpIHtcblx0XHQvL2lmIGhvc3QgY29tcG9uZW50IGlzIGFuIElQdjYgYWRkcmVzc1xuXHRcdGlmIChwcm90b2NvbC5JUFY2QUREUkVTUy50ZXN0KGNvbXBvbmVudHMuaG9zdCkpIHtcblx0XHRcdC8vVE9ETzogbm9ybWFsaXplIElQdjYgYWRkcmVzcyBhcyBwZXIgUkZDIDU5NTJcblx0XHR9XG5cblx0XHQvL2lmIGhvc3QgY29tcG9uZW50IGlzIGEgZG9tYWluIG5hbWVcblx0XHRlbHNlIGlmIChvcHRpb25zLmRvbWFpbkhvc3QgfHwgKHNjaGVtZUhhbmRsZXIgJiYgc2NoZW1lSGFuZGxlci5kb21haW5Ib3N0KSkge1xuXHRcdFx0Ly9jb252ZXJ0IElETiB2aWEgcHVueWNvZGVcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBvbmVudHMuaG9zdCA9ICghb3B0aW9ucy5pcmkgPyBwdW55Y29kZS50b0FTQ0lJKGNvbXBvbmVudHMuaG9zdC5yZXBsYWNlKHByb3RvY29sLlBDVF9FTkNPREVELCBwY3REZWNDaGFycykudG9Mb3dlckNhc2UoKSkgOiBwdW55Y29kZS50b1VuaWNvZGUoY29tcG9uZW50cy5ob3N0KSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbXBvbmVudHMuZXJyb3IgPSBjb21wb25lbnRzLmVycm9yIHx8IFwiSG9zdCdzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIFwiICsgKCFvcHRpb25zLmlyaSA/IFwiQVNDSUlcIiA6IFwiVW5pY29kZVwiKSArIFwiIHZpYSBwdW55Y29kZTogXCIgKyBlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vbm9ybWFsaXplIGVuY29kaW5nXG5cdF9ub3JtYWxpemVDb21wb25lbnRFbmNvZGluZyhjb21wb25lbnRzLCBwcm90b2NvbCk7XG5cblx0aWYgKG9wdGlvbnMucmVmZXJlbmNlICE9PSBcInN1ZmZpeFwiICYmIGNvbXBvbmVudHMuc2NoZW1lKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5zY2hlbWUpO1xuXHRcdHVyaVRva2Vucy5wdXNoKFwiOlwiKTtcblx0fVxuXG5cdGNvbnN0IGF1dGhvcml0eSA9IF9yZWNvbXBvc2VBdXRob3JpdHkoY29tcG9uZW50cywgb3B0aW9ucyk7XG5cdGlmIChhdXRob3JpdHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdGlmIChvcHRpb25zLnJlZmVyZW5jZSAhPT0gXCJzdWZmaXhcIikge1xuXHRcdFx0dXJpVG9rZW5zLnB1c2goXCIvL1wiKTtcblx0XHR9XG5cblx0XHR1cmlUb2tlbnMucHVzaChhdXRob3JpdHkpO1xuXG5cdFx0aWYgKGNvbXBvbmVudHMucGF0aCAmJiBjb21wb25lbnRzLnBhdGguY2hhckF0KDApICE9PSBcIi9cIikge1xuXHRcdFx0dXJpVG9rZW5zLnB1c2goXCIvXCIpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChjb21wb25lbnRzLnBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdGxldCBzID0gY29tcG9uZW50cy5wYXRoO1xuXG5cdFx0aWYgKCFvcHRpb25zLmFic29sdXRlUGF0aCAmJiAoIXNjaGVtZUhhbmRsZXIgfHwgIXNjaGVtZUhhbmRsZXIuYWJzb2x1dGVQYXRoKSkge1xuXHRcdFx0cyA9IHJlbW92ZURvdFNlZ21lbnRzKHMpO1xuXHRcdH1cblxuXHRcdGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cyA9IHMucmVwbGFjZSgvXlxcL1xcLy8sIFwiLyUyRlwiKTsgIC8vZG9uJ3QgYWxsb3cgdGhlIHBhdGggdG8gc3RhcnQgd2l0aCBcIi8vXCJcblx0XHR9XG5cblx0XHR1cmlUb2tlbnMucHVzaChzKTtcblx0fVxuXG5cdGlmIChjb21wb25lbnRzLnF1ZXJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR1cmlUb2tlbnMucHVzaChcIj9cIik7XG5cdFx0dXJpVG9rZW5zLnB1c2goY29tcG9uZW50cy5xdWVyeSk7XG5cdH1cblxuXHRpZiAoY29tcG9uZW50cy5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dXJpVG9rZW5zLnB1c2goXCIjXCIpO1xuXHRcdHVyaVRva2Vucy5wdXNoKGNvbXBvbmVudHMuZnJhZ21lbnQpO1xuXHR9XG5cblx0cmV0dXJuIHVyaVRva2Vucy5qb2luKFwiXCIpOyAgLy9tZXJnZSB0b2tlbnMgaW50byBhIHN0cmluZ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRzKGJhc2U6VVJJQ29tcG9uZW50cywgcmVsYXRpdmU6VVJJQ29tcG9uZW50cywgb3B0aW9uczpVUklPcHRpb25zID0ge30sIHNraXBOb3JtYWxpemF0aW9uPzpib29sZWFuKTpVUklDb21wb25lbnRzIHtcblx0Y29uc3QgdGFyZ2V0OlVSSUNvbXBvbmVudHMgPSB7fTtcblxuXHRpZiAoIXNraXBOb3JtYWxpemF0aW9uKSB7XG5cdFx0YmFzZSA9IHBhcnNlKHNlcmlhbGl6ZShiYXNlLCBvcHRpb25zKSwgb3B0aW9ucyk7ICAvL25vcm1hbGl6ZSBiYXNlIGNvbXBvbmVudHNcblx0XHRyZWxhdGl2ZSA9IHBhcnNlKHNlcmlhbGl6ZShyZWxhdGl2ZSwgb3B0aW9ucyksIG9wdGlvbnMpOyAgLy9ub3JtYWxpemUgcmVsYXRpdmUgY29tcG9uZW50c1xuXHR9XG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdGlmICghb3B0aW9ucy50b2xlcmFudCAmJiByZWxhdGl2ZS5zY2hlbWUpIHtcblx0XHR0YXJnZXQuc2NoZW1lID0gcmVsYXRpdmUuc2NoZW1lO1xuXHRcdC8vdGFyZ2V0LmF1dGhvcml0eSA9IHJlbGF0aXZlLmF1dGhvcml0eTtcblx0XHR0YXJnZXQudXNlcmluZm8gPSByZWxhdGl2ZS51c2VyaW5mbztcblx0XHR0YXJnZXQuaG9zdCA9IHJlbGF0aXZlLmhvc3Q7XG5cdFx0dGFyZ2V0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuXHRcdHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCB8fCBcIlwiKTtcblx0XHR0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcblx0fSBlbHNlIHtcblx0XHRpZiAocmVsYXRpdmUudXNlcmluZm8gIT09IHVuZGVmaW5lZCB8fCByZWxhdGl2ZS5ob3N0ICE9PSB1bmRlZmluZWQgfHwgcmVsYXRpdmUucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvL3RhcmdldC5hdXRob3JpdHkgPSByZWxhdGl2ZS5hdXRob3JpdHk7XG5cdFx0XHR0YXJnZXQudXNlcmluZm8gPSByZWxhdGl2ZS51c2VyaW5mbztcblx0XHRcdHRhcmdldC5ob3N0ID0gcmVsYXRpdmUuaG9zdDtcblx0XHRcdHRhcmdldC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcblx0XHRcdHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCB8fCBcIlwiKTtcblx0XHRcdHRhcmdldC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIXJlbGF0aXZlLnBhdGgpIHtcblx0XHRcdFx0dGFyZ2V0LnBhdGggPSBiYXNlLnBhdGg7XG5cdFx0XHRcdGlmIChyZWxhdGl2ZS5xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGFyZ2V0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFyZ2V0LnF1ZXJ5ID0gYmFzZS5xdWVyeTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHJlbGF0aXZlLnBhdGguY2hhckF0KDApID09PSBcIi9cIikge1xuXHRcdFx0XHRcdHRhcmdldC5wYXRoID0gcmVtb3ZlRG90U2VnbWVudHMocmVsYXRpdmUucGF0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKChiYXNlLnVzZXJpbmZvICE9PSB1bmRlZmluZWQgfHwgYmFzZS5ob3N0ICE9PSB1bmRlZmluZWQgfHwgYmFzZS5wb3J0ICE9PSB1bmRlZmluZWQpICYmICFiYXNlLnBhdGgpIHtcblx0XHRcdFx0XHRcdHRhcmdldC5wYXRoID0gXCIvXCIgKyByZWxhdGl2ZS5wYXRoO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIWJhc2UucGF0aCkge1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnBhdGggPSByZWxhdGl2ZS5wYXRoO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0YXJnZXQucGF0aCA9IGJhc2UucGF0aC5zbGljZSgwLCBiYXNlLnBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgKyByZWxhdGl2ZS5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0YXJnZXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHRhcmdldC5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0YXJnZXQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcblx0XHRcdH1cblx0XHRcdC8vdGFyZ2V0LmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5O1xuXHRcdFx0dGFyZ2V0LnVzZXJpbmZvID0gYmFzZS51c2VyaW5mbztcblx0XHRcdHRhcmdldC5ob3N0ID0gYmFzZS5ob3N0O1xuXHRcdFx0dGFyZ2V0LnBvcnQgPSBiYXNlLnBvcnQ7XG5cdFx0fVxuXHRcdHRhcmdldC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcblx0fVxuXG5cdHRhcmdldC5mcmFnbWVudCA9IHJlbGF0aXZlLmZyYWdtZW50O1xuXG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShiYXNlVVJJOnN0cmluZywgcmVsYXRpdmVVUkk6c3RyaW5nLCBvcHRpb25zPzpVUklPcHRpb25zKTpzdHJpbmcge1xuXHRjb25zdCBzY2hlbWVsZXNzT3B0aW9ucyA9IGFzc2lnbih7IHNjaGVtZSA6ICdudWxsJyB9LCBvcHRpb25zKTtcblx0cmV0dXJuIHNlcmlhbGl6ZShyZXNvbHZlQ29tcG9uZW50cyhwYXJzZShiYXNlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHBhcnNlKHJlbGF0aXZlVVJJLCBzY2hlbWVsZXNzT3B0aW9ucyksIHNjaGVtZWxlc3NPcHRpb25zLCB0cnVlKSwgc2NoZW1lbGVzc09wdGlvbnMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmk6c3RyaW5nLCBvcHRpb25zPzpVUklPcHRpb25zKTpzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHVyaTpVUklDb21wb25lbnRzLCBvcHRpb25zPzpVUklPcHRpb25zKTpVUklDb21wb25lbnRzO1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmk6YW55LCBvcHRpb25zPzpVUklPcHRpb25zKTphbnkge1xuXHRpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHVyaSA9IHNlcmlhbGl6ZShwYXJzZSh1cmksIG9wdGlvbnMpLCBvcHRpb25zKTtcblx0fSBlbHNlIGlmICh0eXBlT2YodXJpKSA9PT0gXCJvYmplY3RcIikge1xuXHRcdHVyaSA9IHBhcnNlKHNlcmlhbGl6ZSg8VVJJQ29tcG9uZW50cz51cmksIG9wdGlvbnMpLCBvcHRpb25zKTtcblx0fVxuXG5cdHJldHVybiB1cmk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWwodXJpQTpzdHJpbmcsIHVyaUI6c3RyaW5nLCBvcHRpb25zPzogVVJJT3B0aW9ucyk6Ym9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbCh1cmlBOlVSSUNvbXBvbmVudHMsIHVyaUI6VVJJQ29tcG9uZW50cywgb3B0aW9ucz86VVJJT3B0aW9ucyk6Ym9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbCh1cmlBOmFueSwgdXJpQjphbnksIG9wdGlvbnM/OlVSSU9wdGlvbnMpOmJvb2xlYW4ge1xuXHRpZiAodHlwZW9mIHVyaUEgPT09IFwic3RyaW5nXCIpIHtcblx0XHR1cmlBID0gc2VyaWFsaXplKHBhcnNlKHVyaUEsIG9wdGlvbnMpLCBvcHRpb25zKTtcblx0fSBlbHNlIGlmICh0eXBlT2YodXJpQSkgPT09IFwib2JqZWN0XCIpIHtcblx0XHR1cmlBID0gc2VyaWFsaXplKDxVUklDb21wb25lbnRzPnVyaUEsIG9wdGlvbnMpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB1cmlCID09PSBcInN0cmluZ1wiKSB7XG5cdFx0dXJpQiA9IHNlcmlhbGl6ZShwYXJzZSh1cmlCLCBvcHRpb25zKSwgb3B0aW9ucyk7XG5cdH0gZWxzZSBpZiAodHlwZU9mKHVyaUIpID09PSBcIm9iamVjdFwiKSB7XG5cdFx0dXJpQiA9IHNlcmlhbGl6ZSg8VVJJQ29tcG9uZW50cz51cmlCLCBvcHRpb25zKTtcblx0fVxuXG5cdHJldHVybiB1cmlBID09PSB1cmlCO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUNvbXBvbmVudChzdHI6c3RyaW5nLCBvcHRpb25zPzpVUklPcHRpb25zKTpzdHJpbmcge1xuXHRyZXR1cm4gc3RyICYmIHN0ci50b1N0cmluZygpLnJlcGxhY2UoKCFvcHRpb25zIHx8ICFvcHRpb25zLmlyaSA/IFVSSV9QUk9UT0NPTC5FU0NBUEUgOiBJUklfUFJPVE9DT0wuRVNDQVBFKSwgcGN0RW5jQ2hhcik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVDb21wb25lbnQoc3RyOnN0cmluZywgb3B0aW9ucz86VVJJT3B0aW9ucyk6c3RyaW5nIHtcblx0cmV0dXJuIHN0ciAmJiBzdHIudG9TdHJpbmcoKS5yZXBsYWNlKCghb3B0aW9ucyB8fCAhb3B0aW9ucy5pcmkgPyBVUklfUFJPVE9DT0wuUENUX0VOQ09ERUQgOiBJUklfUFJPVE9DT0wuUENUX0VOQ09ERUQpLCBwY3REZWNDaGFycyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuY29uc3QgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG4vKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5jb25zdCBiYXNlID0gMzY7XG5jb25zdCB0TWluID0gMTtcbmNvbnN0IHRNYXggPSAyNjtcbmNvbnN0IHNrZXcgPSAzODtcbmNvbnN0IGRhbXAgPSA3MDA7XG5jb25zdCBpbml0aWFsQmlhcyA9IDcyO1xuY29uc3QgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbmNvbnN0IGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xuXG4vKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuY29uc3QgcmVnZXhQdW55Y29kZSA9IC9eeG4tLS87XG5jb25zdCByZWdleE5vbkFTQ0lJID0gL1teXFwwLVxceDdFXS87IC8vIG5vbi1BU0NJSSBjaGFyc1xuY29uc3QgcmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZzsgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG4vKiogRXJyb3IgbWVzc2FnZXMgKi9cbmNvbnN0IGVycm9ycyA9IHtcblx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0J25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcblx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcbn07XG5cbi8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cbmNvbnN0IGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbjtcbmNvbnN0IGZsb29yID0gTWF0aC5mbG9vcjtcbmNvbnN0IHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdHRocm93IG5ldyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG59XG5cbi8qKlxuICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuICogaXRlbS5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRjb25zdCByZXN1bHQgPSBbXTtcblx0bGV0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0d2hpbGUgKGxlbmd0aC0tKSB7XG5cdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuICogYWRkcmVzc2VzLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcbiAqIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcblx0Y29uc3QgcGFydHMgPSBzdHJpbmcuc3BsaXQoJ0AnKTtcblx0bGV0IHJlc3VsdCA9ICcnO1xuXHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdHN0cmluZyA9IHBhcnRzWzFdO1xuXHR9XG5cdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0Y29uc3QgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG5cdGNvbnN0IGVuY29kZWQgPSBtYXAobGFiZWxzLCBmbikuam9pbignLicpO1xuXHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0Y29uc3Qgb3V0cHV0ID0gW107XG5cdGxldCBjb3VudGVyID0gMDtcblx0Y29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gSXQncyBhIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlci5cblx0XHRcdGNvbnN0IGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuXHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcblx0XHRcdFx0Ly8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZW5jb2RlXG4gKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuICovXG5jb25zdCB1Y3MyZW5jb2RlID0gYXJyYXkgPT4gU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uYXJyYXkpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbmNvbnN0IGJhc2ljVG9EaWdpdCA9IGZ1bmN0aW9uKGNvZGVQb2ludCkge1xuXHRpZiAoY29kZVBvaW50IC0gMHgzMCA8IDB4MEEpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHgxNjtcblx0fVxuXHRpZiAoY29kZVBvaW50IC0gMHg0MSA8IDB4MUEpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHg0MTtcblx0fVxuXHRpZiAoY29kZVBvaW50IC0gMHg2MSA8IDB4MUEpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHg2MTtcblx0fVxuXHRyZXR1cm4gYmFzZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG4gKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG4gKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cbiAqL1xuY29uc3QgZGlnaXRUb0Jhc2ljID0gZnVuY3Rpb24oZGlnaXQsIGZsYWcpIHtcblx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0Ly8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG5cdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG59O1xuXG4vKipcbiAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgYWRhcHQgPSBmdW5jdGlvbihkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0bGV0IGsgPSAwO1xuXHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdGZvciAoLyogbm8gaW5pdGlhbGl6YXRpb24gKi87IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG5cdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHR9XG5cdHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuICogc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICovXG5jb25zdCBkZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHQvLyBEb24ndCB1c2UgVUNTLTIuXG5cdGNvbnN0IG91dHB1dCA9IFtdO1xuXHRjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0bGV0IGkgPSAwO1xuXHRsZXQgbiA9IGluaXRpYWxOO1xuXHRsZXQgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuXHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRsZXQgYmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0YmFzaWMgPSAwO1xuXHR9XG5cblx0Zm9yIChsZXQgaiA9IDA7IGogPCBiYXNpYzsgKytqKSB7XG5cdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0ZXJyb3IoJ25vdC1iYXNpYycpO1xuXHRcdH1cblx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0fVxuXG5cdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRmb3IgKGxldCBpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHQvLyBEZWNvZGUgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBpbnRvIGBkZWx0YWAsXG5cdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdC8vIHZhbHVlIGF0IHRoZSBlbmQgdG8gb2J0YWluIGBkZWx0YWAuXG5cdFx0bGV0IG9sZGkgPSBpO1xuXHRcdGZvciAobGV0IHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdGNvbnN0IHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHR9XG5cblx0XHRjb25zdCBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHR9XG5cblx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdGkgJT0gb3V0O1xuXG5cdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dC5cblx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0fVxuXG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5vdXRwdXQpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICovXG5jb25zdCBlbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRjb25zdCBvdXRwdXQgPSBbXTtcblxuXHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBhbiBhcnJheSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLlxuXHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdC8vIENhY2hlIHRoZSBsZW5ndGguXG5cdGxldCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuXHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZS5cblx0bGV0IG4gPSBpbml0aWFsTjtcblx0bGV0IGRlbHRhID0gMDtcblx0bGV0IGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzLlxuXHRmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiBpbnB1dCkge1xuXHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0fVxuXHR9XG5cblx0bGV0IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblx0bGV0IGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7XG5cblx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyB3aXRoIGEgZGVsaW1pdGVyIHVubGVzcyBpdCdzIGVtcHR5LlxuXHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHR9XG5cblx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0bGV0IG0gPSBtYXhJbnQ7XG5cdFx0Zm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuXHRcdGNvbnN0IGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0fVxuXG5cdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRuID0gbTtcblxuXHRcdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG5cdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuXHRcdFx0XHRsZXQgcSA9IGRlbHRhO1xuXHRcdFx0XHRmb3IgKGxldCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRjb25zdCB0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcblx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0Y29uc3QgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdG91dHB1dC5wdXNoKFxuXHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0YmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCsrZGVsdGE7XG5cdFx0KytuO1xuXG5cdH1cblx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG4gKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuICogY29udmVydCB0byBVbmljb2RlLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG4gKiBzdHJpbmcuXG4gKi9cbmNvbnN0IHRvVW5pY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG4gKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cbiAqIEFTQ0lJLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuICogVW5pY29kZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG4gKiBlbWFpbCBhZGRyZXNzLlxuICovXG5jb25zdCB0b0FTQ0lJID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuY29uc3QgcHVueWNvZGUgPSB7XG5cdC8qKlxuXHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAdHlwZSBTdHJpbmdcblx0ICovXG5cdCd2ZXJzaW9uJzogJzIuMS4wJyxcblx0LyoqXG5cdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHQndWNzMic6IHtcblx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHR9LFxuXHQnZGVjb2RlJzogZGVjb2RlLFxuXHQnZW5jb2RlJzogZW5jb2RlLFxuXHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHB1bnljb2RlO1xuIiwgImltcG9ydCB7IFVSSVJlZ0V4cHMgfSBmcm9tIFwiLi91cmlcIjtcbmltcG9ydCB7IGJ1aWxkRXhwcyB9IGZyb20gXCIuL3JlZ2V4cHMtdXJpXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGJ1aWxkRXhwcyh0cnVlKTtcbiIsICJpbXBvcnQgeyBVUklSZWdFeHBzIH0gZnJvbSBcIi4vdXJpXCI7XG5pbXBvcnQgeyBtZXJnZSwgc3ViZXhwIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBzKGlzSVJJOmJvb2xlYW4pOlVSSVJlZ0V4cHMge1xuXHRjb25zdFxuXHRcdEFMUEhBJCQgPSBcIltBLVphLXpdXCIsXG5cdFx0Q1IkID0gXCJbXFxcXHgwRF1cIixcblx0XHRESUdJVCQkID0gXCJbMC05XVwiLFxuXHRcdERRVU9URSQkID0gXCJbXFxcXHgyMl1cIixcblx0XHRIRVhESUckJCA9IG1lcmdlKERJR0lUJCQsIFwiW0EtRmEtZl1cIiksICAvL2Nhc2UtaW5zZW5zaXRpdmVcblx0XHRMRiQkID0gXCJbXFxcXHgwQV1cIixcblx0XHRTUCQkID0gXCJbXFxcXHgyMF1cIixcblx0XHRQQ1RfRU5DT0RFRCQgPSBzdWJleHAoc3ViZXhwKFwiJVtFRmVmXVwiICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIlWzg5QS1GYS1mXVwiICsgSEVYRElHJCQgKyBcIiVcIiArIEhFWERJRyQkICsgSEVYRElHJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIlXCIgKyBIRVhESUckJCArIEhFWERJRyQkKSksICAvL2V4cGFuZGVkXG5cdFx0R0VOX0RFTElNUyQkID0gXCJbXFxcXDpcXFxcL1xcXFw/XFxcXCNcXFxcW1xcXFxdXFxcXEBdXCIsXG5cdFx0U1VCX0RFTElNUyQkID0gXCJbXFxcXCFcXFxcJFxcXFwmXFxcXCdcXFxcKFxcXFwpXFxcXCpcXFxcK1xcXFwsXFxcXDtcXFxcPV1cIixcblx0XHRSRVNFUlZFRCQkID0gbWVyZ2UoR0VOX0RFTElNUyQkLCBTVUJfREVMSU1TJCQpLFxuXHRcdFVDU0NIQVIkJCA9IGlzSVJJID8gXCJbXFxcXHhBMC1cXFxcdTIwMERcXFxcdTIwMTAtXFxcXHUyMDI5XFxcXHUyMDJGLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkVGXVwiIDogXCJbXVwiLCAgLy9zdWJzZXQsIGV4Y2x1ZGVzIGJpZGkgY29udHJvbCBjaGFyYWN0ZXJzXG5cdFx0SVBSSVZBVEUkJCA9IGlzSVJJID8gXCJbXFxcXHVFMDAwLVxcXFx1RjhGRl1cIiA6IFwiW11cIiwgIC8vc3Vic2V0XG5cdFx0VU5SRVNFUlZFRCQkID0gbWVyZ2UoQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXC1cXFxcLlxcXFxfXFxcXH5dXCIsIFVDU0NIQVIkJCksXG5cdFx0U0NIRU1FJCA9IHN1YmV4cChBTFBIQSQkICsgbWVyZ2UoQUxQSEEkJCwgRElHSVQkJCwgXCJbXFxcXCtcXFxcLVxcXFwuXVwiKSArIFwiKlwiKSxcblx0XHRVU0VSSU5GTyQgPSBzdWJleHAoc3ViZXhwKFBDVF9FTkNPREVEJCArIFwifFwiICsgbWVyZ2UoVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XVwiKSkgKyBcIipcIiksXG5cdFx0REVDX09DVEVUJCA9IHN1YmV4cChzdWJleHAoXCIyNVswLTVdXCIpICsgXCJ8XCIgKyBzdWJleHAoXCIyWzAtNF1cIiArIERJR0lUJCQpICsgXCJ8XCIgKyBzdWJleHAoXCIxXCIgKyBESUdJVCQkICsgRElHSVQkJCkgKyBcInxcIiArIHN1YmV4cChcIlsxLTldXCIgKyBESUdJVCQkKSArIFwifFwiICsgRElHSVQkJCksXG5cdFx0REVDX09DVEVUX1JFTEFYRUQkID0gc3ViZXhwKHN1YmV4cChcIjI1WzAtNV1cIikgKyBcInxcIiArIHN1YmV4cChcIjJbMC00XVwiICsgRElHSVQkJCkgKyBcInxcIiArIHN1YmV4cChcIjFcIiArIERJR0lUJCQgKyBESUdJVCQkKSArIFwifFwiICsgc3ViZXhwKFwiMD9bMS05XVwiICsgRElHSVQkJCkgKyBcInwwPzA/XCIgKyBESUdJVCQkKSwgIC8vcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG5cdFx0SVBWNEFERFJFU1MkID0gc3ViZXhwKERFQ19PQ1RFVF9SRUxBWEVEJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVF9SRUxBWEVEJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVF9SRUxBWEVEJCArIFwiXFxcXC5cIiArIERFQ19PQ1RFVF9SRUxBWEVEJCksXG5cdFx0SDE2JCA9IHN1YmV4cChIRVhESUckJCArIFwiezEsNH1cIiksXG5cdFx0TFMzMiQgPSBzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIgKyBIMTYkKSArIFwifFwiICsgSVBWNEFERFJFU1MkKSxcblx0XHRJUFY2QUREUkVTUzEkID0gc3ViZXhwKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezZ9XCIgKyBMUzMyJCksIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgNiggaDE2IFwiOlwiICkgbHMzMlxuXHRcdElQVjZBRERSRVNTMiQgPSBzdWJleHAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxcXDpcXFxcOlwiICsgc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7NX1cIiArIExTMzIkKSwgLy8gICAgICAgICAgICAgICAgICAgICAgXCI6OlwiIDUoIGgxNiBcIjpcIiApIGxzMzJcblx0XHRJUFY2QUREUkVTUzMkID0gc3ViZXhwKHN1YmV4cCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiArIHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezR9XCIgKyBMUzMyJCksIC8vWyAgICAgICAgICAgICAgIGgxNiBdIFwiOjpcIiA0KCBoMTYgXCI6XCIgKSBsczMyXG5cdFx0SVBWNkFERFJFU1M0JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwxfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInszfVwiICsgTFMzMiQpLCAvL1sgKjEoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAzKCBoMTYgXCI6XCIgKSBsczMyXG5cdFx0SVBWNkFERFJFU1M1JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwyfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyBzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInsyfVwiICsgTFMzMiQpLCAvL1sgKjIoIGgxNiBcIjpcIiApIGgxNiBdIFwiOjpcIiAyKCBoMTYgXCI6XCIgKSBsczMyXG5cdFx0SVBWNkFERFJFU1M2JCA9IHN1YmV4cChzdWJleHAoc3ViZXhwKEgxNiQgKyBcIlxcXFw6XCIpICsgXCJ7MCwzfVwiICsgSDE2JCkgKyBcIj9cXFxcOlxcXFw6XCIgKyAgICAgICAgSDE2JCArIFwiXFxcXDpcIiAgICAgICAgICArIExTMzIkKSwgLy9bICozKCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCIgICAgaDE2IFwiOlwiICAgbHMzMlxuXHRcdElQVjZBRERSRVNTNyQgPSBzdWJleHAoc3ViZXhwKHN1YmV4cChIMTYkICsgXCJcXFxcOlwiKSArIFwiezAsNH1cIiArIEgxNiQpICsgXCI/XFxcXDpcXFxcOlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExTMzIkKSwgLy9bICo0KCBoMTYgXCI6XCIgKSBoMTYgXSBcIjo6XCIgICAgICAgICAgICAgIGxzMzJcblx0XHRJUFY2QUREUkVTUzgkID0gc3ViZXhwKHN1YmV4cChzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInswLDV9XCIgKyBIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBIMTYkICksIC8vWyAqNSggaDE2IFwiOlwiICkgaDE2IF0gXCI6OlwiICAgICAgICAgICAgICBoMTZcblx0XHRJUFY2QUREUkVTUzkkID0gc3ViZXhwKHN1YmV4cChzdWJleHAoSDE2JCArIFwiXFxcXDpcIikgKyBcInswLDZ9XCIgKyBIMTYkKSArIFwiP1xcXFw6XFxcXDpcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIC8vWyAqNiggaDE2IFwiOlwiICkgaDE2IF0gXCI6OlwiXG5cdFx0SVBWNkFERFJFU1MkID0gc3ViZXhwKFtJUFY2QUREUkVTUzEkLCBJUFY2QUREUkVTUzIkLCBJUFY2QUREUkVTUzMkLCBJUFY2QUREUkVTUzQkLCBJUFY2QUREUkVTUzUkLCBJUFY2QUREUkVTUzYkLCBJUFY2QUREUkVTUzckLCBJUFY2QUREUkVTUzgkLCBJUFY2QUREUkVTUzkkXS5qb2luKFwifFwiKSksXG5cdFx0Wk9ORUlEJCA9IHN1YmV4cChzdWJleHAoVU5SRVNFUlZFRCQkICsgXCJ8XCIgKyBQQ1RfRU5DT0RFRCQpICsgXCIrXCIpLCAgLy9SRkMgNjg3NFxuXHRcdElQVjZBRERSWiQgPSBzdWJleHAoSVBWNkFERFJFU1MkICsgXCJcXFxcJTI1XCIgKyBaT05FSUQkKSwgIC8vUkZDIDY4NzRcblx0XHRJUFY2QUREUlpfUkVMQVhFRCQgPSBzdWJleHAoSVBWNkFERFJFU1MkICsgc3ViZXhwKFwiXFxcXCUyNXxcXFxcJSg/IVwiICsgSEVYRElHJCQgKyBcInsyfSlcIikgKyBaT05FSUQkKSwgIC8vUkZDIDY4NzQsIHdpdGggcmVsYXhlZCBwYXJzaW5nIHJ1bGVzXG5cdFx0SVBWRlVUVVJFJCA9IHN1YmV4cChcIlt2Vl1cIiArIEhFWERJRyQkICsgXCIrXFxcXC5cIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOl1cIikgKyBcIitcIiksXG5cdFx0SVBfTElURVJBTCQgPSBzdWJleHAoXCJcXFxcW1wiICsgc3ViZXhwKElQVjZBRERSWl9SRUxBWEVEJCArIFwifFwiICsgSVBWNkFERFJFU1MkICsgXCJ8XCIgKyBJUFZGVVRVUkUkKSArIFwiXFxcXF1cIiksICAvL1JGQyA2ODc0XG5cdFx0UkVHX05BTUUkID0gc3ViZXhwKHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkKSkgKyBcIipcIiksXG5cdFx0SE9TVCQgPSBzdWJleHAoSVBfTElURVJBTCQgKyBcInxcIiArIElQVjRBRERSRVNTJCArIFwiKD8hXCIgKyBSRUdfTkFNRSQgKyBcIilcIiArIFwifFwiICsgUkVHX05BTUUkKSxcblx0XHRQT1JUJCA9IHN1YmV4cChESUdJVCQkICsgXCIqXCIpLFxuXHRcdEFVVEhPUklUWSQgPSBzdWJleHAoc3ViZXhwKFVTRVJJTkZPJCArIFwiQFwiKSArIFwiP1wiICsgSE9TVCQgKyBzdWJleHAoXCJcXFxcOlwiICsgUE9SVCQpICsgXCI/XCIpLFxuXHRcdFBDSEFSJCA9IHN1YmV4cChQQ1RfRU5DT0RFRCQgKyBcInxcIiArIG1lcmdlKFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOlxcXFxAXVwiKSksXG5cdFx0U0VHTUVOVCQgPSBzdWJleHAoUENIQVIkICsgXCIqXCIpLFxuXHRcdFNFR01FTlRfTlokID0gc3ViZXhwKFBDSEFSJCArIFwiK1wiKSxcblx0XHRTRUdNRU5UX05aX05DJCA9IHN1YmV4cChzdWJleHAoUENUX0VOQ09ERUQkICsgXCJ8XCIgKyBtZXJnZShVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCwgXCJbXFxcXEBdXCIpKSArIFwiK1wiKSxcblx0XHRQQVRIX0FCRU1QVFkkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXCIgKyBTRUdNRU5UJCkgKyBcIipcIiksXG5cdFx0UEFUSF9BQlNPTFVURSQgPSBzdWJleHAoXCJcXFxcL1wiICsgc3ViZXhwKFNFR01FTlRfTlokICsgUEFUSF9BQkVNUFRZJCkgKyBcIj9cIiksICAvL3NpbXBsaWZpZWRcblx0XHRQQVRIX05PU0NIRU1FJCA9IHN1YmV4cChTRUdNRU5UX05aX05DJCArIFBBVEhfQUJFTVBUWSQpLCAgLy9zaW1wbGlmaWVkXG5cdFx0UEFUSF9ST09UTEVTUyQgPSBzdWJleHAoU0VHTUVOVF9OWiQgKyBQQVRIX0FCRU1QVFkkKSwgIC8vc2ltcGxpZmllZFxuXHRcdFBBVEhfRU1QVFkkID0gXCIoPyFcIiArIFBDSEFSJCArIFwiKVwiLFxuXHRcdFBBVEgkID0gc3ViZXhwKFBBVEhfQUJFTVBUWSQgKyBcInxcIiArIFBBVEhfQUJTT0xVVEUkICsgXCJ8XCIgKyBQQVRIX05PU0NIRU1FJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSxcblx0XHRRVUVSWSQgPSBzdWJleHAoc3ViZXhwKFBDSEFSJCArIFwifFwiICsgbWVyZ2UoXCJbXFxcXC9cXFxcP11cIiwgSVBSSVZBVEUkJCkpICsgXCIqXCIpLFxuXHRcdEZSQUdNRU5UJCA9IHN1YmV4cChzdWJleHAoUENIQVIkICsgXCJ8W1xcXFwvXFxcXD9dXCIpICsgXCIqXCIpLFxuXHRcdEhJRVJfUEFSVCQgPSBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcL1wiICsgQVVUSE9SSVRZJCArIFBBVEhfQUJFTVBUWSQpICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkKSxcblx0XHRVUkkkID0gc3ViZXhwKFNDSEVNRSQgKyBcIlxcXFw6XCIgKyBISUVSX1BBUlQkICsgc3ViZXhwKFwiXFxcXD9cIiArIFFVRVJZJCkgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjXCIgKyBGUkFHTUVOVCQpICsgXCI/XCIpLFxuXHRcdFJFTEFUSVZFX1BBUlQkID0gc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC9cIiArIEFVVEhPUklUWSQgKyBQQVRIX0FCRU1QVFkkKSArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCksXG5cdFx0UkVMQVRJVkUkID0gc3ViZXhwKFJFTEFUSVZFX1BBUlQkICsgc3ViZXhwKFwiXFxcXD9cIiArIFFVRVJZJCkgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjXCIgKyBGUkFHTUVOVCQpICsgXCI/XCIpLFxuXHRcdFVSSV9SRUZFUkVOQ0UkID0gc3ViZXhwKFVSSSQgKyBcInxcIiArIFJFTEFUSVZFJCksXG5cdFx0QUJTT0xVVEVfVVJJJCA9IHN1YmV4cChTQ0hFTUUkICsgXCJcXFxcOlwiICsgSElFUl9QQVJUJCArIHN1YmV4cChcIlxcXFw/XCIgKyBRVUVSWSQpICsgXCI/XCIpLFxuXG5cdFx0R0VORVJJQ19SRUYkID0gXCJeKFwiICsgU0NIRU1FJCArIFwiKVxcXFw6XCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcLyhcIiArIHN1YmV4cChcIihcIiArIFVTRVJJTkZPJCArIFwiKUBcIikgKyBcIj8oXCIgKyBIT1NUJCArIFwiKVwiICsgc3ViZXhwKFwiXFxcXDooXCIgKyBQT1JUJCArIFwiKVwiKSArIFwiPylcIikgKyBcIj8oXCIgKyBQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkICsgXCIpXCIpICsgc3ViZXhwKFwiXFxcXD8oXCIgKyBRVUVSWSQgKyBcIilcIikgKyBcIj9cIiArIHN1YmV4cChcIlxcXFwjKFwiICsgRlJBR01FTlQkICsgXCIpXCIpICsgXCI/JFwiLFxuXHRcdFJFTEFUSVZFX1JFRiQgPSBcIl4oKXswfVwiICsgc3ViZXhwKHN1YmV4cChcIlxcXFwvXFxcXC8oXCIgKyBzdWJleHAoXCIoXCIgKyBVU0VSSU5GTyQgKyBcIilAXCIpICsgXCI/KFwiICsgSE9TVCQgKyBcIilcIiArIHN1YmV4cChcIlxcXFw6KFwiICsgUE9SVCQgKyBcIilcIikgKyBcIj8pXCIpICsgXCI/KFwiICsgUEFUSF9BQkVNUFRZJCArIFwifFwiICsgUEFUSF9BQlNPTFVURSQgKyBcInxcIiArIFBBVEhfTk9TQ0hFTUUkICsgXCJ8XCIgKyBQQVRIX0VNUFRZJCArIFwiKVwiKSArIHN1YmV4cChcIlxcXFw/KFwiICsgUVVFUlkkICsgXCIpXCIpICsgXCI/XCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIixcblx0XHRBQlNPTFVURV9SRUYkID0gXCJeKFwiICsgU0NIRU1FJCArIFwiKVxcXFw6XCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXC9cXFxcLyhcIiArIHN1YmV4cChcIihcIiArIFVTRVJJTkZPJCArIFwiKUBcIikgKyBcIj8oXCIgKyBIT1NUJCArIFwiKVwiICsgc3ViZXhwKFwiXFxcXDooXCIgKyBQT1JUJCArIFwiKVwiKSArIFwiPylcIikgKyBcIj8oXCIgKyBQQVRIX0FCRU1QVFkkICsgXCJ8XCIgKyBQQVRIX0FCU09MVVRFJCArIFwifFwiICsgUEFUSF9ST09UTEVTUyQgKyBcInxcIiArIFBBVEhfRU1QVFkkICsgXCIpXCIpICsgc3ViZXhwKFwiXFxcXD8oXCIgKyBRVUVSWSQgKyBcIilcIikgKyBcIj8kXCIsXG5cdFx0U0FNRURPQ19SRUYkID0gXCJeXCIgKyBzdWJleHAoXCJcXFxcIyhcIiArIEZSQUdNRU5UJCArIFwiKVwiKSArIFwiPyRcIixcblx0XHRBVVRIT1JJVFlfUkVGJCA9IFwiXlwiICsgc3ViZXhwKFwiKFwiICsgVVNFUklORk8kICsgXCIpQFwiKSArIFwiPyhcIiArIEhPU1QkICsgXCIpXCIgKyBzdWJleHAoXCJcXFxcOihcIiArIFBPUlQkICsgXCIpXCIpICsgXCI/JFwiXG5cdDtcblxuXHRyZXR1cm4ge1xuXHRcdE5PVF9TQ0hFTUUgOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15dXCIsIEFMUEhBJCQsIERJR0lUJCQsIFwiW1xcXFwrXFxcXC1cXFxcLl1cIiksIFwiZ1wiKSxcblx0XHROT1RfVVNFUklORk8gOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJVxcXFw6XVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcblx0XHROT1RfSE9TVCA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXFtcXFxcXVxcXFw6XVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcblx0XHROT1RfUEFUSCA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXC9cXFxcOlxcXFxAXVwiLCBVTlJFU0VSVkVEJCQsIFNVQl9ERUxJTVMkJCksIFwiZ1wiKSxcblx0XHROT1RfUEFUSF9OT1NDSEVNRSA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXlxcXFwlXFxcXC9cXFxcQF1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXG5cdFx0Tk9UX1FVRVJZIDogbmV3IFJlZ0V4cChtZXJnZShcIlteXFxcXCVdXCIsIFVOUkVTRVJWRUQkJCwgU1VCX0RFTElNUyQkLCBcIltcXFxcOlxcXFxAXFxcXC9cXFxcP11cIiwgSVBSSVZBVEUkJCksIFwiZ1wiKSxcblx0XHROT1RfRlJBR01FTlQgOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQsIFwiW1xcXFw6XFxcXEBcXFxcL1xcXFw/XVwiKSwgXCJnXCIpLFxuXHRcdEVTQ0FQRSA6IG5ldyBSZWdFeHAobWVyZ2UoXCJbXl1cIiwgVU5SRVNFUlZFRCQkLCBTVUJfREVMSU1TJCQpLCBcImdcIiksXG5cdFx0VU5SRVNFUlZFRCA6IG5ldyBSZWdFeHAoVU5SRVNFUlZFRCQkLCBcImdcIiksXG5cdFx0T1RIRVJfQ0hBUlMgOiBuZXcgUmVnRXhwKG1lcmdlKFwiW15cXFxcJV1cIiwgVU5SRVNFUlZFRCQkLCBSRVNFUlZFRCQkKSwgXCJnXCIpLFxuXHRcdFBDVF9FTkNPREVEIDogbmV3IFJlZ0V4cChQQ1RfRU5DT0RFRCQsIFwiZ1wiKSxcblx0XHRJUFY0QUREUkVTUyA6IG5ldyBSZWdFeHAoXCJeKFwiICsgSVBWNEFERFJFU1MkICsgXCIpJFwiKSxcblx0XHRJUFY2QUREUkVTUyA6IG5ldyBSZWdFeHAoXCJeXFxcXFs/KFwiICsgSVBWNkFERFJFU1MkICsgXCIpXCIgKyBzdWJleHAoc3ViZXhwKFwiXFxcXCUyNXxcXFxcJSg/IVwiICsgSEVYRElHJCQgKyBcInsyfSlcIikgKyBcIihcIiArIFpPTkVJRCQgKyBcIilcIikgKyBcIj9cXFxcXT8kXCIpICAvL1JGQyA2ODc0LCB3aXRoIHJlbGF4ZWQgcGFyc2luZyBydWxlc1xuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBidWlsZEV4cHMoZmFsc2UpO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBtZXJnZSguLi5zZXRzOkFycmF5PHN0cmluZz4pOnN0cmluZyB7XG5cdGlmIChzZXRzLmxlbmd0aCA+IDEpIHtcblx0XHRzZXRzWzBdID0gc2V0c1swXS5zbGljZSgwLCAtMSk7XG5cdFx0Y29uc3QgeGwgPSBzZXRzLmxlbmd0aCAtIDE7XG5cdFx0Zm9yIChsZXQgeCA9IDE7IHggPCB4bDsgKyt4KSB7XG5cdFx0XHRzZXRzW3hdID0gc2V0c1t4XS5zbGljZSgxLCAtMSk7XG5cdFx0fVxuXHRcdHNldHNbeGxdID0gc2V0c1t4bF0uc2xpY2UoMSk7XG5cdFx0cmV0dXJuIHNldHMuam9pbignJyk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHNldHNbMF07XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YmV4cChzdHI6c3RyaW5nKTpzdHJpbmcge1xuXHRyZXR1cm4gXCIoPzpcIiArIHN0ciArIFwiKVwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKG86YW55KTpzdHJpbmcge1xuXHRyZXR1cm4gbyA9PT0gdW5kZWZpbmVkID8gXCJ1bmRlZmluZWRcIiA6IChvID09PSBudWxsID8gXCJudWxsXCIgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc3BsaXQoXCIgXCIpLnBvcCgpLnNwbGl0KFwiXVwiKS5zaGlmdCgpLnRvTG93ZXJDYXNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9VcHBlckNhc2Uoc3RyOnN0cmluZyk6c3RyaW5nIHtcblx0cmV0dXJuIHN0ci50b1VwcGVyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheShvYmo6YW55KTpBcnJheTxhbnk+IHtcblx0cmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCA/IChvYmogaW5zdGFuY2VvZiBBcnJheSA/IG9iaiA6ICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gXCJudW1iZXJcIiB8fCBvYmouc3BsaXQgfHwgb2JqLnNldEludGVydmFsIHx8IG9iai5jYWxsID8gW29ial0gOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopKSkgOiBbXTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKHRhcmdldDogb2JqZWN0LCBzb3VyY2U6IGFueSk6IGFueSB7XG5cdGNvbnN0IG9iaiA9IHRhcmdldCBhcyBhbnk7XG5cdGlmIChzb3VyY2UpIHtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcblx0XHRcdG9ialtrZXldID0gc291cmNlW2tleV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvYmo7XG59IiwgIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgYm90aCBOYU4sIGZhbHNlIG90aGVyd2lzZVxuICByZXR1cm4gYSE9PWEgJiYgYiE9PWI7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLy8gaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmdcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXN0aWVqcy9wdW55Y29kZS5qcyAtIHB1bnljb2RlLnVjczIuZGVjb2RlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVjczJsZW5ndGgoc3RyKSB7XG4gIHZhciBsZW5ndGggPSAwXG4gICAgLCBsZW4gPSBzdHIubGVuZ3RoXG4gICAgLCBwb3MgPSAwXG4gICAgLCB2YWx1ZTtcbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGxlbmd0aCsrO1xuICAgIHZhbHVlID0gc3RyLmNoYXJDb2RlQXQocG9zKyspO1xuICAgIGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIHBvcyA8IGxlbikge1xuICAgICAgLy8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG4gICAgICB2YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgICBpZiAoKHZhbHVlICYgMHhGQzAwKSA9PSAweERDMDApIHBvcysrOyAvLyBsb3cgc3Vycm9nYXRlXG4gICAgfVxuICB9XG4gIHJldHVybiBsZW5ndGg7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29weTogY29weSxcbiAgY2hlY2tEYXRhVHlwZTogY2hlY2tEYXRhVHlwZSxcbiAgY2hlY2tEYXRhVHlwZXM6IGNoZWNrRGF0YVR5cGVzLFxuICBjb2VyY2VUb1R5cGVzOiBjb2VyY2VUb1R5cGVzLFxuICB0b0hhc2g6IHRvSGFzaCxcbiAgZ2V0UHJvcGVydHk6IGdldFByb3BlcnR5LFxuICBlc2NhcGVRdW90ZXM6IGVzY2FwZVF1b3RlcyxcbiAgZXF1YWw6IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpLFxuICB1Y3MybGVuZ3RoOiByZXF1aXJlKCcuL3VjczJsZW5ndGgnKSxcbiAgdmFyT2NjdXJlbmNlczogdmFyT2NjdXJlbmNlcyxcbiAgdmFyUmVwbGFjZTogdmFyUmVwbGFjZSxcbiAgc2NoZW1hSGFzUnVsZXM6IHNjaGVtYUhhc1J1bGVzLFxuICBzY2hlbWFIYXNSdWxlc0V4Y2VwdDogc2NoZW1hSGFzUnVsZXNFeGNlcHQsXG4gIHNjaGVtYVVua25vd25SdWxlczogc2NoZW1hVW5rbm93blJ1bGVzLFxuICB0b1F1b3RlZFN0cmluZzogdG9RdW90ZWRTdHJpbmcsXG4gIGdldFBhdGhFeHByOiBnZXRQYXRoRXhwcixcbiAgZ2V0UGF0aDogZ2V0UGF0aCxcbiAgZ2V0RGF0YTogZ2V0RGF0YSxcbiAgdW5lc2NhcGVGcmFnbWVudDogdW5lc2NhcGVGcmFnbWVudCxcbiAgdW5lc2NhcGVKc29uUG9pbnRlcjogdW5lc2NhcGVKc29uUG9pbnRlcixcbiAgZXNjYXBlRnJhZ21lbnQ6IGVzY2FwZUZyYWdtZW50LFxuICBlc2NhcGVKc29uUG9pbnRlcjogZXNjYXBlSnNvblBvaW50ZXJcbn07XG5cblxuZnVuY3Rpb24gY29weShvLCB0bykge1xuICB0byA9IHRvIHx8IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gbykgdG9ba2V5XSA9IG9ba2V5XTtcbiAgcmV0dXJuIHRvO1xufVxuXG5cbmZ1bmN0aW9uIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGUsIGRhdGEsIHN0cmljdE51bWJlcnMsIG5lZ2F0ZSkge1xuICB2YXIgRVFVQUwgPSBuZWdhdGUgPyAnICE9PSAnIDogJyA9PT0gJ1xuICAgICwgQU5EID0gbmVnYXRlID8gJyB8fCAnIDogJyAmJiAnXG4gICAgLCBPSyA9IG5lZ2F0ZSA/ICchJyA6ICcnXG4gICAgLCBOT1QgPSBuZWdhdGUgPyAnJyA6ICchJztcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgJ251bGwnOiByZXR1cm4gZGF0YSArIEVRVUFMICsgJ251bGwnO1xuICAgIGNhc2UgJ2FycmF5JzogcmV0dXJuIE9LICsgJ0FycmF5LmlzQXJyYXkoJyArIGRhdGEgKyAnKSc7XG4gICAgY2FzZSAnb2JqZWN0JzogcmV0dXJuICcoJyArIE9LICsgZGF0YSArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlb2YgJyArIGRhdGEgKyBFUVVBTCArICdcIm9iamVjdFwiJyArIEFORCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5PVCArICdBcnJheS5pc0FycmF5KCcgKyBkYXRhICsgJykpJztcbiAgICBjYXNlICdpbnRlZ2VyJzogcmV0dXJuICcodHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCJudW1iZXJcIicgKyBBTkQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UICsgJygnICsgZGF0YSArICcgJSAxKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EICsgZGF0YSArIEVRVUFMICsgZGF0YSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaWN0TnVtYmVycyA/IChBTkQgKyBPSyArICdpc0Zpbml0ZSgnICsgZGF0YSArICcpJykgOiAnJykgKyAnKSc7XG4gICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuICcodHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCInICsgZGF0YVR5cGUgKyAnXCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmljdE51bWJlcnMgPyAoQU5EICsgT0sgKyAnaXNGaW5pdGUoJyArIGRhdGEgKyAnKScpIDogJycpICsgJyknO1xuICAgIGRlZmF1bHQ6IHJldHVybiAndHlwZW9mICcgKyBkYXRhICsgRVFVQUwgKyAnXCInICsgZGF0YVR5cGUgKyAnXCInO1xuICB9XG59XG5cblxuZnVuY3Rpb24gY2hlY2tEYXRhVHlwZXMoZGF0YVR5cGVzLCBkYXRhLCBzdHJpY3ROdW1iZXJzKSB7XG4gIHN3aXRjaCAoZGF0YVR5cGVzLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGNoZWNrRGF0YVR5cGUoZGF0YVR5cGVzWzBdLCBkYXRhLCBzdHJpY3ROdW1iZXJzLCB0cnVlKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGNvZGUgPSAnJztcbiAgICAgIHZhciB0eXBlcyA9IHRvSGFzaChkYXRhVHlwZXMpO1xuICAgICAgaWYgKHR5cGVzLmFycmF5ICYmIHR5cGVzLm9iamVjdCkge1xuICAgICAgICBjb2RlID0gdHlwZXMubnVsbCA/ICcoJzogJyghJyArIGRhdGEgKyAnIHx8ICc7XG4gICAgICAgIGNvZGUgKz0gJ3R5cGVvZiAnICsgZGF0YSArICcgIT09IFwib2JqZWN0XCIpJztcbiAgICAgICAgZGVsZXRlIHR5cGVzLm51bGw7XG4gICAgICAgIGRlbGV0ZSB0eXBlcy5hcnJheTtcbiAgICAgICAgZGVsZXRlIHR5cGVzLm9iamVjdDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlcy5udW1iZXIpIGRlbGV0ZSB0eXBlcy5pbnRlZ2VyO1xuICAgICAgZm9yICh2YXIgdCBpbiB0eXBlcylcbiAgICAgICAgY29kZSArPSAoY29kZSA/ICcgJiYgJyA6ICcnICkgKyBjaGVja0RhdGFUeXBlKHQsIGRhdGEsIHN0cmljdE51bWJlcnMsIHRydWUpO1xuXG4gICAgICByZXR1cm4gY29kZTtcbiAgfVxufVxuXG5cbnZhciBDT0VSQ0VfVE9fVFlQRVMgPSB0b0hhc2goWyAnc3RyaW5nJywgJ251bWJlcicsICdpbnRlZ2VyJywgJ2Jvb2xlYW4nLCAnbnVsbCcgXSk7XG5mdW5jdGlvbiBjb2VyY2VUb1R5cGVzKG9wdGlvbkNvZXJjZVR5cGVzLCBkYXRhVHlwZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVR5cGVzKSkge1xuICAgIHZhciB0eXBlcyA9IFtdO1xuICAgIGZvciAodmFyIGk9MDsgaTxkYXRhVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0ID0gZGF0YVR5cGVzW2ldO1xuICAgICAgaWYgKENPRVJDRV9UT19UWVBFU1t0XSkgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IHQ7XG4gICAgICBlbHNlIGlmIChvcHRpb25Db2VyY2VUeXBlcyA9PT0gJ2FycmF5JyAmJiB0ID09PSAnYXJyYXknKSB0eXBlc1t0eXBlcy5sZW5ndGhdID0gdDtcbiAgICB9XG4gICAgaWYgKHR5cGVzLmxlbmd0aCkgcmV0dXJuIHR5cGVzO1xuICB9IGVsc2UgaWYgKENPRVJDRV9UT19UWVBFU1tkYXRhVHlwZXNdKSB7XG4gICAgcmV0dXJuIFtkYXRhVHlwZXNdO1xuICB9IGVsc2UgaWYgKG9wdGlvbkNvZXJjZVR5cGVzID09PSAnYXJyYXknICYmIGRhdGFUeXBlcyA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBbJ2FycmF5J107XG4gIH1cbn1cblxuXG5mdW5jdGlvbiB0b0hhc2goYXJyKSB7XG4gIHZhciBoYXNoID0ge307XG4gIGZvciAodmFyIGk9MDsgaTxhcnIubGVuZ3RoOyBpKyspIGhhc2hbYXJyW2ldXSA9IHRydWU7XG4gIHJldHVybiBoYXNoO1xufVxuXG5cbnZhciBJREVOVElGSUVSID0gL15bYS16JF9dW2EteiRfMC05XSokL2k7XG52YXIgU0lOR0xFX1FVT1RFID0gLyd8XFxcXC9nO1xuZnVuY3Rpb24gZ2V0UHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiB0eXBlb2Yga2V5ID09ICdudW1iZXInXG4gICAgICAgICAgPyAnWycgKyBrZXkgKyAnXSdcbiAgICAgICAgICA6IElERU5USUZJRVIudGVzdChrZXkpXG4gICAgICAgICAgICA/ICcuJyArIGtleVxuICAgICAgICAgICAgOiBcIlsnXCIgKyBlc2NhcGVRdW90ZXMoa2V5KSArIFwiJ11cIjtcbn1cblxuXG5mdW5jdGlvbiBlc2NhcGVRdW90ZXMoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShTSU5HTEVfUVVPVEUsICdcXFxcJCYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcZi9nLCAnXFxcXGYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCAnXFxcXHQnKTtcbn1cblxuXG5mdW5jdGlvbiB2YXJPY2N1cmVuY2VzKHN0ciwgZGF0YVZhcikge1xuICBkYXRhVmFyICs9ICdbXjAtOV0nO1xuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChuZXcgUmVnRXhwKGRhdGFWYXIsICdnJykpO1xuICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbn1cblxuXG5mdW5jdGlvbiB2YXJSZXBsYWNlKHN0ciwgZGF0YVZhciwgZXhwcikge1xuICBkYXRhVmFyICs9ICcoW14wLTldKSc7XG4gIGV4cHIgPSBleHByLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpO1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cChkYXRhVmFyLCAnZycpLCBleHByICsgJyQxJyk7XG59XG5cblxuZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXMoc2NoZW1hLCBydWxlcykge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybiAhc2NoZW1hO1xuICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSBpZiAocnVsZXNba2V5XSkgcmV0dXJuIHRydWU7XG59XG5cblxuZnVuY3Rpb24gc2NoZW1hSGFzUnVsZXNFeGNlcHQoc2NoZW1hLCBydWxlcywgZXhjZXB0S2V5d29yZCkge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybiAhc2NoZW1hICYmIGV4Y2VwdEtleXdvcmQgIT0gJ25vdCc7XG4gIGZvciAodmFyIGtleSBpbiBzY2hlbWEpIGlmIChrZXkgIT0gZXhjZXB0S2V5d29yZCAmJiBydWxlc1trZXldKSByZXR1cm4gdHJ1ZTtcbn1cblxuXG5mdW5jdGlvbiBzY2hlbWFVbmtub3duUnVsZXMoc2NoZW1hLCBydWxlcykge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PSAnYm9vbGVhbicpIHJldHVybjtcbiAgZm9yICh2YXIga2V5IGluIHNjaGVtYSkgaWYgKCFydWxlc1trZXldKSByZXR1cm4ga2V5O1xufVxuXG5cbmZ1bmN0aW9uIHRvUXVvdGVkU3RyaW5nKHN0cikge1xuICByZXR1cm4gJ1xcJycgKyBlc2NhcGVRdW90ZXMoc3RyKSArICdcXCcnO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhFeHByKGN1cnJlbnRQYXRoLCBleHByLCBqc29uUG9pbnRlcnMsIGlzTnVtYmVyKSB7XG4gIHZhciBwYXRoID0ganNvblBvaW50ZXJzIC8vIGZhbHNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgPyAnXFwnL1xcJyArICcgKyBleHByICsgKGlzTnVtYmVyID8gJycgOiAnLnJlcGxhY2UoL34vZywgXFwnfjBcXCcpLnJlcGxhY2UoL1xcXFwvL2csIFxcJ34xXFwnKScpXG4gICAgICAgICAgICAgIDogKGlzTnVtYmVyID8gJ1xcJ1tcXCcgKyAnICsgZXhwciArICcgKyBcXCddXFwnJyA6ICdcXCdbXFxcXFxcJ1xcJyArICcgKyBleHByICsgJyArIFxcJ1xcXFxcXCddXFwnJyk7XG4gIHJldHVybiBqb2luUGF0aHMoY3VycmVudFBhdGgsIHBhdGgpO1xufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGgoY3VycmVudFBhdGgsIHByb3AsIGpzb25Qb2ludGVycykge1xuICB2YXIgcGF0aCA9IGpzb25Qb2ludGVycyAvLyBmYWxzZSBieSBkZWZhdWx0XG4gICAgICAgICAgICAgID8gdG9RdW90ZWRTdHJpbmcoJy8nICsgZXNjYXBlSnNvblBvaW50ZXIocHJvcCkpXG4gICAgICAgICAgICAgIDogdG9RdW90ZWRTdHJpbmcoZ2V0UHJvcGVydHkocHJvcCkpO1xuICByZXR1cm4gam9pblBhdGhzKGN1cnJlbnRQYXRoLCBwYXRoKTtcbn1cblxuXG52YXIgSlNPTl9QT0lOVEVSID0gL15cXC8oPzpbXn5dfH4wfH4xKSokLztcbnZhciBSRUxBVElWRV9KU09OX1BPSU5URVIgPSAvXihbMC05XSspKCN8XFwvKD86W15+XXx+MHx+MSkqKT8kLztcbmZ1bmN0aW9uIGdldERhdGEoJGRhdGEsIGx2bCwgcGF0aHMpIHtcbiAgdmFyIHVwLCBqc29uUG9pbnRlciwgZGF0YSwgbWF0Y2hlcztcbiAgaWYgKCRkYXRhID09PSAnJykgcmV0dXJuICdyb290RGF0YSc7XG4gIGlmICgkZGF0YVswXSA9PSAnLycpIHtcbiAgICBpZiAoIUpTT05fUE9JTlRFUi50ZXN0KCRkYXRhKSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04tcG9pbnRlcjogJyArICRkYXRhKTtcbiAgICBqc29uUG9pbnRlciA9ICRkYXRhO1xuICAgIGRhdGEgPSAncm9vdERhdGEnO1xuICB9IGVsc2Uge1xuICAgIG1hdGNoZXMgPSAkZGF0YS5tYXRjaChSRUxBVElWRV9KU09OX1BPSU5URVIpO1xuICAgIGlmICghbWF0Y2hlcykgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04tcG9pbnRlcjogJyArICRkYXRhKTtcbiAgICB1cCA9ICttYXRjaGVzWzFdO1xuICAgIGpzb25Qb2ludGVyID0gbWF0Y2hlc1syXTtcbiAgICBpZiAoanNvblBvaW50ZXIgPT0gJyMnKSB7XG4gICAgICBpZiAodXAgPj0gbHZsKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgcHJvcGVydHkvaW5kZXggJyArIHVwICsgJyBsZXZlbHMgdXAsIGN1cnJlbnQgbGV2ZWwgaXMgJyArIGx2bCk7XG4gICAgICByZXR1cm4gcGF0aHNbbHZsIC0gdXBdO1xuICAgIH1cblxuICAgIGlmICh1cCA+IGx2bCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIGRhdGEgJyArIHVwICsgJyBsZXZlbHMgdXAsIGN1cnJlbnQgbGV2ZWwgaXMgJyArIGx2bCk7XG4gICAgZGF0YSA9ICdkYXRhJyArICgobHZsIC0gdXApIHx8ICcnKTtcbiAgICBpZiAoIWpzb25Qb2ludGVyKSByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHZhciBleHByID0gZGF0YTtcbiAgdmFyIHNlZ21lbnRzID0ganNvblBvaW50ZXIuc3BsaXQoJy8nKTtcbiAgZm9yICh2YXIgaT0wOyBpPHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgZGF0YSArPSBnZXRQcm9wZXJ0eSh1bmVzY2FwZUpzb25Qb2ludGVyKHNlZ21lbnQpKTtcbiAgICAgIGV4cHIgKz0gJyAmJiAnICsgZGF0YTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4cHI7XG59XG5cblxuZnVuY3Rpb24gam9pblBhdGhzIChhLCBiKSB7XG4gIGlmIChhID09ICdcIlwiJykgcmV0dXJuIGI7XG4gIHJldHVybiAoYSArICcgKyAnICsgYikucmVwbGFjZSgvKFteXFxcXF0pJyBcXCsgJy9nLCAnJDEnKTtcbn1cblxuXG5mdW5jdGlvbiB1bmVzY2FwZUZyYWdtZW50KHN0cikge1xuICByZXR1cm4gdW5lc2NhcGVKc29uUG9pbnRlcihkZWNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5cblxuZnVuY3Rpb24gZXNjYXBlRnJhZ21lbnQoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZXNjYXBlSnNvblBvaW50ZXIoc3RyKSk7XG59XG5cblxuZnVuY3Rpb24gZXNjYXBlSnNvblBvaW50ZXIoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG59XG5cblxuZnVuY3Rpb24gdW5lc2NhcGVKc29uUG9pbnRlcihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9+MS9nLCAnLycpLnJlcGxhY2UoL34wL2csICd+Jyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYU9iamVjdDtcblxuZnVuY3Rpb24gU2NoZW1hT2JqZWN0KG9iaikge1xuICB1dGlsLmNvcHkob2JqLCB0aGlzKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB0cmF2ZXJzZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNjaGVtYSwgb3B0cywgY2IpIHtcbiAgLy8gTGVnYWN5IHN1cHBvcnQgZm9yIHYwLjMuMSBhbmQgZWFybGllci5cbiAgaWYgKHR5cGVvZiBvcHRzID09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgY2IgPSBvcHRzLmNiIHx8IGNiO1xuICB2YXIgcHJlID0gKHR5cGVvZiBjYiA9PSAnZnVuY3Rpb24nKSA/IGNiIDogY2IucHJlIHx8IGZ1bmN0aW9uKCkge307XG4gIHZhciBwb3N0ID0gY2IucG9zdCB8fCBmdW5jdGlvbigpIHt9O1xuXG4gIF90cmF2ZXJzZShvcHRzLCBwcmUsIHBvc3QsIHNjaGVtYSwgJycsIHNjaGVtYSk7XG59O1xuXG5cbnRyYXZlcnNlLmtleXdvcmRzID0ge1xuICBhZGRpdGlvbmFsSXRlbXM6IHRydWUsXG4gIGl0ZW1zOiB0cnVlLFxuICBjb250YWluczogdHJ1ZSxcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUsXG4gIHByb3BlcnR5TmFtZXM6IHRydWUsXG4gIG5vdDogdHJ1ZVxufTtcblxudHJhdmVyc2UuYXJyYXlLZXl3b3JkcyA9IHtcbiAgaXRlbXM6IHRydWUsXG4gIGFsbE9mOiB0cnVlLFxuICBhbnlPZjogdHJ1ZSxcbiAgb25lT2Y6IHRydWVcbn07XG5cbnRyYXZlcnNlLnByb3BzS2V5d29yZHMgPSB7XG4gIGRlZmluaXRpb25zOiB0cnVlLFxuICBwcm9wZXJ0aWVzOiB0cnVlLFxuICBwYXR0ZXJuUHJvcGVydGllczogdHJ1ZSxcbiAgZGVwZW5kZW5jaWVzOiB0cnVlXG59O1xuXG50cmF2ZXJzZS5za2lwS2V5d29yZHMgPSB7XG4gIGRlZmF1bHQ6IHRydWUsXG4gIGVudW06IHRydWUsXG4gIGNvbnN0OiB0cnVlLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgbWF4aW11bTogdHJ1ZSxcbiAgbWluaW11bTogdHJ1ZSxcbiAgZXhjbHVzaXZlTWF4aW11bTogdHJ1ZSxcbiAgZXhjbHVzaXZlTWluaW11bTogdHJ1ZSxcbiAgbXVsdGlwbGVPZjogdHJ1ZSxcbiAgbWF4TGVuZ3RoOiB0cnVlLFxuICBtaW5MZW5ndGg6IHRydWUsXG4gIHBhdHRlcm46IHRydWUsXG4gIGZvcm1hdDogdHJ1ZSxcbiAgbWF4SXRlbXM6IHRydWUsXG4gIG1pbkl0ZW1zOiB0cnVlLFxuICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgbWF4UHJvcGVydGllczogdHJ1ZSxcbiAgbWluUHJvcGVydGllczogdHJ1ZVxufTtcblxuXG5mdW5jdGlvbiBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hlbWEsIGpzb25QdHIsIHJvb3RTY2hlbWEsIHBhcmVudEpzb25QdHIsIHBhcmVudEtleXdvcmQsIHBhcmVudFNjaGVtYSwga2V5SW5kZXgpIHtcbiAgaWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICBwcmUoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICB2YXIgc2NoID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2gpKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdHJhdmVyc2UuYXJyYXlLZXl3b3Jkcykge1xuICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzY2gubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hbaV0sIGpzb25QdHIgKyAnLycgKyBrZXkgKyAnLycgKyBpLCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHRyYXZlcnNlLnByb3BzS2V5d29yZHMpIHtcbiAgICAgICAgaWYgKHNjaCAmJiB0eXBlb2Ygc2NoID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzY2gpXG4gICAgICAgICAgICBfdHJhdmVyc2Uob3B0cywgcHJlLCBwb3N0LCBzY2hbcHJvcF0sIGpzb25QdHIgKyAnLycgKyBrZXkgKyAnLycgKyBlc2NhcGVKc29uUHRyKHByb3ApLCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSwgcHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHRyYXZlcnNlLmtleXdvcmRzIHx8IChvcHRzLmFsbEtleXMgJiYgIShrZXkgaW4gdHJhdmVyc2Uuc2tpcEtleXdvcmRzKSkpIHtcbiAgICAgICAgX3RyYXZlcnNlKG9wdHMsIHByZSwgcG9zdCwgc2NoLCBqc29uUHRyICsgJy8nICsga2V5LCByb290U2NoZW1hLCBqc29uUHRyLCBrZXksIHNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIHBvc3Qoc2NoZW1hLCBqc29uUHRyLCByb290U2NoZW1hLCBwYXJlbnRKc29uUHRyLCBwYXJlbnRLZXl3b3JkLCBwYXJlbnRTY2hlbWEsIGtleUluZGV4KTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGVzY2FwZUpzb25QdHIoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVVJJID0gcmVxdWlyZSgndXJpLWpzJylcbiAgLCBlcXVhbCA9IHJlcXVpcmUoJ2Zhc3QtZGVlcC1lcXVhbCcpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG4gICwgU2NoZW1hT2JqZWN0ID0gcmVxdWlyZSgnLi9zY2hlbWFfb2JqJylcbiAgLCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ2pzb24tc2NoZW1hLXRyYXZlcnNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZTtcblxucmVzb2x2ZS5ub3JtYWxpemVJZCA9IG5vcm1hbGl6ZUlkO1xucmVzb2x2ZS5mdWxsUGF0aCA9IGdldEZ1bGxQYXRoO1xucmVzb2x2ZS51cmwgPSByZXNvbHZlVXJsO1xucmVzb2x2ZS5pZHMgPSByZXNvbHZlSWRzO1xucmVzb2x2ZS5pbmxpbmVSZWYgPSBpbmxpbmVSZWY7XG5yZXNvbHZlLnNjaGVtYSA9IHJlc29sdmVTY2hlbWE7XG5cbi8qKlxuICogW3Jlc29sdmUgYW5kIGNvbXBpbGUgdGhlIHJlZmVyZW5jZXMgKCRyZWYpXVxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjb21waWxlIHJlZmVyZW5jZSB0byBzY2hlbWEgY29tcGlsYXRpb24gZnVuY2l0b24gKGxvY2FsQ29tcGlsZSlcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9vdCBzY2hlbWEgZm9yIHRoZSBjdXJyZW50IHNjaGVtYVxuICogQHBhcmFtICB7U3RyaW5nfSByZWYgcmVmZXJlbmNlIHRvIHJlc29sdmVcbiAqIEByZXR1cm4ge09iamVjdHxGdW5jdGlvbn0gc2NoZW1hIG9iamVjdCAoaWYgdGhlIHNjaGVtYSBjYW4gYmUgaW5saW5lZCkgb3IgdmFsaWRhdGlvbiBmdW5jdGlvblxuICovXG5mdW5jdGlvbiByZXNvbHZlKGNvbXBpbGUsIHJvb3QsIHJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciByZWZWYWwgPSB0aGlzLl9yZWZzW3JlZl07XG4gIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHRoaXMuX3JlZnNbcmVmVmFsXSkgcmVmVmFsID0gdGhpcy5fcmVmc1tyZWZWYWxdO1xuICAgIGVsc2UgcmV0dXJuIHJlc29sdmUuY2FsbCh0aGlzLCBjb21waWxlLCByb290LCByZWZWYWwpO1xuICB9XG5cbiAgcmVmVmFsID0gcmVmVmFsIHx8IHRoaXMuX3NjaGVtYXNbcmVmXTtcbiAgaWYgKHJlZlZhbCBpbnN0YW5jZW9mIFNjaGVtYU9iamVjdCkge1xuICAgIHJldHVybiBpbmxpbmVSZWYocmVmVmFsLnNjaGVtYSwgdGhpcy5fb3B0cy5pbmxpbmVSZWZzKVxuICAgICAgICAgICAgPyByZWZWYWwuc2NoZW1hXG4gICAgICAgICAgICA6IHJlZlZhbC52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gIH1cblxuICB2YXIgcmVzID0gcmVzb2x2ZVNjaGVtYS5jYWxsKHRoaXMsIHJvb3QsIHJlZik7XG4gIHZhciBzY2hlbWEsIHYsIGJhc2VJZDtcbiAgaWYgKHJlcykge1xuICAgIHNjaGVtYSA9IHJlcy5zY2hlbWE7XG4gICAgcm9vdCA9IHJlcy5yb290O1xuICAgIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gIH1cblxuICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hT2JqZWN0KSB7XG4gICAgdiA9IHNjaGVtYS52YWxpZGF0ZSB8fCBjb21waWxlLmNhbGwodGhpcywgc2NoZW1hLnNjaGVtYSwgcm9vdCwgdW5kZWZpbmVkLCBiYXNlSWQpO1xuICB9IGVsc2UgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdiA9IGlubGluZVJlZihzY2hlbWEsIHRoaXMuX29wdHMuaW5saW5lUmVmcylcbiAgICAgICAgPyBzY2hlbWFcbiAgICAgICAgOiBjb21waWxlLmNhbGwodGhpcywgc2NoZW1hLCByb290LCB1bmRlZmluZWQsIGJhc2VJZCk7XG4gIH1cblxuICByZXR1cm4gdjtcbn1cblxuXG4vKipcbiAqIFJlc29sdmUgc2NoZW1hLCBpdHMgcm9vdCBhbmQgYmFzZUlkXG4gKiBAdGhpcyBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgc2NoZW1hLCByZWZWYWwsIHJlZnNcbiAqIEBwYXJhbSAge1N0cmluZ30gcmVmICByZWZlcmVuY2UgdG8gcmVzb2x2ZVxuICogQHJldHVybiB7T2JqZWN0fSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHNjaGVtYSwgcm9vdCwgYmFzZUlkXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY2hlbWEocm9vdCwgcmVmKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHAgPSBVUkkucGFyc2UocmVmKVxuICAgICwgcmVmUGF0aCA9IF9nZXRGdWxsUGF0aChwKVxuICAgICwgYmFzZUlkID0gZ2V0RnVsbFBhdGgodGhpcy5fZ2V0SWQocm9vdC5zY2hlbWEpKTtcbiAgaWYgKE9iamVjdC5rZXlzKHJvb3Quc2NoZW1hKS5sZW5ndGggPT09IDAgfHwgcmVmUGF0aCAhPT0gYmFzZUlkKSB7XG4gICAgdmFyIGlkID0gbm9ybWFsaXplSWQocmVmUGF0aCk7XG4gICAgdmFyIHJlZlZhbCA9IHRoaXMuX3JlZnNbaWRdO1xuICAgIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZVJlY3Vyc2l2ZS5jYWxsKHRoaXMsIHJvb3QsIHJlZlZhbCwgcCk7XG4gICAgfSBlbHNlIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICAgIGlmICghcmVmVmFsLnZhbGlkYXRlKSB0aGlzLl9jb21waWxlKHJlZlZhbCk7XG4gICAgICByb290ID0gcmVmVmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZWYWwgPSB0aGlzLl9zY2hlbWFzW2lkXTtcbiAgICAgIGlmIChyZWZWYWwgaW5zdGFuY2VvZiBTY2hlbWFPYmplY3QpIHtcbiAgICAgICAgaWYgKCFyZWZWYWwudmFsaWRhdGUpIHRoaXMuX2NvbXBpbGUocmVmVmFsKTtcbiAgICAgICAgaWYgKGlkID09IG5vcm1hbGl6ZUlkKHJlZikpXG4gICAgICAgICAgcmV0dXJuIHsgc2NoZW1hOiByZWZWYWwsIHJvb3Q6IHJvb3QsIGJhc2VJZDogYmFzZUlkIH07XG4gICAgICAgIHJvb3QgPSByZWZWYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcm9vdC5zY2hlbWEpIHJldHVybjtcbiAgICBiYXNlSWQgPSBnZXRGdWxsUGF0aCh0aGlzLl9nZXRJZChyb290LnNjaGVtYSkpO1xuICB9XG4gIHJldHVybiBnZXRKc29uUG9pbnRlci5jYWxsKHRoaXMsIHAsIGJhc2VJZCwgcm9vdC5zY2hlbWEsIHJvb3QpO1xufVxuXG5cbi8qIEB0aGlzIEFqdiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlY3Vyc2l2ZShyb290LCByZWYsIHBhcnNlZFJlZikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciByZXMgPSByZXNvbHZlU2NoZW1hLmNhbGwodGhpcywgcm9vdCwgcmVmKTtcbiAgaWYgKHJlcykge1xuICAgIHZhciBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgIHZhciBiYXNlSWQgPSByZXMuYmFzZUlkO1xuICAgIHJvb3QgPSByZXMucm9vdDtcbiAgICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWEpO1xuICAgIGlmIChpZCkgYmFzZUlkID0gcmVzb2x2ZVVybChiYXNlSWQsIGlkKTtcbiAgICByZXR1cm4gZ2V0SnNvblBvaW50ZXIuY2FsbCh0aGlzLCBwYXJzZWRSZWYsIGJhc2VJZCwgc2NoZW1hLCByb290KTtcbiAgfVxufVxuXG5cbnZhciBQUkVWRU5UX1NDT1BFX0NIQU5HRSA9IHV0aWwudG9IYXNoKFsncHJvcGVydGllcycsICdwYXR0ZXJuUHJvcGVydGllcycsICdlbnVtJywgJ2RlcGVuZGVuY2llcycsICdkZWZpbml0aW9ucyddKTtcbi8qIEB0aGlzIEFqdiAqL1xuZnVuY3Rpb24gZ2V0SnNvblBvaW50ZXIocGFyc2VkUmVmLCBiYXNlSWQsIHNjaGVtYSwgcm9vdCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHBhcnNlZFJlZi5mcmFnbWVudCA9IHBhcnNlZFJlZi5mcmFnbWVudCB8fCAnJztcbiAgaWYgKHBhcnNlZFJlZi5mcmFnbWVudC5zbGljZSgwLDEpICE9ICcvJykgcmV0dXJuO1xuICB2YXIgcGFydHMgPSBwYXJzZWRSZWYuZnJhZ21lbnQuc3BsaXQoJy8nKTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAocGFydCkge1xuICAgICAgcGFydCA9IHV0aWwudW5lc2NhcGVGcmFnbWVudChwYXJ0KTtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYVtwYXJ0XTtcbiAgICAgIGlmIChzY2hlbWEgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICB2YXIgaWQ7XG4gICAgICBpZiAoIVBSRVZFTlRfU0NPUEVfQ0hBTkdFW3BhcnRdKSB7XG4gICAgICAgIGlkID0gdGhpcy5fZ2V0SWQoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlkKSBiYXNlSWQgPSByZXNvbHZlVXJsKGJhc2VJZCwgaWQpO1xuICAgICAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgICAgICB2YXIgJHJlZiA9IHJlc29sdmVVcmwoYmFzZUlkLCBzY2hlbWEuJHJlZik7XG4gICAgICAgICAgdmFyIHJlcyA9IHJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCAkcmVmKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBzY2hlbWEgPSByZXMuc2NoZW1hO1xuICAgICAgICAgICAgcm9vdCA9IHJlcy5yb290O1xuICAgICAgICAgICAgYmFzZUlkID0gcmVzLmJhc2VJZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYSAhPT0gcm9vdC5zY2hlbWEpXG4gICAgcmV0dXJuIHsgc2NoZW1hOiBzY2hlbWEsIHJvb3Q6IHJvb3QsIGJhc2VJZDogYmFzZUlkIH07XG59XG5cblxudmFyIFNJTVBMRV9JTkxJTkVEID0gdXRpbC50b0hhc2goW1xuICAndHlwZScsICdmb3JtYXQnLCAncGF0dGVybicsXG4gICdtYXhMZW5ndGgnLCAnbWluTGVuZ3RoJyxcbiAgJ21heFByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsXG4gICdtYXhJdGVtcycsICdtaW5JdGVtcycsXG4gICdtYXhpbXVtJywgJ21pbmltdW0nLFxuICAndW5pcXVlSXRlbXMnLCAnbXVsdGlwbGVPZicsXG4gICdyZXF1aXJlZCcsICdlbnVtJ1xuXSk7XG5mdW5jdGlvbiBpbmxpbmVSZWYoc2NoZW1hLCBsaW1pdCkge1xuICBpZiAobGltaXQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkIHx8IGxpbWl0ID09PSB0cnVlKSByZXR1cm4gY2hlY2tOb1JlZihzY2hlbWEpO1xuICBlbHNlIGlmIChsaW1pdCkgcmV0dXJuIGNvdW50S2V5cyhzY2hlbWEpIDw9IGxpbWl0O1xufVxuXG5cbmZ1bmN0aW9uIGNoZWNrTm9SZWYoc2NoZW1hKSB7XG4gIHZhciBpdGVtO1xuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgZm9yICh2YXIgaT0wOyBpPHNjaGVtYS5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnb2JqZWN0JyAmJiAhY2hlY2tOb1JlZihpdGVtKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICBpZiAoa2V5ID09ICckcmVmJykgcmV0dXJuIGZhbHNlO1xuICAgICAgaXRlbSA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnICYmICFjaGVja05vUmVmKGl0ZW0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIGNvdW50S2V5cyhzY2hlbWEpIHtcbiAgdmFyIGNvdW50ID0gMCwgaXRlbTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBzY2hlbWFbaV07XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ29iamVjdCcpIGNvdW50ICs9IGNvdW50S2V5cyhpdGVtKTtcbiAgICAgIGlmIChjb3VudCA9PSBJbmZpbml0eSkgcmV0dXJuIEluZmluaXR5O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc2NoZW1hKSB7XG4gICAgICBpZiAoa2V5ID09ICckcmVmJykgcmV0dXJuIEluZmluaXR5O1xuICAgICAgaWYgKFNJTVBMRV9JTkxJTkVEW2tleV0pIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSBzY2hlbWFba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09ICdvYmplY3QnKSBjb3VudCArPSBjb3VudEtleXMoaXRlbSkgKyAxO1xuICAgICAgICBpZiAoY291bnQgPT0gSW5maW5pdHkpIHJldHVybiBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvdW50O1xufVxuXG5cbmZ1bmN0aW9uIGdldEZ1bGxQYXRoKGlkLCBub3JtYWxpemUpIHtcbiAgaWYgKG5vcm1hbGl6ZSAhPT0gZmFsc2UpIGlkID0gbm9ybWFsaXplSWQoaWQpO1xuICB2YXIgcCA9IFVSSS5wYXJzZShpZCk7XG4gIHJldHVybiBfZ2V0RnVsbFBhdGgocCk7XG59XG5cblxuZnVuY3Rpb24gX2dldEZ1bGxQYXRoKHApIHtcbiAgcmV0dXJuIFVSSS5zZXJpYWxpemUocCkuc3BsaXQoJyMnKVswXSArICcjJztcbn1cblxuXG52YXIgVFJBSUxJTkdfU0xBU0hfSEFTSCA9IC8jXFwvPyQvO1xuZnVuY3Rpb24gbm9ybWFsaXplSWQoaWQpIHtcbiAgcmV0dXJuIGlkID8gaWQucmVwbGFjZShUUkFJTElOR19TTEFTSF9IQVNILCAnJykgOiAnJztcbn1cblxuXG5mdW5jdGlvbiByZXNvbHZlVXJsKGJhc2VJZCwgaWQpIHtcbiAgaWQgPSBub3JtYWxpemVJZChpZCk7XG4gIHJldHVybiBVUkkucmVzb2x2ZShiYXNlSWQsIGlkKTtcbn1cblxuXG4vKiBAdGhpcyBBanYgKi9cbmZ1bmN0aW9uIHJlc29sdmVJZHMoc2NoZW1hKSB7XG4gIHZhciBzY2hlbWFJZCA9IG5vcm1hbGl6ZUlkKHRoaXMuX2dldElkKHNjaGVtYSkpO1xuICB2YXIgYmFzZUlkcyA9IHsnJzogc2NoZW1hSWR9O1xuICB2YXIgZnVsbFBhdGhzID0geycnOiBnZXRGdWxsUGF0aChzY2hlbWFJZCwgZmFsc2UpfTtcbiAgdmFyIGxvY2FsUmVmcyA9IHt9O1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdHJhdmVyc2Uoc2NoZW1hLCB7YWxsS2V5czogdHJ1ZX0sIGZ1bmN0aW9uKHNjaCwganNvblB0ciwgcm9vdFNjaGVtYSwgcGFyZW50SnNvblB0ciwgcGFyZW50S2V5d29yZCwgcGFyZW50U2NoZW1hLCBrZXlJbmRleCkge1xuICAgIGlmIChqc29uUHRyID09PSAnJykgcmV0dXJuO1xuICAgIHZhciBpZCA9IHNlbGYuX2dldElkKHNjaCk7XG4gICAgdmFyIGJhc2VJZCA9IGJhc2VJZHNbcGFyZW50SnNvblB0cl07XG4gICAgdmFyIGZ1bGxQYXRoID0gZnVsbFBhdGhzW3BhcmVudEpzb25QdHJdICsgJy8nICsgcGFyZW50S2V5d29yZDtcbiAgICBpZiAoa2V5SW5kZXggIT09IHVuZGVmaW5lZClcbiAgICAgIGZ1bGxQYXRoICs9ICcvJyArICh0eXBlb2Yga2V5SW5kZXggPT0gJ251bWJlcicgPyBrZXlJbmRleCA6IHV0aWwuZXNjYXBlRnJhZ21lbnQoa2V5SW5kZXgpKTtcblxuICAgIGlmICh0eXBlb2YgaWQgPT0gJ3N0cmluZycpIHtcbiAgICAgIGlkID0gYmFzZUlkID0gbm9ybWFsaXplSWQoYmFzZUlkID8gVVJJLnJlc29sdmUoYmFzZUlkLCBpZCkgOiBpZCk7XG5cbiAgICAgIHZhciByZWZWYWwgPSBzZWxmLl9yZWZzW2lkXTtcbiAgICAgIGlmICh0eXBlb2YgcmVmVmFsID09ICdzdHJpbmcnKSByZWZWYWwgPSBzZWxmLl9yZWZzW3JlZlZhbF07XG4gICAgICBpZiAocmVmVmFsICYmIHJlZlZhbC5zY2hlbWEpIHtcbiAgICAgICAgaWYgKCFlcXVhbChzY2gsIHJlZlZhbC5zY2hlbWEpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWQgXCInICsgaWQgKyAnXCIgcmVzb2x2ZXMgdG8gbW9yZSB0aGFuIG9uZSBzY2hlbWEnKTtcbiAgICAgIH0gZWxzZSBpZiAoaWQgIT0gbm9ybWFsaXplSWQoZnVsbFBhdGgpKSB7XG4gICAgICAgIGlmIChpZFswXSA9PSAnIycpIHtcbiAgICAgICAgICBpZiAobG9jYWxSZWZzW2lkXSAmJiAhZXF1YWwoc2NoLCBsb2NhbFJlZnNbaWRdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWQgXCInICsgaWQgKyAnXCIgcmVzb2x2ZXMgdG8gbW9yZSB0aGFuIG9uZSBzY2hlbWEnKTtcbiAgICAgICAgICBsb2NhbFJlZnNbaWRdID0gc2NoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuX3JlZnNbaWRdID0gZnVsbFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgYmFzZUlkc1tqc29uUHRyXSA9IGJhc2VJZDtcbiAgICBmdWxsUGF0aHNbanNvblB0cl0gPSBmdWxsUGF0aDtcbiAgfSk7XG5cbiAgcmV0dXJuIGxvY2FsUmVmcztcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciByZXNvbHZlID0gcmVxdWlyZSgnLi9yZXNvbHZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBWYWxpZGF0aW9uOiBlcnJvclN1YmNsYXNzKFZhbGlkYXRpb25FcnJvciksXG4gIE1pc3NpbmdSZWY6IGVycm9yU3ViY2xhc3MoTWlzc2luZ1JlZkVycm9yKVxufTtcblxuXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKSB7XG4gIHRoaXMubWVzc2FnZSA9ICd2YWxpZGF0aW9uIGZhaWxlZCc7XG4gIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB0aGlzLmFqdiA9IHRoaXMudmFsaWRhdGlvbiA9IHRydWU7XG59XG5cblxuTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UgPSBmdW5jdGlvbiAoYmFzZUlkLCByZWYpIHtcbiAgcmV0dXJuICdjYW5cXCd0IHJlc29sdmUgcmVmZXJlbmNlICcgKyByZWYgKyAnIGZyb20gaWQgJyArIGJhc2VJZDtcbn07XG5cblxuZnVuY3Rpb24gTWlzc2luZ1JlZkVycm9yKGJhc2VJZCwgcmVmLCBtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgTWlzc2luZ1JlZkVycm9yLm1lc3NhZ2UoYmFzZUlkLCByZWYpO1xuICB0aGlzLm1pc3NpbmdSZWYgPSByZXNvbHZlLnVybChiYXNlSWQsIHJlZik7XG4gIHRoaXMubWlzc2luZ1NjaGVtYSA9IHJlc29sdmUubm9ybWFsaXplSWQocmVzb2x2ZS5mdWxsUGF0aCh0aGlzLm1pc3NpbmdSZWYpKTtcbn1cblxuXG5mdW5jdGlvbiBlcnJvclN1YmNsYXNzKFN1YmNsYXNzKSB7XG4gIFN1YmNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgU3ViY2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViY2xhc3M7XG4gIHJldHVybiBTdWJjbGFzcztcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIG9wdHMgPSB7IGNtcDogb3B0cyB9O1xuICAgIHZhciBjeWNsZXMgPSAodHlwZW9mIG9wdHMuY3ljbGVzID09PSAnYm9vbGVhbicpID8gb3B0cy5jeWNsZXMgOiBmYWxzZTtcblxuICAgIHZhciBjbXAgPSBvcHRzLmNtcCAmJiAoZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYW9iaiA9IHsga2V5OiBhLCB2YWx1ZTogbm9kZVthXSB9O1xuICAgICAgICAgICAgICAgIHZhciBib2JqID0geyBrZXk6IGIsIHZhbHVlOiBub2RlW2JdIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYoYW9iaiwgYm9iaik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH0pKG9wdHMuY21wKTtcblxuICAgIHZhciBzZWVuID0gW107XG4gICAgcmV0dXJuIChmdW5jdGlvbiBzdHJpbmdpZnkgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS50b0pTT04gJiYgdHlwZW9mIG5vZGUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS50b0pTT04oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGVvZiBub2RlID09ICdudW1iZXInKSByZXR1cm4gaXNGaW5pdGUobm9kZSkgPyAnJyArIG5vZGUgOiAnbnVsbCc7XG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHJldHVybiBKU09OLnN0cmluZ2lmeShub2RlKTtcblxuICAgICAgICB2YXIgaSwgb3V0O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgb3V0ID0gJ1snO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSkgb3V0ICs9ICcsJztcbiAgICAgICAgICAgICAgICBvdXQgKz0gc3RyaW5naWZ5KG5vZGVbaV0pIHx8ICdudWxsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXQgKyAnXSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcblxuICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5vZGUpICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKGN5Y2xlcykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCdfX2N5Y2xlX18nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT04nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLnB1c2gobm9kZSkgLSAxO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG5vZGUpLnNvcnQoY21wICYmIGNtcChub2RlKSk7XG4gICAgICAgIG91dCA9ICcnO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBzdHJpbmdpZnkobm9kZVtrZXldKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAob3V0KSBvdXQgKz0gJywnO1xuICAgICAgICAgICAgb3V0ICs9IEpTT04uc3RyaW5naWZ5KGtleSkgKyAnOicgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLnNwbGljZShzZWVuSW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gJ3snICsgb3V0ICsgJ30nO1xuICAgIH0pKGRhdGEpO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3ZhbGlkYXRlKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnJztcbiAgdmFyICRhc3luYyA9IGl0LnNjaGVtYS4kYXN5bmMgPT09IHRydWUsXG4gICAgJHJlZktleXdvcmRzID0gaXQudXRpbC5zY2hlbWFIYXNSdWxlc0V4Y2VwdChpdC5zY2hlbWEsIGl0LlJVTEVTLmFsbCwgJyRyZWYnKSxcbiAgICAkaWQgPSBpdC5zZWxmLl9nZXRJZChpdC5zY2hlbWEpO1xuICBpZiAoaXQub3B0cy5zdHJpY3RLZXl3b3Jkcykge1xuICAgIHZhciAkdW5rbm93bkt3ZCA9IGl0LnV0aWwuc2NoZW1hVW5rbm93blJ1bGVzKGl0LnNjaGVtYSwgaXQuUlVMRVMua2V5d29yZHMpO1xuICAgIGlmICgkdW5rbm93bkt3ZCkge1xuICAgICAgdmFyICRrZXl3b3Jkc01zZyA9ICd1bmtub3duIGtleXdvcmQ6ICcgKyAkdW5rbm93bkt3ZDtcbiAgICAgIGlmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID09PSAnbG9nJykgaXQubG9nZ2VyLndhcm4oJGtleXdvcmRzTXNnKTtcbiAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3Jkc01zZyk7XG4gICAgfVxuICB9XG4gIGlmIChpdC5pc1RvcCkge1xuICAgIG91dCArPSAnIHZhciB2YWxpZGF0ZSA9ICc7XG4gICAgaWYgKCRhc3luYykge1xuICAgICAgaXQuYXN5bmMgPSB0cnVlO1xuICAgICAgb3V0ICs9ICdhc3luYyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJ2Z1bmN0aW9uKGRhdGEsIGRhdGFQYXRoLCBwYXJlbnREYXRhLCBwYXJlbnREYXRhUHJvcGVydHksIHJvb3REYXRhKSB7IFxcJ3VzZSBzdHJpY3RcXCc7ICc7XG4gICAgaWYgKCRpZCAmJiAoaXQub3B0cy5zb3VyY2VDb2RlIHx8IGl0Lm9wdHMucHJvY2Vzc0NvZGUpKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCcvXFwqIyBzb3VyY2VVUkw9JyArICRpZCArICcgKi8nKSArICcgJztcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBpdC5zY2hlbWEgPT0gJ2Jvb2xlYW4nIHx8ICEoJHJlZktleXdvcmRzIHx8IGl0LnNjaGVtYS4kcmVmKSkge1xuICAgIHZhciAka2V5d29yZCA9ICdmYWxzZSBzY2hlbWEnO1xuICAgIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gICAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICAgIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gICAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICAgIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICAgIHZhciAkZXJyb3JLZXl3b3JkO1xuICAgIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gICAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICAgIGlmIChpdC5zY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXQuaXNUb3ApIHtcbiAgICAgICAgJGJyZWFrT25FcnJvciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgfVxuICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdmYWxzZSBzY2hlbWEnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ2Jvb2xlYW4gc2NoZW1hIGlzIGZhbHNlXFwnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpdC5pc1RvcCkge1xuICAgICAgICBpZiAoJGFzeW5jKSB7XG4gICAgICAgICAgb3V0ICs9ICcgcmV0dXJuIGRhdGE7ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gbnVsbDsgcmV0dXJuIHRydWU7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0LmlzVG9wKSB7XG4gICAgICBvdXQgKz0gJyB9OyByZXR1cm4gdmFsaWRhdGU7ICc7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgaWYgKGl0LmlzVG9wKSB7XG4gICAgdmFyICR0b3AgPSBpdC5pc1RvcCxcbiAgICAgICRsdmwgPSBpdC5sZXZlbCA9IDAsXG4gICAgICAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbCA9IDAsXG4gICAgICAkZGF0YSA9ICdkYXRhJztcbiAgICBpdC5yb290SWQgPSBpdC5yZXNvbHZlLmZ1bGxQYXRoKGl0LnNlbGYuX2dldElkKGl0LnJvb3Quc2NoZW1hKSk7XG4gICAgaXQuYmFzZUlkID0gaXQuYmFzZUlkIHx8IGl0LnJvb3RJZDtcbiAgICBkZWxldGUgaXQuaXNUb3A7XG4gICAgaXQuZGF0YVBhdGhBcnIgPSBbXCJcIl07XG4gICAgaWYgKGl0LnNjaGVtYS5kZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgaXQub3B0cy51c2VEZWZhdWx0cyAmJiBpdC5vcHRzLnN0cmljdERlZmF1bHRzKSB7XG4gICAgICB2YXIgJGRlZmF1bHRNc2cgPSAnZGVmYXVsdCBpcyBpZ25vcmVkIGluIHRoZSBzY2hlbWEgcm9vdCc7XG4gICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRkZWZhdWx0TXNnKTtcbiAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRkZWZhdWx0TXNnKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgdmFyIHZFcnJvcnMgPSBudWxsOyAnO1xuICAgIG91dCArPSAnIHZhciBlcnJvcnMgPSAwOyAgICAgJztcbiAgICBvdXQgKz0gJyBpZiAocm9vdERhdGEgPT09IHVuZGVmaW5lZCkgcm9vdERhdGEgPSBkYXRhOyAnO1xuICB9IGVsc2Uge1xuICAgIHZhciAkbHZsID0gaXQubGV2ZWwsXG4gICAgICAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbCxcbiAgICAgICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgICBpZiAoJGlkKSBpdC5iYXNlSWQgPSBpdC5yZXNvbHZlLnVybChpdC5iYXNlSWQsICRpZCk7XG4gICAgaWYgKCRhc3luYyAmJiAhaXQuYXN5bmMpIHRocm93IG5ldyBFcnJvcignYXN5bmMgc2NoZW1hIGluIHN5bmMgc2NoZW1hJyk7XG4gICAgb3V0ICs9ICcgdmFyIGVycnNfJyArICgkbHZsKSArICcgPSBlcnJvcnM7JztcbiAgfVxuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmwsXG4gICAgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycyxcbiAgICAkY2xvc2luZ0JyYWNlczEgPSAnJyxcbiAgICAkY2xvc2luZ0JyYWNlczIgPSAnJztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkdHlwZVNjaGVtYSA9IGl0LnNjaGVtYS50eXBlLFxuICAgICR0eXBlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoJHR5cGVTY2hlbWEpO1xuICBpZiAoJHR5cGVTY2hlbWEgJiYgaXQub3B0cy5udWxsYWJsZSAmJiBpdC5zY2hlbWEubnVsbGFibGUgPT09IHRydWUpIHtcbiAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICBpZiAoJHR5cGVTY2hlbWEuaW5kZXhPZignbnVsbCcpID09IC0xKSAkdHlwZVNjaGVtYSA9ICR0eXBlU2NoZW1hLmNvbmNhdCgnbnVsbCcpO1xuICAgIH0gZWxzZSBpZiAoJHR5cGVTY2hlbWEgIT0gJ251bGwnKSB7XG4gICAgICAkdHlwZVNjaGVtYSA9IFskdHlwZVNjaGVtYSwgJ251bGwnXTtcbiAgICAgICR0eXBlSXNBcnJheSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICgkdHlwZUlzQXJyYXkgJiYgJHR5cGVTY2hlbWEubGVuZ3RoID09IDEpIHtcbiAgICAkdHlwZVNjaGVtYSA9ICR0eXBlU2NoZW1hWzBdO1xuICAgICR0eXBlSXNBcnJheSA9IGZhbHNlO1xuICB9XG4gIGlmIChpdC5zY2hlbWEuJHJlZiAmJiAkcmVmS2V5d29yZHMpIHtcbiAgICBpZiAoaXQub3B0cy5leHRlbmRSZWZzID09ICdmYWlsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCckcmVmOiB2YWxpZGF0aW9uIGtleXdvcmRzIHVzZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIiAoc2VlIG9wdGlvbiBleHRlbmRSZWZzKScpO1xuICAgIH0gZWxzZSBpZiAoaXQub3B0cy5leHRlbmRSZWZzICE9PSB0cnVlKSB7XG4gICAgICAkcmVmS2V5d29yZHMgPSBmYWxzZTtcbiAgICAgIGl0LmxvZ2dlci53YXJuKCckcmVmOiBrZXl3b3JkcyBpZ25vcmVkIGluIHNjaGVtYSBhdCBwYXRoIFwiJyArIGl0LmVyclNjaGVtYVBhdGggKyAnXCInKTtcbiAgICB9XG4gIH1cbiAgaWYgKGl0LnNjaGVtYS4kY29tbWVudCAmJiBpdC5vcHRzLiRjb21tZW50KSB7XG4gICAgb3V0ICs9ICcgJyArIChpdC5SVUxFUy5hbGwuJGNvbW1lbnQuY29kZShpdCwgJyRjb21tZW50JykpO1xuICB9XG4gIGlmICgkdHlwZVNjaGVtYSkge1xuICAgIGlmIChpdC5vcHRzLmNvZXJjZVR5cGVzKSB7XG4gICAgICB2YXIgJGNvZXJjZVRvVHlwZXMgPSBpdC51dGlsLmNvZXJjZVRvVHlwZXMoaXQub3B0cy5jb2VyY2VUeXBlcywgJHR5cGVTY2hlbWEpO1xuICAgIH1cbiAgICB2YXIgJHJ1bGVzR3JvdXAgPSBpdC5SVUxFUy50eXBlc1skdHlwZVNjaGVtYV07XG4gICAgaWYgKCRjb2VyY2VUb1R5cGVzIHx8ICR0eXBlSXNBcnJheSB8fCAkcnVsZXNHcm91cCA9PT0gdHJ1ZSB8fCAoJHJ1bGVzR3JvdXAgJiYgISRzaG91bGRVc2VHcm91cCgkcnVsZXNHcm91cCkpKSB7XG4gICAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50eXBlJyxcbiAgICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy90eXBlJztcbiAgICAgIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnR5cGUnLFxuICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL3R5cGUnLFxuICAgICAgICAkbWV0aG9kID0gJHR5cGVJc0FycmF5ID8gJ2NoZWNrRGF0YVR5cGVzJyA6ICdjaGVja0RhdGFUeXBlJztcbiAgICAgIG91dCArPSAnIGlmICgnICsgKGl0LnV0aWxbJG1ldGhvZF0oJHR5cGVTY2hlbWEsICRkYXRhLCBpdC5vcHRzLnN0cmljdE51bWJlcnMsIHRydWUpKSArICcpIHsgJztcbiAgICAgIGlmICgkY29lcmNlVG9UeXBlcykge1xuICAgICAgICB2YXIgJGRhdGFUeXBlID0gJ2RhdGFUeXBlJyArICRsdmwsXG4gICAgICAgICAgJGNvZXJjZWQgPSAnY29lcmNlZCcgKyAkbHZsO1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVR5cGUpICsgJyA9IHR5cGVvZiAnICsgKCRkYXRhKSArICc7IHZhciAnICsgKCRjb2VyY2VkKSArICcgPSB1bmRlZmluZWQ7ICc7XG4gICAgICAgIGlmIChpdC5vcHRzLmNvZXJjZVR5cGVzID09ICdhcnJheScpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdvYmplY3RcXCcgJiYgQXJyYXkuaXNBcnJheSgnICsgKCRkYXRhKSArICcpICYmICcgKyAoJGRhdGEpICsgJy5sZW5ndGggPT0gMSkgeyAnICsgKCRkYXRhKSArICcgPSAnICsgKCRkYXRhKSArICdbMF07ICcgKyAoJGRhdGFUeXBlKSArICcgPSB0eXBlb2YgJyArICgkZGF0YSkgKyAnOyBpZiAoJyArIChpdC51dGlsLmNoZWNrRGF0YVR5cGUoaXQuc2NoZW1hLnR5cGUsICRkYXRhLCBpdC5vcHRzLnN0cmljdE51bWJlcnMpKSArICcpICcgKyAoJGNvZXJjZWQpICsgJyA9ICcgKyAoJGRhdGEpICsgJzsgfSAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRjb2VyY2VkKSArICcgIT09IHVuZGVmaW5lZCkgOyAnO1xuICAgICAgICB2YXIgYXJyMSA9ICRjb2VyY2VUb1R5cGVzO1xuICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgIHZhciAkdHlwZSwgJGkgPSAtMSxcbiAgICAgICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAgICAgICAkdHlwZSA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgICAgICBpZiAoJHR5cGUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdudW1iZXJcXCcgfHwgJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdib29sZWFuXFwnKSAnICsgKCRjb2VyY2VkKSArICcgPSBcXCdcXCcgKyAnICsgKCRkYXRhKSArICc7IGVsc2UgaWYgKCcgKyAoJGRhdGEpICsgJyA9PT0gbnVsbCkgJyArICgkY29lcmNlZCkgKyAnID0gXFwnXFwnOyAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkdHlwZSA9PSAnbnVtYmVyJyB8fCAkdHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdib29sZWFuXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gbnVsbCB8fCAoJyArICgkZGF0YVR5cGUpICsgJyA9PSBcXCdzdHJpbmdcXCcgJiYgJyArICgkZGF0YSkgKyAnICYmICcgKyAoJGRhdGEpICsgJyA9PSArJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICAgIGlmICgkdHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAmJiAhKCcgKyAoJGRhdGEpICsgJyAlIDEpJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJykpICcgKyAoJGNvZXJjZWQpICsgJyA9ICsnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR0eXBlID09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyBlbHNlIGlmICgnICsgKCRkYXRhKSArICcgPT09IFxcJ2ZhbHNlXFwnIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gMCB8fCAnICsgKCRkYXRhKSArICcgPT09IG51bGwpICcgKyAoJGNvZXJjZWQpICsgJyA9IGZhbHNlOyBlbHNlIGlmICgnICsgKCRkYXRhKSArICcgPT09IFxcJ3RydWVcXCcgfHwgJyArICgkZGF0YSkgKyAnID09PSAxKSAnICsgKCRjb2VyY2VkKSArICcgPSB0cnVlOyAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgkdHlwZSA9PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgZWxzZSBpZiAoJyArICgkZGF0YSkgKyAnID09PSBcXCdcXCcgfHwgJyArICgkZGF0YSkgKyAnID09PSAwIHx8ICcgKyAoJGRhdGEpICsgJyA9PT0gZmFsc2UpICcgKyAoJGNvZXJjZWQpICsgJyA9IG51bGw7ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0Lm9wdHMuY29lcmNlVHlwZXMgPT0gJ2FycmF5JyAmJiAkdHlwZSA9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgaWYgKCcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnc3RyaW5nXFwnIHx8ICcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnbnVtYmVyXFwnIHx8ICcgKyAoJGRhdGFUeXBlKSArICcgPT0gXFwnYm9vbGVhblxcJyB8fCAnICsgKCRkYXRhKSArICcgPT0gbnVsbCkgJyArICgkY29lcmNlZCkgKyAnID0gWycgKyAoJGRhdGEpICsgJ107ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAgICc7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICd0eXBlJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyB0eXBlOiBcXCcnO1xuICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlICc7XG4gICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IGlmICgnICsgKCRjb2VyY2VkKSArICcgIT09IHVuZGVmaW5lZCkgeyAgJztcbiAgICAgICAgdmFyICRwYXJlbnREYXRhID0gJGRhdGFMdmwgPyAnZGF0YScgKyAoKCRkYXRhTHZsIC0gMSkgfHwgJycpIDogJ3BhcmVudERhdGEnLFxuICAgICAgICAgICRwYXJlbnREYXRhUHJvcGVydHkgPSAkZGF0YUx2bCA/IGl0LmRhdGFQYXRoQXJyWyRkYXRhTHZsXSA6ICdwYXJlbnREYXRhUHJvcGVydHknO1xuICAgICAgICBvdXQgKz0gJyAnICsgKCRkYXRhKSArICcgPSAnICsgKCRjb2VyY2VkKSArICc7ICc7XG4gICAgICAgIGlmICghJGRhdGFMdmwpIHtcbiAgICAgICAgICBvdXQgKz0gJ2lmICgnICsgKCRwYXJlbnREYXRhKSArICcgIT09IHVuZGVmaW5lZCknO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICcgKyAoJHBhcmVudERhdGEpICsgJ1snICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJ10gPSAnICsgKCRjb2VyY2VkKSArICc7IH0gJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICd0eXBlJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyB0eXBlOiBcXCcnO1xuICAgICAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlICc7XG4gICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgIG91dCArPSAnJyArICgkdHlwZVNjaGVtYS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH1cbiAgfVxuICBpZiAoaXQuc2NoZW1hLiRyZWYgJiYgISRyZWZLZXl3b3Jkcykge1xuICAgIG91dCArPSAnICcgKyAoaXQuUlVMRVMuYWxsLiRyZWYuY29kZShpdCwgJyRyZWYnKSkgKyAnICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIH0gaWYgKGVycm9ycyA9PT0gJztcbiAgICAgIGlmICgkdG9wKSB7XG4gICAgICAgIG91dCArPSAnMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ2VycnNfJyArICgkbHZsKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnKSB7ICc7XG4gICAgICAkY2xvc2luZ0JyYWNlczIgKz0gJ30nO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYXJyMiA9IGl0LlJVTEVTO1xuICAgIGlmIChhcnIyKSB7XG4gICAgICB2YXIgJHJ1bGVzR3JvdXAsIGkyID0gLTEsXG4gICAgICAgIGwyID0gYXJyMi5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkyIDwgbDIpIHtcbiAgICAgICAgJHJ1bGVzR3JvdXAgPSBhcnIyW2kyICs9IDFdO1xuICAgICAgICBpZiAoJHNob3VsZFVzZUdyb3VwKCRydWxlc0dyb3VwKSkge1xuICAgICAgICAgIGlmICgkcnVsZXNHcm91cC50eXBlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoJyArIChpdC51dGlsLmNoZWNrRGF0YVR5cGUoJHJ1bGVzR3JvdXAudHlwZSwgJGRhdGEsIGl0Lm9wdHMuc3RyaWN0TnVtYmVycykpICsgJykgeyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy51c2VEZWZhdWx0cykge1xuICAgICAgICAgICAgaWYgKCRydWxlc0dyb3VwLnR5cGUgPT0gJ29iamVjdCcgJiYgaXQuc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWEucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAkc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKCRzY2hlbWEpO1xuICAgICAgICAgICAgICB2YXIgYXJyMyA9ICRzY2hlbWFLZXlzO1xuICAgICAgICAgICAgICBpZiAoYXJyMykge1xuICAgICAgICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksIGkzID0gLTEsXG4gICAgICAgICAgICAgICAgICBsMyA9IGFycjMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaTMgPCBsMykge1xuICAgICAgICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyM1tpMyArPSAxXTtcbiAgICAgICAgICAgICAgICAgIHZhciAkc2NoID0gJHNjaGVtYVskcHJvcGVydHlLZXldO1xuICAgICAgICAgICAgICAgICAgaWYgKCRzY2guZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmNvbXBvc2l0ZVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRkZWZhdWx0TXNnID0gJ2RlZmF1bHQgaXMgaWdub3JlZCBmb3I6ICcgKyAkcGFzc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHBhc3NEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzID09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIHx8ICcgKyAoJHBhc3NEYXRhKSArICcgPT09IG51bGwgfHwgJyArICgkcGFzc0RhdGEpICsgJyA9PT0gXFwnXFwnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICkgJyArICgkcGFzc0RhdGEpICsgJyA9ICc7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMgPT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoaXQudXNlRGVmYXVsdCgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArIChKU09OLnN0cmluZ2lmeSgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc7ICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHJ1bGVzR3JvdXAudHlwZSA9PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkoaXQuc2NoZW1hLml0ZW1zKSkge1xuICAgICAgICAgICAgICB2YXIgYXJyNCA9IGl0LnNjaGVtYS5pdGVtcztcbiAgICAgICAgICAgICAgaWYgKGFycjQpIHtcbiAgICAgICAgICAgICAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgICAgICAgICAgICAgIGw0ID0gYXJyNC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHdoaWxlICgkaSA8IGw0KSB7XG4gICAgICAgICAgICAgICAgICAkc2NoID0gYXJyNFskaSArPSAxXTtcbiAgICAgICAgICAgICAgICAgIGlmICgkc2NoLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaSArICddJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmNvbXBvc2l0ZVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRkZWZhdWx0TXNnID0gJ2RlZmF1bHQgaXMgaWdub3JlZCBmb3I6ICcgKyAkcGFzc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5zdHJpY3REZWZhdWx0cyA9PT0gJ2xvZycpIGl0LmxvZ2dlci53YXJuKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCRkZWZhdWx0TXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHBhc3NEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnVzZURlZmF1bHRzID09ICdlbXB0eScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIHx8ICcgKyAoJHBhc3NEYXRhKSArICcgPT09IG51bGwgfHwgJyArICgkcGFzc0RhdGEpICsgJyA9PT0gXFwnXFwnICc7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICkgJyArICgkcGFzc0RhdGEpICsgJyA9ICc7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMudXNlRGVmYXVsdHMgPT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnICcgKyAoaXQudXNlRGVmYXVsdCgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArIChKU09OLnN0cmluZ2lmeSgkc2NoLmRlZmF1bHQpKSArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc7ICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGFycjUgPSAkcnVsZXNHcm91cC5ydWxlcztcbiAgICAgICAgICBpZiAoYXJyNSkge1xuICAgICAgICAgICAgdmFyICRydWxlLCBpNSA9IC0xLFxuICAgICAgICAgICAgICBsNSA9IGFycjUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHdoaWxlIChpNSA8IGw1KSB7XG4gICAgICAgICAgICAgICRydWxlID0gYXJyNVtpNSArPSAxXTtcbiAgICAgICAgICAgICAgaWYgKCRzaG91bGRVc2VSdWxlKCRydWxlKSkge1xuICAgICAgICAgICAgICAgIHZhciAkY29kZSA9ICRydWxlLmNvZGUoaXQsICRydWxlLmtleXdvcmQsICRydWxlc0dyb3VwLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICgkY29kZSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAkY2xvc2luZ0JyYWNlczEgKz0gJ30nO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlczEpICsgJyAnO1xuICAgICAgICAgICAgJGNsb3NpbmdCcmFjZXMxID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkcnVsZXNHcm91cC50eXBlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICBpZiAoJHR5cGVTY2hlbWEgJiYgJHR5cGVTY2hlbWEgPT09ICRydWxlc0dyb3VwLnR5cGUgJiYgISRjb2VyY2VUb1R5cGVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgICAgICAgICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50eXBlJyxcbiAgICAgICAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL3R5cGUnO1xuICAgICAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAndHlwZScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgdHlwZTogXFwnJztcbiAgICAgICAgICAgICAgICBpZiAoJHR5cGVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJyB9ICc7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnO1xuICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlSXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJycgKyAoJHR5cGVTY2hlbWEuam9pbihcIixcIikpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcnICsgKCR0eXBlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBfX2VyciA9IG91dDtcbiAgICAgICAgICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKGVycm9ycyA9PT0gJztcbiAgICAgICAgICAgIGlmICgkdG9wKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnMCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJ2VycnNfJyArICgkbHZsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlczIgKz0gJ30nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMyKSArICcgJztcbiAgfVxuICBpZiAoJHRvcCkge1xuICAgIGlmICgkYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIGlmIChlcnJvcnMgPT09IDApIHJldHVybiBkYXRhOyAgICAgICAgICAgJztcbiAgICAgIG91dCArPSAnIGVsc2UgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gdkVycm9yczsgJztcbiAgICAgIG91dCArPSAnIHJldHVybiBlcnJvcnMgPT09IDA7ICAgICAgICc7XG4gICAgfVxuICAgIG91dCArPSAnIH07IHJldHVybiB2YWxpZGF0ZTsnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gZXJyb3JzID09PSBlcnJzXycgKyAoJGx2bCkgKyAnOyc7XG4gIH1cblxuICBmdW5jdGlvbiAkc2hvdWxkVXNlR3JvdXAoJHJ1bGVzR3JvdXApIHtcbiAgICB2YXIgcnVsZXMgPSAkcnVsZXNHcm91cC5ydWxlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKCRzaG91bGRVc2VSdWxlKHJ1bGVzW2ldKSkgcmV0dXJuIHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiAkc2hvdWxkVXNlUnVsZSgkcnVsZSkge1xuICAgIHJldHVybiBpdC5zY2hlbWFbJHJ1bGUua2V5d29yZF0gIT09IHVuZGVmaW5lZCB8fCAoJHJ1bGUuaW1wbGVtZW50cyAmJiAkcnVsZUltcGxlbWVudHNTb21lS2V5d29yZCgkcnVsZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHJ1bGVJbXBsZW1lbnRzU29tZUtleXdvcmQoJHJ1bGUpIHtcbiAgICB2YXIgaW1wbCA9ICRydWxlLmltcGxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbXBsLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKGl0LnNjaGVtYVtpbXBsW2ldXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHJlc29sdmUgPSByZXF1aXJlKCcuL3Jlc29sdmUnKVxuICAsIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKVxuICAsIGVycm9yQ2xhc3NlcyA9IHJlcXVpcmUoJy4vZXJyb3JfY2xhc3NlcycpXG4gICwgc3RhYmxlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnknKTtcblxudmFyIHZhbGlkYXRlR2VuZXJhdG9yID0gcmVxdWlyZSgnLi4vZG90anMvdmFsaWRhdGUnKTtcblxuLyoqXG4gKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgaW5zaWRlIGNvbXBpbGVkIHZhbGlkYXRpb25zIGZ1bmN0aW9uXG4gKi9cblxudmFyIHVjczJsZW5ndGggPSB1dGlsLnVjczJsZW5ndGg7XG52YXIgZXF1YWwgPSByZXF1aXJlKCdmYXN0LWRlZXAtZXF1YWwnKTtcblxuLy8gdGhpcyBlcnJvciBpcyB0aHJvd24gYnkgYXN5bmMgc2NoZW1hcyB0byByZXR1cm4gdmFsaWRhdGlvbiBlcnJvcnMgdmlhIGV4Y2VwdGlvblxudmFyIFZhbGlkYXRpb25FcnJvciA9IGVycm9yQ2xhc3Nlcy5WYWxpZGF0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGU7XG5cblxuLyoqXG4gKiBDb21waWxlcyBzY2hlbWEgdG8gdmFsaWRhdGlvbiBmdW5jdGlvblxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9vdCBzY2hlbWEgZm9yIHRoaXMgc2NoZW1hXG4gKiBAcGFyYW0gIHtPYmplY3R9IGxvY2FsUmVmcyB0aGUgaGFzaCBvZiBsb2NhbCByZWZlcmVuY2VzIGluc2lkZSB0aGUgc2NoZW1hIChjcmVhdGVkIGJ5IHJlc29sdmUuaWQpLCB1c2VkIGZvciBpbmxpbmUgcmVzb2x1dGlvblxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBJRCBmb3IgSURzIGluIHRoZSBzY2hlbWFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUoc2NoZW1hLCByb290LCBsb2NhbFJlZnMsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlLCBldmlsOiB0cnVlICovXG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgdmFyIHNlbGYgPSB0aGlzXG4gICAgLCBvcHRzID0gdGhpcy5fb3B0c1xuICAgICwgcmVmVmFsID0gWyB1bmRlZmluZWQgXVxuICAgICwgcmVmcyA9IHt9XG4gICAgLCBwYXR0ZXJucyA9IFtdXG4gICAgLCBwYXR0ZXJuc0hhc2ggPSB7fVxuICAgICwgZGVmYXVsdHMgPSBbXVxuICAgICwgZGVmYXVsdHNIYXNoID0ge31cbiAgICAsIGN1c3RvbVJ1bGVzID0gW107XG5cbiAgcm9vdCA9IHJvb3QgfHwgeyBzY2hlbWE6IHNjaGVtYSwgcmVmVmFsOiByZWZWYWwsIHJlZnM6IHJlZnMgfTtcblxuICB2YXIgYyA9IGNoZWNrQ29tcGlsaW5nLmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICB2YXIgY29tcGlsYXRpb24gPSB0aGlzLl9jb21waWxhdGlvbnNbYy5pbmRleF07XG4gIGlmIChjLmNvbXBpbGluZykgcmV0dXJuIChjb21waWxhdGlvbi5jYWxsVmFsaWRhdGUgPSBjYWxsVmFsaWRhdGUpO1xuXG4gIHZhciBmb3JtYXRzID0gdGhpcy5fZm9ybWF0cztcbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcblxuICB0cnkge1xuICAgIHZhciB2ID0gbG9jYWxDb21waWxlKHNjaGVtYSwgcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuICAgIGNvbXBpbGF0aW9uLnZhbGlkYXRlID0gdjtcbiAgICB2YXIgY3YgPSBjb21waWxhdGlvbi5jYWxsVmFsaWRhdGU7XG4gICAgaWYgKGN2KSB7XG4gICAgICBjdi5zY2hlbWEgPSB2LnNjaGVtYTtcbiAgICAgIGN2LmVycm9ycyA9IG51bGw7XG4gICAgICBjdi5yZWZzID0gdi5yZWZzO1xuICAgICAgY3YucmVmVmFsID0gdi5yZWZWYWw7XG4gICAgICBjdi5yb290ID0gdi5yb290O1xuICAgICAgY3YuJGFzeW5jID0gdi4kYXN5bmM7XG4gICAgICBpZiAob3B0cy5zb3VyY2VDb2RlKSBjdi5zb3VyY2UgPSB2LnNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG4gIH0gZmluYWxseSB7XG4gICAgZW5kQ29tcGlsaW5nLmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICB9XG5cbiAgLyogQHRoaXMgICB7Kn0gLSBjdXN0b20gY29udGV4dCwgc2VlIHBhc3NDb250ZXh0IG9wdGlvbiAqL1xuICBmdW5jdGlvbiBjYWxsVmFsaWRhdGUoKSB7XG4gICAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICAgIHZhciB2YWxpZGF0ZSA9IGNvbXBpbGF0aW9uLnZhbGlkYXRlO1xuICAgIHZhciByZXN1bHQgPSB2YWxpZGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGNhbGxWYWxpZGF0ZS5lcnJvcnMgPSB2YWxpZGF0ZS5lcnJvcnM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2FsQ29tcGlsZShfc2NoZW1hLCBfcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpIHtcbiAgICB2YXIgaXNSb290ID0gIV9yb290IHx8IChfcm9vdCAmJiBfcm9vdC5zY2hlbWEgPT0gX3NjaGVtYSk7XG4gICAgaWYgKF9yb290LnNjaGVtYSAhPSByb290LnNjaGVtYSlcbiAgICAgIHJldHVybiBjb21waWxlLmNhbGwoc2VsZiwgX3NjaGVtYSwgX3Jvb3QsIGxvY2FsUmVmcywgYmFzZUlkKTtcblxuICAgIHZhciAkYXN5bmMgPSBfc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZTtcblxuICAgIHZhciBzb3VyY2VDb2RlID0gdmFsaWRhdGVHZW5lcmF0b3Ioe1xuICAgICAgaXNUb3A6IHRydWUsXG4gICAgICBzY2hlbWE6IF9zY2hlbWEsXG4gICAgICBpc1Jvb3Q6IGlzUm9vdCxcbiAgICAgIGJhc2VJZDogYmFzZUlkLFxuICAgICAgcm9vdDogX3Jvb3QsXG4gICAgICBzY2hlbWFQYXRoOiAnJyxcbiAgICAgIGVyclNjaGVtYVBhdGg6ICcjJyxcbiAgICAgIGVycm9yUGF0aDogJ1wiXCInLFxuICAgICAgTWlzc2luZ1JlZkVycm9yOiBlcnJvckNsYXNzZXMuTWlzc2luZ1JlZixcbiAgICAgIFJVTEVTOiBSVUxFUyxcbiAgICAgIHZhbGlkYXRlOiB2YWxpZGF0ZUdlbmVyYXRvcixcbiAgICAgIHV0aWw6IHV0aWwsXG4gICAgICByZXNvbHZlOiByZXNvbHZlLFxuICAgICAgcmVzb2x2ZVJlZjogcmVzb2x2ZVJlZixcbiAgICAgIHVzZVBhdHRlcm46IHVzZVBhdHRlcm4sXG4gICAgICB1c2VEZWZhdWx0OiB1c2VEZWZhdWx0LFxuICAgICAgdXNlQ3VzdG9tUnVsZTogdXNlQ3VzdG9tUnVsZSxcbiAgICAgIG9wdHM6IG9wdHMsXG4gICAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgICAgbG9nZ2VyOiBzZWxmLmxvZ2dlcixcbiAgICAgIHNlbGY6IHNlbGZcbiAgICB9KTtcblxuICAgIHNvdXJjZUNvZGUgPSB2YXJzKHJlZlZhbCwgcmVmVmFsQ29kZSkgKyB2YXJzKHBhdHRlcm5zLCBwYXR0ZXJuQ29kZSlcbiAgICAgICAgICAgICAgICAgICArIHZhcnMoZGVmYXVsdHMsIGRlZmF1bHRDb2RlKSArIHZhcnMoY3VzdG9tUnVsZXMsIGN1c3RvbVJ1bGVDb2RlKVxuICAgICAgICAgICAgICAgICAgICsgc291cmNlQ29kZTtcblxuICAgIGlmIChvcHRzLnByb2Nlc3NDb2RlKSBzb3VyY2VDb2RlID0gb3B0cy5wcm9jZXNzQ29kZShzb3VyY2VDb2RlLCBfc2NoZW1hKTtcbiAgICAvLyBjb25zb2xlLmxvZygnXFxuXFxuXFxuICoqKiBcXG4nLCBKU09OLnN0cmluZ2lmeShzb3VyY2VDb2RlKSk7XG4gICAgdmFyIHZhbGlkYXRlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgbWFrZVZhbGlkYXRlID0gbmV3IEZ1bmN0aW9uKFxuICAgICAgICAnc2VsZicsXG4gICAgICAgICdSVUxFUycsXG4gICAgICAgICdmb3JtYXRzJyxcbiAgICAgICAgJ3Jvb3QnLFxuICAgICAgICAncmVmVmFsJyxcbiAgICAgICAgJ2RlZmF1bHRzJyxcbiAgICAgICAgJ2N1c3RvbVJ1bGVzJyxcbiAgICAgICAgJ2VxdWFsJyxcbiAgICAgICAgJ3VjczJsZW5ndGgnLFxuICAgICAgICAnVmFsaWRhdGlvbkVycm9yJyxcbiAgICAgICAgc291cmNlQ29kZVxuICAgICAgKTtcblxuICAgICAgdmFsaWRhdGUgPSBtYWtlVmFsaWRhdGUoXG4gICAgICAgIHNlbGYsXG4gICAgICAgIFJVTEVTLFxuICAgICAgICBmb3JtYXRzLFxuICAgICAgICByb290LFxuICAgICAgICByZWZWYWwsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICBjdXN0b21SdWxlcyxcbiAgICAgICAgZXF1YWwsXG4gICAgICAgIHVjczJsZW5ndGgsXG4gICAgICAgIFZhbGlkYXRpb25FcnJvclxuICAgICAgKTtcblxuICAgICAgcmVmVmFsWzBdID0gdmFsaWRhdGU7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBzZWxmLmxvZ2dlci5lcnJvcignRXJyb3IgY29tcGlsaW5nIHNjaGVtYSwgZnVuY3Rpb24gY29kZTonLCBzb3VyY2VDb2RlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUuc2NoZW1hID0gX3NjaGVtYTtcbiAgICB2YWxpZGF0ZS5lcnJvcnMgPSBudWxsO1xuICAgIHZhbGlkYXRlLnJlZnMgPSByZWZzO1xuICAgIHZhbGlkYXRlLnJlZlZhbCA9IHJlZlZhbDtcbiAgICB2YWxpZGF0ZS5yb290ID0gaXNSb290ID8gdmFsaWRhdGUgOiBfcm9vdDtcbiAgICBpZiAoJGFzeW5jKSB2YWxpZGF0ZS4kYXN5bmMgPSB0cnVlO1xuICAgIGlmIChvcHRzLnNvdXJjZUNvZGUgPT09IHRydWUpIHtcbiAgICAgIHZhbGlkYXRlLnNvdXJjZSA9IHtcbiAgICAgICAgY29kZTogc291cmNlQ29kZSxcbiAgICAgICAgcGF0dGVybnM6IHBhdHRlcm5zLFxuICAgICAgICBkZWZhdWx0czogZGVmYXVsdHNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlZihiYXNlSWQsIHJlZiwgaXNSb290KSB7XG4gICAgcmVmID0gcmVzb2x2ZS51cmwoYmFzZUlkLCByZWYpO1xuICAgIHZhciByZWZJbmRleCA9IHJlZnNbcmVmXTtcbiAgICB2YXIgX3JlZlZhbCwgcmVmQ29kZTtcbiAgICBpZiAocmVmSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgX3JlZlZhbCA9IHJlZlZhbFtyZWZJbmRleF07XG4gICAgICByZWZDb2RlID0gJ3JlZlZhbFsnICsgcmVmSW5kZXggKyAnXSc7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRSZWYoX3JlZlZhbCwgcmVmQ29kZSk7XG4gICAgfVxuICAgIGlmICghaXNSb290ICYmIHJvb3QucmVmcykge1xuICAgICAgdmFyIHJvb3RSZWZJZCA9IHJvb3QucmVmc1tyZWZdO1xuICAgICAgaWYgKHJvb3RSZWZJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF9yZWZWYWwgPSByb290LnJlZlZhbFtyb290UmVmSWRdO1xuICAgICAgICByZWZDb2RlID0gYWRkTG9jYWxSZWYocmVmLCBfcmVmVmFsKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkUmVmKF9yZWZWYWwsIHJlZkNvZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlZkNvZGUgPSBhZGRMb2NhbFJlZihyZWYpO1xuICAgIHZhciB2ID0gcmVzb2x2ZS5jYWxsKHNlbGYsIGxvY2FsQ29tcGlsZSwgcm9vdCwgcmVmKTtcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgbG9jYWxTY2hlbWEgPSBsb2NhbFJlZnMgJiYgbG9jYWxSZWZzW3JlZl07XG4gICAgICBpZiAobG9jYWxTY2hlbWEpIHtcbiAgICAgICAgdiA9IHJlc29sdmUuaW5saW5lUmVmKGxvY2FsU2NoZW1hLCBvcHRzLmlubGluZVJlZnMpXG4gICAgICAgICAgICA/IGxvY2FsU2NoZW1hXG4gICAgICAgICAgICA6IGNvbXBpbGUuY2FsbChzZWxmLCBsb2NhbFNjaGVtYSwgcm9vdCwgbG9jYWxSZWZzLCBiYXNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbW92ZUxvY2FsUmVmKHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcGxhY2VMb2NhbFJlZihyZWYsIHYpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkUmVmKHYsIHJlZkNvZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExvY2FsUmVmKHJlZiwgdikge1xuICAgIHZhciByZWZJZCA9IHJlZlZhbC5sZW5ndGg7XG4gICAgcmVmVmFsW3JlZklkXSA9IHY7XG4gICAgcmVmc1tyZWZdID0gcmVmSWQ7XG4gICAgcmV0dXJuICdyZWZWYWwnICsgcmVmSWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMb2NhbFJlZihyZWYpIHtcbiAgICBkZWxldGUgcmVmc1tyZWZdO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVwbGFjZUxvY2FsUmVmKHJlZiwgdikge1xuICAgIHZhciByZWZJZCA9IHJlZnNbcmVmXTtcbiAgICByZWZWYWxbcmVmSWRdID0gdjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVkUmVmKHJlZlZhbCwgY29kZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVmVmFsID09ICdvYmplY3QnIHx8IHR5cGVvZiByZWZWYWwgPT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICA/IHsgY29kZTogY29kZSwgc2NoZW1hOiByZWZWYWwsIGlubGluZTogdHJ1ZSB9XG4gICAgICAgICAgICA6IHsgY29kZTogY29kZSwgJGFzeW5jOiByZWZWYWwgJiYgISFyZWZWYWwuJGFzeW5jIH07XG4gIH1cblxuICBmdW5jdGlvbiB1c2VQYXR0ZXJuKHJlZ2V4U3RyKSB7XG4gICAgdmFyIGluZGV4ID0gcGF0dGVybnNIYXNoW3JlZ2V4U3RyXTtcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBwYXR0ZXJuc0hhc2hbcmVnZXhTdHJdID0gcGF0dGVybnMubGVuZ3RoO1xuICAgICAgcGF0dGVybnNbaW5kZXhdID0gcmVnZXhTdHI7XG4gICAgfVxuICAgIHJldHVybiAncGF0dGVybicgKyBpbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZURlZmF1bHQodmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gJycgKyB2YWx1ZTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB1dGlsLnRvUXVvdGVkU3RyaW5nKHZhbHVlKTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICAgICAgdmFyIHZhbHVlU3RyID0gc3RhYmxlU3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgdmFyIGluZGV4ID0gZGVmYXVsdHNIYXNoW3ZhbHVlU3RyXTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGRlZmF1bHRzSGFzaFt2YWx1ZVN0cl0gPSBkZWZhdWx0cy5sZW5ndGg7XG4gICAgICAgICAgZGVmYXVsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdkZWZhdWx0JyArIGluZGV4O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUN1c3RvbVJ1bGUocnVsZSwgc2NoZW1hLCBwYXJlbnRTY2hlbWEsIGl0KSB7XG4gICAgaWYgKHNlbGYuX29wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgZGVwcyA9IHJ1bGUuZGVmaW5pdGlvbi5kZXBlbmRlbmNpZXM7XG4gICAgICBpZiAoZGVwcyAmJiAhZGVwcy5ldmVyeShmdW5jdGlvbihrZXl3b3JkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50U2NoZW1hLCBrZXl3b3JkKTtcbiAgICAgIH0pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudCBzY2hlbWEgbXVzdCBoYXZlIGFsbCByZXF1aXJlZCBrZXl3b3JkczogJyArIGRlcHMuam9pbignLCcpKTtcblxuICAgICAgdmFyIHZhbGlkYXRlU2NoZW1hID0gcnVsZS5kZWZpbml0aW9uLnZhbGlkYXRlU2NoZW1hO1xuICAgICAgaWYgKHZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAgIHZhciB2YWxpZCA9IHZhbGlkYXRlU2NoZW1hKHNjaGVtYSk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICB2YXIgbWVzc2FnZSA9ICdrZXl3b3JkIHNjaGVtYSBpcyBpbnZhbGlkOiAnICsgc2VsZi5lcnJvcnNUZXh0KHZhbGlkYXRlU2NoZW1hLmVycm9ycyk7XG4gICAgICAgICAgaWYgKHNlbGYuX29wdHMudmFsaWRhdGVTY2hlbWEgPT0gJ2xvZycpIHNlbGYubG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbXBpbGUgPSBydWxlLmRlZmluaXRpb24uY29tcGlsZVxuICAgICAgLCBpbmxpbmUgPSBydWxlLmRlZmluaXRpb24uaW5saW5lXG4gICAgICAsIG1hY3JvID0gcnVsZS5kZWZpbml0aW9uLm1hY3JvO1xuXG4gICAgdmFyIHZhbGlkYXRlO1xuICAgIGlmIChjb21waWxlKSB7XG4gICAgICB2YWxpZGF0ZSA9IGNvbXBpbGUuY2FsbChzZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpO1xuICAgIH0gZWxzZSBpZiAobWFjcm8pIHtcbiAgICAgIHZhbGlkYXRlID0gbWFjcm8uY2FsbChzZWxmLCBzY2hlbWEsIHBhcmVudFNjaGVtYSwgaXQpO1xuICAgICAgaWYgKG9wdHMudmFsaWRhdGVTY2hlbWEgIT09IGZhbHNlKSBzZWxmLnZhbGlkYXRlU2NoZW1hKHZhbGlkYXRlLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGlubGluZSkge1xuICAgICAgdmFsaWRhdGUgPSBpbmxpbmUuY2FsbChzZWxmLCBpdCwgcnVsZS5rZXl3b3JkLCBzY2hlbWEsIHBhcmVudFNjaGVtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlID0gcnVsZS5kZWZpbml0aW9uLnZhbGlkYXRlO1xuICAgICAgaWYgKCF2YWxpZGF0ZSkgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjdXN0b20ga2V5d29yZCBcIicgKyBydWxlLmtleXdvcmQgKyAnXCJmYWlsZWQgdG8gY29tcGlsZScpO1xuXG4gICAgdmFyIGluZGV4ID0gY3VzdG9tUnVsZXMubGVuZ3RoO1xuICAgIGN1c3RvbVJ1bGVzW2luZGV4XSA9IHZhbGlkYXRlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6ICdjdXN0b21SdWxlJyArIGluZGV4LFxuICAgICAgdmFsaWRhdGU6IHZhbGlkYXRlXG4gICAgfTtcbiAgfVxufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBzY2hlbWEgaXMgY3VycmVudGx5IGNvbXBpbGVkXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIGNvbXBpbGVcbiAqIEBwYXJhbSAge09iamVjdH0gcm9vdCByb290IG9iamVjdFxuICogQHBhcmFtICB7U3RyaW5nfSBiYXNlSWQgYmFzZSBzY2hlbWEgSURcbiAqIEByZXR1cm4ge09iamVjdH0gb2JqZWN0IHdpdGggcHJvcGVydGllcyBcImluZGV4XCIgKGNvbXBpbGF0aW9uIGluZGV4KSBhbmQgXCJjb21waWxpbmdcIiAoYm9vbGVhbilcbiAqL1xuZnVuY3Rpb24gY2hlY2tDb21waWxpbmcoc2NoZW1hLCByb290LCBiYXNlSWQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICB2YXIgaW5kZXggPSBjb21wSW5kZXguY2FsbCh0aGlzLCBzY2hlbWEsIHJvb3QsIGJhc2VJZCk7XG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4geyBpbmRleDogaW5kZXgsIGNvbXBpbGluZzogdHJ1ZSB9O1xuICBpbmRleCA9IHRoaXMuX2NvbXBpbGF0aW9ucy5sZW5ndGg7XG4gIHRoaXMuX2NvbXBpbGF0aW9uc1tpbmRleF0gPSB7XG4gICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgcm9vdDogcm9vdCxcbiAgICBiYXNlSWQ6IGJhc2VJZFxuICB9O1xuICByZXR1cm4geyBpbmRleDogaW5kZXgsIGNvbXBpbGluZzogZmFsc2UgfTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHNjaGVtYSBmcm9tIHRoZSBjdXJyZW50bHkgY29tcGlsZWQgbGlzdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSB0byBjb21waWxlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYmFzZUlkIGJhc2Ugc2NoZW1hIElEXG4gKi9cbmZ1bmN0aW9uIGVuZENvbXBpbGluZyhzY2hlbWEsIHJvb3QsIGJhc2VJZCkge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIHZhciBpID0gY29tcEluZGV4LmNhbGwodGhpcywgc2NoZW1hLCByb290LCBiYXNlSWQpO1xuICBpZiAoaSA+PSAwKSB0aGlzLl9jb21waWxhdGlvbnMuc3BsaWNlKGksIDEpO1xufVxuXG5cbi8qKlxuICogSW5kZXggb2Ygc2NoZW1hIGNvbXBpbGF0aW9uIGluIHRoZSBjdXJyZW50bHkgY29tcGlsZWQgbGlzdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSAge09iamVjdH0gc2NoZW1hIHNjaGVtYSB0byBjb21waWxlXG4gKiBAcGFyYW0gIHtPYmplY3R9IHJvb3Qgcm9vdCBvYmplY3RcbiAqIEBwYXJhbSAge1N0cmluZ30gYmFzZUlkIGJhc2Ugc2NoZW1hIElEXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBjb21waWxhdGlvbiBpbmRleFxuICovXG5mdW5jdGlvbiBjb21wSW5kZXgoc2NoZW1hLCByb290LCBiYXNlSWQpIHtcbiAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fY29tcGlsYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSB0aGlzLl9jb21waWxhdGlvbnNbaV07XG4gICAgaWYgKGMuc2NoZW1hID09IHNjaGVtYSAmJiBjLnJvb3QgPT0gcm9vdCAmJiBjLmJhc2VJZCA9PSBiYXNlSWQpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5mdW5jdGlvbiBwYXR0ZXJuQ29kZShpLCBwYXR0ZXJucykge1xuICByZXR1cm4gJ3ZhciBwYXR0ZXJuJyArIGkgKyAnID0gbmV3IFJlZ0V4cCgnICsgdXRpbC50b1F1b3RlZFN0cmluZyhwYXR0ZXJuc1tpXSkgKyAnKTsnO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmF1bHRDb2RlKGkpIHtcbiAgcmV0dXJuICd2YXIgZGVmYXVsdCcgKyBpICsgJyA9IGRlZmF1bHRzWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiByZWZWYWxDb2RlKGksIHJlZlZhbCkge1xuICByZXR1cm4gcmVmVmFsW2ldID09PSB1bmRlZmluZWQgPyAnJyA6ICd2YXIgcmVmVmFsJyArIGkgKyAnID0gcmVmVmFsWycgKyBpICsgJ107Jztcbn1cblxuXG5mdW5jdGlvbiBjdXN0b21SdWxlQ29kZShpKSB7XG4gIHJldHVybiAndmFyIGN1c3RvbVJ1bGUnICsgaSArICcgPSBjdXN0b21SdWxlc1snICsgaSArICddOyc7XG59XG5cblxuZnVuY3Rpb24gdmFycyhhcnIsIHN0YXRlbWVudCkge1xuICBpZiAoIWFyci5sZW5ndGgpIHJldHVybiAnJztcbiAgdmFyIGNvZGUgPSAnJztcbiAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKylcbiAgICBjb2RlICs9IHN0YXRlbWVudChpLCBhcnIpO1xuICByZXR1cm4gY29kZTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cblxudmFyIENhY2hlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBDYWNoZSgpIHtcbiAgdGhpcy5fY2FjaGUgPSB7fTtcbn07XG5cblxuQ2FjaGUucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uIENhY2hlX3B1dChrZXksIHZhbHVlKSB7XG4gIHRoaXMuX2NhY2hlW2tleV0gPSB2YWx1ZTtcbn07XG5cblxuQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIENhY2hlX2dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX2NhY2hlW2tleV07XG59O1xuXG5cbkNhY2hlLnByb3RvdHlwZS5kZWwgPSBmdW5jdGlvbiBDYWNoZV9kZWwoa2V5KSB7XG4gIGRlbGV0ZSB0aGlzLl9jYWNoZVtrZXldO1xufTtcblxuXG5DYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBDYWNoZV9jbGVhcigpIHtcbiAgdGhpcy5fY2FjaGUgPSB7fTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgREFURSA9IC9eKFxcZFxcZFxcZFxcZCktKFxcZFxcZCktKFxcZFxcZCkkLztcbnZhciBEQVlTID0gWzAsMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO1xudmFyIFRJTUUgPSAvXihcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpKFxcLlxcZCspPyh6fFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/KT8kL2k7XG52YXIgSE9TVE5BTUUgPSAvXig/PS57MSwyNTN9XFwuPyQpW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XFwuW2EtejAtOV0oPzpbLTAtOWEtel17MCw2MX1bMC05YS16XSk/KSpcXC4/JC9pO1xudmFyIFVSSSA9IC9eKD86W2Etel1bYS16MC05K1xcLS5dKjopKD86XFwvP1xcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw1fVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPzo6KXxbVnZdWzAtOWEtZl0rXFwuW2EtejAtOVxcLS5ffiEkJicoKSorLDs9Ol0rKVxcXXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPyl8KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9XXwlWzAtOWEtZl17Mn0pKikoPzo6XFxkKik/KD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSp8XFwvKD86KD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJicoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkqKSopP3woPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSsoPzpcXC8oPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QF18JVswLTlhLWZdezJ9KSopKikoPzpcXD8oPzpbYS16MC05XFwtLl9+ISQmJygpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpALz9dfCVbMC05YS1mXXsyfSkqKT8kL2k7XG52YXIgVVJJUkVGID0gL14oPzpbYS16XVthLXowLTkrXFwtLl0qOik/KD86XFwvP1xcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnKCkqKyw7PTpdfCVbMC05YS1mXXsyfSkqQCk/KD86XFxbKD86KD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9fDo6KD86WzAtOWEtZl17MSw0fTopezV9fCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDF9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M318KD86KD86WzAtOWEtZl17MSw0fTopezAsMn1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXsyfXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTp8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86OikoPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw1fVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw2fVswLTlhLWZdezEsNH0pPzo6KXxbVnZdWzAtOWEtZl0rXFwuW2EtejAtOVxcLS5ffiEkJicoKSorLDs9Ol0rKVxcXXwoPzooPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPyl8KD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz1dfCVbMC05YS1mXXsyfSkqKSg/OjpcXGQqKT8oPzpcXC8oPzpbYS16MC05XFwtLl9+ISQmJ1wiKCkqKyw7PTpAXXwlWzAtOWEtZl17Mn0pKikqfFxcLyg/Oig/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/fCg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkBdfCVbMC05YS1mXXsyfSkrKD86XFwvKD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QF18JVswLTlhLWZdezJ9KSopKik/KD86XFw/KD86W2EtejAtOVxcLS5ffiEkJidcIigpKissOz06QC8/XXwlWzAtOWEtZl17Mn0pKik/KD86Iyg/OlthLXowLTlcXC0uX34hJCYnXCIoKSorLDs9OkAvP118JVswLTlhLWZdezJ9KSopPyQvaTtcbi8vIHVyaS10ZW1wbGF0ZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY1NzBcbnZhciBVUklURU1QTEFURSA9IC9eKD86KD86W15cXHgwMC1cXHgyMFwiJzw+JVxcXFxeYHt8fV18JVswLTlhLWZdezJ9KXxcXHtbKyMuLzs/Jj0sIUB8XT8oPzpbYS16MC05X118JVswLTlhLWZdezJ9KSsoPzo6WzEtOV1bMC05XXswLDN9fFxcKik/KD86LCg/OlthLXowLTlfXXwlWzAtOWEtZl17Mn0pKyg/OjpbMS05XVswLTldezAsM318XFwqKT8pKlxcfSkqJC9pO1xuLy8gRm9yIHRoZSBzb3VyY2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RwZXJpbmkvNzI5Mjk0XG4vLyBGb3IgdGVzdCBjYXNlczogaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL2RlbW8vdXJsLXJlZ2V4XG4vLyBAdG9kbyBEZWxldGUgY3VycmVudCBVUkwgaW4gZmF2b3VyIG9mIHRoZSBjb21tZW50ZWQgb3V0IFVSTCBydWxlIHdoZW4gdGhpcyBpc3N1ZSBpcyBmaXhlZCBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvNzk4My5cbi8vIHZhciBVUkwgPSAvXig/Oig/Omh0dHBzP3xmdHApOlxcL1xcLykoPzpcXFMrKD86OlxcUyopP0ApPyg/Oig/ITEwKD86XFwuXFxkezEsM30pezN9KSg/ITEyNyg/OlxcLlxcZHsxLDN9KXszfSkoPyExNjlcXC4yNTQoPzpcXC5cXGR7MSwzfSl7Mn0pKD8hMTkyXFwuMTY4KD86XFwuXFxkezEsM30pezJ9KSg/ITE3MlxcLig/OjFbNi05XXwyXFxkfDNbMC0xXSkoPzpcXC5cXGR7MSwzfSl7Mn0pKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswMV1cXGR8MjJbMC0zXSkoPzpcXC4oPzoxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSl7Mn0oPzpcXC4oPzpbMS05XVxcZD98MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC00XSkpfCg/Oig/OlthLXpcXHV7MDBhMX0tXFx1e2ZmZmZ9MC05XSstKSpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rKSg/OlxcLig/OlthLXpcXHV7MDBhMX0tXFx1e2ZmZmZ9MC05XSstKSpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfTAtOV0rKSooPzpcXC4oPzpbYS16XFx1ezAwYTF9LVxcdXtmZmZmfV17Mix9KSkpKD86OlxcZHsyLDV9KT8oPzpcXC9bXlxcc10qKT8kL2l1O1xudmFyIFVSTCA9IC9eKD86KD86aHR0cFtzXFx1MDE3Rl0/fGZ0cCk6XFwvXFwvKSg/Oig/OltcXDAtXFx4MDhcXHgwRS1cXHgxRiEtXFx4OUZcXHhBMS1cXHUxNjdGXFx1MTY4MS1cXHUxRkZGXFx1MjAwQi1cXHUyMDI3XFx1MjAyQS1cXHUyMDJFXFx1MjAzMC1cXHUyMDVFXFx1MjA2MC1cXHUyRkZGXFx1MzAwMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRUZFXFx1RkYwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSsoPzo6KD86W1xcMC1cXHgwOFxceDBFLVxceDFGIS1cXHg5RlxceEExLVxcdTE2N0ZcXHUxNjgxLVxcdTFGRkZcXHUyMDBCLVxcdTIwMjdcXHUyMDJBLVxcdTIwMkVcXHUyMDMwLVxcdTIwNUVcXHUyMDYwLVxcdTJGRkZcXHUzMDAxLVxcdUQ3RkZcXHVFMDAwLVxcdUZFRkVcXHVGRjAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKik/QCk/KD86KD8hMTAoPzpcXC5bMC05XXsxLDN9KXszfSkoPyExMjcoPzpcXC5bMC05XXsxLDN9KXszfSkoPyExNjlcXC4yNTQoPzpcXC5bMC05XXsxLDN9KXsyfSkoPyExOTJcXC4xNjgoPzpcXC5bMC05XXsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlswLTldfDNbMDFdKSg/OlxcLlswLTldezEsM30pezJ9KSg/OlsxLTldWzAtOV0/fDFbMC05XVswLTldfDJbMDFdWzAtOV18MjJbMC0zXSkoPzpcXC4oPzoxP1swLTldezEsMn18MlswLTRdWzAtOV18MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1bMC05XT98MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC00XSkpfCg/Oig/Oig/OlswLTlhLXpcXHhBMS1cXHVEN0ZGXFx1RTAwMC1cXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXSkrLSkqKD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSspKD86XFwuKD86KD86WzAtOWEtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKSstKSooPzpbMC05YS16XFx4QTEtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKykqKD86XFwuKD86KD86W2EtelxceEExLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdKXsyLH0pKSkoPzo6WzAtOV17Miw1fSk/KD86XFwvKD86W1xcMC1cXHgwOFxceDBFLVxceDFGIS1cXHg5RlxceEExLVxcdTE2N0ZcXHUxNjgxLVxcdTFGRkZcXHUyMDBCLVxcdTIwMjdcXHUyMDJBLVxcdTIwMkVcXHUyMDMwLVxcdTIwNUVcXHUyMDYwLVxcdTJGRkZcXHUzMDAxLVxcdUQ3RkZcXHVFMDAwLVxcdUZFRkVcXHVGRjAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pKik/JC9pO1xudmFyIFVVSUQgPSAvXig/OnVybjp1dWlkOik/WzAtOWEtZl17OH0tKD86WzAtOWEtZl17NH0tKXszfVswLTlhLWZdezEyfSQvaTtcbnZhciBKU09OX1BPSU5URVIgPSAvXig/OlxcLyg/Oltefi9dfH4wfH4xKSopKiQvO1xudmFyIEpTT05fUE9JTlRFUl9VUklfRlJBR01FTlQgPSAvXiMoPzpcXC8oPzpbYS16MC05X1xcLS4hJCYnKCkqKyw7Oj1AXXwlWzAtOWEtZl17Mn18fjB8fjEpKikqJC9pO1xudmFyIFJFTEFUSVZFX0pTT05fUE9JTlRFUiA9IC9eKD86MHxbMS05XVswLTldKikoPzojfCg/OlxcLyg/Oltefi9dfH4wfH4xKSopKikkLztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvcm1hdHM7XG5cbmZ1bmN0aW9uIGZvcm1hdHMobW9kZSkge1xuICBtb2RlID0gbW9kZSA9PSAnZnVsbCcgPyAnZnVsbCcgOiAnZmFzdCc7XG4gIHJldHVybiB1dGlsLmNvcHkoZm9ybWF0c1ttb2RlXSk7XG59XG5cblxuZm9ybWF0cy5mYXN0ID0ge1xuICAvLyBkYXRlOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42XG4gIGRhdGU6IC9eXFxkXFxkXFxkXFxkLVswLTFdXFxkLVswLTNdXFxkJC8sXG4gIC8vIGRhdGUtdGltZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB0aW1lOiAvXig/OlswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkfDIzOjU5OjYwKSg/OlxcLlxcZCspPyg/Onp8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8pPyQvaSxcbiAgJ2RhdGUtdGltZSc6IC9eXFxkXFxkXFxkXFxkLVswLTFdXFxkLVswLTNdXFxkW3RcXHNdKD86WzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGR8MjM6NTk6NjApKD86XFwuXFxkKyk/KD86enxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPykkL2ksXG4gIC8vIHVyaTogaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9pcy1teS1qc29uLXZhbGlkL2Jsb2IvbWFzdGVyL2Zvcm1hdHMuanNcbiAgdXJpOiAvXig/OlthLXpdW2EtejAtOStcXC0uXSo6KSg/OlxcLz9cXC8pP1teXFxzXSokL2ksXG4gICd1cmktcmVmZXJlbmNlJzogL14oPzooPzpbYS16XVthLXowLTkrXFwtLl0qOik/XFwvP1xcLyk/KD86W15cXFxcXFxzI11bXlxccyNdKik/KD86I1teXFxcXFxcc10qKT8kL2ksXG4gICd1cmktdGVtcGxhdGUnOiBVUklURU1QTEFURSxcbiAgdXJsOiBVUkwsXG4gIC8vIGVtYWlsIChzb3VyY2VzIGZyb20ganNlbiB2YWxpZGF0b3IpOlxuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIwMTMyMy91c2luZy1hLXJlZ3VsYXItZXhwcmVzc2lvbi10by12YWxpZGF0ZS1hbi1lbWFpbC1hZGRyZXNzI2Fuc3dlci04ODI5MzYzXG4gIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Zvcm1zLmh0bWwjdmFsaWQtZS1tYWlsLWFkZHJlc3MgKHNlYXJjaCBmb3IgJ3dpbGxmdWwgdmlvbGF0aW9uJylcbiAgZW1haWw6IC9eW2EtejAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XFwuW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KSokL2ksXG4gIGhvc3RuYW1lOiBIT1NUTkFNRSxcbiAgLy8gb3B0aW1pemVkIGh0dHBzOi8vd3d3LnNhZmFyaWJvb2tzb25saW5lLmNvbS9saWJyYXJ5L3ZpZXcvcmVndWxhci1leHByZXNzaW9ucy1jb29rYm9vay85NzgwNTk2ODAyODM3L2NoMDdzMTYuaHRtbFxuICBpcHY0OiAvXig/Oig/OjI1WzAtNV18MlswLTRdXFxkfFswMV0/XFxkXFxkPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KSQvLFxuICAvLyBvcHRpbWl6ZWQgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81MzQ5Ny9yZWd1bGFyLWV4cHJlc3Npb24tdGhhdC1tYXRjaGVzLXZhbGlkLWlwdjYtYWRkcmVzc2VzXG4gIGlwdjY6IC9eXFxzKig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs3fSg/OlswLTlhLWZdezEsNH18OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXs2fSg/OjpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwyfSl8Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NH0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwzfSl8KD86KD86OlswLTlhLWZdezEsNH0pPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXszfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDR9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwyfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsyfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDV9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwzfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsxfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCw0fTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/OjooPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw3fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNX06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoPzolLispP1xccyokL2ksXG4gIHJlZ2V4OiByZWdleCxcbiAgLy8gdXVpZDogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDEyMlxuICB1dWlkOiBVVUlELFxuICAvLyBKU09OLXBvaW50ZXI6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxXG4gIC8vIHVyaSBmcmFnbWVudDogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQVxuICAnanNvbi1wb2ludGVyJzogSlNPTl9QT0lOVEVSLFxuICAnanNvbi1wb2ludGVyLXVyaS1mcmFnbWVudCc6IEpTT05fUE9JTlRFUl9VUklfRlJBR01FTlQsXG4gIC8vIHJlbGF0aXZlIEpTT04tcG9pbnRlcjogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbHVmZi1yZWxhdGl2ZS1qc29uLXBvaW50ZXItMDBcbiAgJ3JlbGF0aXZlLWpzb24tcG9pbnRlcic6IFJFTEFUSVZFX0pTT05fUE9JTlRFUlxufTtcblxuXG5mb3JtYXRzLmZ1bGwgPSB7XG4gIGRhdGU6IGRhdGUsXG4gIHRpbWU6IHRpbWUsXG4gICdkYXRlLXRpbWUnOiBkYXRlX3RpbWUsXG4gIHVyaTogdXJpLFxuICAndXJpLXJlZmVyZW5jZSc6IFVSSVJFRixcbiAgJ3VyaS10ZW1wbGF0ZSc6IFVSSVRFTVBMQVRFLFxuICB1cmw6IFVSTCxcbiAgZW1haWw6IC9eW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/JC9pLFxuICBob3N0bmFtZTogSE9TVE5BTUUsXG4gIGlwdjQ6IC9eKD86KD86MjVbMC01XXwyWzAtNF1cXGR8WzAxXT9cXGRcXGQ/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVxcZHxbMDFdP1xcZFxcZD8pJC8sXG4gIGlwdjY6IC9eXFxzKig/Oig/Oig/OlswLTlhLWZdezEsNH06KXs3fSg/OlswLTlhLWZdezEsNH18OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXs2fSg/OjpbMC05YS1mXXsxLDR9fCg/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwyfSl8Oig/Oig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSg/OlxcLig/OjI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pfDopKXwoPzooPzpbMC05YS1mXXsxLDR9Oil7NH0oPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSwzfSl8KD86KD86OlswLTlhLWZdezEsNH0pPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXszfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDR9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwyfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsyfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDV9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCwzfTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/Oig/OlswLTlhLWZdezEsNH06KXsxfSg/Oig/Oig/OjpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoPzooPzo6WzAtOWEtZl17MSw0fSl7MCw0fTooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoPzpcXC4oPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg/OjooPzooPzooPzo6WzAtOWEtZl17MSw0fSl7MSw3fSl8KD86KD86OlswLTlhLWZdezEsNH0pezAsNX06KD86KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD86XFwuKD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKSkoPzolLispP1xccyokL2ksXG4gIHJlZ2V4OiByZWdleCxcbiAgdXVpZDogVVVJRCxcbiAgJ2pzb24tcG9pbnRlcic6IEpTT05fUE9JTlRFUixcbiAgJ2pzb24tcG9pbnRlci11cmktZnJhZ21lbnQnOiBKU09OX1BPSU5URVJfVVJJX0ZSQUdNRU5ULFxuICAncmVsYXRpdmUtanNvbi1wb2ludGVyJzogUkVMQVRJVkVfSlNPTl9QT0lOVEVSXG59O1xuXG5cbmZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNhcHBlbmRpeC1DXG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cblxuXG5mdW5jdGlvbiBkYXRlKHN0cikge1xuICAvLyBmdWxsLWRhdGUgZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5I3NlY3Rpb24tNS42XG4gIHZhciBtYXRjaGVzID0gc3RyLm1hdGNoKERBVEUpO1xuICBpZiAoIW1hdGNoZXMpIHJldHVybiBmYWxzZTtcblxuICB2YXIgeWVhciA9ICttYXRjaGVzWzFdO1xuICB2YXIgbW9udGggPSArbWF0Y2hlc1syXTtcbiAgdmFyIGRheSA9ICttYXRjaGVzWzNdO1xuXG4gIHJldHVybiBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyICYmIGRheSA+PSAxICYmXG4gICAgICAgICAgZGF5IDw9IChtb250aCA9PSAyICYmIGlzTGVhcFllYXIoeWVhcikgPyAyOSA6IERBWVNbbW9udGhdKTtcbn1cblxuXG5mdW5jdGlvbiB0aW1lKHN0ciwgZnVsbCkge1xuICB2YXIgbWF0Y2hlcyA9IHN0ci5tYXRjaChUSU1FKTtcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGhvdXIgPSBtYXRjaGVzWzFdO1xuICB2YXIgbWludXRlID0gbWF0Y2hlc1syXTtcbiAgdmFyIHNlY29uZCA9IG1hdGNoZXNbM107XG4gIHZhciB0aW1lWm9uZSA9IG1hdGNoZXNbNV07XG4gIHJldHVybiAoKGhvdXIgPD0gMjMgJiYgbWludXRlIDw9IDU5ICYmIHNlY29uZCA8PSA1OSkgfHxcbiAgICAgICAgICAoaG91ciA9PSAyMyAmJiBtaW51dGUgPT0gNTkgJiYgc2Vjb25kID09IDYwKSkgJiZcbiAgICAgICAgICghZnVsbCB8fCB0aW1lWm9uZSk7XG59XG5cblxudmFyIERBVEVfVElNRV9TRVBBUkFUT1IgPSAvdHxcXHMvaTtcbmZ1bmN0aW9uIGRhdGVfdGltZShzdHIpIHtcbiAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSNzZWN0aW9uLTUuNlxuICB2YXIgZGF0ZVRpbWUgPSBzdHIuc3BsaXQoREFURV9USU1FX1NFUEFSQVRPUik7XG4gIHJldHVybiBkYXRlVGltZS5sZW5ndGggPT0gMiAmJiBkYXRlKGRhdGVUaW1lWzBdKSAmJiB0aW1lKGRhdGVUaW1lWzFdLCB0cnVlKTtcbn1cblxuXG52YXIgTk9UX1VSSV9GUkFHTUVOVCA9IC9cXC98Oi87XG5mdW5jdGlvbiB1cmkoc3RyKSB7XG4gIC8vIGh0dHA6Ly9qbXJ3YXJlLmNvbS9hcnRpY2xlcy8yMDA5L3VyaV9yZWdleHAvVVJJX3JlZ2V4Lmh0bWwgKyBvcHRpb25hbCBwcm90b2NvbCArIHJlcXVpcmVkIFwiLlwiXG4gIHJldHVybiBOT1RfVVJJX0ZSQUdNRU5ULnRlc3Qoc3RyKSAmJiBVUkkudGVzdChzdHIpO1xufVxuXG5cbnZhciBaX0FOQ0hPUiA9IC9bXlxcXFxdXFxcXFovO1xuZnVuY3Rpb24gcmVnZXgoc3RyKSB7XG4gIGlmIChaX0FOQ0hPUi50ZXN0KHN0cikpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBuZXcgUmVnRXhwKHN0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcmVmKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkYXN5bmMsICRyZWZDb2RlO1xuICBpZiAoJHNjaGVtYSA9PSAnIycgfHwgJHNjaGVtYSA9PSAnIy8nKSB7XG4gICAgaWYgKGl0LmlzUm9vdCkge1xuICAgICAgJGFzeW5jID0gaXQuYXN5bmM7XG4gICAgICAkcmVmQ29kZSA9ICd2YWxpZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgICRhc3luYyA9IGl0LnJvb3Quc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZTtcbiAgICAgICRyZWZDb2RlID0gJ3Jvb3QucmVmVmFsWzBdJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyICRyZWZWYWwgPSBpdC5yZXNvbHZlUmVmKGl0LmJhc2VJZCwgJHNjaGVtYSwgaXQuaXNSb290KTtcbiAgICBpZiAoJHJlZlZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgJG1lc3NhZ2UgPSBpdC5NaXNzaW5nUmVmRXJyb3IubWVzc2FnZShpdC5iYXNlSWQsICRzY2hlbWEpO1xuICAgICAgaWYgKGl0Lm9wdHMubWlzc2luZ1JlZnMgPT0gJ2ZhaWwnKSB7XG4gICAgICAgIGl0LmxvZ2dlci5lcnJvcigkbWVzc2FnZSk7XG4gICAgICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnJHJlZicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcmVmOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKSArICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdjYW5cXFxcXFwndCByZXNvbHZlIHJlZmVyZW5jZSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKSArICdcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKGZhbHNlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXQub3B0cy5taXNzaW5nUmVmcyA9PSAnaWdub3JlJykge1xuICAgICAgICBpdC5sb2dnZXIud2FybigkbWVzc2FnZSk7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IGl0Lk1pc3NpbmdSZWZFcnJvcihpdC5iYXNlSWQsICRzY2hlbWEsICRtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCRyZWZWYWwuaW5saW5lKSB7XG4gICAgICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgICAgICRpdC5sZXZlbCsrO1xuICAgICAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICAgICAgJGl0LnNjaGVtYSA9ICRyZWZWYWwuc2NoZW1hO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSAnJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJHNjaGVtYTtcbiAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCkucmVwbGFjZSgvdmFsaWRhdGVcXC5zY2hlbWEvZywgJHJlZlZhbC5jb2RlKTtcbiAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICRhc3luYyA9ICRyZWZWYWwuJGFzeW5jID09PSB0cnVlIHx8IChpdC5hc3luYyAmJiAkcmVmVmFsLiRhc3luYyAhPT0gZmFsc2UpO1xuICAgICAgJHJlZkNvZGUgPSAkcmVmVmFsLmNvZGU7XG4gICAgfVxuICB9XG4gIGlmICgkcmVmQ29kZSkge1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJztcbiAgICBpZiAoaXQub3B0cy5wYXNzQ29udGV4dCkge1xuICAgICAgb3V0ICs9ICcgJyArICgkcmVmQ29kZSkgKyAnLmNhbGwodGhpcywgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgJyArICgkcmVmQ29kZSkgKyAnKCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRkYXRhKSArICcsIChkYXRhUGF0aCB8fCBcXCdcXCcpJztcbiAgICBpZiAoaXQuZXJyb3JQYXRoICE9ICdcIlwiJykge1xuICAgICAgb3V0ICs9ICcgKyAnICsgKGl0LmVycm9yUGF0aCk7XG4gICAgfVxuICAgIHZhciAkcGFyZW50RGF0YSA9ICRkYXRhTHZsID8gJ2RhdGEnICsgKCgkZGF0YUx2bCAtIDEpIHx8ICcnKSA6ICdwYXJlbnREYXRhJyxcbiAgICAgICRwYXJlbnREYXRhUHJvcGVydHkgPSAkZGF0YUx2bCA/IGl0LmRhdGFQYXRoQXJyWyRkYXRhTHZsXSA6ICdwYXJlbnREYXRhUHJvcGVydHknO1xuICAgIG91dCArPSAnICwgJyArICgkcGFyZW50RGF0YSkgKyAnICwgJyArICgkcGFyZW50RGF0YVByb3BlcnR5KSArICcsIHJvb3REYXRhKSAgJztcbiAgICB2YXIgX19jYWxsVmFsaWRhdGUgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoJGFzeW5jKSB7XG4gICAgICBpZiAoIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIHNjaGVtYSByZWZlcmVuY2VkIGJ5IHN5bmMgc2NoZW1hJyk7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkdmFsaWQpICsgJzsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRyeSB7IGF3YWl0ICcgKyAoX19jYWxsVmFsaWRhdGUpICsgJzsgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSBjYXRjaCAoZSkgeyBpZiAoIShlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkgdGhyb3cgZTsgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBlLmVycm9yczsgZWxzZSB2RXJyb3JzID0gdkVycm9ycy5jb25jYXQoZS5lcnJvcnMpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghJyArIChfX2NhbGxWYWxpZGF0ZSkgKyAnKSB7IGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gJyArICgkcmVmQ29kZSkgKyAnLmVycm9yczsgZWxzZSB2RXJyb3JzID0gdkVycm9ycy5jb25jYXQoJyArICgkcmVmQ29kZSkgKyAnLmVycm9ycyk7IGVycm9ycyA9IHZFcnJvcnMubGVuZ3RoOyB9ICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2FsbE9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQsXG4gICAgJGFsbFNjaGVtYXNFbXB0eSA9IHRydWU7XG4gIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgaWYgKGFycjEpIHtcbiAgICB2YXIgJHNjaCwgJGkgPSAtMSxcbiAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgIHdoaWxlICgkaSA8IGwxKSB7XG4gICAgICAkc2NoID0gYXJyMVskaSArPSAxXTtcbiAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgJGFsbFNjaGVtYXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgaWYgKCRhbGxTY2hlbWFzRW1wdHkpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJGNsb3NpbmdCcmFjZXMuc2xpY2UoMCwgLTEpKSArICcgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2FueU9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkbm9FbXB0eVNjaGVtYSA9ICRzY2hlbWEuZXZlcnkoZnVuY3Rpb24oJHNjaCkge1xuICAgIHJldHVybiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSk7XG4gIH0pO1xuICBpZiAoJG5vRW1wdHlTY2hlbWEpIHtcbiAgICB2YXIgJGN1cnJlbnRCYXNlSWQgPSAkaXQuYmFzZUlkO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7IHZhciAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7ICAnO1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgICBpZiAoYXJyMSkge1xuICAgICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICAgJHNjaCA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgICRpdC5zY2hlbWEgPSAkc2NoO1xuICAgICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJHZhbGlkKSArICcgfHwgJyArICgkbmV4dFZhbGlkKSArICc7IGlmICghJyArICgkdmFsaWQpICsgJykgeyAnO1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICB9XG4gICAgfVxuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnYW55T2YnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIHNvbWUgc2NoZW1hIGluIGFueU9mXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIG91dCArPSAnIH0gZWxzZSB7ICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBpZiAodHJ1ZSkgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29tbWVudChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkY29tbWVudCA9IGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHNjaGVtYSk7XG4gIGlmIChpdC5vcHRzLiRjb21tZW50ID09PSB0cnVlKSB7XG4gICAgb3V0ICs9ICcgY29uc29sZS5sb2coJyArICgkY29tbWVudCkgKyAnKTsnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpdC5vcHRzLiRjb21tZW50ID09ICdmdW5jdGlvbicpIHtcbiAgICBvdXQgKz0gJyBzZWxmLl9vcHRzLiRjb21tZW50KCcgKyAoJGNvbW1lbnQpICsgJywgJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnLCB2YWxpZGF0ZS5yb290LnNjaGVtYSk7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY29uc3QoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgaWYgKCEkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnOyc7XG4gIH1cbiAgb3V0ICs9ICd2YXIgJyArICgkdmFsaWQpICsgJyA9IGVxdWFsKCcgKyAoJGRhdGEpICsgJywgc2NoZW1hJyArICgkbHZsKSArICcpOyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2NvbnN0JykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBhbGxvd2VkVmFsdWU6IHNjaGVtYScgKyAoJGx2bCkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlIGVxdWFsIHRvIGNvbnN0YW50XFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX2NvbnRhaW5zKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRlcnJzID0gJ2VycnNfXycgKyAkbHZsO1xuICB2YXIgJGl0ID0gaXQudXRpbC5jb3B5KGl0KTtcbiAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkaWR4ID0gJ2knICsgJGx2bCxcbiAgICAkZGF0YU54dCA9ICRpdC5kYXRhTGV2ZWwgPSBpdC5kYXRhTGV2ZWwgKyAxLFxuICAgICRuZXh0RGF0YSA9ICdkYXRhJyArICRkYXRhTnh0LFxuICAgICRjdXJyZW50QmFzZUlkID0gaXQuYmFzZUlkLFxuICAgICRub25FbXB0eVNjaGVtYSA9IChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoZW1hID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2hlbWEpLmxlbmd0aCA+IDApIHx8ICRzY2hlbWEgPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoZW1hLCBpdC5SVUxFUy5hbGwpKTtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzO3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmICgkbm9uRW1wdHlTY2hlbWEpIHtcbiAgICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHRWYWxpZCkgKyAnID0gZmFsc2U7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnID0gMDsgJyArICgkaWR4KSArICcgPCAnICsgKCRkYXRhKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7ICc7XG4gICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAkaWR4LCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGlkeCArICddJztcbiAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGlkeDtcbiAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7IH0gICc7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgeyc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgaWYgKCcgKyAoJGRhdGEpICsgJy5sZW5ndGggPT0gMCkgeyc7XG4gIH1cbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdjb250YWlucycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBjb250YWluIGEgdmFsaWQgaXRlbVxcJyAnO1xuICAgIH1cbiAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gIGlmICgkbm9uRW1wdHlTY2hlbWEpIHtcbiAgICBvdXQgKz0gJyAgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodkVycm9ycyAhPT0gbnVsbCkgeyBpZiAoJyArICgkZXJycykgKyAnKSB2RXJyb3JzLmxlbmd0aCA9ICcgKyAoJGVycnMpICsgJzsgZWxzZSB2RXJyb3JzID0gbnVsbDsgfSAnO1xuICB9XG4gIGlmIChpdC5vcHRzLmFsbEVycm9ycykge1xuICAgIG91dCArPSAnIH0gJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZGVwZW5kZW5jaWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJHNjaGVtYURlcHMgPSB7fSxcbiAgICAkcHJvcGVydHlEZXBzID0ge30sXG4gICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXM7XG4gIGZvciAoJHByb3BlcnR5IGluICRzY2hlbWEpIHtcbiAgICBpZiAoJHByb3BlcnR5ID09ICdfX3Byb3RvX18nKSBjb250aW51ZTtcbiAgICB2YXIgJHNjaCA9ICRzY2hlbWFbJHByb3BlcnR5XTtcbiAgICB2YXIgJGRlcHMgPSBBcnJheS5pc0FycmF5KCRzY2gpID8gJHByb3BlcnR5RGVwcyA6ICRzY2hlbWFEZXBzO1xuICAgICRkZXBzWyRwcm9wZXJ0eV0gPSAkc2NoO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczsnO1xuICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGg7XG4gIG91dCArPSAndmFyIG1pc3NpbmcnICsgKCRsdmwpICsgJzsnO1xuICBmb3IgKHZhciAkcHJvcGVydHkgaW4gJHByb3BlcnR5RGVwcykge1xuICAgICRkZXBzID0gJHByb3BlcnR5RGVwc1skcHJvcGVydHldO1xuICAgIGlmICgkZGVwcy5sZW5ndGgpIHtcbiAgICAgIG91dCArPSAnIGlmICggJyArICgkZGF0YSkgKyAoaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHkpKSArICcgIT09IHVuZGVmaW5lZCAnO1xuICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIG91dCArPSAnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnXFwnKSAnO1xuICAgICAgfVxuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgKCAnO1xuICAgICAgICB2YXIgYXJyMSA9ICRkZXBzO1xuICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksICRpID0gLTEsXG4gICAgICAgICAgICBsMSA9IGFycjEubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMSkge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyMVskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkaSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBvdXQgKz0gJyAoICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpICYmIChtaXNzaW5nJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoaXQub3B0cy5qc29uUG9pbnRlcnMgPyAkcHJvcGVydHlLZXkgOiAkcHJvcCkpICsgJykgKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykpIHsgICc7XG4gICAgICAgIHZhciAkcHJvcGVydHlQYXRoID0gJ21pc3NpbmcnICsgJGx2bCxcbiAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gJ1xcJyArICcgKyAkcHJvcGVydHlQYXRoICsgJyArIFxcJyc7XG4gICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC5vcHRzLmpzb25Qb2ludGVycyA/IGl0LnV0aWwuZ2V0UGF0aEV4cHIoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eVBhdGgsIHRydWUpIDogJGN1cnJlbnRFcnJvclBhdGggKyAnICsgJyArICRwcm9wZXJ0eVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdkZXBlbmRlbmNpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IHByb3BlcnR5OiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eSkpICsgJ1xcJywgbWlzc2luZ1Byb3BlcnR5OiBcXCcnICsgKCRtaXNzaW5nUHJvcGVydHkpICsgJ1xcJywgZGVwc0NvdW50OiAnICsgKCRkZXBzLmxlbmd0aCkgKyAnLCBkZXBzOiBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmxlbmd0aCA9PSAxID8gJGRlcHNbMF0gOiAkZGVwcy5qb2luKFwiLCBcIikpKSArICdcXCcgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgaGF2ZSAnO1xuICAgICAgICAgICAgaWYgKCRkZXBzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgIG91dCArPSAncHJvcGVydHkgJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwc1swXSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0aWVzICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJGRlcHMuam9pbihcIiwgXCIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJyB3aGVuIHByb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnIGlzIHByZXNlbnRcXCcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgKSB7ICc7XG4gICAgICAgIHZhciBhcnIyID0gJGRlcHM7XG4gICAgICAgIGlmIChhcnIyKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTIgPSAtMSxcbiAgICAgICAgICAgIGwyID0gYXJyMi5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlIChpMiA8IGwyKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIyW2kyICs9IDFdO1xuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnZGVwZW5kZW5jaWVzJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwcm9wZXJ0eTogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcsIG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcsIGRlcHNDb3VudDogJyArICgkZGVwcy5sZW5ndGgpICsgJywgZGVwczogXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkZGVwcy5sZW5ndGggPT0gMSA/ICRkZXBzWzBdIDogJGRlcHMuam9pbihcIiwgXCIpKSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgaGF2ZSAnO1xuICAgICAgICAgICAgICAgIGlmICgkZGVwcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdwcm9wZXJ0eSAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzWzBdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAncHJvcGVydGllcyAnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRkZXBzLmpvaW4oXCIsIFwiKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB3aGVuIHByb3BlcnR5ICcgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5KSkgKyAnIGlzIHByZXNlbnRcXCcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAgICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZDtcbiAgZm9yICh2YXIgJHByb3BlcnR5IGluICRzY2hlbWFEZXBzKSB7XG4gICAgdmFyICRzY2ggPSAkc2NoZW1hRGVwc1skcHJvcGVydHldO1xuICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgaWYgKCAnICsgKCRkYXRhKSArIChpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eSkpICsgJyAhPT0gdW5kZWZpbmVkICc7XG4gICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgb3V0ICs9ICcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHkpKSArICdcXCcpICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHkpO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aCArICcvJyArIGl0LnV0aWwuZXNjYXBlRnJhZ21lbnQoJHByb3BlcnR5KTtcbiAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgICAnICsgKCRjbG9zaW5nQnJhY2VzKSArICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9lbnVtKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkdmFsaWQgPSAndmFsaWQnICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkaSA9ICdpJyArICRsdmwsXG4gICAgJHZTY2hlbWEgPSAnc2NoZW1hJyArICRsdmw7XG4gIGlmICghJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7JztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgaWYgKHNjaGVtYScgKyAoJGx2bCkgKyAnID09PSB1bmRlZmluZWQpICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBlbHNlIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEnICsgKCRsdmwpICsgJykpICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgZWxzZSB7JztcbiAgfVxuICBvdXQgKz0gJycgKyAoJHZhbGlkKSArICcgPSBmYWxzZTtmb3IgKHZhciAnICsgKCRpKSArICc9MDsgJyArICgkaSkgKyAnPCcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSBpZiAoZXF1YWwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkpIHsgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGJyZWFrOyB9JztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAgfSAgJztcbiAgfVxuICBvdXQgKz0gJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2VudW0nKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGFsbG93ZWRWYWx1ZXM6IHNjaGVtYScgKyAoJGx2bCkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHt9ICc7XG4gIH1cbiAgdmFyIF9fZXJyID0gb3V0O1xuICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChpdC5hc3luYykge1xuICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgfVxuICBvdXQgKz0gJyB9JztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfZm9ybWF0KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIGlmIChpdC5vcHRzLmZvcm1hdCA9PT0gZmFsc2UpIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICR1bmtub3duRm9ybWF0cyA9IGl0Lm9wdHMudW5rbm93bkZvcm1hdHMsXG4gICAgJGFsbG93VW5rbm93biA9IEFycmF5LmlzQXJyYXkoJHVua25vd25Gb3JtYXRzKTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICB2YXIgJGZvcm1hdCA9ICdmb3JtYXQnICsgJGx2bCxcbiAgICAgICRpc09iamVjdCA9ICdpc09iamVjdCcgKyAkbHZsLFxuICAgICAgJGZvcm1hdFR5cGUgPSAnZm9ybWF0VHlwZScgKyAkbHZsO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRmb3JtYXQpICsgJyA9IGZvcm1hdHNbJyArICgkc2NoZW1hVmFsdWUpICsgJ107IHZhciAnICsgKCRpc09iamVjdCkgKyAnID0gdHlwZW9mICcgKyAoJGZvcm1hdCkgKyAnID09IFxcJ29iamVjdFxcJyAmJiAhKCcgKyAoJGZvcm1hdCkgKyAnIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAnICsgKCRmb3JtYXQpICsgJy52YWxpZGF0ZTsgdmFyICcgKyAoJGZvcm1hdFR5cGUpICsgJyA9ICcgKyAoJGlzT2JqZWN0KSArICcgJiYgJyArICgkZm9ybWF0KSArICcudHlwZSB8fCBcXCdzdHJpbmdcXCc7IGlmICgnICsgKCRpc09iamVjdCkgKyAnKSB7ICc7XG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB2YXIgYXN5bmMnICsgKCRsdmwpICsgJyA9ICcgKyAoJGZvcm1hdCkgKyAnLmFzeW5jOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAnICsgKCRmb3JtYXQpICsgJyA9ICcgKyAoJGZvcm1hdCkgKyAnLnZhbGlkYXRlOyB9IGlmICggICc7XG4gICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnc3RyaW5nXFwnKSB8fCAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyAoJztcbiAgICBpZiAoJHVua25vd25Gb3JtYXRzICE9ICdpZ25vcmUnKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAmJiAhJyArICgkZm9ybWF0KSArICcgJztcbiAgICAgIGlmICgkYWxsb3dVbmtub3duKSB7XG4gICAgICAgIG91dCArPSAnICYmIHNlbGYuX29wdHMudW5rbm93bkZvcm1hdHMuaW5kZXhPZignICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSA9PSAtMSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcpIHx8ICc7XG4gICAgfVxuICAgIG91dCArPSAnICgnICsgKCRmb3JtYXQpICsgJyAmJiAnICsgKCRmb3JtYXRUeXBlKSArICcgPT0gXFwnJyArICgkcnVsZVR5cGUpICsgJ1xcJyAmJiAhKHR5cGVvZiAnICsgKCRmb3JtYXQpICsgJyA9PSBcXCdmdW5jdGlvblxcJyA/ICc7XG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyAoYXN5bmMnICsgKCRsdmwpICsgJyA/IGF3YWl0ICcgKyAoJGZvcm1hdCkgKyAnKCcgKyAoJGRhdGEpICsgJykgOiAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpKSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRmb3JtYXQpICsgJygnICsgKCRkYXRhKSArICcpICc7XG4gICAgfVxuICAgIG91dCArPSAnIDogJyArICgkZm9ybWF0KSArICcudGVzdCgnICsgKCRkYXRhKSArICcpKSkpKSB7JztcbiAgfSBlbHNlIHtcbiAgICB2YXIgJGZvcm1hdCA9IGl0LmZvcm1hdHNbJHNjaGVtYV07XG4gICAgaWYgKCEkZm9ybWF0KSB7XG4gICAgICBpZiAoJHVua25vd25Gb3JtYXRzID09ICdpZ25vcmUnKSB7XG4gICAgICAgIGl0LmxvZ2dlci53YXJuKCd1bmtub3duIGZvcm1hdCBcIicgKyAkc2NoZW1hICsgJ1wiIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH0gZWxzZSBpZiAoJGFsbG93VW5rbm93biAmJiAkdW5rbm93bkZvcm1hdHMuaW5kZXhPZigkc2NoZW1hKSA+PSAwKSB7XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGZvcm1hdCBcIicgKyAkc2NoZW1hICsgJ1wiIGlzIHVzZWQgaW4gc2NoZW1hIGF0IHBhdGggXCInICsgaXQuZXJyU2NoZW1hUGF0aCArICdcIicpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgJGlzT2JqZWN0ID0gdHlwZW9mICRmb3JtYXQgPT0gJ29iamVjdCcgJiYgISgkZm9ybWF0IGluc3RhbmNlb2YgUmVnRXhwKSAmJiAkZm9ybWF0LnZhbGlkYXRlO1xuICAgIHZhciAkZm9ybWF0VHlwZSA9ICRpc09iamVjdCAmJiAkZm9ybWF0LnR5cGUgfHwgJ3N0cmluZyc7XG4gICAgaWYgKCRpc09iamVjdCkge1xuICAgICAgdmFyICRhc3luYyA9ICRmb3JtYXQuYXN5bmMgPT09IHRydWU7XG4gICAgICAkZm9ybWF0ID0gJGZvcm1hdC52YWxpZGF0ZTtcbiAgICB9XG4gICAgaWYgKCRmb3JtYXRUeXBlICE9ICRydWxlVHlwZSkge1xuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGlmICgkYXN5bmMpIHtcbiAgICAgIGlmICghaXQuYXN5bmMpIHRocm93IG5ldyBFcnJvcignYXN5bmMgZm9ybWF0IGluIHN5bmMgc2NoZW1hJyk7XG4gICAgICB2YXIgJGZvcm1hdFJlZiA9ICdmb3JtYXRzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHNjaGVtYSkgKyAnLnZhbGlkYXRlJztcbiAgICAgIG91dCArPSAnIGlmICghKGF3YWl0ICcgKyAoJGZvcm1hdFJlZikgKyAnKCcgKyAoJGRhdGEpICsgJykpKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIGlmICghICc7XG4gICAgICB2YXIgJGZvcm1hdFJlZiA9ICdmb3JtYXRzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHNjaGVtYSk7XG4gICAgICBpZiAoJGlzT2JqZWN0KSAkZm9ybWF0UmVmICs9ICcudmFsaWRhdGUnO1xuICAgICAgaWYgKHR5cGVvZiAkZm9ybWF0ID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0UmVmKSArICcoJyArICgkZGF0YSkgKyAnKSAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgJyArICgkZm9ybWF0UmVmKSArICcudGVzdCgnICsgKCRkYXRhKSArICcpICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJykgeyAnO1xuICAgIH1cbiAgfVxuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2Zvcm1hdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgZm9ybWF0OiAgJztcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIGZvcm1hdCBcIic7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKyBcXCcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRzY2hlbWEpKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnXCJcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICcgfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9pZihpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICRpdC5sZXZlbCsrO1xuICB2YXIgJG5leHRWYWxpZCA9ICd2YWxpZCcgKyAkaXQubGV2ZWw7XG4gIHZhciAkdGhlblNjaCA9IGl0LnNjaGVtYVsndGhlbiddLFxuICAgICRlbHNlU2NoID0gaXQuc2NoZW1hWydlbHNlJ10sXG4gICAgJHRoZW5QcmVzZW50ID0gJHRoZW5TY2ggIT09IHVuZGVmaW5lZCAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHRoZW5TY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHRoZW5TY2gpLmxlbmd0aCA+IDApIHx8ICR0aGVuU2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHRoZW5TY2gsIGl0LlJVTEVTLmFsbCkpLFxuICAgICRlbHNlUHJlc2VudCA9ICRlbHNlU2NoICE9PSB1bmRlZmluZWQgJiYgKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRlbHNlU2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRlbHNlU2NoKS5sZW5ndGggPiAwKSB8fCAkZWxzZVNjaCA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRlbHNlU2NoLCBpdC5SVUxFUy5hbGwpKSxcbiAgICAkY3VycmVudEJhc2VJZCA9ICRpdC5iYXNlSWQ7XG4gIGlmICgkdGhlblByZXNlbnQgfHwgJGVsc2VQcmVzZW50KSB7XG4gICAgdmFyICRpZkNsYXVzZTtcbiAgICAkaXQuY3JlYXRlRXJyb3JzID0gZmFsc2U7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7IHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgICc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSB0cnVlO1xuICAgIG91dCArPSAnICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICAnO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgaWYgKCR0aGVuUHJlc2VudCkge1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICAnO1xuICAgICAgJGl0LnNjaGVtYSA9IGl0LnNjaGVtYVsndGhlbiddO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy50aGVuJztcbiAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvdGhlbic7XG4gICAgICBvdXQgKz0gJyAgJyArIChpdC52YWxpZGF0ZSgkaXQpKSArICcgJztcbiAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRuZXh0VmFsaWQpICsgJzsgJztcbiAgICAgIGlmICgkdGhlblByZXNlbnQgJiYgJGVsc2VQcmVzZW50KSB7XG4gICAgICAgICRpZkNsYXVzZSA9ICdpZkNsYXVzZScgKyAkbHZsO1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkaWZDbGF1c2UpICsgJyA9IFxcJ3RoZW5cXCc7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkaWZDbGF1c2UgPSAnXFwndGhlblxcJyc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICBpZiAoJGVsc2VQcmVzZW50KSB7XG4gICAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkZWxzZVByZXNlbnQpIHtcbiAgICAgICRpdC5zY2hlbWEgPSBpdC5zY2hlbWFbJ2Vsc2UnXTtcbiAgICAgICRpdC5zY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArICcuZWxzZSc7XG4gICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2Vsc2UnO1xuICAgICAgb3V0ICs9ICcgICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICBvdXQgKz0gJyAnICsgKCR2YWxpZCkgKyAnID0gJyArICgkbmV4dFZhbGlkKSArICc7ICc7XG4gICAgICBpZiAoJHRoZW5QcmVzZW50ICYmICRlbHNlUHJlc2VudCkge1xuICAgICAgICAkaWZDbGF1c2UgPSAnaWZDbGF1c2UnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJGlmQ2xhdXNlKSArICcgPSBcXCdlbHNlXFwnOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGlmQ2xhdXNlID0gJ1xcJ2Vsc2VcXCcnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ2lmJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBmYWlsaW5nS2V5d29yZDogJyArICgkaWZDbGF1c2UpICsgJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgbWF0Y2ggXCJcXCcgKyAnICsgKCRpZkNsYXVzZSkgKyAnICsgXFwnXCIgc2NoZW1hXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IodkVycm9ycyk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIG91dCArPSAnIH0gICAnO1xuICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICh0cnVlKSB7ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9pdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGlkeCA9ICdpJyArICRsdmwsXG4gICAgJGRhdGFOeHQgPSAkaXQuZGF0YUxldmVsID0gaXQuZGF0YUxldmVsICsgMSxcbiAgICAkbmV4dERhdGEgPSAnZGF0YScgKyAkZGF0YU54dCxcbiAgICAkY3VycmVudEJhc2VJZCA9IGl0LmJhc2VJZDtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzO3ZhciAnICsgKCR2YWxpZCkgKyAnOyc7XG4gIGlmIChBcnJheS5pc0FycmF5KCRzY2hlbWEpKSB7XG4gICAgdmFyICRhZGRpdGlvbmFsSXRlbXMgPSBpdC5zY2hlbWEuYWRkaXRpb25hbEl0ZW1zO1xuICAgIGlmICgkYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoJGRhdGEpICsgJy5sZW5ndGggPD0gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnOyAnO1xuICAgICAgdmFyICRjdXJyRXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgICAgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgb3V0ICs9ICcgIGlmICghJyArICgkdmFsaWQpICsgJykgeyAgICc7XG4gICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdhZGRpdGlvbmFsSXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWEubGVuZ3RoKSArICcgfSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgaGF2ZSBtb3JlIHRoYW4gJyArICgkc2NoZW1hLmxlbmd0aCkgKyAnIGl0ZW1zXFwnICc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAkZXJyU2NoZW1hUGF0aCA9ICRjdXJyRXJyU2NoZW1hUGF0aDtcbiAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBhcnIxID0gJHNjaGVtYTtcbiAgICBpZiAoYXJyMSkge1xuICAgICAgdmFyICRzY2gsICRpID0gLTEsXG4gICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICAgJHNjaCA9IGFycjFbJGkgKz0gMV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IHRydWU7IGlmICgnICsgKCRkYXRhKSArICcubGVuZ3RoID4gJyArICgkaSkgKyAnKSB7ICc7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGkgKyAnXSc7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyAkaTtcbiAgICAgICAgICAkaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcihpdC5lcnJvclBhdGgsICRpLCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpO1xuICAgICAgICAgIHZhciAkY29kZSA9IGl0LnZhbGlkYXRlKCRpdCk7XG4gICAgICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgICAgIGlmIChpdC51dGlsLnZhck9jY3VyZW5jZXMoJGNvZGUsICRuZXh0RGF0YSkgPCAyKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKGl0LnV0aWwudmFyUmVwbGFjZSgkY29kZSwgJG5leHREYXRhLCAkcGFzc0RhdGEpKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJG5leHREYXRhKSArICcgPSAnICsgKCRwYXNzRGF0YSkgKyAnOyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgJGFkZGl0aW9uYWxJdGVtcyA9PSAnb2JqZWN0JyAmJiAoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJGFkZGl0aW9uYWxJdGVtcyA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkYWRkaXRpb25hbEl0ZW1zKS5sZW5ndGggPiAwKSB8fCAkYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJGFkZGl0aW9uYWxJdGVtcywgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICRpdC5zY2hlbWEgPSAkYWRkaXRpb25hbEl0ZW1zO1xuICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsSXRlbXMnO1xuICAgICAgb3V0ICs9ICcgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyBpZiAoJyArICgkZGF0YSkgKyAnLmxlbmd0aCA+ICcgKyAoJHNjaGVtYS5sZW5ndGgpICsgJykgeyAgZm9yICh2YXIgJyArICgkaWR4KSArICcgPSAnICsgKCRzY2hlbWEubGVuZ3RoKSArICc7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAkaWR4LCBpdC5vcHRzLmpzb25Qb2ludGVycywgdHJ1ZSk7XG4gICAgICB2YXIgJHBhc3NEYXRhID0gJGRhdGEgKyAnWycgKyAkaWR4ICsgJ10nO1xuICAgICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgJGl0LmJhc2VJZCA9ICRjdXJyZW50QmFzZUlkO1xuICAgICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgICAgfVxuICAgICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7ICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9IH0gICc7XG4gICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgJztcbiAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgb3V0ICs9ICcgIGZvciAodmFyICcgKyAoJGlkeCkgKyAnID0gJyArICgwKSArICc7ICcgKyAoJGlkeCkgKyAnIDwgJyArICgkZGF0YSkgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyAnO1xuICAgICRpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGhFeHByKGl0LmVycm9yUGF0aCwgJGlkeCwgaXQub3B0cy5qc29uUG9pbnRlcnMsIHRydWUpO1xuICAgIHZhciAkcGFzc0RhdGEgPSAkZGF0YSArICdbJyArICRpZHggKyAnXSc7XG4gICAgJGl0LmRhdGFQYXRoQXJyWyRkYXRhTnh0XSA9ICRpZHg7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgIG91dCArPSAnICcgKyAoaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSkpICsgJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dERhdGEpICsgJyA9ICcgKyAoJHBhc3NEYXRhKSArICc7ICcgKyAoJGNvZGUpICsgJyAnO1xuICAgIH1cbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgYnJlYWs7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0nO1xuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0KGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICRpc01heCA9ICRrZXl3b3JkID09ICdtYXhpbXVtJyxcbiAgICAkZXhjbHVzaXZlS2V5d29yZCA9ICRpc01heCA/ICdleGNsdXNpdmVNYXhpbXVtJyA6ICdleGNsdXNpdmVNaW5pbXVtJyxcbiAgICAkc2NoZW1hRXhjbCA9IGl0LnNjaGVtYVskZXhjbHVzaXZlS2V5d29yZF0sXG4gICAgJGlzRGF0YUV4Y2wgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWFFeGNsICYmICRzY2hlbWFFeGNsLiRkYXRhLFxuICAgICRvcCA9ICRpc01heCA/ICc8JyA6ICc+JyxcbiAgICAkbm90T3AgPSAkaXNNYXggPyAnPicgOiAnPCcsXG4gICAgJGVycm9yS2V5d29yZCA9IHVuZGVmaW5lZDtcbiAgaWYgKCEoJGlzRGF0YSB8fCB0eXBlb2YgJHNjaGVtYSA9PSAnbnVtYmVyJyB8fCAkc2NoZW1hID09PSB1bmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRrZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghKCRpc0RhdGFFeGNsIHx8ICRzY2hlbWFFeGNsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mICRzY2hlbWFFeGNsID09ICdudW1iZXInIHx8IHR5cGVvZiAkc2NoZW1hRXhjbCA9PSAnYm9vbGVhbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCRleGNsdXNpdmVLZXl3b3JkICsgJyBtdXN0IGJlIG51bWJlciBvciBib29sZWFuJyk7XG4gIH1cbiAgaWYgKCRpc0RhdGFFeGNsKSB7XG4gICAgdmFyICRzY2hlbWFWYWx1ZUV4Y2wgPSBpdC51dGlsLmdldERhdGEoJHNjaGVtYUV4Y2wuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFyciksXG4gICAgICAkZXhjbHVzaXZlID0gJ2V4Y2x1c2l2ZScgKyAkbHZsLFxuICAgICAgJGV4Y2xUeXBlID0gJ2V4Y2xUeXBlJyArICRsdmwsXG4gICAgICAkZXhjbElzTnVtYmVyID0gJ2V4Y2xJc051bWJlcicgKyAkbHZsLFxuICAgICAgJG9wRXhwciA9ICdvcCcgKyAkbHZsLFxuICAgICAgJG9wU3RyID0gJ1xcJyArICcgKyAkb3BFeHByICsgJyArIFxcJyc7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYUV4Y2wnICsgKCRsdmwpICsgJyA9ICcgKyAoJHNjaGVtYVZhbHVlRXhjbCkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZUV4Y2wgPSAnc2NoZW1hRXhjbCcgKyAkbHZsO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRleGNsdXNpdmUpICsgJzsgdmFyICcgKyAoJGV4Y2xUeXBlKSArICcgPSB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICc7IGlmICgnICsgKCRleGNsVHlwZSkgKyAnICE9IFxcJ2Jvb2xlYW5cXCcgJiYgJyArICgkZXhjbFR5cGUpICsgJyAhPSBcXCd1bmRlZmluZWRcXCcgJiYgJyArICgkZXhjbFR5cGUpICsgJyAhPSBcXCdudW1iZXJcXCcpIHsgJztcbiAgICB2YXIgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19leGNsdXNpdmVMaW1pdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCcnICsgKCRleGNsdXNpdmVLZXl3b3JkKSArICcgc2hvdWxkIGJlIGJvb2xlYW5cXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgdmFyIF9fZXJyID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9IGVsc2UgaWYgKCAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgJyArICgkZXhjbFR5cGUpICsgJyA9PSBcXCdudW1iZXJcXCcgPyAoICgnICsgKCRleGNsdXNpdmUpICsgJyA9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPT09IHVuZGVmaW5lZCB8fCAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyAnICsgKCRvcCkgKyAnPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnKSA/ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnPSAnICsgKCRzY2hlbWFWYWx1ZUV4Y2wpICsgJyA6ICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgKSA6ICggKCcgKyAoJGV4Y2x1c2l2ZSkgKyAnID0gJyArICgkc2NoZW1hVmFsdWVFeGNsKSArICcgPT09IHRydWUpID8gJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgOiAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICkgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgdmFyIG9wJyArICgkbHZsKSArICcgPSAnICsgKCRleGNsdXNpdmUpICsgJyA/IFxcJycgKyAoJG9wKSArICdcXCcgOiBcXCcnICsgKCRvcCkgKyAnPVxcJzsgJztcbiAgICBpZiAoJHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAkZXJyb3JLZXl3b3JkID0gJGV4Y2x1c2l2ZUtleXdvcmQ7XG4gICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWFWYWx1ZUV4Y2w7XG4gICAgICAkaXNEYXRhID0gJGlzRGF0YUV4Y2w7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciAkZXhjbElzTnVtYmVyID0gdHlwZW9mICRzY2hlbWFFeGNsID09ICdudW1iZXInLFxuICAgICAgJG9wU3RyID0gJG9wO1xuICAgIGlmICgkZXhjbElzTnVtYmVyICYmICRpc0RhdGEpIHtcbiAgICAgIHZhciAkb3BFeHByID0gJ1xcJycgKyAkb3BTdHIgKyAnXFwnJztcbiAgICAgIG91dCArPSAnIGlmICggJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgKCAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSB1bmRlZmluZWQgfHwgJyArICgkc2NoZW1hRXhjbCkgKyAnICcgKyAoJG9wKSArICc9ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgPyAnICsgKCRkYXRhKSArICcgJyArICgkbm90T3ApICsgJz0gJyArICgkc2NoZW1hRXhjbCkgKyAnIDogJyArICgkZGF0YSkgKyAnICcgKyAoJG5vdE9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJyApIHx8ICcgKyAoJGRhdGEpICsgJyAhPT0gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkZXhjbElzTnVtYmVyICYmICRzY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAkZXhjbHVzaXZlID0gdHJ1ZTtcbiAgICAgICAgJGVycm9yS2V5d29yZCA9ICRleGNsdXNpdmVLZXl3b3JkO1xuICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYUV4Y2w7XG4gICAgICAgICRub3RPcCArPSAnPSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoJGV4Y2xJc051bWJlcikgJHNjaGVtYVZhbHVlID0gTWF0aFskaXNNYXggPyAnbWluJyA6ICdtYXgnXSgkc2NoZW1hRXhjbCwgJHNjaGVtYSk7XG4gICAgICAgIGlmICgkc2NoZW1hRXhjbCA9PT0gKCRleGNsSXNOdW1iZXIgPyAkc2NoZW1hVmFsdWUgOiB0cnVlKSkge1xuICAgICAgICAgICRleGNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgICRlcnJvcktleXdvcmQgPSAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAkZXhjbHVzaXZlS2V5d29yZDtcbiAgICAgICAgICAkbm90T3AgKz0gJz0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRleGNsdXNpdmUgPSBmYWxzZTtcbiAgICAgICAgICAkb3BTdHIgKz0gJz0nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgJG9wRXhwciA9ICdcXCcnICsgJG9wU3RyICsgJ1xcJyc7XG4gICAgICBvdXQgKz0gJyBpZiAoICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICcgKyAoJGRhdGEpICsgJyAnICsgKCRub3RPcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfHwgJyArICgkZGF0YSkgKyAnICE9PSAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICB9XG4gIH1cbiAgJGVycm9yS2V5d29yZCA9ICRlcnJvcktleXdvcmQgfHwgJGtleXdvcmQ7XG4gIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgkZXJyb3JLZXl3b3JkIHx8ICdfbGltaXQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGNvbXBhcmlzb246ICcgKyAoJG9wRXhwcikgKyAnLCBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJywgZXhjbHVzaXZlOiAnICsgKCRleGNsdXNpdmUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBiZSAnICsgKCRvcFN0cikgKyAnICc7XG4gICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICBvdXQgKz0gJ1xcJyArICcgKyAoJHNjaGVtYVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hVmFsdWUpICsgJ1xcJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnIH0gJztcbiAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICBvdXQgKz0gJyBlbHNlIHsgJztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfX2xpbWl0SXRlbXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heEl0ZW1zJyA/ICc+JyA6ICc8JztcbiAgb3V0ICs9ICdpZiAoICc7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgKCcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdudW1iZXJcXCcpIHx8ICc7XG4gIH1cbiAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnLmxlbmd0aCAnICsgKCRvcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcpIHsgJztcbiAgdmFyICRlcnJvcktleXdvcmQgPSAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdEl0ZW1zJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgaGF2ZSAnO1xuICAgICAgaWYgKCRrZXl3b3JkID09ICdtYXhJdGVtcycpIHtcbiAgICAgICAgb3V0ICs9ICdtb3JlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnZmV3ZXInO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgdGhhbiAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGl0ZW1zXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9fbGltaXRMZW5ndGgoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heExlbmd0aCcgPyAnPicgOiAnPCc7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnbnVtYmVyXFwnKSB8fCAnO1xuICB9XG4gIGlmIChpdC5vcHRzLnVuaWNvZGUgPT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgJyArICgkZGF0YSkgKyAnLmxlbmd0aCAnO1xuICB9IGVsc2Uge1xuICAgIG91dCArPSAnIHVjczJsZW5ndGgoJyArICgkZGF0YSkgKyAnKSAnO1xuICB9XG4gIG91dCArPSAnICcgKyAoJG9wKSArICcgJyArICgkc2NoZW1hVmFsdWUpICsgJykgeyAnO1xuICB2YXIgJGVycm9yS2V5d29yZCA9ICRrZXl3b3JkO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnX2xpbWl0TGVuZ3RoJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBsaW1pdDogJyArICgkc2NoZW1hVmFsdWUpICsgJyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBOT1QgYmUgJztcbiAgICAgIGlmICgka2V5d29yZCA9PSAnbWF4TGVuZ3RoJykge1xuICAgICAgICBvdXQgKz0gJ2xvbmdlcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ3Nob3J0ZXInO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgdGhhbiAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGNoYXJhY3RlcnNcXCcgJztcbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX19saW1pdFByb3BlcnRpZXMoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRlcnJvcktleXdvcmQ7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICB2YXIgJG9wID0gJGtleXdvcmQgPT0gJ21heFByb3BlcnRpZXMnID8gJz4nIDogJzwnO1xuICBvdXQgKz0gJ2lmICggJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAoJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJykgfHwgJztcbiAgfVxuICBvdXQgKz0gJyBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpLmxlbmd0aCAnICsgKCRvcCkgKyAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcpIHsgJztcbiAgdmFyICRlcnJvcktleXdvcmQgPSAka2V5d29yZDtcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ19saW1pdFByb3BlcnRpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGxpbWl0OiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlICc7XG4gICAgICBpZiAoJGtleXdvcmQgPT0gJ21heFByb3BlcnRpZXMnKSB7XG4gICAgICAgIG91dCArPSAnbW9yZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJ2Zld2VyJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIHRoYW4gJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpICsgJyArIFxcJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyBwcm9wZXJ0aWVzXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9tdWx0aXBsZU9mKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoISgkaXNEYXRhIHx8IHR5cGVvZiAkc2NoZW1hID09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigka2V5d29yZCArICcgbXVzdCBiZSBudW1iZXInKTtcbiAgfVxuICBvdXQgKz0gJ3ZhciBkaXZpc2lvbicgKyAoJGx2bCkgKyAnO2lmICgnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT09IHVuZGVmaW5lZCAmJiAoIHR5cGVvZiAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9IFxcJ251bWJlclxcJyB8fCAnO1xuICB9XG4gIG91dCArPSAnIChkaXZpc2lvbicgKyAoJGx2bCkgKyAnID0gJyArICgkZGF0YSkgKyAnIC8gJyArICgkc2NoZW1hVmFsdWUpICsgJywgJztcbiAgaWYgKGl0Lm9wdHMubXVsdGlwbGVPZlByZWNpc2lvbikge1xuICAgIG91dCArPSAnIE1hdGguYWJzKE1hdGgucm91bmQoZGl2aXNpb24nICsgKCRsdmwpICsgJykgLSBkaXZpc2lvbicgKyAoJGx2bCkgKyAnKSA+IDFlLScgKyAoaXQub3B0cy5tdWx0aXBsZU9mUHJlY2lzaW9uKSArICcgJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyBkaXZpc2lvbicgKyAoJGx2bCkgKyAnICE9PSBwYXJzZUludChkaXZpc2lvbicgKyAoJGx2bCkgKyAnKSAnO1xuICB9XG4gIG91dCArPSAnICkgJztcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyAgKSAgJztcbiAgfVxuICBvdXQgKz0gJyApIHsgICAnO1xuICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ211bHRpcGxlT2YnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG11bHRpcGxlT2Y6ICcgKyAoJHNjaGVtYVZhbHVlKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgYmUgbXVsdGlwbGUgb2YgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAnXFwnICsgJyArICgkc2NoZW1hVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSkgKyAnXFwnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6ICAnO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArICgkc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIG91dCArPSAnICAgICAgICAgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIHZhciBfX2VyciA9IG91dDtcbiAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIH1cbiAgb3V0ICs9ICd9ICc7XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgZWxzZSB7ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX25vdChpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICBpZiAoKGl0Lm9wdHMuc3RyaWN0S2V5d29yZHMgPyAodHlwZW9mICRzY2hlbWEgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHNjaGVtYSkubGVuZ3RoID4gMCkgfHwgJHNjaGVtYSA9PT0gZmFsc2UgOiBpdC51dGlsLnNjaGVtYUhhc1J1bGVzKCRzY2hlbWEsIGl0LlJVTEVTLmFsbCkpKSB7XG4gICAgJGl0LnNjaGVtYSA9ICRzY2hlbWE7XG4gICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aDtcbiAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoO1xuICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7ICAnO1xuICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICRpdC5jcmVhdGVFcnJvcnMgPSBmYWxzZTtcbiAgICB2YXIgJGFsbEVycm9yc09wdGlvbjtcbiAgICBpZiAoJGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICAkYWxsRXJyb3JzT3B0aW9uID0gJGl0Lm9wdHMuYWxsRXJyb3JzO1xuICAgICAgJGl0Lm9wdHMuYWxsRXJyb3JzID0gZmFsc2U7XG4gICAgfVxuICAgIG91dCArPSAnICcgKyAoaXQudmFsaWRhdGUoJGl0KSkgKyAnICc7XG4gICAgJGl0LmNyZWF0ZUVycm9ycyA9IHRydWU7XG4gICAgaWYgKCRhbGxFcnJvcnNPcHRpb24pICRpdC5vcHRzLmFsbEVycm9ycyA9ICRhbGxFcnJvcnNPcHRpb247XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gJHdhc0NvbXBvc2l0ZTtcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkbmV4dFZhbGlkKSArICcpIHsgICAnO1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXQuY3JlYXRlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdub3QnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7fSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBiZSB2YWxpZFxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgfSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB7fSAnO1xuICAgIH1cbiAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgb3V0ID0gJCRvdXRTdGFjay5wb3AoKTtcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihbJyArIChfX2VycikgKyAnXSk7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSBbJyArIChfX2VycikgKyAnXTsgcmV0dXJuIGZhbHNlOyAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YXIgZXJyID0gJyArIChfX2VycikgKyAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gZWxzZSB7ICBlcnJvcnMgPSAnICsgKCRlcnJzKSArICc7IGlmICh2RXJyb3JzICE9PSBudWxsKSB7IGlmICgnICsgKCRlcnJzKSArICcpIHZFcnJvcnMubGVuZ3RoID0gJyArICgkZXJycykgKyAnOyBlbHNlIHZFcnJvcnMgPSBudWxsOyB9ICc7XG4gICAgaWYgKGl0Lm9wdHMuYWxsRXJyb3JzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dCArPSAnICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ25vdCcpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHt9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgTk9UIGJlIHZhbGlkXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmIChmYWxzZSkgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfb25lT2YoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgdmFyICRjdXJyZW50QmFzZUlkID0gJGl0LmJhc2VJZCxcbiAgICAkcHJldlZhbGlkID0gJ3ByZXZWYWxpZCcgKyAkbHZsLFxuICAgICRwYXNzaW5nU2NoZW1hcyA9ICdwYXNzaW5nU2NoZW1hcycgKyAkbHZsO1xuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnMgLCAnICsgKCRwcmV2VmFsaWQpICsgJyA9IGZhbHNlICwgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlICwgJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJyA9IG51bGw7ICc7XG4gIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgdmFyIGFycjEgPSAkc2NoZW1hO1xuICBpZiAoYXJyMSkge1xuICAgIHZhciAkc2NoLCAkaSA9IC0xLFxuICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCRpIDwgbDEpIHtcbiAgICAgICRzY2ggPSBhcnIxWyRpICs9IDFdO1xuICAgICAgaWYgKChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkc2NoID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRzY2gpLmxlbmd0aCA+IDApIHx8ICRzY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkc2NoLCBpdC5SVUxFUy5hbGwpKSkge1xuICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICdbJyArICRpICsgJ10nO1xuICAgICAgICAkaXQuZXJyU2NoZW1hUGF0aCA9ICRlcnJTY2hlbWFQYXRoICsgJy8nICsgJGk7XG4gICAgICAgIG91dCArPSAnICAnICsgKGl0LnZhbGlkYXRlKCRpdCkpICsgJyAnO1xuICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB2YXIgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyAnO1xuICAgICAgfVxuICAgICAgaWYgKCRpKSB7XG4gICAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJyAmJiAnICsgKCRwcmV2VmFsaWQpICsgJykgeyAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7ICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgPSBbJyArICgkcGFzc2luZ1NjaGVtYXMpICsgJywgJyArICgkaSkgKyAnXTsgfSBlbHNlIHsgJztcbiAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRwcmV2VmFsaWQpICsgJyA9IHRydWU7ICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgPSAnICsgKCRpKSArICc7IH0nO1xuICAgIH1cbiAgfVxuICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICBvdXQgKz0gJycgKyAoJGNsb3NpbmdCcmFjZXMpICsgJ2lmICghJyArICgkdmFsaWQpICsgJykgeyAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdvbmVPZicpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcGFzc2luZ1NjaGVtYXM6ICcgKyAoJHBhc3NpbmdTY2hlbWFzKSArICcgfSAnO1xuICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgbWF0Y2ggZXhhY3RseSBvbmUgc2NoZW1hIGluIG9uZU9mXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gJztcbiAgfSBlbHNlIHtcbiAgICBvdXQgKz0gJyB7fSAnO1xuICB9XG4gIG91dCArPSAnOyAgaWYgKHZFcnJvcnMgPT09IG51bGwpIHZFcnJvcnMgPSBbZXJyXTsgZWxzZSB2RXJyb3JzLnB1c2goZXJyKTsgZXJyb3JzKys7ICc7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgKz0gJyB2YWxpZGF0ZS5lcnJvcnMgPSB2RXJyb3JzOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgfVxuICB9XG4gIG91dCArPSAnfSBlbHNlIHsgIGVycm9ycyA9ICcgKyAoJGVycnMpICsgJzsgaWYgKHZFcnJvcnMgIT09IG51bGwpIHsgaWYgKCcgKyAoJGVycnMpICsgJykgdkVycm9ycy5sZW5ndGggPSAnICsgKCRlcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IG51bGw7IH0nO1xuICBpZiAoaXQub3B0cy5hbGxFcnJvcnMpIHtcbiAgICBvdXQgKz0gJyB9ICc7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlX3BhdHRlcm4oaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkcmVnZXhwID0gJGlzRGF0YSA/ICcobmV3IFJlZ0V4cCgnICsgJHNjaGVtYVZhbHVlICsgJykpJyA6IGl0LnVzZVBhdHRlcm4oJHNjaGVtYSk7XG4gIG91dCArPSAnaWYgKCAnO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mICcgKyAoJHNjaGVtYVZhbHVlKSArICcgIT0gXFwnc3RyaW5nXFwnKSB8fCAnO1xuICB9XG4gIG91dCArPSAnICEnICsgKCRyZWdleHApICsgJy50ZXN0KCcgKyAoJGRhdGEpICsgJykgKSB7ICAgJztcbiAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCdwYXR0ZXJuJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBwYXR0ZXJuOiAgJztcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcnICsgKCRzY2hlbWFWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRzY2hlbWEpKTtcbiAgICB9XG4gICAgb3V0ICs9ICcgIH0gJztcbiAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCInO1xuICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgb3V0ICs9ICdcXCcgKyAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnICsgXFwnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnJyArIChpdC51dGlsLmVzY2FwZVF1b3Rlcygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJ1wiXFwnICc7XG4gICAgfVxuICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgIG91dCArPSAnICwgc2NoZW1hOiAgJztcbiAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgIG91dCArPSAndmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJycgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkc2NoZW1hKSk7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyAgICAgICAgICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcge30gJztcbiAgfVxuICB2YXIgX19lcnIgPSBvdXQ7XG4gIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICB9XG4gIG91dCArPSAnfSAnO1xuICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV9wcm9wZXJ0aWVzKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZGF0YSA9ICdkYXRhJyArICgkZGF0YUx2bCB8fCAnJyk7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gIHZhciAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICAkaXQubGV2ZWwrKztcbiAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICB2YXIgJGtleSA9ICdrZXknICsgJGx2bCxcbiAgICAkaWR4ID0gJ2lkeCcgKyAkbHZsLFxuICAgICRkYXRhTnh0ID0gJGl0LmRhdGFMZXZlbCA9IGl0LmRhdGFMZXZlbCArIDEsXG4gICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgJGRhdGFQcm9wZXJ0aWVzID0gJ2RhdGFQcm9wZXJ0aWVzJyArICRsdmw7XG4gIHZhciAkc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKCRzY2hlbWEgfHwge30pLmZpbHRlcihub3RQcm90byksXG4gICAgJHBQcm9wZXJ0aWVzID0gaXQuc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzIHx8IHt9LFxuICAgICRwUHJvcGVydHlLZXlzID0gT2JqZWN0LmtleXMoJHBQcm9wZXJ0aWVzKS5maWx0ZXIobm90UHJvdG8pLFxuICAgICRhUHJvcGVydGllcyA9IGl0LnNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyxcbiAgICAkc29tZVByb3BlcnRpZXMgPSAkc2NoZW1hS2V5cy5sZW5ndGggfHwgJHBQcm9wZXJ0eUtleXMubGVuZ3RoLFxuICAgICRub0FkZGl0aW9uYWwgPSAkYVByb3BlcnRpZXMgPT09IGZhbHNlLFxuICAgICRhZGRpdGlvbmFsSXNTY2hlbWEgPSB0eXBlb2YgJGFQcm9wZXJ0aWVzID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKCRhUHJvcGVydGllcykubGVuZ3RoLFxuICAgICRyZW1vdmVBZGRpdGlvbmFsID0gaXQub3B0cy5yZW1vdmVBZGRpdGlvbmFsLFxuICAgICRjaGVja0FkZGl0aW9uYWwgPSAkbm9BZGRpdGlvbmFsIHx8ICRhZGRpdGlvbmFsSXNTY2hlbWEgfHwgJHJlbW92ZUFkZGl0aW9uYWwsXG4gICAgJG93blByb3BlcnRpZXMgPSBpdC5vcHRzLm93blByb3BlcnRpZXMsXG4gICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQ7XG4gIHZhciAkcmVxdWlyZWQgPSBpdC5zY2hlbWEucmVxdWlyZWQ7XG4gIGlmICgkcmVxdWlyZWQgJiYgIShpdC5vcHRzLiRkYXRhICYmICRyZXF1aXJlZC4kZGF0YSkgJiYgJHJlcXVpcmVkLmxlbmd0aCA8IGl0Lm9wdHMubG9vcFJlcXVpcmVkKSB7XG4gICAgdmFyICRyZXF1aXJlZEhhc2ggPSBpdC51dGlsLnRvSGFzaCgkcmVxdWlyZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90UHJvdG8ocCkge1xuICAgIHJldHVybiBwICE9PSAnX19wcm90b19fJztcbiAgfVxuICBvdXQgKz0gJ3ZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7dmFyICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsnO1xuICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9IHVuZGVmaW5lZDsnO1xuICB9XG4gIGlmICgkY2hlY2tBZGRpdGlvbmFsKSB7XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyB8fCBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpOyBmb3IgKHZhciAnICsgKCRpZHgpICsgJz0wOyAnICsgKCRpZHgpICsgJzwnICsgKCRkYXRhUHJvcGVydGllcykgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyB2YXIgJyArICgka2V5KSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnWycgKyAoJGlkeCkgKyAnXTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgZm9yICh2YXIgJyArICgka2V5KSArICcgaW4gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkc29tZVByb3BlcnRpZXMpIHtcbiAgICAgIG91dCArPSAnIHZhciBpc0FkZGl0aW9uYWwnICsgKCRsdmwpICsgJyA9ICEoZmFsc2UgJztcbiAgICAgIGlmICgkc2NoZW1hS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCA+IDgpIHtcbiAgICAgICAgICBvdXQgKz0gJyB8fCB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcuaGFzT3duUHJvcGVydHkoJyArICgka2V5KSArICcpICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFycjEgPSAkc2NoZW1hS2V5cztcbiAgICAgICAgICBpZiAoYXJyMSkge1xuICAgICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTEgPSAtMSxcbiAgICAgICAgICAgICAgbDEgPSBhcnIxLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaTEgPCBsMSkge1xuICAgICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIxW2kxICs9IDFdO1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKCRrZXkpICsgJyA9PSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJHByb3BlcnR5S2V5KSkgKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoJHBQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnIyID0gJHBQcm9wZXJ0eUtleXM7XG4gICAgICAgIGlmIChhcnIyKSB7XG4gICAgICAgICAgdmFyICRwUHJvcGVydHksICRpID0gLTEsXG4gICAgICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMikge1xuICAgICAgICAgICAgJHBQcm9wZXJ0eSA9IGFycjJbJGkgKz0gMV07XG4gICAgICAgICAgICBvdXQgKz0gJyB8fCAnICsgKGl0LnVzZVBhdHRlcm4oJHBQcm9wZXJ0eSkpICsgJy50ZXN0KCcgKyAoJGtleSkgKyAnKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9ICcgKTsgaWYgKGlzQWRkaXRpb25hbCcgKyAoJGx2bCkgKyAnKSB7ICc7XG4gICAgfVxuICAgIGlmICgkcmVtb3ZlQWRkaXRpb25hbCA9PSAnYWxsJykge1xuICAgICAgb3V0ICs9ICcgZGVsZXRlICcgKyAoJGRhdGEpICsgJ1snICsgKCRrZXkpICsgJ107ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aDtcbiAgICAgIHZhciAkYWRkaXRpb25hbFByb3BlcnR5ID0gJ1xcJyArICcgKyAka2V5ICsgJyArIFxcJyc7XG4gICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgIGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICB9XG4gICAgICBpZiAoJG5vQWRkaXRpb25hbCkge1xuICAgICAgICBpZiAoJHJlbW92ZUFkZGl0aW9uYWwpIHtcbiAgICAgICAgICBvdXQgKz0gJyBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgICAgIHZhciAkY3VyckVyclNjaGVtYVBhdGggPSAkZXJyU2NoZW1hUGF0aDtcbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJztcbiAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgICAgICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgnYWRkaXRpb25hbFByb3BlcnRpZXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGFkZGl0aW9uYWxQcm9wZXJ0eTogXFwnJyArICgkYWRkaXRpb25hbFByb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnaXMgYW4gaW52YWxpZCBhZGRpdGlvbmFsIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ3Nob3VsZCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG91dCArPSAnXFwnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnICwgc2NoZW1hOiBmYWxzZSAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIF9fZXJyID0gb3V0O1xuICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAkZXJyU2NoZW1hUGF0aCA9ICRjdXJyRXJyU2NoZW1hUGF0aDtcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgYnJlYWs7ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCRhZGRpdGlvbmFsSXNTY2hlbWEpIHtcbiAgICAgICAgaWYgKCRyZW1vdmVBZGRpdGlvbmFsID09ICdmYWlsaW5nJykge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRlcnJzKSArICcgPSBlcnJvcnM7ICAnO1xuICAgICAgICAgIHZhciAkd2FzQ29tcG9zaXRlID0gaXQuY29tcG9zaXRlUnVsZTtcbiAgICAgICAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSB0cnVlO1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkYVByb3BlcnRpZXM7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA/IGl0LmVycm9yUGF0aCA6IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIGlmICghJyArICgkbmV4dFZhbGlkKSArICcpIHsgZXJyb3JzID0gJyArICgkZXJycykgKyAnOyBpZiAodmFsaWRhdGUuZXJyb3JzICE9PSBudWxsKSB7IGlmIChlcnJvcnMpIHZhbGlkYXRlLmVycm9ycy5sZW5ndGggPSBlcnJvcnM7IGVsc2UgdmFsaWRhdGUuZXJyb3JzID0gbnVsbDsgfSBkZWxldGUgJyArICgkZGF0YSkgKyAnWycgKyAoJGtleSkgKyAnXTsgfSAgJztcbiAgICAgICAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRpdC5zY2hlbWEgPSAkYVByb3BlcnRpZXM7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgJy5hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9hZGRpdGlvbmFsUHJvcGVydGllcyc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA/IGl0LmVycm9yUGF0aCA6IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGl0LmVycm9yUGF0aCA9ICRjdXJyZW50RXJyb3JQYXRoO1xuICAgIH1cbiAgICBpZiAoJHNvbWVQcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfVxuICAgIG91dCArPSAnIH0gICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGlmICgnICsgKCRuZXh0VmFsaWQpICsgJykgeyAnO1xuICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgIH1cbiAgfVxuICB2YXIgJHVzZURlZmF1bHRzID0gaXQub3B0cy51c2VEZWZhdWx0cyAmJiAhaXQuY29tcG9zaXRlUnVsZTtcbiAgaWYgKCRzY2hlbWFLZXlzLmxlbmd0aCkge1xuICAgIHZhciBhcnIzID0gJHNjaGVtYUtleXM7XG4gICAgaWYgKGFycjMpIHtcbiAgICAgIHZhciAkcHJvcGVydHlLZXksIGkzID0gLTEsXG4gICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgd2hpbGUgKGkzIDwgbDMpIHtcbiAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyM1tpMyArPSAxXTtcbiAgICAgICAgdmFyICRzY2ggPSAkc2NoZW1hWyRwcm9wZXJ0eUtleV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICB2YXIgJHByb3AgPSBpdC51dGlsLmdldFByb3BlcnR5KCRwcm9wZXJ0eUtleSksXG4gICAgICAgICAgICAkcGFzc0RhdGEgPSAkZGF0YSArICRwcm9wLFxuICAgICAgICAgICAgJGhhc0RlZmF1bHQgPSAkdXNlRGVmYXVsdHMgJiYgJHNjaC5kZWZhdWx0ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgJGl0LnNjaGVtYSA9ICRzY2g7XG4gICAgICAgICAgJGl0LnNjaGVtYVBhdGggPSAkc2NoZW1hUGF0aCArICRwcm9wO1xuICAgICAgICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGggKyAnLycgKyBpdC51dGlsLmVzY2FwZUZyYWdtZW50KCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aChpdC5lcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICRpdC5kYXRhUGF0aEFyclskZGF0YU54dF0gPSBpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KTtcbiAgICAgICAgICAkaXQuYmFzZUlkID0gJGN1cnJlbnRCYXNlSWQ7XG4gICAgICAgICAgaWYgKGl0LnV0aWwudmFyT2NjdXJlbmNlcygkY29kZSwgJG5leHREYXRhKSA8IDIpIHtcbiAgICAgICAgICAgICRjb2RlID0gaXQudXRpbC52YXJSZXBsYWNlKCRjb2RlLCAkbmV4dERhdGEsICRwYXNzRGF0YSk7XG4gICAgICAgICAgICB2YXIgJHVzZURhdGEgPSAkcGFzc0RhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciAkdXNlRGF0YSA9ICRuZXh0RGF0YTtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCRoYXNEZWZhdWx0KSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRjb2RlKSArICcgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCRyZXF1aXJlZEhhc2ggJiYgJHJlcXVpcmVkSGFzaFskcHJvcGVydHlLZXldKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIGlmICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJykgeyAnICsgKCRuZXh0VmFsaWQpICsgJyA9IGZhbHNlOyAnO1xuICAgICAgICAgICAgICB2YXIgJGN1cnJlbnRFcnJvclBhdGggPSBpdC5lcnJvclBhdGgsXG4gICAgICAgICAgICAgICAgJGN1cnJFcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGgsXG4gICAgICAgICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9IGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvcmVxdWlyZWQnO1xuICAgICAgICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICRlcnJTY2hlbWFQYXRoID0gJGN1cnJFcnJTY2hlbWFQYXRoO1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgfSBlbHNlIHsgJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcpIHsgJyArICgkbmV4dFZhbGlkKSArICcgPSB0cnVlOyB9IGVsc2UgeyAnO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIGlmICgnICsgKCR1c2VEYXRhKSArICcgIT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgJiYgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCBcXCcnICsgKGl0LnV0aWwuZXNjYXBlUXVvdGVzKCRwcm9wZXJ0eUtleSkpICsgJ1xcJykgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgKSB7ICc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGNvZGUpICsgJyB9ICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgJGNsb3NpbmdCcmFjZXMgKz0gJ30nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkcFByb3BlcnR5S2V5cy5sZW5ndGgpIHtcbiAgICB2YXIgYXJyNCA9ICRwUHJvcGVydHlLZXlzO1xuICAgIGlmIChhcnI0KSB7XG4gICAgICB2YXIgJHBQcm9wZXJ0eSwgaTQgPSAtMSxcbiAgICAgICAgbDQgPSBhcnI0Lmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaTQgPCBsNCkge1xuICAgICAgICAkcFByb3BlcnR5ID0gYXJyNFtpNCArPSAxXTtcbiAgICAgICAgdmFyICRzY2ggPSAkcFByb3BlcnRpZXNbJHBQcm9wZXJ0eV07XG4gICAgICAgIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaCA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoKS5sZW5ndGggPiAwKSB8fCAkc2NoID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaCwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAgICAgICAkaXQuc2NoZW1hID0gJHNjaDtcbiAgICAgICAgICAkaXQuc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyAnLnBhdHRlcm5Qcm9wZXJ0aWVzJyArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJHBQcm9wZXJ0eSk7XG4gICAgICAgICAgJGl0LmVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy9wYXR0ZXJuUHJvcGVydGllcy8nICsgaXQudXRpbC5lc2NhcGVGcmFnbWVudCgkcFByb3BlcnR5KTtcbiAgICAgICAgICBpZiAoJG93blByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnIHx8IE9iamVjdC5rZXlzKCcgKyAoJGRhdGEpICsgJyk7IGZvciAodmFyICcgKyAoJGlkeCkgKyAnPTA7ICcgKyAoJGlkeCkgKyAnPCcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICcubGVuZ3RoOyAnICsgKCRpZHgpICsgJysrKSB7IHZhciAnICsgKCRrZXkpICsgJyA9ICcgKyAoJGRhdGFQcm9wZXJ0aWVzKSArICdbJyArICgkaWR4KSArICddOyAnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBmb3IgKHZhciAnICsgKCRrZXkpICsgJyBpbiAnICsgKCRkYXRhKSArICcpIHsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXNlUGF0dGVybigkcFByb3BlcnR5KSkgKyAnLnRlc3QoJyArICgka2V5KSArICcpKSB7ICc7XG4gICAgICAgICAgJGl0LmVycm9yUGF0aCA9IGl0LnV0aWwuZ2V0UGF0aEV4cHIoaXQuZXJyb3JQYXRoLCAka2V5LCBpdC5vcHRzLmpzb25Qb2ludGVycyk7XG4gICAgICAgICAgdmFyICRwYXNzRGF0YSA9ICRkYXRhICsgJ1snICsgJGtleSArICddJztcbiAgICAgICAgICAkaXQuZGF0YVBhdGhBcnJbJGRhdGFOeHRdID0gJGtleTtcbiAgICAgICAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICAgICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICAgICAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBpZiAoIScgKyAoJG5leHRWYWxpZCkgKyAnKSBicmVhazsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAnO1xuICAgICAgICAgIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyBlbHNlICcgKyAoJG5leHRWYWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSAgJztcbiAgICAgICAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJG5leHRWYWxpZCkgKyAnKSB7ICc7XG4gICAgICAgICAgICAkY2xvc2luZ0JyYWNlcyArPSAnfSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcHJvcGVydHlOYW1lcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJGVycnMgPSAnZXJyc19fJyArICRsdmw7XG4gIHZhciAkaXQgPSBpdC51dGlsLmNvcHkoaXQpO1xuICB2YXIgJGNsb3NpbmdCcmFjZXMgPSAnJztcbiAgJGl0LmxldmVsKys7XG4gIHZhciAkbmV4dFZhbGlkID0gJ3ZhbGlkJyArICRpdC5sZXZlbDtcbiAgb3V0ICs9ICd2YXIgJyArICgkZXJycykgKyAnID0gZXJyb3JzOyc7XG4gIGlmICgoaXQub3B0cy5zdHJpY3RLZXl3b3JkcyA/ICh0eXBlb2YgJHNjaGVtYSA9PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cygkc2NoZW1hKS5sZW5ndGggPiAwKSB8fCAkc2NoZW1hID09PSBmYWxzZSA6IGl0LnV0aWwuc2NoZW1hSGFzUnVsZXMoJHNjaGVtYSwgaXQuUlVMRVMuYWxsKSkpIHtcbiAgICAkaXQuc2NoZW1hID0gJHNjaGVtYTtcbiAgICAkaXQuc2NoZW1hUGF0aCA9ICRzY2hlbWFQYXRoO1xuICAgICRpdC5lcnJTY2hlbWFQYXRoID0gJGVyclNjaGVtYVBhdGg7XG4gICAgdmFyICRrZXkgPSAna2V5JyArICRsdmwsXG4gICAgICAkaWR4ID0gJ2lkeCcgKyAkbHZsLFxuICAgICAgJGkgPSAnaScgKyAkbHZsLFxuICAgICAgJGludmFsaWROYW1lID0gJ1xcJyArICcgKyAka2V5ICsgJyArIFxcJycsXG4gICAgICAkZGF0YU54dCA9ICRpdC5kYXRhTGV2ZWwgPSBpdC5kYXRhTGV2ZWwgKyAxLFxuICAgICAgJG5leHREYXRhID0gJ2RhdGEnICsgJGRhdGFOeHQsXG4gICAgICAkZGF0YVByb3BlcnRpZXMgPSAnZGF0YVByb3BlcnRpZXMnICsgJGx2bCxcbiAgICAgICRvd25Qcm9wZXJ0aWVzID0gaXQub3B0cy5vd25Qcm9wZXJ0aWVzLFxuICAgICAgJGN1cnJlbnRCYXNlSWQgPSBpdC5iYXNlSWQ7XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyB2YXIgJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyA9IHVuZGVmaW5lZDsgJztcbiAgICB9XG4gICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICBvdXQgKz0gJyAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnID0gJyArICgkZGF0YVByb3BlcnRpZXMpICsgJyB8fCBPYmplY3Qua2V5cygnICsgKCRkYXRhKSArICcpOyBmb3IgKHZhciAnICsgKCRpZHgpICsgJz0wOyAnICsgKCRpZHgpICsgJzwnICsgKCRkYXRhUHJvcGVydGllcykgKyAnLmxlbmd0aDsgJyArICgkaWR4KSArICcrKykgeyB2YXIgJyArICgka2V5KSArICcgPSAnICsgKCRkYXRhUHJvcGVydGllcykgKyAnWycgKyAoJGlkeCkgKyAnXTsgJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgZm9yICh2YXIgJyArICgka2V5KSArICcgaW4gJyArICgkZGF0YSkgKyAnKSB7ICc7XG4gICAgfVxuICAgIG91dCArPSAnIHZhciBzdGFydEVycnMnICsgKCRsdmwpICsgJyA9IGVycm9yczsgJztcbiAgICB2YXIgJHBhc3NEYXRhID0gJGtleTtcbiAgICB2YXIgJHdhc0NvbXBvc2l0ZSA9IGl0LmNvbXBvc2l0ZVJ1bGU7XG4gICAgaXQuY29tcG9zaXRlUnVsZSA9ICRpdC5jb21wb3NpdGVSdWxlID0gdHJ1ZTtcbiAgICB2YXIgJGNvZGUgPSBpdC52YWxpZGF0ZSgkaXQpO1xuICAgICRpdC5iYXNlSWQgPSAkY3VycmVudEJhc2VJZDtcbiAgICBpZiAoaXQudXRpbC52YXJPY2N1cmVuY2VzKCRjb2RlLCAkbmV4dERhdGEpIDwgMikge1xuICAgICAgb3V0ICs9ICcgJyArIChpdC51dGlsLnZhclJlcGxhY2UoJGNvZGUsICRuZXh0RGF0YSwgJHBhc3NEYXRhKSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciAnICsgKCRuZXh0RGF0YSkgKyAnID0gJyArICgkcGFzc0RhdGEpICsgJzsgJyArICgkY29kZSkgKyAnICc7XG4gICAgfVxuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9ICR3YXNDb21wb3NpdGU7XG4gICAgb3V0ICs9ICcgaWYgKCEnICsgKCRuZXh0VmFsaWQpICsgJykgeyBmb3IgKHZhciAnICsgKCRpKSArICc9c3RhcnRFcnJzJyArICgkbHZsKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZFcnJvcnNbJyArICgkaSkgKyAnXS5wcm9wZXJ0eU5hbWUgPSAnICsgKCRrZXkpICsgJzsgfSAgIHZhciBlcnIgPSAgICc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncHJvcGVydHlOYW1lcycpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsgcHJvcGVydHlOYW1lOiBcXCcnICsgKCRpbnZhbGlkTmFtZSkgKyAnXFwnIH0gJztcbiAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Byb3BlcnR5IG5hbWUgXFxcXFxcJycgKyAoJGludmFsaWROYW1lKSArICdcXFxcXFwnIGlzIGludmFsaWRcXCcgJztcbiAgICAgIH1cbiAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICBpZiAoIWl0LmNvbXBvc2l0ZVJ1bGUgJiYgJGJyZWFrT25FcnJvcikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgb3V0ICs9ICcgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcih2RXJyb3JzKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGJyZWFrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9IH0nO1xuICB9XG4gIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgJyArICgkY2xvc2luZ0JyYWNlcykgKyAnIGlmICgnICsgKCRlcnJzKSArICcgPT0gZXJyb3JzKSB7JztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfcmVxdWlyZWQoaXQsICRrZXl3b3JkLCAkcnVsZVR5cGUpIHtcbiAgdmFyIG91dCA9ICcgJztcbiAgdmFyICRsdmwgPSBpdC5sZXZlbDtcbiAgdmFyICRkYXRhTHZsID0gaXQuZGF0YUxldmVsO1xuICB2YXIgJHNjaGVtYSA9IGl0LnNjaGVtYVska2V5d29yZF07XG4gIHZhciAkc2NoZW1hUGF0aCA9IGl0LnNjaGVtYVBhdGggKyBpdC51dGlsLmdldFByb3BlcnR5KCRrZXl3b3JkKTtcbiAgdmFyICRlcnJTY2hlbWFQYXRoID0gaXQuZXJyU2NoZW1hUGF0aCArICcvJyArICRrZXl3b3JkO1xuICB2YXIgJGJyZWFrT25FcnJvciA9ICFpdC5vcHRzLmFsbEVycm9ycztcbiAgdmFyICRkYXRhID0gJ2RhdGEnICsgKCRkYXRhTHZsIHx8ICcnKTtcbiAgdmFyICR2YWxpZCA9ICd2YWxpZCcgKyAkbHZsO1xuICB2YXIgJGlzRGF0YSA9IGl0Lm9wdHMuJGRhdGEgJiYgJHNjaGVtYSAmJiAkc2NoZW1hLiRkYXRhLFxuICAgICRzY2hlbWFWYWx1ZTtcbiAgaWYgKCRpc0RhdGEpIHtcbiAgICBvdXQgKz0gJyB2YXIgc2NoZW1hJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwuZ2V0RGF0YSgkc2NoZW1hLiRkYXRhLCAkZGF0YUx2bCwgaXQuZGF0YVBhdGhBcnIpKSArICc7ICc7XG4gICAgJHNjaGVtYVZhbHVlID0gJ3NjaGVtYScgKyAkbHZsO1xuICB9IGVsc2Uge1xuICAgICRzY2hlbWFWYWx1ZSA9ICRzY2hlbWE7XG4gIH1cbiAgdmFyICR2U2NoZW1hID0gJ3NjaGVtYScgKyAkbHZsO1xuICBpZiAoISRpc0RhdGEpIHtcbiAgICBpZiAoJHNjaGVtYS5sZW5ndGggPCBpdC5vcHRzLmxvb3BSZXF1aXJlZCAmJiBpdC5zY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3Qua2V5cyhpdC5zY2hlbWEucHJvcGVydGllcykubGVuZ3RoKSB7XG4gICAgICB2YXIgJHJlcXVpcmVkID0gW107XG4gICAgICB2YXIgYXJyMSA9ICRzY2hlbWE7XG4gICAgICBpZiAoYXJyMSkge1xuICAgICAgICB2YXIgJHByb3BlcnR5LCBpMSA9IC0xLFxuICAgICAgICAgIGwxID0gYXJyMS5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoaTEgPCBsMSkge1xuICAgICAgICAgICRwcm9wZXJ0eSA9IGFycjFbaTEgKz0gMV07XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eVNjaCA9IGl0LnNjaGVtYS5wcm9wZXJ0aWVzWyRwcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKCEoJHByb3BlcnR5U2NoICYmIChpdC5vcHRzLnN0cmljdEtleXdvcmRzID8gKHR5cGVvZiAkcHJvcGVydHlTY2ggPT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoJHByb3BlcnR5U2NoKS5sZW5ndGggPiAwKSB8fCAkcHJvcGVydHlTY2ggPT09IGZhbHNlIDogaXQudXRpbC5zY2hlbWFIYXNSdWxlcygkcHJvcGVydHlTY2gsIGl0LlJVTEVTLmFsbCkpKSkge1xuICAgICAgICAgICAgJHJlcXVpcmVkWyRyZXF1aXJlZC5sZW5ndGhdID0gJHByb3BlcnR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgJHJlcXVpcmVkID0gJHNjaGVtYTtcbiAgICB9XG4gIH1cbiAgaWYgKCRpc0RhdGEgfHwgJHJlcXVpcmVkLmxlbmd0aCkge1xuICAgIHZhciAkY3VycmVudEVycm9yUGF0aCA9IGl0LmVycm9yUGF0aCxcbiAgICAgICRsb29wUmVxdWlyZWQgPSAkaXNEYXRhIHx8ICRyZXF1aXJlZC5sZW5ndGggPj0gaXQub3B0cy5sb29wUmVxdWlyZWQsXG4gICAgICAkb3duUHJvcGVydGllcyA9IGl0Lm9wdHMub3duUHJvcGVydGllcztcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgdmFyIG1pc3NpbmcnICsgKCRsdmwpICsgJzsgJztcbiAgICAgIGlmICgkbG9vcFJlcXVpcmVkKSB7XG4gICAgICAgIGlmICghJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAgICAgICAkcHJvcGVydHlQYXRoID0gJ3NjaGVtYScgKyAkbHZsICsgJ1snICsgJGkgKyAnXScsXG4gICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9ICdcXCcgKyAnICsgJHByb3BlcnR5UGF0aCArICcgKyBcXCcnO1xuICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZTsgJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyBpZiAoc2NoZW1hJyArICgkbHZsKSArICcgPT09IHVuZGVmaW5lZCkgJyArICgkdmFsaWQpICsgJyA9IHRydWU7IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYScgKyAoJGx2bCkgKyAnKSkgJyArICgkdmFsaWQpICsgJyA9IGZhbHNlOyBlbHNlIHsnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGkpICsgJyA9IDA7ICcgKyAoJGkpICsgJyA8ICcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSB7ICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkYXRhKSArICdbJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ11dICE9PSB1bmRlZmluZWQgJztcbiAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgb3V0ICs9ICcgJiYgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJzsgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSBicmVhazsgfSAnO1xuICAgICAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnICB9ICAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICBpZiAoIScgKyAoJHZhbGlkKSArICcpIHsgICAnO1xuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyBpZiAoICc7XG4gICAgICAgIHZhciBhcnIyID0gJHJlcXVpcmVkO1xuICAgICAgICBpZiAoYXJyMikge1xuICAgICAgICAgIHZhciAkcHJvcGVydHlLZXksICRpID0gLTEsXG4gICAgICAgICAgICBsMiA9IGFycjIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB3aGlsZSAoJGkgPCBsMikge1xuICAgICAgICAgICAgJHByb3BlcnR5S2V5ID0gYXJyMlskaSArPSAxXTtcbiAgICAgICAgICAgIGlmICgkaSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkdXNlRGF0YSA9ICRkYXRhICsgJHByb3A7XG4gICAgICAgICAgICBvdXQgKz0gJyAoICggJyArICgkdXNlRGF0YSkgKyAnID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgICAgIGlmICgkb3duUHJvcGVydGllcykge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB8fCAhIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCgnICsgKCRkYXRhKSArICcsIFxcJycgKyAoaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSkgKyAnXFwnKSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcpICYmIChtaXNzaW5nJyArICgkbHZsKSArICcgPSAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoaXQub3B0cy5qc29uUG9pbnRlcnMgPyAkcHJvcGVydHlLZXkgOiAkcHJvcCkpICsgJykgKSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykgeyAgJztcbiAgICAgICAgdmFyICRwcm9wZXJ0eVBhdGggPSAnbWlzc2luZycgKyAkbHZsLFxuICAgICAgICAgICRtaXNzaW5nUHJvcGVydHkgPSAnXFwnICsgJyArICRwcm9wZXJ0eVBhdGggKyAnICsgXFwnJztcbiAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgIGl0LmVycm9yUGF0aCA9IGl0Lm9wdHMuanNvblBvaW50ZXJzID8gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgdHJ1ZSkgOiAkY3VycmVudEVycm9yUGF0aCArICcgKyAnICsgJHByb3BlcnR5UGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgICAgICBvdXQgPSAnJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX19lcnIgPSBvdXQ7XG4gICAgICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIH0gZWxzZSB7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkbG9vcFJlcXVpcmVkKSB7XG4gICAgICAgIGlmICghJGlzRGF0YSkge1xuICAgICAgICAgIG91dCArPSAnIHZhciAnICsgKCR2U2NoZW1hKSArICcgPSB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICc7ICc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyICRpID0gJ2knICsgJGx2bCxcbiAgICAgICAgICAkcHJvcGVydHlQYXRoID0gJ3NjaGVtYScgKyAkbHZsICsgJ1snICsgJGkgKyAnXScsXG4gICAgICAgICAgJG1pc3NpbmdQcm9wZXJ0eSA9ICdcXCcgKyAnICsgJHByb3BlcnR5UGF0aCArICcgKyBcXCcnO1xuICAgICAgICBpZiAoaXQub3B0cy5fZXJyb3JEYXRhUGF0aFByb3BlcnR5KSB7XG4gICAgICAgICAgaXQuZXJyb3JQYXRoID0gaXQudXRpbC5nZXRQYXRoRXhwcigkY3VycmVudEVycm9yUGF0aCwgJHByb3BlcnR5UGF0aCwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJHZTY2hlbWEpICsgJyAmJiAhQXJyYXkuaXNBcnJheSgnICsgKCR2U2NoZW1hKSArICcpKSB7ICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLm1lc3NhZ2VzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJ2lzIGEgcmVxdWlyZWQgcHJvcGVydHknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSBlbHNlIGlmICgnICsgKCR2U2NoZW1hKSArICcgIT09IHVuZGVmaW5lZCkgeyAnO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnIGZvciAodmFyICcgKyAoJGkpICsgJyA9IDA7ICcgKyAoJGkpICsgJyA8ICcgKyAoJHZTY2hlbWEpICsgJy5sZW5ndGg7ICcgKyAoJGkpICsgJysrKSB7IGlmICgnICsgKCRkYXRhKSArICdbJyArICgkdlNjaGVtYSkgKyAnWycgKyAoJGkpICsgJ11dID09PSB1bmRlZmluZWQgJztcbiAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgb3V0ICs9ICcgfHwgISBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoJyArICgkZGF0YSkgKyAnLCAnICsgKCR2U2NoZW1hKSArICdbJyArICgkaSkgKyAnXSkgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJ3JlcXVpcmVkJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBtaXNzaW5nUHJvcGVydHk6IFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFwnIH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnJztcbiAgICAgICAgICAgIGlmIChpdC5vcHRzLl9lcnJvckRhdGFQYXRoUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG91dCArPSAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFxcXFxcJycgKyAoJG1pc3NpbmdQcm9wZXJ0eSkgKyAnXFxcXFxcJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJ1xcJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArICgkc2NoZW1hUGF0aCkgKyAnICwgcGFyZW50U2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKGl0LnNjaGVtYVBhdGgpICsgJyAsIGRhdGE6ICcgKyAoJGRhdGEpICsgJyAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcge30gJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyB9IH0gJztcbiAgICAgICAgaWYgKCRpc0RhdGEpIHtcbiAgICAgICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycjMgPSAkcmVxdWlyZWQ7XG4gICAgICAgIGlmIChhcnIzKSB7XG4gICAgICAgICAgdmFyICRwcm9wZXJ0eUtleSwgaTMgPSAtMSxcbiAgICAgICAgICAgIGwzID0gYXJyMy5sZW5ndGggLSAxO1xuICAgICAgICAgIHdoaWxlIChpMyA8IGwzKSB7XG4gICAgICAgICAgICAkcHJvcGVydHlLZXkgPSBhcnIzW2kzICs9IDFdO1xuICAgICAgICAgICAgdmFyICRwcm9wID0gaXQudXRpbC5nZXRQcm9wZXJ0eSgkcHJvcGVydHlLZXkpLFxuICAgICAgICAgICAgICAkbWlzc2luZ1Byb3BlcnR5ID0gaXQudXRpbC5lc2NhcGVRdW90ZXMoJHByb3BlcnR5S2V5KSxcbiAgICAgICAgICAgICAgJHVzZURhdGEgPSAkZGF0YSArICRwcm9wO1xuICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICBpdC5lcnJvclBhdGggPSBpdC51dGlsLmdldFBhdGgoJGN1cnJlbnRFcnJvclBhdGgsICRwcm9wZXJ0eUtleSwgaXQub3B0cy5qc29uUG9pbnRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICcgaWYgKCAnICsgKCR1c2VEYXRhKSArICcgPT09IHVuZGVmaW5lZCAnO1xuICAgICAgICAgICAgaWYgKCRvd25Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHx8ICEgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCcgKyAoJGRhdGEpICsgJywgXFwnJyArIChpdC51dGlsLmVzY2FwZVF1b3RlcygkcHJvcGVydHlLZXkpKSArICdcXCcpICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgKz0gJykgeyAgdmFyIGVyciA9ICAgJzsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgncmVxdWlyZWQnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IG1pc3NpbmdQcm9wZXJ0eTogXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXCcgfSAnO1xuICAgICAgICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJyc7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lm9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdpcyBhIHJlcXVpcmVkIHByb3BlcnR5JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0ICs9ICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXFxcXFwnJyArICgkbWlzc2luZ1Byb3BlcnR5KSArICdcXFxcXFwnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3V0ICs9ICdcXCcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgfSAnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpdC5lcnJvclBhdGggPSAkY3VycmVudEVycm9yUGF0aDtcbiAgfSBlbHNlIGlmICgkYnJlYWtPbkVycm9yKSB7XG4gICAgb3V0ICs9ICcgaWYgKHRydWUpIHsnO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZW5lcmF0ZV91bmlxdWVJdGVtcyhpdCwgJGtleXdvcmQsICRydWxlVHlwZSkge1xuICB2YXIgb3V0ID0gJyAnO1xuICB2YXIgJGx2bCA9IGl0LmxldmVsO1xuICB2YXIgJGRhdGFMdmwgPSBpdC5kYXRhTGV2ZWw7XG4gIHZhciAkc2NoZW1hID0gaXQuc2NoZW1hWyRrZXl3b3JkXTtcbiAgdmFyICRzY2hlbWFQYXRoID0gaXQuc2NoZW1hUGF0aCArIGl0LnV0aWwuZ2V0UHJvcGVydHkoJGtleXdvcmQpO1xuICB2YXIgJGVyclNjaGVtYVBhdGggPSBpdC5lcnJTY2hlbWFQYXRoICsgJy8nICsgJGtleXdvcmQ7XG4gIHZhciAkYnJlYWtPbkVycm9yID0gIWl0Lm9wdHMuYWxsRXJyb3JzO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkaXNEYXRhID0gaXQub3B0cy4kZGF0YSAmJiAkc2NoZW1hICYmICRzY2hlbWEuJGRhdGEsXG4gICAgJHNjaGVtYVZhbHVlO1xuICBpZiAoJGlzRGF0YSkge1xuICAgIG91dCArPSAnIHZhciBzY2hlbWEnICsgKCRsdmwpICsgJyA9ICcgKyAoaXQudXRpbC5nZXREYXRhKCRzY2hlbWEuJGRhdGEsICRkYXRhTHZsLCBpdC5kYXRhUGF0aEFycikpICsgJzsgJztcbiAgICAkc2NoZW1hVmFsdWUgPSAnc2NoZW1hJyArICRsdmw7XG4gIH0gZWxzZSB7XG4gICAgJHNjaGVtYVZhbHVlID0gJHNjaGVtYTtcbiAgfVxuICBpZiAoKCRzY2hlbWEgfHwgJGlzRGF0YSkgJiYgaXQub3B0cy51bmlxdWVJdGVtcyAhPT0gZmFsc2UpIHtcbiAgICBpZiAoJGlzRGF0YSkge1xuICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHZhbGlkKSArICc7IGlmICgnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSBmYWxzZSB8fCAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnID09PSB1bmRlZmluZWQpICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyBlbHNlIGlmICh0eXBlb2YgJyArICgkc2NoZW1hVmFsdWUpICsgJyAhPSBcXCdib29sZWFuXFwnKSAnICsgKCR2YWxpZCkgKyAnID0gZmFsc2U7IGVsc2UgeyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB2YXIgaSA9ICcgKyAoJGRhdGEpICsgJy5sZW5ndGggLCAnICsgKCR2YWxpZCkgKyAnID0gdHJ1ZSAsIGo7IGlmIChpID4gMSkgeyAnO1xuICAgIHZhciAkaXRlbVR5cGUgPSBpdC5zY2hlbWEuaXRlbXMgJiYgaXQuc2NoZW1hLml0ZW1zLnR5cGUsXG4gICAgICAkdHlwZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCRpdGVtVHlwZSk7XG4gICAgaWYgKCEkaXRlbVR5cGUgfHwgJGl0ZW1UeXBlID09ICdvYmplY3QnIHx8ICRpdGVtVHlwZSA9PSAnYXJyYXknIHx8ICgkdHlwZUlzQXJyYXkgJiYgKCRpdGVtVHlwZS5pbmRleE9mKCdvYmplY3QnKSA+PSAwIHx8ICRpdGVtVHlwZS5pbmRleE9mKCdhcnJheScpID49IDApKSkge1xuICAgICAgb3V0ICs9ICcgb3V0ZXI6IGZvciAoO2ktLTspIHsgZm9yIChqID0gaTsgai0tOykgeyBpZiAoZXF1YWwoJyArICgkZGF0YSkgKyAnW2ldLCAnICsgKCRkYXRhKSArICdbal0pKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgYnJlYWsgb3V0ZXI7IH0gfSB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBpdGVtSW5kaWNlcyA9IHt9LCBpdGVtOyBmb3IgKDtpLS07KSB7IHZhciBpdGVtID0gJyArICgkZGF0YSkgKyAnW2ldOyAnO1xuICAgICAgdmFyICRtZXRob2QgPSAnY2hlY2tEYXRhVHlwZScgKyAoJHR5cGVJc0FycmF5ID8gJ3MnIDogJycpO1xuICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoaXQudXRpbFskbWV0aG9kXSgkaXRlbVR5cGUsICdpdGVtJywgaXQub3B0cy5zdHJpY3ROdW1iZXJzLCB0cnVlKSkgKyAnKSBjb250aW51ZTsgJztcbiAgICAgIGlmICgkdHlwZUlzQXJyYXkpIHtcbiAgICAgICAgb3V0ICs9ICcgaWYgKHR5cGVvZiBpdGVtID09IFxcJ3N0cmluZ1xcJykgaXRlbSA9IFxcJ1wiXFwnICsgaXRlbTsgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIGlmICh0eXBlb2YgaXRlbUluZGljZXNbaXRlbV0gPT0gXFwnbnVtYmVyXFwnKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgaiA9IGl0ZW1JbmRpY2VzW2l0ZW1dOyBicmVhazsgfSBpdGVtSW5kaWNlc1tpdGVtXSA9IGk7IH0gJztcbiAgICB9XG4gICAgb3V0ICs9ICcgfSAnO1xuICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICBvdXQgKz0gJyAgfSAgJztcbiAgICB9XG4gICAgb3V0ICs9ICcgaWYgKCEnICsgKCR2YWxpZCkgKyAnKSB7ICAgJztcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnIHsga2V5d29yZDogXFwnJyArICgndW5pcXVlSXRlbXMnKSArICdcXCcgLCBkYXRhUGF0aDogKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnICwgc2NoZW1hUGF0aDogJyArIChpdC51dGlsLnRvUXVvdGVkU3RyaW5nKCRlcnJTY2hlbWFQYXRoKSkgKyAnICwgcGFyYW1zOiB7IGk6IGksIGo6IGogfSAnO1xuICAgICAgaWYgKGl0Lm9wdHMubWVzc2FnZXMgIT09IGZhbHNlKSB7XG4gICAgICAgIG91dCArPSAnICwgbWVzc2FnZTogXFwnc2hvdWxkIE5PVCBoYXZlIGR1cGxpY2F0ZSBpdGVtcyAoaXRlbXMgIyMgXFwnICsgaiArIFxcJyBhbmQgXFwnICsgaSArIFxcJyBhcmUgaWRlbnRpY2FsKVxcJyAnO1xuICAgICAgfVxuICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICBvdXQgKz0gJyAsIHNjaGVtYTogICc7XG4gICAgICAgIGlmICgkaXNEYXRhKSB7XG4gICAgICAgICAgb3V0ICs9ICd2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgKz0gJycgKyAoJHNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICcgICAgICAgICAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgIH1cbiAgICAgIG91dCArPSAnIH0gJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcge30gJztcbiAgICB9XG4gICAgdmFyIF9fZXJyID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCFpdC5jb21wb3NpdGVSdWxlICYmICRicmVha09uRXJyb3IpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKGl0LmFzeW5jKSB7XG4gICAgICAgIG91dCArPSAnIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoWycgKyAoX19lcnIpICsgJ10pOyAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcgdmFsaWRhdGUuZXJyb3JzID0gWycgKyAoX19lcnIpICsgJ107IHJldHVybiBmYWxzZTsgJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICcgdmFyIGVyciA9ICcgKyAoX19lcnIpICsgJzsgIGlmICh2RXJyb3JzID09PSBudWxsKSB2RXJyb3JzID0gW2Vycl07IGVsc2UgdkVycm9ycy5wdXNoKGVycik7IGVycm9ycysrOyAnO1xuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8vYWxsIHJlcXVpcmVzIG11c3QgYmUgZXhwbGljaXQgYmVjYXVzZSBicm93c2VyaWZ5IHdvbid0IHdvcmsgd2l0aCBkeW5hbWljIHJlcXVpcmVzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJyRyZWYnOiByZXF1aXJlKCcuL3JlZicpLFxuICBhbGxPZjogcmVxdWlyZSgnLi9hbGxPZicpLFxuICBhbnlPZjogcmVxdWlyZSgnLi9hbnlPZicpLFxuICAnJGNvbW1lbnQnOiByZXF1aXJlKCcuL2NvbW1lbnQnKSxcbiAgY29uc3Q6IHJlcXVpcmUoJy4vY29uc3QnKSxcbiAgY29udGFpbnM6IHJlcXVpcmUoJy4vY29udGFpbnMnKSxcbiAgZGVwZW5kZW5jaWVzOiByZXF1aXJlKCcuL2RlcGVuZGVuY2llcycpLFxuICAnZW51bSc6IHJlcXVpcmUoJy4vZW51bScpLFxuICBmb3JtYXQ6IHJlcXVpcmUoJy4vZm9ybWF0JyksXG4gICdpZic6IHJlcXVpcmUoJy4vaWYnKSxcbiAgaXRlbXM6IHJlcXVpcmUoJy4vaXRlbXMnKSxcbiAgbWF4aW11bTogcmVxdWlyZSgnLi9fbGltaXQnKSxcbiAgbWluaW11bTogcmVxdWlyZSgnLi9fbGltaXQnKSxcbiAgbWF4SXRlbXM6IHJlcXVpcmUoJy4vX2xpbWl0SXRlbXMnKSxcbiAgbWluSXRlbXM6IHJlcXVpcmUoJy4vX2xpbWl0SXRlbXMnKSxcbiAgbWF4TGVuZ3RoOiByZXF1aXJlKCcuL19saW1pdExlbmd0aCcpLFxuICBtaW5MZW5ndGg6IHJlcXVpcmUoJy4vX2xpbWl0TGVuZ3RoJyksXG4gIG1heFByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX2xpbWl0UHJvcGVydGllcycpLFxuICBtaW5Qcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19saW1pdFByb3BlcnRpZXMnKSxcbiAgbXVsdGlwbGVPZjogcmVxdWlyZSgnLi9tdWx0aXBsZU9mJyksXG4gIG5vdDogcmVxdWlyZSgnLi9ub3QnKSxcbiAgb25lT2Y6IHJlcXVpcmUoJy4vb25lT2YnKSxcbiAgcGF0dGVybjogcmVxdWlyZSgnLi9wYXR0ZXJuJyksXG4gIHByb3BlcnRpZXM6IHJlcXVpcmUoJy4vcHJvcGVydGllcycpLFxuICBwcm9wZXJ0eU5hbWVzOiByZXF1aXJlKCcuL3Byb3BlcnR5TmFtZXMnKSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmUoJy4vcmVxdWlyZWQnKSxcbiAgdW5pcXVlSXRlbXM6IHJlcXVpcmUoJy4vdW5pcXVlSXRlbXMnKSxcbiAgdmFsaWRhdGU6IHJlcXVpcmUoJy4vdmFsaWRhdGUnKVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBydWxlTW9kdWxlcyA9IHJlcXVpcmUoJy4uL2RvdGpzJylcbiAgLCB0b0hhc2ggPSByZXF1aXJlKCcuL3V0aWwnKS50b0hhc2g7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcnVsZXMoKSB7XG4gIHZhciBSVUxFUyA9IFtcbiAgICB7IHR5cGU6ICdudW1iZXInLFxuICAgICAgcnVsZXM6IFsgeyAnbWF4aW11bSc6IFsnZXhjbHVzaXZlTWF4aW11bSddIH0sXG4gICAgICAgICAgICAgICB7ICdtaW5pbXVtJzogWydleGNsdXNpdmVNaW5pbXVtJ10gfSwgJ211bHRpcGxlT2YnLCAnZm9ybWF0J10gfSxcbiAgICB7IHR5cGU6ICdzdHJpbmcnLFxuICAgICAgcnVsZXM6IFsgJ21heExlbmd0aCcsICdtaW5MZW5ndGgnLCAncGF0dGVybicsICdmb3JtYXQnIF0gfSxcbiAgICB7IHR5cGU6ICdhcnJheScsXG4gICAgICBydWxlczogWyAnbWF4SXRlbXMnLCAnbWluSXRlbXMnLCAnaXRlbXMnLCAnY29udGFpbnMnLCAndW5pcXVlSXRlbXMnIF0gfSxcbiAgICB7IHR5cGU6ICdvYmplY3QnLFxuICAgICAgcnVsZXM6IFsgJ21heFByb3BlcnRpZXMnLCAnbWluUHJvcGVydGllcycsICdyZXF1aXJlZCcsICdkZXBlbmRlbmNpZXMnLCAncHJvcGVydHlOYW1lcycsXG4gICAgICAgICAgICAgICB7ICdwcm9wZXJ0aWVzJzogWydhZGRpdGlvbmFsUHJvcGVydGllcycsICdwYXR0ZXJuUHJvcGVydGllcyddIH0gXSB9LFxuICAgIHsgcnVsZXM6IFsgJyRyZWYnLCAnY29uc3QnLCAnZW51bScsICdub3QnLCAnYW55T2YnLCAnb25lT2YnLCAnYWxsT2YnLCAnaWYnIF0gfVxuICBdO1xuXG4gIHZhciBBTEwgPSBbICd0eXBlJywgJyRjb21tZW50JyBdO1xuICB2YXIgS0VZV09SRFMgPSBbXG4gICAgJyRzY2hlbWEnLCAnJGlkJywgJ2lkJywgJyRkYXRhJywgJyRhc3luYycsICd0aXRsZScsXG4gICAgJ2Rlc2NyaXB0aW9uJywgJ2RlZmF1bHQnLCAnZGVmaW5pdGlvbnMnLFxuICAgICdleGFtcGxlcycsICdyZWFkT25seScsICd3cml0ZU9ubHknLFxuICAgICdjb250ZW50TWVkaWFUeXBlJywgJ2NvbnRlbnRFbmNvZGluZycsXG4gICAgJ2FkZGl0aW9uYWxJdGVtcycsICd0aGVuJywgJ2Vsc2UnXG4gIF07XG4gIHZhciBUWVBFUyA9IFsgJ251bWJlcicsICdpbnRlZ2VyJywgJ3N0cmluZycsICdhcnJheScsICdvYmplY3QnLCAnYm9vbGVhbicsICdudWxsJyBdO1xuICBSVUxFUy5hbGwgPSB0b0hhc2goQUxMKTtcbiAgUlVMRVMudHlwZXMgPSB0b0hhc2goVFlQRVMpO1xuXG4gIFJVTEVTLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgZ3JvdXAucnVsZXMgPSBncm91cC5ydWxlcy5tYXAoZnVuY3Rpb24gKGtleXdvcmQpIHtcbiAgICAgIHZhciBpbXBsS2V5d29yZHM7XG4gICAgICBpZiAodHlwZW9mIGtleXdvcmQgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIGtleSA9IE9iamVjdC5rZXlzKGtleXdvcmQpWzBdO1xuICAgICAgICBpbXBsS2V5d29yZHMgPSBrZXl3b3JkW2tleV07XG4gICAgICAgIGtleXdvcmQgPSBrZXk7XG4gICAgICAgIGltcGxLZXl3b3Jkcy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgQUxMLnB1c2goayk7XG4gICAgICAgICAgUlVMRVMuYWxsW2tdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBBTEwucHVzaChrZXl3b3JkKTtcbiAgICAgIHZhciBydWxlID0gUlVMRVMuYWxsW2tleXdvcmRdID0ge1xuICAgICAgICBrZXl3b3JkOiBrZXl3b3JkLFxuICAgICAgICBjb2RlOiBydWxlTW9kdWxlc1trZXl3b3JkXSxcbiAgICAgICAgaW1wbGVtZW50czogaW1wbEtleXdvcmRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgfSk7XG5cbiAgICBSVUxFUy5hbGwuJGNvbW1lbnQgPSB7XG4gICAgICBrZXl3b3JkOiAnJGNvbW1lbnQnLFxuICAgICAgY29kZTogcnVsZU1vZHVsZXMuJGNvbW1lbnRcbiAgICB9O1xuXG4gICAgaWYgKGdyb3VwLnR5cGUpIFJVTEVTLnR5cGVzW2dyb3VwLnR5cGVdID0gZ3JvdXA7XG4gIH0pO1xuXG4gIFJVTEVTLmtleXdvcmRzID0gdG9IYXNoKEFMTC5jb25jYXQoS0VZV09SRFMpKTtcbiAgUlVMRVMuY3VzdG9tID0ge307XG5cbiAgcmV0dXJuIFJVTEVTO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBLRVlXT1JEUyA9IFtcbiAgJ211bHRpcGxlT2YnLFxuICAnbWF4aW11bScsXG4gICdleGNsdXNpdmVNYXhpbXVtJyxcbiAgJ21pbmltdW0nLFxuICAnZXhjbHVzaXZlTWluaW11bScsXG4gICdtYXhMZW5ndGgnLFxuICAnbWluTGVuZ3RoJyxcbiAgJ3BhdHRlcm4nLFxuICAnYWRkaXRpb25hbEl0ZW1zJyxcbiAgJ21heEl0ZW1zJyxcbiAgJ21pbkl0ZW1zJyxcbiAgJ3VuaXF1ZUl0ZW1zJyxcbiAgJ21heFByb3BlcnRpZXMnLFxuICAnbWluUHJvcGVydGllcycsXG4gICdyZXF1aXJlZCcsXG4gICdhZGRpdGlvbmFsUHJvcGVydGllcycsXG4gICdlbnVtJyxcbiAgJ2Zvcm1hdCcsXG4gICdjb25zdCdcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGFTY2hlbWEsIGtleXdvcmRzSnNvblBvaW50ZXJzKSB7XG4gIGZvciAodmFyIGk9MDsgaTxrZXl3b3Jkc0pzb25Qb2ludGVycy5sZW5ndGg7IGkrKykge1xuICAgIG1ldGFTY2hlbWEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1ldGFTY2hlbWEpKTtcbiAgICB2YXIgc2VnbWVudHMgPSBrZXl3b3Jkc0pzb25Qb2ludGVyc1tpXS5zcGxpdCgnLycpO1xuICAgIHZhciBrZXl3b3JkcyA9IG1ldGFTY2hlbWE7XG4gICAgdmFyIGo7XG4gICAgZm9yIChqPTE7IGo8c2VnbWVudHMubGVuZ3RoOyBqKyspXG4gICAgICBrZXl3b3JkcyA9IGtleXdvcmRzW3NlZ21lbnRzW2pdXTtcblxuICAgIGZvciAoaj0wOyBqPEtFWVdPUkRTLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gS0VZV09SRFNbal07XG4gICAgICB2YXIgc2NoZW1hID0ga2V5d29yZHNba2V5XTtcbiAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAga2V5d29yZHNba2V5XSA9IHtcbiAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgeyAkcmVmOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXRhU2NoZW1hO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBNaXNzaW5nUmVmRXJyb3IgPSByZXF1aXJlKCcuL2Vycm9yX2NsYXNzZXMnKS5NaXNzaW5nUmVmO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGVBc3luYztcblxuXG4vKipcbiAqIENyZWF0ZXMgdmFsaWRhdGluZyBmdW5jdGlvbiBmb3IgcGFzc2VkIHNjaGVtYSB3aXRoIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIG1pc3Npbmcgc2NoZW1hcy5cbiAqIGBsb2FkU2NoZW1hYCBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHNjaGVtYSB1cmkgYW5kIHJldHVybnMgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjaGVtYS5cbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSAgIHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0ge0Jvb2xlYW59ICBtZXRhIG9wdGlvbmFsIHRydWUgdG8gY29tcGlsZSBtZXRhLXNjaGVtYTsgdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNraXBwZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGFuIG9wdGlvbmFsIG5vZGUtc3R5bGUgY2FsbGJhY2ssIGl0IGlzIGNhbGxlZCB3aXRoIDIgcGFyYW1ldGVyczogZXJyb3IgKG9yIG51bGwpIGFuZCB2YWxpZGF0aW5nIGZ1bmN0aW9uLlxuICogQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSB2YWxpZGF0aW5nIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjb21waWxlQXN5bmMoc2NoZW1hLCBtZXRhLCBjYWxsYmFjaykge1xuICAvKiBlc2xpbnQgbm8tc2hhZG93OiAwICovXG4gIC8qIGdsb2JhbCBQcm9taXNlICovXG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodHlwZW9mIHRoaXMuX29wdHMubG9hZFNjaGVtYSAhPSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5sb2FkU2NoZW1hIHNob3VsZCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKHR5cGVvZiBtZXRhID09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG1ldGE7XG4gICAgbWV0YSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBwID0gbG9hZE1ldGFTY2hlbWFPZihzY2hlbWEpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBzY2hlbWFPYmogPSBzZWxmLl9hZGRTY2hlbWEoc2NoZW1hLCB1bmRlZmluZWQsIG1ldGEpO1xuICAgIHJldHVybiBzY2hlbWFPYmoudmFsaWRhdGUgfHwgX2NvbXBpbGVBc3luYyhzY2hlbWFPYmopO1xuICB9KTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBwLnRoZW4oXG4gICAgICBmdW5jdGlvbih2KSB7IGNhbGxiYWNrKG51bGwsIHYpOyB9LFxuICAgICAgY2FsbGJhY2tcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHA7XG5cblxuICBmdW5jdGlvbiBsb2FkTWV0YVNjaGVtYU9mKHNjaCkge1xuICAgIHZhciAkc2NoZW1hID0gc2NoLiRzY2hlbWE7XG4gICAgcmV0dXJuICRzY2hlbWEgJiYgIXNlbGYuZ2V0U2NoZW1hKCRzY2hlbWEpXG4gICAgICAgICAgICA/IGNvbXBpbGVBc3luYy5jYWxsKHNlbGYsIHsgJHJlZjogJHNjaGVtYSB9LCB0cnVlKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gX2NvbXBpbGVBc3luYyhzY2hlbWFPYmopIHtcbiAgICB0cnkgeyByZXR1cm4gc2VsZi5fY29tcGlsZShzY2hlbWFPYmopOyB9XG4gICAgY2F0Y2goZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nUmVmRXJyb3IpIHJldHVybiBsb2FkTWlzc2luZ1NjaGVtYShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBsb2FkTWlzc2luZ1NjaGVtYShlKSB7XG4gICAgICB2YXIgcmVmID0gZS5taXNzaW5nU2NoZW1hO1xuICAgICAgaWYgKGFkZGVkKHJlZikpIHRocm93IG5ldyBFcnJvcignU2NoZW1hICcgKyByZWYgKyAnIGlzIGxvYWRlZCBidXQgJyArIGUubWlzc2luZ1JlZiArICcgY2Fubm90IGJlIHJlc29sdmVkJyk7XG5cbiAgICAgIHZhciBzY2hlbWFQcm9taXNlID0gc2VsZi5fbG9hZGluZ1NjaGVtYXNbcmVmXTtcbiAgICAgIGlmICghc2NoZW1hUHJvbWlzZSkge1xuICAgICAgICBzY2hlbWFQcm9taXNlID0gc2VsZi5fbG9hZGluZ1NjaGVtYXNbcmVmXSA9IHNlbGYuX29wdHMubG9hZFNjaGVtYShyZWYpO1xuICAgICAgICBzY2hlbWFQcm9taXNlLnRoZW4ocmVtb3ZlUHJvbWlzZSwgcmVtb3ZlUHJvbWlzZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWFQcm9taXNlLnRoZW4oZnVuY3Rpb24gKHNjaCkge1xuICAgICAgICBpZiAoIWFkZGVkKHJlZikpIHtcbiAgICAgICAgICByZXR1cm4gbG9hZE1ldGFTY2hlbWFPZihzY2gpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFhZGRlZChyZWYpKSBzZWxmLmFkZFNjaGVtYShzY2gsIHJlZiwgdW5kZWZpbmVkLCBtZXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9jb21waWxlQXN5bmMoc2NoZW1hT2JqKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiByZW1vdmVQcm9taXNlKCkge1xuICAgICAgICBkZWxldGUgc2VsZi5fbG9hZGluZ1NjaGVtYXNbcmVmXTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYWRkZWQocmVmKSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9yZWZzW3JlZl0gfHwgc2VsZi5fc2NoZW1hc1tyZWZdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVfY3VzdG9tKGl0LCAka2V5d29yZCwgJHJ1bGVUeXBlKSB7XG4gIHZhciBvdXQgPSAnICc7XG4gIHZhciAkbHZsID0gaXQubGV2ZWw7XG4gIHZhciAkZGF0YUx2bCA9IGl0LmRhdGFMZXZlbDtcbiAgdmFyICRzY2hlbWEgPSBpdC5zY2hlbWFbJGtleXdvcmRdO1xuICB2YXIgJHNjaGVtYVBhdGggPSBpdC5zY2hlbWFQYXRoICsgaXQudXRpbC5nZXRQcm9wZXJ0eSgka2V5d29yZCk7XG4gIHZhciAkZXJyU2NoZW1hUGF0aCA9IGl0LmVyclNjaGVtYVBhdGggKyAnLycgKyAka2V5d29yZDtcbiAgdmFyICRicmVha09uRXJyb3IgPSAhaXQub3B0cy5hbGxFcnJvcnM7XG4gIHZhciAkZXJyb3JLZXl3b3JkO1xuICB2YXIgJGRhdGEgPSAnZGF0YScgKyAoJGRhdGFMdmwgfHwgJycpO1xuICB2YXIgJHZhbGlkID0gJ3ZhbGlkJyArICRsdmw7XG4gIHZhciAkZXJycyA9ICdlcnJzX18nICsgJGx2bDtcbiAgdmFyICRpc0RhdGEgPSBpdC5vcHRzLiRkYXRhICYmICRzY2hlbWEgJiYgJHNjaGVtYS4kZGF0YSxcbiAgICAkc2NoZW1hVmFsdWU7XG4gIGlmICgkaXNEYXRhKSB7XG4gICAgb3V0ICs9ICcgdmFyIHNjaGVtYScgKyAoJGx2bCkgKyAnID0gJyArIChpdC51dGlsLmdldERhdGEoJHNjaGVtYS4kZGF0YSwgJGRhdGFMdmwsIGl0LmRhdGFQYXRoQXJyKSkgKyAnOyAnO1xuICAgICRzY2hlbWFWYWx1ZSA9ICdzY2hlbWEnICsgJGx2bDtcbiAgfSBlbHNlIHtcbiAgICAkc2NoZW1hVmFsdWUgPSAkc2NoZW1hO1xuICB9XG4gIHZhciAkcnVsZSA9IHRoaXMsXG4gICAgJGRlZmluaXRpb24gPSAnZGVmaW5pdGlvbicgKyAkbHZsLFxuICAgICRyRGVmID0gJHJ1bGUuZGVmaW5pdGlvbixcbiAgICAkY2xvc2luZ0JyYWNlcyA9ICcnO1xuICB2YXIgJGNvbXBpbGUsICRpbmxpbmUsICRtYWNybywgJHJ1bGVWYWxpZGF0ZSwgJHZhbGlkYXRlQ29kZTtcbiAgaWYgKCRpc0RhdGEgJiYgJHJEZWYuJGRhdGEpIHtcbiAgICAkdmFsaWRhdGVDb2RlID0gJ2tleXdvcmRWYWxpZGF0ZScgKyAkbHZsO1xuICAgIHZhciAkdmFsaWRhdGVTY2hlbWEgPSAkckRlZi52YWxpZGF0ZVNjaGVtYTtcbiAgICBvdXQgKz0gJyB2YXIgJyArICgkZGVmaW5pdGlvbikgKyAnID0gUlVMRVMuY3VzdG9tW1xcJycgKyAoJGtleXdvcmQpICsgJ1xcJ10uZGVmaW5pdGlvbjsgdmFyICcgKyAoJHZhbGlkYXRlQ29kZSkgKyAnID0gJyArICgkZGVmaW5pdGlvbikgKyAnLnZhbGlkYXRlOyc7XG4gIH0gZWxzZSB7XG4gICAgJHJ1bGVWYWxpZGF0ZSA9IGl0LnVzZUN1c3RvbVJ1bGUoJHJ1bGUsICRzY2hlbWEsIGl0LnNjaGVtYSwgaXQpO1xuICAgIGlmICghJHJ1bGVWYWxpZGF0ZSkgcmV0dXJuO1xuICAgICRzY2hlbWFWYWx1ZSA9ICd2YWxpZGF0ZS5zY2hlbWEnICsgJHNjaGVtYVBhdGg7XG4gICAgJHZhbGlkYXRlQ29kZSA9ICRydWxlVmFsaWRhdGUuY29kZTtcbiAgICAkY29tcGlsZSA9ICRyRGVmLmNvbXBpbGU7XG4gICAgJGlubGluZSA9ICRyRGVmLmlubGluZTtcbiAgICAkbWFjcm8gPSAkckRlZi5tYWNybztcbiAgfVxuICB2YXIgJHJ1bGVFcnJzID0gJHZhbGlkYXRlQ29kZSArICcuZXJyb3JzJyxcbiAgICAkaSA9ICdpJyArICRsdmwsXG4gICAgJHJ1bGVFcnIgPSAncnVsZUVycicgKyAkbHZsLFxuICAgICRhc3luY0tleXdvcmQgPSAkckRlZi5hc3luYztcbiAgaWYgKCRhc3luY0tleXdvcmQgJiYgIWl0LmFzeW5jKSB0aHJvdyBuZXcgRXJyb3IoJ2FzeW5jIGtleXdvcmQgaW4gc3luYyBzY2hlbWEnKTtcbiAgaWYgKCEoJGlubGluZSB8fCAkbWFjcm8pKSB7XG4gICAgb3V0ICs9ICcnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsnO1xuICB9XG4gIG91dCArPSAndmFyICcgKyAoJGVycnMpICsgJyA9IGVycm9yczt2YXIgJyArICgkdmFsaWQpICsgJzsnO1xuICBpZiAoJGlzRGF0YSAmJiAkckRlZi4kZGF0YSkge1xuICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICBvdXQgKz0gJyBpZiAoJyArICgkc2NoZW1hVmFsdWUpICsgJyA9PT0gdW5kZWZpbmVkKSB7ICcgKyAoJHZhbGlkKSArICcgPSB0cnVlOyB9IGVsc2UgeyAnO1xuICAgIGlmICgkdmFsaWRhdGVTY2hlbWEpIHtcbiAgICAgICRjbG9zaW5nQnJhY2VzICs9ICd9JztcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRkZWZpbml0aW9uKSArICcudmFsaWRhdGVTY2hlbWEoJyArICgkc2NoZW1hVmFsdWUpICsgJyk7IGlmICgnICsgKCR2YWxpZCkgKyAnKSB7ICc7XG4gICAgfVxuICB9XG4gIGlmICgkaW5saW5lKSB7XG4gICAgaWYgKCRyRGVmLnN0YXRlbWVudHMpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVWYWxpZGF0ZS52YWxpZGF0ZSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnICsgKCRydWxlVmFsaWRhdGUudmFsaWRhdGUpICsgJzsgJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoJG1hY3JvKSB7XG4gICAgdmFyICRpdCA9IGl0LnV0aWwuY29weShpdCk7XG4gICAgdmFyICRjbG9zaW5nQnJhY2VzID0gJyc7XG4gICAgJGl0LmxldmVsKys7XG4gICAgdmFyICRuZXh0VmFsaWQgPSAndmFsaWQnICsgJGl0LmxldmVsO1xuICAgICRpdC5zY2hlbWEgPSAkcnVsZVZhbGlkYXRlLnZhbGlkYXRlO1xuICAgICRpdC5zY2hlbWFQYXRoID0gJyc7XG4gICAgdmFyICR3YXNDb21wb3NpdGUgPSBpdC5jb21wb3NpdGVSdWxlO1xuICAgIGl0LmNvbXBvc2l0ZVJ1bGUgPSAkaXQuY29tcG9zaXRlUnVsZSA9IHRydWU7XG4gICAgdmFyICRjb2RlID0gaXQudmFsaWRhdGUoJGl0KS5yZXBsYWNlKC92YWxpZGF0ZVxcLnNjaGVtYS9nLCAkdmFsaWRhdGVDb2RlKTtcbiAgICBpdC5jb21wb3NpdGVSdWxlID0gJGl0LmNvbXBvc2l0ZVJ1bGUgPSAkd2FzQ29tcG9zaXRlO1xuICAgIG91dCArPSAnICcgKyAoJGNvZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciAkJG91dFN0YWNrID0gJCRvdXRTdGFjayB8fCBbXTtcbiAgICAkJG91dFN0YWNrLnB1c2gob3V0KTtcbiAgICBvdXQgPSAnJztcbiAgICBvdXQgKz0gJyAgJyArICgkdmFsaWRhdGVDb2RlKSArICcuY2FsbCggJztcbiAgICBpZiAoaXQub3B0cy5wYXNzQ29udGV4dCkge1xuICAgICAgb3V0ICs9ICd0aGlzJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9ICdzZWxmJztcbiAgICB9XG4gICAgaWYgKCRjb21waWxlIHx8ICRyRGVmLnNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICwgJyArICgkZGF0YSkgKyAnICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICwgJyArICgkc2NoZW1hVmFsdWUpICsgJyAsICcgKyAoJGRhdGEpICsgJyAsIHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICc7XG4gICAgfVxuICAgIG91dCArPSAnICwgKGRhdGFQYXRoIHx8IFxcJ1xcJyknO1xuICAgIGlmIChpdC5lcnJvclBhdGggIT0gJ1wiXCInKSB7XG4gICAgICBvdXQgKz0gJyArICcgKyAoaXQuZXJyb3JQYXRoKTtcbiAgICB9XG4gICAgdmFyICRwYXJlbnREYXRhID0gJGRhdGFMdmwgPyAnZGF0YScgKyAoKCRkYXRhTHZsIC0gMSkgfHwgJycpIDogJ3BhcmVudERhdGEnLFxuICAgICAgJHBhcmVudERhdGFQcm9wZXJ0eSA9ICRkYXRhTHZsID8gaXQuZGF0YVBhdGhBcnJbJGRhdGFMdmxdIDogJ3BhcmVudERhdGFQcm9wZXJ0eSc7XG4gICAgb3V0ICs9ICcgLCAnICsgKCRwYXJlbnREYXRhKSArICcgLCAnICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJyAsIHJvb3REYXRhICkgICc7XG4gICAgdmFyIGRlZl9jYWxsUnVsZVZhbGlkYXRlID0gb3V0O1xuICAgIG91dCA9ICQkb3V0U3RhY2sucG9wKCk7XG4gICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgIG91dCArPSAnICcgKyAoJHZhbGlkKSArICcgPSAnO1xuICAgICAgaWYgKCRhc3luY0tleXdvcmQpIHtcbiAgICAgICAgb3V0ICs9ICdhd2FpdCAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICcnICsgKGRlZl9jYWxsUnVsZVZhbGlkYXRlKSArICc7ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgkYXN5bmNLZXl3b3JkKSB7XG4gICAgICAgICRydWxlRXJycyA9ICdjdXN0b21FcnJvcnMnICsgJGx2bDtcbiAgICAgICAgb3V0ICs9ICcgdmFyICcgKyAoJHJ1bGVFcnJzKSArICcgPSBudWxsOyB0cnkgeyAnICsgKCR2YWxpZCkgKyAnID0gYXdhaXQgJyArIChkZWZfY2FsbFJ1bGVWYWxpZGF0ZSkgKyAnOyB9IGNhdGNoIChlKSB7ICcgKyAoJHZhbGlkKSArICcgPSBmYWxzZTsgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpICcgKyAoJHJ1bGVFcnJzKSArICcgPSBlLmVycm9yczsgZWxzZSB0aHJvdyBlOyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJycykgKyAnID0gbnVsbDsgJyArICgkdmFsaWQpICsgJyA9ICcgKyAoZGVmX2NhbGxSdWxlVmFsaWRhdGUpICsgJzsgJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCRyRGVmLm1vZGlmeWluZykge1xuICAgIG91dCArPSAnIGlmICgnICsgKCRwYXJlbnREYXRhKSArICcpICcgKyAoJGRhdGEpICsgJyA9ICcgKyAoJHBhcmVudERhdGEpICsgJ1snICsgKCRwYXJlbnREYXRhUHJvcGVydHkpICsgJ107JztcbiAgfVxuICBvdXQgKz0gJycgKyAoJGNsb3NpbmdCcmFjZXMpO1xuICBpZiAoJHJEZWYudmFsaWQpIHtcbiAgICBpZiAoJGJyZWFrT25FcnJvcikge1xuICAgICAgb3V0ICs9ICcgaWYgKHRydWUpIHsgJztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0ICs9ICcgaWYgKCAnO1xuICAgIGlmICgkckRlZi52YWxpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvdXQgKz0gJyAhJztcbiAgICAgIGlmICgkbWFjcm8pIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCRuZXh0VmFsaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0ICs9ICcnICsgKCR2YWxpZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnICcgKyAoISRyRGVmLnZhbGlkKSArICcgJztcbiAgICB9XG4gICAgb3V0ICs9ICcpIHsgJztcbiAgICAkZXJyb3JLZXl3b3JkID0gJHJ1bGUua2V5d29yZDtcbiAgICB2YXIgJCRvdXRTdGFjayA9ICQkb3V0U3RhY2sgfHwgW107XG4gICAgJCRvdXRTdGFjay5wdXNoKG91dCk7XG4gICAgb3V0ID0gJyc7XG4gICAgdmFyICQkb3V0U3RhY2sgPSAkJG91dFN0YWNrIHx8IFtdO1xuICAgICQkb3V0U3RhY2sucHVzaChvdXQpO1xuICAgIG91dCA9ICcnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpdC5jcmVhdGVFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBvdXQgKz0gJyB7IGtleXdvcmQ6IFxcJycgKyAoJGVycm9yS2V5d29yZCB8fCAnY3VzdG9tJykgKyAnXFwnICwgZGF0YVBhdGg6IChkYXRhUGF0aCB8fCBcXCdcXCcpICsgJyArIChpdC5lcnJvclBhdGgpICsgJyAsIHNjaGVtYVBhdGg6ICcgKyAoaXQudXRpbC50b1F1b3RlZFN0cmluZygkZXJyU2NoZW1hUGF0aCkpICsgJyAsIHBhcmFtczogeyBrZXl3b3JkOiBcXCcnICsgKCRydWxlLmtleXdvcmQpICsgJ1xcJyB9ICc7XG4gICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgLCBtZXNzYWdlOiBcXCdzaG91bGQgcGFzcyBcIicgKyAoJHJ1bGUua2V5d29yZCkgKyAnXCIga2V5d29yZCB2YWxpZGF0aW9uXFwnICc7XG4gICAgICB9XG4gICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgIG91dCArPSAnICwgc2NoZW1hOiB2YWxpZGF0ZS5zY2hlbWEnICsgKCRzY2hlbWFQYXRoKSArICcgLCBwYXJlbnRTY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoaXQuc2NoZW1hUGF0aCkgKyAnICwgZGF0YTogJyArICgkZGF0YSkgKyAnICc7XG4gICAgICB9XG4gICAgICBvdXQgKz0gJyB9ICc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHt9ICc7XG4gICAgfVxuICAgIHZhciBfX2VyciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChpdC5hc3luYykge1xuICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFsnICsgKF9fZXJyKSArICddKTsgJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IFsnICsgKF9fZXJyKSArICddOyByZXR1cm4gZmFsc2U7ICc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSAnIHZhciBlcnIgPSAnICsgKF9fZXJyKSArICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICB9XG4gICAgdmFyIGRlZl9jdXN0b21FcnJvciA9IG91dDtcbiAgICBvdXQgPSAkJG91dFN0YWNrLnBvcCgpO1xuICAgIGlmICgkaW5saW5lKSB7XG4gICAgICBpZiAoJHJEZWYuZXJyb3JzKSB7XG4gICAgICAgIGlmICgkckRlZi5lcnJvcnMgIT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgb3V0ICs9ICcgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyBpZiAoJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPT09IHVuZGVmaW5lZCkgeyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9IFwiJyArICgkZXJyU2NoZW1hUGF0aCkgKyAnXCI7IH0gJztcbiAgICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyAnICsgKCRydWxlRXJyKSArICcuc2NoZW1hID0gJyArICgkc2NoZW1hVmFsdWUpICsgJzsgJyArICgkcnVsZUVycikgKyAnLmRhdGEgPSAnICsgKCRkYXRhKSArICc7ICc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dCArPSAnIH0gJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCRyRGVmLmVycm9ycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ICs9ICcgaWYgKCcgKyAoJGVycnMpICsgJyA9PSBlcnJvcnMpIHsgJyArIChkZWZfY3VzdG9tRXJyb3IpICsgJyB9IGVsc2UgeyAgZm9yICh2YXIgJyArICgkaSkgKyAnPScgKyAoJGVycnMpICsgJzsgJyArICgkaSkgKyAnPGVycm9yczsgJyArICgkaSkgKyAnKyspIHsgdmFyICcgKyAoJHJ1bGVFcnIpICsgJyA9IHZFcnJvcnNbJyArICgkaSkgKyAnXTsgaWYgKCcgKyAoJHJ1bGVFcnIpICsgJy5kYXRhUGF0aCA9PT0gdW5kZWZpbmVkKSAnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPSAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICc7IGlmICgnICsgKCRydWxlRXJyKSArICcuc2NoZW1hUGF0aCA9PT0gdW5kZWZpbmVkKSB7ICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWFQYXRoID0gXCInICsgKCRlcnJTY2hlbWFQYXRoKSArICdcIjsgfSAnO1xuICAgICAgICAgIGlmIChpdC5vcHRzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWEgPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnOyAnICsgKCRydWxlRXJyKSArICcuZGF0YSA9ICcgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0ICs9ICcgfSB9ICc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCRtYWNybykge1xuICAgICAgb3V0ICs9ICcgICB2YXIgZXJyID0gICAnOyAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGl0LmNyZWF0ZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgb3V0ICs9ICcgeyBrZXl3b3JkOiBcXCcnICsgKCRlcnJvcktleXdvcmQgfHwgJ2N1c3RvbScpICsgJ1xcJyAsIGRhdGFQYXRoOiAoZGF0YVBhdGggfHwgXFwnXFwnKSArICcgKyAoaXQuZXJyb3JQYXRoKSArICcgLCBzY2hlbWFQYXRoOiAnICsgKGl0LnV0aWwudG9RdW90ZWRTdHJpbmcoJGVyclNjaGVtYVBhdGgpKSArICcgLCBwYXJhbXM6IHsga2V5d29yZDogXFwnJyArICgkcnVsZS5rZXl3b3JkKSArICdcXCcgfSAnO1xuICAgICAgICBpZiAoaXQub3B0cy5tZXNzYWdlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBvdXQgKz0gJyAsIG1lc3NhZ2U6IFxcJ3Nob3VsZCBwYXNzIFwiJyArICgkcnVsZS5rZXl3b3JkKSArICdcIiBrZXl3b3JkIHZhbGlkYXRpb25cXCcgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXQub3B0cy52ZXJib3NlKSB7XG4gICAgICAgICAgb3V0ICs9ICcgLCBzY2hlbWE6IHZhbGlkYXRlLnNjaGVtYScgKyAoJHNjaGVtYVBhdGgpICsgJyAsIHBhcmVudFNjaGVtYTogdmFsaWRhdGUuc2NoZW1hJyArIChpdC5zY2hlbWFQYXRoKSArICcgLCBkYXRhOiAnICsgKCRkYXRhKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9ICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyB7fSAnO1xuICAgICAgfVxuICAgICAgb3V0ICs9ICc7ICBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9IFtlcnJdOyBlbHNlIHZFcnJvcnMucHVzaChlcnIpOyBlcnJvcnMrKzsgJztcbiAgICAgIGlmICghaXQuY29tcG9zaXRlUnVsZSAmJiAkYnJlYWtPbkVycm9yKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoaXQuYXN5bmMpIHtcbiAgICAgICAgICBvdXQgKz0gJyB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKHZFcnJvcnMpOyAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCArPSAnIHZhbGlkYXRlLmVycm9ycyA9IHZFcnJvcnM7IHJldHVybiBmYWxzZTsgJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoJHJEZWYuZXJyb3JzID09PSBmYWxzZSkge1xuICAgICAgICBvdXQgKz0gJyAnICsgKGRlZl9jdXN0b21FcnJvcikgKyAnICc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQgKz0gJyBpZiAoQXJyYXkuaXNBcnJheSgnICsgKCRydWxlRXJycykgKyAnKSkgeyBpZiAodkVycm9ycyA9PT0gbnVsbCkgdkVycm9ycyA9ICcgKyAoJHJ1bGVFcnJzKSArICc7IGVsc2UgdkVycm9ycyA9IHZFcnJvcnMuY29uY2F0KCcgKyAoJHJ1bGVFcnJzKSArICcpOyBlcnJvcnMgPSB2RXJyb3JzLmxlbmd0aDsgIGZvciAodmFyICcgKyAoJGkpICsgJz0nICsgKCRlcnJzKSArICc7ICcgKyAoJGkpICsgJzxlcnJvcnM7ICcgKyAoJGkpICsgJysrKSB7IHZhciAnICsgKCRydWxlRXJyKSArICcgPSB2RXJyb3JzWycgKyAoJGkpICsgJ107IGlmICgnICsgKCRydWxlRXJyKSArICcuZGF0YVBhdGggPT09IHVuZGVmaW5lZCkgJyArICgkcnVsZUVycikgKyAnLmRhdGFQYXRoID0gKGRhdGFQYXRoIHx8IFxcJ1xcJykgKyAnICsgKGl0LmVycm9yUGF0aCkgKyAnOyAgJyArICgkcnVsZUVycikgKyAnLnNjaGVtYVBhdGggPSBcIicgKyAoJGVyclNjaGVtYVBhdGgpICsgJ1wiOyAgJztcbiAgICAgICAgaWYgKGl0Lm9wdHMudmVyYm9zZSkge1xuICAgICAgICAgIG91dCArPSAnICcgKyAoJHJ1bGVFcnIpICsgJy5zY2hlbWEgPSAnICsgKCRzY2hlbWFWYWx1ZSkgKyAnOyAnICsgKCRydWxlRXJyKSArICcuZGF0YSA9ICcgKyAoJGRhdGEpICsgJzsgJztcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyB9IH0gZWxzZSB7ICcgKyAoZGVmX2N1c3RvbUVycm9yKSArICcgfSAnO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXQgKz0gJyB9ICc7XG4gICAgaWYgKCRicmVha09uRXJyb3IpIHtcbiAgICAgIG91dCArPSAnIGVsc2UgeyAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIG1ldGFTY2hlbWEgPSByZXF1aXJlKCcuL3JlZnMvanNvbi1zY2hlbWEtZHJhZnQtMDcuanNvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgJGlkOiAnaHR0cHM6Ly9naXRodWIuY29tL2Fqdi12YWxpZGF0b3IvYWp2L2Jsb2IvbWFzdGVyL2xpYi9kZWZpbml0aW9uX3NjaGVtYS5qcycsXG4gIGRlZmluaXRpb25zOiB7XG4gICAgc2ltcGxlVHlwZXM6IG1ldGFTY2hlbWEuZGVmaW5pdGlvbnMuc2ltcGxlVHlwZXNcbiAgfSxcbiAgdHlwZTogJ29iamVjdCcsXG4gIGRlcGVuZGVuY2llczoge1xuICAgIHNjaGVtYTogWyd2YWxpZGF0ZSddLFxuICAgICRkYXRhOiBbJ3ZhbGlkYXRlJ10sXG4gICAgc3RhdGVtZW50czogWydpbmxpbmUnXSxcbiAgICB2YWxpZDoge25vdDoge3JlcXVpcmVkOiBbJ21hY3JvJ119fVxuICB9LFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgdHlwZTogbWV0YVNjaGVtYS5wcm9wZXJ0aWVzLnR5cGUsXG4gICAgc2NoZW1hOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBzdGF0ZW1lbnRzOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBpdGVtczoge3R5cGU6ICdzdHJpbmcnfVxuICAgIH0sXG4gICAgbWV0YVNjaGVtYToge3R5cGU6ICdvYmplY3QnfSxcbiAgICBtb2RpZnlpbmc6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIHZhbGlkOiB7dHlwZTogJ2Jvb2xlYW4nfSxcbiAgICAkZGF0YToge3R5cGU6ICdib29sZWFuJ30sXG4gICAgYXN5bmM6IHt0eXBlOiAnYm9vbGVhbid9LFxuICAgIGVycm9yczoge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge3R5cGU6ICdib29sZWFuJ30sXG4gICAgICAgIHtjb25zdDogJ2Z1bGwnfVxuICAgICAgXVxuICAgIH1cbiAgfVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBJREVOVElGSUVSID0gL15bYS16XyRdW2EtejAtOV8kLV0qJC9pO1xudmFyIGN1c3RvbVJ1bGVDb2RlID0gcmVxdWlyZSgnLi9kb3Rqcy9jdXN0b20nKTtcbnZhciBkZWZpbml0aW9uU2NoZW1hID0gcmVxdWlyZSgnLi9kZWZpbml0aW9uX3NjaGVtYScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkOiBhZGRLZXl3b3JkLFxuICBnZXQ6IGdldEtleXdvcmQsXG4gIHJlbW92ZTogcmVtb3ZlS2V5d29yZCxcbiAgdmFsaWRhdGU6IHZhbGlkYXRlS2V5d29yZFxufTtcblxuXG4vKipcbiAqIERlZmluZSBjdXN0b20ga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgY3VzdG9tIGtleXdvcmQsIHNob3VsZCBiZSB1bmlxdWUgKGluY2x1ZGluZyBkaWZmZXJlbnQgZnJvbSBhbGwgc3RhbmRhcmQsIGN1c3RvbSBhbmQgbWFjcm8ga2V5d29yZHMpLlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmluaXRpb24ga2V5d29yZCBkZWZpbml0aW9uIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHR5cGVgICh0eXBlKHMpIHdoaWNoIHRoZSBrZXl3b3JkIGFwcGxpZXMgdG8pLCBgdmFsaWRhdGVgIG9yIGBjb21waWxlYC5cbiAqIEByZXR1cm4ge0Fqdn0gdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gKi9cbmZ1bmN0aW9uIGFkZEtleXdvcmQoa2V5d29yZCwgZGVmaW5pdGlvbikge1xuICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gIC8qIGVzbGludCBuby1zaGFkb3c6IDAgKi9cbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcbiAgaWYgKFJVTEVTLmtleXdvcmRzW2tleXdvcmRdKVxuICAgIHRocm93IG5ldyBFcnJvcignS2V5d29yZCAnICsga2V5d29yZCArICcgaXMgYWxyZWFkeSBkZWZpbmVkJyk7XG5cbiAgaWYgKCFJREVOVElGSUVSLnRlc3Qoa2V5d29yZCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdLZXl3b3JkICcgKyBrZXl3b3JkICsgJyBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyJyk7XG5cbiAgaWYgKGRlZmluaXRpb24pIHtcbiAgICB0aGlzLnZhbGlkYXRlS2V5d29yZChkZWZpbml0aW9uLCB0cnVlKTtcblxuICAgIHZhciBkYXRhVHlwZSA9IGRlZmluaXRpb24udHlwZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhVHlwZSkpIHtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhVHlwZS5sZW5ndGg7IGkrKylcbiAgICAgICAgX2FkZFJ1bGUoa2V5d29yZCwgZGF0YVR5cGVbaV0sIGRlZmluaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZSwgZGVmaW5pdGlvbik7XG4gICAgfVxuXG4gICAgdmFyIG1ldGFTY2hlbWEgPSBkZWZpbml0aW9uLm1ldGFTY2hlbWE7XG4gICAgaWYgKG1ldGFTY2hlbWEpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLiRkYXRhICYmIHRoaXMuX29wdHMuJGRhdGEpIHtcbiAgICAgICAgbWV0YVNjaGVtYSA9IHtcbiAgICAgICAgICBhbnlPZjogW1xuICAgICAgICAgICAgbWV0YVNjaGVtYSxcbiAgICAgICAgICAgIHsgJyRyZWYnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgZGVmaW5pdGlvbi52YWxpZGF0ZVNjaGVtYSA9IHRoaXMuY29tcGlsZShtZXRhU2NoZW1hLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBSVUxFUy5rZXl3b3Jkc1trZXl3b3JkXSA9IFJVTEVTLmFsbFtrZXl3b3JkXSA9IHRydWU7XG5cblxuICBmdW5jdGlvbiBfYWRkUnVsZShrZXl3b3JkLCBkYXRhVHlwZSwgZGVmaW5pdGlvbikge1xuICAgIHZhciBydWxlR3JvdXA7XG4gICAgZm9yICh2YXIgaT0wOyBpPFJVTEVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmcgPSBSVUxFU1tpXTtcbiAgICAgIGlmIChyZy50eXBlID09IGRhdGFUeXBlKSB7XG4gICAgICAgIHJ1bGVHcm91cCA9IHJnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJ1bGVHcm91cCkge1xuICAgICAgcnVsZUdyb3VwID0geyB0eXBlOiBkYXRhVHlwZSwgcnVsZXM6IFtdIH07XG4gICAgICBSVUxFUy5wdXNoKHJ1bGVHcm91cCk7XG4gICAgfVxuXG4gICAgdmFyIHJ1bGUgPSB7XG4gICAgICBrZXl3b3JkOiBrZXl3b3JkLFxuICAgICAgZGVmaW5pdGlvbjogZGVmaW5pdGlvbixcbiAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgIGNvZGU6IGN1c3RvbVJ1bGVDb2RlLFxuICAgICAgaW1wbGVtZW50czogZGVmaW5pdGlvbi5pbXBsZW1lbnRzXG4gICAgfTtcbiAgICBydWxlR3JvdXAucnVsZXMucHVzaChydWxlKTtcbiAgICBSVUxFUy5jdXN0b21ba2V5d29yZF0gPSBydWxlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBHZXQga2V5d29yZFxuICogQHRoaXMgIEFqdlxuICogQHBhcmFtIHtTdHJpbmd9IGtleXdvcmQgcHJlLWRlZmluZWQgb3IgY3VzdG9tIGtleXdvcmQuXG4gKiBAcmV0dXJuIHtPYmplY3R8Qm9vbGVhbn0gY3VzdG9tIGtleXdvcmQgZGVmaW5pdGlvbiwgYHRydWVgIGlmIGl0IGlzIGEgcHJlZGVmaW5lZCBrZXl3b3JkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZnVuY3Rpb24gZ2V0S2V5d29yZChrZXl3b3JkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIHJ1bGUgPSB0aGlzLlJVTEVTLmN1c3RvbVtrZXl3b3JkXTtcbiAgcmV0dXJuIHJ1bGUgPyBydWxlLmRlZmluaXRpb24gOiB0aGlzLlJVTEVTLmtleXdvcmRzW2tleXdvcmRdIHx8IGZhbHNlO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlIGtleXdvcmRcbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXl3b3JkIHByZS1kZWZpbmVkIG9yIGN1c3RvbSBrZXl3b3JkLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlS2V5d29yZChrZXl3b3JkKSB7XG4gIC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cbiAgdmFyIFJVTEVTID0gdGhpcy5SVUxFUztcbiAgZGVsZXRlIFJVTEVTLmtleXdvcmRzW2tleXdvcmRdO1xuICBkZWxldGUgUlVMRVMuYWxsW2tleXdvcmRdO1xuICBkZWxldGUgUlVMRVMuY3VzdG9tW2tleXdvcmRdO1xuICBmb3IgKHZhciBpPTA7IGk8UlVMRVMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcnVsZXMgPSBSVUxFU1tpXS5ydWxlcztcbiAgICBmb3IgKHZhciBqPTA7IGo8cnVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChydWxlc1tqXS5rZXl3b3JkID09IGtleXdvcmQpIHtcbiAgICAgICAgcnVsZXMuc3BsaWNlKGosIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBWYWxpZGF0ZSBrZXl3b3JkIGRlZmluaXRpb25cbiAqIEB0aGlzICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZpbml0aW9uIGtleXdvcmQgZGVmaW5pdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93RXJyb3IgdHJ1ZSB0byB0aHJvdyBleGNlcHRpb24gaWYgZGVmaW5pdGlvbiBpcyBpbnZhbGlkXG4gKiBAcmV0dXJuIHtib29sZWFufSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUtleXdvcmQoZGVmaW5pdGlvbiwgdGhyb3dFcnJvcikge1xuICB2YWxpZGF0ZUtleXdvcmQuZXJyb3JzID0gbnVsbDtcbiAgdmFyIHYgPSB0aGlzLl92YWxpZGF0ZUtleXdvcmQgPSB0aGlzLl92YWxpZGF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aGlzLmNvbXBpbGUoZGVmaW5pdGlvblNjaGVtYSwgdHJ1ZSk7XG5cbiAgaWYgKHYoZGVmaW5pdGlvbikpIHJldHVybiB0cnVlO1xuICB2YWxpZGF0ZUtleXdvcmQuZXJyb3JzID0gdi5lcnJvcnM7XG4gIGlmICh0aHJvd0Vycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tIGtleXdvcmQgZGVmaW5pdGlvbiBpcyBpbnZhbGlkOiAnICArIHRoaXMuZXJyb3JzVGV4dCh2LmVycm9ycykpO1xuICBlbHNlXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbXBpbGVTY2hlbWEgPSByZXF1aXJlKCcuL2NvbXBpbGUnKVxuICAsIHJlc29sdmUgPSByZXF1aXJlKCcuL2NvbXBpbGUvcmVzb2x2ZScpXG4gICwgQ2FjaGUgPSByZXF1aXJlKCcuL2NhY2hlJylcbiAgLCBTY2hlbWFPYmplY3QgPSByZXF1aXJlKCcuL2NvbXBpbGUvc2NoZW1hX29iaicpXG4gICwgc3RhYmxlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnknKVxuICAsIGZvcm1hdHMgPSByZXF1aXJlKCcuL2NvbXBpbGUvZm9ybWF0cycpXG4gICwgcnVsZXMgPSByZXF1aXJlKCcuL2NvbXBpbGUvcnVsZXMnKVxuICAsICRkYXRhTWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vZGF0YScpXG4gICwgdXRpbCA9IHJlcXVpcmUoJy4vY29tcGlsZS91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gQWp2O1xuXG5BanYucHJvdG90eXBlLnZhbGlkYXRlID0gdmFsaWRhdGU7XG5BanYucHJvdG90eXBlLmNvbXBpbGUgPSBjb21waWxlO1xuQWp2LnByb3RvdHlwZS5hZGRTY2hlbWEgPSBhZGRTY2hlbWE7XG5BanYucHJvdG90eXBlLmFkZE1ldGFTY2hlbWEgPSBhZGRNZXRhU2NoZW1hO1xuQWp2LnByb3RvdHlwZS52YWxpZGF0ZVNjaGVtYSA9IHZhbGlkYXRlU2NoZW1hO1xuQWp2LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBnZXRTY2hlbWE7XG5BanYucHJvdG90eXBlLnJlbW92ZVNjaGVtYSA9IHJlbW92ZVNjaGVtYTtcbkFqdi5wcm90b3R5cGUuYWRkRm9ybWF0ID0gYWRkRm9ybWF0O1xuQWp2LnByb3RvdHlwZS5lcnJvcnNUZXh0ID0gZXJyb3JzVGV4dDtcblxuQWp2LnByb3RvdHlwZS5fYWRkU2NoZW1hID0gX2FkZFNjaGVtYTtcbkFqdi5wcm90b3R5cGUuX2NvbXBpbGUgPSBfY29tcGlsZTtcblxuQWp2LnByb3RvdHlwZS5jb21waWxlQXN5bmMgPSByZXF1aXJlKCcuL2NvbXBpbGUvYXN5bmMnKTtcbnZhciBjdXN0b21LZXl3b3JkID0gcmVxdWlyZSgnLi9rZXl3b3JkJyk7XG5BanYucHJvdG90eXBlLmFkZEtleXdvcmQgPSBjdXN0b21LZXl3b3JkLmFkZDtcbkFqdi5wcm90b3R5cGUuZ2V0S2V5d29yZCA9IGN1c3RvbUtleXdvcmQuZ2V0O1xuQWp2LnByb3RvdHlwZS5yZW1vdmVLZXl3b3JkID0gY3VzdG9tS2V5d29yZC5yZW1vdmU7XG5BanYucHJvdG90eXBlLnZhbGlkYXRlS2V5d29yZCA9IGN1c3RvbUtleXdvcmQudmFsaWRhdGU7XG5cbnZhciBlcnJvckNsYXNzZXMgPSByZXF1aXJlKCcuL2NvbXBpbGUvZXJyb3JfY2xhc3NlcycpO1xuQWp2LlZhbGlkYXRpb25FcnJvciA9IGVycm9yQ2xhc3Nlcy5WYWxpZGF0aW9uO1xuQWp2Lk1pc3NpbmdSZWZFcnJvciA9IGVycm9yQ2xhc3Nlcy5NaXNzaW5nUmVmO1xuQWp2LiRkYXRhTWV0YVNjaGVtYSA9ICRkYXRhTWV0YVNjaGVtYTtcblxudmFyIE1FVEFfU0NIRU1BX0lEID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hJztcblxudmFyIE1FVEFfSUdOT1JFX09QVElPTlMgPSBbICdyZW1vdmVBZGRpdGlvbmFsJywgJ3VzZURlZmF1bHRzJywgJ2NvZXJjZVR5cGVzJywgJ3N0cmljdERlZmF1bHRzJyBdO1xudmFyIE1FVEFfU1VQUE9SVF9EQVRBID0gWycvcHJvcGVydGllcyddO1xuXG4vKipcbiAqIENyZWF0ZXMgdmFsaWRhdG9yIGluc3RhbmNlLlxuICogVXNhZ2U6IGBBanYob3B0cylgXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBvcHRpb25hbCBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IGFqdiBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBanYob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQWp2KSkgcmV0dXJuIG5ldyBBanYob3B0cyk7XG4gIG9wdHMgPSB0aGlzLl9vcHRzID0gdXRpbC5jb3B5KG9wdHMpIHx8IHt9O1xuICBzZXRMb2dnZXIodGhpcyk7XG4gIHRoaXMuX3NjaGVtYXMgPSB7fTtcbiAgdGhpcy5fcmVmcyA9IHt9O1xuICB0aGlzLl9mcmFnbWVudHMgPSB7fTtcbiAgdGhpcy5fZm9ybWF0cyA9IGZvcm1hdHMob3B0cy5mb3JtYXQpO1xuXG4gIHRoaXMuX2NhY2hlID0gb3B0cy5jYWNoZSB8fCBuZXcgQ2FjaGU7XG4gIHRoaXMuX2xvYWRpbmdTY2hlbWFzID0ge307XG4gIHRoaXMuX2NvbXBpbGF0aW9ucyA9IFtdO1xuICB0aGlzLlJVTEVTID0gcnVsZXMoKTtcbiAgdGhpcy5fZ2V0SWQgPSBjaG9vc2VHZXRJZChvcHRzKTtcblxuICBvcHRzLmxvb3BSZXF1aXJlZCA9IG9wdHMubG9vcFJlcXVpcmVkIHx8IEluZmluaXR5O1xuICBpZiAob3B0cy5lcnJvckRhdGFQYXRoID09ICdwcm9wZXJ0eScpIG9wdHMuX2Vycm9yRGF0YVBhdGhQcm9wZXJ0eSA9IHRydWU7XG4gIGlmIChvcHRzLnNlcmlhbGl6ZSA9PT0gdW5kZWZpbmVkKSBvcHRzLnNlcmlhbGl6ZSA9IHN0YWJsZVN0cmluZ2lmeTtcbiAgdGhpcy5fbWV0YU9wdHMgPSBnZXRNZXRhU2NoZW1hT3B0aW9ucyh0aGlzKTtcblxuICBpZiAob3B0cy5mb3JtYXRzKSBhZGRJbml0aWFsRm9ybWF0cyh0aGlzKTtcbiAgaWYgKG9wdHMua2V5d29yZHMpIGFkZEluaXRpYWxLZXl3b3Jkcyh0aGlzKTtcbiAgYWRkRGVmYXVsdE1ldGFTY2hlbWEodGhpcyk7XG4gIGlmICh0eXBlb2Ygb3B0cy5tZXRhID09ICdvYmplY3QnKSB0aGlzLmFkZE1ldGFTY2hlbWEob3B0cy5tZXRhKTtcbiAgaWYgKG9wdHMubnVsbGFibGUpIHRoaXMuYWRkS2V5d29yZCgnbnVsbGFibGUnLCB7bWV0YVNjaGVtYToge3R5cGU6ICdib29sZWFuJ319KTtcbiAgYWRkSW5pdGlhbFNjaGVtYXModGhpcyk7XG59XG5cblxuXG4vKipcbiAqIFZhbGlkYXRlIGRhdGEgdXNpbmcgc2NoZW1hXG4gKiBTY2hlbWEgd2lsbCBiZSBjb21waWxlZCBhbmQgY2FjaGVkICh1c2luZyBzZXJpYWxpemVkIEpTT04gYXMga2V5LiBbZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnldKGh0dHBzOi8vZ2l0aHViLmNvbS9lcG9iZXJlemtpbi9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSkgaXMgdXNlZCB0byBzZXJpYWxpemUuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7U3RyaW5nfE9iamVjdH0gc2NoZW1hS2V5UmVmIGtleSwgcmVmIG9yIHNjaGVtYSBvYmplY3RcbiAqIEBwYXJhbSAge0FueX0gZGF0YSB0byBiZSB2YWxpZGF0ZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHZhbGlkYXRpb24gcmVzdWx0LiBFcnJvcnMgZnJvbSB0aGUgbGFzdCB2YWxpZGF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIGBhanYuZXJyb3JzYCAoYW5kIGFsc28gaW4gY29tcGlsZWQgc2NoZW1hOiBgc2NoZW1hLmVycm9yc2ApLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZShzY2hlbWFLZXlSZWYsIGRhdGEpIHtcbiAgdmFyIHY7XG4gIGlmICh0eXBlb2Ygc2NoZW1hS2V5UmVmID09ICdzdHJpbmcnKSB7XG4gICAgdiA9IHRoaXMuZ2V0U2NoZW1hKHNjaGVtYUtleVJlZik7XG4gICAgaWYgKCF2KSB0aHJvdyBuZXcgRXJyb3IoJ25vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgXCInICsgc2NoZW1hS2V5UmVmICsgJ1wiJyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHRoaXMuX2FkZFNjaGVtYShzY2hlbWFLZXlSZWYpO1xuICAgIHYgPSBzY2hlbWFPYmoudmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZShzY2hlbWFPYmopO1xuICB9XG5cbiAgdmFyIHZhbGlkID0gdihkYXRhKTtcbiAgaWYgKHYuJGFzeW5jICE9PSB0cnVlKSB0aGlzLmVycm9ycyA9IHYuZXJyb3JzO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cblxuLyoqXG4gKiBDcmVhdGUgdmFsaWRhdGluZyBmdW5jdGlvbiBmb3IgcGFzc2VkIHNjaGVtYS5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0gIHtCb29sZWFufSBfbWV0YSB0cnVlIGlmIHNjaGVtYSBpcyBhIG1ldGEtc2NoZW1hLiBVc2VkIGludGVybmFsbHkgdG8gY29tcGlsZSBtZXRhIHNjaGVtYXMgb2YgY3VzdG9tIGtleXdvcmRzLlxuICogQHJldHVybiB7RnVuY3Rpb259IHZhbGlkYXRpbmcgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gY29tcGlsZShzY2hlbWEsIF9tZXRhKSB7XG4gIHZhciBzY2hlbWFPYmogPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCB1bmRlZmluZWQsIF9tZXRhKTtcbiAgcmV0dXJuIHNjaGVtYU9iai52YWxpZGF0ZSB8fCB0aGlzLl9jb21waWxlKHNjaGVtYU9iaik7XG59XG5cblxuLyoqXG4gKiBBZGRzIHNjaGVtYSB0byB0aGUgaW5zdGFuY2UuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IHNjaGVtYSBzY2hlbWEgb3IgYXJyYXkgb2Ygc2NoZW1hcy4gSWYgYXJyYXkgaXMgcGFzc2VkLCBga2V5YCBhbmQgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IE9wdGlvbmFsIHNjaGVtYSBrZXkuIENhbiBiZSBwYXNzZWQgdG8gYHZhbGlkYXRlYCBtZXRob2QgaW5zdGVhZCBvZiBzY2hlbWEgb2JqZWN0IG9yIGlkL3JlZi4gT25lIHNjaGVtYSBwZXIgaW5zdGFuY2UgY2FuIGhhdmUgZW1wdHkgYGlkYCBhbmQgYGtleWAuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9za2lwVmFsaWRhdGlvbiB0cnVlIHRvIHNraXAgc2NoZW1hIHZhbGlkYXRpb24uIFVzZWQgaW50ZXJuYWxseSwgb3B0aW9uIHZhbGlkYXRlU2NoZW1hIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9tZXRhIHRydWUgaWYgc2NoZW1hIGlzIGEgbWV0YS1zY2hlbWEuIFVzZWQgaW50ZXJuYWxseSwgYWRkTWV0YVNjaGVtYSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gYWRkU2NoZW1hKHNjaGVtYSwga2V5LCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpe1xuICAgIGZvciAodmFyIGk9MDsgaTxzY2hlbWEubGVuZ3RoOyBpKyspIHRoaXMuYWRkU2NoZW1hKHNjaGVtYVtpXSwgdW5kZWZpbmVkLCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWEpO1xuICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaWQgIT0gJ3N0cmluZycpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY2hlbWEgaWQgbXVzdCBiZSBzdHJpbmcnKTtcbiAga2V5ID0gcmVzb2x2ZS5ub3JtYWxpemVJZChrZXkgfHwgaWQpO1xuICBjaGVja1VuaXF1ZSh0aGlzLCBrZXkpO1xuICB0aGlzLl9zY2hlbWFzW2tleV0gPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCBfc2tpcFZhbGlkYXRpb24sIF9tZXRhLCB0cnVlKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBBZGQgc2NoZW1hIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIG90aGVyIHNjaGVtYXNcbiAqIG9wdGlvbnMgaW4gTUVUQV9JR05PUkVfT1BUSU9OUyBhcmUgYWx3YXkgc2V0IHRvIGZhbHNlXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtIHtPYmplY3R9IHNjaGVtYSBzY2hlbWEgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IG9wdGlvbmFsIHNjaGVtYSBrZXlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2tpcFZhbGlkYXRpb24gdHJ1ZSB0byBza2lwIHNjaGVtYSB2YWxpZGF0aW9uLCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB2YWxpZGF0ZVNjaGVtYSBvcHRpb24gZm9yIG1ldGEtc2NoZW1hXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRNZXRhU2NoZW1hKHNjaGVtYSwga2V5LCBza2lwVmFsaWRhdGlvbikge1xuICB0aGlzLmFkZFNjaGVtYShzY2hlbWEsIGtleSwgc2tpcFZhbGlkYXRpb24sIHRydWUpO1xuICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIFZhbGlkYXRlIHNjaGVtYVxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWEgc2NoZW1hIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T3JMb2dFcnJvciBwYXNzIHRydWUgdG8gdGhyb3cgKG9yIGxvZykgYW4gZXJyb3IgaWYgaW52YWxpZFxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBzY2hlbWEgaXMgdmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0aHJvd09yTG9nRXJyb3IpIHtcbiAgdmFyICRzY2hlbWEgPSBzY2hlbWEuJHNjaGVtYTtcbiAgaWYgKCRzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJHNjaGVtYSAhPSAnc3RyaW5nJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJyRzY2hlbWEgbXVzdCBiZSBhIHN0cmluZycpO1xuICAkc2NoZW1hID0gJHNjaGVtYSB8fCB0aGlzLl9vcHRzLmRlZmF1bHRNZXRhIHx8IGRlZmF1bHRNZXRhKHRoaXMpO1xuICBpZiAoISRzY2hlbWEpIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKCdtZXRhLXNjaGVtYSBub3QgYXZhaWxhYmxlJyk7XG4gICAgdGhpcy5lcnJvcnMgPSBudWxsO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciB2YWxpZCA9IHRoaXMudmFsaWRhdGUoJHNjaGVtYSwgc2NoZW1hKTtcbiAgaWYgKCF2YWxpZCAmJiB0aHJvd09yTG9nRXJyb3IpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdzY2hlbWEgaXMgaW52YWxpZDogJyArIHRoaXMuZXJyb3JzVGV4dCgpO1xuICAgIGlmICh0aGlzLl9vcHRzLnZhbGlkYXRlU2NoZW1hID09ICdsb2cnKSB0aGlzLmxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cblxuZnVuY3Rpb24gZGVmYXVsdE1ldGEoc2VsZikge1xuICB2YXIgbWV0YSA9IHNlbGYuX29wdHMubWV0YTtcbiAgc2VsZi5fb3B0cy5kZWZhdWx0TWV0YSA9IHR5cGVvZiBtZXRhID09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxmLl9nZXRJZChtZXRhKSB8fCBtZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZWxmLmdldFNjaGVtYShNRVRBX1NDSEVNQV9JRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTUVUQV9TQ0hFTUFfSURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gc2VsZi5fb3B0cy5kZWZhdWx0TWV0YTtcbn1cblxuXG4vKipcbiAqIEdldCBjb21waWxlZCBzY2hlbWEgZnJvbSB0aGUgaW5zdGFuY2UgYnkgYGtleWAgb3IgYHJlZmAuXG4gKiBAdGhpcyAgIEFqdlxuICogQHBhcmFtICB7U3RyaW5nfSBrZXlSZWYgYGtleWAgdGhhdCB3YXMgcGFzc2VkIHRvIGBhZGRTY2hlbWFgIG9yIGZ1bGwgc2NoZW1hIHJlZmVyZW5jZSAoYHNjaGVtYS5pZGAgb3IgcmVzb2x2ZWQgaWQpLlxuICogQHJldHVybiB7RnVuY3Rpb259IHNjaGVtYSB2YWxpZGF0aW5nIGZ1bmN0aW9uICh3aXRoIHByb3BlcnR5IGBzY2hlbWFgKS5cbiAqL1xuZnVuY3Rpb24gZ2V0U2NoZW1hKGtleVJlZikge1xuICB2YXIgc2NoZW1hT2JqID0gX2dldFNjaGVtYU9iaih0aGlzLCBrZXlSZWYpO1xuICBzd2l0Y2ggKHR5cGVvZiBzY2hlbWFPYmopIHtcbiAgICBjYXNlICdvYmplY3QnOiByZXR1cm4gc2NoZW1hT2JqLnZhbGlkYXRlIHx8IHRoaXMuX2NvbXBpbGUoc2NoZW1hT2JqKTtcbiAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gdGhpcy5nZXRTY2hlbWEoc2NoZW1hT2JqKTtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gX2dldFNjaGVtYUZyYWdtZW50KHRoaXMsIGtleVJlZik7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2NoZW1hRnJhZ21lbnQoc2VsZiwgcmVmKSB7XG4gIHZhciByZXMgPSByZXNvbHZlLnNjaGVtYS5jYWxsKHNlbGYsIHsgc2NoZW1hOiB7fSB9LCByZWYpO1xuICBpZiAocmVzKSB7XG4gICAgdmFyIHNjaGVtYSA9IHJlcy5zY2hlbWFcbiAgICAgICwgcm9vdCA9IHJlcy5yb290XG4gICAgICAsIGJhc2VJZCA9IHJlcy5iYXNlSWQ7XG4gICAgdmFyIHYgPSBjb21waWxlU2NoZW1hLmNhbGwoc2VsZiwgc2NoZW1hLCByb290LCB1bmRlZmluZWQsIGJhc2VJZCk7XG4gICAgc2VsZi5fZnJhZ21lbnRzW3JlZl0gPSBuZXcgU2NoZW1hT2JqZWN0KHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgZnJhZ21lbnQ6IHRydWUsXG4gICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgIHJvb3Q6IHJvb3QsXG4gICAgICBiYXNlSWQ6IGJhc2VJZCxcbiAgICAgIHZhbGlkYXRlOiB2XG4gICAgfSk7XG4gICAgcmV0dXJuIHY7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfZ2V0U2NoZW1hT2JqKHNlbGYsIGtleVJlZikge1xuICBrZXlSZWYgPSByZXNvbHZlLm5vcm1hbGl6ZUlkKGtleVJlZik7XG4gIHJldHVybiBzZWxmLl9zY2hlbWFzW2tleVJlZl0gfHwgc2VsZi5fcmVmc1trZXlSZWZdIHx8IHNlbGYuX2ZyYWdtZW50c1trZXlSZWZdO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlIGNhY2hlZCBzY2hlbWEocykuXG4gKiBJZiBubyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIGJ1dCBtZXRhLXNjaGVtYXMgYXJlIHJlbW92ZWQuXG4gKiBJZiBSZWdFeHAgaXMgcGFzc2VkIGFsbCBzY2hlbWFzIHdpdGgga2V5L2lkIG1hdGNoaW5nIHBhdHRlcm4gYnV0IG1ldGEtc2NoZW1hcyBhcmUgcmVtb3ZlZC5cbiAqIEV2ZW4gaWYgc2NoZW1hIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgc2NoZW1hcyBpdCBzdGlsbCBjYW4gYmUgcmVtb3ZlZCBhcyBvdGhlciBzY2hlbWFzIGhhdmUgbG9jYWwgcmVmZXJlbmNlcy5cbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtTdHJpbmd8T2JqZWN0fFJlZ0V4cH0gc2NoZW1hS2V5UmVmIGtleSwgcmVmLCBwYXR0ZXJuIHRvIG1hdGNoIGtleS9yZWYgb3Igc2NoZW1hIG9iamVjdFxuICogQHJldHVybiB7QWp2fSB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU2NoZW1hKHNjaGVtYUtleVJlZikge1xuICBpZiAoc2NoZW1hS2V5UmVmIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgX3JlbW92ZUFsbFNjaGVtYXModGhpcywgdGhpcy5fc2NoZW1hcywgc2NoZW1hS2V5UmVmKTtcbiAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9yZWZzLCBzY2hlbWFLZXlSZWYpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHN3aXRjaCAodHlwZW9mIHNjaGVtYUtleVJlZikge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBfcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLCB0aGlzLl9zY2hlbWFzKTtcbiAgICAgIF9yZW1vdmVBbGxTY2hlbWFzKHRoaXMsIHRoaXMuX3JlZnMpO1xuICAgICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICB2YXIgc2NoZW1hT2JqID0gX2dldFNjaGVtYU9iaih0aGlzLCBzY2hlbWFLZXlSZWYpO1xuICAgICAgaWYgKHNjaGVtYU9iaikgdGhpcy5fY2FjaGUuZGVsKHNjaGVtYU9iai5jYWNoZUtleSk7XG4gICAgICBkZWxldGUgdGhpcy5fc2NoZW1hc1tzY2hlbWFLZXlSZWZdO1xuICAgICAgZGVsZXRlIHRoaXMuX3JlZnNbc2NoZW1hS2V5UmVmXTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgc2VyaWFsaXplID0gdGhpcy5fb3B0cy5zZXJpYWxpemU7XG4gICAgICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemUgPyBzZXJpYWxpemUoc2NoZW1hS2V5UmVmKSA6IHNjaGVtYUtleVJlZjtcbiAgICAgIHRoaXMuX2NhY2hlLmRlbChjYWNoZUtleSk7XG4gICAgICB2YXIgaWQgPSB0aGlzLl9nZXRJZChzY2hlbWFLZXlSZWYpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGlkID0gcmVzb2x2ZS5ub3JtYWxpemVJZChpZCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zY2hlbWFzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3JlZnNbaWRdO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTY2hlbWFzKHNlbGYsIHNjaGVtYXMsIHJlZ2V4KSB7XG4gIGZvciAodmFyIGtleVJlZiBpbiBzY2hlbWFzKSB7XG4gICAgdmFyIHNjaGVtYU9iaiA9IHNjaGVtYXNba2V5UmVmXTtcbiAgICBpZiAoIXNjaGVtYU9iai5tZXRhICYmICghcmVnZXggfHwgcmVnZXgudGVzdChrZXlSZWYpKSkge1xuICAgICAgc2VsZi5fY2FjaGUuZGVsKHNjaGVtYU9iai5jYWNoZUtleSk7XG4gICAgICBkZWxldGUgc2NoZW1hc1trZXlSZWZdO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qIEB0aGlzICAgQWp2ICovXG5mdW5jdGlvbiBfYWRkU2NoZW1hKHNjaGVtYSwgc2tpcFZhbGlkYXRpb24sIG1ldGEsIHNob3VsZEFkZFNjaGVtYSkge1xuICBpZiAodHlwZW9mIHNjaGVtYSAhPSAnb2JqZWN0JyAmJiB0eXBlb2Ygc2NoZW1hICE9ICdib29sZWFuJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSBzaG91bGQgYmUgb2JqZWN0IG9yIGJvb2xlYW4nKTtcbiAgdmFyIHNlcmlhbGl6ZSA9IHRoaXMuX29wdHMuc2VyaWFsaXplO1xuICB2YXIgY2FjaGVLZXkgPSBzZXJpYWxpemUgPyBzZXJpYWxpemUoc2NoZW1hKSA6IHNjaGVtYTtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX2NhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgc2hvdWxkQWRkU2NoZW1hID0gc2hvdWxkQWRkU2NoZW1hIHx8IHRoaXMuX29wdHMuYWRkVXNlZFNjaGVtYSAhPT0gZmFsc2U7XG5cbiAgdmFyIGlkID0gcmVzb2x2ZS5ub3JtYWxpemVJZCh0aGlzLl9nZXRJZChzY2hlbWEpKTtcbiAgaWYgKGlkICYmIHNob3VsZEFkZFNjaGVtYSkgY2hlY2tVbmlxdWUodGhpcywgaWQpO1xuXG4gIHZhciB3aWxsVmFsaWRhdGUgPSB0aGlzLl9vcHRzLnZhbGlkYXRlU2NoZW1hICE9PSBmYWxzZSAmJiAhc2tpcFZhbGlkYXRpb247XG4gIHZhciByZWN1cnNpdmVNZXRhO1xuICBpZiAod2lsbFZhbGlkYXRlICYmICEocmVjdXJzaXZlTWV0YSA9IGlkICYmIGlkID09IHJlc29sdmUubm9ybWFsaXplSWQoc2NoZW1hLiRzY2hlbWEpKSlcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG5cbiAgdmFyIGxvY2FsUmVmcyA9IHJlc29sdmUuaWRzLmNhbGwodGhpcywgc2NoZW1hKTtcblxuICB2YXIgc2NoZW1hT2JqID0gbmV3IFNjaGVtYU9iamVjdCh7XG4gICAgaWQ6IGlkLFxuICAgIHNjaGVtYTogc2NoZW1hLFxuICAgIGxvY2FsUmVmczogbG9jYWxSZWZzLFxuICAgIGNhY2hlS2V5OiBjYWNoZUtleSxcbiAgICBtZXRhOiBtZXRhXG4gIH0pO1xuXG4gIGlmIChpZFswXSAhPSAnIycgJiYgc2hvdWxkQWRkU2NoZW1hKSB0aGlzLl9yZWZzW2lkXSA9IHNjaGVtYU9iajtcbiAgdGhpcy5fY2FjaGUucHV0KGNhY2hlS2V5LCBzY2hlbWFPYmopO1xuXG4gIGlmICh3aWxsVmFsaWRhdGUgJiYgcmVjdXJzaXZlTWV0YSkgdGhpcy52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gIHJldHVybiBzY2hlbWFPYmo7XG59XG5cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9jb21waWxlKHNjaGVtYU9iaiwgcm9vdCkge1xuICBpZiAoc2NoZW1hT2JqLmNvbXBpbGluZykge1xuICAgIHNjaGVtYU9iai52YWxpZGF0ZSA9IGNhbGxWYWxpZGF0ZTtcbiAgICBjYWxsVmFsaWRhdGUuc2NoZW1hID0gc2NoZW1hT2JqLnNjaGVtYTtcbiAgICBjYWxsVmFsaWRhdGUuZXJyb3JzID0gbnVsbDtcbiAgICBjYWxsVmFsaWRhdGUucm9vdCA9IHJvb3QgPyByb290IDogY2FsbFZhbGlkYXRlO1xuICAgIGlmIChzY2hlbWFPYmouc2NoZW1hLiRhc3luYyA9PT0gdHJ1ZSlcbiAgICAgIGNhbGxWYWxpZGF0ZS4kYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiBjYWxsVmFsaWRhdGU7XG4gIH1cbiAgc2NoZW1hT2JqLmNvbXBpbGluZyA9IHRydWU7XG5cbiAgdmFyIGN1cnJlbnRPcHRzO1xuICBpZiAoc2NoZW1hT2JqLm1ldGEpIHtcbiAgICBjdXJyZW50T3B0cyA9IHRoaXMuX29wdHM7XG4gICAgdGhpcy5fb3B0cyA9IHRoaXMuX21ldGFPcHRzO1xuICB9XG5cbiAgdmFyIHY7XG4gIHRyeSB7IHYgPSBjb21waWxlU2NoZW1hLmNhbGwodGhpcywgc2NoZW1hT2JqLnNjaGVtYSwgcm9vdCwgc2NoZW1hT2JqLmxvY2FsUmVmcyk7IH1cbiAgY2F0Y2goZSkge1xuICAgIGRlbGV0ZSBzY2hlbWFPYmoudmFsaWRhdGU7XG4gICAgdGhyb3cgZTtcbiAgfVxuICBmaW5hbGx5IHtcbiAgICBzY2hlbWFPYmouY29tcGlsaW5nID0gZmFsc2U7XG4gICAgaWYgKHNjaGVtYU9iai5tZXRhKSB0aGlzLl9vcHRzID0gY3VycmVudE9wdHM7XG4gIH1cblxuICBzY2hlbWFPYmoudmFsaWRhdGUgPSB2O1xuICBzY2hlbWFPYmoucmVmcyA9IHYucmVmcztcbiAgc2NoZW1hT2JqLnJlZlZhbCA9IHYucmVmVmFsO1xuICBzY2hlbWFPYmoucm9vdCA9IHYucm9vdDtcbiAgcmV0dXJuIHY7XG5cblxuICAvKiBAdGhpcyAgIHsqfSAtIGN1c3RvbSBjb250ZXh0LCBzZWUgcGFzc0NvbnRleHQgb3B0aW9uICovXG4gIGZ1bmN0aW9uIGNhbGxWYWxpZGF0ZSgpIHtcbiAgICAvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVlICovXG4gICAgdmFyIF92YWxpZGF0ZSA9IHNjaGVtYU9iai52YWxpZGF0ZTtcbiAgICB2YXIgcmVzdWx0ID0gX3ZhbGlkYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgY2FsbFZhbGlkYXRlLmVycm9ycyA9IF92YWxpZGF0ZS5lcnJvcnM7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNob29zZUdldElkKG9wdHMpIHtcbiAgc3dpdGNoIChvcHRzLnNjaGVtYUlkKSB7XG4gICAgY2FzZSAnYXV0byc6IHJldHVybiBfZ2V0JElkT3JJZDtcbiAgICBjYXNlICdpZCc6IHJldHVybiBfZ2V0SWQ7XG4gICAgZGVmYXVsdDogcmV0dXJuIF9nZXQkSWQ7XG4gIH1cbn1cblxuLyogQHRoaXMgICBBanYgKi9cbmZ1bmN0aW9uIF9nZXRJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS4kaWQpIHRoaXMubG9nZ2VyLndhcm4oJ3NjaGVtYSAkaWQgaWdub3JlZCcsIHNjaGVtYS4kaWQpO1xuICByZXR1cm4gc2NoZW1hLmlkO1xufVxuXG4vKiBAdGhpcyAgIEFqdiAqL1xuZnVuY3Rpb24gX2dldCRJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS5pZCkgdGhpcy5sb2dnZXIud2Fybignc2NoZW1hIGlkIGlnbm9yZWQnLCBzY2hlbWEuaWQpO1xuICByZXR1cm4gc2NoZW1hLiRpZDtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0JElkT3JJZChzY2hlbWEpIHtcbiAgaWYgKHNjaGVtYS4kaWQgJiYgc2NoZW1hLmlkICYmIHNjaGVtYS4kaWQgIT0gc2NoZW1hLmlkKVxuICAgIHRocm93IG5ldyBFcnJvcignc2NoZW1hICRpZCBpcyBkaWZmZXJlbnQgZnJvbSBpZCcpO1xuICByZXR1cm4gc2NoZW1hLiRpZCB8fCBzY2hlbWEuaWQ7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIGVycm9yIG1lc3NhZ2Ugb2JqZWN0cyB0byBzdHJpbmdcbiAqIEB0aGlzICAgQWp2XG4gKiBAcGFyYW0gIHtBcnJheTxPYmplY3Q+fSBlcnJvcnMgb3B0aW9uYWwgYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvcnMsIGlmIG5vdCBwYXNzZWQgZXJyb3JzIGZyb20gdGhlIGluc3RhbmNlIGFyZSB1c2VkLlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIG9wdGlvbmFsIG9wdGlvbnMgd2l0aCBwcm9wZXJ0aWVzIGBzZXBhcmF0b3JgIGFuZCBgZGF0YVZhcmAuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGh1bWFuIHJlYWRhYmxlIHN0cmluZyB3aXRoIGFsbCBlcnJvcnMgZGVzY3JpcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGVycm9yc1RleHQoZXJyb3JzLCBvcHRpb25zKSB7XG4gIGVycm9ycyA9IGVycm9ycyB8fCB0aGlzLmVycm9ycztcbiAgaWYgKCFlcnJvcnMpIHJldHVybiAnTm8gZXJyb3JzJztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBzZXBhcmF0b3IgPSBvcHRpb25zLnNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywgJyA6IG9wdGlvbnMuc2VwYXJhdG9yO1xuICB2YXIgZGF0YVZhciA9IG9wdGlvbnMuZGF0YVZhciA9PT0gdW5kZWZpbmVkID8gJ2RhdGEnIDogb3B0aW9ucy5kYXRhVmFyO1xuXG4gIHZhciB0ZXh0ID0gJyc7XG4gIGZvciAodmFyIGk9MDsgaTxlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVycm9yc1tpXTtcbiAgICBpZiAoZSkgdGV4dCArPSBkYXRhVmFyICsgZS5kYXRhUGF0aCArICcgJyArIGUubWVzc2FnZSArIHNlcGFyYXRvcjtcbiAgfVxuICByZXR1cm4gdGV4dC5zbGljZSgwLCAtc2VwYXJhdG9yLmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBBZGQgY3VzdG9tIGZvcm1hdFxuICogQHRoaXMgICBBanZcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGZvcm1hdCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB8RnVuY3Rpb259IGZvcm1hdCBzdHJpbmcgaXMgY29udmVydGVkIHRvIFJlZ0V4cDsgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBib29sZWFuICh0cnVlIHdoZW4gdmFsaWQpXG4gKiBAcmV0dXJuIHtBanZ9IHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICovXG5mdW5jdGlvbiBhZGRGb3JtYXQobmFtZSwgZm9ybWF0KSB7XG4gIGlmICh0eXBlb2YgZm9ybWF0ID09ICdzdHJpbmcnKSBmb3JtYXQgPSBuZXcgUmVnRXhwKGZvcm1hdCk7XG4gIHRoaXMuX2Zvcm1hdHNbbmFtZV0gPSBmb3JtYXQ7XG4gIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIGFkZERlZmF1bHRNZXRhU2NoZW1hKHNlbGYpIHtcbiAgdmFyICRkYXRhU2NoZW1hO1xuICBpZiAoc2VsZi5fb3B0cy4kZGF0YSkge1xuICAgICRkYXRhU2NoZW1hID0gcmVxdWlyZSgnLi9yZWZzL2RhdGEuanNvbicpO1xuICAgIHNlbGYuYWRkTWV0YVNjaGVtYSgkZGF0YVNjaGVtYSwgJGRhdGFTY2hlbWEuJGlkLCB0cnVlKTtcbiAgfVxuICBpZiAoc2VsZi5fb3B0cy5tZXRhID09PSBmYWxzZSkgcmV0dXJuO1xuICB2YXIgbWV0YVNjaGVtYSA9IHJlcXVpcmUoJy4vcmVmcy9qc29uLXNjaGVtYS1kcmFmdC0wNy5qc29uJyk7XG4gIGlmIChzZWxmLl9vcHRzLiRkYXRhKSBtZXRhU2NoZW1hID0gJGRhdGFNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIE1FVEFfU1VQUE9SVF9EQVRBKTtcbiAgc2VsZi5hZGRNZXRhU2NoZW1hKG1ldGFTY2hlbWEsIE1FVEFfU0NIRU1BX0lELCB0cnVlKTtcbiAgc2VsZi5fcmVmc1snaHR0cDovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWEnXSA9IE1FVEFfU0NIRU1BX0lEO1xufVxuXG5cbmZ1bmN0aW9uIGFkZEluaXRpYWxTY2hlbWFzKHNlbGYpIHtcbiAgdmFyIG9wdHNTY2hlbWFzID0gc2VsZi5fb3B0cy5zY2hlbWFzO1xuICBpZiAoIW9wdHNTY2hlbWFzKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdHNTY2hlbWFzKSkgc2VsZi5hZGRTY2hlbWEob3B0c1NjaGVtYXMpO1xuICBlbHNlIGZvciAodmFyIGtleSBpbiBvcHRzU2NoZW1hcykgc2VsZi5hZGRTY2hlbWEob3B0c1NjaGVtYXNba2V5XSwga2V5KTtcbn1cblxuXG5mdW5jdGlvbiBhZGRJbml0aWFsRm9ybWF0cyhzZWxmKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gc2VsZi5fb3B0cy5mb3JtYXRzKSB7XG4gICAgdmFyIGZvcm1hdCA9IHNlbGYuX29wdHMuZm9ybWF0c1tuYW1lXTtcbiAgICBzZWxmLmFkZEZvcm1hdChuYW1lLCBmb3JtYXQpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gYWRkSW5pdGlhbEtleXdvcmRzKHNlbGYpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiBzZWxmLl9vcHRzLmtleXdvcmRzKSB7XG4gICAgdmFyIGtleXdvcmQgPSBzZWxmLl9vcHRzLmtleXdvcmRzW25hbWVdO1xuICAgIHNlbGYuYWRkS2V5d29yZChuYW1lLCBrZXl3b3JkKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNoZWNrVW5pcXVlKHNlbGYsIGlkKSB7XG4gIGlmIChzZWxmLl9zY2hlbWFzW2lkXSB8fCBzZWxmLl9yZWZzW2lkXSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjaGVtYSB3aXRoIGtleSBvciBpZCBcIicgKyBpZCArICdcIiBhbHJlYWR5IGV4aXN0cycpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1ldGFTY2hlbWFPcHRpb25zKHNlbGYpIHtcbiAgdmFyIG1ldGFPcHRzID0gdXRpbC5jb3B5KHNlbGYuX29wdHMpO1xuICBmb3IgKHZhciBpPTA7IGk8TUVUQV9JR05PUkVfT1BUSU9OUy5sZW5ndGg7IGkrKylcbiAgICBkZWxldGUgbWV0YU9wdHNbTUVUQV9JR05PUkVfT1BUSU9OU1tpXV07XG4gIHJldHVybiBtZXRhT3B0cztcbn1cblxuXG5mdW5jdGlvbiBzZXRMb2dnZXIoc2VsZikge1xuICB2YXIgbG9nZ2VyID0gc2VsZi5fb3B0cy5sb2dnZXI7XG4gIGlmIChsb2dnZXIgPT09IGZhbHNlKSB7XG4gICAgc2VsZi5sb2dnZXIgPSB7bG9nOiBub29wLCB3YXJuOiBub29wLCBlcnJvcjogbm9vcH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSBsb2dnZXIgPSBjb25zb2xlO1xuICAgIGlmICghKHR5cGVvZiBsb2dnZXIgPT0gJ29iamVjdCcgJiYgbG9nZ2VyLmxvZyAmJiBsb2dnZXIud2FybiAmJiBsb2dnZXIuZXJyb3IpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2dnZXIgbXVzdCBpbXBsZW1lbnQgbG9nLCB3YXJuIGFuZCBlcnJvciBtZXRob2RzJyk7XG4gICAgc2VsZi5sb2dnZXIgPSBsb2dnZXI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBub29wKCkge31cbiIsICJmdW5jdGlvbiBIQVJFcnJvciAoZXJyb3JzKSB7XG4gIHZhciBtZXNzYWdlID0gJ3ZhbGlkYXRpb24gZmFpbGVkJ1xuXG4gIHRoaXMubmFtZSA9ICdIQVJFcnJvcidcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICB0aGlzLmVycm9ycyA9IGVycm9yc1xuXG4gIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKG1lc3NhZ2UpKS5zdGFja1xuICB9XG59XG5cbkhBUkVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhBUkVycm9yXG4iLCAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZnRlclJlcXVlc3Q6IHJlcXVpcmUoJy4vYWZ0ZXJSZXF1ZXN0Lmpzb24nKSxcbiAgYmVmb3JlUmVxdWVzdDogcmVxdWlyZSgnLi9iZWZvcmVSZXF1ZXN0Lmpzb24nKSxcbiAgYnJvd3NlcjogcmVxdWlyZSgnLi9icm93c2VyLmpzb24nKSxcbiAgY2FjaGU6IHJlcXVpcmUoJy4vY2FjaGUuanNvbicpLFxuICBjb250ZW50OiByZXF1aXJlKCcuL2NvbnRlbnQuanNvbicpLFxuICBjb29raWU6IHJlcXVpcmUoJy4vY29va2llLmpzb24nKSxcbiAgY3JlYXRvcjogcmVxdWlyZSgnLi9jcmVhdG9yLmpzb24nKSxcbiAgZW50cnk6IHJlcXVpcmUoJy4vZW50cnkuanNvbicpLFxuICBoYXI6IHJlcXVpcmUoJy4vaGFyLmpzb24nKSxcbiAgaGVhZGVyOiByZXF1aXJlKCcuL2hlYWRlci5qc29uJyksXG4gIGxvZzogcmVxdWlyZSgnLi9sb2cuanNvbicpLFxuICBwYWdlOiByZXF1aXJlKCcuL3BhZ2UuanNvbicpLFxuICBwYWdlVGltaW5nczogcmVxdWlyZSgnLi9wYWdlVGltaW5ncy5qc29uJyksXG4gIHBvc3REYXRhOiByZXF1aXJlKCcuL3Bvc3REYXRhLmpzb24nKSxcbiAgcXVlcnk6IHJlcXVpcmUoJy4vcXVlcnkuanNvbicpLFxuICByZXF1ZXN0OiByZXF1aXJlKCcuL3JlcXVlc3QuanNvbicpLFxuICByZXNwb25zZTogcmVxdWlyZSgnLi9yZXNwb25zZS5qc29uJyksXG4gIHRpbWluZ3M6IHJlcXVpcmUoJy4vdGltaW5ncy5qc29uJylcbn1cbiIsICJ2YXIgQWp2ID0gcmVxdWlyZSgnYWp2JylcbnZhciBIQVJFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKVxudmFyIHNjaGVtYXMgPSByZXF1aXJlKCdoYXItc2NoZW1hJylcblxudmFyIGFqdlxuXG5mdW5jdGlvbiBjcmVhdGVBanZJbnN0YW5jZSAoKSB7XG4gIHZhciBhanYgPSBuZXcgQWp2KHtcbiAgICBhbGxFcnJvcnM6IHRydWVcbiAgfSlcbiAgYWp2LmFkZE1ldGFTY2hlbWEocmVxdWlyZSgnYWp2L2xpYi9yZWZzL2pzb24tc2NoZW1hLWRyYWZ0LTA2Lmpzb24nKSlcbiAgYWp2LmFkZFNjaGVtYShzY2hlbWFzKVxuXG4gIHJldHVybiBhanZcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGUgKG5hbWUsIGRhdGEpIHtcbiAgZGF0YSA9IGRhdGEgfHwge31cblxuICAvLyB2YWxpZGF0b3IgY29uZmlnXG4gIGFqdiA9IGFqdiB8fCBjcmVhdGVBanZJbnN0YW5jZSgpXG5cbiAgdmFyIHZhbGlkYXRlID0gYWp2LmdldFNjaGVtYShuYW1lICsgJy5qc29uJylcblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciB2YWxpZCA9IHZhbGlkYXRlKGRhdGEpXG5cbiAgICAhdmFsaWQgPyByZWplY3QobmV3IEhBUkVycm9yKHZhbGlkYXRlLmVycm9ycykpIDogcmVzb2x2ZShkYXRhKVxuICB9KVxufVxuXG5leHBvcnRzLmFmdGVyUmVxdWVzdCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnYWZ0ZXJSZXF1ZXN0JywgZGF0YSlcbn1cblxuZXhwb3J0cy5iZWZvcmVSZXF1ZXN0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdiZWZvcmVSZXF1ZXN0JywgZGF0YSlcbn1cblxuZXhwb3J0cy5icm93c2VyID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdicm93c2VyJywgZGF0YSlcbn1cblxuZXhwb3J0cy5jYWNoZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnY2FjaGUnLCBkYXRhKVxufVxuXG5leHBvcnRzLmNvbnRlbnQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ2NvbnRlbnQnLCBkYXRhKVxufVxuXG5leHBvcnRzLmNvb2tpZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnY29va2llJywgZGF0YSlcbn1cblxuZXhwb3J0cy5jcmVhdG9yID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdjcmVhdG9yJywgZGF0YSlcbn1cblxuZXhwb3J0cy5lbnRyeSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnZW50cnknLCBkYXRhKVxufVxuXG5leHBvcnRzLmhhciA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgnaGFyJywgZGF0YSlcbn1cblxuZXhwb3J0cy5oZWFkZXIgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ2hlYWRlcicsIGRhdGEpXG59XG5cbmV4cG9ydHMubG9nID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdsb2cnLCBkYXRhKVxufVxuXG5leHBvcnRzLnBhZ2UgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ3BhZ2UnLCBkYXRhKVxufVxuXG5leHBvcnRzLnBhZ2VUaW1pbmdzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdwYWdlVGltaW5ncycsIGRhdGEpXG59XG5cbmV4cG9ydHMucG9zdERhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ3Bvc3REYXRhJywgZGF0YSlcbn1cblxuZXhwb3J0cy5xdWVyeSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgncXVlcnknLCBkYXRhKVxufVxuXG5leHBvcnRzLnJlcXVlc3QgPSBmdW5jdGlvbiAoZGF0YSkge1xuICByZXR1cm4gdmFsaWRhdGUoJ3JlcXVlc3QnLCBkYXRhKVxufVxuXG5leHBvcnRzLnJlc3BvbnNlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKCdyZXNwb25zZScsIGRhdGEpXG59XG5cbmV4cG9ydHMudGltaW5ncyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHJldHVybiB2YWxpZGF0ZSgndGltaW5ncycsIGRhdGEpXG59XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBxcyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJylcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ2hhci12YWxpZGF0b3InKVxudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ2V4dGVuZCcpXG5cbmZ1bmN0aW9uIEhhciAocmVxdWVzdCkge1xuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG59XG5cbkhhci5wcm90b3R5cGUucmVkdWNlciA9IGZ1bmN0aW9uIChvYmosIHBhaXIpIHtcbiAgLy8gbmV3IHByb3BlcnR5ID9cbiAgaWYgKG9ialtwYWlyLm5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICBvYmpbcGFpci5uYW1lXSA9IHBhaXIudmFsdWVcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICAvLyBleGlzdGluZz8gY29udmVydCB0byBhcnJheVxuICB2YXIgYXJyID0gW1xuICAgIG9ialtwYWlyLm5hbWVdLFxuICAgIHBhaXIudmFsdWVcbiAgXVxuXG4gIG9ialtwYWlyLm5hbWVdID0gYXJyXG5cbiAgcmV0dXJuIG9ialxufVxuXG5IYXIucHJvdG90eXBlLnByZXAgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAvLyBjb25zdHJ1Y3QgdXRpbGl0eSBwcm9wZXJ0aWVzXG4gIGRhdGEucXVlcnlPYmogPSB7fVxuICBkYXRhLmhlYWRlcnNPYmogPSB7fVxuICBkYXRhLnBvc3REYXRhLmpzb25PYmogPSBmYWxzZVxuICBkYXRhLnBvc3REYXRhLnBhcmFtc09iaiA9IGZhbHNlXG5cbiAgLy8gY29uc3RydWN0IHF1ZXJ5IG9iamVjdHNcbiAgaWYgKGRhdGEucXVlcnlTdHJpbmcgJiYgZGF0YS5xdWVyeVN0cmluZy5sZW5ndGgpIHtcbiAgICBkYXRhLnF1ZXJ5T2JqID0gZGF0YS5xdWVyeVN0cmluZy5yZWR1Y2UodGhpcy5yZWR1Y2VyLCB7fSlcbiAgfVxuXG4gIC8vIGNvbnN0cnVjdCBoZWFkZXJzIG9iamVjdHNcbiAgaWYgKGRhdGEuaGVhZGVycyAmJiBkYXRhLmhlYWRlcnMubGVuZ3RoKSB7XG4gICAgLy8gbG93ZUNhc2UgaGVhZGVyIGtleXNcbiAgICBkYXRhLmhlYWRlcnNPYmogPSBkYXRhLmhlYWRlcnMucmVkdWNlUmlnaHQoZnVuY3Rpb24gKGhlYWRlcnMsIGhlYWRlcikge1xuICAgICAgaGVhZGVyc1toZWFkZXIubmFtZV0gPSBoZWFkZXIudmFsdWVcbiAgICAgIHJldHVybiBoZWFkZXJzXG4gICAgfSwge30pXG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgQ29va2llIGhlYWRlclxuICBpZiAoZGF0YS5jb29raWVzICYmIGRhdGEuY29va2llcy5sZW5ndGgpIHtcbiAgICB2YXIgY29va2llcyA9IGRhdGEuY29va2llcy5tYXAoZnVuY3Rpb24gKGNvb2tpZSkge1xuICAgICAgcmV0dXJuIGNvb2tpZS5uYW1lICsgJz0nICsgY29va2llLnZhbHVlXG4gICAgfSlcblxuICAgIGlmIChjb29raWVzLmxlbmd0aCkge1xuICAgICAgZGF0YS5oZWFkZXJzT2JqLmNvb2tpZSA9IGNvb2tpZXMuam9pbignOyAnKVxuICAgIH1cbiAgfVxuXG4gIC8vIHByZXAgYm9keVxuICBmdW5jdGlvbiBzb21lIChhcnIpIHtcbiAgICByZXR1cm4gYXJyLnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHJldHVybiBkYXRhLnBvc3REYXRhLm1pbWVUeXBlLmluZGV4T2YodHlwZSkgPT09IDBcbiAgICB9KVxuICB9XG5cbiAgaWYgKHNvbWUoW1xuICAgICdtdWx0aXBhcnQvbWl4ZWQnLFxuICAgICdtdWx0aXBhcnQvcmVsYXRlZCcsXG4gICAgJ211bHRpcGFydC9mb3JtLWRhdGEnLFxuICAgICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnXSkpIHtcbiAgICAvLyByZXNldCB2YWx1ZXNcbiAgICBkYXRhLnBvc3REYXRhLm1pbWVUeXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gIH0gZWxzZSBpZiAoc29tZShbXG4gICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddKSkge1xuICAgIGlmICghZGF0YS5wb3N0RGF0YS5wYXJhbXMpIHtcbiAgICAgIGRhdGEucG9zdERhdGEudGV4dCA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEucG9zdERhdGEucGFyYW1zT2JqID0gZGF0YS5wb3N0RGF0YS5wYXJhbXMucmVkdWNlKHRoaXMucmVkdWNlciwge30pXG5cbiAgICAgIC8vIGFsd2F5cyBvdmVyd3JpdGVcbiAgICAgIGRhdGEucG9zdERhdGEudGV4dCA9IHFzLnN0cmluZ2lmeShkYXRhLnBvc3REYXRhLnBhcmFtc09iailcbiAgICB9XG4gIH0gZWxzZSBpZiAoc29tZShbXG4gICAgJ3RleHQvanNvbicsXG4gICAgJ3RleHQveC1qc29uJyxcbiAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgJ2FwcGxpY2F0aW9uL3gtanNvbiddKSkge1xuICAgIGRhdGEucG9zdERhdGEubWltZVR5cGUgPSAnYXBwbGljYXRpb24vanNvbidcblxuICAgIGlmIChkYXRhLnBvc3REYXRhLnRleHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEucG9zdERhdGEuanNvbk9iaiA9IEpTT04ucGFyc2UoZGF0YS5wb3N0RGF0YS50ZXh0KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLnJlcXVlc3QuZGVidWcoZSlcblxuICAgICAgICAvLyBmb3JjZSBiYWNrIHRvIHRleHQvcGxhaW5cbiAgICAgICAgZGF0YS5wb3N0RGF0YS5taW1lVHlwZSA9ICd0ZXh0L3BsYWluJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbkhhci5wcm90b3R5cGUub3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIC8vIHNraXAgaWYgbm8gaGFyIHByb3BlcnR5IGRlZmluZWRcbiAgaWYgKCFvcHRpb25zLmhhcikge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICB2YXIgaGFyID0ge31cbiAgZXh0ZW5kKGhhciwgb3B0aW9ucy5oYXIpXG5cbiAgLy8gb25seSBwcm9jZXNzIHRoZSBmaXJzdCBlbnRyeVxuICBpZiAoaGFyLmxvZyAmJiBoYXIubG9nLmVudHJpZXMpIHtcbiAgICBoYXIgPSBoYXIubG9nLmVudHJpZXNbMF1cbiAgfVxuXG4gIC8vIGFkZCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIG1ha2UgdmFsaWRhdGlvbiBzdWNjZXNzZnVsXG4gIGhhci51cmwgPSBoYXIudXJsIHx8IG9wdGlvbnMudXJsIHx8IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMuYmFzZVVybCB8fCAnLydcbiAgaGFyLmh0dHBWZXJzaW9uID0gaGFyLmh0dHBWZXJzaW9uIHx8ICdIVFRQLzEuMSdcbiAgaGFyLnF1ZXJ5U3RyaW5nID0gaGFyLnF1ZXJ5U3RyaW5nIHx8IFtdXG4gIGhhci5oZWFkZXJzID0gaGFyLmhlYWRlcnMgfHwgW11cbiAgaGFyLmNvb2tpZXMgPSBoYXIuY29va2llcyB8fCBbXVxuICBoYXIucG9zdERhdGEgPSBoYXIucG9zdERhdGEgfHwge31cbiAgaGFyLnBvc3REYXRhLm1pbWVUeXBlID0gaGFyLnBvc3REYXRhLm1pbWVUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG5cbiAgaGFyLmJvZHlTaXplID0gMFxuICBoYXIuaGVhZGVyc1NpemUgPSAwXG4gIGhhci5wb3N0RGF0YS5zaXplID0gMFxuXG4gIGlmICghdmFsaWRhdGUucmVxdWVzdChoYXIpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIC8vIGNsZWFuIHVwIGFuZCBnZXQgc29tZSB1dGlsaXR5IHByb3BlcnRpZXNcbiAgdmFyIHJlcSA9IHRoaXMucHJlcChoYXIpXG5cbiAgLy8gY29uc3RydWN0IG5ldyBvcHRpb25zXG4gIGlmIChyZXEudXJsKSB7XG4gICAgb3B0aW9ucy51cmwgPSByZXEudXJsXG4gIH1cblxuICBpZiAocmVxLm1ldGhvZCkge1xuICAgIG9wdGlvbnMubWV0aG9kID0gcmVxLm1ldGhvZFxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlcS5xdWVyeU9iaikubGVuZ3RoKSB7XG4gICAgb3B0aW9ucy5xcyA9IHJlcS5xdWVyeU9ialxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlcS5oZWFkZXJzT2JqKS5sZW5ndGgpIHtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSByZXEuaGVhZGVyc09ialxuICB9XG5cbiAgZnVuY3Rpb24gdGVzdCAodHlwZSkge1xuICAgIHJldHVybiByZXEucG9zdERhdGEubWltZVR5cGUuaW5kZXhPZih0eXBlKSA9PT0gMFxuICB9XG4gIGlmICh0ZXN0KCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSkge1xuICAgIG9wdGlvbnMuZm9ybSA9IHJlcS5wb3N0RGF0YS5wYXJhbXNPYmpcbiAgfSBlbHNlIGlmICh0ZXN0KCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICBpZiAocmVxLnBvc3REYXRhLmpzb25PYmopIHtcbiAgICAgIG9wdGlvbnMuYm9keSA9IHJlcS5wb3N0RGF0YS5qc29uT2JqXG4gICAgICBvcHRpb25zLmpzb24gPSB0cnVlXG4gICAgfVxuICB9IGVsc2UgaWYgKHRlc3QoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkge1xuICAgIG9wdGlvbnMuZm9ybURhdGEgPSB7fVxuXG4gICAgcmVxLnBvc3REYXRhLnBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgdmFyIGF0dGFjaG1lbnQgPSB7fVxuXG4gICAgICBpZiAoIXBhcmFtLmZpbGVOYW1lICYmICFwYXJhbS5jb250ZW50VHlwZSkge1xuICAgICAgICBvcHRpb25zLmZvcm1EYXRhW3BhcmFtLm5hbWVdID0gcGFyYW0udmFsdWVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIGF0dGVtcHQgdG8gcmVhZCBmcm9tIGRpc2shXG4gICAgICBpZiAocGFyYW0uZmlsZU5hbWUgJiYgIXBhcmFtLnZhbHVlKSB7XG4gICAgICAgIGF0dGFjaG1lbnQudmFsdWUgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhcmFtLmZpbGVOYW1lKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbS52YWx1ZSkge1xuICAgICAgICBhdHRhY2htZW50LnZhbHVlID0gcGFyYW0udmFsdWVcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtLmZpbGVOYW1lKSB7XG4gICAgICAgIGF0dGFjaG1lbnQub3B0aW9ucyA9IHtcbiAgICAgICAgICBmaWxlbmFtZTogcGFyYW0uZmlsZU5hbWUsXG4gICAgICAgICAgY29udGVudFR5cGU6IHBhcmFtLmNvbnRlbnRUeXBlID8gcGFyYW0uY29udGVudFR5cGUgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5mb3JtRGF0YVtwYXJhbS5uYW1lXSA9IGF0dGFjaG1lbnRcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGlmIChyZXEucG9zdERhdGEudGV4dCkge1xuICAgICAgb3B0aW9ucy5ib2R5ID0gcmVxLnBvc3REYXRhLnRleHRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5leHBvcnRzLkhhciA9IEhhclxuIiwgIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuICBJbiB0aGVcbi8vIGJyb3dzZXIgdGhpcyBpcyBhIGxpdHRsZSBjb21wbGljYXRlZCBkdWUgdG8gdW5rbm93biBxdWFsaXR5IG9mIE1hdGgucmFuZG9tKClcbi8vIGFuZCBpbmNvbnNpc3RlbnQgc3VwcG9ydCBmb3IgdGhlIGBjcnlwdG9gIEFQSS4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiB2aWFcbi8vIGZlYXR1cmUtZGV0ZWN0aW9uXG5cbi8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0b1xuLy8gaW1wbGVtZW50YXRpb24uIEFsc28sIGZpbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGNyeXB0byBvbiBJRTExLlxudmFyIGdldFJhbmRvbVZhbHVlcyA9ICh0eXBlb2YoY3J5cHRvKSAhPSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YobXNDcnlwdG8pICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09ICdmdW5jdGlvbicgJiYgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pKTtcblxuaWYgKGdldFJhbmRvbVZhbHVlcykge1xuICAvLyBXSEFUV0cgY3J5cHRvIFJORyAtIGh0dHA6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9DcnlwdG9cbiAgdmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3aGF0d2dSTkcoKSB7XG4gICAgZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbiAgICByZXR1cm4gcm5kczg7XG4gIH07XG59IGVsc2Uge1xuICAvLyBNYXRoLnJhbmRvbSgpLWJhc2VkIChSTkcpXG4gIC8vXG4gIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgTWF0aC5yYW5kb20oKS4gIEl0J3MgZmFzdCwgYnV0IGlzIG9mIHVuc3BlY2lmaWVkXG4gIC8vIHF1YWxpdHkuXG4gIHZhciBybmRzID0gbmV3IEFycmF5KDE2KTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hdGhSTkcoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHI7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBpZiAoKGkgJiAweDAzKSA9PT0gMCkgciA9IE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMDtcbiAgICAgIHJuZHNbaV0gPSByID4+PiAoKGkgJiAweDAzKSA8PCAzKSAmIDB4ZmY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJuZHM7XG4gIH07XG59XG4iLCAiLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG52YXIgYnl0ZVRvSGV4ID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9VdWlkKGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBidGggPSBieXRlVG9IZXg7XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIHJldHVybiAoW1xuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuICAgIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG4gICAgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSxcbiAgICBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dXG4gIF0pLmpvaW4oJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ5dGVzVG9VdWlkO1xuIiwgInZhciBybmcgPSByZXF1aXJlKCcuL2xpYi9ybmcnKTtcbnZhciBieXRlc1RvVXVpZCA9IHJlcXVpcmUoJy4vbGliL2J5dGVzVG9VdWlkJyk7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuXG4gIGlmICh0eXBlb2Yob3B0aW9ucykgPT0gJ3N0cmluZycpIHtcbiAgICBidWYgPSBvcHRpb25zID09PSAnYmluYXJ5JyA/IG5ldyBBcnJheSgxNikgOiBudWxsO1xuICAgIG9wdGlvbnMgPSBudWxsO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTtcblxuICAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG4gIHJuZHNbNl0gPSAocm5kc1s2XSAmIDB4MGYpIHwgMHg0MDtcbiAgcm5kc1s4XSA9IChybmRzWzhdICYgMHgzZikgfCAweDgwO1xuXG4gIC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuICBpZiAoYnVmKSB7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IDE2OyArK2lpKSB7XG4gICAgICBidWZbaSArIGlpXSA9IHJuZHNbaWldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWYgfHwgYnl0ZXNUb1V1aWQocm5kcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdjQ7XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBjYXNlbGVzcyA9IHJlcXVpcmUoJ2Nhc2VsZXNzJylcbnZhciB1dWlkID0gcmVxdWlyZSgndXVpZC92NCcpXG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpXG5cbnZhciBtZDUgPSBoZWxwZXJzLm1kNVxudmFyIHRvQmFzZTY0ID0gaGVscGVycy50b0Jhc2U2NFxuXG5mdW5jdGlvbiBBdXRoIChyZXF1ZXN0KSB7XG4gIC8vIGRlZmluZSBhbGwgcHVibGljIHByb3BlcnRpZXMgaGVyZVxuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gIHRoaXMuaGFzQXV0aCA9IGZhbHNlXG4gIHRoaXMuc2VudEF1dGggPSBmYWxzZVxuICB0aGlzLmJlYXJlclRva2VuID0gbnVsbFxuICB0aGlzLnVzZXIgPSBudWxsXG4gIHRoaXMucGFzcyA9IG51bGxcbn1cblxuQXV0aC5wcm90b3R5cGUuYmFzaWMgPSBmdW5jdGlvbiAodXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5KSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAodHlwZW9mIHVzZXIgIT09ICdzdHJpbmcnIHx8IChwYXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhc3MgIT09ICdzdHJpbmcnKSkge1xuICAgIHNlbGYucmVxdWVzdC5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignYXV0aCgpIHJlY2VpdmVkIGludmFsaWQgdXNlciBvciBwYXNzd29yZCcpKVxuICB9XG4gIHNlbGYudXNlciA9IHVzZXJcbiAgc2VsZi5wYXNzID0gcGFzc1xuICBzZWxmLmhhc0F1dGggPSB0cnVlXG4gIHZhciBoZWFkZXIgPSB1c2VyICsgJzonICsgKHBhc3MgfHwgJycpXG4gIGlmIChzZW5kSW1tZWRpYXRlbHkgfHwgdHlwZW9mIHNlbmRJbW1lZGlhdGVseSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgYXV0aEhlYWRlciA9ICdCYXNpYyAnICsgdG9CYXNlNjQoaGVhZGVyKVxuICAgIHNlbGYuc2VudEF1dGggPSB0cnVlXG4gICAgcmV0dXJuIGF1dGhIZWFkZXJcbiAgfVxufVxuXG5BdXRoLnByb3RvdHlwZS5iZWFyZXIgPSBmdW5jdGlvbiAoYmVhcmVyLCBzZW5kSW1tZWRpYXRlbHkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuYmVhcmVyVG9rZW4gPSBiZWFyZXJcbiAgc2VsZi5oYXNBdXRoID0gdHJ1ZVxuICBpZiAoc2VuZEltbWVkaWF0ZWx5IHx8IHR5cGVvZiBzZW5kSW1tZWRpYXRlbHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBiZWFyZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJlYXJlciA9IGJlYXJlcigpXG4gICAgfVxuICAgIHZhciBhdXRoSGVhZGVyID0gJ0JlYXJlciAnICsgKGJlYXJlciB8fCAnJylcbiAgICBzZWxmLnNlbnRBdXRoID0gdHJ1ZVxuICAgIHJldHVybiBhdXRoSGVhZGVyXG4gIH1cbn1cblxuQXV0aC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKG1ldGhvZCwgcGF0aCwgYXV0aEhlYWRlcikge1xuICAvLyBUT0RPOiBNb3JlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIFJGQyAyNjE3LlxuICAvLyAgIC0gaGFuZGxlIGNoYWxsZW5nZS5kb21haW5cbiAgLy8gICAtIHN1cHBvcnQgcW9wPVwiYXV0aC1pbnRcIiBvbmx5XG4gIC8vICAgLSBoYW5kbGUgQXV0aGVudGljYXRpb24tSW5mbyAobm90IG5lY2Vzc2FyaWx5PylcbiAgLy8gICAtIGNoZWNrIGNoYWxsZW5nZS5zdGFsZSAobm90IG5lY2Vzc2FyaWx5PylcbiAgLy8gICAtIGluY3JlYXNlIG5jIChub3QgbmVjZXNzYXJpbHk/KVxuICAvLyBGb3IgcmVmZXJlbmNlOlxuICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNjE3I3NlY3Rpb24tM1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmFnZGVyL2N1cmwvYmxvYi9tYXN0ZXIvbGliL2h0dHBfZGlnZXN0LmNcblxuICB2YXIgc2VsZiA9IHRoaXNcblxuICB2YXIgY2hhbGxlbmdlID0ge31cbiAgdmFyIHJlID0gLyhbYS16MC05Xy1dKyk9KD86XCIoW15cIl0rKVwifChbYS16MC05Xy1dKykpL2dpXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG1hdGNoID0gcmUuZXhlYyhhdXRoSGVhZGVyKVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNoYWxsZW5nZVttYXRjaFsxXV0gPSBtYXRjaFsyXSB8fCBtYXRjaFszXVxuICB9XG5cbiAgLyoqXG4gICAqIFJGQyAyNjE3OiBoYW5kbGUgYm90aCBNRDUgYW5kIE1ENS1zZXNzIGFsZ29yaXRobXMuXG4gICAqXG4gICAqIElmIHRoZSBhbGdvcml0aG0gZGlyZWN0aXZlJ3MgdmFsdWUgaXMgXCJNRDVcIiBvciB1bnNwZWNpZmllZCwgdGhlbiBIQTEgaXNcbiAgICogICBIQTE9TUQ1KHVzZXJuYW1lOnJlYWxtOnBhc3N3b3JkKVxuICAgKiBJZiB0aGUgYWxnb3JpdGhtIGRpcmVjdGl2ZSdzIHZhbHVlIGlzIFwiTUQ1LXNlc3NcIiwgdGhlbiBIQTEgaXNcbiAgICogICBIQTE9TUQ1KE1ENSh1c2VybmFtZTpyZWFsbTpwYXNzd29yZCk6bm9uY2U6Y25vbmNlKVxuICAgKi9cbiAgdmFyIGhhMUNvbXB1dGUgPSBmdW5jdGlvbiAoYWxnb3JpdGhtLCB1c2VyLCByZWFsbSwgcGFzcywgbm9uY2UsIGNub25jZSkge1xuICAgIHZhciBoYTEgPSBtZDUodXNlciArICc6JyArIHJlYWxtICsgJzonICsgcGFzcylcbiAgICBpZiAoYWxnb3JpdGhtICYmIGFsZ29yaXRobS50b0xvd2VyQ2FzZSgpID09PSAnbWQ1LXNlc3MnKSB7XG4gICAgICByZXR1cm4gbWQ1KGhhMSArICc6JyArIG5vbmNlICsgJzonICsgY25vbmNlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaGExXG4gICAgfVxuICB9XG5cbiAgdmFyIHFvcCA9IC8oXnwsKVxccyphdXRoXFxzKigkfCwpLy50ZXN0KGNoYWxsZW5nZS5xb3ApICYmICdhdXRoJ1xuICB2YXIgbmMgPSBxb3AgJiYgJzAwMDAwMDAxJ1xuICB2YXIgY25vbmNlID0gcW9wICYmIHV1aWQoKS5yZXBsYWNlKC8tL2csICcnKVxuICB2YXIgaGExID0gaGExQ29tcHV0ZShjaGFsbGVuZ2UuYWxnb3JpdGhtLCBzZWxmLnVzZXIsIGNoYWxsZW5nZS5yZWFsbSwgc2VsZi5wYXNzLCBjaGFsbGVuZ2Uubm9uY2UsIGNub25jZSlcbiAgdmFyIGhhMiA9IG1kNShtZXRob2QgKyAnOicgKyBwYXRoKVxuICB2YXIgZGlnZXN0UmVzcG9uc2UgPSBxb3BcbiAgICA/IG1kNShoYTEgKyAnOicgKyBjaGFsbGVuZ2Uubm9uY2UgKyAnOicgKyBuYyArICc6JyArIGNub25jZSArICc6JyArIHFvcCArICc6JyArIGhhMilcbiAgICA6IG1kNShoYTEgKyAnOicgKyBjaGFsbGVuZ2Uubm9uY2UgKyAnOicgKyBoYTIpXG4gIHZhciBhdXRoVmFsdWVzID0ge1xuICAgIHVzZXJuYW1lOiBzZWxmLnVzZXIsXG4gICAgcmVhbG06IGNoYWxsZW5nZS5yZWFsbSxcbiAgICBub25jZTogY2hhbGxlbmdlLm5vbmNlLFxuICAgIHVyaTogcGF0aCxcbiAgICBxb3A6IHFvcCxcbiAgICByZXNwb25zZTogZGlnZXN0UmVzcG9uc2UsXG4gICAgbmM6IG5jLFxuICAgIGNub25jZTogY25vbmNlLFxuICAgIGFsZ29yaXRobTogY2hhbGxlbmdlLmFsZ29yaXRobSxcbiAgICBvcGFxdWU6IGNoYWxsZW5nZS5vcGFxdWVcbiAgfVxuXG4gIGF1dGhIZWFkZXIgPSBbXVxuICBmb3IgKHZhciBrIGluIGF1dGhWYWx1ZXMpIHtcbiAgICBpZiAoYXV0aFZhbHVlc1trXSkge1xuICAgICAgaWYgKGsgPT09ICdxb3AnIHx8IGsgPT09ICduYycgfHwgayA9PT0gJ2FsZ29yaXRobScpIHtcbiAgICAgICAgYXV0aEhlYWRlci5wdXNoKGsgKyAnPScgKyBhdXRoVmFsdWVzW2tdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXV0aEhlYWRlci5wdXNoKGsgKyAnPVwiJyArIGF1dGhWYWx1ZXNba10gKyAnXCInKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhdXRoSGVhZGVyID0gJ0RpZ2VzdCAnICsgYXV0aEhlYWRlci5qb2luKCcsICcpXG4gIHNlbGYuc2VudEF1dGggPSB0cnVlXG4gIHJldHVybiBhdXRoSGVhZGVyXG59XG5cbkF1dGgucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uICh1c2VyLCBwYXNzLCBzZW5kSW1tZWRpYXRlbHksIGJlYXJlcikge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHJlcXVlc3QgPSBzZWxmLnJlcXVlc3RcblxuICB2YXIgYXV0aEhlYWRlclxuICBpZiAoYmVhcmVyID09PSB1bmRlZmluZWQgJiYgdXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyBhdXRoIG1lY2hhbmlzbSBkZWZpbmVkJykpXG4gIH0gZWxzZSBpZiAoYmVhcmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhdXRoSGVhZGVyID0gc2VsZi5iZWFyZXIoYmVhcmVyLCBzZW5kSW1tZWRpYXRlbHkpXG4gIH0gZWxzZSB7XG4gICAgYXV0aEhlYWRlciA9IHNlbGYuYmFzaWModXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5KVxuICB9XG4gIGlmIChhdXRoSGVhZGVyKSB7XG4gICAgcmVxdWVzdC5zZXRIZWFkZXIoJ2F1dGhvcml6YXRpb24nLCBhdXRoSGVhZGVyKVxuICB9XG59XG5cbkF1dGgucHJvdG90eXBlLm9uUmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXF1ZXN0ID0gc2VsZi5yZXF1ZXN0XG5cbiAgaWYgKCFzZWxmLmhhc0F1dGggfHwgc2VsZi5zZW50QXV0aCkgeyByZXR1cm4gbnVsbCB9XG5cbiAgdmFyIGMgPSBjYXNlbGVzcyhyZXNwb25zZS5oZWFkZXJzKVxuXG4gIHZhciBhdXRoSGVhZGVyID0gYy5nZXQoJ3d3dy1hdXRoZW50aWNhdGUnKVxuICB2YXIgYXV0aFZlcmIgPSBhdXRoSGVhZGVyICYmIGF1dGhIZWFkZXIuc3BsaXQoJyAnKVswXS50b0xvd2VyQ2FzZSgpXG4gIHJlcXVlc3QuZGVidWcoJ3JlYXV0aCcsIGF1dGhWZXJiKVxuXG4gIHN3aXRjaCAoYXV0aFZlcmIpIHtcbiAgICBjYXNlICdiYXNpYyc6XG4gICAgICByZXR1cm4gc2VsZi5iYXNpYyhzZWxmLnVzZXIsIHNlbGYucGFzcywgdHJ1ZSlcblxuICAgIGNhc2UgJ2JlYXJlcic6XG4gICAgICByZXR1cm4gc2VsZi5iZWFyZXIoc2VsZi5iZWFyZXJUb2tlbiwgdHJ1ZSlcblxuICAgIGNhc2UgJ2RpZ2VzdCc6XG4gICAgICByZXR1cm4gc2VsZi5kaWdlc3QocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QucGF0aCwgYXV0aEhlYWRlcilcbiAgfVxufVxuXG5leHBvcnRzLkF1dGggPSBBdXRoXG4iLCAidmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG5cbmZ1bmN0aW9uIHNoYSAoa2V5LCBib2R5LCBhbGdvcml0aG0pIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIbWFjKGFsZ29yaXRobSwga2V5KS51cGRhdGUoYm9keSkuZGlnZXN0KCdiYXNlNjQnKVxufVxuXG5mdW5jdGlvbiByc2EgKGtleSwgYm9keSkge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEExJykudXBkYXRlKGJvZHkpLnNpZ24oa2V5LCAnYmFzZTY0Jylcbn1cblxuZnVuY3Rpb24gcmZjMzk4NiAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKVxuICAgIC5yZXBsYWNlKC8hL2csJyUyMScpXG4gICAgLnJlcGxhY2UoL1xcKi9nLCclMkEnKVxuICAgIC5yZXBsYWNlKC9cXCgvZywnJTI4JylcbiAgICAucmVwbGFjZSgvXFwpL2csJyUyOScpXG4gICAgLnJlcGxhY2UoLycvZywnJTI3Jylcbn1cblxuLy8gTWFwcyBvYmplY3QgdG8gYmktZGltZW5zaW9uYWwgYXJyYXlcbi8vIENvbnZlcnRzIHsgZm9vOiAnQScsIGJhcjogWyAnYicsICdCJyBdfSB0b1xuLy8gWyBbJ2ZvbycsICdBJ10sIFsnYmFyJywgJ2InXSwgWydiYXInLCAnQiddIF1cbmZ1bmN0aW9uIG1hcCAob2JqKSB7XG4gIHZhciBrZXksIHZhbCwgYXJyID0gW11cbiAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgdmFsID0gb2JqW2tleV1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspXG4gICAgICAgIGFyci5wdXNoKFtrZXksIHZhbFtpXV0pXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpXG4gICAgICBmb3IgKHZhciBwcm9wIGluIHZhbClcbiAgICAgICAgYXJyLnB1c2goW2tleSArICdbJyArIHByb3AgKyAnXScsIHZhbFtwcm9wXV0pXG4gICAgZWxzZVxuICAgICAgYXJyLnB1c2goW2tleSwgdmFsXSlcbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbi8vIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRcbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQmFzZSAoaHR0cE1ldGhvZCwgYmFzZV91cmksIHBhcmFtcykge1xuICAvLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9kZXYudHdpdHRlci5jb20vZG9jcy9hdXRoL29hdXRoIGFuZCBcbiAgLy8gaHR0cHM6Ly9kZXYudHdpdHRlci5jb20vZG9jcy9hdXRoL2NyZWF0aW5nLXNpZ25hdHVyZVxuXG4gIC8vIFBhcmFtZXRlciBub3JtYWxpemF0aW9uXG4gIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU4NDkjc2VjdGlvbi0zLjQuMS4zLjJcbiAgdmFyIG5vcm1hbGl6ZWQgPSBtYXAocGFyYW1zKVxuICAvLyAxLiAgRmlyc3QsIHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiBlYWNoIHBhcmFtZXRlciBhcmUgZW5jb2RlZFxuICAubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIFsgcmZjMzk4NihwWzBdKSwgcmZjMzk4NihwWzFdIHx8ICcnKSBdXG4gIH0pXG4gIC8vIDIuICBUaGUgcGFyYW1ldGVycyBhcmUgc29ydGVkIGJ5IG5hbWUsIHVzaW5nIGFzY2VuZGluZyBieXRlIHZhbHVlXG4gIC8vICAgICBvcmRlcmluZy4gIElmIHR3byBvciBtb3JlIHBhcmFtZXRlcnMgc2hhcmUgdGhlIHNhbWUgbmFtZSwgdGhleVxuICAvLyAgICAgYXJlIHNvcnRlZCBieSB0aGVpciB2YWx1ZS5cbiAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gY29tcGFyZShhWzBdLCBiWzBdKSB8fCBjb21wYXJlKGFbMV0sIGJbMV0pXG4gIH0pXG4gIC8vIDMuICBUaGUgbmFtZSBvZiBlYWNoIHBhcmFtZXRlciBpcyBjb25jYXRlbmF0ZWQgdG8gaXRzIGNvcnJlc3BvbmRpbmdcbiAgLy8gICAgIHZhbHVlIHVzaW5nIGFuIFwiPVwiIGNoYXJhY3RlciAoQVNDSUkgY29kZSA2MSkgYXMgYSBzZXBhcmF0b3IsIGV2ZW5cbiAgLy8gICAgIGlmIHRoZSB2YWx1ZSBpcyBlbXB0eS5cbiAgLm1hcChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5qb2luKCc9JykgfSlcbiAgIC8vIDQuICBUaGUgc29ydGVkIG5hbWUvdmFsdWUgcGFpcnMgYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciBpbnRvIGFcbiAgIC8vICAgICBzaW5nbGUgc3RyaW5nIGJ5IHVzaW5nIGFuIFwiJlwiIGNoYXJhY3RlciAoQVNDSUkgY29kZSAzOCkgYXNcbiAgIC8vICAgICBzZXBhcmF0b3IuXG4gIC5qb2luKCcmJylcblxuICB2YXIgYmFzZSA9IFtcbiAgICByZmMzOTg2KGh0dHBNZXRob2QgPyBodHRwTWV0aG9kLnRvVXBwZXJDYXNlKCkgOiAnR0VUJyksXG4gICAgcmZjMzk4NihiYXNlX3VyaSksXG4gICAgcmZjMzk4Nihub3JtYWxpemVkKVxuICBdLmpvaW4oJyYnKVxuXG4gIHJldHVybiBiYXNlXG59XG5cbmZ1bmN0aW9uIGhtYWNzaWduIChodHRwTWV0aG9kLCBiYXNlX3VyaSwgcGFyYW1zLCBjb25zdW1lcl9zZWNyZXQsIHRva2VuX3NlY3JldCkge1xuICB2YXIgYmFzZSA9IGdlbmVyYXRlQmFzZShodHRwTWV0aG9kLCBiYXNlX3VyaSwgcGFyYW1zKVxuICB2YXIga2V5ID0gW1xuICAgIGNvbnN1bWVyX3NlY3JldCB8fCAnJyxcbiAgICB0b2tlbl9zZWNyZXQgfHwgJydcbiAgXS5tYXAocmZjMzk4Nikuam9pbignJicpXG5cbiAgcmV0dXJuIHNoYShrZXksIGJhc2UsICdzaGExJylcbn1cblxuZnVuY3Rpb24gaG1hY3NpZ24yNTYgKGh0dHBNZXRob2QsIGJhc2VfdXJpLCBwYXJhbXMsIGNvbnN1bWVyX3NlY3JldCwgdG9rZW5fc2VjcmV0KSB7XG4gIHZhciBiYXNlID0gZ2VuZXJhdGVCYXNlKGh0dHBNZXRob2QsIGJhc2VfdXJpLCBwYXJhbXMpXG4gIHZhciBrZXkgPSBbXG4gICAgY29uc3VtZXJfc2VjcmV0IHx8ICcnLFxuICAgIHRva2VuX3NlY3JldCB8fCAnJ1xuICBdLm1hcChyZmMzOTg2KS5qb2luKCcmJylcblxuICByZXR1cm4gc2hhKGtleSwgYmFzZSwgJ3NoYTI1NicpXG59XG5cbmZ1bmN0aW9uIHJzYXNpZ24gKGh0dHBNZXRob2QsIGJhc2VfdXJpLCBwYXJhbXMsIHByaXZhdGVfa2V5LCB0b2tlbl9zZWNyZXQpIHtcbiAgdmFyIGJhc2UgPSBnZW5lcmF0ZUJhc2UoaHR0cE1ldGhvZCwgYmFzZV91cmksIHBhcmFtcylcbiAgdmFyIGtleSA9IHByaXZhdGVfa2V5IHx8ICcnXG5cbiAgcmV0dXJuIHJzYShrZXksIGJhc2UpXG59XG5cbmZ1bmN0aW9uIHBsYWludGV4dCAoY29uc3VtZXJfc2VjcmV0LCB0b2tlbl9zZWNyZXQpIHtcbiAgdmFyIGtleSA9IFtcbiAgICBjb25zdW1lcl9zZWNyZXQgfHwgJycsXG4gICAgdG9rZW5fc2VjcmV0IHx8ICcnXG4gIF0ubWFwKHJmYzM5ODYpLmpvaW4oJyYnKVxuXG4gIHJldHVybiBrZXlcbn1cblxuZnVuY3Rpb24gc2lnbiAoc2lnbk1ldGhvZCwgaHR0cE1ldGhvZCwgYmFzZV91cmksIHBhcmFtcywgY29uc3VtZXJfc2VjcmV0LCB0b2tlbl9zZWNyZXQpIHtcbiAgdmFyIG1ldGhvZFxuICB2YXIgc2tpcEFyZ3MgPSAxXG5cbiAgc3dpdGNoIChzaWduTWV0aG9kKSB7XG4gICAgY2FzZSAnUlNBLVNIQTEnOlxuICAgICAgbWV0aG9kID0gcnNhc2lnblxuICAgICAgYnJlYWtcbiAgICBjYXNlICdITUFDLVNIQTEnOlxuICAgICAgbWV0aG9kID0gaG1hY3NpZ25cbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnSE1BQy1TSEEyNTYnOlxuICAgICAgbWV0aG9kID0gaG1hY3NpZ24yNTZcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnUExBSU5URVhUJzpcbiAgICAgIG1ldGhvZCA9IHBsYWludGV4dFxuICAgICAgc2tpcEFyZ3MgPSA0XG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG1ldGhvZCBub3Qgc3VwcG9ydGVkOiAnICsgc2lnbk1ldGhvZClcbiAgfVxuXG4gIHJldHVybiBtZXRob2QuYXBwbHkobnVsbCwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIHNraXBBcmdzKSlcbn1cblxuZXhwb3J0cy5obWFjc2lnbiA9IGhtYWNzaWduXG5leHBvcnRzLmhtYWNzaWduMjU2ID0gaG1hY3NpZ24yNTZcbmV4cG9ydHMucnNhc2lnbiA9IHJzYXNpZ25cbmV4cG9ydHMucGxhaW50ZXh0ID0gcGxhaW50ZXh0XG5leHBvcnRzLnNpZ24gPSBzaWduXG5leHBvcnRzLnJmYzM5ODYgPSByZmMzOTg2XG5leHBvcnRzLmdlbmVyYXRlQmFzZSA9IGdlbmVyYXRlQmFzZSIsICIndXNlIHN0cmljdCdcblxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG52YXIgcXMgPSByZXF1aXJlKCdxcycpXG52YXIgY2FzZWxlc3MgPSByZXF1aXJlKCdjYXNlbGVzcycpXG52YXIgdXVpZCA9IHJlcXVpcmUoJ3V1aWQvdjQnKVxudmFyIG9hdXRoID0gcmVxdWlyZSgnb2F1dGgtc2lnbicpXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG5mdW5jdGlvbiBPQXV0aCAocmVxdWVzdCkge1xuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gIHRoaXMucGFyYW1zID0gbnVsbFxufVxuXG5PQXV0aC5wcm90b3R5cGUuYnVpbGRQYXJhbXMgPSBmdW5jdGlvbiAoX29hdXRoLCB1cmksIG1ldGhvZCwgcXVlcnksIGZvcm0sIHFzTGliKSB7XG4gIHZhciBvYSA9IHt9XG4gIGZvciAodmFyIGkgaW4gX29hdXRoKSB7XG4gICAgb2FbJ29hdXRoXycgKyBpXSA9IF9vYXV0aFtpXVxuICB9XG4gIGlmICghb2Eub2F1dGhfdmVyc2lvbikge1xuICAgIG9hLm9hdXRoX3ZlcnNpb24gPSAnMS4wJ1xuICB9XG4gIGlmICghb2Eub2F1dGhfdGltZXN0YW1wKSB7XG4gICAgb2Eub2F1dGhfdGltZXN0YW1wID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkudG9TdHJpbmcoKVxuICB9XG4gIGlmICghb2Eub2F1dGhfbm9uY2UpIHtcbiAgICBvYS5vYXV0aF9ub25jZSA9IHV1aWQoKS5yZXBsYWNlKC8tL2csICcnKVxuICB9XG4gIGlmICghb2Eub2F1dGhfc2lnbmF0dXJlX21ldGhvZCkge1xuICAgIG9hLm9hdXRoX3NpZ25hdHVyZV9tZXRob2QgPSAnSE1BQy1TSEExJ1xuICB9XG5cbiAgdmFyIGNvbnN1bWVyX3NlY3JldF9vcl9wcml2YXRlX2tleSA9IG9hLm9hdXRoX2NvbnN1bWVyX3NlY3JldCB8fCBvYS5vYXV0aF9wcml2YXRlX2tleSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNhbWVsY2FzZVxuICBkZWxldGUgb2Eub2F1dGhfY29uc3VtZXJfc2VjcmV0XG4gIGRlbGV0ZSBvYS5vYXV0aF9wcml2YXRlX2tleVxuXG4gIHZhciB0b2tlbl9zZWNyZXQgPSBvYS5vYXV0aF90b2tlbl9zZWNyZXQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgZGVsZXRlIG9hLm9hdXRoX3Rva2VuX3NlY3JldFxuXG4gIHZhciByZWFsbSA9IG9hLm9hdXRoX3JlYWxtXG4gIGRlbGV0ZSBvYS5vYXV0aF9yZWFsbVxuICBkZWxldGUgb2Eub2F1dGhfdHJhbnNwb3J0X21ldGhvZFxuXG4gIHZhciBiYXNldXJsID0gdXJpLnByb3RvY29sICsgJy8vJyArIHVyaS5ob3N0ICsgdXJpLnBhdGhuYW1lXG4gIHZhciBwYXJhbXMgPSBxc0xpYi5wYXJzZShbXS5jb25jYXQocXVlcnksIGZvcm0sIHFzTGliLnN0cmluZ2lmeShvYSkpLmpvaW4oJyYnKSlcblxuICBvYS5vYXV0aF9zaWduYXR1cmUgPSBvYXV0aC5zaWduKFxuICAgIG9hLm9hdXRoX3NpZ25hdHVyZV9tZXRob2QsXG4gICAgbWV0aG9kLFxuICAgIGJhc2V1cmwsXG4gICAgcGFyYW1zLFxuICAgIGNvbnN1bWVyX3NlY3JldF9vcl9wcml2YXRlX2tleSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgICB0b2tlbl9zZWNyZXQgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgKVxuXG4gIGlmIChyZWFsbSkge1xuICAgIG9hLnJlYWxtID0gcmVhbG1cbiAgfVxuXG4gIHJldHVybiBvYVxufVxuXG5PQXV0aC5wcm90b3R5cGUuYnVpbGRCb2R5SGFzaCA9IGZ1bmN0aW9uIChfb2F1dGgsIGJvZHkpIHtcbiAgaWYgKFsnSE1BQy1TSEExJywgJ1JTQS1TSEExJ10uaW5kZXhPZihfb2F1dGguc2lnbmF0dXJlX21ldGhvZCB8fCAnSE1BQy1TSEExJykgPCAwKSB7XG4gICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdvYXV0aDogJyArIF9vYXV0aC5zaWduYXR1cmVfbWV0aG9kICtcbiAgICAgICcgc2lnbmF0dXJlX21ldGhvZCBub3Qgc3VwcG9ydGVkIHdpdGggYm9keV9oYXNoIHNpZ25pbmcuJykpXG4gIH1cblxuICB2YXIgc2hhc3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKVxuICBzaGFzdW0udXBkYXRlKGJvZHkgfHwgJycpXG4gIHZhciBzaGExID0gc2hhc3VtLmRpZ2VzdCgnaGV4JylcblxuICByZXR1cm4gQnVmZmVyLmZyb20oc2hhMSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxufVxuXG5PQXV0aC5wcm90b3R5cGUuY29uY2F0UGFyYW1zID0gZnVuY3Rpb24gKG9hLCBzZXAsIHdyYXApIHtcbiAgd3JhcCA9IHdyYXAgfHwgJydcblxuICB2YXIgcGFyYW1zID0gT2JqZWN0LmtleXMob2EpLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpICE9PSAncmVhbG0nICYmIGkgIT09ICdvYXV0aF9zaWduYXR1cmUnXG4gIH0pLnNvcnQoKVxuXG4gIGlmIChvYS5yZWFsbSkge1xuICAgIHBhcmFtcy5zcGxpY2UoMCwgMCwgJ3JlYWxtJylcbiAgfVxuICBwYXJhbXMucHVzaCgnb2F1dGhfc2lnbmF0dXJlJylcblxuICByZXR1cm4gcGFyYW1zLm1hcChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBpICsgJz0nICsgd3JhcCArIG9hdXRoLnJmYzM5ODYob2FbaV0pICsgd3JhcFxuICB9KS5qb2luKHNlcClcbn1cblxuT0F1dGgucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uIChfb2F1dGgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYucGFyYW1zID0gX29hdXRoXG5cbiAgdmFyIHVyaSA9IHNlbGYucmVxdWVzdC51cmkgfHwge31cbiAgdmFyIG1ldGhvZCA9IHNlbGYucmVxdWVzdC5tZXRob2QgfHwgJydcbiAgdmFyIGhlYWRlcnMgPSBjYXNlbGVzcyhzZWxmLnJlcXVlc3QuaGVhZGVycylcbiAgdmFyIGJvZHkgPSBzZWxmLnJlcXVlc3QuYm9keSB8fCAnJ1xuICB2YXIgcXNMaWIgPSBzZWxmLnJlcXVlc3QucXNMaWIgfHwgcXNcblxuICB2YXIgZm9ybVxuICB2YXIgcXVlcnlcbiAgdmFyIGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8ICcnXG4gIHZhciBmb3JtQ29udGVudFR5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICB2YXIgdHJhbnNwb3J0ID0gX29hdXRoLnRyYW5zcG9ydF9tZXRob2QgfHwgJ2hlYWRlcidcblxuICBpZiAoY29udGVudFR5cGUuc2xpY2UoMCwgZm9ybUNvbnRlbnRUeXBlLmxlbmd0aCkgPT09IGZvcm1Db250ZW50VHlwZSkge1xuICAgIGNvbnRlbnRUeXBlID0gZm9ybUNvbnRlbnRUeXBlXG4gICAgZm9ybSA9IGJvZHlcbiAgfVxuICBpZiAodXJpLnF1ZXJ5KSB7XG4gICAgcXVlcnkgPSB1cmkucXVlcnlcbiAgfVxuICBpZiAodHJhbnNwb3J0ID09PSAnYm9keScgJiYgKG1ldGhvZCAhPT0gJ1BPU1QnIHx8IGNvbnRlbnRUeXBlICE9PSBmb3JtQ29udGVudFR5cGUpKSB7XG4gICAgc2VsZi5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdvYXV0aDogdHJhbnNwb3J0X21ldGhvZCBvZiBib2R5IHJlcXVpcmVzIFBPU1QgJyArXG4gICAgICAnYW5kIGNvbnRlbnQtdHlwZSAnICsgZm9ybUNvbnRlbnRUeXBlKSlcbiAgfVxuXG4gIGlmICghZm9ybSAmJiB0eXBlb2YgX29hdXRoLmJvZHlfaGFzaCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgX29hdXRoLmJvZHlfaGFzaCA9IHNlbGYuYnVpbGRCb2R5SGFzaChfb2F1dGgsIHNlbGYucmVxdWVzdC5ib2R5LnRvU3RyaW5nKCkpXG4gIH1cblxuICB2YXIgb2EgPSBzZWxmLmJ1aWxkUGFyYW1zKF9vYXV0aCwgdXJpLCBtZXRob2QsIHF1ZXJ5LCBmb3JtLCBxc0xpYilcblxuICBzd2l0Y2ggKHRyYW5zcG9ydCkge1xuICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ09BdXRoICcgKyBzZWxmLmNvbmNhdFBhcmFtcyhvYSwgJywnLCAnXCInKSlcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdxdWVyeSc6XG4gICAgICB2YXIgaHJlZiA9IHNlbGYucmVxdWVzdC51cmkuaHJlZiArPSAocXVlcnkgPyAnJicgOiAnPycpICsgc2VsZi5jb25jYXRQYXJhbXMob2EsICcmJylcbiAgICAgIHNlbGYucmVxdWVzdC51cmkgPSB1cmwucGFyc2UoaHJlZilcbiAgICAgIHNlbGYucmVxdWVzdC5wYXRoID0gc2VsZi5yZXF1ZXN0LnVyaS5wYXRoXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnYm9keSc6XG4gICAgICBzZWxmLnJlcXVlc3QuYm9keSA9IChmb3JtID8gZm9ybSArICcmJyA6ICcnKSArIHNlbGYuY29uY2F0UGFyYW1zKG9hLCAnJicpXG4gICAgICBicmVha1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHNlbGYucmVxdWVzdC5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignb2F1dGg6IHRyYW5zcG9ydF9tZXRob2QgaW52YWxpZCcpKVxuICB9XG59XG5cbmV4cG9ydHMuT0F1dGggPSBPQXV0aFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcblxuZnVuY3Rpb24gcmFuZG9tU3RyaW5nIChzaXplKSB7XG4gIHZhciBiaXRzID0gKHNpemUgKyAxKSAqIDZcbiAgdmFyIGJ1ZmZlciA9IGNyeXB0by5yYW5kb21CeXRlcyhNYXRoLmNlaWwoYml0cyAvIDgpKVxuICB2YXIgc3RyaW5nID0gYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89L2csICcnKVxuICByZXR1cm4gc3RyaW5nLnNsaWNlKDAsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBheWxvYWRIYXNoIChwYXlsb2FkLCBhbGdvcml0aG0sIGNvbnRlbnRUeXBlKSB7XG4gIHZhciBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goYWxnb3JpdGhtKVxuICBoYXNoLnVwZGF0ZSgnaGF3ay4xLnBheWxvYWRcXG4nKVxuICBoYXNoLnVwZGF0ZSgoY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdLnRyaW0oKS50b0xvd2VyQ2FzZSgpIDogJycpICsgJ1xcbicpXG4gIGhhc2gudXBkYXRlKHBheWxvYWQgfHwgJycpXG4gIGhhc2gudXBkYXRlKCdcXG4nKVxuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2Jhc2U2NCcpXG59XG5cbmV4cG9ydHMuY2FsY3VsYXRlTWFjID0gZnVuY3Rpb24gKGNyZWRlbnRpYWxzLCBvcHRzKSB7XG4gIHZhciBub3JtYWxpemVkID0gJ2hhd2suMS5oZWFkZXJcXG4nICtcbiAgICBvcHRzLnRzICsgJ1xcbicgK1xuICAgIG9wdHMubm9uY2UgKyAnXFxuJyArXG4gICAgKG9wdHMubWV0aG9kIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgJ1xcbicgK1xuICAgIG9wdHMucmVzb3VyY2UgKyAnXFxuJyArXG4gICAgb3B0cy5ob3N0LnRvTG93ZXJDYXNlKCkgKyAnXFxuJyArXG4gICAgb3B0cy5wb3J0ICsgJ1xcbicgK1xuICAgIChvcHRzLmhhc2ggfHwgJycpICsgJ1xcbidcblxuICBpZiAob3B0cy5leHQpIHtcbiAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZCArIG9wdHMuZXh0LnJlcGxhY2UoJ1xcXFwnLCAnXFxcXFxcXFwnKS5yZXBsYWNlKCdcXG4nLCAnXFxcXG4nKVxuICB9XG5cbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgKyAnXFxuJ1xuXG4gIGlmIChvcHRzLmFwcCkge1xuICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkICsgb3B0cy5hcHAgKyAnXFxuJyArIChvcHRzLmRsZyB8fCAnJykgKyAnXFxuJ1xuICB9XG5cbiAgdmFyIGhtYWMgPSBjcnlwdG8uY3JlYXRlSG1hYyhjcmVkZW50aWFscy5hbGdvcml0aG0sIGNyZWRlbnRpYWxzLmtleSkudXBkYXRlKG5vcm1hbGl6ZWQpXG4gIHZhciBkaWdlc3QgPSBobWFjLmRpZ2VzdCgnYmFzZTY0JylcbiAgcmV0dXJuIGRpZ2VzdFxufVxuXG5leHBvcnRzLmhlYWRlciA9IGZ1bmN0aW9uICh1cmksIG1ldGhvZCwgb3B0cykge1xuICB2YXIgdGltZXN0YW1wID0gb3B0cy50aW1lc3RhbXAgfHwgTWF0aC5mbG9vcigoRGF0ZS5ub3coKSArIChvcHRzLmxvY2FsdGltZU9mZnNldE1zZWMgfHwgMCkpIC8gMTAwMClcbiAgdmFyIGNyZWRlbnRpYWxzID0gb3B0cy5jcmVkZW50aWFsc1xuICBpZiAoIWNyZWRlbnRpYWxzIHx8ICFjcmVkZW50aWFscy5pZCB8fCAhY3JlZGVudGlhbHMua2V5IHx8ICFjcmVkZW50aWFscy5hbGdvcml0aG0pIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChbJ3NoYTEnLCAnc2hhMjU2J10uaW5kZXhPZihjcmVkZW50aWFscy5hbGdvcml0aG0pID09PSAtMSkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgdmFyIGFydGlmYWN0cyA9IHtcbiAgICB0czogdGltZXN0YW1wLFxuICAgIG5vbmNlOiBvcHRzLm5vbmNlIHx8IHJhbmRvbVN0cmluZyg2KSxcbiAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICByZXNvdXJjZTogdXJpLnBhdGhuYW1lICsgKHVyaS5zZWFyY2ggfHwgJycpLFxuICAgIGhvc3Q6IHVyaS5ob3N0bmFtZSxcbiAgICBwb3J0OiB1cmkucG9ydCB8fCAodXJpLnByb3RvY29sID09PSAnaHR0cDonID8gODAgOiA0NDMpLFxuICAgIGhhc2g6IG9wdHMuaGFzaCxcbiAgICBleHQ6IG9wdHMuZXh0LFxuICAgIGFwcDogb3B0cy5hcHAsXG4gICAgZGxnOiBvcHRzLmRsZ1xuICB9XG5cbiAgaWYgKCFhcnRpZmFjdHMuaGFzaCAmJiAob3B0cy5wYXlsb2FkIHx8IG9wdHMucGF5bG9hZCA9PT0gJycpKSB7XG4gICAgYXJ0aWZhY3RzLmhhc2ggPSBjYWxjdWxhdGVQYXlsb2FkSGFzaChvcHRzLnBheWxvYWQsIGNyZWRlbnRpYWxzLmFsZ29yaXRobSwgb3B0cy5jb250ZW50VHlwZSlcbiAgfVxuXG4gIHZhciBtYWMgPSBleHBvcnRzLmNhbGN1bGF0ZU1hYyhjcmVkZW50aWFscywgYXJ0aWZhY3RzKVxuXG4gIHZhciBoYXNFeHQgPSBhcnRpZmFjdHMuZXh0ICE9PSBudWxsICYmIGFydGlmYWN0cy5leHQgIT09IHVuZGVmaW5lZCAmJiBhcnRpZmFjdHMuZXh0ICE9PSAnJ1xuICB2YXIgaGVhZGVyID0gJ0hhd2sgaWQ9XCInICsgY3JlZGVudGlhbHMuaWQgK1xuICAgICdcIiwgdHM9XCInICsgYXJ0aWZhY3RzLnRzICtcbiAgICAnXCIsIG5vbmNlPVwiJyArIGFydGlmYWN0cy5ub25jZSArXG4gICAgKGFydGlmYWN0cy5oYXNoID8gJ1wiLCBoYXNoPVwiJyArIGFydGlmYWN0cy5oYXNoIDogJycpICtcbiAgICAoaGFzRXh0ID8gJ1wiLCBleHQ9XCInICsgYXJ0aWZhY3RzLmV4dC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKSA6ICcnKSArXG4gICAgJ1wiLCBtYWM9XCInICsgbWFjICsgJ1wiJ1xuXG4gIGlmIChhcnRpZmFjdHMuYXBwKSB7XG4gICAgaGVhZGVyID0gaGVhZGVyICsgJywgYXBwPVwiJyArIGFydGlmYWN0cy5hcHAgKyAoYXJ0aWZhY3RzLmRsZyA/ICdcIiwgZGxnPVwiJyArIGFydGlmYWN0cy5kbGcgOiAnJykgKyAnXCInXG4gIH1cblxuICByZXR1cm4gaGVhZGVyXG59XG4iLCAidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlbGF5ZWRTdHJlYW07XG5mdW5jdGlvbiBEZWxheWVkU3RyZWFtKCkge1xuICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gIHRoaXMuZGF0YVNpemUgPSAwO1xuICB0aGlzLm1heERhdGFTaXplID0gMTAyNCAqIDEwMjQ7XG4gIHRoaXMucGF1c2VTdHJlYW0gPSB0cnVlO1xuXG4gIHRoaXMuX21heERhdGFTaXplRXhjZWVkZWQgPSBmYWxzZTtcbiAgdGhpcy5fcmVsZWFzZWQgPSBmYWxzZTtcbiAgdGhpcy5fYnVmZmVyZWRFdmVudHMgPSBbXTtcbn1cbnV0aWwuaW5oZXJpdHMoRGVsYXllZFN0cmVhbSwgU3RyZWFtKTtcblxuRGVsYXllZFN0cmVhbS5jcmVhdGUgPSBmdW5jdGlvbihzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGRlbGF5ZWRTdHJlYW0gPSBuZXcgdGhpcygpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIGRlbGF5ZWRTdHJlYW1bb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgfVxuXG4gIGRlbGF5ZWRTdHJlYW0uc291cmNlID0gc291cmNlO1xuXG4gIHZhciByZWFsRW1pdCA9IHNvdXJjZS5lbWl0O1xuICBzb3VyY2UuZW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgIGRlbGF5ZWRTdHJlYW0uX2hhbmRsZUVtaXQoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gcmVhbEVtaXQuYXBwbHkoc291cmNlLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHNvdXJjZS5vbignZXJyb3InLCBmdW5jdGlvbigpIHt9KTtcbiAgaWYgKGRlbGF5ZWRTdHJlYW0ucGF1c2VTdHJlYW0pIHtcbiAgICBzb3VyY2UucGF1c2UoKTtcbiAgfVxuXG4gIHJldHVybiBkZWxheWVkU3RyZWFtO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KERlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLCAncmVhZGFibGUnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2UucmVhZGFibGU7XG4gIH1cbn0pO1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2Uuc2V0RW5jb2RpbmcuYXBwbHkodGhpcy5zb3VyY2UsIGFyZ3VtZW50cyk7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9yZWxlYXNlZCkge1xuICAgIHRoaXMucmVsZWFzZSgpO1xuICB9XG5cbiAgdGhpcy5zb3VyY2UucmVzdW1lKCk7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNvdXJjZS5wYXVzZSgpO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZWxlYXNlZCA9IHRydWU7XG5cbiAgdGhpcy5fYnVmZmVyZWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbihhcmdzKSB7XG4gICAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9LmJpbmQodGhpcykpO1xuICB0aGlzLl9idWZmZXJlZEV2ZW50cyA9IFtdO1xufTtcblxuRGVsYXllZFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgciA9IFN0cmVhbS5wcm90b3R5cGUucGlwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB0aGlzLnJlc3VtZSgpO1xuICByZXR1cm4gcjtcbn07XG5cbkRlbGF5ZWRTdHJlYW0ucHJvdG90eXBlLl9oYW5kbGVFbWl0ID0gZnVuY3Rpb24oYXJncykge1xuICBpZiAodGhpcy5fcmVsZWFzZWQpIHtcbiAgICB0aGlzLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFyZ3NbMF0gPT09ICdkYXRhJykge1xuICAgIHRoaXMuZGF0YVNpemUgKz0gYXJnc1sxXS5sZW5ndGg7XG4gICAgdGhpcy5fY2hlY2tJZk1heERhdGFTaXplRXhjZWVkZWQoKTtcbiAgfVxuXG4gIHRoaXMuX2J1ZmZlcmVkRXZlbnRzLnB1c2goYXJncyk7XG59O1xuXG5EZWxheWVkU3RyZWFtLnByb3RvdHlwZS5fY2hlY2tJZk1heERhdGFTaXplRXhjZWVkZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX21heERhdGFTaXplRXhjZWVkZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5kYXRhU2l6ZSA8PSB0aGlzLm1heERhdGFTaXplKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fbWF4RGF0YVNpemVFeGNlZWRlZCA9IHRydWU7XG4gIHZhciBtZXNzYWdlID1cbiAgICAnRGVsYXllZFN0cmVhbSNtYXhEYXRhU2l6ZSBvZiAnICsgdGhpcy5tYXhEYXRhU2l6ZSArICcgYnl0ZXMgZXhjZWVkZWQuJ1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKG1lc3NhZ2UpKTtcbn07XG4iLCAidmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtO1xudmFyIERlbGF5ZWRTdHJlYW0gPSByZXF1aXJlKCdkZWxheWVkLXN0cmVhbScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbWJpbmVkU3RyZWFtO1xuZnVuY3Rpb24gQ29tYmluZWRTdHJlYW0oKSB7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuZGF0YVNpemUgPSAwO1xuICB0aGlzLm1heERhdGFTaXplID0gMiAqIDEwMjQgKiAxMDI0O1xuICB0aGlzLnBhdXNlU3RyZWFtcyA9IHRydWU7XG5cbiAgdGhpcy5fcmVsZWFzZWQgPSBmYWxzZTtcbiAgdGhpcy5fc3RyZWFtcyA9IFtdO1xuICB0aGlzLl9jdXJyZW50U3RyZWFtID0gbnVsbDtcbiAgdGhpcy5faW5zaWRlTG9vcCA9IGZhbHNlO1xuICB0aGlzLl9wZW5kaW5nTmV4dCA9IGZhbHNlO1xufVxudXRpbC5pbmhlcml0cyhDb21iaW5lZFN0cmVhbSwgU3RyZWFtKTtcblxuQ29tYmluZWRTdHJlYW0uY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgY29tYmluZWRTdHJlYW0gPSBuZXcgdGhpcygpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgIGNvbWJpbmVkU3RyZWFtW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gIH1cblxuICByZXR1cm4gY29tYmluZWRTdHJlYW07XG59O1xuXG5Db21iaW5lZFN0cmVhbS5pc1N0cmVhbUxpa2UgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3RyZWFtICE9PSAnZnVuY3Rpb24nKVxuICAgICYmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJylcbiAgICAmJiAodHlwZW9mIHN0cmVhbSAhPT0gJ2Jvb2xlYW4nKVxuICAgICYmICh0eXBlb2Ygc3RyZWFtICE9PSAnbnVtYmVyJylcbiAgICAmJiAoIUJ1ZmZlci5pc0J1ZmZlcihzdHJlYW0pKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdmFyIGlzU3RyZWFtTGlrZSA9IENvbWJpbmVkU3RyZWFtLmlzU3RyZWFtTGlrZShzdHJlYW0pO1xuXG4gIGlmIChpc1N0cmVhbUxpa2UpIHtcbiAgICBpZiAoIShzdHJlYW0gaW5zdGFuY2VvZiBEZWxheWVkU3RyZWFtKSkge1xuICAgICAgdmFyIG5ld1N0cmVhbSA9IERlbGF5ZWRTdHJlYW0uY3JlYXRlKHN0cmVhbSwge1xuICAgICAgICBtYXhEYXRhU2l6ZTogSW5maW5pdHksXG4gICAgICAgIHBhdXNlU3RyZWFtOiB0aGlzLnBhdXNlU3RyZWFtcyxcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLm9uKCdkYXRhJywgdGhpcy5fY2hlY2tEYXRhU2l6ZS5iaW5kKHRoaXMpKTtcbiAgICAgIHN0cmVhbSA9IG5ld1N0cmVhbTtcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVFcnJvcnMoc3RyZWFtKTtcblxuICAgIGlmICh0aGlzLnBhdXNlU3RyZWFtcykge1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fc3RyZWFtcy5wdXNoKHN0cmVhbSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIFN0cmVhbS5wcm90b3R5cGUucGlwZS5jYWxsKHRoaXMsIGRlc3QsIG9wdGlvbnMpO1xuICB0aGlzLnJlc3VtZSgpO1xuICByZXR1cm4gZGVzdDtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fZ2V0TmV4dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jdXJyZW50U3RyZWFtID0gbnVsbDtcblxuICBpZiAodGhpcy5faW5zaWRlTG9vcCkge1xuICAgIHRoaXMuX3BlbmRpbmdOZXh0ID0gdHJ1ZTtcbiAgICByZXR1cm47IC8vIGRlZmVyIGNhbGxcbiAgfVxuXG4gIHRoaXMuX2luc2lkZUxvb3AgPSB0cnVlO1xuICB0cnkge1xuICAgIGRvIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdOZXh0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9yZWFsR2V0TmV4dCgpO1xuICAgIH0gd2hpbGUgKHRoaXMuX3BlbmRpbmdOZXh0KTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9pbnNpZGVMb29wID0gZmFsc2U7XG4gIH1cbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fcmVhbEdldE5leHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cmVhbSA9IHRoaXMuX3N0cmVhbXMuc2hpZnQoKTtcblxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtID09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5lbmQoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX3BpcGVOZXh0KHN0cmVhbSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldFN0cmVhbSA9IHN0cmVhbTtcbiAgZ2V0U3RyZWFtKGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgIHZhciBpc1N0cmVhbUxpa2UgPSBDb21iaW5lZFN0cmVhbS5pc1N0cmVhbUxpa2Uoc3RyZWFtKTtcbiAgICBpZiAoaXNTdHJlYW1MaWtlKSB7XG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCB0aGlzLl9jaGVja0RhdGFTaXplLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5faGFuZGxlRXJyb3JzKHN0cmVhbSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGlwZU5leHQoc3RyZWFtKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fcGlwZU5leHQgPSBmdW5jdGlvbihzdHJlYW0pIHtcbiAgdGhpcy5fY3VycmVudFN0cmVhbSA9IHN0cmVhbTtcblxuICB2YXIgaXNTdHJlYW1MaWtlID0gQ29tYmluZWRTdHJlYW0uaXNTdHJlYW1MaWtlKHN0cmVhbSk7XG4gIGlmIChpc1N0cmVhbUxpa2UpIHtcbiAgICBzdHJlYW0ub24oJ2VuZCcsIHRoaXMuX2dldE5leHQuYmluZCh0aGlzKSk7XG4gICAgc3RyZWFtLnBpcGUodGhpcywge2VuZDogZmFsc2V9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdmFsdWUgPSBzdHJlYW07XG4gIHRoaXMud3JpdGUodmFsdWUpO1xuICB0aGlzLl9nZXROZXh0KCk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX2hhbmRsZUVycm9ycyA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzZWxmLl9lbWl0RXJyb3IoZXJyKTtcbiAgfSk7XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5wYXVzZVN0cmVhbXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZih0aGlzLnBhdXNlU3RyZWFtcyAmJiB0aGlzLl9jdXJyZW50U3RyZWFtICYmIHR5cGVvZih0aGlzLl9jdXJyZW50U3RyZWFtLnBhdXNlKSA9PSAnZnVuY3Rpb24nKSB0aGlzLl9jdXJyZW50U3RyZWFtLnBhdXNlKCk7XG4gIHRoaXMuZW1pdCgncGF1c2UnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9yZWxlYXNlZCkge1xuICAgIHRoaXMuX3JlbGVhc2VkID0gdHJ1ZTtcbiAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLl9nZXROZXh0KCk7XG4gIH1cblxuICBpZih0aGlzLnBhdXNlU3RyZWFtcyAmJiB0aGlzLl9jdXJyZW50U3RyZWFtICYmIHR5cGVvZih0aGlzLl9jdXJyZW50U3RyZWFtLnJlc3VtZSkgPT0gJ2Z1bmN0aW9uJykgdGhpcy5fY3VycmVudFN0cmVhbS5yZXN1bWUoKTtcbiAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5lbWl0KCdlbmQnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbn07XG5cbkNvbWJpbmVkU3RyZWFtLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLl9zdHJlYW1zID0gW107XG4gIHRoaXMuX2N1cnJlbnRTdHJlYW0gPSBudWxsO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl9jaGVja0RhdGFTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3VwZGF0ZURhdGFTaXplKCk7XG4gIGlmICh0aGlzLmRhdGFTaXplIDw9IHRoaXMubWF4RGF0YVNpemUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWVzc2FnZSA9XG4gICAgJ0RlbGF5ZWRTdHJlYW0jbWF4RGF0YVNpemUgb2YgJyArIHRoaXMubWF4RGF0YVNpemUgKyAnIGJ5dGVzIGV4Y2VlZGVkLic7XG4gIHRoaXMuX2VtaXRFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xufTtcblxuQ29tYmluZWRTdHJlYW0ucHJvdG90eXBlLl91cGRhdGVEYXRhU2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRhdGFTaXplID0gMDtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX3N0cmVhbXMuZm9yRWFjaChmdW5jdGlvbihzdHJlYW0pIHtcbiAgICBpZiAoIXN0cmVhbS5kYXRhU2l6ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGYuZGF0YVNpemUgKz0gc3RyZWFtLmRhdGFTaXplO1xuICB9KTtcblxuICBpZiAodGhpcy5fY3VycmVudFN0cmVhbSAmJiB0aGlzLl9jdXJyZW50U3RyZWFtLmRhdGFTaXplKSB7XG4gICAgdGhpcy5kYXRhU2l6ZSArPSB0aGlzLl9jdXJyZW50U3RyZWFtLmRhdGFTaXplO1xuICB9XG59O1xuXG5Db21iaW5lZFN0cmVhbS5wcm90b3R5cGUuX2VtaXRFcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciB1dWlkID0gcmVxdWlyZSgndXVpZC92NCcpXG52YXIgQ29tYmluZWRTdHJlYW0gPSByZXF1aXJlKCdjb21iaW5lZC1zdHJlYW0nKVxudmFyIGlzc3RyZWFtID0gcmVxdWlyZSgnaXNzdHJlYW0nKVxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5cbmZ1bmN0aW9uIE11bHRpcGFydCAocmVxdWVzdCkge1xuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gIHRoaXMuYm91bmRhcnkgPSB1dWlkKClcbiAgdGhpcy5jaHVua2VkID0gZmFsc2VcbiAgdGhpcy5ib2R5ID0gbnVsbFxufVxuXG5NdWx0aXBhcnQucHJvdG90eXBlLmlzQ2h1bmtlZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgY2h1bmtlZCA9IGZhbHNlXG4gIHZhciBwYXJ0cyA9IG9wdGlvbnMuZGF0YSB8fCBvcHRpb25zXG5cbiAgaWYgKCFwYXJ0cy5mb3JFYWNoKSB7XG4gICAgc2VsZi5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdBcmd1bWVudCBlcnJvciwgb3B0aW9ucy5tdWx0aXBhcnQuJykpXG4gIH1cblxuICBpZiAob3B0aW9ucy5jaHVua2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjaHVua2VkID0gb3B0aW9ucy5jaHVua2VkXG4gIH1cblxuICBpZiAoc2VsZi5yZXF1ZXN0LmdldEhlYWRlcigndHJhbnNmZXItZW5jb2RpbmcnKSA9PT0gJ2NodW5rZWQnKSB7XG4gICAgY2h1bmtlZCA9IHRydWVcbiAgfVxuXG4gIGlmICghY2h1bmtlZCkge1xuICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5ib2R5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLnJlcXVlc3QuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0JvZHkgYXR0cmlidXRlIG1pc3NpbmcgaW4gbXVsdGlwYXJ0LicpKVxuICAgICAgfVxuICAgICAgaWYgKGlzc3RyZWFtKHBhcnQuYm9keSkpIHtcbiAgICAgICAgY2h1bmtlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGNodW5rZWRcbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5zZXRIZWFkZXJzID0gZnVuY3Rpb24gKGNodW5rZWQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgaWYgKGNodW5rZWQgJiYgIXNlbGYucmVxdWVzdC5oYXNIZWFkZXIoJ3RyYW5zZmVyLWVuY29kaW5nJykpIHtcbiAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCd0cmFuc2Zlci1lbmNvZGluZycsICdjaHVua2VkJylcbiAgfVxuXG4gIHZhciBoZWFkZXIgPSBzZWxmLnJlcXVlc3QuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKVxuXG4gIGlmICghaGVhZGVyIHx8IGhlYWRlci5pbmRleE9mKCdtdWx0aXBhcnQnKSA9PT0gLTEpIHtcbiAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnbXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PScgKyBzZWxmLmJvdW5kYXJ5KVxuICB9IGVsc2Uge1xuICAgIGlmIChoZWFkZXIuaW5kZXhPZignYm91bmRhcnknKSAhPT0gLTEpIHtcbiAgICAgIHNlbGYuYm91bmRhcnkgPSBoZWFkZXIucmVwbGFjZSgvLipib3VuZGFyeT0oW15cXHM7XSspLiovLCAnJDEnKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnJlcXVlc3Quc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCBoZWFkZXIgKyAnOyBib3VuZGFyeT0nICsgc2VsZi5ib3VuZGFyeSlcbiAgICB9XG4gIH1cbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChwYXJ0cywgY2h1bmtlZCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIGJvZHkgPSBjaHVua2VkID8gbmV3IENvbWJpbmVkU3RyZWFtKCkgOiBbXVxuXG4gIGZ1bmN0aW9uIGFkZCAocGFydCkge1xuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHBhcnQgPSBwYXJ0LnRvU3RyaW5nKClcbiAgICB9XG4gICAgcmV0dXJuIGNodW5rZWQgPyBib2R5LmFwcGVuZChwYXJ0KSA6IGJvZHkucHVzaChCdWZmZXIuZnJvbShwYXJ0KSlcbiAgfVxuXG4gIGlmIChzZWxmLnJlcXVlc3QucHJlYW1ibGVDUkxGKSB7XG4gICAgYWRkKCdcXHJcXG4nKVxuICB9XG5cbiAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuICAgIHZhciBwcmVhbWJsZSA9ICctLScgKyBzZWxmLmJvdW5kYXJ5ICsgJ1xcclxcbidcbiAgICBPYmplY3Qua2V5cyhwYXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdib2R5JykgeyByZXR1cm4gfVxuICAgICAgcHJlYW1ibGUgKz0ga2V5ICsgJzogJyArIHBhcnRba2V5XSArICdcXHJcXG4nXG4gICAgfSlcbiAgICBwcmVhbWJsZSArPSAnXFxyXFxuJ1xuICAgIGFkZChwcmVhbWJsZSlcbiAgICBhZGQocGFydC5ib2R5KVxuICAgIGFkZCgnXFxyXFxuJylcbiAgfSlcbiAgYWRkKCctLScgKyBzZWxmLmJvdW5kYXJ5ICsgJy0tJylcblxuICBpZiAoc2VsZi5yZXF1ZXN0LnBvc3RhbWJsZUNSTEYpIHtcbiAgICBhZGQoJ1xcclxcbicpXG4gIH1cblxuICByZXR1cm4gYm9keVxufVxuXG5NdWx0aXBhcnQucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIHZhciBjaHVua2VkID0gc2VsZi5pc0NodW5rZWQob3B0aW9ucylcbiAgdmFyIHBhcnRzID0gb3B0aW9ucy5kYXRhIHx8IG9wdGlvbnNcblxuICBzZWxmLnNldEhlYWRlcnMoY2h1bmtlZClcbiAgc2VsZi5jaHVua2VkID0gY2h1bmtlZFxuICBzZWxmLmJvZHkgPSBzZWxmLmJ1aWxkKHBhcnRzLCBjaHVua2VkKVxufVxuXG5leHBvcnRzLk11bHRpcGFydCA9IE11bHRpcGFydFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcbnZhciBpc1VybCA9IC9eaHR0cHM/Oi9cblxuZnVuY3Rpb24gUmVkaXJlY3QgKHJlcXVlc3QpIHtcbiAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICB0aGlzLmZvbGxvd1JlZGlyZWN0ID0gdHJ1ZVxuICB0aGlzLmZvbGxvd1JlZGlyZWN0cyA9IHRydWVcbiAgdGhpcy5mb2xsb3dBbGxSZWRpcmVjdHMgPSBmYWxzZVxuICB0aGlzLmZvbGxvd09yaWdpbmFsSHR0cE1ldGhvZCA9IGZhbHNlXG4gIHRoaXMuYWxsb3dSZWRpcmVjdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfVxuICB0aGlzLm1heFJlZGlyZWN0cyA9IDEwXG4gIHRoaXMucmVkaXJlY3RzID0gW11cbiAgdGhpcy5yZWRpcmVjdHNGb2xsb3dlZCA9IDBcbiAgdGhpcy5yZW1vdmVSZWZlcmVySGVhZGVyID0gZmFsc2Vcbn1cblxuUmVkaXJlY3QucHJvdG90eXBlLm9uUmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChvcHRpb25zLm1heFJlZGlyZWN0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5tYXhSZWRpcmVjdHMgPSBvcHRpb25zLm1heFJlZGlyZWN0c1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5mb2xsb3dSZWRpcmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNlbGYuYWxsb3dSZWRpcmVjdCA9IG9wdGlvbnMuZm9sbG93UmVkaXJlY3RcbiAgfVxuICBpZiAob3B0aW9ucy5mb2xsb3dSZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5mb2xsb3dSZWRpcmVjdHMgPSAhIW9wdGlvbnMuZm9sbG93UmVkaXJlY3RcbiAgfVxuICBpZiAob3B0aW9ucy5mb2xsb3dBbGxSZWRpcmVjdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHNlbGYuZm9sbG93QWxsUmVkaXJlY3RzID0gb3B0aW9ucy5mb2xsb3dBbGxSZWRpcmVjdHNcbiAgfVxuICBpZiAoc2VsZi5mb2xsb3dSZWRpcmVjdHMgfHwgc2VsZi5mb2xsb3dBbGxSZWRpcmVjdHMpIHtcbiAgICBzZWxmLnJlZGlyZWN0cyA9IHNlbGYucmVkaXJlY3RzIHx8IFtdXG4gIH1cbiAgaWYgKG9wdGlvbnMucmVtb3ZlUmVmZXJlckhlYWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2VsZi5yZW1vdmVSZWZlcmVySGVhZGVyID0gb3B0aW9ucy5yZW1vdmVSZWZlcmVySGVhZGVyXG4gIH1cbiAgaWYgKG9wdGlvbnMuZm9sbG93T3JpZ2luYWxIdHRwTWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZWxmLmZvbGxvd09yaWdpbmFsSHR0cE1ldGhvZCA9IG9wdGlvbnMuZm9sbG93T3JpZ2luYWxIdHRwTWV0aG9kXG4gIH1cbn1cblxuUmVkaXJlY3QucHJvdG90eXBlLnJlZGlyZWN0VG8gPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXF1ZXN0ID0gc2VsZi5yZXF1ZXN0XG5cbiAgdmFyIHJlZGlyZWN0VG8gPSBudWxsXG4gIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID49IDMwMCAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDwgNDAwICYmIHJlc3BvbnNlLmNhc2VsZXNzLmhhcygnbG9jYXRpb24nKSkge1xuICAgIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmNhc2VsZXNzLmdldCgnbG9jYXRpb24nKVxuICAgIHJlcXVlc3QuZGVidWcoJ3JlZGlyZWN0JywgbG9jYXRpb24pXG5cbiAgICBpZiAoc2VsZi5mb2xsb3dBbGxSZWRpcmVjdHMpIHtcbiAgICAgIHJlZGlyZWN0VG8gPSBsb2NhdGlvblxuICAgIH0gZWxzZSBpZiAoc2VsZi5mb2xsb3dSZWRpcmVjdHMpIHtcbiAgICAgIHN3aXRjaCAocmVxdWVzdC5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnUEFUQ0gnOlxuICAgICAgICBjYXNlICdQVVQnOlxuICAgICAgICBjYXNlICdQT1NUJzpcbiAgICAgICAgY2FzZSAnREVMRVRFJzpcbiAgICAgICAgICAvLyBEbyBub3QgZm9sbG93IHJlZGlyZWN0c1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVkaXJlY3RUbyA9IGxvY2F0aW9uXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxKSB7XG4gICAgdmFyIGF1dGhIZWFkZXIgPSByZXF1ZXN0Ll9hdXRoLm9uUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgaWYgKGF1dGhIZWFkZXIpIHtcbiAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCdhdXRob3JpemF0aW9uJywgYXV0aEhlYWRlcilcbiAgICAgIHJlZGlyZWN0VG8gPSByZXF1ZXN0LnVyaVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVkaXJlY3RUb1xufVxuXG5SZWRpcmVjdC5wcm90b3R5cGUub25SZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHJlcXVlc3QgPSBzZWxmLnJlcXVlc3RcblxuICB2YXIgcmVkaXJlY3RUbyA9IHNlbGYucmVkaXJlY3RUbyhyZXNwb25zZSlcbiAgaWYgKCFyZWRpcmVjdFRvIHx8ICFzZWxmLmFsbG93UmVkaXJlY3QuY2FsbChyZXF1ZXN0LCByZXNwb25zZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJlcXVlc3QuZGVidWcoJ3JlZGlyZWN0IHRvJywgcmVkaXJlY3RUbylcblxuICAvLyBpZ25vcmUgYW55IHBvdGVudGlhbCByZXNwb25zZSBib2R5LiAgaXQgY2Fubm90IHBvc3NpYmx5IGJlIHVzZWZ1bFxuICAvLyB0byB1cyBhdCB0aGlzIHBvaW50LlxuICAvLyByZXNwb25zZS5yZXN1bWUgc2hvdWxkIGJlIGRlZmluZWQsIGJ1dCBjaGVjayBhbnl3YXkgYmVmb3JlIGNhbGxpbmcuIFdvcmthcm91bmQgZm9yIGJyb3dzZXJpZnkuXG4gIGlmIChyZXNwb25zZS5yZXN1bWUpIHtcbiAgICByZXNwb25zZS5yZXN1bWUoKVxuICB9XG5cbiAgaWYgKHNlbGYucmVkaXJlY3RzRm9sbG93ZWQgPj0gc2VsZi5tYXhSZWRpcmVjdHMpIHtcbiAgICByZXF1ZXN0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdFeGNlZWRlZCBtYXhSZWRpcmVjdHMuIFByb2JhYmx5IHN0dWNrIGluIGEgcmVkaXJlY3QgbG9vcCAnICsgcmVxdWVzdC51cmkuaHJlZikpXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgc2VsZi5yZWRpcmVjdHNGb2xsb3dlZCArPSAxXG5cbiAgaWYgKCFpc1VybC50ZXN0KHJlZGlyZWN0VG8pKSB7XG4gICAgcmVkaXJlY3RUbyA9IHVybC5yZXNvbHZlKHJlcXVlc3QudXJpLmhyZWYsIHJlZGlyZWN0VG8pXG4gIH1cblxuICB2YXIgdXJpUHJldiA9IHJlcXVlc3QudXJpXG4gIHJlcXVlc3QudXJpID0gdXJsLnBhcnNlKHJlZGlyZWN0VG8pXG5cbiAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGNoYW5nZSBwcm90b2NvbCBmcm9tIGh0dHBzIHRvIGh0dHAgb3IgdmljZSB2ZXJzYVxuICBpZiAocmVxdWVzdC51cmkucHJvdG9jb2wgIT09IHVyaVByZXYucHJvdG9jb2wpIHtcbiAgICBkZWxldGUgcmVxdWVzdC5hZ2VudFxuICB9XG5cbiAgc2VsZi5yZWRpcmVjdHMucHVzaCh7IHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlZGlyZWN0VXJpOiByZWRpcmVjdFRvIH0pXG5cbiAgaWYgKHNlbGYuZm9sbG93QWxsUmVkaXJlY3RzICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcgJiZcbiAgICByZXNwb25zZS5zdGF0dXNDb2RlICE9PSA0MDEgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMzA3KSB7XG4gICAgcmVxdWVzdC5tZXRob2QgPSBzZWxmLmZvbGxvd09yaWdpbmFsSHR0cE1ldGhvZCA/IHJlcXVlc3QubWV0aG9kIDogJ0dFVCdcbiAgfVxuICAvLyByZXF1ZXN0Lm1ldGhvZCA9ICdHRVQnIC8vIEZvcmNlIGFsbCByZWRpcmVjdHMgdG8gdXNlIEdFVCB8fCBjb21tZW50ZWQgb3V0IGZpeGVzICMyMTVcbiAgZGVsZXRlIHJlcXVlc3Quc3JjXG4gIGRlbGV0ZSByZXF1ZXN0LnJlcVxuICBkZWxldGUgcmVxdWVzdC5fc3RhcnRlZFxuICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gNDAxICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDMwNykge1xuICAgIC8vIFJlbW92ZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHByZXZpb3VzIHJlc3BvbnNlLCB1bmxlc3MgdGhpcyBpcyB0aGUgc2Vjb25kIHJlcXVlc3RcbiAgICAvLyBmb3IgYSBzZXJ2ZXIgdGhhdCByZXF1aXJlcyBkaWdlc3QgYXV0aGVudGljYXRpb24uXG4gICAgZGVsZXRlIHJlcXVlc3QuYm9keVxuICAgIGRlbGV0ZSByZXF1ZXN0Ll9mb3JtXG4gICAgaWYgKHJlcXVlc3QuaGVhZGVycykge1xuICAgICAgcmVxdWVzdC5yZW1vdmVIZWFkZXIoJ2hvc3QnKVxuICAgICAgcmVxdWVzdC5yZW1vdmVIZWFkZXIoJ2NvbnRlbnQtdHlwZScpXG4gICAgICByZXF1ZXN0LnJlbW92ZUhlYWRlcignY29udGVudC1sZW5ndGgnKVxuICAgICAgaWYgKHJlcXVlc3QudXJpLmhvc3RuYW1lICE9PSByZXF1ZXN0Lm9yaWdpbmFsSG9zdC5zcGxpdCgnOicpWzBdKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhdXRob3JpemF0aW9uIGlmIGNoYW5naW5nIGhvc3RuYW1lcyAoYnV0IG5vdCBpZiBqdXN0XG4gICAgICAgIC8vIGNoYW5naW5nIHBvcnRzIG9yIHByb3RvY29scykuICBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIGN1cmw6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWdkZXIvY3VybC9ibG9iLzZiZWIwZWVlL2xpYi9odHRwLmMjTDcxMFxuICAgICAgICByZXF1ZXN0LnJlbW92ZUhlYWRlcignYXV0aG9yaXphdGlvbicpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFzZWxmLnJlbW92ZVJlZmVyZXJIZWFkZXIpIHtcbiAgICByZXF1ZXN0LnNldEhlYWRlcigncmVmZXJlcicsIHVyaVByZXYuaHJlZilcbiAgfVxuXG4gIHJlcXVlc3QuZW1pdCgncmVkaXJlY3QnKVxuXG4gIHJlcXVlc3QuaW5pdCgpXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0cy5SZWRpcmVjdCA9IFJlZGlyZWN0XG4iLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBuZXQgPSByZXF1aXJlKCduZXQnKVxuICAsIHRscyA9IHJlcXVpcmUoJ3RscycpXG4gICwgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxuICAsIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKVxuICAsIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpXG4gICwgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbiAgLCB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG4gICwgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbiAgO1xuXG5leHBvcnRzLmh0dHBPdmVySHR0cCA9IGh0dHBPdmVySHR0cFxuZXhwb3J0cy5odHRwc092ZXJIdHRwID0gaHR0cHNPdmVySHR0cFxuZXhwb3J0cy5odHRwT3Zlckh0dHBzID0gaHR0cE92ZXJIdHRwc1xuZXhwb3J0cy5odHRwc092ZXJIdHRwcyA9IGh0dHBzT3Zlckh0dHBzXG5cblxuZnVuY3Rpb24gaHR0cE92ZXJIdHRwKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpXG4gIGFnZW50LnJlcXVlc3QgPSBodHRwLnJlcXVlc3RcbiAgcmV0dXJuIGFnZW50XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHAob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucylcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdFxuICBhZ2VudC5jcmVhdGVTb2NrZXQgPSBjcmVhdGVTZWN1cmVTb2NrZXRcbiAgYWdlbnQuZGVmYXVsdFBvcnQgPSA0NDNcbiAgcmV0dXJuIGFnZW50XG59XG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cHMob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucylcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHBzLnJlcXVlc3RcbiAgcmV0dXJuIGFnZW50XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpXG4gIGFnZW50LnJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0XG4gIGFnZW50LmNyZWF0ZVNvY2tldCA9IGNyZWF0ZVNlY3VyZVNvY2tldFxuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0M1xuICByZXR1cm4gYWdlbnRcbn1cblxuXG5mdW5jdGlvbiBUdW5uZWxpbmdBZ2VudChvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHNlbGYucHJveHlPcHRpb25zID0gc2VsZi5vcHRpb25zLnByb3h5IHx8IHt9XG4gIHNlbGYubWF4U29ja2V0cyA9IHNlbGYub3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuQWdlbnQuZGVmYXVsdE1heFNvY2tldHNcbiAgc2VsZi5yZXF1ZXN0cyA9IFtdXG4gIHNlbGYuc29ja2V0cyA9IFtdXG5cbiAgc2VsZi5vbignZnJlZScsIGZ1bmN0aW9uIG9uRnJlZShzb2NrZXQsIGhvc3QsIHBvcnQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5yZXF1ZXN0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgdmFyIHBlbmRpbmcgPSBzZWxmLnJlcXVlc3RzW2ldXG4gICAgICBpZiAocGVuZGluZy5ob3N0ID09PSBob3N0ICYmIHBlbmRpbmcucG9ydCA9PT0gcG9ydCkge1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHJlcXVlc3QgdG8gY29ubmVjdCBzYW1lIG9yaWdpbiBzZXJ2ZXIsXG4gICAgICAgIC8vIHJldXNlIHRoZSBjb25uZWN0aW9uLlxuICAgICAgICBzZWxmLnJlcXVlc3RzLnNwbGljZShpLCAxKVxuICAgICAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgc29ja2V0LmRlc3Ryb3koKVxuICAgIHNlbGYucmVtb3ZlU29ja2V0KHNvY2tldClcbiAgfSlcbn1cbnV0aWwuaW5oZXJpdHMoVHVubmVsaW5nQWdlbnQsIGV2ZW50cy5FdmVudEVtaXR0ZXIpXG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdChyZXEsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgIC8vIExlZ2FjeSBBUEk6IGFkZFJlcXVlc3QocmVxLCBob3N0LCBwb3J0LCBwYXRoKVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGhvc3Q6IG9wdGlvbnMsXG4gICAgICBwb3J0OiBhcmd1bWVudHNbMl0sXG4gICAgICBwYXRoOiBhcmd1bWVudHNbM11cbiAgICB9O1xuICB9XG5cbiAgaWYgKHNlbGYuc29ja2V0cy5sZW5ndGggPj0gdGhpcy5tYXhTb2NrZXRzKSB7XG4gICAgLy8gV2UgYXJlIG92ZXIgbGltaXQgc28gd2UnbGwgYWRkIGl0IHRvIHRoZSBxdWV1ZS5cbiAgICBzZWxmLnJlcXVlc3RzLnB1c2goe2hvc3Q6IG9wdGlvbnMuaG9zdCwgcG9ydDogb3B0aW9ucy5wb3J0LCByZXF1ZXN0OiByZXF9KVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gSWYgd2UgYXJlIHVuZGVyIG1heFNvY2tldHMgY3JlYXRlIGEgbmV3IG9uZS5cbiAgc2VsZi5jcmVhdGVDb25uZWN0aW9uKHtob3N0OiBvcHRpb25zLmhvc3QsIHBvcnQ6IG9wdGlvbnMucG9ydCwgcmVxdWVzdDogcmVxfSlcbn1cblxuVHVubmVsaW5nQWdlbnQucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKHBlbmRpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgc2VsZi5jcmVhdGVTb2NrZXQocGVuZGluZywgZnVuY3Rpb24oc29ja2V0KSB7XG4gICAgc29ja2V0Lm9uKCdmcmVlJywgb25GcmVlKVxuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpXG4gICAgc29ja2V0Lm9uKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSlcbiAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KVxuXG4gICAgZnVuY3Rpb24gb25GcmVlKCkge1xuICAgICAgc2VsZi5lbWl0KCdmcmVlJywgc29ja2V0LCBwZW5kaW5nLmhvc3QsIHBlbmRpbmcucG9ydClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsb3NlT3JSZW1vdmUoZXJyKSB7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpXG4gICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2ZyZWUnLCBvbkZyZWUpXG4gICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25DbG9zZU9yUmVtb3ZlKVxuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSlcbiAgICB9XG4gIH0pXG59XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQgPSBmdW5jdGlvbiBjcmVhdGVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBwbGFjZWhvbGRlciA9IHt9XG4gIHNlbGYuc29ja2V0cy5wdXNoKHBsYWNlaG9sZGVyKVxuXG4gIHZhciBjb25uZWN0T3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5wcm94eU9wdGlvbnMsXG4gICAgeyBtZXRob2Q6ICdDT05ORUNUJ1xuICAgICwgcGF0aDogb3B0aW9ucy5ob3N0ICsgJzonICsgb3B0aW9ucy5wb3J0XG4gICAgLCBhZ2VudDogZmFsc2VcbiAgICB9XG4gIClcbiAgaWYgKGNvbm5lY3RPcHRpb25zLnByb3h5QXV0aCkge1xuICAgIGNvbm5lY3RPcHRpb25zLmhlYWRlcnMgPSBjb25uZWN0T3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgY29ubmVjdE9wdGlvbnMuaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgK1xuICAgICAgICBCdWZmZXIuZnJvbShjb25uZWN0T3B0aW9ucy5wcm94eUF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICB9XG5cbiAgZGVidWcoJ21ha2luZyBDT05ORUNUIHJlcXVlc3QnKVxuICB2YXIgY29ubmVjdFJlcSA9IHNlbGYucmVxdWVzdChjb25uZWN0T3B0aW9ucylcbiAgY29ubmVjdFJlcS51c2VDaHVua2VkRW5jb2RpbmdCeURlZmF1bHQgPSBmYWxzZSAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ3Jlc3BvbnNlJywgb25SZXNwb25zZSkgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCd1cGdyYWRlJywgb25VcGdyYWRlKSAgIC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgnY29ubmVjdCcsIG9uQ29ubmVjdCkgICAvLyBmb3IgdjAuNyBvciBsYXRlclxuICBjb25uZWN0UmVxLm9uY2UoJ2Vycm9yJywgb25FcnJvcilcbiAgY29ubmVjdFJlcS5lbmQoKVxuXG4gIGZ1bmN0aW9uIG9uUmVzcG9uc2UocmVzKSB7XG4gICAgLy8gVmVyeSBoYWNreS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgaHR0cC1wYXJzZXIgbGVha3MuXG4gICAgcmVzLnVwZ3JhZGUgPSB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBvblVwZ3JhZGUocmVzLCBzb2NrZXQsIGhlYWQpIHtcbiAgICAvLyBIYWNreS5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBvbkNvbm5lY3QocmVzLCBzb2NrZXQsIGhlYWQpIHtcbiAgICBjb25uZWN0UmVxLnJlbW92ZUFsbExpc3RlbmVycygpXG4gICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycygpXG5cbiAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGhlYWQubGVuZ3RoLCAwKVxuICAgICAgZGVidWcoJ3R1bm5lbGluZyBjb25uZWN0aW9uIGhhcyBlc3RhYmxpc2hlZCcpXG4gICAgICBzZWxmLnNvY2tldHNbc2VsZi5zb2NrZXRzLmluZGV4T2YocGxhY2Vob2xkZXIpXSA9IHNvY2tldFxuICAgICAgY2Ioc29ja2V0KVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZygndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsIHN0YXR1c0NvZGU9JWQnLCByZXMuc3RhdHVzQ29kZSlcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsICcgKyAnc3RhdHVzQ29kZT0nICsgcmVzLnN0YXR1c0NvZGUpXG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnXG4gICAgICBvcHRpb25zLnJlcXVlc3QuZW1pdCgnZXJyb3InLCBlcnJvcilcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRXJyb3IoY2F1c2UpIHtcbiAgICBjb25uZWN0UmVxLnJlbW92ZUFsbExpc3RlbmVycygpXG5cbiAgICBkZWJ1ZygndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsIGNhdXNlPSVzXFxuJywgY2F1c2UubWVzc2FnZSwgY2F1c2Uuc3RhY2spXG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgJyArICdjYXVzZT0nICsgY2F1c2UubWVzc2FnZSlcbiAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnXG4gICAgb3B0aW9ucy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpXG4gIH1cbn1cblxuVHVubmVsaW5nQWdlbnQucHJvdG90eXBlLnJlbW92ZVNvY2tldCA9IGZ1bmN0aW9uIHJlbW92ZVNvY2tldChzb2NrZXQpIHtcbiAgdmFyIHBvcyA9IHRoaXMuc29ja2V0cy5pbmRleE9mKHNvY2tldClcbiAgaWYgKHBvcyA9PT0gLTEpIHJldHVyblxuXG4gIHRoaXMuc29ja2V0cy5zcGxpY2UocG9zLCAxKVxuXG4gIHZhciBwZW5kaW5nID0gdGhpcy5yZXF1ZXN0cy5zaGlmdCgpXG4gIGlmIChwZW5kaW5nKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHJlcXVlc3RzIGFuZCBhIHNvY2tldCBnZXRzIGNsb3NlZCBhIG5ldyBvbmVcbiAgICAvLyBuZWVkcyB0byBiZSBjcmVhdGVkIHRvIHRha2Ugb3ZlciBpbiB0aGUgcG9vbCBmb3IgdGhlIG9uZSB0aGF0IGNsb3NlZC5cbiAgICB0aGlzLmNyZWF0ZUNvbm5lY3Rpb24ocGVuZGluZylcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWN1cmVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIFR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQuY2FsbChzZWxmLCBvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICAvLyAwIGlzIGR1bW15IHBvcnQgZm9yIHYwLjZcbiAgICB2YXIgc2VjdXJlU29ja2V0ID0gdGxzLmNvbm5lY3QoMCwgbWVyZ2VPcHRpb25zKHt9LCBzZWxmLm9wdGlvbnMsXG4gICAgICB7IHNlcnZlcm5hbWU6IG9wdGlvbnMuaG9zdFxuICAgICAgLCBzb2NrZXQ6IHNvY2tldFxuICAgICAgfVxuICAgICkpXG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHNvY2tldCldID0gc2VjdXJlU29ja2V0XG4gICAgY2Ioc2VjdXJlU29ja2V0KVxuICB9KVxufVxuXG5cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciBvdmVycmlkZXMgPSBhcmd1bWVudHNbaV1cbiAgICBpZiAodHlwZW9mIG92ZXJyaWRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKVxuICAgICAgZm9yICh2YXIgaiA9IDAsIGtleUxlbiA9IGtleXMubGVuZ3RoOyBqIDwga2V5TGVuOyArK2opIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW2pdXG4gICAgICAgIGlmIChvdmVycmlkZXNba10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRhcmdldFtrXSA9IG92ZXJyaWRlc1trXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRcbn1cblxuXG52YXIgZGVidWdcbmlmIChwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmIC9cXGJ0dW5uZWxcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpIHtcbiAgZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmdzWzBdID0gJ1RVTk5FTDogJyArIGFyZ3NbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KCdUVU5ORUw6JylcbiAgICB9XG4gICAgY29uc29sZS5lcnJvci5hcHBseShjb25zb2xlLCBhcmdzKVxuICB9XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge31cbn1cbmV4cG9ydHMuZGVidWcgPSBkZWJ1ZyAvLyBmb3IgdGVzdFxuIiwgIid1c2Ugc3RyaWN0J1xuXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcbnZhciB0dW5uZWwgPSByZXF1aXJlKCd0dW5uZWwtYWdlbnQnKVxuXG52YXIgZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0ID0gW1xuICAnYWNjZXB0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JyxcbiAgJ2FjY2VwdC1lbmNvZGluZycsXG4gICdhY2NlcHQtbGFuZ3VhZ2UnLFxuICAnYWNjZXB0LXJhbmdlcycsXG4gICdjYWNoZS1jb250cm9sJyxcbiAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAnY29udGVudC1sYW5ndWFnZScsXG4gICdjb250ZW50LWxvY2F0aW9uJyxcbiAgJ2NvbnRlbnQtbWQ1JyxcbiAgJ2NvbnRlbnQtcmFuZ2UnLFxuICAnY29udGVudC10eXBlJyxcbiAgJ2Nvbm5lY3Rpb24nLFxuICAnZGF0ZScsXG4gICdleHBlY3QnLFxuICAnbWF4LWZvcndhcmRzJyxcbiAgJ3ByYWdtYScsXG4gICdyZWZlcmVyJyxcbiAgJ3RlJyxcbiAgJ3VzZXItYWdlbnQnLFxuICAndmlhJ1xuXVxuXG52YXIgZGVmYXVsdFByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IFtcbiAgJ3Byb3h5LWF1dGhvcml6YXRpb24nXG5dXG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFByb3h5SG9zdCAodXJpT2JqZWN0KSB7XG4gIHZhciBwb3J0ID0gdXJpT2JqZWN0LnBvcnRcbiAgdmFyIHByb3RvY29sID0gdXJpT2JqZWN0LnByb3RvY29sXG4gIHZhciBwcm94eUhvc3QgPSB1cmlPYmplY3QuaG9zdG5hbWUgKyAnOidcblxuICBpZiAocG9ydCkge1xuICAgIHByb3h5SG9zdCArPSBwb3J0XG4gIH0gZWxzZSBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcHJveHlIb3N0ICs9ICc0NDMnXG4gIH0gZWxzZSB7XG4gICAgcHJveHlIb3N0ICs9ICc4MCdcbiAgfVxuXG4gIHJldHVybiBwcm94eUhvc3Rcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0UHJveHlIZWFkZXJXaGl0ZUxpc3QgKGhlYWRlcnMsIHByb3h5SGVhZGVyV2hpdGVMaXN0KSB7XG4gIHZhciB3aGl0ZUxpc3QgPSBwcm94eUhlYWRlcldoaXRlTGlzdFxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHNldCwgaGVhZGVyKSB7XG4gICAgICBzZXRbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gdHJ1ZVxuICAgICAgcmV0dXJuIHNldFxuICAgIH0sIHt9KVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgcmV0dXJuIHdoaXRlTGlzdFtoZWFkZXIudG9Mb3dlckNhc2UoKV1cbiAgICB9KVxuICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHNldCwgaGVhZGVyKSB7XG4gICAgICBzZXRbaGVhZGVyXSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgcmV0dXJuIHNldFxuICAgIH0sIHt9KVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RUdW5uZWxPcHRpb25zIChyZXF1ZXN0LCBwcm94eUhlYWRlcnMpIHtcbiAgdmFyIHByb3h5ID0gcmVxdWVzdC5wcm94eVxuXG4gIHZhciB0dW5uZWxPcHRpb25zID0ge1xuICAgIHByb3h5OiB7XG4gICAgICBob3N0OiBwcm94eS5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6ICtwcm94eS5wb3J0LFxuICAgICAgcHJveHlBdXRoOiBwcm94eS5hdXRoLFxuICAgICAgaGVhZGVyczogcHJveHlIZWFkZXJzXG4gICAgfSxcbiAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgY2E6IHJlcXVlc3QuY2EsXG4gICAgY2VydDogcmVxdWVzdC5jZXJ0LFxuICAgIGtleTogcmVxdWVzdC5rZXksXG4gICAgcGFzc3BocmFzZTogcmVxdWVzdC5wYXNzcGhyYXNlLFxuICAgIHBmeDogcmVxdWVzdC5wZngsXG4gICAgY2lwaGVyczogcmVxdWVzdC5jaXBoZXJzLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZDogcmVxdWVzdC5yZWplY3RVbmF1dGhvcml6ZWQsXG4gICAgc2VjdXJlT3B0aW9uczogcmVxdWVzdC5zZWN1cmVPcHRpb25zLFxuICAgIHNlY3VyZVByb3RvY29sOiByZXF1ZXN0LnNlY3VyZVByb3RvY29sXG4gIH1cblxuICByZXR1cm4gdHVubmVsT3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RUdW5uZWxGbk5hbWUgKHVyaSwgcHJveHkpIHtcbiAgdmFyIHVyaVByb3RvY29sID0gKHVyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnaHR0cHMnIDogJ2h0dHAnKVxuICB2YXIgcHJveHlQcm90b2NvbCA9IChwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnSHR0cHMnIDogJ0h0dHAnKVxuICByZXR1cm4gW3VyaVByb3RvY29sLCBwcm94eVByb3RvY29sXS5qb2luKCdPdmVyJylcbn1cblxuZnVuY3Rpb24gZ2V0VHVubmVsRm4gKHJlcXVlc3QpIHtcbiAgdmFyIHVyaSA9IHJlcXVlc3QudXJpXG4gIHZhciBwcm94eSA9IHJlcXVlc3QucHJveHlcbiAgdmFyIHR1bm5lbEZuTmFtZSA9IGNvbnN0cnVjdFR1bm5lbEZuTmFtZSh1cmksIHByb3h5KVxuICByZXR1cm4gdHVubmVsW3R1bm5lbEZuTmFtZV1cbn1cblxuZnVuY3Rpb24gVHVubmVsIChyZXF1ZXN0KSB7XG4gIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgdGhpcy5wcm94eUhlYWRlcldoaXRlTGlzdCA9IGRlZmF1bHRQcm94eUhlYWRlcldoaXRlTGlzdFxuICB0aGlzLnByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IFtdXG4gIGlmICh0eXBlb2YgcmVxdWVzdC50dW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy50dW5uZWxPdmVycmlkZSA9IHJlcXVlc3QudHVubmVsXG4gIH1cbn1cblxuVHVubmVsLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcmVxdWVzdCA9IHNlbGYucmVxdWVzdFxuICAgIC8vIFR1bm5lbCBIVFRQUyBieSBkZWZhdWx0LiBBbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSB0aGlzIHNldHRpbmcuXG5cbiAgLy8gSWYgc2VsZi50dW5uZWxPdmVycmlkZSBpcyBzZXQgKHRoZSB1c2VyIHNwZWNpZmllZCBhIHZhbHVlKSwgdXNlIGl0LlxuICBpZiAodHlwZW9mIHNlbGYudHVubmVsT3ZlcnJpZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGYudHVubmVsT3ZlcnJpZGVcbiAgfVxuXG4gIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBIVFRQUywgdHVubmVsLlxuICBpZiAocmVxdWVzdC51cmkucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgZG8gbm90IHVzZSB0dW5uZWwuXG4gIHJldHVybiBmYWxzZVxufVxuXG5UdW5uZWwucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXF1ZXN0ID0gc2VsZi5yZXF1ZXN0XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAodHlwZW9mIHJlcXVlc3QucHJveHkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVxdWVzdC5wcm94eSA9IHVybC5wYXJzZShyZXF1ZXN0LnByb3h5KVxuICB9XG5cbiAgaWYgKCFyZXF1ZXN0LnByb3h5IHx8ICFyZXF1ZXN0LnR1bm5lbCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gU2V0dXAgUHJveHkgSGVhZGVyIEV4Y2x1c2l2ZSBMaXN0IGFuZCBXaGl0ZSBMaXN0XG4gIGlmIChvcHRpb25zLnByb3h5SGVhZGVyV2hpdGVMaXN0KSB7XG4gICAgc2VsZi5wcm94eUhlYWRlcldoaXRlTGlzdCA9IG9wdGlvbnMucHJveHlIZWFkZXJXaGl0ZUxpc3RcbiAgfVxuICBpZiAob3B0aW9ucy5wcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QpIHtcbiAgICBzZWxmLnByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IG9wdGlvbnMucHJveHlIZWFkZXJFeGNsdXNpdmVMaXN0XG4gIH1cblxuICB2YXIgcHJveHlIZWFkZXJFeGNsdXNpdmVMaXN0ID0gc2VsZi5wcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QuY29uY2F0KGRlZmF1bHRQcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QpXG4gIHZhciBwcm94eUhlYWRlcldoaXRlTGlzdCA9IHNlbGYucHJveHlIZWFkZXJXaGl0ZUxpc3QuY29uY2F0KHByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdClcblxuICAvLyBTZXR1cCBQcm94eSBIZWFkZXJzIGFuZCBQcm94eSBIZWFkZXJzIEhvc3RcbiAgLy8gT25seSBzZW5kIHRoZSBQcm94eSBXaGl0ZSBMaXN0ZWQgSGVhZGVyIG5hbWVzXG4gIHZhciBwcm94eUhlYWRlcnMgPSBjb25zdHJ1Y3RQcm94eUhlYWRlcldoaXRlTGlzdChyZXF1ZXN0LmhlYWRlcnMsIHByb3h5SGVhZGVyV2hpdGVMaXN0KVxuICBwcm94eUhlYWRlcnMuaG9zdCA9IGNvbnN0cnVjdFByb3h5SG9zdChyZXF1ZXN0LnVyaSlcblxuICBwcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3QuZm9yRWFjaChyZXF1ZXN0LnJlbW92ZUhlYWRlciwgcmVxdWVzdClcblxuICAvLyBTZXQgQWdlbnQgZnJvbSBUdW5uZWwgRGF0YVxuICB2YXIgdHVubmVsRm4gPSBnZXRUdW5uZWxGbihyZXF1ZXN0KVxuICB2YXIgdHVubmVsT3B0aW9ucyA9IGNvbnN0cnVjdFR1bm5lbE9wdGlvbnMocmVxdWVzdCwgcHJveHlIZWFkZXJzKVxuICByZXF1ZXN0LmFnZW50ID0gdHVubmVsRm4odHVubmVsT3B0aW9ucylcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5UdW5uZWwuZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0ID0gZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0XG5UdW5uZWwuZGVmYXVsdFByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9IGRlZmF1bHRQcm94eUhlYWRlckV4Y2x1c2l2ZUxpc3RcbmV4cG9ydHMuVHVubmVsID0gVHVubmVsXG4iLCBudWxsLCAiJ3VzZSBzdHJpY3QnXG5cbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciB6bGliID0gcmVxdWlyZSgnemxpYicpXG52YXIgYXdzMiA9IHJlcXVpcmUoJ2F3cy1zaWduMicpXG52YXIgYXdzNCA9IHJlcXVpcmUoJ2F3czQnKVxudmFyIGh0dHBTaWduYXR1cmUgPSByZXF1aXJlKCdodHRwLXNpZ25hdHVyZScpXG52YXIgbWltZSA9IHJlcXVpcmUoJ21pbWUtdHlwZXMnKVxudmFyIGNhc2VsZXNzID0gcmVxdWlyZSgnY2FzZWxlc3MnKVxudmFyIEZvcmV2ZXJBZ2VudCA9IHJlcXVpcmUoJ2ZvcmV2ZXItYWdlbnQnKVxudmFyIEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJylcbnZhciBleHRlbmQgPSByZXF1aXJlKCdleHRlbmQnKVxudmFyIGlzc3RyZWFtID0gcmVxdWlyZSgnaXNzdHJlYW0nKVxudmFyIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJ2lzLXR5cGVkYXJyYXknKS5zdHJpY3RcbnZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9saWIvaGVscGVycycpXG52YXIgY29va2llcyA9IHJlcXVpcmUoJy4vbGliL2Nvb2tpZXMnKVxudmFyIGdldFByb3h5RnJvbVVSSSA9IHJlcXVpcmUoJy4vbGliL2dldFByb3h5RnJvbVVSSScpXG52YXIgUXVlcnlzdHJpbmcgPSByZXF1aXJlKCcuL2xpYi9xdWVyeXN0cmluZycpLlF1ZXJ5c3RyaW5nXG52YXIgSGFyID0gcmVxdWlyZSgnLi9saWIvaGFyJykuSGFyXG52YXIgQXV0aCA9IHJlcXVpcmUoJy4vbGliL2F1dGgnKS5BdXRoXG52YXIgT0F1dGggPSByZXF1aXJlKCcuL2xpYi9vYXV0aCcpLk9BdXRoXG52YXIgaGF3ayA9IHJlcXVpcmUoJy4vbGliL2hhd2snKVxudmFyIE11bHRpcGFydCA9IHJlcXVpcmUoJy4vbGliL211bHRpcGFydCcpLk11bHRpcGFydFxudmFyIFJlZGlyZWN0ID0gcmVxdWlyZSgnLi9saWIvcmVkaXJlY3QnKS5SZWRpcmVjdFxudmFyIFR1bm5lbCA9IHJlcXVpcmUoJy4vbGliL3R1bm5lbCcpLlR1bm5lbFxudmFyIG5vdyA9IHJlcXVpcmUoJ3BlcmZvcm1hbmNlLW5vdycpXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcblxudmFyIHNhZmVTdHJpbmdpZnkgPSBoZWxwZXJzLnNhZmVTdHJpbmdpZnlcbnZhciBpc1JlYWRTdHJlYW0gPSBoZWxwZXJzLmlzUmVhZFN0cmVhbVxudmFyIHRvQmFzZTY0ID0gaGVscGVycy50b0Jhc2U2NFxudmFyIGRlZmVyID0gaGVscGVycy5kZWZlclxudmFyIGNvcHkgPSBoZWxwZXJzLmNvcHlcbnZhciB2ZXJzaW9uID0gaGVscGVycy52ZXJzaW9uXG52YXIgZ2xvYmFsQ29va2llSmFyID0gY29va2llcy5qYXIoKVxuXG52YXIgZ2xvYmFsUG9vbCA9IHt9XG5cbmZ1bmN0aW9uIGZpbHRlckZvck5vblJlc2VydmVkIChyZXNlcnZlZCwgb3B0aW9ucykge1xuICAvLyBGaWx0ZXIgb3V0IHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHJlc2VydmVkLlxuICAvLyBSZXNlcnZlZCB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBhdCBjYWxsIHNpdGUuXG5cbiAgdmFyIG9iamVjdCA9IHt9XG4gIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgIHZhciBub3RSZXNlcnZlZCA9IChyZXNlcnZlZC5pbmRleE9mKGkpID09PSAtMSlcbiAgICBpZiAobm90UmVzZXJ2ZWQpIHtcbiAgICAgIG9iamVjdFtpXSA9IG9wdGlvbnNbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iamVjdFxufVxuXG5mdW5jdGlvbiBmaWx0ZXJPdXRSZXNlcnZlZEZ1bmN0aW9ucyAocmVzZXJ2ZWQsIG9wdGlvbnMpIHtcbiAgLy8gRmlsdGVyIG91dCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucyBhbmQgYXJlIHJlc2VydmVkLlxuICAvLyBSZXNlcnZlZCB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBhdCBjYWxsIHNpdGUuXG5cbiAgdmFyIG9iamVjdCA9IHt9XG4gIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgIHZhciBpc1Jlc2VydmVkID0gIShyZXNlcnZlZC5pbmRleE9mKGkpID09PSAtMSlcbiAgICB2YXIgaXNGdW5jdGlvbiA9ICh0eXBlb2Ygb3B0aW9uc1tpXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBpZiAoIShpc1Jlc2VydmVkICYmIGlzRnVuY3Rpb24pKSB7XG4gICAgICBvYmplY3RbaV0gPSBvcHRpb25zW2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Rcbn1cblxuLy8gUmV0dXJuIGEgc2ltcGxlciByZXF1ZXN0IG9iamVjdCB0byBhbGxvdyBzZXJpYWxpemF0aW9uXG5mdW5jdGlvbiByZXF1ZXN0VG9KU09OICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiB7XG4gICAgdXJpOiBzZWxmLnVyaSxcbiAgICBtZXRob2Q6IHNlbGYubWV0aG9kLFxuICAgIGhlYWRlcnM6IHNlbGYuaGVhZGVyc1xuICB9XG59XG5cbi8vIFJldHVybiBhIHNpbXBsZXIgcmVzcG9uc2Ugb2JqZWN0IHRvIGFsbG93IHNlcmlhbGl6YXRpb25cbmZ1bmN0aW9uIHJlc3BvbnNlVG9KU09OICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHJldHVybiB7XG4gICAgc3RhdHVzQ29kZTogc2VsZi5zdGF0dXNDb2RlLFxuICAgIGJvZHk6IHNlbGYuYm9keSxcbiAgICBoZWFkZXJzOiBzZWxmLmhlYWRlcnMsXG4gICAgcmVxdWVzdDogcmVxdWVzdFRvSlNPTi5jYWxsKHNlbGYucmVxdWVzdClcbiAgfVxufVxuXG5mdW5jdGlvbiBSZXF1ZXN0IChvcHRpb25zKSB7XG4gIC8vIGlmIGdpdmVuIHRoZSBtZXRob2QgcHJvcGVydHkgaW4gb3B0aW9ucywgc2V0IHByb3BlcnR5IGV4cGxpY2l0TWV0aG9kIHRvIHRydWVcblxuICAvLyBleHRlbmQgdGhlIFJlcXVlc3QgaW5zdGFuY2Ugd2l0aCBhbnkgbm9uLXJlc2VydmVkIHByb3BlcnRpZXNcbiAgLy8gcmVtb3ZlIGFueSByZXNlcnZlZCBmdW5jdGlvbnMgZnJvbSB0aGUgb3B0aW9ucyBvYmplY3RcbiAgLy8gc2V0IFJlcXVlc3QgaW5zdGFuY2UgdG8gYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4gIC8vIGNhbGwgaW5pdFxuXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIC8vIHN0YXJ0IHdpdGggSEFSLCB0aGVuIG92ZXJyaWRlIHdpdGggYWRkaXRpb25hbCBvcHRpb25zXG4gIGlmIChvcHRpb25zLmhhcikge1xuICAgIHNlbGYuX2hhciA9IG5ldyBIYXIoc2VsZilcbiAgICBvcHRpb25zID0gc2VsZi5faGFyLm9wdGlvbnMob3B0aW9ucylcbiAgfVxuXG4gIHN0cmVhbS5TdHJlYW0uY2FsbChzZWxmKVxuICB2YXIgcmVzZXJ2ZWQgPSBPYmplY3Qua2V5cyhSZXF1ZXN0LnByb3RvdHlwZSlcbiAgdmFyIG5vblJlc2VydmVkID0gZmlsdGVyRm9yTm9uUmVzZXJ2ZWQocmVzZXJ2ZWQsIG9wdGlvbnMpXG5cbiAgZXh0ZW5kKHNlbGYsIG5vblJlc2VydmVkKVxuICBvcHRpb25zID0gZmlsdGVyT3V0UmVzZXJ2ZWRGdW5jdGlvbnMocmVzZXJ2ZWQsIG9wdGlvbnMpXG5cbiAgc2VsZi5yZWFkYWJsZSA9IHRydWVcbiAgc2VsZi53cml0YWJsZSA9IHRydWVcbiAgaWYgKG9wdGlvbnMubWV0aG9kKSB7XG4gICAgc2VsZi5leHBsaWNpdE1ldGhvZCA9IHRydWVcbiAgfVxuICBzZWxmLl9xcyA9IG5ldyBRdWVyeXN0cmluZyhzZWxmKVxuICBzZWxmLl9hdXRoID0gbmV3IEF1dGgoc2VsZilcbiAgc2VsZi5fb2F1dGggPSBuZXcgT0F1dGgoc2VsZilcbiAgc2VsZi5fbXVsdGlwYXJ0ID0gbmV3IE11bHRpcGFydChzZWxmKVxuICBzZWxmLl9yZWRpcmVjdCA9IG5ldyBSZWRpcmVjdChzZWxmKVxuICBzZWxmLl90dW5uZWwgPSBuZXcgVHVubmVsKHNlbGYpXG4gIHNlbGYuaW5pdChvcHRpb25zKVxufVxuXG51dGlsLmluaGVyaXRzKFJlcXVlc3QsIHN0cmVhbS5TdHJlYW0pXG5cbi8vIERlYnVnZ2luZ1xuUmVxdWVzdC5kZWJ1ZyA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL1xcYnJlcXVlc3RcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRylcbmZ1bmN0aW9uIGRlYnVnICgpIHtcbiAgaWYgKFJlcXVlc3QuZGVidWcpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSRVFVRVNUICVzJywgdXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSlcbiAgfVxufVxuUmVxdWVzdC5wcm90b3R5cGUuZGVidWcgPSBkZWJ1Z1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgLy8gaW5pdCgpIGNvbnRhaW5zIGFsbCB0aGUgY29kZSB0byBzZXR1cCB0aGUgcmVxdWVzdCBvYmplY3QuXG4gIC8vIHRoZSBhY3R1YWwgb3V0Z29pbmcgcmVxdWVzdCBpcyBub3Qgc3RhcnRlZCB1bnRpbCBzdGFydCgpIGlzIGNhbGxlZFxuICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCBvbiByZWRpcmVjdC5cbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG4gIHNlbGYuaGVhZGVycyA9IHNlbGYuaGVhZGVycyA/IGNvcHkoc2VsZi5oZWFkZXJzKSA6IHt9XG5cbiAgLy8gRGVsZXRlIGhlYWRlcnMgd2l0aCB2YWx1ZSB1bmRlZmluZWQgc2luY2UgdGhleSBicmVha1xuICAvLyBDbGllbnRSZXF1ZXN0Lk91dGdvaW5nTWVzc2FnZS5zZXRIZWFkZXIgaW4gbm9kZSAwLjEyXG4gIGZvciAodmFyIGhlYWRlck5hbWUgaW4gc2VsZi5oZWFkZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBzZWxmLmhlYWRlcnNbaGVhZGVyTmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZWxldGUgc2VsZi5oZWFkZXJzW2hlYWRlck5hbWVdXG4gICAgfVxuICB9XG5cbiAgY2FzZWxlc3MuaHR0cGlmeShzZWxmLCBzZWxmLmhlYWRlcnMpXG5cbiAgaWYgKCFzZWxmLm1ldGhvZCkge1xuICAgIHNlbGYubWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgJ0dFVCdcbiAgfVxuICBpZiAoIXNlbGYubG9jYWxBZGRyZXNzKSB7XG4gICAgc2VsZi5sb2NhbEFkZHJlc3MgPSBvcHRpb25zLmxvY2FsQWRkcmVzc1xuICB9XG5cbiAgc2VsZi5fcXMuaW5pdChvcHRpb25zKVxuXG4gIGRlYnVnKG9wdGlvbnMpXG4gIGlmICghc2VsZi5wb29sICYmIHNlbGYucG9vbCAhPT0gZmFsc2UpIHtcbiAgICBzZWxmLnBvb2wgPSBnbG9iYWxQb29sXG4gIH1cbiAgc2VsZi5kZXN0cyA9IHNlbGYuZGVzdHMgfHwgW11cbiAgc2VsZi5fX2lzUmVxdWVzdFJlcXVlc3QgPSB0cnVlXG5cbiAgLy8gUHJvdGVjdCBhZ2FpbnN0IGRvdWJsZSBjYWxsYmFja1xuICBpZiAoIXNlbGYuX2NhbGxiYWNrICYmIHNlbGYuY2FsbGJhY2spIHtcbiAgICBzZWxmLl9jYWxsYmFjayA9IHNlbGYuY2FsbGJhY2tcbiAgICBzZWxmLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuX2NhbGxiYWNrQ2FsbGVkKSB7XG4gICAgICAgIHJldHVybiAvLyBQcmludCBhIHdhcm5pbmcgbWF5YmU/XG4gICAgICB9XG4gICAgICBzZWxmLl9jYWxsYmFja0NhbGxlZCA9IHRydWVcbiAgICAgIHNlbGYuX2NhbGxiYWNrLmFwcGx5KHNlbGYsIGFyZ3VtZW50cylcbiAgICB9XG4gICAgc2VsZi5vbignZXJyb3InLCBzZWxmLmNhbGxiYWNrLmJpbmQoKSlcbiAgICBzZWxmLm9uKCdjb21wbGV0ZScsIHNlbGYuY2FsbGJhY2suYmluZChzZWxmLCBudWxsKSlcbiAgfVxuXG4gIC8vIFBlb3BsZSB1c2UgdGhpcyBwcm9wZXJ0eSBpbnN0ZWFkIGFsbCB0aGUgdGltZSwgc28gc3VwcG9ydCBpdFxuICBpZiAoIXNlbGYudXJpICYmIHNlbGYudXJsKSB7XG4gICAgc2VsZi51cmkgPSBzZWxmLnVybFxuICAgIGRlbGV0ZSBzZWxmLnVybFxuICB9XG5cbiAgLy8gSWYgdGhlcmUncyBhIGJhc2VVcmwsIHRoZW4gdXNlIGl0IGFzIHRoZSBiYXNlIFVSTCAoaS5lLiB1cmkgbXVzdCBiZVxuICAvLyBzcGVjaWZpZWQgYXMgYSByZWxhdGl2ZSBwYXRoIGFuZCBpcyBhcHBlbmRlZCB0byBiYXNlVXJsKS5cbiAgaWYgKHNlbGYuYmFzZVVybCkge1xuICAgIGlmICh0eXBlb2Ygc2VsZi5iYXNlVXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ29wdGlvbnMuYmFzZVVybCBtdXN0IGJlIGEgc3RyaW5nJykpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZWxmLnVyaSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdvcHRpb25zLnVyaSBtdXN0IGJlIGEgc3RyaW5nIHdoZW4gdXNpbmcgb3B0aW9ucy5iYXNlVXJsJykpXG4gICAgfVxuXG4gICAgaWYgKHNlbGYudXJpLmluZGV4T2YoJy8vJykgPT09IDAgfHwgc2VsZi51cmkuaW5kZXhPZignOi8vJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignb3B0aW9ucy51cmkgbXVzdCBiZSBhIHBhdGggd2hlbiB1c2luZyBvcHRpb25zLmJhc2VVcmwnKSlcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYWxsIGNhc2VzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgc2xhc2ggYmV0d2VlblxuICAgIC8vIGJhc2VVcmwgYW5kIHVyaS5cbiAgICB2YXIgYmFzZVVybEVuZHNXaXRoU2xhc2ggPSBzZWxmLmJhc2VVcmwubGFzdEluZGV4T2YoJy8nKSA9PT0gc2VsZi5iYXNlVXJsLmxlbmd0aCAtIDFcbiAgICB2YXIgdXJpU3RhcnRzV2l0aFNsYXNoID0gc2VsZi51cmkuaW5kZXhPZignLycpID09PSAwXG5cbiAgICBpZiAoYmFzZVVybEVuZHNXaXRoU2xhc2ggJiYgdXJpU3RhcnRzV2l0aFNsYXNoKSB7XG4gICAgICBzZWxmLnVyaSA9IHNlbGYuYmFzZVVybCArIHNlbGYudXJpLnNsaWNlKDEpXG4gICAgfSBlbHNlIGlmIChiYXNlVXJsRW5kc1dpdGhTbGFzaCB8fCB1cmlTdGFydHNXaXRoU2xhc2gpIHtcbiAgICAgIHNlbGYudXJpID0gc2VsZi5iYXNlVXJsICsgc2VsZi51cmlcbiAgICB9IGVsc2UgaWYgKHNlbGYudXJpID09PSAnJykge1xuICAgICAgc2VsZi51cmkgPSBzZWxmLmJhc2VVcmxcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi51cmkgPSBzZWxmLmJhc2VVcmwgKyAnLycgKyBzZWxmLnVyaVxuICAgIH1cbiAgICBkZWxldGUgc2VsZi5iYXNlVXJsXG4gIH1cblxuICAvLyBBIFVSSSBpcyBuZWVkZWQgYnkgdGhpcyBwb2ludCwgZW1pdCBlcnJvciBpZiB3ZSBoYXZlbid0IGJlZW4gYWJsZSB0byBnZXQgb25lXG4gIGlmICghc2VsZi51cmkpIHtcbiAgICByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignb3B0aW9ucy51cmkgaXMgYSByZXF1aXJlZCBhcmd1bWVudCcpKVxuICB9XG5cbiAgLy8gSWYgYSBzdHJpbmcgVVJJL1VSTCB3YXMgZ2l2ZW4sIHBhcnNlIGl0IGludG8gYSBVUkwgb2JqZWN0XG4gIGlmICh0eXBlb2Ygc2VsZi51cmkgPT09ICdzdHJpbmcnKSB7XG4gICAgc2VsZi51cmkgPSB1cmwucGFyc2Uoc2VsZi51cmkpXG4gIH1cblxuICAvLyBTb21lIFVSTCBvYmplY3RzIGFyZSBub3QgZnJvbSBhIFVSTCBwYXJzZWQgc3RyaW5nIGFuZCBuZWVkIGhyZWYgYWRkZWRcbiAgaWYgKCFzZWxmLnVyaS5ocmVmKSB7XG4gICAgc2VsZi51cmkuaHJlZiA9IHVybC5mb3JtYXQoc2VsZi51cmkpXG4gIH1cblxuICAvLyBERVBSRUNBVEVEOiBXYXJuaW5nIGZvciB1c2VycyBvZiB0aGUgb2xkIFVuaXggU29ja2V0cyBVUkwgU2NoZW1lXG4gIGlmIChzZWxmLnVyaS5wcm90b2NvbCA9PT0gJ3VuaXg6Jykge1xuICAgIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdgdW5peDovL2AgVVJMIHNjaGVtZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIHRoZSBmb3JtYXQgYGh0dHA6Ly91bml4OlNPQ0tFVDpQQVRIYCcpKVxuICB9XG5cbiAgLy8gU3VwcG9ydCBVbml4IFNvY2tldHNcbiAgaWYgKHNlbGYudXJpLmhvc3QgPT09ICd1bml4Jykge1xuICAgIHNlbGYuZW5hYmxlVW5peFNvY2tldCgpXG4gIH1cblxuICBpZiAoc2VsZi5zdHJpY3RTU0wgPT09IGZhbHNlKSB7XG4gICAgc2VsZi5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZVxuICB9XG5cbiAgaWYgKCFzZWxmLnVyaS5wYXRobmFtZSkgeyBzZWxmLnVyaS5wYXRobmFtZSA9ICcvJyB9XG5cbiAgaWYgKCEoc2VsZi51cmkuaG9zdCB8fCAoc2VsZi51cmkuaG9zdG5hbWUgJiYgc2VsZi51cmkucG9ydCkpICYmICFzZWxmLnVyaS5pc1VuaXgpIHtcbiAgICAvLyBJbnZhbGlkIFVSSTogaXQgbWF5IGdlbmVyYXRlIGxvdCBvZiBiYWQgZXJyb3JzLCBsaWtlICdUeXBlRXJyb3I6IENhbm5vdCBjYWxsIG1ldGhvZCBgaW5kZXhPZmAgb2YgdW5kZWZpbmVkJyBpbiBDb29raWVKYXJcbiAgICAvLyBEZXRlY3QgYW5kIHJlamVjdCBpdCBhcyBzb29uIGFzIHBvc3NpYmxlXG4gICAgdmFyIGZhdWx0eVVyaSA9IHVybC5mb3JtYXQoc2VsZi51cmkpXG4gICAgdmFyIG1lc3NhZ2UgPSAnSW52YWxpZCBVUkkgXCInICsgZmF1bHR5VXJpICsgJ1wiJ1xuICAgIGlmIChPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIE5vIG9wdGlvbiA/IFRoaXMgY2FuIGJlIHRoZSBzaWduIG9mIGEgcmVkaXJlY3RcbiAgICAgIC8vIEFzIHRoaXMgaXMgYSBjYXNlIHdoZXJlIHRoZSB1c2VyIGNhbm5vdCBkbyBhbnl0aGluZyAodGhleSBkaWRuJ3QgY2FsbCByZXF1ZXN0IGRpcmVjdGx5IHdpdGggdGhpcyBVUkwpXG4gICAgICAvLyB0aGV5IHNob3VsZCBiZSB3YXJuZWQgdGhhdCBpdCBjYW4gYmUgY2F1c2VkIGJ5IGEgcmVkaXJlY3Rpb24gKGNhbiBzYXZlIHNvbWUgaGFpcilcbiAgICAgIG1lc3NhZ2UgKz0gJy4gVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IGEgY3JhcHB5IHJlZGlyZWN0aW9uLidcbiAgICB9XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgZmF0YWxcbiAgICBzZWxmLmFib3J0KClcbiAgICByZXR1cm4gc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihtZXNzYWdlKSlcbiAgfVxuXG4gIGlmICghc2VsZi5oYXNPd25Qcm9wZXJ0eSgncHJveHknKSkge1xuICAgIHNlbGYucHJveHkgPSBnZXRQcm94eUZyb21VUkkoc2VsZi51cmkpXG4gIH1cblxuICBzZWxmLnR1bm5lbCA9IHNlbGYuX3R1bm5lbC5pc0VuYWJsZWQoKVxuICBpZiAoc2VsZi5wcm94eSkge1xuICAgIHNlbGYuX3R1bm5lbC5zZXR1cChvcHRpb25zKVxuICB9XG5cbiAgc2VsZi5fcmVkaXJlY3Qub25SZXF1ZXN0KG9wdGlvbnMpXG5cbiAgc2VsZi5zZXRIb3N0ID0gZmFsc2VcbiAgaWYgKCFzZWxmLmhhc0hlYWRlcignaG9zdCcpKSB7XG4gICAgdmFyIGhvc3RIZWFkZXJOYW1lID0gc2VsZi5vcmlnaW5hbEhvc3RIZWFkZXJOYW1lIHx8ICdob3N0J1xuICAgIHNlbGYuc2V0SGVhZGVyKGhvc3RIZWFkZXJOYW1lLCBzZWxmLnVyaS5ob3N0KVxuICAgIC8vIERyb3AgOnBvcnQgc3VmZml4IGZyb20gSG9zdCBoZWFkZXIgaWYga25vd24gcHJvdG9jb2wuXG4gICAgaWYgKHNlbGYudXJpLnBvcnQpIHtcbiAgICAgIGlmICgoc2VsZi51cmkucG9ydCA9PT0gJzgwJyAmJiBzZWxmLnVyaS5wcm90b2NvbCA9PT0gJ2h0dHA6JykgfHxcbiAgICAgICAgICAoc2VsZi51cmkucG9ydCA9PT0gJzQ0MycgJiYgc2VsZi51cmkucHJvdG9jb2wgPT09ICdodHRwczonKSkge1xuICAgICAgICBzZWxmLnNldEhlYWRlcihob3N0SGVhZGVyTmFtZSwgc2VsZi51cmkuaG9zdG5hbWUpXG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuc2V0SG9zdCA9IHRydWVcbiAgfVxuXG4gIHNlbGYuamFyKHNlbGYuX2phciB8fCBvcHRpb25zLmphcilcblxuICBpZiAoIXNlbGYudXJpLnBvcnQpIHtcbiAgICBpZiAoc2VsZi51cmkucHJvdG9jb2wgPT09ICdodHRwOicpIHsgc2VsZi51cmkucG9ydCA9IDgwIH0gZWxzZSBpZiAoc2VsZi51cmkucHJvdG9jb2wgPT09ICdodHRwczonKSB7IHNlbGYudXJpLnBvcnQgPSA0NDMgfVxuICB9XG5cbiAgaWYgKHNlbGYucHJveHkgJiYgIXNlbGYudHVubmVsKSB7XG4gICAgc2VsZi5wb3J0ID0gc2VsZi5wcm94eS5wb3J0XG4gICAgc2VsZi5ob3N0ID0gc2VsZi5wcm94eS5ob3N0bmFtZVxuICB9IGVsc2Uge1xuICAgIHNlbGYucG9ydCA9IHNlbGYudXJpLnBvcnRcbiAgICBzZWxmLmhvc3QgPSBzZWxmLnVyaS5ob3N0bmFtZVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuZm9ybSkge1xuICAgIHNlbGYuZm9ybShvcHRpb25zLmZvcm0pXG4gIH1cblxuICBpZiAob3B0aW9ucy5mb3JtRGF0YSkge1xuICAgIHZhciBmb3JtRGF0YSA9IG9wdGlvbnMuZm9ybURhdGFcbiAgICB2YXIgcmVxdWVzdEZvcm0gPSBzZWxmLmZvcm0oKVxuICAgIHZhciBhcHBlbmRGb3JtVmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIHZhbHVlLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpIHtcbiAgICAgICAgcmVxdWVzdEZvcm0uYXBwZW5kKGtleSwgdmFsdWUudmFsdWUsIHZhbHVlLm9wdGlvbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0Rm9ybS5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgZm9ybUtleSBpbiBmb3JtRGF0YSkge1xuICAgICAgaWYgKGZvcm1EYXRhLmhhc093blByb3BlcnR5KGZvcm1LZXkpKSB7XG4gICAgICAgIHZhciBmb3JtVmFsdWUgPSBmb3JtRGF0YVtmb3JtS2V5XVxuICAgICAgICBpZiAoZm9ybVZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZvcm1WYWx1ZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgYXBwZW5kRm9ybVZhbHVlKGZvcm1LZXksIGZvcm1WYWx1ZVtqXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwZW5kRm9ybVZhbHVlKGZvcm1LZXksIGZvcm1WYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnFzKSB7XG4gICAgc2VsZi5xcyhvcHRpb25zLnFzKVxuICB9XG5cbiAgaWYgKHNlbGYudXJpLnBhdGgpIHtcbiAgICBzZWxmLnBhdGggPSBzZWxmLnVyaS5wYXRoXG4gIH0gZWxzZSB7XG4gICAgc2VsZi5wYXRoID0gc2VsZi51cmkucGF0aG5hbWUgKyAoc2VsZi51cmkuc2VhcmNoIHx8ICcnKVxuICB9XG5cbiAgaWYgKHNlbGYucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICBzZWxmLnBhdGggPSAnLydcbiAgfVxuXG4gIC8vIEF1dGggbXVzdCBoYXBwZW4gbGFzdCBpbiBjYXNlIHNpZ25pbmcgaXMgZGVwZW5kZW50IG9uIG90aGVyIGhlYWRlcnNcbiAgaWYgKG9wdGlvbnMuYXdzKSB7XG4gICAgc2VsZi5hd3Mob3B0aW9ucy5hd3MpXG4gIH1cblxuICBpZiAob3B0aW9ucy5oYXdrKSB7XG4gICAgc2VsZi5oYXdrKG9wdGlvbnMuaGF3aylcbiAgfVxuXG4gIGlmIChvcHRpb25zLmh0dHBTaWduYXR1cmUpIHtcbiAgICBzZWxmLmh0dHBTaWduYXR1cmUob3B0aW9ucy5odHRwU2lnbmF0dXJlKVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5hdXRoLCAndXNlcm5hbWUnKSkge1xuICAgICAgb3B0aW9ucy5hdXRoLnVzZXIgPSBvcHRpb25zLmF1dGgudXNlcm5hbWVcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLmF1dGgsICdwYXNzd29yZCcpKSB7XG4gICAgICBvcHRpb25zLmF1dGgucGFzcyA9IG9wdGlvbnMuYXV0aC5wYXNzd29yZFxuICAgIH1cblxuICAgIHNlbGYuYXV0aChcbiAgICAgIG9wdGlvbnMuYXV0aC51c2VyLFxuICAgICAgb3B0aW9ucy5hdXRoLnBhc3MsXG4gICAgICBvcHRpb25zLmF1dGguc2VuZEltbWVkaWF0ZWx5LFxuICAgICAgb3B0aW9ucy5hdXRoLmJlYXJlclxuICAgIClcbiAgfVxuXG4gIGlmIChzZWxmLmd6aXAgJiYgIXNlbGYuaGFzSGVhZGVyKCdhY2NlcHQtZW5jb2RpbmcnKSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKCdhY2NlcHQtZW5jb2RpbmcnLCAnZ3ppcCwgZGVmbGF0ZScpXG4gIH1cblxuICBpZiAoc2VsZi51cmkuYXV0aCAmJiAhc2VsZi5oYXNIZWFkZXIoJ2F1dGhvcml6YXRpb24nKSkge1xuICAgIHZhciB1cmlBdXRoUGllY2VzID0gc2VsZi51cmkuYXV0aC5zcGxpdCgnOicpLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gc2VsZi5fcXMudW5lc2NhcGUoaXRlbSkgfSlcbiAgICBzZWxmLmF1dGgodXJpQXV0aFBpZWNlc1swXSwgdXJpQXV0aFBpZWNlcy5zbGljZSgxKS5qb2luKCc6JyksIHRydWUpXG4gIH1cblxuICBpZiAoIXNlbGYudHVubmVsICYmIHNlbGYucHJveHkgJiYgc2VsZi5wcm94eS5hdXRoICYmICFzZWxmLmhhc0hlYWRlcigncHJveHktYXV0aG9yaXphdGlvbicpKSB7XG4gICAgdmFyIHByb3h5QXV0aFBpZWNlcyA9IHNlbGYucHJveHkuYXV0aC5zcGxpdCgnOicpLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gc2VsZi5fcXMudW5lc2NhcGUoaXRlbSkgfSlcbiAgICB2YXIgYXV0aEhlYWRlciA9ICdCYXNpYyAnICsgdG9CYXNlNjQocHJveHlBdXRoUGllY2VzLmpvaW4oJzonKSlcbiAgICBzZWxmLnNldEhlYWRlcigncHJveHktYXV0aG9yaXphdGlvbicsIGF1dGhIZWFkZXIpXG4gIH1cblxuICBpZiAoc2VsZi5wcm94eSAmJiAhc2VsZi50dW5uZWwpIHtcbiAgICBzZWxmLnBhdGggPSAoc2VsZi51cmkucHJvdG9jb2wgKyAnLy8nICsgc2VsZi51cmkuaG9zdCArIHNlbGYucGF0aClcbiAgfVxuXG4gIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICBzZWxmLmpzb24ob3B0aW9ucy5qc29uKVxuICB9XG4gIGlmIChvcHRpb25zLm11bHRpcGFydCkge1xuICAgIHNlbGYubXVsdGlwYXJ0KG9wdGlvbnMubXVsdGlwYXJ0KVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGltZSkge1xuICAgIHNlbGYudGltaW5nID0gdHJ1ZVxuXG4gICAgLy8gTk9URTogZWxhcHNlZFRpbWUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAudGltaW5nc1xuICAgIHNlbGYuZWxhcHNlZFRpbWUgPSBzZWxmLmVsYXBzZWRUaW1lIHx8IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENvbnRlbnRMZW5ndGggKCkge1xuICAgIGlmIChpc1R5cGVkQXJyYXkoc2VsZi5ib2R5KSkge1xuICAgICAgc2VsZi5ib2R5ID0gQnVmZmVyLmZyb20oc2VsZi5ib2R5KVxuICAgIH1cblxuICAgIGlmICghc2VsZi5oYXNIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIHZhciBsZW5ndGhcbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5ib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzZWxmLmJvZHkpXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc2VsZi5ib2R5KSkge1xuICAgICAgICBsZW5ndGggPSBzZWxmLmJvZHkucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgYi5sZW5ndGggfSwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aCA9IHNlbGYuYm9keS5sZW5ndGhcbiAgICAgIH1cblxuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICBzZWxmLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBsZW5ndGgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdBcmd1bWVudCBlcnJvciwgb3B0aW9ucy5ib2R5LicpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoc2VsZi5ib2R5ICYmICFpc3N0cmVhbShzZWxmLmJvZHkpKSB7XG4gICAgc2V0Q29udGVudExlbmd0aCgpXG4gIH1cblxuICBpZiAob3B0aW9ucy5vYXV0aCkge1xuICAgIHNlbGYub2F1dGgob3B0aW9ucy5vYXV0aClcbiAgfSBlbHNlIGlmIChzZWxmLl9vYXV0aC5wYXJhbXMgJiYgc2VsZi5oYXNIZWFkZXIoJ2F1dGhvcml6YXRpb24nKSkge1xuICAgIHNlbGYub2F1dGgoc2VsZi5fb2F1dGgucGFyYW1zKVxuICB9XG5cbiAgdmFyIHByb3RvY29sID0gc2VsZi5wcm94eSAmJiAhc2VsZi50dW5uZWwgPyBzZWxmLnByb3h5LnByb3RvY29sIDogc2VsZi51cmkucHJvdG9jb2xcbiAgdmFyIGRlZmF1bHRNb2R1bGVzID0geydodHRwOic6IGh0dHAsICdodHRwczonOiBodHRwc31cbiAgdmFyIGh0dHBNb2R1bGVzID0gc2VsZi5odHRwTW9kdWxlcyB8fCB7fVxuXG4gIHNlbGYuaHR0cE1vZHVsZSA9IGh0dHBNb2R1bGVzW3Byb3RvY29sXSB8fCBkZWZhdWx0TW9kdWxlc1twcm90b2NvbF1cblxuICBpZiAoIXNlbGYuaHR0cE1vZHVsZSkge1xuICAgIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdJbnZhbGlkIHByb3RvY29sOiAnICsgcHJvdG9jb2wpKVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuY2EpIHtcbiAgICBzZWxmLmNhID0gb3B0aW9ucy5jYVxuICB9XG5cbiAgaWYgKCFzZWxmLmFnZW50KSB7XG4gICAgaWYgKG9wdGlvbnMuYWdlbnRPcHRpb25zKSB7XG4gICAgICBzZWxmLmFnZW50T3B0aW9ucyA9IG9wdGlvbnMuYWdlbnRPcHRpb25zXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWdlbnRDbGFzcykge1xuICAgICAgc2VsZi5hZ2VudENsYXNzID0gb3B0aW9ucy5hZ2VudENsYXNzXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmZvcmV2ZXIpIHtcbiAgICAgIHZhciB2ID0gdmVyc2lvbigpXG4gICAgICAvLyB1c2UgRm9yZXZlckFnZW50IGluIG5vZGUgMC4xMC0gb25seVxuICAgICAgaWYgKHYubWFqb3IgPT09IDAgJiYgdi5taW5vciA8PSAxMCkge1xuICAgICAgICBzZWxmLmFnZW50Q2xhc3MgPSBwcm90b2NvbCA9PT0gJ2h0dHA6JyA/IEZvcmV2ZXJBZ2VudCA6IEZvcmV2ZXJBZ2VudC5TU0xcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuYWdlbnRDbGFzcyA9IHNlbGYuaHR0cE1vZHVsZS5BZ2VudFxuICAgICAgICBzZWxmLmFnZW50T3B0aW9ucyA9IHNlbGYuYWdlbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIHNlbGYuYWdlbnRPcHRpb25zLmtlZXBBbGl2ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5hZ2VudENsYXNzID0gc2VsZi5odHRwTW9kdWxlLkFnZW50XG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYucG9vbCA9PT0gZmFsc2UpIHtcbiAgICBzZWxmLmFnZW50ID0gZmFsc2VcbiAgfSBlbHNlIHtcbiAgICBzZWxmLmFnZW50ID0gc2VsZi5hZ2VudCB8fCBzZWxmLmdldE5ld0FnZW50KClcbiAgfVxuXG4gIHNlbGYub24oJ3BpcGUnLCBmdW5jdGlvbiAoc3JjKSB7XG4gICAgaWYgKHNlbGYubnRpY2sgJiYgc2VsZi5fc3RhcnRlZCkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignWW91IGNhbm5vdCBwaXBlIHRvIHRoaXMgc3RyZWFtIGFmdGVyIHRoZSBvdXRib3VuZCByZXF1ZXN0IGhhcyBzdGFydGVkLicpKVxuICAgIH1cbiAgICBzZWxmLnNyYyA9IHNyY1xuICAgIGlmIChpc1JlYWRTdHJlYW0oc3JjKSkge1xuICAgICAgaWYgKCFzZWxmLmhhc0hlYWRlcignY29udGVudC10eXBlJykpIHtcbiAgICAgICAgc2VsZi5zZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScsIG1pbWUubG9va3VwKHNyYy5wYXRoKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNyYy5oZWFkZXJzKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gc3JjLmhlYWRlcnMpIHtcbiAgICAgICAgICBpZiAoIXNlbGYuaGFzSGVhZGVyKGkpKSB7XG4gICAgICAgICAgICBzZWxmLnNldEhlYWRlcihpLCBzcmMuaGVhZGVyc1tpXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLl9qc29uICYmICFzZWxmLmhhc0hlYWRlcignY29udGVudC10eXBlJykpIHtcbiAgICAgICAgc2VsZi5zZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcbiAgICAgIH1cbiAgICAgIGlmIChzcmMubWV0aG9kICYmICFzZWxmLmV4cGxpY2l0TWV0aG9kKSB7XG4gICAgICAgIHNlbGYubWV0aG9kID0gc3JjLm1ldGhvZFxuICAgICAgfVxuICAgIH1cblxuICAvLyBzZWxmLm9uKCdwaXBlJywgZnVuY3Rpb24gKCkge1xuICAvLyAgIGNvbnNvbGUuZXJyb3IoJ1lvdSBoYXZlIGFscmVhZHkgcGlwZWQgdG8gdGhpcyBzdHJlYW0uIFBpcGVpbmcgdHdpY2UgaXMgbGlrZWx5IHRvIGJyZWFrIHRoZSByZXF1ZXN0LicpXG4gIC8vIH0pXG4gIH0pXG5cbiAgZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxmLl9hYm9ydGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuX2Zvcm0pIHtcbiAgICAgICAgaWYgKCFzZWxmLl9hdXRoLmhhc0F1dGgpIHtcbiAgICAgICAgICBzZWxmLl9mb3JtLnBpcGUoc2VsZilcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLl9hdXRoLmhhc0F1dGggJiYgc2VsZi5fYXV0aC5zZW50QXV0aCkge1xuICAgICAgICAgIHNlbGYuX2Zvcm0ucGlwZShzZWxmKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2VsZi5fbXVsdGlwYXJ0ICYmIHNlbGYuX211bHRpcGFydC5jaHVua2VkKSB7XG4gICAgICAgIHNlbGYuX211bHRpcGFydC5ib2R5LnBpcGUoc2VsZilcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLmJvZHkpIHtcbiAgICAgICAgaWYgKGlzc3RyZWFtKHNlbGYuYm9keSkpIHtcbiAgICAgICAgICBzZWxmLmJvZHkucGlwZShzZWxmKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldENvbnRlbnRMZW5ndGgoKVxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGYuYm9keSkpIHtcbiAgICAgICAgICAgIHNlbGYuYm9keS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgICAgICAgICAgIHNlbGYud3JpdGUocGFydClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYud3JpdGUoc2VsZi5ib2R5KVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLmVuZCgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5yZXF1ZXN0Qm9keVN0cmVhbSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ29wdGlvbnMucmVxdWVzdEJvZHlTdHJlYW0gaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHBhc3MgdGhlIHJlcXVlc3Qgb2JqZWN0IHRvIHN0cmVhbS5waXBlLicpXG4gICAgICAgIHNlbGYucmVxdWVzdEJvZHlTdHJlYW0ucGlwZShzZWxmKVxuICAgICAgfSBlbHNlIGlmICghc2VsZi5zcmMpIHtcbiAgICAgICAgaWYgKHNlbGYuX2F1dGguaGFzQXV0aCAmJiAhc2VsZi5fYXV0aC5zZW50QXV0aCkge1xuICAgICAgICAgIHNlbGYuZW5kKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5tZXRob2QgIT09ICdHRVQnICYmIHR5cGVvZiBzZWxmLm1ldGhvZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCAwKVxuICAgICAgICB9XG4gICAgICAgIHNlbGYuZW5kKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VsZi5fZm9ybSAmJiAhc2VsZi5oYXNIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIC8vIEJlZm9yZSBlbmRpbmcgdGhlIHJlcXVlc3QsIHdlIGhhZCB0byBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIHdob2xlIGZvcm0sIGFzeW5jbHlcbiAgICAgIHNlbGYuc2V0SGVhZGVyKHNlbGYuX2Zvcm0uZ2V0SGVhZGVycygpLCB0cnVlKVxuICAgICAgc2VsZi5fZm9ybS5nZXRMZW5ndGgoZnVuY3Rpb24gKGVyciwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICghZXJyICYmICFpc05hTihsZW5ndGgpKSB7XG4gICAgICAgICAgc2VsZi5zZXRIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJywgbGVuZ3RoKVxuICAgICAgICB9XG4gICAgICAgIGVuZCgpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbmQoKVxuICAgIH1cblxuICAgIHNlbGYubnRpY2sgPSB0cnVlXG4gIH0pXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmdldE5ld0FnZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIEFnZW50ID0gc2VsZi5hZ2VudENsYXNzXG4gIHZhciBvcHRpb25zID0ge31cbiAgaWYgKHNlbGYuYWdlbnRPcHRpb25zKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzZWxmLmFnZW50T3B0aW9ucykge1xuICAgICAgb3B0aW9uc1tpXSA9IHNlbGYuYWdlbnRPcHRpb25zW2ldXG4gICAgfVxuICB9XG4gIGlmIChzZWxmLmNhKSB7XG4gICAgb3B0aW9ucy5jYSA9IHNlbGYuY2FcbiAgfVxuICBpZiAoc2VsZi5jaXBoZXJzKSB7XG4gICAgb3B0aW9ucy5jaXBoZXJzID0gc2VsZi5jaXBoZXJzXG4gIH1cbiAgaWYgKHNlbGYuc2VjdXJlUHJvdG9jb2wpIHtcbiAgICBvcHRpb25zLnNlY3VyZVByb3RvY29sID0gc2VsZi5zZWN1cmVQcm90b2NvbFxuICB9XG4gIGlmIChzZWxmLnNlY3VyZU9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnNlY3VyZU9wdGlvbnMgPSBzZWxmLnNlY3VyZU9wdGlvbnNcbiAgfVxuICBpZiAodHlwZW9mIHNlbGYucmVqZWN0VW5hdXRob3JpemVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gc2VsZi5yZWplY3RVbmF1dGhvcml6ZWRcbiAgfVxuXG4gIGlmIChzZWxmLmNlcnQgJiYgc2VsZi5rZXkpIHtcbiAgICBvcHRpb25zLmtleSA9IHNlbGYua2V5XG4gICAgb3B0aW9ucy5jZXJ0ID0gc2VsZi5jZXJ0XG4gIH1cblxuICBpZiAoc2VsZi5wZngpIHtcbiAgICBvcHRpb25zLnBmeCA9IHNlbGYucGZ4XG4gIH1cblxuICBpZiAoc2VsZi5wYXNzcGhyYXNlKSB7XG4gICAgb3B0aW9ucy5wYXNzcGhyYXNlID0gc2VsZi5wYXNzcGhyYXNlXG4gIH1cblxuICB2YXIgcG9vbEtleSA9ICcnXG5cbiAgLy8gZGlmZmVyZW50IHR5cGVzIG9mIGFnZW50cyBhcmUgaW4gZGlmZmVyZW50IHBvb2xzXG4gIGlmIChBZ2VudCAhPT0gc2VsZi5odHRwTW9kdWxlLkFnZW50KSB7XG4gICAgcG9vbEtleSArPSBBZ2VudC5uYW1lXG4gIH1cblxuICAvLyBjYSBvcHRpb24gaXMgb25seSByZWxldmFudCBpZiBwcm94eSBvciBkZXN0aW5hdGlvbiBhcmUgaHR0cHNcbiAgdmFyIHByb3h5ID0gc2VsZi5wcm94eVxuICBpZiAodHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJykge1xuICAgIHByb3h5ID0gdXJsLnBhcnNlKHByb3h5KVxuICB9XG4gIHZhciBpc0h0dHBzID0gKHByb3h5ICYmIHByb3h5LnByb3RvY29sID09PSAnaHR0cHM6JykgfHwgdGhpcy51cmkucHJvdG9jb2wgPT09ICdodHRwczonXG5cbiAgaWYgKGlzSHR0cHMpIHtcbiAgICBpZiAob3B0aW9ucy5jYSkge1xuICAgICAgaWYgKHBvb2xLZXkpIHtcbiAgICAgICAgcG9vbEtleSArPSAnOidcbiAgICAgIH1cbiAgICAgIHBvb2xLZXkgKz0gb3B0aW9ucy5jYVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAocG9vbEtleSkge1xuICAgICAgICBwb29sS2V5ICs9ICc6J1xuICAgICAgfVxuICAgICAgcG9vbEtleSArPSBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNlcnQpIHtcbiAgICAgIGlmIChwb29sS2V5KSB7XG4gICAgICAgIHBvb2xLZXkgKz0gJzonXG4gICAgICB9XG4gICAgICBwb29sS2V5ICs9IG9wdGlvbnMuY2VydC50b1N0cmluZygnYXNjaWknKSArIG9wdGlvbnMua2V5LnRvU3RyaW5nKCdhc2NpaScpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucGZ4KSB7XG4gICAgICBpZiAocG9vbEtleSkge1xuICAgICAgICBwb29sS2V5ICs9ICc6J1xuICAgICAgfVxuICAgICAgcG9vbEtleSArPSBvcHRpb25zLnBmeC50b1N0cmluZygnYXNjaWknKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNpcGhlcnMpIHtcbiAgICAgIGlmIChwb29sS2V5KSB7XG4gICAgICAgIHBvb2xLZXkgKz0gJzonXG4gICAgICB9XG4gICAgICBwb29sS2V5ICs9IG9wdGlvbnMuY2lwaGVyc1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNlY3VyZVByb3RvY29sKSB7XG4gICAgICBpZiAocG9vbEtleSkge1xuICAgICAgICBwb29sS2V5ICs9ICc6J1xuICAgICAgfVxuICAgICAgcG9vbEtleSArPSBvcHRpb25zLnNlY3VyZVByb3RvY29sXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc2VjdXJlT3B0aW9ucykge1xuICAgICAgaWYgKHBvb2xLZXkpIHtcbiAgICAgICAgcG9vbEtleSArPSAnOidcbiAgICAgIH1cbiAgICAgIHBvb2xLZXkgKz0gb3B0aW9ucy5zZWN1cmVPcHRpb25zXG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYucG9vbCA9PT0gZ2xvYmFsUG9vbCAmJiAhcG9vbEtleSAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPT09IDAgJiYgc2VsZi5odHRwTW9kdWxlLmdsb2JhbEFnZW50KSB7XG4gICAgLy8gbm90IGRvaW5nIGFueXRoaW5nIHNwZWNpYWwuICBVc2UgdGhlIGdsb2JhbEFnZW50XG4gICAgcmV0dXJuIHNlbGYuaHR0cE1vZHVsZS5nbG9iYWxBZ2VudFxuICB9XG5cbiAgLy8gd2UncmUgdXNpbmcgYSBzdG9yZWQgYWdlbnQuICBNYWtlIHN1cmUgaXQncyBwcm90b2NvbC1zcGVjaWZpY1xuICBwb29sS2V5ID0gc2VsZi51cmkucHJvdG9jb2wgKyBwb29sS2V5XG5cbiAgLy8gZ2VuZXJhdGUgYSBuZXcgYWdlbnQgZm9yIHRoaXMgc2V0dGluZyBpZiBub25lIHlldCBleGlzdHNcbiAgaWYgKCFzZWxmLnBvb2xbcG9vbEtleV0pIHtcbiAgICBzZWxmLnBvb2xbcG9vbEtleV0gPSBuZXcgQWdlbnQob3B0aW9ucylcbiAgICAvLyBwcm9wZXJseSBzZXQgbWF4U29ja2V0cyBvbiBuZXcgYWdlbnRzXG4gICAgaWYgKHNlbGYucG9vbC5tYXhTb2NrZXRzKSB7XG4gICAgICBzZWxmLnBvb2xbcG9vbEtleV0ubWF4U29ja2V0cyA9IHNlbGYucG9vbC5tYXhTb2NrZXRzXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlbGYucG9vbFtwb29sS2V5XVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gc3RhcnQoKSBpcyBjYWxsZWQgb25jZSB3ZSBhcmUgcmVhZHkgdG8gc2VuZCB0aGUgb3V0Z29pbmcgSFRUUCByZXF1ZXN0LlxuICAvLyB0aGlzIGlzIHVzdWFsbHkgY2FsbGVkIG9uIHRoZSBmaXJzdCB3cml0ZSgpLCBlbmQoKSBvciBvbiBuZXh0VGljaygpXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChzZWxmLnRpbWluZykge1xuICAgIC8vIEFsbCB0aW1pbmdzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyByZXF1ZXN0J3Mgc3RhcnRUaW1lLiAgSW4gb3JkZXIgdG8gZG8gdGhpcyxcbiAgICAvLyB3ZSBuZWVkIHRvIGNhcHR1cmUgdGhlIHdhbGwtY2xvY2sgc3RhcnQgdGltZSAodmlhIERhdGUpLCBpbW1lZGlhdGVseSBmb2xsb3dlZFxuICAgIC8vIGJ5IHRoZSBoaWdoLXJlc29sdXRpb24gdGltZXIgKHZpYSBub3coKSkuICBXaGlsZSB0aGVzZSB0d28gd29uJ3QgYmUgc2V0XG4gICAgLy8gYXQgdGhlIF9leGFjdF8gc2FtZSB0aW1lLCB0aGV5IHNob3VsZCBiZSBjbG9zZSBlbm91Z2ggdG8gYmUgYWJsZSB0byBjYWxjdWxhdGVcbiAgICAvLyBoaWdoLXJlc29sdXRpb24sIG1vbm90b25pY2FsbHkgbm9uLWRlY3JlYXNpbmcgdGltZXN0YW1wcyByZWxhdGl2ZSB0byBzdGFydFRpbWUuXG4gICAgdmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgdmFyIHN0YXJ0VGltZU5vdyA9IG5vdygpXG4gIH1cblxuICBpZiAoc2VsZi5fYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgc2VsZi5fc3RhcnRlZCA9IHRydWVcbiAgc2VsZi5tZXRob2QgPSBzZWxmLm1ldGhvZCB8fCAnR0VUJ1xuICBzZWxmLmhyZWYgPSBzZWxmLnVyaS5ocmVmXG5cbiAgaWYgKHNlbGYuc3JjICYmIHNlbGYuc3JjLnN0YXQgJiYgc2VsZi5zcmMuc3RhdC5zaXplICYmICFzZWxmLmhhc0hlYWRlcignY29udGVudC1sZW5ndGgnKSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIHNlbGYuc3JjLnN0YXQuc2l6ZSlcbiAgfVxuICBpZiAoc2VsZi5fYXdzKSB7XG4gICAgc2VsZi5hd3Moc2VsZi5fYXdzLCB0cnVlKVxuICB9XG5cbiAgLy8gV2UgaGF2ZSBhIG1ldGhvZCBuYW1lZCBhdXRoLCB3aGljaCBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHRoZSBodHRwLnJlcXVlc3RcbiAgLy8gYXV0aCBvcHRpb24uICBJZiB3ZSBkb24ndCByZW1vdmUgaXQsIHdlJ3JlIGdvbm5hIGhhdmUgYSBiYWQgdGltZS5cbiAgdmFyIHJlcU9wdGlvbnMgPSBjb3B5KHNlbGYpXG4gIGRlbGV0ZSByZXFPcHRpb25zLmF1dGhcblxuICBkZWJ1ZygnbWFrZSByZXF1ZXN0Jywgc2VsZi51cmkuaHJlZilcblxuICAvLyBub2RlIHY2LjguMCBub3cgc3VwcG9ydHMgYSBgdGltZW91dGAgdmFsdWUgaW4gYGh0dHAucmVxdWVzdCgpYCwgYnV0IHdlXG4gIC8vIHNob3VsZCBkZWxldGUgaXQgZm9yIG5vdyBzaW5jZSB3ZSBoYW5kbGUgdGltZW91dHMgbWFudWFsbHkgZm9yIGJldHRlclxuICAvLyBjb25zaXN0ZW5jeSB3aXRoIG5vZGUgdmVyc2lvbnMgYmVmb3JlIHY2LjguMFxuICBkZWxldGUgcmVxT3B0aW9ucy50aW1lb3V0XG5cbiAgdHJ5IHtcbiAgICBzZWxmLnJlcSA9IHNlbGYuaHR0cE1vZHVsZS5yZXF1ZXN0KHJlcU9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2VsZi50aW1pbmcpIHtcbiAgICBzZWxmLnN0YXJ0VGltZSA9IHN0YXJ0VGltZVxuICAgIHNlbGYuc3RhcnRUaW1lTm93ID0gc3RhcnRUaW1lTm93XG5cbiAgICAvLyBUaW1pbmcgdmFsdWVzIHdpbGwgYWxsIGJlIHJlbGF0aXZlIHRvIHN0YXJ0VGltZSAoYnkgY29tcGFyaW5nIHRvIHN0YXJ0VGltZU5vd1xuICAgIC8vIHNvIHdlIGhhdmUgYW4gYWNjdXJhdGUgY2xvY2spXG4gICAgc2VsZi50aW1pbmdzID0ge31cbiAgfVxuXG4gIHZhciB0aW1lb3V0XG4gIGlmIChzZWxmLnRpbWVvdXQgJiYgIXNlbGYudGltZW91dFRpbWVyKSB7XG4gICAgaWYgKHNlbGYudGltZW91dCA8IDApIHtcbiAgICAgIHRpbWVvdXQgPSAwXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VsZi50aW1lb3V0ID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShzZWxmLnRpbWVvdXQpKSB7XG4gICAgICB0aW1lb3V0ID0gc2VsZi50aW1lb3V0XG4gICAgfVxuICB9XG5cbiAgc2VsZi5yZXEub24oJ3Jlc3BvbnNlJywgc2VsZi5vblJlcXVlc3RSZXNwb25zZS5iaW5kKHNlbGYpKVxuICBzZWxmLnJlcS5vbignZXJyb3InLCBzZWxmLm9uUmVxdWVzdEVycm9yLmJpbmQoc2VsZikpXG4gIHNlbGYucmVxLm9uKCdkcmFpbicsIGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLmVtaXQoJ2RyYWluJylcbiAgfSlcblxuICBzZWxmLnJlcS5vbignc29ja2V0JywgZnVuY3Rpb24gKHNvY2tldCkge1xuICAgIC8vIGAuX2Nvbm5lY3RpbmdgIHdhcyB0aGUgb2xkIHByb3BlcnR5IHdoaWNoIHdhcyBtYWRlIHB1YmxpYyBpbiBub2RlIHY2LjEuMFxuICAgIHZhciBpc0Nvbm5lY3RpbmcgPSBzb2NrZXQuX2Nvbm5lY3RpbmcgfHwgc29ja2V0LmNvbm5lY3RpbmdcbiAgICBpZiAoc2VsZi50aW1pbmcpIHtcbiAgICAgIHNlbGYudGltaW5ncy5zb2NrZXQgPSBub3coKSAtIHNlbGYuc3RhcnRUaW1lTm93XG5cbiAgICAgIGlmIChpc0Nvbm5lY3RpbmcpIHtcbiAgICAgICAgdmFyIG9uTG9va3VwVGltaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYudGltaW5ncy5sb29rdXAgPSBub3coKSAtIHNlbGYuc3RhcnRUaW1lTm93XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb25Db25uZWN0VGltaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNlbGYudGltaW5ncy5jb25uZWN0ID0gbm93KCkgLSBzZWxmLnN0YXJ0VGltZU5vd1xuICAgICAgICB9XG5cbiAgICAgICAgc29ja2V0Lm9uY2UoJ2xvb2t1cCcsIG9uTG9va3VwVGltaW5nKVxuICAgICAgICBzb2NrZXQub25jZSgnY29ubmVjdCcsIG9uQ29ubmVjdFRpbWluZylcblxuICAgICAgICAvLyBjbGVhbiB1cCB0aW1pbmcgZXZlbnQgbGlzdGVuZXJzIGlmIG5lZWRlZCBvbiBlcnJvclxuICAgICAgICBzZWxmLnJlcS5vbmNlKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2xvb2t1cCcsIG9uTG9va3VwVGltaW5nKVxuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdFRpbWluZylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2V0UmVxVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRoaXMgdGltZW91dCBzZXRzIHRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0ICpiZXR3ZWVuKiBieXRlcyBzZW50XG4gICAgICAvLyBmcm9tIHRoZSBzZXJ2ZXIgb25jZSBjb25uZWN0ZWQuXG4gICAgICAvL1xuICAgICAgLy8gSW4gcGFydGljdWxhciwgaXQncyB1c2VmdWwgZm9yIGVycm9yaW5nIGlmIHRoZSBzZXJ2ZXIgZmFpbHMgdG8gc2VuZFxuICAgICAgLy8gZGF0YSBoYWxmd2F5IHRocm91Z2ggc3RyZWFtaW5nIGEgcmVzcG9uc2UuXG4gICAgICBzZWxmLnJlcS5zZXRUaW1lb3V0KHRpbWVvdXQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNlbGYucmVxKSB7XG4gICAgICAgICAgc2VsZi5hYm9ydCgpXG4gICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ0VTT0NLRVRUSU1FRE9VVCcpXG4gICAgICAgICAgZS5jb2RlID0gJ0VTT0NLRVRUSU1FRE9VVCdcbiAgICAgICAgICBlLmNvbm5lY3QgPSBmYWxzZVxuICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPbmx5IHN0YXJ0IHRoZSBjb25uZWN0aW9uIHRpbWVyIGlmIHdlJ3JlIGFjdHVhbGx5IGNvbm5lY3RpbmcgYSBuZXdcbiAgICAgIC8vIHNvY2tldCwgb3RoZXJ3aXNlIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIChiZWNhdXNlIHRoaXMgaXMgYVxuICAgICAgLy8ga2VlcC1hbGl2ZSBjb25uZWN0aW9uKSBkbyBub3QgYm90aGVyLiBUaGlzIGlzIGltcG9ydGFudCBzaW5jZSB3ZSB3b24ndFxuICAgICAgLy8gZ2V0IGEgJ2Nvbm5lY3QnIGV2ZW50IGZvciBhbiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQuXG4gICAgICBpZiAoaXNDb25uZWN0aW5nKSB7XG4gICAgICAgIHZhciBvblJlcVNvY2tDb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uUmVxU29ja0Nvbm5lY3QpXG4gICAgICAgICAgc2VsZi5jbGVhclRpbWVvdXQoKVxuICAgICAgICAgIHNldFJlcVRpbWVvdXQoKVxuICAgICAgICB9XG5cbiAgICAgICAgc29ja2V0Lm9uKCdjb25uZWN0Jywgb25SZXFTb2NrQ29ubmVjdClcblxuICAgICAgICBzZWxmLnJlcS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaGFuZGxlLWNhbGxiYWNrLWVyclxuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uUmVxU29ja0Nvbm5lY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU2V0IGEgdGltZW91dCBpbiBtZW1vcnkgLSB0aGlzIGJsb2NrIHdpbGwgdGhyb3cgaWYgdGhlIHNlcnZlciB0YWtlcyBtb3JlXG4gICAgICAgIC8vIHRoYW4gYHRpbWVvdXRgIHRvIHdyaXRlIHRoZSBIVFRQIHN0YXR1cyBhbmQgaGVhZGVycyAoY29ycmVzcG9uZGluZyB0b1xuICAgICAgICAvLyB0aGUgb24oJ3Jlc3BvbnNlJykgZXZlbnQgb24gdGhlIGNsaWVudCkuIE5COiB0aGlzIG1lYXN1cmVzIHdhbGwtY2xvY2tcbiAgICAgICAgLy8gdGltZSwgbm90IHRoZSB0aW1lIGJldHdlZW4gYnl0ZXMgc2VudCBieSB0aGUgc2VydmVyLlxuICAgICAgICBzZWxmLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uUmVxU29ja0Nvbm5lY3QpXG4gICAgICAgICAgc2VsZi5hYm9ydCgpXG4gICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ0VUSU1FRE9VVCcpXG4gICAgICAgICAgZS5jb2RlID0gJ0VUSU1FRE9VVCdcbiAgICAgICAgICBlLmNvbm5lY3QgPSB0cnVlXG4gICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpXG4gICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IGNvbm5lY3RlZFxuICAgICAgICBzZXRSZXFUaW1lb3V0KClcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZi5lbWl0KCdzb2NrZXQnLCBzb2NrZXQpXG4gIH0pXG5cbiAgc2VsZi5lbWl0KCdyZXF1ZXN0Jywgc2VsZi5yZXEpXG59XG5cblJlcXVlc3QucHJvdG90eXBlLm9uUmVxdWVzdEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5fYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChzZWxmLnJlcSAmJiBzZWxmLnJlcS5fcmV1c2VkU29ja2V0ICYmIGVycm9yLmNvZGUgPT09ICdFQ09OTlJFU0VUJyAmJlxuICAgIHNlbGYuYWdlbnQuYWRkUmVxdWVzdE5vcmV1c2UpIHtcbiAgICBzZWxmLmFnZW50ID0geyBhZGRSZXF1ZXN0OiBzZWxmLmFnZW50LmFkZFJlcXVlc3ROb3JldXNlLmJpbmQoc2VsZi5hZ2VudCkgfVxuICAgIHNlbGYuc3RhcnQoKVxuICAgIHNlbGYucmVxLmVuZCgpXG4gICAgcmV0dXJuXG4gIH1cbiAgc2VsZi5jbGVhclRpbWVvdXQoKVxuICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG59XG5cblJlcXVlc3QucHJvdG90eXBlLm9uUmVxdWVzdFJlc3BvbnNlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGlmIChzZWxmLnRpbWluZykge1xuICAgIHNlbGYudGltaW5ncy5yZXNwb25zZSA9IG5vdygpIC0gc2VsZi5zdGFydFRpbWVOb3dcbiAgfVxuXG4gIGRlYnVnKCdvblJlcXVlc3RSZXNwb25zZScsIHNlbGYudXJpLmhyZWYsIHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMpXG4gIHJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGYudGltaW5nKSB7XG4gICAgICBzZWxmLnRpbWluZ3MuZW5kID0gbm93KCkgLSBzZWxmLnN0YXJ0VGltZU5vd1xuICAgICAgcmVzcG9uc2UudGltaW5nU3RhcnQgPSBzZWxmLnN0YXJ0VGltZVxuXG4gICAgICAvLyBmaWxsIGluIHRoZSBibGFua3MgZm9yIGFueSBwZXJpb2RzIHRoYXQgZGlkbid0IHRyaWdnZXIsIHN1Y2ggYXNcbiAgICAgIC8vIG5vIGxvb2t1cCBvciBjb25uZWN0IGR1ZSB0byBrZWVwIGFsaXZlXG4gICAgICBpZiAoIXNlbGYudGltaW5ncy5zb2NrZXQpIHtcbiAgICAgICAgc2VsZi50aW1pbmdzLnNvY2tldCA9IDBcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi50aW1pbmdzLmxvb2t1cCkge1xuICAgICAgICBzZWxmLnRpbWluZ3MubG9va3VwID0gc2VsZi50aW1pbmdzLnNvY2tldFxuICAgICAgfVxuICAgICAgaWYgKCFzZWxmLnRpbWluZ3MuY29ubmVjdCkge1xuICAgICAgICBzZWxmLnRpbWluZ3MuY29ubmVjdCA9IHNlbGYudGltaW5ncy5sb29rdXBcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi50aW1pbmdzLnJlc3BvbnNlKSB7XG4gICAgICAgIHNlbGYudGltaW5ncy5yZXNwb25zZSA9IHNlbGYudGltaW5ncy5jb25uZWN0XG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdlbGFwc2VkIHRpbWUnLCBzZWxmLnRpbWluZ3MuZW5kKVxuXG4gICAgICAvLyBlbGFwc2VkVGltZSBpbmNsdWRlcyBhbGwgcmVkaXJlY3RzXG4gICAgICBzZWxmLmVsYXBzZWRUaW1lICs9IE1hdGgucm91bmQoc2VsZi50aW1pbmdzLmVuZClcblxuICAgICAgLy8gTk9URTogZWxhcHNlZFRpbWUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAudGltaW5nc1xuICAgICAgcmVzcG9uc2UuZWxhcHNlZFRpbWUgPSBzZWxmLmVsYXBzZWRUaW1lXG5cbiAgICAgIC8vIHRpbWluZ3MgaXMganVzdCBmb3IgdGhlIGZpbmFsIGZldGNoXG4gICAgICByZXNwb25zZS50aW1pbmdzID0gc2VsZi50aW1pbmdzXG5cbiAgICAgIC8vIHByZS1jYWxjdWxhdGUgcGhhc2UgdGltaW5ncyBhcyB3ZWxsXG4gICAgICByZXNwb25zZS50aW1pbmdQaGFzZXMgPSB7XG4gICAgICAgIHdhaXQ6IHNlbGYudGltaW5ncy5zb2NrZXQsXG4gICAgICAgIGRuczogc2VsZi50aW1pbmdzLmxvb2t1cCAtIHNlbGYudGltaW5ncy5zb2NrZXQsXG4gICAgICAgIHRjcDogc2VsZi50aW1pbmdzLmNvbm5lY3QgLSBzZWxmLnRpbWluZ3MubG9va3VwLFxuICAgICAgICBmaXJzdEJ5dGU6IHNlbGYudGltaW5ncy5yZXNwb25zZSAtIHNlbGYudGltaW5ncy5jb25uZWN0LFxuICAgICAgICBkb3dubG9hZDogc2VsZi50aW1pbmdzLmVuZCAtIHNlbGYudGltaW5ncy5yZXNwb25zZSxcbiAgICAgICAgdG90YWw6IHNlbGYudGltaW5ncy5lbmRcbiAgICAgIH1cbiAgICB9XG4gICAgZGVidWcoJ3Jlc3BvbnNlIGVuZCcsIHNlbGYudXJpLmhyZWYsIHJlc3BvbnNlLnN0YXR1c0NvZGUsIHJlc3BvbnNlLmhlYWRlcnMpXG4gIH0pXG5cbiAgaWYgKHNlbGYuX2Fib3J0ZWQpIHtcbiAgICBkZWJ1ZygnYWJvcnRlZCcsIHNlbGYudXJpLmhyZWYpXG4gICAgcmVzcG9uc2UucmVzdW1lKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNlbGYucmVzcG9uc2UgPSByZXNwb25zZVxuICByZXNwb25zZS5yZXF1ZXN0ID0gc2VsZlxuICByZXNwb25zZS50b0pTT04gPSByZXNwb25zZVRvSlNPTlxuXG4gIC8vIFhYWCBUaGlzIGlzIGRpZmZlcmVudCBvbiAwLjEwLCBiZWNhdXNlIFNTTCBpcyBzdHJpY3QgYnkgZGVmYXVsdFxuICBpZiAoc2VsZi5odHRwTW9kdWxlID09PSBodHRwcyAmJlxuICAgIHNlbGYuc3RyaWN0U1NMICYmICghcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ3NvY2tldCcpIHx8XG4gICAgIXJlc3BvbnNlLnNvY2tldC5hdXRob3JpemVkKSkge1xuICAgIGRlYnVnKCdzdHJpY3Qgc3NsIGVycm9yJywgc2VsZi51cmkuaHJlZilcbiAgICB2YXIgc3NsRXJyID0gcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ3NvY2tldCcpID8gcmVzcG9uc2Uuc29ja2V0LmF1dGhvcml6YXRpb25FcnJvciA6IHNlbGYudXJpLmhyZWYgKyAnIGRvZXMgbm90IHN1cHBvcnQgU1NMJ1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1NTTCBFcnJvcjogJyArIHNzbEVycikpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBob3N0IGJlZm9yZSBhbnkgcmVkaXJlY3QgKGlmIGl0IGNoYW5nZXMsIHdlIG5lZWQgdG9cbiAgLy8gcmVtb3ZlIGFueSBhdXRob3JpemF0aW9uIGhlYWRlcnMpLiAgQWxzbyByZW1lbWJlciB0aGUgY2FzZSBvZiB0aGUgaGVhZGVyXG4gIC8vIG5hbWUgYmVjYXVzZSBsb3RzIG9mIGJyb2tlbiBzZXJ2ZXJzIGV4cGVjdCBIb3N0IGluc3RlYWQgb2YgaG9zdCBhbmQgd2VcbiAgLy8gd2FudCB0aGUgY2FsbGVyIHRvIGJlIGFibGUgdG8gc3BlY2lmeSB0aGlzLlxuICBzZWxmLm9yaWdpbmFsSG9zdCA9IHNlbGYuZ2V0SGVhZGVyKCdob3N0JylcbiAgaWYgKCFzZWxmLm9yaWdpbmFsSG9zdEhlYWRlck5hbWUpIHtcbiAgICBzZWxmLm9yaWdpbmFsSG9zdEhlYWRlck5hbWUgPSBzZWxmLmhhc0hlYWRlcignaG9zdCcpXG4gIH1cbiAgaWYgKHNlbGYuc2V0SG9zdCkge1xuICAgIHNlbGYucmVtb3ZlSGVhZGVyKCdob3N0JylcbiAgfVxuICBzZWxmLmNsZWFyVGltZW91dCgpXG5cbiAgdmFyIHRhcmdldENvb2tpZUphciA9IChzZWxmLl9qYXIgJiYgc2VsZi5famFyLnNldENvb2tpZSkgPyBzZWxmLl9qYXIgOiBnbG9iYWxDb29raWVKYXJcbiAgdmFyIGFkZENvb2tpZSA9IGZ1bmN0aW9uIChjb29raWUpIHtcbiAgICAvLyBzZXQgdGhlIGNvb2tpZSBpZiBpdCdzIGRvbWFpbiBpbiB0aGUgaHJlZidzIGRvbWFpbi5cbiAgICB0cnkge1xuICAgICAgdGFyZ2V0Q29va2llSmFyLnNldENvb2tpZShjb29raWUsIHNlbGYudXJpLmhyZWYsIHtpZ25vcmVFcnJvcjogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpXG4gICAgfVxuICB9XG5cbiAgcmVzcG9uc2UuY2FzZWxlc3MgPSBjYXNlbGVzcyhyZXNwb25zZS5oZWFkZXJzKVxuXG4gIGlmIChyZXNwb25zZS5jYXNlbGVzcy5oYXMoJ3NldC1jb29raWUnKSAmJiAoIXNlbGYuX2Rpc2FibGVDb29raWVzKSkge1xuICAgIHZhciBoZWFkZXJOYW1lID0gcmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdzZXQtY29va2llJylcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZS5oZWFkZXJzW2hlYWRlck5hbWVdKSkge1xuICAgICAgcmVzcG9uc2UuaGVhZGVyc1toZWFkZXJOYW1lXS5mb3JFYWNoKGFkZENvb2tpZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkQ29va2llKHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyTmFtZV0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYuX3JlZGlyZWN0Lm9uUmVzcG9uc2UocmVzcG9uc2UpKSB7XG4gICAgcmV0dXJuIC8vIElnbm9yZSB0aGUgcmVzdCBvZiB0aGUgcmVzcG9uc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBCZSBhIGdvb2Qgc3RyZWFtIGFuZCBlbWl0IGVuZCB3aGVuIHRoZSByZXNwb25zZSBpcyBmaW5pc2hlZC5cbiAgICAvLyBIYWNrIHRvIGVtaXQgZW5kIG9uIGNsb3NlIGJlY2F1c2Ugb2YgYSBjb3JlIGJ1ZyB0aGF0IG5ldmVyIGZpcmVzIGVuZFxuICAgIHJlc3BvbnNlLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc2VsZi5fZW5kZWQpIHtcbiAgICAgICAgc2VsZi5yZXNwb25zZS5lbWl0KCdlbmQnKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXNwb25zZS5vbmNlKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWVcbiAgICB9KVxuXG4gICAgdmFyIG5vQm9keSA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzZWxmLm1ldGhvZCA9PT0gJ0hFQUQnIHx8XG4gICAgICAgIC8vIEluZm9ybWF0aW9uYWxcbiAgICAgICAgKGNvZGUgPj0gMTAwICYmIGNvZGUgPCAyMDApIHx8XG4gICAgICAgIC8vIE5vIENvbnRlbnRcbiAgICAgICAgY29kZSA9PT0gMjA0IHx8XG4gICAgICAgIC8vIE5vdCBNb2RpZmllZFxuICAgICAgICBjb2RlID09PSAzMDRcbiAgICAgIClcbiAgICB9XG5cbiAgICB2YXIgcmVzcG9uc2VDb250ZW50XG4gICAgaWYgKHNlbGYuZ3ppcCAmJiAhbm9Cb2R5KHJlc3BvbnNlLnN0YXR1c0NvZGUpKSB7XG4gICAgICB2YXIgY29udGVudEVuY29kaW5nID0gcmVzcG9uc2UuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddIHx8ICdpZGVudGl0eSdcbiAgICAgIGNvbnRlbnRFbmNvZGluZyA9IGNvbnRlbnRFbmNvZGluZy50cmltKCkudG9Mb3dlckNhc2UoKVxuXG4gICAgICAvLyBCZSBtb3JlIGxlbmllbnQgd2l0aCBkZWNvZGluZyBjb21wcmVzc2VkIHJlc3BvbnNlcywgc2luY2UgKHZlcnkgcmFyZWx5KVxuICAgICAgLy8gc2VydmVycyBzZW5kIHNsaWdodGx5IGludmFsaWQgZ3ppcCByZXNwb25zZXMgdGhhdCBhcmUgc3RpbGwgYWNjZXB0ZWRcbiAgICAgIC8vIGJ5IGNvbW1vbiBicm93c2Vycy5cbiAgICAgIC8vIEFsd2F5cyB1c2luZyBaX1NZTkNfRkxVU0ggaXMgd2hhdCBjVVJMIGRvZXMuXG4gICAgICB2YXIgemxpYk9wdGlvbnMgPSB7XG4gICAgICAgIGZsdXNoOiB6bGliLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgZmluaXNoRmx1c2g6IHpsaWIuWl9TWU5DX0ZMVVNIXG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50RW5jb2RpbmcgPT09ICdnemlwJykge1xuICAgICAgICByZXNwb25zZUNvbnRlbnQgPSB6bGliLmNyZWF0ZUd1bnppcCh6bGliT3B0aW9ucylcbiAgICAgICAgcmVzcG9uc2UucGlwZShyZXNwb25zZUNvbnRlbnQpXG4gICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbmNvZGluZyA9PT0gJ2RlZmxhdGUnKSB7XG4gICAgICAgIHJlc3BvbnNlQ29udGVudCA9IHpsaWIuY3JlYXRlSW5mbGF0ZSh6bGliT3B0aW9ucylcbiAgICAgICAgcmVzcG9uc2UucGlwZShyZXNwb25zZUNvbnRlbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSBwcmV2aW91cyB2ZXJzaW9ucyBkaWRuJ3QgY2hlY2sgZm9yIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyLFxuICAgICAgICAvLyBpZ25vcmUgYW55IGludmFsaWQgdmFsdWVzIHRvIHByZXNlcnZlIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5XG4gICAgICAgIGlmIChjb250ZW50RW5jb2RpbmcgIT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICBkZWJ1ZygnaWdub3JpbmcgdW5yZWNvZ25pemVkIENvbnRlbnQtRW5jb2RpbmcgJyArIGNvbnRlbnRFbmNvZGluZylcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZVxuICAgIH1cblxuICAgIGlmIChzZWxmLmVuY29kaW5nKSB7XG4gICAgICBpZiAoc2VsZi5kZXN0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSWdub3JpbmcgZW5jb2RpbmcgcGFyYW1ldGVyIGFzIHRoaXMgc3RyZWFtIGlzIGJlaW5nIHBpcGVkIHRvIGFub3RoZXIgc3RyZWFtIHdoaWNoIG1ha2VzIHRoZSBlbmNvZGluZyBvcHRpb24gaW52YWxpZC4nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VDb250ZW50LnNldEVuY29kaW5nKHNlbGYuZW5jb2RpbmcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuX3BhdXNlZCkge1xuICAgICAgcmVzcG9uc2VDb250ZW50LnBhdXNlKClcbiAgICB9XG5cbiAgICBzZWxmLnJlc3BvbnNlQ29udGVudCA9IHJlc3BvbnNlQ29udGVudFxuXG4gICAgc2VsZi5lbWl0KCdyZXNwb25zZScsIHJlc3BvbnNlKVxuXG4gICAgc2VsZi5kZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChkZXN0KSB7XG4gICAgICBzZWxmLnBpcGVEZXN0KGRlc3QpXG4gICAgfSlcblxuICAgIHJlc3BvbnNlQ29udGVudC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgaWYgKHNlbGYudGltaW5nICYmICFzZWxmLnJlc3BvbnNlU3RhcnRlZCkge1xuICAgICAgICBzZWxmLnJlc3BvbnNlU3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKVxuXG4gICAgICAgIC8vIE5PVEU6IHJlc3BvbnNlU3RhcnRUaW1lIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgLnRpbWluZ3NcbiAgICAgICAgcmVzcG9uc2UucmVzcG9uc2VTdGFydFRpbWUgPSBzZWxmLnJlc3BvbnNlU3RhcnRUaW1lXG4gICAgICB9XG4gICAgICBzZWxmLl9kZXN0ZGF0YSA9IHRydWVcbiAgICAgIHNlbGYuZW1pdCgnZGF0YScsIGNodW5rKVxuICAgIH0pXG4gICAgcmVzcG9uc2VDb250ZW50Lm9uY2UoJ2VuZCcsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgc2VsZi5lbWl0KCdlbmQnLCBjaHVuaylcbiAgICB9KVxuICAgIHJlc3BvbnNlQ29udGVudC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnJvcilcbiAgICB9KVxuICAgIHJlc3BvbnNlQ29udGVudC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IHNlbGYuZW1pdCgnY2xvc2UnKSB9KVxuXG4gICAgaWYgKHNlbGYuY2FsbGJhY2spIHtcbiAgICAgIHNlbGYucmVhZFJlc3BvbnNlQm9keShyZXNwb25zZSlcbiAgICB9IGVsc2UgeyAvLyBpZiBubyBjYWxsYmFja1xuICAgICAgc2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2VsZi5fYWJvcnRlZCkge1xuICAgICAgICAgIGRlYnVnKCdhYm9ydGVkJywgc2VsZi51cmkuaHJlZilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgcmVzcG9uc2UpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBkZWJ1ZygnZmluaXNoIGluaXQgZnVuY3Rpb24nLCBzZWxmLnVyaS5ocmVmKVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5yZWFkUmVzcG9uc2VCb2R5ID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBkZWJ1ZyhcInJlYWRpbmcgcmVzcG9uc2UncyBib2R5XCIpXG4gIHZhciBidWZmZXJzID0gW11cbiAgdmFyIGJ1ZmZlckxlbmd0aCA9IDBcbiAgdmFyIHN0cmluZ3MgPSBbXVxuXG4gIHNlbGYub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgIHN0cmluZ3MucHVzaChjaHVuaylcbiAgICB9IGVsc2UgaWYgKGNodW5rLmxlbmd0aCkge1xuICAgICAgYnVmZmVyTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuICAgICAgYnVmZmVycy5wdXNoKGNodW5rKVxuICAgIH1cbiAgfSlcbiAgc2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCdlbmQgZXZlbnQnLCBzZWxmLnVyaS5ocmVmKVxuICAgIGlmIChzZWxmLl9hYm9ydGVkKSB7XG4gICAgICBkZWJ1ZygnYWJvcnRlZCcsIHNlbGYudXJpLmhyZWYpXG4gICAgICAvLyBgYnVmZmVyYCBpcyBkZWZpbmVkIGluIHRoZSBwYXJlbnQgc2NvcGUgYW5kIHVzZWQgaW4gYSBjbG9zdXJlIGl0IGV4aXN0cyBmb3IgdGhlIGxpZmUgb2YgdGhlIHJlcXVlc3QuXG4gICAgICAvLyBUaGlzIGNhbiBsZWFkIHRvIGxlYWt5IGJlaGF2aW9yIGlmIHRoZSB1c2VyIHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAgYnVmZmVycyA9IFtdXG4gICAgICBidWZmZXJMZW5ndGggPSAwXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYnVmZmVyTGVuZ3RoKSB7XG4gICAgICBkZWJ1ZygnaGFzIGJvZHknLCBzZWxmLnVyaS5ocmVmLCBidWZmZXJMZW5ndGgpXG4gICAgICByZXNwb25zZS5ib2R5ID0gQnVmZmVyLmNvbmNhdChidWZmZXJzLCBidWZmZXJMZW5ndGgpXG4gICAgICBpZiAoc2VsZi5lbmNvZGluZyAhPT0gbnVsbCkge1xuICAgICAgICByZXNwb25zZS5ib2R5ID0gcmVzcG9uc2UuYm9keS50b1N0cmluZyhzZWxmLmVuY29kaW5nKVxuICAgICAgfVxuICAgICAgLy8gYGJ1ZmZlcmAgaXMgZGVmaW5lZCBpbiB0aGUgcGFyZW50IHNjb3BlIGFuZCB1c2VkIGluIGEgY2xvc3VyZSBpdCBleGlzdHMgZm9yIHRoZSBsaWZlIG9mIHRoZSBSZXF1ZXN0LlxuICAgICAgLy8gVGhpcyBjYW4gbGVhZCB0byBsZWFreSBiZWhhdmlvciBpZiB0aGUgdXNlciByZXRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0IG9iamVjdC5cbiAgICAgIGJ1ZmZlcnMgPSBbXVxuICAgICAgYnVmZmVyTGVuZ3RoID0gMFxuICAgIH0gZWxzZSBpZiAoc3RyaW5ncy5sZW5ndGgpIHtcbiAgICAgIC8vIFRoZSBVVEY4IEJPTSBbMHhFRiwweEJCLDB4QkZdIGlzIGNvbnZlcnRlZCB0byBbMHhGRSwweEZGXSBpbiB0aGUgSlMgVVRDMTYvVUNTMiByZXByZXNlbnRhdGlvbi5cbiAgICAgIC8vIFN0cmlwIHRoaXMgdmFsdWUgb3V0IHdoZW4gdGhlIGVuY29kaW5nIGlzIHNldCB0byAndXRmOCcsIGFzIHVwc3RyZWFtIGNvbnN1bWVycyB3b24ndCBleHBlY3QgaXQgYW5kIGl0IGJyZWFrcyBKU09OLnBhcnNlKCkuXG4gICAgICBpZiAoc2VsZi5lbmNvZGluZyA9PT0gJ3V0ZjgnICYmIHN0cmluZ3NbMF0ubGVuZ3RoID4gMCAmJiBzdHJpbmdzWzBdWzBdID09PSAnXFx1RkVGRicpIHtcbiAgICAgICAgc3RyaW5nc1swXSA9IHN0cmluZ3NbMF0uc3Vic3RyaW5nKDEpXG4gICAgICB9XG4gICAgICByZXNwb25zZS5ib2R5ID0gc3RyaW5ncy5qb2luKCcnKVxuICAgIH1cblxuICAgIGlmIChzZWxmLl9qc29uKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZS5ib2R5ID0gSlNPTi5wYXJzZShyZXNwb25zZS5ib2R5LCBzZWxmLl9qc29uUmV2aXZlcilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWcoJ2ludmFsaWQgSlNPTiByZWNlaXZlZCcsIHNlbGYudXJpLmhyZWYpXG4gICAgICB9XG4gICAgfVxuICAgIGRlYnVnKCdlbWl0dGluZyBjb21wbGV0ZScsIHNlbGYudXJpLmhyZWYpXG4gICAgaWYgKHR5cGVvZiByZXNwb25zZS5ib2R5ID09PSAndW5kZWZpbmVkJyAmJiAhc2VsZi5fanNvbikge1xuICAgICAgcmVzcG9uc2UuYm9keSA9IHNlbGYuZW5jb2RpbmcgPT09IG51bGwgPyBCdWZmZXIuYWxsb2MoMCkgOiAnJ1xuICAgIH1cbiAgICBzZWxmLmVtaXQoJ2NvbXBsZXRlJywgcmVzcG9uc2UsIHJlc3BvbnNlLmJvZHkpXG4gIH0pXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgc2VsZi5fYWJvcnRlZCA9IHRydWVcblxuICBpZiAoc2VsZi5yZXEpIHtcbiAgICBzZWxmLnJlcS5hYm9ydCgpXG4gIH0gZWxzZSBpZiAoc2VsZi5yZXNwb25zZSkge1xuICAgIHNlbGYucmVzcG9uc2UuZGVzdHJveSgpXG4gIH1cblxuICBzZWxmLmNsZWFyVGltZW91dCgpXG4gIHNlbGYuZW1pdCgnYWJvcnQnKVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5waXBlRGVzdCA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcmVzcG9uc2UgPSBzZWxmLnJlc3BvbnNlXG4gIC8vIENhbGxlZCBhZnRlciB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWRcbiAgaWYgKGRlc3QuaGVhZGVycyAmJiAhZGVzdC5oZWFkZXJzU2VudCkge1xuICAgIGlmIChyZXNwb25zZS5jYXNlbGVzcy5oYXMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICB2YXIgY3RuYW1lID0gcmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdjb250ZW50LXR5cGUnKVxuICAgICAgaWYgKGRlc3Quc2V0SGVhZGVyKSB7XG4gICAgICAgIGRlc3Quc2V0SGVhZGVyKGN0bmFtZSwgcmVzcG9uc2UuaGVhZGVyc1tjdG5hbWVdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdC5oZWFkZXJzW2N0bmFtZV0gPSByZXNwb25zZS5oZWFkZXJzW2N0bmFtZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdjb250ZW50LWxlbmd0aCcpKSB7XG4gICAgICB2YXIgY2xuYW1lID0gcmVzcG9uc2UuY2FzZWxlc3MuaGFzKCdjb250ZW50LWxlbmd0aCcpXG4gICAgICBpZiAoZGVzdC5zZXRIZWFkZXIpIHtcbiAgICAgICAgZGVzdC5zZXRIZWFkZXIoY2xuYW1lLCByZXNwb25zZS5oZWFkZXJzW2NsbmFtZV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0LmhlYWRlcnNbY2xuYW1lXSA9IHJlc3BvbnNlLmhlYWRlcnNbY2xuYW1lXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGVzdC5zZXRIZWFkZXIgJiYgIWRlc3QuaGVhZGVyc1NlbnQpIHtcbiAgICBmb3IgKHZhciBpIGluIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIC8vIElmIHRoZSByZXNwb25zZSBjb250ZW50IGlzIGJlaW5nIGRlY29kZWQsIHRoZSBDb250ZW50LUVuY29kaW5nIGhlYWRlclxuICAgICAgLy8gb2YgdGhlIHJlc3BvbnNlIGRvZXNuJ3QgcmVwcmVzZW50IHRoZSBwaXBlZCBjb250ZW50LCBzbyBkb24ndCBwYXNzIGl0LlxuICAgICAgaWYgKCFzZWxmLmd6aXAgfHwgaSAhPT0gJ2NvbnRlbnQtZW5jb2RpbmcnKSB7XG4gICAgICAgIGRlc3Quc2V0SGVhZGVyKGksIHJlc3BvbnNlLmhlYWRlcnNbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIGRlc3Quc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGVcbiAgfVxuICBpZiAoc2VsZi5waXBlZmlsdGVyKSB7XG4gICAgc2VsZi5waXBlZmlsdGVyKHJlc3BvbnNlLCBkZXN0KVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLnFzID0gZnVuY3Rpb24gKHEsIGNsb2JiZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBiYXNlXG4gIGlmICghY2xvYmJlciAmJiBzZWxmLnVyaS5xdWVyeSkge1xuICAgIGJhc2UgPSBzZWxmLl9xcy5wYXJzZShzZWxmLnVyaS5xdWVyeSlcbiAgfSBlbHNlIHtcbiAgICBiYXNlID0ge31cbiAgfVxuXG4gIGZvciAodmFyIGkgaW4gcSkge1xuICAgIGJhc2VbaV0gPSBxW2ldXG4gIH1cblxuICB2YXIgcXMgPSBzZWxmLl9xcy5zdHJpbmdpZnkoYmFzZSlcblxuICBpZiAocXMgPT09ICcnKSB7XG4gICAgcmV0dXJuIHNlbGZcbiAgfVxuXG4gIHNlbGYudXJpID0gdXJsLnBhcnNlKHNlbGYudXJpLmhyZWYuc3BsaXQoJz8nKVswXSArICc/JyArIHFzKVxuICBzZWxmLnVybCA9IHNlbGYudXJpXG4gIHNlbGYucGF0aCA9IHNlbGYudXJpLnBhdGhcblxuICBpZiAoc2VsZi51cmkuaG9zdCA9PT0gJ3VuaXgnKSB7XG4gICAgc2VsZi5lbmFibGVVbml4U29ja2V0KClcbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5mb3JtID0gZnVuY3Rpb24gKGZvcm0pIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmIChmb3JtKSB7XG4gICAgaWYgKCEvXmFwcGxpY2F0aW9uXFwveC13d3ctZm9ybS11cmxlbmNvZGVkXFxiLy50ZXN0KHNlbGYuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSkpIHtcbiAgICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJylcbiAgICB9XG4gICAgc2VsZi5ib2R5ID0gKHR5cGVvZiBmb3JtID09PSAnc3RyaW5nJylcbiAgICAgID8gc2VsZi5fcXMucmZjMzk4Nihmb3JtLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgICA6IHNlbGYuX3FzLnN0cmluZ2lmeShmb3JtKS50b1N0cmluZygndXRmOCcpXG4gICAgcmV0dXJuIHNlbGZcbiAgfVxuICAvLyBjcmVhdGUgZm9ybS1kYXRhIG9iamVjdFxuICBzZWxmLl9mb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgc2VsZi5fZm9ybS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgZXJyLm1lc3NhZ2UgPSAnZm9ybS1kYXRhOiAnICsgZXJyLm1lc3NhZ2VcbiAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIHNlbGYuYWJvcnQoKVxuICB9KVxuICByZXR1cm4gc2VsZi5fZm9ybVxufVxuUmVxdWVzdC5wcm90b3R5cGUubXVsdGlwYXJ0ID0gZnVuY3Rpb24gKG11bHRpcGFydCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBzZWxmLl9tdWx0aXBhcnQub25SZXF1ZXN0KG11bHRpcGFydClcblxuICBpZiAoIXNlbGYuX211bHRpcGFydC5jaHVua2VkKSB7XG4gICAgc2VsZi5ib2R5ID0gc2VsZi5fbXVsdGlwYXJ0LmJvZHlcbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5qc29uID0gZnVuY3Rpb24gKHZhbCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAoIXNlbGYuaGFzSGVhZGVyKCdhY2NlcHQnKSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKCdhY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpXG4gIH1cblxuICBpZiAodHlwZW9mIHNlbGYuanNvblJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2VsZi5fanNvblJlcGxhY2VyID0gc2VsZi5qc29uUmVwbGFjZXJcbiAgfVxuXG4gIHNlbGYuX2pzb24gPSB0cnVlXG4gIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICBpZiAoc2VsZi5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghL15hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcYi8udGVzdChzZWxmLmdldEhlYWRlcignY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIHNlbGYuYm9keSA9IHNhZmVTdHJpbmdpZnkoc2VsZi5ib2R5LCBzZWxmLl9qc29uUmVwbGFjZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmJvZHkgPSBzZWxmLl9xcy5yZmMzOTg2KHNlbGYuYm9keSlcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi5oYXNIZWFkZXIoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbGYuYm9keSA9IHNhZmVTdHJpbmdpZnkodmFsLCBzZWxmLl9qc29uUmVwbGFjZXIpXG4gICAgaWYgKCFzZWxmLmhhc0hlYWRlcignY29udGVudC10eXBlJykpIHtcbiAgICAgIHNlbGYuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpXG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzZWxmLmpzb25SZXZpdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2VsZi5fanNvblJldml2ZXIgPSBzZWxmLmpzb25SZXZpdmVyXG4gIH1cblxuICByZXR1cm4gc2VsZlxufVxuUmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUsIGhlYWRlcnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciByZXN1bHQsIHJlLCBtYXRjaFxuICBpZiAoIWhlYWRlcnMpIHtcbiAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzXG4gIH1cbiAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggIT09IG5hbWUubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmUgPSBuZXcgUmVnRXhwKG5hbWUsICdpJylcbiAgICBtYXRjaCA9IGtleS5tYXRjaChyZSlcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJlc3VsdCA9IGhlYWRlcnNba2V5XVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuUmVxdWVzdC5wcm90b3R5cGUuZW5hYmxlVW5peFNvY2tldCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gR2V0IHRoZSBzb2NrZXQgJiByZXF1ZXN0IHBhdGhzIGZyb20gdGhlIFVSTFxuICB2YXIgdW5peFBhcnRzID0gdGhpcy51cmkucGF0aC5zcGxpdCgnOicpXG4gIHZhciBob3N0ID0gdW5peFBhcnRzWzBdXG4gIHZhciBwYXRoID0gdW5peFBhcnRzWzFdXG4gIC8vIEFwcGx5IHVuaXggcHJvcGVydGllcyB0byByZXF1ZXN0XG4gIHRoaXMuc29ja2V0UGF0aCA9IGhvc3RcbiAgdGhpcy51cmkucGF0aG5hbWUgPSBwYXRoXG4gIHRoaXMudXJpLnBhdGggPSBwYXRoXG4gIHRoaXMudXJpLmhvc3QgPSBob3N0XG4gIHRoaXMudXJpLmhvc3RuYW1lID0gaG9zdFxuICB0aGlzLnVyaS5pc1VuaXggPSB0cnVlXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbiAodXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5LCBiZWFyZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgc2VsZi5fYXV0aC5vblJlcXVlc3QodXNlciwgcGFzcywgc2VuZEltbWVkaWF0ZWx5LCBiZWFyZXIpXG5cbiAgcmV0dXJuIHNlbGZcbn1cblJlcXVlc3QucHJvdG90eXBlLmF3cyA9IGZ1bmN0aW9uIChvcHRzLCBub3cpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgaWYgKCFub3cpIHtcbiAgICBzZWxmLl9hd3MgPSBvcHRzXG4gICAgcmV0dXJuIHNlbGZcbiAgfVxuXG4gIGlmIChvcHRzLnNpZ25fdmVyc2lvbiA9PT0gNCB8fCBvcHRzLnNpZ25fdmVyc2lvbiA9PT0gJzQnKSB7XG4gICAgLy8gdXNlIGF3czRcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGhvc3Q6IHNlbGYudXJpLmhvc3QsXG4gICAgICBwYXRoOiBzZWxmLnVyaS5wYXRoLFxuICAgICAgbWV0aG9kOiBzZWxmLm1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHNlbGYuaGVhZGVycyxcbiAgICAgIGJvZHk6IHNlbGYuYm9keVxuICAgIH1cbiAgICBpZiAob3B0cy5zZXJ2aWNlKSB7XG4gICAgICBvcHRpb25zLnNlcnZpY2UgPSBvcHRzLnNlcnZpY2VcbiAgICB9XG4gICAgdmFyIHNpZ25SZXMgPSBhd3M0LnNpZ24ob3B0aW9ucywge1xuICAgICAgYWNjZXNzS2V5SWQ6IG9wdHMua2V5LFxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiBvcHRzLnNlY3JldCxcbiAgICAgIHNlc3Npb25Ub2tlbjogb3B0cy5zZXNzaW9uXG4gICAgfSlcbiAgICBzZWxmLnNldEhlYWRlcignYXV0aG9yaXphdGlvbicsIHNpZ25SZXMuaGVhZGVycy5BdXRob3JpemF0aW9uKVxuICAgIHNlbGYuc2V0SGVhZGVyKCd4LWFtei1kYXRlJywgc2lnblJlcy5oZWFkZXJzWydYLUFtei1EYXRlJ10pXG4gICAgaWYgKHNpZ25SZXMuaGVhZGVyc1snWC1BbXotU2VjdXJpdHktVG9rZW4nXSkge1xuICAgICAgc2VsZi5zZXRIZWFkZXIoJ3gtYW16LXNlY3VyaXR5LXRva2VuJywgc2lnblJlcy5oZWFkZXJzWydYLUFtei1TZWN1cml0eS1Ub2tlbiddKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBkZWZhdWx0OiB1c2UgYXdzLXNpZ24yXG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpXG4gICAgc2VsZi5zZXRIZWFkZXIoJ2RhdGUnLCBkYXRlLnRvVVRDU3RyaW5nKCkpXG4gICAgdmFyIGF1dGggPSB7XG4gICAgICBrZXk6IG9wdHMua2V5LFxuICAgICAgc2VjcmV0OiBvcHRzLnNlY3JldCxcbiAgICAgIHZlcmI6IHNlbGYubWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICBkYXRlOiBkYXRlLFxuICAgICAgY29udGVudFR5cGU6IHNlbGYuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSB8fCAnJyxcbiAgICAgIG1kNTogc2VsZi5nZXRIZWFkZXIoJ2NvbnRlbnQtbWQ1JykgfHwgJycsXG4gICAgICBhbWF6b25IZWFkZXJzOiBhd3MyLmNhbm9uaWNhbGl6ZUhlYWRlcnMoc2VsZi5oZWFkZXJzKVxuICAgIH1cbiAgICB2YXIgcGF0aCA9IHNlbGYudXJpLnBhdGhcbiAgICBpZiAob3B0cy5idWNrZXQgJiYgcGF0aCkge1xuICAgICAgYXV0aC5yZXNvdXJjZSA9ICcvJyArIG9wdHMuYnVja2V0ICsgcGF0aFxuICAgIH0gZWxzZSBpZiAob3B0cy5idWNrZXQgJiYgIXBhdGgpIHtcbiAgICAgIGF1dGgucmVzb3VyY2UgPSAnLycgKyBvcHRzLmJ1Y2tldFxuICAgIH0gZWxzZSBpZiAoIW9wdHMuYnVja2V0ICYmIHBhdGgpIHtcbiAgICAgIGF1dGgucmVzb3VyY2UgPSBwYXRoXG4gICAgfSBlbHNlIGlmICghb3B0cy5idWNrZXQgJiYgIXBhdGgpIHtcbiAgICAgIGF1dGgucmVzb3VyY2UgPSAnLydcbiAgICB9XG4gICAgYXV0aC5yZXNvdXJjZSA9IGF3czIuY2Fub25pY2FsaXplUmVzb3VyY2UoYXV0aC5yZXNvdXJjZSlcbiAgICBzZWxmLnNldEhlYWRlcignYXV0aG9yaXphdGlvbicsIGF3czIuYXV0aG9yaXphdGlvbihhdXRoKSlcbiAgfVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5odHRwU2lnbmF0dXJlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGh0dHBTaWduYXR1cmUuc2lnblJlcXVlc3Qoe1xuICAgIGdldEhlYWRlcjogZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0SGVhZGVyKGhlYWRlciwgc2VsZi5oZWFkZXJzKVxuICAgIH0sXG4gICAgc2V0SGVhZGVyOiBmdW5jdGlvbiAoaGVhZGVyLCB2YWx1ZSkge1xuICAgICAgc2VsZi5zZXRIZWFkZXIoaGVhZGVyLCB2YWx1ZSlcbiAgICB9LFxuICAgIG1ldGhvZDogc2VsZi5tZXRob2QsXG4gICAgcGF0aDogc2VsZi5wYXRoXG4gIH0sIG9wdHMpXG4gIGRlYnVnKCdodHRwU2lnbmF0dXJlIGF1dGhvcml6YXRpb24nLCBzZWxmLmdldEhlYWRlcignYXV0aG9yaXphdGlvbicpKVxuXG4gIHJldHVybiBzZWxmXG59XG5SZXF1ZXN0LnByb3RvdHlwZS5oYXdrID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHNlbGYuc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgaGF3ay5oZWFkZXIoc2VsZi51cmksIHNlbGYubWV0aG9kLCBvcHRzKSlcbn1cblJlcXVlc3QucHJvdG90eXBlLm9hdXRoID0gZnVuY3Rpb24gKF9vYXV0aCkge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBzZWxmLl9vYXV0aC5vblJlcXVlc3QoX29hdXRoKVxuXG4gIHJldHVybiBzZWxmXG59XG5cblJlcXVlc3QucHJvdG90eXBlLmphciA9IGZ1bmN0aW9uIChqYXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBjb29raWVzXG5cbiAgaWYgKHNlbGYuX3JlZGlyZWN0LnJlZGlyZWN0c0ZvbGxvd2VkID09PSAwKSB7XG4gICAgc2VsZi5vcmlnaW5hbENvb2tpZUhlYWRlciA9IHNlbGYuZ2V0SGVhZGVyKCdjb29raWUnKVxuICB9XG5cbiAgaWYgKCFqYXIpIHtcbiAgICAvLyBkaXNhYmxlIGNvb2tpZXNcbiAgICBjb29raWVzID0gZmFsc2VcbiAgICBzZWxmLl9kaXNhYmxlQ29va2llcyA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFyZ2V0Q29va2llSmFyID0gamFyLmdldENvb2tpZVN0cmluZyA/IGphciA6IGdsb2JhbENvb2tpZUphclxuICAgIHZhciB1cmlocmVmID0gc2VsZi51cmkuaHJlZlxuICAgIC8vIGZldGNoIGNvb2tpZSBpbiB0aGUgU3BlY2lmaWVkIGhvc3RcbiAgICBpZiAodGFyZ2V0Q29va2llSmFyKSB7XG4gICAgICBjb29raWVzID0gdGFyZ2V0Q29va2llSmFyLmdldENvb2tpZVN0cmluZyh1cmlocmVmKVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIG5lZWQgY29va2llIGFuZCBjb29raWUgaXMgbm90IGVtcHR5XG4gIGlmIChjb29raWVzICYmIGNvb2tpZXMubGVuZ3RoKSB7XG4gICAgaWYgKHNlbGYub3JpZ2luYWxDb29raWVIZWFkZXIpIHtcbiAgICAgIC8vIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBDb29raWUgaGVhZGVyXG4gICAgICBzZWxmLnNldEhlYWRlcignY29va2llJywgc2VsZi5vcmlnaW5hbENvb2tpZUhlYWRlciArICc7ICcgKyBjb29raWVzKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldEhlYWRlcignY29va2llJywgY29va2llcylcbiAgICB9XG4gIH1cbiAgc2VsZi5famFyID0gamFyXG4gIHJldHVybiBzZWxmXG59XG5cbi8vIFN0cmVhbSBBUElcblJlcXVlc3QucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgb3B0cykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBpZiAoc2VsZi5yZXNwb25zZSkge1xuICAgIGlmIChzZWxmLl9kZXN0ZGF0YSkge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignWW91IGNhbm5vdCBwaXBlIGFmdGVyIGRhdGEgaGFzIGJlZW4gZW1pdHRlZCBmcm9tIHRoZSByZXNwb25zZS4nKSlcbiAgICB9IGVsc2UgaWYgKHNlbGYuX2VuZGVkKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdZb3UgY2Fubm90IHBpcGUgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGVuZGVkLicpKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0uU3RyZWFtLnByb3RvdHlwZS5waXBlLmNhbGwoc2VsZiwgZGVzdCwgb3B0cylcbiAgICAgIHNlbGYucGlwZURlc3QoZGVzdClcbiAgICAgIHJldHVybiBkZXN0XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbGYuZGVzdHMucHVzaChkZXN0KVxuICAgIHN0cmVhbS5TdHJlYW0ucHJvdG90eXBlLnBpcGUuY2FsbChzZWxmLCBkZXN0LCBvcHRzKVxuICAgIHJldHVybiBkZXN0XG4gIH1cbn1cblJlcXVlc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgaWYgKHNlbGYuX2Fib3J0ZWQpIHsgcmV0dXJuIH1cblxuICBpZiAoIXNlbGYuX3N0YXJ0ZWQpIHtcbiAgICBzZWxmLnN0YXJ0KClcbiAgfVxuICBpZiAoc2VsZi5yZXEpIHtcbiAgICByZXR1cm4gc2VsZi5yZXEud3JpdGUuYXBwbHkoc2VsZi5yZXEsIGFyZ3VtZW50cylcbiAgfVxufVxuUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoc2VsZi5fYWJvcnRlZCkgeyByZXR1cm4gfVxuXG4gIGlmIChjaHVuaykge1xuICAgIHNlbGYud3JpdGUoY2h1bmspXG4gIH1cbiAgaWYgKCFzZWxmLl9zdGFydGVkKSB7XG4gICAgc2VsZi5zdGFydCgpXG4gIH1cbiAgaWYgKHNlbGYucmVxKSB7XG4gICAgc2VsZi5yZXEuZW5kKClcbiAgfVxufVxuUmVxdWVzdC5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBpZiAoIXNlbGYucmVzcG9uc2VDb250ZW50KSB7XG4gICAgc2VsZi5fcGF1c2VkID0gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHNlbGYucmVzcG9uc2VDb250ZW50LnBhdXNlLmFwcGx5KHNlbGYucmVzcG9uc2VDb250ZW50LCBhcmd1bWVudHMpXG4gIH1cbn1cblJlcXVlc3QucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghc2VsZi5yZXNwb25zZUNvbnRlbnQpIHtcbiAgICBzZWxmLl9wYXVzZWQgPSBmYWxzZVxuICB9IGVsc2Uge1xuICAgIHNlbGYucmVzcG9uc2VDb250ZW50LnJlc3VtZS5hcHBseShzZWxmLnJlc3BvbnNlQ29udGVudCwgYXJndW1lbnRzKVxuICB9XG59XG5SZXF1ZXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXNcbiAgdGhpcy5jbGVhclRpbWVvdXQoKVxuICBpZiAoIXNlbGYuX2VuZGVkKSB7XG4gICAgc2VsZi5lbmQoKVxuICB9IGVsc2UgaWYgKHNlbGYucmVzcG9uc2UpIHtcbiAgICBzZWxmLnJlc3BvbnNlLmRlc3Ryb3koKVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudGltZW91dFRpbWVyKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKVxuICAgIHRoaXMudGltZW91dFRpbWVyID0gbnVsbFxuICB9XG59XG5cblJlcXVlc3QuZGVmYXVsdFByb3h5SGVhZGVyV2hpdGVMaXN0ID1cbiAgVHVubmVsLmRlZmF1bHRQcm94eUhlYWRlcldoaXRlTGlzdC5zbGljZSgpXG5cblJlcXVlc3QuZGVmYXVsdFByb3h5SGVhZGVyRXhjbHVzaXZlTGlzdCA9XG4gIFR1bm5lbC5kZWZhdWx0UHJveHlIZWFkZXJFeGNsdXNpdmVMaXN0LnNsaWNlKClcblxuLy8gRXhwb3J0c1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50b0pTT04gPSByZXF1ZXN0VG9KU09OXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RcbiIsICIvLyBDb3B5cmlnaHQgMjAxMC0yMDEyIE1pa2VhbCBSb2dlcnNcbi8vXG4vLyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJylcbnZhciBjb29raWVzID0gcmVxdWlyZSgnLi9saWIvY29va2llcycpXG52YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vbGliL2hlbHBlcnMnKVxuXG52YXIgcGFyYW1zSGF2ZVJlcXVlc3RCb2R5ID0gaGVscGVycy5wYXJhbXNIYXZlUmVxdWVzdEJvZHlcblxuLy8gb3JnYW5pemUgcGFyYW1zIGZvciBwYXRjaCwgcG9zdCwgcHV0LCBoZWFkLCBkZWxcbmZ1bmN0aW9uIGluaXRQYXJhbXMgKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zXG4gIH1cblxuICB2YXIgcGFyYW1zID0ge31cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgZXh0ZW5kKHBhcmFtcywgb3B0aW9ucywge3VyaTogdXJpfSlcbiAgfSBlbHNlIGlmICh0eXBlb2YgdXJpID09PSAnc3RyaW5nJykge1xuICAgIGV4dGVuZChwYXJhbXMsIHt1cmk6IHVyaX0pXG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKHBhcmFtcywgdXJpKVxuICB9XG5cbiAgcGFyYW1zLmNhbGxiYWNrID0gY2FsbGJhY2sgfHwgcGFyYW1zLmNhbGxiYWNrXG4gIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gcmVxdWVzdCAodXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHVyaSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCB1cmkgb3Igb3B0aW9ucyBvYmplY3QuJylcbiAgfVxuXG4gIHZhciBwYXJhbXMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgaWYgKHBhcmFtcy5tZXRob2QgPT09ICdIRUFEJyAmJiBwYXJhbXNIYXZlUmVxdWVzdEJvZHkocGFyYW1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSFRUUCBIRUFEIHJlcXVlc3RzIE1VU1QgTk9UIGluY2x1ZGUgYSByZXF1ZXN0IGJvZHkuJylcbiAgfVxuXG4gIHJldHVybiBuZXcgcmVxdWVzdC5SZXF1ZXN0KHBhcmFtcylcbn1cblxuZnVuY3Rpb24gdmVyYkZ1bmMgKHZlcmIpIHtcbiAgdmFyIG1ldGhvZCA9IHZlcmIudG9VcHBlckNhc2UoKVxuICByZXR1cm4gZnVuY3Rpb24gKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHBhcmFtcy5tZXRob2QgPSBtZXRob2RcbiAgICByZXR1cm4gcmVxdWVzdChwYXJhbXMsIHBhcmFtcy5jYWxsYmFjaylcbiAgfVxufVxuXG4vLyBkZWZpbmUgbGlrZSB0aGlzIHRvIHBsZWFzZSBjb2RlaW50ZWwvaW50ZWxsaXNlbnNlIElERXNcbnJlcXVlc3QuZ2V0ID0gdmVyYkZ1bmMoJ2dldCcpXG5yZXF1ZXN0LmhlYWQgPSB2ZXJiRnVuYygnaGVhZCcpXG5yZXF1ZXN0Lm9wdGlvbnMgPSB2ZXJiRnVuYygnb3B0aW9ucycpXG5yZXF1ZXN0LnBvc3QgPSB2ZXJiRnVuYygncG9zdCcpXG5yZXF1ZXN0LnB1dCA9IHZlcmJGdW5jKCdwdXQnKVxucmVxdWVzdC5wYXRjaCA9IHZlcmJGdW5jKCdwYXRjaCcpXG5yZXF1ZXN0LmRlbCA9IHZlcmJGdW5jKCdkZWxldGUnKVxucmVxdWVzdFsnZGVsZXRlJ10gPSB2ZXJiRnVuYygnZGVsZXRlJylcblxucmVxdWVzdC5qYXIgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgcmV0dXJuIGNvb2tpZXMuamFyKHN0b3JlKVxufVxuXG5yZXF1ZXN0LmNvb2tpZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIGNvb2tpZXMucGFyc2Uoc3RyKVxufVxuXG5mdW5jdGlvbiB3cmFwUmVxdWVzdE1ldGhvZCAobWV0aG9kLCBvcHRpb25zLCByZXF1ZXN0ZXIsIHZlcmIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh1cmksIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHBhcmFtcyA9IGluaXRQYXJhbXModXJpLCBvcHRzLCBjYWxsYmFjaylcblxuICAgIHZhciB0YXJnZXQgPSB7fVxuICAgIGV4dGVuZCh0cnVlLCB0YXJnZXQsIG9wdGlvbnMsIHBhcmFtcylcblxuICAgIHRhcmdldC5wb29sID0gcGFyYW1zLnBvb2wgfHwgb3B0aW9ucy5wb29sXG5cbiAgICBpZiAodmVyYikge1xuICAgICAgdGFyZ2V0Lm1ldGhvZCA9IHZlcmIudG9VcHBlckNhc2UoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVxdWVzdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtZXRob2QgPSByZXF1ZXN0ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0aG9kKHRhcmdldCwgdGFyZ2V0LmNhbGxiYWNrKVxuICB9XG59XG5cbnJlcXVlc3QuZGVmYXVsdHMgPSBmdW5jdGlvbiAob3B0aW9ucywgcmVxdWVzdGVyKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVxdWVzdGVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgdmFyIGRlZmF1bHRzID0gd3JhcFJlcXVlc3RNZXRob2Qoc2VsZiwgb3B0aW9ucywgcmVxdWVzdGVyKVxuXG4gIHZhciB2ZXJicyA9IFsnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnZGVsJywgJ2RlbGV0ZSddXG4gIHZlcmJzLmZvckVhY2goZnVuY3Rpb24gKHZlcmIpIHtcbiAgICBkZWZhdWx0c1t2ZXJiXSA9IHdyYXBSZXF1ZXN0TWV0aG9kKHNlbGZbdmVyYl0sIG9wdGlvbnMsIHJlcXVlc3RlciwgdmVyYilcbiAgfSlcblxuICBkZWZhdWx0cy5jb29raWUgPSB3cmFwUmVxdWVzdE1ldGhvZChzZWxmLmNvb2tpZSwgb3B0aW9ucywgcmVxdWVzdGVyKVxuICBkZWZhdWx0cy5qYXIgPSBzZWxmLmphclxuICBkZWZhdWx0cy5kZWZhdWx0cyA9IHNlbGYuZGVmYXVsdHNcbiAgcmV0dXJuIGRlZmF1bHRzXG59XG5cbnJlcXVlc3QuZm9yZXZlciA9IGZ1bmN0aW9uIChhZ2VudE9wdGlvbnMsIG9wdGlvbnNBcmcpIHtcbiAgdmFyIG9wdGlvbnMgPSB7fVxuICBpZiAob3B0aW9uc0FyZykge1xuICAgIGV4dGVuZChvcHRpb25zLCBvcHRpb25zQXJnKVxuICB9XG4gIGlmIChhZ2VudE9wdGlvbnMpIHtcbiAgICBvcHRpb25zLmFnZW50T3B0aW9ucyA9IGFnZW50T3B0aW9uc1xuICB9XG5cbiAgb3B0aW9ucy5mb3JldmVyID0gdHJ1ZVxuICByZXR1cm4gcmVxdWVzdC5kZWZhdWx0cyhvcHRpb25zKVxufVxuXG4vLyBFeHBvcnRzXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdFxucmVxdWVzdC5SZXF1ZXN0ID0gcmVxdWlyZSgnLi9yZXF1ZXN0JylcbnJlcXVlc3QuaW5pdFBhcmFtcyA9IGluaXRQYXJhbXNcblxuLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHJlcXVlc3QuZGVidWdcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1ZXN0LCAnZGVidWcnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZXF1ZXN0LlJlcXVlc3QuZGVidWdcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoZGVidWcpIHtcbiAgICByZXF1ZXN0LlJlcXVlc3QuZGVidWcgPSBkZWJ1Z1xuICB9XG59KVxuIiwgIm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuZnVuY3Rpb24gY2hlY2tQYXRoRXh0IChwYXRoLCBvcHRpb25zKSB7XG4gIHZhciBwYXRoZXh0ID0gb3B0aW9ucy5wYXRoRXh0ICE9PSB1bmRlZmluZWQgP1xuICAgIG9wdGlvbnMucGF0aEV4dCA6IHByb2Nlc3MuZW52LlBBVEhFWFRcblxuICBpZiAoIXBhdGhleHQpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcGF0aGV4dCA9IHBhdGhleHQuc3BsaXQoJzsnKVxuICBpZiAocGF0aGV4dC5pbmRleE9mKCcnKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aGV4dC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwID0gcGF0aGV4dFtpXS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKHAgJiYgcGF0aC5zdWJzdHIoLXAubGVuZ3RoKS50b0xvd2VyQ2FzZSgpID09PSBwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gY2hlY2tTdGF0IChzdGF0LCBwYXRoLCBvcHRpb25zKSB7XG4gIGlmICghc3RhdC5pc1N5bWJvbGljTGluaygpICYmICFzdGF0LmlzRmlsZSgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGNoZWNrUGF0aEV4dChwYXRoLCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBpc2V4ZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXIsIHN0YXQpIHtcbiAgICBjYihlciwgZXIgPyBmYWxzZSA6IGNoZWNrU3RhdChzdGF0LCBwYXRoLCBvcHRpb25zKSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuICByZXR1cm4gY2hlY2tTdGF0KGZzLnN0YXRTeW5jKHBhdGgpLCBwYXRoLCBvcHRpb25zKVxufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGZzLnN0YXQocGF0aCwgZnVuY3Rpb24gKGVyLCBzdGF0KSB7XG4gICAgY2IoZXIsIGVyID8gZmFsc2UgOiBjaGVja1N0YXQoc3RhdCwgb3B0aW9ucykpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoZWNrU3RhdChmcy5zdGF0U3luYyhwYXRoKSwgb3B0aW9ucylcbn1cblxuZnVuY3Rpb24gY2hlY2tTdGF0IChzdGF0LCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGF0LmlzRmlsZSgpICYmIGNoZWNrTW9kZShzdGF0LCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBjaGVja01vZGUgKHN0YXQsIG9wdGlvbnMpIHtcbiAgdmFyIG1vZCA9IHN0YXQubW9kZVxuICB2YXIgdWlkID0gc3RhdC51aWRcbiAgdmFyIGdpZCA9IHN0YXQuZ2lkXG5cbiAgdmFyIG15VWlkID0gb3B0aW9ucy51aWQgIT09IHVuZGVmaW5lZCA/XG4gICAgb3B0aW9ucy51aWQgOiBwcm9jZXNzLmdldHVpZCAmJiBwcm9jZXNzLmdldHVpZCgpXG4gIHZhciBteUdpZCA9IG9wdGlvbnMuZ2lkICE9PSB1bmRlZmluZWQgP1xuICAgIG9wdGlvbnMuZ2lkIDogcHJvY2Vzcy5nZXRnaWQgJiYgcHJvY2Vzcy5nZXRnaWQoKVxuXG4gIHZhciB1ID0gcGFyc2VJbnQoJzEwMCcsIDgpXG4gIHZhciBnID0gcGFyc2VJbnQoJzAxMCcsIDgpXG4gIHZhciBvID0gcGFyc2VJbnQoJzAwMScsIDgpXG4gIHZhciB1ZyA9IHUgfCBnXG5cbiAgdmFyIHJldCA9IChtb2QgJiBvKSB8fFxuICAgIChtb2QgJiBnKSAmJiBnaWQgPT09IG15R2lkIHx8XG4gICAgKG1vZCAmIHUpICYmIHVpZCA9PT0gbXlVaWQgfHxcbiAgICAobW9kICYgdWcpICYmIG15VWlkID09PSAwXG5cbiAgcmV0dXJuIHJldFxufVxuIiwgInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBjb3JlXG5pZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyB8fCBnbG9iYWwuVEVTVElOR19XSU5ET1dTKSB7XG4gIGNvcmUgPSByZXF1aXJlKCcuL3dpbmRvd3MuanMnKVxufSBlbHNlIHtcbiAgY29yZSA9IHJlcXVpcmUoJy4vbW9kZS5qcycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNleGVcbmlzZXhlLnN5bmMgPSBzeW5jXG5cbmZ1bmN0aW9uIGlzZXhlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdGlvbnNcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIGlmICghY2IpIHtcbiAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIG5vdCBwcm92aWRlZCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlzZXhlKHBhdGgsIG9wdGlvbnMgfHwge30sIGZ1bmN0aW9uIChlciwgaXMpIHtcbiAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgcmVqZWN0KGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoaXMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGNvcmUocGF0aCwgb3B0aW9ucyB8fCB7fSwgZnVuY3Rpb24gKGVyLCBpcykge1xuICAgIC8vIGlnbm9yZSBFQUNDRVMgYmVjYXVzZSB0aGF0IGp1c3QgbWVhbnMgd2UgYXJlbid0IGFsbG93ZWQgdG8gcnVuIGl0XG4gICAgaWYgKGVyKSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBQ0NFUycgfHwgb3B0aW9ucyAmJiBvcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICBlciA9IG51bGxcbiAgICAgICAgaXMgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBjYihlciwgaXMpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcbiAgLy8gbXkga2luZ2RvbSBmb3IgYSBmaWx0ZXJlZCBjYXRjaFxuICB0cnkge1xuICAgIHJldHVybiBjb3JlLnN5bmMocGF0aCwgb3B0aW9ucyB8fCB7fSlcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmlnbm9yZUVycm9ycyB8fCBlci5jb2RlID09PSAnRUFDQ0VTJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyXG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyB8fFxuICAgIHByb2Nlc3MuZW52Lk9TVFlQRSA9PT0gJ2N5Z3dpbicgfHxcbiAgICBwcm9jZXNzLmVudi5PU1RZUEUgPT09ICdtc3lzJ1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBDT0xPTiA9IGlzV2luZG93cyA/ICc7JyA6ICc6J1xuY29uc3QgaXNleGUgPSByZXF1aXJlKCdpc2V4ZScpXG5cbmNvbnN0IGdldE5vdEZvdW5kRXJyb3IgPSAoY21kKSA9PlxuICBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgbm90IGZvdW5kOiAke2NtZH1gKSwgeyBjb2RlOiAnRU5PRU5UJyB9KVxuXG5jb25zdCBnZXRQYXRoSW5mbyA9IChjbWQsIG9wdCkgPT4ge1xuICBjb25zdCBjb2xvbiA9IG9wdC5jb2xvbiB8fCBDT0xPTlxuXG4gIC8vIElmIGl0IGhhcyBhIHNsYXNoLCB0aGVuIHdlIGRvbid0IGJvdGhlciBzZWFyY2hpbmcgdGhlIHBhdGhlbnYuXG4gIC8vIGp1c3QgY2hlY2sgdGhlIGZpbGUgaXRzZWxmLCBhbmQgdGhhdCdzIGl0LlxuICBjb25zdCBwYXRoRW52ID0gY21kLm1hdGNoKC9cXC8vKSB8fCBpc1dpbmRvd3MgJiYgY21kLm1hdGNoKC9cXFxcLykgPyBbJyddXG4gICAgOiAoXG4gICAgICBbXG4gICAgICAgIC8vIHdpbmRvd3MgYWx3YXlzIGNoZWNrcyB0aGUgY3dkIGZpcnN0XG4gICAgICAgIC4uLihpc1dpbmRvd3MgPyBbcHJvY2Vzcy5jd2QoKV0gOiBbXSksXG4gICAgICAgIC4uLihvcHQucGF0aCB8fCBwcm9jZXNzLmVudi5QQVRIIHx8XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHZlcnkgdW51c3VhbCAqLyAnJykuc3BsaXQoY29sb24pLFxuICAgICAgXVxuICAgIClcbiAgY29uc3QgcGF0aEV4dEV4ZSA9IGlzV2luZG93c1xuICAgID8gb3B0LnBhdGhFeHQgfHwgcHJvY2Vzcy5lbnYuUEFUSEVYVCB8fCAnLkVYRTsuQ01EOy5CQVQ7LkNPTSdcbiAgICA6ICcnXG4gIGNvbnN0IHBhdGhFeHQgPSBpc1dpbmRvd3MgPyBwYXRoRXh0RXhlLnNwbGl0KGNvbG9uKSA6IFsnJ11cblxuICBpZiAoaXNXaW5kb3dzKSB7XG4gICAgaWYgKGNtZC5pbmRleE9mKCcuJykgIT09IC0xICYmIHBhdGhFeHRbMF0gIT09ICcnKVxuICAgICAgcGF0aEV4dC51bnNoaWZ0KCcnKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoRW52LFxuICAgIHBhdGhFeHQsXG4gICAgcGF0aEV4dEV4ZSxcbiAgfVxufVxuXG5jb25zdCB3aGljaCA9IChjbWQsIG9wdCwgY2IpID0+IHtcbiAgaWYgKHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IG9wdFxuICAgIG9wdCA9IHt9XG4gIH1cbiAgaWYgKCFvcHQpXG4gICAgb3B0ID0ge31cblxuICBjb25zdCB7IHBhdGhFbnYsIHBhdGhFeHQsIHBhdGhFeHRFeGUgfSA9IGdldFBhdGhJbmZvKGNtZCwgb3B0KVxuICBjb25zdCBmb3VuZCA9IFtdXG5cbiAgY29uc3Qgc3RlcCA9IGkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChpID09PSBwYXRoRW52Lmxlbmd0aClcbiAgICAgIHJldHVybiBvcHQuYWxsICYmIGZvdW5kLmxlbmd0aCA/IHJlc29sdmUoZm91bmQpXG4gICAgICAgIDogcmVqZWN0KGdldE5vdEZvdW5kRXJyb3IoY21kKSlcblxuICAgIGNvbnN0IHBwUmF3ID0gcGF0aEVudltpXVxuICAgIGNvbnN0IHBhdGhQYXJ0ID0gL15cIi4qXCIkLy50ZXN0KHBwUmF3KSA/IHBwUmF3LnNsaWNlKDEsIC0xKSA6IHBwUmF3XG5cbiAgICBjb25zdCBwQ21kID0gcGF0aC5qb2luKHBhdGhQYXJ0LCBjbWQpXG4gICAgY29uc3QgcCA9ICFwYXRoUGFydCAmJiAvXlxcLltcXFxcXFwvXS8udGVzdChjbWQpID8gY21kLnNsaWNlKDAsIDIpICsgcENtZFxuICAgICAgOiBwQ21kXG5cbiAgICByZXNvbHZlKHN1YlN0ZXAocCwgaSwgMCkpXG4gIH0pXG5cbiAgY29uc3Qgc3ViU3RlcCA9IChwLCBpLCBpaSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChpaSA9PT0gcGF0aEV4dC5sZW5ndGgpXG4gICAgICByZXR1cm4gcmVzb2x2ZShzdGVwKGkgKyAxKSlcbiAgICBjb25zdCBleHQgPSBwYXRoRXh0W2lpXVxuICAgIGlzZXhlKHAgKyBleHQsIHsgcGF0aEV4dDogcGF0aEV4dEV4ZSB9LCAoZXIsIGlzKSA9PiB7XG4gICAgICBpZiAoIWVyICYmIGlzKSB7XG4gICAgICAgIGlmIChvcHQuYWxsKVxuICAgICAgICAgIGZvdW5kLnB1c2gocCArIGV4dClcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHAgKyBleHQpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZShzdWJTdGVwKHAsIGksIGlpICsgMSkpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gY2IgPyBzdGVwKDApLnRoZW4ocmVzID0+IGNiKG51bGwsIHJlcyksIGNiKSA6IHN0ZXAoMClcbn1cblxuY29uc3Qgd2hpY2hTeW5jID0gKGNtZCwgb3B0KSA9PiB7XG4gIG9wdCA9IG9wdCB8fCB7fVxuXG4gIGNvbnN0IHsgcGF0aEVudiwgcGF0aEV4dCwgcGF0aEV4dEV4ZSB9ID0gZ2V0UGF0aEluZm8oY21kLCBvcHQpXG4gIGNvbnN0IGZvdW5kID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhFbnYubGVuZ3RoOyBpICsrKSB7XG4gICAgY29uc3QgcHBSYXcgPSBwYXRoRW52W2ldXG4gICAgY29uc3QgcGF0aFBhcnQgPSAvXlwiLipcIiQvLnRlc3QocHBSYXcpID8gcHBSYXcuc2xpY2UoMSwgLTEpIDogcHBSYXdcblxuICAgIGNvbnN0IHBDbWQgPSBwYXRoLmpvaW4ocGF0aFBhcnQsIGNtZClcbiAgICBjb25zdCBwID0gIXBhdGhQYXJ0ICYmIC9eXFwuW1xcXFxcXC9dLy50ZXN0KGNtZCkgPyBjbWQuc2xpY2UoMCwgMikgKyBwQ21kXG4gICAgICA6IHBDbWRcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGF0aEV4dC5sZW5ndGg7IGogKyspIHtcbiAgICAgIGNvbnN0IGN1ciA9IHAgKyBwYXRoRXh0W2pdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpcyA9IGlzZXhlLnN5bmMoY3VyLCB7IHBhdGhFeHQ6IHBhdGhFeHRFeGUgfSlcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgaWYgKG9wdC5hbGwpXG4gICAgICAgICAgICBmb3VuZC5wdXNoKGN1cilcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gY3VyXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGV4KSB7fVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHQuYWxsICYmIGZvdW5kLmxlbmd0aClcbiAgICByZXR1cm4gZm91bmRcblxuICBpZiAob3B0Lm5vdGhyb3cpXG4gICAgcmV0dXJuIG51bGxcblxuICB0aHJvdyBnZXROb3RGb3VuZEVycm9yKGNtZClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aGljaFxud2hpY2guc3luYyA9IHdoaWNoU3luY1xuIiwgImltcG9ydCB7IGFwaVZlcnNpb24sIEFwcCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgUGx1Z2luLCBTZXR0aW5nLCBUZXh0Q29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT3B0aW9ucywgT3B0aW9uU2V0dGluZyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBEZXNrdG9wIH0gZnJvbSAnLi9kZXNrdG9wJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2FrYVRpbWUgZXh0ZW5kcyBQbHVnaW4ge1xuICBvcHRpb25zOiBPcHRpb25zO1xuICBzdGF0dXNCYXI6IEhUTUxFbGVtZW50O1xuICBzaG93U3RhdHVzQmFyOiBib29sZWFuO1xuICBzaG93Q29kaW5nQWN0aXZpdHk6IGJvb2xlYW47XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICBkZXBlbmRlbmNpZXM6IERlcGVuZGVuY2llcztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGxhc3RGZXRjaFRvZGF5ID0gMDtcbiAgZmV0Y2hUb2RheUludGVydmFsID0gNjAwMDA7XG4gIGxhc3RGaWxlOiBzdHJpbmc7XG4gIGxhc3RIZWFydGJlYXQgPSAwO1xuXG4gIGFzeW5jIG9ubG9hZCgpIHtcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIoTG9nTGV2ZWwuSU5GTyk7XG4gICAgdGhpcy5vcHRpb25zID0gbmV3IE9wdGlvbnModGhpcy5sb2dnZXIpO1xuXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgIGlkOiAnd2FrYXRpbWUtYXBpLWtleScsXG4gICAgICBuYW1lOiAnV2FrYVRpbWUgQVBJIEtleScsXG4gICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICB0aGlzLnByb21wdEZvckFwaUtleSgpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdkZWJ1ZycsIGZhbHNlLCAoZGVidWc6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLnNldExldmVsKGRlYnVnLnZhbHVlID09ICd0cnVlJyA/IExvZ0xldmVsLkRFQlVHIDogTG9nTGV2ZWwuSU5GTyk7XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBEZXBlbmRlbmNpZXModGhpcy5vcHRpb25zLCB0aGlzLmxvZ2dlcik7XG5cbiAgICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdkaXNhYmxlZCcsIGZhbHNlLCAoZGlzYWJsZWQ6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG9udW5sb2FkKCkge31cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURlcGVuZGVuY2llcygpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgSW5pdGlhbGl6aW5nIFdha2FUaW1lIHYke3RoaXMubWFuaWZlc3QudmVyc2lvbn1gKTtcblxuICAgIHRoaXMuc3RhdHVzQmFyID0gdGhpcy5hZGRTdGF0dXNCYXJJdGVtKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZyhcbiAgICAgICdzZXR0aW5ncycsXG4gICAgICAnc3RhdHVzX2Jhcl9lbmFibGVkJyxcbiAgICAgIGZhbHNlLFxuICAgICAgKHN0YXR1c0JhckVuYWJsZWQ6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zaG93U3RhdHVzQmFyID0gc3RhdHVzQmFyRW5hYmxlZC52YWx1ZSAhPT0gJ2ZhbHNlJztcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUZXh0KCdXYWthVGltZSBJbml0aWFsaXppbmcuLi4nKTtcblxuICAgICAgICB0aGlzLmNoZWNrQXBpS2V5KCk7XG5cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoXG4gICAgICAgICAgJ3NldHRpbmdzJyxcbiAgICAgICAgICAnc3RhdHVzX2Jhcl9jb2RpbmdfYWN0aXZpdHknLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChzaG93Q29kaW5nQWN0aXZpdHk6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvZGluZ0FjdGl2aXR5ID0gc2hvd0NvZGluZ0FjdGl2aXR5LnZhbHVlICE9PSAnZmFsc2UnO1xuXG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcy5jaGVja0FuZEluc3RhbGxDbGkoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnV2FrYVRpbWUgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUZXh0KCk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVG9vbHRpcCgnV2FrYVRpbWU6IEluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0Q29kaW5nQWN0aXZpdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQXBpS2V5KCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5oYXNBcGlLZXkoKGhhc0FwaUtleSkgPT4ge1xuICAgICAgaWYgKCFoYXNBcGlLZXkpIHRoaXMucHJvbXB0Rm9yQXBpS2V5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RlckRvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snLCAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRXZlbnQoZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJEb21FdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm9uRXZlbnQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkV2ZW50KGlzV3JpdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBpZiAoIXZpZXcpIHJldHVybjtcbiAgICBjb25zdCBhY3RpdmVGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICBpZiAoIWFjdGl2ZUZpbGUpIHJldHVybjtcbiAgICBjb25zdCBjdXJzb3IgPSB2aWV3LmVkaXRvci5nZXRDdXJzb3IoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgZmlsZSA9IGAke3RoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuYmFzZVBhdGh9LyR7YWN0aXZlRmlsZS5wYXRofWA7XG4gICAgY29uc3QgdGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoaXNXcml0ZSB8fCB0aGlzLmVub3VnaFRpbWVQYXNzZWQodGltZSkgfHwgdGhpcy5sYXN0RmlsZSAhPT0gZmlsZSkge1xuICAgICAgdGhpcy5zZW5kSGVhcnRiZWF0KGZpbGUsIHRpbWUsIGN1cnNvci5saW5lLCBjdXJzb3IuY2gsIGlzV3JpdGUpO1xuICAgICAgdGhpcy5sYXN0RmlsZSA9IGZpbGU7XG4gICAgICB0aGlzLmxhc3RIZWFydGJlYXQgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5vdWdoVGltZVBhc3NlZCh0aW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0SGVhcnRiZWF0ICsgMTIwMDAwIDwgdGltZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzQmFyVGV4dCh0ZXh0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXR1c0JhcikgcmV0dXJuO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0VGV4dCgnXHVEODNEXHVERDUyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFyLnNldFRleHQoJ1x1RDgzRFx1REQ1MiAnICsgdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXJUb29sdGlwKHRvb2x0aXBUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFyKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXNCYXIuc2V0QXR0cigndGl0bGUnLCB0b29sdGlwVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgcHJvbXB0Rm9yQXBpS2V5KCk6IHZvaWQge1xuICAgIG5ldyBBcGlLZXlNb2RhbCh0aGlzLmFwcCwgdGhpcy5vcHRpb25zKS5vcGVuKCk7XG4gIH1cblxuICBwcml2YXRlIHNlbmRIZWFydGJlYXQoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIHRpbWU6IG51bWJlcixcbiAgICBsaW5lbm86IG51bWJlcixcbiAgICBjdXJzb3Jwb3M6IG51bWJlcixcbiAgICBpc1dyaXRlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMuZ2V0QXBpS2V5KChhcGlLZXkpID0+IHtcbiAgICAgIGlmICghYXBpS2V5KSByZXR1cm47XG4gICAgICB0aGlzLl9zZW5kSGVhcnRiZWF0KGZpbGUsIHRpbWUsIGxpbmVubywgY3Vyc29ycG9zLCBpc1dyaXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbmRIZWFydGJlYXQoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIHRpbWU6IG51bWJlcixcbiAgICBsaW5lbm86IG51bWJlcixcbiAgICBjdXJzb3Jwb3M6IG51bWJlcixcbiAgICBpc1dyaXRlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzLmlzQ2xpSW5zdGFsbGVkKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBhcmdzLnB1c2goJy0tZW50aXR5JywgVXRpbHMucXVvdGUoZmlsZSkpO1xuXG4gICAgY29uc3QgdXNlcl9hZ2VudCA9ICdvYnNpZGlhbi8nICsgYXBpVmVyc2lvbiArICcgb2JzaWRpYW4td2FrYXRpbWUvJyArIHRoaXMubWFuaWZlc3QudmVyc2lvbjtcbiAgICBhcmdzLnB1c2goJy0tcGx1Z2luJywgVXRpbHMucXVvdGUodXNlcl9hZ2VudCkpO1xuXG4gICAgYXJncy5wdXNoKCctLWxpbmVubycsIFN0cmluZyhsaW5lbm8gKyAxKSk7XG4gICAgYXJncy5wdXNoKCctLWN1cnNvcnBvcycsIFN0cmluZyhjdXJzb3Jwb3MgKyAxKSk7XG5cbiAgICBpZiAoaXNXcml0ZSkgYXJncy5wdXNoKCctLXdyaXRlJyk7XG5cbiAgICBpZiAoRGVza3RvcC5pc1dpbmRvd3MoKSkge1xuICAgICAgYXJncy5wdXNoKFxuICAgICAgICAnLS1jb25maWcnLFxuICAgICAgICBVdGlscy5xdW90ZSh0aGlzLm9wdGlvbnMuZ2V0Q29uZmlnRmlsZShmYWxzZSkpLFxuICAgICAgICAnLS1sb2ctZmlsZScsXG4gICAgICAgIFV0aWxzLnF1b3RlKHRoaXMub3B0aW9ucy5nZXRMb2dGaWxlKCkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXRDbGlMb2NhdGlvbigpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBTZW5kaW5nIGhlYXJ0YmVhdDogJHtVdGlscy5mb3JtYXRBcmd1bWVudHMoYmluYXJ5LCBhcmdzKX1gKTtcbiAgICBjb25zdCBvcHRpb25zID0gRGVza3RvcC5idWlsZE9wdGlvbnMoKTtcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZShiaW5hcnksIGFyZ3MsIG9wdGlvbnMsIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChzdGRlcnIgJiYgc3RkZXJyLnRvU3RyaW5nKCkgIT0gJycpIHRoaXMubG9nZ2VyLmVycm9yKHN0ZGVyci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcoKSAhPSAnJykgdGhpcy5sb2dnZXIuZXJyb3Ioc3Rkb3V0LnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlLCBfc2lnbmFsKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTdGF0dXNCYXIpIHRoaXMuZ2V0Q29kaW5nQWN0aXZpdHkoKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxhc3QgaGVhcnRiZWF0IHNlbnQgJHtVdGlscy5mb3JtYXREYXRlKG5ldyBEYXRlKCkpfWApO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09IDEwMiB8fCBjb2RlID09IDExMikge1xuICAgICAgICBpZiAodGhpcy5zaG93U3RhdHVzQmFyKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dDb2RpbmdBY3Rpdml0eSkgdGhpcy51cGRhdGVTdGF0dXNCYXJUZXh0KCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUb29sdGlwKFxuICAgICAgICAgICAgJ1dha2FUaW1lOiB3b3JraW5nIG9mZmxpbmUuLi4gY29kaW5nIGFjdGl2aXR5IHdpbGwgc3luYyBuZXh0IHRpbWUgd2UgYXJlIG9ubGluZScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBXb3JraW5nIG9mZmxpbmUgKCR7Y29kZX0pOyBDaGVjayB5b3VyICR7dGhpcy5vcHRpb25zLmdldExvZ0ZpbGUoKX0gZmlsZSBmb3IgbW9yZSBkZXRhaWxzYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAxMDMpIHtcbiAgICAgICAgY29uc3QgZXJyb3JfbXNnID0gYENvbmZpZyBwYXJzaW5nIGVycm9yICgxMDMpOyBDaGVjayB5b3VyICR7dGhpcy5vcHRpb25zLmdldExvZ0ZpbGUoKX0gZmlsZSBmb3IgbW9yZSBkZXRhaWxzYDtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgnV2FrYVRpbWUgRXJyb3InKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAoYFdha2FUaW1lOiAke2Vycm9yX21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcl9tc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09IDEwNCkge1xuICAgICAgICBjb25zdCBlcnJvcl9tc2cgPSAnSW52YWxpZCBBcGkgS2V5ICgxMDQpOyBNYWtlIHN1cmUgeW91ciBBcGkgS2V5IGlzIGNvcnJlY3QhJztcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgnV2FrYVRpbWUgRXJyb3InKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAoYFdha2FUaW1lOiAke2Vycm9yX21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcl9tc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JfbXNnID0gYFVua25vd24gRXJyb3IgKCR7Y29kZX0pOyBDaGVjayB5b3VyICR7dGhpcy5vcHRpb25zLmdldExvZ0ZpbGUoKX0gZmlsZSBmb3IgbW9yZSBkZXRhaWxzYDtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgnV2FrYVRpbWUgRXJyb3InKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAoYFdha2FUaW1lOiAke2Vycm9yX21zZ31gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcl9tc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2RpbmdBY3Rpdml0eSgpIHtcbiAgICBpZiAoIXRoaXMuc2hvd1N0YXR1c0Jhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHByZXZlbnQgdXBkYXRpbmcgaWYgd2UgaGF2ZW4ndCBjb2RlZCBzaW5jZSBsYXN0IGNoZWNrZWRcbiAgICBpZiAodGhpcy5sYXN0RmV0Y2hUb2RheSA+IDAgJiYgdGhpcy5sYXN0RmV0Y2hUb2RheSA+IHRoaXMubGFzdEhlYXJ0YmVhdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIHRoaXMuZmV0Y2hUb2RheUludGVydmFsO1xuICAgIGlmICh0aGlzLmxhc3RGZXRjaFRvZGF5ID4gY3V0b2ZmKSByZXR1cm47XG5cbiAgICB0aGlzLmxhc3RGZXRjaFRvZGF5ID0gRGF0ZS5ub3coKTtcblxuICAgIHRoaXMub3B0aW9ucy5nZXRBcGlLZXkoKGFwaUtleSkgPT4ge1xuICAgICAgaWYgKCFhcGlLZXkpIHJldHVybjtcbiAgICAgIHRoaXMuX2dldENvZGluZ0FjdGl2aXR5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb2RpbmdBY3Rpdml0eSgpIHtcbiAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzLmlzQ2xpSW5zdGFsbGVkKCkpIHJldHVybjtcblxuICAgIGNvbnN0IHVzZXJfYWdlbnQgPSAnb2JzaWRpYW4vJyArIGFwaVZlcnNpb24gKyAnIG9ic2lkaWFuLXdha2F0aW1lLycgKyB0aGlzLm1hbmlmZXN0LnZlcnNpb247XG4gICAgY29uc3QgYXJncyA9IFsnLS10b2RheScsICctLXBsdWdpbicsIFV0aWxzLnF1b3RlKHVzZXJfYWdlbnQpXTtcblxuICAgIGlmIChEZXNrdG9wLmlzV2luZG93cygpKSB7XG4gICAgICBhcmdzLnB1c2goXG4gICAgICAgICctLWNvbmZpZycsXG4gICAgICAgIFV0aWxzLnF1b3RlKHRoaXMub3B0aW9ucy5nZXRDb25maWdGaWxlKGZhbHNlKSksXG4gICAgICAgICctLWxvZ2ZpbGUnLFxuICAgICAgICBVdGlscy5xdW90ZSh0aGlzLm9wdGlvbnMuZ2V0TG9nRmlsZSgpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmluYXJ5ID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0Q2xpTG9jYXRpb24oKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBGZXRjaGluZyBjb2RpbmcgYWN0aXZpdHkgZm9yIFRvZGF5IGZyb20gYXBpOiAke1V0aWxzLmZvcm1hdEFyZ3VtZW50cyhiaW5hcnksIGFyZ3MpfWAsXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zID0gRGVza3RvcC5idWlsZE9wdGlvbnMoKTtcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZShiaW5hcnksIGFyZ3MsIG9wdGlvbnMsIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChzdGRlcnIgJiYgc3RkZXJyLnRvU3RyaW5nKCkgIT0gJycpIHRoaXMubG9nZ2VyLmVycm9yKHN0ZGVyci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcoKSAhPSAnJykgdGhpcy5sb2dnZXIuZXJyb3Ioc3Rkb3V0LnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgaWYgKHByb2Muc3Rkb3V0KSB7XG4gICAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmIChkYXRhKSBvdXRwdXQgKz0gZGF0YTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlLCBfc2lnbmFsKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTdGF0dXNCYXIpIHtcbiAgICAgICAgICBpZiAob3V0cHV0ICYmIG91dHB1dC50cmltKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dDb2RpbmdBY3Rpdml0eSkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRleHQob3V0cHV0LnRyaW0oKSk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVG9vbHRpcCgnV2FrYVRpbWU6IFRvZGF5XHUyMDE5cyBjb2RpbmcgdGltZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgpO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhclRvb2x0aXAob3V0cHV0LnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyVGV4dCgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXNCYXJUb29sdGlwKCdXYWthVGltZTogQ2FsY3VsYXRpbmcgdGltZSBzcGVudCB0b2RheSBpbiBiYWNrZ3JvdW5kLi4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMTAyIHx8IGNvZGUgPT0gMTEyKSB7XG4gICAgICAgIC8vIG5vb3AsIHdvcmtpbmcgb2ZmbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JfbXNnID0gYEVycm9yIGZldGNoaW5nIHRvZGF5IGNvZGluZyBhY3Rpdml0eSAoJHtjb2RlfSk7IENoZWNrIHlvdXIgJHt0aGlzLm9wdGlvbnMuZ2V0TG9nRmlsZSgpfSBmaWxlIGZvciBtb3JlIGRldGFpbHNgO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhlcnJvcl9tc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEFwaUtleU1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICBvcHRpb25zOiBPcHRpb25zO1xuICBpbnB1dDogVGV4dENvbXBvbmVudDtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwaUtleU1vZGFsO1xuXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgaWYgKEFwaUtleU1vZGFsLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gQXBpS2V5TW9kYWwuaW5zdGFuY2U7XG4gICAgfVxuICAgIHN1cGVyKGFwcCk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBBcGlLZXlNb2RhbC5pbnN0YW5jZSA9IHRoaXM7XG4gIH1cblxuICBvbk9wZW4oKSB7XG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cbiAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZygnc2V0dGluZ3MnLCAnYXBpX2tleScsIGZhbHNlLCAoc2V0dGluZzogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgbGV0IGRlZmF1bHRWYWwgPSBzZXR0aW5nLnZhbHVlO1xuICAgICAgaWYgKFV0aWxzLmFwaUtleUludmFsaWQoZGVmYXVsdFZhbCkpIGRlZmF1bHRWYWwgPSAnJztcblxuICAgICAgY29udGVudEVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0VudGVyIHlvdXIgV2FrYVRpbWUgQVBJIEtleScgfSk7XG5cbiAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbCkuYWRkVGV4dCgodGV4dCkgPT4ge1xuICAgICAgICB0ZXh0LnNldFZhbHVlKGRlZmF1bHRWYWwpO1xuICAgICAgICB0ZXh0LmlucHV0RWwuYWRkQ2xhc3MoJ2FwaS1rZXktaW5wdXQnKTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IHRleHQ7XG4gICAgICB9KTtcblxuICAgICAgbmV3IFNldHRpbmcoY29udGVudEVsKS5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgYnRuXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQoJ1NhdmUnKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuaW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGludmFsaWQgPSBVdGlscy5hcGlLZXlJbnZhbGlkKHZhbCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpbnZhbGlkKTtcbiAgICAgICAgICAgIGlmICghaW52YWxpZCkge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXRTZXR0aW5nKCdzZXR0aW5ncycsICdhcGlfa2V5JywgdmFsLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgb25DbG9zZSgpIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5cbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgRGVza3RvcCB9IGZyb20gJy4vZGVza3RvcCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uU2V0dGluZyB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlcnJvcj86IEVycm9yO1xufVxuXG50eXBlIEZvdW5kT3B0aW9uID0ge1xuICBba2V5OiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wdGlvbnMge1xuICBwcml2YXRlIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnRlcm5hbENvbmZpZ0ZpbGU6IHN0cmluZztcbiAgcHJpdmF0ZSBsb2dGaWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgY2FjaGU6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgY29uc3Qgd2FrYUhvbWUgPSBEZXNrdG9wLmdldEhvbWVEaXJlY3RvcnkoKTtcbiAgICB0aGlzLmNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4od2FrYUhvbWUsICcud2FrYXRpbWUuY2ZnJyk7XG4gICAgdGhpcy5pbnRlcm5hbENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4od2FrYUhvbWUsICcud2FrYXRpbWUtaW50ZXJuYWwuY2ZnJyk7XG4gICAgdGhpcy5sb2dGaWxlID0gcGF0aC5qb2luKHdha2FIb21lLCAnLndha2F0aW1lLmxvZycpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNldHRpbmdBc3luYyhzZWN0aW9uOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZXRTZXR0aW5nKHNlY3Rpb24sIGtleSwgZmFsc2UsIChzZXR0aW5nKSA9PiB7XG4gICAgICAgIHNldHRpbmcuZXJyb3IgPyByZWplY3Qoc2V0dGluZy5lcnJvcikgOiByZXNvbHZlKHNldHRpbmcudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZyhcbiAgICBzZWN0aW9uOiBzdHJpbmcsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaW50ZXJuYWw6IGJvb2xlYW4sXG4gICAgY2FsbGJhY2s6IChfOiBPcHRpb25TZXR0aW5nKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBmcy5yZWFkRmlsZShcbiAgICAgIHRoaXMuZ2V0Q29uZmlnRmlsZShpbnRlcm5hbCksXG4gICAgICAndXRmLTgnLFxuICAgICAgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgbnVsbCwgY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBjb3VsZCBub3QgcmVhZCAke3RoaXMuZ2V0Q29uZmlnRmlsZShpbnRlcm5hbCl9YCksXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgY3VycmVudFNlY3Rpb24gPSAnJztcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0c1dpdGgobGluZS50cmltKCksICdbJykgJiYgdGhpcy5lbmRzV2l0aChsaW5lLnRyaW0oKSwgJ10nKSkge1xuICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9IGxpbmVcbiAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgLnN1YnN0cmluZygxLCBsaW5lLnRyaW0oKS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50U2VjdGlvbiA9PT0gc2VjdGlvbikge1xuICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRLZXkgPT09IGtleSAmJiBwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soeyBrZXk6IGtleSwgdmFsdWU6IHRoaXMucmVtb3ZlTnVsbHMocGFydHNbMV0udHJpbSgpKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2soeyBrZXk6IGtleSwgdmFsdWU6ICcnIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2V0dGluZyhzZWN0aW9uOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWw6IHN0cmluZywgaW50ZXJuYWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gdGhpcy5nZXRDb25maWdGaWxlKGludGVybmFsKTtcbiAgICBmcy5yZWFkRmlsZShjb25maWdGaWxlLCAndXRmLTgnLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCBudWxsLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvcnMgYmVjYXVzZSBjb25maWcgZmlsZSBtaWdodCBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoZXJyKSBjb250ZW50ID0gJyc7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uID0gJyc7XG5cbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAodGhpcy5zdGFydHNXaXRoKGxpbmUudHJpbSgpLCAnWycpICYmIHRoaXMuZW5kc1dpdGgobGluZS50cmltKCksICddJykpIHtcbiAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gPT09IHNlY3Rpb24gJiYgIWZvdW5kKSB7XG4gICAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMoa2V5ICsgJyA9ICcgKyB2YWwpKTtcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBsaW5lXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAuc3Vic3RyaW5nKDEsIGxpbmUudHJpbSgpLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMobGluZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTZWN0aW9uID09PSBzZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgICBpZiAoY3VycmVudEtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhrZXkgKyAnID0gJyArIHZhbCkpO1xuICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gIT09IHNlY3Rpb24pIHtcbiAgICAgICAgICBjb250ZW50cy5wdXNoKCdbJyArIHNlY3Rpb24gKyAnXScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhrZXkgKyAnID0gJyArIHZhbCkpO1xuICAgICAgfVxuXG4gICAgICBmcy53cml0ZUZpbGUoY29uZmlnRmlsZSBhcyBzdHJpbmcsIGNvbnRlbnRzLmpvaW4oJ1xcbicpLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldFNldHRpbmdzKHNlY3Rpb246IHN0cmluZywgc2V0dGluZ3M6IE9wdGlvblNldHRpbmdbXSwgaW50ZXJuYWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gdGhpcy5nZXRDb25maWdGaWxlKGludGVybmFsKTtcbiAgICBmcy5yZWFkRmlsZShjb25maWdGaWxlLCAndXRmLTgnLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCBudWxsLCBjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvcnMgYmVjYXVzZSBjb25maWcgZmlsZSBtaWdodCBub3QgZXhpc3QgeWV0XG4gICAgICBpZiAoZXJyKSBjb250ZW50ID0gJyc7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnRTZWN0aW9uID0gJyc7XG5cbiAgICAgIGNvbnN0IGZvdW5kOiBGb3VuZE9wdGlvbiA9IHt9O1xuICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICBpZiAodGhpcy5zdGFydHNXaXRoKGxpbmUudHJpbSgpLCAnWycpICYmIHRoaXMuZW5kc1dpdGgobGluZS50cmltKCksICddJykpIHtcbiAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24gPT09IHNlY3Rpb24pIHtcbiAgICAgICAgICAgIHNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFmb3VuZFtzZXR0aW5nLmtleV0pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMoc2V0dGluZy5rZXkgKyAnID0gJyArIHNldHRpbmcudmFsdWUpKTtcbiAgICAgICAgICAgICAgICBmb3VuZFtzZXR0aW5nLmtleV0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBsaW5lXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAuc3Vic3RyaW5nKDEsIGxpbmUudHJpbSgpLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb250ZW50cy5wdXNoKHRoaXMucmVtb3ZlTnVsbHMobGluZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTZWN0aW9uID09PSBzZWN0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcnRzWzBdLnRyaW0oKTtcbiAgICAgICAgICBsZXQga2VlcExpbmVVbmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHRpbmdzLmZvckVhY2goKHNldHRpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50S2V5ID09PSBzZXR0aW5nLmtleSkge1xuICAgICAgICAgICAgICBrZWVwTGluZVVuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoIWZvdW5kW3NldHRpbmcua2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhzZXR0aW5nLmtleSArICcgPSAnICsgc2V0dGluZy52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGZvdW5kW3NldHRpbmcua2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoa2VlcExpbmVVbmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRzLnB1c2godGhpcy5yZW1vdmVOdWxscyhsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0dGluZ3MuZm9yRWFjaCgoc2V0dGluZykgPT4ge1xuICAgICAgICBpZiAoIWZvdW5kW3NldHRpbmcua2V5XSkge1xuICAgICAgICAgIGlmIChjdXJyZW50U2VjdGlvbiAhPT0gc2VjdGlvbikge1xuICAgICAgICAgICAgY29udGVudHMucHVzaCgnWycgKyBzZWN0aW9uICsgJ10nKTtcbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGVudHMucHVzaCh0aGlzLnJlbW92ZU51bGxzKHNldHRpbmcua2V5ICsgJyA9ICcgKyBzZXR0aW5nLnZhbHVlKSk7XG4gICAgICAgICAgZm91bmRbc2V0dGluZy5rZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZShjb25maWdGaWxlIGFzIHN0cmluZywgY29udGVudHMuam9pbignXFxuJyksIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikgdGhyb3cgZXJyO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uZmlnRmlsZShpbnRlcm5hbDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGludGVybmFsID8gdGhpcy5pbnRlcm5hbENvbmZpZ0ZpbGUgOiB0aGlzLmNvbmZpZ0ZpbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9nRmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvZ0ZpbGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXBpS2V5QXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIVV0aWxzLmFwaUtleUludmFsaWQodGhpcy5jYWNoZS5hcGlfa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuYXBpX2tleTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBpS2V5RnJvbVZhdWx0ID0gYXdhaXQgdGhpcy5nZXRBcGlLZXlGcm9tVmF1bHRDbWQoKTtcbiAgICAgIGlmICghVXRpbHMuYXBpS2V5SW52YWxpZChhcGlLZXlGcm9tVmF1bHQpKSB7XG4gICAgICAgIHRoaXMuY2FjaGUuYXBpX2tleSA9IGFwaUtleUZyb21WYXVsdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuYXBpX2tleTtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH0gY2F0Y2ggKGVycikge31cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcGlLZXkgPSBhd2FpdCB0aGlzLmdldFNldHRpbmdBc3luYygnc2V0dGluZ3MnLCAnYXBpX2tleScpO1xuICAgICAgaWYgKCFVdGlscy5hcGlLZXlJbnZhbGlkKGFwaUtleSkpIHRoaXMuY2FjaGUuYXBpX2tleSA9IGFwaUtleTtcbiAgICAgIHJldHVybiBhcGlLZXk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgQVBJIEtleSBmcm9tIGNvbmZpZyBmaWxlOiAke2Vycn1gKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXBpS2V5RnJvbVZhdWx0Q21kKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwaUtleUNtZCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZ0FzeW5jKCdzZXR0aW5ncycsICdhcGlfa2V5X3ZhdWx0X2NtZCcpO1xuICAgICAgaWYgKCFhcGlLZXlDbWQpIHJldHVybiAnJztcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IERlc2t0b3AuYnVpbGRPcHRpb25zKCk7XG4gICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bihhcGlLZXlDbWQsIG9wdGlvbnMpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHByb2Muc3Rkb3V0KSB7XG4gICAgICAgIHN0ZG91dCArPSBjaHVuaztcbiAgICAgIH1cbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcHJvYy5zdGRlcnIpIHtcbiAgICAgICAgc3RkZXJyICs9IGNodW5rO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBwcm9jLm9uKCdjbG9zZScsIHJlc29sdmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGl0Q29kZSkgdGhpcy5sb2dnZXIud2FybihgYXBpIGtleSB2YXVsdCBjb21tYW5kIGVycm9yICgke2V4aXRDb2RlfSk6ICR7c3RkZXJyfWApO1xuICAgICAgZWxzZSBpZiAoc3RkZXJyICYmIHN0ZGVyci50cmltKCkpIHRoaXMubG9nZ2VyLndhcm4oc3RkZXJyLnRyaW0oKSk7XG5cbiAgICAgIGNvbnN0IGFwaUtleSA9IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgIHJldHVybiBhcGlLZXk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgQVBJIEtleSBWYXVsdCBDbWQgZnJvbSBjb25maWcgZmlsZTogJHtlcnJ9YCk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEFwaUtleShjYWxsYmFjazogKGFwaUtleTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0QXBpS2V5QXN5bmMoKVxuICAgICAgLnRoZW4oKGFwaUtleSkgPT4ge1xuICAgICAgICBpZiAoIVV0aWxzLmFwaUtleUludmFsaWQoYXBpS2V5KSkge1xuICAgICAgICAgIGNhbGxiYWNrKGFwaUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbmFibGUgdG8gZ2V0IGFwaSBrZXk6ICR7ZXJyfWApO1xuICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhc0FwaUtleShjYWxsYmFjazogKHZhbGlkOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5nZXRBcGlLZXlBc3luYygpXG4gICAgICAudGhlbigoYXBpS2V5KSA9PiBjYWxsYmFjayghVXRpbHMuYXBpS2V5SW52YWxpZChhcGlLZXkpKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVuYWJsZSB0byBjaGVjayBmb3IgYXBpIGtleTogJHtlcnJ9YCk7XG4gICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydHNXaXRoKG91dGVyOiBzdHJpbmcsIGlubmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3V0ZXIuc2xpY2UoMCwgaW5uZXIubGVuZ3RoKSA9PT0gaW5uZXI7XG4gIH1cblxuICBwcml2YXRlIGVuZHNXaXRoKG91dGVyOiBzdHJpbmcsIGlubmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5uZXIgPT09ICcnIHx8IG91dGVyLnNsaWNlKC1pbm5lci5sZW5ndGgpID09PSBpbm5lcjtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTnVsbHMoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9cXDAvZywgJycpO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgcHVibGljIHN0YXRpYyBxdW90ZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0ci5pbmNsdWRlcygnICcpKSByZXR1cm4gYFwiJHtzdHIucmVwbGFjZSgnXCInLCAnXFxcXFwiJyl9XCJgO1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwaUtleUludmFsaWQoa2V5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBlcnIgPSAnSW52YWxpZCBhcGkga2V5Li4uIGNoZWNrIGh0dHBzOi8vd2FrYXRpbWUuY29tL3NldHRpbmdzIGZvciB5b3VyIGtleSc7XG4gICAgaWYgKCFrZXkpIHJldHVybiBlcnI7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuICAgICAgJ14od2FrYV8pP1swLTlBLUZdezh9LVswLTlBLUZdezR9LTRbMC05QS1GXXszfS1bODlBQl1bMC05QS1GXXszfS1bMC05QS1GXXsxMn0kJyxcbiAgICAgICdpJyxcbiAgICApO1xuICAgIGlmICghcmUudGVzdChrZXkpKSByZXR1cm4gZXJyO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVQcm94eShwcm94eTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXByb3h5KSByZXR1cm4gJyc7XG4gICAgbGV0IHJlO1xuICAgIGlmIChwcm94eS5pbmRleE9mKCdcXFxcJykgPT09IC0xKSB7XG4gICAgICByZSA9IG5ldyBSZWdFeHAoJ14oKGh0dHBzP3xzb2NrczUpOi8vKT8oW146QF0rKDooW146QF0pKyk/QCk/W1xcXFx3XFxcXC4tXSsoOlxcXFxkKyk/JCcsICdpJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlID0gbmV3IFJlZ0V4cCgnXi4qXFxcXFxcXFwuKyQnLCAnaScpO1xuICAgIH1cbiAgICBpZiAoIXJlLnRlc3QocHJveHkpKVxuICAgICAgcmV0dXJuICdJbnZhbGlkIHByb3h5LiBWYWxpZCBmb3JtYXRzIGFyZSBodHRwczovL3VzZXI6cGFzc0Bob3N0OnBvcnQgb3Igc29ja3M1Oi8vdXNlcjpwYXNzQGhvc3Q6cG9ydCBvciBkb21haW5cXFxcdXNlcjpwYXNzJztcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhzID0gW1xuICAgICAgJ0phbicsXG4gICAgICAnRmViJyxcbiAgICAgICdNYXInLFxuICAgICAgJ0FwcicsXG4gICAgICAnTWF5JyxcbiAgICAgICdKdW4nLFxuICAgICAgJ0p1bCcsXG4gICAgICAnQXVnJyxcbiAgICAgICdTZXAnLFxuICAgICAgJ09jdCcsXG4gICAgICAnTm92JyxcbiAgICAgICdEZWMnLFxuICAgIF07XG4gICAgbGV0IGFtcG0gPSAnQU0nO1xuICAgIGxldCBob3VyID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGlmIChob3VyID4gMTEpIHtcbiAgICAgIGFtcG0gPSAnUE0nO1xuICAgICAgaG91ciA9IGhvdXIgLSAxMjtcbiAgICB9XG4gICAgaWYgKGhvdXIgPT0gMCkge1xuICAgICAgaG91ciA9IDEyO1xuICAgIH1cbiAgICBjb25zdCBtaW51dGUgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICByZXR1cm4gYCR7bW9udGhzW2RhdGUuZ2V0TW9udGgoKV19ICR7ZGF0ZS5nZXREYXRlKCl9LCAke2RhdGUuZ2V0RnVsbFllYXIoKX0gJHtob3VyfToke1xuICAgICAgbWludXRlIDwgMTAgPyBgMCR7bWludXRlfWAgOiBtaW51dGVcbiAgICB9ICR7YW1wbX1gO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBvYmZ1c2NhdGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBuZXdLZXkgPSAnJztcbiAgICBpZiAoa2V5KSB7XG4gICAgICBuZXdLZXkgPSBrZXk7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IDQpXG4gICAgICAgIG5ld0tleSA9ICdYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWCcgKyBrZXkuc3Vic3RyaW5nKGtleS5sZW5ndGggLSA0KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0tleTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgd3JhcEFyZyhhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGFyZy5pbmRleE9mKCcgJykgPiAtMSkgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbiAgICByZXR1cm4gYXJnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmb3JtYXRBcmd1bWVudHMoYmluYXJ5OiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbG9uZSA9IGFyZ3Muc2xpY2UoMCk7XG4gICAgY2xvbmUudW5zaGlmdCh0aGlzLndyYXBBcmcoYmluYXJ5KSk7XG4gICAgY29uc3QgbmV3Q21kczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbGFzdENtZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsYXN0Q21kID09ICctLWtleScpIG5ld0NtZHMucHVzaCh0aGlzLndyYXBBcmcodGhpcy5vYmZ1c2NhdGVLZXkoY2xvbmVbaV0pKSk7XG4gICAgICBlbHNlIG5ld0NtZHMucHVzaCh0aGlzLndyYXBBcmcoY2xvbmVbaV0pKTtcbiAgICAgIGxhc3RDbWQgPSBjbG9uZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0NtZHMuam9pbignICcpO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG5pbnRlcmZhY2UgT3B0aW9uIHtcbiAgd2luZG93c0hpZGU6IGJvb2xlYW47XG4gIGVudj86IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIERlc2t0b3Age1xuICBwdWJsaWMgc3RhdGljIGlzV2luZG93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gb3MucGxhdGZvcm0oKSA9PT0gJ3dpbjMyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SG9tZURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5XQUtBVElNRV9IT01FO1xuICAgIGlmIChob21lICYmIGhvbWUudHJpbSgpICYmIGZzLmV4aXN0c1N5bmMoaG9tZS50cmltKCkpKSByZXR1cm4gaG9tZS50cmltKCk7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W3RoaXMuaXNXaW5kb3dzKCkgPyAnVVNFUlBST0ZJTEUnIDogJ0hPTUUnXSB8fCBwcm9jZXNzLmN3ZCgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBidWlsZE9wdGlvbnMoKTogYW55IHtcbiAgICBjb25zdCBvcHRpb25zOiBPcHRpb24gPSB7XG4gICAgICB3aW5kb3dzSGlkZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmICghdGhpcy5pc1dpbmRvd3MoKSAmJiAhcHJvY2Vzcy5lbnYuV0FLQVRJTUVfSE9NRSAmJiAhcHJvY2Vzcy5lbnYuSE9NRSkge1xuICAgICAgb3B0aW9uc1snZW52J10gPSB7IC4uLnByb2Nlc3MuZW52LCBXQUtBVElNRV9IT01FOiB0aGlzLmdldEhvbWVEaXJlY3RvcnkoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuIiwgImV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgREVCVUcgPSAwLFxuICBJTkZPLFxuICBXQVJOLFxuICBFUlJPUixcbn1cbiIsICJpbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHByaXZhdGUgbGV2ZWw6IExvZ0xldmVsO1xuXG4gIGNvbnN0cnVjdG9yKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHRoaXMuc2V0TGV2ZWwobGV2ZWwpO1xuICB9XG5cbiAgcHVibGljIGdldExldmVsKCk6IExvZ0xldmVsIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICBwdWJsaWMgbG9nKGxldmVsOiBMb2dMZXZlbCwgbXNnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobGV2ZWwgPj0gdGhpcy5sZXZlbCkge1xuICAgICAgbXNnID0gYFtXYWthVGltZV1bJHtMb2dMZXZlbFtsZXZlbF19XSAke21zZ31gO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLkRFQlVHKSBjb25zb2xlLmxvZyhtc2cpO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLklORk8pIGNvbnNvbGUuaW5mbyhtc2cpO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLldBUk4pIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgaWYgKGxldmVsID09IExvZ0xldmVsLkVSUk9SKSBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlYnVnKG1zZzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuREVCVUcsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgaW5mbyhtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLklORk8sIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgd2Fybihtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLldBUk4sIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgd2FybkV4Y2VwdGlvbihtc2c6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoKG1zZyBhcyBFcnJvcikubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC5XQVJOLCAobXNnIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZXJyb3IobXNnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5FUlJPUiwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBlcnJvckV4Y2VwdGlvbihtc2c6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoKG1zZyBhcyBFcnJvcikubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC5FUlJPUiwgKG1zZyBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IEFkbVppcCBmcm9tICdhZG0temlwJztcbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcbmltcG9ydCAqIGFzIHdoaWNoIGZyb20gJ3doaWNoJztcblxuaW1wb3J0IHsgT3B0aW9ucywgT3B0aW9uU2V0dGluZyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBEZXNrdG9wIH0gZnJvbSAnLi9kZXNrdG9wJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIERlcGVuZGVuY2llcyB7XG4gIHByaXZhdGUgb3B0aW9uczogT3B0aW9ucztcbiAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZXNvdXJjZXNMb2NhdGlvbj86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGlMb2NhdGlvbj86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGlMb2NhdGlvbkdsb2JhbD86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjbGlJbnN0YWxsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnaXRodWJEb3dubG9hZFByZWZpeCA9ICdodHRwczovL2dpdGh1Yi5jb20vd2FrYXRpbWUvd2FrYXRpbWUtY2xpL3JlbGVhc2VzL2Rvd25sb2FkJztcbiAgcHJpdmF0ZSBnaXRodWJSZWxlYXNlc1N0YWJsZVVybCA9XG4gICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvd2FrYXRpbWUvd2FrYXRpbWUtY2xpL3JlbGVhc2VzL2xhdGVzdCc7XG4gIHByaXZhdGUgZ2l0aHViUmVsZWFzZXNBbHBoYVVybCA9XG4gICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvd2FrYXRpbWUvd2FrYXRpbWUtY2xpL3JlbGVhc2VzP3Blcl9wYWdlPTEnO1xuICBwcml2YXRlIGxhdGVzdENsaVZlcnNpb24gPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zLCBsb2dnZXI6IExvZ2dlcikge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gIH1cblxuICBwcml2YXRlIGdldFJlc291cmNlc0xvY2F0aW9uKCkge1xuICAgIGlmICh0aGlzLnJlc291cmNlc0xvY2F0aW9uKSByZXR1cm4gdGhpcy5yZXNvdXJjZXNMb2NhdGlvbjtcblxuICAgIGNvbnN0IGZvbGRlciA9IHBhdGguam9pbihEZXNrdG9wLmdldEhvbWVEaXJlY3RvcnkoKSwgJy53YWthdGltZScpO1xuICAgIHRyeSB7XG4gICAgICBmcy5ta2RpclN5bmMoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMucmVzb3VyY2VzTG9jYXRpb24gPSBmb2xkZXI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5yZXNvdXJjZXNMb2NhdGlvbiA9IFwiLi8ud2FrYXRpbWVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzTG9jYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jbGlMb2NhdGlvbikgcmV0dXJuIHRoaXMuY2xpTG9jYXRpb247XG5cbiAgICB0aGlzLmNsaUxvY2F0aW9uID0gdGhpcy5nZXRDbGlMb2NhdGlvbkdsb2JhbCgpO1xuICAgIGlmICh0aGlzLmNsaUxvY2F0aW9uKSByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbjtcblxuICAgIGNvbnN0IGV4dCA9IERlc2t0b3AuaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJztcbiAgICBsZXQgb3NuYW1lID0gb3MucGxhdGZvcm0oKSBhcyBzdHJpbmc7XG4gICAgaWYgKG9zbmFtZSA9PSAnd2luMzInKSBvc25hbWUgPSAnd2luZG93cyc7XG4gICAgY29uc3QgYXJjaCA9IHRoaXMuYXJjaGl0ZWN0dXJlKCk7XG4gICAgdGhpcy5jbGlMb2NhdGlvbiA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuZ2V0UmVzb3VyY2VzTG9jYXRpb24oKSxcbiAgICAgIGB3YWthdGltZS1jbGktJHtvc25hbWV9LSR7YXJjaH0ke2V4dH1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGlMb2NhdGlvbkdsb2JhbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNsaUxvY2F0aW9uR2xvYmFsKSByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbkdsb2JhbDtcblxuICAgIGNvbnN0IGJpbmFyeU5hbWUgPSBgd2FrYXRpbWUtY2xpJHtEZXNrdG9wLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgICBjb25zdCBwYXRoID0gd2hpY2guc3luYyhiaW5hcnlOYW1lLCB7IG5vdGhyb3c6IHRydWUgfSk7XG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRoaXMuY2xpTG9jYXRpb25HbG9iYWwgPSBwYXRoO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFVzaW5nIGdsb2JhbCB3YWthdGltZS1jbGkgbG9jYXRpb246ICR7cGF0aH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbGlMb2NhdGlvbkdsb2JhbDtcbiAgfVxuXG4gIHB1YmxpYyBpc0NsaUluc3RhbGxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jbGlJbnN0YWxsZWQpIHJldHVybiB0cnVlO1xuICAgIHRoaXMuY2xpSW5zdGFsbGVkID0gZnMuZXhpc3RzU3luYyh0aGlzLmdldENsaUxvY2F0aW9uKCkpO1xuICAgIHJldHVybiB0aGlzLmNsaUluc3RhbGxlZDtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0FuZEluc3RhbGxDbGkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDbGlJbnN0YWxsZWQoKSkge1xuICAgICAgdGhpcy5pbnN0YWxsQ2xpKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0NsaUxhdGVzdCgoaXNMYXRlc3QpID0+IHtcbiAgICAgICAgaWYgKCFpc0xhdGVzdCkge1xuICAgICAgICAgIHRoaXMuaW5zdGFsbENsaShjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0NsaUxhdGVzdChjYWxsYmFjazogKGFyZzA6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRDbGlMb2NhdGlvbkdsb2JhbCgpKSB7XG4gICAgICBjYWxsYmFjayh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcmdzID0gWyctLXZlcnNpb24nXTtcbiAgICBjb25zdCBvcHRpb25zID0gRGVza3RvcC5idWlsZE9wdGlvbnMoKTtcbiAgICB0cnkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZSh0aGlzLmdldENsaUxvY2F0aW9uKCksIGFyZ3MsIG9wdGlvbnMsIChlcnJvciwgX3N0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmICghKGVycm9yICE9IG51bGwpKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBfc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpICsgc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDdXJyZW50IHdha2F0aW1lLWNsaSB2ZXJzaW9uIGlzICR7Y3VycmVudFZlcnNpb259YCk7XG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgZm9yIHVwZGF0ZXMgdG8gd2FrYXRpbWUtY2xpLi4uJyk7XG4gICAgICAgICAgdGhpcy5nZXRMYXRlc3RDbGlWZXJzaW9uKChsYXRlc3RWZXJzaW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFZlcnNpb24gPT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3dha2F0aW1lLWNsaSBpcyB1cCB0byBkYXRlJyk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXRlc3RWZXJzaW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBGb3VuZCBhbiB1cGRhdGVkIHdha2F0aW1lLWNsaSAke2xhdGVzdFZlcnNpb259YCk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdVbmFibGUgdG8gZmluZCBsYXRlc3Qgd2FrYXRpbWUtY2xpIHZlcnNpb24nKTtcbiAgICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF0ZXN0Q2xpVmVyc2lvbihjYWxsYmFjazogKGFyZzA6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhdGVzdENsaVZlcnNpb24pIHtcbiAgICAgIGNhbGxiYWNrKHRoaXMubGF0ZXN0Q2xpVmVyc2lvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdwcm94eScsIGZhbHNlLCAocHJveHk6IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5nZXRTZXR0aW5nKCdzZXR0aW5ncycsICdub19zc2xfdmVyaWZ5JywgZmFsc2UsIChub1NTTFZlcmlmeTogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZyhcbiAgICAgICAgICAnaW50ZXJuYWwnLFxuICAgICAgICAgICdjbGlfdmVyc2lvbl9sYXN0X21vZGlmaWVkJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIChtb2RpZmllZDogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ2ludGVybmFsJywgJ2NsaV92ZXJzaW9uJywgdHJ1ZSwgKHZlcnNpb246IE9wdGlvblNldHRpbmcpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ3NldHRpbmdzJywgJ2FscGhhJywgZmFsc2UsIChhbHBoYTogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IHJlcXVlc3QuT3B0aW9uc1dpdGhVcmwgPSB7XG4gICAgICAgICAgICAgICAgICB1cmw6XG4gICAgICAgICAgICAgICAgICAgIGFscGhhLnZhbHVlID09ICd0cnVlJ1xuICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5naXRodWJSZWxlYXNlc0FscGhhVXJsXG4gICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdpdGh1YlJlbGVhc2VzU3RhYmxlVXJsLFxuICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnZ2l0aHViLmNvbS93YWthdGltZS92c2NvZGUtd2FrYXRpbWUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChwcm94eS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFVzaW5nIFByb3h5OiAke3Byb3h5LnZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgb3B0aW9uc1sncHJveHknXSA9IHByb3h5LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9TU0xWZXJpZnkudmFsdWUgPT09ICd0cnVlJykgb3B0aW9uc1snc3RyaWN0U1NMJ10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWQudmFsdWUgJiYgdmVyc2lvbi52YWx1ZSAmJiBvcHRpb25zLmhlYWRlcnMpXG4gICAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0lmLU1vZGlmaWVkLVNpbmNlJ10gPSBtb2RpZmllZC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXQob3B0aW9ucywgKGVycm9yLCByZXNwb25zZSwganNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgIWVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAzMDQpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBHaXRIdWIgQVBJIFJlc3BvbnNlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSAzMDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF0ZXN0Q2xpVmVyc2lvbiA9IHZlcnNpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmxhdGVzdENsaVZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdENsaVZlcnNpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEudmFsdWUgPT0gJ3RydWUnID8ganNvblswXVsndGFnX25hbWUnXSA6IGpzb25bJ3RhZ19uYW1lJ107XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICBgTGF0ZXN0IHdha2F0aW1lLWNsaSB2ZXJzaW9uIGZyb20gR2l0SHViOiAke3RoaXMubGF0ZXN0Q2xpVmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gcmVzcG9uc2UuaGVhZGVyc1snbGFzdC1tb2RpZmllZCddIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkICYmIHRoaXMubGF0ZXN0Q2xpVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNldFNldHRpbmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW50ZXJuYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBrZXk6ICdjbGlfdmVyc2lvbicsIHZhbHVlOiB0aGlzLmxhdGVzdENsaVZlcnNpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGtleTogJ2NsaV92ZXJzaW9uX2xhc3RfbW9kaWZpZWQnLCB2YWx1ZTogbGFzdE1vZGlmaWVkIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmxhdGVzdENsaVZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgR2l0SHViIEFQSSBSZXNwb25zZSAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9OiAke2Vycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBHaXRIdWIgQVBJIFJlc3BvbnNlIEVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5FeGNlcHRpb24oZSk7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbENsaShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0TGF0ZXN0Q2xpVmVyc2lvbigodmVyc2lvbikgPT4ge1xuICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBEb3dubG9hZGluZyB3YWthdGltZS1jbGkgJHt2ZXJzaW9ufS4uLmApO1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5jbGlEb3dubG9hZFVybCh2ZXJzaW9uKTtcbiAgICAgIGNvbnN0IHppcEZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICAgIHRoaXMuZ2V0UmVzb3VyY2VzTG9jYXRpb24oKSxcbiAgICAgICAgJ3dha2F0aW1lLWNsaScgKyB0aGlzLnJhbmRTdHIoKSArICcuemlwJyxcbiAgICAgICk7XG4gICAgICB0aGlzLmRvd25sb2FkRmlsZShcbiAgICAgICAgdXJsLFxuICAgICAgICB6aXBGaWxlLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHRyYWN0Q2xpKHppcEZpbGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N5bWxpbmsoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5sc3RhdFN5bmMoZmlsZSkuaXNTeW1ib2xpY0xpbmsoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICB9IGNhdGNoIChfKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdENsaSh6aXBGaWxlOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYEV4dHJhY3Rpbmcgd2FrYXRpbWUtY2xpIGludG8gXCIke3RoaXMuZ2V0UmVzb3VyY2VzTG9jYXRpb24oKX1cIi4uLmApO1xuICAgIHRoaXMucmVtb3ZlQ2xpKCgpID0+IHtcbiAgICAgIHRoaXMudW56aXAoemlwRmlsZSwgdGhpcy5nZXRSZXNvdXJjZXNMb2NhdGlvbigpLCAoKSA9PiB7XG4gICAgICAgIGlmICghRGVza3RvcC5pc1dpbmRvd3MoKSkge1xuICAgICAgICAgIGNvbnN0IGNsaSA9IHRoaXMuZ2V0Q2xpTG9jYXRpb24oKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NobW9kIDc1NSB3YWthdGltZS1jbGkuLi4nKTtcbiAgICAgICAgICAgIGZzLmNobW9kU3luYyhjbGksIDBvNzU1KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuRXhjZXB0aW9uKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleHQgPSBEZXNrdG9wLmlzV2luZG93cygpID8gJy5leGUnIDogJyc7XG4gICAgICAgICAgY29uc3QgbGluayA9IHBhdGguam9pbih0aGlzLmdldFJlc291cmNlc0xvY2F0aW9uKCksIGB3YWthdGltZS1jbGkke2V4dH1gKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNTeW1saW5rKGxpbmspKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRlIHN5bWxpbmsgZnJvbSB3YWthdGltZS1jbGkgdG8gJHtjbGl9YCk7XG4gICAgICAgICAgICAgIGZzLnN5bWxpbmtTeW5jKGNsaSwgbGluayk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5FeGNlcHRpb24oZSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKGNsaSwgbGluayk7XG4gICAgICAgICAgICAgICAgZnMuY2htb2RTeW5jKGxpbmssIDBvNzU1KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuRXhjZXB0aW9uKGUyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRmluaXNoZWQgZXh0cmFjdGluZyB3YWthdGltZS1jbGkuJyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNsaShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuZ2V0Q2xpTG9jYXRpb24oKSkpIHtcbiAgICAgIGZzLnVubGluayh0aGlzLmdldENsaUxvY2F0aW9uKCksICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRGaWxlKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG91dHB1dEZpbGU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKCkgPT4gdm9pZCxcbiAgICBlcnJvcjogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ3NldHRpbmdzJywgJ3Byb3h5JywgZmFsc2UsIChwcm94eTogT3B0aW9uU2V0dGluZykgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmdldFNldHRpbmcoJ3NldHRpbmdzJywgJ25vX3NzbF92ZXJpZnknLCBmYWxzZSwgKG5vU1NMVmVyaWZ5OiBPcHRpb25TZXR0aW5nKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9wdGlvbnM6IHJlcXVlc3QuT3B0aW9uc1dpdGhVcmwgPSB7IHVybDogdXJsIH07XG4gICAgICAgIGlmIChwcm94eS52YWx1ZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVc2luZyBQcm94eTogJHtwcm94eS52YWx1ZX1gKTtcbiAgICAgICAgICBvcHRpb25zWydwcm94eSddID0gcHJveHkudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vU1NMVmVyaWZ5LnZhbHVlID09PSAndHJ1ZScpIG9wdGlvbnNbJ3N0cmljdFNTTCddID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgciA9IHJlcXVlc3QuZ2V0KG9wdGlvbnMpO1xuICAgICAgICAgIHIub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkb3dubG9hZCAke3VybH1gKTtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGVycm9yKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgb3V0ID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0ob3V0cHV0RmlsZSk7XG4gICAgICAgICAgci5waXBlKG91dCk7XG4gICAgICAgICAgci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgb3V0Lm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm5FeGNlcHRpb24oZSk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuemlwKGZpbGU6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHppcCA9IG5ldyBBZG1aaXAoZmlsZSk7XG4gICAgICAgIHppcC5leHRyYWN0QWxsVG8ob3V0cHV0RGlyLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3JFeGNlcHRpb24oZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZzLnVubGluayhmaWxlLCAoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFyY2hpdGVjdHVyZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyY2ggPSBvcy5hcmNoKCk7XG4gICAgaWYgKGFyY2guaW5kZXhPZignMzInKSA+IC0xKSByZXR1cm4gJzM4Nic7XG4gICAgaWYgKGFyY2guaW5kZXhPZigneDY0JykgPiAtMSkgcmV0dXJuICdhbWQ2NCc7XG4gICAgcmV0dXJuIGFyY2g7XG4gIH1cblxuICBwcml2YXRlIGNsaURvd25sb2FkVXJsKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IG9zbmFtZSA9IG9zLnBsYXRmb3JtKCkgYXMgc3RyaW5nO1xuICAgIGlmIChvc25hbWUgPT0gJ3dpbjMyJykgb3NuYW1lID0gJ3dpbmRvd3MnO1xuICAgIGNvbnN0IGFyY2ggPSB0aGlzLmFyY2hpdGVjdHVyZSgpO1xuXG4gICAgY29uc3QgdmFsaWRDb21iaW5hdGlvbnMgPSBbXG4gICAgICAnZGFyd2luLWFtZDY0JyxcbiAgICAgICdkYXJ3aW4tYXJtNjQnLFxuICAgICAgJ2ZyZWVic2QtMzg2JyxcbiAgICAgICdmcmVlYnNkLWFtZDY0JyxcbiAgICAgICdmcmVlYnNkLWFybScsXG4gICAgICAnbGludXgtMzg2JyxcbiAgICAgICdsaW51eC1hbWQ2NCcsXG4gICAgICAnbGludXgtYXJtJyxcbiAgICAgICdsaW51eC1hcm02NCcsXG4gICAgICAnbmV0YnNkLTM4NicsXG4gICAgICAnbmV0YnNkLWFtZDY0JyxcbiAgICAgICduZXRic2QtYXJtJyxcbiAgICAgICdvcGVuYnNkLTM4NicsXG4gICAgICAnb3BlbmJzZC1hbWQ2NCcsXG4gICAgICAnb3BlbmJzZC1hcm0nLFxuICAgICAgJ29wZW5ic2QtYXJtNjQnLFxuICAgICAgJ3dpbmRvd3MtMzg2JyxcbiAgICAgICd3aW5kb3dzLWFtZDY0JyxcbiAgICAgICd3aW5kb3dzLWFybTY0JyxcbiAgICBdO1xuICAgIGlmICghdmFsaWRDb21iaW5hdGlvbnMuaW5jbHVkZXMoYCR7b3NuYW1lfS0ke2FyY2h9YCkpXG4gICAgICB0aGlzLnJlcG9ydE1pc3NpbmdQbGF0Zm9ybVN1cHBvcnQob3NuYW1lLCBhcmNoKTtcblxuICAgIHJldHVybiBgJHt0aGlzLmdpdGh1YkRvd25sb2FkUHJlZml4fS8ke3ZlcnNpb259L3dha2F0aW1lLWNsaS0ke29zbmFtZX0tJHthcmNofS56aXBgO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBvcnRNaXNzaW5nUGxhdGZvcm1TdXBwb3J0KG9zbmFtZTogc3RyaW5nLCBhcmNoaXRlY3R1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS53YWthdGltZS5jb20vYXBpL3YxL2NsaS1taXNzaW5nP29zbmFtZT0ke29zbmFtZX0mYXJjaGl0ZWN0dXJlPSR7YXJjaGl0ZWN0dXJlfSZwbHVnaW49dnNjb2RlYDtcbiAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZygnc2V0dGluZ3MnLCAncHJveHknLCBmYWxzZSwgKHByb3h5OiBPcHRpb25TZXR0aW5nKSA9PiB7XG4gICAgICB0aGlzLm9wdGlvbnMuZ2V0U2V0dGluZygnc2V0dGluZ3MnLCAnbm9fc3NsX3ZlcmlmeScsIGZhbHNlLCAobm9TU0xWZXJpZnk6IE9wdGlvblNldHRpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3B0aW9uczogcmVxdWVzdC5PcHRpb25zV2l0aFVybCA9IHsgdXJsOiB1cmwgfTtcbiAgICAgICAgaWYgKHByb3h5LnZhbHVlKSBvcHRpb25zWydwcm94eSddID0gcHJveHkudmFsdWU7XG4gICAgICAgIGlmIChub1NTTFZlcmlmeS52YWx1ZSA9PT0gJ3RydWUnKSBvcHRpb25zWydzdHJpY3RTU0wnXSA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcXVlc3QuZ2V0KG9wdGlvbnMpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmFuZFN0cigpOiBzdHJpbmcge1xuICAgIHJldHVybiAoTWF0aC5yYW5kb20oKSArIDEpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNyk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxZQUFRLFVBQVUsV0FBWTtBQUMxQixVQUFJLE9BQU8sWUFBWSxZQUFZLFFBQVEsWUFBWSxRQUFRLFNBQVMsYUFBYTtBQUNqRixZQUFJO0FBQ0EsZ0JBQU0sYUFBYSxRQUFRO0FBQzNCLGNBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxTQUFTLEdBQUc7QUFDcEMsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSixTQUFTLEdBQVA7QUFBQSxRQUFXO0FBQUEsTUFDakI7QUFDQSxhQUFPLFFBQVE7QUFBQSxJQUNuQjtBQUFBO0FBQUE7OztBQ1ZBO0FBQUE7QUFBQSxZQUFPLFVBQVU7QUFBQSxNQUViLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUduQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFHbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BR25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFFbkIsVUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFlBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixlQUFtQjtBQUFBLE1BRW5CLFVBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixXQUFtQjtBQUFBLE1BQ25CLFdBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsYUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsV0FBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFlBQW1CO0FBQUEsTUFHbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixVQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUVuQixVQUFtQjtBQUFBLE1BQ25CLG1CQUFtQjtBQUFBLE1BQ25CLFFBQW1CO0FBQUEsTUFFbkIsT0FBbUI7QUFBQSxNQUVuQixNQUFtQjtBQUFBLE1BRW5CLFdBQW1CO0FBQUEsTUFDbkIsVUFBbUI7QUFBQSxNQUNuQixhQUFtQjtBQUFBLE1BSW5CLFNBQW1CO0FBQUEsTUFDbkIsV0FBbUI7QUFBQSxNQUNuQixXQUFtQjtBQUFBLE1BQ25CLFVBQW1CO0FBQUEsTUFDbkIsU0FBbUI7QUFBQSxNQUNuQixXQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FBQUEsTUFFbkIsU0FBbUI7QUFBQSxNQUluQixTQUFtQjtBQUFBLE1BR25CLE1BQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixNQUFtQjtBQUFBLE1BR25CLE9BQW1CO0FBQUEsTUFDbkIsU0FBbUI7QUFBQSxNQUduQixVQUFtQjtBQUFBLE1BQ25CLFdBQW1CO0FBQUEsTUFDbkIsUUFBbUI7QUFBQSxNQUNuQixRQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FBQUEsTUFDbkIsWUFBbUI7QUFBQSxNQUNuQixTQUFtQjtBQUFBLE1BQ25CLFNBQW1CO0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwSEE7QUFBQTtBQUFBO0FBSUEsUUFBSSxXQUFXLFFBQVE7QUFHdkIsUUFBSSxZQUFZLENBQUM7QUFNakIs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SztBQUFHLGlCQUFPLEVBQUUsU0FBUyxDQUFDO0FBQzNDLFlBQUcsRUFBRSxPQUFPLElBQUk7QUFBRyxZQUFFLE1BQU0sR0FBRSxDQUFDO0FBQUE7QUFBUSxpQkFBTztBQUM3QyxZQUFHLEVBQUUsT0FBTyxJQUFJO0FBQUcsaUJBQU8sRUFBRSxJQUFJLENBQUM7QUFBQTtBQUFRLGlCQUFPO0FBQUEsTUFDbEQ7QUFFQSxVQUFJLFlBQVksQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLElBQUcsSUFBRyxJQUFHLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxL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QUssUUFBTyxJQUM5RSxLQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRyxLQUFLLFFBQU8sS0FBTSxHQUFHLEtBQUssUUFBTyxJQUM5RSxLQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRyxLQUFLLFFBQU8sS0FBTSxHQUFHLEtBQUssUUFBTyxJQUM5RSxLQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxLQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUcsS0FBSyxNQUFRLEdBQUcsS0FBSyxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTyxJQUM5RSxNQUFNLEVBQUUsTUFBTSxNQUFRLEdBQUUsTUFBTSxRQUFPLElBQUssR0FBRSxNQUFNLFFBQU8sS0FBTSxHQUFFLE1BQU0sUUFBTztBQUVsRixZQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxL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LFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQU8sS0FBSztBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBRXBCLFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQVEsSUFBSTtBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBQ3BCLFVBQUUsTUFBTSxPQUFPLEtBQUs7QUFFcEIsVUFBRSxNQUFNLE9BQVEsSUFBSTtBQUNwQixVQUFFLE1BQU0sT0FBUSxJQUFJO0FBQ3BCLFVBQUUsTUFBTSxPQUFPLEtBQUs7QUFDcEIsVUFBRSxNQUFNLE9BQU8sS0FBSztBQUVwQixVQUFFLE1BQU0sT0FBUSxJQUFJO0FBQ3BCLFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQU8sS0FBSztBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBRXBCLFVBQUUsTUFBTSxPQUFRLElBQUk7QUFDcEIsVUFBRSxNQUFNLE9BQVEsSUFBSTtBQUNwQixVQUFFLE1BQU0sT0FBTyxLQUFLO0FBQ3BCLFVBQUUsTUFBTSxPQUFPLEtBQUs7QUFFcEIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUVyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBRXJCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFFckIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUVyQixVQUFFLE1BQU0sUUFBUyxJQUFJO0FBQ3JCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVEsS0FBSztBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBRXJCLFVBQUUsTUFBTSxRQUFTLElBQUk7QUFDckIsVUFBRSxNQUFNLFFBQVMsSUFBSTtBQUNyQixVQUFFLE1BQU0sUUFBUSxLQUFLO0FBQ3JCLFVBQUUsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUN2QjtBQUVBLDZCQUF1QixHQUFFLEdBQUUsR0FBRSxHQUFHO0FBQzlCLFlBQUksS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsS0FBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUcsS0FBSyxRQUFPLEtBQU0sR0FBRyxLQUFLLFFBQU8sSUFDOUUsS0FBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsS0FBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFHLEtBQUssTUFBUSxHQUFHLEtBQUssUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU8sSUFDOUUsTUFBTSxFQUFFLE1BQU0sTUFBUSxHQUFFLE1BQU0sUUFBTyxJQUFLLEdBQUUsTUFBTSxRQUFPLEtBQU0sR0FBRSxNQUFNLFFBQU87QUFFbEYsWUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUNwRSxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQ3BFLE1BQU0sS0FBSztBQUVmLGlCQUFTLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHO0FBQzlCLGNBQUksS0FBSyxNQUFNO0FBQ2YsZ0JB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LEtBQU0sR0FBRSxJQUFFLElBQUUsTUFBTTtBQUN0RCxVQUFFLE9BQU87QUFBQSxNQUNYO0FBRUEsaUJBQVcsR0FBRyxHQUFHLEdBQUc7QUFDbEIsaUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSTtBQUFLLFlBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUFBLE1BQy9DO0FBRUEsaUJBQVcsR0FBRyxHQUFHLEdBQUc7QUFDbEIsaUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSTtBQUFLLFlBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUFBLE1BQy9DO0FBRUEsaUJBQVcsR0FBRyxHQUFHLEdBQUc7QUFDbEIsWUFBSSxHQUFHLEdBQ0osS0FBSyxHQUFJLEtBQUssR0FBSSxLQUFLLEdBQUksS0FBSyxHQUFJLEtBQUssR0FBSSxLQUFLLEdBQUksS0FBSyxHQUFJLEtBQUssR0FDcEUsS0FBSyxHQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FDckUsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FDckUsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUM1RCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxLQUFLLEVBQUUsSUFDUCxNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUUsS0FDUixNQUFNLEVBQUU7QUFFVixZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixjQUFNLElBQUk7QUFDVixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxZQUFJLEVBQUU7QUFDTixlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFDWCxlQUFPLElBQUk7QUFFWCxjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixjQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFDWixlQUFPLEtBQUs7QUFJWixZQUFJO0FBQ0osWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFJLE1BQU0sSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFHLGNBQU0sSUFBSSxJQUFJO0FBQzlELFlBQUksTUFBTSxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUcsY0FBTSxJQUFJLElBQUk7QUFDOUQsWUFBSSxNQUFNLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBRyxjQUFNLElBQUksSUFBSTtBQUM5RCxZQUFJLE1BQU0sSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFHLGNBQU0sSUFBSSxJQUFJO0FBQzlELFlBQUksTUFBTSxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUcsY0FBTSxJQUFJLElBQUk7QUFDOUQsWUFBSSxNQUFNLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBRyxjQUFNLElBQUksSUFBSTtBQUM5RCxjQUFNLElBQUUsSUFBSSxLQUFNLEtBQUU7QUFHcEIsWUFBSTtBQUNKLFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSyxLQUFLLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBSSxhQUFLLElBQUksSUFBSTtBQUM5RCxZQUFLLEtBQUssSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFJLGFBQUssSUFBSSxJQUFJO0FBQzlELFlBQUssS0FBSyxJQUFJO0FBQU8sWUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLO0FBQUksYUFBSyxJQUFJLElBQUk7QUFDOUQsWUFBSSxNQUFNLElBQUk7QUFBTyxZQUFJLEtBQUssTUFBTSxJQUFJLEtBQUs7QUFBRyxjQUFNLElBQUksSUFBSTtBQUM5RCxZQUFJLE1BQU0sSUFBSTtBQUFPLFlBQUksS0FBSyxNQUFNLElBQUksS0FBSztBQUFHLGNBQU0sSUFBSSxJQUFJO0FBQzlELFlBQUks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QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFDcEM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQVk7QUFBQSxRQUNwQztBQUFBLFFBQVk7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQ3BDO0FBQUEsUUFB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LGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1BQU07QUFFNUIsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBRVgsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFDbkMsYUFBRyxLQUFLLE1BQU8sSUFBSSxRQUFXLEtBQUs7QUFFbkMsY0FBSTtBQUNKLGNBQUk7QUFFSixjQUFJLElBQUk7QUFBUSxjQUFJLE1BQU07QUFDMUIsY0FBSSxJQUFJO0FBQVEsY0FBSSxNQUFNO0FBRTFCLGNBQUksR0FBRztBQUNQLGNBQUksR0FBRztBQUVQLGVBQUssSUFBSTtBQUFRLGVBQUssTUFBTTtBQUM1QixlQUFLLElBQUk7QUFBUSxlQUFLLE1B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LFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsUUFBVSxDQUFDO0FBQUEsUUFDakQsSUFBSSxZQUFZO0FBQUEsVUFDZDtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFFBQVUsQ0FBQztBQUFBLFFBQ2pELElBQUksWUFBWTtBQUFBLFVBQ2Q7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxRQUFVLENBQUM7QUFBQSxRQUNqRCxJQUFJLFlBQVk7QUFBQSxVQUNkO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFDcEM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUNwQztBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQ3BDO0FBQUEsVUFBWTtBQUFBLFVBQVk7QUFBQSxVQUFZO0FBQUEsUUFBVSxDQUFDO0FBQUEsTUFDakQ7QUFDRixXQUFLLElBQUks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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QkE7QUFBQTtBQVdBLFlBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ1hqQjtBQUFBO0FBQUE7QUFjQSxRQUFJLEtBQUs7QUFDVCxRQUFJLFVBQVUsUUFBUSxR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LEtBQUssQ0FBQztBQUFBLFlBQzNDO0FBQUEsVUFDRixPQUFPO0FBQ0wsaUJBQUssb0JBQW9CO0FBQ3pCLGlCQUFLLHVCQUF1Qix5REFBeUQ7QUFBQSxVQUN2RjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLFdBQVcsUUFBUSxPQUFPLFFBQVEsS0FBSztBQUFBLE1BRXZDLE9BQU87QUFDTCxjQUFNLFlBQVkseUNBQXlDLHFCQUFxQixLQUFLLFFBQVEsV0FBVztBQUN4RyxhQUFLLE9BQU8sTUFBTSxTQUFTO0FBQUEsTUFDN0I7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFFQSxJQUFNLGNBQU4sY0FBMEIsc0JBQU07QUFBQSxFQUs5QixZQUFZLEtBQVUsU0FBa0I7QUFDdEMsUUFBSSxZQUFZLFVBQVU7QUFDeEIsYUFBTyxZQUFZO0FBQUEsSUFDckI7QUFDQSxVQUFNLEdBQUc7QUFDVCxTQUFLLFVBQVU7QUFDZixnQkFBWSxXQUFXO0FBQUEsRUFDekI7QUFBQSxFQUVBLFNBQVM7QUFDUCxVQUFNLEVBQUUsY0FBYztBQUV0QixTQUFLLFFBQVEsV0FBVyxZQUFZLFdBQVcsT0FBTyxDQUFDLFlBQTJCO0FBQ2hGLFVBQUksYUFBYSxRQUFRO0FBQ3pCLFVBQUksTUFBTSxjQUFjLFVBQVU7QUFBRyxxQkFBYTtBQUVsRCxnQkFBVSxTQUFTLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWhFLFVBQUksd0JBQVEsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO0FBQ3ZDLGFBQUssU0FBUyxVQUFVO0FBQ3hCLGFBQUssUUFBUSxTQUFTLGVBQWU7QUFDckMsYUFBSyxRQUFRO0FBQUEsTUFDZixDQUFDO0FBRUQsVUFBSSx3QkFBUSxTQUFTLEVBQUUsVUFBVSxDQUFDLFFBQ2hDLElBQ0csY0FBYyxNQUFNLEVBQ3BCLE9BQU8sRUFDUCxRQUFRLE1BQU07QUFDYixjQUFNLE1BQU0sS0FBSyxNQUFNLFNBQVM7QUFDaEMsY0FBTSxVQUFVLE1BQU0sY0FBYyxHQUFHO0FBQ3ZDLGdCQUFRLElBQUksT0FBTztBQUNuQixZQUFJLENBQUMsU0FBUztBQUNaLGVBQUssTUFBTTtBQUNYLGVBQUssUUFBUSxXQUFXLFlBQVksV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUMzRDtBQUFBLE1BQ0YsQ0FBQyxDQUNMO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRUEsVUFBVTtBQUNSLFVBQU0sRUFBRSxjQUFjO0FBQ3RCLGNBQVUsTUFBTTtBQUFBLEVBQ2xCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==