notes/.obsidian/plugins/obsidian-circuitjs/main.js

587 lines
61 KiB
JavaScript

/*
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 __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[Object.keys(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// node_modules/.pnpm/lz-string@1.4.4/node_modules/lz-string/libs/lz-string.js
var require_lz_string = __commonJS({
"node_modules/.pnpm/lz-string@1.4.4/node_modules/lz-string/libs/lz-string.js"(exports, module2) {
var LZString2 = function() {
var f = String.fromCharCode;
var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$";
var baseReverseDic = {};
function getBaseValue(alphabet, character) {
if (!baseReverseDic[alphabet]) {
baseReverseDic[alphabet] = {};
for (var i = 0; i < alphabet.length; i++) {
baseReverseDic[alphabet][alphabet.charAt(i)] = i;
}
}
return baseReverseDic[alphabet][character];
}
var LZString3 = {
compressToBase64: function(input) {
if (input == null)
return "";
var res = LZString3._compress(input, 6, function(a) {
return keyStrBase64.charAt(a);
});
switch (res.length % 4) {
default:
case 0:
return res;
case 1:
return res + "===";
case 2:
return res + "==";
case 3:
return res + "=";
}
},
decompressFromBase64: function(input) {
if (input == null)
return "";
if (input == "")
return null;
return LZString3._decompress(input.length, 32, function(index) {
return getBaseValue(keyStrBase64, input.charAt(index));
});
},
compressToUTF16: function(input) {
if (input == null)
return "";
return LZString3._compress(input, 15, function(a) {
return f(a + 32);
}) + " ";
},
decompressFromUTF16: function(compressed) {
if (compressed == null)
return "";
if (compressed == "")
return null;
return LZString3._decompress(compressed.length, 16384, function(index) {
return compressed.charCodeAt(index) - 32;
});
},
compressToUint8Array: function(uncompressed) {
var compressed = LZString3.compress(uncompressed);
var buf = new Uint8Array(compressed.length * 2);
for (var i = 0, TotalLen = compressed.length; i < TotalLen; i++) {
var current_value = compressed.charCodeAt(i);
buf[i * 2] = current_value >>> 8;
buf[i * 2 + 1] = current_value % 256;
}
return buf;
},
decompressFromUint8Array: function(compressed) {
if (compressed === null || compressed === void 0) {
return LZString3.decompress(compressed);
} else {
var buf = new Array(compressed.length / 2);
for (var i = 0, TotalLen = buf.length; i < TotalLen; i++) {
buf[i] = compressed[i * 2] * 256 + compressed[i * 2 + 1];
}
var result = [];
buf.forEach(function(c) {
result.push(f(c));
});
return LZString3.decompress(result.join(""));
}
},
compressToEncodedURIComponent: function(input) {
if (input == null)
return "";
return LZString3._compress(input, 6, function(a) {
return keyStrUriSafe.charAt(a);
});
},
decompressFromEncodedURIComponent: function(input) {
if (input == null)
return "";
if (input == "")
return null;
input = input.replace(/ /g, "+");
return LZString3._decompress(input.length, 32, function(index) {
return getBaseValue(keyStrUriSafe, input.charAt(index));
});
},
compress: function(uncompressed) {
return LZString3._compress(uncompressed, 16, function(a) {
return f(a);
});
},
_compress: function(uncompressed, bitsPerChar, getCharFromInt) {
if (uncompressed == null)
return "";
var i, value, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0, ii;
for (ii = 0; ii < uncompressed.length; ii += 1) {
context_c = uncompressed.charAt(ii);
if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) {
context_dictionary[context_c] = context_dictSize++;
context_dictionaryToCreate[context_c] = true;
}
context_wc = context_w + context_c;
if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) {
context_w = context_wc;
} else {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
}
value = context_w.charCodeAt(0);
for (i = 0; i < 8; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
} else {
value = 1;
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1 | value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = 0;
}
value = context_w.charCodeAt(0);
for (i = 0; i < 16; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
}
context_enlargeIn--;
if (context_enlargeIn == 0) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
delete context_dictionaryToCreate[context_w];
} else {
value = context_dictionary[context_w];
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
}
context_enlargeIn--;
if (context_enlargeIn == 0) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
context_dictionary[context_wc] = context_dictSize++;
context_w = String(context_c);
}
}
if (context_w !== "") {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
}
value = context_w.charCodeAt(0);
for (i = 0; i < 8; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
} else {
value = 1;
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1 | value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = 0;
}
value = context_w.charCodeAt(0);
for (i = 0; i < 16; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
}
context_enlargeIn--;
if (context_enlargeIn == 0) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
delete context_dictionaryToCreate[context_w];
} else {
value = context_dictionary[context_w];
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
}
context_enlargeIn--;
if (context_enlargeIn == 0) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
}
value = 2;
for (i = 0; i < context_numBits; i++) {
context_data_val = context_data_val << 1 | value & 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else {
context_data_position++;
}
value = value >> 1;
}
while (true) {
context_data_val = context_data_val << 1;
if (context_data_position == bitsPerChar - 1) {
context_data.push(getCharFromInt(context_data_val));
break;
} else
context_data_position++;
}
return context_data.join("");
},
decompress: function(compressed) {
if (compressed == null)
return "";
if (compressed == "")
return null;
return LZString3._decompress(compressed.length, 32768, function(index) {
return compressed.charCodeAt(index);
});
},
_decompress: function(length, resetValue, getNextValue) {
var dictionary = [], next, enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], i, w, bits, resb, maxpower, power, c, data = { val: getNextValue(0), position: resetValue, index: 1 };
for (i = 0; i < 3; i += 1) {
dictionary[i] = i;
}
bits = 0;
maxpower = Math.pow(2, 2);
power = 1;
while (power != maxpower) {
resb = data.val & data.position;
data.position >>= 1;
if (data.position == 0) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
switch (next = bits) {
case 0:
bits = 0;
maxpower = Math.pow(2, 8);
power = 1;
while (power != maxpower) {
resb = data.val & data.position;
data.position >>= 1;
if (data.position == 0) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
c = f(bits);
break;
case 1:
bits = 0;
maxpower = Math.pow(2, 16);
power = 1;
while (power != maxpower) {
resb = data.val & data.position;
data.position >>= 1;
if (data.position == 0) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
c = f(bits);
break;
case 2:
return "";
}
dictionary[3] = c;
w = c;
result.push(c);
while (true) {
if (data.index > length) {
return "";
}
bits = 0;
maxpower = Math.pow(2, numBits);
power = 1;
while (power != maxpower) {
resb = data.val & data.position;
data.position >>= 1;
if (data.position == 0) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
switch (c = bits) {
case 0:
bits = 0;
maxpower = Math.pow(2, 8);
power = 1;
while (power != maxpower) {
resb = data.val & data.position;
data.position >>= 1;
if (data.position == 0) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
dictionary[dictSize++] = f(bits);
c = dictSize - 1;
enlargeIn--;
break;
case 1:
bits = 0;
maxpower = Math.pow(2, 16);
power = 1;
while (power != maxpower) {
resb = data.val & data.position;
data.position >>= 1;
if (data.position == 0) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
dictionary[dictSize++] = f(bits);
c = dictSize - 1;
enlargeIn--;
break;
case 2:
return result.join("");
}
if (enlargeIn == 0) {
enlargeIn = Math.pow(2, numBits);
numBits++;
}
if (dictionary[c]) {
entry = dictionary[c];
} else {
if (c === dictSize) {
entry = w + w.charAt(0);
} else {
return null;
}
}
result.push(entry);
dictionary[dictSize++] = w + entry.charAt(0);
enlargeIn--;
w = entry;
if (enlargeIn == 0) {
enlargeIn = Math.pow(2, numBits);
numBits++;
}
}
}
};
return LZString3;
}();
if (typeof define === "function" && define.amd) {
define(function() {
return LZString2;
});
} else if (typeof module2 !== "undefined" && module2 != null) {
module2.exports = LZString2;
}
}
});
// main.ts
__export(exports, {
default: () => CircuitJsPlugin
});
var import_obsidian2 = __toModule(require("obsidian"));
// circuitRenderer.ts
var import_obsidian = __toModule(require("obsidian"));
var LZString = __toModule(require_lz_string());
var CircuitRenderChild = class extends import_obsidian.MarkdownRenderChild {
constructor(el, renderer, content, settings) {
super(el);
this.settings = settings;
this.code = content;
this.compressed = LZString.compressToEncodedURIComponent(this.code);
if (this.settings.editable) {
this.url = `${this.settings.circuitJsUrl}?ctz=${this.compressed}&running=true`;
} else {
this.url = `${this.settings.circuitJsUrl}?ctz=${this.compressed}&running=false`;
}
}
onload() {
const div = document.createElement("div");
if (this.settings.editLink) {
const editLink = document.createElement("a");
editLink.setAttribute("href", this.url);
const editLinkContent = document.createTextNode("[EDIT]");
editLink.appendChild(editLinkContent);
div.appendChild(editLink);
}
const iframeNode = document.createElement("iframe");
iframeNode.setAttribute("src", this.url);
iframeNode.setAttribute("width", "100%");
iframeNode.setAttribute("height", "600px");
div.appendChild(iframeNode);
this.containerEl.appendChild(div);
}
onunload() {
}
};
// main.ts
var DEFAULT_SETTINGS = {
editable: true,
editLink: true,
circuitJsUrl: "http://falstad.com/circuit/circuitjs.html",
circuitTag: "circuitjs"
};
var CircuitJsPlugin = class extends import_obsidian2.Plugin {
constructor() {
super(...arguments);
this.postprocessor = (content, el, ctx) => __async(this, null, function* () {
ctx.addChild(new CircuitRenderChild(el, this, content, this.settings));
});
}
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.registerMarkdownCodeBlockProcessor(this.settings.circuitTag, this.postprocessor);
});
}
onunload() {
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzLy5wbnBtL2x6LXN0cmluZ0AxLjQuNC9ub2RlX21vZHVsZXMvbHotc3RyaW5nL2xpYnMvbHotc3RyaW5nLmpzIiwgIm1haW4udHMiLCAiY2lyY3VpdFJlbmRlcmVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb3B5cmlnaHQgKGMpIDIwMTMgUGllcm94eSA8cGllcm94eUBwaWVyb3h5Lm5ldD5cbi8vIFRoaXMgd29yayBpcyBmcmVlLiBZb3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4vLyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIFdURlBMLCBWZXJzaW9uIDJcbi8vIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBMSUNFTlNFLnR4dCBvciBodHRwOi8vd3d3Lnd0ZnBsLm5ldC9cbi8vXG4vLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdGhlIGhvbWUgcGFnZTpcbi8vIGh0dHA6Ly9waWVyb3h5Lm5ldC9ibG9nL3BhZ2VzL2x6LXN0cmluZy90ZXN0aW5nLmh0bWxcbi8vXG4vLyBMWi1iYXNlZCBjb21wcmVzc2lvbiBhbGdvcml0aG0sIHZlcnNpb24gMS40LjRcbnZhciBMWlN0cmluZyA9IChmdW5jdGlvbigpIHtcblxuLy8gcHJpdmF0ZSBwcm9wZXJ0eVxudmFyIGYgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIGtleVN0ckJhc2U2NCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcbnZhciBrZXlTdHJVcmlTYWZlID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstJFwiO1xudmFyIGJhc2VSZXZlcnNlRGljID0ge307XG5cbmZ1bmN0aW9uIGdldEJhc2VWYWx1ZShhbHBoYWJldCwgY2hhcmFjdGVyKSB7XG4gIGlmICghYmFzZVJldmVyc2VEaWNbYWxwaGFiZXRdKSB7XG4gICAgYmFzZVJldmVyc2VEaWNbYWxwaGFiZXRdID0ge307XG4gICAgZm9yICh2YXIgaT0wIDsgaTxhbHBoYWJldC5sZW5ndGggOyBpKyspIHtcbiAgICAgIGJhc2VSZXZlcnNlRGljW2FscGhhYmV0XVthbHBoYWJldC5jaGFyQXQoaSldID0gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhc2VSZXZlcnNlRGljW2FscGhhYmV0XVtjaGFyYWN0ZXJdO1xufVxuXG52YXIgTFpTdHJpbmcgPSB7XG4gIGNvbXByZXNzVG9CYXNlNjQgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHJlcyA9IExaU3RyaW5nLl9jb21wcmVzcyhpbnB1dCwgNiwgZnVuY3Rpb24oYSl7cmV0dXJuIGtleVN0ckJhc2U2NC5jaGFyQXQoYSk7fSk7XG4gICAgc3dpdGNoIChyZXMubGVuZ3RoICUgNCkgeyAvLyBUbyBwcm9kdWNlIHZhbGlkIEJhc2U2NFxuICAgIGRlZmF1bHQ6IC8vIFdoZW4gY291bGQgdGhpcyBoYXBwZW4gP1xuICAgIGNhc2UgMCA6IHJldHVybiByZXM7XG4gICAgY2FzZSAxIDogcmV0dXJuIHJlcytcIj09PVwiO1xuICAgIGNhc2UgMiA6IHJldHVybiByZXMrXCI9PVwiO1xuICAgIGNhc2UgMyA6IHJldHVybiByZXMrXCI9XCI7XG4gICAgfVxuICB9LFxuXG4gIGRlY29tcHJlc3NGcm9tQmFzZTY0IDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIGlmIChpbnB1dCA9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2RlY29tcHJlc3MoaW5wdXQubGVuZ3RoLCAzMiwgZnVuY3Rpb24oaW5kZXgpIHsgcmV0dXJuIGdldEJhc2VWYWx1ZShrZXlTdHJCYXNlNjQsIGlucHV0LmNoYXJBdChpbmRleCkpOyB9KTtcbiAgfSxcblxuICBjb21wcmVzc1RvVVRGMTYgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIExaU3RyaW5nLl9jb21wcmVzcyhpbnB1dCwgMTUsIGZ1bmN0aW9uKGEpe3JldHVybiBmKGErMzIpO30pICsgXCIgXCI7XG4gIH0sXG5cbiAgZGVjb21wcmVzc0Zyb21VVEYxNjogZnVuY3Rpb24gKGNvbXByZXNzZWQpIHtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2RlY29tcHJlc3MoY29tcHJlc3NlZC5sZW5ndGgsIDE2Mzg0LCBmdW5jdGlvbihpbmRleCkgeyByZXR1cm4gY29tcHJlc3NlZC5jaGFyQ29kZUF0KGluZGV4KSAtIDMyOyB9KTtcbiAgfSxcblxuICAvL2NvbXByZXNzIGludG8gdWludDhhcnJheSAoVUNTLTIgYmlnIGVuZGlhbiBmb3JtYXQpXG4gIGNvbXByZXNzVG9VaW50OEFycmF5OiBmdW5jdGlvbiAodW5jb21wcmVzc2VkKSB7XG4gICAgdmFyIGNvbXByZXNzZWQgPSBMWlN0cmluZy5jb21wcmVzcyh1bmNvbXByZXNzZWQpO1xuICAgIHZhciBidWY9bmV3IFVpbnQ4QXJyYXkoY29tcHJlc3NlZC5sZW5ndGgqMik7IC8vIDIgYnl0ZXMgcGVyIGNoYXJhY3RlclxuXG4gICAgZm9yICh2YXIgaT0wLCBUb3RhbExlbj1jb21wcmVzc2VkLmxlbmd0aDsgaTxUb3RhbExlbjsgaSsrKSB7XG4gICAgICB2YXIgY3VycmVudF92YWx1ZSA9IGNvbXByZXNzZWQuY2hhckNvZGVBdChpKTtcbiAgICAgIGJ1ZltpKjJdID0gY3VycmVudF92YWx1ZSA+Pj4gODtcbiAgICAgIGJ1ZltpKjIrMV0gPSBjdXJyZW50X3ZhbHVlICUgMjU2O1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9LFxuXG4gIC8vZGVjb21wcmVzcyBmcm9tIHVpbnQ4YXJyYXkgKFVDUy0yIGJpZyBlbmRpYW4gZm9ybWF0KVxuICBkZWNvbXByZXNzRnJvbVVpbnQ4QXJyYXk6ZnVuY3Rpb24gKGNvbXByZXNzZWQpIHtcbiAgICBpZiAoY29tcHJlc3NlZD09PW51bGwgfHwgY29tcHJlc3NlZD09PXVuZGVmaW5lZCl7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5kZWNvbXByZXNzKGNvbXByZXNzZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBidWY9bmV3IEFycmF5KGNvbXByZXNzZWQubGVuZ3RoLzIpOyAvLyAyIGJ5dGVzIHBlciBjaGFyYWN0ZXJcbiAgICAgICAgZm9yICh2YXIgaT0wLCBUb3RhbExlbj1idWYubGVuZ3RoOyBpPFRvdGFsTGVuOyBpKyspIHtcbiAgICAgICAgICBidWZbaV09Y29tcHJlc3NlZFtpKjJdKjI1Nitjb21wcmVzc2VkW2kqMisxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgYnVmLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChmKGMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5kZWNvbXByZXNzKHJlc3VsdC5qb2luKCcnKSk7XG5cbiAgICB9XG5cbiAgfSxcblxuXG4gIC8vY29tcHJlc3MgaW50byBhIHN0cmluZyB0aGF0IGlzIGFscmVhZHkgVVJJIGVuY29kZWRcbiAgY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2NvbXByZXNzKGlucHV0LCA2LCBmdW5jdGlvbihhKXtyZXR1cm4ga2V5U3RyVXJpU2FmZS5jaGFyQXQoYSk7fSk7XG4gIH0sXG5cbiAgLy9kZWNvbXByZXNzIGZyb20gYW4gb3V0cHV0IG9mIGNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50XG4gIGRlY29tcHJlc3NGcm9tRW5jb2RlZFVSSUNvbXBvbmVudDpmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKGlucHV0ID09IFwiXCIpIHJldHVybiBudWxsO1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvIC9nLCBcIitcIik7XG4gICAgcmV0dXJuIExaU3RyaW5nLl9kZWNvbXByZXNzKGlucHV0Lmxlbmd0aCwgMzIsIGZ1bmN0aW9uKGluZGV4KSB7IHJldHVybiBnZXRCYXNlVmFsdWUoa2V5U3RyVXJpU2FmZSwgaW5wdXQuY2hhckF0KGluZGV4KSk7IH0pO1xuICB9LFxuXG4gIGNvbXByZXNzOiBmdW5jdGlvbiAodW5jb21wcmVzc2VkKSB7XG4gICAgcmV0dXJuIExaU3RyaW5nLl9jb21wcmVzcyh1bmNvbXByZXNzZWQsIDE2LCBmdW5jdGlvbihhKXtyZXR1cm4gZihhKTt9KTtcbiAgfSxcbiAgX2NvbXByZXNzOiBmdW5jdGlvbiAodW5jb21wcmVzc2VkLCBiaXRzUGVyQ2hhciwgZ2V0Q2hhckZyb21JbnQpIHtcbiAgICBpZiAodW5jb21wcmVzc2VkID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIHZhciBpLCB2YWx1ZSxcbiAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5PSB7fSxcbiAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGU9IHt9LFxuICAgICAgICBjb250ZXh0X2M9XCJcIixcbiAgICAgICAgY29udGV4dF93Yz1cIlwiLFxuICAgICAgICBjb250ZXh0X3c9XCJcIixcbiAgICAgICAgY29udGV4dF9lbmxhcmdlSW49IDIsIC8vIENvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBlbnRyeSB3aGljaCBzaG91bGQgbm90IGNvdW50XG4gICAgICAgIGNvbnRleHRfZGljdFNpemU9IDMsXG4gICAgICAgIGNvbnRleHRfbnVtQml0cz0gMixcbiAgICAgICAgY29udGV4dF9kYXRhPVtdLFxuICAgICAgICBjb250ZXh0X2RhdGFfdmFsPTAsXG4gICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbj0wLFxuICAgICAgICBpaTtcblxuICAgIGZvciAoaWkgPSAwOyBpaSA8IHVuY29tcHJlc3NlZC5sZW5ndGg7IGlpICs9IDEpIHtcbiAgICAgIGNvbnRleHRfYyA9IHVuY29tcHJlc3NlZC5jaGFyQXQoaWkpO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5LGNvbnRleHRfYykpIHtcbiAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5W2NvbnRleHRfY10gPSBjb250ZXh0X2RpY3RTaXplKys7XG4gICAgICAgIGNvbnRleHRfZGljdGlvbmFyeVRvQ3JlYXRlW2NvbnRleHRfY10gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0X3djID0gY29udGV4dF93ICsgY29udGV4dF9jO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb250ZXh0X2RpY3Rpb25hcnksY29udGV4dF93YykpIHtcbiAgICAgICAgY29udGV4dF93ID0gY29udGV4dF93YztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGUsY29udGV4dF93KSkge1xuICAgICAgICAgIGlmIChjb250ZXh0X3cuY2hhckNvZGVBdCgwKTwyNTYpIHtcbiAgICAgICAgICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGZvciAoaT0wIDsgaTw4IDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+PiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICBmb3IgKGk9MCA7IGk8Y29udGV4dF9udW1CaXRzIDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8IHZhbHVlO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09Yml0c1BlckNoYXItMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gY29udGV4dF93LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICBmb3IgKGk9MCA7IGk8MTYgOyBpKyspIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpIHwgKHZhbHVlJjEpO1xuICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluLS07XG4gICAgICAgICAgaWYgKGNvbnRleHRfZW5sYXJnZUluID09IDApIHtcbiAgICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluID0gTWF0aC5wb3coMiwgY29udGV4dF9udW1CaXRzKTtcbiAgICAgICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGVbY29udGV4dF93XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IGNvbnRleHRfZGljdGlvbmFyeVtjb250ZXh0X3ddO1xuICAgICAgICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXItMSkge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0X2VubGFyZ2VJbi0tO1xuICAgICAgICBpZiAoY29udGV4dF9lbmxhcmdlSW4gPT0gMCkge1xuICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluID0gTWF0aC5wb3coMiwgY29udGV4dF9udW1CaXRzKTtcbiAgICAgICAgICBjb250ZXh0X251bUJpdHMrKztcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgd2MgdG8gdGhlIGRpY3Rpb25hcnkuXG4gICAgICAgIGNvbnRleHRfZGljdGlvbmFyeVtjb250ZXh0X3djXSA9IGNvbnRleHRfZGljdFNpemUrKztcbiAgICAgICAgY29udGV4dF93ID0gU3RyaW5nKGNvbnRleHRfYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3V0cHV0IHRoZSBjb2RlIGZvciB3LlxuICAgIGlmIChjb250ZXh0X3cgIT09IFwiXCIpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGUsY29udGV4dF93KSkge1xuICAgICAgICBpZiAoY29udGV4dF93LmNoYXJDb2RlQXQoMCk8MjU2KSB7XG4gICAgICAgICAgZm9yIChpPTAgOyBpPGNvbnRleHRfbnVtQml0cyA7IGkrKykge1xuICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICBmb3IgKGk9MCA7IGk8OCA7IGkrKykge1xuICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IChjb250ZXh0X2RhdGFfdmFsIDw8IDEpIHwgKHZhbHVlJjEpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSAxO1xuICAgICAgICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhci0xKSB7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICBmb3IgKGk9MCA7IGk8MTYgOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXItMSkge1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRleHRfZW5sYXJnZUluLS07XG4gICAgICAgIGlmIChjb250ZXh0X2VubGFyZ2VJbiA9PSAwKSB7XG4gICAgICAgICAgY29udGV4dF9lbmxhcmdlSW4gPSBNYXRoLnBvdygyLCBjb250ZXh0X251bUJpdHMpO1xuICAgICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBjb250ZXh0X2RpY3Rpb25hcnlUb0NyZWF0ZVtjb250ZXh0X3ddO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBjb250ZXh0X2RpY3Rpb25hcnlbY29udGV4dF93XTtcbiAgICAgICAgZm9yIChpPTAgOyBpPGNvbnRleHRfbnVtQml0cyA7IGkrKykge1xuICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4gMTtcbiAgICAgICAgfVxuXG5cbiAgICAgIH1cbiAgICAgIGNvbnRleHRfZW5sYXJnZUluLS07XG4gICAgICBpZiAoY29udGV4dF9lbmxhcmdlSW4gPT0gMCkge1xuICAgICAgICBjb250ZXh0X2VubGFyZ2VJbiA9IE1hdGgucG93KDIsIGNvbnRleHRfbnVtQml0cyk7XG4gICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hcmsgdGhlIGVuZCBvZiB0aGUgc3RyZWFtXG4gICAgdmFsdWUgPSAyO1xuICAgIGZvciAoaT0wIDsgaTxjb250ZXh0X251bUJpdHMgOyBpKyspIHtcbiAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAoY29udGV4dF9kYXRhX3ZhbCA8PCAxKSB8ICh2YWx1ZSYxKTtcbiAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXItMSkge1xuICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlID4+IDE7XG4gICAgfVxuXG4gICAgLy8gRmx1c2ggdGhlIGxhc3QgY2hhclxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb250ZXh0X2RhdGFfdmFsID0gKGNvbnRleHRfZGF0YV92YWwgPDwgMSk7XG4gICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyLTEpIHtcbiAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0X2RhdGEuam9pbignJyk7XG4gIH0sXG5cbiAgZGVjb21wcmVzczogZnVuY3Rpb24gKGNvbXByZXNzZWQpIHtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoY29tcHJlc3NlZCA9PSBcIlwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gTFpTdHJpbmcuX2RlY29tcHJlc3MoY29tcHJlc3NlZC5sZW5ndGgsIDMyNzY4LCBmdW5jdGlvbihpbmRleCkgeyByZXR1cm4gY29tcHJlc3NlZC5jaGFyQ29kZUF0KGluZGV4KTsgfSk7XG4gIH0sXG5cbiAgX2RlY29tcHJlc3M6IGZ1bmN0aW9uIChsZW5ndGgsIHJlc2V0VmFsdWUsIGdldE5leHRWYWx1ZSkge1xuICAgIHZhciBkaWN0aW9uYXJ5ID0gW10sXG4gICAgICAgIG5leHQsXG4gICAgICAgIGVubGFyZ2VJbiA9IDQsXG4gICAgICAgIGRpY3RTaXplID0gNCxcbiAgICAgICAgbnVtQml0cyA9IDMsXG4gICAgICAgIGVudHJ5ID0gXCJcIixcbiAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIGksXG4gICAgICAgIHcsXG4gICAgICAgIGJpdHMsIHJlc2IsIG1heHBvd2VyLCBwb3dlcixcbiAgICAgICAgYyxcbiAgICAgICAgZGF0YSA9IHt2YWw6Z2V0TmV4dFZhbHVlKDApLCBwb3NpdGlvbjpyZXNldFZhbHVlLCBpbmRleDoxfTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpICs9IDEpIHtcbiAgICAgIGRpY3Rpb25hcnlbaV0gPSBpO1xuICAgIH1cblxuICAgIGJpdHMgPSAwO1xuICAgIG1heHBvd2VyID0gTWF0aC5wb3coMiwyKTtcbiAgICBwb3dlcj0xO1xuICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgIH1cbiAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgcG93ZXIgPDw9IDE7XG4gICAgfVxuXG4gICAgc3dpdGNoIChuZXh0ID0gYml0cykge1xuICAgICAgY2FzZSAwOlxuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIG1heHBvd2VyID0gTWF0aC5wb3coMiw4KTtcbiAgICAgICAgICBwb3dlcj0xO1xuICAgICAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgfVxuICAgICAgICBjID0gZihiaXRzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLDE2KTtcbiAgICAgICAgICBwb3dlcj0xO1xuICAgICAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgfVxuICAgICAgICBjID0gZihiaXRzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBkaWN0aW9uYXJ5WzNdID0gYztcbiAgICB3ID0gYztcbiAgICByZXN1bHQucHVzaChjKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGRhdGEuaW5kZXggPiBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGJpdHMgPSAwO1xuICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLG51bUJpdHMpO1xuICAgICAgcG93ZXI9MTtcbiAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgcmVzYiA9IGRhdGEudmFsICYgZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgZGF0YS5wb3NpdGlvbiA+Pj0gMTtcbiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgIGRhdGEucG9zaXRpb24gPSByZXNldFZhbHVlO1xuICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgIH1cbiAgICAgICAgYml0cyB8PSAocmVzYj4wID8gMSA6IDApICogcG93ZXI7XG4gICAgICAgIHBvd2VyIDw8PSAxO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGMgPSBiaXRzKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICBtYXhwb3dlciA9IE1hdGgucG93KDIsOCk7XG4gICAgICAgICAgcG93ZXI9MTtcbiAgICAgICAgICB3aGlsZSAocG93ZXIhPW1heHBvd2VyKSB7XG4gICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgZGF0YS5wb3NpdGlvbiA+Pj0gMTtcbiAgICAgICAgICAgIGlmIChkYXRhLnBvc2l0aW9uID09IDApIHtcbiAgICAgICAgICAgICAgZGF0YS5wb3NpdGlvbiA9IHJlc2V0VmFsdWU7XG4gICAgICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRzIHw9IChyZXNiPjAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgIHBvd2VyIDw8PSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpY3Rpb25hcnlbZGljdFNpemUrK10gPSBmKGJpdHMpO1xuICAgICAgICAgIGMgPSBkaWN0U2l6ZS0xO1xuICAgICAgICAgIGVubGFyZ2VJbi0tO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLDE2KTtcbiAgICAgICAgICBwb3dlcj0xO1xuICAgICAgICAgIHdoaWxlIChwb3dlciE9bWF4cG93ZXIpIHtcbiAgICAgICAgICAgIHJlc2IgPSBkYXRhLnZhbCAmIGRhdGEucG9zaXRpb247XG4gICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gPT0gMCkge1xuICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJpdHMgfD0gKHJlc2I+MCA/IDEgOiAwKSAqIHBvd2VyO1xuICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpY3Rpb25hcnlbZGljdFNpemUrK10gPSBmKGJpdHMpO1xuICAgICAgICAgIGMgPSBkaWN0U2l6ZS0xO1xuICAgICAgICAgIGVubGFyZ2VJbi0tO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVubGFyZ2VJbiA9PSAwKSB7XG4gICAgICAgIGVubGFyZ2VJbiA9IE1hdGgucG93KDIsIG51bUJpdHMpO1xuICAgICAgICBudW1CaXRzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWN0aW9uYXJ5W2NdKSB7XG4gICAgICAgIGVudHJ5ID0gZGljdGlvbmFyeVtjXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjID09PSBkaWN0U2l6ZSkge1xuICAgICAgICAgIGVudHJ5ID0gdyArIHcuY2hhckF0KDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChlbnRyeSk7XG5cbiAgICAgIC8vIEFkZCB3K2VudHJ5WzBdIHRvIHRoZSBkaWN0aW9uYXJ5LlxuICAgICAgZGljdGlvbmFyeVtkaWN0U2l6ZSsrXSA9IHcgKyBlbnRyeS5jaGFyQXQoMCk7XG4gICAgICBlbmxhcmdlSW4tLTtcblxuICAgICAgdyA9IGVudHJ5O1xuXG4gICAgICBpZiAoZW5sYXJnZUluID09IDApIHtcbiAgICAgICAgZW5sYXJnZUluID0gTWF0aC5wb3coMiwgbnVtQml0cyk7XG4gICAgICAgIG51bUJpdHMrKztcbiAgICAgIH1cblxuICAgIH1cbiAgfVxufTtcbiAgcmV0dXJuIExaU3RyaW5nO1xufSkoKTtcblxuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICBkZWZpbmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gTFpTdHJpbmc7IH0pO1xufSBlbHNlIGlmKCB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUgIT0gbnVsbCApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBMWlN0cmluZ1xufVxuIiwgImltcG9ydCB7IEFwcCwgRWRpdG9yLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IFJlbmRlcmVyLCB7IENpcmN1aXRSZW5kZXJDaGlsZCB9IGZyb20gJy4vY2lyY3VpdFJlbmRlcmVyJztcclxuXHJcbi8vIFJlbWVtYmVyIHRvIHJlbmFtZSB0aGVzZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaXJjdWl0SnNTZXR0aW5ncyB7XHJcblx0ZWRpdGFibGU6IGJvb2xlYW47XHJcblx0ZWRpdExpbms6IGJvb2xlYW47XHJcblx0Y2lyY3VpdEpzVXJsOiBzdHJpbmc7XHJcblx0Y2lyY3VpdFRhZzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBDaXJjdWl0SnNTZXR0aW5ncyA9IHtcclxuXHRlZGl0YWJsZTogdHJ1ZSxcclxuXHRlZGl0TGluazogdHJ1ZSxcclxuXHRjaXJjdWl0SnNVcmw6IFwiaHR0cDovL2ZhbHN0YWQuY29tL2NpcmN1aXQvY2lyY3VpdGpzLmh0bWxcIixcclxuXHRjaXJjdWl0VGFnOiBcImNpcmN1aXRqc1wiXHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VpdEpzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogQ2lyY3VpdEpzU2V0dGluZ3M7XHJcblx0cmVuZGVyZXI6IFJlbmRlcmVyO1xyXG5cclxuXHRwb3N0cHJvY2Vzc29yID0gYXN5bmMgKGNvbnRlbnQ6IHN0cmluZywgZWw6IEhUTUxFbGVtZW50LCBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQpID0+IHtcclxuXHRcdGN0eC5hZGRDaGlsZChuZXcgQ2lyY3VpdFJlbmRlckNoaWxkKGVsLCB0aGlzLCBjb250ZW50LCB0aGlzLnNldHRpbmdzKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cclxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3Nvcih0aGlzLnNldHRpbmdzLmNpcmN1aXRUYWcsIHRoaXMucG9zdHByb2Nlc3Nvcik7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuY2xhc3MgU2FtcGxlU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogQ2lyY3VpdEpzUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBDaXJjdWl0SnNQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHtjb250YWluZXJFbH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdTZXR0aW5ncyBmb3IgT2JzaWRpYW4gQ2lyY3VpdEpTJ30pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRWRpdGFibGUnKVxyXG5cdFx0XHQuc2V0RGVzYygnSWYgdGhlIHNpbXVsYXRpb24gY2FuIGJlIGVkaXRlZCcpXHJcblx0XHRcdC5hZGRUb2dnbGUoYm9vbGVhbiA9PiBib29sZWFuXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVkaXRhYmxlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdFZGl0YWJsZTogJyArIHZhbHVlKTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVkaXRhYmxlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blJlbmRlckNoaWxkLCBwYXJzZVlhbWwgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBMWlN0cmluZ1N0YXRpYyB9IGZyb20gJ2x6LXN0cmluZyc7XG5pbXBvcnQgKiBhcyBMWlN0cmluZyBmcm9tICdsei1zdHJpbmcnO1xuaW1wb3J0IHsgQ2lyY3VpdEpzU2V0dGluZ3MgfSBmcm9tICdtYWluJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZXIge1xuXG59XG5cbmV4cG9ydCBjbGFzcyBDaXJjdWl0UmVuZGVyQ2hpbGQgZXh0ZW5kcyBNYXJrZG93blJlbmRlckNoaWxkIHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgY29tcHJlc3NlZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjtcbiAgICBzZXR0aW5nczogQ2lyY3VpdEpzU2V0dGluZ3M7XG5cbiAgICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIHJlbmRlcmVyOiBSZW5kZXJlciwgY29udGVudDogc3RyaW5nLCBzZXR0aW5nczogQ2lyY3VpdEpzU2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoZWwpO1xuXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5jb2RlID0gY29udGVudDtcblxuICAgICAgICB0aGlzLmNvbXByZXNzZWQgPSBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudCh0aGlzLmNvZGUpO1xuICAgICAgICBcbiAgICAgICAgaWYodGhpcy5zZXR0aW5ncy5lZGl0YWJsZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBgJHt0aGlzLnNldHRpbmdzLmNpcmN1aXRKc1VybH0/Y3R6PSR7dGhpcy5jb21wcmVzc2VkfSZydW5uaW5nPXRydWVgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy51cmwgPSBgJHt0aGlzLnNldHRpbmdzLmNpcmN1aXRKc1VybH0/Y3R6PSR7dGhpcy5jb21wcmVzc2VkfSZydW5uaW5nPWZhbHNlYDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9ubG9hZCgpIHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5lZGl0TGluaykge1xuICAgICAgICAgICAgY29uc3QgZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICAgIGVkaXRMaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdGhpcy51cmwpO1xuICAgICAgICAgICAgY29uc3QgZWRpdExpbmtDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJbRURJVF1cIik7XG4gICAgICAgICAgICBlZGl0TGluay5hcHBlbmRDaGlsZChlZGl0TGlua0NvbnRlbnQpO1xuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGVkaXRMaW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlmcmFtZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICBpZnJhbWVOb2RlLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnVybCk7XG4gICAgICAgIGlmcmFtZU5vZGUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICBpZnJhbWVOb2RlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjYwMHB4XCIpO1xuXG4gICAgICAgIFxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoaWZyYW1lTm9kZSk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5hcHBlbmRDaGlsZChkaXYpO1xuICAgIH1cblxuICAgIG9udW5sb2FkKCkge1xuICAgIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFTQSxRQUFJLFlBQVksV0FBVztBQUczQixVQUFJLElBQUksT0FBTztBQUNmLFVBQUksZUFBZTtBQUNuQixVQUFJLGdCQUFnQjtBQUNwQixVQUFJLGlCQUFpQjtBQUVyQiw0QkFBc0IsVUFBVSxXQUFXO0FBQ3pDLFlBQUksQ0FBQyxlQUFlLFdBQVc7QUFDN0IseUJBQWUsWUFBWTtBQUMzQixtQkFBUyxJQUFFLEdBQUksSUFBRSxTQUFTLFFBQVMsS0FBSztBQUN0QywyQkFBZSxVQUFVLFNBQVMsT0FBTyxNQUFNO0FBQUE7QUFBQTtBQUduRCxlQUFPLGVBQWUsVUFBVTtBQUFBO0FBR2xDLFVBQUksWUFBVztBQUFBLFFBQ2Isa0JBQW1CLFNBQVUsT0FBTztBQUNsQyxjQUFJLFNBQVM7QUFBTSxtQkFBTztBQUMxQixjQUFJLE1BQU0sVUFBUyxVQUFVLE9BQU8sR0FBRyxTQUFTLEdBQUU7QUFBQyxtQkFBTyxhQUFhLE9BQU87QUFBQTtBQUM5RSxrQkFBUSxJQUFJLFNBQVM7QUFBQTtBQUFBLGlCQUVoQjtBQUFJLHFCQUFPO0FBQUEsaUJBQ1g7QUFBSSxxQkFBTyxNQUFJO0FBQUEsaUJBQ2Y7QUFBSSxxQkFBTyxNQUFJO0FBQUEsaUJBQ2Y7QUFBSSxxQkFBTyxNQUFJO0FBQUE7QUFBQTtBQUFBLFFBSXRCLHNCQUF1QixTQUFVLE9BQU87QUFDdEMsY0FBSSxTQUFTO0FBQU0sbUJBQU87QUFDMUIsY0FBSSxTQUFTO0FBQUksbUJBQU87QUFDeEIsaUJBQU8sVUFBUyxZQUFZLE1BQU0sUUFBUSxJQUFJLFNBQVMsT0FBTztBQUFFLG1CQUFPLGFBQWEsY0FBYyxNQUFNLE9BQU87QUFBQTtBQUFBO0FBQUEsUUFHakgsaUJBQWtCLFNBQVUsT0FBTztBQUNqQyxjQUFJLFNBQVM7QUFBTSxtQkFBTztBQUMxQixpQkFBTyxVQUFTLFVBQVUsT0FBTyxJQUFJLFNBQVMsR0FBRTtBQUFDLG1CQUFPLEVBQUUsSUFBRTtBQUFBLGVBQVM7QUFBQTtBQUFBLFFBR3ZFLHFCQUFxQixTQUFVLFlBQVk7QUFDekMsY0FBSSxjQUFjO0FBQU0sbUJBQU87QUFDL0IsY0FBSSxjQUFjO0FBQUksbUJBQU87QUFDN0IsaUJBQU8sVUFBUyxZQUFZLFdBQVcsUUFBUSxPQUFPLFNBQVMsT0FBTztBQUFFLG1CQUFPLFdBQVcsV0FBVyxTQUFTO0FBQUE7QUFBQTtBQUFBLFFBSWhILHNCQUFzQixTQUFVLGNBQWM7QUFDNUMsY0FBSSxhQUFhLFVBQVMsU0FBUztBQUNuQyxjQUFJLE1BQUksSUFBSSxXQUFXLFdBQVcsU0FBTztBQUV6QyxtQkFBUyxJQUFFLEdBQUcsV0FBUyxXQUFXLFFBQVEsSUFBRSxVQUFVLEtBQUs7QUFDekQsZ0JBQUksZ0JBQWdCLFdBQVcsV0FBVztBQUMxQyxnQkFBSSxJQUFFLEtBQUssa0JBQWtCO0FBQzdCLGdCQUFJLElBQUUsSUFBRSxLQUFLLGdCQUFnQjtBQUFBO0FBRS9CLGlCQUFPO0FBQUE7QUFBQSxRQUlULDBCQUF5QixTQUFVLFlBQVk7QUFDN0MsY0FBSSxlQUFhLFFBQVEsZUFBYSxRQUFVO0FBQzVDLG1CQUFPLFVBQVMsV0FBVztBQUFBLGlCQUN4QjtBQUNILGdCQUFJLE1BQUksSUFBSSxNQUFNLFdBQVcsU0FBTztBQUNwQyxxQkFBUyxJQUFFLEdBQUcsV0FBUyxJQUFJLFFBQVEsSUFBRSxVQUFVLEtBQUs7QUFDbEQsa0JBQUksS0FBRyxXQUFXLElBQUUsS0FBRyxNQUFJLFdBQVcsSUFBRSxJQUFFO0FBQUE7QUFHNUMsZ0JBQUksU0FBUztBQUNiLGdCQUFJLFFBQVEsU0FBVSxHQUFHO0FBQ3ZCLHFCQUFPLEtBQUssRUFBRTtBQUFBO0FBRWhCLG1CQUFPLFVBQVMsV0FBVyxPQUFPLEtBQUs7QUFBQTtBQUFBO0FBQUEsUUFRN0MsK0JBQStCLFNBQVUsT0FBTztBQUM5QyxjQUFJLFNBQVM7QUFBTSxtQkFBTztBQUMxQixpQkFBTyxVQUFTLFVBQVUsT0FBTyxHQUFHLFNBQVMsR0FBRTtBQUFDLG1CQUFPLGNBQWMsT0FBTztBQUFBO0FBQUE7QUFBQSxRQUk5RSxtQ0FBa0MsU0FBVSxPQUFPO0FBQ2pELGNBQUksU0FBUztBQUFNLG1CQUFPO0FBQzFCLGNBQUksU0FBUztBQUFJLG1CQUFPO0FBQ3hCLGtCQUFRLE1BQU0sUUFBUSxNQUFNO0FBQzVCLGlCQUFPLFVBQVMsWUFBWSxNQUFNLFFBQVEsSUFBSSxTQUFTLE9BQU87QUFBRSxtQkFBTyxhQUFhLGVBQWUsTUFBTSxPQUFPO0FBQUE7QUFBQTtBQUFBLFFBR2xILFVBQVUsU0FBVSxjQUFjO0FBQ2hDLGlCQUFPLFVBQVMsVUFBVSxjQUFjLElBQUksU0FBUyxHQUFFO0FBQUMsbUJBQU8sRUFBRTtBQUFBO0FBQUE7QUFBQSxRQUVuRSxXQUFXLFNBQVUsY0FBYyxhQUFhLGdCQUFnQjtBQUM5RCxjQUFJLGdCQUFnQjtBQUFNLG1CQUFPO0FBQ2pDLGNBQUksR0FBRyxPQUNILHFCQUFvQixJQUNwQiw2QkFBNEIsSUFDNUIsWUFBVSxJQUNWLGFBQVcsSUFDWCxZQUFVLElBQ1Ysb0JBQW1CLEdBQ25CLG1CQUFrQixHQUNsQixrQkFBaUIsR0FDakIsZUFBYSxJQUNiLG1CQUFpQixHQUNqQix3QkFBc0IsR0FDdEI7QUFFSixlQUFLLEtBQUssR0FBRyxLQUFLLGFBQWEsUUFBUSxNQUFNLEdBQUc7QUFDOUMsd0JBQVksYUFBYSxPQUFPO0FBQ2hDLGdCQUFJLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxvQkFBbUIsWUFBWTtBQUN2RSxpQ0FBbUIsYUFBYTtBQUNoQyx5Q0FBMkIsYUFBYTtBQUFBO0FBRzFDLHlCQUFhLFlBQVk7QUFDekIsZ0JBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyxvQkFBbUIsYUFBYTtBQUN2RSwwQkFBWTtBQUFBLG1CQUNQO0FBQ0wsa0JBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyw0QkFBMkIsWUFBWTtBQUM5RSxvQkFBSSxVQUFVLFdBQVcsS0FBRyxLQUFLO0FBQy9CLHVCQUFLLElBQUUsR0FBSSxJQUFFLGlCQUFrQixLQUFLO0FBQ2xDLHVDQUFvQixvQkFBb0I7QUFDeEMsd0JBQUkseUJBQXlCLGNBQVksR0FBRztBQUMxQyw4Q0FBd0I7QUFDeEIsbUNBQWEsS0FBSyxlQUFlO0FBQ2pDLHlDQUFtQjtBQUFBLDJCQUNkO0FBQ0w7QUFBQTtBQUFBO0FBR0osMEJBQVEsVUFBVSxXQUFXO0FBQzdCLHVCQUFLLElBQUUsR0FBSSxJQUFFLEdBQUksS0FBSztBQUNwQix1Q0FBb0Isb0JBQW9CLElBQU0sUUFBTTtBQUNwRCx3QkFBSSx5QkFBeUIsY0FBWSxHQUFHO0FBQzFDLDhDQUF3QjtBQUN4QixtQ0FBYSxLQUFLLGVBQWU7QUFDakMseUNBQW1CO0FBQUEsMkJBQ2Q7QUFDTDtBQUFBO0FBRUYsNEJBQVEsU0FBUztBQUFBO0FBQUEsdUJBRWQ7QUFDTCwwQkFBUTtBQUNSLHVCQUFLLElBQUUsR0FBSSxJQUFFLGlCQUFrQixLQUFLO0FBQ2xDLHVDQUFvQixvQkFBb0IsSUFBSztBQUM3Qyx3QkFBSSx5QkFBd0IsY0FBWSxHQUFHO0FBQ3pDLDhDQUF3QjtBQUN4QixtQ0FBYSxLQUFLLGVBQWU7QUFDakMseUNBQW1CO0FBQUEsMkJBQ2Q7QUFDTDtBQUFBO0FBRUYsNEJBQVE7QUFBQTtBQUVWLDBCQUFRLFVBQVUsV0FBVztBQUM3Qix1QkFBSyxJQUFFLEdBQUksSUFBRSxJQUFLLEtBQUs7QUFDckIsdUNBQW9CLG9CQUFvQixJQUFNLFFBQU07QUFDcEQsd0JBQUkseUJBQXlCLGNBQVksR0FBRztBQUMxQyw4Q0FBd0I7QUFDeEIsbUNBQWEsS0FBSyxlQUFlO0FBQ2pDLHlDQUFtQjtBQUFBLDJCQUNkO0FBQ0w7QUFBQTtBQUVGLDRCQUFRLFNBQVM7QUFBQTtBQUFBO0FBR3JCO0FBQ0Esb0JBQUkscUJBQXFCLEdBQUc7QUFDMUIsc0NBQW9CLEtBQUssSUFBSSxHQUFHO0FBQ2hDO0FBQUE7QUFFRix1QkFBTywyQkFBMkI7QUFBQSxxQkFDN0I7QUFDTCx3QkFBUSxtQkFBbUI7QUFDM0IscUJBQUssSUFBRSxHQUFJLElBQUUsaUJBQWtCLEtBQUs7QUFDbEMscUNBQW9CLG9CQUFvQixJQUFNLFFBQU07QUFDcEQsc0JBQUkseUJBQXlCLGNBQVksR0FBRztBQUMxQyw0Q0FBd0I7QUFDeEIsaUNBQWEsS0FBSyxlQUFlO0FBQ2pDLHVDQUFtQjtBQUFBLHlCQUNkO0FBQ0w7QUFBQTtBQUVGLDBCQUFRLFNBQVM7QUFBQTtBQUFBO0FBS3JCO0FBQ0Esa0JBQUkscUJBQXFCLEdBQUc7QUFDMUIsb0NBQW9CLEtBQUssSUFBSSxHQUFHO0FBQ2hDO0FBQUE7QUFHRixpQ0FBbUIsY0FBYztBQUNqQywwQkFBWSxPQUFPO0FBQUE7QUFBQTtBQUt2QixjQUFJLGNBQWMsSUFBSTtBQUNwQixnQkFBSSxPQUFPLFVBQVUsZUFBZSxLQUFLLDRCQUEyQixZQUFZO0FBQzlFLGtCQUFJLFVBQVUsV0FBVyxLQUFHLEtBQUs7QUFDL0IscUJBQUssSUFBRSxHQUFJLElBQUUsaUJBQWtCLEtBQUs7QUFDbEMscUNBQW9CLG9CQUFvQjtBQUN4QyxzQkFBSSx5QkFBeUIsY0FBWSxHQUFHO0FBQzFDLDRDQUF3QjtBQUN4QixpQ0FBYSxLQUFLLGVBQWU7QUFDakMsdUNBQW1CO0FBQUEseUJBQ2Q7QUFDTDtBQUFBO0FBQUE7QUFHSix3QkFBUSxVQUFVLFdBQVc7QUFDN0IscUJBQUssSUFBRSxHQUFJLElBQUUsR0FBSSxLQUFLO0FBQ3BCLHFDQUFvQixvQkFBb0IsSUFBTSxRQUFNO0FBQ3BELHNCQUFJLHlCQUF5QixjQUFZLEdBQUc7QUFDMUMsNENBQXdCO0FBQ3hCLGlDQUFhLEtBQUssZUFBZTtBQUNqQyx1Q0FBbUI7QUFBQSx5QkFDZDtBQUNMO0FBQUE7QUFFRiwwQkFBUSxTQUFTO0FBQUE7QUFBQSxxQkFFZDtBQUNMLHdCQUFRO0FBQ1IscUJBQUssSUFBRSxHQUFJLElBQUUsaUJBQWtCLEtBQUs7QUFDbEMscUNBQW9CLG9CQUFvQixJQUFLO0FBQzdDLHNCQUFJLHlCQUF5QixjQUFZLEdBQUc7QUFDMUMsNENBQXdCO0FBQ3hCLGlDQUFhLEtBQUssZUFBZTtBQUNqQyx1Q0FBbUI7QUFBQSx5QkFDZDtBQUNMO0FBQUE7QUFFRiwwQkFBUTtBQUFBO0FBRVYsd0JBQVEsVUFBVSxXQUFXO0FBQzdCLHFCQUFLLElBQUUsR0FBSSxJQUFFLElBQUssS0FBSztBQUNyQixxQ0FBb0Isb0JBQW9CLElBQU0sUUFBTTtBQUNwRCxzQkFBSSx5QkFBeUIsY0FBWSxHQUFHO0FBQzFDLDRDQUF3QjtBQUN4QixpQ0FBYSxLQUFLLGVBQWU7QUFDakMsdUNBQW1CO0FBQUEseUJBQ2Q7QUFDTDtBQUFBO0FBRUYsMEJBQVEsU0FBUztBQUFBO0FBQUE7QUFHckI7QUFDQSxrQkFBSSxxQkFBcUIsR0FBRztBQUMxQixvQ0FBb0IsS0FBSyxJQUFJLEdBQUc7QUFDaEM7QUFBQTtBQUVGLHFCQUFPLDJCQUEyQjtBQUFBLG1CQUM3QjtBQUNMLHNCQUFRLG1CQUFtQjtBQUMzQixtQkFBSyxJQUFFLEdBQUksSUFBRSxpQkFBa0IsS0FBSztBQUNsQyxtQ0FBb0Isb0JBQW9CLElBQU0sUUFBTTtBQUNwRCxvQkFBSSx5QkFBeUIsY0FBWSxHQUFHO0FBQzFDLDBDQUF3QjtBQUN4QiwrQkFBYSxLQUFLLGVBQWU7QUFDakMscUNBQW1CO0FBQUEsdUJBQ2Q7QUFDTDtBQUFBO0FBRUYsd0JBQVEsU0FBUztBQUFBO0FBQUE7QUFLckI7QUFDQSxnQkFBSSxxQkFBcUIsR0FBRztBQUMxQixrQ0FBb0IsS0FBSyxJQUFJLEdBQUc7QUFDaEM7QUFBQTtBQUFBO0FBS0osa0JBQVE7QUFDUixlQUFLLElBQUUsR0FBSSxJQUFFLGlCQUFrQixLQUFLO0FBQ2xDLCtCQUFvQixvQkFBb0IsSUFBTSxRQUFNO0FBQ3BELGdCQUFJLHlCQUF5QixjQUFZLEdBQUc7QUFDMUMsc0NBQXdCO0FBQ3hCLDJCQUFhLEtBQUssZUFBZTtBQUNqQyxpQ0FBbUI7QUFBQSxtQkFDZDtBQUNMO0FBQUE7QUFFRixvQkFBUSxTQUFTO0FBQUE7QUFJbkIsaUJBQU8sTUFBTTtBQUNYLCtCQUFvQixvQkFBb0I7QUFDeEMsZ0JBQUkseUJBQXlCLGNBQVksR0FBRztBQUMxQywyQkFBYSxLQUFLLGVBQWU7QUFDakM7QUFBQTtBQUVHO0FBQUE7QUFFUCxpQkFBTyxhQUFhLEtBQUs7QUFBQTtBQUFBLFFBRzNCLFlBQVksU0FBVSxZQUFZO0FBQ2hDLGNBQUksY0FBYztBQUFNLG1CQUFPO0FBQy9CLGNBQUksY0FBYztBQUFJLG1CQUFPO0FBQzdCLGlCQUFPLFVBQVMsWUFBWSxXQUFXLFFBQVEsT0FBTyxTQUFTLE9BQU87QUFBRSxtQkFBTyxXQUFXLFdBQVc7QUFBQTtBQUFBO0FBQUEsUUFHdkcsYUFBYSxTQUFVLFFBQVEsWUFBWSxjQUFjO0FBQ3ZELGNBQUksYUFBYSxJQUNiLE1BQ0EsWUFBWSxHQUNaLFdBQVcsR0FDWCxVQUFVLEdBQ1YsUUFBUSxJQUNSLFNBQVMsSUFDVCxHQUNBLEdBQ0EsTUFBTSxNQUFNLFVBQVUsT0FDdEIsR0FDQSxPQUFPLEVBQUMsS0FBSSxhQUFhLElBQUksVUFBUyxZQUFZLE9BQU07QUFFNUQsZUFBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRztBQUN6Qix1QkFBVyxLQUFLO0FBQUE7QUFHbEIsaUJBQU87QUFDUCxxQkFBVyxLQUFLLElBQUksR0FBRTtBQUN0QixrQkFBTTtBQUNOLGlCQUFPLFNBQU8sVUFBVTtBQUN0QixtQkFBTyxLQUFLLE1BQU0sS0FBSztBQUN2QixpQkFBSyxhQUFhO0FBQ2xCLGdCQUFJLEtBQUssWUFBWSxHQUFHO0FBQ3RCLG1CQUFLLFdBQVc7QUFDaEIsbUJBQUssTUFBTSxhQUFhLEtBQUs7QUFBQTtBQUUvQixvQkFBUyxRQUFLLElBQUksSUFBSSxLQUFLO0FBQzNCLHNCQUFVO0FBQUE7QUFHWixrQkFBUSxPQUFPO0FBQUEsaUJBQ1I7QUFDRCxxQkFBTztBQUNQLHlCQUFXLEtBQUssSUFBSSxHQUFFO0FBQ3RCLHNCQUFNO0FBQ04scUJBQU8sU0FBTyxVQUFVO0FBQ3RCLHVCQUFPLEtBQUssTUFBTSxLQUFLO0FBQ3ZCLHFCQUFLLGFBQWE7QUFDbEIsb0JBQUksS0FBSyxZQUFZLEdBQUc7QUFDdEIsdUJBQUssV0FBVztBQUNoQix1QkFBSyxNQUFNLGFBQWEsS0FBSztBQUFBO0FBRS9CLHdCQUFTLFFBQUssSUFBSSxJQUFJLEtBQUs7QUFDM0IsMEJBQVU7QUFBQTtBQUVkLGtCQUFJLEVBQUU7QUFDTjtBQUFBLGlCQUNHO0FBQ0QscUJBQU87QUFDUCx5QkFBVyxLQUFLLElBQUksR0FBRTtBQUN0QixzQkFBTTtBQUNOLHFCQUFPLFNBQU8sVUFBVTtBQUN0Qix1QkFBTyxLQUFLLE1BQU0sS0FBSztBQUN2QixxQkFBSyxhQUFhO0FBQ2xCLG9CQUFJLEtBQUssWUFBWSxHQUFHO0FBQ3RCLHVCQUFLLFdBQVc7QUFDaEIsdUJBQUssTUFBTSxhQUFhLEtBQUs7QUFBQTtBQUUvQix3QkFBUyxRQUFLLElBQUksSUFBSSxLQUFLO0FBQzNCLDBCQUFVO0FBQUE7QUFFZCxrQkFBSSxFQUFFO0FBQ047QUFBQSxpQkFDRztBQUNILHFCQUFPO0FBQUE7QUFFWCxxQkFBVyxLQUFLO0FBQ2hCLGNBQUk7QUFDSixpQkFBTyxLQUFLO0FBQ1osaUJBQU8sTUFBTTtBQUNYLGdCQUFJLEtBQUssUUFBUSxRQUFRO0FBQ3ZCLHFCQUFPO0FBQUE7QUFHVCxtQkFBTztBQUNQLHVCQUFXLEtBQUssSUFBSSxHQUFFO0FBQ3RCLG9CQUFNO0FBQ04sbUJBQU8sU0FBTyxVQUFVO0FBQ3RCLHFCQUFPLEtBQUssTUFBTSxLQUFLO0FBQ3ZCLG1CQUFLLGFBQWE7QUFDbEIsa0JBQUksS0FBSyxZQUFZLEdBQUc7QUFDdEIscUJBQUssV0FBVztBQUNoQixxQkFBSyxNQUFNLGFBQWEsS0FBSztBQUFBO0FBRS9CLHNCQUFTLFFBQUssSUFBSSxJQUFJLEtBQUs7QUFDM0Isd0JBQVU7QUFBQTtBQUdaLG9CQUFRLElBQUk7QUFBQSxtQkFDTDtBQUNILHVCQUFPO0FBQ1AsMkJBQVcsS0FBSyxJQUFJLEdBQUU7QUFDdEIsd0JBQU07QUFDTix1QkFBTyxTQUFPLFVBQVU7QUFDdEIseUJBQU8sS0FBSyxNQUFNLEtBQUs7QUFDdkIsdUJBQUssYUFBYTtBQUNsQixzQkFBSSxLQUFLLFlBQVksR0FBRztBQUN0Qix5QkFBSyxXQUFXO0FBQ2hCLHlCQUFLLE1BQU0sYUFBYSxLQUFLO0FBQUE7QUFFL0IsMEJBQVMsUUFBSyxJQUFJLElBQUksS0FBSztBQUMzQiw0QkFBVTtBQUFBO0FBR1osMkJBQVcsY0FBYyxFQUFFO0FBQzNCLG9CQUFJLFdBQVM7QUFDYjtBQUNBO0FBQUEsbUJBQ0c7QUFDSCx1QkFBTztBQUNQLDJCQUFXLEtBQUssSUFBSSxHQUFFO0FBQ3RCLHdCQUFNO0FBQ04sdUJBQU8sU0FBTyxVQUFVO0FBQ3RCLHlCQUFPLEtBQUssTUFBTSxLQUFLO0FBQ3ZCLHVCQUFLLGFBQWE7QUFDbEIsc0JBQUksS0FBSyxZQUFZLEdBQUc7QUFDdEIseUJBQUssV0FBVztBQUNoQix5QkFBSyxNQUFNLGFBQWEsS0FBSztBQUFBO0FBRS9CLDBCQUFTLFFBQUssSUFBSSxJQUFJLEtBQUs7QUFDM0IsNEJBQVU7QUFBQTtBQUVaLDJCQUFXLGNBQWMsRUFBRTtBQUMzQixvQkFBSSxXQUFTO0FBQ2I7QUFDQTtBQUFBLG1CQUNHO0FBQ0gsdUJBQU8sT0FBTyxLQUFLO0FBQUE7QUFHdkIsZ0JBQUksYUFBYSxHQUFHO0FBQ2xCLDBCQUFZLEtBQUssSUFBSSxHQUFHO0FBQ3hCO0FBQUE7QUFHRixnQkFBSSxXQUFXLElBQUk7QUFDakIsc0JBQVEsV0FBVztBQUFBLG1CQUNkO0FBQ0wsa0JBQUksTUFBTSxVQUFVO0FBQ2xCLHdCQUFRLElBQUksRUFBRSxPQUFPO0FBQUEscUJBQ2hCO0FBQ0wsdUJBQU87QUFBQTtBQUFBO0FBR1gsbUJBQU8sS0FBSztBQUdaLHVCQUFXLGNBQWMsSUFBSSxNQUFNLE9BQU87QUFDMUM7QUFFQSxnQkFBSTtBQUVKLGdCQUFJLGFBQWEsR0FBRztBQUNsQiwwQkFBWSxLQUFLLElBQUksR0FBRztBQUN4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTU4sYUFBTztBQUFBO0FBR1QsUUFBSSxPQUFPLFdBQVcsY0FBYyxPQUFPLEtBQUs7QUFDOUMsYUFBTyxXQUFZO0FBQUUsZUFBTztBQUFBO0FBQUEsZUFDbkIsT0FBTyxZQUFXLGVBQWUsV0FBVSxNQUFPO0FBQzNELGNBQU8sVUFBVTtBQUFBO0FBQUE7QUFBQTs7O0FDbmZuQjtBQUFBO0FBQUE7QUFBQSx1QkFBMEg7OztBQ0ExSCxzQkFBNkU7QUFFN0UsZUFBMEI7QUFPbkIsdUNBQWlDLG9DQUFvQjtBQUFBLEVBT3hELFlBQVksSUFBaUIsVUFBb0IsU0FBaUIsVUFBNkI7QUFDM0YsVUFBTTtBQUVOLFNBQUssV0FBVztBQUNoQixTQUFLLE9BQU87QUFFWixTQUFLLGFBQWEsQUFBUyx1Q0FBOEIsS0FBSztBQUU5RCxRQUFHLEtBQUssU0FBUyxVQUNqQjtBQUNJLFdBQUssTUFBTSxHQUFHLEtBQUssU0FBUyxvQkFBb0IsS0FBSztBQUFBLFdBR3pEO0FBQ0ksV0FBSyxNQUFNLEdBQUcsS0FBSyxTQUFTLG9CQUFvQixLQUFLO0FBQUE7QUFBQTtBQUFBLEVBSTdELFNBQVM7QUFDTCxVQUFNLE1BQU0sU0FBUyxjQUFjO0FBRW5DLFFBQUksS0FBSyxTQUFTLFVBQVU7QUFDeEIsWUFBTSxXQUFXLFNBQVMsY0FBYztBQUN4QyxlQUFTLGFBQWEsUUFBUSxLQUFLO0FBQ25DLFlBQU0sa0JBQWtCLFNBQVMsZUFBZTtBQUNoRCxlQUFTLFlBQVk7QUFDckIsVUFBSSxZQUFZO0FBQUE7QUFHcEIsVUFBTSxhQUFhLFNBQVMsY0FBYztBQUMxQyxlQUFXLGFBQWEsT0FBTyxLQUFLO0FBQ3BDLGVBQVcsYUFBYSxTQUFTO0FBQ2pDLGVBQVcsYUFBYSxVQUFVO0FBR2xDLFFBQUksWUFBWTtBQUVoQixTQUFLLFlBQVksWUFBWTtBQUFBO0FBQUEsRUFHakMsV0FBVztBQUFBO0FBQUE7OztBRDVDZixJQUFNLG1CQUFzQztBQUFBLEVBQzNDLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGNBQWM7QUFBQSxFQUNkLFlBQVk7QUFBQTtBQUtiLG9DQUE2Qyx3QkFBTztBQUFBLEVBQXBELGNBckJBO0FBcUJBO0FBSUMseUJBQWdCLENBQU8sU0FBaUIsSUFBaUIsUUFBc0M7QUFDOUYsVUFBSSxTQUFTLElBQUksbUJBQW1CLElBQUksTUFBTSxTQUFTLEtBQUs7QUFBQTtBQUFBO0FBQUEsRUFHdkQsU0FBUztBQUFBO0FBQ2QsWUFBTSxLQUFLO0FBRVgsV0FBSyxtQ0FBbUMsS0FBSyxTQUFTLFlBQVksS0FBSztBQUFBO0FBQUE7QUFBQSxFQUd4RSxXQUFXO0FBQUE7QUFBQSxFQUlMLGVBQWU7QUFBQTtBQUNwQixXQUFLLFdBQVcsT0FBTyxPQUFPLElBQUksa0JBQWtCLE1BQU0sS0FBSztBQUFBO0FBQUE7QUFBQSxFQUcxRCxlQUFlO0FBQUE7QUFDcEIsWUFBTSxLQUFLLFNBQVMsS0FBSztBQUFBO0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K