/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; 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 __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); // src/main.ts var main_exports = {}; __export(main_exports, { default: () => CalctexPlugin }); module.exports = __toCommonJS(main_exports); var import_obsidian = require("obsidian"); // src/editor.ts var import_language = require("@codemirror/language"); var import_state = require("@codemirror/state"); var import_view2 = require("@codemirror/view"); // src/widget.ts var import_view = require("@codemirror/view"); var ResultWidget = class extends import_view.WidgetType { constructor(view, index, text) { super(); this.view = view; this.index = index; this.text = text; } toDOM(view) { const div2 = document.createElement("span"); div2.className = "result-text"; div2.innerText = this.text; div2.onclick = () => { const transaction = view.state.update({ changes: { from: this.index, to: this.index, insert: this.text } }); view.dispatch(transaction); }; return div2; } }; // node_modules/@cortex-js/compute-engine/dist/compute-engine.min.esm.js var __create = Object.create; var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp2 = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod2) => function __require() { return mod2 || (0, cb[__getOwnPropNames2(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; }; var __copyProps2 = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames2(from)) if (!__hasOwnProp2.call(to, key) && key !== except) __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps2( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod2 || !mod2.__esModule ? __defProp2(target, "default", { value: mod2, enumerable: true }) : target, mod2 )); var require_complex = __commonJS({ "node_modules/complex.js/complex.js"(exports, module2) { (function(root) { "use strict"; var cosh2 = Math.cosh || function(x) { return Math.abs(x) < 1e-9 ? 1 - x : (Math.exp(x) + Math.exp(-x)) * 0.5; }; var sinh2 = Math.sinh || function(x) { return Math.abs(x) < 1e-9 ? x : (Math.exp(x) - Math.exp(-x)) * 0.5; }; var cosm1 = function(x) { var b = Math.PI / 4; if (-b > x || x > b) { return Math.cos(x) - 1; } var xx = x * x; return xx * (xx * (xx * (xx * (xx * (xx * (xx * (xx / 20922789888e3 - 1 / 87178291200) + 1 / 479001600) - 1 / 3628800) + 1 / 40320) - 1 / 720) + 1 / 24) - 1 / 2); }; var hypot2 = function(x, y) { var a = Math.abs(x); var b = Math.abs(y); if (a < 3e3 && b < 3e3) { return Math.sqrt(a * a + b * b); } if (a < b) { a = b; b = x / y; } else { b = y / x; } return a * Math.sqrt(1 + b * b); }; var parser_exit = function() { throw SyntaxError("Invalid Param"); }; function logHypot(a, b) { var _a = Math.abs(a); var _b = Math.abs(b); if (a === 0) { return Math.log(_b); } if (b === 0) { return Math.log(_a); } if (_a < 3e3 && _b < 3e3) { return Math.log(a * a + b * b) * 0.5; } a = a / 2; b = b / 2; return 0.5 * Math.log(a * a + b * b) + Math.LN2; } var parse = function(a, b) { var z = { "re": 0, "im": 0 }; if (a === void 0 || a === null) { z["re"] = z["im"] = 0; } else if (b !== void 0) { z["re"] = a; z["im"] = b; } else switch (typeof a) { case "object": if ("im" in a && "re" in a) { z["re"] = a["re"]; z["im"] = a["im"]; } else if ("abs" in a && "arg" in a) { if (!Number.isFinite(a["abs"]) && Number.isFinite(a["arg"])) { return Complex20["INFINITY"]; } z["re"] = a["abs"] * Math.cos(a["arg"]); z["im"] = a["abs"] * Math.sin(a["arg"]); } else if ("r" in a && "phi" in a) { if (!Number.isFinite(a["r"]) && Number.isFinite(a["phi"])) { return Complex20["INFINITY"]; } z["re"] = a["r"] * Math.cos(a["phi"]); z["im"] = a["r"] * Math.sin(a["phi"]); } else if (a.length === 2) { z["re"] = a[0]; z["im"] = a[1]; } else { parser_exit(); } break; case "string": z["im"] = /* void */ z["re"] = 0; var tokens = a.match(/\d+\.?\d*e[+-]?\d+|\d+\.?\d*|\.\d+|./g); var plus = 1; var minus = 0; if (tokens === null) { parser_exit(); } for (var i = 0; i < tokens.length; i++) { var c = tokens[i]; if (c === " " || c === " " || c === "\n") { } else if (c === "+") { plus++; } else if (c === "-") { minus++; } else if (c === "i" || c === "I") { if (plus + minus === 0) { parser_exit(); } if (tokens[i + 1] !== " " && !isNaN(tokens[i + 1])) { z["im"] += parseFloat((minus % 2 ? "-" : "") + tokens[i + 1]); i++; } else { z["im"] += parseFloat((minus % 2 ? "-" : "") + "1"); } plus = minus = 0; } else { if (plus + minus === 0 || isNaN(c)) { parser_exit(); } if (tokens[i + 1] === "i" || tokens[i + 1] === "I") { z["im"] += parseFloat((minus % 2 ? "-" : "") + c); i++; } else { z["re"] += parseFloat((minus % 2 ? "-" : "") + c); } plus = minus = 0; } } if (plus + minus > 0) { parser_exit(); } break; case "number": z["im"] = 0; z["re"] = a; break; default: parser_exit(); } if (isNaN(z["re"]) || isNaN(z["im"])) { } return z; }; function Complex20(a, b) { if (!(this instanceof Complex20)) { return new Complex20(a, b); } var z = parse(a, b); this["re"] = z["re"]; this["im"] = z["im"]; } Complex20.prototype = { "re": 0, "im": 0, /** * Calculates the sign of a complex number, which is a normalized complex * * @returns {Complex} */ "sign": function() { var abs2 = this["abs"](); return new Complex20( this["re"] / abs2, this["im"] / abs2 ); }, /** * Adds two complex numbers * * @returns {Complex} */ "add": function(a, b) { var z = new Complex20(a, b); if (this["isInfinite"]() && z["isInfinite"]()) { return Complex20["NAN"]; } if (this["isInfinite"]() || z["isInfinite"]()) { return Complex20["INFINITY"]; } return new Complex20( this["re"] + z["re"], this["im"] + z["im"] ); }, /** * Subtracts two complex numbers * * @returns {Complex} */ "sub": function(a, b) { var z = new Complex20(a, b); if (this["isInfinite"]() && z["isInfinite"]()) { return Complex20["NAN"]; } if (this["isInfinite"]() || z["isInfinite"]()) { return Complex20["INFINITY"]; } return new Complex20( this["re"] - z["re"], this["im"] - z["im"] ); }, /** * Multiplies two complex numbers * * @returns {Complex} */ "mul": function(a, b) { var z = new Complex20(a, b); if (this["isInfinite"]() && z["isZero"]() || this["isZero"]() && z["isInfinite"]()) { return Complex20["NAN"]; } if (this["isInfinite"]() || z["isInfinite"]()) { return Complex20["INFINITY"]; } if (z["im"] === 0 && this["im"] === 0) { return new Complex20(this["re"] * z["re"], 0); } return new Complex20( this["re"] * z["re"] - this["im"] * z["im"], this["re"] * z["im"] + this["im"] * z["re"] ); }, /** * Divides two complex numbers * * @returns {Complex} */ "div": function(a, b) { var z = new Complex20(a, b); if (this["isZero"]() && z["isZero"]() || this["isInfinite"]() && z["isInfinite"]()) { return Complex20["NAN"]; } if (this["isInfinite"]() || z["isZero"]()) { return Complex20["INFINITY"]; } if (this["isZero"]() || z["isInfinite"]()) { return Complex20["ZERO"]; } a = this["re"]; b = this["im"]; var c = z["re"]; var d = z["im"]; var t, x; if (0 === d) { return new Complex20(a / c, b / c); } if (Math.abs(c) < Math.abs(d)) { x = c / d; t = c * x + d; return new Complex20( (a * x + b) / t, (b * x - a) / t ); } else { x = d / c; t = d * x + c; return new Complex20( (a + b * x) / t, (b - a * x) / t ); } }, /** * Calculate the power of two complex numbers * * @returns {Complex} */ "pow": function(a, b) { var z = new Complex20(a, b); a = this["re"]; b = this["im"]; if (z["isZero"]()) { return Complex20["ONE"]; } if (z["im"] === 0) { if (b === 0 && a > 0) { return new Complex20(Math.pow(a, z["re"]), 0); } else if (a === 0) { switch ((z["re"] % 4 + 4) % 4) { case 0: return new Complex20(Math.pow(b, z["re"]), 0); case 1: return new Complex20(0, Math.pow(b, z["re"])); case 2: return new Complex20(-Math.pow(b, z["re"]), 0); case 3: return new Complex20(0, -Math.pow(b, z["re"])); } } } if (a === 0 && b === 0 && z["re"] > 0 && z["im"] >= 0) { return Complex20["ZERO"]; } var arg = Math.atan2(b, a); var loh = logHypot(a, b); a = Math.exp(z["re"] * loh - z["im"] * arg); b = z["im"] * loh + z["re"] * arg; return new Complex20( a * Math.cos(b), a * Math.sin(b) ); }, /** * Calculate the complex square root * * @returns {Complex} */ "sqrt": function() { var a = this["re"]; var b = this["im"]; var r = this["abs"](); var re, im; if (a >= 0) { if (b === 0) { return new Complex20(Math.sqrt(a), 0); } re = 0.5 * Math.sqrt(2 * (r + a)); } else { re = Math.abs(b) / Math.sqrt(2 * (r - a)); } if (a <= 0) { im = 0.5 * Math.sqrt(2 * (r - a)); } else { im = Math.abs(b) / Math.sqrt(2 * (r + a)); } return new Complex20(re, b < 0 ? -im : im); }, /** * Calculate the complex exponent * * @returns {Complex} */ "exp": function() { var tmp = Math.exp(this["re"]); if (this["im"] === 0) { } return new Complex20( tmp * Math.cos(this["im"]), tmp * Math.sin(this["im"]) ); }, /** * Calculate the complex exponent and subtracts one. * * This may be more accurate than `Complex(x).exp().sub(1)` if * `x` is small. * * @returns {Complex} */ "expm1": function() { var a = this["re"]; var b = this["im"]; return new Complex20( Math.expm1(a) * Math.cos(b) + cosm1(b), Math.exp(a) * Math.sin(b) ); }, /** * Calculate the natural log * * @returns {Complex} */ "log": function() { var a = this["re"]; var b = this["im"]; if (b === 0 && a > 0) { } return new Complex20( logHypot(a, b), Math.atan2(b, a) ); }, /** * Calculate the magnitude of the complex number * * @returns {number} */ "abs": function() { return hypot2(this["re"], this["im"]); }, /** * Calculate the angle of the complex number * * @returns {number} */ "arg": function() { return Math.atan2(this["im"], this["re"]); }, /** * Calculate the sine of the complex number * * @returns {Complex} */ "sin": function() { var a = this["re"]; var b = this["im"]; return new Complex20( Math.sin(a) * cosh2(b), Math.cos(a) * sinh2(b) ); }, /** * Calculate the cosine * * @returns {Complex} */ "cos": function() { var a = this["re"]; var b = this["im"]; return new Complex20( Math.cos(a) * cosh2(b), -Math.sin(a) * sinh2(b) ); }, /** * Calculate the tangent * * @returns {Complex} */ "tan": function() { var a = 2 * this["re"]; var b = 2 * this["im"]; var d = Math.cos(a) + cosh2(b); return new Complex20( Math.sin(a) / d, sinh2(b) / d ); }, /** * Calculate the cotangent * * @returns {Complex} */ "cot": function() { var a = 2 * this["re"]; var b = 2 * this["im"]; var d = Math.cos(a) - cosh2(b); return new Complex20( -Math.sin(a) / d, sinh2(b) / d ); }, /** * Calculate the secant * * @returns {Complex} */ "sec": function() { var a = this["re"]; var b = this["im"]; var d = 0.5 * cosh2(2 * b) + 0.5 * Math.cos(2 * a); return new Complex20( Math.cos(a) * cosh2(b) / d, Math.sin(a) * sinh2(b) / d ); }, /** * Calculate the cosecans * * @returns {Complex} */ "csc": function() { var a = this["re"]; var b = this["im"]; var d = 0.5 * cosh2(2 * b) - 0.5 * Math.cos(2 * a); return new Complex20( Math.sin(a) * cosh2(b) / d, -Math.cos(a) * sinh2(b) / d ); }, /** * Calculate the complex arcus sinus * * @returns {Complex} */ "asin": function() { var a = this["re"]; var b = this["im"]; var t1 = new Complex20( b * b - a * a + 1, -2 * a * b )["sqrt"](); var t2 = new Complex20( t1["re"] - b, t1["im"] + a )["log"](); return new Complex20(t2["im"], -t2["re"]); }, /** * Calculate the complex arcus cosinus * * @returns {Complex} */ "acos": function() { var a = this["re"]; var b = this["im"]; var t1 = new Complex20( b * b - a * a + 1, -2 * a * b )["sqrt"](); var t2 = new Complex20( t1["re"] - b, t1["im"] + a )["log"](); return new Complex20(Math.PI / 2 - t2["im"], t2["re"]); }, /** * Calculate the complex arcus tangent * * @returns {Complex} */ "atan": function() { var a = this["re"]; var b = this["im"]; if (a === 0) { if (b === 1) { return new Complex20(0, Infinity); } if (b === -1) { return new Complex20(0, -Infinity); } } var d = a * a + (1 - b) * (1 - b); var t1 = new Complex20( (1 - b * b - a * a) / d, -2 * a / d ).log(); return new Complex20(-0.5 * t1["im"], 0.5 * t1["re"]); }, /** * Calculate the complex arcus cotangent * * @returns {Complex} */ "acot": function() { var a = this["re"]; var b = this["im"]; if (b === 0) { return new Complex20(Math.atan2(1, a), 0); } var d = a * a + b * b; return d !== 0 ? new Complex20( a / d, -b / d ).atan() : new Complex20( a !== 0 ? a / 0 : 0, b !== 0 ? -b / 0 : 0 ).atan(); }, /** * Calculate the complex arcus secant * * @returns {Complex} */ "asec": function() { var a = this["re"]; var b = this["im"]; if (a === 0 && b === 0) { return new Complex20(0, Infinity); } var d = a * a + b * b; return d !== 0 ? new Complex20( a / d, -b / d ).acos() : new Complex20( a !== 0 ? a / 0 : 0, b !== 0 ? -b / 0 : 0 ).acos(); }, /** * Calculate the complex arcus cosecans * * @returns {Complex} */ "acsc": function() { var a = this["re"]; var b = this["im"]; if (a === 0 && b === 0) { return new Complex20(Math.PI / 2, Infinity); } var d = a * a + b * b; return d !== 0 ? new Complex20( a / d, -b / d ).asin() : new Complex20( a !== 0 ? a / 0 : 0, b !== 0 ? -b / 0 : 0 ).asin(); }, /** * Calculate the complex sinh * * @returns {Complex} */ "sinh": function() { var a = this["re"]; var b = this["im"]; return new Complex20( sinh2(a) * Math.cos(b), cosh2(a) * Math.sin(b) ); }, /** * Calculate the complex cosh * * @returns {Complex} */ "cosh": function() { var a = this["re"]; var b = this["im"]; return new Complex20( cosh2(a) * Math.cos(b), sinh2(a) * Math.sin(b) ); }, /** * Calculate the complex tanh * * @returns {Complex} */ "tanh": function() { var a = 2 * this["re"]; var b = 2 * this["im"]; var d = cosh2(a) + Math.cos(b); return new Complex20( sinh2(a) / d, Math.sin(b) / d ); }, /** * Calculate the complex coth * * @returns {Complex} */ "coth": function() { var a = 2 * this["re"]; var b = 2 * this["im"]; var d = cosh2(a) - Math.cos(b); return new Complex20( sinh2(a) / d, -Math.sin(b) / d ); }, /** * Calculate the complex coth * * @returns {Complex} */ "csch": function() { var a = this["re"]; var b = this["im"]; var d = Math.cos(2 * b) - cosh2(2 * a); return new Complex20( -2 * sinh2(a) * Math.cos(b) / d, 2 * cosh2(a) * Math.sin(b) / d ); }, /** * Calculate the complex sech * * @returns {Complex} */ "sech": function() { var a = this["re"]; var b = this["im"]; var d = Math.cos(2 * b) + cosh2(2 * a); return new Complex20( 2 * cosh2(a) * Math.cos(b) / d, -2 * sinh2(a) * Math.sin(b) / d ); }, /** * Calculate the complex asinh * * @returns {Complex} */ "asinh": function() { var tmp = this["im"]; this["im"] = -this["re"]; this["re"] = tmp; var res = this["asin"](); this["re"] = -this["im"]; this["im"] = tmp; tmp = res["re"]; res["re"] = -res["im"]; res["im"] = tmp; return res; }, /** * Calculate the complex acosh * * @returns {Complex} */ "acosh": function() { var res = this["acos"](); if (res["im"] <= 0) { var tmp = res["re"]; res["re"] = -res["im"]; res["im"] = tmp; } else { var tmp = res["im"]; res["im"] = -res["re"]; res["re"] = tmp; } return res; }, /** * Calculate the complex atanh * * @returns {Complex} */ "atanh": function() { var a = this["re"]; var b = this["im"]; var noIM = a > 1 && b === 0; var oneMinus = 1 - a; var onePlus = 1 + a; var d = oneMinus * oneMinus + b * b; var x = d !== 0 ? new Complex20( (onePlus * oneMinus - b * b) / d, (b * oneMinus + onePlus * b) / d ) : new Complex20( a !== -1 ? a / 0 : 0, b !== 0 ? b / 0 : 0 ); var temp = x["re"]; x["re"] = logHypot(x["re"], x["im"]) / 2; x["im"] = Math.atan2(x["im"], temp) / 2; if (noIM) { x["im"] = -x["im"]; } return x; }, /** * Calculate the complex acoth * * @returns {Complex} */ "acoth": function() { var a = this["re"]; var b = this["im"]; if (a === 0 && b === 0) { return new Complex20(0, Math.PI / 2); } var d = a * a + b * b; return d !== 0 ? new Complex20( a / d, -b / d ).atanh() : new Complex20( a !== 0 ? a / 0 : 0, b !== 0 ? -b / 0 : 0 ).atanh(); }, /** * Calculate the complex acsch * * @returns {Complex} */ "acsch": function() { var a = this["re"]; var b = this["im"]; if (b === 0) { return new Complex20( a !== 0 ? Math.log(a + Math.sqrt(a * a + 1)) : Infinity, 0 ); } var d = a * a + b * b; return d !== 0 ? new Complex20( a / d, -b / d ).asinh() : new Complex20( a !== 0 ? a / 0 : 0, b !== 0 ? -b / 0 : 0 ).asinh(); }, /** * Calculate the complex asech * * @returns {Complex} */ "asech": function() { var a = this["re"]; var b = this["im"]; if (this["isZero"]()) { return Complex20["INFINITY"]; } var d = a * a + b * b; return d !== 0 ? new Complex20( a / d, -b / d ).acosh() : new Complex20( a !== 0 ? a / 0 : 0, b !== 0 ? -b / 0 : 0 ).acosh(); }, /** * Calculate the complex inverse 1/z * * @returns {Complex} */ "inverse": function() { if (this["isZero"]()) { return Complex20["INFINITY"]; } if (this["isInfinite"]()) { return Complex20["ZERO"]; } var a = this["re"]; var b = this["im"]; var d = a * a + b * b; return new Complex20(a / d, -b / d); }, /** * Returns the complex conjugate * * @returns {Complex} */ "conjugate": function() { return new Complex20(this["re"], -this["im"]); }, /** * Gets the negated complex number * * @returns {Complex} */ "neg": function() { return new Complex20(-this["re"], -this["im"]); }, /** * Ceils the actual complex number * * @returns {Complex} */ "ceil": function(places) { places = Math.pow(10, places || 0); return new Complex20( Math.ceil(this["re"] * places) / places, Math.ceil(this["im"] * places) / places ); }, /** * Floors the actual complex number * * @returns {Complex} */ "floor": function(places) { places = Math.pow(10, places || 0); return new Complex20( Math.floor(this["re"] * places) / places, Math.floor(this["im"] * places) / places ); }, /** * Ceils the actual complex number * * @returns {Complex} */ "round": function(places) { places = Math.pow(10, places || 0); return new Complex20( Math.round(this["re"] * places) / places, Math.round(this["im"] * places) / places ); }, /** * Compares two complex numbers * * **Note:** new Complex(Infinity).equals(Infinity) === false * * @returns {boolean} */ "equals": function(a, b) { var z = new Complex20(a, b); return Math.abs(z["re"] - this["re"]) <= Complex20["EPSILON"] && Math.abs(z["im"] - this["im"]) <= Complex20["EPSILON"]; }, /** * Clones the actual object * * @returns {Complex} */ "clone": function() { return new Complex20(this["re"], this["im"]); }, /** * Gets a string of the actual complex number * * @returns {string} */ "toString": function() { var a = this["re"]; var b = this["im"]; var ret = ""; if (this["isNaN"]()) { return "NaN"; } if (this["isInfinite"]()) { return "Infinity"; } if (Math.abs(a) < Complex20["EPSILON"]) { a = 0; } if (Math.abs(b) < Complex20["EPSILON"]) { b = 0; } if (b === 0) { return ret + a; } if (a !== 0) { ret += a; ret += " "; if (b < 0) { b = -b; ret += "-"; } else { ret += "+"; } ret += " "; } else if (b < 0) { b = -b; ret += "-"; } if (1 !== b) { ret += b; } return ret + "i"; }, /** * Returns the actual number as a vector * * @returns {Array} */ "toVector": function() { return [this["re"], this["im"]]; }, /** * Returns the actual real value of the current object * * @returns {number|null} */ "valueOf": function() { if (this["im"] === 0) { return this["re"]; } return null; }, /** * Determines whether a complex number is not on the Riemann sphere. * * @returns {boolean} */ "isNaN": function() { return isNaN(this["re"]) || isNaN(this["im"]); }, /** * Determines whether or not a complex number is at the zero pole of the * Riemann sphere. * * @returns {boolean} */ "isZero": function() { return this["im"] === 0 && this["re"] === 0; }, /** * Determines whether a complex number is not at the infinity pole of the * Riemann sphere. * * @returns {boolean} */ "isFinite": function() { return isFinite(this["re"]) && isFinite(this["im"]); }, /** * Determines whether or not a complex number is at the infinity pole of the * Riemann sphere. * * @returns {boolean} */ "isInfinite": function() { return !(this["isNaN"]() || this["isFinite"]()); } }; Complex20["ZERO"] = new Complex20(0, 0); Complex20["ONE"] = new Complex20(1, 0); Complex20["I"] = new Complex20(0, 1); Complex20["PI"] = new Complex20(Math.PI, 0); Complex20["E"] = new Complex20(Math.E, 0); Complex20["INFINITY"] = new Complex20(Infinity, Infinity); Complex20["NAN"] = new Complex20(NaN, NaN); Complex20["EPSILON"] = 1e-15; if (typeof define === "function" && define["amd"]) { define([], function() { return Complex20; }); } else if (typeof exports === "object") { Object.defineProperty(Complex20, "__esModule", { "value": true }); Complex20["default"] = Complex20; Complex20["Complex"] = Complex20; module2["exports"] = Complex20; } else { root["Complex"] = Complex20; } })(exports); } }); function isSymbolEntry(entry) { return "kind" in entry && entry.kind === "symbol"; } function isMatchfixEntry(entry) { return "kind" in entry && entry.kind === "matchfix"; } function isInfixEntry(entry) { return "kind" in entry && entry.kind === "infix"; } function isPrefixEntry(entry) { return "kind" in entry && entry.kind === "prefix"; } function isPostfixEntry(entry) { return "kind" in entry && entry.kind === "postfix"; } function isEnvironmentEntry(entry) { return "kind" in entry && entry.kind === "environment"; } var EXP_LIMIT = 9e15; var MAX_DIGITS = 1e9; var NUMERALS = "0123456789abcdef"; var LN10 = "2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058"; var PI = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789"; var DEFAULTS = { // These values must be integers within the stated ranges (inclusive). // Most of these values can be changed at run-time using the `Decimal.config` method. // The maximum number of significant digits of the result of a calculation or base conversion. // E.g. `Decimal.config({ precision: 20 });` precision: 20, // 1 to MAX_DIGITS // The rounding mode used when rounding to `precision`. // // ROUND_UP 0 Away from zero. // ROUND_DOWN 1 Towards zero. // ROUND_CEIL 2 Towards +Infinity. // ROUND_FLOOR 3 Towards -Infinity. // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up. // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. // // E.g. // `Decimal.rounding = 4;` // `Decimal.rounding = Decimal.ROUND_HALF_UP;` rounding: 4, // 0 to 8 // The modulo mode used when calculating the modulus: a mod n. // The quotient (q = a / n) is calculated according to the corresponding rounding mode. // The remainder (r) is calculated as: r = a - n * q. // // UP 0 The remainder is positive if the dividend is negative, else is negative. // DOWN 1 The remainder has the same sign as the dividend (JavaScript %). // FLOOR 3 The remainder has the same sign as the divisor (Python %). // HALF_EVEN 6 The IEEE 754 remainder function. // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive. // // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian // division (9) are commonly used for the modulus operation. The other rounding modes can also // be used, but they may not give useful results. modulo: 1, // 0 to 9 // The exponent value at and beneath which `toString` returns exponential notation. // JavaScript numbers: -7 toExpNeg: -7, // 0 to -EXP_LIMIT // The exponent value at and above which `toString` returns exponential notation. // JavaScript numbers: 21 toExpPos: 21, // 0 to EXP_LIMIT // The minimum exponent value, beneath which underflow to zero occurs. // JavaScript numbers: -324 (5e-324) minE: -EXP_LIMIT, // -1 to -EXP_LIMIT // The maximum exponent value, above which overflow to Infinity occurs. // JavaScript numbers: 308 (1.7976931348623157e+308) maxE: EXP_LIMIT, // 1 to EXP_LIMIT // Whether to use cryptographically-secure random number generation, if available. crypto: false // true/false }; var inexact; var quadrant; var external = true; var decimalError = "[DecimalError] "; var invalidArgument = decimalError + "Invalid argument: "; var precisionLimitExceeded = decimalError + "Precision limit exceeded"; var cryptoUnavailable = decimalError + "crypto unavailable"; var tag = "[object Decimal]"; var mathfloor = Math.floor; var mathpow = Math.pow; var isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i; var isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i; var isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i; var isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; var BASE = 1e7; var LOG_BASE = 7; var MAX_SAFE_INTEGER = 9007199254740991; var LN10_PRECISION = LN10.length - 1; var PI_PRECISION = PI.length - 1; var P = { toStringTag: tag }; P.absoluteValue = P.abs = function() { var x = new this.constructor(this); if (x.s < 0) x.s = 1; return finalise(x); }; P.ceil = function() { return finalise(new this.constructor(this), this.e + 1, 2); }; P.clampedTo = P.clamp = function(min2, max2) { var k, x = this, Ctor = x.constructor; min2 = new Ctor(min2); max2 = new Ctor(max2); if (!min2.s || !max2.s) return new Ctor(NaN); if (min2.gt(max2)) throw Error(invalidArgument + max2); k = x.cmp(min2); return k < 0 ? min2 : x.cmp(max2) > 0 ? max2 : new Ctor(x); }; P.comparedTo = P.cmp = function(y) { var i, j, xdL, ydL, x = this, xd = x.d, yd = (y = new x.constructor(y)).d, xs = x.s, ys = y.s; if (!xd || !yd) { return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1; } if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0; if (xs !== ys) return xs; if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1; xdL = xd.length; ydL = yd.length; for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) { if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1; } return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1; }; P.cosine = P.cos = function() { var pr, rm, x = this, Ctor = x.constructor; if (!x.d) return new Ctor(NaN); if (!x.d[0]) return new Ctor(1); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; Ctor.rounding = 1; x = cosine(Ctor, toLessThanHalfPi(Ctor, x)); Ctor.precision = pr; Ctor.rounding = rm; return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true); }; P.cubeRoot = P.cbrt = function() { var e, m, n, r, rep, s, sd, t, t3, t3plusx, x = this, Ctor = x.constructor; if (!x.isFinite() || x.isZero()) return new Ctor(x); external = false; s = x.s * mathpow(x.s * x, 1 / 3); if (!s || Math.abs(s) == 1 / 0) { n = digitsToString(x.d); e = x.e; if (s = (e - n.length + 1) % 3) n += s == 1 || s == -2 ? "0" : "00"; s = mathpow(n, 1 / 3); e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)); if (s == 1 / 0) { n = "5e" + e; } else { n = s.toExponential(); n = n.slice(0, n.indexOf("e") + 1) + e; } r = new Ctor(n); r.s = x.s; } else { r = new Ctor(s.toString()); } sd = (e = Ctor.precision) + 3; for (; ; ) { t = r; t3 = t.times(t).times(t); t3plusx = t3.plus(x); r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1); if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { n = n.slice(sd - 3, sd + 1); if (n == "9999" || !rep && n == "4999") { if (!rep) { finalise(t, e + 1, 0); if (t.times(t).times(t).eq(x)) { r = t; break; } } sd += 4; rep = 1; } else { if (!+n || !+n.slice(1) && n.charAt(0) == "5") { finalise(r, e + 1, 1); m = !r.times(r).times(r).eq(x); } break; } } } external = true; return finalise(r, e, Ctor.rounding, m); }; P.decimalPlaces = P.dp = function() { var w, d = this.d, n = NaN; if (d) { w = d.length - 1; n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE; w = d[w]; if (w) for (; w % 10 == 0; w /= 10) n--; if (n < 0) n = 0; } return n; }; P.dividedBy = P.div = function(y) { return divide(this, new this.constructor(y)); }; P.dividedToIntegerBy = P.divToInt = function(y) { var x = this, Ctor = x.constructor; return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding); }; P.equals = P.eq = function(y) { return this.cmp(y) === 0; }; P.floor = function() { return finalise(new this.constructor(this), this.e + 1, 3); }; P.greaterThan = P.gt = function(y) { return this.cmp(y) > 0; }; P.greaterThanOrEqualTo = P.gte = function(y) { var k = this.cmp(y); return k == 1 || k === 0; }; P.hyperbolicCosine = P.cosh = function() { var k, n, pr, rm, len, x = this, Ctor = x.constructor, one = new Ctor(1); if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN); if (x.isZero()) return one; pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; Ctor.rounding = 1; len = x.d.length; if (len < 32) { k = Math.ceil(len / 3); n = (1 / tinyPow(4, k)).toString(); } else { k = 16; n = "2.3283064365386962890625e-10"; } x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true); var cosh2_x, i = k, d8 = new Ctor(8); for (; i--; ) { cosh2_x = x.times(x); x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8)))); } return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true); }; P.hyperbolicSine = P.sinh = function() { var k, pr, rm, len, x = this, Ctor = x.constructor; if (!x.isFinite() || x.isZero()) return new Ctor(x); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; Ctor.rounding = 1; len = x.d.length; if (len < 3) { x = taylorSeries(Ctor, 2, x, x, true); } else { k = 1.4 * Math.sqrt(len); k = k > 16 ? 16 : k | 0; x = x.times(1 / tinyPow(5, k)); x = taylorSeries(Ctor, 2, x, x, true); var sinh2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20); for (; k--; ) { sinh2_x = x.times(x); x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20)))); } } Ctor.precision = pr; Ctor.rounding = rm; return finalise(x, pr, rm, true); }; P.hyperbolicTangent = P.tanh = function() { var pr, rm, x = this, Ctor = x.constructor; if (!x.isFinite()) return new Ctor(x.s); if (x.isZero()) return new Ctor(x); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + 7; Ctor.rounding = 1; return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm); }; P.inverseCosine = P.acos = function() { var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding; if (k !== -1) { return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN); } if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5); Ctor.precision = pr + 6; Ctor.rounding = 1; x = x.asin(); halfPi = getPi(Ctor, pr + 4, rm).times(0.5); Ctor.precision = pr; Ctor.rounding = rm; return halfPi.minus(x); }; P.inverseHyperbolicCosine = P.acosh = function() { var pr, rm, x = this, Ctor = x.constructor; if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN); if (!x.isFinite()) return new Ctor(x); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4; Ctor.rounding = 1; external = false; x = x.times(x).minus(1).sqrt().plus(x); external = true; Ctor.precision = pr; Ctor.rounding = rm; return x.ln(); }; P.inverseHyperbolicSine = P.asinh = function() { var pr, rm, x = this, Ctor = x.constructor; if (!x.isFinite() || x.isZero()) return new Ctor(x); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6; Ctor.rounding = 1; external = false; x = x.times(x).plus(1).sqrt().plus(x); external = true; Ctor.precision = pr; Ctor.rounding = rm; return x.ln(); }; P.inverseHyperbolicTangent = P.atanh = function() { var pr, rm, wpr, xsd, x = this, Ctor = x.constructor; if (!x.isFinite()) return new Ctor(NaN); if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN); pr = Ctor.precision; rm = Ctor.rounding; xsd = x.sd(); if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true); Ctor.precision = wpr = xsd - x.e; x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1); Ctor.precision = pr + 4; Ctor.rounding = 1; x = x.ln(); Ctor.precision = pr; Ctor.rounding = rm; return x.times(0.5); }; P.inverseSine = P.asin = function() { var halfPi, k, pr, rm, x = this, Ctor = x.constructor; if (x.isZero()) return new Ctor(x); k = x.abs().cmp(1); pr = Ctor.precision; rm = Ctor.rounding; if (k !== -1) { if (k === 0) { halfPi = getPi(Ctor, pr + 4, rm).times(0.5); halfPi.s = x.s; return halfPi; } return new Ctor(NaN); } Ctor.precision = pr + 6; Ctor.rounding = 1; x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan(); Ctor.precision = pr; Ctor.rounding = rm; return x.times(2); }; P.inverseTangent = P.atan = function() { var i, j, k, n, px, t, r, wpr, x2, x = this, Ctor = x.constructor, pr = Ctor.precision, rm = Ctor.rounding; if (!x.isFinite()) { if (!x.s) return new Ctor(NaN); if (pr + 4 <= PI_PRECISION) { r = getPi(Ctor, pr + 4, rm).times(0.5); r.s = x.s; return r; } } else if (x.isZero()) { return new Ctor(x); } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) { r = getPi(Ctor, pr + 4, rm).times(0.25); r.s = x.s; return r; } Ctor.precision = wpr = pr + 10; Ctor.rounding = 1; k = Math.min(28, wpr / LOG_BASE + 2 | 0); for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1)); external = false; j = Math.ceil(wpr / LOG_BASE); n = 1; x2 = x.times(x); r = new Ctor(x); px = x; for (; i !== -1; ) { px = px.times(x2); t = r.minus(px.div(n += 2)); px = px.times(x2); r = t.plus(px.div(n += 2)); if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--; ) ; } if (k) r = r.times(2 << k - 1); external = true; return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true); }; P.isFinite = function() { return !!this.d; }; P.isInteger = P.isInt = function() { return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2; }; P.isNaN = function() { return !this.s; }; P.isNegative = P.isNeg = function() { return this.s < 0; }; P.isPositive = P.isPos = function() { return this.s > 0; }; P.isZero = function() { return !!this.d && this.d[0] === 0; }; P.lessThan = P.lt = function(y) { return this.cmp(y) < 0; }; P.lessThanOrEqualTo = P.lte = function(y) { return this.cmp(y) < 1; }; P.logarithm = P.log = function(base) { var isBase10, d, denominator, k, inf, num, sd, r, arg = this, Ctor = arg.constructor, pr = Ctor.precision, rm = Ctor.rounding, guard = 5; if (base == null) { base = new Ctor(10); isBase10 = true; } else { base = new Ctor(base); d = base.d; if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN); isBase10 = base.eq(10); } d = arg.d; if (arg.s < 0 || !d || !d[0] || arg.eq(1)) { return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0); } if (isBase10) { if (d.length > 1) { inf = true; } else { for (k = d[0]; k % 10 === 0; ) k /= 10; inf = k !== 1; } } external = false; sd = pr + guard; num = naturalLogarithm(arg, sd); denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); r = divide(num, denominator, sd, 1); if (checkRoundingDigits(r.d, k = pr, rm)) { do { sd += 10; num = naturalLogarithm(arg, sd); denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); r = divide(num, denominator, sd, 1); if (!inf) { if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) { r = finalise(r, pr + 1, 0); } break; } } while (checkRoundingDigits(r.d, k += 10, rm)); } external = true; return finalise(r, pr, rm); }; P.minus = P.sub = function(y) { var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, x = this, Ctor = x.constructor; y = new Ctor(y); if (!x.d || !y.d) { if (!x.s || !y.s) y = new Ctor(NaN); else if (x.d) y.s = -y.s; else y = new Ctor(y.d || x.s !== y.s ? x : NaN); return y; } if (x.s != y.s) { y.s = -y.s; return x.plus(y); } xd = x.d; yd = y.d; pr = Ctor.precision; rm = Ctor.rounding; if (!xd[0] || !yd[0]) { if (yd[0]) y.s = -y.s; else if (xd[0]) y = new Ctor(x); else return new Ctor(rm === 3 ? -0 : 0); return external ? finalise(y, pr, rm) : y; } e = mathfloor(y.e / LOG_BASE); xe = mathfloor(x.e / LOG_BASE); xd = xd.slice(); k = xe - e; if (k) { xLTy = k < 0; if (xLTy) { d = xd; k = -k; len = yd.length; } else { d = yd; e = xe; len = xd.length; } i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2; if (k > i) { k = i; d.length = 1; } d.reverse(); for (i = k; i--; ) d.push(0); d.reverse(); } else { i = xd.length; len = yd.length; xLTy = i < len; if (xLTy) len = i; for (i = 0; i < len; i++) { if (xd[i] != yd[i]) { xLTy = xd[i] < yd[i]; break; } } k = 0; } if (xLTy) { d = xd; xd = yd; yd = d; y.s = -y.s; } len = xd.length; for (i = yd.length - len; i > 0; --i) xd[len++] = 0; for (i = yd.length; i > k; ) { if (xd[--i] < yd[i]) { for (j = i; j && xd[--j] === 0; ) xd[j] = BASE - 1; --xd[j]; xd[i] += BASE; } xd[i] -= yd[i]; } for (; xd[--len] === 0; ) xd.pop(); for (; xd[0] === 0; xd.shift()) --e; if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0); y.d = xd; y.e = getBase10Exponent(xd, e); return external ? finalise(y, pr, rm) : y; }; P.modulo = P.mod = function(y) { var q, x = this, Ctor = x.constructor; y = new Ctor(y); if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN); if (!y.d || x.d && !x.d[0]) { return finalise(new Ctor(x), Ctor.precision, Ctor.rounding); } external = false; if (Ctor.modulo == 9) { q = divide(x, y.abs(), 0, 3, 1); q.s *= y.s; } else { q = divide(x, y, 0, Ctor.modulo, 1); } q = q.times(y); external = true; return x.minus(q); }; P.naturalExponential = P.exp = function() { return naturalExponential(this); }; P.naturalLogarithm = P.ln = function() { return naturalLogarithm(this); }; P.negated = P.neg = function() { var x = new this.constructor(this); x.s = -x.s; return finalise(x); }; P.plus = P.add = function(y) { var carry, d, e, i, k, len, pr, rm, xd, yd, x = this, Ctor = x.constructor; y = new Ctor(y); if (!x.d || !y.d) { if (!x.s || !y.s) y = new Ctor(NaN); else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN); return y; } if (x.s != y.s) { y.s = -y.s; return x.minus(y); } xd = x.d; yd = y.d; pr = Ctor.precision; rm = Ctor.rounding; if (!xd[0] || !yd[0]) { if (!yd[0]) y = new Ctor(x); return external ? finalise(y, pr, rm) : y; } k = mathfloor(x.e / LOG_BASE); e = mathfloor(y.e / LOG_BASE); xd = xd.slice(); i = k - e; if (i) { if (i < 0) { d = xd; i = -i; len = yd.length; } else { d = yd; e = k; len = xd.length; } k = Math.ceil(pr / LOG_BASE); len = k > len ? k + 1 : len + 1; if (i > len) { i = len; d.length = 1; } d.reverse(); for (; i--; ) d.push(0); d.reverse(); } len = xd.length; i = yd.length; if (len - i < 0) { i = len; d = yd; yd = xd; xd = d; } for (carry = 0; i; ) { carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0; xd[i] %= BASE; } if (carry) { xd.unshift(carry); ++e; } for (len = xd.length; xd[--len] == 0; ) xd.pop(); y.d = xd; y.e = getBase10Exponent(xd, e); return external ? finalise(y, pr, rm) : y; }; P.precision = P.sd = function(z) { var k, x = this; if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z); if (x.d) { k = getPrecision(x.d); if (z && x.e + 1 > k) k = x.e + 1; } else { k = NaN; } return k; }; P.round = function() { var x = this, Ctor = x.constructor; return finalise(new Ctor(x), x.e + 1, Ctor.rounding); }; P.sine = P.sin = function() { var pr, rm, x = this, Ctor = x.constructor; if (!x.isFinite()) return new Ctor(NaN); if (x.isZero()) return new Ctor(x); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; Ctor.rounding = 1; x = sine(Ctor, toLessThanHalfPi(Ctor, x)); Ctor.precision = pr; Ctor.rounding = rm; return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true); }; P.squareRoot = P.sqrt = function() { var m, n, sd, r, rep, t, x = this, d = x.d, e = x.e, s = x.s, Ctor = x.constructor; if (s !== 1 || !d || !d[0]) { return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0); } external = false; s = Math.sqrt(+x); if (s == 0 || s == 1 / 0) { n = digitsToString(d); if ((n.length + e) % 2 == 0) n += "0"; s = Math.sqrt(n); e = mathfloor((e + 1) / 2) - (e < 0 || e % 2); if (s == 1 / 0) { n = "5e" + e; } else { n = s.toExponential(); n = n.slice(0, n.indexOf("e") + 1) + e; } r = new Ctor(n); } else { r = new Ctor(s.toString()); } sd = (e = Ctor.precision) + 3; for (; ; ) { t = r; r = t.plus(divide(x, t, sd + 2, 1)).times(0.5); if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { n = n.slice(sd - 3, sd + 1); if (n == "9999" || !rep && n == "4999") { if (!rep) { finalise(t, e + 1, 0); if (t.times(t).eq(x)) { r = t; break; } } sd += 4; rep = 1; } else { if (!+n || !+n.slice(1) && n.charAt(0) == "5") { finalise(r, e + 1, 1); m = !r.times(r).eq(x); } break; } } } external = true; return finalise(r, e, Ctor.rounding, m); }; P.tangent = P.tan = function() { var pr, rm, x = this, Ctor = x.constructor; if (!x.isFinite()) return new Ctor(NaN); if (x.isZero()) return new Ctor(x); pr = Ctor.precision; rm = Ctor.rounding; Ctor.precision = pr + 10; Ctor.rounding = 1; x = x.sin(); x.s = 1; x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0); Ctor.precision = pr; Ctor.rounding = rm; return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true); }; P.times = P.mul = function(y) { var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d; y.s *= x.s; if (!xd || !xd[0] || !yd || !yd[0]) { return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd ? NaN : !xd || !yd ? y.s / 0 : y.s * 0); } e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE); xdL = xd.length; ydL = yd.length; if (xdL < ydL) { r = xd; xd = yd; yd = r; rL = xdL; xdL = ydL; ydL = rL; } r = []; rL = xdL + ydL; for (i = rL; i--; ) r.push(0); for (i = ydL; --i >= 0; ) { carry = 0; for (k = xdL + i; k > i; ) { t = r[k] + yd[i] * xd[k - i - 1] + carry; r[k--] = t % BASE | 0; carry = t / BASE | 0; } r[k] = (r[k] + carry) % BASE | 0; } for (; !r[--rL]; ) r.pop(); if (carry) ++e; else r.shift(); y.d = r; y.e = getBase10Exponent(r, e); return external ? finalise(y, Ctor.precision, Ctor.rounding) : y; }; P.toBinary = function(sd, rm) { return toStringBinary(this, 2, sd, rm); }; P.toDecimalPlaces = P.toDP = function(dp, rm) { var x = this, Ctor = x.constructor; x = new Ctor(x); if (dp === void 0) return x; checkInt32(dp, 0, MAX_DIGITS); if (rm === void 0) rm = Ctor.rounding; else checkInt32(rm, 0, 8); return finalise(x, dp + x.e + 1, rm); }; P.toExponential = function(dp, rm) { var str, x = this, Ctor = x.constructor; if (dp === void 0) { str = finiteToString(x, true); } else { checkInt32(dp, 0, MAX_DIGITS); if (rm === void 0) rm = Ctor.rounding; else checkInt32(rm, 0, 8); x = finalise(new Ctor(x), dp + 1, rm); str = finiteToString(x, true, dp + 1); } return x.isNeg() && !x.isZero() ? "-" + str : str; }; P.toFixed = function(dp, rm) { var str, y, x = this, Ctor = x.constructor; if (dp === void 0) { str = finiteToString(x); } else { checkInt32(dp, 0, MAX_DIGITS); if (rm === void 0) rm = Ctor.rounding; else checkInt32(rm, 0, 8); y = finalise(new Ctor(x), dp + x.e + 1, rm); str = finiteToString(y, false, dp + y.e + 1); } return x.isNeg() && !x.isZero() ? "-" + str : str; }; P.toFraction = function(maxD) { var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, x = this, xd = x.d, Ctor = x.constructor; if (!xd) return new Ctor(x); n1 = d0 = new Ctor(1); d1 = n0 = new Ctor(0); d = new Ctor(d1); e = d.e = getPrecision(xd) - x.e - 1; k = e % LOG_BASE; d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k); if (maxD == null) { maxD = e > 0 ? d : n1; } else { n = new Ctor(maxD); if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n); maxD = n.gt(d) ? e > 0 ? d : n1 : n; } external = false; n = new Ctor(digitsToString(xd)); pr = Ctor.precision; Ctor.precision = e = xd.length * LOG_BASE * 2; for (; ; ) { q = divide(n, d, 0, 1, 1); d2 = d0.plus(q.times(d1)); if (d2.cmp(maxD) == 1) break; d0 = d1; d1 = d2; d2 = n1; n1 = n0.plus(q.times(d2)); n0 = d2; d2 = d; d = n.minus(q.times(d2)); n = d2; } d2 = divide(maxD.minus(d0), d1, 0, 1, 1); n0 = n0.plus(d2.times(n1)); d0 = d0.plus(d2.times(d1)); n0.s = n1.s = x.s; r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0]; Ctor.precision = pr; external = true; return r; }; P.toHexadecimal = P.toHex = function(sd, rm) { return toStringBinary(this, 16, sd, rm); }; P.toNearest = function(y, rm) { var x = this, Ctor = x.constructor; x = new Ctor(x); if (y == null) { if (!x.d) return x; y = new Ctor(1); rm = Ctor.rounding; } else { y = new Ctor(y); if (rm === void 0) { rm = Ctor.rounding; } else { checkInt32(rm, 0, 8); } if (!x.d) return y.s ? x : y; if (!y.d) { if (y.s) y.s = x.s; return y; } } if (y.d[0]) { external = false; x = divide(x, y, 0, rm, 1).times(y); external = true; finalise(x); } else { y.s = x.s; x = y; } return x; }; P.toNumber = function() { return +this; }; P.toOctal = function(sd, rm) { return toStringBinary(this, 8, sd, rm); }; P.toPower = P.pow = function(y) { var e, k, pr, r, rm, s, x = this, Ctor = x.constructor, yn = +(y = new Ctor(y)); if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn)); x = new Ctor(x); if (x.eq(1)) return x; pr = Ctor.precision; rm = Ctor.rounding; if (y.eq(1)) return finalise(x, pr, rm); e = mathfloor(y.e / LOG_BASE); if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) { r = intPow(Ctor, x, k, pr); return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm); } s = x.s; if (s < 0) { if (e < y.d.length - 1) return new Ctor(NaN); if ((y.d[e] & 1) == 0) s = 1; if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) { x.s = s; return x; } } k = mathpow(+x, yn); e = k == 0 || !isFinite(k) ? mathfloor(yn * (Math.log("0." + digitsToString(x.d)) / Math.LN10 + x.e + 1)) : new Ctor(k + "").e; if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0); external = false; Ctor.rounding = x.s = 1; k = Math.min(12, (e + "").length); r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr); if (r.d) { r = finalise(r, pr + 5, 1); if (checkRoundingDigits(r.d, pr, rm)) { e = pr + 10; r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1); if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) { r = finalise(r, pr + 1, 0); } } } r.s = s; external = true; Ctor.rounding = rm; return finalise(r, pr, rm); }; P.toPrecision = function(sd, rm) { var str, x = this, Ctor = x.constructor; if (sd === void 0) { str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); } else { checkInt32(sd, 1, MAX_DIGITS); if (rm === void 0) rm = Ctor.rounding; else checkInt32(rm, 0, 8); x = finalise(new Ctor(x), sd, rm); str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd); } return x.isNeg() && !x.isZero() ? "-" + str : str; }; P.toSignificantDigits = P.toSD = function(sd, rm) { var x = this, Ctor = x.constructor; if (sd === void 0) { sd = Ctor.precision; rm = Ctor.rounding; } else { checkInt32(sd, 1, MAX_DIGITS); if (rm === void 0) rm = Ctor.rounding; else checkInt32(rm, 0, 8); } return finalise(new Ctor(x), sd, rm); }; P.toString = function() { var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); return x.isNeg() && !x.isZero() ? "-" + str : str; }; P.truncated = P.trunc = function() { return finalise(new this.constructor(this), this.e + 1, 1); }; P.valueOf = P.toJSON = function() { var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); return x.isNeg() ? "-" + str : str; }; function digitsToString(d) { var i, k, ws, indexOfLastWord = d.length - 1, str = "", w = d[0]; if (indexOfLastWord > 0) { str += w; for (i = 1; i < indexOfLastWord; i++) { ws = d[i] + ""; k = LOG_BASE - ws.length; if (k) str += getZeroString(k); str += ws; } w = d[i]; ws = w + ""; k = LOG_BASE - ws.length; if (k) str += getZeroString(k); } else if (w === 0) { return "0"; } for (; w % 10 === 0; ) w /= 10; return str + w; } function checkInt32(i, min2, max2) { if (i !== ~~i || i < min2 || i > max2) { throw Error(invalidArgument + i); } } function checkRoundingDigits(d, i, rm, repeating) { var di, k, r, rd; for (k = d[0]; k >= 10; k /= 10) --i; if (--i < 0) { i += LOG_BASE; di = 0; } else { di = Math.ceil((i + 1) / LOG_BASE); i %= LOG_BASE; } k = mathpow(10, LOG_BASE - i); rd = d[di] % k | 0; if (repeating == null) { if (i < 3) { if (i == 0) rd = rd / 100 | 0; else if (i == 1) rd = rd / 10 | 0; r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 5e4 || rd == 0; } else { r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0; } } else { if (i < 4) { if (i == 0) rd = rd / 1e3 | 0; else if (i == 1) rd = rd / 100 | 0; else if (i == 2) rd = rd / 10 | 0; r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999; } else { r = ((repeating || rm < 4) && rd + 1 == k || !repeating && rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 1e3 | 0) == mathpow(10, i - 3) - 1; } } return r; } function convertBase(str, baseIn, baseOut) { var j, arr = [0], arrL, i = 0, strL = str.length; for (; i < strL; ) { for (arrL = arr.length; arrL--; ) arr[arrL] *= baseIn; arr[0] += NUMERALS.indexOf(str.charAt(i++)); for (j = 0; j < arr.length; j++) { if (arr[j] > baseOut - 1) { if (arr[j + 1] === void 0) arr[j + 1] = 0; arr[j + 1] += arr[j] / baseOut | 0; arr[j] %= baseOut; } } } return arr.reverse(); } function cosine(Ctor, x) { var k, len, y; if (x.isZero()) return x; len = x.d.length; if (len < 32) { k = Math.ceil(len / 3); y = (1 / tinyPow(4, k)).toString(); } else { k = 16; y = "2.3283064365386962890625e-10"; } Ctor.precision += k; x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1)); for (var i = k; i--; ) { var cos2x = x.times(x); x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1); } Ctor.precision -= k; return x; } var divide = function() { function multiplyInteger(x, k, base) { var temp, carry = 0, i = x.length; for (x = x.slice(); i--; ) { temp = x[i] * k + carry; x[i] = temp % base | 0; carry = temp / base | 0; } if (carry) x.unshift(carry); return x; } function compare(a, b, aL, bL) { var i, r; if (aL != bL) { r = aL > bL ? 1 : -1; } else { for (i = r = 0; i < aL; i++) { if (a[i] != b[i]) { r = a[i] > b[i] ? 1 : -1; break; } } } return r; } function subtract2(a, b, aL, base) { var i = 0; for (; aL--; ) { a[aL] -= i; i = a[aL] < b[aL] ? 1 : 0; a[aL] = i * base + a[aL] - b[aL]; } for (; !a[0] && a.length > 1; ) a.shift(); } return function(x, y, pr, rm, dp, base) { var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign2 = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d; if (!xd || !xd[0] || !yd || !yd[0]) { return new Ctor( // Return NaN if either NaN, or both Infinity or 0. !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : ( // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0. xd && xd[0] == 0 || !yd ? sign2 * 0 : sign2 / 0 ) ); } if (base) { logBase = 1; e = x.e - y.e; } else { base = BASE; logBase = LOG_BASE; e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase); } yL = yd.length; xL = xd.length; q = new Ctor(sign2); qd = q.d = []; for (i = 0; yd[i] == (xd[i] || 0); i++) ; if (yd[i] > (xd[i] || 0)) e--; if (pr == null) { sd = pr = Ctor.precision; rm = Ctor.rounding; } else if (dp) { sd = pr + (x.e - y.e) + 1; } else { sd = pr; } if (sd < 0) { qd.push(1); more = true; } else { sd = sd / logBase + 2 | 0; i = 0; if (yL == 1) { k = 0; yd = yd[0]; sd++; for (; (i < xL || k) && sd--; i++) { t = k * base + (xd[i] || 0); qd[i] = t / yd | 0; k = t % yd | 0; } more = k || i < xL; } else { k = base / (yd[0] + 1) | 0; if (k > 1) { yd = multiplyInteger(yd, k, base); xd = multiplyInteger(xd, k, base); yL = yd.length; xL = xd.length; } xi = yL; rem = xd.slice(0, yL); remL = rem.length; for (; remL < yL; ) rem[remL++] = 0; yz = yd.slice(); yz.unshift(0); yd0 = yd[0]; if (yd[1] >= base / 2) ++yd0; do { k = 0; cmp = compare(yd, rem, yL, remL); if (cmp < 0) { rem0 = rem[0]; if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); k = rem0 / yd0 | 0; if (k > 1) { if (k >= base) k = base - 1; prod = multiplyInteger(yd, k, base); prodL = prod.length; remL = rem.length; cmp = compare(prod, rem, prodL, remL); if (cmp == 1) { k--; subtract2(prod, yL < prodL ? yz : yd, prodL, base); } } else { if (k == 0) cmp = k = 1; prod = yd.slice(); } prodL = prod.length; if (prodL < remL) prod.unshift(0); subtract2(rem, prod, remL, base); if (cmp == -1) { remL = rem.length; cmp = compare(yd, rem, yL, remL); if (cmp < 1) { k++; subtract2(rem, yL < remL ? yz : yd, remL, base); } } remL = rem.length; } else if (cmp === 0) { k++; rem = [0]; } qd[i++] = k; if (cmp && rem[0]) { rem[remL++] = xd[xi] || 0; } else { rem = [xd[xi]]; remL = 1; } } while ((xi++ < xL || rem[0] !== void 0) && sd--); more = rem[0] !== void 0; } if (!qd[0]) qd.shift(); } if (logBase == 1) { q.e = e; inexact = more; } else { for (i = 1, k = qd[0]; k >= 10; k /= 10) i++; q.e = i + e * logBase - 1; finalise(q, dp ? pr + q.e + 1 : pr, rm, more); } return q; }; }(); function finalise(x, sd, rm, isTruncated) { var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor; out: if (sd != null) { xd = x.d; if (!xd) return x; for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++; i = sd - digits; if (i < 0) { i += LOG_BASE; j = sd; w = xd[xdi = 0]; rd = w / mathpow(10, digits - j - 1) % 10 | 0; } else { xdi = Math.ceil((i + 1) / LOG_BASE); k = xd.length; if (xdi >= k) { if (isTruncated) { for (; k++ <= xdi; ) xd.push(0); w = rd = 0; digits = 1; i %= LOG_BASE; j = i - LOG_BASE + 1; } else { break out; } } else { w = k = xd[xdi]; for (digits = 1; k >= 10; k /= 10) digits++; i %= LOG_BASE; j = i - LOG_BASE + digits; rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0; } } isTruncated = isTruncated || sd < 0 || xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1)); roundUp = rm < 4 ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && // Check whether the digit to the left of the rounding digit is odd. (i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7)); if (sd < 1 || !xd[0]) { xd.length = 0; if (roundUp) { sd -= x.e + 1; xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE); x.e = -sd || 0; } else { xd[0] = x.e = 0; } return x; } if (i == 0) { xd.length = xdi; k = 1; xdi--; } else { xd.length = xdi + 1; k = mathpow(10, LOG_BASE - i); xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0; } if (roundUp) { for (; ; ) { if (xdi == 0) { for (i = 1, j = xd[0]; j >= 10; j /= 10) i++; j = xd[0] += k; for (k = 1; j >= 10; j /= 10) k++; if (i != k) { x.e++; if (xd[0] == BASE) xd[0] = 1; } break; } else { xd[xdi] += k; if (xd[xdi] != BASE) break; xd[xdi--] = 0; k = 1; } } } for (i = xd.length; xd[--i] === 0; ) xd.pop(); } if (external) { if (x.e > Ctor.maxE) { x.d = null; x.e = NaN; } else if (x.e < Ctor.minE) { x.e = 0; x.d = [0]; } } return x; } function finiteToString(x, isExp, sd) { if (!x.isFinite()) return nonFiniteToString(x); var k, e = x.e, str = digitsToString(x.d), len = str.length; if (isExp) { if (sd && (k = sd - len) > 0) { str = str.charAt(0) + "." + str.slice(1) + getZeroString(k); } else if (len > 1) { str = str.charAt(0) + "." + str.slice(1); } str = str + (x.e < 0 ? "e" : "e+") + x.e; } else if (e < 0) { str = "0." + getZeroString(-e - 1) + str; if (sd && (k = sd - len) > 0) str += getZeroString(k); } else if (e >= len) { str += getZeroString(e + 1 - len); if (sd && (k = sd - e - 1) > 0) str = str + "." + getZeroString(k); } else { if ((k = e + 1) < len) str = str.slice(0, k) + "." + str.slice(k); if (sd && (k = sd - len) > 0) { if (e + 1 === len) str += "."; str += getZeroString(k); } } return str; } function getBase10Exponent(digits, e) { var w = digits[0]; for (e *= LOG_BASE; w >= 10; w /= 10) e++; return e; } function getLn10(Ctor, sd, pr) { if (sd > LN10_PRECISION) { external = true; if (pr) Ctor.precision = pr; throw Error(precisionLimitExceeded); } return finalise(new Ctor(LN10), sd, 1, true); } function getPi(Ctor, sd, rm) { if (sd > PI_PRECISION) throw Error(precisionLimitExceeded); return finalise(new Ctor(PI), sd, rm, true); } function getPrecision(digits) { var w = digits.length - 1, len = w * LOG_BASE + 1; w = digits[w]; if (w) { for (; w % 10 == 0; w /= 10) len--; for (w = digits[0]; w >= 10; w /= 10) len++; } return len; } function getZeroString(k) { var zs = ""; for (; k--; ) zs += "0"; return zs; } function intPow(Ctor, x, n, pr) { var isTruncated, r = new Ctor(1), k = Math.ceil(pr / LOG_BASE + 4); external = false; for (; ; ) { if (n % 2) { r = r.times(x); if (truncate(r.d, k)) isTruncated = true; } n = mathfloor(n / 2); if (n === 0) { n = r.d.length - 1; if (isTruncated && r.d[n] === 0) ++r.d[n]; break; } x = x.times(x); truncate(x.d, k); } external = true; return r; } function isOdd(n) { return n.d[n.d.length - 1] & 1; } function maxOrMin(Ctor, args, ltgt) { var y, x = new Ctor(args[0]), i = 0; for (; ++i < args.length; ) { y = new Ctor(args[i]); if (!y.s) { x = y; break; } else if (x[ltgt](y)) { x = y; } } return x; } function naturalExponential(x, sd) { var denominator, guard, j, pow3, sum2, t, wpr, rep = 0, i = 0, k = 0, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision; if (!x.d || !x.d[0] || x.e > 17) { return new Ctor(x.d ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 : x.s ? x.s < 0 ? 0 : x : 0 / 0); } if (sd == null) { external = false; wpr = pr; } else { wpr = sd; } t = new Ctor(0.03125); while (x.e > -2) { x = x.times(t); k += 5; } guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0; wpr += guard; denominator = pow3 = sum2 = new Ctor(1); Ctor.precision = wpr; for (; ; ) { pow3 = finalise(pow3.times(x), wpr, 1); denominator = denominator.times(++i); t = sum2.plus(divide(pow3, denominator, wpr, 1)); if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) { j = k; while (j--) sum2 = finalise(sum2.times(sum2), wpr, 1); if (sd == null) { if (rep < 3 && checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) { Ctor.precision = wpr += 10; denominator = pow3 = t = new Ctor(1); i = 0; rep++; } else { return finalise(sum2, Ctor.precision = pr, rm, external = true); } } else { Ctor.precision = pr; return sum2; } } sum2 = t; } } function naturalLogarithm(y, sd) { var c, c0, denominator, e, numerator, rep, sum2, t, wpr, x1, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision; if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) { return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x); } if (sd == null) { external = false; wpr = pr; } else { wpr = sd; } Ctor.precision = wpr += guard; c = digitsToString(xd); c0 = c.charAt(0); if (Math.abs(e = x.e) < 15e14) { while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) { x = x.times(y); c = digitsToString(x.d); c0 = c.charAt(0); n++; } e = x.e; if (c0 > 1) { x = new Ctor("0." + c); e++; } else { x = new Ctor(c0 + "." + c.slice(1)); } } else { t = getLn10(Ctor, wpr + 2, pr).times(e + ""); x = naturalLogarithm(new Ctor(c0 + "." + c.slice(1)), wpr - guard).plus(t); Ctor.precision = pr; return sd == null ? finalise(x, pr, rm, external = true) : x; } x1 = x; sum2 = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1); x2 = finalise(x.times(x), wpr, 1); denominator = 3; for (; ; ) { numerator = finalise(numerator.times(x2), wpr, 1); t = sum2.plus(divide(numerator, new Ctor(denominator), wpr, 1)); if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) { sum2 = sum2.times(2); if (e !== 0) sum2 = sum2.plus(getLn10(Ctor, wpr + 2, pr).times(e + "")); sum2 = divide(sum2, new Ctor(n), wpr, 1); if (sd == null) { if (checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) { Ctor.precision = wpr += guard; t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1); x2 = finalise(x.times(x), wpr, 1); denominator = rep = 1; } else { return finalise(sum2, Ctor.precision = pr, rm, external = true); } } else { Ctor.precision = pr; return sum2; } } sum2 = t; denominator += 2; } } function nonFiniteToString(x) { return String(x.s * x.s / 0); } function parseDecimal(x, str) { var e, i, len; if ((e = str.indexOf(".")) > -1) str = str.replace(".", ""); if ((i = str.search(/e/i)) > 0) { if (e < 0) e = i; e += +str.slice(i + 1); str = str.substring(0, i); } else if (e < 0) { e = str.length; } for (i = 0; str.charCodeAt(i) === 48; i++) ; for (len = str.length; str.charCodeAt(len - 1) === 48; --len) ; str = str.slice(i, len); if (str) { len -= i; x.e = e = e - i - 1; x.d = []; i = (e + 1) % LOG_BASE; if (e < 0) i += LOG_BASE; if (i < len) { if (i) x.d.push(+str.slice(0, i)); for (len -= LOG_BASE; i < len; ) x.d.push(+str.slice(i, i += LOG_BASE)); str = str.slice(i); i = LOG_BASE - str.length; } else { i -= len; } for (; i--; ) str += "0"; x.d.push(+str); if (external) { if (x.e > x.constructor.maxE) { x.d = null; x.e = NaN; } else if (x.e < x.constructor.minE) { x.e = 0; x.d = [0]; } } } else { x.e = 0; x.d = [0]; } return x; } function parseOther(x, str) { var base, Ctor, divisor, i, isFloat, len, p, xd, xe; if (str.indexOf("_") > -1) { str = str.replace(/(\d)_(?=\d)/g, "$1"); if (isDecimal.test(str)) return parseDecimal(x, str); } else if (str === "Infinity" || str === "NaN") { if (!+str) x.s = NaN; x.e = NaN; x.d = null; return x; } if (isHex.test(str)) { base = 16; str = str.toLowerCase(); } else if (isBinary.test(str)) { base = 2; } else if (isOctal.test(str)) { base = 8; } else { throw Error(invalidArgument + str); } i = str.search(/p/i); if (i > 0) { p = +str.slice(i + 1); str = str.substring(2, i); } else { str = str.slice(2); } i = str.indexOf("."); isFloat = i >= 0; Ctor = x.constructor; if (isFloat) { str = str.replace(".", ""); len = str.length; i = len - i; divisor = intPow(Ctor, new Ctor(base), i, i * 2); } xd = convertBase(str, base, BASE); xe = xd.length - 1; for (i = xe; xd[i] === 0; --i) xd.pop(); if (i < 0) return new Ctor(x.s * 0); x.e = getBase10Exponent(xd, xe); x.d = xd; external = false; if (isFloat) x = divide(x, divisor, len * 4); if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p)); external = true; return x; } function sine(Ctor, x) { var k, len = x.d.length; if (len < 3) { return x.isZero() ? x : taylorSeries(Ctor, 2, x, x); } k = 1.4 * Math.sqrt(len); k = k > 16 ? 16 : k | 0; x = x.times(1 / tinyPow(5, k)); x = taylorSeries(Ctor, 2, x, x); var sin2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20); for (; k--; ) { sin2_x = x.times(x); x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20)))); } return x; } function taylorSeries(Ctor, n, x, y, isHyperbolic) { var j, t, u, x2, i = 1, pr = Ctor.precision, k = Math.ceil(pr / LOG_BASE); external = false; x2 = x.times(x); u = new Ctor(y); for (; ; ) { t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1); u = isHyperbolic ? y.plus(t) : y.minus(t); y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1); t = u.plus(y); if (t.d[k] !== void 0) { for (j = k; t.d[j] === u.d[j] && j--; ) ; if (j == -1) break; } j = u; u = y; y = t; t = j; i++; } external = true; t.d.length = k + 1; return t; } function tinyPow(b, e) { var n = b; while (--e) n *= b; return n; } function toLessThanHalfPi(Ctor, x) { var t, isNeg2 = x.s < 0, pi = getPi(Ctor, Ctor.precision, 1), halfPi = pi.times(0.5); x = x.abs(); if (x.lte(halfPi)) { quadrant = isNeg2 ? 4 : 1; return x; } t = x.divToInt(pi); if (t.isZero()) { quadrant = isNeg2 ? 3 : 2; } else { x = x.minus(t.times(pi)); if (x.lte(halfPi)) { quadrant = isOdd(t) ? isNeg2 ? 2 : 3 : isNeg2 ? 4 : 1; return x; } quadrant = isOdd(t) ? isNeg2 ? 1 : 4 : isNeg2 ? 3 : 2; } return x.minus(pi).abs(); } function toStringBinary(x, baseOut, sd, rm) { var base, e, i, k, len, roundUp, str, xd, y, Ctor = x.constructor, isExp = sd !== void 0; if (isExp) { checkInt32(sd, 1, MAX_DIGITS); if (rm === void 0) rm = Ctor.rounding; else checkInt32(rm, 0, 8); } else { sd = Ctor.precision; rm = Ctor.rounding; } if (!x.isFinite()) { str = nonFiniteToString(x); } else { str = finiteToString(x); i = str.indexOf("."); if (isExp) { base = 2; if (baseOut == 16) { sd = sd * 4 - 3; } else if (baseOut == 8) { sd = sd * 3 - 2; } } else { base = baseOut; } if (i >= 0) { str = str.replace(".", ""); y = new Ctor(1); y.e = str.length - i; y.d = convertBase(finiteToString(y), 10, base); y.e = y.d.length; } xd = convertBase(str, 10, base); e = len = xd.length; for (; xd[--len] == 0; ) xd.pop(); if (!xd[0]) { str = isExp ? "0p+0" : "0"; } else { if (i < 0) { e--; } else { x = new Ctor(x); x.d = xd; x.e = e; x = divide(x, y, sd, rm, 0, base); xd = x.d; e = x.e; roundUp = inexact; } i = xd[sd]; k = base / 2; roundUp = roundUp || xd[sd + 1] !== void 0; roundUp = rm < 4 ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || rm === (x.s < 0 ? 8 : 7)); xd.length = sd; if (roundUp) { for (; ++xd[--sd] > base - 1; ) { xd[sd] = 0; if (!sd) { ++e; xd.unshift(1); } } } for (len = xd.length; !xd[len - 1]; --len) ; for (i = 0, str = ""; i < len; i++) str += NUMERALS.charAt(xd[i]); if (isExp) { if (len > 1) { if (baseOut == 16 || baseOut == 8) { i = baseOut == 16 ? 4 : 3; for (--len; len % i; len++) str += "0"; xd = convertBase(str, base, baseOut); for (len = xd.length; !xd[len - 1]; --len) ; for (i = 1, str = "1."; i < len; i++) str += NUMERALS.charAt(xd[i]); } else { str = str.charAt(0) + "." + str.slice(1); } } str = str + (e < 0 ? "p" : "p+") + e; } else if (e < 0) { for (; ++e; ) str = "0" + str; str = "0." + str; } else { if (++e > len) for (e -= len; e--; ) str += "0"; else if (e < len) str = str.slice(0, e) + "." + str.slice(e); } } str = (baseOut == 16 ? "0x" : baseOut == 2 ? "0b" : baseOut == 8 ? "0o" : "") + str; } return x.s < 0 ? "-" + str : str; } function truncate(arr, len) { if (arr.length > len) { arr.length = len; return true; } } function abs(x) { return new this(x).abs(); } function acos(x) { return new this(x).acos(); } function acosh(x) { return new this(x).acosh(); } function add(x, y) { return new this(x).plus(y); } function asin(x) { return new this(x).asin(); } function asinh(x) { return new this(x).asinh(); } function atan(x) { return new this(x).atan(); } function atanh(x) { return new this(x).atanh(); } function atan2(y, x) { y = new this(y); x = new this(x); var r, pr = this.precision, rm = this.rounding, wpr = pr + 4; if (!y.s || !x.s) { r = new this(NaN); } else if (!y.d && !x.d) { r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75); r.s = y.s; } else if (!x.d || y.isZero()) { r = x.s < 0 ? getPi(this, pr, rm) : new this(0); r.s = y.s; } else if (!y.d || x.isZero()) { r = getPi(this, wpr, 1).times(0.5); r.s = y.s; } else if (x.s < 0) { this.precision = wpr; this.rounding = 1; r = this.atan(divide(y, x, wpr, 1)); x = getPi(this, wpr, 1); this.precision = pr; this.rounding = rm; r = y.s < 0 ? r.minus(x) : r.plus(x); } else { r = this.atan(divide(y, x, wpr, 1)); } return r; } function cbrt(x) { return new this(x).cbrt(); } function ceil(x) { return finalise(x = new this(x), x.e + 1, 2); } function clamp(x, min2, max2) { return new this(x).clamp(min2, max2); } function config(obj) { if (!obj || typeof obj !== "object") throw Error(decimalError + "Object expected"); var i, p, v, useDefaults = obj.defaults === true, ps = [ "precision", 1, MAX_DIGITS, "rounding", 0, 8, "toExpNeg", -EXP_LIMIT, 0, "toExpPos", 0, EXP_LIMIT, "maxE", 0, EXP_LIMIT, "minE", -EXP_LIMIT, 0, "modulo", 0, 9 ]; for (i = 0; i < ps.length; i += 3) { if (p = ps[i], useDefaults) this[p] = DEFAULTS[p]; if ((v = obj[p]) !== void 0) { if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v; else throw Error(invalidArgument + p + ": " + v); } } if (p = "crypto", useDefaults) this[p] = DEFAULTS[p]; if ((v = obj[p]) !== void 0) { if (v === true || v === false || v === 0 || v === 1) { if (v) { if (typeof crypto != "undefined" && crypto && (crypto.getRandomValues || crypto.randomBytes)) { this[p] = true; } else { throw Error(cryptoUnavailable); } } else { this[p] = false; } } else { throw Error(invalidArgument + p + ": " + v); } } return this; } function cos(x) { return new this(x).cos(); } function cosh(x) { return new this(x).cosh(); } function clone(obj) { var i, p, ps; function Decimal2(v) { var e, i2, t, x = this; if (!(x instanceof Decimal2)) return new Decimal2(v); x.constructor = Decimal2; if (isDecimalInstance(v)) { x.s = v.s; if (external) { if (!v.d || v.e > Decimal2.maxE) { x.e = NaN; x.d = null; } else if (v.e < Decimal2.minE) { x.e = 0; x.d = [0]; } else { x.e = v.e; x.d = v.d.slice(); } } else { x.e = v.e; x.d = v.d ? v.d.slice() : v.d; } return; } t = typeof v; if (t === "number") { if (v === 0) { x.s = 1 / v < 0 ? -1 : 1; x.e = 0; x.d = [0]; return; } if (v < 0) { v = -v; x.s = -1; } else { x.s = 1; } if (v === ~~v && v < 1e7) { for (e = 0, i2 = v; i2 >= 10; i2 /= 10) e++; if (external) { if (e > Decimal2.maxE) { x.e = NaN; x.d = null; } else if (e < Decimal2.minE) { x.e = 0; x.d = [0]; } else { x.e = e; x.d = [v]; } } else { x.e = e; x.d = [v]; } return; } else if (v * 0 !== 0) { if (!v) x.s = NaN; x.e = NaN; x.d = null; return; } return parseDecimal(x, v.toString()); } else if (t !== "string") { throw Error(invalidArgument + v); } if ((i2 = v.charCodeAt(0)) === 45) { v = v.slice(1); x.s = -1; } else { if (i2 === 43) v = v.slice(1); x.s = 1; } return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v); } Decimal2.prototype = P; Decimal2.ROUND_UP = 0; Decimal2.ROUND_DOWN = 1; Decimal2.ROUND_CEIL = 2; Decimal2.ROUND_FLOOR = 3; Decimal2.ROUND_HALF_UP = 4; Decimal2.ROUND_HALF_DOWN = 5; Decimal2.ROUND_HALF_EVEN = 6; Decimal2.ROUND_HALF_CEIL = 7; Decimal2.ROUND_HALF_FLOOR = 8; Decimal2.EUCLID = 9; Decimal2.config = Decimal2.set = config; Decimal2.clone = clone; Decimal2.isDecimal = isDecimalInstance; Decimal2.abs = abs; Decimal2.acos = acos; Decimal2.acosh = acosh; Decimal2.add = add; Decimal2.asin = asin; Decimal2.asinh = asinh; Decimal2.atan = atan; Decimal2.atanh = atanh; Decimal2.atan2 = atan2; Decimal2.cbrt = cbrt; Decimal2.ceil = ceil; Decimal2.clamp = clamp; Decimal2.cos = cos; Decimal2.cosh = cosh; Decimal2.div = div; Decimal2.exp = exp; Decimal2.floor = floor; Decimal2.hypot = hypot; Decimal2.ln = ln; Decimal2.log = log; Decimal2.log10 = log10; Decimal2.log2 = log2; Decimal2.max = max; Decimal2.min = min; Decimal2.mod = mod; Decimal2.mul = mul; Decimal2.pow = pow; Decimal2.random = random; Decimal2.round = round; Decimal2.sign = sign; Decimal2.sin = sin; Decimal2.sinh = sinh; Decimal2.sqrt = sqrt; Decimal2.sub = sub; Decimal2.sum = sum; Decimal2.tan = tan; Decimal2.tanh = tanh; Decimal2.trunc = trunc; if (obj === void 0) obj = {}; if (obj) { if (obj.defaults !== true) { ps = ["precision", "rounding", "toExpNeg", "toExpPos", "maxE", "minE", "modulo", "crypto"]; for (i = 0; i < ps.length; ) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p]; } } Decimal2.config(obj); return Decimal2; } function div(x, y) { return new this(x).div(y); } function exp(x) { return new this(x).exp(); } function floor(x) { return finalise(x = new this(x), x.e + 1, 3); } function hypot() { var i, n, t = new this(0); external = false; for (i = 0; i < arguments.length; ) { n = new this(arguments[i++]); if (!n.d) { if (n.s) { external = true; return new this(1 / 0); } t = n; } else if (t.d) { t = t.plus(n.times(n)); } } external = true; return t.sqrt(); } function isDecimalInstance(obj) { return obj instanceof Decimal || obj && obj.toStringTag === tag || false; } function ln(x) { return new this(x).ln(); } function log(x, y) { return new this(x).log(y); } function log2(x) { return new this(x).log(2); } function log10(x) { return new this(x).log(10); } function max() { return maxOrMin(this, arguments, "lt"); } function min() { return maxOrMin(this, arguments, "gt"); } function mod(x, y) { return new this(x).mod(y); } function mul(x, y) { return new this(x).mul(y); } function pow(x, y) { return new this(x).pow(y); } function random(sd) { var d, e, k, n, i = 0, r = new this(1), rd = []; if (sd === void 0) sd = this.precision; else checkInt32(sd, 1, MAX_DIGITS); k = Math.ceil(sd / LOG_BASE); if (!this.crypto) { for (; i < k; ) rd[i++] = Math.random() * 1e7 | 0; } else if (crypto.getRandomValues) { d = crypto.getRandomValues(new Uint32Array(k)); for (; i < k; ) { n = d[i]; if (n >= 429e7) { d[i] = crypto.getRandomValues(new Uint32Array(1))[0]; } else { rd[i++] = n % 1e7; } } } else if (crypto.randomBytes) { d = crypto.randomBytes(k *= 4); for (; i < k; ) { n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 127) << 24); if (n >= 214e7) { crypto.randomBytes(4).copy(d, i); } else { rd.push(n % 1e7); i += 4; } } i = k / 4; } else { throw Error(cryptoUnavailable); } k = rd[--i]; sd %= LOG_BASE; if (k && sd) { n = mathpow(10, LOG_BASE - sd); rd[i] = (k / n | 0) * n; } for (; rd[i] === 0; i--) rd.pop(); if (i < 0) { e = 0; rd = [0]; } else { e = -1; for (; rd[0] === 0; e -= LOG_BASE) rd.shift(); for (k = 1, n = rd[0]; n >= 10; n /= 10) k++; if (k < LOG_BASE) e -= LOG_BASE - k; } r.e = e; r.d = rd; return r; } function round(x) { return finalise(x = new this(x), x.e + 1, this.rounding); } function sign(x) { x = new this(x); return x.d ? x.d[0] ? x.s : 0 * x.s : x.s || NaN; } function sin(x) { return new this(x).sin(); } function sinh(x) { return new this(x).sinh(); } function sqrt(x) { return new this(x).sqrt(); } function sub(x, y) { return new this(x).sub(y); } function sum() { var i = 0, args = arguments, x = new this(args[i]); external = false; for (; x.s && ++i < args.length; ) x = x.plus(args[i]); external = true; return finalise(x, this.precision, this.rounding); } function tan(x) { return new this(x).tan(); } function tanh(x) { return new this(x).tanh(); } function trunc(x) { return finalise(x = new this(x), x.e + 1, 1); } P[Symbol.for("nodejs.util.inspect.custom")] = P.toString; P[Symbol.toStringTag] = "Decimal"; var Decimal = P.constructor = clone(DEFAULTS); LN10 = new Decimal(LN10); PI = new Decimal(PI); var decimal_default = Decimal; var import_complex20 = __toESM(require_complex()); function stringToCodepoints(string) { const result = []; for (let i = 0; i < string.length; i++) { let code = string.charCodeAt(i); if (code >= 55296 && code <= 56319) { const nextCode = string.charCodeAt(i + 1); if (nextCode >= 56320 && nextCode <= 57343) { const lead = code - 55296; const trail = nextCode - 56320; code = 2 ** 16 + lead * 2 ** 10 + trail; i++; } } result.push(code); } return result; } var ZWJ = 8205; var REGIONAL_INDICATOR = [127462, 127487]; function isEmojiCombinator(code) { if (code === ZWJ) return true; if (code === 65038 || code === 65039) return true; if (code >= 127995 && code <= 127995 + 5) return true; if (code >= 129456 && code <= 129456 + 4) return true; if (code >= 917536 && code <= 917536 + 96) return true; return false; } function isRegionalIndicator(code) { return code >= REGIONAL_INDICATOR[0] && code <= REGIONAL_INDICATOR[1]; } function splitGraphemes(string) { if (/^[\u0020-\u00FF]*$/.test(string)) return string; const result = []; const codePoints = stringToCodepoints(string); let index = 0; while (index < codePoints.length) { const code = codePoints[index++]; const next = codePoints[index]; if (next === ZWJ) { const baseIndex = index - 1; index += 2; while (codePoints[index] === ZWJ) { index += 2; } result.push( String.fromCodePoint( ...codePoints.slice(baseIndex, 2 * index - baseIndex + 1) ) ); } else if (isEmojiCombinator(next)) { const baseIndex = index - 1; while (isEmojiCombinator(codePoints[index])) { index += codePoints[index] === ZWJ ? 2 : 1; } result.push( String.fromCodePoint( ...codePoints.slice(baseIndex, 2 * index - baseIndex - 1) ) ); } else if (isRegionalIndicator(code)) { index += 1; result.push(String.fromCodePoint(...codePoints.slice(index - 2, 2))); } else { result.push(String.fromCodePoint(code)); } } return result; } var Tokenizer = class { constructor(s) { this.obeyspaces = false; s = s.replace(/[\u200E\u200F\u2066-\u2069\u202A-\u202E]/g, ""); this.s = splitGraphemes(s); this.pos = 0; } /** * @return True if we reached the end of the stream */ end() { return this.pos >= this.s.length; } /** * Return the next char and advance */ get() { return this.pos < this.s.length ? this.s[this.pos++] : ""; } /** * Return the next char, but do not advance */ peek() { return this.s[this.pos]; } /** * Return the next substring matching regEx and advance. */ match(regEx) { let execResult; if (typeof this.s === "string") { execResult = regEx.exec(this.s.slice(this.pos)); } else { execResult = regEx.exec(this.s.slice(this.pos).join("")); } if (execResult == null ? void 0 : execResult[0]) { this.pos += execResult[0].length; return execResult[0]; } return null; } /** * Return the next token, or null. */ next() { if (this.end()) return null; if (!this.obeyspaces && this.match(/^[ \f\n\r\t\v\xA0\u2028\u2029]+/)) { return ""; } else if (this.obeyspaces && this.match(/^[ \f\n\r\t\v\xA0\u2028\u2029]/)) { return ""; } const next = this.get(); if (next === "\\") { if (!this.end()) { let command = this.match(/^[a-zA-Z*]+/); if (command) { this.match(/^[ \f\n\r\t\v\xA0\u2028\u2029]*/); } else { command = this.get(); if (command === " ") { return ""; } } return "\\" + command; } } else if (next === "{") { return "<{>"; } else if (next === "}") { return "<}>"; } else if (next === "^") { if (this.peek() === "^") { this.get(); const hex = this.match( /^(\^(\^(\^(\^[0-9a-f])?[0-9a-f])?[0-9a-f])?[0-9a-f])?[0-9a-f][0-9a-f]/ ); if (hex) { return String.fromCodePoint( parseInt(hex.slice(hex.lastIndexOf("^") + 1), 16) ); } } return next; } else if (next === "#") { if (!this.end()) { let isParam = false; if (/[0-9?]/.test(this.peek())) { isParam = true; if (this.pos + 1 < this.s.length) { const after = this.s[this.pos + 1]; isParam = /[^0-9A-Za-z]/.test(after); } } if (isParam) { return "#" + this.get(); } return "#"; } } else if (next === "$") { if (this.peek() === "$") { this.get(); return "<$$>"; } return "<$>"; } return next; } }; function expand(lex2, args) { var _a, _b, _c, _d; let token = lex2.next(); if (!token) return []; let result = []; if (token === "\\relax") { } else if (token === "\\noexpand") { token = lex2.next(); if (token) { result.push(token); } } else if (token === "\\obeyspaces") { lex2.obeyspaces = true; } else if (token === "\\space" || token === "~") { result.push(""); } else if (token === "\\bgroup") { result.push("<{>"); } else if (token === "\\egroup") { result.push("<}>"); } else if (token === "\\string") { token = lex2.next(); if (token) { if (token[0] === "\\") { Array.from(token).forEach( (x) => result.push(x === "\\" ? "\\backslash" : x) ); } else if (token === "<{>") { result.push("\\{"); } else if (token === "") { result.push("~"); } else if (token === "<}>") { result.push("\\}"); } } } else if (token === "\\csname") { while (lex2.peek() === "") { lex2.next(); } let command = ""; let done = false; let tokens = []; do { if (tokens.length === 0) { if (/^#[0-9?]$/.test(lex2.peek())) { const param = lex2.get().slice(1); tokens = tokenize( (_b = (_a = args == null ? void 0 : args[param]) != null ? _a : args == null ? void 0 : args["?"]) != null ? _b : "\\placeholder{}", args ); token = tokens[0]; } else { token = lex2.next(); tokens = token ? [token] : []; } } done = tokens.length === 0; if (!done && token === "\\endcsname") { done = true; tokens.shift(); } if (!done) { done = token === "<$>" || token === "<$$>" || token === "<{>" || token === "<}>" || !!token && token.length > 1 && token[0] === "\\"; } if (!done) { command += tokens.shift(); } } while (!done); if (command) { result.push("\\" + command); } result = result.concat(tokens); } else if (token === "\\endcsname") { } else if (token.length > 1 && token[0] === "#") { const param = token.slice(1); result = result.concat( tokenize((_d = (_c = args == null ? void 0 : args[param]) != null ? _c : args == null ? void 0 : args["?"]) != null ? _d : "\\placeholder{}", args) ); } else { result.push(token); } return result; } function tokenize(s, args) { const lines = s.toString().split(/\r?\n/); let stream = ""; let sep = ""; for (const line of lines) { stream += sep; sep = " "; const m = line.match(/((?:\\%)|[^%])*/); if (m !== null) stream += m[0]; } const tokenizer = new Tokenizer(stream); const result = []; do result.push(...expand(tokenizer, args)); while (!tokenizer.end()); return result; } function countTokens(s) { return tokenize(s, []).length; } function joinLatex(segments) { let sep = ""; let result = ""; for (const segment of segments) { if (segment) { if (/[a-zA-Z*]/.test(segment[0])) { result += sep; } if (/\\[a-zA-Z]+\*?$/.test(segment)) { sep = " "; } else { sep = ""; } result += segment; } } return result; } function tokensToString(tokens) { let flat = []; if (Array.isArray(tokens)) { for (const item of tokens) { if (Array.isArray(item)) { flat = [...flat, ...item]; } else { flat.push(item); } } } else { flat = [tokens]; } const result = joinLatex( flat.map((token) => { var _a; return (_a = { "": " ", "<$$>": "$$", "<$>": "$", "<{>": "{", "<}>": "}" }[token]) != null ? _a : token; }) ); return result; } var DEFINITIONS_ALGEBRA = [ { name: "To", latexTrigger: ["\\to"], kind: "infix", precedence: 270 // MathML rightwards arrow } ]; var MISSING = ["Error", "'missing'"]; function isNumberExpression(expr) { if (expr === null) return false; if (typeof expr === "number" || isNumberObject(expr)) return true; if (typeof expr === "string" && /^[+-]?[0-9\.]/.test(expr)) return true; return false; } function isNumberObject(expr) { return expr !== null && typeof expr === "object" && "num" in expr; } function isSymbolObject(expr) { return expr !== null && typeof expr === "object" && "sym" in expr; } function isStringObject(expr) { return expr !== null && typeof expr === "object" && "str" in expr; } function isFunctionObject(expr) { return expr !== null && typeof expr === "object" && "fn" in expr; } var recommendedScriptsRegex; function isRecommendedScripts(text) { if (!recommendedScriptsRegex) { const recommendedScripts = [ "Zyyy", "Zinh", "Arab", "Armn", "Beng", "Bopo", "Cyrl", "Deva", "Ethi", "Geor", "Grek", "Gujr", "Guru", "Hang", "Hani", "Hebr", "Hira", "Kana", "Knda", "Khmr", "Laoo", "Latn", "Mlym", "Mymr", "Orya", "Sinh", "Taml", "Telu", "Thaa", "Thai", "Tibt" ]; const regexPattern = `^[${recommendedScripts.map((x) => `\\p{Script=${x}}`).join("")}]*$`; recommendedScriptsRegex = new RegExp(regexPattern, "u"); } return recommendedScriptsRegex.test(text); } function isValidIdentifier(s) { if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(s)) return true; if (ONLY_EMOJIS.test(s)) return true; if (!isRecommendedScripts(s)) return false; return /^[\p{XIDS}_]\p{XIDC}*$/u.test(s); } var VS16 = "\\u{FE0F}"; var KEYCAP = "\\u{20E3}"; var ZWJ2 = "\\u{200D}"; var FLAG_SEQUENCE = "\\p{RI}\\p{RI}"; var TAG_MOD = `(?:[\\u{E0020}-\\u{E007E}]+\\u{E007F})`; var EMOJI_MOD = `(?:\\p{EMod}|${VS16}${KEYCAP}?|${TAG_MOD})`; var EMOJI_NOT_IDENTIFIER = `(?:(?=\\P{XIDC})\\p{Emoji})`; var ZWJ_ELEMENT = `(?:${EMOJI_NOT_IDENTIFIER}${EMOJI_MOD}*|\\p{Emoji}${EMOJI_MOD}+|${FLAG_SEQUENCE})`; var POSSIBLE_EMOJI = `(?:${ZWJ_ELEMENT})(${ZWJ2}${ZWJ_ELEMENT})*`; var SOME_EMOJI = new RegExp(`(?:${POSSIBLE_EMOJI})+`, "u"); var ONLY_EMOJIS = new RegExp(`^(?:${POSSIBLE_EMOJI})+$`, "u"); function validateIdentifier(s) { if (typeof s !== "string") return "not-a-string"; if (s === "") return "empty-string"; if (s.normalize() !== s) return "expected-nfc"; if (/[\u200E\u200F\u2066-\u2069\u202A-\u202E]/.test(s)) return "unexpected-bidi-marker"; if (ONLY_EMOJIS.test(s)) return "valid"; if (/\p{XIDC}/u.test(s) && SOME_EMOJI.test(s)) return "unexpected-mixed-emoji"; if (!isRecommendedScripts(s)) return "unexpected-script"; if (!isValidIdentifier(s)) { if (!isValidIdentifier(s[0])) return "invalid-first-char"; return "invalid-char"; } return "valid"; } function stringValue(expr) { if (expr === null || expr === void 0) return null; if (typeof expr === "object" && "str" in expr) return expr.str; if (typeof expr !== "string") return null; if (expr.length < 2) return null; if (expr[0] !== "'" || expr[expr.length - 1] !== "'") return null; return expr.substring(1, expr.length - 1); } function stripText(expr) { var _a; if (expr === null || expr === void 0 || stringValue(expr) !== null) return null; const h = head(expr); if (h !== null) { return [ h, ...((_a = ops(expr)) != null ? _a : []).map((x) => stripText(x)).filter((x) => x !== null) ]; } return expr; } function head(expr) { if (expr === null || expr === void 0) return null; if (Array.isArray(expr)) { if (typeof expr[0] === "string" && !isValidIdentifier(expr[0])) { console.error( `Invalid identifier "${expr[0]}": ${validateIdentifier(expr[0])}` ); return null; } return expr[0]; } if (isFunctionObject(expr)) return expr.fn[0]; return null; } function headName(expr) { const h = head(expr); return typeof h === "string" ? h : ""; } function ops(expr) { if (expr === null || expr === void 0) return null; if (Array.isArray(expr)) return expr.slice(1); if (isFunctionObject(expr)) return expr.fn.slice(1); return null; } function op(expr, n) { var _a, _b; if (expr === null || expr === void 0) return null; if (Array.isArray(expr)) return (_a = expr[n]) != null ? _a : null; if (isFunctionObject(expr)) return (_b = expr.fn[n]) != null ? _b : null; return null; } function op1(expr) { return op(expr, 1); } function op2(expr) { return op(expr, 2); } function nops(expr) { if (expr === null || expr === void 0) return 0; if (Array.isArray(expr)) return Math.max(0, expr.length - 1); if (isFunctionObject(expr)) return Math.max(0, expr.fn.length - 1); return 0; } function symbol(expr) { if (expr === null || expr === void 0) return null; if (typeof expr === "string") { if (/^[+\-\.0-9]/.test(expr)) return null; if (expr.length >= 2 && expr[0] === "'" && expr[expr.length - 1] === "'") return null; } const s = isSymbolObject(expr) ? expr.sym : expr; if (typeof s !== "string") return null; return s; } function isListLike(expr) { if (expr === null) return false; const h = head(expr); if (!h || typeof h !== "string") return false; return /^(List|Sequence|Tuple|Single|Pair|Triple)$/.test(h); } function keyValuePair(expr) { var _a; const h = head(expr); if (h === "KeyValuePair" || h === "Tuple" || h === "Pair") { const key = stringValue(op1(expr)); if (!key) return null; return [key, (_a = op2(expr)) != null ? _a : "Nothing"]; } return null; } function dictionary(expr) { if (expr === null) return null; if (typeof expr === "object" && "dict" in expr) return expr.dict; const kv = keyValuePair(expr); if (kv) return { [kv[0]]: kv[1] }; const h = head(expr); if (h === "Dictionary") { const result = {}; for (let i = 1; i < nops(expr); i++) { const kv2 = keyValuePair(op(expr, i)); if (kv2) result[kv2[0]] = kv2[1]; } return result; } return null; } function machineValueOfString(s) { var _a; s = s.toLowerCase().replace(/[nd]$/g, "").replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); if (s === "nan") return NaN; if (s === "+infinity") return Infinity; if (s === "-infinity") return -Infinity; if (/\([0-9]+\)/.test(s)) { const [_, body, repeat, trail] = (_a = s.match(/(.+)\(([0-9]+)\)(.*)$/)) != null ? _a : []; s = body + repeat.repeat(Math.ceil(16 / repeat.length)) + (trail != null ? trail : ""); } return parseFloat(s); } function machineValue(expr) { if (expr === null || expr === void 0) return null; if (typeof expr === "number") return expr; if (typeof expr === "string") return machineValueOfString(expr); if (isNumberObject(expr)) return machineValue(expr.num); return null; } function rationalValue(expr) { var _a, _b; if (expr === void 0 || expr === null) return null; if (symbol(expr) === "Half") return [1, 2]; const h = head(expr); if (!h) return null; let numer = null; let denom = null; if (h === "Negate") { const r = rationalValue(op1(expr)); if (r) return [-r[0], r[1]]; } if (h === "Rational" || h === "Divide") { numer = (_a = machineValue(op1(expr))) != null ? _a : NaN; denom = (_b = machineValue(op2(expr))) != null ? _b : NaN; } if (h === "Power") { const exponent = machineValue(op2(expr)); if (exponent === 1) { numer = machineValue(op1(expr)); denom = 1; } else if (exponent === -1) { numer = 1; denom = machineValue(op1(expr)); } } if (h === "Multiply" && head(op2(expr)) === "Power" && machineValue(op2(op2(expr))) === -1) { numer = machineValue(op1(expr)); denom = machineValue(op1(op2(expr))); } if (numer === null || denom === null) return null; if (Number.isInteger(numer) && Number.isInteger(denom)) return [numer, denom]; return null; } function subs(expr, s) { var _a; const h = head(expr); if (h !== null) return [subs(h, s), ...((_a = ops(expr)) != null ? _a : []).map((x) => subs(x, s))]; const dict = dictionary(expr); if (dict !== null) { const keys = Object.keys(dict); const result = {}; for (const key of keys) result[key] = subs(dict[key], s); return { dict: result }; } const sym = symbol(expr); if (sym && s[sym]) return s[sym]; return expr; } function mapArgs(expr, fn) { let args = null; if (Array.isArray(expr)) args = expr; if (isFunctionObject(expr)) args = expr.fn; if (args === null) return []; let i = 1; const result = []; while (i < args.length) { result.push(fn(args[i])); i += 1; } return result; } function applyAssociativeOperator(op3, lhs, rhs, associativity = "both") { var _a, _b, _c, _d, _e, _f; if (associativity === "non") return [op3, lhs, rhs]; const lhsName = head(lhs); const rhsName = head(rhs); if (associativity === "left") { if (lhsName === op3) return [op3, ...(_a = ops(lhs)) != null ? _a : [], rhs]; return [op3, lhs, rhs]; } if (associativity === "right") { if (rhsName === op3) return [op3, lhs, ...(_b = ops(rhs)) != null ? _b : []]; return [op3, lhs, rhs]; } if (lhsName === op3 && rhsName === op3) { return [op3, ...(_c = ops(lhs)) != null ? _c : [], ...(_d = ops(rhs)) != null ? _d : []]; } if (lhsName === op3) return [op3, ...(_e = ops(lhs)) != null ? _e : [], rhs]; if (rhsName === op3) return [op3, lhs, ...(_f = ops(rhs)) != null ? _f : []]; return [op3, lhs, rhs]; } function getSequence(expr) { var _a; if (expr === null) return null; let h = head(expr); if (h === "Delimiter") { expr = op(expr, 1); if (expr === null) return []; if (head(expr) !== "Sequence") return [expr]; } h = head(expr); if (h !== "Sequence") return null; return (_a = ops(expr)) != null ? _a : []; } function isEmptySequence(expr) { return expr !== null && head(expr) === "Sequence" && nops(expr) === 0; } function missingIfEmpty(expr) { if (expr === null || isEmptySequence(expr)) return MISSING; return expr; } function countFunctionLeaves(xs) { if (xs[0] === "Square") { return countFunctionLeaves(xs.slice(1)) + 2; } return xs.reduce((acc, x) => acc + countLeaves(x), 0); } function countLeaves(expr) { if (expr === null) return 0; if (typeof expr === "number" || typeof expr === "string") return 1; if (isNumberExpression(expr) || isSymbolObject(expr) || isStringObject(expr)) return 1; if (Array.isArray(expr)) return countFunctionLeaves(expr); if ("fn" in expr) return countFunctionLeaves(expr.fn); const dict = dictionary(expr); if (dict) { const keys = Object.keys(dict); return 1 + keys.length + keys.reduce((acc, x) => acc + countLeaves(dict[x]), 0); } return 0; } function getApplyFunctionStyle(_expr, _level) { return "paren"; } function getGroupStyle(_expr, _level) { return "paren"; } function getRootStyle(_expr, level) { return level > 2 ? "solidus" : "radical"; } function getFractionStyle(expr, level) { if (level > 3) return "inline-solidus"; if (head(expr) === "Divide") { const [n, d] = [countLeaves(op1(expr)), countLeaves(op2(expr))]; if (d <= 2 && n > 5) return "factor"; if (n <= 2 && d > 5) return "reciprocal"; } return "quotient"; } function getLogicStyle(_expr, _level) { return "boolean"; } function getPowerStyle(_expr, _level) { return "solidus"; } function getNumericSetStyle(_expr, _level) { return "compact"; } function numeratorDenominator(expr) { var _a, _b; if (head(expr) !== "Multiply") return [[], []]; const numerator = []; const denominator = []; const args = (_a = ops(expr)) != null ? _a : []; for (const arg of args) { if (head(arg) === "Power") { const op12 = op(arg, 1); const op22 = op(arg, 2); if (head(op22) === "Negate") { const b = op(op22, 1); if (op12 && b) denominator.push(["Power", op12, b]); } else { const exponentVal = (_b = machineValue(op22)) != null ? _b : NaN; if (exponentVal === -1) { if (op12) denominator.push(op12); } else if (exponentVal < 0) { if (op12) denominator.push(["Power", op12, -exponentVal]); } else { numerator.push(arg); } } } else if (head(arg) === "Rational" && nops(arg) === 2) { const op12 = op(arg, 1); const op22 = op(arg, 2); if (machineValue(op12) !== 1) numerator.push(op12); if (machineValue(op22) !== 1) denominator.push(op22); } else { const r = rationalValue(arg); if (r !== null) { if (r[0] !== 1) numerator.push(r[0]); denominator.push(r[1]); } else numerator.push(arg); } } return [numerator, denominator]; } function parseRoot(parser) { var _a; const degree = parser.parseOptionalGroup(); const base = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); if (base === null || isEmptySequence(base)) { if (degree !== null) return ["Root", MISSING, missingIfEmpty(degree)]; return ["Sqrt", MISSING]; } if (degree !== null) return ["Root", base, degree]; return ["Sqrt", base]; } function serializeRoot(serializer, style, base, degree) { if (base === null) return "\\sqrt{}"; degree = degree != null ? degree : 2; if (style === "solidus") { return serializer.wrapShort(base) + "^{1\\/" + serializer.serialize(degree) + "}"; } else if (style === "quotient") { return serializer.wrapShort(base) + "^{\\frac{1}{" + serializer.serialize(degree) + "}}"; } const degreeValue = machineValue(degree); if (degreeValue === 2) return "\\sqrt{" + serializer.serialize(base) + "}"; return "\\sqrt[" + serializer.serialize(degree) + "]{" + serializer.serialize(base) + "}"; } function serializeAdd(serializer, expr) { var _a, _b; serializer.level -= 1; const name = head(expr); let result = ""; let arg = op(expr, 1); if (name === "Negate") { result = "-" + serializer.wrap(arg, 276); } else if (name === "Add") { if (serializer.canonical && nops(expr) === 2 && serializer.options.invisiblePlus !== "+") { const [op12, op22] = [op(expr, 1), op(expr, 2)]; let [lhs, rhs] = [op12, op22]; let lhsValue = machineValue(lhs); let rhsValue = rationalValue(rhs); if (lhsValue === null || rhsValue === null) { [lhs, rhs] = [op22, op12]; lhsValue = machineValue(lhs); rhsValue = rationalValue(rhs); } if (lhsValue !== null && rhsValue !== null) { if (isFinite(lhsValue) && Number.isInteger(lhsValue) && lhsValue >= 0 && lhsValue <= 1e3 && isFinite(rhsValue[0]) && isFinite(rhsValue[1]) && rhsValue[0] > 0 && rhsValue[0] <= 100 && rhsValue[1] <= 100) { result = joinLatex([ serializer.serialize(lhs), serializer.options.invisiblePlus, serializer.serialize(rhs) ]); serializer.level += 1; return result; } } } let val = (_a = machineValue(arg)) != null ? _a : NaN; result = serializer.serialize(arg); const last = nops(expr) + 1; for (let i = 2; i < last; i++) { arg = op(expr, i); val = (_b = machineValue(arg)) != null ? _b : NaN; if (val < 0) { result += serializer.serialize(arg); } else if (head(arg) === "Negate") { result += serializer.wrap(arg, 275); } else { const term = serializer.wrap(arg, 275); if (term[0] === "-" || term[0] === "+") result += term; else result += "+" + term; } } } else if (name === "Subtract") { result = serializer.wrap(arg, 275); const arg2 = op(expr, 2); if (arg2 !== null) { const term = serializer.wrap(arg2, 275); if (term[0] === "-") result += "+" + term.slice(1); else if (term[0] === "+") result += "-" + term.slice(1); else result = result + "-" + term; } } serializer.level += 1; return result; } function serializeMultiply(serializer, expr) { var _a; if (expr === null) return ""; serializer.level -= 1; let result = ""; if (serializer.canonical === true) { const [numer, denom] = numeratorDenominator(expr); if (denom.length > 0) { if (denom.length === 1 && denom[0] === 1) { if (numer.length === 0) result = "1"; else if (numer.length === 1) result = serializer.serialize(numer[0]); else result = serializeMultiply(serializer, ["Multiply", ...numer]); } else { result = serializer.serialize([ "Divide", numer.length === 1 ? numer[0] : ["Multiply", ...numer], denom.length === 1 ? denom[0] : ["Multiply", ...denom] ]); } } } if (result) { serializer.level += 1; return result; } let isNegative = false; let arg = null; const count = nops(expr) + 1; let prevWasNumber = false; for (let i = 1; i < count; i++) { arg = op(expr, i); if (arg === null) continue; let term; if (isNumberExpression(arg)) { term = serializer.serialize(arg); if (term === "-1" && !result) { result = ""; isNegative = !isNegative; } else { if (term[0] === "-") { term = term.slice(1); isNegative = !isNegative; } result = !result ? term : joinLatex([result, serializer.options.multiply, term]); } prevWasNumber = true; continue; } if (head(arg) === "Power") { const r = rationalValue(op(arg, 2)); if (r) { const [n, d] = r; if (n === 1 && d !== null) { result += serializeRoot( serializer, getRootStyle(arg, serializer.level), op(arg, 1), d ); prevWasNumber = false; continue; } } } if (head(arg) === "Power" && !isNaN((_a = machineValue(op(arg, 1))) != null ? _a : NaN)) { term = serializer.serialize(arg); result = !result ? term : joinLatex([result, serializer.options.multiply, term]); prevWasNumber = true; continue; } if (head(arg) === "Negate") { arg = op(arg, 1); isNegative = !isNegative; } term = serializer.wrap(arg, 390); if (!result) { result = term; } else { const h = head(arg); if (prevWasNumber && (h === "Divide" || h === "Rational")) { result = joinLatex([result, serializer.options.multiply, term]); } else if (!serializer.options.invisibleMultiply) { result = joinLatex([result, term]); } else { result = joinLatex([ result, serializer.options.invisibleMultiply, term ]); } } prevWasNumber = false; } serializer.level += 1; return isNegative ? "-" + result : result; } function parseFraction(parser) { var _a, _b; let numer = parser.parseGroup(); let denom = null; if (numer === null) { numer = parser.parseToken(); denom = parser.parseToken(); } else { denom = parser.parseGroup(); } numer = missingIfEmpty(numer); denom = missingIfEmpty(denom); if (head(numer) === "PartialDerivative" && (head(denom) === "PartialDerivative" || head(denom) === "Multiply" && head(op(denom, 1)) === "PartialDerivative")) { const degree = (_a = op(numer, 3)) != null ? _a : null; let fn = op(numer, 1); if (fn === null) fn = missingIfEmpty(parser.parseExpression()); let vars = []; if (head(denom) === "Multiply") { for (const arg of (_b = ops(denom)) != null ? _b : []) { if (head(arg) === "PartialDerivative") { const v = op(arg, 2); if (v) vars.push(v); } } } else { const v = op(denom, 2); if (v) vars.push(v); } if (vars.length > 1) { vars = ["List", ...vars]; } return ["PartialDerivative", fn, ...vars, degree === null ? 1 : degree]; } return ["Divide", numer, denom]; } function serializeFraction(serializer, expr) { if (expr === null) return ""; const numer = missingIfEmpty(op(expr, 1)); const denom = missingIfEmpty(op(expr, 2)); const style = serializer.canonical ? getFractionStyle(expr, serializer.level) : "quotient"; if (style === "inline-solidus" || style === "nice-solidus") { const numerStr = serializer.wrapShort(numer); const denomStr = serializer.wrapShort(denom); if (style === "inline-solidus") return `${numerStr}\\/${denomStr}`; return `{}^{${numerStr}}\\!\\!/\\!{}_{${denomStr}}`; } else if (style === "reciprocal") { if (machineValue(numer) === 1) return serializer.wrap(denom) + "^{-1}"; return serializer.wrap(numer) + serializer.wrap(denom) + "^{-1}"; } else if (style === "factor") { if (machineValue(denom) === 1) return serializer.wrap(numer); return "\\frac{1}{" + serializer.serialize(denom) + "}{" + serializer.wrap(numer) + "}"; } const numerLatex = serializer.serialize(numer); const denomLatex = serializer.serialize(denom); return `\\frac{${numerLatex}}{${denomLatex}}`; } function serializePower(serializer, expr) { var _a; const name = head(expr); const base = missingIfEmpty(op(expr, 1)); if (name === "Sqrt") { return serializeRoot( serializer, getRootStyle(expr, serializer.level - 1), base, 2 ); } const exp2 = missingIfEmpty(op(expr, 2)); if (name === "Root") return serializeRoot( serializer, getRootStyle(expr, serializer.level - 1), base, exp2 ); if (serializer.canonical) { const val2 = (_a = machineValue(exp2)) != null ? _a : 1; if (val2 === -1) { return serializer.serialize(["Divide", "1", base]); } else if (val2 < 0) { return serializer.serialize(["Divide", "1", ["Power", base, -val2]]); } else if (head(exp2) === "Divide" || head(exp2) === "Rational") { if (machineValue(op(exp2, 1)) === 1) { const style = getRootStyle(expr, serializer.level); return serializeRoot(serializer, style, base, op(exp2, 2)); } if (machineValue(op(exp2, 2)) === 2) { return `${serializer.serialize(["Sqrt", base])}^{${serializer.serialize( op(exp2, 1) )}}`; } } else if (head(exp2) === "Power") { if (machineValue(op(exp2, 2)) === -1) { const style = getRootStyle(expr, serializer.level); return serializeRoot(serializer, style, base, op(exp2, 1)); } } } return serializer.wrapShort(base) + "^{" + serializer.serialize(exp2) + "}"; } var DEFINITIONS_ARITHMETIC = [ // Constants { name: "CatalanConstant", serialize: "G" }, { name: "GoldenRatio", serialize: "\\varphi" }, { name: "EulerGamma", serialize: "\\gamma" }, { name: "Degrees", latexTrigger: ["\\degree"], kind: "postfix", precedence: 880, parse: (_parser, lhs) => ["Degrees", lhs], serialize: (serializer, expr) => { return joinLatex([serializer.serialize(op(expr, 1)), "\\degree"]); } }, { latexTrigger: ["\\degree"], kind: "postfix", precedence: 880, parse: (_parser, lhs) => ["Degrees", lhs] }, { latexTrigger: ["^", "<{>", "\\circ", "<}>"], kind: "postfix", parse: (_parser, lhs) => ["Degrees", lhs] }, { latexTrigger: ["^", "\\circ"], kind: "postfix", parse: (_parser, lhs) => ["Degrees", lhs] }, { latexTrigger: ["\xB0"], kind: "postfix", precedence: 880, parse: (_parser, lhs) => ["Degrees", lhs] }, { latexTrigger: ["\\ang"], parse: (parser) => { const arg = parser.parseGroup(); return arg === null ? ["Degrees"] : ["Degrees", arg]; } }, { latexTrigger: ["\\infty"], parse: { num: "+Infinity" } }, { name: "ComplexInfinity", latexTrigger: ["\\tilde", "\\infty"], serialize: "\\tilde\\infty" }, { latexTrigger: ["\\tilde", "<{>", "\\infty", "<}>"], parse: "ComplexInfinity" }, { name: "Pi", kind: "symbol", latexTrigger: ["\\pi"] }, { latexTrigger: ["\u03C0"], parse: "Pi" }, { name: "ExponentialE", latexTrigger: ["\\exponentialE"], parse: "ExponentialE", serialize: "\\exponentialE" }, { latexTrigger: "\\operatorname{e}", parse: "ExponentialE" }, { latexTrigger: "\\mathrm{e}", parse: "ExponentialE" }, { kind: "function", identifierTrigger: "exp", parse: "Exp" }, { latexTrigger: "\\exp", parse: "Exp" }, { name: "ImaginaryUnit", latexTrigger: ["\\imaginaryI"] }, { latexTrigger: "\\operatorname{i}", parse: "ImaginaryUnit" }, { latexTrigger: "\\mathrm{i}", parse: "ImaginaryUnit" }, // Operations { /** Could be the determinant if the argument is a matrix */ /** @todo: domain check */ /** If a literal matrix, the `serialize` should be custom, the parens are * replaced with bars */ name: "Abs", kind: "matchfix", openTrigger: "|", closeTrigger: "|", parse: (_parser, body) => isEmptySequence(body) ? null : ["Abs", body] }, { identifierTrigger: "abs", kind: "function", parse: "Abs" }, { name: "Add", latexTrigger: ["+"], kind: "infix", associativity: "both", precedence: 275, parse: (parser, lhs, until) => { if (until && 275 < until.minPrec) return null; const rhs = parser.parseExpression({ ...until, minPrec: 275 }); if (rhs === null) return null; return applyAssociativeOperator("Add", lhs, rhs); }, serialize: serializeAdd }, { kind: "prefix", latexTrigger: ["+"], precedence: 275, parse: (parser, until) => { if (until && 275 < until.minPrec) return null; return parser.parseExpression({ ...until, minPrec: 400 }); } }, { name: "Ceil", kind: "matchfix", openTrigger: "\\lceil", closeTrigger: "\\rceil", parse: (_parser, body) => isEmptySequence(body) ? null : ["Ceil", body] }, { kind: "matchfix", openTrigger: ["\u2308"], closeTrigger: ["\u2309"], parse: (_parser, body) => isEmptySequence(body) ? null : ["Ceil", body] }, { identifierTrigger: "ceil", kind: "function", parse: "Ceil" }, { name: "Chop", identifierTrigger: "chop", kind: "function", parse: "Chop" }, { name: "Complex", precedence: 274, // One less than precedence of `Add`: used for correct wrapping serialize: (serializer, expr) => { const re = machineValue(op(expr, 1)); const im = machineValue(op(expr, 2)); if (im === 0) return serializer.serialize(op(expr, 1)); const imPart = im === 1 ? "\\imaginaryI" : im === -1 ? "-\\imaginaryI" : joinLatex([serializer.serialize(op(expr, 2)), "\\imaginaryI"]); if (re === 0) return imPart; if (im !== null && im < 0) return joinLatex([serializer.serialize(op(expr, 1)), imPart]); return joinLatex([serializer.serialize(op(expr, 1)), "+", imPart]); } }, { name: "Divide", latexTrigger: "\\frac", precedence: 660, // For \frac specifically, not for \div, etc.. // handles Leibnitz notation for partial derivatives parse: parseFraction, serialize: serializeFraction }, { kind: "infix", latexTrigger: "\\over", precedence: 660, parse: "Divide" }, { latexTrigger: ["\\/"], kind: "infix", associativity: "non", precedence: 660, // ??? MathML has 265, but it's wrong. // It has to be at least higher than multiply // e.g. `1/2+3*x` -> `1/2 + 3*x` , not `1/(2+3*x)` parse: "Divide" }, { latexTrigger: ["/"], kind: "infix", associativity: "non", precedence: 660, parse: "Divide" }, { latexTrigger: ["\\div"], kind: "infix", associativity: "non", precedence: 660, // ??? according to MathML parse: "Divide" }, { name: "Exp", serialize: (serializer, expr) => { const op12 = op(expr, 1); if (symbol(op12) || machineValue(op12) !== null) return joinLatex(["\\exponentialE^{", serializer.serialize(op12)]); return joinLatex(["\\exp", serializer.wrap(missingIfEmpty(op12))]); } }, { name: "Factorial", latexTrigger: ["!"], kind: "postfix", precedence: 810 }, { name: "Factorial2", latexTrigger: ["!", "!"], kind: "postfix", precedence: 810 }, { name: "Floor", kind: "matchfix", openTrigger: "\\lfloor", closeTrigger: "\\rfloor", parse: (_parser, body) => isEmptySequence(body) ? null : ["Floor", body] }, { kind: "matchfix", openTrigger: ["\u230A"], closeTrigger: ["\u230B"], parse: (_parser, body) => isEmptySequence(body) ? null : ["Floor", body] }, { identifierTrigger: "floor", kind: "function", parse: "Floor" }, { latexTrigger: ["\\Gamma"], parse: "Gamma" }, { name: "Gcd", identifierTrigger: "gcd", kind: "function" }, { name: "Half", serialize: "\\frac12" }, { name: "Lg", latexTrigger: ["\\lg"], serialize: (serializer, expr) => "\\log_{10}" + serializer.wrapArguments(expr), parse: (parser) => { const args = parser.parseArguments("implicit"); if (args === null) return "Lg"; return ["Log", ...args, 10]; } }, { name: "Lb", latexTrigger: "\\lb", parse: (parser) => { const args = parser.parseArguments("implicit"); if (args === null) return "Log"; return ["Log", ...args, 2]; } }, { name: "Ln", latexTrigger: ["\\ln"], serialize: (serializer, expr) => "\\ln" + serializer.wrapArguments(expr), parse: (parser) => parseLog("Ln", parser) }, { name: "Log", latexTrigger: ["\\log"], parse: (parser) => parseLog("Log", parser), serialize: (serializer, expr) => { const base = op2(expr); if (base) return joinLatex([ "\\log_{", base.toString(), "}", serializer.wrap(op1(expr)) ]); return "\\log" + serializer.wrapArguments(expr); } }, { name: "Lcm", identifierTrigger: "lcm", kind: "function" }, { name: "Max", identifierTrigger: "max", kind: "function" }, { name: "Min", identifierTrigger: "min", kind: "function" }, { name: "MinusPlus", latexTrigger: ["\\mp"], kind: "infix", associativity: "both", precedence: 270 }, { name: "Multiply", latexTrigger: ["\\times"], kind: "infix", associativity: "both", precedence: 390, serialize: serializeMultiply }, { latexTrigger: ["\\cdot"], kind: "infix", associativity: "both", precedence: 390, parse: (parser, lhs, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 392 }); if (rhs === null) return ["Multiply", lhs, MISSING]; return applyAssociativeOperator("Multiply", lhs, rhs); } }, { latexTrigger: ["*"], kind: "infix", associativity: "both", precedence: 390, parse: (parser, lhs, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 392 }); if (rhs === null) return ["Multiply", lhs, MISSING]; return applyAssociativeOperator("Multiply", lhs, rhs); } }, { name: "Negate", latexTrigger: ["-"], kind: "prefix", parse: (parser, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); return ["Negate", missingIfEmpty(rhs)]; }, precedence: 275 }, // { // /** If the argument is a vector */ // /** @todo: domain check */ // name: 'Norm', // kind: 'matchfix', // openDelimiter: '|', // closeDelimiter: '|', // }, // { // /** If the argument is a set */ // /** @todo: domain check */ // name: 'Cardinality', // kind: 'matchfix', // openDelimiter: '|', // closeDelimiter: '|', // }, { // /** If the argument is a vector */ /** @todo: domain check */ kind: "matchfix", openTrigger: "||", closeTrigger: "||", parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Norm", expr] }, { // /** If the argument is a vector */ /** @todo: domain check */ name: "Norm", kind: "matchfix", openTrigger: ["\\left", "\\Vert"], closeTrigger: ["\\right", "\\Vert"], parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Norm", expr] }, { name: "PlusMinus", latexTrigger: ["\\pm"], kind: "infix", associativity: "both", precedence: 270, serialize: (serializer, expr) => { const op12 = op(expr, 1); if (op12 === null) return "\\pm"; if (nops(expr) === 1) return joinLatex(["\\pm", serializer.serialize(op12)]); const op22 = op(expr, 2); return joinLatex([ serializer.serialize(op12), "\\pm", serializer.serialize(op22) ]); } }, { latexTrigger: ["\\pm"], kind: "prefix", precedence: 270, parse: (parser, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); return ["PlusMinus", missingIfEmpty(rhs)]; } }, { latexTrigger: ["\\plusmn"], kind: "infix", associativity: "both", precedence: 270, parse: (parser, lhs, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); return ["PlusMinus", lhs, missingIfEmpty(rhs)]; } }, { latexTrigger: ["\\plusmn"], kind: "prefix", precedence: 270, parse: (parser, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 400 }); return ["PlusMinus", missingIfEmpty(rhs)]; } }, { name: "Power", latexTrigger: ["^"], kind: "infix", serialize: serializePower }, { latexTrigger: "\\prod", precedence: 390, name: "Product", parse: parseBigOp("Product", 390), serialize: serializeBigOp("\\prod") }, // { // trigger: ['*', '*'], // kind: 'infix', // associativity: 'non', // precedence: 720, // }, { name: "Rational", precedence: 660, serialize: (serializer, expr) => { if (expr && nops(expr) === 1) return "\\operatorname{Rational}" + serializer.wrapArguments(expr); return serializeFraction(serializer, expr); } }, { name: "Root", serialize: serializePower }, { name: "Round", identifierTrigger: "round", kind: "function" }, { name: "Square", precedence: 720, serialize: (serializer, expr) => serializer.wrapShort(op(expr, 1)) + "^2" }, { latexTrigger: ["\\sum"], precedence: 275, name: "Sum", parse: parseBigOp("Sum", 275), serialize: serializeBigOp("\\sum") }, { name: "Sign", // As per ISO 80000-2, "signum" is 'sgn' identifierTrigger: "sgn", kind: "function" }, { name: "Sqrt", latexTrigger: ["\\sqrt"], parse: parseRoot, serialize: serializePower }, { name: "Subtract", latexTrigger: ["-"], kind: "infix", associativity: "both", precedence: 275, parse: (parser, lhs, terminator) => { const rhs = parser.parseExpression({ ...terminator, minPrec: 277 }); return ["Subtract", lhs, missingIfEmpty(rhs)]; } } ]; function parseBigOp(name, prec) { return (parser) => { var _a, _b, _c, _d; parser.skipSpace(); let sup = null; let sub2 = null; while (!(sub2 && sup) && (parser.peek === "_" || parser.peek === "^")) { if (parser.match("_")) sub2 = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); else if (parser.match("^")) sup = (_b = parser.parseGroup()) != null ? _b : parser.parseToken(); parser.skipSpace(); } if (sub2 === "Nothing" || isEmptySequence(sub2)) sub2 = null; if (sup === "Nothing" || isEmptySequence(sup)) sup = null; let index = null; let lower = null; if (head(sub2) === "Equal") { index = op(sub2, 1); lower = op(sub2, 2); } else { index = sub2; } const sym = symbol(index); if (sym) (_c = parser.computeEngine) == null ? void 0 : _c.pushScope({ [sym]: { domain: "Integer" } }); const fn = parser.parseExpression({ minPrec: prec + 1 }); if (sym) (_d = parser.computeEngine) == null ? void 0 : _d.popScope(); if (!fn) return [name]; if (sup) return [ name, fn, ["Tuple", index ? ["Hold", index] : "Nothing", lower != null ? lower : 1, sup] ]; if (lower) return [name, fn, ["Tuple", index ? ["Hold", index] : "Nothing", lower]]; if (index) return [name, fn, ["Tuple", ["Hold", index]]]; return [name, fn]; }; } function serializeBigOp(command) { return (serializer, expr) => { if (!op(expr, 1)) return command; let arg = op(expr, 2); const h = head(arg); if (h !== "Tuple" && h !== "Triple" && h !== "Pair" && h !== "Single") arg = null; let index = op(arg, 1); if (index && head(index) === "Hold") index = op(index, 1); const fn = op(expr, 1); if (!arg) { if (!op(expr, 2)) return joinLatex([command, "_n", serializer.serialize(fn)]); return joinLatex([ command, "_{", serializer.serialize(op(expr, 2)), "}", serializer.serialize(fn) ]); } const lower = op(arg, 2); let sub2 = []; if (index && symbol(index) !== "Nothing" && lower) sub2 = [serializer.serialize(index), "=", serializer.serialize(lower)]; else if (index && symbol(index) !== "Nothing") sub2 = [serializer.serialize(index)]; else if (lower) sub2 = [serializer.serialize(lower)]; if (sub2.length > 0) sub2 = ["_{", ...sub2, "}"]; let sup = []; if (op(arg, 3)) sup = ["^{", serializer.serialize(op(arg, 3)), "}"]; return joinLatex([command, ...sup, ...sub2, serializer.serialize(fn)]); }; } function parseLog(command, parser) { var _a, _b; let sub2 = null; let base = null; if (parser.match("_")) { sub2 = (_b = (_a = parser.parseStringGroup()) == null ? void 0 : _a.trim()) != null ? _b : parser.nextToken(); base = Number.parseFloat(sub2 != null ? sub2 : "10"); } const args = parser.parseArguments("implicit"); if (args === null) return [command]; if (base === 10) return ["Log", args[0]]; if (base === 2) return ["Lb", ...args]; if (sub2 === null) return [command, ...args]; return ["Log", ...args, sub2]; } function parseSequence(parser, terminator, lhs, prec, sep) { /* @__PURE__ */ console.assert(lhs !== null); if (terminator.minPrec >= prec) return null; const result = [lhs]; let done = false; while (!done) { done = true; parser.skipSpace(); while (parser.match(sep)) { result.push("Nothing"); parser.skipSpace(); } if (parser.atTerminator(terminator)) { result.push("Nothing"); } else { const rhs = parser.parseExpression({ ...terminator, minPrec: prec }); result.push(rhs != null ? rhs : "Nothing"); done = rhs === null; } if (!done) { parser.skipSpace(); done = !parser.match(sep); } } return result; } function serializeOps(sep = "") { return (serializer, expr) => { var _a; return ((_a = ops(expr)) != null ? _a : []).map((x) => serializer.serialize(x)).join(sep); }; } var DEFINITIONS_CORE = [ // // Constants // { latexTrigger: ["\\placeholder"], kind: "symbol", parse: (parser) => { while (parser.match("")) { } if (parser.match("[")) while (!parser.match("]") && !parser.atBoundary) parser.nextToken(); while (parser.match("")) { } if (parser.match("<{>")) while (!parser.match("<}>") && !parser.atBoundary) parser.nextToken(); return "Nothing"; } }, // // Functions // { name: "Apply", kind: "function", identifierTrigger: "apply", serialize: (serializer, expr) => serializer.serializeFunction(ops(expr)) }, { latexTrigger: "\\rhd", kind: "infix", precedence: 20, parse: "Apply" }, { latexTrigger: "\\lhd", kind: "infix", precedence: 20, parse: (parser, lhs) => { var _a; const rhs = (_a = parser.parseExpression({ minPrec: 20 })) != null ? _a : "Nothing"; return ["Apply", rhs, lhs]; } }, { name: "BaseForm", serialize: (serializer, expr) => { var _a, _b; const radix = (_a = machineValue(op(expr, 2))) != null ? _a : NaN; if (isFinite(radix) && radix >= 2 && radix <= 36) { const num = (_b = machineValue(op(expr, 1))) != null ? _b : NaN; if (isFinite(num) && Number.isInteger(num)) { let digits = Number(num).toString(radix); let groupLength = 0; if (radix === 2) { groupLength = 4; } else if (radix === 10) { groupLength = 4; } else if (radix === 16) { groupLength = 2; } else if (radix > 16) { groupLength = 4; } if (groupLength > 0) { const oldDigits = digits; digits = ""; for (let i = 0; i < oldDigits.length; i++) { if (i > 0 && i % groupLength === 0) digits = "\\, " + digits; digits = oldDigits[oldDigits.length - i - 1] + digits; } } return `(\\text{${digits}}_{${radix}}`; } } return "\\operatorname{BaseForm}(" + serializer.serialize(op(expr, 1)) + ", " + serializer.serialize(op(expr, 2)) + ")"; } }, { name: "Delimiter", serialize: (serializer, expr) => { var _a, _b, _c, _d, _e, _f, _g, _h; const argCount = nops(expr); if (argCount === 0) return ""; const style = serializer.options.groupStyle(expr, serializer.level + 1); const arg1 = op(expr, 1); const h1 = head(arg1); const defaultFence = (_a = { List: "[],", Sequence: "" }[typeof h1 === "string" ? h1 : ""]) != null ? _a : "(),"; let open = (_b = defaultFence[0]) != null ? _b : ""; let close = (_c = defaultFence[1]) != null ? _c : ""; let sep = (_d = defaultFence[2]) != null ? _d : ""; if (argCount > 1) { const op22 = (_e = stringValue(op(expr, 2))) != null ? _e : ""; open = (_f = op22[0]) != null ? _f : defaultFence[0]; close = (_g = op22[1]) != null ? _g : defaultFence[1]; sep = (_h = op22[2]) != null ? _h : defaultFence[2]; } const body = isListLike(arg1) ? serializeOps(sep)(serializer, arg1) : serializer.serialize(arg1); return serializer.wrapString(body, style, open + close); } }, { name: "Domain", serialize: (serializer, expr) => { if (head(expr) === "Error") return serializer.serialize(expr); return `\\mathbf{${serializer.serialize(op(expr, 1))}}`; } }, { latexTrigger: ["\\mathtip"], parse: (parser) => { const op12 = parser.parseGroup(); const op22 = parser.parseGroup(); return op12; } }, { latexTrigger: ["\\texttip"], parse: (parser) => { const op12 = parser.parseGroup(); const op22 = parser.parseGroup(); return op12; } }, { latexTrigger: ["\\error"], parse: (parser) => ["Error", parser.parseGroup()] }, { name: "Error", serialize: (serializer, expr) => { var _a; if (stringValue(op(expr, 1)) === "missing") return `\\error{${(_a = serializer.options.missingSymbol) != null ? _a : "\\placeholder{}"}}`; const where = errorContextAsLatex(serializer, expr) || "\\blacksquare"; const op12 = op(expr, 1); const code = head(op12) === "ErrorCode" ? stringValue(op(op12, 1)) : stringValue(op12); if (code === "incompatible-domain") { return `\\mathtip{\\error{${where}}}{\\in ${serializer.serialize( op(op12, 3) )}\\notin ${serializer.serialize(op(op12, 2))}}`; } if (typeof code === "string") return `\\error{${where}}`; return `\\error{${where}}`; } }, { name: "ErrorCode", serialize: (serializer, expr) => { var _a; const code = stringValue(op(expr, 1)); if (code === "missing") return (_a = serializer.options.missingSymbol) != null ? _a : "\\placeholder{}"; if (code === "unexpected-command" || code === "unexpected-operator" || code === "unexpected-token" || code === "invalid-identifier" || code === "unknown-environment" || code === "unexpected-base" || code === "incompatible-domain" || code === "invalid-domain") { return ""; } return `\\texttip{\\error{\\blacksquare}}{\\mathtt{${code}}}`; } }, { name: "FromLatex", serialize: (_serializer, expr) => { return `\\texttt{${sanitizeLatex(stringValue(op(expr, 1)))}}`; } }, { name: "Latex", serialize: (serializer, expr) => { if (expr === null) return ""; return joinLatex( mapArgs(expr, (x) => { var _a; return (_a = stringValue(x)) != null ? _a : serializer.serialize(x); }) ); } }, { name: "LatexString", serialize: (serializer, expr) => { if (expr === null) return ""; return joinLatex(mapArgs(expr, (x) => serializer.serialize(x))); } }, { name: "LatexTokens", serialize: serializeLatexTokens }, { name: "List", kind: "matchfix", openTrigger: "\\lbrack", closeTrigger: "\\rbrack", parse: parseList, serialize: (serializer, expr) => { return joinLatex([ "\\lbrack", serializeOps(", ")(serializer, expr), "\\rbrack" ]); } }, // Synonyms for List { kind: "matchfix", openTrigger: "[", closeTrigger: "]", parse: parseList }, { kind: "matchfix", openTrigger: "\\[", closeTrigger: "\\]", parse: parseList }, // Synonyms for Delimiter { kind: "matchfix", openTrigger: "(", closeTrigger: ")", parse: parseDelimiter }, { kind: "matchfix", openTrigger: "\\lparen", closeTrigger: "\\rparen", parse: parseDelimiter }, { latexTrigger: [","], kind: "infix", precedence: 20, // Unlike the matchfix version of List, // when the comma operator is used, the lhs and rhs are flattened, // i.e. `1,2,3` -> `["Delimiter", ["List", 1, 2, 3], ","]`, // and `1, (2, 3)` -> `["Delimiter", // ["Sequence", 1, ["Delimiter", ["List", 2, 3], "()", ","]]], parse: (parser, lhs, terminator) => { const seq = parseSequence(parser, terminator, lhs, 20, ","); if (seq === null) return null; return ["Sequence", ...seq]; } }, { name: "Sequence", serialize: serializeOps("") }, { latexTrigger: [";"], kind: "infix", precedence: 19, parse: (parser, lhs, terminator) => { const seq = parseSequence(parser, terminator, lhs, 19, ";"); if (seq === null) return null; return [ "Sequence", ...seq.map( (x) => { var _a; return head(x) === "Sequence" ? ["List", ...(_a = ops(x)) != null ? _a : []] : x; } ) ]; } }, { name: "String", latexTrigger: ["\\text"], parse: (scanner) => parseTextRun(scanner), serialize: (serializer, expr) => { const args = ops(expr); if (args === null || args.length === 0) return "\\text{}"; return joinLatex([ "\\text{", args.map((x) => serializer.serialize(x)).join(""), "}" ]); } }, { name: "Subscript", latexTrigger: ["_"], kind: "infix", serialize: (serializer, expr) => { if (nops(expr) === 2) { return serializer.serialize(op(expr, 1)) + "_{" + serializer.serialize(op(expr, 2)) + "}"; } return "_{" + serializer.serialize(op(expr, 1)) + "}"; } }, { name: "Superplus", latexTrigger: ["^", "+"], kind: "postfix" }, { name: "Subplus", latexTrigger: ["_", "+"], kind: "postfix" }, { name: "Superminus", latexTrigger: ["^", "-"], kind: "postfix" }, { name: "Subminus", latexTrigger: ["_", "-"], kind: "postfix" }, { latexTrigger: ["^", "*"], kind: "postfix", parse: (_parser, lhs) => ["Superstar", lhs] }, // { name: 'Superstar', latexTrigger: ['^', '\\star'], kind: 'postfix' }, { latexTrigger: ["_", "*"], kind: "postfix", parse: (_parser, lhs) => ["Substar", lhs] }, { name: "Substar", latexTrigger: ["_", "\\star"], kind: "postfix" }, { name: "Superdagger", latexTrigger: ["^", "\\dagger"], kind: "postfix" }, { latexTrigger: ["^", "\\dag"], kind: "postfix", parse: (_parser, lhs) => ["Superdagger", lhs] }, { name: "Prime", latexTrigger: ["^", "\\prime"], // Note: we don't need a precedence because the trigger is '^' // and '^' (and '_') are treated specially by the parser. kind: "postfix", parse: (parser, lhs) => parsePrime(parser, lhs, 1), serialize: (serializer, expr) => { var _a; const n2 = (_a = machineValue(op(expr, 2))) != null ? _a : 1; const base = serializer.serialize(op(expr, 1)); if (n2 === 1) return base + "^\\prime"; if (n2 === 2) return base + "^\\doubleprime"; if (n2 === 3) return base + "^\\tripleprime"; return base + "^{(" + serializer.serialize(op(expr, 2)) + ")}"; } }, { latexTrigger: "^{\\prime\\prime}", kind: "postfix", parse: (parser, lhs) => parsePrime(parser, lhs, 2) }, { latexTrigger: "^{\\prime\\prime\\prime}", kind: "postfix", parse: (parser, lhs) => parsePrime(parser, lhs, 3) }, { latexTrigger: ["^", "\\doubleprime"], kind: "postfix", parse: (parser, lhs) => parsePrime(parser, lhs, 2) }, { latexTrigger: ["^", "\\tripleprime"], kind: "postfix", parse: (parser, lhs) => parsePrime(parser, lhs, 3) }, { latexTrigger: "'", kind: "postfix", precedence: 810, parse: (parser, lhs) => parsePrime(parser, lhs, 1) }, { latexTrigger: "\\prime", kind: "postfix", precedence: 810, parse: (parser, lhs) => parsePrime(parser, lhs, 1) }, { latexTrigger: "\\doubleprime", kind: "postfix", precedence: 810, parse: (parser, lhs) => parsePrime(parser, lhs, 2) }, { latexTrigger: "\\tripleprime", kind: "postfix", precedence: 810, parse: (parser, lhs) => parsePrime(parser, lhs, 3) }, { latexTrigger: ["^", "<{>", "("], kind: "postfix", parse: (parser, lhs) => { var _a, _b; if (!((_b = (_a = parser.computeEngine) == null ? void 0 : _a.box(lhs)) == null ? void 0 : _b.domain.isFunction)) return null; const start = parser.index; parser.addBoundary([")"]); const expr = parser.parseExpression(); if (!parser.matchBoundary()) { parser.index = start; return null; } if (!parser.match("<}>")) { parser.index = start; return null; } return ["Derivative", lhs, expr]; } }, { name: "InverseFunction", latexTrigger: "^{-1}", kind: "postfix", parse: (parser, lhs) => { var _a, _b; if ((_b = (_a = parser.computeEngine) == null ? void 0 : _a.box(lhs)) == null ? void 0 : _b.domain.isFunction) return ["InverseFunction", lhs]; return ["Power", missingIfEmpty(lhs), -1]; }, serialize: (serializer, expr) => serializer.serialize(op(expr, 1)) + "^{-1}" }, { name: "Derivative", serialize: (serializer, expr) => { var _a; const degree = (_a = machineValue(op(expr, 2))) != null ? _a : 1; const base = serializer.serialize(op(expr, 1)); if (degree === 1) return base + "^{\\prime}"; if (degree === 2) return base + "^{\\doubleprime}"; if (degree === 3) return base + "^{\\tripleprime}"; return base + "^{(" + serializer.serialize(op(expr, 2)) + ")}"; } }, { kind: "environment", name: "Which", identifierTrigger: "cases", parse: (parser) => { var _a; const tabular = parser.parseTabular(); if (!tabular) return ["Which"]; const result = ["Which"]; for (const row of tabular) { if (row.length === 1) { result.push("True"); result.push(row[0]); } else if (row.length === 2) { const s = stringValue(row[1]); result.push(s ? "True" : (_a = stripText(row[1])) != null ? _a : "True"); result.push(row[0]); } } return result; }, serialize: (serialize2, expr) => { const rows = []; const args = ops(expr); if (args) { for (let i = 0; i <= args.length - 2; i += 2) { const row = []; row.push(serialize2.serialize(args[i + 1])); row.push(serialize2.serialize(args[i])); rows.push(row.join("&")); } } return joinLatex(["\\begin{cases}", rows.join("\\\\"), "\\end{cases}"]); } } ]; function parseTextRun(parser, style) { var _a, _b, _c; if (!parser.match("<{>")) return "''"; const runs = []; let text = ""; let runinStyle = null; while (!parser.atEnd && !parser.match("<}>")) { if (parser.peek === "<{>") { runs.push(parseTextRun(parser)); } else if (parser.match("\\textbf") && parser.match("<{>")) { runs.push(parseTextRun(parser, { "font-weight": "bold" })); } else if (parser.match("\\color")) { const color = parser.parseStringGroup(); if (color !== null) { if (runinStyle !== null && text) { runs.push(["Style", text, { dict: runinStyle }]); } else if (text) { runs.push(["String", text]); } text = ""; runinStyle = { color }; } } else if (parser.match("")) { text += " "; } else if (parser.match("<$>")) { const index = parser.index; const expr = (_a = parser.parseExpression()) != null ? _a : ["Sequence"]; parser.skipSpace(); if (parser.match("<$>")) { runs.push(expr); } else { text += "$"; parser.index = index; } } else if (parser.match("<$$>")) { const index = parser.index; const expr = (_b = parser.parseExpression()) != null ? _b : ["Sequence"]; parser.skipSpace(); if (parser.match("<$$>")) { runs.push(expr); } else { text += "$$"; parser.index = index; } } else text += (_c = parser.matchChar()) != null ? _c : parser.nextToken(); } if (runinStyle !== null && text) { runs.push(["Style", `'${text}'`, { dict: runinStyle }]); } else if (text) { runs.push(`'${text}'`); } let body; if (runs.length === 1) body = runs[0]; else { if (runs.every((x) => stringValue(x) !== null)) body = "'" + runs.map((x) => stringValue(x)).join() + "'"; else body = ["String", ...runs]; } return style ? ["Style", body, { dict: style }] : body; } function serializeLatexTokens(serializer, expr) { if (expr === null) return ""; return joinLatex( mapArgs(expr, (x) => { const s = stringValue(x); if (s === null) return serializer.serialize(x); if (s === "<{>") return "{"; if (s === "<}>") return "}"; if (s === "<$>") return "$"; if (s === "<$$>") return "$$"; if (s === "") return " "; return s; }) ); } function sanitizeLatex(s) { if (s === null) return ""; return s.replace( /[{}\[\]\\:\-\$%]/g, (c) => { var _a; return (_a = { "{": "\\lbrace ", "}": "\\rbrace ", "[": "\\lbrack ", "]": "\\rbrack ", ":": "\\colon ", "\\": "\\backslash " }[c]) != null ? _a : "\\" + c; } ); } function errorContextAsLatex(serializer, error) { var _a; const arg = op(error, 2); if (!arg) return ""; if (head(arg) === "Latex") return `\\texttt{${sanitizeLatex((_a = stringValue(op(arg, 1))) != null ? _a : "")}}`; if (head(arg) === "Hold") return serializer.serialize(op(arg, 1)); return serializer.serialize(arg); } function parsePrime(parser, lhs, order2) { var _a, _b, _c; const lhsh = head(lhs); if (lhsh === "Derivative" || lhsh === "Prime") { const n = (_a = machineValue(op(lhs, 2))) != null ? _a : 1; return [lhsh, missingIfEmpty(op(lhs, 1)), n + order2]; } if ((_c = (_b = parser.computeEngine) == null ? void 0 : _b.box(lhs)) == null ? void 0 : _c.domain.isFunction) { if (order2 === 1) return ["Derivative", lhs]; return ["Derivative", lhs, order2]; } if (order2 === 1) return ["Prime", missingIfEmpty(lhs)]; return ["Prime", missingIfEmpty(lhs), order2]; } function parseDelimiter(parser, body) { var _a; if (body === null || isEmptySequence(body)) return ["Sequence"]; if (head(body) === "Sequence") { if (nops(body) === 0) return ["Delimiter"]; return ["Delimiter", ["Sequence", ...(_a = ops(body)) != null ? _a : []]]; } return ["Delimiter", body]; } function parseList(_parser, body) { var _a; if (body === null || isEmptySequence(body)) return ["List"]; if (head(body) !== "Sequence" && head(body) !== "List") return ["List", body]; return ["List", ...(_a = ops(body)) != null ? _a : []]; } var DEFINITIONS_INEQUALITIES = [ { latexTrigger: ["\\not", "<"], kind: "infix", associativity: "right", precedence: 246, parse: "NotLess" }, { name: "NotLess", latexTrigger: ["\\nless"], kind: "infix", associativity: "right", precedence: 246 }, { latexTrigger: ["<"], kind: "infix", associativity: "right", precedence: 245, parse: "Less" }, { name: "Less", latexTrigger: ["\\lt"], kind: "infix", associativity: "right", precedence: 245 }, { latexTrigger: ["<", "="], kind: "infix", associativity: "right", precedence: 241, parse: "LessEqual" }, { name: "LessEqual", latexTrigger: ["\\le"], kind: "infix", associativity: "right", precedence: 241 }, { latexTrigger: ["\\leq"], kind: "infix", associativity: "right", precedence: 241, parse: "LessEqual" }, { latexTrigger: ["\\leqslant"], kind: "infix", associativity: "right", precedence: 265, // Note different precedence than `<=` as per MathML parse: "LessEqual" }, { name: "LessNotEqual", latexTrigger: ["\\lneqq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "NotLessNotEqual", latexTrigger: ["\\nleqq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "LessOverEqual", latexTrigger: ["\\leqq"], kind: "infix", associativity: "right", precedence: 265 }, { name: "GreaterOverEqual", latexTrigger: ["\\geqq"], kind: "infix", associativity: "right", precedence: 265, parse: "GreaterEqual" }, { name: "Equal", latexTrigger: ["="], kind: "infix", associativity: "right", precedence: 260 }, { latexTrigger: ["*", "="], kind: "infix", associativity: "right", precedence: 260, parse: "StarEqual" }, { name: "StarEqual", latexTrigger: ["\\star", "="], kind: "infix", associativity: "right", precedence: 260 }, { name: "PlusEqual", latexTrigger: ["+", "="], kind: "infix", associativity: "right", precedence: 260 }, { name: "MinusEqual", latexTrigger: ["-", "="], kind: "infix", associativity: "right", precedence: 260 }, { name: "SlashEqual", latexTrigger: ["/", "="], kind: "infix", associativity: "right", precedence: 260 }, { name: "EqualEqual", latexTrigger: ["=", "="], kind: "infix", associativity: "right", precedence: 260 }, { name: "EqualEqualEqual", latexTrigger: ["=", "=", "="], kind: "infix", associativity: "right", precedence: 265 }, { name: "TildeFullEqual", // MathML: approximately equal to latexTrigger: ["\\cong"], kind: "infix", associativity: "right", precedence: 260 }, { name: "NotTildeFullEqual", // MathML: approximately but not actually equal to latexTrigger: ["\\ncong"], kind: "infix", associativity: "right", precedence: 260 }, { latexTrigger: [":", "="], kind: "infix", associativity: "right", precedence: 260, parse: "Assign" }, { name: "Assign", latexTrigger: ["\\coloneq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "Approx", // Note: Mathematica TildeTilde latexTrigger: ["\\approx"], kind: "infix", associativity: "right", precedence: 247 }, { name: "NotApprox", // Note: Mathematica TildeTilde latexTrigger: ["\\not", "\\approx"], kind: "infix", associativity: "right", precedence: 247 }, { name: "ApproxEqual", // Note: Mathematica TildeEqual, MathML: `asymptotically equal to` latexTrigger: ["\\approxeq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "NotApproxEqual", // Note: Mathematica NotTildeEqual latexTrigger: ["\\not", "\\approxeq"], kind: "infix", // Note: no LaTeX symbol for char U+2249 associativity: "right", precedence: 250 }, { name: "NotEqual", latexTrigger: ["\\ne"], kind: "infix", associativity: "right", precedence: 255 }, { name: "Unequal", latexTrigger: ["!", "="], kind: "infix", associativity: "right", precedence: 260 // Note different precendence than \\ne per MathML }, { name: "GreaterEqual", latexTrigger: ["\\ge"], kind: "infix", associativity: "right", precedence: 242 // Note: different precendence than `>=` as per MathML }, { latexTrigger: ["\\geq"], kind: "infix", associativity: "right", precedence: 242, // Note: different precendence than `>=` as per MathML parse: "GreaterEqual" }, { latexTrigger: [">", "="], kind: "infix", associativity: "right", precedence: 243, parse: "GreaterEqual" }, { latexTrigger: ["\\geqslant"], kind: "infix", associativity: "right", precedence: 265, // Note: different precendence than `>=` as per MathML parse: "GreaterEqual" }, { name: "GreaterNotEqual", latexTrigger: ["\\gneqq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "NotGreaterNotEqual", latexTrigger: ["\\ngeqq"], kind: "infix", associativity: "right", precedence: 260 }, { latexTrigger: [">"], kind: "infix", associativity: "right", precedence: 245, parse: "Greater" }, { name: "Greater", latexTrigger: ["\\gt"], kind: "infix", associativity: "right", precedence: 245 }, { name: "NotGreater", latexTrigger: ["\\ngtr"], kind: "infix", associativity: "right", precedence: 244 }, { latexTrigger: ["\\not", ">"], kind: "infix", associativity: "right", precedence: 244, parse: "NotGreater" }, { name: "RingEqual", latexTrigger: ["\\circeq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "TriangleEqual", // MathML: delta equal to latexTrigger: ["\\triangleq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "DotEqual", // MathML: approaches the limit latexTrigger: ["\\doteq"], kind: "infix", associativity: "right", precedence: 265 }, { name: "DotEqualDot", // MathML: Geometrically equal latexTrigger: ["\\doteqdot"], kind: "infix", associativity: "right", precedence: 265 }, { name: "FallingDotEqual", // MathML: approximately equal to or the image of latexTrigger: ["\\fallingdotseq"], kind: "infix", associativity: "right", precedence: 265 }, { name: "RisingDotEqual", // MathML: image of or approximately equal to latexTrigger: ["\\fallingdotseq"], kind: "infix", associativity: "right", precedence: 265 }, { name: "QuestionEqual", latexTrigger: ["\\questeq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "MuchLess", latexTrigger: ["\\ll"], kind: "infix", associativity: "right", precedence: 260 }, { name: "MuchGreater", latexTrigger: ["\\gg"], kind: "infix", associativity: "right", precedence: 260 }, { name: "Precedes", latexTrigger: ["\\prec"], kind: "infix", associativity: "right", precedence: 260 }, { name: "Succeeds", latexTrigger: ["\\succ"], kind: "infix", associativity: "right", precedence: 260 }, { name: "PrecedesEqual", latexTrigger: ["\\preccurlyeq"], kind: "infix", associativity: "right", precedence: 260 }, { name: "SucceedsEqual", latexTrigger: ["\\curlyeqprec"], kind: "infix", associativity: "right", precedence: 260 }, { name: "NotPrecedes", latexTrigger: ["\\nprec"], kind: "infix", associativity: "right", precedence: 260 }, { name: "NotSucceeds", latexTrigger: ["\\nsucc"], kind: "infix", associativity: "right", precedence: 260 }, { name: "Between", latexTrigger: ["\\between"], kind: "infix", associativity: "right", precedence: 265 } ]; var DEFINITIONS_LOGIC = [ // Constants { name: "True", kind: "symbol", latexTrigger: ["\\top"] // ⊤ U+22A4 }, { kind: "symbol", latexTrigger: "\\mathrm{True}", parse: "True" }, { kind: "symbol", latexTrigger: "\\operator{True}", parse: "True" }, { kind: "symbol", latexTrigger: "\\mathsf{T}", parse: "True" }, { name: "False", kind: "symbol", latexTrigger: ["\\bot"] // ⊥ U+22A5 }, { kind: "symbol", latexTrigger: "\\operator{False}", parse: "True" }, { kind: "symbol", latexTrigger: "\\mathsf{F}", parse: "True" }, { name: "Maybe", kind: "symbol", latexTrigger: "\\operatorname{Maybe}", serialize: "\\operatorname{Maybe}" }, { kind: "symbol", latexTrigger: "\\mathrm{Maybe}", parse: "Maybe" }, // Operators { name: "And", kind: "infix", latexTrigger: ["\\land"], precedence: 317 // serialize: '\\land', }, { kind: "infix", latexTrigger: ["\\wedge"], parse: "And", precedence: 317 }, { kind: "infix", latexTrigger: "\\&", parse: "And", precedence: 317 }, { kind: "infix", latexTrigger: "\\operatorname{and}", parse: "And", precedence: 317 }, { name: "Or", kind: "infix", latexTrigger: ["\\lor"], precedence: 310 }, { kind: "infix", latexTrigger: ["\\vee"], parse: "Or", precedence: 310 }, { kind: "infix", latexTrigger: "\\parallel", parse: "Or", precedence: 310 }, { kind: "infix", latexTrigger: "\\operatorname{or}", parse: "And", precedence: 310 }, { name: "Xor", kind: "infix", latexTrigger: ["\\veebar"], precedence: 315 }, // Possible alt: \oplus ⊕ U+2295 { name: "Not", kind: "prefix", latexTrigger: ["\\lnot"], precedence: 880 }, { name: "Nand", kind: "infix", latexTrigger: ["\\barwedge"], precedence: 315 // serialize: '\\mid', }, { name: "Nor", kind: "infix", latexTrigger: ["\u22BD"], // bar vee precedence: 315 // serialize: '\\downarrow', }, // Functions { kind: "function", identifierTrigger: "and", parse: "And" }, { kind: "function", identifierTrigger: "or", parse: "Or" }, { kind: "function", identifierTrigger: "not", parse: "Not" }, // Relations { name: "Implies", kind: "infix", precedence: 220, associativity: "right", latexTrigger: ["\\implies"], serialize: "\\implies" }, { latexTrigger: ["\\Rightarrow"], kind: "infix", precedence: 220, associativity: "right", parse: "Implies" }, { name: "Equivalent", // MathML: identical to, Mathematica: Congruent latexTrigger: ["\\iff"], kind: "infix", associativity: "right", precedence: 219 }, { latexTrigger: ["\\Leftrightarrow"], kind: "infix", associativity: "right", precedence: 219, parse: "Equivalent" }, { latexTrigger: ["\\equiv"], kind: "infix", associativity: "right", precedence: 219, parse: "Equivalent" }, { name: "Proves", kind: "infix", latexTrigger: ["\\vdash"], precedence: 220, associativity: "right", serialize: "\\vdash" }, { name: "Entails", kind: "infix", latexTrigger: ["\\vDash"], precedence: 220, associativity: "right", serialize: "\\vDash" }, { name: "Satisfies", kind: "infix", latexTrigger: ["\\models"], precedence: 220, associativity: "right", serialize: "\\models" } ]; function parseSingleArg(cmd) { return (parser) => { const arg = parser.parseGroup(); return arg === null ? [cmd] : [cmd, arg]; }; } var DEFINITIONS_OTHERS = [ { name: "Overscript", latexTrigger: ["\\overset"], kind: "infix", precedence: 700 // @todo: not in MathML }, { name: "Underscript", latexTrigger: ["\\underset"], kind: "infix", precedence: 700 // @todo: not in MathML }, { name: "Increment", latexTrigger: ["+", "+"], kind: "postfix", precedence: 880 }, { name: "Decrement", latexTrigger: ["-", "-"], kind: "postfix", precedence: 880 }, { name: "PreIncrement", latexTrigger: ["+", "+"], kind: "prefix", precedence: 880 }, { name: "PreDecrement", latexTrigger: ["-", "-"], kind: "prefix", precedence: 880 }, { name: "Ring", // Aka 'Composition', i.e. function composition latexTrigger: ["\\circ"], kind: "infix", precedence: 265 // @todo: MathML is 950 // @todo: check lhs and rhs are functions }, { name: "Transpose", latexTrigger: ["^", "T"], kind: "postfix" // @todo: if lhs is a list/tensor }, { // @todo: if lhs is a list/tensor name: "ConjugateTranspose", latexTrigger: ["^", "H"], kind: "postfix" }, { name: "StringJoin", // @todo From Mathematica...? latexTrigger: ["\\lt", "\\gt"], kind: "infix", precedence: 780 }, { name: "Starstar", latexTrigger: ["\\star", "\\star"], kind: "infix", precedence: 780 }, { // Partial derivative using a variation of the Euler notation: `∂_xf(x)` // (the Euler notation uses `D_1f(x)` where "1" is for the first variable // For the Leibniz notation see 'Divide' that handles `∂f/∂x` name: "PartialDerivative", // PartialDerivative(expr, {lists of vars}, degree) latexTrigger: ["\\partial"], kind: "prefix", parse: (parser) => { var _a, _b, _c, _d; let done = false; let sup = "Nothing"; let sub2 = "Nothing"; while (!done) { parser.skipSpace(); if (parser.match("_")) { sub2 = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); } else if (parser.match("^")) { sup = (_b = parser.parseGroup()) != null ? _b : parser.parseToken(); } else { done = true; } } const seq = getSequence(sub2); if (seq) sub2 = ["List", ...seq]; if (sub2 === null || sup === null) return null; let rhs = (_c = parser.parseGroup()) != null ? _c : "Nothing"; if (rhs !== "Nothing" && !isEmptySequence(rhs)) { const args = (_d = parser.parseArguments()) != null ? _d : ["Nothing"]; rhs = [rhs, ...args]; } return ["PartialDerivative", rhs, sub2, sup]; }, serialize: (serializer, expr) => { var _a; let result = "\\partial"; const fn = op(expr, 1); const vars = op(expr, 2); const degree = op(expr, 3); if (vars !== null && vars !== "Nothing") { if (head(vars) === "List") { result += "_{" + serializer.serialize(["Sequence", ...(_a = ops(vars)) != null ? _a : []]) + "}"; } else { result += "_{" + serializer.serialize(vars) + "}"; } } if (degree !== null && degree !== "Nothing") result += "^{" + serializer.serialize(degree) + "}"; if (fn !== null && fn !== "Nothing") result += serializer.serialize(fn); return result; }, precedence: 740 }, { name: "OverBar", latexTrigger: ["\\overline"], parse: parseSingleArg("OverBar") }, { name: "UnderBar", latexTrigger: ["\\underline"], parse: parseSingleArg("UnderBar") }, { name: "OverVector", latexTrigger: ["\\vec"], parse: parseSingleArg("OverVector") }, { name: "OverTilde", latexTrigger: ["\\tilde"], parse: parseSingleArg("OverTilde") }, { name: "OverHat", latexTrigger: ["\\hat"], parse: parseSingleArg("OverHat") }, { name: "OverRightArrow", latexTrigger: ["\\overrightarrow"], parse: parseSingleArg("OverRightArrow") }, { name: "OverLeftArrow", latexTrigger: ["\\overleftarrow"], parse: parseSingleArg("OverLeftArrow") }, { name: "OverRightDoubleArrow", latexTrigger: ["\\Overrightarrow"], parse: parseSingleArg("OverRightDoubleArrow") }, { name: "OverLeftHarpoon", latexTrigger: ["\\overleftharpoon"], parse: parseSingleArg("OverLeftHarpoon") }, { name: "OverRightHarpoon", latexTrigger: ["\\overrightharpoon"], parse: parseSingleArg("OverRightHarpoon") }, { name: "OverLeftRightArrow", latexTrigger: ["\\overleftrightarrow"], parse: parseSingleArg("OverLeftRightArrow") }, { name: "OverBrace", latexTrigger: ["\\overbrace"], parse: parseSingleArg("OverBrace") }, { name: "OverLineSegment", latexTrigger: ["\\overlinesegment"], parse: parseSingleArg("OverLineSegment") }, { name: "OverGroup", latexTrigger: ["\\overgroup"], parse: parseSingleArg("OverGroup") }, { latexTrigger: ["\\displaystyle"], parse: () => ["Sequence"] }, { latexTrigger: ["\\textstyle"], parse: () => ["Sequence"] }, { latexTrigger: ["\\scriptstyle"], parse: () => ["Sequence"] }, { latexTrigger: ["\\scriptscriptstyle"], parse: () => ["Sequence"] }, { latexTrigger: ["\\tiny"], parse: () => ["Sequence"] }, { latexTrigger: ["\\scriptsize"], parse: () => ["Sequence"] }, { latexTrigger: ["\\footnotesize"], parse: () => ["Sequence"] }, { latexTrigger: ["\\small"], parse: () => ["Sequence"] }, { latexTrigger: ["\\normalsize"], parse: () => ["Sequence"] }, { latexTrigger: ["\\large"], parse: () => ["Sequence"] }, { latexTrigger: ["\\Large"], parse: () => ["Sequence"] }, { latexTrigger: ["\\LARGE"], parse: () => ["Sequence"] }, { latexTrigger: ["\\huge"], parse: () => ["Sequence"] }, { latexTrigger: ["\\Huge"], parse: () => ["Sequence"] }, { name: "Style", serialize: (serializer, expr) => { let result = serializer.serialize(op(expr, 1)); const dict = dictionary(op(expr, 2)); if (dict === null) return result; if (stringValue(dict.display) === "block") result = joinLatex(["{\\displaystyle", result, "}"]); else if (stringValue(dict.display) === "inline") result = joinLatex(["{\\textstyle", result, "}"]); else if (stringValue(dict.display) === "script") result = joinLatex(["{\\scriptstyle", result, "}"]); else if (stringValue(dict.display) === "scriptscript") result = joinLatex(["{\\scriptscriptstyle", result, "}"]); const v = machineValue(dict.size); if (v !== null && v >= 1 && v <= 10) { result = joinLatex([ "{", { 1: "\\tiny", 2: "\\scriptsize", 3: "\\footnotesize", 4: "\\small", 5: "\\normalsize", 6: "\\large", 7: "\\Large", 8: "\\LARGE", 9: "\\huge", 10: "\\Huge" }[v], result, "}" ]); } return result; } }, { latexTrigger: ["\\!"], parse: () => ["HorizontalSpacing", -3] }, { latexTrigger: ["\\ "], parse: () => ["HorizontalSpacing", 6] }, { latexTrigger: ["\\:"], parse: () => ["HorizontalSpacing", 4] }, { latexTrigger: ["\\enskip"], parse: () => ["HorizontalSpacing", 9] }, { latexTrigger: ["\\quad"], parse: () => ["HorizontalSpacing", 18] }, { latexTrigger: ["\\qquad"], parse: () => ["HorizontalSpacing", 36] }, { latexTrigger: ["\\,"], parse: () => ["HorizontalSpacing", 3] }, { latexTrigger: ["\\;"], parse: () => ["HorizontalSpacing", 5] }, { latexTrigger: ["\\enspace"], parse: () => ["HorizontalSpacing", 9] }, { name: "HorizontalSpacing", // The `HorizontalSpacing` function has two forms // `["HorizontalSpacing", number]` -> indicate a space of mu units // `["HorizontalSpacing", expr, 'op'|'bin'|rel]` -> indicate a spacing around and expression, i.e. `\mathbin{x}`, etc... serialize: (serializer, expr) => { var _a; if (op(expr, 2)) { return serializer.serialize(op(expr, 1)); } const v = machineValue(op(expr, 1)); if (v === null) return ""; return (_a = { "-3": "\\!", 6: "\\ ", 3: "\\,", 4: "\\:", 5: "\\;", 9: "\\enspace", 18: "\\quad", 36: "\\qquad" }[v]) != null ? _a : ""; } } // if ( // [ // '\\!', // '\\:', // '\\enskip', // '\\quad', // '\\,', // '\\;', // '\\enspace', // '\\qquad', // '\\selectfont', // ].includes(token) // ) { // return 'skip'; // } // { // name: '', // trigger: '\\mathring', // }, // { // name: '', // trigger: '\\check', // }, ]; function parseTrig(op3) { return (parser, until) => { var _a, _b; const head2 = (_b = (_a = { "\\arcsin": "Arcsin", "\\arccos": "Arccos", "\\arctan": "Arctan", "\\arctg": "Arctan", "\\arcctg": "Arctan", "\\arcsec": "Arcsec", "\\arccsc": " Arccsc", "\\arsinh": "Arsinh", "\\arcosh": "Arcosh", "\\artanh": "Artanh", "\\arcsech": "Arcsech", "\\arccsch": "Arcsch", // '\\arg', "\\ch": "Cosh", "\\cos": "Cos", "\\cosec": "Csc", "\\cosh": "Csch", "\\cot": "Cot", "\\cotg": "Cot", "\\coth": "Coth", "\\csc": "Csc", "\\ctg": "Cot", "\\cth": "Coth", "\\sec": "Sec", "\\sin": "Sin", "\\sinh": "Sinh", "\\sh": "Sinh", "\\tan": "Tan", "\\tanh": "Tanh", "\\tg": "Tan", "\\th": "Tanh" }[op3 != null ? op3 : ""]) != null ? _a : op3) != null ? _b : ""; if (parser.atTerminator(until)) return head2; const fn = parser.parsePostfixOperator(head2, until); if (fn !== null) return fn; const args = parser.parseArguments("implicit", until); return args === null ? head2 : [head2, ...args]; }; } var DEFINITIONS_TRIGONOMETRY = [ { name: "Arcsin", latexTrigger: ["\\arcsin"], parse: parseTrig("Arcsin") }, { name: "Arccos", latexTrigger: ["\\arccos"], parse: parseTrig("Arccos") }, { name: "Arctan", latexTrigger: ["\\arctan"], parse: parseTrig("Arctan") }, { latexTrigger: ["\\arctg"], parse: parseTrig("Arctan") }, { name: "Arccot", latexTrigger: ["\\arcctg"], parse: parseTrig("Arccot") }, { name: "Arcsec", latexTrigger: "arcsec", parse: parseTrig("Arcsec") }, { name: "Arccsc", latexTrigger: ["\\arccsc"], parse: parseTrig("Arccsc") }, { name: "Arsinh", latexTrigger: ["\\arsinh"], parse: parseTrig("Arsinh") }, { name: "Arcosh", latexTrigger: ["\\arcosh"], parse: parseTrig("Arcosh") }, { name: "Artanh", latexTrigger: ["\\artanh"], parse: parseTrig("Artanh") }, { name: "Arsech", latexTrigger: ["\\arsech"], parse: parseTrig("Arsech") }, { name: "Arcsch", latexTrigger: ["\\arcsch"], parse: parseTrig("Arcsch") }, { // Rusian hyperbolic cosine latexTrigger: ["\\ch"], parse: parseTrig("Cosh") }, { name: "Cosec", latexTrigger: ["\\cosec"], parse: parseTrig("Cosec") }, { name: "Cosh", latexTrigger: ["\\cosh"], parse: parseTrig("Cosh") }, { name: "Cot", latexTrigger: ["\\cot"], parse: parseTrig("Cot") }, { latexTrigger: ["\\cotg"], parse: parseTrig("Cot") }, { name: "Coth", latexTrigger: ["\\coth"], parse: parseTrig("Coth") }, { name: "Csc", latexTrigger: ["\\csc"], parse: parseTrig("Csc") }, { // Rusian cotangent latexTrigger: ["\\ctg"], parse: parseTrig("Cot") }, { latexTrigger: ["\\cth"], parse: parseTrig("Cotanh") }, { name: "Sec", latexTrigger: ["\\sec"], parse: parseTrig("Sec") }, { name: "Sinh", latexTrigger: ["\\sinh"], parse: parseTrig("Sinh") }, { latexTrigger: ["\\sh"], parse: parseTrig("Sinh") }, { name: "Tan", latexTrigger: ["\\tan"], parse: parseTrig("Tan") }, { latexTrigger: ["\\tg"], parse: parseTrig("Tan") }, { name: "Tanh", latexTrigger: ["\\tanh"], parse: parseTrig("Tanh") }, { latexTrigger: ["\\th"], parse: parseTrig("Tanh") }, { name: "Cos", latexTrigger: ["\\cos"], parse: parseTrig("Cos") }, { name: "Sin", latexTrigger: ["\\sin"], parse: parseTrig("Sin") } ]; var DEFINITIONS_SETS = [ // Constants { name: "AlgebraicNumber", latexTrigger: "\\bar\\Q" }, { name: "ComplexNumber", latexTrigger: ["\\C"] }, { latexTrigger: "\\mathbb{C}", parse: "ComplexNumber" }, { name: "ImaginaryNumber", latexTrigger: ["\\imaginaryI", "\\R"] }, { name: "ExtendedComplexNumber", latexTrigger: ["\\bar", "\\C"] }, { name: "EmptySet", latexTrigger: ["\\emptyset"] }, { latexTrigger: ["\\varnothing"], parse: "EmptySet" }, // Parsing only { name: "Integer", latexTrigger: ["\\Z"] }, { latexTrigger: "\\mathbb{Z}", parse: "Integer" }, { name: "RationalNumber", latexTrigger: ["\\Q"] }, { name: "RealNumber", latexTrigger: ["\\R"] }, { latexTrigger: "\\mathbb{R}", parse: "RealNumber" }, { name: "ExtendedRealNumber", latexTrigger: ["\\bar", "\\R"] }, { name: "TranscendentalNumber", latexTrigger: "\\R-\\bar\\Q" }, { latexTrigger: "\\R\\backslash\\bar\\Q", parse: "TranscendentalNumber" }, // Real numbers < 0 { name: "NegativeNumber", latexTrigger: "\\R^-" }, { latexTrigger: "\\R^{-}", parse: "NegativeNumber" }, { latexTrigger: "\\R_-", parse: "NegativeNumber" }, { latexTrigger: "\\R_{-}", parse: "NegativeNumber" }, { latexTrigger: "\\R^{\\lt}", parse: "NegativeNumber" }, // Real numbers > 0 { name: "PositiveNumber", latexTrigger: "\\R^+" }, { latexTrigger: "\\R^{+}", parse: "PositiveNumber" }, { latexTrigger: "\\R_+", parse: "PositiveNumber" }, { latexTrigger: "\\R_{+}", parse: "PositiveNumber" }, { latexTrigger: "\\R^{\\gt}", parse: "PositiveNumber" }, // Real numbers <= 0 { name: "NonPositiveNumber", latexTrigger: "\\R^{0-}" }, { latexTrigger: "\\R^{-0}", parse: "NonPositiveNumber" }, { latexTrigger: "\\R^{\\leq}", parse: "NonPositiveNumber" }, // Integers < 0 { name: "NegativeInteger", latexTrigger: "\\Z^-" }, { latexTrigger: "\\Z^-", parse: "NegativeInteger" }, { latexTrigger: "\\Z^{-}", parse: "NegativeInteger" }, { latexTrigger: "\\Z_-", parse: "NegativeInteger" }, { latexTrigger: "\\Z_{-}", parse: "NegativeInteger" }, { latexTrigger: "\\Z^{\\lt}", parse: "NegativeInteger" }, // Integers > 0 { name: "PositiveInteger", latexTrigger: "\\Z^+" }, { latexTrigger: "\\Z^{+}", parse: "PositiveInteger" }, { latexTrigger: "\\Z_+", parse: "PositiveInteger" }, { latexTrigger: "\\Z_{+}", parse: "PositiveInteger" }, { latexTrigger: "\\Z^{\\gt}", parse: "PositiveInteger" }, { latexTrigger: "\\Z^{\\gt0}", parse: "PositiveInteger" }, { latexTrigger: "\\N^+", parse: "PositiveInteger" }, { latexTrigger: "\\N^{+}", parse: "PositiveInteger" }, { latexTrigger: "\\N^*", parse: "PositiveInteger" }, { latexTrigger: "\\N^{*}", parse: "PositiveInteger" }, { latexTrigger: "\\N^\\star", parse: "PositiveInteger" }, { latexTrigger: "\\N^{\\star}", parse: "PositiveInteger" }, { latexTrigger: "\\N_1", parse: "PositiveInteger" }, { latexTrigger: "\\N_{1}", parse: "PositiveInteger" }, // https://mathvault.ca/hub/higher-math/math-symbols/algebra-symbols/ // Integers >= 0 { name: "NonNegativeInteger", latexTrigger: ["\\N"] }, { latexTrigger: "\\Z^{+0}", parse: "NonNegativeInteger" }, { latexTrigger: "\\Z^{\\geq}", parse: "NonNegativeInteger" }, { latexTrigger: "\\Z^{\\geq0}", parse: "NonNegativeInteger" }, { latexTrigger: "\\Z^{0+}", parse: "NonNegativeInteger" }, { latexTrigger: "\\mathbb{N}", parse: "NonNegativeInteger" }, { latexTrigger: "\\N_0", parse: "NonNegativeInteger" }, { latexTrigger: "\\N_{0}", parse: "NonNegativeInteger" }, // // Set Expressions // // @todo: could also have a `CartesianPower` function with a number `rhs` { name: "CartesianProduct", latexTrigger: ["\\times"], kind: "infix", associativity: "right", // Caution: cartesian product is not associative precedence: 390, // Same as Multiply? parse: (parser, lhs, until) => { if (390 < until.minPrec) return null; const ce = parser.computeEngine; if (!ce || !ce.box(lhs).domain.isCompatible("Set")) return null; const index = parser.index; const rhs = parser.parseExpression({ ...until, minPrec: 390 }); if (rhs === null || ce.box(lhs).domain.isCompatible("Set") !== true) { parser.index = index; return null; } return ["CartesianProduct", lhs, rhs]; } }, { latexTrigger: ["^", "\\complement"], kind: "postfix", parse: (_parser, lhs) => { return ["Complement", lhs]; } // precedence: 240, // @todo: serialize for the multiple argument case }, { name: "Complement", latexTrigger: ["^", "<{>", "\\complement", "<}>"], kind: "postfix" // precedence: 240, // @todo: serialize for the multiple argument case }, { name: "Intersection", latexTrigger: ["\\cap"], kind: "infix", precedence: 350 }, { name: "Interval", // @todo: parse opening '[' or ']' or '(' serialize: serializeSet }, { name: "Multiple", // @todo: parse serialize: serializeSet }, { name: "Union", latexTrigger: ["\\cup"], kind: "infix", precedence: 350 }, { name: "Range", // @todo: parse opening '[' or ']' or '(' serialize: serializeSet }, // { // name: 'Set', // kind: 'matchfix', // openDelimiter: '{', // closeDelimiter: '}', // precedence: 20, // // @todo: the set syntax can also include conditions... // }, { name: "SetMinus", latexTrigger: ["\\setminus"], kind: "infix", precedence: 650 }, { name: "SymmetricDifference", latexTrigger: ["\\triangle"], // or \\ominus kind: "infix", // @todo: parser could check that lhs and rhs are sets precedence: 260 }, // Predicates/Relations { latexTrigger: ["\\ni"], kind: "infix", associativity: "right", precedence: 160, // As per MathML, lower precedence parse: (parser, lhs, terminator) => { const rhs = parser.parseExpression(terminator); return rhs === null ? null : ["Element", rhs, lhs]; } }, { name: "Element", latexTrigger: ["\\in"], kind: "infix", precedence: 240 }, { name: "NotElement", latexTrigger: ["\\notin"], kind: "infix", precedence: 240 }, { name: "NotSubset", latexTrigger: ["\\nsubset"], kind: "infix", associativity: "right", precedence: 240 }, { name: "NotSuperset", latexTrigger: ["\\nsupset"], kind: "infix", associativity: "right", precedence: 240 }, { name: "NotSubsetNotEqual", latexTrigger: ["\\nsubseteq"], kind: "infix", associativity: "right", precedence: 240 }, { name: "NotSupersetNotEqual", latexTrigger: ["\\nsupseteq"], kind: "infix", associativity: "right", precedence: 240 }, { name: "SquareSubset", // MathML: square image of latexTrigger: ["\\sqsubset"], kind: "infix", associativity: "right", precedence: 265 }, { name: "SquareSubsetEqual", // MathML: square image of or equal to latexTrigger: ["\\sqsubseteq"], kind: "infix", associativity: "right", precedence: 265 }, { name: "SquareSuperset", // MathML: square original of latexTrigger: ["\\sqsupset"], kind: "infix", associativity: "right", precedence: 265 }, { name: "SquareSupersetEqual", // MathML: square original of or equal latexTrigger: ["\\sqsupseteq"], kind: "infix", associativity: "right", precedence: 265 }, { name: "Subset", latexTrigger: ["\\subset"], kind: "infix", associativity: "right", precedence: 240 }, { latexTrigger: ["\\subsetneq"], kind: "infix", associativity: "right", precedence: 240, parse: "Subset" }, { latexTrigger: ["\\varsubsetneqq"], kind: "infix", associativity: "right", precedence: 240, parse: "Subset" }, { name: "SubsetEqual", latexTrigger: ["\\subseteq"], kind: "infix", precedence: 240 }, { name: "Superset", latexTrigger: ["\\supset"], kind: "infix", associativity: "right", precedence: 240 }, { latexTrigger: ["\\supsetneq"], kind: "infix", associativity: "right", precedence: 240, parse: "Superset" }, { latexTrigger: ["\\varsupsetneq"], kind: "infix", associativity: "right", precedence: 240, parse: "Superset" }, { name: "SupersetEqual", latexTrigger: ["\\supseteq"], kind: "infix", associativity: "right", precedence: 240 } ]; function serializeSet(serializer, expr) { var _a; if (expr === null) return ""; const h = head(expr); if (h === null) return ""; if (h === "Set") { if (nops(expr) === 0) return "\\emptyset"; if (nops(expr) === 2 && head(op(expr, 2)) === "Condition") { return joinLatex([ "\\left\\lbrace", serializer.serialize(op(expr, 1)), "\\middle\\mid", serializer.serialize(op(expr, 2)), "\\right\\rbrace" ]); } return joinLatex([ "\\left\\lbrace", ...((_a = ops(expr)) != null ? _a : []).map((x) => serializer.serialize(x) + " ,"), "\\right\\rbrace" ]); } if (h === "Multiple") { } if (h === "Range") { return joinLatex([ "\\mathopen\\lbrack", serializer.serialize(op(expr, 1)), ", ", serializer.serialize(op(expr, 2)), "\\mathclose\\rbrack" ]); } if (h === "Interval") { let op12 = op(expr, 1); let op22 = op(expr, 2); let openLeft = false; let openRight = false; if (head(op12) === "Open") { op12 = op(op12, 1); openLeft = true; } if (head(op22) === "Open") { op22 = op(op22, 1); openRight = true; } return joinLatex([ `\\mathopen${openLeft ? "\\rbrack" : "\\lbrack"}`, serializer.serialize(op12), ", ", serializer.serialize(op22), `\\mathclose${openRight ? "\\lbrack" : "\\rbrack"}` ]); } const style = serializer.numericSetStyle(expr, serializer.level); if (style === "compact") { } else if (style === "interval") { } else if (style === "regular") { } else if (style === "set-builder") { } return ""; } function parseIntegral(command, n = 1) { return (parser) => { var _a, _b, _c; parser.skipSpace(); let sup = null; let sub2 = null; while (!(sub2 !== null && sup !== null) && (parser.peek === "_" || parser.peek === "^")) { if (parser.match("_")) sub2 = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); else if (parser.match("^")) { sup = (_b = parser.parseGroup()) != null ? _b : parser.parseToken(); } parser.skipSpace(); } if (sub2 === "Nothing" || isEmptySequence(sub2)) sub2 = null; if (sup === "Nothing" || isEmptySequence(sup)) sup = null; let [fn, index] = parseIntegralBody(parser, n); if (fn && !index) { if (head(fn) === "Add" || head(fn) === "Subtract") { const newOp = []; const rest = []; for (const op3 of (_c = ops(fn)) != null ? _c : []) { if (index) rest.push(op3); else { let op22; [op22, index] = parseIntegralBodyExpression(op3); newOp.push(op22 != null ? op22 : op3); } } if (index !== null && rest.length > 0) { return [ "Add", makeIntegral( parser, command, ["Add", ...newOp], [{ index, sub: sub2, sup }] ), ...rest ]; } } else if (head(fn) === "Divide") { let altNumerator; [altNumerator, index] = parseIntegralBodyExpression(op(fn, 1)); if (altNumerator !== null && index !== null) { fn = ["Divide", altNumerator, op(fn, 2)]; } } } return makeIntegral(parser, command, fn, [{ index, sub: sub2, sup }]); }; } function makeIntegral(parser, command, fn, ranges) { if (fn && ranges.length === 0) return [command, fn]; fn != null ? fn : fn = "Nothing"; if (parser.computeEngine) { const ce = parser.computeEngine; let hasIndex = false; const idTable = {}; for (const r of ranges) if (r.index) { hasIndex = true; idTable[r.index] = { domain: "ExtendedRealNumber" }; } if (hasIndex) ce.pushScope(idTable); fn = ce.box(fn).json; if (hasIndex) ce.popScope(); } return [command, fn, ...ranges.map((r) => makeRange(r))]; } function makeRange(range) { var _a; const heldIndex = range.index ? ["Hold", range.index] : "Nothing"; if (range.sup !== null) return ["Tuple", heldIndex, (_a = range.sub) != null ? _a : "Nothing", range.sup]; if (range.sub !== null) return ["Tuple", heldIndex, range.sub]; return heldIndex; } function parseIntegralBody(parser, n = 1) { var _a; const start = parser.index; let found = false; let fn = parser.parseExpression({ minPrec: 266, condition: () => { if (parser.matchAll(["\\mathrm", "<{>", "d", "<}>"])) found = true; else if (parser.matchAll(["\\operatorname", "<{>", "d", "<}>"])) found = true; return found; } }); if (!found) { parser.index = start; fn = parser.parseExpression({ minPrec: 266, condition: () => { if (parser.match("d")) found = true; return found; } }); } if (fn && !found) return parseIntegralBodyExpression(fn); const indexes = parseIndexes(parser, n); return [fn, (_a = indexes[0]) != null ? _a : null]; } function parseIndexes(parser, n = 1) { parser.skipSpace(); const result = []; const index = symbol(parser.parseSymbol()); if (index === null) return []; result.push(index); return result; } function parseIntegralBodyExpression(expr) { const h = head(expr); const op12 = op(expr, 1); if (!op12) return [expr, null]; if (h === "Multiply") { const args = ops(expr); if (args && args.length > 1) { const sym = symbol(args[args.length - 2]); if (sym === "d" || sym === "d_upright") { if (args.length === 2) return [null, symbol(args[1])]; if (args.length === 3) return [args[0], symbol(args[2])]; return [ ["Multiply", ...args.slice(0, -2)], symbol(args[args.length - 1]) ]; } const [fn2, index] = parseIntegralBodyExpression(args[args.length - 1]); if (fn2) return [["Multiply", ...args.slice(0, -1), fn2], index]; } } else if (h === "Delimiter") { const [fn2, index] = parseIntegralBodyExpression(op12); if (index) { if (!fn2) return [null, index]; return [["Delimiter", fn2, ...ops(expr).slice(1)], index]; } } else if (h === "Add") { const args = ops(expr); if (args && args.length > 0) { const [fn2, index] = parseIntegralBodyExpression(args[args.length - 1]); if (index) { if (fn2) return [["Add", ...args.slice(0, -1), fn2], index]; if (args.length > 2) return [["Add", ...args.slice(0, -1)], index]; if (args.length > 2) return [args[0], index]; } } } else if (h === "Negate") { const [fn2, index] = parseIntegralBodyExpression(op12); if (index) return [fn2 ? ["Negate", fn2] : null, index]; } else if (h === "Divide") { const [fn2, index] = parseIntegralBodyExpression(op12); if (index) return [["Divide", fn2 != null ? fn2 : 1, op(expr, 2)], index]; } else { const args = ops(expr); if ((args == null ? void 0 : args.length) === 1) { const [arg2, index] = parseIntegralBodyExpression(args[0]); if (index) return [[head(expr), arg2], index]; } } return [expr, null]; } function serializeIntegral(command) { return (serializer, expr) => { var _a; if (!op(expr, 1)) return command; let arg = op(expr, 2); const h = head(arg); let indexExpr = null; if (h === "Tuple" || h === "Triple" || h === "Pair" || h === "Single") { indexExpr = op(arg, 1); } else if (h === "Hold") { indexExpr = op(arg, 1); } else { indexExpr = (_a = op(arg, 1)) != null ? _a : "x"; arg = null; } if (head(indexExpr) === "Hold") indexExpr = op(indexExpr, 1); const index = indexExpr !== null ? symbol(indexExpr) : null; let fn = op(expr, 1); if (head(fn) === "Lambda" && op(fn, 1)) fn = subs(op(fn, 1), { _: index != null ? index : "x", _1: index != null ? index : "x" }); if (!arg) { if (!index || index === "Nothing") return joinLatex([command, "\\!", serializer.serialize(fn)]); return joinLatex([ command, "\\!", serializer.serialize(fn), "\\,\\operatorname{d}", serializer.serialize(index) ]); } const subSymbol = op(arg, 2) ? symbol(op(arg, 2)) : null; let sub2 = arg && subSymbol !== "Nothing" ? serializer.serialize(op(arg, 2)) : ""; if (sub2.length > 0) sub2 = `_{${sub2}}`; let sup = ""; const supSymbol = op(arg, 3) ? symbol(op(arg, 3)) : null; if (op(arg, 3) && supSymbol !== "Nothing") sup = `^{${serializer.serialize(op(arg, 3))}}`; return joinLatex([ command, sup, sub2, "\\!", serializer.serialize(fn), ...index && symbol(index) !== "Nothing" ? ["\\,\\operatorname{d}", serializer.serialize(index)] : [] ]); }; } var DEFINITIONS_CALCULUS = [ { kind: "expression", name: "Integrate", latexTrigger: ["\\int"], parse: parseIntegral("Integrate"), serialize: serializeIntegral("\\int") }, { kind: "expression", latexTrigger: ["\\iint"], parse: parseIntegral("Integrate", 2) }, { kind: "expression", latexTrigger: ["\\iiint"], parse: parseIntegral("Integrate", 3) }, { kind: "expression", name: "CircularIntegrate", latexTrigger: ["\\oint"], parse: parseIntegral("CircularIntegrate"), serialize: serializeIntegral("\\oint") }, { kind: "expression", latexTrigger: ["\\oiint"], parse: parseIntegral("CircularIntegrate", 2) }, { kind: "expression", latexTrigger: ["\\oiiint"], parse: parseIntegral("CircularIntegrate", 3) } ]; var SYMBOLS = [ // Greek ["alpha", "\\alpha", 945], ["beta", "\\beta", 946], ["gamma", "\\gamma", 947], ["delta", "\\delta", 948], ["epsilon", "\\epsilon", 949], ["epsilonSymbol", "\\varepsilon", 1013], // GREEK LUNATE EPSILON SYMBOL ["zeta", "\\zeta", 950], ["eta", "\\eta", 951], ["theta", "\\theta", 952], ["thetaSymbol", "\\vartheta", 977], // Unicode GREEK THETA SYMBOL ["iota", "\\iota", 953], ["kappa", "\\kappa", 954], ["kappaSymbol", "\\varkappa", 1008], // GREEK KAPPA SYMBOL ["lambda", "\\lambda", 955], ["mu", "\\mu", 956], ["nu", "\\nu", 957], ["xi", "\\xi", 958], ["omicron", "\\omicron", 959], ["pi", "\\pi", 960], ["piSymbol", "\\varpi", 982], // GREEK PI SYMBOL ["rho", "\\rho", 961], ["rhoSymbol", "\\varrho", 1009], // GREEK RHO SYMBOL ["sigma", "\\sigma", 963], ["finalSigma", "\\varsigma", 962], //GREEK SMALL LETTER FINAL SIGMA ["tau", "\\tau", 964], ["phi", "\\phi", 981], // Note GREEK PHI SYMBOL, but common usage in math ["phiLetter", "\\varphi", 966], ["upsilon", "\\upsilon", 965], ["chi", "\\chi", 967], ["psi", "\\psi", 968], ["omega", "\\omega", 969], ["Alpha", "\\Alpha", 913], ["Beta", "\\Beta", 914], ["Gamma", "\\Gamma", 915], ["Delta", "\\Delta", 916], ["Epsilon", "\\Epsilon", 917], ["Zeta", "\\Zeta", 918], ["Eta", "\\Eta", 919], ["Theta", "\\Theta", 920], ["Iota", "\\Iota", 921], ["Kappa", "\\Kappa", 922], ["Lambda", "\\Lambda", 923], ["Mu", "\\Mu", 924], ["Nu", "\\Nu", 925], ["Xi", "\\Xi", 926], ["Omicron", "\\Omicron", 927], // ['Pi', '\\Pi', 0x03a0], ["Rho", "\\Rho", 929], ["Sigma", "\\Sigma", 931], ["Tau", "\\Tau", 932], ["Phi", "\\Phi", 934], ["Upsilon", "\\Upsilon", 933], ["Chi", "\\Chi", 935], ["Psi", "\\Psi", 936], ["Omega", "\\Omega", 937], ["digamma", "\\digamma", 989], // Hebrew ["aleph", "\\aleph", 8501], // Unicode ALEF SYMBOL ["bet", "\\beth", 8502], ["gimel", "\\gimel", 8503], ["dalet", "\\daleth", 8504], // Letter-like ["ell", "\\ell", 8499], // Unicode SCRIPT SMALL L ["turnedCapitalF", "\\Finv", 8498], // Unicode TURNED CAPITAL F' ["turnedCapitalG", "\\Game", 8513], // TURNED SANS-SERIF CAPITAL G ["weierstrass", "\\wp", 8472], // Unicode SCRIPT CAPITAL P ["eth", "\\eth", 240], ["invertedOhm", "\\mho", 8487], // Unicode INVERTED OHM SIGN ["hBar", "\\hbar", 295], // Unicode LATIN SMALL LETTER H WITH STROKE ["hSlash", "\\hslash", 8463], // Unicode PLANCK CONSTANT OVER TWO PI // Symbols ["blackClubSuit", "\\clubsuit", 9827], ["whiteHeartSuit", "\\heartsuit", 9825], ["blackSpadeSuit", "\\spadesuit", 9824], ["whiteDiamondSuit", "\\diamondsuit", 9826], ["sharp", "\\sharp", 9839], ["flat", "\\flat", 9837], ["natural", "\\natural", 9838] ]; var DEFINITIONS_SYMBOLS = [ ...SYMBOLS.map(([symbol2, latex, _codepoint]) => { return { kind: "symbol", name: symbol2, latexTrigger: [latex], parse: symbol2 }; }), ...SYMBOLS.map(([symbol2, _latex, codepoint]) => { return { kind: "symbol", latexTrigger: [String.fromCodePoint(codepoint)], parse: symbol2 }; }) ]; var DEFINITIONS_COMPLEX = [ { name: "Real", kind: "function", latexTrigger: ["\\Re"] }, { name: "Imaginary", kind: "function", latexTrigger: ["\\Im"] }, { name: "Argument", kind: "function", latexTrigger: ["\\arg"] }, { name: "Conjugate", latexTrigger: ["^", "\\star"], kind: "postfix" } ]; var DEFINITIONS_STATISTICS = [ { name: "Mean", kind: "function", identifierTrigger: "mean" }, { name: "Median", kind: "function", identifierTrigger: "median" }, { name: "StandarDeviation", kind: "function", identifierTrigger: "stddev" }, { latexTrigger: ["\\bar"], kind: "expression", parse: (parser, _until) => { var _a; const expr = (_a = parser.parseGroup()) != null ? _a : parser.parseToken(); if (!expr || !symbol(expr)) return null; return ["Mean", expr]; } } ]; var DEFAULT_DELIMITER = { "(": "(", ")": ")", "[": "\\lbrack", "]": "\\rbrack", "{": "\\lbrace", "}": "\\rbrace", "<": "\\langle", ">": "\\rangle", "|": "\\vert", "||": "\\Vert", "\\lceil": "\\lceil", "\\lfloor": "\\lfloor", "\\rceil": "\\rceil", "\\rfloor": "\\rfloor" }; function addEntry(result, entry, onError) { const indexedEntry = makeIndexedEntry(entry, onError); if (indexedEntry === null) return; const kind = "kind" in entry ? entry.kind : "expression"; const latexTrigger = indexedEntry.latexTrigger; if (typeof latexTrigger === "string") result.lookahead = Math.max(result.lookahead, countTokens(latexTrigger)); const tokensTrigger = tokenize(latexTrigger != null ? latexTrigger : "", []); if ((latexTrigger == null ? void 0 : latexTrigger[1]) === "\\prime") ; if (tokensTrigger.length === 2 && /[_^]/.test(tokensTrigger[0]) && tokensTrigger[1] !== "<{>" && kind !== "function" && kind !== "environment" && kind !== "matchfix") { let parse = entry.parse; if (!parse && entry.name) { if (kind === "postfix" || kind === "prefix") parse = (_parser, expr) => [entry.name, expr]; else parse = entry.name; } addEntry( result, { ...entry, kind, name: void 0, serialize: void 0, parse, latexTrigger: [tokensTrigger[0], "<{>", tokensTrigger[1], "<}>"] }, onError ); } result.defs.push(indexedEntry); if (indexedEntry.name !== void 0) { if (result.ids.has(indexedEntry.name)) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", indexedEntry.name, "Duplicate definition. The name (MathJSON identifier) must be unique, but triggers can be shared by multiple definitions." ] }); } result.ids.set(indexedEntry.name, indexedEntry); } } function indexLatexDictionary(dic, onError) { const result = { lookahead: 1, ids: /* @__PURE__ */ new Map(), defs: [] }; for (const entry of dic) addEntry(result, entry, onError); return result; } function makeIndexedEntry(entry, onError) { var _a, _b, _c, _d; if (!isValidEntry(entry, onError)) return null; const result = { kind: "kind" in entry ? entry.kind : "expression" }; let tokensTrigger = null; if ("latexTrigger" in entry) { if (typeof entry.latexTrigger === "string") tokensTrigger = tokenize(entry.latexTrigger, []); else tokensTrigger = entry.latexTrigger; } let idTrigger = null; if ("identifierTrigger" in entry) { idTrigger = entry.identifierTrigger; } if (tokensTrigger !== null) result.latexTrigger = tokensToString(tokensTrigger); if (idTrigger !== null) result.identifierTrigger = idTrigger; if (entry.name) { result.name = entry.name; result.serialize = makeSerializeHandler(entry, tokensTrigger, idTrigger); } if (result.kind === "matchfix" && isMatchfixEntry(entry)) { result.openDelimiter = entry.openTrigger; result.closeDelimiter = entry.closeTrigger; } if (result.kind === "symbol" && isSymbolEntry(entry)) { result.precedence = (_a = entry.precedence) != null ? _a : 1e4; } if ((result.kind === "prefix" || result.kind === "postfix") && (isPrefixEntry(entry) || isPostfixEntry(entry))) { if (tokensTrigger && (tokensTrigger[0] === "^" || tokensTrigger[0] === "_")) { result.precedence = 720; /* @__PURE__ */ console.assert( entry.precedence === void 0, "'precedence' is fixed and cannot be modified with ^ and _ triggers" ); } else result.precedence = (_b = entry.precedence) != null ? _b : 1e4; } if (result.kind === "infix" && isInfixEntry(entry)) { /* @__PURE__ */ console.assert( !tokensTrigger || tokensTrigger[0] !== "^" && tokensTrigger[0] !== "_" || !entry.associativity || entry.associativity === "non" ); result.associativity = (_c = entry.associativity) != null ? _c : "non"; result.precedence = (_d = entry.precedence) != null ? _d : 1e4; } const parse = makeParseHandler(entry, tokensTrigger, idTrigger); if (parse) result.parse = parse; return result; } function makeSerializeHandler(entry, latexTrigger, idTrigger) { var _a, _b, _c, _d; if (typeof entry.serialize === "function") return entry.serialize; const kind = (_a = entry["kind"]) != null ? _a : "expression"; if (kind === "environment") { const envName = (_c = (_b = entry["identifierTrigger"]) != null ? _b : entry.name) != null ? _c : "unknown"; return (serializer, expr) => joinLatex([ `\\begin{${envName}}`, serializer.serialize(op(expr, 1)), `\\end{${envName}}` ]); } if (isMatchfixEntry(entry)) { const openDelim = typeof entry.openTrigger === "string" ? DEFAULT_DELIMITER[entry.openTrigger] : tokensToString(entry["openDelimiter"]); const closeDelim = typeof entry.closeTrigger === "string" ? DEFAULT_DELIMITER[entry.closeTrigger] : tokensToString(entry["closeDelimiter"]); return (serializer, expr) => joinLatex([openDelim, serializer.serialize(op(expr, 1)), closeDelim]); } let latex = entry.serialize; if (latex === void 0 && latexTrigger) latex = tokensToString(latexTrigger); if (latex) { if (kind === "postfix") return (serializer, expr) => joinLatex([serializer.serialize(op(expr, 1)), latex]); if (kind === "prefix") return (serializer, expr) => joinLatex([latex, serializer.serialize(op(expr, 1))]); if (kind === "infix") { return (serializer, expr) => { var _a2; return joinLatex( ((_a2 = ops(expr)) != null ? _a2 : []).flatMap( (val, i) => i < nops(expr) - 1 ? [serializer.serialize(val), latex] : [serializer.serialize(val)] ) ); }; } return (serializer, expr) => head(expr) ? joinLatex([latex, serializer.wrapArguments(expr)]) : latex; } const id = (_d = idTrigger != null ? idTrigger : entry.name) != null ? _d : "unknown"; if (kind === "postfix") return (serializer, expr) => joinLatex([ serializer.serialize(op(expr, 1)), serializer.serializeSymbol(id) ]); if (kind === "prefix") return (serializer, expr) => joinLatex([ serializer.serializeSymbol(id), serializer.serialize(op(expr, 1)) ]); if (kind === "infix") return (serializer, expr) => joinLatex([ serializer.serialize(op(expr, 1)), serializer.serializeSymbol(id), serializer.serialize(op(expr, 2)) ]); return (serializer, expr) => head(expr) ? joinLatex([ serializer.serializeSymbol(id), serializer.wrapArguments(expr) ]) : serializer.serializeSymbol(id); } function makeParseHandler(entry, latexTrigger, idTrigger) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s; if ("parse" in entry && typeof entry.parse === "function") return entry.parse; const kind = "kind" in entry ? entry.kind : "expression"; if (kind === "environment") { const envName = (_b = (_a = entry.parse) != null ? _a : entry.name) != null ? _b : idTrigger; if (envName) return (parser, _until) => { const array = parser.parseTabular(); if (array === null) return null; return [envName, ["List", array.map((row) => ["List", ...row])]]; }; } if (kind === "function") { const fnName = (_d = (_c = entry.parse) != null ? _c : entry.name) != null ? _d : idTrigger; if (fnName) return (parser, until) => { const args = parser.parseArguments("enclosure", until); return args === null ? fnName : [fnName, ...args]; }; } if (kind === "symbol") { const symName = (_f = (_e = entry.parse) != null ? _e : entry.name) != null ? _f : idTrigger; if (symName) return (_parser, _terminator) => symName; } if (kind === "prefix") { const h = (_h = (_g = entry.parse) != null ? _g : entry.name) != null ? _h : idTrigger; if (h) { const prec = (_i = entry["precedence"]) != null ? _i : 1e4; return (parser, until) => { const rhs = parser.parseExpression({ ...until != null ? until : [], minPrec: prec }); return rhs === null ? null : [h, rhs]; }; } } if (kind === "postfix") { const h = (_j = entry.parse) != null ? _j : entry.name; if (h) return (_parser, lhs) => lhs === null ? null : [h, lhs]; } if (kind === "infix") { if (/[_^]/.test((_k = latexTrigger == null ? void 0 : latexTrigger[0]) != null ? _k : "")) { const h2 = (_l = entry.name) != null ? _l : entry.parse; return (_parser, arg) => [ h2, missingIfEmpty(op(arg, 1)), missingIfEmpty(op(arg, 2)) ]; } const h = (_n = (_m = entry.parse) != null ? _m : entry.name) != null ? _n : idTrigger; const prec = (_o = entry["precedence"]) != null ? _o : 1e4; const associativity = (_p = entry["associativity"]) != null ? _p : "non"; if (h) return (parser, lhs, until) => { if (lhs === null) return null; if (prec < until.minPrec) return null; const rhs = missingIfEmpty( parser.parseExpression({ ...until, minPrec: prec }) ); return typeof h === "string" ? applyAssociativeOperator(h, lhs, rhs, associativity) : [h, lhs, rhs]; }; } if (kind === "matchfix") { const h = (_q = entry.parse) != null ? _q : entry.name; if (h) return (_parser, body) => { if (body === null || isEmptySequence(body)) return null; return [h, body]; }; } if (kind === "expression") { const parseResult = (_s = (_r = entry.parse) != null ? _r : entry.name) != null ? _s : idTrigger; if (parseResult) return () => parseResult; } if ("parse" in entry) { const parseResult = entry.parse; return () => parseResult; } return void 0; } function isValidEntry(entry, onError) { var _a, _b, _c; let subject = (_c = (_b = (_a = entry.name) != null ? _a : entry["latexTrigger"]) != null ? _b : entry["identifierTrigger"]) != null ? _c : entry["openDelimiter"]; if (!subject) { try { subject = JSON.stringify(entry); } catch (e) { subject = "???"; } } if (Array.isArray(subject)) subject = tokensToString(subject); if ("trigger" in entry) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `The 'trigger' property is deprecated. Use 'latexTrigger' or 'identifierTrigger' instead` ] }); } if ("kind" in entry && ![ "expression", "symbol", "function", "infix", "postfix", "prefix", "matchfix", "environment" ].includes(entry.kind)) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `The 'kind' property must be one of 'expression', 'symbol', 'function', 'infix', 'postfix', 'prefix', 'matchfix', 'environment'` ] }); } if (entry.serialize !== void 0 && !entry.name) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `A 'name' property must be provided if a 'serialize' handler is provided` ] }); return false; } if ("identifierTrigger" in entry) { if (typeof entry.identifierTrigger !== "string" || !isValidIdentifier(entry.identifierTrigger)) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `The 'identifierTrigger' property must be a valid identifier` ] }); } } if ("name" in entry) { if (typeof entry.name !== "string") { if (entry.name !== void 0) onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `The 'name' property must be a string` ] }); } else if (!isValidIdentifier(entry.name)) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", entry.name, `The 'name' property must be a valid identifier` ] }); } } if (isMatchfixEntry(entry)) { if ("latexTrigger" in entry || "identifierTrigger" in isPrefixEntry) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `'matchfix' operators use a 'openDelimiter' and 'closeDelimiter' instead of a 'latexTrigger' or 'identifierTrigger'. ` ] }); return false; } if (!entry.openTrigger || !entry.closeTrigger) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, "Expected `openDelimiter` and a `closeDelimiter` for matchfix operator" ] }); return false; } if (typeof entry.openTrigger !== typeof entry.closeTrigger) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, "Expected `openDelimiter` and `closeDelimiter` to both be strings or array of LatexToken" ] }); return false; } } if (isInfixEntry(entry) || isPostfixEntry(entry) || isPrefixEntry(entry)) { if (Array.isArray(entry.latexTrigger) && (entry.latexTrigger[0] === "_" || entry.latexTrigger[0] === "^") || typeof entry.latexTrigger === "string" && (entry.latexTrigger.startsWith("^") || entry.latexTrigger.startsWith("_"))) { if (entry.precedence !== void 0 || entry["associativity"] !== void 0) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `Unexpected "precedence" or "associativity" for superscript/subscript operator` ] }); return false; } } else if (entry.precedence === void 0) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `Expected a "precedence" for ${entry.kind} operator` ] }); return false; } } else { if (entry["associativity"] !== void 0) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, 'Unexpected "associativity" operator' ] }); return false; } } if (!isMatchfixEntry(entry) && !isEnvironmentEntry(entry)) { if (!entry.latexTrigger && !entry.identifierTrigger && !entry.name) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `Expected a 'name', a 'latexTrigger' or a 'identifierTrigger'` ] }); return false; } } if (entry["parse"] === void 0 && entry.name === void 0) { onError({ severity: "warning", message: [ "invalid-dictionary-entry", subject, `Expected a 'parse' or 'name'` ] }); return false; } return true; } var DEFAULT_LATEX_DICTIONARY = { algebra: DEFINITIONS_ALGEBRA, arithmetic: DEFINITIONS_ARITHMETIC, calculus: DEFINITIONS_CALCULUS, complex: DEFINITIONS_COMPLEX, core: DEFINITIONS_CORE, logic: DEFINITIONS_LOGIC, relop: DEFINITIONS_INEQUALITIES, other: DEFINITIONS_OTHERS, physics: [ { name: "mu0", kind: "symbol", latexTrigger: "\\mu_0" } ], sets: DEFINITIONS_SETS, statistics: DEFINITIONS_STATISTICS, symbols: DEFINITIONS_SYMBOLS, trigonometry: DEFINITIONS_TRIGONOMETRY }; var IDENTIFIER_PREFIX = { // Those are "grouping" prefix that also specify spacing // around the symbol. We ignore the spacing, though. "\\mathord": "", "\\mathop": "", "\\mathbin": "", "\\mathrel": "", "\\mathopen": "", "\\mathclose": "", "\\mathpunct": "", "\\mathinner": "", // This is the preferred way to specify an identifier // it defines both spacing and font. By default, identifiers // are wrapper with `\\operatorname{}`. "\\operatorname": "", // These styling commands are used to change the font of an identifier // They may be problematic, as adjacent identifiers may be merged // into a single identifier when used in editors, such a MathLive. // For example `\mathrm{speed}\mathrm{sound}` can be confused with `\mathrm{speedsound}` "\\mathrm": "_upright", "\\mathit": "_italic", "\\mathbf": "_bold", "\\mathscr": "_script", "\\mathcal": "_calligraphic", "\\mathfrak": "_fraktur", "\\mathsf": "_sansserif", "\\mathtt": "_monospace", "\\mathbb": "_doublestruck" }; var IDENTIFIER_MODIFIER = { "\\mathring": "_ring", "\\hat": "_hat", "\\tilde": "_tilde", "\\vec": "_vec", "\\overline": "_bar", "\\underline": "_underbar", "\\dot": "_dot", "\\ddot": "_ddot", "\\dddot": "_dddot", "\\ddddot": "_ddddot", "\\acute": "_acute", "\\grave": "_grave", "\\breve": "_breve", "\\check": "_check" }; function parseIdentifierToken(parser, options) { var _a; if (parser.atEnd) return null; const token = parser.peek; let special = { "\\_": "_", "\\#": "hash" }[token]; if (!special && !options.toplevel) { special = { "+": "plus", "-": "minus", "\\plusmn": "pm", "\\pm": "pm", "\\ast": "ast", "\\dag": "dag", "\\ddag": "ddag", "\\bot": "bottom", "\\top": "top", "\\bullet": "bullet", "\\cir": "circle", "\\diamond": "diamond", "\\times": "times", "\\square": "square", "\\star": "star" }[token]; } if (special) { parser.nextToken(); return special; } const i = SYMBOLS.findIndex((x) => x[1] === token); if (i >= 0) { parser.nextToken(); return SYMBOLS[i][0]; } return (_a = parser.matchChar()) != null ? _a : parser.nextToken(); } function parseIdentifierBody(parser) { var _a; let id = matchPrefixedIdentifier(parser); const start = parser.index; const prefix = (_a = IDENTIFIER_MODIFIER[parser.peek]) != null ? _a : null; if (prefix) { parser.nextToken(); if (!parser.match("<{>")) { parser.index = start; return null; } const body = parseIdentifierBody(parser); if (body === null || !parser.match("<}>")) { parser.index = start; return null; } id = `${body}${prefix}`; } if (id === null) { id = ""; while (!parser.atEnd) { const token = parser.peek; if (token === "<}>" || token === "_" || token === "^") break; const next = parseIdentifierToken(parser, { toplevel: false }); if (next === null) { parser.index = start; return null; } id += next; } while (!parser.atEnd && /\d/.test(parser.peek)) id += parser.nextToken(); } while (!parser.atEnd) { if (parser.match("\\degree")) id += "_deg"; else if (parser.matchAll(["^", "\\prime"])) id += "_prime"; else if (parser.matchAll(["^", "<{>", "\\prime", "<}>"])) id += "_prime"; else if (parser.matchAll(["^", "<{>", "\\doubleprime", "<}>"])) id += "_dprime"; else if (parser.matchAll(["^", "<{>", "\\prime", "\\prime", "<}>"])) id += "_dprime"; else break; } const sups = []; const subs2 = []; while (!parser.atEnd) { if (parser.match("_")) { const hasBrace = parser.match("<{>"); const sub2 = parseIdentifierBody(parser); if (hasBrace && !parser.match("<}>") || sub2 === null) { parser.index = start; return null; } subs2.push(sub2); } else if (parser.match("^")) { const hasBrace = parser.match("<{>"); const sup = parseIdentifierBody(parser); if (hasBrace && !parser.match("<}>") || sup === null) { parser.index = start; return null; } sups.push(sup); } else break; } if (sups.length > 0) id += "__" + sups.join(""); if (subs2.length > 0) id += "_" + subs2.join(""); return id; } function matchPrefixedIdentifier(parser) { var _a, _b; const start = parser.index; const prefix = (_a = IDENTIFIER_PREFIX[parser.peek]) != null ? _a : null; if (prefix === null) return null; parser.nextToken(); if (parser.match("<{>")) { let body = ""; const digit = (_b = { 0: "zero", 1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine" }[parser.peek]) != null ? _b : ""; if (digit) { body = digit; parser.nextToken(); } body += parseIdentifierBody(parser); if (body === null || !parser.match("<}>")) { parser.index = start; return null; } if (prefix === "_upright" && body.length > 1) return body; return body + prefix; } parser.index = start; return null; } function parseInvalidIdentifier(parser) { const start = parser.index; const id = matchPrefixedIdentifier(parser); if (id === null || isValidIdentifier(id)) { parser.index = start; return null; } return parser.error( ["invalid-identifier", { str: validateIdentifier(id) }], start ); } function parseIdentifier(parser) { if (/^[a-zA-Z]$/.test(parser.peek) || /^\p{XIDS}$/u.test(parser.peek)) return parser.nextToken(); const start = parser.index; let id = matchPrefixedIdentifier(parser); if (!id) { id = ""; while (!parser.atEnd && ONLY_EMOJIS.test(id + parser.peek)) id += parser.nextToken(); if (!id) id = null; } id != null ? id : id = parseIdentifierToken(parser, { toplevel: true }); if (id) { id = id.normalize(); if (isValidIdentifier(id)) return id; } parser.index = start; return null; } var DELIMITER_SHORTHAND = { "(": ["\\lparen", "("], ")": ["\\rparen", ")"], "[": ["\\lbrack"], "]": ["\\rbrack"], "<": ["<", "\\langle"], ">": [">", "\\rangle"], "{": ["\\{", "\\lbrace"], "}": ["\\}", "\\rbrace"], ":": [":", "\\colon"], "|": ["|", "\\|", "\\lvert", "\\rvert"], //special: '\lvert` when open, `\rvert` when close "||": ["||", "\\Vert", "\\lVert", "\\rVert"], // special: `\lVert` when open, `\rVert` when close "\\lfloor": ["\\lfloor"], "\\rfloor": ["\\rfloor"], "\\lceil": ["\\lceil"], "\\rceil": ["\\rceil"], "\\ulcorner": ["\\ulcorner"], "\\urcorner": ["\\urcorner"], "\\llcorner": ["\\llcorner"], "\\lrcorner": ["\\lrcorner"], "\\lgroup": ["\\lgroup"], "\\rgroup": ["\\rgroup"], "\\lmoustache": ["\\lmoustache"], "\\rmoustache": ["\\rmoustache"] }; var OPEN_DELIMITER_PREFIX = { "\\left": "\\right", "\\bigl": "\\bigr", "\\Bigl": "\\Bigr", "\\biggl": "\\biggr", "\\Biggl": "\\Biggr", "\\big": "\\big", "\\Big": "\\Big", "\\bigg": "\\bigg", "\\Bigg": "\\Bigg" }; var CLOSE_DELIMITER = { "(": ")", "[": "]", "\\{": "\\}", "\\lbrace": "\\rbrace", "\\lparen": "\\rparen", "\\langle": "\\rangle", "\\lfloor": "\\rfloor", "\\lceil": "\\rceil", "\\vert": "\\vert", "\\lvert": "\\rvert", "\\Vert": "\\Vert", "\\lVert": "\\rVert", "\\lbrack": "\\rbrack", "\\ulcorner": "\\urcorner", "\\llcorner": "\\lrcorner", "\\lgroup": "\\rgroup", "\\lmoustache": "\\rmoustache" }; var DEFAULT_LATEX_NUMBER_OPTIONS = { precision: 6, // with machine numbers, up to 15 assuming 2^53 bits floating points positiveInfinity: "\\infty", negativeInfinity: "-\\infty", notANumber: "\\operatorname{NaN}", decimalMarker: ".", // Use `{,}` for comma as a decimal marker groupSeparator: "\\,", // for thousands, etc... exponentProduct: "\\cdot", beginExponentMarker: "10^{", // could be 'e' endExponentMarker: "}", notation: "auto", truncationMarker: "\\ldots", beginRepeatingDigits: "\\overline{", endRepeatingDigits: "}", imaginaryUnit: "\\imaginaryI", avoidExponentsInRange: [-7, 20] }; var DEFAULT_PARSE_LATEX_OPTIONS = { applyInvisibleOperator: "auto", skipSpace: true, parseArgumentsOfUnknownLatexCommands: true, parseNumbers: true, parseUnknownIdentifier: (id, parser) => { var _a; return ((_a = parser.computeEngine) == null ? void 0 : _a.lookupFunction(id)) !== void 0 ? "function" : "symbol"; }, preserveLatex: false }; var _Parser = class { constructor(tokens, options, dictionary2, computeEngine) { this.index = 0; this._boundaries = []; this._lastPeek = ""; this._peekCounter = 0; this._tokens = tokens; this.options = { ...DEFAULT_LATEX_NUMBER_OPTIONS, ...DEFAULT_PARSE_LATEX_OPTIONS, ...options }; this._dictionary = dictionary2; this.computeEngine = computeEngine; this._positiveInfinityTokens = tokenize(this.options.positiveInfinity, []); this._negativeInfinityTokens = tokenize(this.options.negativeInfinity, []); this._notANumberTokens = tokenize(this.options.notANumber, []); this._decimalMarkerTokens = tokenize(this.options.decimalMarker, []); this._groupSeparatorTokens = tokenize(this.options.groupSeparator, []); this._exponentProductTokens = tokenize(this.options.exponentProduct, []); this._beginExponentMarkerTokens = tokenize( this.options.beginExponentMarker, [] ); this._endExponentMarkerTokens = tokenize( this.options.endExponentMarker, [] ); this._truncationMarkerTokens = tokenize(this.options.truncationMarker, []); this._beginRepeatingDigitsTokens = tokenize( this.options.beginRepeatingDigits, [] ); this._endRepeatingDigitsTokens = tokenize( this.options.endRepeatingDigits, [] ); this._imaginaryNumberTokens = tokenize(this.options.imaginaryUnit, []); } updateOptions(opt) { for (const [k, v] of Object.entries(opt)) if (k in this.options) { this.options[k] = v; if (typeof v === "string") { if (k === "positiveInfinity") this._positiveInfinityTokens = tokenize(v, []); if (k === "negativeInfinity") this._negativeInfinityTokens = tokenize(v, []); if (k === "notANumber") this._notANumberTokens = tokenize(v, []); if (k === "decimalMarker") this._decimalMarkerTokens = tokenize(v, []); if (k === "groupSeparator") this._groupSeparatorTokens = tokenize(v, []); if (k === "exponentProduct") this._exponentProductTokens = tokenize(v, []); if (k === "beginExponentMarker") this._beginExponentMarkerTokens = tokenize(v, []); if (k === "endExponentMarker") this._endExponentMarkerTokens = tokenize(v, []); if (k === "truncationMarker") this._truncationMarkerTokens = tokenize(v, []); if (k === "beginRepeatingDigits") this._beginRepeatingDigitsTokens = tokenize(v, []); if (k === "endRepeatingDigits") this._endRepeatingDigitsTokens = tokenize(v, []); if (k === "imaginaryNumber") this._imaginaryNumberTokens = tokenize(v, []); } } else throw Error(`Unexpected option "${k}"`); } get atEnd() { return this.index >= this._tokens.length; } get peek() { const peek = this._tokens[this.index]; if (peek === this._lastPeek) this._peekCounter += 1; else this._peekCounter = 0; if (this._peekCounter >= 1024) { console.error( `Infinite loop detected while parsing "${this.latex(0)}" at "${this._lastPeek}" (index ${this.index})` ); throw new Error( `Infinite loop detected while parsing "${this.latex(0)}" at ${this._lastPeek} (index ${this.index})` ); } this._lastPeek = peek; return peek; } nextToken() { return this._tokens[this.index++]; } /** * Return true if * - at end of the token stream * - the `t.condition` function returns true * Note: the `minPrec` condition is not checked. It should be checked separately. */ atTerminator(t) { var _a; return this.atBoundary || ((_a = (t == null ? void 0 : t.condition) && t.condition(this)) != null ? _a : false); } /** * True if the current token matches any of the boundaries we are * waiting for. */ get atBoundary() { if (this.atEnd) return true; const start = this.index; for (const boundary of this._boundaries) { if (this.matchAll(boundary.tokens)) { this.index = start; return true; } } return false; } addBoundary(boundary) { this._boundaries.push({ index: this.index, tokens: boundary }); } removeBoundary() { this._boundaries.pop(); } matchBoundary() { const currentBoundary = this._boundaries[this._boundaries.length - 1]; const match2 = currentBoundary && this.matchAll(currentBoundary.tokens); if (match2) this._boundaries.pop(); return match2; } boundaryError(msg) { const currentBoundary = this._boundaries[this._boundaries.length - 1]; this._boundaries.pop(); return this.error(msg, currentBoundary.index); } latex(start, end) { return tokensToString(this._tokens.slice(start, end)); } latexAhead(n) { return this.latex(this.index, this.index + n); } // latexBefore(): string { // return this.latex(0, this.index); // } // latexAfter(): string { // return this.latex(this.index); // } /** * Return at most `this._dictionary.lookahead` LaTeX tokens. * * The index in the returned array correspond to the number of tokens. * Note that since a token can be longer than one char ('\\pi', but also * some astral plane unicode characters), the length of the string * does not match that index. However, knowing the index is important * to know by how many tokens to advance. * * For example: * * `[empty, '\\sqrt', '\\sqrt{', '\\sqrt{2', '\\sqrt{2}']` * */ lookAhead() { let n = Math.min( this._dictionary.lookahead, this._tokens.length - this.index ); if (n <= 0) return []; const result = []; while (n > 0) result.push([n, this.latexAhead(n--)]); return result; } peekDefinitions(kind) { const result = []; const defs = [...this.getDefs(kind)]; for (const def of defs) if (def.latexTrigger === "") result.push([def, 0]); for (const [n, tokens] of this.lookAhead()) { for (const def of defs) if (def.latexTrigger === tokens) result.push([def, n]); } for (const def of defs) { if (def.identifierTrigger) { const n = parseComplexId(this, def.identifierTrigger); if (n > 0) result.push([def, n]); } } return result; } /** Skip strictly `` tokens. * To also skip `{}` see `skipSpace()`. * To skip visual space (e.g. `\,`) see `skipVisualSpace()`. */ skipSpaceTokens() { while (this.match("")) { } } /** While parsing in math mode, skip applicable spaces, which includes `{}`. * Do not use to skip spaces while parsing a string. See `skipSpaceTokens()` * instead. */ skipSpace() { if (!this.atEnd && this.peek === "<{>") { const index = this.index; this.nextToken(); while (this.match("")) { } if (this.nextToken() === "<}>") { this.skipSpace(); return true; } this.index = index; } if (!this.options.skipSpace) return false; let result = false; while (this.match("")) result = true; if (result) this.skipSpace(); return result; } skipVisualSpace() { if (!this.options.skipSpace) return; this.skipSpace(); if ([ "\\!", "\\,", "\\:", "\\;", "\\enskip", "\\enspace", "\\space", "\\quad", "\\qquad" ].includes(this.peek)) { this.nextToken(); this.skipVisualSpace(); } this.skipSpace(); } match(token) { if (this._tokens[this.index] === token) { this.index++; return true; } return false; } matchAll(tokens) { /* @__PURE__ */ console.assert(Array.isArray(tokens)); if (tokens.length === 0) return false; let matched = true; let i = 0; do { matched = this._tokens[this.index + i] === tokens[i++]; } while (matched && i < tokens.length); if (matched) this.index += i; return matched; } matchAny(tokens) { if (tokens.includes(this._tokens[this.index])) return this._tokens[this.index++]; return ""; } matchChar() { var _a; const index = this.index; let caretCount = 0; while (this.match("^")) caretCount += 1; if (caretCount < 2) this.index = index; if (caretCount >= 2) { let digits = ""; let n = 0; while (n != caretCount) { const digit = this.matchAny([ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ]); if (!digit) break; digits += digit; n += 1; } if (digits.length === caretCount) return String.fromCodePoint(Number.parseInt(digits, 16)); } else if (this.match("\\char")) { let codepoint = Math.floor((_a = this.matchLatexNumber()) != null ? _a : Number.NaN); if (!Number.isFinite(codepoint) || codepoint < 0 || codepoint > 1114111) { codepoint = 10067; } return String.fromCodePoint(codepoint); } else if (this.match("\\unicode")) { this.skipSpaceTokens(); if (this.match("<{>")) { const codepoint = this.matchLatexNumber(); if (this.match("<}>") && codepoint !== null && codepoint >= 0 && codepoint <= 1114111) { return String.fromCodePoint(codepoint); } } else { const codepoint = this.matchLatexNumber(); if (codepoint !== null && codepoint >= 0 && codepoint <= 1114111) return String.fromCodePoint(codepoint); } } this.index = index; return null; } /** If the next token matches the open delimiter, set a boundary with * the close token and return true. * * Note this method handles generic delimiters, i.e. '(' will math both * '(', '\left(', '\bigl(', etc... * * Note that the definitions for matchfix may need to include synonyms * for example: * * { * openDelimiter: '(', * closeDelimiter: ')' * } * * and * * { * openDelimiter: '\\lparen', * closeDelimiter: '\\rparen' * } * * For: * - '[': '\\lbrack' and '\\[' * - ']': '\\rbrack' and '\\]' * - '{': '\\lbrace' and '\\}' * - '}': '\\rbrace' and '\\}' * - '<': '\\langle' * - '>': '\\rangle' * - '|': '\\vert' * - '||': '\\Vert' * - '|': '\\lvert' and '\\rvert' * - '||': '\\lVert' and '\\rVert' */ matchDelimiter(open, close) { if (this.peek === "[") return false; if (Array.isArray(open)) { /* @__PURE__ */ console.assert(Array.isArray(close)); if (this.matchAll(open)) { this.addBoundary(close); return true; } return false; } const start = this.index; const closePrefix = OPEN_DELIMITER_PREFIX[this.peek]; if (closePrefix) this.nextToken(); if (open === "||" && this.matchAll(["|", "|"])) { this.addBoundary(["|", "|"]); return true; } if (!this.match(open)) { this.index = start; return false; } this.addBoundary(closePrefix ? [closePrefix, close] : [close]); return true; } parseGroup() { const start = this.index; this.skipSpaceTokens(); if (this.match("<{>")) { this.addBoundary(["<}>"]); const expr = this.parseExpression(); this.skipSpace(); if (this.matchBoundary()) return expr != null ? expr : ["Sequence"]; const from = this.index; while (!this.matchBoundary() && !this.atEnd) this.nextToken(); const err = this.error("syntax-error", from); return expr ? ["Sequence", expr, err] : err; } this.index = start; return null; } // Some LaTeX commands (but not all) can accept an argument without braces, // for example `^` , `\sqrt` or `\frac`. // This argument will usually be a single token, but can be a sequence of // tokens (e.g. `\sqrt\frac12` or `\sqrt\operatorname{speed}`). parseToken() { var _a; const excluding = [ ...'!"#$%&(),/;:?@[]\\`|~'.split(""), "\\left", "\\bigl" ]; if (excluding.includes(this.peek)) return null; if (/^[0-9]$/.test(this.peek)) return parseInt(this.nextToken()); const result = (_a = this.parseGenericExpression()) != null ? _a : this.parseSymbol(); if (!result) return null; return result; } parseOptionalGroup() { const index = this.index; this.skipSpaceTokens(); if (this.match("[")) { this.addBoundary(["]"]); const expr = this.parseExpression(); this.skipSpace(); if (this.matchBoundary()) return expr; return this.boundaryError("expected-closing-delimiter"); } this.index = index; return null; } /** * Parse an expression in a tabular format, where rows are separated by `\\` * and columns by `&`. * * Return rows of sparse columns: empty rows are indicated with `Nothing`, * and empty cells are also indicated with `Nothing`. */ parseTabular() { var _a; const result = []; let row = []; let expr = null; while (!this.atBoundary) { this.skipSpace(); if (this.match("&")) { row.push(expr != null ? expr : "Nothing"); expr = null; } else if (this.match("\\\\") || this.match("\\cr")) { this.skipSpace(); this.parseOptionalGroup(); if (expr !== null) row.push(expr); result.push(row); row = []; expr = null; } else { const cell = []; let peek = this.peek; while (peek !== "&" && peek !== "\\\\" && peek !== "\\cr" && !this.atBoundary) { expr = this.parseExpression({ minPrec: 0, condition: (p) => { const peek2 = p.peek; return peek2 === "&" || peek2 === "\\\\" || peek2 === "\\cr"; } }); if (expr) cell.push(expr); else { cell.push(["Error", ["'unexpected-token'", peek]]); this.nextToken(); } this.skipSpace(); peek = this.peek; } if (cell.length > 1) expr = ["Sequence", ...cell]; else expr = (_a = cell[0]) != null ? _a : "Nothing"; } } if (expr !== null) row.push(expr); if (row.length > 0) result.push(row); return result; } /** Parse a group as a a string, for example for `\operatorname` or `\begin` */ parseStringGroup() { const start = this.index; while (this.match("")) { } if (this.match("<{>")) { this.addBoundary(["<}>"]); const arg = this.parseStringGroupContent(); if (this.matchBoundary()) return arg; this.removeBoundary(); } this.index = start; return null; } /** Parse an environment: `\begin{env}...\end{end}` */ parseEnvironment(until) { var _a; const index = this.index; if (!this.match("\\begin")) return null; const name = (_a = this.parseStringGroup()) == null ? void 0 : _a.trim(); if (!name) return this.error("expected-environment-name", index); this.addBoundary(["\\end", "<{>", ...name.split(""), "<}>"]); for (const def of this.getDefs("environment")) if (def.identifierTrigger === name) { const expr = def.parse(this, until); this.skipSpace(); if (!this.matchBoundary()) return this.boundaryError("unbalanced-environment"); if (expr !== null) return this.decorate(expr, index); this.index = index; return null; } this.parseTabular(); this.skipSpace(); if (!this.matchBoundary()) return this.boundaryError("unbalanced-environment"); return this.error(["unknown-environment", { str: name }], index); } /** If the next token matches a `+` or `-` sign, return it and advance the index. * Otherwise return `''` and do not advance */ parseOptionalSign() { let isNegative = !!this.matchAny(["-", "\u2212"]); while (this.matchAny(["+", "\uFE62"]) || this.skipSpace()) if (this.matchAny(["-", "\u2212"])) isNegative = !isNegative; return isNegative ? "-" : "+"; } parseDecimalDigits(options) { var _a; options != null ? options : options = {}; (_a = options.withGrouping) != null ? _a : options.withGrouping = false; const result = []; let done = false; while (!done) { while (/^[0-9]$/.test(this.peek)) { result.push(this.nextToken()); this.skipVisualSpace(); } done = true; if (options.withGrouping && this.options.groupSeparator) { const savedIndex = this.index; this.skipVisualSpace(); if (this.matchAll(this._groupSeparatorTokens)) { this.skipVisualSpace(); if (/^[0-9]$/.test(this.peek)) done = false; else this.index = savedIndex; } } } return result.join(""); } parseSignedInteger(options) { var _a; options != null ? options : options = {}; (_a = options.withGrouping) != null ? _a : options.withGrouping = false; const start = this.index; const sign2 = this.parseOptionalSign(); const result = this.parseDecimalDigits(options); if (result) return sign2 === "-" ? "-" + result : result; this.index = start; return ""; } parseExponent() { const start = this.index; if (this.matchAny(["e", "E"])) { const exponent = this.parseSignedInteger({ withGrouping: false }); if (exponent) return "e" + exponent; } this.index = start; if (this.match("\\times")) { this.skipSpaceTokens(); if (this.match("1") && this.match("0") && this.match("^")) { if (/^[0-9]$/.test(this.peek)) return "e" + this.nextToken(); if (this.match("<{>")) { this.skipSpaceTokens(); const exponent = this.parseSignedInteger(); this.skipSpaceTokens(); if (this.match("<}>") && exponent) return "e" + exponent; } } } this.index = start; this.skipSpaceTokens(); if (this.match("\\%")) return `e-2`; this.index = start; if (this.matchAll(this._exponentProductTokens)) { this.skipSpaceTokens(); if (this.matchAll(this._beginExponentMarkerTokens)) { this.skipSpaceTokens(); const exponent = this.parseSignedInteger(); this.skipSpaceTokens(); if (this.matchAll(this._endExponentMarkerTokens) && exponent) return "e" + exponent; } } this.index = start; return ""; } parseRepeatingDecimal() { const start = this.index; let repeatingDecimals2 = ""; if (this.match("(")) { repeatingDecimals2 = this.parseDecimalDigits(); if (repeatingDecimals2 && this.match(")")) return "(" + repeatingDecimals2 + ")"; this.index = start; return ""; } this.index = start; if (this.matchAll([`\\left`, "("])) { repeatingDecimals2 = this.parseDecimalDigits(); if (repeatingDecimals2 && this.matchAll([`\\right`, ")"])) return "(" + repeatingDecimals2 + ")"; this.index = start; return ""; } this.index = start; if (this.matchAll([`\\overline`, "<{>"])) { repeatingDecimals2 = this.parseDecimalDigits(); if (repeatingDecimals2 && this.match("<}>")) return "(" + repeatingDecimals2 + ")"; this.index = start; return ""; } this.index = start; if (this.matchAll(this._beginRepeatingDigitsTokens)) { repeatingDecimals2 = this.parseDecimalDigits(); if (repeatingDecimals2 && this.matchAll(this._endRepeatingDigitsTokens)) return "(" + repeatingDecimals2 + ")"; this.index = start; return ""; } this.index = start; return ""; } /** * Parse a number, with an optional sign, exponent, decimal marker, * repeating decimals, etc... */ parseNumber() { if (!this.options.parseNumbers) return null; const start = this.index; this.skipVisualSpace(); this.match("+"); let result = ""; let dotPrefix = false; if (this.match(".") || this.matchAll(this._decimalMarkerTokens)) { const peek = this.peek; if (peek !== "\\overline" && peek !== this._beginRepeatingDigitsTokens[0] && !/[0-9\(]/.test(peek)) { this.index = start; return null; } dotPrefix = true; } else { result = this.parseDecimalDigits({ withGrouping: true }); if (!result) { this.index = start; return null; } } let hasDecimal = true; if (!dotPrefix && (this.match(".") || this.matchAll(this._decimalMarkerTokens))) result += "." + this.parseDecimalDigits({ withGrouping: true }); else if (dotPrefix) result = "0." + this.parseDecimalDigits({ withGrouping: true }); else hasDecimal = false; if (hasDecimal) { const repeat = this.parseRepeatingDecimal(); if (repeat) result += repeat; else if (this.match("\\ldots") || this.matchAll(this._truncationMarkerTokens)) { } } this.skipVisualSpace(); return result + this.parseExponent(); } /** * A Latex number can be a decimal, hex or octal number. * It is used in some Latex commands, such as `\char` * * From TeX:8695 (scan_int): * > An integer number can be preceded by any number of spaces and `+' or * > `-' signs. Then comes either a decimal constant (i.e., radix 10), an * > octal constant (i.e., radix 8, preceded by '), a hexadecimal constant * > (radix 16, preceded by "), an alphabetic constant (preceded by `), or * > an internal variable. */ matchLatexNumber(isInteger = true) { var _a, _b; let negative = false; let token = this.peek; while (token === "" || token === "+" || token === "-") { if (token === "-") negative = !negative; this.nextToken(); token = this.peek; } let radix = 10; let digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; if (this.match("'")) { radix = 8; digits = ["0", "1", "2", "3", "4", "5", "6", "7"]; isInteger = true; } else if (this.match('"') || this.match("x")) { radix = 16; digits = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" ]; isInteger = true; } else if (this.match("`")) { token = this.nextToken(); if (token) { if (token.startsWith("\\") && token.length === 2) { return (negative ? -1 : 1) * ((_a = token.codePointAt(1)) != null ? _a : 0); } return (negative ? -1 : 1) * ((_b = token.codePointAt(0)) != null ? _b : 0); } return null; } let value = ""; while (digits.includes(this.peek)) { value += this.nextToken(); } if (!isInteger && this.match(".")) { value += "."; while (digits.includes(this.peek)) { value += this.nextToken(); } } const result = isInteger ? Number.parseInt(value, radix) : Number.parseFloat(value); if (Number.isNaN(result)) return null; return negative ? -result : result; } parsePrefixOperator(until) { if (!until) until = { minPrec: 0 }; if (!until.minPrec) until = { ...until, minPrec: 0 }; const start = this.index; for (const [def, n] of this.peekDefinitions("prefix")) { this.index = start + n; const rhs = def.parse(this, until); if (rhs) return rhs; } this.index = start; return null; } parseInfixOperator(lhs, until) { until != null ? until : until = { minPrec: 0 }; /* @__PURE__ */ console.assert(until.minPrec !== void 0); if (until.minPrec === void 0) until = { ...until, minPrec: 0 }; const start = this.index; for (const [def, n] of this.peekDefinitions("infix")) { if (def.precedence >= until.minPrec) { this.index = start + n; const rhs = def.parse(this, lhs, until); if (rhs) return rhs; } } this.index = start; return null; } /** * This returns an array of arguments (as in a function application), * or null if there is no match. * * - 'enclosure' : will look for an argument inside an enclosure * (open/close fence) * - 'implicit': either an expression inside a pair of `()`, or just a product * (i.e. we interpret `\cos 2x + 1` as `\cos(2x) + 1`) * */ parseArguments(kind = "enclosure", until) { var _a, _b; if (this.atTerminator(until)) return null; const savedIndex = this.index; const group = this.parseEnclosure(); if (kind === "enclosure") { if (group === null) return null; return (_a = getSequence(group)) != null ? _a : []; } if (kind === "implicit") { if (head(group) === "Delimiter") return (_b = getSequence(group)) != null ? _b : []; if (group !== null) return [group]; const primary = this.parseExpression({ ...until, minPrec: 390 }); return primary === null ? null : [primary]; } this.index = savedIndex; return null; } /** If matches the normalized open delimiter, return the * expected closing delimiter. * * For example, if `delimiter` is `(`, it would match `\left\lparen` and * return `['\right', '\rparen']`, which can be matched with `matchAll()` * * If you need to match several tokens, use `matchAll()` * * @internal */ matchOpenDelimiter(openDelim, closeDelim) { var _a; const index = this.index; const closePrefix = OPEN_DELIMITER_PREFIX[this.peek]; if (closePrefix) this.nextToken(); const alternatives = (_a = DELIMITER_SHORTHAND[openDelim]) != null ? _a : [openDelim]; const result = closePrefix ? [closePrefix] : []; if (alternatives.includes("||") && this.matchAll(["|", "|"])) { result.push("|"); result.push("|"); return result; } if (!alternatives.includes(this.peek)) { this.index = index; return null; } if (CLOSE_DELIMITER[openDelim] === closeDelim) { result.push(CLOSE_DELIMITER[this.peek]); } else { result.push(closeDelim); } this.nextToken(); return result; } // matchMiddleDelimiter(delimiter: '|' | ':' | LatexToken): boolean { // const delimiters = MIDDLE_DELIMITER[delimiter] ?? [delimiter]; // if (MIDDLE_DELIMITER_PREFIX.includes(this.peek)) { // const index = this.index; // this.nextToken(); // if (delimiters.includes(this.peek)) { // this.nextToken(); // return true; // } // this.index = index; // return false; // } else if (delimiters.include(this.peek)) { // this.nextToken(); // return true; // } // return false; // } /** For error handling, when there is potentially a mismatched delimiter. * Return a LaTeX fragment of the expected closing delimiter * * @internal */ matchEnclosureOpen() { const defs = this.getDefs("matchfix"); const start = this.index; for (const def of defs) { this.index = start; if (Array.isArray(def.openDelimiter)) { if (this.matchAll(def.openDelimiter)) return tokensToString(def.closeDelimiter); continue; } const closeDelimiter = this.matchOpenDelimiter( def.openDelimiter, def.closeDelimiter ); if (closeDelimiter !== null) return tokensToString(closeDelimiter); } this.index = start; return null; } /** * Used for error handling * @internal */ matchEnclosureClose() { const defs = this.getDefs("matchfix"); const start = this.index; for (const def of defs) { this.index = start; if (Array.isArray(def.closeDelimiter)) { if (this.matchAll(def.closeDelimiter)) return tokensToString(def.openDelimiter); continue; } this.index = start; let peek = this.peek; const prefix = Object.keys(OPEN_DELIMITER_PREFIX).find( (x) => OPEN_DELIMITER_PREFIX[x] === peek ); if (prefix) this.nextToken(); let openDelimiter = []; peek = this.peek; const matchingDelim = Object.keys(CLOSE_DELIMITER).find( (x) => CLOSE_DELIMITER[x] === peek ); if (matchingDelim) openDelimiter = [matchingDelim]; if (prefix) openDelimiter = [prefix, ...openDelimiter]; if (openDelimiter.length > 0) { this.nextToken(); return tokensToString(openDelimiter); } } this.index = start; return null; } /** * An enclosure is an opening matchfix operator, an optional expression, * optionally followed multiple times by a separator and another expression, * and finally a closing matching operator. */ parseEnclosure() { const defs = this.getDefs("matchfix"); const start = this.index; for (const def of defs) { this.index = start; if (!this.matchDelimiter(def.openDelimiter, def.closeDelimiter)) continue; const bodyStart = this.index; this.skipSpace(); let body = this.parseExpression(); this.skipSpace(); if (!this.matchBoundary()) { const boundary = this._boundaries[this._boundaries.length - 1].tokens; this.removeBoundary(); this.index = bodyStart; this.skipSpace(); body = this.parseExpression(); this.skipSpace(); if (!this.matchAll(boundary)) { if (!this.atEnd) continue; this.index = start; return null; } } const result = def.parse(this, body != null ? body : ["Sequence"]); if (result !== null) return result; } this.index = start; return null; } /** * A generic expression is used for dictionary entries that take do * some complex (non-standard) parsing. This includes trig functions (to * parse implicit arguments), and integrals (to parse the integrand and * limits and the "dx" terminator). */ parseGenericExpression(until) { var _a; if (this.atTerminator(until)) return null; const start = this.index; let expr = null; const fnDefs = (_a = this.peekDefinitions("expression")) != null ? _a : []; for (const [def, tokenCount] of fnDefs) { this.index = start + tokenCount; if (typeof def.parse === "function") { expr = def.parse(this, until); if (expr !== null) return expr; } else { return def.name; } } this.index = start; return null; } /** * A function is an identifier followed by postfix operators * (`\prime`...) and some arguments. */ parseFunction(until) { if (this.atTerminator(until)) return null; const start = this.index; let fn = null; for (const [def, tokenCount] of this.peekDefinitions("function")) { this.index = start + tokenCount; if (typeof def.parse === "function") { fn = def.parse(this, until); if (fn !== null) break; } else { fn = def.name; break; } } if (fn === null) { this.index = start; fn = parseIdentifier(this); if (!this.isFunctionHead(fn)) { this.index = start; return null; } } do { const pf = this.parsePostfixOperator(fn); if (pf === null) break; fn = pf; } while (true); const seq = this.isFunctionHead(fn) ? this.parseArguments() : null; return seq ? [fn, ...seq] : fn; } parseSymbol(until) { var _a, _b; if (this.atTerminator(until)) return null; const start = this.index; for (const [def, tokenCount] of this.peekDefinitions("symbol")) { this.index = start + tokenCount; if (typeof def.parse === "function") { const result = def.parse(this, until); if (result) return result; } else return def.name; } this.index = start; const id = parseIdentifier(this); if (id === null) return null; if (((_b = (_a = this.options).parseUnknownIdentifier) == null ? void 0 : _b.call(_a, id, this)) === "symbol") return id; this.index = start; return null; } /** * Parse a sequence superfix/subfix operator, e.g. `^{*}` * * Superfix and subfix need special handling: * * - they act mostly like an infix operator, but they are commutative, i.e. * `x_a^b` should be parsed identically to `x^b_a`. * * - furthermore, in LaTeX `x^a^b` parses the same as `x^a{}^b`. * */ parseSupsub(lhs) { var _a, _b, _c; /* @__PURE__ */ console.assert(lhs !== null); const index = this.index; this.skipSpace(); const superscripts = []; const subscripts = []; let subIndex = index; while (this.peek === "_" || this.peek === "^") { if (this.match("_")) { subIndex = this.index; if (this.match("_") || this.match("^")) subscripts.push(this.error("syntax-error", subIndex)); else { const sub2 = (_b = (_a = this.parseGroup()) != null ? _a : this.parseToken()) != null ? _b : this.parseStringGroup(); if (sub2 === null) return this.error("missing", index); subscripts.push(sub2); } } else if (this.match("^")) { subIndex = this.index; if (this.match("_") || this.match("^")) superscripts.push(this.error("syntax-error", subIndex)); else { const sup = (_c = this.parseGroup()) != null ? _c : this.parseToken(); if (sup === null) return this.error("missing", index); superscripts.push(sup); } } subIndex = this.index; this.skipSpace(); } if (superscripts.length === 0 && subscripts.length === 0) { this.index = index; return lhs; } let result = lhs; if (subscripts.length > 0) { const defs = [...this.getDefs("infix")].filter( (x) => x.latexTrigger === "_" ); if (defs) { const arg = [ "Subscript", result, subscripts.length === 1 ? subscripts[0] : ["List", ...subscripts] ]; for (const def of defs) { if (typeof def.parse === "function") result = def.parse(this, arg, { minPrec: 0 }); else result = arg; if (result) break; } } } if (superscripts.length > 0) { const defs = [...this.getDefs("infix")].filter( (x) => x.latexTrigger === "^" ); if (defs) { const arg = [ "Superscript", result, superscripts.length === 1 ? superscripts[0] : ["List", ...superscripts] ]; for (const def of defs) { if (typeof def.parse === "function") result = def.parse(this, arg, { minPrec: 0 }); else result = arg; if (result) break; } } } if (result === null) this.index = index; return result; } parsePostfixOperator(lhs, until) { /* @__PURE__ */ console.assert(lhs !== null); if (lhs === null) return null; const start = this.index; for (const [def, n] of this.peekDefinitions("postfix")) { this.index = start + n; const result = def.parse(this, lhs, until); if (result !== null) return result; } this.index = start; return null; } /** Match a string used as a LaTeX identifier, for example an environment * name. * Not suitable for general purpose text, e.g. argument of a `\text{} * command. See `matchChar()` instead. */ parseStringGroupContent() { const start = this.index; let result = ""; let level = 0; while (!this.atBoundary || level > 0) { const token = this.nextToken(); if (token === "<$>" || token === "<$$>") { this.index = start; return ""; } if (token === "<{>") { level += 1; result += "\\{"; } else if (token === "<}>") { level -= 1; result += "\\}"; } else if (token === "") { result += " "; } else if (token[0] === "\\") { result += token; } else { result += token; } } return result; } /** * Apply an invisible operator between two expressions. * * If the `lhs` is an literal integer and the `rhs` is a literal rational * -> 'invisible plus' * * That is '2 3/4' -> ['Add', 2, ['Rational', 3, 4]] * * If `lhs` is a number and `rhs` is a number but not a literal -> 'invisible multiply'. * - 2x * - 2(x+1) * - x(x+1) * - f(x)g(y) * - 2 sin(x) * - 2 f(x) * - x f(x) * - (x-1)(x+1) * - (x+1)2 -> no * - x2 -> no * => lhs is a number, rhs is a number, but not a literal */ applyInvisibleOperator(until, lhs) { var _a; if (lhs === null || this.options.applyInvisibleOperator === null || head(lhs) === "Error" || symbol(lhs) === "Nothing" || isEmptySequence(lhs) || this.atTerminator(until)) return null; if (this.peekDefinitions("operator").length > 0) return null; if (this.isFunctionHead(lhs)) { const args = this.parseArguments("enclosure", { ...until, minPrec: 0 }); if (args === null) return null; return [lhs, ...args]; } const start = this.index; const rhs = this.parseExpression({ ...until, minPrec: 390 }); if (rhs === null || symbol(rhs) === "Nothing" || isEmptySequence(rhs)) { this.index = start; return null; } if (head(rhs) === "Error") return applyAssociativeOperator("Sequence", lhs, rhs); if (typeof this.options.applyInvisibleOperator === "function") return this.options.applyInvisibleOperator(this, lhs, rhs); if (this.isFunctionHead(lhs)) { const seq = getSequence(rhs); return seq ? [lhs, ...seq] : lhs; } const lhsNumber = machineValue(lhs); if (lhsNumber !== null && Number.isInteger(lhsNumber)) { const rhsHead = head(rhs); if (rhsHead === "Divide" || rhsHead === "Rational") { const [n, d] = [machineValue(op(rhs, 1)), machineValue(op(rhs, 2))]; if (n !== null && d !== null && n > 0 && n <= 1e3 && d > 1 && d <= 1e3 && Number.isInteger(n) && Number.isInteger(d)) return ["Add", lhs, rhs]; } } if (head(rhs) === "Delimiter") { if (head(op(rhs, 1)) === "Sequence") return [lhs, ...(_a = ops(op(rhs, 1))) != null ? _a : []]; if (!op(rhs, 1) || symbol(op(rhs, 1)) === "Nothing") return applyAssociativeOperator( "Sequence", lhs, this.error("expected-expression", start) ); } if (head(rhs) === "Sequence" || head(lhs) === "Sequence" || stringValue(lhs) !== null || stringValue(rhs) !== null || dictionary(lhs) !== null || dictionary(rhs) !== null) return applyAssociativeOperator("Sequence", lhs, rhs); return applyAssociativeOperator("Multiply", lhs, rhs); } /** * This is an error handling method. We've encountered a LaTeX command * but were not able to match it to any entry in the LaTeX dictionary, * or ran into it in an unexpected context (postfix operator lacking an * argument, for example) */ parseUnexpectedLatexCommand() { var _a, _b; const start = this.index; let opDefs = this.peekDefinitions("operator"); if (opDefs.length > 0) { opDefs = this.peekDefinitions("postfix"); if (opDefs.length > 0) { const [def, n] = opDefs[0]; this.index += n; if (typeof def.parse === "function") { const result = def.parse(this, this.error("missing", start)); if (result) return result; } if (def.name) return [def.name, this.error("missing", start)]; return this.error("unexpected-operator", start); } opDefs = this.peekDefinitions("prefix"); if (opDefs.length > 0) { const [def, n] = opDefs[0]; this.index += n; if (typeof def.parse === "function") { const result = def.parse(this, { minPrec: 0 }); if (result) return result; } if (def.name) return [ def.name, // @todo: pass a precedence? (_a = this.parseExpression()) != null ? _a : this.error("missing", start) ]; return this.error("unexpected-operator", start); } opDefs = this.peekDefinitions("infix"); if (opDefs.length > 0) { const [def, n] = opDefs[0]; this.index += n; if (typeof def.parse === "function") { const result = def.parse(this, this.error("missing", start), { minPrec: 0 }); if (result) return result; } if (def.name) return [ def.name, this.error("missing", start), (_b = this.parseExpression()) != null ? _b : this.error("missing", start) ]; return this.error("unexpected-operator", start); } } const command = this.peek; if (!command || command[0] !== "\\") return null; this.nextToken(); this.skipSpaceTokens(); if (command === "\\end") { const name = this.parseStringGroup(); if (name === null) return this.error("expected-environment-name", start); return this.error(["unbalanced-environment", { str: name }], start); } while (this.match("[")) { let level = 0; while (!this.atEnd && level === 0 && this.peek !== "]") { if (this.peek === "[") level += 1; if (this.peek === "]") level -= 1; this.nextToken(); } this.match("]"); } const index = this.index; this.index = start; const closeDelimiter = this.matchEnclosureOpen(); if (closeDelimiter) return this.error( ["expected-close-delimiter", { str: closeDelimiter }], index ); const openDelimiter = this.matchEnclosureClose(); if (openDelimiter) return this.error( ["expected-open-delimiter", { str: openDelimiter }], start ); this.index = index; while (this.match("<{>")) { let level = 0; while (!this.atEnd && level === 0 && this.peek !== "<}>") { if (this.peek === "<{>") level += 1; if (this.peek === "<}>") level -= 1; this.nextToken(); } this.match("<}>"); } return this.error(["unexpected-command", { str: command }], start); } /** * := * ( | | | ) * * * * * ::= * ( | ()) * * := * * * ( )* * * */ parsePrimary(until) { var _a, _b, _c; if (this.atBoundary) return null; if (this.atTerminator(until)) return null; let result = null; const start = this.index; if (this.match("<}>")) return this.error("unexpected-closing-delimiter", start); if (this.match("<{>")) { result = this.parseExpression({ minPrec: 0, condition: (p) => p.peek === "<}>" }); if (result === null) return this.error("expected-expression", start); if (!this.match("<}>")) { return this.decorate( ["Sequence", result, this.error("expected-closing-delimiter", start)], start ); } } if (result === null) { const num = this.parseNumber(); if (num !== null) result = { num }; } result != null ? result : result = this.parseEnclosure(); result != null ? result : result = this.parseEnvironment(until); if (result === null && this.matchAll(this._positiveInfinityTokens)) result = { num: "+Infinity" }; if (result === null && this.matchAll(this._negativeInfinityTokens)) result = { num: "-Infinity" }; if (result === null && this.matchAll(this._notANumberTokens)) result = { num: "NaN" }; result != null ? result : result = (_c = (_b = (_a = this.parseGenericExpression(until)) != null ? _a : this.parseFunction(until)) != null ? _b : this.parseSymbol(until)) != null ? _c : parseInvalidIdentifier(this); if (result !== null) { result = this.decorate(result, start); let postfix = null; let index = this.index; do { postfix = this.parsePostfixOperator(result, until); result = postfix != null ? postfix : result; if (this.index === index && postfix !== null) { /* @__PURE__ */ console.assert(this.index !== index, "No token consumed"); break; } index = this.index; } while (postfix !== null); } if (result !== null) result = this.parseSupsub(result); return this.decorate(result, start); } /** * Parse an expression: * * ::= * | * | * | * * Stop when an operator of precedence less than `until.minPrec` * is encountered */ parseExpression(until) { const start = this.index; this.skipSpace(); if (this.atBoundary) { this.index = start; return null; } until != null ? until : until = { minPrec: 0 }; /* @__PURE__ */ console.assert(until.minPrec !== void 0); if (until.minPrec === void 0) until = { ...until, minPrec: 0 }; let lhs = this.parsePrefixOperator({ ...until, minPrec: 0 }); if (lhs === null) { lhs = this.parsePrimary(until); if (head(lhs) === "Sequence" && nops(lhs) === 0) lhs = null; } if (lhs) { let done = false; while (!done && !this.atTerminator(until)) { this.skipSpace(); let result = this.parseInfixOperator(lhs, until); if (result === null) { result = this.applyInvisibleOperator(until, lhs); } if (result !== null) { lhs = result; } else { done = true; } } } lhs != null ? lhs : lhs = this.parseUnexpectedLatexCommand(); return this.decorate(lhs, start); } /** * Add LaTeX or other requested metadata to the expression */ decorate(expr, start) { if (expr === null) return null; if (!this.options.preserveLatex) return expr; const latex = this.latex(start, this.index); if (Array.isArray(expr)) { expr = { latex, fn: expr }; } else if (typeof expr === "number") { expr = { latex, num: Number(expr).toString() }; } else if (typeof expr === "string") { expr = { latex, sym: expr }; } else if (typeof expr === "object" && expr !== null) { expr.latex = latex; } return expr; } error(code, fromToken) { let msg; if (typeof code === "string") { /* @__PURE__ */ console.assert(!code.startsWith("'")); msg = { str: code }; } else { /* @__PURE__ */ console.assert(!code[0].startsWith("'")); msg = ["ErrorCode", { str: code[0] }, ...code.slice(1)]; } const latex = this.latex(fromToken, this.index); return latex ? ["Error", msg, ["Latex", { str: latex }]] : ["Error", msg]; } isFunctionHead(expr) { var _a, _b; if (expr === null) return false; const s = symbol(expr); if (!s) return this.computeEngine.box(expr).domain.isFunction; if (this.computeEngine && this.computeEngine.lookupFunction(s) !== void 0) return true; if (((_b = (_a = this.options).parseUnknownIdentifier) == null ? void 0 : _b.call(_a, s, this)) === "function") return true; return false; } /** Return all defs of the specified kind */ *getDefs(kind) { if (kind === "operator") { for (const def of this._dictionary.defs) if (/^prefix|infix|postfix/.test(def.kind)) yield def; } else { for (const def of this._dictionary.defs) if (def.kind === kind) yield def; } } }; function parseComplexId(parser, id) { var _a; const start = parser.index; const candidate = (_a = parseIdentifier(parser)) == null ? void 0 : _a.trim(); if (candidate === null) return 0; const result = candidate !== id ? 0 : parser.index - start; parser.index = start; return result; } function formatFractionalPart(m, options) { const originalLength = m.length; const originalM = m; if (options.beginRepeatingDigits && options.endRepeatingDigits) { m = m.slice(0, -1); for (let i = 0; i < m.length - 16; i++) { const offset = m.substring(0, i); for (let j = 0; j < 17; j++) { const cycle = m.substring(i, i + j + 1); const times = Math.floor((m.length - offset.length) / cycle.length); if (times <= 3) break; if ((offset + cycle.repeat(times + 1)).startsWith(m)) { if (cycle === "0") { return offset.replace(/(\d{3})/g, "$1" + options.groupSeparator); } return offset.replace(/(\d{3})/g, "$1" + options.groupSeparator) + options.beginRepeatingDigits + cycle + options.endRepeatingDigits; } } } } const extraDigits = originalLength > options.precision - 1; m = originalM; if (extraDigits) m = m.substring(0, options.precision - 1); if (options.groupSeparator) { m = m.replace(/(\d{3})/g, "$1" + options.groupSeparator); if (m.endsWith(options.groupSeparator)) { m = m.slice(0, -options.groupSeparator.length); } } if (extraDigits) return m + options.truncationMarker; return m; } function formatExponent(exp2, options) { var _a; if (!exp2) return ""; if (options.beginExponentMarker) { return options.beginExponentMarker + exp2 + ((_a = options.endExponentMarker) != null ? _a : ""); } return "10^{" + exp2 + "}"; } function serializeNumber(expr, options) { var _a; if (expr === null) return ""; let num; if (typeof expr === "number" || typeof expr === "string") { num = expr; } else if (typeof expr === "object" && "num" in expr) { num = expr.num; } else return ""; if (typeof num === "number") { if (num === Infinity) return options.positiveInfinity; else if (num === -Infinity) return options.negativeInfinity; else if (Number.isNaN(num)) return options.notANumber; let result2 = void 0; if (options.notation === "engineering") result2 = serializeScientificNotationNumber( num.toExponential(), options, 3 ); else if (options.notation === "scientific") result2 = serializeScientificNotationNumber(num.toExponential(), options); return result2 != null ? result2 : serializeAutoNotationNumber(num.toString(), options); } num = num.toLowerCase().replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); if (num === "infinity" || num === "+infinity") return options.positiveInfinity; else if (num === "-infinity") return options.negativeInfinity; else if (num === "nan") return options.notANumber; if (!/^[-+\.]?[0-9]/.test(num)) return ""; num = num.replace(/[nd]$/, ""); if (/\([0-9]+\)/.test(num)) { const [_, body, repeat, trail] = (_a = num.match(/(.+)\(([0-9]+)\)(.*)$/)) != null ? _a : []; num = body + repeat.repeat(Math.ceil(options.precision / repeat.length)) + trail; } let sign2 = ""; if (num[0] === "-") { sign2 = "-"; num = num.substring(1); } else if (num[0] === "+") { num = num.substring(1); } while (num[0] === "0") num = num.substring(1); if (num.length === 0) num = "0"; else if (num[0] === ".") num = "0" + num; let result = void 0; if (options.notation === "engineering") result = serializeScientificNotationNumber(num, options, 3); else if (options.notation === "scientific") result = serializeScientificNotationNumber(num, options); return sign2 + (result != null ? result : serializeAutoNotationNumber(num, options)); } function serializeScientificNotationNumber(valString, options, expMultiple = 1) { var _a; let m = valString.match(/^(.*)[e|E]([-+]?[0-9]+)$/); if (!m) { let sign2 = ""; if (valString[0] === "-") { sign2 = "-"; valString = valString.substring(1); } else if (valString[0] === "+") { valString = valString.substring(1); } if (valString.indexOf(".") < 0) { if (valString.length === 1) { valString = sign2 + valString + "e+0"; } else { valString = sign2 + valString[0] + "." + valString.slice(1) + "e+" + (valString.length - 1).toString(); } } else { let [_, whole, fraction] = valString.match(/^(.*)\.(.*)$/); if (!fraction) fraction = ""; while (whole.startsWith("0")) whole = whole.substring(1); if (!whole) { valString = sign2 + "0." + fraction + "e+0"; } else { valString = sign2 + whole[0] + "." + whole.slice(1) + fraction + "e+" + (whole.length - 1).toString(); } } m = valString.match(/^(.*)[e|E]([-+]?[0-9]+)$/); } /* @__PURE__ */ console.assert(m); if (!m) return serializeAutoNotationNumber(valString, options); let exponent = parseInt(m[2]); let mantissa = m[1]; if (Math.abs(exponent) % expMultiple !== 0) { const adjust = exponent > 0 ? exponent % expMultiple : -((expMultiple + exponent) % expMultiple); exponent = exponent >= 0 ? exponent - adjust : exponent + adjust; let [_, whole, fraction] = (_a = mantissa.match(/^(.*)\.(.*)$/)) != null ? _a : [ "", mantissa, "" ]; mantissa = whole + (fraction + "00000000000000000").slice(0, Math.abs(adjust)) + "." + fraction.slice(Math.abs(adjust)); } const avoid = options.avoidExponentsInRange; if (avoid && exponent >= avoid[0] && exponent <= avoid[1]) return void 0; let fractionalPart = ""; let wholePart = mantissa; m = wholePart.match(/^(.*)\.(.*)$/); if (m) { wholePart = m[1]; fractionalPart = m[2]; } const expString = exponent !== 0 ? formatExponent(Number(exponent).toString(), options) : ""; if (options.groupSeparator) { wholePart = wholePart.replace( /\B(?=(\d{3})+(?!\d))/g, options.groupSeparator ); fractionalPart = formatFractionalPart(fractionalPart, options); } if (fractionalPart) fractionalPart = options.decimalMarker + fractionalPart; if (!expString) return wholePart + fractionalPart; if (wholePart === "1" && !fractionalPart) return expString; return wholePart + fractionalPart + options.exponentProduct + expString; } function serializeAutoNotationNumber(valString, options) { var _a; let m = valString.match(/^(.*)[e|E]([-+]?[0-9]+)$/i); let exponent = void 0; if ((m == null ? void 0 : m[1]) && m[2]) { exponent = formatExponent(m[2], options); } let wholePart = (_a = m == null ? void 0 : m[1]) != null ? _a : valString; let fractionalPart = ""; m = (exponent ? m[1] : valString).match(/^(.*)\.(.*)$/); if ((m == null ? void 0 : m[1]) && m[2]) { wholePart = m[1]; fractionalPart = m[2]; } if (options.groupSeparator) { wholePart = wholePart.replace( /\B(?=(\d{3})+(?!\d))/g, options.groupSeparator ); fractionalPart = formatFractionalPart(fractionalPart, options); } if (fractionalPart) fractionalPart = options.decimalMarker + fractionalPart; if (!exponent) return wholePart + fractionalPart; if (wholePart === "1" && !fractionalPart) return exponent; return wholePart + fractionalPart + options.exponentProduct + exponent; } var ACCENT_MODIFIERS = { deg: (s) => `${s}\\degree`, prime: (s) => `${s}^{\\prime}`, dprime: (s) => `${s}^{\\doubleprime}`, ring: (s) => `\\mathring{${s}}`, hat: (s) => `\\hat{${s}}`, tilde: (s) => `\\tilde{${s}}`, vec: (s) => `\\vec{${s}}`, bar: (s) => `\\overline{${s}}`, underbar: (s) => `\\underline{${s}}`, dot: (s) => `\\dot{${s}}`, ddot: (s) => `\\ddot{${s}}`, tdot: (s) => `\\dddot{${s}}`, qdot: (s) => `\\ddddot{${s}}`, // Supplemental acute: (s) => `\\acute{${s}}`, grave: (s) => `\\grave{${s}}`, breve: (s) => `\\breve{${s}}`, check: (s) => `\\check{${s}}` }; var STYLE_MODIFIERS = { upright: (s) => `\\mathrm{${s}}`, italic: (s) => `\\mathit{${s}}`, bold: (s) => `\\mathbf{${s}}`, script: (s) => `\\mathscr{${s}}`, fraktur: (s) => `\\mathfrak{${s}}`, // Note Unicode uses 'fraktur' for 'gothic' doublestruck: (s) => `\\mathbb{${s}}`, // Unicode uses 'double-struck' for 'blackboard' // Supplemental blackboard: (s) => `\\mathbb{${s}}`, calligraphic: (s) => `\\mathcal{${s}}`, gothic: (s) => `\\mathfrak{${s}}`, sansserif: (s) => `\\mathsf{${s}}`, monospace: (s) => `\\mathtt{${s}}` }; var Serializer = class { constructor(options, dictionary2, onError) { this.level = -1; this.options = options; if (options.invisibleMultiply) { if (!/#1/.test(options.invisibleMultiply) || !/#2/.test(options.invisibleMultiply)) { onError([ { severity: "warning", message: ["expected-argument", "invisibleMultiply"] } ]); } } this.onError = onError; this.dictionary = dictionary2; this.canonical = void 0; } updateOptions(opt) { for (const k of Object.keys(this.options)) if (k in opt) this.options[k] = opt[k]; } /** * Serialize the expression, and if the expression is an operator * of precedence less than or equal to prec, wrap it in some paren. * @todo: don't wrap Abs, Floor, Ceil, Delimiter */ wrap(expr, prec) { if (expr === null) return ""; if (prec === void 0) { return this.wrapString( this.serialize(expr), this.options.groupStyle(expr, this.level + 1) ); } if (typeof expr === "number" || isNumberObject(expr) || typeof expr === "string" || isSymbolObject(expr)) { return this.serialize(expr); } const name = head(expr); if (typeof name === "string" && name !== "Delimiter" && name !== "Subscript") { const def = this.dictionary.ids.get(name); if (def && (def.kind === "symbol" || def.kind === "prefix" || def.kind === "infix" || def.kind === "postfix") && def.precedence < prec) return this.wrapString( this.serialize(expr), this.options.applyFunctionStyle(expr, this.level) ); } return this.serialize(expr); } /** * If this is a "short" expression, wrap it. * Do not wrap identifiers, positive numbers or functions. * * This is called by the serializer for power and division (i.e. "(a+1)/b") * */ wrapShort(expr) { if (expr === null) return ""; const exprStr = this.serialize(expr); if (symbol(expr) !== null) return exprStr; if (head(expr) === "Delimiter" && nops(expr) === 1) return exprStr; const isNum = isNumberExpression(expr); if (isNum && !/^(-|\.)/.test(exprStr)) return exprStr; const h = head(expr); if (h !== "Add" && h !== "Negate" && h !== "Subtract" && h !== "PlusMinus" && h !== "Multiply") return exprStr; return this.wrapString( exprStr, this.options.groupStyle(expr, this.level + 1) ); } wrapString(s, style, fence) { var _a, _b; if (style === "none") return s; if (fence === void 0) fence = "()"; const openFence = (_a = fence == null ? void 0 : fence[0]) != null ? _a : "."; const closeFence = (_b = fence == null ? void 0 : fence[1]) != null ? _b : "."; if ((openFence === "." || closeFence === ".") && style === "paren") style = "leftright"; if (style === "leftright") return `\\left${openFence}${s}\\right${closeFence}}`; if (style === "big") return `${openFence === "." ? "" : `\\Bigl${openFence}`}${s}${closeFence === "." ? "" : `\\Bigr${closeFence}`})`; return openFence + s + closeFence; } wrapArguments(expr) { var _a; return this.wrapString( ((_a = ops(expr)) != null ? _a : []).map((x) => this.serialize(x)).join(", "), this.options.applyFunctionStyle(expr, this.level) ); } serializeSymbol(expr, def) { var _a, _b, _c, _d, _e; /* @__PURE__ */ console.assert(typeof expr === "string" || isSymbolObject(expr)); if ((def == null ? void 0 : def.kind) === "function") { return (_b = serializeIdentifier((_a = symbol(expr)) != null ? _a : "")) != null ? _b : ""; } return (_e = (_d = (_c = def == null ? void 0 : def.serialize) == null ? void 0 : _c.call(def, this, expr)) != null ? _d : serializeIdentifier(symbol(expr))) != null ? _e : ""; } serializeFunction(expr, def) { var _a; if (def == null ? void 0 : def.serialize) return def.serialize(this, expr); const h = head(expr); if (typeof h === "string") return serializeIdentifier(h, "auto") + this.wrapArguments(expr); const args = (_a = ops(expr)) != null ? _a : []; if (args.length === 1) { return joinLatex([ this.serialize(args[0]), "\\rhd", this.wrapString( this.serialize(h), this.options.applyFunctionStyle(expr, this.level) ) ]); } const style = this.options.applyFunctionStyle(expr, this.level); return joinLatex([ "\\operatorname{apply}", this.wrapString( this.serialize(h) + ", " + this.serialize(["List", ...args]), style ) ]); } serializeDictionary(dict) { return `\\left\\lbrack\\begin{array}{lll}${Object.keys(dict).map((x) => { return `\\textbf{${x}} & \\rightarrow & ${this.serialize(dict[x])}`; }).join("\\\\")}\\end{array}\\right\\rbrack`; } serialize(expr, options) { if (expr === null || expr === void 0) return ""; options != null ? options : options = {}; options = { ...options }; if (!("canonical" in options)) options.canonical = true; const savedCanonical = this.canonical; if (this.canonical === void 0) this.canonical = options.canonical; this.level += 1; try { const result = (() => { const numericValue = serializeNumber(expr, this.options); if (numericValue) return numericValue; const s = stringValue(expr); if (s !== null) return `\\text{${s}}`; const dict = dictionary(expr); if (dict !== null) return this.serializeDictionary(dict); const symbolName = symbol(expr); if (symbolName !== null) { return this.serializeSymbol( expr, this.dictionary.ids.get(symbolName) ); } const fnName = headName(expr); if (fnName) { return this.serializeFunction(expr, this.dictionary.ids.get(fnName)); } if (head(expr) !== null) return this.serializeFunction(expr); this.onError([ { severity: "warning", message: [ "syntax-error", expr ? JSON.stringify(expr) : "undefined" ] } ]); })(); this.level -= 1; this.canonical = savedCanonical; return result != null ? result : ""; } catch (e) { } this.level -= 1; this.canonical = savedCanonical; return ""; } applyFunctionStyle(expr, level) { return this.options.applyFunctionStyle(expr, level); } groupStyle(expr, level) { return this.options.groupStyle(expr, level); } rootStyle(expr, level) { return this.options.rootStyle(expr, level); } fractionStyle(expr, level) { return this.options.fractionStyle(expr, level); } logicStyle(expr, level) { return this.options.logicStyle(expr, level); } powerStyle(expr, level) { return this.options.powerStyle(expr, level); } numericSetStyle(expr, level) { return this.options.numericSetStyle(expr, level); } }; function specialName(s) { var _a, _b; const prefix = (_b = (_a = s.match(/^([^_]+)/)) == null ? void 0 : _a[1]) != null ? _b : ""; let i = SYMBOLS.findIndex((x) => prefix === x[0]); if (i >= 0) return [SYMBOLS[i][1], s.substring(SYMBOLS[i][0].length)]; const DIGITS = { zero: "0", one: "1", two: "2", three: "3", four: "4", five: "5", six: "6", seven: "7", eight: "8", nine: "9", ten: "10" }; i = Object.keys(DIGITS).findIndex((x) => s.startsWith(x)); if (i >= 0) { const key = Object.keys(DIGITS)[i]; return [DIGITS[key], s.substring(key.length)]; } const code = s.codePointAt(0); i = SYMBOLS.findIndex((x) => x[2] === code); if (i >= 0) return [SYMBOLS[i][1], s.substring(1)]; const EXTRA_SYMBOLS = { plus: "+", minus: "-", pm: "\\pm", ast: "\\ast", dag: "\\dag", ddag: "\\ddag", hash: "\\#", bottom: "\\bot", top: "\\top", bullet: "\\bullet", circle: "\\circ", diamond: "\\diamond", times: "\\times", square: "\\square", star: "\\star" }; i = Object.keys(EXTRA_SYMBOLS).findIndex((x) => prefix === x); if (i >= 0) { const key = Object.keys(EXTRA_SYMBOLS)[i]; return [EXTRA_SYMBOLS[key], s.substring(key.length)]; } return [prefix, s.substring(prefix.length)]; } function parseModifiers(s) { let [body, rest] = specialName(s); const accent = []; while (rest.length > 0) { const m = rest.match(/^_([a-zA-Z]+)(.*)/); if (!m) break; if (!ACCENT_MODIFIERS[m[1]]) break; accent.push(m[1]); rest = m[2]; } const styles = []; while (rest.length > 0) { const m = rest.match(/^_([a-zA-Z]+)(.*)/); if (!m) break; if (!STYLE_MODIFIERS[m[1]]) break; styles.push(m[1]); rest = m[2]; } return [body, accent, styles, rest]; } function parseIdentifierBody2(s, topLevel = true, style = "auto") { let [body, accents, styles, rest] = parseModifiers(s); for (const accent of accents) { if (ACCENT_MODIFIERS[accent]) body = ACCENT_MODIFIERS[accent](body); } if (topLevel) { const sups = []; const subs2 = []; const m = body.match(/^([^\d].*?)(\d+)$/); if (m) { subs2.push(m[2]); body = m[1]; } while (rest.length > 0) { if (rest.startsWith("__")) { const [sup, rest2] = parseIdentifierBody2( rest.substring(2), false, "none" ); sups.push(sup); rest = rest2; } else if (rest.startsWith("_")) { const [sub2, rest2] = parseIdentifierBody2( rest.substring(1), false, "none" ); subs2.push(sub2); rest = rest2; } else { break; } } if (sups.length > 0) body = `${body}^{${sups.join(",")}}`; if (subs2.length > 0) body = `${body}_{${subs2.join(",")}}`; } for (const style2 of styles) { if (STYLE_MODIFIERS[style2]) body = STYLE_MODIFIERS[style2](body); } if (styles.length === 0 && style !== "none") { switch (style) { case "auto": if (countTokens(body) > 1) body = `\\mathrm{${body}}`; break; case "operator": body = `\\operatorname{${body}}`; break; case "italic": body = `\\mathit{${body}}`; break; case "upright": body = `\\mathrm{${body}}`; break; } } return [body, rest]; } function serializeIdentifier(s, style = "auto") { if (s === null) return null; if (ONLY_EMOJIS.test(s)) return s; const m = s.match(/^(_+)(.*)/); if (m) { const [body2, rest2] = parseIdentifierBody2(m[2], true, "none"); return `\\operatorname{${"\\_".repeat(m[1].length) + body2 + rest2}}`; } const [body, rest] = parseIdentifierBody2(s, true, style); if (rest.length > 0) return `\\operatorname{${s}}`; return body; } var DEFAULT_SERIALIZE_LATEX_OPTIONS = { invisibleMultiply: "", // '\\cdot', invisiblePlus: "", // '+', // invisibleApply: '', multiply: "\\times", missingSymbol: "\\blacksquare", // openGroup: '(', // closeGroup: ')', // divide: '\\frac{#1}{#2}', // subtract: '#1-#2', // add: '#1+#2', // negate: '-#1', // squareRoot: '\\sqrt{#1}', // nthRoot: '\\sqrt[#2]{#1}', applyFunctionStyle: getApplyFunctionStyle, groupStyle: getGroupStyle, rootStyle: getRootStyle, fractionStyle: getFractionStyle, logicStyle: getLogicStyle, powerStyle: getPowerStyle, numericSetStyle: getNumericSetStyle }; var LatexSyntax = class _LatexSyntax { constructor(options) { var _a, _b; const onError = (warnings) => { if (typeof window !== "undefined") { for (const warning of warnings) console.warn(warning.message); } return; }; this.onError = (_a = options.onError) != null ? _a : onError; this.computeEngine = options.computeEngine; const opts = { ...options }; delete opts.dictionary; delete opts.onError; this.options = { ...DEFAULT_LATEX_NUMBER_OPTIONS, ...DEFAULT_PARSE_LATEX_OPTIONS, ...DEFAULT_SERIALIZE_LATEX_OPTIONS, ...opts }; this._dictionaryInput = (_b = options.dictionary) != null ? _b : _LatexSyntax.getDictionary(); this._dictionary = indexLatexDictionary( this._dictionaryInput, (sig) => this.onError([sig]) ); } get dictionary() { return this._dictionaryInput; } set dictionary(val) { this._dictionaryInput = val; this._dictionary = indexLatexDictionary(val, (sig) => this.onError([sig])); } updateOptions(opt) { for (const k of Object.keys(this.options)) if (k in opt) this.options[k] = opt[k]; this.serializer.updateOptions(opt); } static getDictionary(category = "all") { if (category === "all") { const result = []; for (const domain of Object.keys(DEFAULT_LATEX_DICTIONARY)) if (DEFAULT_LATEX_DICTIONARY[domain]) result.push(...DEFAULT_LATEX_DICTIONARY[domain]); return result; } if (!DEFAULT_LATEX_DICTIONARY[category]) return []; return Object.freeze([...DEFAULT_LATEX_DICTIONARY[category]]); } parse(latex) { const parser = new _Parser( tokenize(latex, []), this.options, this._dictionary, this.computeEngine ); let expr = parser.parseExpression(); if (!parser.atEnd) { const opDefs = parser.peekDefinitions("infix"); if (opDefs.length > 0) { const start = parser.index; const [def, n] = opDefs[0]; parser.index += n; const result = def.parse( parser, expr != null ? expr : parser.error("missing", start), { minPrec: 0 } ); if (result) return result; if (def.name) { return [ def.name, expr != null ? expr : parser.error("missing", start), parser.error("missing", start) ]; } parser.index = start; } const index = parser.index; const id = parseIdentifier(parser); if (id) { const idError = parser.error(["unexpected-identifier", id], index); return expr ? ["Sequence", expr, idError] : idError; } let openDelimiter = parser.peek; const closeDelimiter = parser.matchEnclosureOpen(); if (closeDelimiter) { parser.parseExpression(); parser.match(closeDelimiter); const enclosureError = parser.error( ["unexpected-open-delimiter", { str: openDelimiter }], index ); return expr ? ["Sequence", expr, enclosureError] : enclosureError; } openDelimiter = parser.matchEnclosureClose(); if (openDelimiter) { const enclosureError = parser.error( ["expected-open-delimiter", { str: openDelimiter }], index ); return expr ? ["Sequence", expr, enclosureError] : enclosureError; } const rest = parser.index; const token = parser.nextToken(); while (!parser.atEnd) parser.nextToken(); if (!token) return parser.error("syntax-error", rest); const error = parser.error( [ token.length > 1 && token.startsWith("\\") ? "unexpected-command" : "unexpected-token", { str: tokensToString([token]) } ], rest ); expr = expr ? ["Sequence", expr, error] : error; } expr != null ? expr : expr = ["Sequence"]; if (this.options.preserveLatex) { if (Array.isArray(expr)) expr = { latex, fn: expr }; else if (typeof expr === "number") expr = { latex, num: Number(expr).toString() }; else if (typeof expr === "string") expr = { latex, sym: expr }; else if (typeof expr === "object" && expr !== null) expr.latex = latex; } return expr != null ? expr : ["Sequence"]; } serialize(expr, options) { return this.serializer.serialize(expr, options); } get serializer() { if (this._serializer) return this._serializer; this._serializer = new Serializer( this.options, this._dictionary, this.onError ); return this._serializer; } }; var import_complex2 = __toESM(require_complex()); var import_complex = __toESM(require_complex()); var MACHINE_PRECISION_BITS = 53; var MACHINE_PRECISION = Math.log10( Math.pow(2, MACHINE_PRECISION_BITS) ); var MACHINE_TOLERANCE_BITS = 7; var MACHINE_TOLERANCE = Math.pow( 2, -(MACHINE_PRECISION_BITS - MACHINE_TOLERANCE_BITS) ); var NUMERIC_TOLERANCE = Math.pow(10, -10); var SMALL_INTEGER = 1e6; var MAX_ITERATION = 1e6; var MAX_SYMBOLIC_TERMS = 200; var SMALL_PRIMES = /* @__PURE__ */ new Set([ 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, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919 ]); var LARGEST_SMALL_PRIME = 7919; function primeFactors(n) { var _a, _b; /* @__PURE__ */ console.assert( Number.isInteger(n) && n >= 0 && n < Number.MAX_SAFE_INTEGER, n ); if (n <= 3) return { [n]: 1 }; const result = {}; let count = 0; while (n % 2 === 0) { count += 1; n /= 2; } if (count > 0) result[2] = count; count = 0; while (n % 3 === 0) { count += 1; n /= 3; } if (count > 0) result[3] = count; let done = false; while (!done) { if (n === 1) return result; const sr = Math.sqrt(n); done = true; for (let i = 6; i <= sr + 6; i += 6) { if (n % (i - 1) === 0) { result[i - 1] = ((_a = result[i - 1]) != null ? _a : 0) + 1; n /= i - 1; done = false; break; } if (n % (i + 1) === 0) { result[i + 1] = ((_b = result[i + 1]) != null ? _b : 0) + 1; n /= i + 1; done = false; break; } } } if (result[n] !== void 0) result[n] += 1; else result[n] = 1; return result; } function factorPower(n, exponent) { if (n >= Number.MAX_SAFE_INTEGER) return [1, n]; /* @__PURE__ */ console.assert(Number.isInteger(n) && n > 0 && n < Number.MAX_SAFE_INTEGER); const factors = primeFactors(n); let f = 1; let r = 1; for (const k of Object.keys(factors)) { const v = parseInt(k); f = f * Math.pow(v, Math.floor(factors[k] / exponent)); r = r * Math.pow(v, factors[k] % exponent); } return [f, r]; } function gcd(a, b) { if (a === 0) return b; if (b === 0) return a; if (a === b) return a; if (!Number.isInteger(a) || !Number.isInteger(b)) return NaN; while (b !== 0) [a, b] = [b, a % b]; return a < 0 ? -a : a; } function lcm(a, b) { return a * b / gcd(a, b); } function factorial(n) { if (!Number.isInteger(n) || n < 0) return NaN; let val = 1; for (let i = 2; i <= n; i++) val = val * i; return val; } var gammaG = 7; var lanczos_7_c = [ 0.9999999999998099, 676.5203681218851, -1259.1392167224028, 771.3234287776531, -176.6150291621406, 12.507343278686905, -0.13857109526572012, 9984369578019572e-21, 15056327351493116e-23 ]; var gammaGLn = 607 / 128; var gammaPLn = [ 0.999999999999997, 57.15623566586292, -59.59796035547549, 14.13609797474174, -0.4919138160976202, 3399464998481188e-20, 4652362892704857e-20, -9837447530487956e-20, 1580887032249125e-19, -21026444172410488e-20, 2174396181152126e-19, -1643181065367639e-19, 8441822398385274e-20, -261908384015814e-19, 3689918265953162e-21 ]; function lngamma(z) { if (z < 0) return NaN; let x = gammaPLn[0]; for (let i = gammaPLn.length - 1; i > 0; --i) x += gammaPLn[i] / (z + i); const t = z + gammaGLn + 0.5; return 0.5 * Math.log(2 * Math.PI) + (z + 0.5) * Math.log(t) - t + Math.log(x) - Math.log(z); } function gamma(z) { if (z < 0.5) return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z)); if (z > 100) return Math.exp(lngamma(z)); z -= 1; let x = lanczos_7_c[0]; for (let i = 1; i < gammaG + 2; i++) x += lanczos_7_c[i] / (z + i); const t = z + gammaG + 0.5; return Math.sqrt(2 * Math.PI) * Math.pow(t, z + 0.5) * Math.exp(-t) * x; } function fromDigits(s, base = 10) { let value = 0; for (let i = 0; i < s.length; i++) { const k = { " ": -1, "\xA0": -1, // NBS "\u2000": -1, // EN QUAD "\u2001": -1, // EM QUAD "\u2002": -1, // EN SPACE "\u2003": -1, // EM SPACE "\u2004": -1, // THREE-PER-EM SPACE "\u2005": -1, // FOUR-PER-EM SPACE "\u2006": -1, // SIX-PER-EM SPACE "\u2007": -1, // FIGURE SPACE "\u2008": -1, // PUNCTUATION SPACE "\u2009": -1, // THIN SPACE "\u200A": -1, // HAIR SPACE "\u200B": -1, // ZWS "\u202F": -1, // NARROW NBS "\u205F": -1, // MEDIUM MATHEMATICAL SPACE "_": -1, ",": -1, "0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "a": 10, "b": 11, "c": 12, "d": 13, "e": 14, "f": 15, "g": 16, "h": 17, "i": 18, "j": 19, "k": 20, "l": 21, "m": 22, "n": 23, "o": 24, "p": 25, "q": 26, "r": 27, "s": 28, "t": 29, "u": 30, "v": 31, "w": 32, "x": 33, "y": 34, "z": 35 }[s[i]]; if (k !== -1) { if (k === void 0) return [value, s.substring(i)]; if (k >= base) return [value, s.substring(i)]; value = value * base + k; } } return [value, ""]; } function asFloat(expr) { const num = expr.numericValue; if (num === null) return null; if (typeof num === "number") return num; if (num instanceof decimal_default) return num.toNumber(); if (Array.isArray(num)) { const [n, d] = num; if (typeof n === "number" && typeof d === "number") return n / d; return Number(n) / Number(d); } /* @__PURE__ */ console.assert(!(num instanceof import_complex.default) || num.im !== 0); return null; } function asBignum(expr) { const num = expr.numericValue; if (num === null) return null; if (num instanceof decimal_default) return num; if (typeof num === "number") return expr.engine.bignum(num); if (Array.isArray(num)) { const [n, d] = num; if (typeof n === "number" && typeof d === "number") return expr.engine.bignum(n / d); return expr.engine.bignum(n).div(d.toString()); } /* @__PURE__ */ console.assert(!(num instanceof import_complex.default) || num.im !== 0); return null; } function asSmallInteger(expr) { const num = expr.numericValue; if (num === null) return null; if (typeof num === "number") { if (Number.isInteger(num) && num >= -SMALL_INTEGER && num <= SMALL_INTEGER) return num; return null; } if (num instanceof decimal_default) { if (num.isInteger()) { const n = num.toNumber(); if (n >= -SMALL_INTEGER && n <= SMALL_INTEGER) return n; } return null; } if (expr.isCanonical) return null; const r = num; if (Array.isArray(r)) { const [n, d] = r; let v; if (typeof n === "number" && typeof d === "number") v = n / d; else v = Number(n) / Number(d); if (Number.isInteger(v) && v >= -SMALL_INTEGER && v <= SMALL_INTEGER) return v; return null; } return null; } function chop(n, tolerance) { if (typeof n === "number" && Math.abs(n) <= tolerance) return 0; if (n instanceof decimal_default && n.abs().lte(tolerance)) return 0; if (n instanceof import_complex.default && Math.abs(n.re) <= tolerance && Math.abs(n.im) <= tolerance) return 0; return n; } function erf(x) { const a1 = 0.254829592; const a2 = -0.284496736; const a3 = 1.421413741; const a4 = -1.453152027; const a5 = 1.061405429; const p = 0.3275911; const sign2 = x < 0 ? -1 : 1; x = Math.abs(x); const t = 1 / (1 + p * x); const y = ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t; return sign2 * (1 - y * Math.exp(-x * x)); } function bigint(a) { var _a; if (typeof a === "bigint") return a; if (a instanceof decimal_default) return bigint(a.toString()); let s = a.toString(); const m = s.match(/([^\.]+)(?:\.([0-9]+))?e(.+)$/); if (m) { s = m[1] + ((_a = m[2]) != null ? _a : "") + "0".repeat(parseInt(m[3]) - (m[2] ? m[2].length : 0)); } return BigInt(s); } function gcd2(a, b) { while (b !== BigInt(0)) [a, b] = [b, a % b]; return a < 0 ? -a : a; } var PRIME_WHEEL_INC = [ BigInt(4), BigInt(2), BigInt(4), BigInt(2), BigInt(4), BigInt(6), BigInt(2), BigInt(6) ]; function primeFactors2(d) { var _a, _b; if (d < Number.MAX_SAFE_INTEGER) { const factors = primeFactors(Number(d)); const result2 = /* @__PURE__ */ new Map(); for (const f of Object.keys(factors)) result2.set(bigint(f), factors[f]); return result2; } let n = d; const result = /* @__PURE__ */ new Map(); let count2 = 0; let count3 = 0; let count5 = 0; let k = BigInt(10); while (n % k === BigInt(0)) { count2 += 1; count5 += 1; n = n / k; } k = BigInt(5); while (n % k === BigInt(0)) { count5 += 1; n = n / k; } k = BigInt(3); while (n % k === BigInt(0)) { count3 += 1; n = n / k; } k = BigInt(2); while (n % k === BigInt(0)) { count2 += 1; n = n / k; } if (count2 > 0) result.set("2", count2); if (count3 > 0) result.set("3", count3); if (count5 > 0) result.set("5", count5); k = BigInt(7); let kIndex = ""; let i = 0; while (k * k < n) { if (n % k === BigInt(0)) { if (!kIndex) kIndex = k.toString(); result.set(kIndex, ((_a = result.get(kIndex)) != null ? _a : 0) + 1); n = n / k; } else { k = k + PRIME_WHEEL_INC[i]; kIndex = ""; i = i < 7 ? i + 1 : 0; } } if (n !== BigInt(1)) result.set(n.toString(), ((_b = result.get(n.toString())) != null ? _b : 0) + 1); const r = /* @__PURE__ */ new Map(); for (const [k2, v] of result) r.set(bigint(k2), v); return r; } function factorPower2(n, exponent) { const factors = primeFactors2(n); let f = BigInt(1); let r = BigInt(1); const exp2 = bigint(exponent); for (const [k, v] of factors) { const v2 = bigint(v); f = f * k ** (v2 / exp2); r = r * k ** (v2 % exp2); } return [f, r]; } function isLatexString(s) { if (typeof s === "string") return s.startsWith("$") && s.endsWith("$"); return false; } function latexString(s) { if (typeof s === "string" && s.startsWith("$") && s.endsWith("$")) return s.slice(1, -1); return null; } function getImaginaryCoef(expr) { if (expr.symbol === "ImaginaryUnit") return 1; const z = expr.numericValue; if (z !== null && z instanceof import_complex2.default && z.re === 0) return z.im; if (expr.head === "Negate") { const v = getImaginaryCoef(expr.op1); if (v === null) return null; return -v; } if (expr.head === "Multiply" && expr.nops === 2) { if (expr.op1.symbol === "ImaginaryUnit") return asFloat(expr.op2); if (expr.op2.symbol === "ImaginaryUnit") return asFloat(expr.op1); } return 0; } function getFreeVars(expr, set) { if (expr.symbol) { const def = expr.engine.lookupSymbol(expr.symbol); if ((def == null ? void 0 : def.value) === void 0) set.add(expr.symbol); return; } if (!expr.ops && !expr.keys) return; if (expr.ops) for (const op3 of expr.ops) getFreeVars(op3, set); if (expr.keys) for (const key of expr.keys) getFreeVars(expr.getKey(key), set); return; } function getSymbols(expr, set) { if (expr.symbol) { set.add(expr.symbol); return; } if (!expr.ops && !expr.keys) return; if (expr.ops) for (const op3 of expr.ops) getSymbols(op3, set); if (expr.keys) for (const key of expr.keys) getSymbols(expr.getKey(key), set); return; } function getSubexpressions(expr, head2) { const result = !head2 || expr.head === head2 ? [expr] : []; if (expr.ops) { for (const op3 of expr.ops) result.push(...getSubexpressions(op3, head2)); } else if (expr.keys) { for (const op3 of expr.keys) result.push(...getSubexpressions(expr.getKey(op3), head2)); } return result; } function bignumPreferred(ce) { return ce.numericMode === "bignum" || ce.numericMode === "auto"; } function complexAllowed(ce) { return ce.numericMode === "auto" || ce.numericMode === "complex"; } function hashCode(s) { let hash2 = 0; for (let i = 0; i < s.length; i++) hash2 = Math.imul(31, hash2) + s.charCodeAt(i) | 0; return Math.abs(hash2); } function bigintValue(ce, expr) { var _a; if (expr === null || expr === void 0) return null; if (typeof expr === "number") return Number.isInteger(expr) ? bigint(expr) : null; if (isNumberExpression(expr)) { const num = isNumberObject(expr) ? expr.num.toString() : expr; let s = num.toLowerCase().replace(/[nd]$/g, "").replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); if (/\([0-9]+\)/.test(s)) { const [_, body, repeat, trail] = (_a = s.match(/(.+)\(([0-9]+)\)(.*)$/)) != null ? _a : []; s = body + repeat.repeat(Math.ceil(ce.precision / repeat.length)) + (trail != null ? trail : ""); } if (s === "nan") return null; if (s === "infinity" || s === "+infinity") return null; if (s === "-infinity") return null; if (s.includes(".")) return null; return bigint(s); } return null; } function asBigint(expr) { const num = expr.numericValue; if (num === null) return null; if (typeof num === "number" && Number.isInteger(num)) return bigint(num); if (num instanceof decimal_default && num.isInteger()) return bigint(num); return null; } function matchRules(expr, rules, sub2) { const result = []; for (const rule of rules) { const r = applyRule(rule, expr, sub2); if (r !== null) result.push(r); } return result; } function boxRules(ce, rs) { var _a; const result = /* @__PURE__ */ new Set(); for (const [rawLhs, rawRhs, options] of rs) { let cond; const latex = latexString(options == null ? void 0 : options.condition); if (latex) { const condPattern = ce.pattern(latex); cond = (x) => { var _a2; return ((_a2 = condPattern.subs(x).value) == null ? void 0 : _a2.symbol) === "True"; }; } else cond = options == null ? void 0 : options.condition; result.add([ ce.pattern(rawLhs), ce.pattern(rawRhs), (_a = options == null ? void 0 : options.priority) != null ? _a : 0, cond ]); } return result; } function applyRule([lhs, rhs, _priority, condition], expr, substitution, options) { const sub2 = lhs.match(expr, { substitution, ...options }); if (sub2 === null) return null; if (typeof condition === "function" && !condition(sub2)) return null; return rhs.subs(sub2, { canonical: true }); } function replace(expr, ruleSet, options) { var _a, _b; const iterationLimit = (_a = options == null ? void 0 : options.iterationLimit) != null ? _a : 1; let iterationCount = 0; const once = (_b = options == null ? void 0 : options.once) != null ? _b : false; let done = false; let atLeastOneRule = false; try { while (!done && iterationCount < iterationLimit) { done = true; for (const rule of ruleSet) { const result = applyRule(rule, expr, {}, options); if (result !== null && result !== expr) { if (once) return result; done = false; atLeastOneRule = true; expr = result; } } iterationCount += 1; } } catch (e) { console.error(e); } return atLeastOneRule ? expr : null; } function getWildcardName(s) { const m = s.match(/^(__?_?[a-zA-Z0-9]+)/); if (m === null) return ""; return m[1]; } var import_complex3 = __toESM(require_complex()); function totalDegree(expr) { if (expr.head === "Power" && expr.op2.numericValue !== null) { const deg = asSmallInteger(expr.op2); if (deg !== null && deg > 0) return deg; return 1; } if (expr.head === "Multiply") { let deg = 1; for (const arg of expr.ops) { const t = totalDegree(arg); if (t > 1) deg = deg + t; } return deg; } return 1; } function maxDegree(expr) { if (expr.head === "Power" && expr.op2.numericValue !== null) { const deg = asSmallInteger(expr.op2); if (deg !== null && deg > 0) return deg; return 1; } if (expr.head === "Multiply") { let deg = 1; for (const arg of expr.ops) deg = Math.max(deg, totalDegree(arg)); return deg; } return 1; } function lex(expr) { if (expr.symbol) return expr.symbol; if (expr.ops) { const h = typeof expr.head === "string" ? expr.head : lex(expr.head); return h + '"' + expr.ops.map((x) => lex(x)).filter((x) => x.length > 0).join('"'); } return ""; } var DEFAULT_COMPLEXITY = 1e5; function sortAdd(ce, ops2) { return ops2.sort((a, b) => { const aLex = lex(a); const bLex = lex(b); if (!aLex && !bLex) return order(a, b); if (!aLex) return 1; if (!bLex) return -1; if (aLex < bLex) return -1; if (aLex > bLex) return 1; const aTotalDeg = totalDegree(a); const bTotalDeg = totalDegree(b); if (aTotalDeg !== bTotalDeg) return bTotalDeg - aTotalDeg; const aMaxDeg = maxDegree(a); const bMaxDeg = maxDegree(b); if (aMaxDeg !== bMaxDeg) return aMaxDeg - bMaxDeg; return order(a, b); }); } function order(a, b) { var _a, _b, _c, _d, _e, _f, _g, _h; if (a === b) return 0; if (a.numericValue !== null && a.numericValue === b.numericValue) return 0; const af = asFloat(a); if (af !== null) { const bf = asFloat(b); if (bf !== null) return af - bf; return -1; } if (a.numericValue instanceof import_complex3.default) { if (b.numericValue instanceof import_complex3.default) { if (a.numericValue.re === b.numericValue.re) { if (Math.abs(a.numericValue.im) === Math.abs(b.numericValue.im)) { return a.numericValue.im - b.numericValue.im; } return Math.abs(a.numericValue.im) - Math.abs(b.numericValue.im); } return a.numericValue.re - b.numericValue.re; } if (b.numericValue !== null) return 1; return -1; } if (a.numericValue) { if (b.numericValue) { return 1; } return -1; } if (a.head === "Sqrt" && a.op1.numericValue) { if (b.head === "Sqrt" && b.op1.numericValue) return order(a.op1, b.op1); return -1; } if (a.symbol) { if (b.symbol) { if (a.symbol === b.symbol) return 0; return a.symbol > b.symbol ? 1 : -1; } if (b.numericValue !== null) return 1; return -1; } if (a.ops) { if (b.ops) { const aComplexity = (_b = (_a = a.functionDefinition) == null ? void 0 : _a.complexity) != null ? _b : DEFAULT_COMPLEXITY; const bComplexity = (_d = (_c = b.functionDefinition) == null ? void 0 : _c.complexity) != null ? _d : DEFAULT_COMPLEXITY; if (aComplexity === bComplexity) { if (typeof a.head === "string" && typeof b.head === "string") { if (a.head === b.head) { return getLeafCount(a) - getLeafCount(b); } if (a.head < b.head) return 1; return -1; } return getLeafCount(a) - getLeafCount(b); } return aComplexity - bComplexity; } if (b.numericValue !== null || b.symbol) return 1; return -1; } if (a.string) { if (b.string) { if (a.string.length !== b.string.length) return b.string.length - a.string.length; if (b.string < a.string) return -1; if (a.string > b.string) return 1; return 0; } if (b.keys) return -1; return 1; } if (a.keys && b.keys) { if (a.keysCount !== b.keysCount) return b.keysCount - a.keysCount; let bComplexity = 0; let aComplexity = 0; for (const key of b.keys) bComplexity += (_e = b.getKey(key).complexity) != null ? _e : DEFAULT_COMPLEXITY; for (const key of a.keys) aComplexity += (_f = a.getKey(key).complexity) != null ? _f : DEFAULT_COMPLEXITY; return aComplexity - bComplexity; } return ((_g = a.complexity) != null ? _g : DEFAULT_COMPLEXITY) - ((_h = b.complexity) != null ? _h : DEFAULT_COMPLEXITY); } function getLeafCount(expr) { if (expr.keys !== null) return 1 + expr.keysCount; if (!expr.ops) return 1; return (typeof expr.head === "string" ? 1 : getLeafCount(expr.head)) + [...expr.ops].reduce((acc, x) => acc + getLeafCount(x), 0); } function flattenOps(ops2, head2) { if (!head2) return ops2; if (ops2.every((x) => !x.ops || x.head !== head2)) return ops2; const result = []; for (const arg of ops2) { if (!arg.ops || arg.head !== head2) result.push(arg); else { result.push(...flattenOps(arg.ops, head2)); } } /* @__PURE__ */ console.assert(result.length !== ops2.length); if (result.length === ops2.length) return ops2; return result; } function flattenSequence(xs) { if (xs.every((x) => x.head !== "Sequence")) return xs; const ys = []; for (const x of xs) { if (x.isValid && x.head === "Sequence") { if (x.ops) ys.push(...x.ops); } else ys.push(x); } return ys; } function canonical(xs) { return xs.every((x) => x.isCanonical) ? xs : xs.map((x) => x.canonical); } var import_complex4 = __toESM(require_complex()); function isRational(x) { return x !== null && Array.isArray(x); } function isMachineRational(x) { return x !== null && Array.isArray(x) && typeof x[0] === "number"; } function isBigRational(x) { return x !== null && Array.isArray(x) && typeof x[0] === "bigint"; } function isRationalZero(x) { return x[0] == 0; } function isRationalOne(x) { return x[0] === x[1]; } function isRationalNegativeOne(x) { return x[0] === -x[1]; } function machineNumerator(x) { return Number(x[0]); } function machineDenominator(x) { return Number(x[1]); } function isNeg(x) { return x[0] < 0; } function neg(x) { return [-x[0], x[1]]; } function inverse(x) { return x[0] < 0 ? [-x[1], -x[0]] : [x[1], x[0]]; } function asRational(expr) { const num = expr.numericValue; if (num === null) return void 0; if (Array.isArray(num)) return num; if (typeof num === "number" && Number.isInteger(num)) return [num, 1]; if (num instanceof decimal_default && num.isInteger()) return [bigint(num), BigInt(1)]; return void 0; } function asMachineRational(r) { return [Number(r[0]), Number(r[1])]; } function add2(lhs, rhs) { /* @__PURE__ */ console.assert( Array.isArray(rhs) || rhs.numericValue !== null && !(rhs instanceof import_complex4.default) ); if (typeof lhs[0] === "number" && !Number.isFinite(lhs[0])) return lhs; const rhsNum = Array.isArray(rhs) ? rhs : rhs.numericValue; if (rhsNum === null) return lhs; if (Array.isArray(rhsNum)) { if (isBigRational(rhsNum)) { lhs = [bigint(lhs[0]), bigint(lhs[1])]; return [rhsNum[1] * lhs[0] + rhsNum[0] * lhs[1], rhsNum[1] * lhs[1]]; } if (!Number.isFinite(rhsNum[0])) return rhsNum; if (isBigRational(lhs)) { const bigRhs = [bigint(rhsNum[0]), bigint(rhsNum[1])]; return [bigRhs[1] * lhs[0] + bigRhs[0] * lhs[1], bigRhs[1] * lhs[1]]; } return [rhsNum[1] * lhs[0] + rhsNum[0] * lhs[1], rhsNum[1] * lhs[1]]; } if (rhsNum instanceof decimal_default) { if (rhsNum.isNaN()) return [Number.NaN, 1]; if (!rhsNum.isFinite()) return [rhsNum.isNegative() ? -Infinity : Infinity, 1]; /* @__PURE__ */ console.assert(rhsNum.isInteger()); if (isMachineRational(lhs)) lhs = [bigint(lhs[0]), bigint(lhs[1])]; return [lhs[0] + lhs[1] * bigint(rhsNum.toString()), lhs[1]]; } if (rhsNum instanceof import_complex4.default) return [Number.NaN, 1]; /* @__PURE__ */ console.assert(!Number.isFinite(rhsNum) || Number.isInteger(rhsNum)); if (!Number.isFinite(rhsNum)) return [rhsNum, 1]; if (isMachineRational(lhs)) return [lhs[0] + lhs[1] * rhsNum, lhs[1]]; return [lhs[0] + lhs[1] * bigint(rhsNum), lhs[1]]; } function mul2(lhs, rhs) { /* @__PURE__ */ console.assert( Array.isArray(rhs) || rhs.numericValue !== null && !(rhs instanceof import_complex4.default) ); if (Array.isArray(rhs)) { if (isMachineRational(lhs) && isMachineRational(rhs)) return [lhs[0] * rhs[0], lhs[1] * rhs[1]]; if (isMachineRational(lhs)) lhs = [bigint(lhs[0]), bigint(lhs[1])]; if (isMachineRational(rhs)) rhs = [bigint(rhs[0]), bigint(rhs[1])]; return [lhs[0] * rhs[0], lhs[1] * rhs[1]]; } const rhsNum = rhs.numericValue; if (rhsNum !== null && typeof rhsNum === "number") { /* @__PURE__ */ console.assert(Number.isInteger(rhsNum)); if (isMachineRational(lhs)) return [lhs[0] * rhsNum, lhs[1]]; return [lhs[0] * bigint(rhsNum), lhs[1]]; } if (rhsNum instanceof decimal_default) { /* @__PURE__ */ console.assert(rhsNum.isInteger()); if (isMachineRational(lhs)) return [bigint(rhsNum.toString()) * bigint(lhs[0]), bigint(lhs[1])]; return [bigint(rhsNum.toString()) * lhs[0], lhs[1]]; } if (Array.isArray(rhsNum)) { if (isBigRational(rhsNum)) return [rhsNum[0] * bigint(lhs[0]), rhsNum[1] * bigint(lhs[1])]; else if (isMachineRational(lhs)) return [lhs[0] * rhsNum[0], lhs[1] * rhsNum[1]]; return [lhs[0] * bigint(rhsNum[0]), lhs[1] * bigint(rhsNum[1])]; } return lhs; } function pow2(r, exp2) { /* @__PURE__ */ console.assert(Number.isInteger(exp2)); if (exp2 === 0) return [1, 1]; if (exp2 < 0) { r = inverse(r); exp2 = -exp2; } if (exp2 === 1) return r; if (isMachineRational(r)) return [Math.pow(r[0], exp2), Math.pow(r[1], exp2)]; const bigexp = bigint(exp2); return [r[0] ** bigexp, r[1] ** bigexp]; } function reducedRational(r) { if (isMachineRational(r)) { if (r[0] === 1 || r[1] === 1) return r; if (r[1] < 0) r = [-r[0], -r[1]]; if (!Number.isFinite(r[1])) return [0, 1]; const g2 = gcd(r[0], r[1]); return g2 <= 1 ? r : [r[0] / g2, r[1] / g2]; } if (r[0] === BigInt(1) || r[1] === BigInt(1)) return r; if (r[1] < 0) r = [-r[0], -r[1]]; const g = gcd2(r[0], r[1]); if (g <= 1) return r; return [r[0] / g, r[1] / g]; } function rationalize(x) { if (!Number.isFinite(x)) return x; const fractional = x % 1; if (fractional === 0) return x; const eps = 1e-15; let a = Math.floor(x); let h1 = 1; let k1 = 0; let h = a; let k = 1; while (x - a > eps * k * k) { x = 1 / (x - a); a = Math.floor(x); const h2 = h1; h1 = h; const k2 = k1; k1 = k; h = h2 + a * h1; k = k2 + a * k1; } return [h, k]; } function asCoefficient(expr) { /* @__PURE__ */ console.assert(expr.isCanonical); const ce = expr.engine; if (expr.head === "Multiply") { const rest = []; let coef = [1, 1]; for (const arg of expr.ops) { const n2 = arg.numericValue; if (n2 !== null && (typeof n2 === "number" && Number.isInteger(n2) || n2 instanceof decimal_default && n2.isInteger() || isRational(n2))) coef = mul2(coef, arg); else rest.push(arg); } coef = reducedRational(coef); if (isRationalOne(coef)) return [[1, 1], expr]; if (rest.length === 0) return [coef, ce._ONE]; if (rest.length === 1) return [coef, rest[0]]; return [coef, ce.mul(rest)]; } if (expr.head === "Divide") { let [coef1, numer] = asCoefficient(expr.op1); const [coef2, denom] = asCoefficient(expr.op2); const coef = reducedRational(mul2(coef1, inverse(coef2))); if (denom.isOne) return [coef, numer]; return [coef, ce.div(numer, denom)]; } if (expr.head === "Power") { if (expr.op2.numericValue === null) return [[1, 1], expr]; let [coef, base] = asCoefficient(expr.op1); if (isRationalOne(coef)) return [[1, 1], expr]; const exponent = expr.op2; const e = asSmallInteger(exponent); if (e === -1) return [inverse(coef), ce.inv(base)]; if (e !== null) return [pow2(coef, e), ce.pow(base, exponent)]; if (exponent.numericValue !== null && Array.isArray(exponent.numericValue)) { const [en, ed] = asMachineRational(exponent.numericValue); const [numer, denom] = asMachineRational(coef); if (numer > 0 && Math.abs(en) === 1) { const [nCoef, nRest] = factorPower(numer, ed); const [dCoef, dRest] = factorPower(denom, ed); if (nCoef === 1 && dCoef === 1) return [[1, 1], expr]; return [ en === 1 ? [nCoef, dCoef] : [dCoef, nCoef], ce.pow(ce.mul([ce.number([nRest, dRest]), base]), exponent) ]; } } return [[1, 1], expr]; } if (expr.head === "Add") { } if (expr.head === "Negate") { const [coef, rest] = asCoefficient(expr.op1); return [neg(coef), rest]; } const n = expr.numericValue; if (n !== null) { if (n instanceof decimal_default) { if (n.isInteger()) return [[bigint(n.toString()), BigInt(1)], ce._ONE]; if (n.isNegative()) return [[-1, 1], ce.number(n.neg())]; } if (typeof n === "number") { if (Number.isInteger(n)) return [[n, 1], ce._ONE]; if (n < 0) return [[-1, 1], ce.number(-n)]; } if (isRational(n)) return [n, ce._ONE]; if (n instanceof import_complex4.default && n.re < 0) return [[-1, 1], ce.number(ce.complex(-n.re, -n.im))]; } return [[1, 1], expr]; } function signDiff(lhs, rhs, tolerance) { if (lhs === rhs) return 0; const lhsN = lhs.N(); const rhsN = rhs.N(); const lhsNum = lhsN.numericValue; const rhsNum = rhsN.numericValue; if (lhsNum === null || rhsNum === null) { const lhsS = lhs.sgn; const rhsS = rhs.sgn; if (typeof lhsS !== "number" || typeof rhsS !== "number") return void 0; if (lhsS === 0 && rhsS === 0) return 0; if (lhsS < 0 && rhsS > 0) return -1; if (lhsS > 0 && rhsS < 0) return 1; return void 0; } tolerance != null ? tolerance : tolerance = lhs.engine.tolerance; if (lhsNum instanceof import_complex4.default && rhsNum instanceof import_complex4.default) return chop(lhsNum.re - rhsNum.re, tolerance) === 0 && chop(lhsNum.im - rhsNum.im, tolerance) === 0 ? 0 : void 0; if (lhsNum instanceof import_complex4.default || rhsNum instanceof import_complex4.default) return void 0; if (isRational(lhsNum) || isRational(rhsNum)) return void 0; if (typeof lhsNum === "number" && typeof rhsNum === "number") { if (chop(rhsNum - lhsNum, tolerance) === 0) return 0; return lhsNum < rhsNum ? -1 : 1; } const ce = lhs.engine; const delta = ce.bignum(rhsNum).sub(ce.bignum(lhsNum)); if (chop(delta, tolerance) === 0) return 0; return delta.isPos() ? 1 : -1; } var import_complex5 = __toESM(require_complex()); var Sum = class { constructor(ce, xs, options) { this._isCanonical = true; this._imaginary = 0; this._posInfinityCount = 0; this._negInfinityCount = 0; this._naNCount = 0; this._terms = []; options != null ? options : options = {}; if (!("canonical" in options)) this._isCanonical = true; else this._isCanonical = options.canonical; this.engine = ce; this._rational = bignumPreferred(ce) ? [BigInt(0), BigInt(1)] : [0, 1]; this._bignum = ce._BIGNUM_ZERO; this._number = 0; if (xs) for (const x of xs) this.addTerm(x); } get isEmpty() { if (!this._isCanonical) return this._terms.length === 0; return this._terms.length === 0 && isRationalZero(this._rational) && this._imaginary === 0 && this._number === 0 && this._bignum.isZero() && this._negInfinityCount === 0 && this._posInfinityCount === 0 && this._naNCount === 0; } /** * Add a term to the sum. * * A term is a rational coefficient and an expression. * Optionally, the term is multiplied by the constant `c` before being added. * * If the sum already has this term, the coefficient is added * to the previous one. Otherwise, a new entry is added. * * E.g. "2x + x + 1/5 y" * -> [['x', [3, 1]], ['y', [1, 5]]] */ addTerm(term, c) { if (term.isNothing) return; if (term.isNaN || term.isImaginary && !complexAllowed(this.engine)) { this._naNCount += 1; return; } if (this._isCanonical) { if (term.numericValue !== null) { if (term.isInfinity) { if (term.isPositive) this._posInfinityCount += 1; else this._negInfinityCount += 1; return; } const r = asRational(term); if (r) { this._rational = add2(this._rational, c === void 0 ? r : mul2(r, c)); return; } const num = term.numericValue; if (num !== null && typeof num === "number") { /* @__PURE__ */ console.assert(!Number.isInteger(num)); if (bignumPreferred(this.engine)) this._bignum = this._bignum.add(num); else this._number += num; return; } if (num !== null && num instanceof decimal_default) { /* @__PURE__ */ console.assert(!num.isInteger()); this._bignum = this._bignum.add(num); return; } if (num !== null && num instanceof import_complex5.default) { let re = num.re; let im = num.im; if (Number.isInteger(re)) { this._rational = add2(this._rational, mul2([re, 1], c != null ? c : [1, 1])); re = 0; } else { if (bignumPreferred(this.engine)) this._bignum = this._bignum.add(re); else this._number += re; re = 0; } if (Number.isInteger(im)) { if (c === void 0) this._imaginary += im; else if (isMachineRational(c)) this._imaginary += im * c[0] / c[1]; else this._imaginary += this.engine.bignum(c[0]).mul(im).div(this.engine.bignum(c[1])).toNumber(); im = 0; } if (re === 0 && im === 0) return; term = this.engine.number(this.engine.complex(re, im)); } } } let coef; [coef, term] = asCoefficient(term); if (isRationalZero(coef)) return; if (c !== void 0) coef = mul2(coef, c); if (term.head === "Negate") { this.addTerm(term.op1, neg(coef)); return; } if (term.head === "Add") { for (const x of term.ops) this.addTerm(x, coef); return; } let hasTerm = false; if (term.numericValue === null) { if (this._terms.length > 500) { const h = term.hash; for (let i = 0; i < this._terms.length; i++) { if (this._terms[i].term.numericValue === null && h === this._terms[i].term.hash && term.isSame(this._terms[i].term)) { this._terms[i].coef = add2(this._terms[i].coef, coef); hasTerm = true; break; } } } else { for (let i = 0; i < this._terms.length; i++) { if (this._terms[i].term.numericValue === null && term.isSame(this._terms[i].term)) { this._terms[i].coef = add2(this._terms[i].coef, coef); hasTerm = true; break; } } } } if (!hasTerm) this._terms.push({ term, coef }); } // For debugging toString() { const xs = this.terms("expression"); if (xs.length === 0) return "0"; return xs.map((x) => x.toString()).join("\\n"); } terms(mode) { const ce = this.engine; if (this._naNCount > 0) return [ce._NAN]; if (this._imaginary !== 0 && !complexAllowed(ce)) return [ce._NAN]; if (this._posInfinityCount > 0 && this._negInfinityCount > 0) return [ce._NAN]; if (this._posInfinityCount > 0) return [ce._POSITIVE_INFINITY]; if (this._negInfinityCount > 0) return [ce._NEGATIVE_INFINITY]; const xs = []; for (const { coef, term } of this._terms) { if (!isRationalZero(coef)) { if (isRationalOne(coef)) xs.push(term); else if (isRationalNegativeOne(coef)) xs.push(ce.neg(term)); else if (machineDenominator(coef) === 1) xs.push(ce.mul([ce.number(coef[0]), term])); else if (machineNumerator(coef) === 1) xs.push(ce.div(term, ce.number(coef[1]))); else xs.push(ce.mul([ce.number(coef), term])); } } if (mode === "numeric") { if (bignumPreferred(this.engine)) { let sum2 = this._bignum.add(this._number); if (!isRationalZero(this._rational)) sum2 = sum2.add( ce.bignum(this._rational[0]).div(ce.bignum(this._rational[1])) ); if (this._imaginary !== 0) xs.push(ce.number(ce.complex(sum2.toNumber(), this._imaginary))); else if (!sum2.isZero()) xs.push(ce.number(sum2)); } else { let sum2 = this._bignum.toNumber() + this._number; if (!isRationalZero(this._rational)) sum2 += machineNumerator(this._rational) / machineDenominator(this._rational); if (this._imaginary !== 0) xs.push(ce.number(ce.complex(sum2, this._imaginary))); else if (sum2 !== 0) xs.push(ce.number(sum2)); } } else { if (!isRationalZero(this._rational)) xs.push(ce.number(this._rational)); if (this._imaginary !== 0) { if (!complexAllowed(ce)) return [ce._NAN]; xs.push(ce.number(ce.complex(0, this._imaginary))); } if (bignumPreferred(this.engine)) { const sum2 = this._bignum.add(this._number); if (!sum2.isZero()) xs.push(ce.number(sum2)); } else { if (!this._bignum.isZero()) xs.push(ce.number(this._bignum)); if (this._number !== 0) xs.push(ce.number(this._number)); } } return flattenOps(xs, "Add"); } asExpression(mode) { const ce = this.engine; const xs = this.terms(mode); if (xs.length === 0) return ce._ZERO; if (xs.length === 1) return xs[0]; return ce._fn("Add", sortAdd(ce, xs)); } }; var DOMAIN_CONSTRUCTORS = [ "InvalidDomain", "Dictionary", "Function", "List", "Tuple", "Intersection", "Union", "Maybe", "Sequence", "Interval", "Range", "Head", "Symbol", "Value" ]; var DOMAIN_ALIAS = { // Function: ['Function', ['Sequence', 'Anything'], 'Anything'], NumericFunction: ["Function", ["Sequence", "Number"], "Number"], RealFunction: [ "Function", ["Sequence", "ExtendedRealNumber"], "ExtendedRealNumber" ], TrigonometricFunction: ["Function", "Number", "Number"], // HyperbolicFunction: ['Function', 'Number', 'Number'], LogicOperator: [ "Function", "MaybeBoolean", ["Maybe", "MaybeBoolean"], "MaybeBoolean" ], Predicate: ["Function", ["Sequence", "Anything"], "MaybeBoolean"], RelationalOperator: ["Function", "Anything", "Anything", "MaybeBoolean"] // PositiveInteger: ['Range', 1, +Infinity], // NonNegativeInteger: ['Range', 0, +Infinity], // NegativeInteger: ['Range', -Infinity, -1], // NonPositiveInteger: ['Range', -Infinity, 0], // PositiveNumber: ['Interval', ['Open', 0], +Infinity], // NonNegativeNumber: ['Interval', 0, +Infinity], // NegativeNumber: ['Interval', -Infinity, ['Open', 0]], // NonPositiveNumber: ['Interval', -Infinity, 0], }; var DOMAIN_LITERAL = { Anything: [], Value: "Anything", Domain: "Anything", DomainExpression: "Domain", Void: "Nothing", Nothing: [ "DomainExpression", "Boolean", "String", "Symbol", "Tuple", "List", "Dictionary", "InfiniteSet", "FiniteSet", "ImaginaryNumber", "TranscendentalNumber", "PositiveInteger", "NegativeInteger", "NonPositiveInteger", "NonNegativeInteger", "PositiveNumber", "NegativeNumber", "NonPositiveNumber", "NonNegativeNumber", "Scalar", "TrigonometricFunction", "LogicOperator", "RelationalOperator" ], MaybeBoolean: "Value", Boolean: "MaybeBoolean", String: "Boolean", Symbol: "Boolean", Collection: "Value", List: "Collection", Dictionary: "Collection", Sequence: "Collection", Tuple: "Sequence", Set: "Collection", InfiniteSet: "Set", FiniteSet: "Set", // // Functional Domains // Function: "Anything", Predicate: "Function", LogicOperator: "Predicate", RelationalOperator: "Predicate", // https://en.wikipedia.org/wiki/List_of_mathematical_functions NumericFunction: "Function", RealFunction: "NumericFunction", TrigonometricFunction: "RealFunction", // // Numeric Domains // // https://en.wikipedia.org/wiki/Category_of_sets Number: "Value", ExtendedComplexNumber: "Number", ComplexNumber: "ExtendedComplexNumber", ImaginaryNumber: "ComplexNumber", ExtendedRealNumber: "ExtendedComplexNumber", RealNumber: ["ComplexNumber", "ExtendedRealNumber"], PositiveNumber: "NonNegativeNumber", NonNegativeNumber: "RealNumber", NonPositiveNumber: "NegativeNumber", NegativeNumber: "RealNumber", TranscendentalNumber: "RealNumber", AlgebraicNumber: "RealNumber", RationalNumber: "AlgebraicNumber", // NaturalNumber: 'Integer', Integer: "RationalNumber", PositiveInteger: "NonNegativeInteger", NonNegativeInteger: "Integer", NonPositiveInteger: "NegativeInteger", NegativeInteger: "Integer", // // Tensorial Domains // Tensor: "Value", Matrix: "Tensor", Scalar: ["Row", "Column"], Row: "Vector", Column: "Vector", Vector: "Matrix" // https://en.wikipedia.org/wiki/List_of_named_matrices // ComplexTensor: 'Tensor', // RealTensor: 'ComplexTensor', // IntegerTensor: 'RealTensor', // LogicalTensor: 'IntegerTensor', // SquareMatrix: 'Matrix', // MonomialMatrix: 'SquareMatrix', // TriangularMatrix: 'SquareMatrix', // UpperTriangularMatrix: 'TriangularMatrix', // LowerTriangularMatrix: 'TriangularMatrix', // PermutationMatrix: ['MonomialMatrix', 'LogicalTensor', 'OrthogonalMatrix'], // OrthogonalMatrix: ['SquareMatrix', 'RealTensor'], // DiagonalMatrix: ['UpperTriangularMatrix', 'LowerTriangularMatrix'], // IdentityMatrix: ['DiagonalMatrix', 'SymmetricMatrix', 'PermutationMatrix'], // ZeroMatrix: ['DiagonalMatrix', 'SymmetricMatrix', 'PermutationMatrix'], // SymmetricMatrix: ['HermitianMatrix', 'SquareMatrix', 'RealTensor'], // HermitianMatrix: 'ComplexTensor', // Quaternion: ['SquareMatrix', 'ComplexTensor'], }; var gDomainLiterals; function isDomainLiteral(s) { if (!s) return false; return DOMAIN_LITERAL[s] !== void 0; } function ancestors(dom) { if (!gDomainLiterals) { gDomainLiterals = {}; ancestors("Void"); } if (gDomainLiterals[dom]) return Array.from(gDomainLiterals[dom]); let result = []; if (typeof dom !== "string" || !DOMAIN_LITERAL[dom]) { if (!Array.isArray(dom)) throw Error(`Unknown domain literal ${dom}`); if (!DOMAIN_CONSTRUCTORS.includes(dom[0])) throw Error(`Unknown domain constructor ${dom[0]}`); if (dom[0] === "Function" || dom[0] === "Head") return ancestors("Function"); if (dom[0] === "Symbol") return ancestors("Symbol"); if (dom[0] === "Tuple") return ancestors("Tuple"); if (dom[0] === "List") return ancestors("List"); if (dom[0] === "Dictionary") return ancestors("Dictionary"); if (dom[0] === "Range") return ancestors("Integer"); if (dom[0] === "Interval") return ancestors("RealNumberExtended"); if (dom[0] === "Maybe" || dom[0] === "Sequence") return ancestors(dom[1]); if (dom[0] === "Literal") return ["Anything"]; if (dom[0] === "Union") return ["Anything"]; if (dom[0] === "Intersection") return ["Anything"]; return ["Anything"]; } if (typeof DOMAIN_LITERAL[dom] === "string") result = [DOMAIN_LITERAL[dom], ...ancestors(DOMAIN_LITERAL[dom])]; else if (Array.isArray(DOMAIN_LITERAL[dom])) for (const parent of DOMAIN_LITERAL[dom]) { result.push(parent); result.push(...ancestors(parent)); } gDomainLiterals[dom] = new Set(result); return result; } function domainSetsLibrary() { const table = {}; for (const dom of Object.keys(DOMAIN_LITERAL)) { if (dom !== "Domain" && dom !== "Nothing" && dom !== "String" && dom !== "Symbol" && dom !== "List" && dom !== "Tuple" && dom !== "Sequence") table[dom] = { domain: "Set" }; } return table; } var import_complex6 = __toESM(require_complex()); function isSymbolDefinition(def) { return !!def && typeof def === "object" && ("domain" in def || "value" in def || "constant" in def); } function isFunctionDefinition(def) { if (def === void 0 || def === null) return false; if (typeof def !== "object") return false; if ("complexity" in def || "numeric" in def || "signature" in def) return true; if (!("domain" in def)) return false; if (def.domain === void 0) return false; if (typeof def.domain === "string") return def.domain === "Function"; return def.domain.isFunction; } function normalizeLimits(range) { var _a, _b; let lower = 1; let upper = lower + MAX_ITERATION; let index = "Nothing"; let isFinite2 = true; if (range.head === "Tuple" || range.head === "Triple" || range.head === "Pair" || range.head === "Single") { index = (_a = range.op1.head === "Hold" ? range.op1.op1.symbol : range.op1.symbol) != null ? _a : "Nothing"; lower = (_b = asSmallInteger(range.op2)) != null ? _b : 1; if (!Number.isFinite(lower)) isFinite2 = false; if (range.op3.isNothing || range.op3.isInfinity) { isFinite2 = false; } else { const u = asSmallInteger(range.op3); if (u === null) isFinite2 = false; else { upper = u; if (!Number.isFinite(upper)) isFinite2 = false; } } if (!isFinite2 && Number.isFinite(lower)) upper = lower + MAX_ITERATION; } return [index, lower, upper, isFinite2]; } var ComputeEngineFunction = class extends Function { constructor(body) { super("_SYS", "_", `return ${body}`); this.sys = { factorial, gamma, lngamma, gcd, lcm, chop }; return new Proxy(this, { apply: (target, thisArg, argumentsList) => super.apply(thisArg, [this.sys, ...argumentsList]), get: (target, prop) => { if (prop === "toString") return () => body; return target[prop]; } }); } }; function compileToJavascript(expr) { const js = compile(expr, expr.freeVars); try { return new ComputeEngineFunction(js); } catch (e) { console.error(`${e} ${expr.latex} ${js}`); } return void 0; } function compile(expr, freeVars = [], prec = 0) { var _a; const f = asFloat(expr); if (f !== null) return f.toString(); const s = expr.symbol; if (s !== null) { const result = { True: "true", False: "false", Pi: "Math.PI", ExponentialE: "Math.E", I: "Math.I", NaN: "Number.NaN", ImaginaryUnit: "NaN", Half: "0.5", MachineEpsilon: "Number.EPSILON", GoldenRatio: "((1 + Math.sqrt(5)) / 2)", CatalanConstant: "0.91596559417721901", EulerGamma: "0.57721566490153286" }[s]; if (result !== void 0) return result; if (freeVars.includes(s)) return `_.${s}`; return s; } const str = expr.string; if (str !== null) return JSON.stringify(str); const keys = expr.keys; if (keys !== null) { const result = []; for (const key of keys) { const value = expr.getKey(key); if (value) result.push(`${key}: ${compile(value, freeVars, 0)}`); } return `{${result.join(", ")}}`; } const h = expr.head; if (typeof h === "string") { if (h === "Negate") { const arg = expr.op1; if (arg === null) return ""; return `-${compile(arg, freeVars, 3)}`; } if (h === "Error") throw new Error("Error"); if (h === "Sum") return compileLoop(expr, "+"); if (h === "Product") return compileLoop(expr, "*"); if (h === "Root") { const arg = expr.op1; if (arg === null) throw new Error("Root: no argument"); const exp2 = expr.op2; if (exp2 === null) return `Math.sqrt(${compile(arg, freeVars, 0)})`; return `Math.pow(${compile(arg, freeVars)}, 1/${compile(exp2, freeVars)}`; } if (h === "Factorial") { const arg = expr.op1; if (arg === null) throw new Error("Factorial: no argument"); return `_SYS.factorial(${compile(arg, freeVars)})`; } if (h === "Power") { const arg = expr.op1; if (arg === null) throw new Error("Power: no argument"); const exp2 = asFloat(expr.op2); if (exp2 === 0.5) return `Math.sqrt(${compile(arg, freeVars)})`; if (exp2 === 1 / 3) return `Math.cbrt(${compile(arg, freeVars)})`; if (exp2 === 1) return compile(arg, freeVars); if (exp2 === -1) return `1 / ${compile(arg, freeVars)}`; if (exp2 === -0.5) return `1 / Math.sqrt(${compile(arg, freeVars)})`; } if (h === "Square") { const arg = expr.op1; if (arg === null) throw new Error("Square: no argument"); return `Math.pow(${compile(arg, freeVars)}, 2)`; } const OPS = { Add: ["+", 11], Negate: ["-", 14], // Unary operator Subtract: ["-", 11], Multiply: ["*", 12], Divide: ["/", 13], Equal: ["===", 8], NotEqual: ["!==", 8], LessEqual: ["<=", 9], GreaterEqual: [">=", 9], Less: ["<", 9], Greater: [">", 9], And: ["&&", 4], Or: ["||", 3], Not: ["!", 14] // Unary operator // Xor: ['^', 6], // That's bitwise XOR, not logical XOR // Possible solution is to use `a ? !b : b` instead of `a ^ b` }; const op3 = OPS[h]; if (op3 !== void 0) { const args2 = expr.ops; if (args2 === null) return ""; let resultStr; if (args2.length === 1) { resultStr = `${op3[0]}${compile(args2[0], freeVars, op3[1])}`; } else { resultStr = args2.map((arg) => compile(arg, freeVars, op3[1])).join(` ${op3[0]} `); } return op3[1] < prec ? `(${resultStr})` : resultStr; } const fn = (_a = { Abs: "Math.abs", Arccos: "Math.acos", Arcosh: "Math.acosh", Arsin: "Math.asin", Arsinh: "Math.asinh", Arctan: "Math.atan", Artanh: "Math.atanh", // Math.cbrt Ceiling: "Math.ceil", Chop: "_SYS.chop", Cos: "Math.cos", Cosh: "Math.cosh", Exp: "Math.exp", Floor: "Math.floor", Gamma: "_SYS.gamma", Gcd: "_SYS.gcd", // Math.hypot Lcm: "_SYS.lcm", Ln: "Math.log", Log: "Math.log10", LogGamma: "_SYS.lngamma", Lb: "Math.log2", Max: "Math.max", Min: "Math.min", Power: "Math.pow", Random: "Math.random", Round: "Math.round", Sgn: "Math.sign", Sin: "Math.sin", Sinh: "Math.sinh", Sqrt: "Math.sqrt", Tan: "Math.tan", Tanh: "Math.tanh" // Factorial: 'factorial', // TODO: implement // Hallucinated by Copilot, but interesting ideas... // Cot: 'Math.cot', // Sec: 'Math.sec', // Csc: 'Math.csc', // ArcCot: 'Math.acot', // ArcSec: 'Math.asec', // ArcCsc: 'Math.acsc', // Coth: 'Math.coth', // Sech: 'Math.sech', // Csch: 'Math.csch', // ArcCoth: 'Math.acoth', // ArcSech: 'Math.asech', // ArcCsch: 'Math.acsch', // Root: 'Math.root', // Gamma: 'Math.gamma', // Erf: 'Math.erf', // Erfc: 'Math.erfc', // Erfi: 'Math.erfi', // Zeta: 'Math.zeta', // PolyGamma: 'Math.polygamma', // HurwitzZeta: 'Math.hurwitzZeta', $$\zeta (s,a)=\sum _{n=0}^{\infty }{\frac {1}{(n+a)^{s}}}$$ // DirichletEta: 'Math.dirichletEta', // Beta: 'Math.beta', // Binomial: 'Math.binomial', // Mod: 'Math.mod', // Quotient: 'Math.quotient', // GCD: 'Math.gcd', // LCM: 'Math.lcm', // Divisors: 'Math.divisors', // PrimeQ: 'Math.isPrime', // PrimePi: 'Math.primePi', // Prime: 'Math.prime', // NextPrime: 'Math.nextPrime', // PreviousPrime: 'Math.prevPrime', // PrimePowerQ: 'Math.isPrimePower', // PrimePowerPi: 'Math.primePowerPi', // PrimePower: 'Math.primePower', // NextPrimePower: 'Math.nextPrimePower', // PreviousPrimePower: 'Math.prevPrimePower', // PrimeFactors: 'Math.primeFactors', // DivisorSigma: 'Math.divisorSigma', // DivisorSigma0: 'Math.divisorSigma0', // DivisorSigma1: 'Math.divisorSigma1', // DivisorSigma2: 'Math.divisorSigma2', // DivisorSigma3: 'Math.divisorSigma3', // DivisorSigma4: 'Math.divisorSigma4', // DivisorCount: 'Math.divisorCount', // DivisorSum: 'Math.divisorSum', // MoebiusMu: 'Math.moebiusMu', // LiouvilleLambda: 'Math.liouvilleLambda', // CarmichaelLambda: 'Math.carmichaelLambda', // EulerPhi: 'Math.eulerPhi', // EulerPsi: 'Math.eulerPsi', // EulerGamma: 'Math.eulerGamma', // HarmonicNumber: 'Math.harmonicNumber', // BernoulliB: 'Math.bernoulliB', // StirlingS1: 'Math.stirlingS1', // StirlingS2: 'Math.stirlingS2', // BellB: 'Math.bellB', // BellNumber: 'Math.bellNumber', // LahS: 'Math.lahS', // LahL: 'Math.lahL', // RiemannR: 'Math.riemannR', // RiemannZeta: 'Math.riemannZeta', // RiemannXi: 'Math.riemannXi', // RiemannH: 'Math.riemannH', // RiemannZ: 'Math.riemannZ', // RiemannS: 'Math.riemannS', // RiemannXiZero: 'Math.riemannXiZero', // RiemannZetaZero: 'Math.riemannZetaZero', // RiemannHZero: 'Math.riemannHZero', // RiemannSZero: 'Math.riemannSZero', // RiemannPrimeCount: 'Math.riemannPrimeCount', // RiemannRLog: 'Math.riemannRLog', // RiemannRLogDerivative: 'Math.riemannRLogDerivative', // RiemannRLogZero: 'Math.riemannRLogZero', // RiemannRLogZeroDerivative: 'Math.riemannRLogZeroDerivative', // RiemannRZero: 'Math.riemannRZero', // RiemannRDerivative: 'Math.riemannRDerivative', // RiemannXiZeroDerivative: 'Math.riemannXiZeroDerivative', // RiemannZetaZeroDerivative: 'Math.riemannZetaZeroDerivative', // RiemannHZeroDerivative: 'Math.riemannHZeroDerivative', // RiemannSZeroDerivative: 'Math.riemannSZeroDerivative', // RiemannSZeroDerivative2: 'Math.riemannSZeroDerivative2', // RiemannSZeroDerivative3: 'Math.riemannSZeroDerivative3', // RiemannSZeroDerivative4: 'Math.riemannSZeroDerivative4', // RiemannSZeroDerivative5: 'Math.riemannSZeroDerivative5', // RiemannSZeroDerivative6: 'Math.riemannSZeroDerivative6', }[h]) != null ? _a : h; const args = expr.ops; if (args !== null) { const result = []; for (const arg of args) result.push(compile(arg, freeVars)); return `${fn}(${result.join(", ")})`; } } return ""; } function compileLoop(expr, op3) { const args = expr.ops; if (args === null) throw new Error("Sum: no arguments"); if (!expr.op1 || !expr.op2) throw new Error("Sum: no limits"); const [index, lower, upper, isFinite2] = normalizeLimits(expr.op2); const fn = compile(expr.op1, [...expr.op1.freeVars, index], 0); return `(() => { let acc = ${op3 === "+" ? "0" : "1"}; const fn = (_) => ${fn}; for (let i = ${lower}; i <= ${upper}; i++) acc ${op3}= fn({ ..._, ${index}: i }); return acc; })()`; } var AbstractBoxedExpression = class { constructor(ce, metadata) { this.engine = ce; if ((metadata == null ? void 0 : metadata.latex) !== void 0) this._latex = metadata.latex; if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) this._wikidata = metadata.wikidata; } /** `Object.valueOf()`: return a primitive value for the object * */ valueOf() { var _a, _b, _c; if (this.symbol === "True") return true; if (this.symbol === "False") return false; return (_c = (_b = (_a = asFloat(this)) != null ? _a : this.string) != null ? _b : this.symbol) != null ? _c : JSON.stringify(this.json); } /** Object.toString() */ toString() { if (this.symbol) return this.symbol; if (this.string) return this.string; const num = this.numericValue; if (num !== null) { if (typeof num === "number") return num.toString(); if (isMachineRational(num)) return `${num[0].toString()}/${num[1].toString()}`; if (isBigRational(num)) return `${num[0].toString()}/${num[1].toString()}`; if (num instanceof import_complex6.Complex) { const im = num.im === 1 ? "" : num.im === -1 ? "-" : num.im.toString(); if (num.re === 0) return im + "i"; if (num.im < 0) return `${num.re.toString()}${im}i`; return `${num.re.toString()}+${im}i`; } } return JSON.stringify(this.json); } [Symbol.toPrimitive](hint) { if (hint === "number") { const v = this.valueOf(); return typeof v === "number" ? v : null; } return this.toString(); } /** Called by `JSON.stringify()` when serializing to json */ toJSON() { return this.json; } /** @internal */ get rawJson() { return this.json; } get scope() { return null; } /** Object.is() */ is(rhs) { if (rhs === null || rhs === void 0) return false; return this.isSame(this.engine.box(rhs)); } get latex() { var _a; return (_a = this._latex) != null ? _a : this.engine.serialize(this); } set latex(val) { this._latex = val; } get symbol() { return null; } get isNothing() { return false; } get string() { return null; } getSubexpressions(head2) { return getSubexpressions(this, head2); } get subexpressions() { return this.getSubexpressions(""); } get symbols() { const set = /* @__PURE__ */ new Set(); getSymbols(this, set); return Array.from(set); } get freeVars() { const set = /* @__PURE__ */ new Set(); getFreeVars(this, set); return Array.from(set); } get errors() { return this.getSubexpressions("Error"); } // Only return non-null for functions get ops() { return null; } get nops() { return 0; } get op1() { return this.engine.symbol("Nothing"); } get op2() { return this.engine.symbol("Nothing"); } get op3() { return this.engine.symbol("Nothing"); } get isValid() { return true; } get isPure() { return false; } get isExact() { return true; } /** For a symbol, true if the symbol is a free variable (no value) */ get isFree() { return false; } /** For a symbol, true if the symbol is a constant (unchangeable value) */ get isConstant() { return false; } get canonical() { return this; } apply(_fn, _head) { return this; } subs(_sub, options) { if (options == null ? void 0 : options.canonical) return this.canonical; return this; } solve(_vars) { return null; } replace(_rules) { return null; } has(_v) { return false; } get isNaN() { return void 0; } get isZero() { return void 0; } get isNotZero() { return void 0; } get isOne() { return void 0; } get isNegativeOne() { return void 0; } get isInfinity() { return void 0; } // Not +- Infinity, not NaN get isFinite() { return void 0; } get isEven() { return void 0; } get isOdd() { return void 0; } get isPrime() { return void 0; } get isComposite() { return void 0; } get numericValue() { return null; } get sgn() { return null; } isLess(_rhs) { return void 0; } isLessEqual(_rhs) { return void 0; } isGreater(_rhs) { return void 0; } isGreaterEqual(_rhs) { return void 0; } // x > 0 get isPositive() { return void 0; } // x >= 0 get isNonNegative() { return void 0; } // x < 0 get isNegative() { return void 0; } // x <= 0 get isNonPositive() { return void 0; } // // // // // isCompatible(_dom, _kind) { return false; } get description() { return void 0; } get url() { return void 0; } get wikidata() { return this._wikidata; } set wikidata(val) { this._wikidata = val; } get complexity() { return void 0; } get basedDefinition() { return void 0; } get symbolDefinition() { return void 0; } get functionDefinition() { return void 0; } bind(_scope) { return; } unbind() { return; } get keys() { return null; } get keysCount() { return 0; } getKey(_key) { return void 0; } hasKey(_key) { return false; } get value() { return void 0; } set value(_value) { throw new Error(`Can't change the value of \\(${this.latex}\\)`); } get domain() { return this.engine.domain("Void"); } set domain(_domain) { throw new Error(`Can't change the domain of \\(${this.latex}\\)`); } get explicitDomain() { return this.domain; } get isNumber() { return void 0; } get isInteger() { return void 0; } get isRational() { return void 0; } get isAlgebraic() { return false; } get isReal() { return void 0; } // Real or +-Infinity get isExtendedReal() { return void 0; } get isComplex() { return void 0; } get isImaginary() { return void 0; } get isExtendedComplex() { return void 0; } simplify(_options) { return this; } evaluate(options) { return this.simplify(options); } N(_options) { return this.evaluate(); } compile(to = "javascript", options) { if (to !== "javascript") return void 0; options != null ? options : options = { optimize: ["simplify", "evaluate"] }; let expr = this; if (options.optimize.includes("simplify")) expr = expr.simplify(); if (options.optimize.includes("evaluate")) expr = expr.evaluate(); try { return compileToJavascript(expr); } catch (e) { } return void 0; } }; var import_complex8 = __toESM(require_complex()); function factorial2(ce, n) { if (!n.isInteger() || n.isNegative()) return ce._BIGNUM_NAN; if (n.lessThan(10)) return ce.bignum( [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800][n.toNumber()] ); if (n.gt(Number.MAX_SAFE_INTEGER)) { let val2 = ce._BIGNUM_ONE; let i = ce._BIGNUM_TWO; while (i.lessThan(n)) { val2 = val2.mul(i); i = i.add(1); } return val2; } if (n.modulo(2).eq(1)) { return n.times(factorial2(ce, n.minus(1))); } let loop = n.toNumber(); let sum2 = n; let val = n; while (loop > 2) { loop -= 2; sum2 = sum2.add(loop); val = val.mul(sum2); } return val; } var gammaG2 = 7; function lngamma2(ce, z) { if (z.isNegative()) return ce._BIGNUM_NAN; const GAMMA_P_LN = ce.cache("gamma-p-ln", () => { return [ "0.99999999999999709182", "57.156235665862923517", "-59.597960355475491248", "14.136097974741747174", "-0.49191381609762019978", "0.33994649984811888699e-4", "0.46523628927048575665e-4", "-0.98374475304879564677e-4", "0.15808870322491248884e-3", "-0.21026444172410488319e-3", "0.2174396181152126432e-3", "-0.16431810653676389022e-3", "0.84418223983852743293e-4", "-0.2619083840158140867e-4", "0.36899182659531622704e-5" ].map((x2) => ce.bignum(x2)); }); let x = GAMMA_P_LN[0]; for (let i = GAMMA_P_LN.length - 1; i > 0; --i) { x = x.add(GAMMA_P_LN[i].div(z.add(i))); } const GAMMA_G_LN = ce.cache("gamma-g-ln", () => ce.bignum(607).div(128)); const t = z.add(GAMMA_G_LN).add(ce._BIGNUM_HALF); return ce._BIGNUM_NEGATIVE_ONE.acos().mul(ce._BIGNUM_TWO).log().mul(ce._BIGNUM_HALF).add( t.log().mul(z.add(ce._BIGNUM_HALF)).minus(t).add(x.log()).minus(z.log()) ); } function gamma2(ce, z) { if (z.lessThan(ce._BIGNUM_HALF)) { const pi = ce._BIGNUM_NEGATIVE_ONE.acos(); return pi.div( pi.mul(z).sin().mul(gamma2(ce, ce._BIGNUM_ONE.sub(z))) ); } if (z.greaterThan(100)) return lngamma2(ce, z).exp(); z = z.sub(1); const LANCZOS_7_C = ce.cache("lanczos-7-c", () => { return [ "0.99999999999980993227684700473478", "676.520368121885098567009190444019", "-1259.13921672240287047156078755283", "771.3234287776530788486528258894", "-176.61502916214059906584551354", "12.507343278686904814458936853", "-0.13857109526572011689554707", "9.984369578019570859563e-6", "1.50563273514931155834e-7" ].map((x2) => ce.bignum(x2)); }); let x = LANCZOS_7_C[0]; for (let i = 1; i < gammaG2 + 2; i++) x = x.add(LANCZOS_7_C[i].div(z.add(i))); const t = z.add(gammaG2).add(ce._BIGNUM_HALF); return ce._BIGNUM_NEGATIVE_ONE.acos().times(ce._BIGNUM_TWO).sqrt().mul(x.mul(t.neg().exp()).mul(t.pow(z.add(ce._BIGNUM_HALF)))); } function isInMachineRange(d) { if (!d.isFinite()) return true; if (d.d.length > 3 || d.d.length === 3 && d.d[0] >= 90) return false; /* @__PURE__ */ console.assert(d.precision() <= 16); return d.e < 308 && d.e > -306; } var import_complex7 = __toESM(require_complex()); var Product = class { constructor(ce, xs, options) { this.options = options; this._terms = []; this._hasInfinity = false; this._hasZero = false; this._isCanonical = true; options = options ? { ...options } : {}; if (!("canonical" in options)) options.canonical = true; this._isCanonical = options.canonical; this.engine = ce; this._sign = 1; this._rational = bignumPreferred(ce) ? [BigInt(1), BigInt(1)] : [1, 1]; this._complex = import_complex7.default.ONE; this._bignum = ce._BIGNUM_ONE; this._number = 1; if (xs) for (const x of xs) this.addTerm(x); } get isEmpty() { if (!this._isCanonical) return this._terms.length === 0; return this._terms.length === 0 && this._hasInfinity === false && this._hasZero === false && this._sign === 1 && isRationalOne(this._rational) && // isRationalOne(this._squareRootRational) && this._complex.re === 1 && this._complex.im === 0 && this._bignum.eq(this.engine._BIGNUM_ONE) && this._number === 1; } /** * Add a term to the product. * * If `this._isCanonical` a running product of exact terms is kept. * Otherwise, terms and their exponent are tallied. */ addTerm(term) { /* @__PURE__ */ console.assert(term.isCanonical); if (term.head === "Multiply") { for (const t of term.ops) this.addTerm(t); return; } if (this._isCanonical) { if (term.isNothing) return; if (term.numericValue !== null) { if (term.isOne) return; if (term.isZero) { this._hasZero = true; return; } if (term.isNegativeOne) { this._sign *= -1; return; } if (term.isInfinity) { this._hasInfinity = true; if (term.isNegative) this._sign *= -1; return; } let num = term.numericValue; if (typeof num === "number") { if (num < 0) { this._sign *= -1; num = -num; } if (Number.isInteger(num)) this._rational = mul2(this._rational, [num, 1]); else if (bignumPreferred(this.engine)) this._bignum = this._bignum.mul(num); else this._number *= num; return; } if (num instanceof decimal_default) { if (num.isNegative()) { this._sign *= -1; num = num.neg(); } if (num.isInteger()) this._rational = mul2(this._rational, [bigint(num), BigInt(1)]); else if (bignumPreferred(this.engine)) this._bignum = this._bignum.mul(num); else this._number *= num.toNumber(); return; } if (num instanceof import_complex7.default) { this._complex = this._complex.mul(num); return; } if (isRational(num)) { this._rational = mul2(this._rational, num); if (isNeg(this._rational)) { this._sign *= -1; this._rational = neg(this._rational); } return; } } } let rest = term; if (this._isCanonical) { let coef; [coef, rest] = asCoefficient(term); this._rational = mul2(this._rational, coef); if (isNeg(this._rational)) { this._sign *= -1; this._rational = neg(this._rational); } } if (rest.numericValue !== null && rest.isOne) return; let exponent = [1, 1]; if (rest.head === "Power") { const r = asRational(rest.op2); if (r) { exponent = r; rest = rest.op1; } } else if (rest.head === "Divide") { this.addTerm(rest.op1); exponent = [-1, 1]; rest = rest.op2; } let found = false; for (const x of this._terms) { if (x.term.isSame(rest)) { x.exponent = add2(x.exponent, exponent); found = true; break; } } if (!found) this._terms.push({ term: rest, exponent }); } unitTerms(mode) { const ce = this.engine; if (mode === "numeric") { if (!complexAllowed(ce) && this._complex.im !== 0) return null; if (bignumPreferred(ce)) { let b2 = ce._BIGNUM_ONE; if (!isRationalOne(this._rational)) { if (isBigRational(this._rational)) b2 = ce.bignum(this._rational[0].toString()).div(ce.bignum(this._rational[1].toString())); else b2 = ce.bignum(this._rational[0]).div(this._rational[1]); } b2 = b2.mul(this._bignum).mul(this._sign * this._number); if (this._complex.im !== 0) { const z = this._complex.mul(b2.toNumber()); if (z.equals(1)) return []; return [{ exponent: [1, 1], terms: [ce.number(z)] }]; } b2 = b2.mul(this._complex.re); if (b2.equals(1)) return []; return [{ exponent: [1, 1], terms: [ce.number(b2)] }]; } let n2 = 1; if (!isRationalOne(this._rational)) { if (isBigRational(this._rational)) n2 = Number(this._rational[0]) / Number(this._rational[1]); else n2 = this._rational[0] / this._rational[1]; } n2 *= this._sign * this._number * this._bignum.toNumber(); if (this._complex.im !== 0) { const z = this._complex.mul(n2); if (z.equals(1)) return []; return [{ exponent: [1, 1], terms: [ce.number(z)] }]; } n2 *= this._complex.re; if (n2 === 1) return []; return [{ exponent: [1, 1], terms: [ce.number(n2)] }]; } const xs = []; const unitTerms = []; if (this._hasInfinity) unitTerms.push(ce._POSITIVE_INFINITY); this._rational = reducedRational(this._rational); if (this._complex.re !== 1 || this._complex.im !== 0) { if (this._complex.im === 0) this._number *= Math.abs(this._complex.re); if (this._complex.re < 0) this._rational = neg(this._rational); else { unitTerms.push(ce.number(this._complex)); } } let n = this._sign * this._number; let b = this._bignum; if (!isRationalOne(this._rational)) { if (mode === "rational") { if (machineNumerator(this._rational) !== 1) { if (isBigRational(this._rational)) b = b.mul(ce.bignum(this._rational[0])); else n *= this._rational[0]; } if (machineDenominator(this._rational) !== 1) xs.push({ exponent: [-1, 1], terms: [ce.number(this._rational[1])] }); } else { if (n === -1) { unitTerms.push(ce.number(neg(this._rational))); n = 1; } else unitTerms.push(ce.number(this._rational)); } } if (!b.equals(ce._BIGNUM_ONE)) unitTerms.push(ce.number(b.mul(n))); else if (n !== 1) unitTerms.push(ce.number(n)); if (unitTerms.length > 0) xs.push({ exponent: [1, 1], terms: unitTerms }); return xs; } /** The terms of the product, grouped by degrees. * * If `mode` is `rational`, rationals are split into separate numerator and * denominator, so that a rational expression can be created later * If `mode` is `expression`, a regular expression is returned, without * splitting rationals * If `mode` is `numeric`, the literals are combined into one expression * */ groupedByDegrees(options) { var _a; options != null ? options : options = {}; if (!("mode" in options)) options.mode = "expression"; const ce = this.engine; if (options.mode === "numeric") { if (this._complex.im !== 0 && !complexAllowed(ce)) return null; if (this._hasInfinity) return [{ exponent: [1, 1], terms: [ce._POSITIVE_INFINITY] }]; } const xs = this.unitTerms((_a = options.mode) != null ? _a : "expression"); if (xs === null) return null; for (const t of this._terms) { const exponent = reducedRational(t.exponent); if (exponent[0] === 0) continue; let found = false; for (const x of xs) { if (exponent[0] === x.exponent[0] && exponent[1] === x.exponent[1]) { x.terms.push(t.term); found = true; break; } } if (!found) xs.push({ exponent, terms: [t.term] }); } return xs; } asExpression(mode = "evaluate") { const ce = this.engine; if (this._hasInfinity) { if (this._hasZero) return ce._NAN; if (this._terms.length === 0) { if (machineNumerator(this._rational) > 0) return ce._POSITIVE_INFINITY; return ce._NEGATIVE_INFINITY; } } if (this._hasZero) return ce._ZERO; const groupedTerms = this.groupedByDegrees({ mode: mode === "N" ? "numeric" : "expression" }); if (groupedTerms === null) return ce._NAN; const terms = termsAsExpressions(ce, groupedTerms); if (terms.length === 0) return ce._ONE; if (terms.length === 1) return terms[0]; return this.engine._fn("Multiply", terms); } /** The product, expressed as a numerator and denominator */ asNumeratorDenominator() { const xs = this.groupedByDegrees({ mode: "rational" }); if (xs === null) return [this.engine._NAN, this.engine._NAN]; const xsNumerator = []; const xsDenominator = []; for (const x of xs) if (x.exponent[0] >= 0) xsNumerator.push(x); else xsDenominator.push({ exponent: neg(x.exponent), terms: x.terms }); const ce = this.engine; const numeratorTerms = termsAsExpressions(ce, xsNumerator); let numerator = ce._ONE; if (numeratorTerms.length === 1) numerator = numeratorTerms[0]; else if (numeratorTerms.length > 0) numerator = ce._fn("Multiply", numeratorTerms); const denominatorTerms = termsAsExpressions(ce, xsDenominator); let denominator = ce._ONE; if (denominatorTerms.length === 1) denominator = denominatorTerms[0]; else if (denominatorTerms.length > 0) denominator = ce._fn("Multiply", denominatorTerms); return [numerator, denominator]; } asRationalExpression() { const [numerator, denominator] = this.asNumeratorDenominator(); if (denominator.numericValue !== null) { if (denominator.isOne) return numerator; if (denominator.isNegativeOne) return this.engine.neg(numerator); } return this.engine._fn("Divide", [numerator, denominator]); } }; function degreeKey(exponent) { if (isRationalOne(exponent)) return 0; const [n, d] = [machineNumerator(exponent), machineDenominator(exponent)]; if (n > 0 && Number.isInteger(n / d)) return 1; if (n > 0) return 2; if (Number.isInteger(n / d)) return 3; return 4; } function degreeOrder(a, b) { const keyA = degreeKey(a.exponent); const keyB = degreeKey(b.exponent); if (keyA !== keyB) return keyA - keyB; const [a_n, a_d] = [ machineNumerator(a.exponent), machineDenominator(a.exponent) ]; const [b_n, b_d] = [ machineNumerator(b.exponent), machineDenominator(b.exponent) ]; return a_n / a_d - b_n / b_d; } function termsAsExpressions(ce, terms) { var _a; const result = terms.sort(degreeOrder).map((x) => { const t = flattenOps(x.terms, "Multiply"); const base = t.length <= 1 ? t[0] : ce._fn("Multiply", t.sort(order)); if (isRationalOne(x.exponent)) return base; return ce.pow(base, x.exponent); }); return (_a = flattenOps(result, "Multiply")) != null ? _a : result; } function subtract(ce, a, b, metadata) { if (a.numericValue !== null) { if (isRational(a.numericValue)) { if (machineNumerator(a.numericValue) < 0) { return serializeJsonFunction( ce, "Subtract", [b, ce.number(neg(a.numericValue))], metadata ); } return null; } const t0 = asSmallInteger(a); if (t0 !== null && t0 < 0) return serializeJsonFunction( ce, "Subtract", [b, ce.number(-t0)], metadata ); } if (a.head === "Negate") return serializeJsonFunction(ce, "Subtract", [b, a.op1], metadata); return null; } function serializeJsonCanonicalFunction(ce, head2, args, metadata) { var _a, _b, _c; const exclusions = ce.jsonSerializationOptions.exclude; if (head2 === "Add" && args.length === 2 && !exclusions.includes("Subtract")) { const sub2 = (_a = subtract(ce, args[0], args[1], metadata)) != null ? _a : subtract(ce, args[1], args[0], metadata); if (sub2) return sub2; } if (head2 === "Divide" && args.length === 2 && exclusions.includes("Divide")) { return serializeJsonFunction( ce, "Multiply", [args[0], ce._fn("Power", [args[1], ce._NEGATIVE_ONE])], metadata ); } if (head2 === "Multiply" && !exclusions.includes("Negate")) { if (asFloat(args[0]) === -1) { if (args.length === 2) return serializeJsonFunction(ce, "Negate", [args[1]]); return serializeJsonFunction( ce, "Negate", [ce._fn("Multiply", args.slice(1))], metadata ); } } if (head2 === "Multiply" && !exclusions.includes("Divide")) { const result = new Product(ce, args, { canonical: false }).asRationalExpression(); if (result.head === "Divide") return serializeJsonFunction(ce, result.head, result.ops, metadata); } if (head2 === "Power") { if (!exclusions.includes("Exp") && ((_b = args[0]) == null ? void 0 : _b.symbol) === "ExponentialE") return serializeJsonFunction(ce, "Exp", [args[1]], metadata); if (((_c = args[1]) == null ? void 0 : _c.numericValue) !== null) { const exp2 = asSmallInteger(args[1]); if (exp2 === 2 && !exclusions.includes("Square")) return serializeJsonFunction(ce, "Square", [args[0]], metadata); if (exp2 !== null && exp2 < 0 && !exclusions.includes("Divide")) { return serializeJsonFunction( ce, "Divide", [ce._ONE, exp2 === -1 ? args[0] : ce.pow(args[0], -exp2)], metadata ); } const r = args[1].numericValue; if (!exclusions.includes("Sqrt") && r === 0.5) return serializeJsonFunction(ce, "Sqrt", [args[0]], metadata); if (!exclusions.includes("Sqrt") && r === -0.5) return serializeJsonFunction( ce, "Divide", [ce._ONE, ce._fn("Sqrt", [args[0]])], metadata ); if (isRational(r)) { const n = machineNumerator(r); const d = machineDenominator(r); if (n === 1) { if (!exclusions.includes("Sqrt") && d === 2) return serializeJsonFunction(ce, "Sqrt", [args[0]], metadata); if (!exclusions.includes("Root")) return serializeJsonFunction( ce, "Root", [args[0], ce.number(r[1])], metadata ); } if (n === -1) { if (!exclusions.includes("Sqrt") && d === 2) return serializeJsonFunction( ce, "Divide", [ce._ONE, ce._fn("Sqrt", [args[0]])], metadata ); if (!exclusions.includes("Root")) return serializeJsonFunction( ce, "Divide", [ce._ONE, ce._fn("Root", [args[0], ce.number(r[1])])], metadata ); } } } } return serializeJsonFunction(ce, head2, args, metadata); } function serializeJsonFunction(ce, head2, args, metadata) { var _a; const exclusions = ce.jsonSerializationOptions.exclude; if ((head2 === "Rational" || head2 === "Divide") && args.length === 2 && asSmallInteger(args[0]) === 1 && asSmallInteger(args[1]) === 2 && !exclusions.includes("Half")) { return serializeJsonSymbol(ce, "Half", { ...metadata, wikidata: "Q39373172" }); } if (args.length === 1) { const num0 = args[0].numericValue; if (head2 === "Negate" && num0 !== null) { if (typeof num0 === "number") return serializeJsonNumber(ce, -num0); if (num0 instanceof decimal_default) return serializeJsonNumber(ce, num0.neg()); if (num0 instanceof import_complex8.Complex) return serializeJsonNumber(ce, num0.neg()); if (isRational(num0)) return serializeJsonNumber(ce, neg(num0)); } } if (typeof head2 === "string" && exclusions.includes(head2)) { if (head2 === "Rational" && args.length === 2) return serializeJsonFunction(ce, "Divide", args, metadata); if (head2 === "Complex" && args.length === 2) return serializeJsonFunction( ce, "Add", [args[0], ce._fn("Multiply", [args[1], ce.symbol("ImaginaryUnit")])], metadata ); if (head2 === "Sqrt" && args.length === 1) return serializeJsonFunction( ce, "Power", [args[0], exclusions.includes("Half") ? ce.number([1, 2]) : ce._HALF], metadata ); if (head2 === "Root" && args.length === 2 && args[1].numericValue !== null) { const n = asSmallInteger(args[1]); if (n === 2) return serializeJsonFunction(ce, "Sqrt", [args[0]]); if (n !== null) { if (n < 0) return serializeJsonFunction( ce, "Divide", [ce._ONE, ce._fn("Power", [args[0], ce.number([1, -n])])], metadata ); return serializeJsonFunction( ce, "Power", [args[0], ce.number([1, -n])], metadata ); } } if (head2 === "Square" && args.length === 1) return serializeJsonFunction( ce, "Power", [args[0], ce.number(2)], metadata ); if (head2 === "Exp" && args.length === 1) return serializeJsonFunction( ce, "Power", [ce.symbol("ExponentialE"), args[0]], metadata ); if (head2 === "Subtract" && args.length === 2) return serializeJsonFunction( ce, "Add", [args[0], ce._fn("Negate", [args[1]])], metadata ); if (head2 === "Subtract" && args.length === 1) return serializeJsonFunction(ce, "Negate", args, metadata); } if (head2 === "Add" && args.length === 2 && !exclusions.includes("Subtract")) { if (args[1].numericValue !== null) { const t1 = asSmallInteger(args[1]); if (t1 !== null && t1 < 0) return serializeJsonFunction( ce, "Subtract", [args[0], ce.number(-t1)], metadata ); } if (args[1].head === "Negate") { return serializeJsonFunction( ce, "Subtract", [args[0], args[1].op1], metadata ); } } if (head2 === "Tuple") { if (args.length === 1 && !exclusions.includes("Single")) return serializeJsonFunction(ce, "Single", args, metadata); if (args.length === 2 && !exclusions.includes("Pair")) return serializeJsonFunction(ce, "Pair", args, metadata); if (args.length === 3 && !exclusions.includes("Triple")) return serializeJsonFunction(ce, "Triple", args, metadata); } const jsonHead = typeof head2 === "string" ? _escapeJsonString(head2) : head2.json; const fn = [jsonHead, ...args.map((x) => x.json)]; const md = { ...metadata != null ? metadata : {} }; if (ce.jsonSerializationOptions.metadata.includes("latex")) { md.latex = _escapeJsonString((_a = md.latex) != null ? _a : ce.serialize({ fn })); } else md.latex = ""; if (!ce.jsonSerializationOptions.metadata.includes("wikidata")) md.wikidata = ""; if (!md.latex && !md.wikidata && ce.jsonSerializationOptions.shorthands.includes("function")) return fn; if (md.latex && md.wikidata) return { fn, latex: md.latex, wikidata: md.wikidata }; if (md.latex) return { fn, latex: md.latex }; if (md.wikidata) return { fn, wikidata: md.wikidata }; return { fn }; } function serializeJsonString(ce, s) { s = _escapeJsonString(s); if (ce.jsonSerializationOptions.shorthands.includes("string")) return `'${s}'`; return { str: s }; } function serializeJsonSymbol(ce, sym, metadata) { var _a, _b; if (sym === "Half" && ce.jsonSerializationOptions.exclude.includes("Half")) { return serializeJsonNumber(ce, [1, 2], metadata); } metadata = { ...metadata }; if (ce.jsonSerializationOptions.metadata.includes("latex")) { metadata.latex = (_a = metadata.latex) != null ? _a : ce.serialize({ sym }); if (metadata.latex !== void 0) metadata.latex = _escapeJsonString(metadata.latex); } else metadata.latex = void 0; if (ce.jsonSerializationOptions.metadata.includes("wikidata")) { if (metadata.wikidata === void 0) { const wikidata = (_b = ce.lookupSymbol(sym)) == null ? void 0 : _b.wikidata; if (wikidata !== void 0) metadata.wikidata = _escapeJsonString(wikidata); } } else metadata.wikidata = void 0; sym = _escapeJsonString(sym); if (metadata.latex === void 0 && metadata.wikidata === void 0 && ce.jsonSerializationOptions.shorthands.includes("symbol")) return sym; if (metadata.latex !== void 0 && metadata.wikidata !== void 0) return { sym, latex: metadata.latex, wikidata: metadata.wikidata }; if (metadata.latex !== void 0) return { sym, latex: metadata.latex }; if (metadata.wikidata !== void 0) return { sym, wikidata: metadata.wikidata }; return { sym }; } function serializeJsonNumber(ce, value, metadata) { var _a, _b, _c; metadata = { ...metadata }; if (!ce.jsonSerializationOptions.metadata.includes("latex")) metadata.latex = void 0; const shorthandAllowed = metadata.latex === void 0 && metadata.wikidata === void 0 && !ce.jsonSerializationOptions.metadata.includes("latex") && ce.jsonSerializationOptions.shorthands.includes("number"); const exclusions = ce.jsonSerializationOptions.exclude; let num = ""; if (value instanceof decimal_default) { if (value.isNaN()) num = "NaN"; else if (!value.isFinite()) num = value.isPositive() ? "+Infinity" : "-Infinity"; else { if (shorthandAllowed && isInMachineRange(value)) return value.toNumber(); if (value.isInteger() && value.e < value.precision() + 4) num = value.toFixed(0); else { const precision = ce.jsonSerializationOptions.precision; const s = precision === "max" ? value.toString() : value.toPrecision( precision === "auto" ? ce.precision : precision ); num = repeatingDecimals(ce, s); if (shorthandAllowed) { const val = value.toNumber(); if (val.toString() === num) return val; } } } if (ce.jsonSerializationOptions.metadata.includes("latex")) metadata.latex = (_a = metadata.latex) != null ? _a : ce.serialize({ num }); return metadata.latex !== void 0 ? { num, latex: metadata.latex } : shorthandAllowed ? num : { num }; } if (value instanceof import_complex8.Complex) { if (value.isInfinite()) return serializeJsonSymbol(ce, "ComplexInfinity", metadata); if (value.isNaN()) { num = "NaN"; if (ce.jsonSerializationOptions.metadata.includes("latex")) metadata.latex = (_b = metadata.latex) != null ? _b : ce.serialize({ num }); return metadata.latex !== void 0 ? { num, latex: metadata.latex } : { num }; } return serializeJsonFunction( ce, "Complex", [ce.number(value.re), ce.number(value.im)], { ...metadata, wikidata: "Q11567" } ); } if (isRational(value)) { const allowRational = !exclusions.includes("Rational"); if (shorthandAllowed && ce.jsonSerializationOptions.shorthands.includes("function") && isMachineRational(value)) { if (value[0] === 1 && value[1] === 2 && !exclusions.includes("Half")) return serializeJsonSymbol(ce, "Half", metadata); return [allowRational ? "Rational" : "Divide", value[0], value[1]]; } return serializeJsonFunction( ce, allowRational ? "Rational" : "Divide", [ce.number(value[0]), ce.number(value[1])], { ...metadata } ); } if (Number.isNaN(value)) num = "NaN"; else if (!Number.isFinite(value)) num = value > 0 ? "+Infinity" : "-Infinity"; else { if (shorthandAllowed) return value; num = repeatingDecimals(ce, value.toString()); } if (ce.jsonSerializationOptions.metadata.includes("latex")) metadata.latex = (_c = metadata.latex) != null ? _c : ce.serialize({ num }); return metadata.latex !== void 0 ? { num, latex: metadata.latex } : { num }; } function _escapeJsonString(s) { return s; } function repeatingDecimals(ce, s) { var _a; if (!ce.jsonSerializationOptions.repeatingDecimals) return s; let [_, wholepart, fractionalPart, exponent] = (_a = s.match(/^(.*)\.([0-9]+)([e|E][-+]?[0-9]+)?$/)) != null ? _a : []; if (!fractionalPart) return s.toLowerCase(); const lastDigit = fractionalPart[fractionalPart.length - 1]; fractionalPart = fractionalPart.slice(0, -1); const MAX_REPEATING_PATTERN_LENGTH = 16; let prefix = ""; for (let i = 0; i < fractionalPart.length - MAX_REPEATING_PATTERN_LENGTH; i++) { prefix = fractionalPart.substring(0, i); for (let j = 0; j <= MAX_REPEATING_PATTERN_LENGTH; j++) { const repetend = fractionalPart.substring(i, i + j + 1); const times = Math.floor( (fractionalPart.length - prefix.length) / repetend.length ); if (times < 3) break; if ((prefix + repetend.repeat(times + 1)).startsWith(fractionalPart)) { if (repetend === "0") { if (lastDigit === "0") return wholepart + "." + prefix + (exponent != null ? exponent : ""); return s; } return wholepart + "." + prefix + "(" + repetend + ")" + (exponent != null ? exponent : ""); } } } fractionalPart += lastDigit; while (fractionalPart.endsWith("0")) fractionalPart = fractionalPart.slice(0, -1); if (exponent) return `${wholepart}.${fractionalPart}${exponent.toLowerCase()}`; return `${wholepart}.${fractionalPart}`; } var _BoxedDomain = class __BoxedDomain extends AbstractBoxedExpression { constructor(ce, dom, metadata) { super(ce, metadata); this._value = makeCanonical(ce, dom); } get isCanonical() { return true; } /** Boxed domains are always canonical. */ get canonical() { return this; } get isValid() { return this.ctor !== "InvalidDomain"; } get json() { return ["Domain", serialize(this.engine, this._value)]; } get literal() { if (typeof this._value === "string") return this._value; return null; } get ctor() { if (typeof this._value === "string") return null; return this._value[0]; } get domainArgs() { if (typeof this._value === "string") return null; return this._value.slice(1); } get domainArg1() { if (typeof this._value === "string") return null; return this._value[1]; } get codomain() { if (typeof this._value === "string") return null; return this.engine.domain(this._value[this._value.length - 1]); } get hash() { if (this._hash === void 0) this._hash = hashCode(hash(this._value)); return this._hash; } isEqual(rhs) { return isEqual(this._value, rhs); } isSame(rhs) { return isEqual(this._value, rhs); } is(rhs) { return isEqual(this._value, rhs); } isCompatible(dom, compatibility = "covariant") { const lhs = this._value; const rhs = dom instanceof __BoxedDomain ? dom._value : dom; const rhsCtor = Array.isArray(rhs) ? rhs[0] : null; if (rhsCtor) { const rhsParam = rhs[1]; if (rhsCtor === "Covariant") return isSubdomainOf1(lhs, rhsParam); if (rhsCtor === "Contravariant") return isSubdomainOf1(rhsParam, lhs); if (rhsCtor === "Invariant") return !isSubdomainOf1(rhsParam, lhs) && !isSubdomainOf1(lhs, rhsParam); if (rhsCtor === "Bivariant") return isSubdomainOf1(lhs, rhsParam) && isSubdomainOf1(rhsParam, lhs); } if (compatibility === "covariant") return isSubdomainOf1(lhs, rhs); if (compatibility === "contravariant") return isSubdomainOf1(rhs, lhs); if (compatibility === "bivariant") return isSubdomainOf1(rhs, lhs) && isSubdomainOf1(lhs, rhs); return !isSubdomainOf1(rhs, lhs) && !isSubdomainOf1(lhs, rhs); } match(rhs, _options) { if (!(rhs instanceof __BoxedDomain)) return null; if (this.isSame(rhs)) return {}; return null; } get head() { return "Domain"; } get domain() { return this.engine.domain("Domain"); } get isNothing() { return this._value === "Nothing"; } get isFunction() { return this.ctor === "Function" || this._value === "Function"; } // get isPredicate(): boolean { // if (this.domainLiteral === 'Predicate') return true; // if (this.domainConstructor !== 'Function') return false; // const resultDomain = this._value[this._value.length]; // if (!(resultDomain instanceof _Domain)) return false; // return resultDomain.isBoolean; // } // get isNumericFunction(): boolean { // if (this.domainLiteral === 'NumericFunction') return true; // if (this.domainConstructor !== 'Function') return false; // for (const arg of this.domainParams!) // if (!isNumericSubdomain(arg, 'Number')) return false; // return true; // } // get isBoolean(): boolean { // const dom = this.domainLiteral; // return dom === 'Boolean' || dom === 'MaybeBoolean'; // } // get isRealFunction(): boolean { // if (this.domainLiteral === 'RealFunction') return true; // if (this.domainConstructor !== 'Function') return false; // for (const arg of this.domainParams!) // if (!isNumericSubdomain(arg, 'ExtendedRealNumber')) return false; // return true; // } get isNumeric() { return this.isCompatible(this.engine.domain("Number")); } // get isLogicOperator(): boolean { // if (this.domainLiteral === 'LogicOperator') return true; // if (!this.codomain?.isBoolean) return false; // const params = this.domainParams!; // if (params.length < 1 || params.length > 2) return false; // if (!params[0].isBoolean) return false; // if (params.length === 1) return true; // if (!params[1].isBoolean) return false; // return true; // } get isRelationalOperator() { if (this._value === "RelationalOperator") return true; if (this.ctor !== "Function") return false; if (this.domainArgs.length !== 2) return false; if (!this.codomain.isCompatible("MaybeBoolean")) return false; return true; } }; function boxDomain(ce, dom, metadata) { if (Array.isArray(dom) && dom[0] === "Domain") dom = dom[1]; if (dom instanceof _BoxedDomain) return dom; if (dom instanceof AbstractBoxedExpression) dom = dom.json; if (typeof dom === "string") { const expr = DOMAIN_ALIAS[dom]; if (expr) return boxDomain(ce, expr); if (!isDomainLiteral(dom)) throw Error("Expected a domain literal, got " + dom); return new _BoxedDomain(ce, dom, metadata); } if (!Array.isArray(dom) || dom.length === 0) throw Error("Expected a valid domain"); const constructor = dom[0]; if (!DOMAIN_CONSTRUCTORS.includes(constructor)) throw Error("Expected domain constructor, got " + constructor); return new _BoxedDomain(ce, dom, metadata); } function makeCanonical(ce, dom) { if (dom === void 0 || typeof dom === "number") throw Error("Expected a domain expression"); if (dom instanceof _BoxedDomain) return dom._value; if (typeof dom === "string") { if (!isDomainLiteral(dom)) throw Error("Unknown domain literal"); return dom; } if (!Array.isArray(dom) && typeof dom === "object") throw Error("Expected a domain expression"); if (!dom) ; const ctor = dom[0]; /* @__PURE__ */ console.assert(ctor); if (ctor === "Range") { if (dom.length === 1) return "Integer"; let first = 1; let last = Infinity; if (dom.length === 2) { last = dom[1]; } else if (dom.length === 3) { first = dom[1]; last = dom[2]; } const firstNum = asRangeBound(ce, first); const lastNum = asRangeBound(ce, last); if (firstNum === null || lastNum === null) throw Error(`Invalid range [${firstNum}, ${lastNum}] `); if (lastNum < firstNum) [first, last] = [last, first]; if (firstNum === -Infinity && lastNum === Infinity) return "Integer"; if (firstNum === 1 && lastNum === Infinity) return "PositiveInteger"; if (firstNum === 0 && lastNum === Infinity) return "NonNegativeInteger"; if (firstNum === -Infinity && lastNum === -1) return "NegativeInteger"; if (firstNum === -Infinity && lastNum === 0) return "NonPositiveInteger"; return ["Range", ce.number(firstNum), ce.number(lastNum)]; } if (ctor === "Interval") { if (dom.length !== 3) throw Error("Invalid range " + dom); let [isLeftOpen, first] = maybeOpen(ce, dom[1]); let [isRightOpen, last] = maybeOpen(ce, dom[2]); if (first === null || last === null) throw Error("Invalid range " + dom); if (last < first) { [first, last] = [last, first]; [isLeftOpen, isRightOpen] = [isRightOpen, isLeftOpen]; } if (first === 0 && last === Infinity) return isLeftOpen ? "PositiveNumber" : "NonNegativeNumber"; if (first === -Infinity && last === 0) return isRightOpen ? "NegativeNumber" : "NonPositiveNumber"; return [ "Interval", isLeftOpen ? ["Open", ce.number(first)] : ce.number(first), isRightOpen ? ["Open", ce.number(last)] : ce.number(last) ]; } if (ctor === "Function") { return ["Function", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; } if (ctor === "Dictionary") { return ["Dictionary", makeCanonical(ce, dom[1])]; } if (ctor === "List") { return ["List", makeCanonical(ce, dom[1])]; } if (ctor === "Tuple") { return ["Tuple", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; } if (ctor === "Union") { return ["Union", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; } if (ctor === "Intersection") { return ["Intersection", ...dom.slice(1).map((x) => makeCanonical(ce, x))]; } if (ctor === "Covariant" || ctor === "Contravariant" || ctor === "Invariant") { return [ctor, makeCanonical(ce, dom[1])]; } if (ctor === "Maybe") { return ["Maybe", makeCanonical(ce, dom[1])]; } if (ctor === "Sequence") { return ["Sequence", makeCanonical(ce, dom[1])]; } if (ctor === "Head") { return ["Head", dom[1]]; } if (ctor === "Symbol") { return ["Symbol", dom[1]]; } if (ctor === "Value") { return ["Value", ce.box(dom[1])]; } if (ctor === "InvalidDomain") { return ["InvalidDomain", dom[1]]; } throw Error("Unexpected domain constructor " + ctor); } function asRangeBound(ce, expr) { if (typeof expr === "number") return expr; const x = ce.box(expr).evaluate(); return x.isInfinity ? x.isPositive ? Infinity : -Infinity : asSmallInteger(x); } function maybeOpen(ce, expr) { if (Array.isArray(expr) && expr[0] === "Open") return [true, asRangeBound(ce, expr[1])]; return [false, asRangeBound(ce, expr)]; } function isDomain(expr) { if (expr instanceof _BoxedDomain) return true; if (expr instanceof AbstractBoxedExpression) expr = expr.json; if (typeof expr === "string") return isDomainLiteral(expr); if (Array.isArray(expr)) { if (expr.length <= 1) return false; const ctor = expr[0]; if (typeof ctor !== "string" || !DOMAIN_CONSTRUCTORS.includes(ctor)) return false; if (ctor === "InvalidDomain") return false; if (ctor === "List") return expr.length === 2 && isValidDomain(expr[1]); if (ctor === "Tuple" || ctor === "Function" || ctor === "Maybe" || ctor === "Sequence" || ctor === "Intersection" || ctor === "Union") return expr.slice(1, -1).every((x) => isValidDomain(x)); return expr.every((x) => x !== null); } return false; } function isValidDomain(expr) { if (expr instanceof _BoxedDomain) return expr.isValid; if (Array.isArray(expr) && expr[0] === "InvalidDomain") return false; return isDomain(expr); } function isSubdomainOf1(lhs, rhs) { const [result, rest] = isSubdomainOf([lhs], rhs); if (result && rest.length === 0) return true; return false; } function isSubdomainOf(xlhs, rhs) { let lhs = xlhs.shift(); const rhsLiteral = typeof rhs === "string" ? rhs : null; if (rhsLiteral === "Anything") return [true, xlhs]; const lhsLiteral = typeof lhs === "string" ? lhs : null; if (lhsLiteral && rhsLiteral) { if (lhsLiteral === rhsLiteral) return [true, xlhs]; return [ancestors(lhsLiteral).includes(rhsLiteral), xlhs]; } if (rhsLiteral) { if (!lhs) ; const lhsConstructor = lhs[0]; if (lhsConstructor === "Function") return [rhsLiteral === "Function", xlhs]; if (lhsConstructor === "Dictionary") return [rhsLiteral === "Dictionary", xlhs]; if (lhsConstructor === "List") return [rhsLiteral === "List", xlhs]; if (lhsConstructor === "Tuple") return [rhsLiteral === "Tuple", xlhs]; if (lhsConstructor === "Intersection") { } if (lhsConstructor === "Interval") return [isSubdomainOf1("ExtendedRealNumber", rhsLiteral), xlhs]; if (lhsConstructor === "Range") return [isSubdomainOf1("Integer", rhsLiteral), xlhs]; return [true, xlhs]; } const rhsConstructor = rhs[0]; if (rhsConstructor === "Function") { if (lhsLiteral === "Function") return [true, xlhs]; if (lhsLiteral) return [false, xlhs]; if (lhs[0] !== "Function") return [false, xlhs]; if (lhs.length === 1 && rhs.length === 1) return [true, xlhs]; if (!isSubdomainOf1( lhs[lhs.length - 1], rhs[rhs.length - 1] )) return [false, xlhs]; const lhsParams = lhs.slice(1, -1); let rhsParams = rhs.slice(1, -1); for (let i = 0; i <= lhsParams.length - 1; i++) { if (rhsParams.length === 0) { const lhsCtor = Array.isArray(lhsParams[i]) ? lhsParams[i][0] : null; if (lhsCtor !== "Maybe") return [false, xlhs]; return [true, xlhs]; } else { let match2 = false; [match2, rhsParams] = isSubdomainOf(rhsParams, lhsParams[i]); if (!match2) return [false, xlhs]; } } return [rhsParams.length === 0, xlhs]; } if (rhsConstructor === "Intersection") { return [ rhs.slice(1, -1).every( (x) => isSubdomainOf1(lhs, x) ), xlhs ]; } if (rhsConstructor === "Union") { return [ rhs.slice(1, -1).some((x) => isSubdomainOf1(lhs, x)), xlhs ]; } if (rhsConstructor === "Maybe") { if (lhsLiteral === "Nothing") return [true, xlhs]; return isSubdomainOf( [lhs, ...xlhs], rhs[1] ); } if (rhsConstructor === "Sequence") { const seq = rhs[1]; if (!isSubdomainOf1(lhs, seq)) return [false, xlhs]; lhs = xlhs.shift(); let match2 = true; while (xlhs.length > 0 && match2) { [match2, xlhs] = isSubdomainOf(xlhs, seq); lhs = xlhs.shift(); } return [true, xlhs]; } if (rhsConstructor === "Tuple") { if (!Array.isArray(lhs) || lhs[0] !== "Tuple") return [false, xlhs]; if (lhs.length > rhs.length) return [false, xlhs]; for (let i = 1; i <= rhs.length - 1; i++) { if (!lhs[i] || !isSubdomainOf1( lhs[i], rhs[i] )) return [false, xlhs]; } return [true, xlhs]; } if (rhsConstructor === "Range") { if (!Array.isArray(lhs) || lhs[0] !== "Range") return [false, xlhs]; const lhsMin = asFloat(lhs[1]); const lhsMax = asFloat(lhs[2]); const rhsMin = asFloat(rhs[1]); const rhsMax = asFloat(rhs[2]); return [ lhsMin !== null && lhsMax !== null && rhsMin !== null && rhsMax !== null && lhsMin >= rhsMin && lhsMax <= rhsMax, xlhs ]; } if (rhsConstructor === "Interval") { if (!Array.isArray(lhs) || lhs[0] !== "Interval") return [false, xlhs]; const lhsMin = asFloat(lhs[1]); const lhsMax = asFloat(lhs[2]); const rhsMin = asFloat(rhs[1]); const rhsMax = asFloat(rhs[2]); return [ lhsMin !== null && lhsMax !== null && rhsMin !== null && rhsMax !== null && lhsMin >= rhsMin && lhsMax <= rhsMax, xlhs ]; } console.error("Unexpected domain constructor " + rhsConstructor); return [false, xlhs]; } function sharedAncestorDomain(a, b) { const aLiteral = domainLiteralAncestor(a); const bLiteral = domainLiteralAncestor(b); const aAncestors = [aLiteral, ...ancestors(aLiteral)]; const bAncestors = [bLiteral, ...ancestors(bLiteral)]; while (!bAncestors.includes(aAncestors[0])) aAncestors.shift(); return a.engine.domain(aAncestors[0]); } function domainLiteralAncestor(dom) { let result = dom.literal; if (result) return result; result = dom.ctor; if (result === "Maybe") return "Anything"; if (result === "Interval") return "RealNumber"; if (result === "Range") return "Integer"; if (result === "Head") return "Function"; if (result === "Union") return "Anything"; if (result === "Intersection") return "Anything"; return result; } function serialize(ce, dom) { if (dom instanceof AbstractBoxedExpression) return dom.json; if (typeof dom === "string") return dom; if (dom[0] === "InvalidDomain") { return ["InvalidDomain", serialize(ce, dom[1])]; } const result = [serializeJsonSymbol(ce, dom[0])]; if (dom.length > 1) for (let i = 1; i <= dom.length - 1; i++) result.push(serialize(ce, dom[i])); return result; } function hash(dom) { if (typeof dom === "string") return "domain:" + dom; let s = "domain:" + this.ctor; for (const arg of this.domainArgs) s += ":" + hash(arg); return s; } function isEqual(lhs, rhs) { if (typeof rhs === "string") return this._value === rhs; if (rhs instanceof _BoxedDomain) return isEqual(lhs, rhs._value); if (typeof lhs === "string") return lhs === rhs; /* @__PURE__ */ console.assert(Array.isArray(lhs)); if (!Array.isArray(rhs)) return false; if (lhs[0] !== rhs[0]) return false; if (rhs.length !== lhs.length) return false; for (let i = 1; i <= lhs.length - 1; i++) { if (lhs[i] instanceof AbstractBoxedExpression) { if (!(rhs[i] instanceof AbstractBoxedExpression)) return false; if (!rhs[i].isEqual(rhs[i])) return false; } else if (typeof lhs[i] === "string") { if (typeof rhs[i] !== "string") return false; if (lhs[i] !== rhs[i]) return false; } else if (!isEqual(lhs[i], rhs[i])) return false; } return true; } function validateArgumentCount(ce, ops2, count) { if (ops2.length === count) return ops2; const xs = [...ops2.slice(0, count)]; let i = Math.min(count, ops2.length); while (i < count) { xs.push(ce.error("missing")); i += 1; } while (i < ops2.length) { xs.push(ce.error("unexpected-argument", ops2[i])); i += 1; } return xs; } function validateNumericArgs(ce, ops2, count) { if (!ce.strict) return ops2; let xs; if (count === void 0) xs = ops2; else { xs = []; for (let i = 0; i <= Math.max(count - 1, ops2.length - 1); i++) { if (i > count - 1) xs.push(ce.error("unexpected-argument", ops2[i])); else xs.push(ops2[i] !== void 0 ? ce.box(ops2[i]) : ce.error("missing")); } } return xs.map( (op3) => op3 && !op3.isValid || op3.isNumber ? op3 : ce.error(["incompatible-domain", "Number", op3.domain], op3) ); } function validateSignature(sig, ops2, codomain) { const ce = sig.engine; if (!ce.strict) return ops2; const opsDomain = ops2.map((x) => x.domain); const targetSig = ce.domain([ "Function", ...opsDomain, codomain != null ? codomain : "Anything" ]); if (sig.isCompatible(targetSig)) return null; const expectedArgs = sig.domainArgs.slice(0, -1); const count = Math.max(expectedArgs.length, opsDomain.length); let newOps = []; let rest = [...ops2]; for (let i = 0; i <= count - 1; i++) [newOps, rest] = validateNextArgument( ce, expectedArgs[i], newOps, rest ); while (newOps.length > 0 && newOps[newOps.length - 1].symbol === "Nothing") newOps.pop(); return newOps; } function validateArgument(ce, arg, dom) { if (dom === void 0) return ce.error("unexpected-argument", arg); if (arg === void 0) return ce.error("missing"); if (!arg.isValid) return arg; if (arg == null ? void 0 : arg.domain.isCompatible(dom)) return arg; return ce.error(["incompatible-domain", dom, arg.domain], arg); } function validateNextArgument(ce, dom, matched, ops2) { let next = ops2.shift(); if (dom === void 0) return [[...matched, ce.error("unexpected-argument", next)], ops2]; if (!Array.isArray(dom)) { if (!next) return [[...matched, ce.error("missing")], ops2]; if (!next.domain.isCompatible(dom)) { return [ [...matched, ce.error(["incompatible-domain", dom, next.domain], next)], ops2 ]; } return [[...matched, next], ops2]; } const ctor = dom[0]; if (next === void 0) { let valid = false; if (ctor === "Union") { for (let k = 1; k <= dom.length - 1; k++) { if (dom[k] === "Nothing") { valid = true; break; } } } else if (ctor === "Maybe") valid = true; if (valid) return [[...matched, ce.symbol("Nothing")], ops2]; return [[...matched, ce.error("missing")], ops2]; } if (ctor === "Union") { let found = false; for (let k = 1; k <= dom.length - 1; k++) { if (next.domain.isCompatible(dom[k])) { found = true; break; } } if (found) return [[...matched, next], ops2]; return [ [...matched, ce.error(["incompatible-domain", dom, next.domain], next)], ops2 ]; } if (ctor === "Sequence") { const seq = dom[1]; if (!next || !next.domain.isCompatible(seq)) { return [ [...matched, ce.error(["incompatible-domain", seq, next.domain], next)], ops2 ]; } let done = false; const result = [...matched, next]; while (!done) { next = ops2.shift(); if (!next) done = false; else if (!next.domain.isCompatible(seq)) { ops2.unshift(next); done = false; } else result.push(next); } return [result, ops2]; } if (ctor === "Maybe") { if (next === void 0 || next.symbol === "Nothing") return [[...matched, ce.symbol("Nothing")], ops2]; return validateNextArgument(ce, dom[1], matched, [next, ...ops2]); } console.error("Unhandled ctor", ctor); return [[...matched, next], ops2]; } function validateArguments(ce, args, doms) { if (args.length === doms.length && args.every((x, i) => x.domain.isCompatible(doms[i]))) return args; const xs = []; for (let i = 0; i <= doms.length - 1; i++) xs.push(validateArgument(ce, args[i], doms[i])); for (let i = doms.length; i <= args.length - 1; i++) xs.push(ce.error("unexpected-argument", args[i])); return xs; } function canonicalAdd(ce, ops2) { /* @__PURE__ */ console.assert(ops2.every((x) => x.isCanonical)); ops2 = ops2.filter((x) => x.numericValue === null || !x.isZero); if (ops2.length === 0) return ce.number(0); if (ops2.length === 1) return ops2[0]; if (ops2.length === 2) { let im = 0; let re = 0; re = asFloat(ops2[0]); if (re !== null && re !== 0) im = getImaginaryCoef(ops2[1]); else { im = getImaginaryCoef(ops2[0]); if (im !== 0 && ops2[1].numericValue !== null) re = asFloat(ops2[1]); } if (re !== null && im !== null && im !== 0) return ce.number(ce.complex(re, im)); } if (ops2.length > 1) ops2 = sortAdd(ce, ops2); return ce._fn("Add", ops2); } function domainAdd(_ce, args) { let dom = null; for (const arg of args) { if (!arg.isNumeric) return null; if (!dom) dom = arg; else dom = sharedAncestorDomain(dom, arg); } return dom; } function simplifyAdd(ce, args) { /* @__PURE__ */ console.assert(args.length > 1, `simplifyAdd: not enough args`); const sum2 = new Sum(ce); for (let arg of args) { arg = arg.simplify(); if (arg.isImaginary && arg.isInfinity) return ce.symbol("ComplexInfinity"); if (arg.isNaN || arg.symbol === "Undefined") return ce._NAN; if (!arg.isZero) sum2.addTerm(arg); } return sum2.asExpression("expression"); } function evalAddNum(ops2) { let sum2 = 0; for (const op3 of ops2) { const v = op3.numericValue; if (typeof v === "number") sum2 += v; else return null; } return sum2; } function evalAdd(ce, ops2, mode = "evaluate") { if (mode === "N" && ce.numericMode === "machine") { ops2 = ops2.map((x) => x.N()); const sum2 = evalAddNum(ops2); if (sum2 !== null) return ce.number(sum2); } for (const arg of ops2) { if (arg.isImaginary && arg.isInfinity) return ce.symbol("ComplexInfinity"); if (arg.isNaN || arg.symbol === "Undefined") return ce._NAN; if (!arg.isExact) mode = "N"; } if (mode === "N") ops2 = ops2.map((x) => x.N()); else ops2 = ops2.map((x) => x.evaluate()); return new Sum(ce, ops2).asExpression(mode === "N" ? "numeric" : "expression"); } function canonicalSummation(ce, body, range) { var _a, _b, _c, _d, _e, _f, _g, _h, _i; body != null ? body : body = ce.error("missing"); let index = null; let lower = null; let upper = null; if (range && range.head !== "Tuple" && range.head !== "Triple" && range.head !== "Pair" && range.head !== "Single") { index = range; } else if (range) { index = (_b = (_a = range.ops) == null ? void 0 : _a[0]) != null ? _b : null; lower = (_e = (_d = (_c = range.ops) == null ? void 0 : _c[1]) == null ? void 0 : _d.canonical) != null ? _e : null; upper = (_h = (_g = (_f = range.ops) == null ? void 0 : _f[2]) == null ? void 0 : _g.canonical) != null ? _h : null; } if ((index == null ? void 0 : index.head) === "Hold") index = index.op1; if ((index == null ? void 0 : index.head) === "ReleaseHold") index = (_i = index.op1) == null ? void 0 : _i.evaluate(); index != null ? index : index = ce.symbol("Nothing"); if (!index.symbol) index = ce.error(["incompatible-domain", "Symbol", index.domain]); if (index.symbol) ce.pushScope({ [index.symbol]: { domain: "Integer" } }); const fn = body.canonical; if (index.symbol) { ce.popScope(); index = index = ce.hold(index); } if (lower && lower.isFinite) lower = validateArgument(ce, lower, "Integer"); if (upper && upper.isFinite) upper = validateArgument(ce, upper, "Integer"); if (lower && upper) range = ce.tuple([index, lower, upper]); else if (upper) range = ce.tuple([index, ce.number(1), upper]); else if (lower) range = ce.tuple([index, lower]); else range = index; return ce._fn("Sum", [fn, range]); } function evalSummation(ce, expr, range, mode) { var _a; const [index, lower, upper, isFinite2] = normalizeLimits(range); const fn = expr; if (mode !== "N" && (lower >= upper || upper - lower >= MAX_SYMBOLIC_TERMS)) return void 0; let result = null; const savedContext = ce.context; ce.context = (_a = fn.scope) != null ? _a : ce.context; if (mode === "simplify") { const terms = []; if (!fn.scope) for (let i = lower; i <= upper; i++) terms.push(fn.simplify()); else for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); terms.push(fn.simplify()); } result = ce.add(terms).simplify(); } if (mode === "evaluate") { const terms = []; if (!fn.scope) for (let i = lower; i <= upper; i++) terms.push(fn.evaluate()); else for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); terms.push(fn.evaluate()); } result = ce.add(terms).evaluate(); } if (mode === "N") { if (result === null && !fn.scope) { const n = fn.N(); if (!isFinite2) { if (n.isZero) result = ce._ZERO; else if (n.isPositive) result = ce._POSITIVE_INFINITY; else result = ce._NEGATIVE_INFINITY; } if (result === null && fn.isPure) result = ce.mul([ce.number(upper - lower + 1), n]); } if (result === null && isFinite2) { if (bignumPreferred(ce)) { let sum2 = ce.bignum(0); for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); const term = asBignum(fn.N()); if (term === null) { result = void 0; break; } if (!term.isFinite()) { sum2 = term; break; } sum2 = sum2.add(term); } if (result === null) result = ce.number(sum2); } else { const numericMode = ce.numericMode; ce.numericMode = "machine"; let sum2 = 0; for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); const term = asFloat(fn.N()); if (term === null) { result = void 0; break; } if (!Number.isFinite(term)) { sum2 = term; break; } sum2 += term; } ce.numericMode = numericMode; if (result === null) result = ce.number(sum2); } } else if (result === null) { ce.set({ [index]: 1e3 }); const nMax = fn.N(); ce.set({ [index]: 999 }); const nMaxMinusOne = fn.N(); const ratio = asFloat(ce.div(nMax, nMaxMinusOne).N()); if (ratio !== null && Number.isFinite(ratio) && Math.abs(ratio) > 1) { result = ce._POSITIVE_INFINITY; } else { let sum2 = 0; const numericMode = ce.numericMode; ce.numericMode = "machine"; for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); const term = asFloat(fn.N()); if (term === null) { result = void 0; break; } if (Math.abs(term) < Number.EPSILON || !Number.isFinite(term)) break; sum2 += term; } ce.numericMode = numericMode; if (result === null) result = ce.number(sum2); } } } ce.context = savedContext; return result != null ? result : void 0; } var import_complex9 = __toESM(require_complex()); function negateLiteral(expr, metadata) { let n = expr.numericValue; if (n === null) return null; if (typeof n === "number") n = -n; else if (n instanceof decimal_default) n = n.neg(); else if (n instanceof import_complex9.Complex) n = n.neg(); else if (Array.isArray(n)) n = neg(n); return expr.engine.number(n, { metadata }); } function canonicalNegate(expr, metadata) { if (expr.head === "Negate") return expr.op1; if (expr.numericValue !== null) return negateLiteral(expr, metadata); if (expr.head === "Add") { let ops2 = expr.ops.map((x) => canonicalNegate(x)); ops2 = flattenOps(ops2, "Add"); return expr.engine.add(ops2, metadata); } if (expr.head === "Multiply") { return negateProduct(expr.engine, expr.ops); } if (expr.head === "Divide") return expr.engine._fn("Divide", [canonicalNegate(expr.op1), expr.op2]); /* @__PURE__ */ console.assert(expr.head !== "Subtract"); return expr.engine._fn("Negate", [expr], metadata); } function negateProduct(ce, args) { let result = []; let done = false; for (const arg of args) { if (!done && arg.head === "Negate") { done = true; result.push(arg.op1); } else result.push(arg); } if (done) return ce.mul(result); result = []; for (const arg of args) { if (done || arg.numericValue === null || !arg.isInteger) result.push(arg); else { done = true; result.push(canonicalNegate(arg)); } } if (done) return ce.mul(result); result = []; for (const arg of args) { if (done || arg.numericValue === null || !arg.isNumber) result.push(arg); else { done = true; result.push(canonicalNegate(arg)); } } if (done) return ce.mul(result); return ce._fn("Negate", [ce._fn("Multiply", args)]); } function processNegate(_ce, x, _mode = "simplify") { return canonicalNegate(x); } function distribute2(lhs, rhs) { if (lhs.head === "Negate" && rhs.head === "Negate") return distribute2(lhs.op1, rhs.op1); if (lhs.head === "Negate") return canonicalNegate(distribute2(lhs.op1, rhs)); if (rhs.head === "Negate") return canonicalNegate(distribute2(lhs, rhs.op1)); const ce = lhs.engine; if (lhs.head === "Divide" && rhs.head === "Divide") { const denom = ce.mul([lhs.op2, rhs.op2]); return ce.div(distribute2(lhs.op1, rhs.op1), denom); } if (lhs.head === "Divide") return ce.div(distribute2(lhs.op1, rhs), lhs.op2); if (rhs.head === "Divide") return ce.div(distribute2(lhs, rhs.op1), rhs.op2); if (lhs.head === "Add") return ce.add(lhs.ops.map((x) => distribute2(x, rhs))); if (rhs.head === "Add") return ce.add(rhs.ops.map((x) => distribute2(lhs, x))); return ce.mul([lhs, rhs]); } function distribute(expr) { if (expr.length === 1) return expr[0]; if (expr.length === 2) return distribute2(expr[0], expr[1]); return distribute2(expr[0], distribute(expr.slice(1))); } var binomials = [ [1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56, 28, 8, 1] ]; function choose(n, k) { while (n >= binomials.length) { const s = binomials.length; const nextRow = [1]; const prev = binomials[s - 1]; for (let i = 1; i < s; i++) nextRow[i] = prev[i - 1] + prev[i]; nextRow[s] = 1; binomials.push(nextRow); } return binomials[n][k]; } function multinomialCoefficient(k) { let n = k.reduce((acc, v) => acc + v, 0); let prod = 1; for (let i = 0; i < k.length; i += 1) { prod *= choose(n, k[i]); n -= k[i]; } return prod; } function* powers(n, exp2) { if (n === 1) { yield [exp2]; return; } for (let i = 0; i <= exp2; i += 1) for (const p of powers(n - 1, exp2 - i)) yield [i, ...p]; } function expandMultinomial(expr) { if (expr.head !== "Power") return null; const exp2 = asSmallInteger(expr.op2); if (exp2 === null || exp2 < 0) return null; if (exp2 === 0) return expr.engine._ONE; if (exp2 === 1) return expr.op1; const ce = expr.engine; if (expr.op1.head === "Negate") { const sign2 = exp2 % 2 === 0 ? 1 : -1; const result2 = expandMultinomial(ce.pow(expr.op1.op1, expr.op2)); if (result2 === null) return null; if (sign2 > 0) return result2; return ce.neg(result2); } /* @__PURE__ */ console.assert(expr.op1.head !== "Subtract"); if (expr.op1.head !== "Add") return null; const terms = expr.op1.ops; const it = powers(terms.length, exp2); const result = []; for (const val of it) { const product = [ce.number(multinomialCoefficient(val))]; for (let i = 0; i < val.length; i += 1) { if (val[i] !== 0) { if (val[i] === 1) product.push(terms[i]); else product.push(ce.pow(terms[i], val[i])); } } result.push(ce.mul(product)); } return ce.add(result); } function expandNumerator(expr) { if (expr.head !== "Divide") return null; const expandedNumerator = expand2(expr.op1); if (expandedNumerator === null) return null; const ce = expr.engine; if (expandedNumerator.head === "Add") { return ce.add(expandedNumerator.ops.map((x) => ce.div(x, expr.op2))); } return expr.engine.div(expandedNumerator, expr.op2); } function expand2(expr) { if (!expr) return null; let result = expandNumerator(expr); if (result !== null) return result; if (expr.head === "Multiply") { result = distribute(expr.ops); if (result !== null) return result; } if (expr.head === "Add") { const ops2 = expr.ops.map((x) => { var _a; return (_a = expand2(x)) != null ? _a : x; }); return simplifyAdd(expr.engine, ops2); } if (expr.head === "Negate") { result = expand2(expr.op1); if (result !== null) return expr.engine.neg(result); } if (expr.head === "Power") { result = expandMultinomial(expr); if (result !== null) return result; } return null; } var UNIVARIATE_ROOTS = [ // ax = 0 [["Multiply", "_x", "_a"], 0], // x + a = 0 [ ["Add", "_a", "_x"], ["Negate", "_a"] ], [["Add", ["Negate", "_x"], "_a"], "_a"], // ax + b = 0 [ ["Add", ["Multiply", "_x", "_a"], "_b"], ["Divide", ["Negate", "_b"], "_a"] ], // Quadratic formula (real) // ax^2 + bx + c = 0 [ [ "Add", ["Multiply", ["Power", "_x", 2], "_a"], ["Multiply", "_x", "_b"], "_c" ], [ "Divide", [ "Add", ["Negate", "_b"], ["Sqrt", ["Subtract", ["Square", "_b"], ["Multiply", 4, "_a", "_c"]]] ], ["Multiply", 2, "_a"] ] // (_ce, vars): boolean => vars.x.isReal === true, ], [ [ "Add", ["Multiply", ["Power", "_x", 2], "_a"], ["Multiply", "_x", "_b"], "_c" ], [ "Divide", [ "Subtract", ["Negate", "_b"], ["Sqrt", ["Subtract", ["Square", "_b"], ["Multiply", 4, "_a", "_c"]]] ], ["Multiply", 2, "_a"] ] // (_ce, vars): boolean => vars.x.isReal === true, ], // ax^2 + bx = 0 [ ["Add", ["Multiply", ["Power", "_x", 2], "_a"], ["Multiply", "_x", "_b"]], 0 // (_ce, vars): boolean => vars.x.isReal === true, ], [ ["Add", ["Multiply", ["Power", "_x", 2], "_a"], ["Multiply", "_x", "_b"]], ["Divide", ["Negate", "_b"], "_a"] // (_ce, vars): boolean => vars.x.isReal === true, ], // ax^2 + b = 0 [ ["Add", ["Multiply", ["Power", "_x", 2], "_a"], "_b"], ["Sqrt", ["Divide", ["Negate", "_b"], "_a"]] // (_ce, vars): boolean => vars.x.isReal === true, ], [ ["Add", ["Multiply", ["Power", "_x", 2], "_a"], "_b"], ["Negate", ["Sqrt", ["Divide", ["Negate", "_b"], "_a"]]] // (_ce, vars): boolean => vars.x.isReal === true, ] // Quadratic formula (complex) // [ // '$ax^2 + bx + c$', // [ // '$-\\frac{b}{2a} - \\imaginaryI \\frac{\\sqrt{4ac - b^2}}{2a}$', // '$-\\frac{b}{2a} + \\imaginaryI \\frac{\\sqrt{4ac - b^2}}{2a}$', // ], // (_ce, vars): boolean => vars.x.isImaginary === true, // ], ]; function findUnivariateRoots(expr, x) { const ce = expr.engine; if (expr.head === "Equal") { expr = ce.add([expr.op1.canonical, ce.neg(expr.op2.canonical)]).simplify(); } const rules = ce.cache( "univariate-roots-rules", () => boxRules(ce, UNIVARIATE_ROOTS) ); let result = matchRules( expr.subs({ [x]: "_x" }, { canonical: false }), rules, { _x: ce.symbol("_x") } ); if (result.length === 0) { const expandedExpr = expand2(expr.canonical); if (expandedExpr === null) return []; result = matchRules( expandedExpr.subs({ [x]: "_x" }, { canonical: false }), rules, { _x: ce.symbol("_x") } ); } return result.map((x2) => x2.canonical.evaluate()); } function assume(proposition) { if (proposition.head === "Element") return assumeElement(proposition); if (proposition.head === "Equal") return assumeEquality(proposition); if (isInequality(proposition)) return assumeInequality(proposition); return "not-a-predicate"; } function assumeEquality(proposition) { /* @__PURE__ */ console.assert(proposition.head === "Equal"); const freeVars = proposition.freeVars; if (freeVars.length === 0) { const val = proposition.evaluate(); if (val.symbol === "True") return "tautology"; if (val.symbol === "False") return "contradiction"; /* @__PURE__ */ console.log(proposition.canonical.evaluate()); return "not-a-predicate"; } const ce = proposition.engine; const lhs = proposition.op1.symbol; if (lhs && !hasValue(ce, lhs) && !proposition.op2.has(lhs)) { const val = proposition.op2.evaluate(); if (!val.isValid) return "not-a-predicate"; const def = ce.lookupSymbol(lhs); if (!def) { ce.defineSymbol(lhs, { value: val }); return "ok"; } if (def.domain && !val.domain.isCompatible(def.domain)) return "contradiction"; def.value = val; return "ok"; } if (freeVars.length === 1) { const lhs2 = freeVars[0]; const sols = findUnivariateRoots(proposition, lhs2); if (sols.length === 0) { ce.assumptions.set( ce.fn("Equal", [ ce.add([proposition.op1.canonical, ce.neg(proposition.op2.canonical)]).simplify(), 0 ]), true ); } const val = sols.length === 1 ? sols[0] : ce.fn("List", sols); const def = ce.lookupSymbol(lhs2); if (!def) { ce.defineSymbol(lhs2, { value: val }); return "ok"; } if (def.domain && !sols.every((sol) => val.domain.isCompatible(sol.domain))) return "contradiction"; def.value = val; return "ok"; } ce.assumptions.set(proposition, true); return "ok"; } function assumeInequality(proposition) { const ce = proposition.engine; if (proposition.op1.symbol && !hasDef(ce, proposition.op1.symbol)) { if (proposition.op2.evaluate().isZero) { if (proposition.head === "Less") { ce.defineSymbol(proposition.op1.symbol, { domain: ce.domain("NegativeNumber") }); } else if (proposition.head === "LessEqual") { ce.defineSymbol(proposition.op1.symbol, { domain: ce.domain("NonPositiveNumber") }); } else if (proposition.head === "Greater") { ce.defineSymbol(proposition.op1.symbol, { domain: ce.domain("PositiveNumber") }); } else if (proposition.head === "GreaterEqual") { ce.defineSymbol(proposition.op1.symbol, { domain: ce.domain("NonNegativeNumber") }); } } else { ce.defineSymbol(proposition.op1.symbol, { domain: ce.domain("ExtendedRealNumber") }); ce.assumptions.set(proposition, true); } return "ok"; } let op3 = ""; let lhs; let rhs; if (proposition.head === "Less") { lhs = proposition.op1; rhs = proposition.op2; op3 = "<"; } else if (proposition.head === "LessEqual") { lhs = proposition.op1; rhs = proposition.op2; op3 = "<="; } else if (proposition.head === "Greater") { lhs = proposition.op2; rhs = proposition.op1; op3 = "<"; } else if (proposition.head === "GreaterEqual") { lhs = proposition.op2; rhs = proposition.op1; op3 = "<="; } if (!op3) return "internal-error"; const p = ce.add([lhs.canonical, ce.neg(rhs.canonical)]).simplify(); const result = ce.box([op3 === "<" ? "Less" : "LessEqual", p, 0]).evaluate(); if (result.symbol === "True") return "tautology"; if (result.symbol === "False") return "contradiction"; const freeVars = result.freeVars; if (freeVars.length === 0) return "not-a-predicate"; if (freeVars.length === 1) { if (!ce.lookupSymbol(freeVars[0])) ce.defineSymbol(freeVars[0], { domain: "ExtendedRealNumber" }); } /* @__PURE__ */ console.assert(result.head === "Less" || result.head === "LessEqual"); ce.assumptions.set(result, true); return "ok"; } function assumeElement(proposition) { var _a; /* @__PURE__ */ console.assert(proposition.head === "Element"); const ce = proposition.engine; const undefs = undefinedIdentifiers(proposition.op1); if (undefs.length === 1) { const dom = ce.domain(proposition.op2.evaluate().json); if (!dom.isValid) return "not-a-predicate"; if (dom.isCompatible("Function")) ce.defineFunction(undefs[0], { signature: { domain: "Function" } }); else ce.defineSymbol(undefs[0], { domain: dom }); return "ok"; } if (proposition.op1.symbol && hasDef(ce, proposition.op1.symbol)) { const dom = ce.domain(proposition.op2.evaluate().json); if (!dom.isValid) return "not-a-predicate"; const def = ce.lookupSymbol(proposition.op1.symbol); if (def) { if (def.domain && !dom.isCompatible(def.domain)) return "contradiction"; def.domain = dom; return "ok"; } const fdef = ce.lookupFunction(proposition.op1.symbol); if ((_a = fdef == null ? void 0 : fdef.signature) == null ? void 0 : _a.domain) { if (!dom.isCompatible(fdef.signature.domain)) return "contradiction"; if (dom.isCompatible(fdef.signature.domain, "bivariant")) return "tautology"; return "not-a-predicate"; } return "ok"; } if (undefs.length > 0) { ce.assumptions.set(proposition, true); return "ok"; } const val = proposition.evaluate(); if (val.symbol === "True") return "tautology"; if (val.symbol === "False") return "contradiction"; return "not-a-predicate"; } function hasDef(ce, s) { var _a; return ((_a = ce.lookupSymbol(s)) != null ? _a : ce.lookupFunction(s)) !== void 0; } function undefinedIdentifiers(expr) { return expr.symbols.filter((x) => !hasDef(expr.engine, x)); } function hasValue(ce, s) { var _a; if (ce.lookupFunction(s)) return false; return ((_a = ce.lookupSymbol(s)) == null ? void 0 : _a.value) !== void 0; } function isInequality(expr) { const h = expr.head; if (typeof h !== "string") return false; return ["Less", "Greater", "LessEqual", "GreaterEqual"].includes(h); } var import_complex13 = __toESM(require_complex()); var BoxedDictionary = class _BoxedDictionary extends AbstractBoxedExpression { constructor(ce, dict, options) { var _a; options != null ? options : options = {}; super(ce, options.metadata); this._value = /* @__PURE__ */ new Map(); const canonical2 = (_a = options.canonical) != null ? _a : true; for (const key of Object.keys(dict)) this._value.set(key, ce.box(dict[key], { canonical: canonical2 })); ce._register(this); } unbind() { for (const [_k, v] of this._value) v.unbind(); return void 0; } get hash() { let h = hashCode("Dictionary"); for (const [k, v] of this._value) h ^= hashCode(k) ^ v.hash; return h; } get complexity() { return 97; } get head() { return "Dictionary"; } get isPure() { return false; } getKey(key) { return this._value.get(key); } hasKey(key) { return this._value.has(key); } get keys() { return this._value.keys(); } get keysCount() { return this._value.size; } has(x) { for (const [_k, v] of this._value) if (v.has(x)) return true; return false; } get domain() { const result = ["Dictionary"]; for (const [k, v] of this._value) result.push(["Tuple", k, v.domain]); return this.engine.domain(result); } get json() { if (this.engine.jsonSerializationOptions.shorthands.includes("dictionary")) { const dict = {}; for (const key of this._value.keys()) dict[key] = this._value.get(key).json; return { dict }; } const kvs = []; for (const key of this._value.keys()) kvs.push( this.engine._fn("KeyValuePair", [ this.engine.string(key), this._value.get(key) ]) ); return serializeJsonFunction(this.engine, "Dictionary", kvs, { latex: this._latex }); } /** Structural equality */ isSame(rhs) { if (this === rhs) return true; if (!(rhs instanceof _BoxedDictionary)) return false; if (this._value.size !== rhs._value.size) return false; for (const [k, v] of this._value) { const rhsV = rhs.getKey(k); if (!rhsV || !v.isSame(rhsV)) return false; } return true; } match(rhs, _options) { if (!(rhs instanceof _BoxedDictionary)) return null; if (this._value.size !== rhs._value.size) return null; let result = {}; for (const [k, v] of this._value) { const rhsV = rhs.getKey(k); if (!rhsV) return null; const m = v.match(rhsV); if (m === null) return null; result = { ...result, ...m }; } return result; } /** Mathematical equality */ isEqual(rhs) { if (this === rhs) return true; if (!(rhs instanceof _BoxedDictionary)) return false; if (!rhs.keys || this._value.size !== rhs._value.size) return false; for (const [k, v] of this._value) { const rhsV = rhs.getKey(k); if (!rhsV || !v.isEqual(rhsV)) return false; } return true; } apply(fn, head2) { const result = {}; for (const key of this.keys) result[key] = this.engine.box(fn(this.getKey(key))); if (head2) return this.engine.fn(head2, [{ dict: result }]); return new _BoxedDictionary(this.engine, result); } evaluate(options) { return this.apply((x) => { var _a; return (_a = x.evaluate(options)) != null ? _a : x; }); } get isCanonical() { return this._isCanonical; } set isCanonical(val) { this._isCanonical = val; } get canonical() { if (this.isCanonical) return this; const result = this.apply((x) => x.canonical); result.isCanonical = true; return result; } simplify(options) { var _a; if (!((_a = options == null ? void 0 : options.recursive) != null ? _a : true)) return this; return this.apply((x) => { var _a2; return (_a2 = x.simplify(options)) != null ? _a2 : x; }); } N(options) { return this.apply((x) => x.N(options)); } replace(rules, options) { let changeCount = 0; const result = {}; for (const key of this.keys) { const val = this.getKey(key); const newVal = val.replace(rules, options); if (newVal !== null) changeCount += 1; result[key] = newVal != null ? newVal : val; } return changeCount === 0 ? null : new _BoxedDictionary(this.engine, result); } subs(sub2, options) { const result = {}; for (const key of this.keys) result[key] = this.getKey(key).subs(sub2, options); return new _BoxedDictionary(this.engine, result, options); } }; var import_complex10 = __toESM(require_complex()); var SIMPLIFY_RULES = []; function cheapest(oldExpr, newExpr) { if (newExpr === null || newExpr === void 0) return oldExpr; if (oldExpr === newExpr) return oldExpr; const ce = oldExpr.engine; const boxedNewExpr = ce.box(newExpr); if (ce.costFunction(boxedNewExpr) <= 1.2 * ce.costFunction(oldExpr)) { return boxedNewExpr; } return oldExpr; } var BoxedFunction = class _BoxedFunction extends AbstractBoxedExpression { constructor(ce, head2, ops2, options) { var _a, _b, _c, _d, _e; options != null ? options : options = {}; (_a = options.canonical) != null ? _a : options.canonical = false; super(ce, options.metadata); this._scope = ce.context; this._head = head2; this._ops = ops2; this._def = (_b = options.def) != null ? _b : null; if (options.canonical) { if (!this._def) this._def = ce.lookupFunction(head2, ce.context); this._canonical = this; } this._codomain = null; if (!options.canonical) { this._codomain = ce.domain("Anything"); } else { if (typeof this._head !== "string") this._codomain = this._head.domain.codomain; else if (this._def) { const sig = this._def.signature; if (typeof sig.codomain === "function") { this._codomain = (_c = sig.codomain(ce, this._ops)) != null ? _c : null; } else { this._codomain = (_d = sig.codomain) != null ? _d : null; } } if (!this._codomain) this._codomain = (_e = ce.defaultDomain) != null ? _e : ce.domain("Void"); } ce._register(this); } // // NON-CANONICAL OR CANONICAL OPERATIONS // // Those operations/properties can be applied to a canonical or // non-canonical expression // get hash() { if (this._hash !== void 0) return this._hash; let h = 0; for (const op3 of this._ops) h = h << 1 ^ op3.hash | 0; if (typeof this._head === "string") h = h ^ hashCode(this._head) | 0; else h = h ^ this._head.hash | 0; this._hash = h; return h; } get isCanonical() { return this._canonical === this; } set isCanonical(val) { this._canonical = val ? this : void 0; } get isPure() { var _a; if (this._isPure !== void 0) return this._isPure; if (!this.isCanonical) { this._isPure = false; return false; } let result = void 0; if (((_a = this.functionDefinition) == null ? void 0 : _a.pure) !== void 0) result = this.functionDefinition.pure; if (result !== false) result = this._ops.every((x) => x.isPure); this._isPure = result; return result; } get json() { if (this.isValid && this._canonical === this) return serializeJsonCanonicalFunction( this.engine, this._head, this._ops, { latex: this._latex, wikidata: this._wikidata } ); return serializeJsonFunction(this.engine, this._head, this._ops, { latex: this._latex, wikidata: this._wikidata }); } get rawJson() { const head2 = typeof this._head === "string" ? this._head : this._head.json; return [head2, ...this.ops.map((x) => x.rawJson)]; } get scope() { return this._scope; } get head() { return this._head; } get ops() { return this._ops; } get nops() { return this._ops.length; } get op1() { var _a; return (_a = this._ops[0]) != null ? _a : this.engine.symbol("Nothing"); } get op2() { var _a; return (_a = this._ops[1]) != null ? _a : this.engine.symbol("Nothing"); } get op3() { var _a; return (_a = this._ops[2]) != null ? _a : this.engine.symbol("Nothing"); } get isValid() { if (this._head === "Error") return false; if (typeof this._head !== "string" && !this._head.isValid) return false; return this._ops.every((x) => x.isValid); } get canonical() { if (this._canonical) return this._canonical; this._canonical = this.isValid ? makeCanonicalFunction(this.engine, this._head, this._ops) : this; return this._canonical; } *map(fn) { let i = 0; while (i < this._ops.length) yield fn(this._ops[i++]); } subs(sub2, options) { options = options ? { ...options } : {}; if (!("canonical" in options)) options.canonical = true; const ops2 = this._ops.map((x) => x.subs(sub2, options)); if (options.canonical && ops2.every((x) => x.isValid)) return makeCanonicalFunction(this.engine, this._head, ops2); return new _BoxedFunction(this.engine, this._head, ops2, { canonical: false }); } replace(rules, options) { return replace(this, rules, options); } has(x) { if (typeof this._head === "string") { if (typeof x === "string") { if (this._head === x) return true; } else if (x.includes(this._head)) return true; } for (const arg of this._ops) if (arg.has(x)) return true; return false; } /** `isSame` is structural/symbolic equality */ isSame(rhs) { if (this === rhs) return true; if (!(rhs instanceof _BoxedFunction)) return false; if (this.nops !== rhs.nops) return false; if (typeof this.head === "string") { if (this.head !== rhs.head) return false; } else { if (typeof rhs.head === "string") return false; else if (!rhs.head || !this.head.isSame(rhs.head)) return false; } const lhsTail = this._ops; const rhsTail = rhs._ops; for (let i = 0; i < lhsTail.length; i++) if (!lhsTail[i].isSame(rhsTail[i])) return false; return true; } match(rhs, options) { if (!(rhs instanceof _BoxedFunction)) return null; let result = {}; if (typeof this.head === "string") { if (this.head !== rhs.head) return null; } else { if (typeof rhs.head === "string") return null; else { if (!rhs.head) return null; const m = this.head.match(rhs.head, options); if (m === null) return null; result = { ...result, ...m }; } } const lhsTail = this._ops; const rhsTail = rhs._ops; for (let i = 0; i < lhsTail.length; i++) { const m = lhsTail[i].match(rhsTail[i], options); if (m === null) return null; result = { ...result, ...m }; } return result; } // // CANONICAL OPERATIONS // // These operations apply only to canonical expressions // unbind() { this._value = void 0; this._numericValue = void 0; } get wikidata() { var _a, _b, _c; if (!this.isCanonical) return void 0; return (_c = (_b = this._wikidata) != null ? _b : (_a = this.functionDefinition) == null ? void 0 : _a.wikidata) != null ? _c : void 0; } get description() { if (!this.isCanonical) return void 0; const def = this.functionDefinition; if (!def) return []; if (!def.description) return void 0; if (typeof def.description === "string") return [def.description]; return def.description; } get url() { var _a, _b; if (!this.isCanonical) return ""; return (_b = (_a = this.functionDefinition) == null ? void 0 : _a.url) != null ? _b : void 0; } get complexity() { var _a, _b; if (!this.isCanonical) return void 0; return (_b = (_a = this.functionDefinition) == null ? void 0 : _a.complexity) != null ? _b : DEFAULT_COMPLEXITY; } get functionDefinition() { if (!this.isCanonical) return void 0; if (this._def !== null) return this._def; return void 0; } bind(_scope) { } get value() { if (!this.isCanonical || !this.isPure) return void 0; if (!this._value) this._value = this.evaluate(); return this._value; } /** `isEqual` is mathematical equality */ isEqual(rhs) { const s = signDiff(this, rhs); if (s === 0) return true; if (s !== void 0) return false; const diff = this.engine.box(["Subtract", this, rhs]).simplify(); if (diff.isZero) return true; return this.isSame(rhs); } isLess(rhs) { const s = signDiff(this, rhs); if (s === void 0) return void 0; return s < 0; } isLessEqual(rhs) { const s = signDiff(this, rhs); if (s === void 0) return void 0; return s <= 0; } isGreater(rhs) { const s = signDiff(this, rhs); if (s === void 0) return void 0; return s > 0; } isGreaterEqual(rhs) { const s = signDiff(this, rhs); if (s === void 0) return void 0; return s >= 0; } get isZero() { const s = this.sgn; if (s === null) return false; if (typeof s === "number") return s === 0; return void 0; } get isNotZero() { const s = this.sgn; if (s === null) return false; if (typeof s === "number") return s !== 0; return void 0; } get isOne() { return this.isEqual(this.engine._ONE); } get isNegativeOne() { return this.isEqual(this.engine._NEGATIVE_ONE); } // x > 0 get isPositive() { const s = this.sgn; if (s === null) return false; if (typeof s === "number") return s > 0; return void 0; } // x <= 0 get isNonPositive() { const s = this.sgn; if (s === null) return false; if (typeof s === "number") return s <= 0; return void 0; } // x < 0 get isNegative() { const s = this.sgn; if (s === null) return false; if (typeof s === "number") return s < 0; return void 0; } // x >= 0 get isNonNegative() { const s = this.sgn; if (s === null) return false; if (typeof s === "number") return s >= 0; return void 0; } get isNumber() { return this.domain.isCompatible("Number"); } get isInteger() { return this.domain.isCompatible("Integer"); } get isRational() { return this.domain.isCompatible("RationalNumber"); } get isAlgebraic() { return this.domain.isCompatible("AlgebraicNumber"); } get isReal() { return this.domain.isCompatible("RealNumber"); } get isExtendedReal() { return this.domain.isCompatible("ExtendedRealNumber"); } get isComplex() { return this.domain.isCompatible("ComplexNumber"); } get isImaginary() { return this.domain.isCompatible("ImaginaryNumber"); } get sgn() { var _a, _b, _c, _d, _e, _f, _g, _h; if (!this.isCanonical) return void 0; const head2 = this.head; if (head2 === "Negate") { const s = (_a = this._ops[0]) == null ? void 0 : _a.sgn; if (s === void 0) return void 0; if (s === null) return null; return s === 0 ? 0 : s > 0 ? -1 : 1; } if (head2 === "Multiply") { const total = this._ops.reduce((acc, x) => { var _a2; return acc * ((_a2 = x.sgn) != null ? _a2 : NaN); }, 1); if (isNaN(total)) return null; if (total > 0) return 1; if (total < 0) return -1; return 0; } if (head2 === "Add") { let posCount = 0; let negCount = 0; let zeroCount = 0; const count = this._ops.length; for (const op3 of this._ops) { const s = op3.sgn; if (s === null || s === void 0) break; if (s === 0) zeroCount += 1; if (s > 0) posCount += 1; if (s < 0) negCount += 1; } if (zeroCount === count) return 0; if (posCount === count) return 1; if (negCount === count) return -1; return null; } if (head2 === "Divide") { const n = (_b = this._ops[0]) == null ? void 0 : _b.sgn; const d = (_c = this._ops[1]) == null ? void 0 : _c.sgn; if (n === null || d === null || n === void 0 || d === void 0) return null; if (n === 0) return 0; if (n > 0 && d > 0 || n < 0 && d < 0) return 1; return -1; } if (head2 === "Square") { if ((_d = this._ops[0]) == null ? void 0 : _d.isImaginary) return -1; if ((_e = this._ops[0]) == null ? void 0 : _e.isZero) return 0; return 1; } if (head2 === "Abs") { if ((_f = this._ops[0]) == null ? void 0 : _f.isZero) return 0; return 1; } if (head2 === "Sqrt") { if ((_g = this._ops[0]) == null ? void 0 : _g.isZero) return 0; if ((_h = this._ops[0]) == null ? void 0 : _h.isImaginary) return null; return 1; } if (head2 === "Power") { } if (head2 === "Root") { } if (head2 === "Ln") { } if (head2 === "Floor") { } if (head2 === "Ceil") { } if (head2 === "Round") { } const v = asFloat(this.N()); if (v === null) return void 0; if (v === 0) return 0; if (v < 0) return -1; return 1; } // // AUTO-CANONICAL OPERATIONS // // The operations are automatically done on the canonical form of the // expression // get domain() { return this._codomain; } // simplify(options?: SimplifyOptions): BoxedExpression { // const result = this.simplifyAll(options); // if (result.length === 1) return result[0]; // const ce = this.engine; // result.sort((a, b) => { // if (a === b) return 0; // return ce.costFunction(a) - ce.costFunction(b); // }); // return result[0]; // } simplify(options) { var _a, _b, _c, _d, _e; if (!this.isValid) return this; if (!this.isCanonical) { const canonical2 = this.canonical; if (!canonical2.isCanonical || !canonical2.isValid) return this; return canonical2.simplify(options); } const recursive = (_a = options == null ? void 0 : options.recursive) != null ? _a : true; let expr; if (recursive) { expr = expand2(this); if (expr !== null) { expr = expr.simplify({ ...options, recursive: false }); return cheapest(this, expr); } } const def = this.functionDefinition; const tail = recursive ? holdMap( this._ops, (_b = def == null ? void 0 : def.hold) != null ? _b : "none", (def == null ? void 0 : def.associative) ? def.name : "", (x) => x.simplify(options) ) : this._ops; if (typeof this._head !== "string") { const expr2 = apply(this._head, tail); if (typeof expr2.head !== "string") return expr2; return expr2.simplify(options); } if (def) { if (def.inert) expr = (_d = (_c = tail[0]) == null ? void 0 : _c.canonical) != null ? _d : this; else { const sig = def.signature; if (sig == null ? void 0 : sig.simplify) expr = sig.simplify(this.engine, tail); } } if (!expr) expr = this.engine.fn(this._head, tail); else expr = cheapest(this.engine.fn(this._head, tail), expr); expr = cheapest(this, expr); const rules = (_e = options == null ? void 0 : options.rules) != null ? _e : this.engine.cache( "standard-simplification-rules", () => boxRules(this.engine, SIMPLIFY_RULES), (rules2) => { for (const [lhs, rhs, _priority, _condition] of rules2) { lhs.unbind(); rhs.unbind(); } return rules2; } ); let iterationCount = 0; let done = false; do { const newExpr = expr.replace(rules); if (newExpr !== null) { expr = cheapest(expr, newExpr); if (expr === newExpr) done = true; } else done = true; iterationCount += 1; } while (!done && iterationCount < this.engine.iterationLimit); return cheapest(this, expr); } evaluate(options) { var _a, _b, _c; if (!this.isValid) return this; if (!this.isCanonical) { const canonical2 = this.canonical; if (!canonical2.isCanonical || !canonical2.isValid) return this; return canonical2.evaluate(options); } const def = this.functionDefinition; const tail = holdMap( this._ops, (_a = def == null ? void 0 : def.hold) != null ? _a : "none", (def == null ? void 0 : def.associative) ? def.name : "", (x) => x.evaluate(options) ); if (typeof this._head !== "string") { const expr = apply(this._head, tail); if (typeof expr.head !== "string") return expr; return expr.evaluate(options); } if (!def) return this.engine.fn(this._head, tail); if (def.inert) return (_b = tail[0]) != null ? _b : this; const sig = def.signature; if (!sig || !sig.evaluate) return this.engine.fn(this._head, tail); if (typeof sig.evaluate !== "function") return apply(sig.evaluate, tail); return (_c = sig.evaluate(this.engine, tail)) != null ? _c : this.engine.fn(this._head, tail); } N(options) { var _a, _b, _c, _d; if (this._numericValue) return this._numericValue; if (this.engine.strict && !this.isValid) return this; if (!this.isCanonical) { const canonical2 = this.canonical; if (!canonical2.isCanonical || !canonical2.isValid) return this; return canonical2.N(options); } const def = this.functionDefinition; const tail = holdMap( this._ops, (_a = def == null ? void 0 : def.hold) != null ? _a : "none", (def == null ? void 0 : def.associative) ? def.name : "", (x) => x.N(options) ); if (typeof this._head !== "string") { const expr = apply(this._head, tail); if (typeof expr.head !== "string") return expr; return expr.N(options); } if (!def) return this.engine.fn(this._head, tail); if (def.inert) return (_b = tail[0]) != null ? _b : this; const sig = def.signature; let result = (_d = (_c = sig == null ? void 0 : sig.N) == null ? void 0 : _c.call(sig, this.engine, tail)) != null ? _d : this.engine.fn(this._head, tail).evaluate(); const num = result.numericValue; if (num !== null) { if (!complexAllowed(this.engine) && num instanceof import_complex10.default) result = this.engine._NAN; else if (!bignumPreferred(this.engine) && num instanceof decimal_default) result = this.engine.number(num.toNumber()); } if (this.isPure) this._numericValue = result; return result; } solve(vars) { if (vars.length !== 1) return null; const roots = findUnivariateRoots(this.simplify(), vars[0]); return roots; } }; function makeNumericFunction(ce, head2, semiOps, metadata) { var _a; let ops2 = []; if (head2 === "Add" || head2 === "Multiply") ops2 = validateNumericArgs( ce, flattenOps(flattenSequence(ce.canonical(semiOps)), head2) ); else if (head2 === "Negate" || head2 === "Square" || head2 === "Sqrt") ops2 = validateNumericArgs(ce, flattenSequence(ce.canonical(semiOps)), 1); else if (head2 === "Divide" || head2 === "Power") ops2 = validateNumericArgs(ce, flattenSequence(ce.canonical(semiOps)), 2); else return null; if (!ops2.every((x) => x.isValid)) return new BoxedFunction(ce, head2, ops2, { metadata, canonical: false }); if (head2 === "Add") return ce.add(ops2, metadata); if (head2 === "Negate") return ce.neg((_a = ops2[0]) != null ? _a : ce.error("missing"), metadata); if (head2 === "Multiply") return ce.mul(ops2, metadata); if (head2 === "Divide") return ce.div(ops2[0], ops2[1], metadata); if (head2 === "Power") return ce.pow(ops2[0], ops2[1], metadata); if (head2 === "Square") return ce.pow(ops2[0], ce.number(2), metadata); if (head2 === "Sqrt") { const op3 = ops2[0].canonical; if (isRational(op3.numericValue)) return new BoxedFunction(ce, "Sqrt", [op3], { metadata, canonical: true }); return ce.pow(op3, ce._HALF, metadata); } return null; } function makeCanonicalFunction(ce, head2, ops2, metadata) { var _a, _b; if (typeof head2 !== "string") head2 = (_a = head2.evaluate().symbol) != null ? _a : head2; if (typeof head2 === "string") { const result = makeNumericFunction(ce, head2, ops2, metadata); if (result) return result; } else { if (!head2.isValid) return new BoxedFunction( ce, head2, ops2.map((x) => ce.box(x, { canonical: false })), { metadata, canonical: false } ); } const def = ce.lookupFunction(head2, ce.context); if (typeof head2 !== "string" || !def) { return new BoxedFunction( ce, head2, flattenSequence(ops2.map((x) => ce.box(x))), { metadata, canonical: true } ); } let xs = []; for (let i = 0; i < ops2.length; i++) { if (applicable(def.hold, ops2.length - 1, i)) { xs.push(ce.box(ops2[i])); } else { const y = ce.box(ops2[i], { canonical: false }); if (y.head === "ReleaseHold") xs.push(y.op1.canonical); else xs.push(y); } } if (!xs.every((x) => x.isValid)) return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); const sig = def.signature; if (sig.canonical) { try { const result = sig.canonical(ce, xs); if (result) return result; } catch (e) { console.error(e); } return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); } xs = flattenSequence(xs); if (def.associative) xs = flattenOps(xs, head2); if (!xs.every((x) => x.isValid)) return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); xs = (_b = validateSignature(sig.domain, xs)) != null ? _b : xs; if (!xs.every((x) => x.isValid)) return new BoxedFunction(ce, head2, xs, { metadata, canonical: false }); if (xs.length === 1 && xs[0].head === head2) { if (def.involution) return xs[0].op1; if (def.idempotent) xs = xs[0].ops; } if (xs.length > 1 && def.commutative === true) xs = xs.sort(order); return new BoxedFunction(ce, head2, xs, { metadata, def, canonical: true }); } function apply(fn, args) { var _a; const ce = fn.engine; if (fn.head !== "Lambda") return ce._fn(fn.evaluate(), args); const subs2 = { "__": ce.tuple(args), "_#": ce.number(args.length) }; let n = 1; for (const op3 of args) subs2[`_${n++}`] = op3; subs2["_"] = subs2["_1"]; const savedContext = ce.context; ce.context = (_a = fn.scope) != null ? _a : null; const result = fn.subs(subs2); ce.context = savedContext; return result.op1.evaluate(); } function holdMap(xs, skip, associativeHead, f) { if (xs.length === 0) return []; xs = flattenOps(xs, associativeHead); if (skip === "all") return xs; if (skip === "none") { const result2 = []; for (const x of xs) { const h = x.head; if (h === "Hold") result2.push(x); else { const op3 = h === "ReleaseHold" ? x.op1 : x; if (op3) { const y = f(op3); if (y !== null) result2.push(y); } } } return flattenOps(result2, associativeHead); } const result = []; for (let i = 0; i < xs.length; i++) { if (xs[i].head === "Hold") { result.push(xs[i]); } else { let y = void 0; if (xs[i].head === "ReleaseHold") y = xs[i].op1; else if (applicable(skip, xs.length - 1, i)) y = xs[i]; else result.push(xs[i]); if (y) { const x = f(y); if (x !== null) result.push(x); } } } return flattenOps(result, associativeHead); } function applicable(skip, count, index) { if (skip === "all") return false; if (skip === "none") return true; if (skip === "first") return index !== 0; if (skip === "rest") return index === 0; if (skip === "last") return index !== count; if (skip === "most") return index === count; return false; } var import_complex12 = __toESM(require_complex()); var import_complex11 = __toESM(require_complex()); function inferNumericDomain(value) { if (typeof value === "number" && !isNaN(value)) { if (!isFinite(value)) return "ExtendedRealNumber"; if (Number.isInteger(value)) { if (value > 0) return "PositiveInteger"; if (value < 0) return "NegativeInteger"; return "Integer"; } if (value > 0) return "PositiveNumber"; if (value < 0) return "NegativeNumber"; return "RealNumber"; } if (value instanceof Decimal) { if (value.isNaN()) return "Number"; if (!value.isFinite()) return "ExtendedRealNumber"; if (value.isInteger()) { if (value.isPositive()) return "PositiveInteger"; if (value.isNegative()) return "NegativeInteger"; return "Integer"; } if (value.isPositive()) return "PositiveNumber"; if (value.isNegative()) return "NegativeNumber"; return "RealNumber"; } if (value instanceof import_complex11.Complex) { const c = value; /* @__PURE__ */ console.assert(c.im !== 0); if (c.re === 0) return "ImaginaryNumber"; return "ComplexNumber"; } if (isRational(value)) { const [numer, denom] = value; /* @__PURE__ */ console.assert( typeof numer !== "number" || !Number.isNaN(numer) && !Number.isNaN(denom) ); return "RationalNumber"; } return "Number"; } var LARGE_PRIME = 1125899906842597; function isPrime(n) { if (!Number.isInteger(n) || !Number.isFinite(n) || Number.isNaN(n) || n <= 1) { return false; } if (n <= LARGEST_SMALL_PRIME) return SMALL_PRIMES.has(n); for (const smallPrime of SMALL_PRIMES) { if (n % smallPrime === 0) return false; } if (n >= LARGE_PRIME) { return probablyPrime(n, 30) ? void 0 : false; } return n === leastFactor(n); } function leastFactor(n) { if (n === 1) return 1; if (n % 2 === 0) return 2; if (n % 3 === 0) return 3; if (n % 5 === 0) return 5; const m = Math.floor(Math.sqrt(n)); let i = 7; while (i <= m) { if (n % i === 0) return i; if (n % (i + 4) === 0) return i + 4; if (n % (i + 6) === 0) return i + 6; if (n % (i + 10) === 0) return i + 10; if (n % (i + 12) === 0) return i + 12; if (n % (i + 16) === 0) return i + 16; if (n % (i + 22) === 0) return i + 22; if (n % (i + 24) === 0) return i + 24; i += 30; } return n; } function probablyPrime(n, k) { let s = 0, d = n - 1; while (d % 2 === 0) { d /= 2; ++s; } WitnessLoop: do { let x = Math.pow(2 + Math.floor(Math.random() * (n - 3)), d) % n; if (x === 1 || x === n - 1) continue; for (let i = s - 1; i--; ) { x = x * x % n; if (x === 1) return false; if (x === n - 1) continue WitnessLoop; } return false; } while (--k); return true; } var BoxedNumber = class _BoxedNumber extends AbstractBoxedExpression { /** * By the time the constructor is called, the `value` should have been * screened for cases where it's a well-known value (0, NaN, +Infinity, * etc...) or non-normal (complex number with im = 0, rational with * denom = 1, etc...). * * This is done in `ce.number()`. In general, use `ce.number()` rather * than calling this constructor directly. * * We may store as a machine number if a Decimal is passed that is in machine * range */ constructor(ce, value, options) { var _a; super(ce, options == null ? void 0 : options.metadata); if (typeof value === "number") { this._value = value; this._isCanonical = true; return; } if (isRational(value)) { const [n, d] = value; /* @__PURE__ */ console.assert( typeof n !== "number" || Number.isInteger(n) && Number.isInteger(d) && d !== n && d !== 1 ); /* @__PURE__ */ console.assert( !(typeof n === "bigint" && typeof d == "bigint") || d !== n && d !== BigInt(1) ); if ((_a = options == null ? void 0 : options.canonical) != null ? _a : true) { this._value = canonicalNumber(ce, value); this._isCanonical = true; } else { this._value = value; this._isCanonical = false; } } else { /* @__PURE__ */ console.assert( !(value instanceof import_complex12.Complex) || !Number.isNaN(value.re) && !Number.isNaN(value.im) && ce.chop(value.im) !== 0 ); this._value = canonicalNumber(ce, value); this._isCanonical = true; } } get hash() { if (this._hash !== void 0) return this._hash; let h = 0; if (typeof this._value === "number") h = hashCode(this._value.toString()); else if (this._value instanceof import_complex12.Complex) h = hashCode( this._value.re.toString() + " +i " + this._value.im.toString() ); else if (this._value instanceof Decimal) h = hashCode(this._value.toString()); else h = hashCode( this._value[0].toString() + " / " + this._value[1].toString() ); this._hash = h; return h; } get head() { return "Number"; } get isPure() { return true; } get isExact() { if (typeof this._value === "number") return Number.isInteger(this._value); if (this._value instanceof Decimal) return this._value.isInteger(); if (this._value instanceof import_complex12.Complex) return Number.isInteger(this._value.re) && Number.isInteger(this._value.im); return isRational(this._value); } get isCanonical() { return this._isCanonical; } set isCanonical(val) { this._isCanonical = val; } get complexity() { return 1; } get value() { return this; } get numericValue() { return this._value; } get domain() { if (this._domain === void 0) this._domain = this.engine.domain(inferNumericDomain(this._value)); return this._domain; } get json() { return serializeJsonNumber(this.engine, this._value, { latex: this._latex }); } get sgn() { if (this._value === 0) return 0; if (typeof this._value === "number") { if (this._value < 0) return -1; if (this._value > 0) return 1; return null; } if (this._value instanceof Decimal) { if (this._value.isZero()) return 0; if (this._value.isNegative()) return -1; if (this._value.isPositive()) return 1; return null; } if (Array.isArray(this._value)) { const [numer, denom] = this._value; if (numer === 0 && denom !== 0) return 0; if (numer < 0) return -1; if (numer > 0) return 1; return null; } return null; } isSame(rhs) { if (this === rhs) return true; if (!(rhs instanceof _BoxedNumber)) return false; if (typeof this._value === "number") { if (typeof rhs._value !== "number") return false; return this._value === rhs._value; } if (this._value instanceof Decimal) { if (!(rhs._value instanceof Decimal)) return false; return this._value.eq(rhs._value); } if (Array.isArray(this._value)) { if (!Array.isArray(rhs._value)) return false; const [rhsN, rhsD] = rhs._value; return this._value[0] === rhsN && this._value[1] === rhsD; } if (this._value instanceof import_complex12.Complex) { if (!(rhs._value instanceof import_complex12.Complex)) return false; return this._value.equals(rhs._value); } return false; } isEqual(rhs) { return this.isSame(rhs); } match(rhs, options) { var _a; if (this.isEqualWithTolerance(rhs, (_a = options == null ? void 0 : options.numericTolerance) != null ? _a : 0)) return {}; return null; } /** Compare this with another BoxedNumber. * `rhs` must be a BoxedNumber. Use `isEqualWithTolerance(rhs.N())` * if necessary. */ isEqualWithTolerance(rhs, tolerance) { return rhs instanceof _BoxedNumber && signDiff(this, rhs, tolerance) === 0; } isLess(rhs) { const s = signDiff(this, rhs); if (s === void 0) return void 0; return s < 0; } isLessEqual(rhs) { const s = signDiff(this, rhs); if (s === void 0) return void 0; return s <= 0; } isGreater(rhs) { return rhs.isLessEqual(this); } isGreaterEqual(rhs) { return rhs.isLess(this); } /** x > 0, same as `isGreater(0)` */ get isPositive() { if (typeof this._value === "number") return this._value > 0; const s = this.sgn; if (s === void 0 || s === null) return void 0; return s > 0; } /** x >= 0, same as `isGreaterEqual(0)` */ get isNonNegative() { if (typeof this._value === "number") return this._value >= 0; const s = this.sgn; if (s === void 0 || s === null) return void 0; return s >= 0; } /** x < 0, same as `isLess(0)` */ get isNegative() { if (typeof this._value === "number") return this._value < 0; const s = this.sgn; if (s === void 0 || s === null) return void 0; return s < 0; } /** x <= 0, same as `isLessEqual(0)` */ get isNonPositive() { if (typeof this._value === "number") return this._value <= 0; const s = this.sgn; if (s === void 0 || s === null) return void 0; return s <= 0; } get isZero() { if (this._value === 0) return true; if (this._value instanceof Decimal) return this._value.isZero(); if (this._value instanceof import_complex12.Complex) return this._value.isZero(); return false; } get isNotZero() { if (this._value === 0) return false; if (this._value instanceof Decimal) return !this._value.isZero(); if (this._value instanceof import_complex12.Complex) return !this._value.isZero(); return true; } get isOne() { if (this._value === 1) return true; if (typeof this._value === "number") return false; if (this._value instanceof Decimal) return this._value.equals(this.engine._BIGNUM_ONE); if (this._value instanceof import_complex12.Complex) return this._value.im === 0 && this._value.re === 1; return isRationalOne(this._value); } get isNegativeOne() { if (this._value === -1) return true; if (typeof this._value === "number") return false; if (this._value instanceof Decimal) return this._value.equals(this.engine._BIGNUM_NEGATIVE_ONE); if (Array.isArray(this._value)) return isRationalNegativeOne(this._value); return this._value.equals(-1); } get isOdd() { if (this.isOne || this.isNegativeOne) return true; if (this.isZero) return false; if (!this.isInteger) return false; if (typeof this._value === "number") return this._value % 2 !== 0; if (this._value instanceof Decimal) return !this._value.mod(2).isZero(); return void 0; } get isEven() { if (this.isOne || this.isNegativeOne) return false; if (this.isZero) return true; if (!this.isInteger) return false; if (typeof this._value === "number") return this._value % 2 === 0; if (this._value instanceof Decimal) return this._value.mod(2).isZero(); return void 0; } get isPrime() { if (!this.isInteger || !this.isFinite || this.isNonPositive || this.isOne || this.isZero) return false; if (typeof this._value === "number") return isPrime(this._value); if (this._value instanceof Decimal) return isPrime(this._value.toNumber()); return void 0; } get isComposite() { if (!this.isInteger || !this.isFinite || this.isNonPositive || this.isOne || this.isZero) return false; if (typeof this._value === "number") return !isPrime(this._value); if (this._value instanceof Decimal) return !isPrime(this._value.toNumber()); return void 0; } get isInfinity() { if (typeof this._value === "number") return !Number.isFinite(this._value) && !Number.isNaN(this._value); if (this._value instanceof Decimal) return !this._value.isFinite() && !this._value.isNaN(); if (this._value instanceof import_complex12.Complex) return !this._value.isFinite() && !this._value.isNaN(); return false; } get isNaN() { if (typeof this._value === "number") return Number.isNaN(this._value); if (this._value instanceof Decimal) return this._value.isNaN(); if (this._value instanceof import_complex12.Complex) return this._value.isNaN(); return false; } get isFinite() { return !this.isInfinity && !this.isNaN; } get isNumber() { return true; } get isInteger() { if (typeof this._value === "number") return Number.isInteger(this._value); if (this._value instanceof Decimal) return this._value.isInteger(); return false; } get isRational() { if (Array.isArray(this._value)) return true; return this.isInteger; } get isAlgebraic() { if (this.isRational) return true; return void 0; } get isReal() { if (!this.isFinite) return false; if (this._value instanceof import_complex12.Complex) return this.engine.chop(this._value.im) === 0; return true; } // Real or +-Infinity get isExtendedReal() { return this.isInfinity || this.isReal; } get isComplex() { return !this.isNaN; } get isImaginary() { if (this._value instanceof import_complex12.Complex) { /* @__PURE__ */ console.assert(this._value.im !== 0); return true; } return false; } get isExtendedComplex() { return this.isInfinity || !this.isNaN; } get canonical() { if (this._isCanonical) return this; return this.engine.number(canonicalNumber(this.engine, this._value)); } simplify(_options) { return this.canonical; } N(_options) { if (!Array.isArray(this._value)) return this; const ce = this.engine; const [numer, denom] = this._value; if (typeof numer === "number" && typeof denom === "number" && !bignumPreferred(ce)) return ce.number(numer / denom); return ce.number(ce.bignum(numer).div(ce.bignum(denom))); } }; function canonicalNumber(ce, value) { if (value instanceof Decimal && isInMachineRange(value)) return value.toNumber(); if (!isRational(value)) return value; value = reducedRational(value); if (isBigRational(value)) { let [n2, d2] = value; if (n2 > Number.MIN_SAFE_INTEGER && n2 < Number.MAX_SAFE_INTEGER && d2 > Number.MIN_SAFE_INTEGER && d2 < Number.MAX_SAFE_INTEGER) value = [Number(n2), Number(d2)]; else { if (d2 < 0) [n2, d2] = [-n2, -d2]; if (d2 === BigInt(1)) return ce.bignum(n2); if (d2 === BigInt(0)) { if (n2 === d2) return NaN; return n2 < 0 ? -Infinity : Infinity; } return [n2, d2]; } } let [n, d] = value; if (Number.isNaN(n) || Number.isNaN(d)) return NaN; if (d < 0) [n, d] = [-n, -d]; if (d === 1) return n; if (d === 0) { if (n === 0 || !Number.isFinite(n)) return NaN; if (n < 0) return -Infinity; return Infinity; } if (n === 0) return n; return [n, d]; } var BoxedString = class _BoxedString extends AbstractBoxedExpression { constructor(ce, expr, metadata) { super(ce, metadata); this._string = expr.normalize(); ce._register(this); } get hash() { return hashCode("String" + this._string); } get json() { return serializeJsonString(this.engine, this._string); } get head() { return "String"; } get isPure() { return true; } get isCanonical() { return true; } set isCanonical(_va) { return; } get domain() { return this.engine.domain("String"); } get complexity() { return 19; } get string() { return this._string; } isEqual(rhs) { return rhs.string === this._string; } isSame(rhs) { return rhs.string === this._string; } match(rhs, _options) { if (!(rhs instanceof _BoxedString)) return null; if (this._string === rhs._string) return {}; return null; } }; function boxNumber(ce, num, options) { var _a; if (typeof num === "number" || num instanceof Decimal) return new BoxedNumber(ce, num, options); options = options ? { ...options } : {}; if (!("canonical" in options)) options.canonical = true; if (Array.isArray(num) && num.length === 2 && num[0] instanceof Decimal && num[1] instanceof Decimal) { if (!num[0].isInteger() || !num[1].isInteger()) throw new Error("Array argument to `boxNumber()` should be two integers"); num = [bigint(num[0].toString()), bigint(num[1].toString())]; } if (isRational(num)) { if (num.length !== 2) throw new Error( "Array argument to `boxNumber()` should be two integers or two bignums" ); const [n, d] = num; if (typeof n === "bigint" && typeof d === "bigint") { if (n === d) return d === BigInt(0) ? ce._NAN : ce._ONE; if (n === BigInt(0)) return ce._ZERO; if (d === BigInt(1)) return ce.number(n, options); if (d === BigInt(-1)) return ce.number(-n, options); if (n === BigInt(1) && d === BigInt(2)) return ce._HALF; return new BoxedNumber(ce, [n, d], options); } if (typeof n !== "number" || typeof d !== "number") throw new Error( "Array argument to `boxNumber()` should be two integers or two bignums" ); if (!Number.isInteger(n) || !Number.isInteger(d)) throw new Error("Array argument to `boxNumber()` should be two integers"); if (d === n) return d === 0 ? ce._NAN : ce._ONE; if (n === 0) return ce._ZERO; if (d === 1) return ce.number(n, options); if (d === -1) return ce.number(-n, options); if (n === 1 && d === 2) return ce._HALF; return new BoxedNumber(ce, [n, d], options); } if (num instanceof import_complex13.Complex) { if (num.isNaN()) return ce._NAN; if (num.isZero()) return ce._ZERO; if (num.isInfinite()) return ce._COMPLEX_INFINITY; if (ce.chop(num.im) === 0) return ce.number(num.re, options); return new BoxedNumber(ce, num, options); } let strNum = ""; if (typeof num === "string") strNum = num; else if (typeof num === "object" && "num" in num) { if (typeof num.num === "number") return ce.number(num.num, options); if (typeof num.num !== "string") throw new Error("MathJSON `num` property should be a string of digits"); strNum = num.num; } if (strNum) { strNum = strNum.toLowerCase(); if (/[0-9][nd]$/.test(strNum)) strNum = strNum.slice(0, -1); strNum = strNum.replace(/[\u0009-\u000d\u0020\u00a0]/g, ""); if (strNum === "nan") return ce._NAN; if (strNum === "infinity" || strNum === "+infinity") return ce._POSITIVE_INFINITY; if (strNum === "-infinity") return ce._NEGATIVE_INFINITY; if (strNum === "0") return ce._ZERO; if (strNum === "1") return ce._ONE; if (strNum === "-1") return ce._NEGATIVE_ONE; if (/\([0-9]+\)/.test(strNum)) { const [_, body, repeat, trail] = (_a = strNum.match(/(.+)\(([0-9]+)\)(.+)?$/)) != null ? _a : []; strNum = body + repeat.repeat(Math.ceil(ce.precision / repeat.length)) + (trail != null ? trail : ""); } return boxNumber(ce, ce.bignum(strNum), options); } return null; } function boxHold(ce, expr, options) { if (expr === null) return ce.error("missing"); if (typeof expr === "object" && expr instanceof AbstractBoxedExpression) return expr; expr = missingIfEmpty(expr); if (typeof expr === "string") return box(ce, expr, options); if (Array.isArray(expr)) { const boxed = expr.map((x) => boxHold(ce, x, options)); return new BoxedFunction(ce, boxed[0], boxed.slice(1)); } if (typeof expr === "object") { if ("dict" in expr) return new BoxedDictionary(ce, expr.dict); if ("fn" in expr) return boxHold(ce, expr.fn, options); if ("str" in expr) return new BoxedString(ce, expr.str); if ("sym" in expr) return box(ce, expr.sym, options); if ("num" in expr) return box(ce, expr.num, options); } return box(ce, expr, options); } function boxFunction(ce, head2, ops2, options) { var _a; if (head2 === "Hold") { return new BoxedFunction(ce, "Hold", [boxHold(ce, ops2[0], options)], { ...options, canonical: true }); } if (head2 === "Error" || head2 === "ErrorCode") { return ce._fn( head2, ops2.map((x) => ce.box(x, { canonical: false })), options.metadata ); } if (head2 === "Domain") return ce.domain(ops2[0], options.metadata); if (head2 === "Number" && ops2.length === 1) return box(ce, ops2[0], options); if (head2 === "String") { if (ops2.length === 0) return new BoxedString(ce, "", options.metadata); return new BoxedString( ce, ops2.map((x) => { var _a2; return (_a2 = asString(x)) != null ? _a2 : ""; }).join(""), options.metadata ); } if (head2 === "Symbol" && ops2.length > 0) { return ce.symbol(ops2.map((x) => { var _a2; return (_a2 = asString(x)) != null ? _a2 : ""; }).join(""), options); } if ((head2 === "Divide" || head2 === "Rational") && ops2.length === 2) { if (ops2[0] instanceof AbstractBoxedExpression && ops2[1] instanceof AbstractBoxedExpression) { if (ce.numericMode === "machine") { const [fn, fd] = [asFloat(ops2[0]), asFloat(ops2[1])]; if (fn !== null && Number.isInteger(fn) && fd !== null && Number.isInteger(fd)) return ce.number([fn, fd], options); } const [n, d] = [asBigint(ops2[0]), asBigint(ops2[1])]; if (n !== null && d !== null) return ce.number([n, d], options); } else { const [n, d] = [ bigintValue(ce, ops2[0]), bigintValue(ce, ops2[1]) ]; if (n !== null && d !== null) return ce.number([n, d], options); } head2 = "Divide"; } if (head2 === "Complex") { if (ops2.length === 1) { const op12 = box(ce, ops2[0], options); const im = asFloat(op12); if (im !== null && im !== 0) return ce.number(ce.complex(0, im), options); return ce.mul([op12, ce._I]); } if (ops2.length === 2) { const op12 = box(ce, ops2[0], options); const op22 = box(ce, ops2[1], options); const re = asFloat(op12); const im = asFloat(op22); if (im !== null && re !== null) { if (im === 0 && re === 0) return ce._ZERO; if (im !== null && im !== 0) return ce.number(ce.complex(re, im), options); return op12; } return ce.add([op12, ce.mul([op22, ce._I])], options.metadata); } } if (head2 === "Negate" && ops2.length === 1) { const op12 = ops2[0]; if (typeof op12 === "number") return ce.number(-op12, options); if (op12 instanceof Decimal) return ce.number(op12.neg(), options); const num = ce.box(op12, options).numericValue; if (num !== null) { if (typeof num === "number") return ce.number(-num, options); if (num instanceof Decimal) return ce.number(num.neg(), options); if (num instanceof import_complex13.Complex) return ce.number(num.neg()); if (isRational(num)) return ce.number(neg(num)); } } if (head2 === "Dictionary") { const dict = {}; for (const op3 of ops2) { const arg = ce.box(op3); const head3 = arg.head; if (head3 === "KeyValuePair" || head3 === "Pair" || head3 === "Tuple" && arg.nops === 2) { const key = arg.op1; if (key.isValid && !key.isNothing) { const value = arg.op2; let k = (_a = key.symbol) != null ? _a : key.string; if (!k && (key.numericValue !== null || key.string)) { const n = typeof key.numericValue === "number" ? key.numericValue : asSmallInteger(key); if (n && Number.isFinite(n) && Number.isInteger(n)) k = n.toString(); } if (k) dict[k] = value; } } } return new BoxedDictionary(ce, dict, options); } if (options.canonical) return makeCanonicalFunction(ce, head2, ops2, options.metadata); return new BoxedFunction( ce, head2, ops2.map((x) => box(ce, x, { canonical: false })), options ); } function box(ce, expr, options) { if (expr === null || expr === void 0) return ce._fn("Sequence", []); options = options ? { ...options } : {}; if (!("canonical" in options)) options.canonical = true; if (expr instanceof AbstractBoxedExpression) return options.canonical ? expr.canonical : expr; if (Array.isArray(expr)) { if (isMachineRational(expr)) { if (Number.isInteger(expr[0]) && Number.isInteger(expr[1])) return ce.number(expr); return boxFunction(ce, "Divide", expr, options); } if (isBigRational(expr)) return ce.number(expr); if (typeof expr[0] === "string") return boxFunction(ce, expr[0], expr.slice(1), options); const ops2 = expr.slice(1).map((x) => box(ce, x, options)); const head2 = box(ce, expr[0], options); if (head2.symbol) return new BoxedFunction(ce, head2.symbol, ops2); return apply(head2, ops2); } if (typeof expr === "number" || expr instanceof import_complex13.Complex || expr instanceof Decimal) return ce.number(expr); if (typeof expr === "string") { if (expr.startsWith("'") && expr.endsWith("'")) return new BoxedString(ce, expr.slice(1, -1)); if (/^[+-]?[0-9]/.test(expr)) return ce.number(expr); if (!isValidIdentifier(expr)) return ce.error("invalid-identifier", { str: expr }); return ce.symbol(expr, options); } if (typeof expr === "object") { const metadata = { latex: expr.latex, wikidata: expr.wikidata }; if ("dict" in expr) return new BoxedDictionary(ce, expr.dict, { canonical: true, metadata }); if ("fn" in expr) { if (typeof expr.fn[0] === "string") return boxFunction(ce, expr.fn[0], expr.fn.slice(1), options); return new BoxedFunction( ce, box(ce, expr.fn[0], options), expr.fn.slice(1).map((x) => box(ce, x, options)), { metadata } ); } if ("str" in expr) return new BoxedString(ce, expr.str, metadata); if ("sym" in expr) return ce.symbol(expr.sym, options); if ("num" in expr) return ce.number(expr, options); } return ce.symbol("Undefined"); } function asString(expr) { var _a, _b; if (typeof expr === "string") return expr; if (expr instanceof AbstractBoxedExpression) { return (_b = (_a = expr.string) != null ? _a : expr.symbol) != null ? _b : expr.toString(); } if (typeof expr === "object") { if ("str" in expr) return expr.str; if ("fn" in expr && expr.fn[0] === "String" && typeof expr.fn[1] === "string") return expr.fn[1]; } if (Array.isArray(expr)) { if (expr[0] === "String" && typeof expr[1] === "string") return expr[1]; } return null; } function gamma3(c) { return c; } function lngamma3(c) { return c; } var import_complex15 = __toESM(require_complex()); var import_complex14 = __toESM(require_complex()); function makePositive(expr) { if (expr.head === "Negate") return [-1, expr.op1]; const n = expr.numericValue; if (n === null) return [1, expr]; const ce = expr.engine; if (typeof n === "number" && n < 0) return [-1, ce.number(-n)]; if (n instanceof decimal_default && n.isNegative()) return [-1, ce.number(n.neg())]; if (n instanceof import_complex14.default && n.re < 0) return [-1, ce.number(ce.complex(-n.re, -n.im))]; if (isMachineRational(n) && n[0] < 0) return [-1, ce.number([-n[0], n[1]])]; if (isBigRational(n) && n[0] < 0) return [-1, ce.number([-n[0], n[1]])]; return [1, expr]; } function apply2(expr, fn, bigFn, complexFn) { var _a; const n = expr.numericValue; const ce = expr.engine; /* @__PURE__ */ console.assert(n !== null); if (typeof n === "number") { if (bignumPreferred(ce) && bigFn) return ce.chop(bigFn(ce.bignum(n))); return ce.chop(fn(n)); } if (n instanceof decimal_default) return ce.chop((_a = bigFn == null ? void 0 : bigFn(n)) != null ? _a : fn(n.toNumber())); if (isMachineRational(n)) { if (!bignumPreferred(ce) || !bigFn) return ce.chop(fn(n[0] / n[1])); return ce.chop(bigFn(ce.bignum(n[0]).div(n[1]))); } if (isBigRational(n)) { if (bigFn) return ce.chop(bigFn(ce.bignum(n[0]).div(ce.bignum(n[1])))); return ce.chop(fn(Number(n[0]) / Number(n[1]))); } if (n instanceof import_complex14.default) { if (!complexFn || !complexAllowed(ce)) return NaN; return ce.chop(complexFn(n)); } return NaN; } function applyN(expr, fn, bigFn, complexFn) { var _a; if (((_a = expr == null ? void 0 : expr.numericValue) != null ? _a : null) === null) return void 0; return expr.engine.number(apply2(expr, fn, bigFn, complexFn)); } function apply22(expr1, expr2, fn, bigFn, complexFn) { var _a, _b, _c; /* @__PURE__ */ console.assert(expr1.numericValue !== null && expr2.numericValue !== null); const ce = expr1.engine; let m1 = expr1.numericValue; if (isMachineRational(m1)) m1 = m1[0] / m1[1]; let m2 = expr2.numericValue; if (isMachineRational(m2)) m2 = m2[0] / m2[1]; if (!bignumPreferred(ce) && typeof m1 === "number" && typeof m2 === "number") return fn(m1, m2); let b1 = void 0; if (m1 instanceof decimal_default) b1 = m1; else if (isBigRational(m1)) b1 = ce.bignum(m1[0]).div(ce.bignum(m1[1])); else if (m1 !== null && typeof m1 === "number") b1 = ce.bignum(m1); let b2 = void 0; if (m2 instanceof decimal_default) b2 = m2; else if (isBigRational(m2)) b1 = ce.bignum(m2[0]).div(ce.bignum(m2[1])); else if (m2 !== null && typeof m2 === "number") b2 = ce.bignum(m2); if (b1 && b2) return (_a = bigFn == null ? void 0 : bigFn(b1, b2)) != null ? _a : fn(b1.toNumber(), b2.toNumber()); if (m1 instanceof import_complex14.default || m2 instanceof import_complex14.default) { if (!complexFn || !complexAllowed(ce)) return NaN; return complexFn( ce.complex((_b = m1 != null ? m1 : b1 == null ? void 0 : b1.toNumber()) != null ? _b : NaN), ce.complex((_c = m2 != null ? m2 : b2 == null ? void 0 : b2.toNumber()) != null ? _c : NaN) ); } return NaN; } function apply2N(expr1, expr2, fn, bigFn, complexFn) { if (expr1.numericValue === null || expr2.numericValue === null) return void 0; return expr1.engine.number(apply22(expr1, expr2, fn, bigFn, complexFn)); } function canonicalPower(ce, base, exponent, metadata) { if (exponent.symbol === "ComplexInfinity") return ce._NAN; if (exponent.isZero) return ce._ONE; if (exponent.isOne) return base; if (exponent.isNegativeOne) return ce.inv(base); if (exponent.numericValue !== null) { if (base.numericValue !== null) { const numBase = asFloat(base); if (numBase === 1) return ce._ONE; if (numBase === 0) { if (exponent.isPositive) return ce._ZERO; if (exponent.isNegative) return ce._COMPLEX_INFINITY; } if (exponent.isNegativeOne) return ce.inv(base); const e = asFloat(exponent); if (e === 0.5 || e === -0.5) { const b = asSmallInteger(base); if (b !== null && b > 0) { const [coef, radicand] = factorPower(b, 2); if (radicand === 1 && coef === 1) return ce._ONE; if (coef !== 1) { if (radicand === 1) return ce.number(e >= 0 ? coef : [1, coef]); return ce.mul([ ce.number(coef), ce._fn("Sqrt", [ce.number(radicand)]) ]); } if (e > 0) return ce._fn("Sqrt", [base], metadata); return ce.inv(ce._fn("Sqrt", [base]), metadata); } if (e > 0) return ce._fn("Power", [base, ce._HALF], metadata); return ce._fn("Power", [base, ce.number([-1, 2])], metadata); } if (base.isInfinity) { if (exponent.numericValue instanceof import_complex15.default) { const re = exponent.numericValue.re; if (re === 0) return ce._NAN; if (re < 0) return ce._ZERO; if (re > 0) return ce._COMPLEX_INFINITY; } if (base.isNegative) { if (exponent.isInfinity) return ce._NAN; } else if (base.isPositive) { if (exponent.isNegativeOne) return ce._ZERO; if (exponent.isInfinity) return exponent.isNegative ? ce._ZERO : ce._POSITIVE_INFINITY; } } if (exponent.isInfinity && (base.isOne || base.isNegativeOne)) return ce._NAN; } } if (base.head === "Power" && base.op1.isReal) { const a = asSmallInteger(exponent); if (a !== null) { const b = asSmallInteger(base.op2); if (b !== null) { return ce.pow(base.op1, ce.number(a * b)); } } if (base.op1.isNonNegative) { const ar = asRational(exponent); if (ar) { const br = asRational(base.op2); if (br) return ce.pow(base.op1, ce.number(mul2(ar, br))); } } } if (base.head === "Multiply") { const e = asSmallInteger(exponent); if (e !== null) return ce._fn( "Multiply", base.ops.map((x) => ce.pow(x, exponent)) ); } return ce._fn("Power", [base, exponent], metadata); } function square(ce, base) { const num = base.numericValue; if (typeof num === "number") return ce.number(num * num); if (num instanceof decimal_default) return ce.number(num.pow(2)); if (num instanceof import_complex15.default) return ce.number(num.pow(2)); if (isMachineRational(num)) return ce.number([num[1] * num[1], num[0] * num[0]]); if (isBigRational(num)) return ce.number([num[1] * num[1], num[0] * num[0]]); if (base.head === "Multiply") return ce._fn( "Multiply", base.ops.map((x) => square(ce, x)) ); if (base.head === "Power") { const exp2 = asSmallInteger(base.op2); if (exp2 !== null) return ce.pow(base.op1, ce.number(exp2 * 2)); return ce.pow(base.op1, ce.mul([ce.number(2), base.op2])); } return ce.pow(base, ce.number(2)); } function numEvalPower(ce, base, exponent) { var _a, _b, _c, _d; if (base.numericValue === null || exponent.numericValue === null) return void 0; if (base.numericValue instanceof import_complex15.default) { if (exponent.numericValue instanceof import_complex15.default) return ce.number(base.numericValue.pow(exponent.numericValue)); return ce.number(base.numericValue.pow((_a = asFloat(exponent)) != null ? _a : NaN)); } if (exponent.numericValue instanceof import_complex15.default) { const b = (_b = asFloat(base)) != null ? _b : null; if (b !== null) return ce.number(ce.complex(b).pow(exponent.numericValue)); return void 0; } const invExp = rootExp(exponent); if (bignumPreferred(ce) || base.numericValue instanceof decimal_default || exponent.numericValue instanceof decimal_default) { const bigBase = asBignum(base); const bigExp = asBignum(exponent); if (!bigBase || !bigExp) return void 0; if (invExp === 2) { if (bigBase.isNeg()) return complexAllowed(ce) ? ce.number(ce.complex(0, bigBase.neg().sqrt().toNumber())) : ce._NAN; return ce.number(bigBase.sqrt()); } if (!bigExp.isInteger() && bigBase.isNeg()) { if (!complexAllowed(ce)) return ce._NAN; const zBase = ce.complex(bigBase.toNumber()); const zExp = ce.complex(bigExp.toNumber()); return ce.number(zBase.pow(zExp)); } return ce.number(bigBase.pow(bigExp)); } const floatExp = (_c = asFloat(exponent)) != null ? _c : NaN; const floatBase = (_d = asFloat(base)) != null ? _d : NaN; if (invExp === 2) { if (floatBase < 0) { return complexAllowed(ce) ? ce.mul([ce._I, ce.number(Math.sqrt(-floatBase))]) : ce._NAN; } return ce.number(Math.sqrt(floatBase)); } if (!Number.isInteger(floatExp) && floatBase < 0) { if (!complexAllowed(ce)) return ce._NAN; const zBase = ce.complex(floatBase); const zExp = ce.complex(floatExp); return ce.number(zBase.pow(zExp)); } return ce.number(Math.pow(floatBase, floatExp)); } function processPower(ce, base, exponent, mode) { var _a, _b; if (base.head === "Multiply") { let c = bignumPreferred(ce) ? [BigInt(1), BigInt(1)] : [1, 1]; const xs = []; for (const op3 of base.ops) { const r = asRational(op3); if (r) c = mul2(c, r); else xs.push(op3); } if (!isRationalOne(c)) return ce.mul([ (_a = processSqrt(ce, ce.number(c), mode)) != null ? _a : ce._ONE, ce.pow( (_b = processPower(ce, ce.mul(xs), exponent, mode)) != null ? _b : ce.mul(xs), exponent ) ]); } if (base.head === "Power") { if (asSmallInteger(base.op2) === -1 && asSmallInteger(exponent) === -1) return base.op1; const e1 = asRational(base.op2); const e2 = asRational(exponent); if (e1 && e2) { const e = mul2(e1, e2); if (isRationalZero(e)) return ce._ONE; if (isRationalOne(e)) return base.op1; return ce.pow(base.op1, e); } if (mode === "N") { const ef1 = asFloat(base.op2); const ef2 = asFloat(exponent); if (ef1 !== null && ef2 !== null) { const ef = ef1 * ef2; if (ef === 0) return ce._ONE; if (ef === 1) return base.op1; return ce.pow(base.op1, ef); } } } if (mode !== "N" && base.numericValue !== null && base.isInteger) { const smallExpr = asSmallInteger(exponent); if (smallExpr) return numEvalPower(ce, base, exponent); const r = asRational(exponent); if (r) { const [n, d] = [machineNumerator(r), machineDenominator(r)]; if ((n === 1 || n === -1) && (d === 2 || d === 3)) { if (bignumPreferred(ce) || base.numericValue instanceof decimal_default) { const bigBase = asBigint(base); if (d % 2 === 0 && bigBase < 0 && !complexAllowed(ce)) return ce._NAN; const sign2 = bigBase < 0 ? d % 2 === 0 ? ce._I : ce._NEGATIVE_ONE : ce._ONE; const [factor, root] = factorPower2( bigBase > 0 ? bigBase : -bigBase, d ); if (root === BigInt(1) && factor === BigInt(1)) return sign2; if (factor !== BigInt(1)) { if (root === BigInt(1)) return ce.mul([ sign2, ce.number(n >= 0 ? factor : [BigInt(1), factor]) ]); return ce.mul([ sign2, ce.number(factor), ce.pow(ce.number(root), exponent) ]); } } else if (typeof base.numericValue === "number") { if (base.numericValue < 0 && d % 2 === 0 && !complexAllowed(ce)) return ce._NAN; const [factor, root] = factorPower(Math.abs(base.numericValue), d); const sign2 = base.numericValue < 0 ? d % 2 === 0 ? ce._I : ce._NEGATIVE_ONE : ce._ONE; if (root === 1 && factor === 1) return sign2; if (factor !== 1) { if (root === 1) return ce.mul([sign2, ce.number(n >= 0 ? factor : [1, factor])]); return ce.mul([ sign2, ce.number(factor), ce.pow(ce.number(root), exponent) ]); } } else { } } if (base.isNegative) { if (!complexAllowed) return ce._NAN; return ce.mul([ce._I, ce.fn("Sqrt", [ce.neg(base)])]); } return void 0; } } if (mode !== "simplify" && base.numericValue !== null && exponent.numericValue !== null) return numEvalPower(ce, base, exponent); return void 0; } function processSqrt(ce, base, mode) { if (base.isOne) return ce._ONE; if (base.isZero) return ce._ZERO; if (base.isNegativeOne) return complexAllowed(ce) ? ce._I : ce._NAN; if (base.isNegative && !complexAllowed(ce)) return ce._NAN; const r = asRational(base); if (mode === "N" || mode === "evaluate" && !r) return applyN( base, (x) => x < 0 ? ce.complex(x).sqrt() : Math.sqrt(x), (x) => x.isNeg() ? ce.complex(x.toNumber()).sqrt() : x.sqrt(), (x) => x.sqrt() ); const n = asSmallInteger(base); if (n !== null) { const [factor, root] = factorPower(Math.abs(n), 2); if (n < 0) { if (root === 1) ce.mul([ce.number(ce.complex(0, factor))]); return ce.mul([ ce.number(ce.complex(0, factor)), ce.sqrt(ce.number(root)) ]); } if (root === 1) return ce.number(factor); return ce.mul([ce.number(factor), ce.sqrt(ce.number(root))]); } if (r) { if (isMachineRational(r) && !bignumPreferred(ce)) { const [n2, d] = r; if (Math.abs(n2) < Number.MAX_SAFE_INTEGER && d < Number.MAX_SAFE_INTEGER) { const [nFactor, nRoot] = factorPower(Math.abs(n2), 2); const [dFactor, dRoot] = factorPower(d, 2); if (n2 < 0) return ce.mul([ ce.number([nFactor, dFactor]), ce.sqrt(ce.number([nRoot, dRoot])), ce._I ]); return ce.mul([ ce.number([nFactor, dFactor]), ce.sqrt(ce.number([nRoot, dRoot])) ]); } } if (isBigRational(r) || bignumPreferred(ce)) { const n2 = bigint(r[0]); const [nFactor, nRoot] = factorPower2(n2 > 0 ? n2 : -n2, 2); const [dFactor, dRoot] = factorPower2(bigint(r[1]), 2); if (n2 < 0) return ce.mul([ ce.number([nFactor, dFactor]), ce.sqrt(ce.number([nRoot, dRoot])), ce._I ]); return ce.mul([ ce.number([nFactor, dFactor]), ce.sqrt(ce.number([nRoot, dRoot])) ]); } } return void 0; } function rootExp(exponent) { if (typeof exponent.numericValue === "number") { const inv = 1 / exponent.numericValue; if (Number.isInteger(inv)) return inv; return null; } if (exponent.numericValue instanceof decimal_default) { const inv = exponent.engine._BIGNUM_ONE.div(exponent.numericValue); if (inv.isInt()) return inv.toNumber(); return null; } if (!isRational(exponent.numericValue)) return null; const [n, d] = [ machineNumerator(exponent.numericValue), machineDenominator(exponent.numericValue) ]; if (n !== 1 && n !== -1) return null; return n * d; } function canonicalMultiply(ce, ops2) { /* @__PURE__ */ console.assert(ops2.every((x) => x.isCanonical)); if (ops2.length === 0) return ce.number(1); if (ops2.length === 1) return ops2[0]; if (ops2.length === 2) return multiply2(ops2[0], ops2[1]); const product = new Product(ce); for (const op3 of ops2) { if (op3.isNaN || op3.symbol === "Undefined") return ce._NAN; product.addTerm(op3); } return product.asExpression(); } function simplifyMultiply(ce, ops2) { /* @__PURE__ */ console.assert(ops2.every((x) => x.head !== "Multiply")); const product = new Product(ce); for (let op3 of ops2) { op3 = op3.simplify(); if (op3.isNaN || op3.symbol === "Undefined") return ce._NAN; product.addTerm(op3); } return product.asExpression(); } function evalMultiply(ce, ops2, mode = "evaluate") { /* @__PURE__ */ console.assert(ops2.length > 1, "evalMultiply(): no arguments"); if (mode === "N") { ops2 = ops2.map((x) => x.N()); if ((ce.numericMode === "machine" || ce.numericMode === "auto") && ops2.every((x) => typeof x.numericValue === "number")) { let prod = 1; for (const op3 of ops2) prod *= op3.numericValue; return ce.number(prod); } } for (const op3 of ops2) { if (op3.isNaN || op3.symbol === "Undefined") return ce._NAN; if (!op3.isExact) mode = "N"; } /* @__PURE__ */ console.assert(ops2.every((x) => x.head !== "Multiply")); if (mode === "N") ops2 = ops2.map((x) => x.N()); else ops2 = ops2.map((x) => x.evaluate()); return new Product(ce, ops2).asExpression(mode); } function multiply2(op12, op22, metadata) { var _a; /* @__PURE__ */ console.assert(op12.isCanonical); /* @__PURE__ */ console.assert(op22.isCanonical); const ce = op12.engine; if (op12.symbol === "ImaginaryUnit") { const f = asFloat(op22); if (f !== null) return ce.number(ce.complex(0, f)); } if (op22.symbol === "ImaginaryUnit") { const f = asFloat(op12); if (f !== null) return ce.number(ce.complex(0, f)); } if (op12.numericValue !== null && op22.numericValue !== null) { const f1 = asFloat(op12); const f2 = asFloat(op22); if (f1 !== null && ce.isComplex(op22)) return ce.number(ce.complex(f1 * op22.re, f1 * op22.im)); if (f2 !== null && ce.isComplex(op12)) return ce.number(ce.complex(f2 * op12.re, f2 * op12.im)); } if (op12.numericValue !== null && op22.numericValue !== null && op12.isInteger && op22.isInteger) { return (_a = apply2N( op12, op22, (a, b) => a * b, (a, b) => a.mul(b) )) != null ? _a : ce._NAN; } if (op12.isNaN || op22.isNaN || op12.symbol === "Undefined" || op22.symbol === "Undefined") return ce._NAN; if (op12.isNothing) return op22; if (op22.isNothing) return op12; if (op12.numericValue !== null) { if (op12.isOne) return op22; if (op12.isNegativeOne) return canonicalNegate(op22); } if (op22.numericValue !== null) { if (op22.isOne) return op12; if (op22.isNegativeOne) return canonicalNegate(op12); } let sign2 = 1; let [t, c] = op12.numericValue !== null ? [op12, op22] : [op22, op12]; /* @__PURE__ */ console.assert(t.head !== "Subtract"); if (t.head === "Negate") { t = t.op1; sign2 = -sign2; } if (c.numericValue !== null) { const r = asRational(c); if (r) { if (isRationalOne(r)) return t; if (isRationalZero(r)) return ce._ZERO; if (t.head === "Add") { if (sign2 < 0) c = canonicalNegate(c); return ce.add( t.ops.map((x) => multiply2(c, x)), metadata ); } const tr = asRational(t); if (tr) { const p = mul2(r, tr); return ce.number(sign2 < 0 ? neg(p) : p, { metadata }); } if (sign2 < 0) return ce._fn("Multiply", [canonicalNegate(c), t], metadata); return ce._fn("Multiply", [c, t], metadata); } } if (c.hash === t.hash && c.isSame(t)) return square(ce, c); const product = new Product(ce, [c, t]); if (sign2 > 0) return product.asExpression(); return canonicalNegate(product.asExpression(), metadata); } function canonicalProduct(ce, body, range) { var _a, _b, _c, _d, _e, _f, _g, _h; body != null ? body : body = ce.error("missing"); let index = null; let lower = null; let upper = null; if (range && range.head !== "Tuple" && range.head !== "Triple" && range.head !== "Pair" && range.head !== "Single") { index = range; } else if (range) { index = (_b = (_a = range.ops) == null ? void 0 : _a[0]) != null ? _b : null; lower = (_e = (_d = (_c = range.ops) == null ? void 0 : _c[1]) == null ? void 0 : _d.canonical) != null ? _e : null; upper = (_h = (_g = (_f = range.ops) == null ? void 0 : _f[2]) == null ? void 0 : _g.canonical) != null ? _h : null; } if (index && index.head === "Hold") index = index.op1; if (index && index.head === "ReleaseHold") index = index.op1.evaluate(); index != null ? index : index = ce.symbol("Nothing"); if (!index.symbol) index = ce.error(["incompatible-domain", "Symbol", index.domain]); else index = ce.hold(index); if (lower && lower.isFinite) lower = validateArgument(ce, lower, "Integer"); if (upper && upper.isFinite) upper = validateArgument(ce, upper, "Integer"); if (lower && upper) range = ce.tuple([index, lower, upper]); else if (upper) range = ce.tuple([index, ce.number(1), upper]); else if (lower) range = ce.tuple([index, lower]); else range = index; return ce._fn("Product", [body.canonical, range]); } function evalMultiplication(ce, expr, range, mode) { var _a; const [index, lower, upper, isFinite2] = normalizeLimits(range); const fn = expr; if (mode !== "N" && (lower >= upper || upper - lower >= MAX_SYMBOLIC_TERMS)) return void 0; let result = null; const savedContext = ce.context; ce.context = (_a = fn.scope) != null ? _a : ce.context; if (mode === "simplify") { const terms = []; if (!fn.scope) for (let i = lower; i <= upper; i++) terms.push(fn.simplify()); else for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); terms.push(fn.simplify()); } result = ce.mul(terms).simplify(); } if (mode === "evaluate") { const terms = []; if (!fn.scope) for (let i = lower; i <= upper; i++) terms.push(fn.evaluate()); else for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); terms.push(fn.evaluate()); } result = ce.mul(terms).evaluate(); } if (mode === "N") { if (result === null && !fn.scope) { const n = fn.N(); if (!isFinite2) { if (n.isZero) result = ce._ZERO; else if (n.isPositive) result = ce._POSITIVE_INFINITY; else result = ce._NEGATIVE_INFINITY; } if (result === null && fn.isPure) result = ce.pow(n, ce.number(upper - lower + 1)); } if (result === null && isFinite2) { if (bignumPreferred(ce)) { let product2 = ce.bignum(1); for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); const term = asBignum(fn.N()); if (term === null || !term.isFinite()) { result = term !== null ? ce.number(term) : void 0; break; } product2 = product2.mul(term); } if (result === null) result = ce.number(product2); } let product = 1; const numericMode = ce.numericMode; ce.numericMode = "machine"; for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); const term = asFloat(fn.N()); if (term === null || !Number.isFinite(term)) { result = term !== null ? ce.number(term) : void 0; break; } product *= term; } ce.numericMode = numericMode; if (result === null) result = ce.number(product); } if (result === null) { ce.set({ [index]: 1e3 }); const nMax = fn.N(); ce.set({ [index]: 999 }); const nMaxMinusOne = fn.N(); const ratio = asFloat(ce.div(nMax, nMaxMinusOne).N()); if (ratio !== null && Number.isFinite(ratio) && Math.abs(ratio) > 1) { result = ce._POSITIVE_INFINITY; } else { let product = 1; const numericMode = ce.numericMode; ce.numericMode = "machine"; for (let i = lower; i <= upper; i++) { ce.set({ [index]: i }); const term = asFloat(fn.N()); if (term === null) { result = void 0; break; } if (Math.abs(1 - term) < Number.EPSILON || !Number.isFinite(term)) break; product *= term; } if (result === null) result = ce.number(product); ce.numericMode = numericMode; } } } ce.context = savedContext; return result != null ? result : void 0; } function canonicalDivide(ce, op12, op22) { if (!op12.isValid || !op22.isValid) return ce._fn("Divide", [op12, op22]); if (op12.head === "Negate" && op22.head === "Negate") { op12 = op12.op1; op22 = op22.op1; } if (op12.numericValue !== null && op22.numericValue !== null) { if (op22.isOne) return op12; if (op22.isNegativeOne) return ce.neg(op12); if (op12.isOne) return ce.inv(op22); if (op12.isNegativeOne) return ce.neg(ce.inv(op22)); const r1 = asRational(op12); const r2 = asRational(op22); if (r1 && r2 && !isRationalZero(r2)) return ce.number(mul2(r1, inverse(r2))); } if (op12.head === "Divide" && op22.head === "Divide") { return canonicalDivide( ce, ce.mul([op12.op1, op22.op2]), ce.mul([op12.op2, op22.op1]) ); } if (op12.head === "Divide") return canonicalDivide(ce, ce.mul([op12.op1, op22]), op12.op2); if (op22.head === "Divide") return canonicalDivide(ce, ce.mul([op12, op22.op2]), op22.op1); const num1 = op12.numericValue; if (num1 !== null) { if (isMachineRational(num1)) { const [a, b] = num1; return canonicalDivide(ce, ce.number(a), ce.mul([ce.number(b), op22])); } if (isBigRational(num1)) { const [a, b] = num1; return canonicalDivide(ce, ce.number(a), ce.mul([ce.number(b), op22])); } } const num2 = op22.numericValue; if (num2 !== null) { if (isMachineRational(num2)) { const [a, b] = num2; return canonicalDivide(ce, ce.mul([op12, ce.number(b)]), ce.number(a)); } if (isBigRational(num2)) { const [a, b] = num2; return canonicalDivide(ce, ce.mul([op12, ce.number(b)]), ce.number(a)); } } const [c1, t1] = asCoefficient(op12); const [c2, t2] = asCoefficient(op22); if (!isRationalOne(c1) || !isRationalOne(c2)) { const [cn, cd] = mul2(c1, inverse(c2)); const en = ce.mul([ce.number(cn), t1]); if (en.isZero) return ce._ZERO; const ed = ce.mul([ce.number(cd), t2]); if (ed.isOne) return en; return ce._fn("Divide", [en, ed]); } let [nSign, n] = makePositive(op12); let [dSign, d] = makePositive(op22); n = n.canonical; d = d.canonical; if (d.numericValue !== null && d.isOne) return nSign * dSign < 0 ? canonicalNegate(n) : n; if (nSign * dSign > 0) return ce._fn("Divide", [n, d]); if (n.numericValue) return ce._fn("Divide", [canonicalNegate(n), d]); return canonicalNegate(ce._fn("Divide", [n, d])); } function simplifyDivide(ce, op12, op22) { if (op12.numericValue !== null && op22.numericValue !== null) { const r1 = asRational(op12); const r2 = asRational(op22); if (r1 && r2 && !isRationalZero(r2)) return ce.number(mul2(r1, inverse(r2))); } return new Product(ce, [op12, ce.inv(op22)]).asRationalExpression(); } var import_complex16 = __toESM(require_complex()); var ARITHMETIC_LIBRARY = [ { // // Functions // Abs: { wikidata: "Q3317982", // magnitude 'Q120812 (for reals) threadable: true, idempotent: true, complexity: 1200, signature: { domain: ["Function", "Number", "NonNegativeNumber"], simplify: (ce, ops2) => processAbs(ce, ops2[0], "simplify"), evaluate: (ce, ops2) => processAbs(ce, ops2[0], "evaluate"), N: (ce, ops2) => processAbs(ce, ops2[0], "N") } }, Add: { wikidata: "Q32043", associative: true, commutative: true, threadable: true, idempotent: true, complexity: 1300, hold: "all", signature: { domain: "NumericFunction", codomain: (ce, args) => domainAdd( ce, args.map((x) => x.domain) ), // canonical: (ce, args) => canonicalAdd(ce, args), // never called: shortpath simplify: (ce, ops2) => simplifyAdd(ce, ops2), evaluate: (ce, ops2) => evalAdd(ce, ops2), N: (ce, ops2) => evalAdd(ce, ops2, "N") } }, Ceil: { description: "Rounds a number up to the next largest integer", complexity: 1250, signature: { domain: ["Function", "Number", "Integer"], evaluate: (_ce, ops2) => applyN( ops2[0], Math.ceil, (x) => x.ceil(), (z) => z.ceil(0) ) } }, Chop: { associative: true, threadable: true, idempotent: true, complexity: 1200, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => applyN( ops2[0], (x) => ce.chop(x), (x) => ce.chop(x), (x) => ce.chop(x) ) } }, Complex: { // This function is converted during boxing, so unlikely to encounter wikidata: "Q11567", complexity: 500 }, Divide: { wikidata: "Q1226939", complexity: 2500, // - if numer product of numbers, or denom product of numbers, // i.e. √2x/2 -> 0.707x, 2/√2x -> 1.4142x signature: { domain: ["Function", "Number", "Number", "Number"], canonical: (ce, args) => { args = validateArguments(ce, canonical(flattenSequence(args)), [ "Number", "Number" ]); if (args.length !== 2) return ce._fn("Divide", args); return ce.div(args[0], args[1]); }, simplify: (ce, args) => simplifyDivide(ce, args[0], args[1]), evaluate: (ce, ops2) => apply2N( ops2[0], ops2[1], (n, d) => n / d, (n, d) => n.div(d), (n, d) => n.div(d) ) } }, Exp: { wikidata: "Q168698", threadable: true, complexity: 3500, // Exp(x) -> e^x signature: { domain: ["Function", "Number", "Number"], canonical: (ce, args) => { args = validateArguments(ce, canonical(flattenSequence(args)), [ "Number" ]); if (args.length !== 1) return ce._fn("Power", args); return ce.pow(ce.symbol("ExponentialE"), args[0]); } } }, Factorial: { description: "Factorial Function", wikidata: "Q120976", complexity: 9e3, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const n = asSmallInteger(ops2[0]); if (n !== null && n >= 0) { if (!bignumPreferred(ce)) return ce.number(factorial(n)); return ce.number(factorial2(ce, ce.bignum(n))); } const num = ops2[0].numericValue; if (num !== null && num instanceof import_complex16.default) return ce.number(gamma3(num.add(1))); const f = asFloat(ops2[0]); if (f !== null) return ce.number(gamma(1 + f)); return void 0; } } }, Floor: { wikidata: "Q56860783", complexity: 1250, signature: { domain: ["Function", "Number", "ExtendedRealNumber"], evaluate: (ce, ops2) => applyN( ops2[0], Math.floor, (x) => x.floor(), (z) => z.floor(0) ) } }, Gamma: { wikidata: "Q190573", complexity: 8e3, signature: { domain: ["Function", "Number", "Number"], N: (ce, ops2) => applyN( ops2[0], (x) => gamma(x), (x) => gamma2(ce, x), (x) => gamma3(x) ) } }, LogGamma: { complexity: 8e3, signature: { domain: ["Function", "Number", "Number"], N: (ce, ops2) => applyN( ops2[0], (x) => lngamma(x), (x) => lngamma2(ce, x), (x) => lngamma3(x) ) } }, Ln: { description: "Natural Logarithm", wikidata: "Q204037", complexity: 4e3, signature: { domain: ["Function", "Number", "Number"], N: (ce, ops2) => applyN( ops2[0], (x) => x >= 0 ? Math.log(x) : ce.complex(x).log(), (x) => !x.isNeg() ? x.ln() : ce.complex(x.toNumber()).log(), (z) => z.log() ) } }, Log: { description: "Log(z, b = 10) = Logarithm of base b", wikidata: "Q11197", complexity: 4100, signature: { domain: ["Function", "Number", ["Maybe", "Number"], "Number"], canonical: (ce, ops2) => { ops2 = canonical(flattenSequence(ops2)); if (ops2.length === 1) return ce._fn("Log", [validateArgument(ce, ops2[0], "Number")]); if (ops2.length === 2) { const arg = validateArgument(ce, ops2[0], "Number"); const base = validateArgument(ce, ops2[1], "Number"); if (base.numericValue === 10) return ce._fn("Log", [arg]); return ce._fn("Log", [arg, base]); } return ce._fn("Log", validateArgumentCount(ce, ops2, 2)); }, N: (ce, ops2) => { if (ops2[1] === void 0) return applyN( ops2[0], (x) => x >= 0 ? Math.log10(x) : ce.complex(x).log().div(Math.LN10), (x) => !x.isNeg() ? decimal_default.log10(x) : ce.complex(x.toNumber()).log().div(Math.LN10), (z) => z.log().div(Math.LN10) ); return apply2N( ops2[0], ops2[1], (a, b) => Math.log(a) / Math.log(b), (a, b) => a.log(b), (a, b) => a.log().div(typeof b === "number" ? Math.log(b) : b.log()) ); } } }, Lb: { description: "Base-2 Logarithm", wikidata: "Q581168", complexity: 4100, signature: { domain: ["Function", "Number", "Number"], N: (ce, ops2) => applyN( ops2[0], (x) => x >= 0 ? Math.log2(x) : ce.complex(x).log().div(Math.LN2), (x) => x.isNeg() ? decimal_default.log10(x) : ce.complex(x.toNumber()).log().div(Math.LN2), (z) => z.log().div(Math.LN2) ) } }, Lg: { description: "Base-10 Logarithm", wikidata: "Q966582", complexity: 4100, signature: { domain: ["Function", "Number", "Number"], N: (ce, ops2) => applyN( ops2[0], (x) => x >= 0 ? Math.log10(x) : ce.complex(x).log().div(Math.LN10), (x) => !x.isNeg() ? decimal_default.log10(x) : ce.complex(x.toNumber()).log().div(Math.LN10), (z) => z.log().div(Math.LN10) ) } }, Max: { description: "Maximum of two or more numbers", complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], simplify: (ce, ops2) => { if (ops2.length === 0) return ce._NEGATIVE_INFINITY; if (ops2.length === 1) return ops2[0]; return ce.fn("Max", ops2); }, evaluate: (ce, ops2) => { if (ops2.length === 0) return ce._NEGATIVE_INFINITY; let result = void 0; const rest = []; for (const op3 of ops2) { if (!op3.isNumber || op3.numericValue === void 0) rest.push(op3); else if (!result || op3.isGreater(result)) result = op3; } if (rest.length > 0) return ce.box(result ? ["Max", result, ...rest] : ["Max", ...rest]); return result != null ? result : ce._NAN; } } }, Min: { description: "Minimum of two or more numbers", complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], simplify: (ce, ops2) => { if (ops2.length === 0) return ce._NEGATIVE_INFINITY; if (ops2.length === 1) return ops2[0]; return ce.fn("Min", ops2); }, evaluate: (ce, ops2) => { if (ops2.length === 0) return ce._NEGATIVE_INFINITY; let result = void 0; const rest = []; for (const op3 of ops2) { if (!op3.isNumber || op3.numericValue === void 0) rest.push(op3); else if (!result || op3.isLess(result)) result = op3; } if (rest.length > 0) return ce.box(result ? ["Min", result, ...rest] : ["Min", ...rest]); return result != null ? result : ce._NAN; } } }, Multiply: { wikidata: "Q40276", associative: true, commutative: true, idempotent: true, complexity: 2100, hold: "all", signature: { domain: "NumericFunction", // Never called: fastpath // canonical: (ce, args) => { // return canonicalMultiply(ce, args); // }, simplify: (ce, ops2) => simplifyMultiply(ce, ops2), evaluate: (ce, ops2) => evalMultiply(ce, ops2), N: (ce, ops2) => evalMultiply(ce, ops2, "N") } }, Negate: { description: "Additive Inverse", wikidata: "Q715358", complexity: 2e3, signature: { domain: ["Function", "Number", "Number"], codomain: (ce, args) => { const arg = args[0].domain; if (!arg.literal) return arg; const negDomain = { PositiveNumber: "NegativeNumber", NonNegativeNumber: "NonPositiveNumber", NonPositiveNumber: "NonNegativeNumber", NegativeNumber: "PositiveNumber", PositiveInteger: "NegativeInteger", NonNegativeInteger: "NonPositiveInteger", NonPositiveInteger: "NonNegativeInteger", NegativeInteger: "PositiveInteger" }[arg.literal]; if (negDomain) return ce.domain(negDomain); return arg; }, canonical: (ce, args) => { args = validateArguments(ce, canonical(flattenSequence(args)), [ "Number" ]); if (args.length !== 1) return ce._fn("Negate", args); return canonicalNegate(args[0]); }, simplify: (ce, ops2) => processNegate(ce, ops2[0], "simplify"), evaluate: (ce, ops2) => processNegate(ce, ops2[0], "evaluate"), N: (ce, ops2) => processNegate(ce, ops2[0], "N"), sgn: (_ce, args) => { const s = args[0].sgn; if (s === void 0 || s === null) return void 0; if (s === 0) return 0; if (s > 0) return -1; if (s < 0) return 1; return void 0; } } }, Power: { wikidata: "Q33456", commutative: false, complexity: 3500, signature: { domain: ["Function", "Number", "Number", "Number"], canonical: (ce, args) => { args = validateArguments(ce, canonical(flattenSequence(args)), [ "Number", "Number" ]); if (args.length !== 2) return ce._fn("Power", args); return ce.pow(args[0], args[1]); }, simplify: (ce, ops2) => processPower(ce, ops2[0], ops2[1], "simplify"), evaluate: (ce, ops2) => processPower(ce, ops2[0], ops2[1], "evaluate"), N: (ce, ops2) => { if (ce.numericMode === "machine" && typeof ops2[0].numericValue === "number" && typeof ops2[1].numericValue === "number") return ce.number( Math.pow(ops2[0].numericValue, ops2[1].numericValue) ); return processPower(ce, ops2[0], ops2[1], "N"); } // Defined as RealNumber for all power in RealNumber when base > 0; // when x < 0, only defined if n is an integer // if x is a non-zero complex, defined as ComplexNumber // Square root of a prime is irrational (AlgebraicNumber) // https://proofwiki.org/wiki/Square_Root_of_Prime_is_Irrational // evalDomain: (ce, base: BoxedExpression, power: BoxedExpression) ; } }, Product: { wikidata: "Q901718", complexity: 1e3, hold: "first", signature: { domain: [ "Function", "Anything", // [ // 'Maybe', "Tuple", // ['Tuple', 'Symbol', ['Maybe', 'Integer'], ['Maybe', 'Integer']], // ], "Number" ], // codomain: (ce, args) => domainAdd(ce, args), // The 'body' and 'range' need to be interpreted by canonicalMultiplication(). Don't canonicalize them yet. canonical: (ce, ops2) => canonicalProduct(ce, ops2[0], ops2[1]), simplify: (ce, ops2) => evalMultiplication(ce, ops2[0], ops2[1], "simplify"), evaluate: (ce, ops2) => evalMultiplication(ce, ops2[0], ops2[1], "evaluate"), N: (ce, ops2) => evalMultiplication(ce, ops2[0], ops2[1], "N") } }, Rational: { complexity: 2400, signature: { domain: ["Function", "Number", ["Maybe", "Number"], "RationalNumber"], canonical: (ce, args) => { args = canonical(flattenSequence(args)); if (args.length === 0) return ce._fn("Rational", [ce.error("missing")]); if (args.length === 1) return ce._fn("Rational", [ validateArgument(ce, args[0], "ExtendedRealNumber") ]); args = validateArguments(ce, args, ["Integer", "Integer"]); if (args.length !== 2) return ce._fn("Rational", args); return ce.div(args[0], args[1]); }, simplify: (ce, ops2) => { if (ops2.length !== 2) return void 0; return simplifyDivide(ce, ops2[0], ops2[1]); }, evaluate: (ce, ops2) => { if (ops2.length === 2) { const [n, d] = [asSmallInteger(ops2[0]), asSmallInteger(ops2[1])]; if (n !== null && d !== null) return ce.number([n, d]); return void 0; } const f = asFloat(ops2[0].N()); if (f === null) return void 0; return ce.number(rationalize(f)); }, N: (ce, ops2) => { if (ops2.length === 1) return ops2[0]; return apply2N( ops2[0], ops2[1], (a, b) => a / b, (a, b) => a.div(b), (a, b) => a.div(b) ); } } }, Root: { complexity: 3200, signature: { domain: ["Function", "Number", "Number", "Number"], canonical: (ce, args) => { args = canonical(flattenSequence(args)); if (args.length > 2) return ce._fn("Root", validateArgumentCount(ce, args, 2)); const [base, exp2] = [ validateArgument(ce, args[0], "Number"), validateArgument(ce, args[1], "Number") ]; if (!exp2.isValid || !base.isValid) return ce._fn("Root", [base, exp2]); return ce.pow(base, ce.inv(exp2)); } } }, Round: { complexity: 1250, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => applyN( ops2[0], Math.round, (x) => x.round(), (x) => x.round(0) ) } }, Sign: { complexity: 1200, signature: { domain: ["Function", "Number", ["Range", -1, 1]], simplify: (ce, ops2) => { const s = ops2[0].sgn; if (s === 0) return ce._ZERO; if (s === 1) return ce._ONE; if (s === -1) return ce._NEGATIVE_ONE; return void 0; }, evaluate: (ce, ops2) => { const s = ops2[0].sgn; if (s === 0) return ce._ZERO; if (s === 1) return ce._ONE; if (s === -1) return ce._NEGATIVE_ONE; return void 0; }, N: (ce, ops2) => { const s = ops2[0].sgn; if (s === 0) return ce._ZERO; if (s === 1) return ce._ONE; if (s === -1) return ce._NEGATIVE_ONE; return void 0; } } }, SignGamma: { description: "The sign of the gamma function: -1 or +1", complexity: 7900 // @todo }, Sqrt: { description: "Square Root", wikidata: "Q134237", complexity: 3e3, signature: { domain: ["Function", "Number", "Number"], canonical: (ce, args) => { args = canonical(flattenSequence(args)); if (args.length !== 1) return ce._fn("Sqrt", args); return ce.pow(args[0], ce._HALF); }, simplify: (ce, ops2) => processSqrt(ce, ops2[0], "simplify"), evaluate: (ce, ops2) => processSqrt(ce, ops2[0], "evaluate"), N: (ce, ops2) => processSqrt(ce, ops2[0], "N") // evalDomain: Square root of a prime is irrational // https://proofwiki.org/wiki/Square_Root_of_Prime_is_Irrational } }, Square: { wikidata: "Q3075175", complexity: 3100, signature: { domain: ["Function", "Number", "Number"], canonical: (ce, args) => { args = canonical(flattenSequence(args)); if (args.length !== 1) return ce._fn("Square", args); return ce.pow(args[0], ce.number(2)); } } }, Subtract: { wikidata: "Q40754", complexity: 1350, signature: { domain: ["Function", "Number", ["Maybe", "Number"], "Number"], canonical: (ce, args) => { args = canonical(flattenSequence(args)); if (args.length === 1) return canonicalNegate(args[0]); args = validateArgumentCount(ce, args, 2); if (args.length !== 2) return ce._fn("Subtract", args); if (!args.every((x) => x.isValid)) return ce._fn("Subtract", args); return ce.add([args[0], canonicalNegate(args[1])]); } } }, Sum: { wikidata: "Q218005", complexity: 1e3, hold: "all", signature: { domain: [ "Function", "Anything", // [ // 'Maybe', "Tuple", // ['Tuple', 'Symbol', ['Maybe', 'Integer'], ['Maybe', 'Integer']], // ], "Number" ], canonical: (ce, ops2) => canonicalSummation(ce, ops2[0], ops2[1]), simplify: (ce, ops2) => evalSummation(ce, ops2[0], ops2[1], "simplify"), evaluate: (ce, ops2) => evalSummation(ce, ops2[0], ops2[1], "evaluate"), N: (ce, ops2) => evalSummation(ce, ops2[0], ops2[1], "N") } } }, { // // Constants // Note: constants are put in a separate, subsequent, dictionary because // some of the values (CatalanConstant) reference some function names (Add...) // that are defined above. This avoid circular references. // e: { domain: "TranscendentalNumber", constant: true, holdUntil: "never", value: "ExponentialE" }, i: { domain: "ImaginaryNumber", constant: true, holdUntil: "never", flags: { imaginary: true }, value: "ImaginaryUnit" }, MachineEpsilon: { /** * The difference between 1 and the next larger floating point number * * 2^{−52} * * See https://en.wikipedia.org/wiki/Machine_epsilon */ domain: "RealNumber", holdUntil: "N", constant: true, flags: { real: true }, value: { num: Number.EPSILON.toString() } }, Half: { constant: true, holdUntil: "evaluate", value: ["Rational", 1, 2] }, ImaginaryUnit: { domain: "ImaginaryNumber", constant: true, holdUntil: "evaluate", wikidata: "Q193796", flags: { imaginary: true }, value: ["Complex", 0, 1] }, ExponentialE: { domain: "TranscendentalNumber", flags: { algebraic: false, real: true }, wikidata: "Q82435", constant: true, holdUntil: "N", value: (engine) => bignumPreferred(engine) ? engine._BIGNUM_ONE.exp() : Math.exp(1) }, GoldenRatio: { domain: "AlgebraicNumber", wikidata: "Q41690", constant: true, flags: { algebraic: true }, holdUntil: "simplify", value: ["Divide", ["Add", 1, ["Sqrt", 5]], 2] }, CatalanConstant: { domain: "RealNumber", flags: { algebraic: void 0 }, // Not proven irrational or transcendental wikidata: "Q855282", constant: true, holdUntil: "N", value: { // From http://www.fullbooks.com/Miscellaneous-Mathematical-Constants1.html num: `0.91596559417721901505460351493238411077414937428167 21342664981196217630197762547694793565129261151062 48574422619196199579035898803325859059431594737481 15840699533202877331946051903872747816408786590902 47064841521630002287276409423882599577415088163974 70252482011560707644883807873370489900864775113225 99713434074854075532307685653357680958352602193823 23950800720680355761048235733942319149829836189977 06903640418086217941101917532743149978233976105512 24779530324875371878665828082360570225594194818097 53509711315712615804242723636439850017382875977976 53068370092980873887495610893659771940968726844441 66804621624339864838916280448281506273022742073884 31172218272190472255870531908685735423498539498309 91911596738846450861515249962423704374517773723517 75440708538464401321748392999947572446199754961975 87064007474870701490937678873045869979860644874974 64387206238513712392736304998503539223928787979063 36440323547845358519277777872709060830319943013323 16712476158709792455479119092126201854803963934243 ` } }, EulerGamma: { // From http://www.fullbooks.com/Miscellaneous-Mathematical-Constants2.html domain: "RealNumber", flags: { algebraic: void 0 }, // Not proven irrational or transcendental wikidata: "Q273023", holdUntil: "N", constant: true, value: { num: `0.57721566490153286060651209008240243104215933593992359880576723488486772677766 467093694706329174674951463144724980708248096050401448654283622417399764492353 625350033374293733773767394279259525824709491600873520394816567085323315177661 152862119950150798479374508570574002992135478614669402960432542151905877553526 733139925401296742051375413954911168510280798423487758720503843109399736137255 306088933126760017247953783675927135157722610273492913940798430103417771778088 154957066107501016191663340152278935867965497252036212879226555953669628176388 792726801324310104765059637039473949576389065729679296010090151251959509222435 014093498712282479497471956469763185066761290638110518241974448678363808617494 551698927923018773910729457815543160050021828440960537724342032854783670151773 943987003023703395183286900015581939880427074115422278197165230110735658339673` } } }, { PreIncrement: { signature: { domain: ["Function", "Number", "Number"] } }, PreDecrement: { signature: { domain: ["Function", "Number", "Number"] } } } ]; function processAbs(ce, arg, mode) { if (mode !== "simplify") { const num = arg.numericValue; if (num !== null) { if (typeof num === "number") return ce.number(Math.abs(num)); if (num instanceof decimal_default) return ce.number(num.abs()); if (num instanceof import_complex16.default) return ce.number(num.abs()); if (isMachineRational(num)) return ce.number( mode === "N" ? Math.abs(num[0] / num[1]) : [Math.abs(num[0]), num[1]] ); if (isBigRational(num)) { const [n, d] = num; return ce.number( mode === "N" ? ce.bignum(n).div(ce.bignum(d)).abs() : [n > 0 ? n : -n, d] ); } } } if (arg.isNonNegative) return arg; if (arg.isNegative) return ce.neg(arg); return void 0; } var CALCULUS_LIBRARY = [ { // // Functions // Integrate: { wikidata: "Q80091", hold: "all", signature: { domain: [ "Function", "Anything", ["Union", "Nothing", "Tuple", "Symbol"], // ['Tuple', 'Symbol', ['Maybe', 'Integer'], ['Maybe', 'Integer']], "Number" ], canonical: (ce, ops2) => { var _a, _b, _c, _d, _e, _f, _g, _h, _i; const body = (_a = ops2[0]) != null ? _a : ce.error("missing"); let range = ops2[1]; let index = null; let lower = null; let upper = null; if (range && range.head !== "Tuple" && range.head !== "Triple" && range.head !== "Pair" && range.head !== "Single") { index = range; } else if (range) { index = (_c = (_b = range.ops) == null ? void 0 : _b[0]) != null ? _c : null; lower = (_f = (_e = (_d = range.ops) == null ? void 0 : _d[1]) == null ? void 0 : _e.canonical) != null ? _f : null; upper = (_i = (_h = (_g = range.ops) == null ? void 0 : _g[2]) == null ? void 0 : _h.canonical) != null ? _i : null; } if (index && index.head === "Hold") index = index.op1; if (index && index.head === "ReleaseHold") index = index.op1.evaluate(); index != null ? index : index = ce.symbol("Nothing"); if (!index.symbol) index = ce.error(["incompatible-domain", "Symbol", index.domain]); if (lower) lower = validateArgument(ce, lower, "Number"); if (upper) upper = validateArgument(ce, upper, "Number"); if (lower && upper) range = ce.tuple([index, lower, upper]); else if (upper) range = ce.tuple([index, ce._NEGATIVE_INFINITY, upper]); else if (lower) range = ce.tuple([index, lower]); else range = index; return ce._fn("Integrate", [body.canonical, range]); } } } } ]; var COLLECTIONS_LIBRARY = { Sequence: { signature: { domain: "Function" } } }; var COMPLEX_LIBRARY = [ { Real: { threadable: true, complexity: 1200, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const op3 = ops2[0].numericValue; if (op3 === null) return void 0; if (ce.isComplex(op3)) return ce.number(op3.re); return ops2[0]; } } }, Imaginary: { threadable: true, complexity: 1200, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const op3 = ops2[0].numericValue; if (op3 === null) return void 0; if (ce.isComplex(op3)) return ce.number(op3.im); return ce._ZERO; } } }, Argument: { threadable: true, complexity: 1200, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const op3 = ops2[0].numericValue; if (op3 === null) return void 0; if (ce.isComplex(op3)) return ce.number(op3.arg()); const f = asFloat(ops2[0]); if (f === null) return void 0; if (f >= 0) return ce.number(0); return ce.number(Math.PI); } } }, AbsArg: { threadable: true, complexity: 1200, signature: { domain: ["Function", "Number", "Tuple"], evaluate: (ce, ops2) => { const op3 = ops2[0].numericValue; if (op3 === null) return void 0; if (ce.isComplex(op3)) return ce.tuple([ce.number(op3.abs()), ce.number(op3.arg())]); const f = asFloat(ops2[0]); if (f === null) return void 0; return ce.tuple([ ce.number(Math.abs(f)), ce.number(f >= 0 ? 0 : Math.PI) ]); } } }, Conjugate: { threadable: true, complexity: 1200, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const op3 = ops2[0].numericValue; if (op3 === null || !ce.isComplex(op3)) return void 0; return ce.number(op3.conjugate()); } } }, ComplexRoots: { threadable: true, complexity: 1200, signature: { domain: ["Function", "Number", "Number", "List"], evaluate: (ce, ops2) => { const x = asFloat(ops2[0]); const n = asFloat(ops2[1]); if (x === null || n === null || !Number.isInteger(n) || n <= 0) return void 0; const roots = []; const [re, im] = ce.isComplex(x) ? [x.re, x.im] : [x, 0]; const arg = Math.atan2(im, re); const mod2 = Math.sqrt(re * re + im * im); for (let k = 0; k < n; k++) { const theta = (arg + 2 * Math.PI * k) / n; const r = Math.pow(mod2, 1 / n); roots.push([r * Math.cos(theta), r * Math.sin(theta)]); } return ce.box([ "List", ...roots.map( (r) => ce.number(r[1] !== 0 ? ce.complex(r[0], r[1]) : r[0]) ) ]); } } } // For Abs (magnitude) see src/compute-engine/library/processAbs } ]; function oneOf(xs) { return xs[Math.floor(Math.random() * xs.length)]; } function randomExpressionWithHead(head2, level) { if (head2 === "Add" || head2 === "Multiply") { const ops2 = []; let count = 1 + Math.floor(Math.random() * 12); while (count > 0) { ops2.push(randomExpression(level + 1)); count -= 1; } return [head2, ...ops2]; } if (head2 === "Divide" || head2 === "Power") { return [head2, randomExpression(level + 1), randomExpression(level + 1)]; } if (head2 === "Root") { return [head2, randomExpression(level + 1), randomExpression(10)]; } if (head2 === "trig") return randomTrig(); return [head2, randomExpression(level + 1)]; } function randomTrig() { return [ oneOf([ "Cos", "Sin", "Tan", "Sinh", "Arccos", "Arsinh", ["InverseFunction", "Cos"] ]), oneOf([ "Pi", "-1", "0", "1", ["Divide", "Pi", -5], ["Multiply", -2, ["Divide", "Pi", 11]], ["Multiply", "Half", "Pi"], ["Multiply", 5, "Pi"], ["Multiply", 12, "Pi"], ["Divide", "Pi", 5], ["Divide", "Pi", 9], ["Multiply", 5, ["Divide", "Pi", 9]], ["Multiply", 2, ["Divide", "Pi", 11]], ["Multiply", 2, ["Divide", "Pi", 3]] ]) ]; } function randomExpression(level) { level != null ? level : level = 1; if (level === 1) { const h = oneOf([ [ "Sqrt", [ "Multiply", 6, [ "Sum", ["Divide", 1, ["Power", "n", 2]], ["Triple", ["Hold", "n"], 1, { num: "+Infinity" }] ] ] ], "Add", "Add", "Add", "Add", "Add", "Multiply", "Multiply", "Multiply", "Multiply", "Divide", "Divide", "Divide", "Root", "Sqrt", "Subtract", "Negate", "trig" ]); if (typeof h === "string") return randomExpressionWithHead(h, 1); return h; } if (level === 2) { const r = Math.random(); if (r > 0.75) return randomExpression(1); if (r > 0.5) return randomExpression(3); const h = oneOf([ "Multiply", "Multiply", "Add", "Power", "trig", "Ln", "Exp" ]); return randomExpressionWithHead(h, 2); } return oneOf([ -12345e-9, -2, -2, -2, -3, -5, -6, -12, -1654e-60, 0, 0, 12345e-8, 1654e-60, 1, 2, 2, 2, 2, 3, 3, 5, 5, 6, 6, 1234.5678, 5678.1234, 10, 15, 18, 30, 60, 1234e54, "123456789.12345678912345e200", "987654321.12345678912345", ["Rational", -6, 10], ["Rational", -12, 15], ["Rational", -15, 12], ["Rational", 3, 5], ["Rational", 12, 15], ["Rational", 15, 12], "ExponentialE", // 'ImaginaryUnit', ["Sqrt", 3], ["Sqrt", 5], ["Sqrt", 15], ["Sqrt", 25], ["Complex", -1.1, 1.1], ["Complex", 4, 5], "x", "x", "x", "x", ["Add", "x", 1], ["Divide", "x", 3], ["Square", "x"], ["Power", "x", 3], ["Power", "x", 4], ["Subtract", "x", 1], ["Add", "x", 1], // 'a', // 'b', "Pi" ]); } var CORE_LIBRARY = [ { Nothing: { domain: "Nothing" } }, // // Data Structures // { List: { complexity: 8200, signature: { domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "List"] } }, KeyValuePair: { description: "A key/value pair", complexity: 8200, signature: { domain: [ "Function", "String", "Anything", ["Tuple", "String", "Anything"] ], codomain: (ce, args) => ce.domain(["Tuple", "String", args[1].domain]), canonical: (ce, args) => { var _a, _b; const key = validateArgument(ce, (_a = args[0]) == null ? void 0 : _a.canonical, "String"); const value = validateArgument(ce, (_b = args[1]) == null ? void 0 : _b.canonical, "Value"); return ce.tuple([key, value]); } } }, Single: { description: "A tuple with a single element", complexity: 8200, signature: { domain: ["Function", "Anything", ["Tuple", "Anything"]], codomain: (ce, args) => ce.domain(["Tuple", args[0].domain]), canonical: (ce, ops2) => ce.tuple(validateArgumentCount(ce, canonical(ops2), 1)) } }, Pair: { description: "A tuple of two elements", complexity: 8200, signature: { domain: [ "Function", "Anything", "Anything", ["Tuple", "Anything", "Anything"] ], codomain: (ce, args) => ce.domain(["Tuple", args[0].domain, args[1].domain]), canonical: (ce, ops2) => ce.tuple(validateArgumentCount(ce, canonical(ops2), 2)) } }, Triple: { description: "A tuple of three elements", complexity: 8200, signature: { domain: [ "Function", "Anything", "Anything", "Anything", ["Tuple", "Anything", "Anything", "Anything"] ], codomain: (ce, args) => ce.domain(["Tuple", args[0].domain, args[1].domain, args[2].domain]), canonical: (ce, ops2) => ce.tuple(validateArgumentCount(ce, canonical(ops2), 3)) } }, Tuple: { description: "A fixed number of heterogeneous elements", complexity: 8200, signature: { domain: [ "Function", ["Sequence", "Anything"], ["Tuple", ["Sequence", "Anything"]] ], canonical: (ce, ops2) => ce.tuple(canonical(ops2)), codomain: (ce, args) => ce.domain(["Tuple", ...args.map((x) => x.domain)]) } } }, // // Inert functions // { BaseForm: { description: "`BaseForm(expr, base=10)`", complexity: 9e3, inert: true, signature: { domain: ["Function", "Value", ["Maybe", "Integer"], "Value"], codomain: (_ce, args) => args[0].domain } }, Delimiter: { // Use to represent groups of expressions. Named after https://en.wikipedia.org/wiki/Delimiter complexity: 9e3, hold: "first", signature: { domain: [ "Function", "Anything", ["Maybe", "String"], ["Maybe", "String"], "Anything" ], codomain: (_ce, args) => args[0].domain, canonical: (ce, args) => { var _a, _b; return (_b = (_a = args[0]) == null ? void 0 : _a.canonical) != null ? _b : ce.box(["Sequence"]); } } }, Error: { /** * - The first argument is either a string or an `["ErrorCode"]` * expression indicating the nature of the error. * - The second argument, if present, indicates the context/location * of the error. If the error occur while parsing a LaTeX string, * for example, the argument will be a `Latex` expression. */ complexity: 500, signature: { domain: ["Function", "Anything", ["Maybe", "Anything"], "Void"], // To make a canonical expression, don't canonicalize the args canonical: (ce, args) => ce._fn("Error", args) } }, ErrorCode: { complexity: 500, hold: "all", signature: { domain: [ "Function", "String", ["Maybe", ["Sequence", "Anything"]], "Anything" ], canonical: (ce, args) => { var _a, _b; const code = validateArgument(ce, args[0], "String").string; if (code === "incompatible-domain") { return ce._fn("ErrorCode", [ ce.string(code), ce.domain((_a = args[1]) != null ? _a : "Anything"), ce.domain((_b = args[2]) != null ? _b : "Anything") ]); } return ce._fn("ErrorCode", args); } } }, Hold: { hold: "all", signature: { domain: "Function", codomain: (ce, args) => args[0].symbol ? ce.domain("Symbol") : ce.domain("Anything"), // To make a canonical expression, don't canonicalize the args canonical: (ce, args) => args.length !== 1 ? ce._fn("Hold", validateArgumentCount(ce, args, 1)) : ce._fn("Hold", [validateArgument(ce, args[0], "Anything")]) } }, HorizontalSpacing: { signature: { domain: "Function", canonical: (ce, args) => { if (args.length === 2) return args[0].canonical; return ce.box(["Sequence"]); } } }, Style: { complexity: 9e3, inert: true, signature: { domain: [ "Function", "Anything", ["Maybe", "Dictionary"], // @todo "Anything" ] } // @todo: simplify: merge Style(Style(x, s1), s2), Style(x) -> x } }, { Apply: { signature: { domain: "Function", evaluate: (_ce, ops2) => apply(ops2[0], ops2.slice(1)) } }, About: { signature: { domain: "Function" } }, Block: { /** Create a local scope. First argument is a dictionary of local variables. * They are evaluated in the context of the parent scope. The second argument * is an expression to be evaluated in the context of the new scope. * ["Block", ["List", ["Equal", "x", 1]], [...]] */ signature: { domain: "Function" } }, Derivative: { signature: { domain: ["Function", "Function", ["Maybe", "Number"], "Function"] } }, Domain: { /** Return the domain of an expression */ signature: { domain: ["Function", "Anything", "Domain"], canonical: (ce, ops2) => ce.domain(validateArgumentCount(ce, canonical(ops2), 1)[0]) } }, Evaluate: { hold: "all", signature: { domain: ["Function", "Anything", "Anything"], codomain: (_ce, args) => args[0].domain, canonical: (ce, ops2) => ce._fn("Evaluate", validateArgumentCount(ce, canonical(ops2), 1)), evaluate: (_ce, ops2) => ops2[0].evaluate() } }, Head: { signature: { domain: "Function", evaluate: (ce, ops2) => { var _a; const op12 = ops2[0]; if (typeof (op12 == null ? void 0 : op12.head) === "string") return ce.symbol(op12.head); return (_a = op12 == null ? void 0 : op12.head) != null ? _a : ce.symbol("Nothing"); } } }, Html: { signature: { domain: ["Function", "Value", "String"], evaluate: (ce, ops2) => { if (ops2.length === 0) return ce.string(""); return ce.string(""); } } }, Lambda: { wikidata: "Q567612", hold: "all", signature: { domain: ["Function", "Anything", "Function"], codomain: (_ce, ops2) => ops2[0].domain, canonical: (ce, ops2) => ce._fn("Lambda", validateArgumentCount(ce, ops2, 1)) } }, Signatures: { signature: { domain: ["Function", "Symbol", ["Maybe", ["List", "Domain"]]], canonical: (ce, ops2) => { ops2 = validateArgumentCount(ce, ops2, 1); if (!ops2[0].symbol) return ce._fn("Signatures", [ ce.error( ["incompatible-domain", "Symbol", ops2[0].domain], ops2[0] ) ]); return ce._fn("Signatures", ops2); }, evaluate: (ce, ops2) => { const name = ops2[0].symbol; if (!name) return ce.symbol("Nothing"); const result = ce.lookupFunction(name); if (!result) return ce.symbol("Nothing"); return ce.fn("List", [result.signature.domain]); } } }, Subscript: { /** * The `Subscript` function can take several forms: * * If `op1` is a string, the string is interpreted as a number in * base `op2` (2 to 36). * * If `op1` is an indexable collection, `x`: * - `x_*` -> `At(x, *)` * * Otherwise: * - `x_0` -> Symbol "x_0" * - `x_n` -> Symbol "x_n" * - `x_{\text{max}}` -> Symbol `x_max` * - `x_{(n+1)}` -> `At(x, n+1)` * - `x_{n+1}` -> `Subscript(x, n+1)` */ // The last (subscript) argument can include a delimiter that // needs to be interpreted. Without the hold, it would get // removed during canonicalization. hold: "last", signature: { domain: ["Function", "Anything", "Anything", "Anything"], codomain: (_ce, args) => { if (args[0].isFunction) return args[0].domain; return args[0].domain; }, canonical: (ce, args) => { var _a, _b, _c, _d; const op12 = args[0]; const op22 = args[1]; if (op12.string) { const base = asSmallInteger(op22); if (base !== null) { if (base > 1 && base <= 36) { const [value, rest] = fromDigits(op12.string, base); if (rest) { return ce.error( ["unexpected-digit", { str: rest[0] }], ["Latex", ce.string(op12.string)] ); } return ce.number(value); } } } if (op12.symbol) { if ((_a = op12.symbolDefinition) == null ? void 0 : _a.at) return ce._fn("At", [op12, op22.canonical]); const sub2 = (_d = (_b = op22.string) != null ? _b : op22.symbol) != null ? _d : (_c = asSmallInteger(op22)) == null ? void 0 : _c.toString(); if (sub2) return ce.symbol(op12.symbol + "_" + sub2); } if (op22.head === "Sequence") ce._fn("Subscript", [op12, ce._fn("List", op22.ops)]); return ce._fn("Subscript", args); } } }, Symbol: { complexity: 500, description: "Construct a new symbol with a name formed by concatenating the arguments", threadable: true, hold: "all", signature: { domain: ["Function", ["Sequence", "Anything"], "Anything"], canonical: (ce, ops2) => { if (ops2.length === 0) return ce.symbol("Nothing"); const arg = ops2.map( (x) => { var _a, _b, _c, _d; return (_d = (_c = (_a = x.symbol) != null ? _a : x.string) != null ? _c : (_b = asSmallInteger(x)) == null ? void 0 : _b.toString()) != null ? _d : ""; } ).join(""); if (arg.length > 0) return ce.symbol(arg); return ce.symbol("Nothing"); } // Note: a `["Symbol"]` expression is never evaluated, it gets // transformed into something else (a symbol) during canonicalization } }, Tail: { signature: { domain: ["Function", "Value", ["List", "Value"]], evaluate: (ce, ops2) => { var _a; return ops2[0] ? ce._fn("List", (_a = ops2[0].ops) != null ? _a : []) : ce._fn("List", []); } } }, Timing: { description: "`Timing(expr)` evaluates `expr` and return a `Pair` of the number of second elapsed for the evaluation, and the value of the evaluation", signature: { domain: [ "Function", "Value", ["Maybe", "Integer"], ["Tuple", "Value", "Number"] ], evaluate: (ce, ops2) => { var _a; if (ops2[1].symbol === "Nothing") { const start = globalThis.performance.now(); const result2 = ops2[0].evaluate(); const timing = 1e3 * (globalThis.performance.now() - start); return ce.pair(ce.number(timing), result2); } let n = Math.max(3, Math.round((_a = asSmallInteger(ops2[1])) != null ? _a : 3)); let timings = []; let result; while (n > 0) { const start = globalThis.performance.now(); result = ops2[0].evaluate(); timings.push(1e3 * (globalThis.performance.now() - start)); n -= 1; } const max2 = Math.max(...timings); const min2 = Math.min(...timings); timings = timings.filter((x) => x > min2 && x < max2); const sum2 = timings.reduce((acc, v) => acc + v, 0); if (sum2 === 0) return ce.pair(ce.number(max2), result); return ce.pair(ce.number(sum2 / timings.length), result); } } } // {name: 'Pattern',}, }, // // String-related // { FromDigits: { description: `\`FromDigits(s, base=10)\` return an integer representation of the string \`s\` in base \`base\`.`, // @todo could accept `0xcafe`, `0b01010` or `(deadbeef)_16` as string formats // @todo could accept "roman"... as base // @todo could accept optional third parameter as the (padded) length of the output signature: { domain: ["Function", "String", ["Maybe", ["Range", 1, 36]], "Integer"], evaluate: (ce, ops2) => { const op12 = ops2[0]; if (!op12.string) return ce.error(["incompatible-domain", "String", op12.domain], op12); const op22 = ops2[1]; if (op22.isNothing) return ce.number(Number.parseInt(op12.string, 10)); if (op22.numericValue === null) { return ce.error(["unexpected-base", op22.latex], op22); } const base = asFloat(op22); if (!Number.isInteger(base) || base < 2 || base > 36) return ce.error(["unexpected-base", base], op22); const [value, rest] = fromDigits(op12.string, base); if (rest) return ce.error(["unexpected-digit", { str: rest[0] }], { str: rest }); return ce.number(value); } } }, IntegerString: { description: `\`IntegerString(n, base=10)\` return a string representation of the integer \`n\` in base \`base\`.`, // @todo could accept `0xcafe`, `0b01010` or `(deadbeef)_16` as string formats // @todo could accept "roman"... as base // @todo could accept optional third parameter as the (padded) length of the output signature: { domain: ["Function", "Integer", ["Maybe", "Integer"], "String"], evaluate: (ce, ops2) => { var _a, _b; const op12 = ops2[0]; const val = (_a = asFloat(op12)) != null ? _a : NaN; if (Number.isNaN(val) || !Number.isInteger(val)) { return ce.error( ["incompatible-domain", "Integer", op12.domain], op12 ); } const op22 = ops2[1]; if (op22.isNothing) { const op1Num = op12.numericValue; if (typeof op1Num === "number") return ce.string(Math.abs(op1Num).toString()); if (op1Num instanceof decimal_default) return ce.string(op1Num.abs().toString()); return ce.string( Math.abs(Math.round((_b = asFloat(op12)) != null ? _b : NaN)).toString() ); } if (asSmallInteger(op22) === null) { return ce.error( ["incompatible-domain", "Integer", op22.domain], op22 ); } const base = asSmallInteger(op22); if (base < 2 || base > 36) return ce.error(["out-of-range", 2, 36, base], op22); return ce.string(Math.abs(val).toString(base)); } } }, String: { threadable: true, signature: { domain: ["Function", ["Maybe", "Anything"], "String"], evaluate: (ce, ops2) => { if (ops2.length === 0) return ce.string(""); return ce.string(ops2.map((x) => { var _a; return (_a = x.string) != null ? _a : x.toString(); }).join("")); } } } }, // // LaTeX-related // { // Join or more LatexTokens into a LaTeX string JoinLatexTokens: { signature: { domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "String"], evaluate: (ce, ops2) => { return ce.fn("Latex", [ ce.string(tokensToString(ops2.map((x) => { var _a; return (_a = x.string) != null ? _a : x.latex; }))) ]); } } }, // Value preserving type conversion/tag indicating the string // is a LaTeX string Latex: { signature: { domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "String"], evaluate: (ce, ops2) => { if (ops2.length === 0) return ce.string(""); return ce.string(joinLatex(ops2.map((x) => { var _a; return (_a = x.string) != null ? _a : x.toString(); }))); } } }, // Serialize one or more expressions to LaTeX SerializeLatex: { hold: "all", signature: { domain: ["Function", ["Maybe", ["Sequence", "Anything"]], "String"], evaluate: (ce, ops2) => ce.fn("Latex", [ce.string(joinLatex(ops2.map((x) => x.latex)))]) } }, SplitAsLatexTokens: { description: "Split a LaTeX string into a list of LaTeX tokens", hold: "all", signature: { domain: ["Function", ["Maybe", "Anything"], ["List", "String"]], evaluate: (ce, ops2) => { var _a; if (ops2.length === 0) return ce._fn("List", []); let latex = ""; if (ops2[0].head === "Latex") latex = (_a = ops2[0].op1.string) != null ? _a : ""; else if (ops2[0].head === "LatexString") latex = joinLatex(ops2[0].ops.map((op3) => op3.latex)); else latex = ops2[0].latex; return ce._fn( "List", tokenize(latex, []).map((x) => ce.string(x)) ); } } }, ParseLatex: { description: "Parse a LaTeX string and evaluate to a corresponding expression", signature: { domain: ["Function", ["Maybe", "String"], "Anything"], evaluate: (ce, ops2) => { var _a; if (ops2.length === 0 || !ops2[0].string) return ce.box(["Sequence"]); return (_a = ce.parse(ops2[0].string)) != null ? _a : ce.box(["Sequence"]); } } } }, { RandomExpression: { signature: { domain: "Function", evaluate: (ce, _ops) => ce.box(randomExpression()) } } } ]; var LOGIC_LIBRARY = { True: { wikidata: "Q16751793", domain: "Boolean", constant: true }, False: { wikidata: "Q5432619", domain: "Boolean", constant: true }, Maybe: { wikidata: "Q781546", domain: "MaybeBoolean", constant: true }, // @todo: specify a `canonical` function that converts boolean // expressions into CNF (Conjunctive Normal Form) // https://en.wikipedia.org/wiki/Conjunctive_normal_form // using rules (with a rule set that's kinda the inverse of the // logic rules for simplify) And: { wikidata: "Q191081", threadable: true, associative: true, commutative: true, idempotent: true, complexity: 1e4, signature: { domain: "LogicOperator", simplify: processAnd, evaluate: processAnd } }, Or: { wikidata: "Q1651704", threadable: true, associative: true, commutative: true, idempotent: true, complexity: 1e4, signature: { domain: "LogicOperator", simplify: processOr, evaluate: processOr } }, Not: { wikidata: "Q190558", involution: true, complexity: 10100, // @todo: this may not be needed, since we also have rules. signature: { domain: "LogicOperator", simplify: processNot, evaluate: processNot } }, Equivalent: { wikidata: "Q220433", complexity: 10200, signature: { domain: "LogicOperator", simplify: processEquivalent, evaluate: processEquivalent } }, Implies: { wikidata: "Q7881229", complexity: 10200, signature: { domain: "LogicOperator", simplify: processImplies, evaluate: processImplies } }, Exists: { signature: { domain: "MaybeBoolean" } }, If: { hold: "rest", signature: { domain: "Function", codomain: (ce, ops2) => ce.domain(["Union", ops2[0], ops2[1]]), simplify: (ce, ops2) => { const cond = ops2[0]; if (cond && cond.symbol === "True") return ops2[1] ? ops2[1].simplify() : ce.box("Nothing"); return ops2[2] ? ops2[2].simplify() : ce.box("Nothing"); }, evaluate: (ce, ops2) => { const cond = ops2[0]; if (cond && cond.symbol === "True") return ops2[1] ? ops2[1].evaluate() : ce.box("Nothing"); return ops2[2] ? ops2[2].evaluate() : ce.box("Nothing"); }, // @todo: probably don't need a N() handler. Doesn't make a difference // for the evaluation of booleans. Also, don't need to call N() on the // arguments, the caller should have done that. Same for evaluate() // and simplify() above N: (ce, ops2) => { const cond = ops2[0]; if (cond && cond.symbol === "True") return ops2[1] ? ops2[1].N() : ce.box("Nothing"); return ops2[2] ? ops2[2].N() : ce.box("Nothing"); } } }, Loop: { hold: "all", signature: { domain: "Function", simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = ops2[0]) == null ? void 0 : _a.simplify()) != null ? _b : ce.box("Nothing"); }, evaluate: (ce, ops2) => { var _a; const body = (_a = ops2[0]) != null ? _a : ce.box("Nothing"); if (body.isNothing) return body; let result; let i = 0; do { result = body.evaluate(); i += 1; } while (result.head !== "Return" && i < ce.iterationLimit); if (result.head === "Return") return result.op1; return ce.error("iteration-limit-exceeded"); }, N: (ce, ops2) => { const cond = ops2[0]; if (cond && cond.symbol === "True") return ops2[1] ? ops2[1].N() : ce.box("Nothing"); return ops2[2] ? ops2[2].N() : ce.box("Nothing"); } } }, Which: { hold: "all", signature: { domain: "Function", codomain: (ce, ops2) => domainWhich(ce, ops2), evaluate: (ce, ops2) => whichEvaluate(ce, ops2, "evaluate"), N: (ce, ops2) => whichEvaluate(ce, ops2, "N") } } }; function processAnd(ce, args) { if (args.length === 0) return ce.symbol("True"); const ops2 = []; for (const arg of args) { if (arg.symbol === "False") return ce.symbol("False"); if (arg.symbol !== "True") { let duplicate = false; for (const x of ops2) { if (x.isSame(arg)) { duplicate = true; } else if (arg.head === "Not" && arg.op1.isSame(x) || x.head === "Not" && x.op1.isSame(arg)) { return ce.symbol("False"); } } if (!duplicate) ops2.push(arg); } } if (ops2.length === 0) return ce.symbol("True"); if (ops2.length === 1) return ops2[0]; return ce._fn("And", ops2); } function processOr(ce, args) { if (args.length === 0) return ce.symbol("True"); const ops2 = []; for (const arg of args) { if (arg.symbol === "True") return ce.symbol("True"); if (arg.symbol !== "False") { let duplicate = false; for (const x of ops2) { if (x.isSame(arg)) { duplicate = true; } else if (arg.head === "Not" && arg.op1.isSame(x) || x.head === "Not" && x.op1.isSame(arg)) { return ce.symbol("True"); } } if (!duplicate) ops2.push(arg); } } if (ops2.length === 0) return ce.symbol("True"); if (ops2.length === 1) return ops2[0]; return ce._fn("Or", ops2); } function processNot(ce, args) { const op12 = args[0].symbol; if (op12 === "True") return ce.symbol("False"); if (op12 === "False") return ce.symbol("True"); if (op12 === "Maybe") return ce.symbol("Maybe"); return void 0; } function processEquivalent(ce, args) { const lhs = args[0].symbol; const rhs = args[1].symbol; if (lhs === "True" && rhs === "True" || lhs === "False" && rhs === "False") return ce.symbol("True"); if (lhs === "True" && rhs === "False" || lhs === "False" && rhs === "True") return ce.symbol("False"); if (lhs === "Maybe" || rhs === "Maybe") return ce.symbol("Maybe"); return void 0; } function processImplies(ce, args) { const lhs = args[0].symbol; const rhs = args[1].symbol; if (lhs === "True" && rhs === "True" || lhs === "False" && rhs === "False" || lhs === "False" && rhs === "True") return ce.symbol("True"); if (lhs === "True" && rhs === "False") return ce.symbol("False"); if (lhs === "Maybe" || rhs === "Maybe") return ce.symbol("Maybe"); return void 0; } function domainWhich(ce, args) { let dom = null; for (let i = 1; i <= args.length - 1; i += 2) { if (!dom) dom = args[i].domain; else dom = sharedAncestorDomain(dom, args[i].domain); } return dom != null ? dom : ce.domain("Nothing"); } function whichEvaluate(ce, args, mode) { let i = 0; while (i < args.length - 1) { if (args[i].evaluate().symbol === "True") { if (!args[i + 1]) return ce.symbol("Undefined"); return mode === "N" ? args[i + 1].N() : args[i + 1].evaluate(); } i += 2; } return ce.symbol("Undefined"); } var POLYNOMIALS_LIBRARY = [ { Expand: { description: "Expand out products and positive integer powers", signature: { domain: ["Function", "Value", "Value"], evaluate: (_ce, ops2) => { var _a; return (_a = expand2(ops2[0])) != null ? _a : ops2[0]; } } }, Distribute: { description: "Distribute multiplication over addition", signature: { domain: ["Function", "Value", "Value"], evaluate: (ce, ops2) => { var _a, _b; const h = ops2[0].head; if (h === "Multiply") return (_a = distribute(ops2[0].ops)) != null ? _a : ops2[0]; if (h === "Negate") return (_b = distribute([ce._NEGATIVE_ONE, ...ops2[0].ops])) != null ? _b : ops2[0]; if (h === "Divide" && ops2[0].ops[0].head === "Multiply") { const numerator = distribute(ops2[0].ops); const denominator = ops2[0].ops[1]; if (numerator) { if (numerator.head === "Add") return ce.add( numerator.ops.map((x) => ce.div(x, denominator)) ); return ce.div(numerator, denominator); } } return ops2[0]; } } } } ]; var RELOP_LIBRARY = { Equal: { commutative: true, complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, ops2) => { return ce._fn( "Equal", flattenOps(canonical(flattenSequence(ops2)), "Equal") ); }, evaluate: (ce, ops2) => { if (ops2.length < 2) return ce.symbol("True"); let lhs = void 0; for (const arg of ops2) { if (!lhs) lhs = arg; else { const test = lhs.isEqual(arg); if (test !== true) return ce.symbol("False"); } } return ce.symbol("True"); } } }, NotEqual: { wikidata: "Q28113351", commutative: true, complexity: 11e3, signature: { domain: "RelationalOperator", evaluate: (ce, ops2) => { if (ops2.length < 2) return ce.symbol("False"); let lhs = void 0; for (const arg of ops2) { if (!lhs) lhs = arg; else { const test = lhs.isEqual(arg); if (test === true) return ce.symbol("False"); } } return ce.symbol("True"); } } }, Less: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, ops2) => ce._fn("Less", flattenOps(canonical(flattenSequence(ops2)), "Less")), evaluate: (ce, ops2) => { if (ops2.length < 2) return ce.symbol("True"); let lhs = void 0; for (const arg of ops2) { if (!arg.isNumber) return void 0; if (!lhs) lhs = arg; else { const test = ce.fn("Subtract", [arg, lhs]).N().sgn; if (test === null || test === void 0) return void 0; if (test <= 0) return ce.symbol("False"); lhs = arg; } } return ce.symbol("True"); } } }, NotLess: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("Less", args)]) } }, Greater: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Less", args.reverse()), evaluate: (ce, ops2) => { if (ops2.length < 2) return ce.symbol("True"); let lhs = void 0; for (const arg of ops2) { if (!arg.isNumber) return void 0; if (!lhs) lhs = arg; else { const test = ce.fn("Subtract", [arg, lhs]).N().sgn; if (test === null || test === void 0) return void 0; if (test >= 0) return ce.symbol("False"); lhs = arg; } } return ce.symbol("True"); } } }, NotGreater: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("Greater", args)]) } }, LessEqual: { complexity: 11e3, signature: { domain: "RelationalOperator", evaluate: (ce, ops2) => { if (ops2.length < 2) return ce.symbol("True"); let lhs = void 0; for (const arg of ops2) { if (!arg.isNumber) return void 0; if (!lhs) lhs = arg; else { const test = ce.fn("Subtract", [arg, lhs]).N().sgn; if (test === null || test === void 0) return void 0; if (test < 0) return ce.symbol("False"); lhs = arg; } } return ce.symbol("True"); } } }, NotLessNotEqual: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("LessEqual", args)]) } }, GreaterEqual: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("LessEqual", args.reverse()), evaluate: (ce, ops2) => { if (ops2.length < 2) return ce.symbol("True"); let lhs = void 0; for (const arg of ops2) { if (!arg.isNumber) return void 0; if (!lhs) lhs = arg; else { const test = ce.fn("Subtract", [arg, lhs]).N().sgn; if (test === null || test === void 0) return void 0; if (test > 0) return ce.symbol("False"); lhs = arg; } } return ce.symbol("True"); } } }, NotGreaterNotEqual: { complexity: 11e3, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("GreaterEqual", args)]) } }, TildeFullEqual: { description: "Indicate isomorphism, congruence and homotopic equivalence", signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotTildeFullEqual: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("TildeFullEqual", args)]) } }, TildeEqual: { description: "Approximately or asymptotically equal", complexity: 11e3, signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotTildeEqual: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("TildeEqual", args)]) } }, Approx: { complexity: 11100, signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotApprox: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("Approx", args)]) } }, ApproxEqual: { complexity: 11100, signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotApproxEqual: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("ApproxEqual", args)]) } }, ApproxNotEqual: { complexity: 11100, signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotApproxNotEqual: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("ApproxNotEqual", args)]) } }, Precedes: { complexity: 11100, signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotPrecedes: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("Precedes", args)]) } }, Succeeds: { signature: { domain: "RelationalOperator" } // @todo evaluate: (ce, ...args: BoxedExpression[]) => SemiBoxedExpression {} }, NotSucceeds: { complexity: 11100, signature: { domain: "RelationalOperator", canonical: (ce, args) => ce._fn("Not", [ce._fn("Succeeds", args)]) } } }; var SETS_LIBRARY = { // // Constants // EmptySet: { domain: "Set", constant: true, wikidata: "Q226183" // contains: () => false, // @todo not quite true... // includes: () => true, // The empty set is a subset of every set }, // // Predicates // Element: { complexity: 11200, hold: "all", signature: { domain: "Predicate", canonical: (ce, args) => { args = validateArgumentCount(ce, flattenSequence(canonical(args)), 2); if (args.length === 2 && isValidDomain(args[1])) return ce._fn("Element", [args[0], ce.domain(args[1])]); return ce._fn("Element", args); }, evaluate: (ce, args) => evaluateElement(ce, args) } }, NotElement: { complexity: 11200, hold: "all", signature: { domain: "Predicate", canonical: (ce, args) => ce.fn("Not", [ce.fn("Element", args)]) } }, Subset: { complexity: 11200, signature: { domain: "Predicate" } }, NotSubset: { complexity: 11200, signature: { domain: "Predicate", canonical: (ce, args) => ce.fn("Not", [ce.fn("Subset", args)]) } }, Superset: { complexity: 11200, signature: { domain: "Predicate" } }, SupersetEqual: { complexity: 11200, signature: { domain: "Predicate" } }, NotSuperset: { complexity: 11200, signature: { domain: "Predicate", canonical: (ce, args) => ce.fn("Not", [ce.fn("Superset", args)]) } }, NotSupersetEqual: { complexity: 11200, signature: { domain: "Predicate", canonical: (ce, args) => ce.fn("Not", [ce.fn("SupersetEqual", args)]) } }, SubsetEqual: { complexity: 11200, signature: { domain: "Predicate" } // evaluate: subsetEqual, }, NotSubsetNotEqual: { complexity: 11200, signature: { domain: "Predicate", canonical: (ce, args) => ce.fn("Not", [ce.fn("SubsetEqual", args)]) } }, // // Functions // CartesianProduct: { // Aka the product set, the set direct product or cross product // Notation: \times wikidata: "Q173740", signature: { domain: ["Function", "Set", ["Sequence", "Set"], "Set"] } // evaluate: cartesianProduct, }, Complement: { // Return the elements of the first argument that are not in any of // the subsequent lists wikidata: "Q242767", signature: { domain: ["Function", "Set", "Set"] } }, Intersection: { // notation: \cap wikidata: "Q185837", threadable: true, associative: true, commutative: true, involution: true, signature: { domain: ["Function", "Set", ["Sequence", "Set"], "Set"], evaluate: intersection } }, Union: { // Works on set, but can also work on lists wikidata: "Q185359", threadable: true, associative: true, commutative: true, involution: true, signature: { domain: ["Function", "Set", ["Sequence", "Set"], "Set"], evaluate: union } }, // { // name: 'Set', // domain: ['Function', ['Sequence', 'Anything'], 'Set'], // // @todo! set has multiple forms // // Set(Sequence) // // Set(Sequence, Condition) // // Set(Set, Condition) // }, // disjoint union Q842620 ⊔ SetMinus: { wikidata: "Q18192442", signature: { domain: ["Function", "Set", "Value", "Set"], evaluate: setMinus } }, SymmetricDifference: { // symmetric difference = disjunctive union (circled minus) /* = Union(Complement(a, b), Complement(b, a) */ /* Corresponds to XOR in boolean logic */ wikidata: "Q1147242", signature: { domain: ["Function", "Set", ["Sequence", "Set"], "Set"] } } }; function union(ce, _ops) { return ce.symbol("False"); } function intersection(ce, _ops) { return ce.symbol("EmptySet"); } function setMinus(ce, _ops) { return ce.symbol("EmptySet"); } function evaluateElement(ce, ops2) { /* @__PURE__ */ console.assert(ops2.length === 2); const [lhs, rhs] = ops2; if (rhs.string) { if (lhs.string && rhs.string.includes(lhs.string)) return ce.symbol("True"); return ce.symbol("False"); } if (rhs.keys) { if (lhs.string) { for (const key of rhs.keys) if (key === lhs.string) return ce.symbol("True"); } return ce.symbol("False"); } if (rhs.head === "List") { if (lhs.head === "List") { let found = false; for (let i = 0; i < 1 + (rhs.nops - lhs.nops); ++i) { found = true; for (let j = 0; j < lhs.nops; ++j) { if (!rhs.ops[i + j].isEqual(lhs.ops[j])) { found = false; break; } } if (found) return ce.symbol("True"); } return ce.symbol("False"); } const val = lhs.head === "Hold" ? lhs.op1 : lhs; for (const elem of rhs.ops) if (val.isEqual(elem)) return ce.symbol("True"); return ce.symbol("False"); } if (isValidDomain(rhs)) { if (lhs.domain.isCompatible(ce.domain(rhs))) return ce.symbol("True"); return ce.symbol("False"); } return ce._fn("Element", [lhs, rhs]); } var STATISTICS_LIBRARY = [ { Mean: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { let sum2 = 0; let count = 0; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; sum2 += v; count++; } if (count === 0) return ce._NAN; return ce.number(sum2 / count); } } }, Median: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { const values = []; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; values.push(v); } if (values.length === 0) return ce._NAN; values.sort((a, b) => a - b); const mid = Math.floor(values.length / 2); if (values.length % 2 === 0) return ce.number((values[mid - 1] + values[mid]) / 2); return ce.number(values[mid]); } } }, Variance: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { let sum2 = 0; let sum22 = 0; let count = 0; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; sum2 += v; sum22 += v * v; count++; } if (count === 0) return ce._NAN; return ce.number((sum22 - sum2 * sum2 / count) / (count - 1)); } } }, StandardDeviation: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { let sum2 = 0; let sum22 = 0; let count = 0; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; sum2 += v; sum22 += v * v; count++; } if (count === 0) return ce._NAN; return ce.number( Math.sqrt((sum22 - sum2 * sum2 / count) / (count - 1)) ); } } }, Kurtosis: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { let sum2 = 0; let sum22 = 0; let sum4 = 0; let count = 0; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; sum2 += v; sum22 += v * v; sum4 += v * v * v * v; count++; } if (count === 0) return ce._NAN; const s2 = (sum22 - sum2 * sum2 / count) / (count - 1); const s4 = (sum4 - sum22 * sum22 / count) / (count - 1); return ce.number((s4 / (s2 * s2) - 3) * (count * (count + 1)) / 6); } } }, Skewness: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { let sum2 = 0; let sum22 = 0; let sum3 = 0; let count = 0; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; sum2 += v; sum22 += v * v; sum3 += v * v * v; count++; } if (count === 0) return ce._NAN; const s2 = (sum22 - sum2 * sum2 / count) / (count - 1); const s3 = (sum3 - sum22 * sum2 / count) / (count - 1); return ce.number(s3 / Math.pow(s2, 3 / 2) * Math.sqrt(count * 1)); } } }, Mode: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { var _a; const values = []; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; values.push(v); } if (values.length === 0) return ce._NAN; values.sort((a, b) => a - b); const counts = {}; for (const v of values) { counts[v] = ((_a = counts[v]) != null ? _a : 0) + 1; } let max2 = 0; let mode = values[0]; for (const v of values) { const c = counts[v]; if (c > max2) { max2 = c; mode = v; } } return ce.number(mode); } } }, Quartiles: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "List"], evaluate: (ce, ops2) => { const values = []; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; values.push(v); } if (values.length === 0) return ce._NAN; values.sort((a, b) => a - b); const mid = Math.floor(values.length / 2); const lower = values.slice(0, mid); const upper = values.slice(mid + 1); return ce.box([ "List", ce.number(values[mid]), ce.number(lower[Math.floor(lower.length / 2)]), ce.number(upper[Math.floor(upper.length / 2)]) ]); } } }, InterquartileRange: { complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { const values = []; for (const op3 of each(ops2)) { const v = asFloat(op3); if (v === null) return void 0; values.push(v); } if (values.length === 0) return ce._NAN; values.sort((a, b) => a - b); const mid = Math.floor(values.length / 2); const lower = values.slice(0, mid); const upper = values.slice(mid + 1); return ce.number( upper[Math.floor(upper.length / 2)] - lower[Math.floor(lower.length / 2)] ); } } }, Count: { threadable: true, complexity: 1200, signature: { domain: ["Function", ["Sequence", "Value"], "Number"], evaluate: (ce, ops2) => { let count = 0; for (const _op of each(ops2)) count++; return ce.number(count); } } }, Erf: { complexity: 7500, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const x = asFloat(ops2[0]); if (x === null) return void 0; return ce.number(erf(x)); } } }, Erfc: { complexity: 7500, signature: { domain: ["Function", "Number", "Number"], evaluate: (ce, ops2) => { const x = asFloat(ops2[0]); if (x === null) return void 0; return ce.number(1 - erf(x)); } } } } ]; function* each(ops2) { var _a, _b, _c, _d, _e; if (ops2.length === 0) return; const ce = ops2[0].engine; for (const op3 of ops2) { const h = op3.head; if (h === "Range") { let lower = asFloat(op3[1]); if (lower === null) return; let upper = asFloat(op3[2]); if (upper === null) { upper = lower; lower = 1; } if (lower > upper) { const step2 = (_b = asFloat((_a = op3[3]) != null ? _a : -1)) != null ? _b : -1; if (step2 >= 0) return; for (let i = lower; i <= upper; i += step2) yield ce.number(i); return; } const step = (_d = asFloat((_c = op3[3]) != null ? _c : 1)) != null ? _d : 1; if (step <= 0) return; for (let i = lower; i <= upper; i += step) yield ce.number(i); return; } if (h === "Linspace") { let start = asFloat(op3[1]); if (start === null) return; let stop = asFloat(op3[2]); if (stop === null) { stop = start; start = 0; } const num = (_e = asFloat(op3[3])) != null ? _e : 50; if (!Number.isInteger(num)) return; if (num <= 0) return; const step = (stop - start) / (num - 1); for (let i = start; i <= stop; i += step) yield ce.number(i); return; } if (typeof h === "string" && /^(List|Sequence|Tuple|Single|Pair|Triple)$/.test(h)) { yield* each(op3.ops); return; } yield op3; } } var domainNumberToRealNumber = (_head) => { return ["Function", "Number", "ExtendedRealNumber"]; }; var trigFunction = (_head) => { return ["Function", "Number", "Number"]; }; var hyperbolicFunction = (_head) => { return ["Function", "Number", "Number"]; }; var TRIGONOMETRY_LIBRARY = [ { // // Constants // Pi: { domain: "TranscendentalNumber", flags: { algebraic: false }, constant: true, holdUntil: "N", wikidata: "Q167", value: (engine) => bignumPreferred(engine) ? engine._BIGNUM_PI : Math.PI } }, { // sqrt(x*x + y*y) Degrees: { /* = Pi / 180 */ signature: { domain: ["Function", "Number", "Number"], canonical: (ce, ops2) => { ops2 = validateArguments(ce, flattenSequence(canonical(ops2)), [ "Number" ]); if (ops2.length !== 1) return ce.fn("Degrees", ops2, { canonical: false }); const arg = ops2[0]; if (arg.numericValue === null || !arg.isValid) return ce.fn("Degrees", ops2, { canonical: false }); return ce.div(ce.mul([arg, ce.symbol("Pi")]), ce.number(180)); }, evaluate: (ce, ops2) => ce.mul([ops2[0], ce.div(ce.symbol("Pi"), ce.number(180))]) } }, Hypot: { signature: { domain: ["Function", "Number", "Number", "NonNegativeNumber"], simplify: (ce, ops2) => ce.box(["Sqrt", ["Add", ["Square", ops2[0]], ["Square", ops2[1]]]]).simplify(), evaluate: [ "Lambda", ["Sqrt", ["Add", ["Square", "_1"], ["Square", "_2"]]] ] } }, Sin: { complexity: 5e3, signature: { domain: ["Function", "Number", ["Interval", -1, 1]], simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Sin", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : complexAllowed(ce) ? ce.box([ "Divide", [ "Subtract", ["Exp", ["Multiply", "ImaginaryUnit", ops2[0]]], ["Exp", ["Multiply", "ImaginaryUnit", ["Negate", ops2[0]]]] ], ["Complex", 0, 2] ]).simplify() : void 0; }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sin", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Sin", ops2[0]) } } }, { // // Basic trigonometric function // (may be used in the definition of other functions below) // Arctan: { wikidata: "Q2257242", complexity: 5200, signature: { domain: domainNumberToRealNumber("Arctan"), simplify: (ce, ops2) => { var _a; return (_a = constructibleValues(ce, "Arctan", ops2[0])) == null ? void 0 : _a.simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arctan", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arctan", ops2[0]) } }, Arctan2: { wikidata: "Q776598", complexity: 5200, signature: { domain: ["Function", "Number", "Number", "Number"], N: (_ce, ops2) => apply2N(ops2[0], ops2[1], Math.atan2, (a, b) => Decimal.atan2(a, b)) } }, Cos: { complexity: 5050, signature: { domain: ["Function", "Number", ["Interval", -1, 1]], simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Cos", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Sin", ["Add", ops2[0], ["Multiply", "Half", "Pi"]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Cos", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Cos", ops2[0]) } }, Tan: { // Range: 'RealNumber', complexity: 5100, signature: { domain: trigFunction("Tan"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Tan", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", ["Sin", ops2[0]], ["Cos", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Tan", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Tan", ops2[0]) } } /* converts (x, y) -> (radius, angle) */ // ToPolarCoordinates: { // domain: 'Function', // outputDomain: ['TupleOf', 'RealNumber', 'RealNumber'], // } }, // // Functions defined using arithmetic functions or basic // trigonometric functions above // { Arcosh: { complexity: 6200, signature: { domain: hyperbolicFunction("Arcosh"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Arcosh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ "Ln", ["Add", ops2[0], ["Sqrt", ["Subtract", ["Square", ops2[0]], 1]]] ]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcosh", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arcosh", ops2[0]) } }, Arcsin: { complexity: 5500, signature: { domain: hyperbolicFunction("Arcsin"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Arcsin", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ "Multiply", 2, [ "Arctan2", ops2[0], ["Add", 1, ["Sqrt", ["Subtract", 1, ["Square", ops2[0]]]]] ] ]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcsin", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arcsin", ops2[0]) } }, //Note: Arsinh, not ArCsinh Arsinh: { complexity: 6100, signature: { domain: hyperbolicFunction("Arsinh"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Arsinh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ "Ln", ["Add", ops2[0], ["Sqrt", ["Add", ["Square", ops2[0]], 1]]] ]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arsinh", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arsinh", ops2[0]) } }, Artanh: { complexity: 6300, signature: { domain: hyperbolicFunction("Artanh"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Artanh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ "Multiply", "Half", ["Ln", ["Divide", ["Add", 1, ops2[0]], ["Subtract", 1, ops2[0]]]] ]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Artanh", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Artanh", ops2[0]) } }, Cosh: { complexity: 6050, signature: { domain: hyperbolicFunction("Cosh"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Cosh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ "Multiply", "Half", ["Add", ["Exp", ops2[0]], ["Exp", ["Negate", ops2[0]]]] ]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Cosh", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Cosh", ops2[0]) } }, Cot: { complexity: 5600, signature: { domain: trigFunction("Cot"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Cot", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", ["Cos", ops2[0]], ["Sin", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Cot", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Cot", ops2[0]) } }, Csc: { description: "Cosecant", complexity: 5600, signature: { domain: trigFunction("Csc"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Csc", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Sin", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Csc", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Csc", ops2[0]) } }, /** = sin(z/2)^2 = (1 - cos z) / 2*/ Haversine: { wikidata: "Q2528380", signature: { domain: ["Function", "ExtendedRealNumber", ["Interval", 0, 1]], evaluate: ["Lambda", ["Divide", ["Subtract", 1, ["Cos", "_1"]], 2]] } }, /** = 2 * Arcsin(Sqrt(z)) */ InverseHaversine: { // Range ['Interval', [['Negate', 'Pi'], 'Pi'], signature: { domain: ["Function", "ExtendedRealNumber", "RealNumber"], evaluate: ["Lambda", ["Multiply", 2, ["Arcsin", ["Sqrt", "_1"]]]] } }, Sec: { description: "Secant, inverse of cosine", complexity: 5500, signature: { domain: trigFunction("Sec"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Sec", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Cos", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sec", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Sec", ops2[0]) } }, Sinh: { // Range: ['Interval', -Infinity, Infinity], complexity: 6e3, signature: { domain: hyperbolicFunction("Sinh"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Sinh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box([ "Multiply", "Half", ["Subtract", ["Exp", ops2[0]], ["Exp", ["Negate", ops2[0]]]] ]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sinh", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Sinh", ops2[0]) } } }, { Csch: { complexity: 6200, signature: { domain: domainNumberToRealNumber("Csch"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Csch", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Sinh", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Csch", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Csch", ops2[0]) } }, Sech: { complexity: 6200, signature: { domain: ["Function", "Number", ["Interval", -1, 1]], simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Sech", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Cosh", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Sech", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Sech", ops2[0]) } }, Tanh: { // Range: ['Interval', -Infinity, Infinity], complexity: 6200, signature: { domain: hyperbolicFunction("Tanh"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Tanh", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", ["Sinh", ops2[0]], ["Cosh", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Tanh", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Tanh", ops2[0]) } } }, { Arccos: { complexity: 5550, signature: { domain: domainNumberToRealNumber("Arccos"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Arccos", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Subtract", ["Divide", "Pi", 2], ["Arcsin", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arccos", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arccos", ops2[0]) } }, Arccot: { numeric: true, signature: { domain: domainNumberToRealNumber("Arccot"), evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arccot", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arccot", ops2[0]) } }, Arcoth: { numeric: true, signature: { domain: domainNumberToRealNumber("Arcoth"), evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcoth", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arcoth", ops2[0]) } }, Arcsch: { numeric: true, signature: { domain: domainNumberToRealNumber("Arcsch"), evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcsch", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arcsch", ops2[0]) } }, Arcsec: { numeric: true, signature: { domain: domainNumberToRealNumber("Arcsec"), evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arcsec", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arcsec", ops2[0]) } }, Arsech: { numeric: true, signature: { domain: domainNumberToRealNumber("Arsech"), evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arsech", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arsech", ops2[0]) } }, Arccsc: { numeric: true, signature: { domain: domainNumberToRealNumber("Arccsc"), evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Arccsc", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Arccsc", ops2[0]) } }, Coth: { complexity: 6300, signature: { domain: hyperbolicFunction("Coth"), simplify: (ce, ops2) => { var _a, _b; return (_b = (_a = constructibleValues(ce, "Coth", ops2[0])) == null ? void 0 : _a.simplify()) != null ? _b : ce.box(["Divide", 1, ["Tanh", ops2[0]]]).simplify(); }, evaluate: (ce, ops2) => evalTrig(ce, "evaluate", "Coth", ops2[0]), N: (ce, ops2) => evalTrig(ce, "N", "Coth", ops2[0]) } }, /* converts (radius, angle) -> (x, y) */ // FromPolarCoordinates: { // domain: 'Function', // outputDomain: ['TupleOf', 'RealNumber', 'RealNumber'], // }, InverseFunction: { signature: { domain: ["Function", "Function", "Function"], canonical: (ce, ops2) => { var _a; ops2 = validateArgumentCount(ce, flattenSequence(canonical(ops2)), 1); return (_a = processInverseFunction(ce, ops2)) != null ? _a : ce._fn("InverseFunction", ops2); }, simplify: (ce, ops2) => processInverseFunction(ce, ops2), evaluate: (ce, ops2) => processInverseFunction(ce, ops2) } } } ]; var S2 = ["Sqrt", 2]; var S3 = ["Sqrt", 3]; var S5 = ["Sqrt", 5]; var S6 = ["Sqrt", 6]; var CONSTRUCTIBLE_VALUES = [ [ [0, 1], { Sin: 0, Cos: 1, Tan: 0, Cot: NaN, Sec: 1, Csc: NaN } ], [ [1, 12], { Sin: ["Divide", ["Subtract", S6, S2], 4], Cos: ["Divide", ["Add", S6, S2], 4], Tan: ["Subtract", 2, S3], Cot: ["Add", 2, S3], Sec: ["Subtract", S6, S2], Csc: ["Add", S6, S2] } ], [ [1, 10], { Sin: ["Divide", ["Subtract", S5, 1], 4], Cos: ["Divide", ["Sqrt", ["Add", 10, ["Multiply", 2, S5]]], 4], Tan: ["Divide", ["Sqrt", ["Subtract", 25, ["Multiply", 10, S5]]], 4], Cot: ["Sqrt", ["Add", 5, ["Multiply", 2, S5]]], Sec: ["Divide", ["Sqrt", ["Subtract", 50, ["Multiply", 10, S5]]], 5], Csc: ["Add", 1, S5] } ], [ [1, 8], { Sin: "$\\frac{\\sqrt{2-\\sqrt2}}{2}$", Cos: "$\\frac{\\sqrt {2+{\\sqrt {2}}}}{2}$", Tan: "$\\sqrt{2} - 1$", Cot: "$\\sqrt{2} + 1$", Sec: "$\\sqrt{ 4 - 2\\sqrt{2}}$", Csc: "$\\sqrt{ 4 + 2\\sqrt{2}}$" } ], [ [1, 6], { Sin: "$\\frac{1}{2}$", Cos: "$\\frac{\\sqrt{3}}{2}$", Tan: "$\\frac{\\sqrt{3}}{3}$", Cot: "$\\frac{2\\sqrt{3}}{3}$", Sec: "$\\sqrt{3}$", Csc: 2 } ], [ [1, 5], { Sin: "$\\frac{\\sqrt{10- 2\\sqrt{5}}} {4}$", Cos: "$\\frac{1+ \\sqrt{5}} {4}$", Tan: "$\\sqrt{5-2\\sqrt5}$", Cot: "$\\frac{\\sqrt{25+10\\sqrt5}} {5}$", Sec: "$\\sqrt{5} - 1$", Csc: "$\\frac{\\sqrt{50+10\\sqrt{5}}} {5}$" } ], [ [1, 4], { Sin: ["Divide", S2, 2], Cos: ["Divide", S2, 2], Tan: 1, Cot: 1, Sec: S2, Csc: S2 } ], [ [3, 10], { Sin: "$\\frac{1+ \\sqrt{5}} {4}$", Cos: "$\\frac{\\sqrt{10- 2\\sqrt{5}}} {4}$", Tan: "$\\frac{\\sqrt{25+10\\sqrt5}} {5}$", Cot: "$\\sqrt{5-2\\sqrt5}$", Sec: "$$", Csc: "$\\frac{\\sqrt{50+10\\sqrt{5}}} {5}$" } ], [ [1, 3], { Sin: ["Divide", S3, 2], // '$\\frac{\\sqrt{3}}{2}$' Cos: "Half", // '$\\frac{1}{2}$' Tan: S3, // '$\\sqrt{3}$' Cot: ["Divide", S3, 3], // '$\\frac{\\sqrt{3}}{3}$' Sec: 2, Csc: ["Divide", ["Multiply", 2, S3], 3] // '$\\frac{2\\sqrt{3}}{3}$' } ], [ [3, 8], { Sin: "$\\frac{ \\sqrt{2 + \\sqrt{2}} } {2}$", Cos: "$\\frac{ \\sqrt{2 - \\sqrt{2}} } {2}$", Tan: "$\\sqrt{2} + 1$", Cot: "$\\sqrt{2} - 1$", Sec: "$\\sqrt{ 4 + 2 \\sqrt{2} }$", Csc: "$\\sqrt{ 4 - 2 \\sqrt{2} }$" } ], [ [2, 5], { Sin: "$\\frac{\\sqrt{10+ 2\\sqrt{5}}} {4}$", Cos: "$\\frac{\\sqrt{5}-1} {4}$", Tan: "$\\sqrt{5+2\\sqrt{5}}$", Cot: "$\\frac{\\sqrt{25-10\\sqrt{5}}} {5}$", Sec: "$1 + \\sqrt{5}$", Csc: "$\\frac{\\sqrt{50-10\\sqrt{5}}} {5}$" } ], [ [5, 12], { Sin: "$\\frac{\\sqrt{6} + \\sqrt{2}} {4}$", Cos: "$\\frac{ \\sqrt{6} - \\sqrt{2}} {4}$", Tan: "$2+\\sqrt{3}$", Cot: "$2-\\sqrt{3}$", Sec: "$\\sqrt{6}+\\sqrt{2}$", Csc: "$\\sqrt{6} - \\sqrt{2}$" } ], [ [1, 2], { Sin: 1, Cos: 0, Tan: NaN, Cot: 0, Sec: NaN, Csc: 1 } ] ]; var TRIG_IDENTITIES = { Sin: [ [1, "Sin"], [1, "Cos"], [-1, "Sin"], [-1, "Cos"] ], Cos: [ [1, "Cos"], [-1, "Sin"], [-1, "Cos"], [1, "Sin"] ], Sec: [ [1, "Sec"], [-1, "Csc"], [-1, "Sec"], [1, "Csc"] ], Csc: [ [1, "Csc"], [1, "Sec"], [-1, "Csc"], [-1, "Sec"] ], Tan: [ [1, "Tan"], [-1, "Cot"], [1, "Tan"], [-1, "Cot"] ], Cot: [ [1, "Cot"], [-1, "Tan"], [1, "Cot"], [-1, "Tan"] ] }; function constructibleValues(ce, head2, x) { var _a, _b, _c; if (!x) return void 0; const specialValues = ce.cache( "constructible-trigonometric-values", () => { var _a2; const values = []; for (const [val, results] of CONSTRUCTIBLE_VALUES) { const boxedResults = {}; for (const head3 of Object.keys(results)) boxedResults[head3] = (_a2 = ce.parse(latexString(results[head3]))) != null ? _a2 : ce.box(results[head3]); values.push([val, boxedResults]); } return values; }, (cache) => { for (const [_k, v] of cache) { for (const v2 of Object.values(v)) v2.unbind(); } return cache; } ); x = x.N(); if (x.numericValue === null) return void 0; let theta = (_a = asFloat(x)) != null ? _a : null; if (theta === null) return void 0; theta = theta % (2 * Math.PI); const identitySign = head2 !== "Cos" && head2 !== "Sec" ? Math.sign(theta) : 1; theta = Math.abs(theta); const quadrant2 = Math.floor(theta * 2 / Math.PI); theta = theta % (Math.PI / 2); let sign2; [sign2, head2] = (_c = (_b = TRIG_IDENTITIES[head2]) == null ? void 0 : _b[quadrant2]) != null ? _c : [1, head2]; sign2 = sign2 * identitySign; for (const [[n, d], result] of specialValues) { if (result[head2] && ce.chop(theta - Math.PI * n / d) === 0) { return sign2 < 0 ? canonicalNegate(result[head2]) : result[head2]; } } return void 0; } function processInverseFunction(ce, xs) { if (xs.length !== 1) return void 0; const expr = xs[0]; const head2 = expr.symbol; if (typeof head2 !== "string") return void 0; if (head2 === "InverseFunction") return expr.op1; const newHead = { Sin: "Arcsin", Cos: "Arccos", Tan: "Arctan", Sec: "Arcsec", Csc: " Arccsc", Sinh: "Arsinh", Cosh: "Arcosh", Tanh: "Artanh", Sech: "Arcsech", Csch: "Arcsch", Arcosh: "Cosh", Arccos: "Cos", Arccsc: "Csc", Arcsch: "Csch", // '??': 'Cot', // '??': 'Coth', Arcsec: "Sec", Arcsin: "Sin", Arsinh: "Sinh", Arctan: "Tan", Artanh: "Tanh" }[head2]; return newHead ? ce.symbol(newHead) : void 0; } function evalTrig(ce, mode, head2, op3) { var _a; if (!op3) return void 0; if (mode === "evaluate") { const result = (_a = constructibleValues(ce, head2, op3)) == null ? void 0 : _a.evaluate(); if (result) return result; if (op3.isExact) return void 0; } switch (head2) { case "Arccos": return applyN( op3, Math.acos, (x) => x.acos(), (x) => x.acos() ); case "Arccot": return applyN( op3, (x) => Math.atan2(1, x), (x) => Decimal.atan2(ce._BIGNUM_ONE, x), (x) => x.inverse().atan() ); case "Arccsc": return applyN( op3, (x) => Math.asin(1 / x), (x) => ce._BIGNUM_ONE.div(x).asin(), (x) => x.inverse().asin() ); case "Arcosh": return applyN( op3, Math.acosh, (x) => x.acosh(), (x) => x.acosh() ); case "Arcoth": return applyN( op3, (x) => x, (x) => x.acosh(), (x) => x.acosh() ); case "Arcsch": return applyN( op3, (x) => Math.log(1 / x + Math.sqrt(1 / (x * x) + 1)), (x) => ce._BIGNUM_ONE.div(x.mul(x)).add(ce._BIGNUM_ONE).sqrt().add(ce._BIGNUM_ONE.div(x)).log(), (x) => x.mul(x).inverse().add(1).sqrt().add(x.inverse()).log() ); case "Arcsec": return applyN( op3, (x) => Math.acos(1 / x), (x) => ce._BIGNUM_ONE.div(x).acos(), (x) => x.inverse().acos() ); case "Arcsin": return applyN( op3, Math.asin, (x) => x.asin(), (x) => x.asin() ); case "Arsech": return applyN( op3, (x) => Math.log((1 + Math.sqrt(1 - x * x)) / x), (x) => ce._BIGNUM_ONE.sub(x.mul(x).add(ce._BIGNUM_ONE).div(x)).log(), (x) => ce.complex(1).sub(x.mul(x)).add(1).div(x).log() ); case "Arsinh": return applyN( op3, Math.asinh, (x) => x.asinh(), (x) => x.asinh() ); case "Arctan": return applyN( op3, Math.atan, (x) => x.atan(), (x) => x.atan() ); case "Artanh": return applyN( op3, Math.atanh, (x) => x.atanh(), (x) => x.atanh() ); case "Cos": return applyN( op3, Math.cos, (x) => x.toSignificantDigits(ce.precision + 4).cos().toSignificantDigits(ce.precision), (x) => x.cos() ); case "Cosh": return applyN( op3, Math.cosh, (x) => x.cosh(), (x) => x.cosh() ); case "Cot": return applyN( op3, (x) => 1 / Math.tan(x), (x) => ce._BIGNUM_ONE.div(x.tan()), (x) => x.tan().inverse() ); case "Coth": return applyN( op3, (x) => 1 / Math.tanh(x), (x) => ce._BIGNUM_ONE.div(x.tanh()), (x) => x.tanh().inverse() ); case "Csc": return applyN( op3, (x) => 1 / Math.sin(x), (x) => ce._BIGNUM_ONE.div(x.sin()), (x) => x.sin().inverse() ); case "Csch": return applyN( op3, (x) => 1 / Math.sinh(x), (x) => ce._BIGNUM_ONE.div(x.sinh()), (x) => x.sinh().inverse() ); case "Sec": return applyN( op3, (x) => 1 / Math.cos(x), (x) => ce._BIGNUM_ONE.div(x.cos()), (x) => x.cos().inverse() ); case "Sech": return applyN( op3, (x) => 1 / Math.cosh(x), (x) => ce._BIGNUM_ONE.div(x.cosh()), (x) => x.cosh().inverse() ); case "Sin": return applyN( op3, Math.sin, (x) => x.toSignificantDigits(ce.precision + 4).sin().toSignificantDigits(ce.precision), (x) => x.sin() ); case "Sinh": return applyN( op3, Math.sinh, (x) => x.sinh(), (x) => x.sinh() ); case "Tan": return applyN( op3, Math.tan, (x) => x.toSignificantDigits(ce.precision + 4).tan().toSignificantDigits(ce.precision), (x) => x.tan() ); case "Tanh": return applyN( op3, Math.tanh, (x) => x.tanh(), (x) => x.tanh() ); } return void 0; } var import_complex17 = __toESM(require_complex()); var BoxedSymbolDefinitionImpl = class { // @todo constructor(ce, name, def) { var _a, _b, _c, _d; if (!ce.context) throw Error("No context available"); this.name = name; this.wikidata = def.wikidata; this.description = def.description; this.url = def.url; this._engine = ce; this.scope = ce.context; this.name = name; this._flags = def.flags ? normalizeFlags(def.flags) : void 0; this._domain = def.domain ? ce.domain(def.domain) : void 0; this.constant = (_a = def.constant) != null ? _a : false; this.holdUntil = (_b = def.holdUntil) != null ? _b : "evaluate"; if (this.constant) { this._defValue = def.value; this._value = null; } else { if (def.value) { if (isLatexString(def.value)) this._value = (_c = ce.parse(def.value)) != null ? _c : ce.symbol("Undefined"); else if (typeof def.value === "function") this._value = ce.box((_d = def.value(ce)) != null ? _d : "Undefined"); else if (def.value instanceof AbstractBoxedExpression) this._value = def.value; else this._value = ce.box(def.value); } else this._value = void 0; if (!this._value && this._domain && !def.flags) this._flags = domainToFlags(this._domain); } } reset() { if (this.constant) this._value = null; } // unbind() { // this._value = null; // this._domain = null; // } get value() { var _a, _b, _c, _d; if (this._value === null) { const ce = this._engine; if (isLatexString(this._defValue)) this._value = (_a = ce.parse(this._defValue)) != null ? _a : ce.symbol("Undefined"); else if (typeof this._defValue === "function") this._value = ce.box((_b = this._defValue(ce)) != null ? _b : "Undefined"); else if (this._defValue) this._value = ce.box(this._defValue); else this._value = void 0; if ((_c = this._value) == null ? void 0 : _c.numericValue) { const val = this._value.numericValue; if (!bignumPreferred(ce) && val instanceof decimal_default) this._value = ce.number(val.toNumber()); else if (!complexAllowed(ce) && val instanceof import_complex17.default) this._value = ce._NAN; } } return (_d = this._value) != null ? _d : void 0; } set value(val) { if (this.constant) throw new Error( `The value of the constant "${this.name}" cannot be changed` ); /* @__PURE__ */ console.assert(this._defValue === void 0); if (typeof val === "number") { this._value = this._engine.number(val); } else if (val) { const newVal = this._engine.box(val); if (!this._domain || newVal.domain.isCompatible(this._domain)) this._value = newVal; else this._value = void 0; } else this._value = void 0; if (this._value !== void 0) this._flags = void 0; else this._flags = domainToFlags(this.domain); } get domain() { var _a, _b, _c; return (_c = (_b = this._domain) != null ? _b : (_a = this._value) == null ? void 0 : _a.domain) != null ? _c : void 0; } set domain(domain) { var _a, _b, _c; if (this.constant) throw new Error( `The domain of the constant "${this.name}" cannot be changed` ); if (!domain) { this._defValue = void 0; this._value = void 0; this._flags = void 0; this._domain = void 0; return; } domain = this._engine.domain(domain); if ((_a = this._domain) == null ? void 0 : _a.isNumeric) { if (!domain.isNumeric) throw Error("Can't change from a numeric domain to a non-numeric one"); this._domain = domain; if (!this._value) this._flags = { ...(_b = this._flags) != null ? _b : {}, ...domainToFlags(domain) }; return; } if (this._domain) throw Error("Can't change a non-numeric domain"); this._flags = void 0; this._domain = domain; if (!this._value && domain.isNumeric) this._flags = { ...(_c = this._flags) != null ? _c : {}, ...domainToFlags(domain) }; } // // Flags // get number() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNumber) != null ? _c : (_b = this._flags) == null ? void 0 : _b.number; } set number(val) { this.updateFlags({ number: val }); } get integer() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isInteger) != null ? _c : (_b = this._flags) == null ? void 0 : _b.integer; } set integer(val) { this.updateFlags({ integer: val }); } get rational() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isRational) != null ? _c : (_b = this._flags) == null ? void 0 : _b.rational; } set rational(val) { this.updateFlags({ rational: val }); } get algebraic() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isAlgebraic) != null ? _c : (_b = this._flags) == null ? void 0 : _b.algebraic; } set algebraic(val) { this.updateFlags({ algebraic: val }); } get real() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isReal) != null ? _c : (_b = this._flags) == null ? void 0 : _b.real; } set real(val) { this.updateFlags({ real: val }); } get extendedReal() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isExtendedReal) != null ? _c : (_b = this._flags) == null ? void 0 : _b.extendedReal; } set extendedReal(val) { this.updateFlags({ extendedReal: val }); } get complex() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isComplex) != null ? _c : (_b = this._flags) == null ? void 0 : _b.complex; } set complex(val) { this.updateFlags({ complex: val }); } get extendedComplex() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isExtendedComplex) != null ? _c : (_b = this._flags) == null ? void 0 : _b.extendedComplex; } set extendedComplex(val) { this.updateFlags({ extendedComplex: val }); } get imaginary() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isImaginary) != null ? _c : (_b = this._flags) == null ? void 0 : _b.imaginary; } set imaginary(val) { this.updateFlags({ imaginary: val }); } get positive() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isPositive) != null ? _c : (_b = this._flags) == null ? void 0 : _b.positive; } set positive(val) { this.updateFlags({ positive: val }); } get nonPositive() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNonPositive) != null ? _c : (_b = this._flags) == null ? void 0 : _b.nonPositive; } set nonPositive(val) { this.updateFlags({ nonPositive: val }); } get negative() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNegative) != null ? _c : (_b = this._flags) == null ? void 0 : _b.negative; } set negative(val) { this.updateFlags({ negative: val }); } get nonNegative() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNonNegative) != null ? _c : (_b = this._flags) == null ? void 0 : _b.nonNegative; } set nonNegative(val) { this.updateFlags({ nonNegative: val }); } get zero() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isZero) != null ? _c : (_b = this._flags) == null ? void 0 : _b.zero; } set zero(val) { this.updateFlags({ zero: val }); } get notZero() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNotZero) != null ? _c : (_b = this._flags) == null ? void 0 : _b.notZero; } set notZero(val) { this.updateFlags({ notZero: val }); } get one() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isOne) != null ? _c : (_b = this._flags) == null ? void 0 : _b.one; } set one(val) { this.updateFlags({ one: val }); } get negativeOne() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNegativeOne) != null ? _c : (_b = this._flags) == null ? void 0 : _b.negativeOne; } set negativeOne(val) { this.updateFlags({ negativeOne: val }); } get infinity() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isInfinity) != null ? _c : (_b = this._flags) == null ? void 0 : _b.infinity; } set infinity(val) { this.updateFlags({ infinity: val }); } get finite() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isFinite) != null ? _c : (_b = this._flags) == null ? void 0 : _b.finite; } set finite(val) { this.updateFlags({ finite: val }); } get NaN() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isNaN) != null ? _c : (_b = this._flags) == null ? void 0 : _b.NaN; } set NaN(val) { this.updateFlags({ NaN: val }); } get even() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isEven) != null ? _c : (_b = this._flags) == null ? void 0 : _b.even; } set even(val) { this.updateFlags({ even: val }); } get odd() { var _a, _b, _c; return (_c = (_a = this.value) == null ? void 0 : _a.isOdd) != null ? _c : (_b = this._flags) == null ? void 0 : _b.odd; } set odd(val) { this.updateFlags({ odd: val }); } get prime() { var _a, _b; const val = this._value; if (val) { if (!val.isInteger || val.isNonPositive) return false; return isPrime((_a = asFloat(val)) != null ? _a : NaN); } return (_b = this._flags) == null ? void 0 : _b.prime; } set prime(val) { this.updateFlags({ prime: val }); } get composite() { var _a, _b; const val = this._value; if (val) { if (!val.isInteger || val.isNonPositive) return false; return !isPrime((_a = asFloat(val)) != null ? _a : NaN); } return (_b = this._flags) == null ? void 0 : _b.composite; } set composite(val) { this.updateFlags({ composite: val }); } updateFlags(flags) { var _a; if (this.constant) throw Error("The flags of constant cannot be changed"); if (((_a = this.domain) == null ? void 0 : _a.isNumeric) === false) throw Error("Flags only apply to numeric domains"); let flagCount = 0; let consistent = true; for (const flag in Object.keys(flags)) { flagCount += 1; if (this._value && flags[flag] !== void 0) { switch (flag) { case "number": consistent = this._value.isNumber === flags.number; break; case "integer": consistent = this._value.isInteger === flags.integer; break; case "rational": consistent = this._value.isRational === flags.rational; break; case "algebraic": consistent = this._value.isAlgebraic === flags.algebraic; break; case "real": consistent = this._value.isReal === flags.real; break; case "extendedReal": consistent = this._value.isExtendedReal === flags.extendedReal; break; case "complex": consistent = this._value.isComplex === flags.complex; break; case "extendedComplex": consistent = this._value.isExtendedComplex === flags.extendedComplex; break; case "imaginary": consistent = this._value.isImaginary === flags.imaginary; break; case "positive": consistent = this._value.isPositive === flags.positive; break; case "nonPositive": consistent = this._value.isNonPositive === flags.nonPositive; break; case "negative": consistent = this._value.isNegative === flags.negative; break; case "nonNegative": consistent = this._value.isNonNegative === flags.nonNegative; break; case "zero": consistent = this._value.isZero === flags.zero; break; case "notZero": consistent = this._value.isNotZero === flags.notZero; break; case "one": consistent = this._value.isOne === flags.one; break; case "negativeOne": consistent = this._value.isNegativeOne === flags.negativeOne; break; case "infinity": consistent = this._value.isInfinity === flags.infinity; break; case "NaN": consistent = this._value.isNaN === flags.NaN; break; case "finite": consistent = this._value.isFinite === flags.finite; break; case "even": consistent = this._value.isEven === flags.even; break; case "odd": consistent = this._value.isOdd === flags.odd; break; case "prime": consistent = this._value.isPrime === flags.prime; break; case "composite": consistent = this._value.isComposite === flags.composite; break; } } } if (flagCount > 0) { if (!consistent) { this._defValue = void 0; this._value = void 0; } this._domain = this._engine.domain("Number"); if (!this._flags) this._flags = normalizeFlags(flags); else this._flags = { ...this._flags, ...normalizeFlags(flags) }; } } }; function definedKeys(xs) { return Object.fromEntries( Object.entries(xs).filter(([_k, v]) => v !== void 0) ); } function normalizeFlags(flags) { const result = { ...flags }; if (flags.zero || flags.one || flags.negativeOne) { result.zero = flags.zero && !flags.one && !flags.negativeOne; result.notZero = !flags.zero || flags.one || flags.negativeOne; result.one = flags.one && !flags.zero && !flags.negativeOne; result.negativeOne = flags.negativeOne && !flags.zero && !flags.one; result.infinity = false; result.NaN = false; result.finite = true; result.integer = true; result.finite = true; result.infinity = false; result.NaN = false; result.even = flags.one; result.odd = !flags.one; result.prime = false; result.composite = false; } if (result.zero) { result.positive = false; result.negative = false; result.nonPositive = true; result.nonNegative = true; } if (result.notZero === true) { if (!result.imaginary) result.real = true; result.zero = false; } if (result.one) { result.positive = true; } if (result.negativeOne) { result.nonPositive = true; } if (result.positive || result.nonNegative) { result.negativeOne = false; } if (result.positive) { result.nonPositive = false; result.negative = false; result.nonNegative = true; } else if (result.nonPositive) { result.positive = false; result.negative = result.notZero; result.nonNegative = !result.zero; } else if (result.negative) { result.positive = false; result.nonPositive = result.notZero; result.nonNegative = false; } else if (result.nonNegative) { result.positive = result.notZero; result.nonPositive = !result.zero; result.negative = false; } if (result.positive || result.negative || result.nonPositive || result.nonNegative) { result.number = true; if (result.finite) result.real = true; else if (!result.finite) result.complex = true; result.imaginary = false; } if (result.finite) { result.number = true; result.complex = true; result.infinity = false; result.NaN = false; } if (result.infinity) { result.finite = false; result.NaN = false; } if (result.infinity === false) { result.extendedComplex = false; result.extendedReal = false; } if (flags.even) result.odd = false; if (flags.odd) result.even = false; if (result.integer) result.rational = true; if (result.rational) result.algebraic = true; if (result.algebraic) result.real = true; if (result.real) result.complex = true; if (result.imaginary) result.complex = true; if (result.complex) result.number = true; if (result.real && result.infinity !== false) result.extendedReal = true; if (result.complex && result.infinity !== false) result.extendedComplex = true; if (result.even || result.infinity || result.NaN || result.negative || result.imaginary || result.integer === false) result.prime = false; if (result.number && result.prime) result.composite = false; return result; } function domainToFlags(dom) { if (!dom) return {}; const result = {}; if (dom.isNumeric) { const domain = dom.literal; result.number = true; if (domain === "Integer") result.integer = true; if (domain === "RationalNumber") result.rational = true; if (domain === "AlgebraicNumber") result.algebraic = true; if (domain === "TranscendentalNumber") { result.algebraic = false; result.real = true; } if (domain === "ExtendedRealNumber") result.extendedReal = true; if (domain === "RealNumber") result.real = true; if (domain === "ImaginaryNumber") result.imaginary = true; if (domain === "ExtendedComplexNumber") result.extendedComplex = true; if (domain === "ComplexNumber") result.complex = true; if (domain === "PositiveNumber") { result.notZero = true; result.real = true; result.positive = true; } if (domain === "NegativeNumber") { result.notZero = true; result.real = true; result.negative = true; } if (domain === "NonNegativeNumber") { result.real = true; result.positive = true; } if (domain === "NonPositiveNumber") { result.real = true; result.negative = true; } if (domain === "PositiveInteger") { result.notZero = true; result.integer = true; result.positive = true; } if (domain === "NegativeNumber") { result.notZero = true; result.integer = true; result.negative = true; } if (domain === "NonNegativeNumber") { result.integer = true; result.positive = true; } if (domain === "NonPositiveNumber") { result.integer = true; result.negative = true; } } else { result.number = false; result.integer = false; result.rational = false; result.algebraic = false; result.real = false; result.extendedReal = false; result.complex = false; result.extendedComplex = false; result.imaginary = false; result.positive = false; result.nonPositive = false; result.negative = false; result.nonNegative = false; result.zero = false; result.notZero = false; result.one = false; result.negativeOne = false; result.infinity = false; result.NaN = false; result.odd = false; result.even = false; result.prime = false; result.composite = false; } return definedKeys(normalizeFlags(result)); } var BoxedFunctionDefinitionImpl = class { constructor(ce, name, def) { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l; if (!ce.context) throw Error("No context available"); this.engine = ce; this.scope = ce.context; const idempotent = (_a = def.idempotent) != null ? _a : false; const involution = (_b = def.involution) != null ? _b : false; if (idempotent && involution) throw new Error( `Function Definition "${name}": the 'idempotent' and 'involution' flags are mutually exclusive` ); this.name = name; this.description = def.description; this.wikidata = def.wikidata; this.threadable = (_c = def.threadable) != null ? _c : false; this.associative = (_d = def.associative) != null ? _d : false; this.commutative = (_e = def.commutative) != null ? _e : false; this.idempotent = idempotent; this.involution = involution; this.inert = (_f = def.inert) != null ? _f : false; this.numeric = (_g = def.numeric) != null ? _g : false; this.pure = (_h = def.pure) != null ? _h : true; this.complexity = (_i = def.complexity) != null ? _i : DEFAULT_COMPLEXITY; this.hold = (_j = def.hold) != null ? _j : "none"; if (this.inert) { if (def.hold) throw Error( `Function Definition "${name}": an inert function should not have a hold` ); this.hold = "rest"; if (def.signature) { const sig = def.signature; if ("simplify" in sig || "evaluate" in sig || "N" in sig || "evalDimension" in sig || "sgn" in sig || "compile" in sig) throw Error( `Function Definition "${name}": an inert function should only have 'canonical' or 'codomain' handlers` ); } if (this.threadable) throw Error( `Function Definition "${name}": an inert function should not be threadable` ); if (this.associative) throw Error( `Function Definition "${name}": an inert function should not be associative` ); if (this.commutative) throw Error( `Function Definition "${name}": an inert function should not be commutative` ); if (this.idempotent) throw Error( `Function Definition "${name}": an inert function should not be idempotent` ); if (this.involution) throw Error( `Function Definition "${name}": an inert function should not be involution` ); if (!this.pure) throw Error( `Function Definition "${name}": an inert function should be pure` ); } if (def.signature) { const sig = def.signature; const domain = sig.domain ? ce.domain(sig.domain) : def.numeric ? ce.domain("NumericFunction") : ce.domain("Function"); if (!domain.isValid) throw Error( `Function Definition "${name}": invalid domain ${JSON.stringify( sig.domain )}` ); const codomain = (_l = (_k = sig.codomain) != null ? _k : domain.codomain) != null ? _l : def.numeric ? ce.domain("Number") : ce.domain("Anything"); this.signature = { domain, codomain, canonical: sig.canonical, simplify: sig.simplify, evaluate: !sig.evaluate ? void 0 : typeof sig.evaluate === "function" ? sig.evaluate : ce.box(sig.evaluate, { canonical: false }), N: sig.N, evalDimension: sig.evalDimension, sgn: sig.sgn, compile: sig.compile }; } else if (def.numeric) { this.signature = { domain: ce.domain("NumericFunction"), codomain: ce.domain("Number") }; } else { this.signature = { domain: ce.domain("Function"), codomain: ce.domain("Anything") }; } } reset() { return; } }; function makeFunctionDefinition(engine, name, def) { if (def instanceof BoxedFunctionDefinitionImpl) return def; return new BoxedFunctionDefinitionImpl( engine, name, def ); } function getStandardLibrary(categories) { if (categories === "all") { return getStandardLibrary([ "domains", "core", "control-structures", // If, Block, Loop "logic", "collections", // Dictionary, List, Sets "relop", "numeric", "arithmetic", "algebra", "calculus", "combinatorics", "linear-algebra", "other", "physics", "polynomials", "statistics", "trigonometry", "dimensions", "units" ]); } else if (typeof categories === "string") categories = [categories]; const result = []; for (const category of categories) { const dict = LIBRARIES[category]; if (!dict) throw Error(`Unknown library category ${category}`); if (Array.isArray(dict)) result.push(...dict); else result.push(dict); } return result; } var LIBRARIES = { "algebra": [], // 'algebra': [ // // polynomial([0, 2, 0, 4]:list, x:symbol) -> 2x + 4x^3 // // polynomial(2x + 4x^3, x) -> {0, 2, 0, 4} // // rational(2x + 4x^3, {3, 1}, x) -> (2x + 4x^3)/(3+x) // // https://reference.wolfram.com/language/tutorial/AlgebraicCalculations.html // // simplify-trig (macsyma) // // - trigReduce, trigExpand, trigFactor, trigToExp (mathematica) // // Mathematica: // // - distribute -> (a+b)(c+d) -> ac+ ad+ bc+ bd (doesn't have to be multiply, // // f(a+b, c+d) -> f(a, c) + f(a, d) + f(b, c) + f(b, d) // // -- distribute(expr, over=add, with=multiply) // // https://reference.wolfram.com/language/ref/Distribute.html // // - expand, expand-all // // - factor // // - simplify // ], "arithmetic": [...ARITHMETIC_LIBRARY, ...COMPLEX_LIBRARY], "calculus": CALCULUS_LIBRARY, "combinatorics": [], // @todo fibonacci, binomial, etc... "control-structures": [], // // D // // Derivative (mathematica) // // diff (macsyma) // // nth-diff // // int // // - integrate(expression, symbol) -- indefinite integral // // - integrate(expression, range) = {symbol, min, max} -- definite integral // // - integrate(expression, range1, range2) -- multiple integral // // def-int // ], "dimensions": [], // @todo // volume, speed, area "domains": [], "core": CORE_LIBRARY, "collections": [SETS_LIBRARY, COLLECTIONS_LIBRARY, domainSetsLibrary()], // 'domains': getDomainsDictionary(), "linear-algebra": [], //@todo // 'linear-algebra': [ // // matrix // // transpose // // cross-product // // outer-product // // determinant // // vector // // matrix // // rank // // scalar-matrix // // constant-matrix // // identity-matrix // ], "logic": LOGIC_LIBRARY, "numeric": [], // @todo // 'numeric': [ // // Gamma function // // Zeta function // // erf function // // numerator(fraction) // // denominator(fraction) // // exactFloatToRational // // N -> eval as a number // // random // // hash // ], "other": [], "relop": RELOP_LIBRARY, "polynomials": POLYNOMIALS_LIBRARY, "physics": { Mu0: { description: "Vaccum permeability", constant: true, wikidata: "Q1515261", domain: "RealNumber", value: 125663706212e-17 // unit: ['Divide', 'N', ['Square', 'A']], } }, "statistics": STATISTICS_LIBRARY, "trigonometry": TRIGONOMETRY_LIBRARY, "units": [] }; function validateDefinitionName(name) { name = name.normalize(); if (isValidIdentifier(name)) return name; throw new Error( `Invalid definition name "${name}": ${validateIdentifier(name)}` ); } function setCurrentContextSymbolTable(engine, table) { var _a2; var _a; if (!engine.context) throw Error("No context available"); (_a2 = (_a = engine.context).idTable) != null ? _a2 : _a.idTable = /* @__PURE__ */ new Map(); const idTable = engine.context.idTable; for (let name of Object.keys(table)) { const entry = table[name]; name = validateDefinitionName(name); if (isFunctionDefinition(entry)) { const def = makeFunctionDefinition(engine, name, entry); if (idTable.has(name)) throw new Error( `Duplicate function definition ${name}: ${JSON.stringify( idTable.get(name) )} ${JSON.stringify(entry)}` ); idTable.set(name, def); } else if (isSymbolDefinition(entry)) { const def = new BoxedSymbolDefinitionImpl(engine, name, entry); if (engine.strict && entry.wikidata) { for (const [_, d] of idTable) { if (d.wikidata === entry.wikidata) throw new Error( `Duplicate entries with wikidata "${entry.wikidata}": "${name}" and "${d.name}"` ); } } if (idTable.has(name)) throw new Error(`Duplicate symbol definition "${name}"`); idTable.set(name, def); } else { const def = new BoxedSymbolDefinitionImpl(engine, name, { value: engine.box(entry) }); /* @__PURE__ */ console.assert(def); idTable.set(name, def); } } } var import_complex19 = __toESM(require_complex()); function numericCostFunction(n) { if (Number.isInteger(n) && n !== 0) { return Math.floor(Math.log2(Math.abs(n)) / Math.log2(10)) + (n > 0 ? 1 : 2); } return 2; } function costFunction(expr) { var _a, _b; if (expr.symbol) return 1; const num = expr.numericValue; if (num !== null) { if (expr.isZero) return 1; if (expr.isInteger) return numericCostFunction(asFloat(expr)); if (isRational(num)) { if (isMachineRational(num)) return numericCostFunction(num[0]) + numericCostFunction(num[1]) + 1; else return numericCostFunction(Number(num[0])) + numericCostFunction(Number(num[1])) + 1; } if (num instanceof import_complex19.default) return numericCostFunction(num.re) + numericCostFunction(num.im) + 1; if (expr.isNumber) return 2; } const head2 = expr.head; let headCost = 2; if (typeof head2 === "string") { if (["Add", "Divide"].includes(head2)) headCost = 3; else if (["Subtract", "Negate"].includes(head2)) headCost = 4; else if (["Square", "Sqrt", "Multiply", "Root"].includes(head2)) headCost = 5; else if (["Power"].includes(head2)) headCost = 6; else if (["Ln", "Exp", "Log"].includes(head2)) headCost = 7; else if ([ "Arcsin", "Arccos", "Arctan", "Arcsec", " Arccsc", "Arsinh", "Arcosh", "Artanh", "Arcsech", "Arcsch", "Cosh", "Cos", "Csc", "Csch", // '??': 'Cot', // '??': 'Coth', "Sec", "Sin", "Sinh", "Tan", "Tanh" ].includes(head2)) headCost = 9; else headCost = 10; } else headCost = costFunction(head2); return headCost + ((_b = (_a = expr.ops) == null ? void 0 : _a.reduce((acc, x) => acc + costFunction(x), 0)) != null ? _b : 0); } var DEFAULT_COST_FUNCTION = costFunction; var ExpressionMap = class _ExpressionMap { constructor(source) { if (!source) { this._items = /* @__PURE__ */ new Map(); } else if (source instanceof _ExpressionMap) { this._items = new Map(source._items); } else { this._items = new Map( source ); } } has(expr) { for (const x of this._items.keys()) if (x.isSame(expr)) return true; return false; } get(expr) { for (const [x, v] of this._items) if (x.isSame(expr)) return v; return void 0; } clear() { this._items.clear(); } set(expr, value) { for (const x of this._items.keys()) { if (x.isSame(expr)) { this._items.set(x, value); return; } } this._items.set(expr, value); } delete(expr) { this._items.delete(expr); } [Symbol.iterator]() { return this._items.entries(); } entries() { return this._items.entries(); } }; function permutations(xs) { const result = []; const permute = (arr, m = []) => { if (arr.length === 0) { result.push(m); } else { for (let i = 0; i < arr.length; i++) { const curr = arr.slice(); const next = curr.splice(i, 1); permute(curr.slice(), m.concat(next)); } } }; permute(xs); return result; } var BoxedPattern = class _BoxedPattern extends AbstractBoxedExpression { constructor(ce, pattern, metadata) { super(ce, metadata); this._pattern = isLatexString(pattern) ? ce.parse(pattern, { canonical: false }) : ce.box(pattern, { canonical: false }); } get hash() { return hashCode("Pattern") ^ this._pattern.hash; } unbind() { this._pattern.unbind(); } get json() { return serializeJsonFunction(this.engine, "Pattern", [this._pattern]); } get head() { return "Pattern"; } get domain() { return this.engine.domain("Pattern"); } get isCanonical() { return true; } set isCanonical(_val) { return; } isSame(rhs) { if (this === rhs) return true; return rhs instanceof _BoxedPattern && this._pattern.isSame(rhs._pattern); } isEqual(rhs) { return rhs instanceof _BoxedPattern && this._pattern.isEqual(rhs._pattern); } match(expr, options) { var _a, _b, _c; return match(expr, this._pattern, { recursive: (_a = options == null ? void 0 : options.recursive) != null ? _a : false, numericTolerance: (_b = options == null ? void 0 : options.numericTolerance) != null ? _b : 0, substitution: (_c = options == null ? void 0 : options.substitution) != null ? _c : {} }); } test(expr, options) { return this.match(expr, options) !== null; } count(exprs, options) { let result = 0; for (const expr of exprs) { if (this.match(expr, options) !== null) result += 1; } return result; } subs(sub2, options) { return this._pattern.subs(sub2, options); } }; function hasWildcards(expr) { var _a; if (typeof expr === "string") return expr.startsWith("_"); if ((_a = expr.symbol) == null ? void 0 : _a.startsWith("_")) return true; if (expr.ops) return hasWildcards(expr.head) || expr.ops.some(hasWildcards); if (expr.keys) { for (const key of expr.keys) if (hasWildcards(expr.getKey(key))) return true; } return false; } function captureWildcard(wildcard, expr, substitution) { const name = getWildcardName(wildcard); if (name === "") return substitution; if (substitution[name] !== void 0) { if (!expr.isSame(substitution[name])) return null; return substitution; } if (hasWildcards(expr)) return null; return { ...substitution, [name]: expr }; } function matchOnce(expr, pattern, substitution, options) { const ce = expr.engine; if (pattern.head === "Pattern") return pattern.match(expr, { substitution, ...options }); if (pattern instanceof BoxedNumber) { if (!(expr instanceof BoxedNumber)) return null; if (options.numericTolerance === 0) return pattern.isSame(expr) ? substitution : null; return pattern.isEqualWithTolerance(expr, options.numericTolerance) ? substitution : null; } const str = pattern.string; if (str !== null) return expr.string === str ? substitution : null; const symbol2 = pattern.symbol; if (symbol2 !== null) { if (symbol2.startsWith("_")) return captureWildcard(symbol2, expr, substitution); return symbol2 === expr.symbol ? substitution : null; } if (pattern.nops !== expr.nops) return null; const keys = pattern.keys; if (keys !== null) { const exprKeys = expr.keys; if (exprKeys === null) return null; for (const key of keys) { const r = matchOnce(exprKeys[key], keys[key], substitution, options); if (r === null) return null; substitution = r; } return substitution; } if (pattern.ops) { const head2 = pattern.head; if (typeof head2 === "string" && head2.startsWith("_")) return captureWildcard(head2, ce.box(expr.head), substitution); let def = void 0; if (typeof head2 === "string" && typeof expr.head === "string") { if (head2 !== expr.head) return null; def = ce.lookupFunction(head2); } else { const r = matchOnce( ce.box(expr.head, { canonical: false }), ce.box(head2, { canonical: false }), substitution, options ); if (r === null) return null; substitution = r; } return (def == null ? void 0 : def.commutative) ? matchCommutativeArguments(expr, pattern, substitution, options) : matchNonCommutativeArguments(expr, pattern, substitution, options); } return null; } function matchPermutation(ce, ops2, patterns, substitution, options) { var _a; let result = { ...substitution }; ops2 = [...ops2]; let hasRest = false; for (const arg of patterns) { if (arg.symbol === "__") hasRest = true; else { let r = null; if ((_a = arg.symbol) == null ? void 0 : _a.startsWith("_")) { for (let i = 0; i <= ops2.length - 1; i++) { r = captureWildcard(arg.symbol, ops2[i], result); if (r !== null) { ops2.splice(i, 1); break; } } } else { for (let i = 0; i <= ops2.length - 1; i++) { r = matchOnce(ops2[i], arg, result, options); if (r !== null) { ops2.splice(i, 1); break; } } } if (r === null) return null; result = r; } } if (!hasRest && ops2.length > 0) return null; if (result !== null && hasRest) result["__"] = ce._fn("Sequence", ops2); return result; } function matchCommutativeArguments(expr, pattern, substitution, options) { const patterns = permutations(pattern.ops); for (const pat of patterns) { const result = matchPermutation( expr.engine, expr.ops, pat, substitution, options ); if (result !== null) return result; } return null; } function matchNonCommutativeArguments(expr, pattern, substitution, options) { const ce = expr.engine; const ops2 = [...expr.ops]; let result = { ...substitution }; let i = 0; const patterns = pattern.ops; while (i < pattern.nops) { const pat = patterns[i]; const argName = pat.symbol; if (argName !== null) { if (argName.startsWith("__")) { let j = 0; if (patterns[i + 1] === void 0) { j = ops2.length + 1; } else { let found = false; while (!found && j < ops2.length) { found = matchOnce(ops2[j], patterns[i + 1], result, options) !== null; j += 1; } if (!found) return null; } if (!argName.startsWith("___") && j <= 1) return null; result = captureWildcard( argName, ce.fn("Sequence", ops2.splice(0, j - 1)), result ); } else if (argName.startsWith("_")) { result = captureWildcard(argName, ops2.shift(), result); } else { const sub2 = matchOnce(ops2.shift(), pat, result, options); if (sub2 === null) return null; result = sub2; } } else { const sub2 = matchOnce(ops2.shift(), pat, result, options); if (sub2 === null) return null; result = sub2; } if (result === null) return null; i += 1; } return result; } function match(subject, pattern, options) { var _a, _b; const substitution = matchOnce(subject, pattern, (_a = options.substitution) != null ? _a : {}, { numericTolerance: (_b = options == null ? void 0 : options.numericTolerance) != null ? _b : NUMERIC_TOLERANCE }); if (substitution) { /* @__PURE__ */ console.log("match", subject.toString(), pattern.toString(), substitution); return substitution; } if (!options.recursive) return null; return null; } function isSymbolDefinition2(def) { if (def === null || def === void 0) return false; if ("constant" in def) return true; return false; } function isFunctionDefinition2(def) { if (def === null || def === void 0) return false; if ("signature" in def) return true; return false; } var BoxedSymbol = class _BoxedSymbol extends AbstractBoxedExpression { constructor(ce, name, options) { var _a; super(ce, options == null ? void 0 : options.metadata); /* @__PURE__ */ console.assert( name === name.normalize(), `Symbol "${name}" must be in Unicode NFC canonical order` ); this._name = name; /* @__PURE__ */ console.assert( isValidIdentifier(this._name), `Invalid symbol "${name}": ${validateIdentifier(this._name)}` ); this._scope = (options == null ? void 0 : options.canonical) ? ce.context : null; this._def = (_a = options == null ? void 0 : options.def) != null ? _a : null; } get hash() { if (this._hash === void 0) this._hash = hashCode(this._name); return this._hash; } unbind() { var _a; (_a = this._def) == null ? void 0 : _a.reset(); this._def = null; } get isPure() { var _a, _b, _c, _d, _e; return (_e = (_d = ((_a = this.symbolDefinition) == null ? void 0 : _a.constant) && ((_b = this.symbolDefinition.value) == null ? void 0 : _b.isPure)) != null ? _d : (_c = this.functionDefinition) == null ? void 0 : _c.pure) != null ? _e : false; } get json() { return serializeJsonSymbol(this.engine, this._name, { latex: this._latex, wikidata: this._wikidata }); } get scope() { return this._scope; } /** A free variable either has no definition, or it has a definition, but no value */ get isFree() { var _a; const def = (_a = this._def) != null ? _a : this.engine.lookupSymbol(this._name, this._wikidata); return !isSymbolDefinition2(def) || def.value === void 0; } get isConstant() { var _a; const def = (_a = this._def) != null ? _a : this.engine.lookupSymbol(this._name, this._wikidata); return !isSymbolDefinition2(def) || def.constant; } get isCanonical() { return this._scope !== null; } set isCanonical(val) { this._scope = val ? this.engine.context : null; this._def = null; } get canonical() { if (this._scope) return this; return this.engine.box(this._name); } get wikidata() { var _a, _b, _c; return (_c = (_b = this._wikidata) != null ? _b : (_a = this.baseDefinition) == null ? void 0 : _a.wikidata) != null ? _c : void 0; } get description() { if (!this.baseDefinition) return void 0; if (!this.baseDefinition.description) return void 0; if (typeof this.baseDefinition.description === "string") return [this.baseDefinition.description]; return this.baseDefinition.description; } get url() { var _a, _b; return (_b = (_a = this.baseDefinition) == null ? void 0 : _a.url) != null ? _b : void 0; } get complexity() { return 7; } get head() { return "Symbol"; } get symbol() { return this._name; } get isNothing() { return this._name === "Nothing"; } // A base definition is the base class of both symbol and function definition get baseDefinition() { var _a; if (this._def === null) this.bind(this._scope); return (_a = this._def) != null ? _a : void 0; } get symbolDefinition() { if (this._def === null) this.bind(this._scope); return isSymbolDefinition2(this._def) ? this._def : void 0; } get functionDefinition() { if (this._def === null) this.bind(this._scope); return isFunctionDefinition2(this._def) ? this._def : void 0; } bind(scope) { if (scope === null) { this._def = void 0; return; } let def; def = this.engine.lookupSymbol(this._name, this._wikidata, scope); if ((def == null ? void 0 : def.wikidata) && this._wikidata && def.wikidata !== this._wikidata) def = void 0; if (def) { this._name = def.name; this._def = def; return; } def = this.engine.lookupFunction(this._name, scope); if (def) { this._def = def; return; } if (this.engine.defaultDomain !== null) { this._def = this.engine.defineSymbol(this._name, { wikidata: this._wikidata, domain: this.engine.defaultDomain }); this._name = this._def.name; } } get value() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.value; } set value(value) { var _a; if (this._name[0] === "_") throw new Error( `The value of the wildcard "${this._name}" cannot be changed` ); this.engine.forget(this._name); let v; if (value !== void 0) { const boxedValue = this.engine.box(value); v = (_a = boxedValue.value) != null ? _a : boxedValue.evaluate(); } if (v == null ? void 0 : v.domain.isCompatible("Function")) { this._def = this.engine.defineFunction(this._name, { signature: { domain: v.domain, evaluate: v // Evaluate as a lambda } }); } else if (this._def && isSymbolDefinition2(this._def)) { this._def.value = v; } else { let dom = v == null ? void 0 : v.domain; if (dom == null ? void 0 : dom.isNumeric) dom = this.engine.domain("Number"); this._def = this.engine.defineSymbol(this._name, { value: v, domain: dom != null ? dom : void 0 }); } } get domain() { var _a, _b, _c; if (this.functionDefinition) return this.engine.domain("Function"); return (_c = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.domain) != null ? _b : this.engine.defaultDomain) != null ? _c : this.engine.domain("Value"); } set domain(inDomain) { if (this._name[0] === "_") throw new Error( `The domain of the wildcard "${this._name}" cannot be changed` ); const d = this.engine.domain(inDomain); if (d.isCompatible("Function")) { this.engine.forget(this._name); this._def = this.engine.defineFunction(this._name, { signature: { domain: d } }); } else if (isSymbolDefinition2(this._def)) { this._def.domain = d; } else { this.engine.forget(this._name); this._def = this.engine.defineSymbol(this._name, { domain: d }); } } get explicitDomain() { var _a, _b; if (this.functionDefinition) return this.engine.domain("Function"); return (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.domain) != null ? _b : void 0; } get sgn() { const v = this.value; if (v && v !== this) { const s = v.sgn; if (s !== void 0) return s; } const def = this.symbolDefinition; if (def) { if (def.zero === true) return 0; if (def.positive === true) return 1; if (def.negative === true) return -1; } else return null; return void 0; } has(x) { if (typeof x === "string") return this._name === x; return x.includes(this._name); } isSame(rhs) { if (this === rhs) return true; if (!(rhs instanceof _BoxedSymbol)) return false; return this._name === rhs._name; } match(rhs, _options) { if (!(rhs instanceof _BoxedSymbol)) return null; if (this._name === rhs._name) return {}; return null; } isEqual(rhs) { var _a, _b; if (!this.isCanonical) return this.canonical.isEqual(rhs); rhs = rhs.canonical; if (this === rhs) return true; if (rhs.symbol !== null) return rhs.symbol === this._name; const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); if (lhsVal) return lhsVal.isEqual(rhs.N()); if (rhs.isZero) { if (this.isZero) return true; if (this.isNotZero) return false; } if (this.isZero && rhs.isNotZero) return false; if (this.engine.ask(["Equal", this, rhs]).length > 0) return true; if (this.engine.ask(["NotEqual", this, rhs]).length > 0) return false; return false; } isLess(rhs) { var _a, _b; if (rhs.symbol !== null && rhs.symbol === this._name) return false; const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); if (lhsVal) return lhsVal.isLess(rhs.N()); if (rhs.isZero) { const s = this.sgn; if (s === null) return false; if (s !== void 0) return s < 0; } return void 0; } isLessEqual(rhs) { var _a, _b; if (rhs.symbol !== null && rhs.symbol === this._name) return true; const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); if (lhsVal) return lhsVal.isLessEqual(rhs.N()); if (rhs.isZero) { const s = this.sgn; if (s === null) return false; if (s !== void 0) return s <= 0; } return this.isLess(rhs) || this.isEqual(rhs); } isGreater(rhs) { var _a, _b; if (rhs.symbol !== null && rhs.symbol === this._name) return false; const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); if (lhsVal) return lhsVal.isGreater(rhs.N()); if (rhs.isZero) { const s = this.sgn; if (s === null) return false; if (s !== void 0) return s > 0; } return void 0; } isGreaterEqual(rhs) { var _a, _b; if (rhs.symbol !== null && rhs.symbol === this._name) return true; const lhsVal = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(); if (lhsVal) return lhsVal.isGreaterEqual(rhs.N()); if (rhs.isZero) { const s = this.sgn; if (s === null) return false; if (s !== void 0) return s >= 0; } return this.isGreater(rhs) || this.isEqual(rhs); } get isFunction() { return !!this.functionDefinition; } get isZero() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.zero; } get isNotZero() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.notZero; } get isOne() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.one; } get isNegativeOne() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.negativeOne; } get isOdd() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.odd; } get isEven() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.even; } get isPrime() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.prime; } get isComposite() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.composite; } get isInfinity() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.infinity; } get isNaN() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.NaN; } // x > 0 get isPositive() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.positive; } get isNonPositive() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.nonPositive; } get isNegative() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.negative; } get isNonNegative() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.nonNegative; } get isNumber() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.number; } get isInteger() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.integer; } get isRational() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.rational; } get isAlgebraic() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.rational; } get isReal() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.real; } get isExtendedReal() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.extendedReal; } get isComplex() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.complex; } get isImaginary() { var _a; return (_a = this.symbolDefinition) == null ? void 0 : _a.imaginary; } simplify(options) { var _a; const def = this.symbolDefinition; if ((def == null ? void 0 : def.holdUntil) === "simplify" && def.value) return def.value.simplify(options); return (options == null ? void 0 : options.rules) ? (_a = this.replace(options.rules)) != null ? _a : this : this; } evaluate(options) { var _a, _b; const def = this.symbolDefinition; if (def && (def.holdUntil === "simplify" || def.holdUntil === "evaluate")) return (_b = (_a = def.value) == null ? void 0 : _a.evaluate(options)) != null ? _b : this; return this; } N(options) { var _a, _b, _c; const def = this.symbolDefinition; if (def && def.holdUntil === "never") return this; return (_c = (_b = (_a = this.symbolDefinition) == null ? void 0 : _a.value) == null ? void 0 : _b.N(options)) != null ? _c : this; } replace(rules, options) { return replace(this, rules, options); } subs(sub2, options) { if (sub2[this._name] === void 0) return (options == null ? void 0 : options.canonical) ? this.canonical : this; return this.engine.box(sub2[this._name], options); } }; function makeCanonicalSymbol(ce, name) { const def = ce.lookupSymbol(name, void 0, ce.context); if ((def == null ? void 0 : def.holdUntil) === "never" && def.value) return def.value; return new BoxedSymbol(ce, name, { canonical: true, def }); } var ComputeEngine = class _ComputeEngine { /** * Construct a new `ComputeEngine` instance. * * Identifier tables define functions and symbols (in `options.ids`). * If no table is provided the standard library is used (`ComputeEngine.getStandardLibrary()`) * * The LaTeX syntax dictionary is defined in `options.latexDictionary`. * * The order of the dictionaries matter: the definitions from the later ones * override the definitions from earlier ones. The first dictionary should * be the `'core'` dictionary which include some basic definitions such * as domains (`Boolean`, `Number`, etc...) that are used by later dictionaries. * * @param options.numericMode The default mode is `"auto"`. Use `"machine"` * to perform numeric calculations using 64-bit floats. Use `"bignum"` to * perform calculations using arbitrary precision floating point numbers. * Use `"auto"` or `"complex"` to allow calculations on complex numbers. * * @param options.numericPrecision Specific how many digits of precision * for the numeric calculations. Default is 100. * * @param options.tolerance If the absolute value of the difference of two * numbers is less than `tolerance`, they are considered equal. Used by * `chop()` as well. * * @param options.defaultDomain If an unknown symbol is encountered, assume * this is its domain. **Default** `ExtendedRealNumber` */ constructor(options) { var _a, _b, _c, _d; this._cache = {}; this._commonSymbols = { True: null, False: null, Maybe: null, All: null, Nothing: null, None: null, Undefined: null, Function: null, Pi: null, ImaginaryUnit: null }; this._commonNumbers = { "-5": null, "-4": null, "-3": null, "-2": null, 2: null, 3: null, 4: null, 5: null, 6: null, 7: null, 8: null, 9: null, 10: null, 11: null, 12: null, 36: null }; this._commonDomains = { Anything: null, Nothing: null, Boolean: null, MaybeBoolean: null, String: null, Domain: null, Symbol: null, Integer: null, RationalNumber: null, AlgebraicNumber: null, RealNumber: null, ExtendedRealNumber: null, ImaginaryNumber: null, ComplexNumber: null, ExtendedComplexNumber: null, Number: null, PositiveInteger: null, TranscendentalNumber: null, PositiveNumber: null, Function: null, // (Anything^n) -> Anything NumericFunction: null, // (Number^n) -> Number RealFunction: null, // (ExtendedRealNumber^n) -> ExtendRealNumber TrigonometricFunction: null, // (ComplexNumber) -> ComplexNumber LogicOperator: null, // (Boolean, Boolean) -> Boolean Predicate: null, // (Anything^n) -> MaybeBoolean RelationalOperator: null // (Anything, Anything) -> MaybeBoolean }; if (options !== void 0 && typeof options !== "object") throw Error("Unexpected argument"); this.strict = true; this._latexDictionary = options == null ? void 0 : options.latexDictionary; this._jsonSerializationOptions = { exclude: [], shorthands: ["function", "symbol", "string", "dictionary", "number"], metadata: [], precision: "max", repeatingDecimals: true }; this._useRawJsonSerializationOptions = false; this._rawJsonSerializationOptions = { exclude: [], shorthands: ["function", "symbol", "string", "dictionary", "number"], metadata: [], precision: "max", repeatingDecimals: false }; this._stats = { highwaterMark: 0, symbols: /* @__PURE__ */ new Set(), expressions: /* @__PURE__ */ new Set() }; this._defaultDomain = null; this._numericMode = (_a = options == null ? void 0 : options.numericMode) != null ? _a : "auto"; this._precision = Math.max( (_b = options == null ? void 0 : options.numericPrecision) != null ? _b : 100, Math.floor(MACHINE_PRECISION) ); this._bignum = Decimal.clone({ precision: this._precision }); this.tolerance = (_c = options == null ? void 0 : options.tolerance) != null ? _c : NUMERIC_TOLERANCE; this._ZERO = new BoxedNumber(this, 0); this._ONE = new BoxedNumber(this, 1); this._HALF = new BoxedNumber(this, [1, 2]); this._NEGATIVE_ONE = new BoxedNumber(this, -1); this._I = new BoxedNumber(this, import_complex20.Complex.I); this._NAN = new BoxedNumber(this, Number.NaN); this._POSITIVE_INFINITY = new BoxedNumber(this, Number.POSITIVE_INFINITY); this._NEGATIVE_INFINITY = new BoxedNumber(this, Number.NEGATIVE_INFINITY); this._COMPLEX_INFINITY = new BoxedNumber(this, import_complex20.Complex.INFINITY); this.reset(); this.context = { assumptions: new ExpressionMap(), timeLimit: 2, // execution time limit: 2.0 seconds memoryLimit: 1, // memory limit: 1.0 megabyte recursionLimit: 1024, iterationLimit: Number.POSITIVE_INFINITY }; const tables = (_d = options == null ? void 0 : options.ids) != null ? _d : _ComputeEngine.getStandardLibrary(); for (const table of tables) setCurrentContextSymbolTable(this, table); for (const d of Object.keys(this._commonDomains)) { if (this._commonDomains[d] && !this._commonDomains[d].symbolDefinition) this._commonDomains[d].bind(this.context); else this._commonDomains[d] = boxDomain(this, d); } for (const sym of Object.keys(this._commonSymbols)) { this._commonSymbols[sym] = new BoxedSymbol(this, sym, { canonical: true }); this._commonSymbols[sym].bind(this.context); } if (options == null ? void 0 : options.defaultDomain) { const defaultDomain = this.domain(options.defaultDomain); if (defaultDomain.isValid) this._defaultDomain = defaultDomain; else this._defaultDomain = this.domain("ExtendedRealNumber"); } else this._defaultDomain = this.domain("ExtendedRealNumber"); this.pushScope(); } /** * Return identifier tables suitable for the specified categories, or `"all"` * for all categories (`"arithmetic"`, `"algebra"`, etc...). * * An identifier table defines how the symbols and function names in a * MathJSON expression should be interpreted, i.e. how to evaluate and * manipulate them. * */ static getStandardLibrary(categories = "all") { return getStandardLibrary(categories); } get latexDictionary() { return this.latexSyntax.dictionary; } set latexDictionary(dic) { this.latexSyntax.dictionary = dic; } /** After the configuration of the engine has changed, clear the caches * so that new values can be recalculated. * * This needs to happen for example when the numeric precision changes. * * @internal */ reset() { var _a; /* @__PURE__ */ console.assert(this._bignum); this._BIGNUM_NEGATIVE_ONE = this.bignum(-1); this._BIGNUM_NAN = this.bignum(NaN); this._BIGNUM_ZERO = this.bignum(0); this._BIGNUM_ONE = this.bignum(1); this._BIGNUM_TWO = this.bignum(2); this._BIGNUM_HALF = this._BIGNUM_ONE.div(this._BIGNUM_TWO); this._BIGNUM_PI = this._BIGNUM_NEGATIVE_ONE.acos(); const symbols = this._stats.symbols.values(); const expressions = this._stats.expressions.values(); this._stats.symbols = /* @__PURE__ */ new Set(); this._stats.expressions = /* @__PURE__ */ new Set(); for (const s of symbols) s.unbind(); for (const s of expressions) s.unbind(); for (const d of Object.values(this._commonDomains)) d == null ? void 0 : d.unbind(); for (const d of Object.values(this._commonSymbols)) d == null ? void 0 : d.unbind(); let scope = this.context; while (scope) { if (scope.idTable) for (const [_k, v] of scope.idTable) v.reset(); scope = (_a = scope.parentScope) != null ? _a : null; } for (const k of Object.keys(this._cache)) if (this._cache[k].value) { if (!this._cache[k].purge) delete this._cache[k]; else this._cache[k].value = this._cache[k].purge(this._cache[k].value); } } /** @internal */ _register(_expr) { this._stats.highwaterMark += 1; } /** @internal */ _unregister(_expr) { } get stats() { const expressions = this._stats.expressions; this._stats.expressions = null; this._stats.expressions = expressions; return { ...this._stats // _dupeSymbols: topDupes, // _popularExpressions: top10, }; } /** The precision, or number of significant digits, of numeric * calculations when the numeric mode is `"auto"` or `"bignum"`. * * To make calculations using more digits, at the cost of expanded memory * usage and slower computations, set the `precision` higher. * * If the numeric mode is not `"auto"` or `"bignum"`, it is set to `"auto"`. * * Trigonometric operations are accurate for precision up to 1,000. * */ get precision() { if (this._numericMode === "machine" || this._numericMode === "complex") return Math.floor(MACHINE_PRECISION); return this._precision; } set precision(p) { var _a; if (p === "machine") p = Math.floor(MACHINE_PRECISION); const currentPrecision = this._precision; if (p === currentPrecision) return; if (typeof p !== "number" || p <= 0) throw Error('Expected "machine" or a positive number'); (_a = this._latexSyntax) == null ? void 0 : _a.updateOptions({ precision: p, avoidExponentsInRange: [-6, p] }); this._precision = Math.max(p, Math.floor(MACHINE_PRECISION)); if (this.jsonSerializationOptions.precision > this._precision) this.jsonSerializationOptions = { precision: this._precision }; if (this._numericMode !== "auto" && this._numericMode !== "bignum" && this._precision > Math.floor(MACHINE_PRECISION)) this._numericMode = "auto"; this._bignum = this._bignum.config({ precision: this._precision }); this.reset(); } get numericMode() { return this._numericMode; } set numericMode(f) { if (f === this._numericMode) return; if (typeof f !== "string") throw Error("Expected a string"); this._numericMode = f; if (f === "complex" || f === "machine") this._precision = Math.floor(MACHINE_PRECISION); if (this._latexSyntax && this.latexSyntax.options.precision > this._precision) this.latexSyntax.updateOptions({ precision: this._precision }); if (this.jsonSerializationOptions.precision > this._precision) this.jsonSerializationOptions = { precision: this._precision }; this.reset(); } /** @experimental */ get timeLimit() { var _a; let scope = this.context; while (scope) { if (scope.timeLimit !== void 0) return scope.timeLimit; scope = (_a = scope.parentScope) != null ? _a : null; } return 2; } /** @experimental */ get iterationLimit() { var _a; let scope = this.context; while (scope) { if (scope.iterationLimit !== void 0) return scope.iterationLimit; scope = (_a = scope.parentScope) != null ? _a : null; } return 1024; } /** @experimental */ get recursionLimit() { var _a; let scope = this.context; while (scope) { if (scope.recursionLimit !== void 0) return scope.recursionLimit; scope = (_a = scope.parentScope) != null ? _a : null; } return 1024; } /** * If an unknown symbol is encountered, assume it should * be a variable in this domain. * * If set to `null`, unknown symbols will trigger an error. * * **Default:** `"ExtendedRealNumber"` */ get defaultDomain() { return this._defaultDomain; } set defaultDomain(domain) { if (domain === null) this._defaultDomain = null; else { const defaultDomain = this.domain(domain); if (!defaultDomain.isValid) throw Error(`Invalid domain ${domain}`); this._defaultDomain = defaultDomain; } } /** * Values smaller than the tolerance are considered to be zero for the * purpose of comparison, i.e. if `|b - a| <= tolerance`, `b` is considered * equal to `a`. */ get tolerance() { return this._tolerance; } set tolerance(val) { if (typeof val === "number" && Number.isFinite(val)) this._tolerance = Math.max(val, 0); else this._tolerance = NUMERIC_TOLERANCE; this._bignumTolerance = this.bignum(this._tolerance); } chop(n) { if (typeof n === "number" && Math.abs(n) <= this._tolerance) return 0; if (n instanceof Decimal && n.abs().lte(this._bignumTolerance)) return 0; if (n instanceof import_complex20.Complex && Math.abs(n.re) <= this._tolerance && Math.abs(n.im) <= this._tolerance) return 0; return n; } bignum(a) { if (typeof a === "bigint") return new this._bignum(a.toString()); return new this._bignum(a); } complex(a, b) { if (a instanceof Decimal) a = a.toNumber(); if (b instanceof Decimal) b = b.toNumber(); return new import_complex20.Complex(a, b); } isBignum(a) { return a instanceof Decimal; } isComplex(a) { return a instanceof import_complex20.Complex; } get latexSyntax() { if (!this._latexSyntax) this._latexSyntax = new LatexSyntax({ computeEngine: this, dictionary: this._latexDictionary, precision: this.precision, avoidExponentsInRange: [-6, this.precision], onError: (err) => { throw new Error(JSON.stringify(err[0].message)); } }); return this._latexSyntax; } static getLatexDictionary(domain = "all") { return LatexSyntax.getDictionary(domain); } set costFunction(fn) { if (typeof fn !== "function") this._cost = DEFAULT_COST_FUNCTION; this._cost = fn; } get costFunction() { var _a; return (_a = this._cost) != null ? _a : DEFAULT_COST_FUNCTION; } /** * Return a matching symbol definition, starting with the current * scope and going up the scope chain. Prioritize finding a match by * wikidata, if provided. */ lookupSymbol(symbol2, wikidata, scope) { var _a, _b, _c; if (!this.strict) { scope != null ? scope : scope = (_a = this.context) != null ? _a : void 0; while (scope) { const def = (_b = scope.idTable) == null ? void 0 : _b.get(symbol2); if (isSymbolDefinition(def)) return def; scope = scope.parentScope; } return void 0; } if (typeof symbol2 !== "string") throw Error("Expected a string"); if (symbol2.length === 0 || !this.context) return void 0; const rootScope = scope != null ? scope : this.context; if (wikidata) { scope = rootScope; while (scope) { if (scope.idTable) for (const [_, d] of scope.idTable) { if (isSymbolDefinition(d) && d.wikidata === wikidata) return d; } scope = scope.parentScope; } } scope = rootScope; while (scope) { const def = (_c = scope.idTable) == null ? void 0 : _c.get(symbol2); if (isSymbolDefinition(def)) return def; scope = scope.parentScope; } return void 0; } /** * Return the definition for a function matching this head. * * Start looking in the current context, than up the scope chain. * * This is a very rough lookup, since it doesn't account for the domain * of the argument or the codomain. However, it is useful during parsing * to differentiate between symbols that might represent a function application, e.g. `f` vs `x`. */ lookupFunction(head2, scope) { var _a; if (typeof head2 !== "string") return void 0; if (!this.context) return void 0; scope != null ? scope : scope = this.context; while (scope) { const def = (_a = scope.idTable) == null ? void 0 : _a.get(head2); if (isFunctionDefinition(def)) return def; scope = scope.parentScope; } return void 0; } /** * Add (or replace) a definition for a symbol in the current scope. */ defineSymbol(name, def) { if (!this.context) throw Error("Symbol cannot be defined: no scope available"); if (name.length === 0 || !isValidIdentifier(name)) throw Error(`Invalid identifier "${name}": ${validateIdentifier(name)}}`); if (!this.context.idTable) this.context.idTable = /* @__PURE__ */ new Map(); const boxedDef = new BoxedSymbolDefinitionImpl(this, name, def); if (boxedDef.name) this.context.idTable.set(boxedDef.name, boxedDef); return boxedDef; } defineFunction(name, def) { if (!this.context) throw Error("Function cannot be defined: no scope available"); if (name.length === 0 || !isValidIdentifier(name)) throw Error(`Invalid identifier "${name}": ${validateIdentifier(name)}}`); if (!this.context.idTable) this.context.idTable = /* @__PURE__ */ new Map(); const boxedDef = makeFunctionDefinition(this, name, def); if (boxedDef.name) this.context.idTable.set(name, boxedDef); return boxedDef; } /** * * Create a new scope and add it to the top of the scope stack * * The `options.scope` property can be used to specify custom precision, * etc... for this scope * */ pushScope(ids, scope) { if (this.context === null) throw Error("No parent scope available"); this.context = { timeLimit: this.context.timeLimit, memoryLimit: this.context.memoryLimit, recursionLimit: this.context.recursionLimit, iterationLimit: this.context.iterationLimit, ...scope != null ? scope : {}, parentScope: this.context, // We always copy the current assumptions in the new scope. // This make is much easier to deal with 'inherited' assumptions // (and potentially modifying them later) without having to walk back // into parent contexts. In other words, calling `ce.forget()` will // forget everything **in the current scope**. When exiting the scope, // the previous assumptions are restored. assumptions: new ExpressionMap(this.context.assumptions) }; if (ids) { if (Array.isArray(ids)) for (const table of ids) setCurrentContextSymbolTable(this, table); else setCurrentContextSymbolTable(this, ids); } } /** Remove the topmost scope from the scope stack. */ popScope() { var _a; if (!this.context) throw Error("No scope available"); const parentScope = (_a = this.context) == null ? void 0 : _a.parentScope; this.context = parentScope != null ? parentScope : null; /* @__PURE__ */ console.assert(this.context !== null); } set(identifiers) { if (!this.strict) { for (const k of Object.keys(identifiers)) { if (k !== "Nothing") { const def = this.lookupSymbol(k); const idk = identifiers[k]; if (def) def.value = idk != null ? idk : void 0; else if (idk !== void 0 && idk !== null) { const val = this.box(idk); if (val.domain.isNumeric) this.defineSymbol(k, { value: val, domain: "Number" }); else this.defineSymbol(k, { value: val }); } } } return; } for (const k of Object.keys(identifiers)) { if (k !== "Nothing") { const def = this.lookupSymbol(k); const idk = identifiers[k]; if (idk === void 0 || idk === null) { if (def) def.value = void 0; } else { const val = this.box(idk); if (def) { if (def.domain && !val.domain.isCompatible(def.domain)) throw Error( `Expected value with domain ${def.domain.toString()} for "${k}"` ); def.value = val; } else { if (val.domain.isNumeric) this.defineSymbol(k, { value: val, domain: "Number" }); else this.defineSymbol(k, { value: val }); } } } } } let(identifiers) { for (const k of Object.keys(identifiers)) { if (k !== "Nothing") { const def = identifiers[k]; if (isSymbolDefinition(def)) this.defineSymbol(k, def); else if (isFunctionDefinition(def)) this.defineFunction(k, def); else this.set({ [k]: identifiers[k] }); } } } get assumptions() { if (!this.context) throw Error("No scope available"); if (this.context.assumptions) return this.context.assumptions; this.context.assumptions = new ExpressionMap(); return this.context.assumptions; } /** * Return false if the execution should stop. * * This can occur if: * - an error has been signaled * - the time limit or memory limit has been exceeded * * @internal */ shouldContinueExecution() { return this.deadline === void 0 || this.deadline >= Date.now(); } /** @internal */ checkContinueExecution() { if (!this.shouldContinueExecution()) { throw new Error("timeout"); } } // assert( // condition: boolean, // expr: BoxedExpression, // msg: string, // code?: SignalMessage // ) { // if (!condition) this.signal(expr, msg, code); // } /** @internal */ cache(cacheName, build, purge) { var _a; if (this._cache[cacheName] === void 0) { try { this._cache[cacheName] = { build, purge, value: build() }; } catch (e) { console.error( `Fatal error building cache "${cacheName}": ${e.toString()}` ); } } return (_a = this._cache[cacheName]) == null ? void 0 : _a.value; } box(expr, options) { return box(this, expr, options); } canonical(xs) { if (!xs.every((x) => x instanceof AbstractBoxedExpression)) return xs.map((x) => this.box(x)); const bxs = xs; return bxs.every((x) => x.isCanonical) ? bxs : bxs.map((x) => x.canonical); } fn(head2, ops2, options) { return boxFunction(this, head2, ops2, options != null ? options : { canonical: true }); } /** @internal */ _fn(head2, ops2, metadata) { return new BoxedFunction(this, head2, ops2, { metadata, canonical: true, def: this.lookupFunction(head2, this.context) }); } error(message, where) { if (where instanceof AbstractBoxedExpression) { where = this.rawJson(where); } else if (where && Array.isArray(where) && where[0] === "Latex") { if (where[1] === void 0 || !where[1]) where = ""; if (typeof where[1] === "object" && "str" in where[1] && !where[1].str) where = ""; } let msg = void 0; if (Array.isArray(message) && message[0] === "incompatible-domain") { msg = new BoxedFunction(this, "ErrorCode", [ this.string("incompatible-domain"), boxDomain(this, message[1]), boxDomain(this, message[2]) ]); } if (typeof message === "string") msg = this.string(message); if (!msg && typeof message !== "string") msg = new BoxedFunction(this, "ErrorCode", [ this.string(message[0]), ...message.slice(1).map((x) => { if (typeof x === "string") ; /* @__PURE__ */ console.assert(typeof x !== "string"); return this.box(x, { canonical: false }); }) ]); if (!where) return new BoxedFunction(this, "Error", [msg], { canonical: false }); return new BoxedFunction( this, "Error", [msg, this.box(where, { canonical: false })], { canonical: false } ); } hold(expr) { return this._fn("Hold", [this.box(expr, { canonical: false })]); } add(ops2, metadata) { const result = canonicalAdd(this, flattenOps(flattenSequence(ops2), "Add")); if ((metadata == null ? void 0 : metadata.latex) !== void 0) result.latex = metadata.latex; if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) result.wikidata = metadata.wikidata; return result; } neg(expr, metadata) { return canonicalNegate(expr, metadata); } mul(ops2, metadata) { const result = canonicalMultiply( this, flattenOps(flattenSequence(ops2), " Multiply") ); if ((metadata == null ? void 0 : metadata.latex) !== void 0) result.latex = metadata.latex; if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) result.wikidata = metadata.wikidata; return result; } div(num, denom, metadata) { const result = canonicalDivide(this, num, denom); if ((metadata == null ? void 0 : metadata.latex) !== void 0) result.latex = metadata.latex; if ((metadata == null ? void 0 : metadata.wikidata) !== void 0) result.wikidata = metadata.wikidata; return result; } sqrt(base, metadata) { return canonicalPower(this, base, this._HALF, metadata); } pow(base, exponent, metadata) { if (base.symbol === "ExponentialE" && exponent instanceof import_complex20.Complex && exponent.re === 0) { const im = exponent.im; return this.number(this.complex(Math.cos(im), Math.sin(im))); } if (exponent instanceof AbstractBoxedExpression) { const num = exponent.numericValue; if (num !== null) { if (typeof num === "number") exponent = num; if (isRational(num)) exponent = num; } } let e = null; if (typeof exponent === "number") e = exponent; else if (isRational(exponent)) { if (isMachineRational(exponent) && exponent[1] === 1) e = exponent[0]; else if (isBigRational(exponent) && exponent[1] === BigInt(1)) e = Number(exponent[0]); } if (e === 1) return base; const r = base.numericValue; if (e === -1 && r !== null) { if (typeof r === "number" && Number.isInteger(r)) return this.number([1, r]); else if (r instanceof Decimal && r.isInteger()) return this.number([BigInt(1), bigint(r)]); else if (isRational(r)) return this.number([r[1], r[0]]); } if (typeof exponent === "number" || isRational(exponent)) exponent = this.number(exponent); return canonicalPower(this, base, exponent, metadata); } inv(expr, metadata) { if (expr.isOne) return this._ONE; if (expr.isNegativeOne) return this._NEGATIVE_ONE; if (expr.isInfinity) return this._ZERO; const n = expr.numericValue; if (n !== null) { if (isRational(n)) return this.number(inverse(n), { metadata }); if (typeof n === "number" && Number.isInteger(n)) return this.number([1, n], { metadata }); if (n instanceof Decimal && n.isInteger()) return this.number([BigInt(1), bigint(n)], { metadata }); return this._fn("Divide", [this._ONE, expr], metadata); } if (expr.head === "Sqrt") return this._fn("Sqrt", [this.inv(expr.op1)], metadata); if (expr.head === "Divide") return this._fn("Divide", [expr[1], expr[0]], metadata); let e = this._NEGATIVE_ONE; if (expr.head === "Power") { if (expr.op2.isNegativeOne) return expr.op1; e = canonicalNegate(expr.op2); expr = expr.op1; } if (e.isNegativeOne) return this._fn("Divide", [this._ONE, expr], metadata); return this._fn("Power", [expr, e], metadata); } pair(first, second, metadata) { return new BoxedFunction(this, "Tuple", [first, second], { metadata, canonical: true }); } tuple(elements, metadata) { return new BoxedFunction(this, "Tuple", canonical(elements), { metadata, canonical: true }); } string(s, metadata) { return new BoxedString(this, s, metadata); } symbol(name, options) { var _a, _b, _c; options = options ? { ...options } : {}; if (!("canonical" in options)) options.canonical = true; name = name.normalize(); if (name === "NaN") return this._NAN; if (name === "Infinity") return this._POSITIVE_INFINITY; if (name === "+Infinity") return this._POSITIVE_INFINITY; if (name === "-Infinity") return this._NEGATIVE_INFINITY; if (name === "Half") return this._HALF; if (this.strict && !isValidIdentifier(name)) { const where = (_a = options == null ? void 0 : options.metadata) == null ? void 0 : _a.latex; const nameStr = `'${name}'`; return this.error( ["invalid-identifier", { str: validateIdentifier(name) }], where ? ["Latex", `'${where}'`] : nameStr ); } if (((_b = options == null ? void 0 : options.metadata) == null ? void 0 : _b.latex) !== void 0 && !options.canonical) return new BoxedSymbol(this, name, options); const result = this._commonSymbols[name]; if (result) { if (!((_c = options == null ? void 0 : options.metadata) == null ? void 0 : _c.wikidata) || !result.wikidata || result.wikidata === options.metadata.wikidata) return result; if (options.canonical) return makeCanonicalSymbol(this, name); return new BoxedSymbol(this, name, options); } if (options.canonical) return makeCanonicalSymbol(this, name); return new BoxedSymbol(this, name, options); } domain(domain, metadata) { if (domain instanceof _BoxedDomain) return domain; if (domain instanceof AbstractBoxedExpression && domain.symbol) domain = domain.symbol; if (typeof domain === "string") { const expr = this._commonDomains[domain]; if (expr) return expr; } return boxDomain(this, domain, metadata); } /* * This function tries to avoid creating a boxed number if `num` corresponds * to a common value for which we have a shared instance (-1, 0, NaN, etc...) */ number(value, options) { var _a, _b; options = options ? { ...options } : {}; if (!("canonical" in options)) options.canonical = true; if (options.metadata === void 0) { if (typeof value === "bigint") { if (value === BigInt(1)) return this._ONE; if (value === BigInt(0)) return this._ZERO; if (value === BigInt(-1)) return this._NEGATIVE_ONE; } if (typeof value === "number") { const n = value; if (n === 1) return this._ONE; if (n === 0) return this._ZERO; if (n === -1) return this._NEGATIVE_ONE; if (Number.isInteger(n) && this._commonNumbers[n] !== void 0) { if (this._commonNumbers[n] === null) this._commonNumbers[n] = (_a = boxNumber(this, value)) != null ? _a : this._NAN; return this._commonNumbers[n]; } if (Number.isNaN(n)) return this._NAN; if (!Number.isFinite(n)) return n < 0 ? this._NEGATIVE_INFINITY : this._POSITIVE_INFINITY; } } if (typeof value === "bigint") value = this.bignum(value); return (_b = boxNumber(this, value, options)) != null ? _b : this._NAN; } rules(rules) { return boxRules(this, rules); } pattern(expr) { return new BoxedPattern(this, expr); } parse(latex, options) { var _a; if (typeof latex !== "string") return null; const result = this.latexSyntax.parse((_a = latexString(latex)) != null ? _a : latex); return this.box(result, options); } serialize(x, options) { if (typeof x === "object" && "json" in x) { const ce = "engine" in x ? x.engine : this; return this.latexSyntax.serialize( this.rawJson(ce.box(x, { canonical: false })), options ); } return this.latexSyntax.serialize(x, options); } get latexOptions() { const latexSyntax = this.latexSyntax; return new Proxy( { ...this.latexSyntax.options, ...this.latexSyntax.serializer.options }, { set(options, prop, value) { if (!(prop in options)) return false; latexSyntax.updateOptions({ [prop]: value }); return true; } } ); } set latexOptions(opts) { this.latexSyntax.updateOptions(opts); } get jsonSerializationOptions() { if (this._useRawJsonSerializationOptions) { return new Proxy(this._rawJsonSerializationOptions, { get(options, prop) { if (!(prop in options)) return void 0; return options[prop]; } }); } const self = this; return new Proxy(this._jsonSerializationOptions, { get(options, prop) { if (!(prop in options)) return void 0; return options[prop]; }, set(options, prop, value) { if (!(prop in options)) return false; self.jsonSerializationOptions = { [prop]: value }; return true; } }); } set jsonSerializationOptions(val) { if (val.exclude) this._jsonSerializationOptions.exclude = [...val.exclude]; if (val.shorthands) { if (val.shorthands === "all" || val.shorthands.includes("all")) { this._jsonSerializationOptions.shorthands = [ "function", "symbol", "string", "dictionary", "number" ]; } else this._jsonSerializationOptions.shorthands = [...val.shorthands]; } if (val.metadata) { if (val.metadata === "all" || val.metadata.includes("all")) { this._jsonSerializationOptions.metadata = ["latex", "wikidata"]; } else this._jsonSerializationOptions.metadata = [...val.metadata]; } if (typeof val.precision === "number" && val.precision > 0) { this._jsonSerializationOptions.precision = val.precision; } if (typeof val.repeatingDecimals === "boolean") { this._jsonSerializationOptions.repeatingDecimals = val.repeatingDecimals; } } rawJson(expr) { const save = this._useRawJsonSerializationOptions; this._useRawJsonSerializationOptions = true; const result = expr.json; this._useRawJsonSerializationOptions = save; return result; } /** * Return a list of all the assumptions that match a pattern. * * ```js * ce.assume(x, 'PositiveInteger'); * ce.ask(['Greater', 'x', '_val']) * // -> [{'val': 0}] * ``` */ ask(pattern) { const pat = this.pattern(pattern); const result = []; for (const [assumption, val] of this.assumptions) { const m = pat.match(assumption, { numericTolerance: this._tolerance }); if (m !== null && val === true) result.push(m); } return result; } // Based on contextual usage, infer domain of a symbol infer(symbol2, _domain) { if (typeof symbol2 !== "string") { if (!symbol2.symbol) return "internal-error"; symbol2 = symbol2.symbol; } return "ok"; } assume(arg1, arg2) { try { const latex = latexString(arg1); const predicate = latex ? this.parse(latex, { canonical: false }) : this.box(arg1, { canonical: false }); if (!arg2) return assume(predicate); if (isDomain(arg2)) return assume(this.box(["Element", predicate, this.domain(arg2)])); return assume(this.box(["Equal", predicate, arg2])); } catch (e) { console.error(e); return "internal-error"; } } forget(symbol2) { var _a, _b; if (!this.context) throw Error("No scope available"); if (symbol2 === void 0) { if (this.context.idTable) for (const k of this.context.idTable.keys()) this.forget(k); this.assumptions.clear(); return; } if (Array.isArray(symbol2)) { for (const x of symbol2) this.forget(x); return; } if (typeof symbol2 === "string") { if (this.context.idTable) { const def = this.context.idTable.get(symbol2); if (isSymbolDefinition(def)) { def.value = void 0; if ((_a = def.domain) == null ? void 0 : _a.isNumeric) { def.domain = (_b = this.defaultDomain) != null ? _b : this.domain("Number"); } else def.domain = void 0; } } for (const [assumption, _val] of this.assumptions) { if (assumption.symbols.includes(symbol2)) this.assumptions.delete(assumption); } } } }; globalThis[Symbol.for("io.cortexjs.compute-engine")] = { ComputeEngine: ComputeEngine.prototype.constructor, version: "0.15.0" }; // src/editor.ts var CALCULATE_TRIGGER_SYMBOL = " ="; var CalctexHintRenderer = class { constructor(view) { this.decorations = this.buildDecorations(view); } update(update) { this.decorations = this.buildDecorations(update.view); } destroy() { } buildDecorations(view) { const builder = new import_state.RangeSetBuilder(); for (let { from, to } of view.visibleRanges) { let cursorPos = view.state.selection.main.from; let mathBegin = null; (0, import_language.syntaxTree)(view.state).iterate({ from, to, enter(node) { let nodeTags = node.type.name.split("_"); if (nodeTags.contains("formatting-math-begin")) mathBegin = node.to; if (nodeTags.contains("formatting-math-end") && mathBegin != null) { let mathEnd = node.from; if (cursorPos < mathBegin || mathEnd < cursorPos) return; let formula = view.state.sliceDoc(mathBegin, mathEnd); if (!formula.trim().endsWith(CALCULATE_TRIGGER_SYMBOL)) return; let formulaLength = formula.replace("\n", "").length; let insertIndex = mathBegin + formulaLength; const calculationEngine = new ComputeEngine(); calculationEngine.latexOptions = { multiply: "*", groupSeparator: "'" }; let formattedFormula = formula.trim().slice(0, -CALCULATE_TRIGGER_SYMBOL.length).trim(); let result = calculationEngine.parse(formattedFormula).evaluate().latex; let resultString = ` ${result}`; if (result.toLowerCase().contains("error")) resultString = ` \u26A1`; builder.add( insertIndex, insertIndex, import_view2.Decoration.replace({ widget: new ResultWidget(view, insertIndex, resultString) }) ); } } }); } return builder.finish(); } }; var pluginSpec = { decorations: (value) => value.decorations }; var calctexHintRenderer = import_view2.ViewPlugin.fromClass( CalctexHintRenderer, pluginSpec ); // src/main.ts var CalctexPlugin = class extends import_obsidian.Plugin { async onload() { this.registerEditorExtension([calctexHintRenderer]); } onunload() { } }; /*! Bundled license information: @cortex-js/compute-engine/dist/compute-engine.min.esm.js: (*! Bundled license information: complex.js/complex.js: (** * @license Complex.js v2.1.1 12/05/2020 * * Copyright (c) 2020, Robert Eisele (robert@xarg.org) * Dual licensed under the MIT or GPL Version 2 licenses. **) decimal.js/decimal.mjs: (*! * decimal.js v10.4.3 * An arbitrary-precision Decimal type for JavaScript. * https://github.com/MikeMcl/decimal.js * Copyright (c) 2022 Michael Mclaughlin * MIT Licence *) *) */ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL2VkaXRvci50cyIsICJzcmMvd2lkZ2V0LnRzIiwgIm5vZGVfbW9kdWxlcy9AY29ydGV4LWpzL2NvbXB1dGUtZW5naW5lL2Rpc3QvY29tcHV0ZS1lbmdpbmUubWluLmVzbS5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgY2FsY3RleEhpbnRSZW5kZXJlciB9IGZyb20gJy4vZWRpdG9yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FsY3RleFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdGFzeW5jIG9ubG9hZCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uKFtjYWxjdGV4SGludFJlbmRlcmVyXSk7XG5cdH1cblxuXHRvbnVubG9hZCgpIHt9XG59IiwgIi8vQHRzLWlnbm9yZVxyXG5pbXBvcnQgeyBzeW50YXhUcmVlIH0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XHJcbmltcG9ydCB7IFJhbmdlU2V0QnVpbGRlciB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xyXG5pbXBvcnQge1xyXG4gIERlY29yYXRpb24sXHJcbiAgRGVjb3JhdGlvblNldCxcclxuICBFZGl0b3JWaWV3LFxyXG4gIFBsdWdpblNwZWMsXHJcbiAgUGx1Z2luVmFsdWUsXHJcbiAgVmlld1BsdWdpbixcclxuICBWaWV3VXBkYXRlXHJcbn0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcclxuaW1wb3J0IHsgUmVzdWx0V2lkZ2V0IH0gZnJvbSBcInNyYy93aWRnZXRcIjtcclxuaW1wb3J0IHsgQ29tcHV0ZUVuZ2luZSB9IGZyb20gJ0Bjb3J0ZXgtanMvY29tcHV0ZS1lbmdpbmUnO1xyXG5cclxuY29uc3QgQ0FMQ1VMQVRFX1RSSUdHRVJfU1lNQk9MID0gXCIgPVwiO1xyXG5cclxuY2xhc3MgQ2FsY3RleEhpbnRSZW5kZXJlciBpbXBsZW1lbnRzIFBsdWdpblZhbHVlIHtcclxuICBkZWNvcmF0aW9uczogRGVjb3JhdGlvblNldDtcclxuXHJcbiAgY29uc3RydWN0b3IodmlldzogRWRpdG9yVmlldykge1xyXG4gICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh2aWV3KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZSh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcclxuICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjb3JhdGlvbnModXBkYXRlLnZpZXcpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpIHt9XHJcblxyXG4gIGJ1aWxkRGVjb3JhdGlvbnModmlldzogRWRpdG9yVmlldyk6IERlY29yYXRpb25TZXQge1xyXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4oKTtcclxuXHJcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XHJcbiAgICAgIGxldCBjdXJzb3JQb3MgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmZyb207XHJcbiAgICAgIGxldCBtYXRoQmVnaW46IG51bWJlcnxudWxsID0gbnVsbDtcclxuXHJcbiAgICAgIHN5bnRheFRyZWUodmlldy5zdGF0ZSkuaXRlcmF0ZSh7XHJcbiAgICAgICAgZnJvbSxcclxuICAgICAgICB0byxcclxuICAgICAgICBlbnRlcihub2RlOiBhbnkpIHtcclxuICAgICAgICAgIGxldCBub2RlVGFncyA9IG5vZGUudHlwZS5uYW1lLnNwbGl0KFwiX1wiKVxyXG5cclxuICAgICAgICAgIGlmIChub2RlVGFncy5jb250YWlucyhcImZvcm1hdHRpbmctbWF0aC1iZWdpblwiKSlcclxuICAgICAgICAgICAgbWF0aEJlZ2luID0gbm9kZS50bztcclxuICAgICAgICAgIGlmIChub2RlVGFncy5jb250YWlucyhcImZvcm1hdHRpbmctbWF0aC1lbmRcIikgJiYgbWF0aEJlZ2luICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IG1hdGhFbmQgPSBub2RlLmZyb207XHJcbiAgICAgICAgICAgIGlmIChjdXJzb3JQb3MgPCBtYXRoQmVnaW4gfHwgbWF0aEVuZCA8IGN1cnNvclBvcykgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZvcm11bGEgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKG1hdGhCZWdpbiwgbWF0aEVuZCk7XHJcbiAgICAgICAgICAgIGlmICghZm9ybXVsYS50cmltKCkuZW5kc1dpdGgoQ0FMQ1VMQVRFX1RSSUdHRVJfU1lNQk9MKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgLy8gQ291bnQgdGhlIGxlbmd0aCBvZiB0aGUgZm9ybXVsYSB3aXRob3V0IG5ld2xpbmVzXHJcbiAgICAgICAgICAgIGxldCBmb3JtdWxhTGVuZ3RoID0gZm9ybXVsYS5yZXBsYWNlKFwiXFxuXCIsIFwiXCIpLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IGluc2VydEluZGV4ID0gbWF0aEJlZ2luICsgZm9ybXVsYUxlbmd0aDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0aW9uRW5naW5lID0gbmV3IENvbXB1dGVFbmdpbmUoKTtcclxuICAgICAgICAgICAgY2FsY3VsYXRpb25FbmdpbmUubGF0ZXhPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgIG11bHRpcGx5OiBcIipcIixcclxuICAgICAgICAgICAgICBncm91cFNlcGFyYXRvcjogXCInXCIsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkRm9ybXVsYSA9IGZvcm11bGEudHJpbSgpLnNsaWNlKDAsIC1DQUxDVUxBVEVfVFJJR0dFUl9TWU1CT0wubGVuZ3RoKS50cmltKCk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBjYWxjdWxhdGlvbkVuZ2luZS5wYXJzZShmb3JtYXR0ZWRGb3JtdWxhKS5ldmFsdWF0ZSgpLmxhdGV4O1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdFN0cmluZyA9IGAgJHtyZXN1bHR9YDtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKFwiZXJyb3JcIikpIHJlc3VsdFN0cmluZyA9IGAgXHUyNkExYDtcclxuXHJcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkKFxyXG4gICAgICAgICAgICAgIGluc2VydEluZGV4LFxyXG4gICAgICAgICAgICAgIGluc2VydEluZGV4LFxyXG4gICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBSZXN1bHRXaWRnZXQodmlldywgaW5zZXJ0SW5kZXgsIHJlc3VsdFN0cmluZyksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHBsdWdpblNwZWM6IFBsdWdpblNwZWM8Q2FsY3RleEhpbnRSZW5kZXJlcj4gPSB7XHJcbiAgZGVjb3JhdGlvbnM6ICh2YWx1ZTogQ2FsY3RleEhpbnRSZW5kZXJlcikgPT4gdmFsdWUuZGVjb3JhdGlvbnMsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgY2FsY3RleEhpbnRSZW5kZXJlciA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKFxyXG4gIENhbGN0ZXhIaW50UmVuZGVyZXIsXHJcbiAgcGx1Z2luU3BlY1xyXG4pOyIsICJpbXBvcnQgeyBFZGl0b3JWaWV3LCBXaWRnZXRUeXBlIH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZXN1bHRXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlldzogRWRpdG9yVmlldywgcHVibGljIGluZGV4OiBudW1iZXIsIHB1YmxpYyB0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICB0b0RPTSh2aWV3OiBFZGl0b3JWaWV3KTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICBkaXYuY2xhc3NOYW1lID0gXCJyZXN1bHQtdGV4dFwiO1xyXG5cclxuICAgIGRpdi5pbm5lclRleHQgPSB0aGlzLnRleHQ7XHJcbiAgICBkaXYub25jbGljayA9ICgpID0+IHtcclxuICAgICAgLy8gSW5zZXJ0IHRoZSByZXN1bHQgaW50byB0aGUgZWRpdG9yXHJcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdmlldy5zdGF0ZS51cGRhdGUoe1xyXG4gICAgICAgIGNoYW5nZXM6IHtcclxuICAgICAgICAgIGZyb206IHRoaXMuaW5kZXgsXHJcbiAgICAgICAgICB0bzogdGhpcy5pbmRleCxcclxuICAgICAgICAgIGluc2VydDogdGhpcy50ZXh0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICB2aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGRpdjtcclxuICB9XHJcbn0iLCAiLyoqIENvcnRleEpTIENvbXB1dGUgRW5naW5lIDAuMTUuMCAqL1xudmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QyKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUoKSB7XG4gIHJldHVybiBtb2QyIHx8ICgwLCBjYltfX2dldE93blByb3BOYW1lcyhjYilbMF1dKSgobW9kMiA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kMiksIG1vZDIuZXhwb3J0cztcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0VTTSA9IChtb2QyLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QyICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kMikpIDoge30sIF9fY29weVByb3BzKFxuICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNXG4gIC8vIGZpbGUgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBDb21tb25KUyBmaWxlIHVzaW5nIGEgQmFiZWwtXG4gIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuIFwiX19lc01vZHVsZVwiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldFxuICAvLyBcImRlZmF1bHRcIiB0byB0aGUgQ29tbW9uSlMgXCJtb2R1bGUuZXhwb3J0c1wiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuXG4gIGlzTm9kZU1vZGUgfHwgIW1vZDIgfHwgIW1vZDIuX19lc01vZHVsZSA/IF9fZGVmUHJvcCh0YXJnZXQsIFwiZGVmYXVsdFwiLCB7IHZhbHVlOiBtb2QyLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0LFxuICBtb2QyXG4pKTtcblxuLy8gbm9kZV9tb2R1bGVzL2NvbXBsZXguanMvY29tcGxleC5qc1xudmFyIHJlcXVpcmVfY29tcGxleCA9IF9fY29tbW9uSlMoe1xuICBcIm5vZGVfbW9kdWxlcy9jb21wbGV4LmpzL2NvbXBsZXguanNcIihleHBvcnRzLCBtb2R1bGUpIHtcbiAgICAoZnVuY3Rpb24ocm9vdCkge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgICB2YXIgY29zaDIgPSBNYXRoLmNvc2ggfHwgZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoeCkgPCAxZS05ID8gMSAtIHggOiAoTWF0aC5leHAoeCkgKyBNYXRoLmV4cCgteCkpICogMC41O1xuICAgICAgfTtcbiAgICAgIHZhciBzaW5oMiA9IE1hdGguc2luaCB8fCBmdW5jdGlvbih4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh4KSA8IDFlLTkgPyB4IDogKE1hdGguZXhwKHgpIC0gTWF0aC5leHAoLXgpKSAqIDAuNTtcbiAgICAgIH07XG4gICAgICB2YXIgY29zbTEgPSBmdW5jdGlvbih4KSB7XG4gICAgICAgIHZhciBiID0gTWF0aC5QSSAvIDQ7XG4gICAgICAgIGlmICgtYiA+IHggfHwgeCA+IGIpIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5jb3MoeCkgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4eCA9IHggKiB4O1xuICAgICAgICByZXR1cm4geHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggKiAoeHggLyAyMDkyMjc4OTg4OGUzIC0gMSAvIDg3MTc4MjkxMjAwKSArIDEgLyA0NzkwMDE2MDApIC0gMSAvIDM2Mjg4MDApICsgMSAvIDQwMzIwKSAtIDEgLyA3MjApICsgMSAvIDI0KSAtIDEgLyAyKTtcbiAgICAgIH07XG4gICAgICB2YXIgaHlwb3QyID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB2YXIgYSA9IE1hdGguYWJzKHgpO1xuICAgICAgICB2YXIgYiA9IE1hdGguYWJzKHkpO1xuICAgICAgICBpZiAoYSA8IDNlMyAmJiBiIDwgM2UzKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICBhID0gYjtcbiAgICAgICAgICBiID0geCAvIHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYiA9IHkgLyB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhICogTWF0aC5zcXJ0KDEgKyBiICogYik7XG4gICAgICB9O1xuICAgICAgdmFyIHBhcnNlcl9leGl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IFN5bnRheEVycm9yKFwiSW52YWxpZCBQYXJhbVwiKTtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBsb2dIeXBvdChhLCBiKSB7XG4gICAgICAgIHZhciBfYSA9IE1hdGguYWJzKGEpO1xuICAgICAgICB2YXIgX2IgPSBNYXRoLmFicyhiKTtcbiAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5sb2coX2IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGgubG9nKF9hKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2EgPCAzZTMgJiYgX2IgPCAzZTMpIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5sb2coYSAqIGEgKyBiICogYikgKiAwLjU7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEgLyAyO1xuICAgICAgICBiID0gYiAvIDI7XG4gICAgICAgIHJldHVybiAwLjUgKiBNYXRoLmxvZyhhICogYSArIGIgKiBiKSArIE1hdGguTE4yO1xuICAgICAgfVxuICAgICAgdmFyIHBhcnNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgICAgICB2YXIgeiA9IHsgXCJyZVwiOiAwLCBcImltXCI6IDAgfTtcbiAgICAgICAgaWYgKGEgPT09IHZvaWQgMCB8fCBhID09PSBudWxsKSB7XG4gICAgICAgICAgeltcInJlXCJdID0geltcImltXCJdID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChiICE9PSB2b2lkIDApIHtcbiAgICAgICAgICB6W1wicmVcIl0gPSBhO1xuICAgICAgICAgIHpbXCJpbVwiXSA9IGI7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGEpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgICAgaWYgKFwiaW1cIiBpbiBhICYmIFwicmVcIiBpbiBhKSB7XG4gICAgICAgICAgICAgICAgeltcInJlXCJdID0gYVtcInJlXCJdO1xuICAgICAgICAgICAgICAgIHpbXCJpbVwiXSA9IGFbXCJpbVwiXTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcImFic1wiIGluIGEgJiYgXCJhcmdcIiBpbiBhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYVtcImFic1wiXSkgJiYgTnVtYmVyLmlzRmluaXRlKGFbXCJhcmdcIl0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGFbXCJhYnNcIl0gKiBNYXRoLmNvcyhhW1wiYXJnXCJdKTtcbiAgICAgICAgICAgICAgICB6W1wiaW1cIl0gPSBhW1wiYWJzXCJdICogTWF0aC5zaW4oYVtcImFyZ1wiXSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJyXCIgaW4gYSAmJiBcInBoaVwiIGluIGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShhW1wiclwiXSkgJiYgTnVtYmVyLmlzRmluaXRlKGFbXCJwaGlcIl0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGFbXCJyXCJdICogTWF0aC5jb3MoYVtcInBoaVwiXSk7XG4gICAgICAgICAgICAgICAgeltcImltXCJdID0gYVtcInJcIl0gKiBNYXRoLnNpbihhW1wicGhpXCJdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGFbMF07XG4gICAgICAgICAgICAgICAgeltcImltXCJdID0gYVsxXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJzZXJfZXhpdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB6W1wiaW1cIl0gPSAvKiB2b2lkICovXG4gICAgICAgICAgICAgIHpbXCJyZVwiXSA9IDA7XG4gICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBhLm1hdGNoKC9cXGQrXFwuP1xcZCplWystXT9cXGQrfFxcZCtcXC4/XFxkKnxcXC5cXGQrfC4vZyk7XG4gICAgICAgICAgICAgIHZhciBwbHVzID0gMTtcbiAgICAgICAgICAgICAgdmFyIG1pbnVzID0gMDtcbiAgICAgICAgICAgICAgaWYgKHRva2VucyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlcl9leGl0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gXCIgXCIgfHwgYyA9PT0gXCJcdFwiIHx8IGMgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IFwiK1wiKSB7XG4gICAgICAgICAgICAgICAgICBwbHVzKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSBcIi1cIikge1xuICAgICAgICAgICAgICAgICAgbWludXMrKztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IFwiaVwiIHx8IGMgPT09IFwiSVwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocGx1cyArIG1pbnVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlcl9leGl0KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAodG9rZW5zW2kgKyAxXSAhPT0gXCIgXCIgJiYgIWlzTmFOKHRva2Vuc1tpICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJpbVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgdG9rZW5zW2kgKyAxXSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJpbVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcGx1cyA9IG1pbnVzID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKHBsdXMgKyBtaW51cyA9PT0gMCB8fCBpc05hTihjKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZXJfZXhpdCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tpICsgMV0gPT09IFwiaVwiIHx8IHRva2Vuc1tpICsgMV0gPT09IFwiSVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJpbVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgYyk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHpbXCJyZVwiXSArPSBwYXJzZUZsb2F0KChtaW51cyAlIDIgPyBcIi1cIiA6IFwiXCIpICsgYyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBwbHVzID0gbWludXMgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocGx1cyArIG1pbnVzID4gMCkge1xuICAgICAgICAgICAgICAgIHBhcnNlcl9leGl0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgIHpbXCJpbVwiXSA9IDA7XG4gICAgICAgICAgICAgIHpbXCJyZVwiXSA9IGE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcGFyc2VyX2V4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIGlmIChpc05hTih6W1wicmVcIl0pIHx8IGlzTmFOKHpbXCJpbVwiXSkpIHtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gejtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBDb21wbGV4MjAoYSwgYikge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29tcGxleDIwKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKGEsIGIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB6ID0gcGFyc2UoYSwgYik7XG4gICAgICAgIHRoaXNbXCJyZVwiXSA9IHpbXCJyZVwiXTtcbiAgICAgICAgdGhpc1tcImltXCJdID0geltcImltXCJdO1xuICAgICAgfVxuICAgICAgQ29tcGxleDIwLnByb3RvdHlwZSA9IHtcbiAgICAgICAgXCJyZVwiOiAwLFxuICAgICAgICBcImltXCI6IDAsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBzaWduIG9mIGEgY29tcGxleCBudW1iZXIsIHdoaWNoIGlzIGEgbm9ybWFsaXplZCBjb21wbGV4XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJzaWduXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhYnMyID0gdGhpc1tcImFic1wiXSgpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgdGhpc1tcInJlXCJdIC8gYWJzMixcbiAgICAgICAgICAgIHRoaXNbXCJpbVwiXSAvIGFiczJcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWRkcyB0d28gY29tcGxleCBudW1iZXJzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhZGRcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSAmJiB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiTkFOXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSB8fCB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgdGhpc1tcInJlXCJdICsgeltcInJlXCJdLFxuICAgICAgICAgICAgdGhpc1tcImltXCJdICsgeltcImltXCJdXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFN1YnRyYWN0cyB0d28gY29tcGxleCBudW1iZXJzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJzdWJcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSAmJiB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiTkFOXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSB8fCB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgdGhpc1tcInJlXCJdIC0geltcInJlXCJdLFxuICAgICAgICAgICAgdGhpc1tcImltXCJdIC0geltcImltXCJdXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE11bHRpcGxpZXMgdHdvIGNvbXBsZXggbnVtYmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwibXVsXCI6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICB2YXIgeiA9IG5ldyBDb21wbGV4MjAoYSwgYik7XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc0luZmluaXRlXCJdKCkgJiYgeltcImlzWmVyb1wiXSgpIHx8IHRoaXNbXCJpc1plcm9cIl0oKSAmJiB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiTkFOXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpc1tcImlzSW5maW5pdGVcIl0oKSB8fCB6W1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh6W1wiaW1cIl0gPT09IDAgJiYgdGhpc1tcImltXCJdID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCh0aGlzW1wicmVcIl0gKiB6W1wicmVcIl0sIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIHRoaXNbXCJyZVwiXSAqIHpbXCJyZVwiXSAtIHRoaXNbXCJpbVwiXSAqIHpbXCJpbVwiXSxcbiAgICAgICAgICAgIHRoaXNbXCJyZVwiXSAqIHpbXCJpbVwiXSArIHRoaXNbXCJpbVwiXSAqIHpbXCJyZVwiXVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEaXZpZGVzIHR3byBjb21wbGV4IG51bWJlcnNcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImRpdlwiOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgdmFyIHogPSBuZXcgQ29tcGxleDIwKGEsIGIpO1xuICAgICAgICAgIGlmICh0aGlzW1wiaXNaZXJvXCJdKCkgJiYgeltcImlzWmVyb1wiXSgpIHx8IHRoaXNbXCJpc0luZmluaXRlXCJdKCkgJiYgeltcImlzSW5maW5pdGVcIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIk5BTlwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc0luZmluaXRlXCJdKCkgfHwgeltcImlzWmVyb1wiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiSU5GSU5JVFlcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzW1wiaXNaZXJvXCJdKCkgfHwgeltcImlzSW5maW5pdGVcIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIlpFUk9cIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgYyA9IHpbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgZCA9IHpbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgdCwgeDtcbiAgICAgICAgICBpZiAoMCA9PT0gZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoYSAvIGMsIGIgLyBjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGMpIDwgTWF0aC5hYnMoZCkpIHtcbiAgICAgICAgICAgIHggPSBjIC8gZDtcbiAgICAgICAgICAgIHQgPSBjICogeCArIGQ7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgICAgKGEgKiB4ICsgYikgLyB0LFxuICAgICAgICAgICAgICAoYiAqIHggLSBhKSAvIHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHggPSBkIC8gYztcbiAgICAgICAgICAgIHQgPSBkICogeCArIGM7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgICAgKGEgKyBiICogeCkgLyB0LFxuICAgICAgICAgICAgICAoYiAtIGEgKiB4KSAvIHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBwb3dlciBvZiB0d28gY29tcGxleCBudW1iZXJzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJwb3dcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgaWYgKHpbXCJpc1plcm9cIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIk9ORVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHpbXCJpbVwiXSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGIgPT09IDAgJiYgYSA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoTWF0aC5wb3coYSwgeltcInJlXCJdKSwgMCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAgICAgc3dpdGNoICgoeltcInJlXCJdICUgNCArIDQpICUgNCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKE1hdGgucG93KGIsIHpbXCJyZVwiXSksIDApO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKDAsIE1hdGgucG93KGIsIHpbXCJyZVwiXSkpO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKC1NYXRoLnBvdyhiLCB6W1wicmVcIl0pLCAwKTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCgwLCAtTWF0aC5wb3coYiwgeltcInJlXCJdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEgPT09IDAgJiYgYiA9PT0gMCAmJiB6W1wicmVcIl0gPiAwICYmIHpbXCJpbVwiXSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tcGxleDIwW1wiWkVST1wiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGFyZyA9IE1hdGguYXRhbjIoYiwgYSk7XG4gICAgICAgICAgdmFyIGxvaCA9IGxvZ0h5cG90KGEsIGIpO1xuICAgICAgICAgIGEgPSBNYXRoLmV4cCh6W1wicmVcIl0gKiBsb2ggLSB6W1wiaW1cIl0gKiBhcmcpO1xuICAgICAgICAgIGIgPSB6W1wiaW1cIl0gKiBsb2ggKyB6W1wicmVcIl0gKiBhcmc7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBhICogTWF0aC5jb3MoYiksXG4gICAgICAgICAgICBhICogTWF0aC5zaW4oYilcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IHNxdWFyZSByb290XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJzcXJ0XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciByID0gdGhpc1tcImFic1wiXSgpO1xuICAgICAgICAgIHZhciByZSwgaW07XG4gICAgICAgICAgaWYgKGEgPj0gMCkge1xuICAgICAgICAgICAgaWYgKGIgPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoTWF0aC5zcXJ0KGEpLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlID0gMC41ICogTWF0aC5zcXJ0KDIgKiAociArIGEpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmUgPSBNYXRoLmFicyhiKSAvIE1hdGguc3FydCgyICogKHIgLSBhKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhIDw9IDApIHtcbiAgICAgICAgICAgIGltID0gMC41ICogTWF0aC5zcXJ0KDIgKiAociAtIGEpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW0gPSBNYXRoLmFicyhiKSAvIE1hdGguc3FydCgyICogKHIgKyBhKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKHJlLCBiIDwgMCA/IC1pbSA6IGltKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBleHBvbmVudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiZXhwXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0bXAgPSBNYXRoLmV4cCh0aGlzW1wicmVcIl0pO1xuICAgICAgICAgIGlmICh0aGlzW1wiaW1cIl0gPT09IDApIHtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICB0bXAgKiBNYXRoLmNvcyh0aGlzW1wiaW1cIl0pLFxuICAgICAgICAgICAgdG1wICogTWF0aC5zaW4odGhpc1tcImltXCJdKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggZXhwb25lbnQgYW5kIHN1YnRyYWN0cyBvbmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGUgdGhhbiBgQ29tcGxleCh4KS5leHAoKS5zdWIoMSlgIGlmXG4gICAgICAgICAqIGB4YCBpcyBzbWFsbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImV4cG0xXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgTWF0aC5leHBtMShhKSAqIE1hdGguY29zKGIpICsgY29zbTEoYiksXG4gICAgICAgICAgICBNYXRoLmV4cChhKSAqIE1hdGguc2luKGIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgbmF0dXJhbCBsb2dcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImxvZ1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICBpZiAoYiA9PT0gMCAmJiBhID4gMCkge1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGxvZ0h5cG90KGEsIGIpLFxuICAgICAgICAgICAgTWF0aC5hdGFuMihiLCBhKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIFwiYWJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBoeXBvdDIodGhpc1tcInJlXCJdLCB0aGlzW1wiaW1cIl0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBhbmdsZSBvZiB0aGUgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIFwiYXJnXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXNbXCJpbVwiXSwgdGhpc1tcInJlXCJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZSBvZiB0aGUgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInNpblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIE1hdGguc2luKGEpICogY29zaDIoYiksXG4gICAgICAgICAgICBNYXRoLmNvcyhhKSAqIHNpbmgyKGIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjb3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLmNvcyhhKSAqIGNvc2gyKGIpLFxuICAgICAgICAgICAgLU1hdGguc2luKGEpICogc2luaDIoYilcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSB0YW5nZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJ0YW5cIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSAyICogdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gMiAqIHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IE1hdGguY29zKGEpICsgY29zaDIoYik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLnNpbihhKSAvIGQsXG4gICAgICAgICAgICBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb3RhbmdlbnRcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImNvdFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IDIgKiB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSAyICogdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciBkID0gTWF0aC5jb3MoYSkgLSBjb3NoMihiKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIC1NYXRoLnNpbihhKSAvIGQsXG4gICAgICAgICAgICBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzZWNhbnRcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInNlY1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IDAuNSAqIGNvc2gyKDIgKiBiKSArIDAuNSAqIE1hdGguY29zKDIgKiBhKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIE1hdGguY29zKGEpICogY29zaDIoYikgLyBkLFxuICAgICAgICAgICAgTWF0aC5zaW4oYSkgKiBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NlY2Fuc1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiY3NjXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciBkID0gMC41ICogY29zaDIoMiAqIGIpIC0gMC41ICogTWF0aC5jb3MoMiAqIGEpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgTWF0aC5zaW4oYSkgKiBjb3NoMihiKSAvIGQsXG4gICAgICAgICAgICAtTWF0aC5jb3MoYSkgKiBzaW5oMihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGFyY3VzIHNpbnVzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhc2luXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciB0MSA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBiICogYiAtIGEgKiBhICsgMSxcbiAgICAgICAgICAgIC0yICogYSAqIGJcbiAgICAgICAgICApW1wic3FydFwiXSgpO1xuICAgICAgICAgIHZhciB0MiA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICB0MVtcInJlXCJdIC0gYixcbiAgICAgICAgICAgIHQxW1wiaW1cIl0gKyBhXG4gICAgICAgICAgKVtcImxvZ1wiXSgpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKHQyW1wiaW1cIl0sIC10MltcInJlXCJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBhcmN1cyBjb3NpbnVzXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhY29zXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciB0MSA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBiICogYiAtIGEgKiBhICsgMSxcbiAgICAgICAgICAgIC0yICogYSAqIGJcbiAgICAgICAgICApW1wic3FydFwiXSgpO1xuICAgICAgICAgIHZhciB0MiA9IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICB0MVtcInJlXCJdIC0gYixcbiAgICAgICAgICAgIHQxW1wiaW1cIl0gKyBhXG4gICAgICAgICAgKVtcImxvZ1wiXSgpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKE1hdGguUEkgLyAyIC0gdDJbXCJpbVwiXSwgdDJbXCJyZVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgdGFuZ2VudFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiYXRhblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGIgPT09IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoMCwgSW5maW5pdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGIgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKDAsIC1JbmZpbml0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBkID0gYSAqIGEgKyAoMSAtIGIpICogKDEgLSBiKTtcbiAgICAgICAgICB2YXIgdDEgPSBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgKDEgLSBiICogYiAtIGEgKiBhKSAvIGQsXG4gICAgICAgICAgICAtMiAqIGEgLyBkXG4gICAgICAgICAgKS5sb2coKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCgtMC41ICogdDFbXCJpbVwiXSwgMC41ICogdDFbXCJyZVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgY290YW5nZW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhY290XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChNYXRoLmF0YW4yKDEsIGEpLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hdGFuKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hdGFuKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgc2VjYW50XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhc2VjXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIGlmIChhID09PSAwICYmIGIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKDAsIEluZmluaXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hY29zKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hY29zKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYXJjdXMgY29zZWNhbnNcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImFjc2NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgaWYgKGEgPT09IDAgJiYgYiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoTWF0aC5QSSAvIDIsIEluZmluaXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hc2luKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hc2luKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggc2luaFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwic2luaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIHNpbmgyKGEpICogTWF0aC5jb3MoYiksXG4gICAgICAgICAgICBjb3NoMihhKSAqIE1hdGguc2luKGIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBjb3NoXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjb3NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgY29zaDIoYSkgKiBNYXRoLmNvcyhiKSxcbiAgICAgICAgICAgIHNpbmgyKGEpICogTWF0aC5zaW4oYilcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IHRhbmhcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInRhbmhcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSAyICogdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gMiAqIHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IGNvc2gyKGEpICsgTWF0aC5jb3MoYik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBzaW5oMihhKSAvIGQsXG4gICAgICAgICAgICBNYXRoLnNpbihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGNvdGhcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImNvdGhcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSAyICogdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gMiAqIHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IGNvc2gyKGEpIC0gTWF0aC5jb3MoYik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBzaW5oMihhKSAvIGQsXG4gICAgICAgICAgICAtTWF0aC5zaW4oYikgLyBkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBjb3RoXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjc2NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciBkID0gTWF0aC5jb3MoMiAqIGIpIC0gY29zaDIoMiAqIGEpO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgLTIgKiBzaW5oMihhKSAqIE1hdGguY29zKGIpIC8gZCxcbiAgICAgICAgICAgIDIgKiBjb3NoMihhKSAqIE1hdGguc2luKGIpIC8gZFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggc2VjaFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwic2VjaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IE1hdGguY29zKDIgKiBiKSArIGNvc2gyKDIgKiBhKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIDIgKiBjb3NoMihhKSAqIE1hdGguY29zKGIpIC8gZCxcbiAgICAgICAgICAgIC0yICogc2luaDIoYSkgKiBNYXRoLnNpbihiKSAvIGRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGFzaW5oXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhc2luaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdG1wID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHRoaXNbXCJpbVwiXSA9IC10aGlzW1wicmVcIl07XG4gICAgICAgICAgdGhpc1tcInJlXCJdID0gdG1wO1xuICAgICAgICAgIHZhciByZXMgPSB0aGlzW1wiYXNpblwiXSgpO1xuICAgICAgICAgIHRoaXNbXCJyZVwiXSA9IC10aGlzW1wiaW1cIl07XG4gICAgICAgICAgdGhpc1tcImltXCJdID0gdG1wO1xuICAgICAgICAgIHRtcCA9IHJlc1tcInJlXCJdO1xuICAgICAgICAgIHJlc1tcInJlXCJdID0gLXJlc1tcImltXCJdO1xuICAgICAgICAgIHJlc1tcImltXCJdID0gdG1wO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYWNvc2hcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImFjb3NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciByZXMgPSB0aGlzW1wiYWNvc1wiXSgpO1xuICAgICAgICAgIGlmIChyZXNbXCJpbVwiXSA8PSAwKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gcmVzW1wicmVcIl07XG4gICAgICAgICAgICByZXNbXCJyZVwiXSA9IC1yZXNbXCJpbVwiXTtcbiAgICAgICAgICAgIHJlc1tcImltXCJdID0gdG1wO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gcmVzW1wiaW1cIl07XG4gICAgICAgICAgICByZXNbXCJpbVwiXSA9IC1yZXNbXCJyZVwiXTtcbiAgICAgICAgICAgIHJlc1tcInJlXCJdID0gdG1wO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGF0YW5oXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhdGFuaFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgbm9JTSA9IGEgPiAxICYmIGIgPT09IDA7XG4gICAgICAgICAgdmFyIG9uZU1pbnVzID0gMSAtIGE7XG4gICAgICAgICAgdmFyIG9uZVBsdXMgPSAxICsgYTtcbiAgICAgICAgICB2YXIgZCA9IG9uZU1pbnVzICogb25lTWludXMgKyBiICogYjtcbiAgICAgICAgICB2YXIgeCA9IGQgIT09IDAgPyBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgKG9uZVBsdXMgKiBvbmVNaW51cyAtIGIgKiBiKSAvIGQsXG4gICAgICAgICAgICAoYiAqIG9uZU1pbnVzICsgb25lUGx1cyAqIGIpIC8gZFxuICAgICAgICAgICkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gLTEgPyBhIC8gMCA6IDAsXG4gICAgICAgICAgICBiICE9PSAwID8gYiAvIDAgOiAwXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YXIgdGVtcCA9IHhbXCJyZVwiXTtcbiAgICAgICAgICB4W1wicmVcIl0gPSBsb2dIeXBvdCh4W1wicmVcIl0sIHhbXCJpbVwiXSkgLyAyO1xuICAgICAgICAgIHhbXCJpbVwiXSA9IE1hdGguYXRhbjIoeFtcImltXCJdLCB0ZW1wKSAvIDI7XG4gICAgICAgICAgaWYgKG5vSU0pIHtcbiAgICAgICAgICAgIHhbXCJpbVwiXSA9IC14W1wiaW1cIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGFjb3RoXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJhY290aFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICBpZiAoYSA9PT0gMCAmJiBiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMCgwLCBNYXRoLlBJIC8gMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBkID0gYSAqIGEgKyBiICogYjtcbiAgICAgICAgICByZXR1cm4gZCAhPT0gMCA/IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBhIC8gZCxcbiAgICAgICAgICAgIC1iIC8gZFxuICAgICAgICAgICkuYXRhbmgoKSA6IG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBhICE9PSAwID8gYSAvIDAgOiAwLFxuICAgICAgICAgICAgYiAhPT0gMCA/IC1iIC8gMCA6IDBcbiAgICAgICAgICApLmF0YW5oKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXggYWNzY2hcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcImFjc2NoXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgICAgYSAhPT0gMCA/IE1hdGgubG9nKGEgKyBNYXRoLnNxcnQoYSAqIGEgKyAxKSkgOiBJbmZpbml0eSxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGQgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgIHJldHVybiBkICE9PSAwID8gbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgLyBkLFxuICAgICAgICAgICAgLWIgLyBkXG4gICAgICAgICAgKS5hc2luaCgpIDogbmV3IENvbXBsZXgyMChcbiAgICAgICAgICAgIGEgIT09IDAgPyBhIC8gMCA6IDAsXG4gICAgICAgICAgICBiICE9PSAwID8gLWIgLyAwIDogMFxuICAgICAgICAgICkuYXNpbmgoKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgY29tcGxleCBhc2VjaFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiYXNlY2hcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGEgPSB0aGlzW1wicmVcIl07XG4gICAgICAgICAgdmFyIGIgPSB0aGlzW1wiaW1cIl07XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc1plcm9cIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIENvbXBsZXgyMFtcIklORklOSVRZXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZCA9IGEgKiBhICsgYiAqIGI7XG4gICAgICAgICAgcmV0dXJuIGQgIT09IDAgPyBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAvIGQsXG4gICAgICAgICAgICAtYiAvIGRcbiAgICAgICAgICApLmFjb3NoKCkgOiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgYSAhPT0gMCA/IGEgLyAwIDogMCxcbiAgICAgICAgICAgIGIgIT09IDAgPyAtYiAvIDAgOiAwXG4gICAgICAgICAgKS5hY29zaCgpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBjb21wbGV4IGludmVyc2UgMS96XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJpbnZlcnNlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzW1wiaXNaZXJvXCJdKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBDb21wbGV4MjBbXCJJTkZJTklUWVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXNbXCJpc0luZmluaXRlXCJdKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBDb21wbGV4MjBbXCJaRVJPXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYSA9IHRoaXNbXCJyZVwiXTtcbiAgICAgICAgICB2YXIgYiA9IHRoaXNbXCJpbVwiXTtcbiAgICAgICAgICB2YXIgZCA9IGEgKiBhICsgYiAqIGI7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoYSAvIGQsIC1iIC8gZCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiY29uanVnYXRlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKHRoaXNbXCJyZVwiXSwgLXRoaXNbXCJpbVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBuZWdhdGVkIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJuZWdcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoLXRoaXNbXCJyZVwiXSwgLXRoaXNbXCJpbVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDZWlscyB0aGUgYWN0dWFsIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJjZWlsXCI6IGZ1bmN0aW9uKHBsYWNlcykge1xuICAgICAgICAgIHBsYWNlcyA9IE1hdGgucG93KDEwLCBwbGFjZXMgfHwgMCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLmNlaWwodGhpc1tcInJlXCJdICogcGxhY2VzKSAvIHBsYWNlcyxcbiAgICAgICAgICAgIE1hdGguY2VpbCh0aGlzW1wiaW1cIl0gKiBwbGFjZXMpIC8gcGxhY2VzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsb29ycyB0aGUgYWN0dWFsIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtDb21wbGV4fVxuICAgICAgICAgKi9cbiAgICAgICAgXCJmbG9vclwiOiBmdW5jdGlvbihwbGFjZXMpIHtcbiAgICAgICAgICBwbGFjZXMgPSBNYXRoLnBvdygxMCwgcGxhY2VzIHx8IDApO1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleDIwKFxuICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzW1wicmVcIl0gKiBwbGFjZXMpIC8gcGxhY2VzLFxuICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzW1wiaW1cIl0gKiBwbGFjZXMpIC8gcGxhY2VzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENlaWxzIHRoZSBhY3R1YWwgY29tcGxleCBudW1iZXJcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0NvbXBsZXh9XG4gICAgICAgICAqL1xuICAgICAgICBcInJvdW5kXCI6IGZ1bmN0aW9uKHBsYWNlcykge1xuICAgICAgICAgIHBsYWNlcyA9IE1hdGgucG93KDEwLCBwbGFjZXMgfHwgMCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAoXG4gICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXNbXCJyZVwiXSAqIHBsYWNlcykgLyBwbGFjZXMsXG4gICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXNbXCJpbVwiXSAqIHBsYWNlcykgLyBwbGFjZXNcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcGFyZXMgdHdvIGNvbXBsZXggbnVtYmVyc1xuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5vdGU6KiogbmV3IENvbXBsZXgoSW5maW5pdHkpLmVxdWFscyhJbmZpbml0eSkgPT09IGZhbHNlXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgXCJlcXVhbHNcIjogZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHZhciB6ID0gbmV3IENvbXBsZXgyMChhLCBiKTtcbiAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoeltcInJlXCJdIC0gdGhpc1tcInJlXCJdKSA8PSBDb21wbGV4MjBbXCJFUFNJTE9OXCJdICYmIE1hdGguYWJzKHpbXCJpbVwiXSAtIHRoaXNbXCJpbVwiXSkgPD0gQ29tcGxleDIwW1wiRVBTSUxPTlwiXTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsb25lcyB0aGUgYWN0dWFsIG9iamVjdFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Q29tcGxleH1cbiAgICAgICAgICovXG4gICAgICAgIFwiY2xvbmVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4MjAodGhpc1tcInJlXCJdLCB0aGlzW1wiaW1cIl0pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHN0cmluZyBvZiB0aGUgYWN0dWFsIGNvbXBsZXggbnVtYmVyXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBcInRvU3RyaW5nXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBhID0gdGhpc1tcInJlXCJdO1xuICAgICAgICAgIHZhciBiID0gdGhpc1tcImltXCJdO1xuICAgICAgICAgIHZhciByZXQgPSBcIlwiO1xuICAgICAgICAgIGlmICh0aGlzW1wiaXNOYU5cIl0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTmFOXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzW1wiaXNJbmZpbml0ZVwiXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJJbmZpbml0eVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoTWF0aC5hYnMoYSkgPCBDb21wbGV4MjBbXCJFUFNJTE9OXCJdKSB7XG4gICAgICAgICAgICBhID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGIpIDwgQ29tcGxleDIwW1wiRVBTSUxPTlwiXSkge1xuICAgICAgICAgICAgYiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0ICsgYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEgIT09IDApIHtcbiAgICAgICAgICAgIHJldCArPSBhO1xuICAgICAgICAgICAgcmV0ICs9IFwiIFwiO1xuICAgICAgICAgICAgaWYgKGIgPCAwKSB7XG4gICAgICAgICAgICAgIGIgPSAtYjtcbiAgICAgICAgICAgICAgcmV0ICs9IFwiLVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0ICs9IFwiK1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0ICs9IFwiIFwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYiA8IDApIHtcbiAgICAgICAgICAgIGIgPSAtYjtcbiAgICAgICAgICAgIHJldCArPSBcIi1cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDEgIT09IGIpIHtcbiAgICAgICAgICAgIHJldCArPSBiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmV0ICsgXCJpXCI7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIGFzIGEgdmVjdG9yXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIFwidG9WZWN0b3JcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzW1wicmVcIl0sIHRoaXNbXCJpbVwiXV07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcmVhbCB2YWx1ZSBvZiB0aGUgY3VycmVudCBvYmplY3RcbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge251bWJlcnxudWxsfVxuICAgICAgICAgKi9cbiAgICAgICAgXCJ2YWx1ZU9mXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzW1wiaW1cIl0gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW1wicmVcIl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29tcGxleCBudW1iZXIgaXMgbm90IG9uIHRoZSBSaWVtYW5uIHNwaGVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBcImlzTmFOXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBpc05hTih0aGlzW1wicmVcIl0pIHx8IGlzTmFOKHRoaXNbXCJpbVwiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgY29tcGxleCBudW1iZXIgaXMgYXQgdGhlIHplcm8gcG9sZSBvZiB0aGVcbiAgICAgICAgICogUmllbWFubiBzcGhlcmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgXCJpc1plcm9cIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbXCJpbVwiXSA9PT0gMCAmJiB0aGlzW1wicmVcIl0gPT09IDA7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBjb21wbGV4IG51bWJlciBpcyBub3QgYXQgdGhlIGluZmluaXR5IHBvbGUgb2YgdGhlXG4gICAgICAgICAqIFJpZW1hbm4gc3BoZXJlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIFwiaXNGaW5pdGVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRmluaXRlKHRoaXNbXCJyZVwiXSkgJiYgaXNGaW5pdGUodGhpc1tcImltXCJdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBjb21wbGV4IG51bWJlciBpcyBhdCB0aGUgaW5maW5pdHkgcG9sZSBvZiB0aGVcbiAgICAgICAgICogUmllbWFubiBzcGhlcmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgXCJpc0luZmluaXRlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiAhKHRoaXNbXCJpc05hTlwiXSgpIHx8IHRoaXNbXCJpc0Zpbml0ZVwiXSgpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIENvbXBsZXgyMFtcIlpFUk9cIl0gPSBuZXcgQ29tcGxleDIwKDAsIDApO1xuICAgICAgQ29tcGxleDIwW1wiT05FXCJdID0gbmV3IENvbXBsZXgyMCgxLCAwKTtcbiAgICAgIENvbXBsZXgyMFtcIklcIl0gPSBuZXcgQ29tcGxleDIwKDAsIDEpO1xuICAgICAgQ29tcGxleDIwW1wiUElcIl0gPSBuZXcgQ29tcGxleDIwKE1hdGguUEksIDApO1xuICAgICAgQ29tcGxleDIwW1wiRVwiXSA9IG5ldyBDb21wbGV4MjAoTWF0aC5FLCAwKTtcbiAgICAgIENvbXBsZXgyMFtcIklORklOSVRZXCJdID0gbmV3IENvbXBsZXgyMChJbmZpbml0eSwgSW5maW5pdHkpO1xuICAgICAgQ29tcGxleDIwW1wiTkFOXCJdID0gbmV3IENvbXBsZXgyMChOYU4sIE5hTik7XG4gICAgICBDb21wbGV4MjBbXCJFUFNJTE9OXCJdID0gMWUtMTU7XG4gICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZVtcImFtZFwiXSkge1xuICAgICAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBDb21wbGV4MjA7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcGxleDIwLCBcIl9fZXNNb2R1bGVcIiwgeyBcInZhbHVlXCI6IHRydWUgfSk7XG4gICAgICAgIENvbXBsZXgyMFtcImRlZmF1bHRcIl0gPSBDb21wbGV4MjA7XG4gICAgICAgIENvbXBsZXgyMFtcIkNvbXBsZXhcIl0gPSBDb21wbGV4MjA7XG4gICAgICAgIG1vZHVsZVtcImV4cG9ydHNcIl0gPSBDb21wbGV4MjA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290W1wiQ29tcGxleFwiXSA9IENvbXBsZXgyMDtcbiAgICAgIH1cbiAgICB9KShleHBvcnRzKTtcbiAgfVxufSk7XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvcHVibGljLnRzXG5mdW5jdGlvbiBpc0V4cHJlc3Npb25FbnRyeShlbnRyeSkge1xuICByZXR1cm4gIShcImtpbmRcIiBpbiBlbnRyeSkgfHwgZW50cnkua2luZCA9PT0gXCJleHByZXNzaW9uXCI7XG59XG5mdW5jdGlvbiBpc1N5bWJvbEVudHJ5KGVudHJ5KSB7XG4gIHJldHVybiBcImtpbmRcIiBpbiBlbnRyeSAmJiBlbnRyeS5raW5kID09PSBcInN5bWJvbFwiO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkVudHJ5KGVudHJ5KSB7XG4gIHJldHVybiBcImtpbmRcIiBpbiBlbnRyeSAmJiBlbnRyeS5raW5kID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBpc01hdGNoZml4RW50cnkoZW50cnkpIHtcbiAgcmV0dXJuIFwia2luZFwiIGluIGVudHJ5ICYmIGVudHJ5LmtpbmQgPT09IFwibWF0Y2hmaXhcIjtcbn1cbmZ1bmN0aW9uIGlzSW5maXhFbnRyeShlbnRyeSkge1xuICByZXR1cm4gXCJraW5kXCIgaW4gZW50cnkgJiYgZW50cnkua2luZCA9PT0gXCJpbmZpeFwiO1xufVxuZnVuY3Rpb24gaXNQcmVmaXhFbnRyeShlbnRyeSkge1xuICByZXR1cm4gXCJraW5kXCIgaW4gZW50cnkgJiYgZW50cnkua2luZCA9PT0gXCJwcmVmaXhcIjtcbn1cbmZ1bmN0aW9uIGlzUG9zdGZpeEVudHJ5KGVudHJ5KSB7XG4gIHJldHVybiBcImtpbmRcIiBpbiBlbnRyeSAmJiBlbnRyeS5raW5kID09PSBcInBvc3RmaXhcIjtcbn1cbmZ1bmN0aW9uIGlzRW52aXJvbm1lbnRFbnRyeShlbnRyeSkge1xuICByZXR1cm4gXCJraW5kXCIgaW4gZW50cnkgJiYgZW50cnkua2luZCA9PT0gXCJlbnZpcm9ubWVudFwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvZGVjaW1hbC5qcy9kZWNpbWFsLm1qc1xudmFyIEVYUF9MSU1JVCA9IDllMTU7XG52YXIgTUFYX0RJR0lUUyA9IDFlOTtcbnZhciBOVU1FUkFMUyA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xudmFyIExOMTAgPSBcIjIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAxNDg4NjI4NzcyOTc2MDMzMzI3OTAwOTY3NTcyNjA5Njc3MzUyNDgwMjM1OTk3MjA1MDg5NTk4Mjk4MzQxOTY3Nzg0MDQyMjg2MjQ4NjMzNDA5NTI1NDY1MDgyODA2NzU2NjY2Mjg3MzY5MDk4NzgxNjg5NDgyOTA3MjA4MzI1NTU0NjgwODQzNzk5ODk0ODI2MjMzMTk4NTI4MzkzNTA1MzA4OTY1Mzc3NzMyNjI4ODQ2MTYzMzY2MjIyMjg3Njk4MjE5ODg2NzQ2NTQzNjY3NDc0NDA0MjQzMjc0MzY1MTU1MDQ4OTM0MzE0OTM5MzkxNDc5NjE5NDA0NDAwMjIyMTA1MTAxNzE0MTc0ODAwMzY4ODA4NDAxMjY0NzA4MDY4NTU2Nzc0MzIxNjIyODM1NTIyMDExNDgwNDY2MzcxNTY1OTEyMTM3MzQ1MDc0Nzg1Njk0NzY4MzQ2MzYxNjc5MjEwMTgwNjQ0NTA3MDY0ODAwMDI3NzUwMjY4NDkxNjc0NjU1MDU4Njg1NjkzNTY3MzQyMDY3MDU4MTEzNjQyOTIyNDU1NDQwNTc1ODkyNTcyNDIwODI0MTMxNDY5NTY4OTAxNjc1ODk0MDI1Njc3NjMxMTM1NjkxOTI5MjAzMzM3NjU4NzE0MTY2MDIzMDEwNTcwMzA4OTYzNDU3MjA3NTQ0MDM3MDg0NzQ2OTk0MDE2ODI2OTI4MjgwODQ4MTE4NDI4OTMxNDg0ODUyNDk0ODY0NDg3MTkyNzgwOTY3NjI3MTI3NTc3NTM5NzAyNzY2ODYwNTk1MjQ5NjcxNjY3NDE4MzQ4NTcwNDQyMjUwNzE5Nzk2NTAwNDcxNDk1MTA1MDQ5MjIxNDc3NjU2NzYzNjkzODY2Mjk3Njk3OTUyMjExMDcxODI2NDU0OTczNDc3MjY2MjQyNTcwOTQyOTMyMjU4Mjc5ODUwMjU4NTUwOTc4NTI2NTM4MzIwNzYwNjcyNjMxNzE2NDMwOTUwNTk5NTA4NzgwNzUyMzcxMDMzMzEwMTE5Nzg1NzU0NzMzMTU0MTQyMTgwODQyNzU0Mzg2MzU5MTc3ODExNzA1NDMwOTgyNzQ4MjM4NTA0NTY0ODAxOTA5NTYxMDI5OTI5MTgyNDMxODIzNzUyNTM1NzcwOTc1MDUzOTU2NTE4NzY5NzUxMDM3NDk3MDg4ODY5MjE4MDIwNTE4OTMzOTUwNzIzODUzOTIwNTE0NDYzNDE5NzI2NTI4NzI4Njk2NTExMDg2MjU3MTQ5MjE5ODg0OTk3ODc0ODg3Mzc3MTM0NTY4NjIwOTE2NzA1OFwiO1xudmFyIFBJID0gXCIzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEwNTgyMDk3NDk0NDU5MjMwNzgxNjQwNjI4NjIwODk5ODYyODAzNDgyNTM0MjExNzA2Nzk4MjE0ODA4NjUxMzI4MjMwNjY0NzA5Mzg0NDYwOTU1MDU4MjIzMTcyNTM1OTQwODEyODQ4MTExNzQ1MDI4NDEwMjcwMTkzODUyMTEwNTU1OTY0NDYyMjk0ODk1NDkzMDM4MTk2NDQyODgxMDk3NTY2NTkzMzQ0NjEyODQ3NTY0ODIzMzc4Njc4MzE2NTI3MTIwMTkwOTE0NTY0ODU2NjkyMzQ2MDM0ODYxMDQ1NDMyNjY0ODIxMzM5MzYwNzI2MDI0OTE0MTI3MzcyNDU4NzAwNjYwNjMxNTU4ODE3NDg4MTUyMDkyMDk2MjgyOTI1NDA5MTcxNTM2NDM2Nzg5MjU5MDM2MDAxMTMzMDUzMDU0ODgyMDQ2NjUyMTM4NDE0Njk1MTk0MTUxMTYwOTQzMzA1NzI3MDM2NTc1OTU5MTk1MzA5MjE4NjExNzM4MTkzMjYxMTc5MzEwNTExODU0ODA3NDQ2MjM3OTk2Mjc0OTU2NzM1MTg4NTc1MjcyNDg5MTIyNzkzODE4MzAxMTk0OTEyOTgzMzY3MzM2MjQ0MDY1NjY0MzA4NjAyMTM5NDk0NjM5NTIyNDczNzE5MDcwMjE3OTg2MDk0MzcwMjc3MDUzOTIxNzE3NjI5MzE3Njc1MjM4NDY3NDgxODQ2NzY2OTQwNTEzMjAwMDU2ODEyNzE0NTI2MzU2MDgyNzc4NTc3MTM0Mjc1Nzc4OTYwOTE3MzYzNzE3ODcyMTQ2ODQ0MDkwMTIyNDk1MzQzMDE0NjU0OTU4NTM3MTA1MDc5MjI3OTY4OTI1ODkyMzU0MjAxOTk1NjExMjEyOTAyMTk2MDg2NDAzNDQxODE1OTgxMzYyOTc3NDc3MTMwOTk2MDUxODcwNzIxMTM0OTk5OTk5ODM3Mjk3ODA0OTk1MTA1OTczMTczMjgxNjA5NjMxODU5NTAyNDQ1OTQ1NTM0NjkwODMwMjY0MjUyMjMwODI1MzM0NDY4NTAzNTI2MTkzMTE4ODE3MTAxMDAwMzEzNzgzODc1Mjg4NjU4NzUzMzIwODM4MTQyMDYxNzE3NzY2OTE0NzMwMzU5ODI1MzQ5MDQyODc1NTQ2ODczMTE1OTU2Mjg2Mzg4MjM1Mzc4NzU5Mzc1MTk1Nzc4MTg1Nzc4MDUzMjE3MTIyNjgwNjYxMzAwMTkyNzg3NjYxMTE5NTkwOTIxNjQyMDE5ODkzODA5NTI1NzIwMTA2NTQ4NTg2MzI3ODlcIjtcbnZhciBERUZBVUxUUyA9IHtcbiAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgaW50ZWdlcnMgd2l0aGluIHRoZSBzdGF0ZWQgcmFuZ2VzIChpbmNsdXNpdmUpLlxuICAvLyBNb3N0IG9mIHRoZXNlIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBhdCBydW4tdGltZSB1c2luZyB0aGUgYERlY2ltYWwuY29uZmlnYCBtZXRob2QuXG4gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgb2YgdGhlIHJlc3VsdCBvZiBhIGNhbGN1bGF0aW9uIG9yIGJhc2UgY29udmVyc2lvbi5cbiAgLy8gRS5nLiBgRGVjaW1hbC5jb25maWcoeyBwcmVjaXNpb246IDIwIH0pO2BcbiAgcHJlY2lzaW9uOiAyMCxcbiAgLy8gMSB0byBNQVhfRElHSVRTXG4gIC8vIFRoZSByb3VuZGluZyBtb2RlIHVzZWQgd2hlbiByb3VuZGluZyB0byBgcHJlY2lzaW9uYC5cbiAgLy9cbiAgLy8gUk9VTkRfVVAgICAgICAgICAwIEF3YXkgZnJvbSB6ZXJvLlxuICAvLyBST1VORF9ET1dOICAgICAgIDEgVG93YXJkcyB6ZXJvLlxuICAvLyBST1VORF9DRUlMICAgICAgIDIgVG93YXJkcyArSW5maW5pdHkuXG4gIC8vIFJPVU5EX0ZMT09SICAgICAgMyBUb3dhcmRzIC1JbmZpbml0eS5cbiAgLy8gUk9VTkRfSEFMRl9VUCAgICA0IFRvd2FyZHMgbmVhcmVzdCBuZWlnaGJvdXIuIElmIGVxdWlkaXN0YW50LCB1cC5cbiAgLy8gUk9VTkRfSEFMRl9ET1dOICA1IFRvd2FyZHMgbmVhcmVzdCBuZWlnaGJvdXIuIElmIGVxdWlkaXN0YW50LCBkb3duLlxuICAvLyBST1VORF9IQUxGX0VWRU4gIDYgVG93YXJkcyBuZWFyZXN0IG5laWdoYm91ci4gSWYgZXF1aWRpc3RhbnQsIHRvd2FyZHMgZXZlbiBuZWlnaGJvdXIuXG4gIC8vIFJPVU5EX0hBTEZfQ0VJTCAgNyBUb3dhcmRzIG5lYXJlc3QgbmVpZ2hib3VyLiBJZiBlcXVpZGlzdGFudCwgdG93YXJkcyArSW5maW5pdHkuXG4gIC8vIFJPVU5EX0hBTEZfRkxPT1IgOCBUb3dhcmRzIG5lYXJlc3QgbmVpZ2hib3VyLiBJZiBlcXVpZGlzdGFudCwgdG93YXJkcyAtSW5maW5pdHkuXG4gIC8vXG4gIC8vIEUuZy5cbiAgLy8gYERlY2ltYWwucm91bmRpbmcgPSA0O2BcbiAgLy8gYERlY2ltYWwucm91bmRpbmcgPSBEZWNpbWFsLlJPVU5EX0hBTEZfVVA7YFxuICByb3VuZGluZzogNCxcbiAgLy8gMCB0byA4XG4gIC8vIFRoZSBtb2R1bG8gbW9kZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIG1vZHVsdXM6IGEgbW9kIG4uXG4gIC8vIFRoZSBxdW90aWVudCAocSA9IGEgLyBuKSBpcyBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyByb3VuZGluZyBtb2RlLlxuICAvLyBUaGUgcmVtYWluZGVyIChyKSBpcyBjYWxjdWxhdGVkIGFzOiByID0gYSAtIG4gKiBxLlxuICAvL1xuICAvLyBVUCAgICAgICAgIDAgVGhlIHJlbWFpbmRlciBpcyBwb3NpdGl2ZSBpZiB0aGUgZGl2aWRlbmQgaXMgbmVnYXRpdmUsIGVsc2UgaXMgbmVnYXRpdmUuXG4gIC8vIERPV04gICAgICAgMSBUaGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkaXZpZGVuZCAoSmF2YVNjcmlwdCAlKS5cbiAgLy8gRkxPT1IgICAgICAzIFRoZSByZW1haW5kZXIgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRpdmlzb3IgKFB5dGhvbiAlKS5cbiAgLy8gSEFMRl9FVkVOICA2IFRoZSBJRUVFIDc1NCByZW1haW5kZXIgZnVuY3Rpb24uXG4gIC8vIEVVQ0xJRCAgICAgOSBFdWNsaWRpYW4gZGl2aXNpb24uIHEgPSBzaWduKG4pICogZmxvb3IoYSAvIGFicyhuKSkuIEFsd2F5cyBwb3NpdGl2ZS5cbiAgLy9cbiAgLy8gVHJ1bmNhdGVkIGRpdmlzaW9uICgxKSwgZmxvb3JlZCBkaXZpc2lvbiAoMyksIHRoZSBJRUVFIDc1NCByZW1haW5kZXIgKDYpLCBhbmQgRXVjbGlkaWFuXG4gIC8vIGRpdmlzaW9uICg5KSBhcmUgY29tbW9ubHkgdXNlZCBmb3IgdGhlIG1vZHVsdXMgb3BlcmF0aW9uLiBUaGUgb3RoZXIgcm91bmRpbmcgbW9kZXMgY2FuIGFsc29cbiAgLy8gYmUgdXNlZCwgYnV0IHRoZXkgbWF5IG5vdCBnaXZlIHVzZWZ1bCByZXN1bHRzLlxuICBtb2R1bG86IDEsXG4gIC8vIDAgdG8gOVxuICAvLyBUaGUgZXhwb25lbnQgdmFsdWUgYXQgYW5kIGJlbmVhdGggd2hpY2ggYHRvU3RyaW5nYCByZXR1cm5zIGV4cG9uZW50aWFsIG5vdGF0aW9uLlxuICAvLyBKYXZhU2NyaXB0IG51bWJlcnM6IC03XG4gIHRvRXhwTmVnOiAtNyxcbiAgLy8gMCB0byAtRVhQX0xJTUlUXG4gIC8vIFRoZSBleHBvbmVudCB2YWx1ZSBhdCBhbmQgYWJvdmUgd2hpY2ggYHRvU3RyaW5nYCByZXR1cm5zIGV4cG9uZW50aWFsIG5vdGF0aW9uLlxuICAvLyBKYXZhU2NyaXB0IG51bWJlcnM6IDIxXG4gIHRvRXhwUG9zOiAyMSxcbiAgLy8gMCB0byBFWFBfTElNSVRcbiAgLy8gVGhlIG1pbmltdW0gZXhwb25lbnQgdmFsdWUsIGJlbmVhdGggd2hpY2ggdW5kZXJmbG93IHRvIHplcm8gb2NjdXJzLlxuICAvLyBKYXZhU2NyaXB0IG51bWJlcnM6IC0zMjQgICg1ZS0zMjQpXG4gIG1pbkU6IC1FWFBfTElNSVQsXG4gIC8vIC0xIHRvIC1FWFBfTElNSVRcbiAgLy8gVGhlIG1heGltdW0gZXhwb25lbnQgdmFsdWUsIGFib3ZlIHdoaWNoIG92ZXJmbG93IHRvIEluZmluaXR5IG9jY3Vycy5cbiAgLy8gSmF2YVNjcmlwdCBudW1iZXJzOiAzMDggICgxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOClcbiAgbWF4RTogRVhQX0xJTUlULFxuICAvLyAxIHRvIEVYUF9MSU1JVFxuICAvLyBXaGV0aGVyIHRvIHVzZSBjcnlwdG9ncmFwaGljYWxseS1zZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLCBpZiBhdmFpbGFibGUuXG4gIGNyeXB0bzogZmFsc2VcbiAgLy8gdHJ1ZS9mYWxzZVxufTtcbnZhciBpbmV4YWN0O1xudmFyIHF1YWRyYW50O1xudmFyIGV4dGVybmFsID0gdHJ1ZTtcbnZhciBkZWNpbWFsRXJyb3IgPSBcIltEZWNpbWFsRXJyb3JdIFwiO1xudmFyIGludmFsaWRBcmd1bWVudCA9IGRlY2ltYWxFcnJvciArIFwiSW52YWxpZCBhcmd1bWVudDogXCI7XG52YXIgcHJlY2lzaW9uTGltaXRFeGNlZWRlZCA9IGRlY2ltYWxFcnJvciArIFwiUHJlY2lzaW9uIGxpbWl0IGV4Y2VlZGVkXCI7XG52YXIgY3J5cHRvVW5hdmFpbGFibGUgPSBkZWNpbWFsRXJyb3IgKyBcImNyeXB0byB1bmF2YWlsYWJsZVwiO1xudmFyIHRhZyA9IFwiW29iamVjdCBEZWNpbWFsXVwiO1xudmFyIG1hdGhmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgbWF0aHBvdyA9IE1hdGgucG93O1xudmFyIGlzQmluYXJ5ID0gL14wYihbMDFdKyhcXC5bMDFdKik/fFxcLlswMV0rKShwWystXT9cXGQrKT8kL2k7XG52YXIgaXNIZXggPSAvXjB4KFswLTlhLWZdKyhcXC5bMC05YS1mXSopP3xcXC5bMC05YS1mXSspKHBbKy1dP1xcZCspPyQvaTtcbnZhciBpc09jdGFsID0gL14wbyhbMC03XSsoXFwuWzAtN10qKT98XFwuWzAtN10rKShwWystXT9cXGQrKT8kL2k7XG52YXIgaXNEZWNpbWFsID0gL14oXFxkKyhcXC5cXGQqKT98XFwuXFxkKykoZVsrLV0/XFxkKyk/JC9pO1xudmFyIEJBU0UgPSAxZTc7XG52YXIgTE9HX0JBU0UgPSA3O1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIExOMTBfUFJFQ0lTSU9OID0gTE4xMC5sZW5ndGggLSAxO1xudmFyIFBJX1BSRUNJU0lPTiA9IFBJLmxlbmd0aCAtIDE7XG52YXIgUCA9IHsgdG9TdHJpbmdUYWc6IHRhZyB9O1xuUC5hYnNvbHV0ZVZhbHVlID0gUC5hYnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgaWYgKHgucyA8IDApXG4gICAgeC5zID0gMTtcbiAgcmV0dXJuIGZpbmFsaXNlKHgpO1xufTtcblAuY2VpbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZmluYWxpc2UobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksIHRoaXMuZSArIDEsIDIpO1xufTtcblAuY2xhbXBlZFRvID0gUC5jbGFtcCA9IGZ1bmN0aW9uKG1pbjIsIG1heDIpIHtcbiAgdmFyIGssIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgbWluMiA9IG5ldyBDdG9yKG1pbjIpO1xuICBtYXgyID0gbmV3IEN0b3IobWF4Mik7XG4gIGlmICghbWluMi5zIHx8ICFtYXgyLnMpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmIChtaW4yLmd0KG1heDIpKVxuICAgIHRocm93IEVycm9yKGludmFsaWRBcmd1bWVudCArIG1heDIpO1xuICBrID0geC5jbXAobWluMik7XG4gIHJldHVybiBrIDwgMCA/IG1pbjIgOiB4LmNtcChtYXgyKSA+IDAgPyBtYXgyIDogbmV3IEN0b3IoeCk7XG59O1xuUC5jb21wYXJlZFRvID0gUC5jbXAgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBpLCBqLCB4ZEwsIHlkTCwgeCA9IHRoaXMsIHhkID0geC5kLCB5ZCA9ICh5ID0gbmV3IHguY29uc3RydWN0b3IoeSkpLmQsIHhzID0geC5zLCB5cyA9IHkucztcbiAgaWYgKCF4ZCB8fCAheWQpIHtcbiAgICByZXR1cm4gIXhzIHx8ICF5cyA/IE5hTiA6IHhzICE9PSB5cyA/IHhzIDogeGQgPT09IHlkID8gMCA6ICF4ZCBeIHhzIDwgMCA/IDEgOiAtMTtcbiAgfVxuICBpZiAoIXhkWzBdIHx8ICF5ZFswXSlcbiAgICByZXR1cm4geGRbMF0gPyB4cyA6IHlkWzBdID8gLXlzIDogMDtcbiAgaWYgKHhzICE9PSB5cylcbiAgICByZXR1cm4geHM7XG4gIGlmICh4LmUgIT09IHkuZSlcbiAgICByZXR1cm4geC5lID4geS5lIF4geHMgPCAwID8gMSA6IC0xO1xuICB4ZEwgPSB4ZC5sZW5ndGg7XG4gIHlkTCA9IHlkLmxlbmd0aDtcbiAgZm9yIChpID0gMCwgaiA9IHhkTCA8IHlkTCA/IHhkTCA6IHlkTDsgaSA8IGo7ICsraSkge1xuICAgIGlmICh4ZFtpXSAhPT0geWRbaV0pXG4gICAgICByZXR1cm4geGRbaV0gPiB5ZFtpXSBeIHhzIDwgMCA/IDEgOiAtMTtcbiAgfVxuICByZXR1cm4geGRMID09PSB5ZEwgPyAwIDogeGRMID4geWRMIF4geHMgPCAwID8gMSA6IC0xO1xufTtcblAuY29zaW5lID0gUC5jb3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHByLCBybSwgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICBpZiAoIXguZClcbiAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgaWYgKCF4LmRbMF0pXG4gICAgcmV0dXJuIG5ldyBDdG9yKDEpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyBNYXRoLm1heCh4LmUsIHguc2QoKSkgKyBMT0dfQkFTRTtcbiAgQ3Rvci5yb3VuZGluZyA9IDE7XG4gIHggPSBjb3NpbmUoQ3RvciwgdG9MZXNzVGhhbkhhbGZQaShDdG9yLCB4KSk7XG4gIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIGZpbmFsaXNlKHF1YWRyYW50ID09IDIgfHwgcXVhZHJhbnQgPT0gMyA/IHgubmVnKCkgOiB4LCBwciwgcm0sIHRydWUpO1xufTtcblAuY3ViZVJvb3QgPSBQLmNicnQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGUsIG0sIG4sIHIsIHJlcCwgcywgc2QsIHQsIHQzLCB0M3BsdXN4LCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICgheC5pc0Zpbml0ZSgpIHx8IHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBzID0geC5zICogbWF0aHBvdyh4LnMgKiB4LCAxIC8gMyk7XG4gIGlmICghcyB8fCBNYXRoLmFicyhzKSA9PSAxIC8gMCkge1xuICAgIG4gPSBkaWdpdHNUb1N0cmluZyh4LmQpO1xuICAgIGUgPSB4LmU7XG4gICAgaWYgKHMgPSAoZSAtIG4ubGVuZ3RoICsgMSkgJSAzKVxuICAgICAgbiArPSBzID09IDEgfHwgcyA9PSAtMiA/IFwiMFwiIDogXCIwMFwiO1xuICAgIHMgPSBtYXRocG93KG4sIDEgLyAzKTtcbiAgICBlID0gbWF0aGZsb29yKChlICsgMSkgLyAzKSAtIChlICUgMyA9PSAoZSA8IDAgPyAtMSA6IDIpKTtcbiAgICBpZiAocyA9PSAxIC8gMCkge1xuICAgICAgbiA9IFwiNWVcIiArIGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBzLnRvRXhwb25lbnRpYWwoKTtcbiAgICAgIG4gPSBuLnNsaWNlKDAsIG4uaW5kZXhPZihcImVcIikgKyAxKSArIGU7XG4gICAgfVxuICAgIHIgPSBuZXcgQ3RvcihuKTtcbiAgICByLnMgPSB4LnM7XG4gIH0gZWxzZSB7XG4gICAgciA9IG5ldyBDdG9yKHMudG9TdHJpbmcoKSk7XG4gIH1cbiAgc2QgPSAoZSA9IEN0b3IucHJlY2lzaW9uKSArIDM7XG4gIGZvciAoOyA7ICkge1xuICAgIHQgPSByO1xuICAgIHQzID0gdC50aW1lcyh0KS50aW1lcyh0KTtcbiAgICB0M3BsdXN4ID0gdDMucGx1cyh4KTtcbiAgICByID0gZGl2aWRlKHQzcGx1c3gucGx1cyh4KS50aW1lcyh0KSwgdDNwbHVzeC5wbHVzKHQzKSwgc2QgKyAyLCAxKTtcbiAgICBpZiAoZGlnaXRzVG9TdHJpbmcodC5kKS5zbGljZSgwLCBzZCkgPT09IChuID0gZGlnaXRzVG9TdHJpbmcoci5kKSkuc2xpY2UoMCwgc2QpKSB7XG4gICAgICBuID0gbi5zbGljZShzZCAtIDMsIHNkICsgMSk7XG4gICAgICBpZiAobiA9PSBcIjk5OTlcIiB8fCAhcmVwICYmIG4gPT0gXCI0OTk5XCIpIHtcbiAgICAgICAgaWYgKCFyZXApIHtcbiAgICAgICAgICBmaW5hbGlzZSh0LCBlICsgMSwgMCk7XG4gICAgICAgICAgaWYgKHQudGltZXModCkudGltZXModCkuZXEoeCkpIHtcbiAgICAgICAgICAgIHIgPSB0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNkICs9IDQ7XG4gICAgICAgIHJlcCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIStuIHx8ICErbi5zbGljZSgxKSAmJiBuLmNoYXJBdCgwKSA9PSBcIjVcIikge1xuICAgICAgICAgIGZpbmFsaXNlKHIsIGUgKyAxLCAxKTtcbiAgICAgICAgICBtID0gIXIudGltZXMocikudGltZXMocikuZXEoeCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIGUsIEN0b3Iucm91bmRpbmcsIG0pO1xufTtcblAuZGVjaW1hbFBsYWNlcyA9IFAuZHAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHcsIGQgPSB0aGlzLmQsIG4gPSBOYU47XG4gIGlmIChkKSB7XG4gICAgdyA9IGQubGVuZ3RoIC0gMTtcbiAgICBuID0gKHcgLSBtYXRoZmxvb3IodGhpcy5lIC8gTE9HX0JBU0UpKSAqIExPR19CQVNFO1xuICAgIHcgPSBkW3ddO1xuICAgIGlmICh3KVxuICAgICAgZm9yICg7IHcgJSAxMCA9PSAwOyB3IC89IDEwKVxuICAgICAgICBuLS07XG4gICAgaWYgKG4gPCAwKVxuICAgICAgbiA9IDA7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuUC5kaXZpZGVkQnkgPSBQLmRpdiA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIGRpdmlkZSh0aGlzLCBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih5KSk7XG59O1xuUC5kaXZpZGVkVG9JbnRlZ2VyQnkgPSBQLmRpdlRvSW50ID0gZnVuY3Rpb24oeSkge1xuICB2YXIgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICByZXR1cm4gZmluYWxpc2UoZGl2aWRlKHgsIG5ldyBDdG9yKHkpLCAwLCAxLCAxKSwgQ3Rvci5wcmVjaXNpb24sIEN0b3Iucm91bmRpbmcpO1xufTtcblAuZXF1YWxzID0gUC5lcSA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIHRoaXMuY21wKHkpID09PSAwO1xufTtcblAuZmxvb3IgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZpbmFsaXNlKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpLCB0aGlzLmUgKyAxLCAzKTtcbn07XG5QLmdyZWF0ZXJUaGFuID0gUC5ndCA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIHRoaXMuY21wKHkpID4gMDtcbn07XG5QLmdyZWF0ZXJUaGFuT3JFcXVhbFRvID0gUC5ndGUgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBrID0gdGhpcy5jbXAoeSk7XG4gIHJldHVybiBrID09IDEgfHwgayA9PT0gMDtcbn07XG5QLmh5cGVyYm9saWNDb3NpbmUgPSBQLmNvc2ggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGssIG4sIHByLCBybSwgbGVuLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3IsIG9uZSA9IG5ldyBDdG9yKDEpO1xuICBpZiAoIXguaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5zID8gMSAvIDAgOiBOYU4pO1xuICBpZiAoeC5pc1plcm8oKSlcbiAgICByZXR1cm4gb25lO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyBNYXRoLm1heCh4LmUsIHguc2QoKSkgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgbGVuID0geC5kLmxlbmd0aDtcbiAgaWYgKGxlbiA8IDMyKSB7XG4gICAgayA9IE1hdGguY2VpbChsZW4gLyAzKTtcbiAgICBuID0gKDEgLyB0aW55UG93KDQsIGspKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIGsgPSAxNjtcbiAgICBuID0gXCIyLjMyODMwNjQzNjUzODY5NjI4OTA2MjVlLTEwXCI7XG4gIH1cbiAgeCA9IHRheWxvclNlcmllcyhDdG9yLCAxLCB4LnRpbWVzKG4pLCBuZXcgQ3RvcigxKSwgdHJ1ZSk7XG4gIHZhciBjb3NoMl94LCBpID0gaywgZDggPSBuZXcgQ3Rvcig4KTtcbiAgZm9yICg7IGktLTsgKSB7XG4gICAgY29zaDJfeCA9IHgudGltZXMoeCk7XG4gICAgeCA9IG9uZS5taW51cyhjb3NoMl94LnRpbWVzKGQ4Lm1pbnVzKGNvc2gyX3gudGltZXMoZDgpKSkpO1xuICB9XG4gIHJldHVybiBmaW5hbGlzZSh4LCBDdG9yLnByZWNpc2lvbiA9IHByLCBDdG9yLnJvdW5kaW5nID0gcm0sIHRydWUpO1xufTtcblAuaHlwZXJib2xpY1NpbmUgPSBQLnNpbmggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGssIHByLCBybSwgbGVuLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICgheC5pc0Zpbml0ZSgpIHx8IHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyBNYXRoLm1heCh4LmUsIHguc2QoKSkgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgbGVuID0geC5kLmxlbmd0aDtcbiAgaWYgKGxlbiA8IDMpIHtcbiAgICB4ID0gdGF5bG9yU2VyaWVzKEN0b3IsIDIsIHgsIHgsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGsgPSAxLjQgKiBNYXRoLnNxcnQobGVuKTtcbiAgICBrID0gayA+IDE2ID8gMTYgOiBrIHwgMDtcbiAgICB4ID0geC50aW1lcygxIC8gdGlueVBvdyg1LCBrKSk7XG4gICAgeCA9IHRheWxvclNlcmllcyhDdG9yLCAyLCB4LCB4LCB0cnVlKTtcbiAgICB2YXIgc2luaDJfeCwgZDUgPSBuZXcgQ3Rvcig1KSwgZDE2ID0gbmV3IEN0b3IoMTYpLCBkMjAgPSBuZXcgQ3RvcigyMCk7XG4gICAgZm9yICg7IGstLTsgKSB7XG4gICAgICBzaW5oMl94ID0geC50aW1lcyh4KTtcbiAgICAgIHggPSB4LnRpbWVzKGQ1LnBsdXMoc2luaDJfeC50aW1lcyhkMTYudGltZXMoc2luaDJfeCkucGx1cyhkMjApKSkpO1xuICAgIH1cbiAgfVxuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBDdG9yLnJvdW5kaW5nID0gcm07XG4gIHJldHVybiBmaW5hbGlzZSh4LCBwciwgcm0sIHRydWUpO1xufTtcblAuaHlwZXJib2xpY1RhbmdlbnQgPSBQLnRhbmggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHByLCBybSwgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICBpZiAoIXguaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5zKTtcbiAgaWYgKHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyA3O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgcmV0dXJuIGRpdmlkZSh4LnNpbmgoKSwgeC5jb3NoKCksIEN0b3IucHJlY2lzaW9uID0gcHIsIEN0b3Iucm91bmRpbmcgPSBybSk7XG59O1xuUC5pbnZlcnNlQ29zaW5lID0gUC5hY29zID0gZnVuY3Rpb24oKSB7XG4gIHZhciBoYWxmUGksIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvciwgayA9IHguYWJzKCkuY21wKDEpLCBwciA9IEN0b3IucHJlY2lzaW9uLCBybSA9IEN0b3Iucm91bmRpbmc7XG4gIGlmIChrICE9PSAtMSkge1xuICAgIHJldHVybiBrID09PSAwID8geC5pc05lZygpID8gZ2V0UGkoQ3RvciwgcHIsIHJtKSA6IG5ldyBDdG9yKDApIDogbmV3IEN0b3IoTmFOKTtcbiAgfVxuICBpZiAoeC5pc1plcm8oKSlcbiAgICByZXR1cm4gZ2V0UGkoQ3RvciwgcHIgKyA0LCBybSkudGltZXMoMC41KTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwciArIDY7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICB4ID0geC5hc2luKCk7XG4gIGhhbGZQaSA9IGdldFBpKEN0b3IsIHByICsgNCwgcm0pLnRpbWVzKDAuNSk7XG4gIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIGhhbGZQaS5taW51cyh4KTtcbn07XG5QLmludmVyc2VIeXBlcmJvbGljQ29zaW5lID0gUC5hY29zaCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcHIsIHJtLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICh4Lmx0ZSgxKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5lcSgxKSA/IDAgOiBOYU4pO1xuICBpZiAoIXguaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gbmV3IEN0b3IoeCk7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgQ3Rvci5wcmVjaXNpb24gPSBwciArIE1hdGgubWF4KE1hdGguYWJzKHguZSksIHguc2QoKSkgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgeCA9IHgudGltZXMoeCkubWludXMoMSkuc3FydCgpLnBsdXMoeCk7XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgQ3Rvci5yb3VuZGluZyA9IHJtO1xuICByZXR1cm4geC5sbigpO1xufTtcblAuaW52ZXJzZUh5cGVyYm9saWNTaW5lID0gUC5hc2luaCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcHIsIHJtLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICgheC5pc0Zpbml0ZSgpIHx8IHguaXNaZXJvKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyAyICogTWF0aC5tYXgoTWF0aC5hYnMoeC5lKSwgeC5zZCgpKSArIDY7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICB4ID0geC50aW1lcyh4KS5wbHVzKDEpLnNxcnQoKS5wbHVzKHgpO1xuICBleHRlcm5hbCA9IHRydWU7XG4gIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIHgubG4oKTtcbn07XG5QLmludmVyc2VIeXBlcmJvbGljVGFuZ2VudCA9IFAuYXRhbmggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHByLCBybSwgd3ByLCB4c2QsIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4LmlzRmluaXRlKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmICh4LmUgPj0gMClcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5hYnMoKS5lcSgxKSA/IHgucyAvIDAgOiB4LmlzWmVybygpID8geCA6IE5hTik7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgeHNkID0geC5zZCgpO1xuICBpZiAoTWF0aC5tYXgoeHNkLCBwcikgPCAyICogLXguZSAtIDEpXG4gICAgcmV0dXJuIGZpbmFsaXNlKG5ldyBDdG9yKHgpLCBwciwgcm0sIHRydWUpO1xuICBDdG9yLnByZWNpc2lvbiA9IHdwciA9IHhzZCAtIHguZTtcbiAgeCA9IGRpdmlkZSh4LnBsdXMoMSksIG5ldyBDdG9yKDEpLm1pbnVzKHgpLCB3cHIgKyBwciwgMSk7XG4gIEN0b3IucHJlY2lzaW9uID0gcHIgKyA0O1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgeCA9IHgubG4oKTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgQ3Rvci5yb3VuZGluZyA9IHJtO1xuICByZXR1cm4geC50aW1lcygwLjUpO1xufTtcblAuaW52ZXJzZVNpbmUgPSBQLmFzaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhhbGZQaSwgaywgcHIsIHJtLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiBuZXcgQ3Rvcih4KTtcbiAgayA9IHguYWJzKCkuY21wKDEpO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIGlmIChrICE9PSAtMSkge1xuICAgIGlmIChrID09PSAwKSB7XG4gICAgICBoYWxmUGkgPSBnZXRQaShDdG9yLCBwciArIDQsIHJtKS50aW1lcygwLjUpO1xuICAgICAgaGFsZlBpLnMgPSB4LnM7XG4gICAgICByZXR1cm4gaGFsZlBpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgfVxuICBDdG9yLnByZWNpc2lvbiA9IHByICsgNjtcbiAgQ3Rvci5yb3VuZGluZyA9IDE7XG4gIHggPSB4LmRpdihuZXcgQ3RvcigxKS5taW51cyh4LnRpbWVzKHgpKS5zcXJ0KCkucGx1cygxKSkuYXRhbigpO1xuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBDdG9yLnJvdW5kaW5nID0gcm07XG4gIHJldHVybiB4LnRpbWVzKDIpO1xufTtcblAuaW52ZXJzZVRhbmdlbnQgPSBQLmF0YW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGksIGosIGssIG4sIHB4LCB0LCByLCB3cHIsIHgyLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3IsIHByID0gQ3Rvci5wcmVjaXNpb24sIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgaWYgKCF4LmlzRmluaXRlKCkpIHtcbiAgICBpZiAoIXgucylcbiAgICAgIHJldHVybiBuZXcgQ3RvcihOYU4pO1xuICAgIGlmIChwciArIDQgPD0gUElfUFJFQ0lTSU9OKSB7XG4gICAgICByID0gZ2V0UGkoQ3RvciwgcHIgKyA0LCBybSkudGltZXMoMC41KTtcbiAgICAgIHIucyA9IHgucztcbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgfSBlbHNlIGlmICh4LmlzWmVybygpKSB7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHgpO1xuICB9IGVsc2UgaWYgKHguYWJzKCkuZXEoMSkgJiYgcHIgKyA0IDw9IFBJX1BSRUNJU0lPTikge1xuICAgIHIgPSBnZXRQaShDdG9yLCBwciArIDQsIHJtKS50aW1lcygwLjI1KTtcbiAgICByLnMgPSB4LnM7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgQ3Rvci5wcmVjaXNpb24gPSB3cHIgPSBwciArIDEwO1xuICBDdG9yLnJvdW5kaW5nID0gMTtcbiAgayA9IE1hdGgubWluKDI4LCB3cHIgLyBMT0dfQkFTRSArIDIgfCAwKTtcbiAgZm9yIChpID0gazsgaTsgLS1pKVxuICAgIHggPSB4LmRpdih4LnRpbWVzKHgpLnBsdXMoMSkuc3FydCgpLnBsdXMoMSkpO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBqID0gTWF0aC5jZWlsKHdwciAvIExPR19CQVNFKTtcbiAgbiA9IDE7XG4gIHgyID0geC50aW1lcyh4KTtcbiAgciA9IG5ldyBDdG9yKHgpO1xuICBweCA9IHg7XG4gIGZvciAoOyBpICE9PSAtMTsgKSB7XG4gICAgcHggPSBweC50aW1lcyh4Mik7XG4gICAgdCA9IHIubWludXMocHguZGl2KG4gKz0gMikpO1xuICAgIHB4ID0gcHgudGltZXMoeDIpO1xuICAgIHIgPSB0LnBsdXMocHguZGl2KG4gKz0gMikpO1xuICAgIGlmIChyLmRbal0gIT09IHZvaWQgMClcbiAgICAgIGZvciAoaSA9IGo7IHIuZFtpXSA9PT0gdC5kW2ldICYmIGktLTsgKVxuICAgICAgICA7XG4gIH1cbiAgaWYgKGspXG4gICAgciA9IHIudGltZXMoMiA8PCBrIC0gMSk7XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIEN0b3IucHJlY2lzaW9uID0gcHIsIEN0b3Iucm91bmRpbmcgPSBybSwgdHJ1ZSk7XG59O1xuUC5pc0Zpbml0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gISF0aGlzLmQ7XG59O1xuUC5pc0ludGVnZXIgPSBQLmlzSW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhIXRoaXMuZCAmJiBtYXRoZmxvb3IodGhpcy5lIC8gTE9HX0JBU0UpID4gdGhpcy5kLmxlbmd0aCAtIDI7XG59O1xuUC5pc05hTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMucztcbn07XG5QLmlzTmVnYXRpdmUgPSBQLmlzTmVnID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnMgPCAwO1xufTtcblAuaXNQb3NpdGl2ZSA9IFAuaXNQb3MgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucyA+IDA7XG59O1xuUC5pc1plcm8gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICEhdGhpcy5kICYmIHRoaXMuZFswXSA9PT0gMDtcbn07XG5QLmxlc3NUaGFuID0gUC5sdCA9IGZ1bmN0aW9uKHkpIHtcbiAgcmV0dXJuIHRoaXMuY21wKHkpIDwgMDtcbn07XG5QLmxlc3NUaGFuT3JFcXVhbFRvID0gUC5sdGUgPSBmdW5jdGlvbih5KSB7XG4gIHJldHVybiB0aGlzLmNtcCh5KSA8IDE7XG59O1xuUC5sb2dhcml0aG0gPSBQLmxvZyA9IGZ1bmN0aW9uKGJhc2UpIHtcbiAgdmFyIGlzQmFzZTEwLCBkLCBkZW5vbWluYXRvciwgaywgaW5mLCBudW0sIHNkLCByLCBhcmcgPSB0aGlzLCBDdG9yID0gYXJnLmNvbnN0cnVjdG9yLCBwciA9IEN0b3IucHJlY2lzaW9uLCBybSA9IEN0b3Iucm91bmRpbmcsIGd1YXJkID0gNTtcbiAgaWYgKGJhc2UgPT0gbnVsbCkge1xuICAgIGJhc2UgPSBuZXcgQ3RvcigxMCk7XG4gICAgaXNCYXNlMTAgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIGJhc2UgPSBuZXcgQ3RvcihiYXNlKTtcbiAgICBkID0gYmFzZS5kO1xuICAgIGlmIChiYXNlLnMgPCAwIHx8ICFkIHx8ICFkWzBdIHx8IGJhc2UuZXEoMSkpXG4gICAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgICBpc0Jhc2UxMCA9IGJhc2UuZXEoMTApO1xuICB9XG4gIGQgPSBhcmcuZDtcbiAgaWYgKGFyZy5zIDwgMCB8fCAhZCB8fCAhZFswXSB8fCBhcmcuZXEoMSkpIHtcbiAgICByZXR1cm4gbmV3IEN0b3IoZCAmJiAhZFswXSA/IC0xIC8gMCA6IGFyZy5zICE9IDEgPyBOYU4gOiBkID8gMCA6IDEgLyAwKTtcbiAgfVxuICBpZiAoaXNCYXNlMTApIHtcbiAgICBpZiAoZC5sZW5ndGggPiAxKSB7XG4gICAgICBpbmYgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGsgPSBkWzBdOyBrICUgMTAgPT09IDA7IClcbiAgICAgICAgayAvPSAxMDtcbiAgICAgIGluZiA9IGsgIT09IDE7XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gZmFsc2U7XG4gIHNkID0gcHIgKyBndWFyZDtcbiAgbnVtID0gbmF0dXJhbExvZ2FyaXRobShhcmcsIHNkKTtcbiAgZGVub21pbmF0b3IgPSBpc0Jhc2UxMCA/IGdldExuMTAoQ3Rvciwgc2QgKyAxMCkgOiBuYXR1cmFsTG9nYXJpdGhtKGJhc2UsIHNkKTtcbiAgciA9IGRpdmlkZShudW0sIGRlbm9taW5hdG9yLCBzZCwgMSk7XG4gIGlmIChjaGVja1JvdW5kaW5nRGlnaXRzKHIuZCwgayA9IHByLCBybSkpIHtcbiAgICBkbyB7XG4gICAgICBzZCArPSAxMDtcbiAgICAgIG51bSA9IG5hdHVyYWxMb2dhcml0aG0oYXJnLCBzZCk7XG4gICAgICBkZW5vbWluYXRvciA9IGlzQmFzZTEwID8gZ2V0TG4xMChDdG9yLCBzZCArIDEwKSA6IG5hdHVyYWxMb2dhcml0aG0oYmFzZSwgc2QpO1xuICAgICAgciA9IGRpdmlkZShudW0sIGRlbm9taW5hdG9yLCBzZCwgMSk7XG4gICAgICBpZiAoIWluZikge1xuICAgICAgICBpZiAoK2RpZ2l0c1RvU3RyaW5nKHIuZCkuc2xpY2UoayArIDEsIGsgKyAxNSkgKyAxID09IDFlMTQpIHtcbiAgICAgICAgICByID0gZmluYWxpc2UociwgcHIgKyAxLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IHdoaWxlIChjaGVja1JvdW5kaW5nRGlnaXRzKHIuZCwgayArPSAxMCwgcm0pKTtcbiAgfVxuICBleHRlcm5hbCA9IHRydWU7XG4gIHJldHVybiBmaW5hbGlzZShyLCBwciwgcm0pO1xufTtcblAubWludXMgPSBQLnN1YiA9IGZ1bmN0aW9uKHkpIHtcbiAgdmFyIGQsIGUsIGksIGosIGssIGxlbiwgcHIsIHJtLCB4ZCwgeGUsIHhMVHksIHlkLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIHkgPSBuZXcgQ3Rvcih5KTtcbiAgaWYgKCF4LmQgfHwgIXkuZCkge1xuICAgIGlmICgheC5zIHx8ICF5LnMpXG4gICAgICB5ID0gbmV3IEN0b3IoTmFOKTtcbiAgICBlbHNlIGlmICh4LmQpXG4gICAgICB5LnMgPSAteS5zO1xuICAgIGVsc2VcbiAgICAgIHkgPSBuZXcgQ3Rvcih5LmQgfHwgeC5zICE9PSB5LnMgPyB4IDogTmFOKTtcbiAgICByZXR1cm4geTtcbiAgfVxuICBpZiAoeC5zICE9IHkucykge1xuICAgIHkucyA9IC15LnM7XG4gICAgcmV0dXJuIHgucGx1cyh5KTtcbiAgfVxuICB4ZCA9IHguZDtcbiAgeWQgPSB5LmQ7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgaWYgKCF4ZFswXSB8fCAheWRbMF0pIHtcbiAgICBpZiAoeWRbMF0pXG4gICAgICB5LnMgPSAteS5zO1xuICAgIGVsc2UgaWYgKHhkWzBdKVxuICAgICAgeSA9IG5ldyBDdG9yKHgpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuZXcgQ3RvcihybSA9PT0gMyA/IC0wIDogMCk7XG4gICAgcmV0dXJuIGV4dGVybmFsID8gZmluYWxpc2UoeSwgcHIsIHJtKSA6IHk7XG4gIH1cbiAgZSA9IG1hdGhmbG9vcih5LmUgLyBMT0dfQkFTRSk7XG4gIHhlID0gbWF0aGZsb29yKHguZSAvIExPR19CQVNFKTtcbiAgeGQgPSB4ZC5zbGljZSgpO1xuICBrID0geGUgLSBlO1xuICBpZiAoaykge1xuICAgIHhMVHkgPSBrIDwgMDtcbiAgICBpZiAoeExUeSkge1xuICAgICAgZCA9IHhkO1xuICAgICAgayA9IC1rO1xuICAgICAgbGVuID0geWQubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkID0geWQ7XG4gICAgICBlID0geGU7XG4gICAgICBsZW4gPSB4ZC5sZW5ndGg7XG4gICAgfVxuICAgIGkgPSBNYXRoLm1heChNYXRoLmNlaWwocHIgLyBMT0dfQkFTRSksIGxlbikgKyAyO1xuICAgIGlmIChrID4gaSkge1xuICAgICAgayA9IGk7XG4gICAgICBkLmxlbmd0aCA9IDE7XG4gICAgfVxuICAgIGQucmV2ZXJzZSgpO1xuICAgIGZvciAoaSA9IGs7IGktLTsgKVxuICAgICAgZC5wdXNoKDApO1xuICAgIGQucmV2ZXJzZSgpO1xuICB9IGVsc2Uge1xuICAgIGkgPSB4ZC5sZW5ndGg7XG4gICAgbGVuID0geWQubGVuZ3RoO1xuICAgIHhMVHkgPSBpIDwgbGVuO1xuICAgIGlmICh4TFR5KVxuICAgICAgbGVuID0gaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh4ZFtpXSAhPSB5ZFtpXSkge1xuICAgICAgICB4TFR5ID0geGRbaV0gPCB5ZFtpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGsgPSAwO1xuICB9XG4gIGlmICh4TFR5KSB7XG4gICAgZCA9IHhkO1xuICAgIHhkID0geWQ7XG4gICAgeWQgPSBkO1xuICAgIHkucyA9IC15LnM7XG4gIH1cbiAgbGVuID0geGQubGVuZ3RoO1xuICBmb3IgKGkgPSB5ZC5sZW5ndGggLSBsZW47IGkgPiAwOyAtLWkpXG4gICAgeGRbbGVuKytdID0gMDtcbiAgZm9yIChpID0geWQubGVuZ3RoOyBpID4gazsgKSB7XG4gICAgaWYgKHhkWy0taV0gPCB5ZFtpXSkge1xuICAgICAgZm9yIChqID0gaTsgaiAmJiB4ZFstLWpdID09PSAwOyApXG4gICAgICAgIHhkW2pdID0gQkFTRSAtIDE7XG4gICAgICAtLXhkW2pdO1xuICAgICAgeGRbaV0gKz0gQkFTRTtcbiAgICB9XG4gICAgeGRbaV0gLT0geWRbaV07XG4gIH1cbiAgZm9yICg7IHhkWy0tbGVuXSA9PT0gMDsgKVxuICAgIHhkLnBvcCgpO1xuICBmb3IgKDsgeGRbMF0gPT09IDA7IHhkLnNoaWZ0KCkpXG4gICAgLS1lO1xuICBpZiAoIXhkWzBdKVxuICAgIHJldHVybiBuZXcgQ3RvcihybSA9PT0gMyA/IC0wIDogMCk7XG4gIHkuZCA9IHhkO1xuICB5LmUgPSBnZXRCYXNlMTBFeHBvbmVudCh4ZCwgZSk7XG4gIHJldHVybiBleHRlcm5hbCA/IGZpbmFsaXNlKHksIHByLCBybSkgOiB5O1xufTtcblAubW9kdWxvID0gUC5tb2QgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBxLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIHkgPSBuZXcgQ3Rvcih5KTtcbiAgaWYgKCF4LmQgfHwgIXkucyB8fCB5LmQgJiYgIXkuZFswXSlcbiAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgaWYgKCF5LmQgfHwgeC5kICYmICF4LmRbMF0pIHtcbiAgICByZXR1cm4gZmluYWxpc2UobmV3IEN0b3IoeCksIEN0b3IucHJlY2lzaW9uLCBDdG9yLnJvdW5kaW5nKTtcbiAgfVxuICBleHRlcm5hbCA9IGZhbHNlO1xuICBpZiAoQ3Rvci5tb2R1bG8gPT0gOSkge1xuICAgIHEgPSBkaXZpZGUoeCwgeS5hYnMoKSwgMCwgMywgMSk7XG4gICAgcS5zICo9IHkucztcbiAgfSBlbHNlIHtcbiAgICBxID0gZGl2aWRlKHgsIHksIDAsIEN0b3IubW9kdWxvLCAxKTtcbiAgfVxuICBxID0gcS50aW1lcyh5KTtcbiAgZXh0ZXJuYWwgPSB0cnVlO1xuICByZXR1cm4geC5taW51cyhxKTtcbn07XG5QLm5hdHVyYWxFeHBvbmVudGlhbCA9IFAuZXhwID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuYXR1cmFsRXhwb25lbnRpYWwodGhpcyk7XG59O1xuUC5uYXR1cmFsTG9nYXJpdGhtID0gUC5sbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmF0dXJhbExvZ2FyaXRobSh0aGlzKTtcbn07XG5QLm5lZ2F0ZWQgPSBQLm5lZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO1xuICB4LnMgPSAteC5zO1xuICByZXR1cm4gZmluYWxpc2UoeCk7XG59O1xuUC5wbHVzID0gUC5hZGQgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBjYXJyeSwgZCwgZSwgaSwgaywgbGVuLCBwciwgcm0sIHhkLCB5ZCwgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICB5ID0gbmV3IEN0b3IoeSk7XG4gIGlmICgheC5kIHx8ICF5LmQpIHtcbiAgICBpZiAoIXgucyB8fCAheS5zKVxuICAgICAgeSA9IG5ldyBDdG9yKE5hTik7XG4gICAgZWxzZSBpZiAoIXguZClcbiAgICAgIHkgPSBuZXcgQ3Rvcih5LmQgfHwgeC5zID09PSB5LnMgPyB4IDogTmFOKTtcbiAgICByZXR1cm4geTtcbiAgfVxuICBpZiAoeC5zICE9IHkucykge1xuICAgIHkucyA9IC15LnM7XG4gICAgcmV0dXJuIHgubWludXMoeSk7XG4gIH1cbiAgeGQgPSB4LmQ7XG4gIHlkID0geS5kO1xuICBwciA9IEN0b3IucHJlY2lzaW9uO1xuICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIGlmICgheGRbMF0gfHwgIXlkWzBdKSB7XG4gICAgaWYgKCF5ZFswXSlcbiAgICAgIHkgPSBuZXcgQ3Rvcih4KTtcbiAgICByZXR1cm4gZXh0ZXJuYWwgPyBmaW5hbGlzZSh5LCBwciwgcm0pIDogeTtcbiAgfVxuICBrID0gbWF0aGZsb29yKHguZSAvIExPR19CQVNFKTtcbiAgZSA9IG1hdGhmbG9vcih5LmUgLyBMT0dfQkFTRSk7XG4gIHhkID0geGQuc2xpY2UoKTtcbiAgaSA9IGsgLSBlO1xuICBpZiAoaSkge1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgZCA9IHhkO1xuICAgICAgaSA9IC1pO1xuICAgICAgbGVuID0geWQubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkID0geWQ7XG4gICAgICBlID0gaztcbiAgICAgIGxlbiA9IHhkLmxlbmd0aDtcbiAgICB9XG4gICAgayA9IE1hdGguY2VpbChwciAvIExPR19CQVNFKTtcbiAgICBsZW4gPSBrID4gbGVuID8gayArIDEgOiBsZW4gKyAxO1xuICAgIGlmIChpID4gbGVuKSB7XG4gICAgICBpID0gbGVuO1xuICAgICAgZC5sZW5ndGggPSAxO1xuICAgIH1cbiAgICBkLnJldmVyc2UoKTtcbiAgICBmb3IgKDsgaS0tOyApXG4gICAgICBkLnB1c2goMCk7XG4gICAgZC5yZXZlcnNlKCk7XG4gIH1cbiAgbGVuID0geGQubGVuZ3RoO1xuICBpID0geWQubGVuZ3RoO1xuICBpZiAobGVuIC0gaSA8IDApIHtcbiAgICBpID0gbGVuO1xuICAgIGQgPSB5ZDtcbiAgICB5ZCA9IHhkO1xuICAgIHhkID0gZDtcbiAgfVxuICBmb3IgKGNhcnJ5ID0gMDsgaTsgKSB7XG4gICAgY2FycnkgPSAoeGRbLS1pXSA9IHhkW2ldICsgeWRbaV0gKyBjYXJyeSkgLyBCQVNFIHwgMDtcbiAgICB4ZFtpXSAlPSBCQVNFO1xuICB9XG4gIGlmIChjYXJyeSkge1xuICAgIHhkLnVuc2hpZnQoY2FycnkpO1xuICAgICsrZTtcbiAgfVxuICBmb3IgKGxlbiA9IHhkLmxlbmd0aDsgeGRbLS1sZW5dID09IDA7IClcbiAgICB4ZC5wb3AoKTtcbiAgeS5kID0geGQ7XG4gIHkuZSA9IGdldEJhc2UxMEV4cG9uZW50KHhkLCBlKTtcbiAgcmV0dXJuIGV4dGVybmFsID8gZmluYWxpc2UoeSwgcHIsIHJtKSA6IHk7XG59O1xuUC5wcmVjaXNpb24gPSBQLnNkID0gZnVuY3Rpb24oeikge1xuICB2YXIgaywgeCA9IHRoaXM7XG4gIGlmICh6ICE9PSB2b2lkIDAgJiYgeiAhPT0gISF6ICYmIHogIT09IDEgJiYgeiAhPT0gMClcbiAgICB0aHJvdyBFcnJvcihpbnZhbGlkQXJndW1lbnQgKyB6KTtcbiAgaWYgKHguZCkge1xuICAgIGsgPSBnZXRQcmVjaXNpb24oeC5kKTtcbiAgICBpZiAoeiAmJiB4LmUgKyAxID4gaylcbiAgICAgIGsgPSB4LmUgKyAxO1xuICB9IGVsc2Uge1xuICAgIGsgPSBOYU47XG4gIH1cbiAgcmV0dXJuIGs7XG59O1xuUC5yb3VuZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yO1xuICByZXR1cm4gZmluYWxpc2UobmV3IEN0b3IoeCksIHguZSArIDEsIEN0b3Iucm91bmRpbmcpO1xufTtcblAuc2luZSA9IFAuc2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwciwgcm0sIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4LmlzRmluaXRlKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiBuZXcgQ3Rvcih4KTtcbiAgcHIgPSBDdG9yLnByZWNpc2lvbjtcbiAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICBDdG9yLnByZWNpc2lvbiA9IHByICsgTWF0aC5tYXgoeC5lLCB4LnNkKCkpICsgTE9HX0JBU0U7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICB4ID0gc2luZShDdG9yLCB0b0xlc3NUaGFuSGFsZlBpKEN0b3IsIHgpKTtcbiAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgQ3Rvci5yb3VuZGluZyA9IHJtO1xuICByZXR1cm4gZmluYWxpc2UocXVhZHJhbnQgPiAyID8geC5uZWcoKSA6IHgsIHByLCBybSwgdHJ1ZSk7XG59O1xuUC5zcXVhcmVSb290ID0gUC5zcXJ0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtLCBuLCBzZCwgciwgcmVwLCB0LCB4ID0gdGhpcywgZCA9IHguZCwgZSA9IHguZSwgcyA9IHgucywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChzICE9PSAxIHx8ICFkIHx8ICFkWzBdKSB7XG4gICAgcmV0dXJuIG5ldyBDdG9yKCFzIHx8IHMgPCAwICYmICghZCB8fCBkWzBdKSA/IE5hTiA6IGQgPyB4IDogMSAvIDApO1xuICB9XG4gIGV4dGVybmFsID0gZmFsc2U7XG4gIHMgPSBNYXRoLnNxcnQoK3gpO1xuICBpZiAocyA9PSAwIHx8IHMgPT0gMSAvIDApIHtcbiAgICBuID0gZGlnaXRzVG9TdHJpbmcoZCk7XG4gICAgaWYgKChuLmxlbmd0aCArIGUpICUgMiA9PSAwKVxuICAgICAgbiArPSBcIjBcIjtcbiAgICBzID0gTWF0aC5zcXJ0KG4pO1xuICAgIGUgPSBtYXRoZmxvb3IoKGUgKyAxKSAvIDIpIC0gKGUgPCAwIHx8IGUgJSAyKTtcbiAgICBpZiAocyA9PSAxIC8gMCkge1xuICAgICAgbiA9IFwiNWVcIiArIGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBzLnRvRXhwb25lbnRpYWwoKTtcbiAgICAgIG4gPSBuLnNsaWNlKDAsIG4uaW5kZXhPZihcImVcIikgKyAxKSArIGU7XG4gICAgfVxuICAgIHIgPSBuZXcgQ3RvcihuKTtcbiAgfSBlbHNlIHtcbiAgICByID0gbmV3IEN0b3Iocy50b1N0cmluZygpKTtcbiAgfVxuICBzZCA9IChlID0gQ3Rvci5wcmVjaXNpb24pICsgMztcbiAgZm9yICg7IDsgKSB7XG4gICAgdCA9IHI7XG4gICAgciA9IHQucGx1cyhkaXZpZGUoeCwgdCwgc2QgKyAyLCAxKSkudGltZXMoMC41KTtcbiAgICBpZiAoZGlnaXRzVG9TdHJpbmcodC5kKS5zbGljZSgwLCBzZCkgPT09IChuID0gZGlnaXRzVG9TdHJpbmcoci5kKSkuc2xpY2UoMCwgc2QpKSB7XG4gICAgICBuID0gbi5zbGljZShzZCAtIDMsIHNkICsgMSk7XG4gICAgICBpZiAobiA9PSBcIjk5OTlcIiB8fCAhcmVwICYmIG4gPT0gXCI0OTk5XCIpIHtcbiAgICAgICAgaWYgKCFyZXApIHtcbiAgICAgICAgICBmaW5hbGlzZSh0LCBlICsgMSwgMCk7XG4gICAgICAgICAgaWYgKHQudGltZXModCkuZXEoeCkpIHtcbiAgICAgICAgICAgIHIgPSB0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNkICs9IDQ7XG4gICAgICAgIHJlcCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIStuIHx8ICErbi5zbGljZSgxKSAmJiBuLmNoYXJBdCgwKSA9PSBcIjVcIikge1xuICAgICAgICAgIGZpbmFsaXNlKHIsIGUgKyAxLCAxKTtcbiAgICAgICAgICBtID0gIXIudGltZXMocikuZXEoeCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIGUsIEN0b3Iucm91bmRpbmcsIG0pO1xufTtcblAudGFuZ2VudCA9IFAudGFuID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwciwgcm0sIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4LmlzRmluaXRlKCkpXG4gICAgcmV0dXJuIG5ldyBDdG9yKE5hTik7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiBuZXcgQ3Rvcih4KTtcbiAgcHIgPSBDdG9yLnByZWNpc2lvbjtcbiAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICBDdG9yLnByZWNpc2lvbiA9IHByICsgMTA7XG4gIEN0b3Iucm91bmRpbmcgPSAxO1xuICB4ID0geC5zaW4oKTtcbiAgeC5zID0gMTtcbiAgeCA9IGRpdmlkZSh4LCBuZXcgQ3RvcigxKS5taW51cyh4LnRpbWVzKHgpKS5zcXJ0KCksIHByICsgMTAsIDApO1xuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBDdG9yLnJvdW5kaW5nID0gcm07XG4gIHJldHVybiBmaW5hbGlzZShxdWFkcmFudCA9PSAyIHx8IHF1YWRyYW50ID09IDQgPyB4Lm5lZygpIDogeCwgcHIsIHJtLCB0cnVlKTtcbn07XG5QLnRpbWVzID0gUC5tdWwgPSBmdW5jdGlvbih5KSB7XG4gIHZhciBjYXJyeSwgZSwgaSwgaywgciwgckwsIHQsIHhkTCwgeWRMLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3IsIHhkID0geC5kLCB5ZCA9ICh5ID0gbmV3IEN0b3IoeSkpLmQ7XG4gIHkucyAqPSB4LnM7XG4gIGlmICgheGQgfHwgIXhkWzBdIHx8ICF5ZCB8fCAheWRbMF0pIHtcbiAgICByZXR1cm4gbmV3IEN0b3IoIXkucyB8fCB4ZCAmJiAheGRbMF0gJiYgIXlkIHx8IHlkICYmICF5ZFswXSAmJiAheGQgPyBOYU4gOiAheGQgfHwgIXlkID8geS5zIC8gMCA6IHkucyAqIDApO1xuICB9XG4gIGUgPSBtYXRoZmxvb3IoeC5lIC8gTE9HX0JBU0UpICsgbWF0aGZsb29yKHkuZSAvIExPR19CQVNFKTtcbiAgeGRMID0geGQubGVuZ3RoO1xuICB5ZEwgPSB5ZC5sZW5ndGg7XG4gIGlmICh4ZEwgPCB5ZEwpIHtcbiAgICByID0geGQ7XG4gICAgeGQgPSB5ZDtcbiAgICB5ZCA9IHI7XG4gICAgckwgPSB4ZEw7XG4gICAgeGRMID0geWRMO1xuICAgIHlkTCA9IHJMO1xuICB9XG4gIHIgPSBbXTtcbiAgckwgPSB4ZEwgKyB5ZEw7XG4gIGZvciAoaSA9IHJMOyBpLS07IClcbiAgICByLnB1c2goMCk7XG4gIGZvciAoaSA9IHlkTDsgLS1pID49IDA7ICkge1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGsgPSB4ZEwgKyBpOyBrID4gaTsgKSB7XG4gICAgICB0ID0gcltrXSArIHlkW2ldICogeGRbayAtIGkgLSAxXSArIGNhcnJ5O1xuICAgICAgcltrLS1dID0gdCAlIEJBU0UgfCAwO1xuICAgICAgY2FycnkgPSB0IC8gQkFTRSB8IDA7XG4gICAgfVxuICAgIHJba10gPSAocltrXSArIGNhcnJ5KSAlIEJBU0UgfCAwO1xuICB9XG4gIGZvciAoOyAhclstLXJMXTsgKVxuICAgIHIucG9wKCk7XG4gIGlmIChjYXJyeSlcbiAgICArK2U7XG4gIGVsc2VcbiAgICByLnNoaWZ0KCk7XG4gIHkuZCA9IHI7XG4gIHkuZSA9IGdldEJhc2UxMEV4cG9uZW50KHIsIGUpO1xuICByZXR1cm4gZXh0ZXJuYWwgPyBmaW5hbGlzZSh5LCBDdG9yLnByZWNpc2lvbiwgQ3Rvci5yb3VuZGluZykgOiB5O1xufTtcblAudG9CaW5hcnkgPSBmdW5jdGlvbihzZCwgcm0pIHtcbiAgcmV0dXJuIHRvU3RyaW5nQmluYXJ5KHRoaXMsIDIsIHNkLCBybSk7XG59O1xuUC50b0RlY2ltYWxQbGFjZXMgPSBQLnRvRFAgPSBmdW5jdGlvbihkcCwgcm0pIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgeCA9IG5ldyBDdG9yKHgpO1xuICBpZiAoZHAgPT09IHZvaWQgMClcbiAgICByZXR1cm4geDtcbiAgY2hlY2tJbnQzMihkcCwgMCwgTUFYX0RJR0lUUyk7XG4gIGlmIChybSA9PT0gdm9pZCAwKVxuICAgIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgZWxzZVxuICAgIGNoZWNrSW50MzIocm0sIDAsIDgpO1xuICByZXR1cm4gZmluYWxpc2UoeCwgZHAgKyB4LmUgKyAxLCBybSk7XG59O1xuUC50b0V4cG9uZW50aWFsID0gZnVuY3Rpb24oZHAsIHJtKSB7XG4gIHZhciBzdHIsIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGRwID09PSB2b2lkIDApIHtcbiAgICBzdHIgPSBmaW5pdGVUb1N0cmluZyh4LCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBjaGVja0ludDMyKGRwLCAwLCBNQVhfRElHSVRTKTtcbiAgICBpZiAocm0gPT09IHZvaWQgMClcbiAgICAgIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgICBlbHNlXG4gICAgICBjaGVja0ludDMyKHJtLCAwLCA4KTtcbiAgICB4ID0gZmluYWxpc2UobmV3IEN0b3IoeCksIGRwICsgMSwgcm0pO1xuICAgIHN0ciA9IGZpbml0ZVRvU3RyaW5nKHgsIHRydWUsIGRwICsgMSk7XG4gIH1cbiAgcmV0dXJuIHguaXNOZWcoKSAmJiAheC5pc1plcm8oKSA/IFwiLVwiICsgc3RyIDogc3RyO1xufTtcblAudG9GaXhlZCA9IGZ1bmN0aW9uKGRwLCBybSkge1xuICB2YXIgc3RyLCB5LCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChkcCA9PT0gdm9pZCAwKSB7XG4gICAgc3RyID0gZmluaXRlVG9TdHJpbmcoeCk7XG4gIH0gZWxzZSB7XG4gICAgY2hlY2tJbnQzMihkcCwgMCwgTUFYX0RJR0lUUyk7XG4gICAgaWYgKHJtID09PSB2b2lkIDApXG4gICAgICBybSA9IEN0b3Iucm91bmRpbmc7XG4gICAgZWxzZVxuICAgICAgY2hlY2tJbnQzMihybSwgMCwgOCk7XG4gICAgeSA9IGZpbmFsaXNlKG5ldyBDdG9yKHgpLCBkcCArIHguZSArIDEsIHJtKTtcbiAgICBzdHIgPSBmaW5pdGVUb1N0cmluZyh5LCBmYWxzZSwgZHAgKyB5LmUgKyAxKTtcbiAgfVxuICByZXR1cm4geC5pc05lZygpICYmICF4LmlzWmVybygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuUC50b0ZyYWN0aW9uID0gZnVuY3Rpb24obWF4RCkge1xuICB2YXIgZCwgZDAsIGQxLCBkMiwgZSwgaywgbiwgbjAsIG4xLCBwciwgcSwgciwgeCA9IHRoaXMsIHhkID0geC5kLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKCF4ZClcbiAgICByZXR1cm4gbmV3IEN0b3IoeCk7XG4gIG4xID0gZDAgPSBuZXcgQ3RvcigxKTtcbiAgZDEgPSBuMCA9IG5ldyBDdG9yKDApO1xuICBkID0gbmV3IEN0b3IoZDEpO1xuICBlID0gZC5lID0gZ2V0UHJlY2lzaW9uKHhkKSAtIHguZSAtIDE7XG4gIGsgPSBlICUgTE9HX0JBU0U7XG4gIGQuZFswXSA9IG1hdGhwb3coMTAsIGsgPCAwID8gTE9HX0JBU0UgKyBrIDogayk7XG4gIGlmIChtYXhEID09IG51bGwpIHtcbiAgICBtYXhEID0gZSA+IDAgPyBkIDogbjE7XG4gIH0gZWxzZSB7XG4gICAgbiA9IG5ldyBDdG9yKG1heEQpO1xuICAgIGlmICghbi5pc0ludCgpIHx8IG4ubHQobjEpKVxuICAgICAgdGhyb3cgRXJyb3IoaW52YWxpZEFyZ3VtZW50ICsgbik7XG4gICAgbWF4RCA9IG4uZ3QoZCkgPyBlID4gMCA/IGQgOiBuMSA6IG47XG4gIH1cbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgbiA9IG5ldyBDdG9yKGRpZ2l0c1RvU3RyaW5nKHhkKSk7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIEN0b3IucHJlY2lzaW9uID0gZSA9IHhkLmxlbmd0aCAqIExPR19CQVNFICogMjtcbiAgZm9yICg7IDsgKSB7XG4gICAgcSA9IGRpdmlkZShuLCBkLCAwLCAxLCAxKTtcbiAgICBkMiA9IGQwLnBsdXMocS50aW1lcyhkMSkpO1xuICAgIGlmIChkMi5jbXAobWF4RCkgPT0gMSlcbiAgICAgIGJyZWFrO1xuICAgIGQwID0gZDE7XG4gICAgZDEgPSBkMjtcbiAgICBkMiA9IG4xO1xuICAgIG4xID0gbjAucGx1cyhxLnRpbWVzKGQyKSk7XG4gICAgbjAgPSBkMjtcbiAgICBkMiA9IGQ7XG4gICAgZCA9IG4ubWludXMocS50aW1lcyhkMikpO1xuICAgIG4gPSBkMjtcbiAgfVxuICBkMiA9IGRpdmlkZShtYXhELm1pbnVzKGQwKSwgZDEsIDAsIDEsIDEpO1xuICBuMCA9IG4wLnBsdXMoZDIudGltZXMobjEpKTtcbiAgZDAgPSBkMC5wbHVzKGQyLnRpbWVzKGQxKSk7XG4gIG4wLnMgPSBuMS5zID0geC5zO1xuICByID0gZGl2aWRlKG4xLCBkMSwgZSwgMSkubWludXMoeCkuYWJzKCkuY21wKGRpdmlkZShuMCwgZDAsIGUsIDEpLm1pbnVzKHgpLmFicygpKSA8IDEgPyBbbjEsIGQxXSA6IFtuMCwgZDBdO1xuICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICBleHRlcm5hbCA9IHRydWU7XG4gIHJldHVybiByO1xufTtcblAudG9IZXhhZGVjaW1hbCA9IFAudG9IZXggPSBmdW5jdGlvbihzZCwgcm0pIHtcbiAgcmV0dXJuIHRvU3RyaW5nQmluYXJ5KHRoaXMsIDE2LCBzZCwgcm0pO1xufTtcblAudG9OZWFyZXN0ID0gZnVuY3Rpb24oeSwgcm0pIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgeCA9IG5ldyBDdG9yKHgpO1xuICBpZiAoeSA9PSBudWxsKSB7XG4gICAgaWYgKCF4LmQpXG4gICAgICByZXR1cm4geDtcbiAgICB5ID0gbmV3IEN0b3IoMSk7XG4gICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICB9IGVsc2Uge1xuICAgIHkgPSBuZXcgQ3Rvcih5KTtcbiAgICBpZiAocm0gPT09IHZvaWQgMCkge1xuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0ludDMyKHJtLCAwLCA4KTtcbiAgICB9XG4gICAgaWYgKCF4LmQpXG4gICAgICByZXR1cm4geS5zID8geCA6IHk7XG4gICAgaWYgKCF5LmQpIHtcbiAgICAgIGlmICh5LnMpXG4gICAgICAgIHkucyA9IHgucztcbiAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgfVxuICBpZiAoeS5kWzBdKSB7XG4gICAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgICB4ID0gZGl2aWRlKHgsIHksIDAsIHJtLCAxKS50aW1lcyh5KTtcbiAgICBleHRlcm5hbCA9IHRydWU7XG4gICAgZmluYWxpc2UoeCk7XG4gIH0gZWxzZSB7XG4gICAgeS5zID0geC5zO1xuICAgIHggPSB5O1xuICB9XG4gIHJldHVybiB4O1xufTtcblAudG9OdW1iZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICt0aGlzO1xufTtcblAudG9PY3RhbCA9IGZ1bmN0aW9uKHNkLCBybSkge1xuICByZXR1cm4gdG9TdHJpbmdCaW5hcnkodGhpcywgOCwgc2QsIHJtKTtcbn07XG5QLnRvUG93ZXIgPSBQLnBvdyA9IGZ1bmN0aW9uKHkpIHtcbiAgdmFyIGUsIGssIHByLCByLCBybSwgcywgeCA9IHRoaXMsIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCB5biA9ICsoeSA9IG5ldyBDdG9yKHkpKTtcbiAgaWYgKCF4LmQgfHwgIXkuZCB8fCAheC5kWzBdIHx8ICF5LmRbMF0pXG4gICAgcmV0dXJuIG5ldyBDdG9yKG1hdGhwb3coK3gsIHluKSk7XG4gIHggPSBuZXcgQ3Rvcih4KTtcbiAgaWYgKHguZXEoMSkpXG4gICAgcmV0dXJuIHg7XG4gIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIHJtID0gQ3Rvci5yb3VuZGluZztcbiAgaWYgKHkuZXEoMSkpXG4gICAgcmV0dXJuIGZpbmFsaXNlKHgsIHByLCBybSk7XG4gIGUgPSBtYXRoZmxvb3IoeS5lIC8gTE9HX0JBU0UpO1xuICBpZiAoZSA+PSB5LmQubGVuZ3RoIC0gMSAmJiAoayA9IHluIDwgMCA/IC15biA6IHluKSA8PSBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgciA9IGludFBvdyhDdG9yLCB4LCBrLCBwcik7XG4gICAgcmV0dXJuIHkucyA8IDAgPyBuZXcgQ3RvcigxKS5kaXYocikgOiBmaW5hbGlzZShyLCBwciwgcm0pO1xuICB9XG4gIHMgPSB4LnM7XG4gIGlmIChzIDwgMCkge1xuICAgIGlmIChlIDwgeS5kLmxlbmd0aCAtIDEpXG4gICAgICByZXR1cm4gbmV3IEN0b3IoTmFOKTtcbiAgICBpZiAoKHkuZFtlXSAmIDEpID09IDApXG4gICAgICBzID0gMTtcbiAgICBpZiAoeC5lID09IDAgJiYgeC5kWzBdID09IDEgJiYgeC5kLmxlbmd0aCA9PSAxKSB7XG4gICAgICB4LnMgPSBzO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9XG4gIGsgPSBtYXRocG93KCt4LCB5bik7XG4gIGUgPSBrID09IDAgfHwgIWlzRmluaXRlKGspID8gbWF0aGZsb29yKHluICogKE1hdGgubG9nKFwiMC5cIiArIGRpZ2l0c1RvU3RyaW5nKHguZCkpIC8gTWF0aC5MTjEwICsgeC5lICsgMSkpIDogbmV3IEN0b3IoayArIFwiXCIpLmU7XG4gIGlmIChlID4gQ3Rvci5tYXhFICsgMSB8fCBlIDwgQ3Rvci5taW5FIC0gMSlcbiAgICByZXR1cm4gbmV3IEN0b3IoZSA+IDAgPyBzIC8gMCA6IDApO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBDdG9yLnJvdW5kaW5nID0geC5zID0gMTtcbiAgayA9IE1hdGgubWluKDEyLCAoZSArIFwiXCIpLmxlbmd0aCk7XG4gIHIgPSBuYXR1cmFsRXhwb25lbnRpYWwoeS50aW1lcyhuYXR1cmFsTG9nYXJpdGhtKHgsIHByICsgaykpLCBwcik7XG4gIGlmIChyLmQpIHtcbiAgICByID0gZmluYWxpc2UociwgcHIgKyA1LCAxKTtcbiAgICBpZiAoY2hlY2tSb3VuZGluZ0RpZ2l0cyhyLmQsIHByLCBybSkpIHtcbiAgICAgIGUgPSBwciArIDEwO1xuICAgICAgciA9IGZpbmFsaXNlKG5hdHVyYWxFeHBvbmVudGlhbCh5LnRpbWVzKG5hdHVyYWxMb2dhcml0aG0oeCwgZSArIGspKSwgZSksIGUgKyA1LCAxKTtcbiAgICAgIGlmICgrZGlnaXRzVG9TdHJpbmcoci5kKS5zbGljZShwciArIDEsIHByICsgMTUpICsgMSA9PSAxZTE0KSB7XG4gICAgICAgIHIgPSBmaW5hbGlzZShyLCBwciArIDEsIDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByLnMgPSBzO1xuICBleHRlcm5hbCA9IHRydWU7XG4gIEN0b3Iucm91bmRpbmcgPSBybTtcbiAgcmV0dXJuIGZpbmFsaXNlKHIsIHByLCBybSk7XG59O1xuUC50b1ByZWNpc2lvbiA9IGZ1bmN0aW9uKHNkLCBybSkge1xuICB2YXIgc3RyLCB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChzZCA9PT0gdm9pZCAwKSB7XG4gICAgc3RyID0gZmluaXRlVG9TdHJpbmcoeCwgeC5lIDw9IEN0b3IudG9FeHBOZWcgfHwgeC5lID49IEN0b3IudG9FeHBQb3MpO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrSW50MzIoc2QsIDEsIE1BWF9ESUdJVFMpO1xuICAgIGlmIChybSA9PT0gdm9pZCAwKVxuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIGVsc2VcbiAgICAgIGNoZWNrSW50MzIocm0sIDAsIDgpO1xuICAgIHggPSBmaW5hbGlzZShuZXcgQ3Rvcih4KSwgc2QsIHJtKTtcbiAgICBzdHIgPSBmaW5pdGVUb1N0cmluZyh4LCBzZCA8PSB4LmUgfHwgeC5lIDw9IEN0b3IudG9FeHBOZWcsIHNkKTtcbiAgfVxuICByZXR1cm4geC5pc05lZygpICYmICF4LmlzWmVybygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuUC50b1NpZ25pZmljYW50RGlnaXRzID0gUC50b1NEID0gZnVuY3Rpb24oc2QsIHJtKSB7XG4gIHZhciB4ID0gdGhpcywgQ3RvciA9IHguY29uc3RydWN0b3I7XG4gIGlmIChzZCA9PT0gdm9pZCAwKSB7XG4gICAgc2QgPSBDdG9yLnByZWNpc2lvbjtcbiAgICBybSA9IEN0b3Iucm91bmRpbmc7XG4gIH0gZWxzZSB7XG4gICAgY2hlY2tJbnQzMihzZCwgMSwgTUFYX0RJR0lUUyk7XG4gICAgaWYgKHJtID09PSB2b2lkIDApXG4gICAgICBybSA9IEN0b3Iucm91bmRpbmc7XG4gICAgZWxzZVxuICAgICAgY2hlY2tJbnQzMihybSwgMCwgOCk7XG4gIH1cbiAgcmV0dXJuIGZpbmFsaXNlKG5ldyBDdG9yKHgpLCBzZCwgcm0pO1xufTtcblAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3Rvciwgc3RyID0gZmluaXRlVG9TdHJpbmcoeCwgeC5lIDw9IEN0b3IudG9FeHBOZWcgfHwgeC5lID49IEN0b3IudG9FeHBQb3MpO1xuICByZXR1cm4geC5pc05lZygpICYmICF4LmlzWmVybygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuUC50cnVuY2F0ZWQgPSBQLnRydW5jID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBmaW5hbGlzZShuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSwgdGhpcy5lICsgMSwgMSk7XG59O1xuUC52YWx1ZU9mID0gUC50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSB0aGlzLCBDdG9yID0geC5jb25zdHJ1Y3Rvciwgc3RyID0gZmluaXRlVG9TdHJpbmcoeCwgeC5lIDw9IEN0b3IudG9FeHBOZWcgfHwgeC5lID49IEN0b3IudG9FeHBQb3MpO1xuICByZXR1cm4geC5pc05lZygpID8gXCItXCIgKyBzdHIgOiBzdHI7XG59O1xuZnVuY3Rpb24gZGlnaXRzVG9TdHJpbmcoZCkge1xuICB2YXIgaSwgaywgd3MsIGluZGV4T2ZMYXN0V29yZCA9IGQubGVuZ3RoIC0gMSwgc3RyID0gXCJcIiwgdyA9IGRbMF07XG4gIGlmIChpbmRleE9mTGFzdFdvcmQgPiAwKSB7XG4gICAgc3RyICs9IHc7XG4gICAgZm9yIChpID0gMTsgaSA8IGluZGV4T2ZMYXN0V29yZDsgaSsrKSB7XG4gICAgICB3cyA9IGRbaV0gKyBcIlwiO1xuICAgICAgayA9IExPR19CQVNFIC0gd3MubGVuZ3RoO1xuICAgICAgaWYgKGspXG4gICAgICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGspO1xuICAgICAgc3RyICs9IHdzO1xuICAgIH1cbiAgICB3ID0gZFtpXTtcbiAgICB3cyA9IHcgKyBcIlwiO1xuICAgIGsgPSBMT0dfQkFTRSAtIHdzLmxlbmd0aDtcbiAgICBpZiAoaylcbiAgICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGspO1xuICB9IGVsc2UgaWYgKHcgPT09IDApIHtcbiAgICByZXR1cm4gXCIwXCI7XG4gIH1cbiAgZm9yICg7IHcgJSAxMCA9PT0gMDsgKVxuICAgIHcgLz0gMTA7XG4gIHJldHVybiBzdHIgKyB3O1xufVxuZnVuY3Rpb24gY2hlY2tJbnQzMihpLCBtaW4yLCBtYXgyKSB7XG4gIGlmIChpICE9PSB+fmkgfHwgaSA8IG1pbjIgfHwgaSA+IG1heDIpIHtcbiAgICB0aHJvdyBFcnJvcihpbnZhbGlkQXJndW1lbnQgKyBpKTtcbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tSb3VuZGluZ0RpZ2l0cyhkLCBpLCBybSwgcmVwZWF0aW5nKSB7XG4gIHZhciBkaSwgaywgciwgcmQ7XG4gIGZvciAoayA9IGRbMF07IGsgPj0gMTA7IGsgLz0gMTApXG4gICAgLS1pO1xuICBpZiAoLS1pIDwgMCkge1xuICAgIGkgKz0gTE9HX0JBU0U7XG4gICAgZGkgPSAwO1xuICB9IGVsc2Uge1xuICAgIGRpID0gTWF0aC5jZWlsKChpICsgMSkgLyBMT0dfQkFTRSk7XG4gICAgaSAlPSBMT0dfQkFTRTtcbiAgfVxuICBrID0gbWF0aHBvdygxMCwgTE9HX0JBU0UgLSBpKTtcbiAgcmQgPSBkW2RpXSAlIGsgfCAwO1xuICBpZiAocmVwZWF0aW5nID09IG51bGwpIHtcbiAgICBpZiAoaSA8IDMpIHtcbiAgICAgIGlmIChpID09IDApXG4gICAgICAgIHJkID0gcmQgLyAxMDAgfCAwO1xuICAgICAgZWxzZSBpZiAoaSA9PSAxKVxuICAgICAgICByZCA9IHJkIC8gMTAgfCAwO1xuICAgICAgciA9IHJtIDwgNCAmJiByZCA9PSA5OTk5OSB8fCBybSA+IDMgJiYgcmQgPT0gNDk5OTkgfHwgcmQgPT0gNWU0IHx8IHJkID09IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIgPSAocm0gPCA0ICYmIHJkICsgMSA9PSBrIHx8IHJtID4gMyAmJiByZCArIDEgPT0gayAvIDIpICYmIChkW2RpICsgMV0gLyBrIC8gMTAwIHwgMCkgPT0gbWF0aHBvdygxMCwgaSAtIDIpIC0gMSB8fCAocmQgPT0gayAvIDIgfHwgcmQgPT0gMCkgJiYgKGRbZGkgKyAxXSAvIGsgLyAxMDAgfCAwKSA9PSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaSA8IDQpIHtcbiAgICAgIGlmIChpID09IDApXG4gICAgICAgIHJkID0gcmQgLyAxZTMgfCAwO1xuICAgICAgZWxzZSBpZiAoaSA9PSAxKVxuICAgICAgICByZCA9IHJkIC8gMTAwIHwgMDtcbiAgICAgIGVsc2UgaWYgKGkgPT0gMilcbiAgICAgICAgcmQgPSByZCAvIDEwIHwgMDtcbiAgICAgIHIgPSAocmVwZWF0aW5nIHx8IHJtIDwgNCkgJiYgcmQgPT0gOTk5OSB8fCAhcmVwZWF0aW5nICYmIHJtID4gMyAmJiByZCA9PSA0OTk5O1xuICAgIH0gZWxzZSB7XG4gICAgICByID0gKChyZXBlYXRpbmcgfHwgcm0gPCA0KSAmJiByZCArIDEgPT0gayB8fCAhcmVwZWF0aW5nICYmIHJtID4gMyAmJiByZCArIDEgPT0gayAvIDIpICYmIChkW2RpICsgMV0gLyBrIC8gMWUzIHwgMCkgPT0gbWF0aHBvdygxMCwgaSAtIDMpIC0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBjb252ZXJ0QmFzZShzdHIsIGJhc2VJbiwgYmFzZU91dCkge1xuICB2YXIgaiwgYXJyID0gWzBdLCBhcnJMLCBpID0gMCwgc3RyTCA9IHN0ci5sZW5ndGg7XG4gIGZvciAoOyBpIDwgc3RyTDsgKSB7XG4gICAgZm9yIChhcnJMID0gYXJyLmxlbmd0aDsgYXJyTC0tOyApXG4gICAgICBhcnJbYXJyTF0gKj0gYmFzZUluO1xuICAgIGFyclswXSArPSBOVU1FUkFMUy5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSk7XG4gICAgZm9yIChqID0gMDsgaiA8IGFyci5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFycltqXSA+IGJhc2VPdXQgLSAxKSB7XG4gICAgICAgIGlmIChhcnJbaiArIDFdID09PSB2b2lkIDApXG4gICAgICAgICAgYXJyW2ogKyAxXSA9IDA7XG4gICAgICAgIGFycltqICsgMV0gKz0gYXJyW2pdIC8gYmFzZU91dCB8IDA7XG4gICAgICAgIGFycltqXSAlPSBiYXNlT3V0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyLnJldmVyc2UoKTtcbn1cbmZ1bmN0aW9uIGNvc2luZShDdG9yLCB4KSB7XG4gIHZhciBrLCBsZW4sIHk7XG4gIGlmICh4LmlzWmVybygpKVxuICAgIHJldHVybiB4O1xuICBsZW4gPSB4LmQubGVuZ3RoO1xuICBpZiAobGVuIDwgMzIpIHtcbiAgICBrID0gTWF0aC5jZWlsKGxlbiAvIDMpO1xuICAgIHkgPSAoMSAvIHRpbnlQb3coNCwgaykpLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgayA9IDE2O1xuICAgIHkgPSBcIjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTBcIjtcbiAgfVxuICBDdG9yLnByZWNpc2lvbiArPSBrO1xuICB4ID0gdGF5bG9yU2VyaWVzKEN0b3IsIDEsIHgudGltZXMoeSksIG5ldyBDdG9yKDEpKTtcbiAgZm9yICh2YXIgaSA9IGs7IGktLTsgKSB7XG4gICAgdmFyIGNvczJ4ID0geC50aW1lcyh4KTtcbiAgICB4ID0gY29zMngudGltZXMoY29zMngpLm1pbnVzKGNvczJ4KS50aW1lcyg4KS5wbHVzKDEpO1xuICB9XG4gIEN0b3IucHJlY2lzaW9uIC09IGs7XG4gIHJldHVybiB4O1xufVxudmFyIGRpdmlkZSA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBtdWx0aXBseUludGVnZXIoeCwgaywgYmFzZSkge1xuICAgIHZhciB0ZW1wLCBjYXJyeSA9IDAsIGkgPSB4Lmxlbmd0aDtcbiAgICBmb3IgKHggPSB4LnNsaWNlKCk7IGktLTsgKSB7XG4gICAgICB0ZW1wID0geFtpXSAqIGsgKyBjYXJyeTtcbiAgICAgIHhbaV0gPSB0ZW1wICUgYmFzZSB8IDA7XG4gICAgICBjYXJyeSA9IHRlbXAgLyBiYXNlIHwgMDtcbiAgICB9XG4gICAgaWYgKGNhcnJ5KVxuICAgICAgeC51bnNoaWZ0KGNhcnJ5KTtcbiAgICByZXR1cm4geDtcbiAgfVxuICBmdW5jdGlvbiBjb21wYXJlKGEsIGIsIGFMLCBiTCkge1xuICAgIHZhciBpLCByO1xuICAgIGlmIChhTCAhPSBiTCkge1xuICAgICAgciA9IGFMID4gYkwgPyAxIDogLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IHIgPSAwOyBpIDwgYUw7IGkrKykge1xuICAgICAgICBpZiAoYVtpXSAhPSBiW2ldKSB7XG4gICAgICAgICAgciA9IGFbaV0gPiBiW2ldID8gMSA6IC0xO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnRyYWN0MihhLCBiLCBhTCwgYmFzZSkge1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgYUwtLTsgKSB7XG4gICAgICBhW2FMXSAtPSBpO1xuICAgICAgaSA9IGFbYUxdIDwgYlthTF0gPyAxIDogMDtcbiAgICAgIGFbYUxdID0gaSAqIGJhc2UgKyBhW2FMXSAtIGJbYUxdO1xuICAgIH1cbiAgICBmb3IgKDsgIWFbMF0gJiYgYS5sZW5ndGggPiAxOyApXG4gICAgICBhLnNoaWZ0KCk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKHgsIHksIHByLCBybSwgZHAsIGJhc2UpIHtcbiAgICB2YXIgY21wLCBlLCBpLCBrLCBsb2dCYXNlLCBtb3JlLCBwcm9kLCBwcm9kTCwgcSwgcWQsIHJlbSwgcmVtTCwgcmVtMCwgc2QsIHQsIHhpLCB4TCwgeWQwLCB5TCwgeXosIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBzaWduMiA9IHgucyA9PSB5LnMgPyAxIDogLTEsIHhkID0geC5kLCB5ZCA9IHkuZDtcbiAgICBpZiAoIXhkIHx8ICF4ZFswXSB8fCAheWQgfHwgIXlkWzBdKSB7XG4gICAgICByZXR1cm4gbmV3IEN0b3IoXG4gICAgICAgIC8vIFJldHVybiBOYU4gaWYgZWl0aGVyIE5hTiwgb3IgYm90aCBJbmZpbml0eSBvciAwLlxuICAgICAgICAheC5zIHx8ICF5LnMgfHwgKHhkID8geWQgJiYgeGRbMF0gPT0geWRbMF0gOiAheWQpID8gTmFOIDogKFxuICAgICAgICAgIC8vIFJldHVybiBcdTAwQjEwIGlmIHggaXMgMCBvciB5IGlzIFx1MDBCMUluZmluaXR5LCBvciByZXR1cm4gXHUwMEIxSW5maW5pdHkgYXMgeSBpcyAwLlxuICAgICAgICAgIHhkICYmIHhkWzBdID09IDAgfHwgIXlkID8gc2lnbjIgKiAwIDogc2lnbjIgLyAwXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChiYXNlKSB7XG4gICAgICBsb2dCYXNlID0gMTtcbiAgICAgIGUgPSB4LmUgLSB5LmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2UgPSBCQVNFO1xuICAgICAgbG9nQmFzZSA9IExPR19CQVNFO1xuICAgICAgZSA9IG1hdGhmbG9vcih4LmUgLyBsb2dCYXNlKSAtIG1hdGhmbG9vcih5LmUgLyBsb2dCYXNlKTtcbiAgICB9XG4gICAgeUwgPSB5ZC5sZW5ndGg7XG4gICAgeEwgPSB4ZC5sZW5ndGg7XG4gICAgcSA9IG5ldyBDdG9yKHNpZ24yKTtcbiAgICBxZCA9IHEuZCA9IFtdO1xuICAgIGZvciAoaSA9IDA7IHlkW2ldID09ICh4ZFtpXSB8fCAwKTsgaSsrKVxuICAgICAgO1xuICAgIGlmICh5ZFtpXSA+ICh4ZFtpXSB8fCAwKSlcbiAgICAgIGUtLTtcbiAgICBpZiAocHIgPT0gbnVsbCkge1xuICAgICAgc2QgPSBwciA9IEN0b3IucHJlY2lzaW9uO1xuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIH0gZWxzZSBpZiAoZHApIHtcbiAgICAgIHNkID0gcHIgKyAoeC5lIC0geS5lKSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNkID0gcHI7XG4gICAgfVxuICAgIGlmIChzZCA8IDApIHtcbiAgICAgIHFkLnB1c2goMSk7XG4gICAgICBtb3JlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2QgPSBzZCAvIGxvZ0Jhc2UgKyAyIHwgMDtcbiAgICAgIGkgPSAwO1xuICAgICAgaWYgKHlMID09IDEpIHtcbiAgICAgICAgayA9IDA7XG4gICAgICAgIHlkID0geWRbMF07XG4gICAgICAgIHNkKys7XG4gICAgICAgIGZvciAoOyAoaSA8IHhMIHx8IGspICYmIHNkLS07IGkrKykge1xuICAgICAgICAgIHQgPSBrICogYmFzZSArICh4ZFtpXSB8fCAwKTtcbiAgICAgICAgICBxZFtpXSA9IHQgLyB5ZCB8IDA7XG4gICAgICAgICAgayA9IHQgJSB5ZCB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgbW9yZSA9IGsgfHwgaSA8IHhMO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgayA9IGJhc2UgLyAoeWRbMF0gKyAxKSB8IDA7XG4gICAgICAgIGlmIChrID4gMSkge1xuICAgICAgICAgIHlkID0gbXVsdGlwbHlJbnRlZ2VyKHlkLCBrLCBiYXNlKTtcbiAgICAgICAgICB4ZCA9IG11bHRpcGx5SW50ZWdlcih4ZCwgaywgYmFzZSk7XG4gICAgICAgICAgeUwgPSB5ZC5sZW5ndGg7XG4gICAgICAgICAgeEwgPSB4ZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgeGkgPSB5TDtcbiAgICAgICAgcmVtID0geGQuc2xpY2UoMCwgeUwpO1xuICAgICAgICByZW1MID0gcmVtLmxlbmd0aDtcbiAgICAgICAgZm9yICg7IHJlbUwgPCB5TDsgKVxuICAgICAgICAgIHJlbVtyZW1MKytdID0gMDtcbiAgICAgICAgeXogPSB5ZC5zbGljZSgpO1xuICAgICAgICB5ei51bnNoaWZ0KDApO1xuICAgICAgICB5ZDAgPSB5ZFswXTtcbiAgICAgICAgaWYgKHlkWzFdID49IGJhc2UgLyAyKVxuICAgICAgICAgICsreWQwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgayA9IDA7XG4gICAgICAgICAgY21wID0gY29tcGFyZSh5ZCwgcmVtLCB5TCwgcmVtTCk7XG4gICAgICAgICAgaWYgKGNtcCA8IDApIHtcbiAgICAgICAgICAgIHJlbTAgPSByZW1bMF07XG4gICAgICAgICAgICBpZiAoeUwgIT0gcmVtTClcbiAgICAgICAgICAgICAgcmVtMCA9IHJlbTAgKiBiYXNlICsgKHJlbVsxXSB8fCAwKTtcbiAgICAgICAgICAgIGsgPSByZW0wIC8geWQwIHwgMDtcbiAgICAgICAgICAgIGlmIChrID4gMSkge1xuICAgICAgICAgICAgICBpZiAoayA+PSBiYXNlKVxuICAgICAgICAgICAgICAgIGsgPSBiYXNlIC0gMTtcbiAgICAgICAgICAgICAgcHJvZCA9IG11bHRpcGx5SW50ZWdlcih5ZCwgaywgYmFzZSk7XG4gICAgICAgICAgICAgIHByb2RMID0gcHJvZC5sZW5ndGg7XG4gICAgICAgICAgICAgIHJlbUwgPSByZW0ubGVuZ3RoO1xuICAgICAgICAgICAgICBjbXAgPSBjb21wYXJlKHByb2QsIHJlbSwgcHJvZEwsIHJlbUwpO1xuICAgICAgICAgICAgICBpZiAoY21wID09IDEpIHtcbiAgICAgICAgICAgICAgICBrLS07XG4gICAgICAgICAgICAgICAgc3VidHJhY3QyKHByb2QsIHlMIDwgcHJvZEwgPyB5eiA6IHlkLCBwcm9kTCwgYmFzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChrID09IDApXG4gICAgICAgICAgICAgICAgY21wID0gayA9IDE7XG4gICAgICAgICAgICAgIHByb2QgPSB5ZC5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZEwgPSBwcm9kLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwcm9kTCA8IHJlbUwpXG4gICAgICAgICAgICAgIHByb2QudW5zaGlmdCgwKTtcbiAgICAgICAgICAgIHN1YnRyYWN0MihyZW0sIHByb2QsIHJlbUwsIGJhc2UpO1xuICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkge1xuICAgICAgICAgICAgICByZW1MID0gcmVtLmxlbmd0aDtcbiAgICAgICAgICAgICAgY21wID0gY29tcGFyZSh5ZCwgcmVtLCB5TCwgcmVtTCk7XG4gICAgICAgICAgICAgIGlmIChjbXAgPCAxKSB7XG4gICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIHN1YnRyYWN0MihyZW0sIHlMIDwgcmVtTCA/IHl6IDogeWQsIHJlbUwsIGJhc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1MID0gcmVtLmxlbmd0aDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgcmVtID0gWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxZFtpKytdID0gaztcbiAgICAgICAgICBpZiAoY21wICYmIHJlbVswXSkge1xuICAgICAgICAgICAgcmVtW3JlbUwrK10gPSB4ZFt4aV0gfHwgMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtID0gW3hkW3hpXV07XG4gICAgICAgICAgICByZW1MID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKCh4aSsrIDwgeEwgfHwgcmVtWzBdICE9PSB2b2lkIDApICYmIHNkLS0pO1xuICAgICAgICBtb3JlID0gcmVtWzBdICE9PSB2b2lkIDA7XG4gICAgICB9XG4gICAgICBpZiAoIXFkWzBdKVxuICAgICAgICBxZC5zaGlmdCgpO1xuICAgIH1cbiAgICBpZiAobG9nQmFzZSA9PSAxKSB7XG4gICAgICBxLmUgPSBlO1xuICAgICAgaW5leGFjdCA9IG1vcmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDEsIGsgPSBxZFswXTsgayA+PSAxMDsgayAvPSAxMClcbiAgICAgICAgaSsrO1xuICAgICAgcS5lID0gaSArIGUgKiBsb2dCYXNlIC0gMTtcbiAgICAgIGZpbmFsaXNlKHEsIGRwID8gcHIgKyBxLmUgKyAxIDogcHIsIHJtLCBtb3JlKTtcbiAgICB9XG4gICAgcmV0dXJuIHE7XG4gIH07XG59KCk7XG5mdW5jdGlvbiBmaW5hbGlzZSh4LCBzZCwgcm0sIGlzVHJ1bmNhdGVkKSB7XG4gIHZhciBkaWdpdHMsIGksIGosIGssIHJkLCByb3VuZFVwLCB3LCB4ZCwgeGRpLCBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgb3V0OlxuICAgIGlmIChzZCAhPSBudWxsKSB7XG4gICAgICB4ZCA9IHguZDtcbiAgICAgIGlmICgheGQpXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgZm9yIChkaWdpdHMgPSAxLCBrID0geGRbMF07IGsgPj0gMTA7IGsgLz0gMTApXG4gICAgICAgIGRpZ2l0cysrO1xuICAgICAgaSA9IHNkIC0gZGlnaXRzO1xuICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgIGkgKz0gTE9HX0JBU0U7XG4gICAgICAgIGogPSBzZDtcbiAgICAgICAgdyA9IHhkW3hkaSA9IDBdO1xuICAgICAgICByZCA9IHcgLyBtYXRocG93KDEwLCBkaWdpdHMgLSBqIC0gMSkgJSAxMCB8IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ZGkgPSBNYXRoLmNlaWwoKGkgKyAxKSAvIExPR19CQVNFKTtcbiAgICAgICAgayA9IHhkLmxlbmd0aDtcbiAgICAgICAgaWYgKHhkaSA+PSBrKSB7XG4gICAgICAgICAgaWYgKGlzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICBmb3IgKDsgaysrIDw9IHhkaTsgKVxuICAgICAgICAgICAgICB4ZC5wdXNoKDApO1xuICAgICAgICAgICAgdyA9IHJkID0gMDtcbiAgICAgICAgICAgIGRpZ2l0cyA9IDE7XG4gICAgICAgICAgICBpICU9IExPR19CQVNFO1xuICAgICAgICAgICAgaiA9IGkgLSBMT0dfQkFTRSArIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrIG91dDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdyA9IGsgPSB4ZFt4ZGldO1xuICAgICAgICAgIGZvciAoZGlnaXRzID0gMTsgayA+PSAxMDsgayAvPSAxMClcbiAgICAgICAgICAgIGRpZ2l0cysrO1xuICAgICAgICAgIGkgJT0gTE9HX0JBU0U7XG4gICAgICAgICAgaiA9IGkgLSBMT0dfQkFTRSArIGRpZ2l0cztcbiAgICAgICAgICByZCA9IGogPCAwID8gMCA6IHcgLyBtYXRocG93KDEwLCBkaWdpdHMgLSBqIC0gMSkgJSAxMCB8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlzVHJ1bmNhdGVkID0gaXNUcnVuY2F0ZWQgfHwgc2QgPCAwIHx8IHhkW3hkaSArIDFdICE9PSB2b2lkIDAgfHwgKGogPCAwID8gdyA6IHcgJSBtYXRocG93KDEwLCBkaWdpdHMgLSBqIC0gMSkpO1xuICAgICAgcm91bmRVcCA9IHJtIDwgNCA/IChyZCB8fCBpc1RydW5jYXRlZCkgJiYgKHJtID09IDAgfHwgcm0gPT0gKHgucyA8IDAgPyAzIDogMikpIDogcmQgPiA1IHx8IHJkID09IDUgJiYgKHJtID09IDQgfHwgaXNUcnVuY2F0ZWQgfHwgcm0gPT0gNiAmJiAvLyBDaGVjayB3aGV0aGVyIHRoZSBkaWdpdCB0byB0aGUgbGVmdCBvZiB0aGUgcm91bmRpbmcgZGlnaXQgaXMgb2RkLlxuICAgICAgKGkgPiAwID8gaiA+IDAgPyB3IC8gbWF0aHBvdygxMCwgZGlnaXRzIC0gaikgOiAwIDogeGRbeGRpIC0gMV0pICUgMTAgJiAxIHx8IHJtID09ICh4LnMgPCAwID8gOCA6IDcpKTtcbiAgICAgIGlmIChzZCA8IDEgfHwgIXhkWzBdKSB7XG4gICAgICAgIHhkLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmIChyb3VuZFVwKSB7XG4gICAgICAgICAgc2QgLT0geC5lICsgMTtcbiAgICAgICAgICB4ZFswXSA9IG1hdGhwb3coMTAsIChMT0dfQkFTRSAtIHNkICUgTE9HX0JBU0UpICUgTE9HX0JBU0UpO1xuICAgICAgICAgIHguZSA9IC1zZCB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHhkWzBdID0geC5lID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgeGQubGVuZ3RoID0geGRpO1xuICAgICAgICBrID0gMTtcbiAgICAgICAgeGRpLS07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ZC5sZW5ndGggPSB4ZGkgKyAxO1xuICAgICAgICBrID0gbWF0aHBvdygxMCwgTE9HX0JBU0UgLSBpKTtcbiAgICAgICAgeGRbeGRpXSA9IGogPiAwID8gKHcgLyBtYXRocG93KDEwLCBkaWdpdHMgLSBqKSAlIG1hdGhwb3coMTAsIGopIHwgMCkgKiBrIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChyb3VuZFVwKSB7XG4gICAgICAgIGZvciAoOyA7ICkge1xuICAgICAgICAgIGlmICh4ZGkgPT0gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMSwgaiA9IHhkWzBdOyBqID49IDEwOyBqIC89IDEwKVxuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqID0geGRbMF0gKz0gaztcbiAgICAgICAgICAgIGZvciAoayA9IDE7IGogPj0gMTA7IGogLz0gMTApXG4gICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgIGlmIChpICE9IGspIHtcbiAgICAgICAgICAgICAgeC5lKys7XG4gICAgICAgICAgICAgIGlmICh4ZFswXSA9PSBCQVNFKVxuICAgICAgICAgICAgICAgIHhkWzBdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4ZFt4ZGldICs9IGs7XG4gICAgICAgICAgICBpZiAoeGRbeGRpXSAhPSBCQVNFKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHhkW3hkaS0tXSA9IDA7XG4gICAgICAgICAgICBrID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IHhkLmxlbmd0aDsgeGRbLS1pXSA9PT0gMDsgKVxuICAgICAgICB4ZC5wb3AoKTtcbiAgICB9XG4gIGlmIChleHRlcm5hbCkge1xuICAgIGlmICh4LmUgPiBDdG9yLm1heEUpIHtcbiAgICAgIHguZCA9IG51bGw7XG4gICAgICB4LmUgPSBOYU47XG4gICAgfSBlbHNlIGlmICh4LmUgPCBDdG9yLm1pbkUpIHtcbiAgICAgIHguZSA9IDA7XG4gICAgICB4LmQgPSBbMF07XG4gICAgfVxuICB9XG4gIHJldHVybiB4O1xufVxuZnVuY3Rpb24gZmluaXRlVG9TdHJpbmcoeCwgaXNFeHAsIHNkKSB7XG4gIGlmICgheC5pc0Zpbml0ZSgpKVxuICAgIHJldHVybiBub25GaW5pdGVUb1N0cmluZyh4KTtcbiAgdmFyIGssIGUgPSB4LmUsIHN0ciA9IGRpZ2l0c1RvU3RyaW5nKHguZCksIGxlbiA9IHN0ci5sZW5ndGg7XG4gIGlmIChpc0V4cCkge1xuICAgIGlmIChzZCAmJiAoayA9IHNkIC0gbGVuKSA+IDApIHtcbiAgICAgIHN0ciA9IHN0ci5jaGFyQXQoMCkgKyBcIi5cIiArIHN0ci5zbGljZSgxKSArIGdldFplcm9TdHJpbmcoayk7XG4gICAgfSBlbHNlIGlmIChsZW4gPiAxKSB7XG4gICAgICBzdHIgPSBzdHIuY2hhckF0KDApICsgXCIuXCIgKyBzdHIuc2xpY2UoMSk7XG4gICAgfVxuICAgIHN0ciA9IHN0ciArICh4LmUgPCAwID8gXCJlXCIgOiBcImUrXCIpICsgeC5lO1xuICB9IGVsc2UgaWYgKGUgPCAwKSB7XG4gICAgc3RyID0gXCIwLlwiICsgZ2V0WmVyb1N0cmluZygtZSAtIDEpICsgc3RyO1xuICAgIGlmIChzZCAmJiAoayA9IHNkIC0gbGVuKSA+IDApXG4gICAgICBzdHIgKz0gZ2V0WmVyb1N0cmluZyhrKTtcbiAgfSBlbHNlIGlmIChlID49IGxlbikge1xuICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGUgKyAxIC0gbGVuKTtcbiAgICBpZiAoc2QgJiYgKGsgPSBzZCAtIGUgLSAxKSA+IDApXG4gICAgICBzdHIgPSBzdHIgKyBcIi5cIiArIGdldFplcm9TdHJpbmcoayk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKChrID0gZSArIDEpIDwgbGVuKVxuICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIGspICsgXCIuXCIgKyBzdHIuc2xpY2Uoayk7XG4gICAgaWYgKHNkICYmIChrID0gc2QgLSBsZW4pID4gMCkge1xuICAgICAgaWYgKGUgKyAxID09PSBsZW4pXG4gICAgICAgIHN0ciArPSBcIi5cIjtcbiAgICAgIHN0ciArPSBnZXRaZXJvU3RyaW5nKGspO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gZ2V0QmFzZTEwRXhwb25lbnQoZGlnaXRzLCBlKSB7XG4gIHZhciB3ID0gZGlnaXRzWzBdO1xuICBmb3IgKGUgKj0gTE9HX0JBU0U7IHcgPj0gMTA7IHcgLz0gMTApXG4gICAgZSsrO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIGdldExuMTAoQ3Rvciwgc2QsIHByKSB7XG4gIGlmIChzZCA+IExOMTBfUFJFQ0lTSU9OKSB7XG4gICAgZXh0ZXJuYWwgPSB0cnVlO1xuICAgIGlmIChwcilcbiAgICAgIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gICAgdGhyb3cgRXJyb3IocHJlY2lzaW9uTGltaXRFeGNlZWRlZCk7XG4gIH1cbiAgcmV0dXJuIGZpbmFsaXNlKG5ldyBDdG9yKExOMTApLCBzZCwgMSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBnZXRQaShDdG9yLCBzZCwgcm0pIHtcbiAgaWYgKHNkID4gUElfUFJFQ0lTSU9OKVxuICAgIHRocm93IEVycm9yKHByZWNpc2lvbkxpbWl0RXhjZWVkZWQpO1xuICByZXR1cm4gZmluYWxpc2UobmV3IEN0b3IoUEkpLCBzZCwgcm0sIHRydWUpO1xufVxuZnVuY3Rpb24gZ2V0UHJlY2lzaW9uKGRpZ2l0cykge1xuICB2YXIgdyA9IGRpZ2l0cy5sZW5ndGggLSAxLCBsZW4gPSB3ICogTE9HX0JBU0UgKyAxO1xuICB3ID0gZGlnaXRzW3ddO1xuICBpZiAodykge1xuICAgIGZvciAoOyB3ICUgMTAgPT0gMDsgdyAvPSAxMClcbiAgICAgIGxlbi0tO1xuICAgIGZvciAodyA9IGRpZ2l0c1swXTsgdyA+PSAxMDsgdyAvPSAxMClcbiAgICAgIGxlbisrO1xuICB9XG4gIHJldHVybiBsZW47XG59XG5mdW5jdGlvbiBnZXRaZXJvU3RyaW5nKGspIHtcbiAgdmFyIHpzID0gXCJcIjtcbiAgZm9yICg7IGstLTsgKVxuICAgIHpzICs9IFwiMFwiO1xuICByZXR1cm4genM7XG59XG5mdW5jdGlvbiBpbnRQb3coQ3RvciwgeCwgbiwgcHIpIHtcbiAgdmFyIGlzVHJ1bmNhdGVkLCByID0gbmV3IEN0b3IoMSksIGsgPSBNYXRoLmNlaWwocHIgLyBMT0dfQkFTRSArIDQpO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBmb3IgKDsgOyApIHtcbiAgICBpZiAobiAlIDIpIHtcbiAgICAgIHIgPSByLnRpbWVzKHgpO1xuICAgICAgaWYgKHRydW5jYXRlKHIuZCwgaykpXG4gICAgICAgIGlzVHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgbiA9IG1hdGhmbG9vcihuIC8gMik7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIG4gPSByLmQubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpc1RydW5jYXRlZCAmJiByLmRbbl0gPT09IDApXG4gICAgICAgICsrci5kW25dO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHggPSB4LnRpbWVzKHgpO1xuICAgIHRydW5jYXRlKHguZCwgayk7XG4gIH1cbiAgZXh0ZXJuYWwgPSB0cnVlO1xuICByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIGlzT2RkKG4pIHtcbiAgcmV0dXJuIG4uZFtuLmQubGVuZ3RoIC0gMV0gJiAxO1xufVxuZnVuY3Rpb24gbWF4T3JNaW4oQ3RvciwgYXJncywgbHRndCkge1xuICB2YXIgeSwgeCA9IG5ldyBDdG9yKGFyZ3NbMF0pLCBpID0gMDtcbiAgZm9yICg7ICsraSA8IGFyZ3MubGVuZ3RoOyApIHtcbiAgICB5ID0gbmV3IEN0b3IoYXJnc1tpXSk7XG4gICAgaWYgKCF5LnMpIHtcbiAgICAgIHggPSB5O1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh4W2x0Z3RdKHkpKSB7XG4gICAgICB4ID0geTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHg7XG59XG5mdW5jdGlvbiBuYXR1cmFsRXhwb25lbnRpYWwoeCwgc2QpIHtcbiAgdmFyIGRlbm9taW5hdG9yLCBndWFyZCwgaiwgcG93Mywgc3VtMiwgdCwgd3ByLCByZXAgPSAwLCBpID0gMCwgayA9IDAsIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBybSA9IEN0b3Iucm91bmRpbmcsIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIGlmICgheC5kIHx8ICF4LmRbMF0gfHwgeC5lID4gMTcpIHtcbiAgICByZXR1cm4gbmV3IEN0b3IoeC5kID8gIXguZFswXSA/IDEgOiB4LnMgPCAwID8gMCA6IDEgLyAwIDogeC5zID8geC5zIDwgMCA/IDAgOiB4IDogMCAvIDApO1xuICB9XG4gIGlmIChzZCA9PSBudWxsKSB7XG4gICAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgICB3cHIgPSBwcjtcbiAgfSBlbHNlIHtcbiAgICB3cHIgPSBzZDtcbiAgfVxuICB0ID0gbmV3IEN0b3IoMC4wMzEyNSk7XG4gIHdoaWxlICh4LmUgPiAtMikge1xuICAgIHggPSB4LnRpbWVzKHQpO1xuICAgIGsgKz0gNTtcbiAgfVxuICBndWFyZCA9IE1hdGgubG9nKG1hdGhwb3coMiwgaykpIC8gTWF0aC5MTjEwICogMiArIDUgfCAwO1xuICB3cHIgKz0gZ3VhcmQ7XG4gIGRlbm9taW5hdG9yID0gcG93MyA9IHN1bTIgPSBuZXcgQ3RvcigxKTtcbiAgQ3Rvci5wcmVjaXNpb24gPSB3cHI7XG4gIGZvciAoOyA7ICkge1xuICAgIHBvdzMgPSBmaW5hbGlzZShwb3czLnRpbWVzKHgpLCB3cHIsIDEpO1xuICAgIGRlbm9taW5hdG9yID0gZGVub21pbmF0b3IudGltZXMoKytpKTtcbiAgICB0ID0gc3VtMi5wbHVzKGRpdmlkZShwb3czLCBkZW5vbWluYXRvciwgd3ByLCAxKSk7XG4gICAgaWYgKGRpZ2l0c1RvU3RyaW5nKHQuZCkuc2xpY2UoMCwgd3ByKSA9PT0gZGlnaXRzVG9TdHJpbmcoc3VtMi5kKS5zbGljZSgwLCB3cHIpKSB7XG4gICAgICBqID0gaztcbiAgICAgIHdoaWxlIChqLS0pXG4gICAgICAgIHN1bTIgPSBmaW5hbGlzZShzdW0yLnRpbWVzKHN1bTIpLCB3cHIsIDEpO1xuICAgICAgaWYgKHNkID09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlcCA8IDMgJiYgY2hlY2tSb3VuZGluZ0RpZ2l0cyhzdW0yLmQsIHdwciAtIGd1YXJkLCBybSwgcmVwKSkge1xuICAgICAgICAgIEN0b3IucHJlY2lzaW9uID0gd3ByICs9IDEwO1xuICAgICAgICAgIGRlbm9taW5hdG9yID0gcG93MyA9IHQgPSBuZXcgQ3RvcigxKTtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICByZXArKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmluYWxpc2Uoc3VtMiwgQ3Rvci5wcmVjaXNpb24gPSBwciwgcm0sIGV4dGVybmFsID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEN0b3IucHJlY2lzaW9uID0gcHI7XG4gICAgICAgIHJldHVybiBzdW0yO1xuICAgICAgfVxuICAgIH1cbiAgICBzdW0yID0gdDtcbiAgfVxufVxuZnVuY3Rpb24gbmF0dXJhbExvZ2FyaXRobSh5LCBzZCkge1xuICB2YXIgYywgYzAsIGRlbm9taW5hdG9yLCBlLCBudW1lcmF0b3IsIHJlcCwgc3VtMiwgdCwgd3ByLCB4MSwgeDIsIG4gPSAxLCBndWFyZCA9IDEwLCB4ID0geSwgeGQgPSB4LmQsIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBybSA9IEN0b3Iucm91bmRpbmcsIHByID0gQ3Rvci5wcmVjaXNpb247XG4gIGlmICh4LnMgPCAwIHx8ICF4ZCB8fCAheGRbMF0gfHwgIXguZSAmJiB4ZFswXSA9PSAxICYmIHhkLmxlbmd0aCA9PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHhkICYmICF4ZFswXSA/IC0xIC8gMCA6IHgucyAhPSAxID8gTmFOIDogeGQgPyAwIDogeCk7XG4gIH1cbiAgaWYgKHNkID09IG51bGwpIHtcbiAgICBleHRlcm5hbCA9IGZhbHNlO1xuICAgIHdwciA9IHByO1xuICB9IGVsc2Uge1xuICAgIHdwciA9IHNkO1xuICB9XG4gIEN0b3IucHJlY2lzaW9uID0gd3ByICs9IGd1YXJkO1xuICBjID0gZGlnaXRzVG9TdHJpbmcoeGQpO1xuICBjMCA9IGMuY2hhckF0KDApO1xuICBpZiAoTWF0aC5hYnMoZSA9IHguZSkgPCAxNWUxNCkge1xuICAgIHdoaWxlIChjMCA8IDcgJiYgYzAgIT0gMSB8fCBjMCA9PSAxICYmIGMuY2hhckF0KDEpID4gMykge1xuICAgICAgeCA9IHgudGltZXMoeSk7XG4gICAgICBjID0gZGlnaXRzVG9TdHJpbmcoeC5kKTtcbiAgICAgIGMwID0gYy5jaGFyQXQoMCk7XG4gICAgICBuKys7XG4gICAgfVxuICAgIGUgPSB4LmU7XG4gICAgaWYgKGMwID4gMSkge1xuICAgICAgeCA9IG5ldyBDdG9yKFwiMC5cIiArIGMpO1xuICAgICAgZSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0gbmV3IEN0b3IoYzAgKyBcIi5cIiArIGMuc2xpY2UoMSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0ID0gZ2V0TG4xMChDdG9yLCB3cHIgKyAyLCBwcikudGltZXMoZSArIFwiXCIpO1xuICAgIHggPSBuYXR1cmFsTG9nYXJpdGhtKG5ldyBDdG9yKGMwICsgXCIuXCIgKyBjLnNsaWNlKDEpKSwgd3ByIC0gZ3VhcmQpLnBsdXModCk7XG4gICAgQ3Rvci5wcmVjaXNpb24gPSBwcjtcbiAgICByZXR1cm4gc2QgPT0gbnVsbCA/IGZpbmFsaXNlKHgsIHByLCBybSwgZXh0ZXJuYWwgPSB0cnVlKSA6IHg7XG4gIH1cbiAgeDEgPSB4O1xuICBzdW0yID0gbnVtZXJhdG9yID0geCA9IGRpdmlkZSh4Lm1pbnVzKDEpLCB4LnBsdXMoMSksIHdwciwgMSk7XG4gIHgyID0gZmluYWxpc2UoeC50aW1lcyh4KSwgd3ByLCAxKTtcbiAgZGVub21pbmF0b3IgPSAzO1xuICBmb3IgKDsgOyApIHtcbiAgICBudW1lcmF0b3IgPSBmaW5hbGlzZShudW1lcmF0b3IudGltZXMoeDIpLCB3cHIsIDEpO1xuICAgIHQgPSBzdW0yLnBsdXMoZGl2aWRlKG51bWVyYXRvciwgbmV3IEN0b3IoZGVub21pbmF0b3IpLCB3cHIsIDEpKTtcbiAgICBpZiAoZGlnaXRzVG9TdHJpbmcodC5kKS5zbGljZSgwLCB3cHIpID09PSBkaWdpdHNUb1N0cmluZyhzdW0yLmQpLnNsaWNlKDAsIHdwcikpIHtcbiAgICAgIHN1bTIgPSBzdW0yLnRpbWVzKDIpO1xuICAgICAgaWYgKGUgIT09IDApXG4gICAgICAgIHN1bTIgPSBzdW0yLnBsdXMoZ2V0TG4xMChDdG9yLCB3cHIgKyAyLCBwcikudGltZXMoZSArIFwiXCIpKTtcbiAgICAgIHN1bTIgPSBkaXZpZGUoc3VtMiwgbmV3IEN0b3IobiksIHdwciwgMSk7XG4gICAgICBpZiAoc2QgPT0gbnVsbCkge1xuICAgICAgICBpZiAoY2hlY2tSb3VuZGluZ0RpZ2l0cyhzdW0yLmQsIHdwciAtIGd1YXJkLCBybSwgcmVwKSkge1xuICAgICAgICAgIEN0b3IucHJlY2lzaW9uID0gd3ByICs9IGd1YXJkO1xuICAgICAgICAgIHQgPSBudW1lcmF0b3IgPSB4ID0gZGl2aWRlKHgxLm1pbnVzKDEpLCB4MS5wbHVzKDEpLCB3cHIsIDEpO1xuICAgICAgICAgIHgyID0gZmluYWxpc2UoeC50aW1lcyh4KSwgd3ByLCAxKTtcbiAgICAgICAgICBkZW5vbWluYXRvciA9IHJlcCA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZpbmFsaXNlKHN1bTIsIEN0b3IucHJlY2lzaW9uID0gcHIsIHJtLCBleHRlcm5hbCA9IHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDdG9yLnByZWNpc2lvbiA9IHByO1xuICAgICAgICByZXR1cm4gc3VtMjtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtMiA9IHQ7XG4gICAgZGVub21pbmF0b3IgKz0gMjtcbiAgfVxufVxuZnVuY3Rpb24gbm9uRmluaXRlVG9TdHJpbmcoeCkge1xuICByZXR1cm4gU3RyaW5nKHgucyAqIHgucyAvIDApO1xufVxuZnVuY3Rpb24gcGFyc2VEZWNpbWFsKHgsIHN0cikge1xuICB2YXIgZSwgaSwgbGVuO1xuICBpZiAoKGUgPSBzdHIuaW5kZXhPZihcIi5cIikpID4gLTEpXG4gICAgc3RyID0gc3RyLnJlcGxhY2UoXCIuXCIsIFwiXCIpO1xuICBpZiAoKGkgPSBzdHIuc2VhcmNoKC9lL2kpKSA+IDApIHtcbiAgICBpZiAoZSA8IDApXG4gICAgICBlID0gaTtcbiAgICBlICs9ICtzdHIuc2xpY2UoaSArIDEpO1xuICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgaSk7XG4gIH0gZWxzZSBpZiAoZSA8IDApIHtcbiAgICBlID0gc3RyLmxlbmd0aDtcbiAgfVxuICBmb3IgKGkgPSAwOyBzdHIuY2hhckNvZGVBdChpKSA9PT0gNDg7IGkrKylcbiAgICA7XG4gIGZvciAobGVuID0gc3RyLmxlbmd0aDsgc3RyLmNoYXJDb2RlQXQobGVuIC0gMSkgPT09IDQ4OyAtLWxlbilcbiAgICA7XG4gIHN0ciA9IHN0ci5zbGljZShpLCBsZW4pO1xuICBpZiAoc3RyKSB7XG4gICAgbGVuIC09IGk7XG4gICAgeC5lID0gZSA9IGUgLSBpIC0gMTtcbiAgICB4LmQgPSBbXTtcbiAgICBpID0gKGUgKyAxKSAlIExPR19CQVNFO1xuICAgIGlmIChlIDwgMClcbiAgICAgIGkgKz0gTE9HX0JBU0U7XG4gICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgIGlmIChpKVxuICAgICAgICB4LmQucHVzaCgrc3RyLnNsaWNlKDAsIGkpKTtcbiAgICAgIGZvciAobGVuIC09IExPR19CQVNFOyBpIDwgbGVuOyApXG4gICAgICAgIHguZC5wdXNoKCtzdHIuc2xpY2UoaSwgaSArPSBMT0dfQkFTRSkpO1xuICAgICAgc3RyID0gc3RyLnNsaWNlKGkpO1xuICAgICAgaSA9IExPR19CQVNFIC0gc3RyLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgaSAtPSBsZW47XG4gICAgfVxuICAgIGZvciAoOyBpLS07IClcbiAgICAgIHN0ciArPSBcIjBcIjtcbiAgICB4LmQucHVzaCgrc3RyKTtcbiAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgIGlmICh4LmUgPiB4LmNvbnN0cnVjdG9yLm1heEUpIHtcbiAgICAgICAgeC5kID0gbnVsbDtcbiAgICAgICAgeC5lID0gTmFOO1xuICAgICAgfSBlbHNlIGlmICh4LmUgPCB4LmNvbnN0cnVjdG9yLm1pbkUpIHtcbiAgICAgICAgeC5lID0gMDtcbiAgICAgICAgeC5kID0gWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB4LmUgPSAwO1xuICAgIHguZCA9IFswXTtcbiAgfVxuICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIHBhcnNlT3RoZXIoeCwgc3RyKSB7XG4gIHZhciBiYXNlLCBDdG9yLCBkaXZpc29yLCBpLCBpc0Zsb2F0LCBsZW4sIHAsIHhkLCB4ZTtcbiAgaWYgKHN0ci5pbmRleE9mKFwiX1wiKSA+IC0xKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoLyhcXGQpXyg/PVxcZCkvZywgXCIkMVwiKTtcbiAgICBpZiAoaXNEZWNpbWFsLnRlc3Qoc3RyKSlcbiAgICAgIHJldHVybiBwYXJzZURlY2ltYWwoeCwgc3RyKTtcbiAgfSBlbHNlIGlmIChzdHIgPT09IFwiSW5maW5pdHlcIiB8fCBzdHIgPT09IFwiTmFOXCIpIHtcbiAgICBpZiAoIStzdHIpXG4gICAgICB4LnMgPSBOYU47XG4gICAgeC5lID0gTmFOO1xuICAgIHguZCA9IG51bGw7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgaWYgKGlzSGV4LnRlc3Qoc3RyKSkge1xuICAgIGJhc2UgPSAxNjtcbiAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChpc0JpbmFyeS50ZXN0KHN0cikpIHtcbiAgICBiYXNlID0gMjtcbiAgfSBlbHNlIGlmIChpc09jdGFsLnRlc3Qoc3RyKSkge1xuICAgIGJhc2UgPSA4O1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGludmFsaWRBcmd1bWVudCArIHN0cik7XG4gIH1cbiAgaSA9IHN0ci5zZWFyY2goL3AvaSk7XG4gIGlmIChpID4gMCkge1xuICAgIHAgPSArc3RyLnNsaWNlKGkgKyAxKTtcbiAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDIsIGkpO1xuICB9IGVsc2Uge1xuICAgIHN0ciA9IHN0ci5zbGljZSgyKTtcbiAgfVxuICBpID0gc3RyLmluZGV4T2YoXCIuXCIpO1xuICBpc0Zsb2F0ID0gaSA+PSAwO1xuICBDdG9yID0geC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzRmxvYXQpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZShcIi5cIiwgXCJcIik7XG4gICAgbGVuID0gc3RyLmxlbmd0aDtcbiAgICBpID0gbGVuIC0gaTtcbiAgICBkaXZpc29yID0gaW50UG93KEN0b3IsIG5ldyBDdG9yKGJhc2UpLCBpLCBpICogMik7XG4gIH1cbiAgeGQgPSBjb252ZXJ0QmFzZShzdHIsIGJhc2UsIEJBU0UpO1xuICB4ZSA9IHhkLmxlbmd0aCAtIDE7XG4gIGZvciAoaSA9IHhlOyB4ZFtpXSA9PT0gMDsgLS1pKVxuICAgIHhkLnBvcCgpO1xuICBpZiAoaSA8IDApXG4gICAgcmV0dXJuIG5ldyBDdG9yKHgucyAqIDApO1xuICB4LmUgPSBnZXRCYXNlMTBFeHBvbmVudCh4ZCwgeGUpO1xuICB4LmQgPSB4ZDtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgaWYgKGlzRmxvYXQpXG4gICAgeCA9IGRpdmlkZSh4LCBkaXZpc29yLCBsZW4gKiA0KTtcbiAgaWYgKHApXG4gICAgeCA9IHgudGltZXMoTWF0aC5hYnMocCkgPCA1NCA/IG1hdGhwb3coMiwgcCkgOiBEZWNpbWFsLnBvdygyLCBwKSk7XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIHg7XG59XG5mdW5jdGlvbiBzaW5lKEN0b3IsIHgpIHtcbiAgdmFyIGssIGxlbiA9IHguZC5sZW5ndGg7XG4gIGlmIChsZW4gPCAzKSB7XG4gICAgcmV0dXJuIHguaXNaZXJvKCkgPyB4IDogdGF5bG9yU2VyaWVzKEN0b3IsIDIsIHgsIHgpO1xuICB9XG4gIGsgPSAxLjQgKiBNYXRoLnNxcnQobGVuKTtcbiAgayA9IGsgPiAxNiA/IDE2IDogayB8IDA7XG4gIHggPSB4LnRpbWVzKDEgLyB0aW55UG93KDUsIGspKTtcbiAgeCA9IHRheWxvclNlcmllcyhDdG9yLCAyLCB4LCB4KTtcbiAgdmFyIHNpbjJfeCwgZDUgPSBuZXcgQ3Rvcig1KSwgZDE2ID0gbmV3IEN0b3IoMTYpLCBkMjAgPSBuZXcgQ3RvcigyMCk7XG4gIGZvciAoOyBrLS07ICkge1xuICAgIHNpbjJfeCA9IHgudGltZXMoeCk7XG4gICAgeCA9IHgudGltZXMoZDUucGx1cyhzaW4yX3gudGltZXMoZDE2LnRpbWVzKHNpbjJfeCkubWludXMoZDIwKSkpKTtcbiAgfVxuICByZXR1cm4geDtcbn1cbmZ1bmN0aW9uIHRheWxvclNlcmllcyhDdG9yLCBuLCB4LCB5LCBpc0h5cGVyYm9saWMpIHtcbiAgdmFyIGosIHQsIHUsIHgyLCBpID0gMSwgcHIgPSBDdG9yLnByZWNpc2lvbiwgayA9IE1hdGguY2VpbChwciAvIExPR19CQVNFKTtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgeDIgPSB4LnRpbWVzKHgpO1xuICB1ID0gbmV3IEN0b3IoeSk7XG4gIGZvciAoOyA7ICkge1xuICAgIHQgPSBkaXZpZGUodS50aW1lcyh4MiksIG5ldyBDdG9yKG4rKyAqIG4rKyksIHByLCAxKTtcbiAgICB1ID0gaXNIeXBlcmJvbGljID8geS5wbHVzKHQpIDogeS5taW51cyh0KTtcbiAgICB5ID0gZGl2aWRlKHQudGltZXMoeDIpLCBuZXcgQ3RvcihuKysgKiBuKyspLCBwciwgMSk7XG4gICAgdCA9IHUucGx1cyh5KTtcbiAgICBpZiAodC5kW2tdICE9PSB2b2lkIDApIHtcbiAgICAgIGZvciAoaiA9IGs7IHQuZFtqXSA9PT0gdS5kW2pdICYmIGotLTsgKVxuICAgICAgICA7XG4gICAgICBpZiAoaiA9PSAtMSlcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGogPSB1O1xuICAgIHUgPSB5O1xuICAgIHkgPSB0O1xuICAgIHQgPSBqO1xuICAgIGkrKztcbiAgfVxuICBleHRlcm5hbCA9IHRydWU7XG4gIHQuZC5sZW5ndGggPSBrICsgMTtcbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiB0aW55UG93KGIsIGUpIHtcbiAgdmFyIG4gPSBiO1xuICB3aGlsZSAoLS1lKVxuICAgIG4gKj0gYjtcbiAgcmV0dXJuIG47XG59XG5mdW5jdGlvbiB0b0xlc3NUaGFuSGFsZlBpKEN0b3IsIHgpIHtcbiAgdmFyIHQsIGlzTmVnMiA9IHgucyA8IDAsIHBpID0gZ2V0UGkoQ3RvciwgQ3Rvci5wcmVjaXNpb24sIDEpLCBoYWxmUGkgPSBwaS50aW1lcygwLjUpO1xuICB4ID0geC5hYnMoKTtcbiAgaWYgKHgubHRlKGhhbGZQaSkpIHtcbiAgICBxdWFkcmFudCA9IGlzTmVnMiA/IDQgOiAxO1xuICAgIHJldHVybiB4O1xuICB9XG4gIHQgPSB4LmRpdlRvSW50KHBpKTtcbiAgaWYgKHQuaXNaZXJvKCkpIHtcbiAgICBxdWFkcmFudCA9IGlzTmVnMiA/IDMgOiAyO1xuICB9IGVsc2Uge1xuICAgIHggPSB4Lm1pbnVzKHQudGltZXMocGkpKTtcbiAgICBpZiAoeC5sdGUoaGFsZlBpKSkge1xuICAgICAgcXVhZHJhbnQgPSBpc09kZCh0KSA/IGlzTmVnMiA/IDIgOiAzIDogaXNOZWcyID8gNCA6IDE7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgcXVhZHJhbnQgPSBpc09kZCh0KSA/IGlzTmVnMiA/IDEgOiA0IDogaXNOZWcyID8gMyA6IDI7XG4gIH1cbiAgcmV0dXJuIHgubWludXMocGkpLmFicygpO1xufVxuZnVuY3Rpb24gdG9TdHJpbmdCaW5hcnkoeCwgYmFzZU91dCwgc2QsIHJtKSB7XG4gIHZhciBiYXNlLCBlLCBpLCBrLCBsZW4sIHJvdW5kVXAsIHN0ciwgeGQsIHksIEN0b3IgPSB4LmNvbnN0cnVjdG9yLCBpc0V4cCA9IHNkICE9PSB2b2lkIDA7XG4gIGlmIChpc0V4cCkge1xuICAgIGNoZWNrSW50MzIoc2QsIDEsIE1BWF9ESUdJVFMpO1xuICAgIGlmIChybSA9PT0gdm9pZCAwKVxuICAgICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICAgIGVsc2VcbiAgICAgIGNoZWNrSW50MzIocm0sIDAsIDgpO1xuICB9IGVsc2Uge1xuICAgIHNkID0gQ3Rvci5wcmVjaXNpb247XG4gICAgcm0gPSBDdG9yLnJvdW5kaW5nO1xuICB9XG4gIGlmICgheC5pc0Zpbml0ZSgpKSB7XG4gICAgc3RyID0gbm9uRmluaXRlVG9TdHJpbmcoeCk7XG4gIH0gZWxzZSB7XG4gICAgc3RyID0gZmluaXRlVG9TdHJpbmcoeCk7XG4gICAgaSA9IHN0ci5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaXNFeHApIHtcbiAgICAgIGJhc2UgPSAyO1xuICAgICAgaWYgKGJhc2VPdXQgPT0gMTYpIHtcbiAgICAgICAgc2QgPSBzZCAqIDQgLSAzO1xuICAgICAgfSBlbHNlIGlmIChiYXNlT3V0ID09IDgpIHtcbiAgICAgICAgc2QgPSBzZCAqIDMgLSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlID0gYmFzZU91dDtcbiAgICB9XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoXCIuXCIsIFwiXCIpO1xuICAgICAgeSA9IG5ldyBDdG9yKDEpO1xuICAgICAgeS5lID0gc3RyLmxlbmd0aCAtIGk7XG4gICAgICB5LmQgPSBjb252ZXJ0QmFzZShmaW5pdGVUb1N0cmluZyh5KSwgMTAsIGJhc2UpO1xuICAgICAgeS5lID0geS5kLmxlbmd0aDtcbiAgICB9XG4gICAgeGQgPSBjb252ZXJ0QmFzZShzdHIsIDEwLCBiYXNlKTtcbiAgICBlID0gbGVuID0geGQubGVuZ3RoO1xuICAgIGZvciAoOyB4ZFstLWxlbl0gPT0gMDsgKVxuICAgICAgeGQucG9wKCk7XG4gICAgaWYgKCF4ZFswXSkge1xuICAgICAgc3RyID0gaXNFeHAgPyBcIjBwKzBcIiA6IFwiMFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgZS0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IG5ldyBDdG9yKHgpO1xuICAgICAgICB4LmQgPSB4ZDtcbiAgICAgICAgeC5lID0gZTtcbiAgICAgICAgeCA9IGRpdmlkZSh4LCB5LCBzZCwgcm0sIDAsIGJhc2UpO1xuICAgICAgICB4ZCA9IHguZDtcbiAgICAgICAgZSA9IHguZTtcbiAgICAgICAgcm91bmRVcCA9IGluZXhhY3Q7XG4gICAgICB9XG4gICAgICBpID0geGRbc2RdO1xuICAgICAgayA9IGJhc2UgLyAyO1xuICAgICAgcm91bmRVcCA9IHJvdW5kVXAgfHwgeGRbc2QgKyAxXSAhPT0gdm9pZCAwO1xuICAgICAgcm91bmRVcCA9IHJtIDwgNCA/IChpICE9PSB2b2lkIDAgfHwgcm91bmRVcCkgJiYgKHJtID09PSAwIHx8IHJtID09PSAoeC5zIDwgMCA/IDMgOiAyKSkgOiBpID4gayB8fCBpID09PSBrICYmIChybSA9PT0gNCB8fCByb3VuZFVwIHx8IHJtID09PSA2ICYmIHhkW3NkIC0gMV0gJiAxIHx8IHJtID09PSAoeC5zIDwgMCA/IDggOiA3KSk7XG4gICAgICB4ZC5sZW5ndGggPSBzZDtcbiAgICAgIGlmIChyb3VuZFVwKSB7XG4gICAgICAgIGZvciAoOyArK3hkWy0tc2RdID4gYmFzZSAtIDE7ICkge1xuICAgICAgICAgIHhkW3NkXSA9IDA7XG4gICAgICAgICAgaWYgKCFzZCkge1xuICAgICAgICAgICAgKytlO1xuICAgICAgICAgICAgeGQudW5zaGlmdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGVuID0geGQubGVuZ3RoOyAheGRbbGVuIC0gMV07IC0tbGVuKVxuICAgICAgICA7XG4gICAgICBmb3IgKGkgPSAwLCBzdHIgPSBcIlwiOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIHN0ciArPSBOVU1FUkFMUy5jaGFyQXQoeGRbaV0pO1xuICAgICAgaWYgKGlzRXhwKSB7XG4gICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgaWYgKGJhc2VPdXQgPT0gMTYgfHwgYmFzZU91dCA9PSA4KSB7XG4gICAgICAgICAgICBpID0gYmFzZU91dCA9PSAxNiA/IDQgOiAzO1xuICAgICAgICAgICAgZm9yICgtLWxlbjsgbGVuICUgaTsgbGVuKyspXG4gICAgICAgICAgICAgIHN0ciArPSBcIjBcIjtcbiAgICAgICAgICAgIHhkID0gY29udmVydEJhc2Uoc3RyLCBiYXNlLCBiYXNlT3V0KTtcbiAgICAgICAgICAgIGZvciAobGVuID0geGQubGVuZ3RoOyAheGRbbGVuIC0gMV07IC0tbGVuKVxuICAgICAgICAgICAgICA7XG4gICAgICAgICAgICBmb3IgKGkgPSAxLCBzdHIgPSBcIjEuXCI7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICAgICAgc3RyICs9IE5VTUVSQUxTLmNoYXJBdCh4ZFtpXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IHN0ci5jaGFyQXQoMCkgKyBcIi5cIiArIHN0ci5zbGljZSgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gc3RyICsgKGUgPCAwID8gXCJwXCIgOiBcInArXCIpICsgZTtcbiAgICAgIH0gZWxzZSBpZiAoZSA8IDApIHtcbiAgICAgICAgZm9yICg7ICsrZTsgKVxuICAgICAgICAgIHN0ciA9IFwiMFwiICsgc3RyO1xuICAgICAgICBzdHIgPSBcIjAuXCIgKyBzdHI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKytlID4gbGVuKVxuICAgICAgICAgIGZvciAoZSAtPSBsZW47IGUtLTsgKVxuICAgICAgICAgICAgc3RyICs9IFwiMFwiO1xuICAgICAgICBlbHNlIGlmIChlIDwgbGVuKVxuICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCBlKSArIFwiLlwiICsgc3RyLnNsaWNlKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHIgPSAoYmFzZU91dCA9PSAxNiA/IFwiMHhcIiA6IGJhc2VPdXQgPT0gMiA/IFwiMGJcIiA6IGJhc2VPdXQgPT0gOCA/IFwiMG9cIiA6IFwiXCIpICsgc3RyO1xuICB9XG4gIHJldHVybiB4LnMgPCAwID8gXCItXCIgKyBzdHIgOiBzdHI7XG59XG5mdW5jdGlvbiB0cnVuY2F0ZShhcnIsIGxlbikge1xuICBpZiAoYXJyLmxlbmd0aCA+IGxlbikge1xuICAgIGFyci5sZW5ndGggPSBsZW47XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGFicyh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hYnMoKTtcbn1cbmZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkuYWNvcygpO1xufVxuZnVuY3Rpb24gYWNvc2goeCkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkuYWNvc2goKTtcbn1cbmZ1bmN0aW9uIGFkZCh4LCB5KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5wbHVzKHkpO1xufVxuZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hc2luKCk7XG59XG5mdW5jdGlvbiBhc2luaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hc2luaCgpO1xufVxuZnVuY3Rpb24gYXRhbih4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hdGFuKCk7XG59XG5mdW5jdGlvbiBhdGFuaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5hdGFuaCgpO1xufVxuZnVuY3Rpb24gYXRhbjIoeSwgeCkge1xuICB5ID0gbmV3IHRoaXMoeSk7XG4gIHggPSBuZXcgdGhpcyh4KTtcbiAgdmFyIHIsIHByID0gdGhpcy5wcmVjaXNpb24sIHJtID0gdGhpcy5yb3VuZGluZywgd3ByID0gcHIgKyA0O1xuICBpZiAoIXkucyB8fCAheC5zKSB7XG4gICAgciA9IG5ldyB0aGlzKE5hTik7XG4gIH0gZWxzZSBpZiAoIXkuZCAmJiAheC5kKSB7XG4gICAgciA9IGdldFBpKHRoaXMsIHdwciwgMSkudGltZXMoeC5zID4gMCA/IDAuMjUgOiAwLjc1KTtcbiAgICByLnMgPSB5LnM7XG4gIH0gZWxzZSBpZiAoIXguZCB8fCB5LmlzWmVybygpKSB7XG4gICAgciA9IHgucyA8IDAgPyBnZXRQaSh0aGlzLCBwciwgcm0pIDogbmV3IHRoaXMoMCk7XG4gICAgci5zID0geS5zO1xuICB9IGVsc2UgaWYgKCF5LmQgfHwgeC5pc1plcm8oKSkge1xuICAgIHIgPSBnZXRQaSh0aGlzLCB3cHIsIDEpLnRpbWVzKDAuNSk7XG4gICAgci5zID0geS5zO1xuICB9IGVsc2UgaWYgKHgucyA8IDApIHtcbiAgICB0aGlzLnByZWNpc2lvbiA9IHdwcjtcbiAgICB0aGlzLnJvdW5kaW5nID0gMTtcbiAgICByID0gdGhpcy5hdGFuKGRpdmlkZSh5LCB4LCB3cHIsIDEpKTtcbiAgICB4ID0gZ2V0UGkodGhpcywgd3ByLCAxKTtcbiAgICB0aGlzLnByZWNpc2lvbiA9IHByO1xuICAgIHRoaXMucm91bmRpbmcgPSBybTtcbiAgICByID0geS5zIDwgMCA/IHIubWludXMoeCkgOiByLnBsdXMoeCk7XG4gIH0gZWxzZSB7XG4gICAgciA9IHRoaXMuYXRhbihkaXZpZGUoeSwgeCwgd3ByLCAxKSk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBjYnJ0KHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmNicnQoKTtcbn1cbmZ1bmN0aW9uIGNlaWwoeCkge1xuICByZXR1cm4gZmluYWxpc2UoeCA9IG5ldyB0aGlzKHgpLCB4LmUgKyAxLCAyKTtcbn1cbmZ1bmN0aW9uIGNsYW1wKHgsIG1pbjIsIG1heDIpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmNsYW1wKG1pbjIsIG1heDIpO1xufVxuZnVuY3Rpb24gY29uZmlnKG9iaikge1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiKVxuICAgIHRocm93IEVycm9yKGRlY2ltYWxFcnJvciArIFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICB2YXIgaSwgcCwgdiwgdXNlRGVmYXVsdHMgPSBvYmouZGVmYXVsdHMgPT09IHRydWUsIHBzID0gW1xuICAgIFwicHJlY2lzaW9uXCIsXG4gICAgMSxcbiAgICBNQVhfRElHSVRTLFxuICAgIFwicm91bmRpbmdcIixcbiAgICAwLFxuICAgIDgsXG4gICAgXCJ0b0V4cE5lZ1wiLFxuICAgIC1FWFBfTElNSVQsXG4gICAgMCxcbiAgICBcInRvRXhwUG9zXCIsXG4gICAgMCxcbiAgICBFWFBfTElNSVQsXG4gICAgXCJtYXhFXCIsXG4gICAgMCxcbiAgICBFWFBfTElNSVQsXG4gICAgXCJtaW5FXCIsXG4gICAgLUVYUF9MSU1JVCxcbiAgICAwLFxuICAgIFwibW9kdWxvXCIsXG4gICAgMCxcbiAgICA5XG4gIF07XG4gIGZvciAoaSA9IDA7IGkgPCBwcy5sZW5ndGg7IGkgKz0gMykge1xuICAgIGlmIChwID0gcHNbaV0sIHVzZURlZmF1bHRzKVxuICAgICAgdGhpc1twXSA9IERFRkFVTFRTW3BdO1xuICAgIGlmICgodiA9IG9ialtwXSkgIT09IHZvaWQgMCkge1xuICAgICAgaWYgKG1hdGhmbG9vcih2KSA9PT0gdiAmJiB2ID49IHBzW2kgKyAxXSAmJiB2IDw9IHBzW2kgKyAyXSlcbiAgICAgICAgdGhpc1twXSA9IHY7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IEVycm9yKGludmFsaWRBcmd1bWVudCArIHAgKyBcIjogXCIgKyB2KTtcbiAgICB9XG4gIH1cbiAgaWYgKHAgPSBcImNyeXB0b1wiLCB1c2VEZWZhdWx0cylcbiAgICB0aGlzW3BdID0gREVGQVVMVFNbcF07XG4gIGlmICgodiA9IG9ialtwXSkgIT09IHZvaWQgMCkge1xuICAgIGlmICh2ID09PSB0cnVlIHx8IHYgPT09IGZhbHNlIHx8IHYgPT09IDAgfHwgdiA9PT0gMSkge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT0gXCJ1bmRlZmluZWRcIiAmJiBjcnlwdG8gJiYgKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgfHwgY3J5cHRvLnJhbmRvbUJ5dGVzKSkge1xuICAgICAgICAgIHRoaXNbcF0gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IEVycm9yKGNyeXB0b1VuYXZhaWxhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1twXSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcihpbnZhbGlkQXJndW1lbnQgKyBwICsgXCI6IFwiICsgdik7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gY29zKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmNvcygpO1xufVxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5jb3NoKCk7XG59XG5mdW5jdGlvbiBjbG9uZShvYmopIHtcbiAgdmFyIGksIHAsIHBzO1xuICBmdW5jdGlvbiBEZWNpbWFsMih2KSB7XG4gICAgdmFyIGUsIGkyLCB0LCB4ID0gdGhpcztcbiAgICBpZiAoISh4IGluc3RhbmNlb2YgRGVjaW1hbDIpKVxuICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsMih2KTtcbiAgICB4LmNvbnN0cnVjdG9yID0gRGVjaW1hbDI7XG4gICAgaWYgKGlzRGVjaW1hbEluc3RhbmNlKHYpKSB7XG4gICAgICB4LnMgPSB2LnM7XG4gICAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgICAgaWYgKCF2LmQgfHwgdi5lID4gRGVjaW1hbDIubWF4RSkge1xuICAgICAgICAgIHguZSA9IE5hTjtcbiAgICAgICAgICB4LmQgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHYuZSA8IERlY2ltYWwyLm1pbkUpIHtcbiAgICAgICAgICB4LmUgPSAwO1xuICAgICAgICAgIHguZCA9IFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4LmUgPSB2LmU7XG4gICAgICAgICAgeC5kID0gdi5kLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHguZSA9IHYuZTtcbiAgICAgICAgeC5kID0gdi5kID8gdi5kLnNsaWNlKCkgOiB2LmQ7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHQgPSB0eXBlb2YgdjtcbiAgICBpZiAodCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHYgPT09IDApIHtcbiAgICAgICAgeC5zID0gMSAvIHYgPCAwID8gLTEgOiAxO1xuICAgICAgICB4LmUgPSAwO1xuICAgICAgICB4LmQgPSBbMF07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh2IDwgMCkge1xuICAgICAgICB2ID0gLXY7XG4gICAgICAgIHgucyA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeC5zID0gMTtcbiAgICAgIH1cbiAgICAgIGlmICh2ID09PSB+fnYgJiYgdiA8IDFlNykge1xuICAgICAgICBmb3IgKGUgPSAwLCBpMiA9IHY7IGkyID49IDEwOyBpMiAvPSAxMClcbiAgICAgICAgICBlKys7XG4gICAgICAgIGlmIChleHRlcm5hbCkge1xuICAgICAgICAgIGlmIChlID4gRGVjaW1hbDIubWF4RSkge1xuICAgICAgICAgICAgeC5lID0gTmFOO1xuICAgICAgICAgICAgeC5kID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGUgPCBEZWNpbWFsMi5taW5FKSB7XG4gICAgICAgICAgICB4LmUgPSAwO1xuICAgICAgICAgICAgeC5kID0gWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4LmUgPSBlO1xuICAgICAgICAgICAgeC5kID0gW3ZdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB4LmUgPSBlO1xuICAgICAgICAgIHguZCA9IFt2XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHYgKiAwICE9PSAwKSB7XG4gICAgICAgIGlmICghdilcbiAgICAgICAgICB4LnMgPSBOYU47XG4gICAgICAgIHguZSA9IE5hTjtcbiAgICAgICAgeC5kID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlRGVjaW1hbCh4LCB2LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAodCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgRXJyb3IoaW52YWxpZEFyZ3VtZW50ICsgdik7XG4gICAgfVxuICAgIGlmICgoaTIgPSB2LmNoYXJDb2RlQXQoMCkpID09PSA0NSkge1xuICAgICAgdiA9IHYuc2xpY2UoMSk7XG4gICAgICB4LnMgPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGkyID09PSA0MylcbiAgICAgICAgdiA9IHYuc2xpY2UoMSk7XG4gICAgICB4LnMgPSAxO1xuICAgIH1cbiAgICByZXR1cm4gaXNEZWNpbWFsLnRlc3QodikgPyBwYXJzZURlY2ltYWwoeCwgdikgOiBwYXJzZU90aGVyKHgsIHYpO1xuICB9XG4gIERlY2ltYWwyLnByb3RvdHlwZSA9IFA7XG4gIERlY2ltYWwyLlJPVU5EX1VQID0gMDtcbiAgRGVjaW1hbDIuUk9VTkRfRE9XTiA9IDE7XG4gIERlY2ltYWwyLlJPVU5EX0NFSUwgPSAyO1xuICBEZWNpbWFsMi5ST1VORF9GTE9PUiA9IDM7XG4gIERlY2ltYWwyLlJPVU5EX0hBTEZfVVAgPSA0O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0RPV04gPSA1O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0VWRU4gPSA2O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0NFSUwgPSA3O1xuICBEZWNpbWFsMi5ST1VORF9IQUxGX0ZMT09SID0gODtcbiAgRGVjaW1hbDIuRVVDTElEID0gOTtcbiAgRGVjaW1hbDIuY29uZmlnID0gRGVjaW1hbDIuc2V0ID0gY29uZmlnO1xuICBEZWNpbWFsMi5jbG9uZSA9IGNsb25lO1xuICBEZWNpbWFsMi5pc0RlY2ltYWwgPSBpc0RlY2ltYWxJbnN0YW5jZTtcbiAgRGVjaW1hbDIuYWJzID0gYWJzO1xuICBEZWNpbWFsMi5hY29zID0gYWNvcztcbiAgRGVjaW1hbDIuYWNvc2ggPSBhY29zaDtcbiAgRGVjaW1hbDIuYWRkID0gYWRkO1xuICBEZWNpbWFsMi5hc2luID0gYXNpbjtcbiAgRGVjaW1hbDIuYXNpbmggPSBhc2luaDtcbiAgRGVjaW1hbDIuYXRhbiA9IGF0YW47XG4gIERlY2ltYWwyLmF0YW5oID0gYXRhbmg7XG4gIERlY2ltYWwyLmF0YW4yID0gYXRhbjI7XG4gIERlY2ltYWwyLmNicnQgPSBjYnJ0O1xuICBEZWNpbWFsMi5jZWlsID0gY2VpbDtcbiAgRGVjaW1hbDIuY2xhbXAgPSBjbGFtcDtcbiAgRGVjaW1hbDIuY29zID0gY29zO1xuICBEZWNpbWFsMi5jb3NoID0gY29zaDtcbiAgRGVjaW1hbDIuZGl2ID0gZGl2O1xuICBEZWNpbWFsMi5leHAgPSBleHA7XG4gIERlY2ltYWwyLmZsb29yID0gZmxvb3I7XG4gIERlY2ltYWwyLmh5cG90ID0gaHlwb3Q7XG4gIERlY2ltYWwyLmxuID0gbG47XG4gIERlY2ltYWwyLmxvZyA9IGxvZztcbiAgRGVjaW1hbDIubG9nMTAgPSBsb2cxMDtcbiAgRGVjaW1hbDIubG9nMiA9IGxvZzI7XG4gIERlY2ltYWwyLm1heCA9IG1heDtcbiAgRGVjaW1hbDIubWluID0gbWluO1xuICBEZWNpbWFsMi5tb2QgPSBtb2Q7XG4gIERlY2ltYWwyLm11bCA9IG11bDtcbiAgRGVjaW1hbDIucG93ID0gcG93O1xuICBEZWNpbWFsMi5yYW5kb20gPSByYW5kb207XG4gIERlY2ltYWwyLnJvdW5kID0gcm91bmQ7XG4gIERlY2ltYWwyLnNpZ24gPSBzaWduO1xuICBEZWNpbWFsMi5zaW4gPSBzaW47XG4gIERlY2ltYWwyLnNpbmggPSBzaW5oO1xuICBEZWNpbWFsMi5zcXJ0ID0gc3FydDtcbiAgRGVjaW1hbDIuc3ViID0gc3ViO1xuICBEZWNpbWFsMi5zdW0gPSBzdW07XG4gIERlY2ltYWwyLnRhbiA9IHRhbjtcbiAgRGVjaW1hbDIudGFuaCA9IHRhbmg7XG4gIERlY2ltYWwyLnRydW5jID0gdHJ1bmM7XG4gIGlmIChvYmogPT09IHZvaWQgMClcbiAgICBvYmogPSB7fTtcbiAgaWYgKG9iaikge1xuICAgIGlmIChvYmouZGVmYXVsdHMgIT09IHRydWUpIHtcbiAgICAgIHBzID0gW1wicHJlY2lzaW9uXCIsIFwicm91bmRpbmdcIiwgXCJ0b0V4cE5lZ1wiLCBcInRvRXhwUG9zXCIsIFwibWF4RVwiLCBcIm1pbkVcIiwgXCJtb2R1bG9cIiwgXCJjcnlwdG9cIl07XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcHMubGVuZ3RoOyApXG4gICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KHAgPSBwc1tpKytdKSlcbiAgICAgICAgICBvYmpbcF0gPSB0aGlzW3BdO1xuICAgIH1cbiAgfVxuICBEZWNpbWFsMi5jb25maWcob2JqKTtcbiAgcmV0dXJuIERlY2ltYWwyO1xufVxuZnVuY3Rpb24gZGl2KHgsIHkpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmRpdih5KTtcbn1cbmZ1bmN0aW9uIGV4cCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5leHAoKTtcbn1cbmZ1bmN0aW9uIGZsb29yKHgpIHtcbiAgcmV0dXJuIGZpbmFsaXNlKHggPSBuZXcgdGhpcyh4KSwgeC5lICsgMSwgMyk7XG59XG5mdW5jdGlvbiBoeXBvdCgpIHtcbiAgdmFyIGksIG4sIHQgPSBuZXcgdGhpcygwKTtcbiAgZXh0ZXJuYWwgPSBmYWxzZTtcbiAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICkge1xuICAgIG4gPSBuZXcgdGhpcyhhcmd1bWVudHNbaSsrXSk7XG4gICAgaWYgKCFuLmQpIHtcbiAgICAgIGlmIChuLnMpIHtcbiAgICAgICAgZXh0ZXJuYWwgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoMSAvIDApO1xuICAgICAgfVxuICAgICAgdCA9IG47XG4gICAgfSBlbHNlIGlmICh0LmQpIHtcbiAgICAgIHQgPSB0LnBsdXMobi50aW1lcyhuKSk7XG4gICAgfVxuICB9XG4gIGV4dGVybmFsID0gdHJ1ZTtcbiAgcmV0dXJuIHQuc3FydCgpO1xufVxuZnVuY3Rpb24gaXNEZWNpbWFsSW5zdGFuY2Uob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBEZWNpbWFsIHx8IG9iaiAmJiBvYmoudG9TdHJpbmdUYWcgPT09IHRhZyB8fCBmYWxzZTtcbn1cbmZ1bmN0aW9uIGxuKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLmxuKCk7XG59XG5mdW5jdGlvbiBsb2coeCwgeSkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkubG9nKHkpO1xufVxuZnVuY3Rpb24gbG9nMih4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5sb2coMik7XG59XG5mdW5jdGlvbiBsb2cxMCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5sb2coMTApO1xufVxuZnVuY3Rpb24gbWF4KCkge1xuICByZXR1cm4gbWF4T3JNaW4odGhpcywgYXJndW1lbnRzLCBcImx0XCIpO1xufVxuZnVuY3Rpb24gbWluKCkge1xuICByZXR1cm4gbWF4T3JNaW4odGhpcywgYXJndW1lbnRzLCBcImd0XCIpO1xufVxuZnVuY3Rpb24gbW9kKHgsIHkpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLm1vZCh5KTtcbn1cbmZ1bmN0aW9uIG11bCh4LCB5KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5tdWwoeSk7XG59XG5mdW5jdGlvbiBwb3coeCwgeSkge1xuICByZXR1cm4gbmV3IHRoaXMoeCkucG93KHkpO1xufVxuZnVuY3Rpb24gcmFuZG9tKHNkKSB7XG4gIHZhciBkLCBlLCBrLCBuLCBpID0gMCwgciA9IG5ldyB0aGlzKDEpLCByZCA9IFtdO1xuICBpZiAoc2QgPT09IHZvaWQgMClcbiAgICBzZCA9IHRoaXMucHJlY2lzaW9uO1xuICBlbHNlXG4gICAgY2hlY2tJbnQzMihzZCwgMSwgTUFYX0RJR0lUUyk7XG4gIGsgPSBNYXRoLmNlaWwoc2QgLyBMT0dfQkFTRSk7XG4gIGlmICghdGhpcy5jcnlwdG8pIHtcbiAgICBmb3IgKDsgaSA8IGs7IClcbiAgICAgIHJkW2krK10gPSBNYXRoLnJhbmRvbSgpICogMWU3IHwgMDtcbiAgfSBlbHNlIGlmIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgZCA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KGspKTtcbiAgICBmb3IgKDsgaSA8IGs7ICkge1xuICAgICAgbiA9IGRbaV07XG4gICAgICBpZiAobiA+PSA0MjllNykge1xuICAgICAgICBkW2ldID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmRbaSsrXSA9IG4gJSAxZTc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGNyeXB0by5yYW5kb21CeXRlcykge1xuICAgIGQgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoayAqPSA0KTtcbiAgICBmb3IgKDsgaSA8IGs7ICkge1xuICAgICAgbiA9IGRbaV0gKyAoZFtpICsgMV0gPDwgOCkgKyAoZFtpICsgMl0gPDwgMTYpICsgKChkW2kgKyAzXSAmIDEyNykgPDwgMjQpO1xuICAgICAgaWYgKG4gPj0gMjE0ZTcpIHtcbiAgICAgICAgY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLmNvcHkoZCwgaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZC5wdXNoKG4gJSAxZTcpO1xuICAgICAgICBpICs9IDQ7XG4gICAgICB9XG4gICAgfVxuICAgIGkgPSBrIC8gNDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcihjcnlwdG9VbmF2YWlsYWJsZSk7XG4gIH1cbiAgayA9IHJkWy0taV07XG4gIHNkICU9IExPR19CQVNFO1xuICBpZiAoayAmJiBzZCkge1xuICAgIG4gPSBtYXRocG93KDEwLCBMT0dfQkFTRSAtIHNkKTtcbiAgICByZFtpXSA9IChrIC8gbiB8IDApICogbjtcbiAgfVxuICBmb3IgKDsgcmRbaV0gPT09IDA7IGktLSlcbiAgICByZC5wb3AoKTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgZSA9IDA7XG4gICAgcmQgPSBbMF07XG4gIH0gZWxzZSB7XG4gICAgZSA9IC0xO1xuICAgIGZvciAoOyByZFswXSA9PT0gMDsgZSAtPSBMT0dfQkFTRSlcbiAgICAgIHJkLnNoaWZ0KCk7XG4gICAgZm9yIChrID0gMSwgbiA9IHJkWzBdOyBuID49IDEwOyBuIC89IDEwKVxuICAgICAgaysrO1xuICAgIGlmIChrIDwgTE9HX0JBU0UpXG4gICAgICBlIC09IExPR19CQVNFIC0gaztcbiAgfVxuICByLmUgPSBlO1xuICByLmQgPSByZDtcbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiByb3VuZCh4KSB7XG4gIHJldHVybiBmaW5hbGlzZSh4ID0gbmV3IHRoaXMoeCksIHguZSArIDEsIHRoaXMucm91bmRpbmcpO1xufVxuZnVuY3Rpb24gc2lnbih4KSB7XG4gIHggPSBuZXcgdGhpcyh4KTtcbiAgcmV0dXJuIHguZCA/IHguZFswXSA/IHgucyA6IDAgKiB4LnMgOiB4LnMgfHwgTmFOO1xufVxuZnVuY3Rpb24gc2luKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLnNpbigpO1xufVxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5zaW5oKCk7XG59XG5mdW5jdGlvbiBzcXJ0KHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLnNxcnQoKTtcbn1cbmZ1bmN0aW9uIHN1Yih4LCB5KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS5zdWIoeSk7XG59XG5mdW5jdGlvbiBzdW0oKSB7XG4gIHZhciBpID0gMCwgYXJncyA9IGFyZ3VtZW50cywgeCA9IG5ldyB0aGlzKGFyZ3NbaV0pO1xuICBleHRlcm5hbCA9IGZhbHNlO1xuICBmb3IgKDsgeC5zICYmICsraSA8IGFyZ3MubGVuZ3RoOyApXG4gICAgeCA9IHgucGx1cyhhcmdzW2ldKTtcbiAgZXh0ZXJuYWwgPSB0cnVlO1xuICByZXR1cm4gZmluYWxpc2UoeCwgdGhpcy5wcmVjaXNpb24sIHRoaXMucm91bmRpbmcpO1xufVxuZnVuY3Rpb24gdGFuKHgpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKHgpLnRhbigpO1xufVxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiBuZXcgdGhpcyh4KS50YW5oKCk7XG59XG5mdW5jdGlvbiB0cnVuYyh4KSB7XG4gIHJldHVybiBmaW5hbGlzZSh4ID0gbmV3IHRoaXMoeCksIHguZSArIDEsIDEpO1xufVxuUFtTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIildID0gUC50b1N0cmluZztcblBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiRGVjaW1hbFwiO1xudmFyIERlY2ltYWwgPSBQLmNvbnN0cnVjdG9yID0gY2xvbmUoREVGQVVMVFMpO1xuTE4xMCA9IG5ldyBEZWNpbWFsKExOMTApO1xuUEkgPSBuZXcgRGVjaW1hbChQSSk7XG52YXIgZGVjaW1hbF9kZWZhdWx0ID0gRGVjaW1hbDtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2NvbXB1dGUtZW5naW5lLnRzXG52YXIgaW1wb3J0X2NvbXBsZXgyMCA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tbW9uL2dyYXBoZW1lLXNwbGl0dGVyLnRzXG5mdW5jdGlvbiBzdHJpbmdUb0NvZGVwb2ludHMoc3RyaW5nKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPj0gNTUyOTYgJiYgY29kZSA8PSA1NjMxOSkge1xuICAgICAgY29uc3QgbmV4dENvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dENvZGUgPj0gNTYzMjAgJiYgbmV4dENvZGUgPD0gNTczNDMpIHtcbiAgICAgICAgY29uc3QgbGVhZCA9IGNvZGUgLSA1NTI5NjtcbiAgICAgICAgY29uc3QgdHJhaWwgPSBuZXh0Q29kZSAtIDU2MzIwO1xuICAgICAgICBjb2RlID0gMiAqKiAxNiArIGxlYWQgKiAyICoqIDEwICsgdHJhaWw7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnB1c2goY29kZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbnZhciBaV0ogPSA4MjA1O1xudmFyIFJFR0lPTkFMX0lORElDQVRPUiA9IFsxMjc0NjIsIDEyNzQ4N107XG5mdW5jdGlvbiBpc0Vtb2ppQ29tYmluYXRvcihjb2RlKSB7XG4gIGlmIChjb2RlID09PSBaV0opXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChjb2RlID09PSA2NTAzOCB8fCBjb2RlID09PSA2NTAzOSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPj0gMTI3OTk1ICYmIGNvZGUgPD0gMTI3OTk1ICsgNSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPj0gMTI5NDU2ICYmIGNvZGUgPD0gMTI5NDU2ICsgNClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGNvZGUgPj0gOTE3NTM2ICYmIGNvZGUgPD0gOTE3NTM2ICsgOTYpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZSkge1xuICByZXR1cm4gY29kZSA+PSBSRUdJT05BTF9JTkRJQ0FUT1JbMF0gJiYgY29kZSA8PSBSRUdJT05BTF9JTkRJQ0FUT1JbMV07XG59XG5mdW5jdGlvbiBzcGxpdEdyYXBoZW1lcyhzdHJpbmcpIHtcbiAgaWYgKC9eW1xcdTAwMjAtXFx1MDBGRl0qJC8udGVzdChzdHJpbmcpKVxuICAgIHJldHVybiBzdHJpbmc7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjb2RlUG9pbnRzID0gc3RyaW5nVG9Db2RlcG9pbnRzKHN0cmluZyk7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGNvZGVQb2ludHMubGVuZ3RoKSB7XG4gICAgY29uc3QgY29kZSA9IGNvZGVQb2ludHNbaW5kZXgrK107XG4gICAgY29uc3QgbmV4dCA9IGNvZGVQb2ludHNbaW5kZXhdO1xuICAgIGlmIChuZXh0ID09PSBaV0opIHtcbiAgICAgIGNvbnN0IGJhc2VJbmRleCA9IGluZGV4IC0gMTtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoY29kZVBvaW50c1tpbmRleF0gPT09IFpXSikge1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgIC4uLmNvZGVQb2ludHMuc2xpY2UoYmFzZUluZGV4LCAyICogaW5kZXggLSBiYXNlSW5kZXggKyAxKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNFbW9qaUNvbWJpbmF0b3IobmV4dCkpIHtcbiAgICAgIGNvbnN0IGJhc2VJbmRleCA9IGluZGV4IC0gMTtcbiAgICAgIHdoaWxlIChpc0Vtb2ppQ29tYmluYXRvcihjb2RlUG9pbnRzW2luZGV4XSkpIHtcbiAgICAgICAgaW5kZXggKz0gY29kZVBvaW50c1tpbmRleF0gPT09IFpXSiA/IDIgOiAxO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgIC4uLmNvZGVQb2ludHMuc2xpY2UoYmFzZUluZGV4LCAyICogaW5kZXggLSBiYXNlSW5kZXggLSAxKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNSZWdpb25hbEluZGljYXRvcihjb2RlKSkge1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMuc2xpY2UoaW5kZXggLSAyLCAyKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvdG9rZW5pemVyLnRzXG52YXIgVG9rZW5pemVyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihzKSB7XG4gICAgdGhpcy5vYmV5c3BhY2VzID0gZmFsc2U7XG4gICAgcyA9IHMucmVwbGFjZSgvW1xcdTIwMEVcXHUyMDBGXFx1MjA2Ni1cXHUyMDY5XFx1MjAyQS1cXHUyMDJFXS9nLCBcIlwiKTtcbiAgICB0aGlzLnMgPSBzcGxpdEdyYXBoZW1lcyhzKTtcbiAgICB0aGlzLnBvcyA9IDA7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm4gVHJ1ZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbVxuICAgKi9cbiAgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLnBvcyA+PSB0aGlzLnMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgY2hhciBhbmQgYWR2YW5jZVxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLnBvcyA8IHRoaXMucy5sZW5ndGggPyB0aGlzLnNbdGhpcy5wb3MrK10gOiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgY2hhciwgYnV0IGRvIG5vdCBhZHZhbmNlXG4gICAqL1xuICBwZWVrKCkge1xuICAgIHJldHVybiB0aGlzLnNbdGhpcy5wb3NdO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgc3Vic3RyaW5nIG1hdGNoaW5nIHJlZ0V4IGFuZCBhZHZhbmNlLlxuICAgKi9cbiAgbWF0Y2gocmVnRXgpIHtcbiAgICBsZXQgZXhlY1Jlc3VsdDtcbiAgICBpZiAodHlwZW9mIHRoaXMucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZXhlY1Jlc3VsdCA9IHJlZ0V4LmV4ZWModGhpcy5zLnNsaWNlKHRoaXMucG9zKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4ZWNSZXN1bHQgPSByZWdFeC5leGVjKHRoaXMucy5zbGljZSh0aGlzLnBvcykuam9pbihcIlwiKSk7XG4gICAgfVxuICAgIGlmIChleGVjUmVzdWx0Py5bMF0pIHtcbiAgICAgIHRoaXMucG9zICs9IGV4ZWNSZXN1bHRbMF0ubGVuZ3RoO1xuICAgICAgcmV0dXJuIGV4ZWNSZXN1bHRbMF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgdG9rZW4sIG9yIG51bGwuXG4gICAqL1xuICBuZXh0KCkge1xuICAgIGlmICh0aGlzLmVuZCgpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLm9iZXlzcGFjZXMgJiYgdGhpcy5tYXRjaCgvXlsgXFxmXFxuXFxyXFx0XFx2XFx4QTBcXHUyMDI4XFx1MjAyOV0rLykpIHtcbiAgICAgIHJldHVybiBcIjxzcGFjZT5cIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMub2JleXNwYWNlcyAmJiB0aGlzLm1hdGNoKC9eWyBcXGZcXG5cXHJcXHRcXHZcXHhBMFxcdTIwMjhcXHUyMDI5XS8pKSB7XG4gICAgICByZXR1cm4gXCI8c3BhY2U+XCI7XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldCgpO1xuICAgIGlmIChuZXh0ID09PSBcIlxcXFxcIikge1xuICAgICAgaWYgKCF0aGlzLmVuZCgpKSB7XG4gICAgICAgIGxldCBjb21tYW5kID0gdGhpcy5tYXRjaCgvXlthLXpBLVoqXSsvKTtcbiAgICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgICB0aGlzLm1hdGNoKC9eWyBcXGZcXG5cXHJcXHRcXHZcXHhBMFxcdTIwMjhcXHUyMDI5XSovKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21tYW5kID0gdGhpcy5nZXQoKTtcbiAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gXCIgXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjxzcGFjZT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXFxcXFwiICsgY29tbWFuZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwie1wiKSB7XG4gICAgICByZXR1cm4gXCI8ez5cIjtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwifVwiKSB7XG4gICAgICByZXR1cm4gXCI8fT5cIjtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwiXlwiKSB7XG4gICAgICBpZiAodGhpcy5wZWVrKCkgPT09IFwiXlwiKSB7XG4gICAgICAgIHRoaXMuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMubWF0Y2goXG4gICAgICAgICAgL14oXFxeKFxcXihcXF4oXFxeWzAtOWEtZl0pP1swLTlhLWZdKT9bMC05YS1mXSk/WzAtOWEtZl0pP1swLTlhLWZdWzAtOWEtZl0vXG4gICAgICAgICk7XG4gICAgICAgIGlmIChoZXgpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoXG4gICAgICAgICAgICBwYXJzZUludChoZXguc2xpY2UoaGV4Lmxhc3RJbmRleE9mKFwiXlwiKSArIDEpLCAxNilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9IGVsc2UgaWYgKG5leHQgPT09IFwiI1wiKSB7XG4gICAgICBpZiAoIXRoaXMuZW5kKCkpIHtcbiAgICAgICAgbGV0IGlzUGFyYW0gPSBmYWxzZTtcbiAgICAgICAgaWYgKC9bMC05P10vLnRlc3QodGhpcy5wZWVrKCkpKSB7XG4gICAgICAgICAgaXNQYXJhbSA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMucG9zICsgMSA8IHRoaXMucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gdGhpcy5zW3RoaXMucG9zICsgMV07XG4gICAgICAgICAgICBpc1BhcmFtID0gL1teMC05QS1aYS16XS8udGVzdChhZnRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BhcmFtKSB7XG4gICAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy5nZXQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIjXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0ID09PSBcIiRcIikge1xuICAgICAgaWYgKHRoaXMucGVlaygpID09PSBcIiRcIikge1xuICAgICAgICB0aGlzLmdldCgpO1xuICAgICAgICByZXR1cm4gXCI8JCQ+XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCI8JD5cIjtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbn07XG5mdW5jdGlvbiBleHBhbmQobGV4MiwgYXJncykge1xuICBsZXQgdG9rZW4gPSBsZXgyLm5leHQoKTtcbiAgaWYgKCF0b2tlbilcbiAgICByZXR1cm4gW107XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgaWYgKHRva2VuID09PSBcIlxcXFxyZWxheFwiKSB7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXG5vZXhwYW5kXCIpIHtcbiAgICB0b2tlbiA9IGxleDIubmV4dCgpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gXCJcXFxcb2JleXNwYWNlc1wiKSB7XG4gICAgbGV4Mi5vYmV5c3BhY2VzID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gXCJcXFxcc3BhY2VcIiB8fCB0b2tlbiA9PT0gXCJ+XCIpIHtcbiAgICByZXN1bHQucHVzaChcIjxzcGFjZT5cIik7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXGJncm91cFwiKSB7XG4gICAgcmVzdWx0LnB1c2goXCI8ez5cIik7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXGVncm91cFwiKSB7XG4gICAgcmVzdWx0LnB1c2goXCI8fT5cIik7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXHN0cmluZ1wiKSB7XG4gICAgdG9rZW4gPSBsZXgyLm5leHQoKTtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGlmICh0b2tlblswXSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0b2tlbikuZm9yRWFjaChcbiAgICAgICAgICAoeCkgPT4gcmVzdWx0LnB1c2goeCA9PT0gXCJcXFxcXCIgPyBcIlxcXFxiYWNrc2xhc2hcIiA6IHgpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjx7PlwiKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFwiXFxcXHtcIik7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjxzcGFjZT5cIikge1xuICAgICAgICByZXN1bHQucHVzaChcIn5cIik7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjx9PlwiKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFwiXFxcXH1cIik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHRva2VuID09PSBcIlxcXFxjc25hbWVcIikge1xuICAgIHdoaWxlIChsZXgyLnBlZWsoKSA9PT0gXCI8c3BhY2U+XCIpIHtcbiAgICAgIGxleDIubmV4dCgpO1xuICAgIH1cbiAgICBsZXQgY29tbWFuZCA9IFwiXCI7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBsZXQgdG9rZW5zID0gW107XG4gICAgZG8ge1xuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKC9eI1swLTk/XSQvLnRlc3QobGV4Mi5wZWVrKCkpKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW0gPSBsZXgyLmdldCgpLnNsaWNlKDEpO1xuICAgICAgICAgIHRva2VucyA9IHRva2VuaXplKFxuICAgICAgICAgICAgYXJncz8uW3BhcmFtXSA/PyBhcmdzPy5bXCI/XCJdID8/IFwiXFxcXHBsYWNlaG9sZGVye31cIixcbiAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIHRva2VuID0gdG9rZW5zWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2VuID0gbGV4Mi5uZXh0KCk7XG4gICAgICAgICAgdG9rZW5zID0gdG9rZW4gPyBbdG9rZW5dIDogW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvbmUgPSB0b2tlbnMubGVuZ3RoID09PSAwO1xuICAgICAgaWYgKCFkb25lICYmIHRva2VuID09PSBcIlxcXFxlbmRjc25hbWVcIikge1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgdG9rZW5zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgZG9uZSA9IHRva2VuID09PSBcIjwkPlwiIHx8IHRva2VuID09PSBcIjwkJD5cIiB8fCB0b2tlbiA9PT0gXCI8ez5cIiB8fCB0b2tlbiA9PT0gXCI8fT5cIiB8fCAhIXRva2VuICYmIHRva2VuLmxlbmd0aCA+IDEgJiYgdG9rZW5bMF0gPT09IFwiXFxcXFwiO1xuICAgICAgfVxuICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgIGNvbW1hbmQgKz0gdG9rZW5zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgIGlmIChjb21tYW5kKSB7XG4gICAgICByZXN1bHQucHVzaChcIlxcXFxcIiArIGNvbW1hbmQpO1xuICAgIH1cbiAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRva2Vucyk7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09IFwiXFxcXGVuZGNzbmFtZVwiKSB7XG4gIH0gZWxzZSBpZiAodG9rZW4ubGVuZ3RoID4gMSAmJiB0b2tlblswXSA9PT0gXCIjXCIpIHtcbiAgICBjb25zdCBwYXJhbSA9IHRva2VuLnNsaWNlKDEpO1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoXG4gICAgICB0b2tlbml6ZShhcmdzPy5bcGFyYW1dID8/IGFyZ3M/LltcIj9cIl0gPz8gXCJcXFxccGxhY2Vob2xkZXJ7fVwiLCBhcmdzKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB0b2tlbml6ZShzLCBhcmdzKSB7XG4gIGNvbnN0IGxpbmVzID0gcy50b1N0cmluZygpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGxldCBzdHJlYW0gPSBcIlwiO1xuICBsZXQgc2VwID0gXCJcIjtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgc3RyZWFtICs9IHNlcDtcbiAgICBzZXAgPSBcIiBcIjtcbiAgICBjb25zdCBtID0gbGluZS5tYXRjaCgvKCg/OlxcXFwlKXxbXiVdKSovKTtcbiAgICBpZiAobSAhPT0gbnVsbClcbiAgICAgIHN0cmVhbSArPSBtWzBdO1xuICB9XG4gIGNvbnN0IHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoc3RyZWFtKTtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGRvXG4gICAgcmVzdWx0LnB1c2goLi4uZXhwYW5kKHRva2VuaXplciwgYXJncykpO1xuICB3aGlsZSAoIXRva2VuaXplci5lbmQoKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb3VudFRva2VucyhzKSB7XG4gIHJldHVybiB0b2tlbml6ZShzLCBbXSkubGVuZ3RoO1xufVxuZnVuY3Rpb24gam9pbkxhdGV4KHNlZ21lbnRzKSB7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgIGlmICgvW2EtekEtWipdLy50ZXN0KHNlZ21lbnRbMF0pKSB7XG4gICAgICAgIHJlc3VsdCArPSBzZXA7XG4gICAgICB9XG4gICAgICBpZiAoL1xcXFxbYS16QS1aXStcXCo/JC8udGVzdChzZWdtZW50KSkge1xuICAgICAgICBzZXAgPSBcIiBcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcCA9IFwiXCI7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gc2VnbWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHRva2Vuc1RvU3RyaW5nKHRva2Vucykge1xuICBsZXQgZmxhdCA9IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2Vucykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgZmxhdCA9IFsuLi5mbGF0LCAuLi5pdGVtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYXQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmxhdCA9IFt0b2tlbnNdO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGpvaW5MYXRleChcbiAgICBmbGF0Lm1hcCgodG9rZW4pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFwiPHNwYWNlPlwiOiBcIiBcIixcbiAgICAgICAgXCI8JCQ+XCI6IFwiJCRcIixcbiAgICAgICAgXCI8JD5cIjogXCIkXCIsXG4gICAgICAgIFwiPHs+XCI6IFwie1wiLFxuICAgICAgICBcIjx9PlwiOiBcIn1cIlxuICAgICAgfVt0b2tlbl0gPz8gdG9rZW47XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xhdGV4LXN5bnRheC9kaWN0aW9uYXJ5L2RlZmluaXRpb25zLWFsZ2VicmEudHNcbnZhciBERUZJTklUSU9OU19BTEdFQlJBID0gW1xuICB7XG4gICAgbmFtZTogXCJUb1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRvXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNzBcbiAgICAvLyBNYXRoTUwgcmlnaHR3YXJkcyBhcnJvd1xuICB9XG5dO1xuXG4vLyBzcmMvbWF0aC1qc29uL3V0aWxzLnRzXG52YXIgTUlTU0lORyA9IFtcIkVycm9yXCIsIFwiJ21pc3NpbmcnXCJdO1xuZnVuY3Rpb24gaXNOdW1iZXJFeHByZXNzaW9uKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIGV4cHIgPT09IFwibnVtYmVyXCIgfHwgaXNOdW1iZXJPYmplY3QoZXhwcikpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIiAmJiAvXlsrLV0/WzAtOVxcLl0vLnRlc3QoZXhwcikpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KGV4cHIpIHtcbiAgcmV0dXJuIGV4cHIgIT09IG51bGwgJiYgdHlwZW9mIGV4cHIgPT09IFwib2JqZWN0XCIgJiYgXCJudW1cIiBpbiBleHByO1xufVxuZnVuY3Rpb24gaXNTeW1ib2xPYmplY3QoZXhwcikge1xuICByZXR1cm4gZXhwciAhPT0gbnVsbCAmJiB0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBcInN5bVwiIGluIGV4cHI7XG59XG5mdW5jdGlvbiBpc1N0cmluZ09iamVjdChleHByKSB7XG4gIHJldHVybiBleHByICE9PSBudWxsICYmIHR5cGVvZiBleHByID09PSBcIm9iamVjdFwiICYmIFwic3RyXCIgaW4gZXhwcjtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb25PYmplY3QoZXhwcikge1xuICByZXR1cm4gZXhwciAhPT0gbnVsbCAmJiB0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBcImZuXCIgaW4gZXhwcjtcbn1cbnZhciByZWNvbW1lbmRlZFNjcmlwdHNSZWdleDtcbmZ1bmN0aW9uIGlzUmVjb21tZW5kZWRTY3JpcHRzKHRleHQpIHtcbiAgaWYgKCFyZWNvbW1lbmRlZFNjcmlwdHNSZWdleCkge1xuICAgIGNvbnN0IHJlY29tbWVuZGVkU2NyaXB0cyA9IFtcbiAgICAgIFwiWnl5eVwiLFxuICAgICAgXCJaaW5oXCIsXG4gICAgICBcIkFyYWJcIixcbiAgICAgIFwiQXJtblwiLFxuICAgICAgXCJCZW5nXCIsXG4gICAgICBcIkJvcG9cIixcbiAgICAgIFwiQ3lybFwiLFxuICAgICAgXCJEZXZhXCIsXG4gICAgICBcIkV0aGlcIixcbiAgICAgIFwiR2VvclwiLFxuICAgICAgXCJHcmVrXCIsXG4gICAgICBcIkd1anJcIixcbiAgICAgIFwiR3VydVwiLFxuICAgICAgXCJIYW5nXCIsXG4gICAgICBcIkhhbmlcIixcbiAgICAgIFwiSGViclwiLFxuICAgICAgXCJIaXJhXCIsXG4gICAgICBcIkthbmFcIixcbiAgICAgIFwiS25kYVwiLFxuICAgICAgXCJLaG1yXCIsXG4gICAgICBcIkxhb29cIixcbiAgICAgIFwiTGF0blwiLFxuICAgICAgXCJNbHltXCIsXG4gICAgICBcIk15bXJcIixcbiAgICAgIFwiT3J5YVwiLFxuICAgICAgXCJTaW5oXCIsXG4gICAgICBcIlRhbWxcIixcbiAgICAgIFwiVGVsdVwiLFxuICAgICAgXCJUaGFhXCIsXG4gICAgICBcIlRoYWlcIixcbiAgICAgIFwiVGlidFwiXG4gICAgXTtcbiAgICBjb25zdCByZWdleFBhdHRlcm4gPSBgXlske3JlY29tbWVuZGVkU2NyaXB0cy5tYXAoKHgpID0+IGBcXFxccHtTY3JpcHQ9JHt4fX1gKS5qb2luKFwiXCIpfV0qJGA7XG4gICAgcmVjb21tZW5kZWRTY3JpcHRzUmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4UGF0dGVybiwgXCJ1XCIpO1xuICB9XG4gIHJldHVybiByZWNvbW1lbmRlZFNjcmlwdHNSZWdleC50ZXN0KHRleHQpO1xufVxuZnVuY3Rpb24gaXNWYWxpZElkZW50aWZpZXIocykge1xuICBpZiAoL15bYS16QS1aX11bYS16QS1aMC05X10qJC8udGVzdChzKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKE9OTFlfRU1PSklTLnRlc3QocykpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICghaXNSZWNvbW1lbmRlZFNjcmlwdHMocykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL15bXFxwe1hJRFN9X11cXHB7WElEQ30qJC91LnRlc3Qocyk7XG59XG52YXIgVlMxNiA9IFwiXFxcXHV7RkUwRn1cIjtcbnZhciBLRVlDQVAgPSBcIlxcXFx1ezIwRTN9XCI7XG52YXIgWldKMiA9IFwiXFxcXHV7MjAwRH1cIjtcbnZhciBGTEFHX1NFUVVFTkNFID0gXCJcXFxccHtSSX1cXFxccHtSSX1cIjtcbnZhciBUQUdfTU9EID0gYCg/OltcXFxcdXtFMDAyMH0tXFxcXHV7RTAwN0V9XStcXFxcdXtFMDA3Rn0pYDtcbnZhciBFTU9KSV9NT0QgPSBgKD86XFxcXHB7RU1vZH18JHtWUzE2fSR7S0VZQ0FQfT98JHtUQUdfTU9EfSlgO1xudmFyIEVNT0pJX05PVF9JREVOVElGSUVSID0gYCg/Oig/PVxcXFxQe1hJREN9KVxcXFxwe0Vtb2ppfSlgO1xudmFyIFpXSl9FTEVNRU5UID0gYCg/OiR7RU1PSklfTk9UX0lERU5USUZJRVJ9JHtFTU9KSV9NT0R9KnxcXFxccHtFbW9qaX0ke0VNT0pJX01PRH0rfCR7RkxBR19TRVFVRU5DRX0pYDtcbnZhciBQT1NTSUJMRV9FTU9KSSA9IGAoPzoke1pXSl9FTEVNRU5UfSkoJHtaV0oyfSR7WldKX0VMRU1FTlR9KSpgO1xudmFyIFNPTUVfRU1PSkkgPSBuZXcgUmVnRXhwKGAoPzoke1BPU1NJQkxFX0VNT0pJfSkrYCwgXCJ1XCIpO1xudmFyIE9OTFlfRU1PSklTID0gbmV3IFJlZ0V4cChgXig/OiR7UE9TU0lCTEVfRU1PSkl9KSskYCwgXCJ1XCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVJZGVudGlmaWVyKHMpIHtcbiAgaWYgKHR5cGVvZiBzICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBcIm5vdC1hLXN0cmluZ1wiO1xuICBpZiAocyA9PT0gXCJcIilcbiAgICByZXR1cm4gXCJlbXB0eS1zdHJpbmdcIjtcbiAgaWYgKHMubm9ybWFsaXplKCkgIT09IHMpXG4gICAgcmV0dXJuIFwiZXhwZWN0ZWQtbmZjXCI7XG4gIGlmICgvW1xcdTIwMEVcXHUyMDBGXFx1MjA2Ni1cXHUyMDY5XFx1MjAyQS1cXHUyMDJFXS8udGVzdChzKSlcbiAgICByZXR1cm4gXCJ1bmV4cGVjdGVkLWJpZGktbWFya2VyXCI7XG4gIGlmIChPTkxZX0VNT0pJUy50ZXN0KHMpKVxuICAgIHJldHVybiBcInZhbGlkXCI7XG4gIGlmICgvXFxwe1hJREN9L3UudGVzdChzKSAmJiBTT01FX0VNT0pJLnRlc3QocykpXG4gICAgcmV0dXJuIFwidW5leHBlY3RlZC1taXhlZC1lbW9qaVwiO1xuICBpZiAoIWlzUmVjb21tZW5kZWRTY3JpcHRzKHMpKVxuICAgIHJldHVybiBcInVuZXhwZWN0ZWQtc2NyaXB0XCI7XG4gIGlmICghaXNWYWxpZElkZW50aWZpZXIocykpIHtcbiAgICBpZiAoIWlzVmFsaWRJZGVudGlmaWVyKHNbMF0pKVxuICAgICAgcmV0dXJuIFwiaW52YWxpZC1maXJzdC1jaGFyXCI7XG4gICAgcmV0dXJuIFwiaW52YWxpZC1jaGFyXCI7XG4gIH1cbiAgcmV0dXJuIFwidmFsaWRcIjtcbn1cbmZ1bmN0aW9uIHN0cmluZ1ZhbHVlKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwgfHwgZXhwciA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIGV4cHIgPT09IFwib2JqZWN0XCIgJiYgXCJzdHJcIiBpbiBleHByKVxuICAgIHJldHVybiBleHByLnN0cjtcbiAgaWYgKHR5cGVvZiBleHByICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoZXhwci5sZW5ndGggPCAyKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoZXhwclswXSAhPT0gXCInXCIgfHwgZXhwcltleHByLmxlbmd0aCAtIDFdICE9PSBcIidcIilcbiAgICByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGV4cHIuc3Vic3RyaW5nKDEsIGV4cHIubGVuZ3RoIC0gMSk7XG59XG5mdW5jdGlvbiBzdHJpcFRleHQoZXhwcikge1xuICBpZiAoZXhwciA9PT0gbnVsbCB8fCBleHByID09PSB2b2lkIDAgfHwgc3RyaW5nVmFsdWUoZXhwcikgIT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoaCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBbXG4gICAgICBoLFxuICAgICAgLi4uKG9wcyhleHByKSA/PyBbXSkubWFwKCh4KSA9PiBzdHJpcFRleHQoeCkpLmZpbHRlcigoeCkgPT4geCAhPT0gbnVsbClcbiAgICBdO1xuICB9XG4gIHJldHVybiBleHByO1xufVxuZnVuY3Rpb24gaGVhZChleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpIHtcbiAgICBpZiAodHlwZW9mIGV4cHJbMF0gPT09IFwic3RyaW5nXCIgJiYgIWlzVmFsaWRJZGVudGlmaWVyKGV4cHJbMF0pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgSW52YWxpZCBpZGVudGlmaWVyIFwiJHtleHByWzBdfVwiOiAke3ZhbGlkYXRlSWRlbnRpZmllcihleHByWzBdKX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBleHByWzBdO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uT2JqZWN0KGV4cHIpKVxuICAgIHJldHVybiBleHByLmZuWzBdO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGhlYWROYW1lKGV4cHIpIHtcbiAgY29uc3QgaCA9IGhlYWQoZXhwcik7XG4gIHJldHVybiB0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIiA/IGggOiBcIlwiO1xufVxuZnVuY3Rpb24gb3BzKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwgfHwgZXhwciA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoQXJyYXkuaXNBcnJheShleHByKSlcbiAgICByZXR1cm4gZXhwci5zbGljZSgxKTtcbiAgaWYgKGlzRnVuY3Rpb25PYmplY3QoZXhwcikpXG4gICAgcmV0dXJuIGV4cHIuZm4uc2xpY2UoMSk7XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gb3AoZXhwciwgbikge1xuICBpZiAoZXhwciA9PT0gbnVsbCB8fCBleHByID09PSB2b2lkIDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKVxuICAgIHJldHVybiBleHByW25dID8/IG51bGw7XG4gIGlmIChpc0Z1bmN0aW9uT2JqZWN0KGV4cHIpKVxuICAgIHJldHVybiBleHByLmZuW25dID8/IG51bGw7XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gb3AxKGV4cHIpIHtcbiAgcmV0dXJuIG9wKGV4cHIsIDEpO1xufVxuZnVuY3Rpb24gb3AyKGV4cHIpIHtcbiAgcmV0dXJuIG9wKGV4cHIsIDIpO1xufVxuZnVuY3Rpb24gbm9wcyhleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gMDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cHIubGVuZ3RoIC0gMSk7XG4gIGlmIChpc0Z1bmN0aW9uT2JqZWN0KGV4cHIpKVxuICAgIHJldHVybiBNYXRoLm1heCgwLCBleHByLmZuLmxlbmd0aCAtIDEpO1xuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIHN5bWJvbChleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKC9eWytcXC1cXC4wLTldLy50ZXN0KGV4cHIpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKGV4cHIubGVuZ3RoID49IDIgJiYgZXhwclswXSA9PT0gXCInXCIgJiYgZXhwcltleHByLmxlbmd0aCAtIDFdID09PSBcIidcIilcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHMgPSBpc1N5bWJvbE9iamVjdChleHByKSA/IGV4cHIuc3ltIDogZXhwcjtcbiAgaWYgKHR5cGVvZiBzICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIGlzTGlzdExpa2UoZXhwcikge1xuICBpZiAoZXhwciA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoIWggfHwgdHlwZW9mIGggIT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL14oTGlzdHxTZXF1ZW5jZXxUdXBsZXxTaW5nbGV8UGFpcnxUcmlwbGUpJC8udGVzdChoKTtcbn1cbmZ1bmN0aW9uIGtleVZhbHVlUGFpcihleHByKSB7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoaCA9PT0gXCJLZXlWYWx1ZVBhaXJcIiB8fCBoID09PSBcIlR1cGxlXCIgfHwgaCA9PT0gXCJQYWlyXCIpIHtcbiAgICBjb25zdCBrZXkgPSBzdHJpbmdWYWx1ZShvcDEoZXhwcikpO1xuICAgIGlmICgha2V5KVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIFtrZXksIG9wMihleHByKSA/PyBcIk5vdGhpbmdcIl07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkaWN0aW9uYXJ5KGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBcImRpY3RcIiBpbiBleHByKVxuICAgIHJldHVybiBleHByLmRpY3Q7XG4gIGNvbnN0IGt2ID0ga2V5VmFsdWVQYWlyKGV4cHIpO1xuICBpZiAoa3YpXG4gICAgcmV0dXJuIHsgW2t2WzBdXToga3ZbMV0gfTtcbiAgY29uc3QgaCA9IGhlYWQoZXhwcik7XG4gIGlmIChoID09PSBcIkRpY3Rpb25hcnlcIikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbm9wcyhleHByKTsgaSsrKSB7XG4gICAgICBjb25zdCBrdjIgPSBrZXlWYWx1ZVBhaXIob3AoZXhwciwgaSkpO1xuICAgICAgaWYgKGt2MilcbiAgICAgICAgcmVzdWx0W2t2MlswXV0gPSBrdjJbMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBtYWNoaW5lVmFsdWVPZlN0cmluZyhzKSB7XG4gIHMgPSBzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW25kXSQvZywgXCJcIikucmVwbGFjZSgvW1xcdTAwMDktXFx1MDAwZFxcdTAwMjBcXHUwMGEwXS9nLCBcIlwiKTtcbiAgaWYgKHMgPT09IFwibmFuXCIpXG4gICAgcmV0dXJuIE5hTjtcbiAgaWYgKHMgPT09IFwiK2luZmluaXR5XCIpXG4gICAgcmV0dXJuIEluZmluaXR5O1xuICBpZiAocyA9PT0gXCItaW5maW5pdHlcIilcbiAgICByZXR1cm4gLUluZmluaXR5O1xuICBpZiAoL1xcKFswLTldK1xcKS8udGVzdChzKSkge1xuICAgIGNvbnN0IFtfLCBib2R5LCByZXBlYXQsIHRyYWlsXSA9IHMubWF0Y2goLyguKylcXCgoWzAtOV0rKVxcKSguKikkLykgPz8gW107XG4gICAgcyA9IGJvZHkgKyByZXBlYXQucmVwZWF0KE1hdGguY2VpbCgxNiAvIHJlcGVhdC5sZW5ndGgpKSArICh0cmFpbCA/PyBcIlwiKTtcbiAgfVxuICByZXR1cm4gcGFyc2VGbG9hdChzKTtcbn1cbmZ1bmN0aW9uIG1hY2hpbmVWYWx1ZShleHByKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm51bWJlclwiKVxuICAgIHJldHVybiBleHByO1xuICBpZiAodHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIG1hY2hpbmVWYWx1ZU9mU3RyaW5nKGV4cHIpO1xuICBpZiAoaXNOdW1iZXJPYmplY3QoZXhwcikpXG4gICAgcmV0dXJuIG1hY2hpbmVWYWx1ZShleHByLm51bSk7XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmF0aW9uYWxWYWx1ZShleHByKSB7XG4gIGlmIChleHByID09PSB2b2lkIDAgfHwgZXhwciA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHN5bWJvbChleHByKSA9PT0gXCJIYWxmXCIpXG4gICAgcmV0dXJuIFsxLCAyXTtcbiAgY29uc3QgaCA9IGhlYWQoZXhwcik7XG4gIGlmICghaClcbiAgICByZXR1cm4gbnVsbDtcbiAgbGV0IG51bWVyID0gbnVsbDtcbiAgbGV0IGRlbm9tID0gbnVsbDtcbiAgaWYgKGggPT09IFwiTmVnYXRlXCIpIHtcbiAgICBjb25zdCByID0gcmF0aW9uYWxWYWx1ZShvcDEoZXhwcikpO1xuICAgIGlmIChyKVxuICAgICAgcmV0dXJuIFstclswXSwgclsxXV07XG4gIH1cbiAgaWYgKGggPT09IFwiUmF0aW9uYWxcIiB8fCBoID09PSBcIkRpdmlkZVwiKSB7XG4gICAgbnVtZXIgPSBtYWNoaW5lVmFsdWUob3AxKGV4cHIpKSA/PyBOYU47XG4gICAgZGVub20gPSBtYWNoaW5lVmFsdWUob3AyKGV4cHIpKSA/PyBOYU47XG4gIH1cbiAgaWYgKGggPT09IFwiUG93ZXJcIikge1xuICAgIGNvbnN0IGV4cG9uZW50ID0gbWFjaGluZVZhbHVlKG9wMihleHByKSk7XG4gICAgaWYgKGV4cG9uZW50ID09PSAxKSB7XG4gICAgICBudW1lciA9IG1hY2hpbmVWYWx1ZShvcDEoZXhwcikpO1xuICAgICAgZGVub20gPSAxO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IC0xKSB7XG4gICAgICBudW1lciA9IDE7XG4gICAgICBkZW5vbSA9IG1hY2hpbmVWYWx1ZShvcDEoZXhwcikpO1xuICAgIH1cbiAgfVxuICBpZiAoaCA9PT0gXCJNdWx0aXBseVwiICYmIGhlYWQob3AyKGV4cHIpKSA9PT0gXCJQb3dlclwiICYmIG1hY2hpbmVWYWx1ZShvcDIob3AyKGV4cHIpKSkgPT09IC0xKSB7XG4gICAgbnVtZXIgPSBtYWNoaW5lVmFsdWUob3AxKGV4cHIpKTtcbiAgICBkZW5vbSA9IG1hY2hpbmVWYWx1ZShvcDEob3AyKGV4cHIpKSk7XG4gIH1cbiAgaWYgKG51bWVyID09PSBudWxsIHx8IGRlbm9tID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihudW1lcikgJiYgTnVtYmVyLmlzSW50ZWdlcihkZW5vbSkpXG4gICAgcmV0dXJuIFtudW1lciwgZGVub21dO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHN1YnMoZXhwciwgcykge1xuICBjb25zdCBoID0gaGVhZChleHByKTtcbiAgaWYgKGggIT09IG51bGwpXG4gICAgcmV0dXJuIFtzdWJzKGgsIHMpLCAuLi4ob3BzKGV4cHIpID8/IFtdKS5tYXAoKHgpID0+IHN1YnMoeCwgcykpXTtcbiAgY29uc3QgZGljdCA9IGRpY3Rpb25hcnkoZXhwcik7XG4gIGlmIChkaWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRpY3QpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpXG4gICAgICByZXN1bHRba2V5XSA9IHN1YnMoZGljdFtrZXldLCBzKTtcbiAgICByZXR1cm4geyBkaWN0OiByZXN1bHQgfTtcbiAgfVxuICBjb25zdCBzeW0gPSBzeW1ib2woZXhwcik7XG4gIGlmIChzeW0gJiYgc1tzeW1dKVxuICAgIHJldHVybiBzW3N5bV07XG4gIHJldHVybiBleHByO1xufVxuZnVuY3Rpb24gbWFwQXJncyhleHByLCBmbikge1xuICBsZXQgYXJncyA9IG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKVxuICAgIGFyZ3MgPSBleHByO1xuICBpZiAoaXNGdW5jdGlvbk9iamVjdChleHByKSlcbiAgICBhcmdzID0gZXhwci5mbjtcbiAgaWYgKGFyZ3MgPT09IG51bGwpXG4gICAgcmV0dXJuIFtdO1xuICBsZXQgaSA9IDE7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnB1c2goZm4oYXJnc1tpXSkpO1xuICAgIGkgKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gYXBwbHlBc3NvY2lhdGl2ZU9wZXJhdG9yKG9wMywgbGhzLCByaHMsIGFzc29jaWF0aXZpdHkgPSBcImJvdGhcIikge1xuICBpZiAoYXNzb2NpYXRpdml0eSA9PT0gXCJub25cIilcbiAgICByZXR1cm4gW29wMywgbGhzLCByaHNdO1xuICBjb25zdCBsaHNOYW1lID0gaGVhZChsaHMpO1xuICBjb25zdCByaHNOYW1lID0gaGVhZChyaHMpO1xuICBpZiAoYXNzb2NpYXRpdml0eSA9PT0gXCJsZWZ0XCIpIHtcbiAgICBpZiAobGhzTmFtZSA9PT0gb3AzKVxuICAgICAgcmV0dXJuIFtvcDMsIC4uLm9wcyhsaHMpID8/IFtdLCByaHNdO1xuICAgIHJldHVybiBbb3AzLCBsaHMsIHJoc107XG4gIH1cbiAgaWYgKGFzc29jaWF0aXZpdHkgPT09IFwicmlnaHRcIikge1xuICAgIGlmIChyaHNOYW1lID09PSBvcDMpXG4gICAgICByZXR1cm4gW29wMywgbGhzLCAuLi5vcHMocmhzKSA/PyBbXV07XG4gICAgcmV0dXJuIFtvcDMsIGxocywgcmhzXTtcbiAgfVxuICBpZiAobGhzTmFtZSA9PT0gb3AzICYmIHJoc05hbWUgPT09IG9wMykge1xuICAgIHJldHVybiBbb3AzLCAuLi5vcHMobGhzKSA/PyBbXSwgLi4ub3BzKHJocykgPz8gW11dO1xuICB9XG4gIGlmIChsaHNOYW1lID09PSBvcDMpXG4gICAgcmV0dXJuIFtvcDMsIC4uLm9wcyhsaHMpID8/IFtdLCByaHNdO1xuICBpZiAocmhzTmFtZSA9PT0gb3AzKVxuICAgIHJldHVybiBbb3AzLCBsaHMsIC4uLm9wcyhyaHMpID8/IFtdXTtcbiAgcmV0dXJuIFtvcDMsIGxocywgcmhzXTtcbn1cbmZ1bmN0aW9uIGdldFNlcXVlbmNlKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGxldCBoID0gaGVhZChleHByKTtcbiAgaWYgKGggPT09IFwiRGVsaW1pdGVyXCIpIHtcbiAgICBleHByID0gb3AoZXhwciwgMSk7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gW107XG4gICAgaWYgKGhlYWQoZXhwcikgIT09IFwiU2VxdWVuY2VcIilcbiAgICAgIHJldHVybiBbZXhwcl07XG4gIH1cbiAgaCA9IGhlYWQoZXhwcik7XG4gIGlmIChoICE9PSBcIlNlcXVlbmNlXCIpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBvcHMoZXhwcikgPz8gW107XG59XG5mdW5jdGlvbiBpc0VtcHR5U2VxdWVuY2UoZXhwcikge1xuICByZXR1cm4gZXhwciAhPT0gbnVsbCAmJiBoZWFkKGV4cHIpID09PSBcIlNlcXVlbmNlXCIgJiYgbm9wcyhleHByKSA9PT0gMDtcbn1cbmZ1bmN0aW9uIG1pc3NpbmdJZkVtcHR5KGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwgfHwgaXNFbXB0eVNlcXVlbmNlKGV4cHIpKVxuICAgIHJldHVybiBNSVNTSU5HO1xuICByZXR1cm4gZXhwcjtcbn1cbmZ1bmN0aW9uIGNvdW50RnVuY3Rpb25MZWF2ZXMoeHMpIHtcbiAgaWYgKHhzWzBdID09PSBcIlNxdWFyZVwiKSB7XG4gICAgcmV0dXJuIGNvdW50RnVuY3Rpb25MZWF2ZXMoeHMuc2xpY2UoMSkpICsgMjtcbiAgfVxuICByZXR1cm4geHMucmVkdWNlKChhY2MsIHgpID0+IGFjYyArIGNvdW50TGVhdmVzKHgpLCAwKTtcbn1cbmZ1bmN0aW9uIGNvdW50TGVhdmVzKGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIDA7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gMTtcbiAgaWYgKGlzTnVtYmVyRXhwcmVzc2lvbihleHByKSB8fCBpc1N5bWJvbE9iamVjdChleHByKSB8fCBpc1N0cmluZ09iamVjdChleHByKSlcbiAgICByZXR1cm4gMTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpXG4gICAgcmV0dXJuIGNvdW50RnVuY3Rpb25MZWF2ZXMoZXhwcik7XG4gIGlmIChcImZuXCIgaW4gZXhwcilcbiAgICByZXR1cm4gY291bnRGdW5jdGlvbkxlYXZlcyhleHByLmZuKTtcbiAgY29uc3QgZGljdCA9IGRpY3Rpb25hcnkoZXhwcik7XG4gIGlmIChkaWN0KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRpY3QpO1xuICAgIHJldHVybiAxICsga2V5cy5sZW5ndGggKyBrZXlzLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyBjb3VudExlYXZlcyhkaWN0W3hdKSwgMCk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvc2VyaWFsaXplci1zdHlsZS50c1xuZnVuY3Rpb24gZ2V0QXBwbHlGdW5jdGlvblN0eWxlKF9leHByLCBfbGV2ZWwpIHtcbiAgcmV0dXJuIFwicGFyZW5cIjtcbn1cbmZ1bmN0aW9uIGdldEdyb3VwU3R5bGUoX2V4cHIsIF9sZXZlbCkge1xuICByZXR1cm4gXCJwYXJlblwiO1xufVxuZnVuY3Rpb24gZ2V0Um9vdFN0eWxlKF9leHByLCBsZXZlbCkge1xuICByZXR1cm4gbGV2ZWwgPiAyID8gXCJzb2xpZHVzXCIgOiBcInJhZGljYWxcIjtcbn1cbmZ1bmN0aW9uIGdldEZyYWN0aW9uU3R5bGUoZXhwciwgbGV2ZWwpIHtcbiAgaWYgKGxldmVsID4gMylcbiAgICByZXR1cm4gXCJpbmxpbmUtc29saWR1c1wiO1xuICBpZiAoaGVhZChleHByKSA9PT0gXCJEaXZpZGVcIikge1xuICAgIGNvbnN0IFtuLCBkXSA9IFtjb3VudExlYXZlcyhvcDEoZXhwcikpLCBjb3VudExlYXZlcyhvcDIoZXhwcikpXTtcbiAgICBpZiAoZCA8PSAyICYmIG4gPiA1KVxuICAgICAgcmV0dXJuIFwiZmFjdG9yXCI7XG4gICAgaWYgKG4gPD0gMiAmJiBkID4gNSlcbiAgICAgIHJldHVybiBcInJlY2lwcm9jYWxcIjtcbiAgfVxuICByZXR1cm4gXCJxdW90aWVudFwiO1xufVxuZnVuY3Rpb24gZ2V0TG9naWNTdHlsZShfZXhwciwgX2xldmVsKSB7XG4gIHJldHVybiBcImJvb2xlYW5cIjtcbn1cbmZ1bmN0aW9uIGdldFBvd2VyU3R5bGUoX2V4cHIsIF9sZXZlbCkge1xuICByZXR1cm4gXCJzb2xpZHVzXCI7XG59XG5mdW5jdGlvbiBnZXROdW1lcmljU2V0U3R5bGUoX2V4cHIsIF9sZXZlbCkge1xuICByZXR1cm4gXCJjb21wYWN0XCI7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1hcml0aG1ldGljLnRzXG5mdW5jdGlvbiBudW1lcmF0b3JEZW5vbWluYXRvcihleHByKSB7XG4gIGlmIChoZWFkKGV4cHIpICE9PSBcIk11bHRpcGx5XCIpXG4gICAgcmV0dXJuIFtbXSwgW11dO1xuICBjb25zdCBudW1lcmF0b3IgPSBbXTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBbXTtcbiAgY29uc3QgYXJncyA9IG9wcyhleHByKSA/PyBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmIChoZWFkKGFyZykgPT09IFwiUG93ZXJcIikge1xuICAgICAgY29uc3Qgb3AxMiA9IG9wKGFyZywgMSk7XG4gICAgICBjb25zdCBvcDIyID0gb3AoYXJnLCAyKTtcbiAgICAgIGlmIChoZWFkKG9wMjIpID09PSBcIk5lZ2F0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGIgPSBvcChvcDIyLCAxKTtcbiAgICAgICAgaWYgKG9wMTIgJiYgYilcbiAgICAgICAgICBkZW5vbWluYXRvci5wdXNoKFtcIlBvd2VyXCIsIG9wMTIsIGJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50VmFsID0gbWFjaGluZVZhbHVlKG9wMjIpID8/IE5hTjtcbiAgICAgICAgaWYgKGV4cG9uZW50VmFsID09PSAtMSkge1xuICAgICAgICAgIGlmIChvcDEyKVxuICAgICAgICAgICAgZGVub21pbmF0b3IucHVzaChvcDEyKTtcbiAgICAgICAgfSBlbHNlIGlmIChleHBvbmVudFZhbCA8IDApIHtcbiAgICAgICAgICBpZiAob3AxMilcbiAgICAgICAgICAgIGRlbm9taW5hdG9yLnB1c2goW1wiUG93ZXJcIiwgb3AxMiwgLWV4cG9uZW50VmFsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbnVtZXJhdG9yLnB1c2goYXJnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZChhcmcpID09PSBcIlJhdGlvbmFsXCIgJiYgbm9wcyhhcmcpID09PSAyKSB7XG4gICAgICBjb25zdCBvcDEyID0gb3AoYXJnLCAxKTtcbiAgICAgIGNvbnN0IG9wMjIgPSBvcChhcmcsIDIpO1xuICAgICAgaWYgKG1hY2hpbmVWYWx1ZShvcDEyKSAhPT0gMSlcbiAgICAgICAgbnVtZXJhdG9yLnB1c2gob3AxMik7XG4gICAgICBpZiAobWFjaGluZVZhbHVlKG9wMjIpICE9PSAxKVxuICAgICAgICBkZW5vbWluYXRvci5wdXNoKG9wMjIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByID0gcmF0aW9uYWxWYWx1ZShhcmcpO1xuICAgICAgaWYgKHIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJbMF0gIT09IDEpXG4gICAgICAgICAgbnVtZXJhdG9yLnB1c2goclswXSk7XG4gICAgICAgIGRlbm9taW5hdG9yLnB1c2goclsxXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgbnVtZXJhdG9yLnB1c2goYXJnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtudW1lcmF0b3IsIGRlbm9taW5hdG9yXTtcbn1cbmZ1bmN0aW9uIHBhcnNlUm9vdChwYXJzZXIpIHtcbiAgY29uc3QgZGVncmVlID0gcGFyc2VyLnBhcnNlT3B0aW9uYWxHcm91cCgpO1xuICBjb25zdCBiYXNlID0gcGFyc2VyLnBhcnNlR3JvdXAoKSA/PyBwYXJzZXIucGFyc2VUb2tlbigpO1xuICBpZiAoYmFzZSA9PT0gbnVsbCB8fCBpc0VtcHR5U2VxdWVuY2UoYmFzZSkpIHtcbiAgICBpZiAoZGVncmVlICE9PSBudWxsKVxuICAgICAgcmV0dXJuIFtcIlJvb3RcIiwgTUlTU0lORywgbWlzc2luZ0lmRW1wdHkoZGVncmVlKV07XG4gICAgcmV0dXJuIFtcIlNxcnRcIiwgTUlTU0lOR107XG4gIH1cbiAgaWYgKGRlZ3JlZSAhPT0gbnVsbClcbiAgICByZXR1cm4gW1wiUm9vdFwiLCBiYXNlLCBkZWdyZWVdO1xuICByZXR1cm4gW1wiU3FydFwiLCBiYXNlXTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVJvb3Qoc2VyaWFsaXplciwgc3R5bGUsIGJhc2UsIGRlZ3JlZSkge1xuICBpZiAoYmFzZSA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJcXFxcc3FydHt9XCI7XG4gIGRlZ3JlZSA9IGRlZ3JlZSA/PyAyO1xuICBpZiAoc3R5bGUgPT09IFwic29saWR1c1wiKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcFNob3J0KGJhc2UpICsgXCJeezFcXFxcL1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZGVncmVlKSArIFwifVwiO1xuICB9IGVsc2UgaWYgKHN0eWxlID09PSBcInF1b3RpZW50XCIpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplci53cmFwU2hvcnQoYmFzZSkgKyBcIl57XFxcXGZyYWN7MX17XCIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZWdyZWUpICsgXCJ9fVwiO1xuICB9XG4gIGNvbnN0IGRlZ3JlZVZhbHVlID0gbWFjaGluZVZhbHVlKGRlZ3JlZSk7XG4gIGlmIChkZWdyZWVWYWx1ZSA9PT0gMilcbiAgICByZXR1cm4gXCJcXFxcc3FydHtcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGJhc2UpICsgXCJ9XCI7XG4gIHJldHVybiBcIlxcXFxzcXJ0W1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZGVncmVlKSArIFwiXXtcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGJhc2UpICsgXCJ9XCI7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVBZGQoc2VyaWFsaXplciwgZXhwcikge1xuICBzZXJpYWxpemVyLmxldmVsIC09IDE7XG4gIGNvbnN0IG5hbWUgPSBoZWFkKGV4cHIpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IGFyZyA9IG9wKGV4cHIsIDEpO1xuICBpZiAobmFtZSA9PT0gXCJOZWdhdGVcIikge1xuICAgIHJlc3VsdCA9IFwiLVwiICsgc2VyaWFsaXplci53cmFwKGFyZywgMjc2KTtcbiAgfSBlbHNlIGlmIChuYW1lID09PSBcIkFkZFwiKSB7XG4gICAgaWYgKHNlcmlhbGl6ZXIuY2Fub25pY2FsICYmIG5vcHMoZXhwcikgPT09IDIgJiYgc2VyaWFsaXplci5vcHRpb25zLmludmlzaWJsZVBsdXMgIT09IFwiK1wiKSB7XG4gICAgICBjb25zdCBbb3AxMiwgb3AyMl0gPSBbb3AoZXhwciwgMSksIG9wKGV4cHIsIDIpXTtcbiAgICAgIGxldCBbbGhzLCByaHNdID0gW29wMTIsIG9wMjJdO1xuICAgICAgbGV0IGxoc1ZhbHVlID0gbWFjaGluZVZhbHVlKGxocyk7XG4gICAgICBsZXQgcmhzVmFsdWUgPSByYXRpb25hbFZhbHVlKHJocyk7XG4gICAgICBpZiAobGhzVmFsdWUgPT09IG51bGwgfHwgcmhzVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgW2xocywgcmhzXSA9IFtvcDIyLCBvcDEyXTtcbiAgICAgICAgbGhzVmFsdWUgPSBtYWNoaW5lVmFsdWUobGhzKTtcbiAgICAgICAgcmhzVmFsdWUgPSByYXRpb25hbFZhbHVlKHJocyk7XG4gICAgICB9XG4gICAgICBpZiAobGhzVmFsdWUgIT09IG51bGwgJiYgcmhzVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzRmluaXRlKGxoc1ZhbHVlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxoc1ZhbHVlKSAmJiBsaHNWYWx1ZSA+PSAwICYmIGxoc1ZhbHVlIDw9IDFlMyAmJiBpc0Zpbml0ZShyaHNWYWx1ZVswXSkgJiYgaXNGaW5pdGUocmhzVmFsdWVbMV0pICYmIHJoc1ZhbHVlWzBdID4gMCAmJiByaHNWYWx1ZVswXSA8PSAxMDAgJiYgcmhzVmFsdWVbMV0gPD0gMTAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGxocyksXG4gICAgICAgICAgICBzZXJpYWxpemVyLm9wdGlvbnMuaW52aXNpYmxlUGx1cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHJocylcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBzZXJpYWxpemVyLmxldmVsICs9IDE7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgdmFsID0gbWFjaGluZVZhbHVlKGFyZykgPz8gTmFOO1xuICAgIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZyk7XG4gICAgY29uc3QgbGFzdCA9IG5vcHMoZXhwcikgKyAxO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgbGFzdDsgaSsrKSB7XG4gICAgICBhcmcgPSBvcChleHByLCBpKTtcbiAgICAgIHZhbCA9IG1hY2hpbmVWYWx1ZShhcmcpID8/IE5hTjtcbiAgICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgIHJlc3VsdCArPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShhcmcpO1xuICAgICAgfSBlbHNlIGlmIChoZWFkKGFyZykgPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgICAgcmVzdWx0ICs9IHNlcmlhbGl6ZXIud3JhcChhcmcsIDI3NSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ZXJtID0gc2VyaWFsaXplci53cmFwKGFyZywgMjc1KTtcbiAgICAgICAgaWYgKHRlcm1bMF0gPT09IFwiLVwiIHx8IHRlcm1bMF0gPT09IFwiK1wiKVxuICAgICAgICAgIHJlc3VsdCArPSB0ZXJtO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmVzdWx0ICs9IFwiK1wiICsgdGVybTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJTdWJ0cmFjdFwiKSB7XG4gICAgcmVzdWx0ID0gc2VyaWFsaXplci53cmFwKGFyZywgMjc1KTtcbiAgICBjb25zdCBhcmcyID0gb3AoZXhwciwgMik7XG4gICAgaWYgKGFyZzIgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlcm0gPSBzZXJpYWxpemVyLndyYXAoYXJnMiwgMjc1KTtcbiAgICAgIGlmICh0ZXJtWzBdID09PSBcIi1cIilcbiAgICAgICAgcmVzdWx0ICs9IFwiK1wiICsgdGVybS5zbGljZSgxKTtcbiAgICAgIGVsc2UgaWYgKHRlcm1bMF0gPT09IFwiK1wiKVxuICAgICAgICByZXN1bHQgKz0gXCItXCIgKyB0ZXJtLnNsaWNlKDEpO1xuICAgICAgZWxzZVxuICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBcIi1cIiArIHRlcm07XG4gICAgfVxuICB9XG4gIHNlcmlhbGl6ZXIubGV2ZWwgKz0gMTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZU11bHRpcGx5KHNlcmlhbGl6ZXIsIGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIHNlcmlhbGl6ZXIubGV2ZWwgLT0gMTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGlmIChzZXJpYWxpemVyLmNhbm9uaWNhbCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IFtudW1lciwgZGVub21dID0gbnVtZXJhdG9yRGVub21pbmF0b3IoZXhwcik7XG4gICAgaWYgKGRlbm9tLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChkZW5vbS5sZW5ndGggPT09IDEgJiYgZGVub21bMF0gPT09IDEpIHtcbiAgICAgICAgaWYgKG51bWVyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICByZXN1bHQgPSBcIjFcIjtcbiAgICAgICAgZWxzZSBpZiAobnVtZXIubGVuZ3RoID09PSAxKVxuICAgICAgICAgIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG51bWVyWzBdKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlc3VsdCA9IHNlcmlhbGl6ZU11bHRpcGx5KHNlcmlhbGl6ZXIsIFtcIk11bHRpcGx5XCIsIC4uLm51bWVyXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShbXG4gICAgICAgICAgXCJEaXZpZGVcIixcbiAgICAgICAgICBudW1lci5sZW5ndGggPT09IDEgPyBudW1lclswXSA6IFtcIk11bHRpcGx5XCIsIC4uLm51bWVyXSxcbiAgICAgICAgICBkZW5vbS5sZW5ndGggPT09IDEgPyBkZW5vbVswXSA6IFtcIk11bHRpcGx5XCIsIC4uLmRlbm9tXVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHJlc3VsdCkge1xuICAgIHNlcmlhbGl6ZXIubGV2ZWwgKz0gMTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxldCBpc05lZ2F0aXZlID0gZmFsc2U7XG4gIGxldCBhcmcgPSBudWxsO1xuICBjb25zdCBjb3VudCA9IG5vcHMoZXhwcikgKyAxO1xuICBsZXQgcHJldldhc051bWJlciA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBhcmcgPSBvcChleHByLCBpKTtcbiAgICBpZiAoYXJnID09PSBudWxsKVxuICAgICAgY29udGludWU7XG4gICAgbGV0IHRlcm07XG4gICAgaWYgKGlzTnVtYmVyRXhwcmVzc2lvbihhcmcpKSB7XG4gICAgICB0ZXJtID0gc2VyaWFsaXplci5zZXJpYWxpemUoYXJnKTtcbiAgICAgIGlmICh0ZXJtID09PSBcIi0xXCIgJiYgIXJlc3VsdCkge1xuICAgICAgICByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpc05lZ2F0aXZlID0gIWlzTmVnYXRpdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGVybVswXSA9PT0gXCItXCIpIHtcbiAgICAgICAgICB0ZXJtID0gdGVybS5zbGljZSgxKTtcbiAgICAgICAgICBpc05lZ2F0aXZlID0gIWlzTmVnYXRpdmU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gIXJlc3VsdCA/IHRlcm0gOiBqb2luTGF0ZXgoW3Jlc3VsdCwgc2VyaWFsaXplci5vcHRpb25zLm11bHRpcGx5LCB0ZXJtXSk7XG4gICAgICB9XG4gICAgICBwcmV2V2FzTnVtYmVyID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaGVhZChhcmcpID09PSBcIlBvd2VyXCIpIHtcbiAgICAgIGNvbnN0IHIgPSByYXRpb25hbFZhbHVlKG9wKGFyZywgMikpO1xuICAgICAgaWYgKHIpIHtcbiAgICAgICAgY29uc3QgW24sIGRdID0gcjtcbiAgICAgICAgaWYgKG4gPT09IDEgJiYgZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdCArPSBzZXJpYWxpemVSb290KFxuICAgICAgICAgICAgc2VyaWFsaXplcixcbiAgICAgICAgICAgIGdldFJvb3RTdHlsZShhcmcsIHNlcmlhbGl6ZXIubGV2ZWwpLFxuICAgICAgICAgICAgb3AoYXJnLCAxKSxcbiAgICAgICAgICAgIGRcbiAgICAgICAgICApO1xuICAgICAgICAgIHByZXZXYXNOdW1iZXIgPSBmYWxzZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGVhZChhcmcpID09PSBcIlBvd2VyXCIgJiYgIWlzTmFOKG1hY2hpbmVWYWx1ZShvcChhcmcsIDEpKSA/PyBOYU4pKSB7XG4gICAgICB0ZXJtID0gc2VyaWFsaXplci5zZXJpYWxpemUoYXJnKTtcbiAgICAgIHJlc3VsdCA9ICFyZXN1bHQgPyB0ZXJtIDogam9pbkxhdGV4KFtyZXN1bHQsIHNlcmlhbGl6ZXIub3B0aW9ucy5tdWx0aXBseSwgdGVybV0pO1xuICAgICAgcHJldldhc051bWJlciA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGhlYWQoYXJnKSA9PT0gXCJOZWdhdGVcIikge1xuICAgICAgYXJnID0gb3AoYXJnLCAxKTtcbiAgICAgIGlzTmVnYXRpdmUgPSAhaXNOZWdhdGl2ZTtcbiAgICB9XG4gICAgdGVybSA9IHNlcmlhbGl6ZXIud3JhcChhcmcsIDM5MCk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IHRlcm07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGggPSBoZWFkKGFyZyk7XG4gICAgICBpZiAocHJldldhc051bWJlciAmJiAoaCA9PT0gXCJEaXZpZGVcIiB8fCBoID09PSBcIlJhdGlvbmFsXCIpKSB7XG4gICAgICAgIHJlc3VsdCA9IGpvaW5MYXRleChbcmVzdWx0LCBzZXJpYWxpemVyLm9wdGlvbnMubXVsdGlwbHksIHRlcm1dKTtcbiAgICAgIH0gZWxzZSBpZiAoIXNlcmlhbGl6ZXIub3B0aW9ucy5pbnZpc2libGVNdWx0aXBseSkge1xuICAgICAgICByZXN1bHQgPSBqb2luTGF0ZXgoW3Jlc3VsdCwgdGVybV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc2VyaWFsaXplci5vcHRpb25zLmludmlzaWJsZU11bHRpcGx5LFxuICAgICAgICAgIHRlcm1cbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByZXZXYXNOdW1iZXIgPSBmYWxzZTtcbiAgfVxuICBzZXJpYWxpemVyLmxldmVsICs9IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlID8gXCItXCIgKyByZXN1bHQgOiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUZyYWN0aW9uKHBhcnNlcikge1xuICBsZXQgbnVtZXIgPSBwYXJzZXIucGFyc2VHcm91cCgpO1xuICBsZXQgZGVub20gPSBudWxsO1xuICBpZiAobnVtZXIgPT09IG51bGwpIHtcbiAgICBudW1lciA9IHBhcnNlci5wYXJzZVRva2VuKCk7XG4gICAgZGVub20gPSBwYXJzZXIucGFyc2VUb2tlbigpO1xuICB9IGVsc2Uge1xuICAgIGRlbm9tID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgfVxuICBudW1lciA9IG1pc3NpbmdJZkVtcHR5KG51bWVyKTtcbiAgZGVub20gPSBtaXNzaW5nSWZFbXB0eShkZW5vbSk7XG4gIGlmIChoZWFkKG51bWVyKSA9PT0gXCJQYXJ0aWFsRGVyaXZhdGl2ZVwiICYmIChoZWFkKGRlbm9tKSA9PT0gXCJQYXJ0aWFsRGVyaXZhdGl2ZVwiIHx8IGhlYWQoZGVub20pID09PSBcIk11bHRpcGx5XCIgJiYgaGVhZChvcChkZW5vbSwgMSkpID09PSBcIlBhcnRpYWxEZXJpdmF0aXZlXCIpKSB7XG4gICAgY29uc3QgZGVncmVlID0gb3AobnVtZXIsIDMpID8/IG51bGw7XG4gICAgbGV0IGZuID0gb3AobnVtZXIsIDEpO1xuICAgIGlmIChmbiA9PT0gbnVsbClcbiAgICAgIGZuID0gbWlzc2luZ0lmRW1wdHkocGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpKTtcbiAgICBsZXQgdmFycyA9IFtdO1xuICAgIGlmIChoZWFkKGRlbm9tKSA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGFyZyBvZiBvcHMoZGVub20pID8/IFtdKSB7XG4gICAgICAgIGlmIChoZWFkKGFyZykgPT09IFwiUGFydGlhbERlcml2YXRpdmVcIikge1xuICAgICAgICAgIGNvbnN0IHYgPSBvcChhcmcsIDIpO1xuICAgICAgICAgIGlmICh2KVxuICAgICAgICAgICAgdmFycy5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHYgPSBvcChkZW5vbSwgMik7XG4gICAgICBpZiAodilcbiAgICAgICAgdmFycy5wdXNoKHYpO1xuICAgIH1cbiAgICBpZiAodmFycy5sZW5ndGggPiAxKSB7XG4gICAgICB2YXJzID0gW1wiTGlzdFwiLCAuLi52YXJzXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcIlBhcnRpYWxEZXJpdmF0aXZlXCIsIGZuLCAuLi52YXJzLCBkZWdyZWUgPT09IG51bGwgPyAxIDogZGVncmVlXTtcbiAgfVxuICByZXR1cm4gW1wiRGl2aWRlXCIsIG51bWVyLCBkZW5vbV07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVGcmFjdGlvbihzZXJpYWxpemVyLCBleHByKSB7XG4gIGlmIChleHByID09PSBudWxsKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBudW1lciA9IG1pc3NpbmdJZkVtcHR5KG9wKGV4cHIsIDEpKTtcbiAgY29uc3QgZGVub20gPSBtaXNzaW5nSWZFbXB0eShvcChleHByLCAyKSk7XG4gIGNvbnN0IHN0eWxlID0gc2VyaWFsaXplci5jYW5vbmljYWwgPyBnZXRGcmFjdGlvblN0eWxlKGV4cHIsIHNlcmlhbGl6ZXIubGV2ZWwpIDogXCJxdW90aWVudFwiO1xuICBpZiAoc3R5bGUgPT09IFwiaW5saW5lLXNvbGlkdXNcIiB8fCBzdHlsZSA9PT0gXCJuaWNlLXNvbGlkdXNcIikge1xuICAgIGNvbnN0IG51bWVyU3RyID0gc2VyaWFsaXplci53cmFwU2hvcnQobnVtZXIpO1xuICAgIGNvbnN0IGRlbm9tU3RyID0gc2VyaWFsaXplci53cmFwU2hvcnQoZGVub20pO1xuICAgIGlmIChzdHlsZSA9PT0gXCJpbmxpbmUtc29saWR1c1wiKVxuICAgICAgcmV0dXJuIGAke251bWVyU3RyfVxcXFwvJHtkZW5vbVN0cn1gO1xuICAgIHJldHVybiBge31eeyR7bnVtZXJTdHJ9fVxcXFwhXFxcXCEvXFxcXCF7fV97JHtkZW5vbVN0cn19YDtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJyZWNpcHJvY2FsXCIpIHtcbiAgICBpZiAobWFjaGluZVZhbHVlKG51bWVyKSA9PT0gMSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVyLndyYXAoZGVub20pICsgXCJeey0xfVwiO1xuICAgIHJldHVybiBzZXJpYWxpemVyLndyYXAobnVtZXIpICsgc2VyaWFsaXplci53cmFwKGRlbm9tKSArIFwiXnstMX1cIjtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJmYWN0b3JcIikge1xuICAgIGlmIChtYWNoaW5lVmFsdWUoZGVub20pID09PSAxKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcChudW1lcik7XG4gICAgcmV0dXJuIFwiXFxcXGZyYWN7MX17XCIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZW5vbSkgKyBcIn17XCIgKyBzZXJpYWxpemVyLndyYXAobnVtZXIpICsgXCJ9XCI7XG4gIH1cbiAgY29uc3QgbnVtZXJMYXRleCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG51bWVyKTtcbiAgY29uc3QgZGVub21MYXRleCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbm9tKTtcbiAgcmV0dXJuIGBcXFxcZnJhY3ske251bWVyTGF0ZXh9fXske2Rlbm9tTGF0ZXh9fWA7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVQb3dlcihzZXJpYWxpemVyLCBleHByKSB7XG4gIGNvbnN0IG5hbWUgPSBoZWFkKGV4cHIpO1xuICBjb25zdCBiYXNlID0gbWlzc2luZ0lmRW1wdHkob3AoZXhwciwgMSkpO1xuICBpZiAobmFtZSA9PT0gXCJTcXJ0XCIpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplUm9vdChcbiAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICBnZXRSb290U3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCAtIDEpLFxuICAgICAgYmFzZSxcbiAgICAgIDJcbiAgICApO1xuICB9XG4gIGNvbnN0IGV4cDIgPSBtaXNzaW5nSWZFbXB0eShvcChleHByLCAyKSk7XG4gIGlmIChuYW1lID09PSBcIlJvb3RcIilcbiAgICByZXR1cm4gc2VyaWFsaXplUm9vdChcbiAgICAgIHNlcmlhbGl6ZXIsXG4gICAgICBnZXRSb290U3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCAtIDEpLFxuICAgICAgYmFzZSxcbiAgICAgIGV4cDJcbiAgICApO1xuICBpZiAoc2VyaWFsaXplci5jYW5vbmljYWwpIHtcbiAgICBjb25zdCB2YWwyID0gbWFjaGluZVZhbHVlKGV4cDIpID8/IDE7XG4gICAgaWYgKHZhbDIgPT09IC0xKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoW1wiRGl2aWRlXCIsIFwiMVwiLCBiYXNlXSk7XG4gICAgfSBlbHNlIGlmICh2YWwyIDwgMCkge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKFtcIkRpdmlkZVwiLCBcIjFcIiwgW1wiUG93ZXJcIiwgYmFzZSwgLXZhbDJdXSk7XG4gICAgfSBlbHNlIGlmIChoZWFkKGV4cDIpID09PSBcIkRpdmlkZVwiIHx8IGhlYWQoZXhwMikgPT09IFwiUmF0aW9uYWxcIikge1xuICAgICAgaWYgKG1hY2hpbmVWYWx1ZShvcChleHAyLCAxKSkgPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRSb290U3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVSb290KHNlcmlhbGl6ZXIsIHN0eWxlLCBiYXNlLCBvcChleHAyLCAyKSk7XG4gICAgICB9XG4gICAgICBpZiAobWFjaGluZVZhbHVlKG9wKGV4cDIsIDIpKSA9PT0gMikge1xuICAgICAgICByZXR1cm4gYCR7c2VyaWFsaXplci5zZXJpYWxpemUoW1wiU3FydFwiLCBiYXNlXSl9Xnske3NlcmlhbGl6ZXIuc2VyaWFsaXplKFxuICAgICAgICAgIG9wKGV4cDIsIDEpXG4gICAgICAgICl9fWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkKGV4cDIpID09PSBcIlBvd2VyXCIpIHtcbiAgICAgIGlmIChtYWNoaW5lVmFsdWUob3AoZXhwMiwgMikpID09PSAtMSkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldFJvb3RTdHlsZShleHByLCBzZXJpYWxpemVyLmxldmVsKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVJvb3Qoc2VyaWFsaXplciwgc3R5bGUsIGJhc2UsIG9wKGV4cDIsIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcFNob3J0KGJhc2UpICsgXCJee1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZXhwMikgKyBcIn1cIjtcbn1cbnZhciBERUZJTklUSU9OU19BUklUSE1FVElDID0gW1xuICAvLyBDb25zdGFudHNcbiAgeyBuYW1lOiBcIkNhdGFsYW5Db25zdGFudFwiLCBzZXJpYWxpemU6IFwiR1wiIH0sXG4gIHsgbmFtZTogXCJHb2xkZW5SYXRpb1wiLCBzZXJpYWxpemU6IFwiXFxcXHZhcnBoaVwiIH0sXG4gIHsgbmFtZTogXCJFdWxlckdhbW1hXCIsIHNlcmlhbGl6ZTogXCJcXFxcZ2FtbWFcIiB9LFxuICB7XG4gICAgbmFtZTogXCJEZWdyZWVzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZGVncmVlXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDg4MCxcbiAgICBwYXJzZTogKF9wYXJzZXIsIGxocykgPT4gW1wiRGVncmVlc1wiLCBsaHNdLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSwgXCJcXFxcZGVncmVlXCJdKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxkZWdyZWVcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIjx7PlwiLCBcIlxcXFxjaXJjXCIsIFwiPH0+XCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxjaXJjXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFx4QjBcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiBbXCJEZWdyZWVzXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFuZ1wiXSxcbiAgICBwYXJzZTogKHBhcnNlcikgPT4ge1xuICAgICAgY29uc3QgYXJnID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICAgIHJldHVybiBhcmcgPT09IG51bGwgPyBbXCJEZWdyZWVzXCJdIDogW1wiRGVncmVlc1wiLCBhcmddO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGluZnR5XCJdLFxuICAgIHBhcnNlOiB7IG51bTogXCIrSW5maW5pdHlcIiB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvbXBsZXhJbmZpbml0eVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRpbGRlXCIsIFwiXFxcXGluZnR5XCJdLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcdGlsZGVcXFxcaW5mdHlcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdGlsZGVcIiwgXCI8ez5cIiwgXCJcXFxcaW5mdHlcIiwgXCI8fT5cIl0sXG4gICAgcGFyc2U6IFwiQ29tcGxleEluZmluaXR5XCJcbiAgfSxcbiAgeyBuYW1lOiBcIlBpXCIsIGtpbmQ6IFwic3ltYm9sXCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHBpXCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBbXCJcXHUwM0MwXCJdLCBwYXJzZTogXCJQaVwiIH0sXG4gIHtcbiAgICBuYW1lOiBcIkV4cG9uZW50aWFsRVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGV4cG9uZW50aWFsRVwiXSxcbiAgICBwYXJzZTogXCJFeHBvbmVudGlhbEVcIixcbiAgICBzZXJpYWxpemU6IFwiXFxcXGV4cG9uZW50aWFsRVwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG9wZXJhdG9ybmFtZXtlfVwiLFxuICAgIHBhcnNlOiBcIkV4cG9uZW50aWFsRVwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG1hdGhybXtlfVwiLFxuICAgIHBhcnNlOiBcIkV4cG9uZW50aWFsRVwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiZXhwXCIsXG4gICAgcGFyc2U6IFwiRXhwXCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcZXhwXCIsXG4gICAgcGFyc2U6IFwiRXhwXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiSW1hZ2luYXJ5VW5pdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGltYWdpbmFyeUlcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3JuYW1le2l9XCIsXG4gICAgcGFyc2U6IFwiSW1hZ2luYXJ5VW5pdFwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG1hdGhybXtpfVwiLFxuICAgIHBhcnNlOiBcIkltYWdpbmFyeVVuaXRcIlxuICB9LFxuICAvLyBPcGVyYXRpb25zXG4gIHtcbiAgICAvKiogQ291bGQgYmUgdGhlIGRldGVybWluYW50IGlmIHRoZSBhcmd1bWVudCBpcyBhIG1hdHJpeCAqL1xuICAgIC8qKiBAdG9kbzogZG9tYWluIGNoZWNrICovXG4gICAgLyoqIElmIGEgbGl0ZXJhbCBtYXRyaXgsIHRoZSBgc2VyaWFsaXplYCBzaG91bGQgYmUgY3VzdG9tLCB0aGUgcGFyZW5zIGFyZVxuICAgICAqIHJlcGxhY2VkIHdpdGggYmFycyAqL1xuICAgIG5hbWU6IFwiQWJzXCIsXG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBcInxcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwifFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgYm9keSkgPT4gaXNFbXB0eVNlcXVlbmNlKGJvZHkpID8gbnVsbCA6IFtcIkFic1wiLCBib2R5XVxuICB9LFxuICB7XG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiYWJzXCIsXG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIHBhcnNlOiBcIkFic1wiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkFkZFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiK1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJib3RoXCIsXG4gICAgcHJlY2VkZW5jZTogMjc1LFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHVudGlsKSA9PiB7XG4gICAgICBpZiAodW50aWwgJiYgMjc1IDwgdW50aWwubWluUHJlYylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udW50aWwsIG1pblByZWM6IDI3NSB9KTtcbiAgICAgIGlmIChyaHMgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihcIkFkZFwiLCBsaHMsIHJocyk7XG4gICAgfSxcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZUFkZFxuICB9LFxuICB7XG4gICAga2luZDogXCJwcmVmaXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIitcIl0sXG4gICAgcHJlY2VkZW5jZTogMjc1LFxuICAgIHBhcnNlOiAocGFyc2VyLCB1bnRpbCkgPT4ge1xuICAgICAgaWYgKHVudGlsICYmIDI3NSA8IHVudGlsLm1pblByZWMpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyAuLi51bnRpbCwgbWluUHJlYzogNDAwIH0pO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ2VpbFwiLFxuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJcXFxcbGNlaWxcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwiXFxcXHJjZWlsXCIsXG4gICAgcGFyc2U6IChfcGFyc2VyLCBib2R5KSA9PiBpc0VtcHR5U2VxdWVuY2UoYm9keSkgPyBudWxsIDogW1wiQ2VpbFwiLCBib2R5XVxuICB9LFxuICB7XG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBbXCJcXHUyMzA4XCJdLFxuICAgIGNsb3NlVHJpZ2dlcjogW1wiXFx1MjMwOVwiXSxcbiAgICBwYXJzZTogKF9wYXJzZXIsIGJvZHkpID0+IGlzRW1wdHlTZXF1ZW5jZShib2R5KSA/IG51bGwgOiBbXCJDZWlsXCIsIGJvZHldXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyVHJpZ2dlcjogXCJjZWlsXCIsXG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIHBhcnNlOiBcIkNlaWxcIlxuICB9LFxuICB7IG5hbWU6IFwiQ2hvcFwiLCBpZGVudGlmaWVyVHJpZ2dlcjogXCJjaG9wXCIsIGtpbmQ6IFwiZnVuY3Rpb25cIiwgcGFyc2U6IFwiQ2hvcFwiIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvbXBsZXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNzQsXG4gICAgLy8gT25lIGxlc3MgdGhhbiBwcmVjZWRlbmNlIG9mIGBBZGRgOiB1c2VkIGZvciBjb3JyZWN0IHdyYXBwaW5nXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgcmUgPSBtYWNoaW5lVmFsdWUob3AoZXhwciwgMSkpO1xuICAgICAgY29uc3QgaW0gPSBtYWNoaW5lVmFsdWUob3AoZXhwciwgMikpO1xuICAgICAgaWYgKGltID09PSAwKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpO1xuICAgICAgY29uc3QgaW1QYXJ0ID0gaW0gPT09IDEgPyBcIlxcXFxpbWFnaW5hcnlJXCIgOiBpbSA9PT0gLTEgPyBcIi1cXFxcaW1hZ2luYXJ5SVwiIDogam9pbkxhdGV4KFtzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAyKSksIFwiXFxcXGltYWdpbmFyeUlcIl0pO1xuICAgICAgaWYgKHJlID09PSAwKVxuICAgICAgICByZXR1cm4gaW1QYXJ0O1xuICAgICAgaWYgKGltICE9PSBudWxsICYmIGltIDwgMClcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLCBpbVBhcnRdKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSwgXCIrXCIsIGltUGFydF0pO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRGl2aWRlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxmcmFjXCIsXG4gICAgcHJlY2VkZW5jZTogNjYwLFxuICAgIC8vIEZvciBcXGZyYWMgc3BlY2lmaWNhbGx5LCBub3QgZm9yIFxcZGl2LCBldGMuLlxuICAgIC8vIGhhbmRsZXMgTGVpYm5pdHogbm90YXRpb24gZm9yIHBhcnRpYWwgZGVyaXZhdGl2ZXNcbiAgICBwYXJzZTogcGFyc2VGcmFjdGlvbixcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZUZyYWN0aW9uXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxvdmVyXCIsXG4gICAgcHJlY2VkZW5jZTogNjYwLFxuICAgIHBhcnNlOiBcIkRpdmlkZVwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFwvXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcIm5vblwiLFxuICAgIHByZWNlZGVuY2U6IDY2MCxcbiAgICAvLyA/Pz8gTWF0aE1MIGhhcyAyNjUsIGJ1dCBpdCdzIHdyb25nLlxuICAgIC8vIEl0IGhhcyB0byBiZSBhdCBsZWFzdCBoaWdoZXIgdGhhbiBtdWx0aXBseVxuICAgIC8vIGUuZy4gYDEvMiszKnhgIC0+IGAxLzIgKyAzKnhgICwgbm90IGAxLygyKzMqeClgXG4gICAgcGFyc2U6IFwiRGl2aWRlXCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiL1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJub25cIixcbiAgICBwcmVjZWRlbmNlOiA2NjAsXG4gICAgcGFyc2U6IFwiRGl2aWRlXCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGRpdlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJub25cIixcbiAgICBwcmVjZWRlbmNlOiA2NjAsXG4gICAgLy8gPz8/IGFjY29yZGluZyB0byBNYXRoTUxcbiAgICBwYXJzZTogXCJEaXZpZGVcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFeHBcIixcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBvcDEyID0gb3AoZXhwciwgMSk7XG4gICAgICBpZiAoc3ltYm9sKG9wMTIpIHx8IG1hY2hpbmVWYWx1ZShvcDEyKSAhPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbXCJcXFxcZXhwb25lbnRpYWxFXntcIiwgc2VyaWFsaXplci5zZXJpYWxpemUob3AxMildKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1wiXFxcXGV4cFwiLCBzZXJpYWxpemVyLndyYXAobWlzc2luZ0lmRW1wdHkob3AxMikpXSk7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJGYWN0b3JpYWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIiFcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODEwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkZhY3RvcmlhbDJcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIiFcIiwgXCIhXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJGbG9vclwiLFxuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJcXFxcbGZsb29yXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIlxcXFxyZmxvb3JcIixcbiAgICBwYXJzZTogKF9wYXJzZXIsIGJvZHkpID0+IGlzRW1wdHlTZXF1ZW5jZShib2R5KSA/IG51bGwgOiBbXCJGbG9vclwiLCBib2R5XVxuICB9LFxuICB7XG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBbXCJcXHUyMzBBXCJdLFxuICAgIGNsb3NlVHJpZ2dlcjogW1wiXFx1MjMwQlwiXSxcbiAgICBwYXJzZTogKF9wYXJzZXIsIGJvZHkpID0+IGlzRW1wdHlTZXF1ZW5jZShib2R5KSA/IG51bGwgOiBbXCJGbG9vclwiLCBib2R5XVxuICB9LFxuICB7XG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiZmxvb3JcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgcGFyc2U6IFwiRmxvb3JcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcR2FtbWFcIl0sXG4gICAgcGFyc2U6IFwiR2FtbWFcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJHY2RcIixcbiAgICBpZGVudGlmaWVyVHJpZ2dlcjogXCJnY2RcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiSGFsZlwiLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcZnJhYzEyXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGdcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsZ1wiXSxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiBcIlxcXFxsb2dfezEwfVwiICsgc2VyaWFsaXplci53cmFwQXJndW1lbnRzKGV4cHIpLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gcGFyc2VyLnBhcnNlQXJndW1lbnRzKFwiaW1wbGljaXRcIik7XG4gICAgICBpZiAoYXJncyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiTGdcIjtcbiAgICAgIHJldHVybiBbXCJMb2dcIiwgLi4uYXJncywgMTBdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGJcIixcbiAgICBsYXRleFRyaWdnZXI6IFwiXFxcXGxiXCIsXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHtcbiAgICAgIGNvbnN0IGFyZ3MgPSBwYXJzZXIucGFyc2VBcmd1bWVudHMoXCJpbXBsaWNpdFwiKTtcbiAgICAgIGlmIChhcmdzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gXCJMb2dcIjtcbiAgICAgIHJldHVybiBbXCJMb2dcIiwgLi4uYXJncywgMl07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJMblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGxuXCJdLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IFwiXFxcXGxuXCIgKyBzZXJpYWxpemVyLndyYXBBcmd1bWVudHMoZXhwciksXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHBhcnNlTG9nKFwiTG5cIiwgcGFyc2VyKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJMb2dcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsb2dcIl0sXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHBhcnNlTG9nKFwiTG9nXCIsIHBhcnNlciksXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IG9wMihleHByKTtcbiAgICAgIGlmIChiYXNlKVxuICAgICAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgICAgICBcIlxcXFxsb2dfe1wiLFxuICAgICAgICAgIGJhc2UudG9TdHJpbmcoKSxcbiAgICAgICAgICBcIn1cIixcbiAgICAgICAgICBzZXJpYWxpemVyLndyYXAob3AxKGV4cHIpKVxuICAgICAgICBdKTtcbiAgICAgIHJldHVybiBcIlxcXFxsb2dcIiArIHNlcmlhbGl6ZXIud3JhcEFyZ3VtZW50cyhleHByKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkxjbVwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcImxjbVwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIlxuICB9LFxuICB7IG5hbWU6IFwiTWF4XCIsIGlkZW50aWZpZXJUcmlnZ2VyOiBcIm1heFwiLCBraW5kOiBcImZ1bmN0aW9uXCIgfSxcbiAgeyBuYW1lOiBcIk1pblwiLCBpZGVudGlmaWVyVHJpZ2dlcjogXCJtaW5cIiwga2luZDogXCJmdW5jdGlvblwiIH0sXG4gIHtcbiAgICBuYW1lOiBcIk1pbnVzUGx1c1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG1wXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcImJvdGhcIixcbiAgICBwcmVjZWRlbmNlOiAyNzBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTXVsdGlwbHlcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0aW1lc1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJib3RoXCIsXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplTXVsdGlwbHlcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNkb3RcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDM5MCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogMzkyIH0pO1xuICAgICAgaWYgKHJocyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFtcIk11bHRpcGx5XCIsIGxocywgTUlTU0lOR107XG4gICAgICByZXR1cm4gYXBwbHlBc3NvY2lhdGl2ZU9wZXJhdG9yKFwiTXVsdGlwbHlcIiwgbGhzLCByaHMpO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiKlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJib3RoXCIsXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHRlcm1pbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyAuLi50ZXJtaW5hdG9yLCBtaW5QcmVjOiAzOTIgfSk7XG4gICAgICBpZiAocmhzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gW1wiTXVsdGlwbHlcIiwgbGhzLCBNSVNTSU5HXTtcbiAgICAgIHJldHVybiBhcHBseUFzc29jaWF0aXZlT3BlcmF0b3IoXCJNdWx0aXBseVwiLCBsaHMsIHJocyk7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJOZWdhdGVcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIi1cIl0sXG4gICAga2luZDogXCJwcmVmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgdGVybWluYXRvcikgPT4ge1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnRlcm1pbmF0b3IsIG1pblByZWM6IDQwMCB9KTtcbiAgICAgIHJldHVybiBbXCJOZWdhdGVcIiwgbWlzc2luZ0lmRW1wdHkocmhzKV07XG4gICAgfSxcbiAgICBwcmVjZWRlbmNlOiAyNzVcbiAgfSxcbiAgLy8ge1xuICAvLyAgIC8qKiBJZiB0aGUgYXJndW1lbnQgaXMgYSB2ZWN0b3IgKi9cbiAgLy8gICAvKiogQHRvZG86IGRvbWFpbiBjaGVjayAqL1xuICAvLyAgIG5hbWU6ICdOb3JtJyxcbiAgLy8gICBraW5kOiAnbWF0Y2hmaXgnLFxuICAvLyAgIG9wZW5EZWxpbWl0ZXI6ICd8JyxcbiAgLy8gICBjbG9zZURlbGltaXRlcjogJ3wnLFxuICAvLyB9LFxuICAvLyB7XG4gIC8vICAgLyoqIElmIHRoZSBhcmd1bWVudCBpcyBhIHNldCAqL1xuICAvLyAgIC8qKiBAdG9kbzogZG9tYWluIGNoZWNrICovXG4gIC8vICAgbmFtZTogJ0NhcmRpbmFsaXR5JyxcbiAgLy8gICBraW5kOiAnbWF0Y2hmaXgnLFxuICAvLyAgIG9wZW5EZWxpbWl0ZXI6ICd8JyxcbiAgLy8gICBjbG9zZURlbGltaXRlcjogJ3wnLFxuICAvLyB9LFxuICB7XG4gICAgLy8gICAvKiogSWYgdGhlIGFyZ3VtZW50IGlzIGEgdmVjdG9yICovXG4gICAgLyoqIEB0b2RvOiBkb21haW4gY2hlY2sgKi9cbiAgICBraW5kOiBcIm1hdGNoZml4XCIsXG4gICAgb3BlblRyaWdnZXI6IFwifHxcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwifHxcIixcbiAgICBwYXJzZTogKF9wYXJzZXIsIGV4cHIpID0+IGlzRW1wdHlTZXF1ZW5jZShleHByKSA/IG51bGwgOiBbXCJOb3JtXCIsIGV4cHJdXG4gIH0sXG4gIHtcbiAgICAvLyAgIC8qKiBJZiB0aGUgYXJndW1lbnQgaXMgYSB2ZWN0b3IgKi9cbiAgICAvKiogQHRvZG86IGRvbWFpbiBjaGVjayAqL1xuICAgIG5hbWU6IFwiTm9ybVwiLFxuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogW1wiXFxcXGxlZnRcIiwgXCJcXFxcVmVydFwiXSxcbiAgICBjbG9zZVRyaWdnZXI6IFtcIlxcXFxyaWdodFwiLCBcIlxcXFxWZXJ0XCJdLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgZXhwcikgPT4gaXNFbXB0eVNlcXVlbmNlKGV4cHIpID8gbnVsbCA6IFtcIk5vcm1cIiwgZXhwcl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUGx1c01pbnVzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxccG1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDI3MCxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBvcDEyID0gb3AoZXhwciwgMSk7XG4gICAgICBpZiAob3AxMiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXFxcXHBtXCI7XG4gICAgICBpZiAobm9wcyhleHByKSA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbXCJcXFxccG1cIiwgc2VyaWFsaXplci5zZXJpYWxpemUob3AxMildKTtcbiAgICAgIGNvbnN0IG9wMjIgPSBvcChleHByLCAyKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcDEyKSxcbiAgICAgICAgXCJcXFxccG1cIixcbiAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AyMilcbiAgICAgIF0pO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHBtXCJdLFxuICAgIGtpbmQ6IFwicHJlZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMjcwLFxuICAgIHBhcnNlOiAocGFyc2VyLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogNDAwIH0pO1xuICAgICAgcmV0dXJuIFtcIlBsdXNNaW51c1wiLCBtaXNzaW5nSWZFbXB0eShyaHMpXTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxwbHVzbW5cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDI3MCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogNDAwIH0pO1xuICAgICAgcmV0dXJuIFtcIlBsdXNNaW51c1wiLCBsaHMsIG1pc3NpbmdJZkVtcHR5KHJocyldO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHBsdXNtblwiXSxcbiAgICBraW5kOiBcInByZWZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDI3MCxcbiAgICBwYXJzZTogKHBhcnNlciwgdGVybWluYXRvcikgPT4ge1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnRlcm1pbmF0b3IsIG1pblByZWM6IDQwMCB9KTtcbiAgICAgIHJldHVybiBbXCJQbHVzTWludXNcIiwgbWlzc2luZ0lmRW1wdHkocmhzKV07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJQb3dlclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgc2VyaWFsaXplOiBzZXJpYWxpemVQb3dlclxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxwcm9kXCIsXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIG5hbWU6IFwiUHJvZHVjdFwiLFxuICAgIHBhcnNlOiBwYXJzZUJpZ09wKFwiUHJvZHVjdFwiLCAzOTApLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplQmlnT3AoXCJcXFxccHJvZFwiKVxuICB9LFxuICAvLyB7XG4gIC8vICAgdHJpZ2dlcjogWycqJywgJyonXSxcbiAgLy8gICBraW5kOiAnaW5maXgnLFxuICAvLyAgIGFzc29jaWF0aXZpdHk6ICdub24nLFxuICAvLyAgIHByZWNlZGVuY2U6IDcyMCxcbiAgLy8gfSxcbiAge1xuICAgIG5hbWU6IFwiUmF0aW9uYWxcIixcbiAgICBwcmVjZWRlbmNlOiA2NjAsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgaWYgKGV4cHIgJiYgbm9wcyhleHByKSA9PT0gMSlcbiAgICAgICAgcmV0dXJuIFwiXFxcXG9wZXJhdG9ybmFtZXtSYXRpb25hbH1cIiArIHNlcmlhbGl6ZXIud3JhcEFyZ3VtZW50cyhleHByKTtcbiAgICAgIHJldHVybiBzZXJpYWxpemVGcmFjdGlvbihzZXJpYWxpemVyLCBleHByKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlJvb3RcIixcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZVBvd2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlJvdW5kXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwicm91bmRcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3F1YXJlXCIsXG4gICAgcHJlY2VkZW5jZTogNzIwLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHNlcmlhbGl6ZXIud3JhcFNob3J0KG9wKGV4cHIsIDEpKSArIFwiXjJcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3VtXCJdLFxuICAgIHByZWNlZGVuY2U6IDI3NSxcbiAgICBuYW1lOiBcIlN1bVwiLFxuICAgIHBhcnNlOiBwYXJzZUJpZ09wKFwiU3VtXCIsIDI3NSksXG4gICAgc2VyaWFsaXplOiBzZXJpYWxpemVCaWdPcChcIlxcXFxzdW1cIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU2lnblwiLFxuICAgIC8vIEFzIHBlciBJU08gODAwMDAtMiwgXCJzaWdudW1cIiBpcyAnc2duJ1xuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcInNnblwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTcXJ0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3FydFwiXSxcbiAgICBwYXJzZTogcGFyc2VSb290LFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplUG93ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3VidHJhY3RcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIi1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwiYm90aFwiLFxuICAgIHByZWNlZGVuY2U6IDI3NSxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzLCB0ZXJtaW5hdG9yKSA9PiB7XG4gICAgICBjb25zdCByaHMgPSBwYXJzZXIucGFyc2VFeHByZXNzaW9uKHsgLi4udGVybWluYXRvciwgbWluUHJlYzogMjc3IH0pO1xuICAgICAgcmV0dXJuIFtcIlN1YnRyYWN0XCIsIGxocywgbWlzc2luZ0lmRW1wdHkocmhzKV07XG4gICAgfVxuICB9XG5dO1xuZnVuY3Rpb24gcGFyc2VCaWdPcChuYW1lLCBwcmVjKSB7XG4gIHJldHVybiAocGFyc2VyKSA9PiB7XG4gICAgcGFyc2VyLnNraXBTcGFjZSgpO1xuICAgIGxldCBzdXAgPSBudWxsO1xuICAgIGxldCBzdWIyID0gbnVsbDtcbiAgICB3aGlsZSAoIShzdWIyICYmIHN1cCkgJiYgKHBhcnNlci5wZWVrID09PSBcIl9cIiB8fCBwYXJzZXIucGVlayA9PT0gXCJeXCIpKSB7XG4gICAgICBpZiAocGFyc2VyLm1hdGNoKFwiX1wiKSlcbiAgICAgICAgc3ViMiA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgIGVsc2UgaWYgKHBhcnNlci5tYXRjaChcIl5cIikpXG4gICAgICAgIHN1cCA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB9XG4gICAgaWYgKHN1YjIgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdWIyKSlcbiAgICAgIHN1YjIgPSBudWxsO1xuICAgIGlmIChzdXAgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdXApKVxuICAgICAgc3VwID0gbnVsbDtcbiAgICBsZXQgaW5kZXggPSBudWxsO1xuICAgIGxldCBsb3dlciA9IG51bGw7XG4gICAgaWYgKGhlYWQoc3ViMikgPT09IFwiRXF1YWxcIikge1xuICAgICAgaW5kZXggPSBvcChzdWIyLCAxKTtcbiAgICAgIGxvd2VyID0gb3Aoc3ViMiwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gc3ViMjtcbiAgICB9XG4gICAgY29uc3Qgc3ltID0gc3ltYm9sKGluZGV4KTtcbiAgICBpZiAoc3ltKVxuICAgICAgcGFyc2VyLmNvbXB1dGVFbmdpbmU/LnB1c2hTY29wZSh7IFtzeW1dOiB7IGRvbWFpbjogXCJJbnRlZ2VyXCIgfSB9KTtcbiAgICBjb25zdCBmbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyBtaW5QcmVjOiBwcmVjICsgMSB9KTtcbiAgICBpZiAoc3ltKVxuICAgICAgcGFyc2VyLmNvbXB1dGVFbmdpbmU/LnBvcFNjb3BlKCk7XG4gICAgaWYgKCFmbilcbiAgICAgIHJldHVybiBbbmFtZV07XG4gICAgaWYgKHN1cClcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZuLFxuICAgICAgICBbXCJUdXBsZVwiLCBpbmRleCA/IFtcIkhvbGRcIiwgaW5kZXhdIDogXCJOb3RoaW5nXCIsIGxvd2VyID8/IDEsIHN1cF1cbiAgICAgIF07XG4gICAgaWYgKGxvd2VyKVxuICAgICAgcmV0dXJuIFtuYW1lLCBmbiwgW1wiVHVwbGVcIiwgaW5kZXggPyBbXCJIb2xkXCIsIGluZGV4XSA6IFwiTm90aGluZ1wiLCBsb3dlcl1dO1xuICAgIGlmIChpbmRleClcbiAgICAgIHJldHVybiBbbmFtZSwgZm4sIFtcIlR1cGxlXCIsIFtcIkhvbGRcIiwgaW5kZXhdXV07XG4gICAgcmV0dXJuIFtuYW1lLCBmbl07XG4gIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCaWdPcChjb21tYW5kKSB7XG4gIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgIGlmICghb3AoZXhwciwgMSkpXG4gICAgICByZXR1cm4gY29tbWFuZDtcbiAgICBsZXQgYXJnID0gb3AoZXhwciwgMik7XG4gICAgY29uc3QgaCA9IGhlYWQoYXJnKTtcbiAgICBpZiAoaCAhPT0gXCJUdXBsZVwiICYmIGggIT09IFwiVHJpcGxlXCIgJiYgaCAhPT0gXCJQYWlyXCIgJiYgaCAhPT0gXCJTaW5nbGVcIilcbiAgICAgIGFyZyA9IG51bGw7XG4gICAgbGV0IGluZGV4ID0gb3AoYXJnLCAxKTtcbiAgICBpZiAoaW5kZXggJiYgaGVhZChpbmRleCkgPT09IFwiSG9sZFwiKVxuICAgICAgaW5kZXggPSBvcChpbmRleCwgMSk7XG4gICAgY29uc3QgZm4gPSBvcChleHByLCAxKTtcbiAgICBpZiAoIWFyZykge1xuICAgICAgaWYgKCFvcChleHByLCAyKSlcbiAgICAgICAgcmV0dXJuIGpvaW5MYXRleChbY29tbWFuZCwgXCJfblwiLCBzZXJpYWxpemVyLnNlcmlhbGl6ZShmbildKTtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBcIl97XCIsXG4gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZuKVxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IGxvd2VyID0gb3AoYXJnLCAyKTtcbiAgICBsZXQgc3ViMiA9IFtdO1xuICAgIGlmIChpbmRleCAmJiBzeW1ib2woaW5kZXgpICE9PSBcIk5vdGhpbmdcIiAmJiBsb3dlcilcbiAgICAgIHN1YjIgPSBbc2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXgpLCBcIj1cIiwgc2VyaWFsaXplci5zZXJpYWxpemUobG93ZXIpXTtcbiAgICBlbHNlIGlmIChpbmRleCAmJiBzeW1ib2woaW5kZXgpICE9PSBcIk5vdGhpbmdcIilcbiAgICAgIHN1YjIgPSBbc2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXgpXTtcbiAgICBlbHNlIGlmIChsb3dlcilcbiAgICAgIHN1YjIgPSBbc2VyaWFsaXplci5zZXJpYWxpemUobG93ZXIpXTtcbiAgICBpZiAoc3ViMi5sZW5ndGggPiAwKVxuICAgICAgc3ViMiA9IFtcIl97XCIsIC4uLnN1YjIsIFwifVwiXTtcbiAgICBsZXQgc3VwID0gW107XG4gICAgaWYgKG9wKGFyZywgMykpXG4gICAgICBzdXAgPSBbXCJee1wiLCBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChhcmcsIDMpKSwgXCJ9XCJdO1xuICAgIHJldHVybiBqb2luTGF0ZXgoW2NvbW1hbmQsIC4uLnN1cCwgLi4uc3ViMiwgc2VyaWFsaXplci5zZXJpYWxpemUoZm4pXSk7XG4gIH07XG59XG5mdW5jdGlvbiBwYXJzZUxvZyhjb21tYW5kLCBwYXJzZXIpIHtcbiAgbGV0IHN1YjIgPSBudWxsO1xuICBsZXQgYmFzZSA9IG51bGw7XG4gIGlmIChwYXJzZXIubWF0Y2goXCJfXCIpKSB7XG4gICAgc3ViMiA9IHBhcnNlci5wYXJzZVN0cmluZ0dyb3VwKCk/LnRyaW0oKSA/PyBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgYmFzZSA9IE51bWJlci5wYXJzZUZsb2F0KHN1YjIgPz8gXCIxMFwiKTtcbiAgfVxuICBjb25zdCBhcmdzID0gcGFyc2VyLnBhcnNlQXJndW1lbnRzKFwiaW1wbGljaXRcIik7XG4gIGlmIChhcmdzID09PSBudWxsKVxuICAgIHJldHVybiBbY29tbWFuZF07XG4gIGlmIChiYXNlID09PSAxMClcbiAgICByZXR1cm4gW1wiTG9nXCIsIGFyZ3NbMF1dO1xuICBpZiAoYmFzZSA9PT0gMilcbiAgICByZXR1cm4gW1wiTGJcIiwgLi4uYXJnc107XG4gIGlmIChzdWIyID09PSBudWxsKVxuICAgIHJldHVybiBbY29tbWFuZCwgLi4uYXJnc107XG4gIHJldHVybiBbXCJMb2dcIiwgLi4uYXJncywgc3ViMl07XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1jb3JlLnRzXG5mdW5jdGlvbiBwYXJzZVNlcXVlbmNlKHBhcnNlciwgdGVybWluYXRvciwgbGhzLCBwcmVjLCBzZXApIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGxocyAhPT0gbnVsbCk7XG4gIGlmICh0ZXJtaW5hdG9yLm1pblByZWMgPj0gcHJlYylcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0gW2xoc107XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIHdoaWxlICghZG9uZSkge1xuICAgIGRvbmUgPSB0cnVlO1xuICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB3aGlsZSAocGFyc2VyLm1hdGNoKHNlcCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFwiTm90aGluZ1wiKTtcbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlci5hdFRlcm1pbmF0b3IodGVybWluYXRvcikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFwiTm90aGluZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnRlcm1pbmF0b3IsIG1pblByZWM6IHByZWMgfSk7XG4gICAgICByZXN1bHQucHVzaChyaHMgPz8gXCJOb3RoaW5nXCIpO1xuICAgICAgZG9uZSA9IHJocyA9PT0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFkb25lKSB7XG4gICAgICBwYXJzZXIuc2tpcFNwYWNlKCk7XG4gICAgICBkb25lID0gIXBhcnNlci5tYXRjaChzZXApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2VyaWFsaXplT3BzKHNlcCA9IFwiXCIpIHtcbiAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiAob3BzKGV4cHIpID8/IFtdKS5tYXAoKHgpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHgpKS5qb2luKHNlcCk7XG59XG52YXIgREVGSU5JVElPTlNfQ09SRSA9IFtcbiAgLy9cbiAgLy8gQ29uc3RhbnRzXG4gIC8vXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxwbGFjZWhvbGRlclwiXSxcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICB3aGlsZSAocGFyc2VyLm1hdGNoKFwiPHNwYWNlPlwiKSkge1xuICAgICAgfVxuICAgICAgaWYgKHBhcnNlci5tYXRjaChcIltcIikpXG4gICAgICAgIHdoaWxlICghcGFyc2VyLm1hdGNoKFwiXVwiKSAmJiAhcGFyc2VyLmF0Qm91bmRhcnkpXG4gICAgICAgICAgcGFyc2VyLm5leHRUb2tlbigpO1xuICAgICAgd2hpbGUgKHBhcnNlci5tYXRjaChcIjxzcGFjZT5cIikpIHtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJzZXIubWF0Y2goXCI8ez5cIikpXG4gICAgICAgIHdoaWxlICghcGFyc2VyLm1hdGNoKFwiPH0+XCIpICYmICFwYXJzZXIuYXRCb3VuZGFyeSlcbiAgICAgICAgICBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgICByZXR1cm4gXCJOb3RoaW5nXCI7XG4gICAgfVxuICB9LFxuICAvL1xuICAvLyBGdW5jdGlvbnNcbiAgLy9cbiAge1xuICAgIG5hbWU6IFwiQXBwbHlcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwiYXBwbHlcIixcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiBzZXJpYWxpemVyLnNlcmlhbGl6ZUZ1bmN0aW9uKG9wcyhleHByKSlcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxccmhkXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDIwLFxuICAgIHBhcnNlOiBcIkFwcGx5XCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcbGhkXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDIwLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMpID0+IHtcbiAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oeyBtaW5QcmVjOiAyMCB9KSA/PyBcIk5vdGhpbmdcIjtcbiAgICAgIHJldHVybiBbXCJBcHBseVwiLCByaHMsIGxoc107XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJCYXNlRm9ybVwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGNvbnN0IHJhZGl4ID0gbWFjaGluZVZhbHVlKG9wKGV4cHIsIDIpKSA/PyBOYU47XG4gICAgICBpZiAoaXNGaW5pdGUocmFkaXgpICYmIHJhZGl4ID49IDIgJiYgcmFkaXggPD0gMzYpIHtcbiAgICAgICAgY29uc3QgbnVtID0gbWFjaGluZVZhbHVlKG9wKGV4cHIsIDEpKSA/PyBOYU47XG4gICAgICAgIGlmIChpc0Zpbml0ZShudW0pICYmIE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgICAgICAgIGxldCBkaWdpdHMgPSBOdW1iZXIobnVtKS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgICAgbGV0IGdyb3VwTGVuZ3RoID0gMDtcbiAgICAgICAgICBpZiAocmFkaXggPT09IDIpIHtcbiAgICAgICAgICAgIGdyb3VwTGVuZ3RoID0gNDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJhZGl4ID09PSAxMCkge1xuICAgICAgICAgICAgZ3JvdXBMZW5ndGggPSA0O1xuICAgICAgICAgIH0gZWxzZSBpZiAocmFkaXggPT09IDE2KSB7XG4gICAgICAgICAgICBncm91cExlbmd0aCA9IDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChyYWRpeCA+IDE2KSB7XG4gICAgICAgICAgICBncm91cExlbmd0aCA9IDQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChncm91cExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZERpZ2l0cyA9IGRpZ2l0cztcbiAgICAgICAgICAgIGRpZ2l0cyA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZERpZ2l0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgaSAlIGdyb3VwTGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGRpZ2l0cyA9IFwiXFxcXCwgXCIgKyBkaWdpdHM7XG4gICAgICAgICAgICAgIGRpZ2l0cyA9IG9sZERpZ2l0c1tvbGREaWdpdHMubGVuZ3RoIC0gaSAtIDFdICsgZGlnaXRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYChcXFxcdGV4dHske2RpZ2l0c319X3ske3JhZGl4fX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJcXFxcb3BlcmF0b3JuYW1le0Jhc2VGb3JtfShcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwiLCBcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSArIFwiKVwiO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRGVsaW1pdGVyXCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgYXJnQ291bnQgPSBub3BzKGV4cHIpO1xuICAgICAgaWYgKGFyZ0NvdW50ID09PSAwKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGNvbnN0IHN0eWxlID0gc2VyaWFsaXplci5vcHRpb25zLmdyb3VwU3R5bGUoZXhwciwgc2VyaWFsaXplci5sZXZlbCArIDEpO1xuICAgICAgY29uc3QgYXJnMSA9IG9wKGV4cHIsIDEpO1xuICAgICAgY29uc3QgaDEgPSBoZWFkKGFyZzEpO1xuICAgICAgY29uc3QgZGVmYXVsdEZlbmNlID0geyBMaXN0OiBcIltdLFwiLCBTZXF1ZW5jZTogXCJcIiB9W3R5cGVvZiBoMSA9PT0gXCJzdHJpbmdcIiA/IGgxIDogXCJcIl0gPz8gXCIoKSxcIjtcbiAgICAgIGxldCBvcGVuID0gZGVmYXVsdEZlbmNlWzBdID8/IFwiXCI7XG4gICAgICBsZXQgY2xvc2UgPSBkZWZhdWx0RmVuY2VbMV0gPz8gXCJcIjtcbiAgICAgIGxldCBzZXAgPSBkZWZhdWx0RmVuY2VbMl0gPz8gXCJcIjtcbiAgICAgIGlmIChhcmdDb3VudCA+IDEpIHtcbiAgICAgICAgY29uc3Qgb3AyMiA9IHN0cmluZ1ZhbHVlKG9wKGV4cHIsIDIpKSA/PyBcIlwiO1xuICAgICAgICBvcGVuID0gb3AyMlswXSA/PyBkZWZhdWx0RmVuY2VbMF07XG4gICAgICAgIGNsb3NlID0gb3AyMlsxXSA/PyBkZWZhdWx0RmVuY2VbMV07XG4gICAgICAgIHNlcCA9IG9wMjJbMl0gPz8gZGVmYXVsdEZlbmNlWzJdO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IGlzTGlzdExpa2UoYXJnMSkgPyBzZXJpYWxpemVPcHMoc2VwKShzZXJpYWxpemVyLCBhcmcxKSA6IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZzEpO1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JhcFN0cmluZyhib2R5LCBzdHlsZSwgb3BlbiArIGNsb3NlKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkRvbWFpblwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGlmIChoZWFkKGV4cHIpID09PSBcIkVycm9yXCIpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZShleHByKTtcbiAgICAgIHJldHVybiBgXFxcXG1hdGhiZnske3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKX19YDtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxtYXRodGlwXCJdLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICBjb25zdCBvcDEyID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICAgIGNvbnN0IG9wMjIgPSBwYXJzZXIucGFyc2VHcm91cCgpO1xuICAgICAgcmV0dXJuIG9wMTI7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdGV4dHRpcFwiXSxcbiAgICBwYXJzZTogKHBhcnNlcikgPT4ge1xuICAgICAgY29uc3Qgb3AxMiA9IHBhcnNlci5wYXJzZUdyb3VwKCk7XG4gICAgICBjb25zdCBvcDIyID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICAgIHJldHVybiBvcDEyO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGVycm9yXCJdLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiBbXCJFcnJvclwiLCBwYXJzZXIucGFyc2VHcm91cCgpXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcnJvclwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGlmIChzdHJpbmdWYWx1ZShvcChleHByLCAxKSkgPT09IFwibWlzc2luZ1wiKVxuICAgICAgICByZXR1cm4gYFxcXFxlcnJvcnske3NlcmlhbGl6ZXIub3B0aW9ucy5taXNzaW5nU3ltYm9sID8/IFwiXFxcXHBsYWNlaG9sZGVye31cIn19YDtcbiAgICAgIGNvbnN0IHdoZXJlID0gZXJyb3JDb250ZXh0QXNMYXRleChzZXJpYWxpemVyLCBleHByKSB8fCBcIlxcXFxibGFja3NxdWFyZVwiO1xuICAgICAgY29uc3Qgb3AxMiA9IG9wKGV4cHIsIDEpO1xuICAgICAgY29uc3QgY29kZSA9IGhlYWQob3AxMikgPT09IFwiRXJyb3JDb2RlXCIgPyBzdHJpbmdWYWx1ZShvcChvcDEyLCAxKSkgOiBzdHJpbmdWYWx1ZShvcDEyKTtcbiAgICAgIGlmIChjb2RlID09PSBcImluY29tcGF0aWJsZS1kb21haW5cIikge1xuICAgICAgICByZXR1cm4gYFxcXFxtYXRodGlwe1xcXFxlcnJvcnske3doZXJlfX19e1xcXFxpbiAke3NlcmlhbGl6ZXIuc2VyaWFsaXplKFxuICAgICAgICAgIG9wKG9wMTIsIDMpXG4gICAgICAgICl9XFxcXG5vdGluICR7c2VyaWFsaXplci5zZXJpYWxpemUob3Aob3AxMiwgMikpfX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjb2RlID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gYFxcXFxlcnJvcnske3doZXJlfX1gO1xuICAgICAgcmV0dXJuIGBcXFxcZXJyb3J7JHt3aGVyZX19YDtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkVycm9yQ29kZVwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGNvbnN0IGNvZGUgPSBzdHJpbmdWYWx1ZShvcChleHByLCAxKSk7XG4gICAgICBpZiAoY29kZSA9PT0gXCJtaXNzaW5nXCIpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyLm9wdGlvbnMubWlzc2luZ1N5bWJvbCA/PyBcIlxcXFxwbGFjZWhvbGRlcnt9XCI7XG4gICAgICBpZiAoY29kZSA9PT0gXCJ1bmV4cGVjdGVkLWNvbW1hbmRcIiB8fCBjb2RlID09PSBcInVuZXhwZWN0ZWQtb3BlcmF0b3JcIiB8fCBjb2RlID09PSBcInVuZXhwZWN0ZWQtdG9rZW5cIiB8fCBjb2RlID09PSBcImludmFsaWQtaWRlbnRpZmllclwiIHx8IGNvZGUgPT09IFwidW5rbm93bi1lbnZpcm9ubWVudFwiIHx8IGNvZGUgPT09IFwidW5leHBlY3RlZC1iYXNlXCIgfHwgY29kZSA9PT0gXCJpbmNvbXBhdGlibGUtZG9tYWluXCIgfHwgY29kZSA9PT0gXCJpbnZhbGlkLWRvbWFpblwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBcXFxcdGV4dHRpcHtcXFxcZXJyb3J7XFxcXGJsYWNrc3F1YXJlfX17XFxcXG1hdGh0dHske2NvZGV9fX1gO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRnJvbUxhdGV4XCIsXG4gICAgc2VyaWFsaXplOiAoX3NlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIHJldHVybiBgXFxcXHRleHR0dHske3Nhbml0aXplTGF0ZXgoc3RyaW5nVmFsdWUob3AoZXhwciwgMSkpKX19YDtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkxhdGV4XCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChcbiAgICAgICAgbWFwQXJncyhleHByLCAoeCkgPT4gc3RyaW5nVmFsdWUoeCkgPz8gc2VyaWFsaXplci5zZXJpYWxpemUoeCkpXG4gICAgICApO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGF0ZXhTdHJpbmdcIixcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBpZiAoZXhwciA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gam9pbkxhdGV4KG1hcEFyZ3MoZXhwciwgKHgpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHgpKSk7XG4gICAgfVxuICB9LFxuICB7IG5hbWU6IFwiTGF0ZXhUb2tlbnNcIiwgc2VyaWFsaXplOiBzZXJpYWxpemVMYXRleFRva2VucyB9LFxuICB7XG4gICAgbmFtZTogXCJMaXN0XCIsXG4gICAga2luZDogXCJtYXRjaGZpeFwiLFxuICAgIG9wZW5UcmlnZ2VyOiBcIlxcXFxsYnJhY2tcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwiXFxcXHJicmFja1wiLFxuICAgIHBhcnNlOiBwYXJzZUxpc3QsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICAgIFwiXFxcXGxicmFja1wiLFxuICAgICAgICBzZXJpYWxpemVPcHMoXCIsIFwiKShzZXJpYWxpemVyLCBleHByKSxcbiAgICAgICAgXCJcXFxccmJyYWNrXCJcbiAgICAgIF0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3lub255bXMgZm9yIExpc3RcbiAge1xuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJbXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIl1cIixcbiAgICBwYXJzZTogcGFyc2VMaXN0XG4gIH0sXG4gIHtcbiAgICBraW5kOiBcIm1hdGNoZml4XCIsXG4gICAgb3BlblRyaWdnZXI6IFwiXFxcXFtcIixcbiAgICBjbG9zZVRyaWdnZXI6IFwiXFxcXF1cIixcbiAgICBwYXJzZTogcGFyc2VMaXN0XG4gIH0sXG4gIC8vIFN5bm9ueW1zIGZvciBEZWxpbWl0ZXJcbiAge1xuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCIoXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIilcIixcbiAgICBwYXJzZTogcGFyc2VEZWxpbWl0ZXJcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwibWF0Y2hmaXhcIixcbiAgICBvcGVuVHJpZ2dlcjogXCJcXFxcbHBhcmVuXCIsXG4gICAgY2xvc2VUcmlnZ2VyOiBcIlxcXFxycGFyZW5cIixcbiAgICBwYXJzZTogcGFyc2VEZWxpbWl0ZXJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiLFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMjAsXG4gICAgLy8gVW5saWtlIHRoZSBtYXRjaGZpeCB2ZXJzaW9uIG9mIExpc3QsXG4gICAgLy8gd2hlbiB0aGUgY29tbWEgb3BlcmF0b3IgaXMgdXNlZCwgdGhlIGxocyBhbmQgcmhzIGFyZSBmbGF0dGVuZWQsXG4gICAgLy8gaS5lLiBgMSwyLDNgIC0+IGBbXCJEZWxpbWl0ZXJcIiwgW1wiTGlzdFwiLCAxLCAyLCAzXSwgIFwiLFwiXWAsXG4gICAgLy8gYW5kIGAxLCAoMiwgMylgIC0+IGBbXCJEZWxpbWl0ZXJcIixcbiAgICAvLyBbXCJTZXF1ZW5jZVwiLCAxLCBbXCJEZWxpbWl0ZXJcIiwgW1wiTGlzdFwiLCAyLCAzXSwgIFwiKClcIiwgXCIsXCJdXV0sXG4gICAgcGFyc2U6IChwYXJzZXIsIGxocywgdGVybWluYXRvcikgPT4ge1xuICAgICAgY29uc3Qgc2VxID0gcGFyc2VTZXF1ZW5jZShwYXJzZXIsIHRlcm1pbmF0b3IsIGxocywgMjAsIFwiLFwiKTtcbiAgICAgIGlmIChzZXEgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFtcIlNlcXVlbmNlXCIsIC4uLnNlcV07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplT3BzKFwiXCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIjtcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDE5LFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHRlcm1pbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHNlcSA9IHBhcnNlU2VxdWVuY2UocGFyc2VyLCB0ZXJtaW5hdG9yLCBsaHMsIDE5LCBcIjtcIik7XG4gICAgICBpZiAoc2VxID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiU2VxdWVuY2VcIixcbiAgICAgICAgLi4uc2VxLm1hcChcbiAgICAgICAgICAoeCkgPT4gaGVhZCh4KSA9PT0gXCJTZXF1ZW5jZVwiID8gW1wiTGlzdFwiLCAuLi5vcHMoeCkgPz8gW11dIDogeFxuICAgICAgICApXG4gICAgICBdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdGV4dFwiXSxcbiAgICBwYXJzZTogKHNjYW5uZXIpID0+IHBhcnNlVGV4dFJ1bihzY2FubmVyKSxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gb3BzKGV4cHIpO1xuICAgICAgaWYgKGFyZ3MgPT09IG51bGwgfHwgYXJncy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBcIlxcXFx0ZXh0e31cIjtcbiAgICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgICBcIlxcXFx0ZXh0e1wiLFxuICAgICAgICBhcmdzLm1hcCgoeCkgPT4gc2VyaWFsaXplci5zZXJpYWxpemUoeCkpLmpvaW4oXCJcIiksXG4gICAgICAgIFwifVwiXG4gICAgICBdKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1YnNjcmlwdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiX1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgaWYgKG5vcHMoZXhwcikgPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwiX3tcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSArIFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiX3tcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwifVwiO1xuICAgIH1cbiAgfSxcbiAgeyBuYW1lOiBcIlN1cGVycGx1c1wiLCBsYXRleFRyaWdnZXI6IFtcIl5cIiwgXCIrXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VicGx1c1wiLCBsYXRleFRyaWdnZXI6IFtcIl9cIiwgXCIrXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VwZXJtaW51c1wiLCBsYXRleFRyaWdnZXI6IFtcIl5cIiwgXCItXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VibWludXNcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJfXCIsIFwiLVwiXSwga2luZDogXCJwb3N0Zml4XCIgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIipcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcGFyc2U6IChfcGFyc2VyLCBsaHMpID0+IFtcIlN1cGVyc3RhclwiLCBsaHNdXG4gIH0sXG4gIC8vIHsgbmFtZTogJ1N1cGVyc3RhcicsIGxhdGV4VHJpZ2dlcjogWydeJywgJ1xcXFxzdGFyJ10sIGtpbmQ6ICdwb3N0Zml4JyB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJfXCIsIFwiKlwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKF9wYXJzZXIsIGxocykgPT4gW1wiU3Vic3RhclwiLCBsaHNdXG4gIH0sXG4gIHsgbmFtZTogXCJTdWJzdGFyXCIsIGxhdGV4VHJpZ2dlcjogW1wiX1wiLCBcIlxcXFxzdGFyXCJdLCBraW5kOiBcInBvc3RmaXhcIiB9LFxuICB7IG5hbWU6IFwiU3VwZXJkYWdnZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiXFxcXGRhZ2dlclwiXSwga2luZDogXCJwb3N0Zml4XCIgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxkYWdcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcGFyc2U6IChfcGFyc2VyLCBsaHMpID0+IFtcIlN1cGVyZGFnZ2VyXCIsIGxoc11cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUHJpbWVcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIl5cIiwgXCJcXFxccHJpbWVcIl0sXG4gICAgLy8gTm90ZTogd2UgZG9uJ3QgbmVlZCBhIHByZWNlZGVuY2UgYmVjYXVzZSB0aGUgdHJpZ2dlciBpcyAnXidcbiAgICAvLyBhbmQgJ14nIChhbmQgJ18nKSBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgYnkgdGhlIHBhcnNlci5cbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAxKSxcbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBjb25zdCBuMiA9IG1hY2hpbmVWYWx1ZShvcChleHByLCAyKSkgPz8gMTtcbiAgICAgIGNvbnN0IGJhc2UgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSk7XG4gICAgICBpZiAobjIgPT09IDEpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJeXFxcXHByaW1lXCI7XG4gICAgICBpZiAobjIgPT09IDIpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJeXFxcXGRvdWJsZXByaW1lXCI7XG4gICAgICBpZiAobjIgPT09IDMpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJeXFxcXHRyaXBsZXByaW1lXCI7XG4gICAgICByZXR1cm4gYmFzZSArIFwiXnsoXCIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAyKSkgKyBcIil9XCI7XG4gICAgfVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIl57XFxcXHByaW1lXFxcXHByaW1lfVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMpID0+IHBhcnNlUHJpbWUocGFyc2VyLCBsaHMsIDIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiXntcXFxccHJpbWVcXFxccHJpbWVcXFxccHJpbWV9XCIsXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcGFyc2U6IChwYXJzZXIsIGxocykgPT4gcGFyc2VQcmltZShwYXJzZXIsIGxocywgMylcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxkb3VibGVwcmltZVwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAyKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiXFxcXHRyaXBsZXByaW1lXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMpID0+IHBhcnNlUHJpbWUocGFyc2VyLCBsaHMsIDMpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFwiJ1wiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAxKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxwcmltZVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAxKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxkb3VibGVwcmltZVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAyKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFx0cmlwbGVwcmltZVwiLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDgxMCxcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiBwYXJzZVByaW1lKHBhcnNlciwgbGhzLCAzKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiPHs+XCIsIFwiKFwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiB7XG4gICAgICBpZiAoIXBhcnNlci5jb21wdXRlRW5naW5lPy5ib3gobGhzKT8uZG9tYWluLmlzRnVuY3Rpb24pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY29uc3Qgc3RhcnQgPSBwYXJzZXIuaW5kZXg7XG4gICAgICBwYXJzZXIuYWRkQm91bmRhcnkoW1wiKVwiXSk7XG4gICAgICBjb25zdCBleHByID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgaWYgKCFwYXJzZXIubWF0Y2hCb3VuZGFyeSgpKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyc2VyLm1hdGNoKFwiPH0+XCIpKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXCJEZXJpdmF0aXZlXCIsIGxocywgZXhwcl07XG4gICAgfVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJJbnZlcnNlRnVuY3Rpb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFwiXnstMX1cIixcbiAgICBraW5kOiBcInBvc3RmaXhcIixcbiAgICBwYXJzZTogKHBhcnNlciwgbGhzKSA9PiB7XG4gICAgICBpZiAocGFyc2VyLmNvbXB1dGVFbmdpbmU/LmJveChsaHMpPy5kb21haW4uaXNGdW5jdGlvbilcbiAgICAgICAgcmV0dXJuIFtcIkludmVyc2VGdW5jdGlvblwiLCBsaHNdO1xuICAgICAgcmV0dXJuIFtcIlBvd2VyXCIsIG1pc3NpbmdJZkVtcHR5KGxocyksIC0xXTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSArIFwiXnstMX1cIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJEZXJpdmF0aXZlXCIsXG4gICAgc2VyaWFsaXplOiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgICAgY29uc3QgZGVncmVlID0gbWFjaGluZVZhbHVlKG9wKGV4cHIsIDIpKSA/PyAxO1xuICAgICAgY29uc3QgYmFzZSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKTtcbiAgICAgIGlmIChkZWdyZWUgPT09IDEpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJee1xcXFxwcmltZX1cIjtcbiAgICAgIGlmIChkZWdyZWUgPT09IDIpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJee1xcXFxkb3VibGVwcmltZX1cIjtcbiAgICAgIGlmIChkZWdyZWUgPT09IDMpXG4gICAgICAgIHJldHVybiBiYXNlICsgXCJee1xcXFx0cmlwbGVwcmltZX1cIjtcbiAgICAgIHJldHVybiBiYXNlICsgXCJeeyhcIiArIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSArIFwiKX1cIjtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImVudmlyb25tZW50XCIsXG4gICAgbmFtZTogXCJXaGljaFwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcImNhc2VzXCIsXG4gICAgcGFyc2U6IChwYXJzZXIpID0+IHtcbiAgICAgIGNvbnN0IHRhYnVsYXIgPSBwYXJzZXIucGFyc2VUYWJ1bGFyKCk7XG4gICAgICBpZiAoIXRhYnVsYXIpXG4gICAgICAgIHJldHVybiBbXCJXaGljaFwiXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtcIldoaWNoXCJdO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgdGFidWxhcikge1xuICAgICAgICBpZiAocm93Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKFwiVHJ1ZVwiKTtcbiAgICAgICAgICByZXN1bHQucHVzaChyb3dbMF0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBzID0gc3RyaW5nVmFsdWUocm93WzFdKTtcbiAgICAgICAgICByZXN1bHQucHVzaChzID8gXCJUcnVlXCIgOiBzdHJpcFRleHQocm93WzFdKSA/PyBcIlRydWVcIik7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocm93WzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZTIsIGV4cHIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICAgIGNvbnN0IGFyZ3MgPSBvcHMoZXhwcik7XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBhcmdzLmxlbmd0aCAtIDI7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHJvdyA9IFtdO1xuICAgICAgICAgIHJvdy5wdXNoKHNlcmlhbGl6ZTIuc2VyaWFsaXplKGFyZ3NbaSArIDFdKSk7XG4gICAgICAgICAgcm93LnB1c2goc2VyaWFsaXplMi5zZXJpYWxpemUoYXJnc1tpXSkpO1xuICAgICAgICAgIHJvd3MucHVzaChyb3cuam9pbihcIiZcIikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gam9pbkxhdGV4KFtcIlxcXFxiZWdpbntjYXNlc31cIiwgcm93cy5qb2luKFwiXFxcXFxcXFxcIiksIFwiXFxcXGVuZHtjYXNlc31cIl0pO1xuICAgIH1cbiAgfVxuXTtcbmZ1bmN0aW9uIHBhcnNlVGV4dFJ1bihwYXJzZXIsIHN0eWxlKSB7XG4gIGlmICghcGFyc2VyLm1hdGNoKFwiPHs+XCIpKVxuICAgIHJldHVybiBcIicnXCI7XG4gIGNvbnN0IHJ1bnMgPSBbXTtcbiAgbGV0IHRleHQgPSBcIlwiO1xuICBsZXQgcnVuaW5TdHlsZSA9IG51bGw7XG4gIHdoaWxlICghcGFyc2VyLmF0RW5kICYmICFwYXJzZXIubWF0Y2goXCI8fT5cIikpIHtcbiAgICBpZiAocGFyc2VyLnBlZWsgPT09IFwiPHs+XCIpIHtcbiAgICAgIHJ1bnMucHVzaChwYXJzZVRleHRSdW4ocGFyc2VyKSk7XG4gICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJcXFxcdGV4dGJmXCIpICYmIHBhcnNlci5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgcnVucy5wdXNoKHBhcnNlVGV4dFJ1bihwYXJzZXIsIHsgXCJmb250LXdlaWdodFwiOiBcImJvbGRcIiB9KSk7XG4gICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJcXFxcY29sb3JcIikpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gcGFyc2VyLnBhcnNlU3RyaW5nR3JvdXAoKTtcbiAgICAgIGlmIChjb2xvciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocnVuaW5TdHlsZSAhPT0gbnVsbCAmJiB0ZXh0KSB7XG4gICAgICAgICAgcnVucy5wdXNoKFtcIlN0eWxlXCIsIHRleHQsIHsgZGljdDogcnVuaW5TdHlsZSB9XSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dCkge1xuICAgICAgICAgIHJ1bnMucHVzaChbXCJTdHJpbmdcIiwgdGV4dF0pO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSBcIlwiO1xuICAgICAgICBydW5pblN0eWxlID0geyBjb2xvciB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFyc2VyLm1hdGNoKFwiPHNwYWNlPlwiKSkge1xuICAgICAgdGV4dCArPSBcIiBcIjtcbiAgICB9IGVsc2UgaWYgKHBhcnNlci5tYXRjaChcIjwkPlwiKSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZXIuaW5kZXg7XG4gICAgICBjb25zdCBleHByID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpID8/IFtcIlNlcXVlbmNlXCJdO1xuICAgICAgcGFyc2VyLnNraXBTcGFjZSgpO1xuICAgICAgaWYgKHBhcnNlci5tYXRjaChcIjwkPlwiKSkge1xuICAgICAgICBydW5zLnB1c2goZXhwcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ICs9IFwiJFwiO1xuICAgICAgICBwYXJzZXIuaW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcnNlci5tYXRjaChcIjwkJD5cIikpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VyLmluZGV4O1xuICAgICAgY29uc3QgZXhwciA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKSA/PyBbXCJTZXF1ZW5jZVwiXTtcbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICAgIGlmIChwYXJzZXIubWF0Y2goXCI8JCQ+XCIpKSB7XG4gICAgICAgIHJ1bnMucHVzaChleHByKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgKz0gXCIkJFwiO1xuICAgICAgICBwYXJzZXIuaW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgIHRleHQgKz0gcGFyc2VyLm1hdGNoQ2hhcigpID8/IHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgfVxuICBpZiAocnVuaW5TdHlsZSAhPT0gbnVsbCAmJiB0ZXh0KSB7XG4gICAgcnVucy5wdXNoKFtcIlN0eWxlXCIsIGAnJHt0ZXh0fSdgLCB7IGRpY3Q6IHJ1bmluU3R5bGUgfV0pO1xuICB9IGVsc2UgaWYgKHRleHQpIHtcbiAgICBydW5zLnB1c2goYCcke3RleHR9J2ApO1xuICB9XG4gIGxldCBib2R5O1xuICBpZiAocnVucy5sZW5ndGggPT09IDEpXG4gICAgYm9keSA9IHJ1bnNbMF07XG4gIGVsc2Uge1xuICAgIGlmIChydW5zLmV2ZXJ5KCh4KSA9PiBzdHJpbmdWYWx1ZSh4KSAhPT0gbnVsbCkpXG4gICAgICBib2R5ID0gXCInXCIgKyBydW5zLm1hcCgoeCkgPT4gc3RyaW5nVmFsdWUoeCkpLmpvaW4oKSArIFwiJ1wiO1xuICAgIGVsc2VcbiAgICAgIGJvZHkgPSBbXCJTdHJpbmdcIiwgLi4ucnVuc107XG4gIH1cbiAgcmV0dXJuIHN0eWxlID8gW1wiU3R5bGVcIiwgYm9keSwgeyBkaWN0OiBzdHlsZSB9XSA6IGJvZHk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVMYXRleFRva2VucyhzZXJpYWxpemVyLCBleHByKSB7XG4gIGlmIChleHByID09PSBudWxsKVxuICAgIHJldHVybiBcIlwiO1xuICByZXR1cm4gam9pbkxhdGV4KFxuICAgIG1hcEFyZ3MoZXhwciwgKHgpID0+IHtcbiAgICAgIGNvbnN0IHMgPSBzdHJpbmdWYWx1ZSh4KTtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoeCk7XG4gICAgICBpZiAocyA9PT0gXCI8ez5cIilcbiAgICAgICAgcmV0dXJuIFwie1wiO1xuICAgICAgaWYgKHMgPT09IFwiPH0+XCIpXG4gICAgICAgIHJldHVybiBcIn1cIjtcbiAgICAgIGlmIChzID09PSBcIjwkPlwiKVxuICAgICAgICByZXR1cm4gXCIkXCI7XG4gICAgICBpZiAocyA9PT0gXCI8JCQ+XCIpXG4gICAgICAgIHJldHVybiBcIiQkXCI7XG4gICAgICBpZiAocyA9PT0gXCI8c3BhY2U+XCIpXG4gICAgICAgIHJldHVybiBcIiBcIjtcbiAgICAgIHJldHVybiBzO1xuICAgIH0pXG4gICk7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZUxhdGV4KHMpIHtcbiAgaWYgKHMgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBzLnJlcGxhY2UoXG4gICAgL1t7fVxcW1xcXVxcXFw6XFwtXFwkJV0vZyxcbiAgICAoYykgPT4gKHtcbiAgICAgIFwie1wiOiBcIlxcXFxsYnJhY2UgXCIsXG4gICAgICBcIn1cIjogXCJcXFxccmJyYWNlIFwiLFxuICAgICAgXCJbXCI6IFwiXFxcXGxicmFjayBcIixcbiAgICAgIFwiXVwiOiBcIlxcXFxyYnJhY2sgXCIsXG4gICAgICBcIjpcIjogXCJcXFxcY29sb24gXCIsXG4gICAgICBcIlxcXFxcIjogXCJcXFxcYmFja3NsYXNoIFwiXG4gICAgfSlbY10gPz8gXCJcXFxcXCIgKyBjXG4gICk7XG59XG5mdW5jdGlvbiBlcnJvckNvbnRleHRBc0xhdGV4KHNlcmlhbGl6ZXIsIGVycm9yKSB7XG4gIGNvbnN0IGFyZyA9IG9wKGVycm9yLCAyKTtcbiAgaWYgKCFhcmcpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGlmIChoZWFkKGFyZykgPT09IFwiTGF0ZXhcIilcbiAgICByZXR1cm4gYFxcXFx0ZXh0dHR7JHtzYW5pdGl6ZUxhdGV4KHN0cmluZ1ZhbHVlKG9wKGFyZywgMSkpID8/IFwiXCIpfX1gO1xuICBpZiAoaGVhZChhcmcpID09PSBcIkhvbGRcIilcbiAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUob3AoYXJnLCAxKSk7XG4gIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZShhcmcpO1xufVxuZnVuY3Rpb24gcGFyc2VQcmltZShwYXJzZXIsIGxocywgb3JkZXIyKSB7XG4gIGNvbnN0IGxoc2ggPSBoZWFkKGxocyk7XG4gIGlmIChsaHNoID09PSBcIkRlcml2YXRpdmVcIiB8fCBsaHNoID09PSBcIlByaW1lXCIpIHtcbiAgICBjb25zdCBuID0gbWFjaGluZVZhbHVlKG9wKGxocywgMikpID8/IDE7XG4gICAgcmV0dXJuIFtsaHNoLCBtaXNzaW5nSWZFbXB0eShvcChsaHMsIDEpKSwgbiArIG9yZGVyMl07XG4gIH1cbiAgaWYgKHBhcnNlci5jb21wdXRlRW5naW5lPy5ib3gobGhzKT8uZG9tYWluLmlzRnVuY3Rpb24pIHtcbiAgICBpZiAob3JkZXIyID09PSAxKVxuICAgICAgcmV0dXJuIFtcIkRlcml2YXRpdmVcIiwgbGhzXTtcbiAgICByZXR1cm4gW1wiRGVyaXZhdGl2ZVwiLCBsaHMsIG9yZGVyMl07XG4gIH1cbiAgaWYgKG9yZGVyMiA9PT0gMSlcbiAgICByZXR1cm4gW1wiUHJpbWVcIiwgbWlzc2luZ0lmRW1wdHkobGhzKV07XG4gIHJldHVybiBbXCJQcmltZVwiLCBtaXNzaW5nSWZFbXB0eShsaHMpLCBvcmRlcjJdO1xufVxuZnVuY3Rpb24gcGFyc2VEZWxpbWl0ZXIocGFyc2VyLCBib2R5KSB7XG4gIGlmIChib2R5ID09PSBudWxsIHx8IGlzRW1wdHlTZXF1ZW5jZShib2R5KSlcbiAgICByZXR1cm4gW1wiU2VxdWVuY2VcIl07XG4gIGlmIChoZWFkKGJvZHkpID09PSBcIlNlcXVlbmNlXCIpIHtcbiAgICBpZiAobm9wcyhib2R5KSA9PT0gMClcbiAgICAgIHJldHVybiBbXCJEZWxpbWl0ZXJcIl07XG4gICAgcmV0dXJuIFtcIkRlbGltaXRlclwiLCBbXCJTZXF1ZW5jZVwiLCAuLi5vcHMoYm9keSkgPz8gW11dXTtcbiAgfVxuICByZXR1cm4gW1wiRGVsaW1pdGVyXCIsIGJvZHldO1xufVxuZnVuY3Rpb24gcGFyc2VMaXN0KF9wYXJzZXIsIGJvZHkpIHtcbiAgaWYgKGJvZHkgPT09IG51bGwgfHwgaXNFbXB0eVNlcXVlbmNlKGJvZHkpKVxuICAgIHJldHVybiBbXCJMaXN0XCJdO1xuICBpZiAoaGVhZChib2R5KSAhPT0gXCJTZXF1ZW5jZVwiICYmIGhlYWQoYm9keSkgIT09IFwiTGlzdFwiKVxuICAgIHJldHVybiBbXCJMaXN0XCIsIGJvZHldO1xuICByZXR1cm4gW1wiTGlzdFwiLCAuLi5vcHMoYm9keSkgPz8gW11dO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L2RpY3Rpb25hcnkvZGVmaW5pdGlvbnMtaW5lcXVhbGl0aWVzLnRzXG52YXIgREVGSU5JVElPTlNfSU5FUVVBTElUSUVTID0gW1xuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbm90XCIsIFwiPFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0NixcbiAgICBwYXJzZTogXCJOb3RMZXNzXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90TGVzc1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5sZXNzXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ2XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIjxcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDUsXG4gICAgcGFyc2U6IFwiTGVzc1wiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkxlc3NcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsdFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0NVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCI8XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MSxcbiAgICBwYXJzZTogXCJMZXNzRXF1YWxcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJMZXNzRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsZVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQxLFxuICAgIHBhcnNlOiBcIkxlc3NFcXVhbFwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsZXFzbGFudFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NSxcbiAgICAvLyBOb3RlIGRpZmZlcmVudCBwcmVjZWRlbmNlIHRoYW4gYDw9YCBhcyBwZXIgTWF0aE1MXG4gICAgcGFyc2U6IFwiTGVzc0VxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGVzc05vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbG5lcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90TGVzc05vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbmxlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTGVzc092ZXJFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGxlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlck92ZXJFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGdlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjUsXG4gICAgcGFyc2U6IFwiR3JlYXRlckVxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIj1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiKlwiLCBcIj1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjAsXG4gICAgcGFyc2U6IFwiU3RhckVxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU3RhckVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3RhclwiLCBcIj1cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUGx1c0VxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCIrXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJNaW51c0VxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCItXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTbGFzaEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCIvXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcXVhbEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCI9XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcXVhbEVxdWFsRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIj1cIiwgXCI9XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJUaWxkZUZ1bGxFcXVhbFwiLFxuICAgIC8vIE1hdGhNTDogYXBwcm94aW1hdGVseSBlcXVhbCB0b1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvbmdcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90VGlsZGVGdWxsRXF1YWxcIixcbiAgICAvLyBNYXRoTUw6IGFwcHJveGltYXRlbHkgYnV0IG5vdCBhY3R1YWxseSBlcXVhbCB0b1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5jb25nXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIjpcIiwgXCI9XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwLFxuICAgIHBhcnNlOiBcIkFzc2lnblwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkFzc2lnblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvbG9uZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXBwcm94XCIsXG4gICAgLy8gTm90ZTogTWF0aGVtYXRpY2EgVGlsZGVUaWxkZVxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFwcHJveFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0N1xuICB9LFxuICB7XG4gICAgbmFtZTogXCJOb3RBcHByb3hcIixcbiAgICAvLyBOb3RlOiBNYXRoZW1hdGljYSBUaWxkZVRpbGRlXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbm90XCIsIFwiXFxcXGFwcHJveFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0N1xuICB9LFxuICB7XG4gICAgbmFtZTogXCJBcHByb3hFcXVhbFwiLFxuICAgIC8vIE5vdGU6IE1hdGhlbWF0aWNhIFRpbGRlRXF1YWwsIE1hdGhNTDogYGFzeW1wdG90aWNhbGx5IGVxdWFsIHRvYFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFwcHJveGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk5vdEFwcHJveEVxdWFsXCIsXG4gICAgLy8gTm90ZTogTWF0aGVtYXRpY2EgTm90VGlsZGVFcXVhbFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5vdFwiLCBcIlxcXFxhcHByb3hlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgLy8gTm90ZTogbm8gTGFUZVggc3ltYm9sIGZvciBjaGFyIFUrMjI0OVxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNTBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90RXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxuZVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI1NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJVbmVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCIhXCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICAgIC8vIE5vdGUgZGlmZmVyZW50IHByZWNlbmRlbmNlIHRoYW4gXFxcXG5lIHBlciBNYXRoTUxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlckVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZ2VcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDJcbiAgICAvLyBOb3RlOiBkaWZmZXJlbnQgcHJlY2VuZGVuY2UgdGhhbiBgPj1gIGFzIHBlciBNYXRoTUxcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGdlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MixcbiAgICAvLyBOb3RlOiBkaWZmZXJlbnQgcHJlY2VuZGVuY2UgdGhhbiBgPj1gIGFzIHBlciBNYXRoTUxcbiAgICBwYXJzZTogXCJHcmVhdGVyRXF1YWxcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCI+XCIsIFwiPVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MyxcbiAgICBwYXJzZTogXCJHcmVhdGVyRXF1YWxcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZ2Vxc2xhbnRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjUsXG4gICAgLy8gTm90ZTogZGlmZmVyZW50IHByZWNlbmRlbmNlIHRoYW4gYD49YCBhcyBwZXIgTWF0aE1MXG4gICAgcGFyc2U6IFwiR3JlYXRlckVxdWFsXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlck5vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZ25lcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90R3JlYXRlck5vdEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbmdlcXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiPlwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0NSxcbiAgICBwYXJzZTogXCJHcmVhdGVyXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiR3JlYXRlclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGd0XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk5vdEdyZWF0ZXJcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxuZ3RyXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ0XG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxub3RcIiwgXCI+XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQ0LFxuICAgIHBhcnNlOiBcIk5vdEdyZWF0ZXJcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJSaW5nRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjaXJjZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiVHJpYW5nbGVFcXVhbFwiLFxuICAgIC8vIE1hdGhNTDogZGVsdGEgZXF1YWwgdG9cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0cmlhbmdsZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRG90RXF1YWxcIixcbiAgICAvLyBNYXRoTUw6IGFwcHJvYWNoZXMgdGhlIGxpbWl0XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZG90ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRG90RXF1YWxEb3RcIixcbiAgICAvLyBNYXRoTUw6IEdlb21ldHJpY2FsbHkgZXF1YWxcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxkb3RlcWRvdFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJGYWxsaW5nRG90RXF1YWxcIixcbiAgICAvLyBNYXRoTUw6IGFwcHJveGltYXRlbHkgZXF1YWwgdG8gb3IgdGhlIGltYWdlIG9mXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZmFsbGluZ2RvdHNlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJSaXNpbmdEb3RFcXVhbFwiLFxuICAgIC8vIE1hdGhNTDogaW1hZ2Ugb2Ygb3IgYXBwcm94aW1hdGVseSBlcXVhbCB0b1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGZhbGxpbmdkb3RzZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUXVlc3Rpb25FcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHF1ZXN0ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTXVjaExlc3NcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsbFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJNdWNoR3JlYXRlclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGdnXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlByZWNlZGVzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxccHJlY1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdWNjZWVkc1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHN1Y2NcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUHJlY2VkZXNFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHByZWNjdXJseWVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1Y2NlZWRzRXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjdXJseWVxcHJlY1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJOb3RQcmVjZWRlc1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5wcmVjXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjYwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk5vdFN1Y2NlZWRzXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbnN1Y2NcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQmV0d2VlblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGJldHdlZW5cIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgfVxuXTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xhdGV4LXN5bnRheC9kaWN0aW9uYXJ5L2RlZmluaXRpb25zLWxvZ2ljLnRzXG52YXIgREVGSU5JVElPTlNfTE9HSUMgPSBbXG4gIC8vIENvbnN0YW50c1xuICB7XG4gICAgbmFtZTogXCJUcnVlXCIsXG4gICAga2luZDogXCJzeW1ib2xcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0b3BcIl1cbiAgICAvLyBcdTIyQTQgVSsyMkE0XG4gIH0sXG4gIHtcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcbWF0aHJte1RydWV9XCIsXG4gICAgcGFyc2U6IFwiVHJ1ZVwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3J7VHJ1ZX1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoc2Z7VH1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRmFsc2VcIixcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGJvdFwiXVxuICAgIC8vIFx1MjJBNSBVKzIyQTVcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxvcGVyYXRvcntGYWxzZX1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoc2Z7Rn1cIixcbiAgICBwYXJzZTogXCJUcnVlXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTWF5YmVcIixcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3JuYW1le01heWJlfVwiLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcb3BlcmF0b3JuYW1le01heWJlfVwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcbWF0aHJte01heWJlfVwiLFxuICAgIHBhcnNlOiBcIk1heWJlXCJcbiAgfSxcbiAgLy8gT3BlcmF0b3JzXG4gIHtcbiAgICBuYW1lOiBcIkFuZFwiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsYW5kXCJdLFxuICAgIHByZWNlZGVuY2U6IDMxN1xuICAgIC8vIHNlcmlhbGl6ZTogJ1xcXFxsYW5kJyxcbiAgfSxcbiAgeyBraW5kOiBcImluZml4XCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHdlZGdlXCJdLCBwYXJzZTogXCJBbmRcIiwgcHJlY2VkZW5jZTogMzE3IH0sXG4gIHsga2luZDogXCJpbmZpeFwiLCBsYXRleFRyaWdnZXI6IFwiXFxcXCZcIiwgcGFyc2U6IFwiQW5kXCIsIHByZWNlZGVuY2U6IDMxNyB9LFxuICB7XG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogXCJcXFxcb3BlcmF0b3JuYW1le2FuZH1cIixcbiAgICBwYXJzZTogXCJBbmRcIixcbiAgICBwcmVjZWRlbmNlOiAzMTdcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3JcIixcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbG9yXCJdLFxuICAgIHByZWNlZGVuY2U6IDMxMFxuICB9LFxuICB7IGtpbmQ6IFwiaW5maXhcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdmVlXCJdLCBwYXJzZTogXCJPclwiLCBwcmVjZWRlbmNlOiAzMTAgfSxcbiAgeyBraW5kOiBcImluZml4XCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxccGFyYWxsZWxcIiwgcGFyc2U6IFwiT3JcIiwgcHJlY2VkZW5jZTogMzEwIH0sXG4gIHtcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxvcGVyYXRvcm5hbWV7b3J9XCIsXG4gICAgcGFyc2U6IFwiQW5kXCIsXG4gICAgcHJlY2VkZW5jZTogMzEwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlhvclwiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx2ZWViYXJcIl0sXG4gICAgcHJlY2VkZW5jZTogMzE1XG4gIH0sXG4gIC8vIFBvc3NpYmxlIGFsdDogXFxvcGx1cyBcdTIyOTUgVSsyMjk1XG4gIHtcbiAgICBuYW1lOiBcIk5vdFwiLFxuICAgIGtpbmQ6IFwicHJlZml4XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbG5vdFwiXSxcbiAgICBwcmVjZWRlbmNlOiA4ODBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTmFuZFwiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxiYXJ3ZWRnZVwiXSxcbiAgICBwcmVjZWRlbmNlOiAzMTVcbiAgICAvLyBzZXJpYWxpemU6ICdcXFxcbWlkJyxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm9yXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFx1MjJCRFwiXSxcbiAgICAvLyBiYXIgdmVlXG4gICAgcHJlY2VkZW5jZTogMzE1XG4gICAgLy8gc2VyaWFsaXplOiAnXFxcXGRvd25hcnJvdycsXG4gIH0sXG4gIC8vIEZ1bmN0aW9uc1xuICB7XG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcImFuZFwiLFxuICAgIHBhcnNlOiBcIkFuZFwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwib3JcIixcbiAgICBwYXJzZTogXCJPclwiXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwibm90XCIsXG4gICAgcGFyc2U6IFwiTm90XCJcbiAgfSxcbiAgLy8gUmVsYXRpb25zXG4gIHtcbiAgICBuYW1lOiBcIkltcGxpZXNcIixcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMjIwLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpbXBsaWVzXCJdLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcaW1wbGllc1wiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxSaWdodGFycm93XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyMjAsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHBhcnNlOiBcIkltcGxpZXNcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFcXVpdmFsZW50XCIsXG4gICAgLy8gTWF0aE1MOiBpZGVudGljYWwgdG8sIE1hdGhlbWF0aWNhOiBDb25ncnVlbnRcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpZmZcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyMTlcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXExlZnRyaWdodGFycm93XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjE5LFxuICAgIHBhcnNlOiBcIkVxdWl2YWxlbnRcIlxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZXF1aXZcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyMTksXG4gICAgcGFyc2U6IFwiRXF1aXZhbGVudFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlByb3Zlc1wiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx2ZGFzaFwiXSxcbiAgICBwcmVjZWRlbmNlOiAyMjAsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHNlcmlhbGl6ZTogXCJcXFxcdmRhc2hcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJFbnRhaWxzXCIsXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHZEYXNoXCJdLFxuICAgIHByZWNlZGVuY2U6IDIyMCxcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgc2VyaWFsaXplOiBcIlxcXFx2RGFzaFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlNhdGlzZmllc1wiLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxtb2RlbHNcIl0sXG4gICAgcHJlY2VkZW5jZTogMjIwLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBzZXJpYWxpemU6IFwiXFxcXG1vZGVsc1wiXG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1vdGhlci50c1xuZnVuY3Rpb24gcGFyc2VTaW5nbGVBcmcoY21kKSB7XG4gIHJldHVybiAocGFyc2VyKSA9PiB7XG4gICAgY29uc3QgYXJnID0gcGFyc2VyLnBhcnNlR3JvdXAoKTtcbiAgICByZXR1cm4gYXJnID09PSBudWxsID8gW2NtZF0gOiBbY21kLCBhcmddO1xuICB9O1xufVxudmFyIERFRklOSVRJT05TX09USEVSUyA9IFtcbiAge1xuICAgIG5hbWU6IFwiT3ZlcnNjcmlwdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJzZXRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDcwMFxuICAgIC8vIEB0b2RvOiBub3QgaW4gTWF0aE1MXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlVuZGVyc2NyaXB0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdW5kZXJzZXRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDcwMFxuICAgIC8vIEB0b2RvOiBub3QgaW4gTWF0aE1MXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkluY3JlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiK1wiLCBcIitcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkRlY3JlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiLVwiLCBcIi1cIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCIsXG4gICAgcHJlY2VkZW5jZTogODgwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlByZUluY3JlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiK1wiLCBcIitcIl0sXG4gICAga2luZDogXCJwcmVmaXhcIixcbiAgICBwcmVjZWRlbmNlOiA4ODBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUHJlRGVjcmVtZW50XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCItXCIsIFwiLVwiXSxcbiAgICBraW5kOiBcInByZWZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDg4MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJSaW5nXCIsXG4gICAgLy8gQWthICdDb21wb3NpdGlvbicsIGkuZS4gZnVuY3Rpb24gY29tcG9zaXRpb25cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjaXJjXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNjVcbiAgICAvLyBAdG9kbzogTWF0aE1MIGlzIDk1MFxuICAgIC8vIEB0b2RvOiBjaGVjayBsaHMgYW5kIHJocyBhcmUgZnVuY3Rpb25zXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlRyYW5zcG9zZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlRcIl0sXG4gICAga2luZDogXCJwb3N0Zml4XCJcbiAgICAvLyBAdG9kbzogaWYgbGhzIGlzIGEgbGlzdC90ZW5zb3JcbiAgfSxcbiAge1xuICAgIC8vIEB0b2RvOiBpZiBsaHMgaXMgYSBsaXN0L3RlbnNvclxuICAgIG5hbWU6IFwiQ29uanVnYXRlVHJhbnNwb3NlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJeXCIsIFwiSFwiXSxcbiAgICBraW5kOiBcInBvc3RmaXhcIlxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdHJpbmdKb2luXCIsXG4gICAgLy8gQHRvZG8gRnJvbSBNYXRoZW1hdGljYS4uLj9cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxsdFwiLCBcIlxcXFxndFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogNzgwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN0YXJzdGFyXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3RhclwiLCBcIlxcXFxzdGFyXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiA3ODBcbiAgfSxcbiAge1xuICAgIC8vIFBhcnRpYWwgZGVyaXZhdGl2ZSB1c2luZyBhIHZhcmlhdGlvbiBvZiB0aGUgRXVsZXIgbm90YXRpb246IGBcdTIyMDJfeGYoeClgXG4gICAgLy8gKHRoZSBFdWxlciBub3RhdGlvbiB1c2VzIGBEXzFmKHgpYCB3aGVyZSBcIjFcIiBpcyBmb3IgdGhlIGZpcnN0IHZhcmlhYmxlXG4gICAgLy8gRm9yIHRoZSBMZWlibml6IG5vdGF0aW9uIHNlZSAnRGl2aWRlJyB0aGF0IGhhbmRsZXMgYFx1MjIwMmYvXHUyMjAyeGBcbiAgICBuYW1lOiBcIlBhcnRpYWxEZXJpdmF0aXZlXCIsXG4gICAgLy8gUGFydGlhbERlcml2YXRpdmUoZXhwciwge2xpc3RzIG9mIHZhcnN9LCBkZWdyZWUpXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxccGFydGlhbFwiXSxcbiAgICBraW5kOiBcInByZWZpeFwiLFxuICAgIHBhcnNlOiAocGFyc2VyKSA9PiB7XG4gICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgbGV0IHN1cCA9IFwiTm90aGluZ1wiO1xuICAgICAgbGV0IHN1YjIgPSBcIk5vdGhpbmdcIjtcbiAgICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICBwYXJzZXIuc2tpcFNwYWNlKCk7XG4gICAgICAgIGlmIChwYXJzZXIubWF0Y2goXCJfXCIpKSB7XG4gICAgICAgICAgc3ViMiA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJeXCIpKSB7XG4gICAgICAgICAgc3VwID0gcGFyc2VyLnBhcnNlR3JvdXAoKSA/PyBwYXJzZXIucGFyc2VUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzZXEgPSBnZXRTZXF1ZW5jZShzdWIyKTtcbiAgICAgIGlmIChzZXEpXG4gICAgICAgIHN1YjIgPSBbXCJMaXN0XCIsIC4uLnNlcV07XG4gICAgICBpZiAoc3ViMiA9PT0gbnVsbCB8fCBzdXAgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgbGV0IHJocyA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gXCJOb3RoaW5nXCI7XG4gICAgICBpZiAocmhzICE9PSBcIk5vdGhpbmdcIiAmJiAhaXNFbXB0eVNlcXVlbmNlKHJocykpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IHBhcnNlci5wYXJzZUFyZ3VtZW50cygpID8/IFtcIk5vdGhpbmdcIl07XG4gICAgICAgIHJocyA9IFtyaHMsIC4uLmFyZ3NdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtcIlBhcnRpYWxEZXJpdmF0aXZlXCIsIHJocywgc3ViMiwgc3VwXTtcbiAgICB9LFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBcIlxcXFxwYXJ0aWFsXCI7XG4gICAgICBjb25zdCBmbiA9IG9wKGV4cHIsIDEpO1xuICAgICAgY29uc3QgdmFycyA9IG9wKGV4cHIsIDIpO1xuICAgICAgY29uc3QgZGVncmVlID0gb3AoZXhwciwgMyk7XG4gICAgICBpZiAodmFycyAhPT0gbnVsbCAmJiB2YXJzICE9PSBcIk5vdGhpbmdcIikge1xuICAgICAgICBpZiAoaGVhZCh2YXJzKSA9PT0gXCJMaXN0XCIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gXCJfe1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoW1wiU2VxdWVuY2VcIiwgLi4ub3BzKHZhcnMpID8/IFtdXSkgKyBcIn1cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgKz0gXCJfe1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUodmFycykgKyBcIn1cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlZ3JlZSAhPT0gbnVsbCAmJiBkZWdyZWUgIT09IFwiTm90aGluZ1wiKVxuICAgICAgICByZXN1bHQgKz0gXCJee1wiICsgc2VyaWFsaXplci5zZXJpYWxpemUoZGVncmVlKSArIFwifVwiO1xuICAgICAgaWYgKGZuICE9PSBudWxsICYmIGZuICE9PSBcIk5vdGhpbmdcIilcbiAgICAgICAgcmVzdWx0ICs9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZuKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBwcmVjZWRlbmNlOiA3NDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlckJhclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJsaW5lXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJCYXJcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiVW5kZXJCYXJcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx1bmRlcmxpbmVcIl0sXG4gICAgcGFyc2U6IHBhcnNlU2luZ2xlQXJnKFwiVW5kZXJCYXJcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlclZlY3RvclwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHZlY1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyVmVjdG9yXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJUaWxkZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRpbGRlXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJUaWxkZVwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVySGF0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcaGF0XCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJIYXRcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlclJpZ2h0QXJyb3dcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxvdmVycmlnaHRhcnJvd1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyUmlnaHRBcnJvd1wiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVyTGVmdEFycm93XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcmxlZnRhcnJvd1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyTGVmdEFycm93XCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJSaWdodERvdWJsZUFycm93XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcT3ZlcnJpZ2h0YXJyb3dcIl0sXG4gICAgcGFyc2U6IHBhcnNlU2luZ2xlQXJnKFwiT3ZlclJpZ2h0RG91YmxlQXJyb3dcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlckxlZnRIYXJwb29uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcmxlZnRoYXJwb29uXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJMZWZ0SGFycG9vblwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVyUmlnaHRIYXJwb29uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcnJpZ2h0aGFycG9vblwiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyUmlnaHRIYXJwb29uXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJMZWZ0UmlnaHRBcnJvd1wiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJsZWZ0cmlnaHRhcnJvd1wiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyTGVmdFJpZ2h0QXJyb3dcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiT3ZlckJyYWNlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcb3ZlcmJyYWNlXCJdLFxuICAgIHBhcnNlOiBwYXJzZVNpbmdsZUFyZyhcIk92ZXJCcmFjZVwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJPdmVyTGluZVNlZ21lbnRcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxvdmVybGluZXNlZ21lbnRcIl0sXG4gICAgcGFyc2U6IHBhcnNlU2luZ2xlQXJnKFwiT3ZlckxpbmVTZWdtZW50XCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIk92ZXJHcm91cFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG92ZXJncm91cFwiXSxcbiAgICBwYXJzZTogcGFyc2VTaW5nbGVBcmcoXCJPdmVyR3JvdXBcIilcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGRpc3BsYXlzdHlsZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRleHRzdHlsZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNjcmlwdHN0eWxlXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc2NyaXB0c2NyaXB0c3R5bGVcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIlNlcXVlbmNlXCJdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0aW55XCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc2NyaXB0c2l6ZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGZvb3Rub3Rlc2l6ZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNtYWxsXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbm9ybWFsc2l6ZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGxhcmdlXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcTGFyZ2VcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIlNlcXVlbmNlXCJdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxMQVJHRVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiU2VxdWVuY2VcIl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGh1Z2VcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIlNlcXVlbmNlXCJdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxIdWdlXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJTZXF1ZW5jZVwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdHlsZVwiLFxuICAgIHNlcmlhbGl6ZTogKHNlcmlhbGl6ZXIsIGV4cHIpID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSk7XG4gICAgICBjb25zdCBkaWN0ID0gZGljdGlvbmFyeShvcChleHByLCAyKSk7XG4gICAgICBpZiAoZGljdCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGlmIChzdHJpbmdWYWx1ZShkaWN0LmRpc3BsYXkpID09PSBcImJsb2NrXCIpXG4gICAgICAgIHJlc3VsdCA9IGpvaW5MYXRleChbXCJ7XFxcXGRpc3BsYXlzdHlsZVwiLCByZXN1bHQsIFwifVwiXSk7XG4gICAgICBlbHNlIGlmIChzdHJpbmdWYWx1ZShkaWN0LmRpc3BsYXkpID09PSBcImlubGluZVwiKVxuICAgICAgICByZXN1bHQgPSBqb2luTGF0ZXgoW1wie1xcXFx0ZXh0c3R5bGVcIiwgcmVzdWx0LCBcIn1cIl0pO1xuICAgICAgZWxzZSBpZiAoc3RyaW5nVmFsdWUoZGljdC5kaXNwbGF5KSA9PT0gXCJzY3JpcHRcIilcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcIntcXFxcc2NyaXB0c3R5bGVcIiwgcmVzdWx0LCBcIn1cIl0pO1xuICAgICAgZWxzZSBpZiAoc3RyaW5nVmFsdWUoZGljdC5kaXNwbGF5KSA9PT0gXCJzY3JpcHRzY3JpcHRcIilcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcIntcXFxcc2NyaXB0c2NyaXB0c3R5bGVcIiwgcmVzdWx0LCBcIn1cIl0pO1xuICAgICAgY29uc3QgdiA9IG1hY2hpbmVWYWx1ZShkaWN0LnNpemUpO1xuICAgICAgaWYgKHYgIT09IG51bGwgJiYgdiA+PSAxICYmIHYgPD0gMTApIHtcbiAgICAgICAgcmVzdWx0ID0gam9pbkxhdGV4KFtcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAxOiBcIlxcXFx0aW55XCIsXG4gICAgICAgICAgICAyOiBcIlxcXFxzY3JpcHRzaXplXCIsXG4gICAgICAgICAgICAzOiBcIlxcXFxmb290bm90ZXNpemVcIixcbiAgICAgICAgICAgIDQ6IFwiXFxcXHNtYWxsXCIsXG4gICAgICAgICAgICA1OiBcIlxcXFxub3JtYWxzaXplXCIsXG4gICAgICAgICAgICA2OiBcIlxcXFxsYXJnZVwiLFxuICAgICAgICAgICAgNzogXCJcXFxcTGFyZ2VcIixcbiAgICAgICAgICAgIDg6IFwiXFxcXExBUkdFXCIsXG4gICAgICAgICAgICA5OiBcIlxcXFxodWdlXCIsXG4gICAgICAgICAgICAxMDogXCJcXFxcSHVnZVwiXG4gICAgICAgICAgfVt2XSxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgXCJ9XCJcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXCFcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIC0zXVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcIFwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiSG9yaXpvbnRhbFNwYWNpbmdcIiwgNl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXDpcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIDRdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxlbnNraXBcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIDldXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxxdWFkXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJIb3Jpem9udGFsU3BhY2luZ1wiLCAxOF1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHFxdWFkXCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJIb3Jpem9udGFsU3BhY2luZ1wiLCAzNl1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXCxcIl0sXG4gICAgcGFyc2U6ICgpID0+IFtcIkhvcml6b250YWxTcGFjaW5nXCIsIDNdXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFw7XCJdLFxuICAgIHBhcnNlOiAoKSA9PiBbXCJIb3Jpem9udGFsU3BhY2luZ1wiLCA1XVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcZW5zcGFjZVwiXSxcbiAgICBwYXJzZTogKCkgPT4gW1wiSG9yaXpvbnRhbFNwYWNpbmdcIiwgOV1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiSG9yaXpvbnRhbFNwYWNpbmdcIixcbiAgICAvLyBUaGUgYEhvcml6b250YWxTcGFjaW5nYCBmdW5jdGlvbiBoYXMgdHdvIGZvcm1zXG4gICAgLy8gYFtcIkhvcml6b250YWxTcGFjaW5nXCIsIG51bWJlcl1gIC0+IGluZGljYXRlIGEgc3BhY2Ugb2YgbXUgdW5pdHNcbiAgICAvLyBgW1wiSG9yaXpvbnRhbFNwYWNpbmdcIiwgZXhwciwgJ29wJ3wnYmluJ3xyZWxdYCAtPiBpbmRpY2F0ZSBhIHNwYWNpbmcgYXJvdW5kIGFuZCBleHByZXNzaW9uLCBpLmUuIGBcXG1hdGhiaW57eH1gLCBldGMuLi5cbiAgICBzZXJpYWxpemU6IChzZXJpYWxpemVyLCBleHByKSA9PiB7XG4gICAgICBpZiAob3AoZXhwciwgMikpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHYgPSBtYWNoaW5lVmFsdWUob3AoZXhwciwgMSkpO1xuICAgICAgaWYgKHYgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgXCItM1wiOiBcIlxcXFwhXCIsXG4gICAgICAgIDY6IFwiXFxcXCBcIixcbiAgICAgICAgMzogXCJcXFxcLFwiLFxuICAgICAgICA0OiBcIlxcXFw6XCIsXG4gICAgICAgIDU6IFwiXFxcXDtcIixcbiAgICAgICAgOTogXCJcXFxcZW5zcGFjZVwiLFxuICAgICAgICAxODogXCJcXFxccXVhZFwiLFxuICAgICAgICAzNjogXCJcXFxccXF1YWRcIlxuICAgICAgfVt2XSA/PyBcIlwiO1xuICAgIH1cbiAgfVxuICAvLyBpZiAoXG4gIC8vICAgW1xuICAvLyAgICAgJ1xcXFwhJyxcbiAgLy8gICAgICdcXFxcOicsXG4gIC8vICAgICAnXFxcXGVuc2tpcCcsXG4gIC8vICAgICAnXFxcXHF1YWQnLFxuICAvLyAgICAgJ1xcXFwsJyxcbiAgLy8gICAgICdcXFxcOycsXG4gIC8vICAgICAnXFxcXGVuc3BhY2UnLFxuICAvLyAgICAgJ1xcXFxxcXVhZCcsXG4gIC8vICAgICAnXFxcXHNlbGVjdGZvbnQnLFxuICAvLyAgIF0uaW5jbHVkZXModG9rZW4pXG4gIC8vICkge1xuICAvLyAgIHJldHVybiAnc2tpcCc7XG4gIC8vIH1cbiAgLy8ge1xuICAvLyAgICAgbmFtZTogJycsXG4gIC8vICAgICB0cmlnZ2VyOiAnXFxcXG1hdGhyaW5nJyxcbiAgLy8gfSxcbiAgLy8ge1xuICAvLyAgICAgbmFtZTogJycsXG4gIC8vICAgICB0cmlnZ2VyOiAnXFxcXGNoZWNrJyxcbiAgLy8gfSxcbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy10cmlnb25vbWV0cnkudHNcbmZ1bmN0aW9uIHBhcnNlVHJpZyhvcDMpIHtcbiAgcmV0dXJuIChwYXJzZXIsIHVudGlsKSA9PiB7XG4gICAgY29uc3QgaGVhZDIgPSB7XG4gICAgICBcIlxcXFxhcmNzaW5cIjogXCJBcmNzaW5cIixcbiAgICAgIFwiXFxcXGFyY2Nvc1wiOiBcIkFyY2Nvc1wiLFxuICAgICAgXCJcXFxcYXJjdGFuXCI6IFwiQXJjdGFuXCIsXG4gICAgICBcIlxcXFxhcmN0Z1wiOiBcIkFyY3RhblwiLFxuICAgICAgXCJcXFxcYXJjY3RnXCI6IFwiQXJjdGFuXCIsXG4gICAgICBcIlxcXFxhcmNzZWNcIjogXCJBcmNzZWNcIixcbiAgICAgIFwiXFxcXGFyY2NzY1wiOiBcIiBBcmNjc2NcIixcbiAgICAgIFwiXFxcXGFyc2luaFwiOiBcIkFyc2luaFwiLFxuICAgICAgXCJcXFxcYXJjb3NoXCI6IFwiQXJjb3NoXCIsXG4gICAgICBcIlxcXFxhcnRhbmhcIjogXCJBcnRhbmhcIixcbiAgICAgIFwiXFxcXGFyY3NlY2hcIjogXCJBcmNzZWNoXCIsXG4gICAgICBcIlxcXFxhcmNjc2NoXCI6IFwiQXJjc2NoXCIsXG4gICAgICAvLyAnXFxcXGFyZycsXG4gICAgICBcIlxcXFxjaFwiOiBcIkNvc2hcIixcbiAgICAgIFwiXFxcXGNvc1wiOiBcIkNvc1wiLFxuICAgICAgXCJcXFxcY29zZWNcIjogXCJDc2NcIixcbiAgICAgIFwiXFxcXGNvc2hcIjogXCJDc2NoXCIsXG4gICAgICBcIlxcXFxjb3RcIjogXCJDb3RcIixcbiAgICAgIFwiXFxcXGNvdGdcIjogXCJDb3RcIixcbiAgICAgIFwiXFxcXGNvdGhcIjogXCJDb3RoXCIsXG4gICAgICBcIlxcXFxjc2NcIjogXCJDc2NcIixcbiAgICAgIFwiXFxcXGN0Z1wiOiBcIkNvdFwiLFxuICAgICAgXCJcXFxcY3RoXCI6IFwiQ290aFwiLFxuICAgICAgXCJcXFxcc2VjXCI6IFwiU2VjXCIsXG4gICAgICBcIlxcXFxzaW5cIjogXCJTaW5cIixcbiAgICAgIFwiXFxcXHNpbmhcIjogXCJTaW5oXCIsXG4gICAgICBcIlxcXFxzaFwiOiBcIlNpbmhcIixcbiAgICAgIFwiXFxcXHRhblwiOiBcIlRhblwiLFxuICAgICAgXCJcXFxcdGFuaFwiOiBcIlRhbmhcIixcbiAgICAgIFwiXFxcXHRnXCI6IFwiVGFuXCIsXG4gICAgICBcIlxcXFx0aFwiOiBcIlRhbmhcIlxuICAgIH1bb3AzID8/IFwiXCJdID8/IG9wMyA/PyBcIlwiO1xuICAgIGlmIChwYXJzZXIuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBoZWFkMjtcbiAgICBjb25zdCBmbiA9IHBhcnNlci5wYXJzZVBvc3RmaXhPcGVyYXRvcihoZWFkMiwgdW50aWwpO1xuICAgIGlmIChmbiAhPT0gbnVsbClcbiAgICAgIHJldHVybiBmbjtcbiAgICBjb25zdCBhcmdzID0gcGFyc2VyLnBhcnNlQXJndW1lbnRzKFwiaW1wbGljaXRcIiwgdW50aWwpO1xuICAgIHJldHVybiBhcmdzID09PSBudWxsID8gaGVhZDIgOiBbaGVhZDIsIC4uLmFyZ3NdO1xuICB9O1xufVxudmFyIERFRklOSVRJT05TX1RSSUdPTk9NRVRSWSA9IFtcbiAge1xuICAgIG5hbWU6IFwiQXJjc2luXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjc2luXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNzaW5cIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjY29zXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjY29zXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNjb3NcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjdGFuXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjdGFuXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmN0YW5cIilcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGFyY3RnXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmN0YW5cIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjY290XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjY3RnXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNjb3RcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjc2VjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBcImFyY3NlY1wiLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNzZWNcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjY3NjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjY3NjXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNjc2NcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJzaW5oXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJzaW5oXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcnNpbmhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjb3NoXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjb3NoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNvc2hcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJ0YW5oXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJ0YW5oXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcnRhbmhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJzZWNoXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJzZWNoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcnNlY2hcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJjc2NoXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJjc2NoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJBcmNzY2hcIilcbiAgfSxcbiAge1xuICAgIC8vIFJ1c2lhbiBoeXBlcmJvbGljIGNvc2luZVxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3NoXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvc2VjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY29zZWNcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvc2VjXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvc2hcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjb3NoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3NoXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvdFwiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiQ290XCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjb3RnXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3RcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ290aFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNvdGhcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvdGhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ3NjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY3NjXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDc2NcIilcbiAgfSxcbiAge1xuICAgIC8vIFJ1c2lhbiBjb3RhbmdlbnRcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjdGdcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvdFwiKVxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY3RoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJDb3RhbmhcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU2VjXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc2VjXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJTZWNcIilcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiU2luaFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNpbmhcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIlNpbmhcIilcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNoXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJTaW5oXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlRhblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRhblwiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiVGFuXCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0Z1wiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiVGFuXCIpXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlRhbmhcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0YW5oXCJdLFxuICAgIHBhcnNlOiBwYXJzZVRyaWcoXCJUYW5oXCIpXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0aFwiXSxcbiAgICBwYXJzZTogcGFyc2VUcmlnKFwiVGFuaFwiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJDb3NcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxjb3NcIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIkNvc1wiKVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTaW5cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzaW5cIl0sXG4gICAgcGFyc2U6IHBhcnNlVHJpZyhcIlNpblwiKVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L2RpY3Rpb25hcnkvZGVmaW5pdGlvbnMtc2V0cy50c1xudmFyIERFRklOSVRJT05TX1NFVFMgPSBbXG4gIC8vIENvbnN0YW50c1xuICB7IG5hbWU6IFwiQWxnZWJyYWljTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcYmFyXFxcXFFcIiB9LFxuICB7IG5hbWU6IFwiQ29tcGxleE51bWJlclwiLCBsYXRleFRyaWdnZXI6IFtcIlxcXFxDXCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoYmJ7Q31cIiwgcGFyc2U6IFwiQ29tcGxleE51bWJlclwiIH0sXG4gIHsgbmFtZTogXCJJbWFnaW5hcnlOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcaW1hZ2luYXJ5SVwiLCBcIlxcXFxSXCJdIH0sXG4gIHsgbmFtZTogXCJFeHRlbmRlZENvbXBsZXhOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYmFyXCIsIFwiXFxcXENcIl0gfSxcbiAgeyBuYW1lOiBcIkVtcHR5U2V0XCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGVtcHR5c2V0XCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcdmFybm90aGluZ1wiXSwgcGFyc2U6IFwiRW1wdHlTZXRcIiB9LFxuICAvLyBQYXJzaW5nIG9ubHlcbiAgeyBuYW1lOiBcIkludGVnZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcWlwiXSB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcbWF0aGJie1p9XCIsIHBhcnNlOiBcIkludGVnZXJcIiB9LFxuICB7IG5hbWU6IFwiUmF0aW9uYWxOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcUVwiXSB9LFxuICB7IG5hbWU6IFwiUmVhbE51bWJlclwiLCBsYXRleFRyaWdnZXI6IFtcIlxcXFxSXCJdIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoYmJ7Un1cIiwgcGFyc2U6IFwiUmVhbE51bWJlclwiIH0sXG4gIHsgbmFtZTogXCJFeHRlbmRlZFJlYWxOdW1iZXJcIiwgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYmFyXCIsIFwiXFxcXFJcIl0gfSxcbiAgeyBuYW1lOiBcIlRyYW5zY2VuZGVudGFsTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcUi1cXFxcYmFyXFxcXFFcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcUlxcXFxiYWNrc2xhc2hcXFxcYmFyXFxcXFFcIiwgcGFyc2U6IFwiVHJhbnNjZW5kZW50YWxOdW1iZXJcIiB9LFxuICAvLyBSZWFsIG51bWJlcnMgPCAwXG4gIHsgbmFtZTogXCJOZWdhdGl2ZU51bWJlclwiLCBsYXRleFRyaWdnZXI6IFwiXFxcXFJeLVwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXnstfVwiLCBwYXJzZTogXCJOZWdhdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXy1cIiwgcGFyc2U6IFwiTmVnYXRpdmVOdW1iZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcUl97LX1cIiwgcGFyc2U6IFwiTmVnYXRpdmVOdW1iZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcUl57XFxcXGx0fVwiLCBwYXJzZTogXCJOZWdhdGl2ZU51bWJlclwiIH0sXG4gIC8vIFJlYWwgbnVtYmVycyA+IDBcbiAgeyBuYW1lOiBcIlBvc2l0aXZlTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcUl4rXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFJeeyt9XCIsIHBhcnNlOiBcIlBvc2l0aXZlTnVtYmVyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFJfK1wiLCBwYXJzZTogXCJQb3NpdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSX3srfVwiLCBwYXJzZTogXCJQb3NpdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXntcXFxcZ3R9XCIsIHBhcnNlOiBcIlBvc2l0aXZlTnVtYmVyXCIgfSxcbiAgLy8gUmVhbCBudW1iZXJzIDw9IDBcbiAgeyBuYW1lOiBcIk5vblBvc2l0aXZlTnVtYmVyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcUl57MC19XCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFJeey0wfVwiLCBwYXJzZTogXCJOb25Qb3NpdGl2ZU51bWJlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxSXntcXFxcbGVxfVwiLCBwYXJzZTogXCJOb25Qb3NpdGl2ZU51bWJlclwiIH0sXG4gIC8vIEludGVnZXJzIDwgMFxuICB7IG5hbWU6IFwiTmVnYXRpdmVJbnRlZ2VyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcWl4tXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpeLVwiLCBwYXJzZTogXCJOZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl57LX1cIiwgcGFyc2U6IFwiTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpfLVwiLCBwYXJzZTogXCJOZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl97LX1cIiwgcGFyc2U6IFwiTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpee1xcXFxsdH1cIiwgcGFyc2U6IFwiTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgLy8gSW50ZWdlcnMgPiAgMFxuICB7IG5hbWU6IFwiUG9zaXRpdmVJbnRlZ2VyXCIsIGxhdGV4VHJpZ2dlcjogXCJcXFxcWl4rXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpeeyt9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxaXytcIiwgcGFyc2U6IFwiUG9zaXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpfeyt9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxaXntcXFxcZ3R9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxaXntcXFxcZ3QwfVwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl4rXCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxOXnsrfVwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl4qXCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxOXnsqfVwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl5cXFxcc3RhclwiLCBwYXJzZTogXCJQb3NpdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl57XFxcXHN0YXJ9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxOXzFcIiwgcGFyc2U6IFwiUG9zaXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXE5fezF9XCIsIHBhcnNlOiBcIlBvc2l0aXZlSW50ZWdlclwiIH0sXG4gIC8vIGh0dHBzOi8vbWF0aHZhdWx0LmNhL2h1Yi9oaWdoZXItbWF0aC9tYXRoLXN5bWJvbHMvYWxnZWJyYS1zeW1ib2xzL1xuICAvLyBJbnRlZ2VycyA+PSAgMFxuICB7IG5hbWU6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIsIGxhdGV4VHJpZ2dlcjogW1wiXFxcXE5cIl0gfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpeeyswfVwiLCBwYXJzZTogXCJOb25OZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl57XFxcXGdlcX1cIiwgcGFyc2U6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXFpee1xcXFxnZXEwfVwiLCBwYXJzZTogXCJOb25OZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcWl57MCt9XCIsIHBhcnNlOiBcIk5vbk5lZ2F0aXZlSW50ZWdlclwiIH0sXG4gIHsgbGF0ZXhUcmlnZ2VyOiBcIlxcXFxtYXRoYmJ7Tn1cIiwgcGFyc2U6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgeyBsYXRleFRyaWdnZXI6IFwiXFxcXE5fMFwiLCBwYXJzZTogXCJOb25OZWdhdGl2ZUludGVnZXJcIiB9LFxuICB7IGxhdGV4VHJpZ2dlcjogXCJcXFxcTl97MH1cIiwgcGFyc2U6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIgfSxcbiAgLy9cbiAgLy8gU2V0IEV4cHJlc3Npb25zXG4gIC8vXG4gIC8vIEB0b2RvOiBjb3VsZCBhbHNvIGhhdmUgYSBgQ2FydGVzaWFuUG93ZXJgIGZ1bmN0aW9uIHdpdGggYSBudW1iZXIgYHJoc2BcbiAge1xuICAgIG5hbWU6IFwiQ2FydGVzaWFuUHJvZHVjdFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHRpbWVzXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgLy8gQ2F1dGlvbjogY2FydGVzaWFuIHByb2R1Y3QgaXMgbm90IGFzc29jaWF0aXZlXG4gICAgcHJlY2VkZW5jZTogMzkwLFxuICAgIC8vIFNhbWUgYXMgTXVsdGlwbHk/XG4gICAgcGFyc2U6IChwYXJzZXIsIGxocywgdW50aWwpID0+IHtcbiAgICAgIGlmICgzOTAgPCB1bnRpbC5taW5QcmVjKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGNlID0gcGFyc2VyLmNvbXB1dGVFbmdpbmU7XG4gICAgICBpZiAoIWNlIHx8ICFjZS5ib3gobGhzKS5kb21haW4uaXNDb21wYXRpYmxlKFwiU2V0XCIpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VyLmluZGV4O1xuICAgICAgY29uc3QgcmhzID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnVudGlsLCBtaW5QcmVjOiAzOTAgfSk7XG4gICAgICBpZiAocmhzID09PSBudWxsIHx8IGNlLmJveChsaHMpLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJTZXRcIikgIT09IHRydWUpIHtcbiAgICAgICAgcGFyc2VyLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtcIkNhcnRlc2lhblByb2R1Y3RcIiwgbGhzLCByaHNdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxjb21wbGVtZW50XCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiLFxuICAgIHBhcnNlOiAoX3BhcnNlciwgbGhzKSA9PiB7XG4gICAgICByZXR1cm4gW1wiQ29tcGxlbWVudFwiLCBsaHNdO1xuICAgIH1cbiAgICAvLyBwcmVjZWRlbmNlOiAyNDAsXG4gICAgLy8gQHRvZG86IHNlcmlhbGl6ZSBmb3IgdGhlIG11bHRpcGxlIGFyZ3VtZW50IGNhc2VcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQ29tcGxlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIjx7PlwiLCBcIlxcXFxjb21wbGVtZW50XCIsIFwiPH0+XCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiXG4gICAgLy8gcHJlY2VkZW5jZTogMjQwLFxuICAgIC8vIEB0b2RvOiBzZXJpYWxpemUgZm9yIHRoZSBtdWx0aXBsZSBhcmd1bWVudCBjYXNlXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkludGVyc2VjdGlvblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGNhcFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogMzUwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkludGVydmFsXCIsXG4gICAgLy8gQHRvZG86IHBhcnNlIG9wZW5pbmcgJ1snIG9yICddJyBvciAnKCdcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZVNldFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJNdWx0aXBsZVwiLFxuICAgIC8vIEB0b2RvOiBwYXJzZVxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplU2V0XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlVuaW9uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcY3VwXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAzNTBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiUmFuZ2VcIixcbiAgICAvLyBAdG9kbzogcGFyc2Ugb3BlbmluZyAnWycgb3IgJ10nIG9yICcoJ1xuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplU2V0XG4gIH0sXG4gIC8vIHtcbiAgLy8gICBuYW1lOiAnU2V0JyxcbiAgLy8gICBraW5kOiAnbWF0Y2hmaXgnLFxuICAvLyAgIG9wZW5EZWxpbWl0ZXI6ICd7JyxcbiAgLy8gICBjbG9zZURlbGltaXRlcjogJ30nLFxuICAvLyAgIHByZWNlZGVuY2U6IDIwLFxuICAvLyAgIC8vIEB0b2RvOiB0aGUgc2V0IHN5bnRheCBjYW4gYWxzbyBpbmNsdWRlIGNvbmRpdGlvbnMuLi5cbiAgLy8gfSxcbiAge1xuICAgIG5hbWU6IFwiU2V0TWludXNcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzZXRtaW51c1wiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgcHJlY2VkZW5jZTogNjUwXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN5bW1ldHJpY0RpZmZlcmVuY2VcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx0cmlhbmdsZVwiXSxcbiAgICAvLyBvciBcXFxcb21pbnVzXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIC8vIEB0b2RvOiBwYXJzZXIgY291bGQgY2hlY2sgdGhhdCBsaHMgYW5kIHJocyBhcmUgc2V0c1xuICAgIHByZWNlZGVuY2U6IDI2MFxuICB9LFxuICAvLyBQcmVkaWNhdGVzL1JlbGF0aW9uc1xuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbmlcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAxNjAsXG4gICAgLy8gQXMgcGVyIE1hdGhNTCwgbG93ZXIgcHJlY2VkZW5jZVxuICAgIHBhcnNlOiAocGFyc2VyLCBsaHMsIHRlcm1pbmF0b3IpID0+IHtcbiAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24odGVybWluYXRvcik7XG4gICAgICByZXR1cm4gcmhzID09PSBudWxsID8gbnVsbCA6IFtcIkVsZW1lbnRcIiwgcmhzLCBsaHNdO1xuICAgIH1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiRWxlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGluXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90RWxlbWVudFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5vdGluXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90U3Vic2V0XCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcbnN1YnNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJOb3RTdXBlcnNldFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5zdXBzZXRcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90U3Vic2V0Tm90RXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxuc3Vic2V0ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIGFzc29jaWF0aXZpdHk6IFwicmlnaHRcIixcbiAgICBwcmVjZWRlbmNlOiAyNDBcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTm90U3VwZXJzZXROb3RFcXVhbFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG5zdXBzZXRlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTcXVhcmVTdWJzZXRcIixcbiAgICAvLyBNYXRoTUw6IHNxdWFyZSBpbWFnZSBvZlxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHNxc3Vic2V0XCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjY1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlNxdWFyZVN1YnNldEVxdWFsXCIsXG4gICAgLy8gTWF0aE1MOiBzcXVhcmUgaW1hZ2Ugb2Ygb3IgZXF1YWwgdG9cbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzcXN1YnNldGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjY1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlNxdWFyZVN1cGVyc2V0XCIsXG4gICAgLy8gTWF0aE1MOiBzcXVhcmUgb3JpZ2luYWwgb2ZcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzcXN1cHNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI2NVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTcXVhcmVTdXBlcnNldEVxdWFsXCIsXG4gICAgLy8gTWF0aE1MOiBzcXVhcmUgb3JpZ2luYWwgb2Ygb3IgZXF1YWxcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzcXN1cHNldGVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjY1XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1YnNldFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHN1YnNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3Vic2V0bmVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQwLFxuICAgIHBhcnNlOiBcIlN1YnNldFwiXG4gIH0sXG4gIHtcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFx2YXJzdWJzZXRuZXFxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQwLFxuICAgIHBhcnNlOiBcIlN1YnNldFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1YnNldEVxdWFsXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3Vic2V0ZXFcIl0sXG4gICAga2luZDogXCJpbmZpeFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJTdXBlcnNldFwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHN1cHNldFwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9LFxuICB7XG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcc3Vwc2V0bmVxXCJdLFxuICAgIGtpbmQ6IFwiaW5maXhcIixcbiAgICBhc3NvY2lhdGl2aXR5OiBcInJpZ2h0XCIsXG4gICAgcHJlY2VkZW5jZTogMjQwLFxuICAgIHBhcnNlOiBcIlN1cGVyc2V0XCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXHZhcnN1cHNldG5lcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MCxcbiAgICBwYXJzZTogXCJTdXBlcnNldFwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN1cGVyc2V0RXF1YWxcIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxzdXBzZXRlcVwiXSxcbiAgICBraW5kOiBcImluZml4XCIsXG4gICAgYXNzb2NpYXRpdml0eTogXCJyaWdodFwiLFxuICAgIHByZWNlZGVuY2U6IDI0MFxuICB9XG5dO1xuZnVuY3Rpb24gc2VyaWFsaXplU2V0KHNlcmlhbGl6ZXIsIGV4cHIpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICBpZiAoaCA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJcIjtcbiAgaWYgKGggPT09IFwiU2V0XCIpIHtcbiAgICBpZiAobm9wcyhleHByKSA9PT0gMClcbiAgICAgIHJldHVybiBcIlxcXFxlbXB0eXNldFwiO1xuICAgIGlmIChub3BzKGV4cHIpID09PSAyICYmIGhlYWQob3AoZXhwciwgMikpID09PSBcIkNvbmRpdGlvblwiKSB7XG4gICAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgICAgXCJcXFxcbGVmdFxcXFxsYnJhY2VcIixcbiAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLFxuICAgICAgICBcIlxcXFxtaWRkbGVcXFxcbWlkXCIsXG4gICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDIpKSxcbiAgICAgICAgXCJcXFxccmlnaHRcXFxccmJyYWNlXCJcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgIFwiXFxcXGxlZnRcXFxcbGJyYWNlXCIsXG4gICAgICAuLi4ob3BzKGV4cHIpID8/IFtdKS5tYXAoKHgpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHgpICsgXCIgLFwiKSxcbiAgICAgIFwiXFxcXHJpZ2h0XFxcXHJicmFjZVwiXG4gICAgXSk7XG4gIH1cbiAgaWYgKGggPT09IFwiTXVsdGlwbGVcIikge1xuICB9XG4gIGlmIChoID09PSBcIlJhbmdlXCIpIHtcbiAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgIFwiXFxcXG1hdGhvcGVuXFxcXGxicmFja1wiLFxuICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLFxuICAgICAgXCIsIFwiLFxuICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMikpLFxuICAgICAgXCJcXFxcbWF0aGNsb3NlXFxcXHJicmFja1wiXG4gICAgXSk7XG4gIH1cbiAgaWYgKGggPT09IFwiSW50ZXJ2YWxcIikge1xuICAgIGxldCBvcDEyID0gb3AoZXhwciwgMSk7XG4gICAgbGV0IG9wMjIgPSBvcChleHByLCAyKTtcbiAgICBsZXQgb3BlbkxlZnQgPSBmYWxzZTtcbiAgICBsZXQgb3BlblJpZ2h0ID0gZmFsc2U7XG4gICAgaWYgKGhlYWQob3AxMikgPT09IFwiT3BlblwiKSB7XG4gICAgICBvcDEyID0gb3Aob3AxMiwgMSk7XG4gICAgICBvcGVuTGVmdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoZWFkKG9wMjIpID09PSBcIk9wZW5cIikge1xuICAgICAgb3AyMiA9IG9wKG9wMjIsIDEpO1xuICAgICAgb3BlblJpZ2h0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICBgXFxcXG1hdGhvcGVuJHtvcGVuTGVmdCA/IFwiXFxcXHJicmFja1wiIDogXCJcXFxcbGJyYWNrXCJ9YCxcbiAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wMTIpLFxuICAgICAgXCIsIFwiLFxuICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUob3AyMiksXG4gICAgICBgXFxcXG1hdGhjbG9zZSR7b3BlblJpZ2h0ID8gXCJcXFxcbGJyYWNrXCIgOiBcIlxcXFxyYnJhY2tcIn1gXG4gICAgXSk7XG4gIH1cbiAgY29uc3Qgc3R5bGUgPSBzZXJpYWxpemVyLm51bWVyaWNTZXRTdHlsZShleHByLCBzZXJpYWxpemVyLmxldmVsKTtcbiAgaWYgKHN0eWxlID09PSBcImNvbXBhY3RcIikge1xuICB9IGVsc2UgaWYgKHN0eWxlID09PSBcImludGVydmFsXCIpIHtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJyZWd1bGFyXCIpIHtcbiAgfSBlbHNlIGlmIChzdHlsZSA9PT0gXCJzZXQtYnVpbGRlclwiKSB7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1jYWxjdWx1cy50c1xuZnVuY3Rpb24gcGFyc2VJbnRlZ3JhbChjb21tYW5kLCBuID0gMSkge1xuICByZXR1cm4gKHBhcnNlcikgPT4ge1xuICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICBsZXQgc3VwID0gbnVsbDtcbiAgICBsZXQgc3ViMiA9IG51bGw7XG4gICAgd2hpbGUgKCEoc3ViMiAhPT0gbnVsbCAmJiBzdXAgIT09IG51bGwpICYmIChwYXJzZXIucGVlayA9PT0gXCJfXCIgfHwgcGFyc2VyLnBlZWsgPT09IFwiXlwiKSkge1xuICAgICAgaWYgKHBhcnNlci5tYXRjaChcIl9cIikpXG4gICAgICAgIHN1YjIgPSBwYXJzZXIucGFyc2VHcm91cCgpID8/IHBhcnNlci5wYXJzZVRva2VuKCk7XG4gICAgICBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJeXCIpKSB7XG4gICAgICAgIHN1cCA9IHBhcnNlci5wYXJzZUdyb3VwKCkgPz8gcGFyc2VyLnBhcnNlVG9rZW4oKTtcbiAgICAgIH1cbiAgICAgIHBhcnNlci5za2lwU3BhY2UoKTtcbiAgICB9XG4gICAgaWYgKHN1YjIgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdWIyKSlcbiAgICAgIHN1YjIgPSBudWxsO1xuICAgIGlmIChzdXAgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShzdXApKVxuICAgICAgc3VwID0gbnVsbDtcbiAgICBsZXQgW2ZuLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keShwYXJzZXIsIG4pO1xuICAgIGlmIChmbiAmJiAhaW5kZXgpIHtcbiAgICAgIGlmIChoZWFkKGZuKSA9PT0gXCJBZGRcIiB8fCBoZWFkKGZuKSA9PT0gXCJTdWJ0cmFjdFwiKSB7XG4gICAgICAgIGNvbnN0IG5ld09wID0gW107XG4gICAgICAgIGNvbnN0IHJlc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcDMgb2Ygb3BzKGZuKSA/PyBbXSkge1xuICAgICAgICAgIGlmIChpbmRleClcbiAgICAgICAgICAgIHJlc3QucHVzaChvcDMpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG9wMjI7XG4gICAgICAgICAgICBbb3AyMiwgaW5kZXhdID0gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKG9wMyk7XG4gICAgICAgICAgICBuZXdPcC5wdXNoKG9wMjIgPz8gb3AzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsICYmIHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcIkFkZFwiLFxuICAgICAgICAgICAgbWFrZUludGVncmFsKFxuICAgICAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgIFtcIkFkZFwiLCAuLi5uZXdPcF0sXG4gICAgICAgICAgICAgIFt7IGluZGV4LCBzdWI6IHN1YjIsIHN1cCB9XVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhlYWQoZm4pID09PSBcIkRpdmlkZVwiKSB7XG4gICAgICAgIGxldCBhbHROdW1lcmF0b3I7XG4gICAgICAgIFthbHROdW1lcmF0b3IsIGluZGV4XSA9IHBhcnNlSW50ZWdyYWxCb2R5RXhwcmVzc2lvbihvcChmbiwgMSkpO1xuICAgICAgICBpZiAoYWx0TnVtZXJhdG9yICE9PSBudWxsICYmIGluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgZm4gPSBbXCJEaXZpZGVcIiwgYWx0TnVtZXJhdG9yLCBvcChmbiwgMildO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWtlSW50ZWdyYWwocGFyc2VyLCBjb21tYW5kLCBmbiwgW3sgaW5kZXgsIHN1Yjogc3ViMiwgc3VwIH1dKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1ha2VJbnRlZ3JhbChwYXJzZXIsIGNvbW1hbmQsIGZuLCByYW5nZXMpIHtcbiAgaWYgKGZuICYmIHJhbmdlcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFtjb21tYW5kLCBmbl07XG4gIGZuID8/IChmbiA9IFwiTm90aGluZ1wiKTtcbiAgaWYgKHBhcnNlci5jb21wdXRlRW5naW5lKSB7XG4gICAgY29uc3QgY2UgPSBwYXJzZXIuY29tcHV0ZUVuZ2luZTtcbiAgICBsZXQgaGFzSW5kZXggPSBmYWxzZTtcbiAgICBjb25zdCBpZFRhYmxlID0ge307XG4gICAgZm9yIChjb25zdCByIG9mIHJhbmdlcylcbiAgICAgIGlmIChyLmluZGV4KSB7XG4gICAgICAgIGhhc0luZGV4ID0gdHJ1ZTtcbiAgICAgICAgaWRUYWJsZVtyLmluZGV4XSA9IHsgZG9tYWluOiBcIkV4dGVuZGVkUmVhbE51bWJlclwiIH07XG4gICAgICB9XG4gICAgaWYgKGhhc0luZGV4KVxuICAgICAgY2UucHVzaFNjb3BlKGlkVGFibGUpO1xuICAgIGZuID0gY2UuYm94KGZuKS5qc29uO1xuICAgIGlmIChoYXNJbmRleClcbiAgICAgIGNlLnBvcFNjb3BlKCk7XG4gIH1cbiAgcmV0dXJuIFtjb21tYW5kLCBmbiwgLi4ucmFuZ2VzLm1hcCgocikgPT4gbWFrZVJhbmdlKHIpKV07XG59XG5mdW5jdGlvbiBtYWtlUmFuZ2UocmFuZ2UpIHtcbiAgY29uc3QgaGVsZEluZGV4ID0gcmFuZ2UuaW5kZXggPyBbXCJIb2xkXCIsIHJhbmdlLmluZGV4XSA6IFwiTm90aGluZ1wiO1xuICBpZiAocmFuZ2Uuc3VwICE9PSBudWxsKVxuICAgIHJldHVybiBbXCJUdXBsZVwiLCBoZWxkSW5kZXgsIHJhbmdlLnN1YiA/PyBcIk5vdGhpbmdcIiwgcmFuZ2Uuc3VwXTtcbiAgaWYgKHJhbmdlLnN1YiAhPT0gbnVsbClcbiAgICByZXR1cm4gW1wiVHVwbGVcIiwgaGVsZEluZGV4LCByYW5nZS5zdWJdO1xuICByZXR1cm4gaGVsZEluZGV4O1xufVxuZnVuY3Rpb24gcGFyc2VJbnRlZ3JhbEJvZHkocGFyc2VyLCBuID0gMSkge1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIGxldCBmbiA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oe1xuICAgIG1pblByZWM6IDI2NixcbiAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZXIubWF0Y2hBbGwoW1wiXFxcXG1hdGhybVwiLCBcIjx7PlwiLCBcImRcIiwgXCI8fT5cIl0pKVxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChwYXJzZXIubWF0Y2hBbGwoW1wiXFxcXG9wZXJhdG9ybmFtZVwiLCBcIjx7PlwiLCBcImRcIiwgXCI8fT5cIl0pKVxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9KTtcbiAgaWYgKCFmb3VuZCkge1xuICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgIGZuID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7XG4gICAgICBtaW5QcmVjOiAyNjYsXG4gICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgaWYgKHBhcnNlci5tYXRjaChcImRcIikpXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaWYgKGZuICYmICFmb3VuZClcbiAgICByZXR1cm4gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKGZuKTtcbiAgY29uc3QgaW5kZXhlcyA9IHBhcnNlSW5kZXhlcyhwYXJzZXIsIG4pO1xuICByZXR1cm4gW2ZuLCBpbmRleGVzWzBdID8/IG51bGxdO1xufVxuZnVuY3Rpb24gcGFyc2VJbmRleGVzKHBhcnNlciwgbiA9IDEpIHtcbiAgcGFyc2VyLnNraXBTcGFjZSgpO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgaW5kZXggPSBzeW1ib2wocGFyc2VyLnBhcnNlU3ltYm9sKCkpO1xuICBpZiAoaW5kZXggPT09IG51bGwpXG4gICAgcmV0dXJuIFtdO1xuICByZXN1bHQucHVzaChpbmRleCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24oZXhwcikge1xuICBjb25zdCBoID0gaGVhZChleHByKTtcbiAgY29uc3Qgb3AxMiA9IG9wKGV4cHIsIDEpO1xuICBpZiAoIW9wMTIpXG4gICAgcmV0dXJuIFtleHByLCBudWxsXTtcbiAgaWYgKGggPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGNvbnN0IGFyZ3MgPSBvcHMoZXhwcik7XG4gICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBzeW0gPSBzeW1ib2woYXJnc1thcmdzLmxlbmd0aCAtIDJdKTtcbiAgICAgIGlmIChzeW0gPT09IFwiZFwiIHx8IHN5bSA9PT0gXCJkX3VwcmlnaHRcIikge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpXG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBzeW1ib2woYXJnc1sxXSldO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDMpXG4gICAgICAgICAgcmV0dXJuIFthcmdzWzBdLCBzeW1ib2woYXJnc1syXSldO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFtcIk11bHRpcGx5XCIsIC4uLmFyZ3Muc2xpY2UoMCwgLTIpXSxcbiAgICAgICAgICBzeW1ib2woYXJnc1thcmdzLmxlbmd0aCAtIDFdKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgY29uc3QgW2ZuMiwgaW5kZXhdID0gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKGFyZ3NbYXJncy5sZW5ndGggLSAxXSk7XG4gICAgICBpZiAoZm4yKVxuICAgICAgICByZXR1cm4gW1tcIk11bHRpcGx5XCIsIC4uLmFyZ3Muc2xpY2UoMCwgLTEpLCBmbjJdLCBpbmRleF07XG4gICAgfVxuICB9IGVsc2UgaWYgKGggPT09IFwiRGVsaW1pdGVyXCIpIHtcbiAgICBjb25zdCBbZm4yLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24ob3AxMik7XG4gICAgaWYgKGluZGV4KSB7XG4gICAgICBpZiAoIWZuMilcbiAgICAgICAgcmV0dXJuIFtudWxsLCBpbmRleF07XG4gICAgICByZXR1cm4gW1tcIkRlbGltaXRlclwiLCBmbjIsIC4uLm9wcyhleHByKS5zbGljZSgxKV0sIGluZGV4XTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaCA9PT0gXCJBZGRcIikge1xuICAgIGNvbnN0IGFyZ3MgPSBvcHMoZXhwcik7XG4gICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbZm4yLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24oYXJnc1thcmdzLmxlbmd0aCAtIDFdKTtcbiAgICAgIGlmIChpbmRleCkge1xuICAgICAgICBpZiAoZm4yKVxuICAgICAgICAgIHJldHVybiBbW1wiQWRkXCIsIC4uLmFyZ3Muc2xpY2UoMCwgLTEpLCBmbjJdLCBpbmRleF07XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgcmV0dXJuIFtbXCJBZGRcIiwgLi4uYXJncy5zbGljZSgwLCAtMSldLCBpbmRleF07XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgcmV0dXJuIFthcmdzWzBdLCBpbmRleF07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGggPT09IFwiTmVnYXRlXCIpIHtcbiAgICBjb25zdCBbZm4yLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24ob3AxMik7XG4gICAgaWYgKGluZGV4KVxuICAgICAgcmV0dXJuIFtmbjIgPyBbXCJOZWdhdGVcIiwgZm4yXSA6IG51bGwsIGluZGV4XTtcbiAgfSBlbHNlIGlmIChoID09PSBcIkRpdmlkZVwiKSB7XG4gICAgY29uc3QgW2ZuMiwgaW5kZXhdID0gcGFyc2VJbnRlZ3JhbEJvZHlFeHByZXNzaW9uKG9wMTIpO1xuICAgIGlmIChpbmRleClcbiAgICAgIHJldHVybiBbW1wiRGl2aWRlXCIsIGZuMiA/PyAxLCBvcChleHByLCAyKV0sIGluZGV4XTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhcmdzID0gb3BzKGV4cHIpO1xuICAgIGlmIChhcmdzPy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFthcmcyLCBpbmRleF0gPSBwYXJzZUludGVncmFsQm9keUV4cHJlc3Npb24oYXJnc1swXSk7XG4gICAgICBpZiAoaW5kZXgpXG4gICAgICAgIHJldHVybiBbW2hlYWQoZXhwciksIGFyZzJdLCBpbmRleF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXhwciwgbnVsbF07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVJbnRlZ3JhbChjb21tYW5kKSB7XG4gIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4ge1xuICAgIGlmICghb3AoZXhwciwgMSkpXG4gICAgICByZXR1cm4gY29tbWFuZDtcbiAgICBsZXQgYXJnID0gb3AoZXhwciwgMik7XG4gICAgY29uc3QgaCA9IGhlYWQoYXJnKTtcbiAgICBsZXQgaW5kZXhFeHByID0gbnVsbDtcbiAgICBpZiAoaCA9PT0gXCJUdXBsZVwiIHx8IGggPT09IFwiVHJpcGxlXCIgfHwgaCA9PT0gXCJQYWlyXCIgfHwgaCA9PT0gXCJTaW5nbGVcIikge1xuICAgICAgaW5kZXhFeHByID0gb3AoYXJnLCAxKTtcbiAgICB9IGVsc2UgaWYgKGggPT09IFwiSG9sZFwiKSB7XG4gICAgICBpbmRleEV4cHIgPSBvcChhcmcsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleEV4cHIgPSBvcChhcmcsIDEpID8/IFwieFwiO1xuICAgICAgYXJnID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhlYWQoaW5kZXhFeHByKSA9PT0gXCJIb2xkXCIpXG4gICAgICBpbmRleEV4cHIgPSBvcChpbmRleEV4cHIsIDEpO1xuICAgIGNvbnN0IGluZGV4ID0gaW5kZXhFeHByICE9PSBudWxsID8gc3ltYm9sKGluZGV4RXhwcikgOiBudWxsO1xuICAgIGxldCBmbiA9IG9wKGV4cHIsIDEpO1xuICAgIGlmIChoZWFkKGZuKSA9PT0gXCJMYW1iZGFcIiAmJiBvcChmbiwgMSkpXG4gICAgICBmbiA9IHN1YnMob3AoZm4sIDEpLCB7IF86IGluZGV4ID8/IFwieFwiLCBfMTogaW5kZXggPz8gXCJ4XCIgfSk7XG4gICAgaWYgKCFhcmcpIHtcbiAgICAgIGlmICghaW5kZXggfHwgaW5kZXggPT09IFwiTm90aGluZ1wiKVxuICAgICAgICByZXR1cm4gam9pbkxhdGV4KFtjb21tYW5kLCBcIlxcXFwhXCIsIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZuKV0pO1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIFwiXFxcXCFcIixcbiAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoZm4pLFxuICAgICAgICBcIlxcXFwsXFxcXG9wZXJhdG9ybmFtZXtkfVwiLFxuICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleClcbiAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCBzdWJTeW1ib2wgPSBvcChhcmcsIDIpID8gc3ltYm9sKG9wKGFyZywgMikpIDogbnVsbDtcbiAgICBsZXQgc3ViMiA9IGFyZyAmJiBzdWJTeW1ib2wgIT09IFwiTm90aGluZ1wiID8gc2VyaWFsaXplci5zZXJpYWxpemUob3AoYXJnLCAyKSkgOiBcIlwiO1xuICAgIGlmIChzdWIyLmxlbmd0aCA+IDApXG4gICAgICBzdWIyID0gYF97JHtzdWIyfX1gO1xuICAgIGxldCBzdXAgPSBcIlwiO1xuICAgIGNvbnN0IHN1cFN5bWJvbCA9IG9wKGFyZywgMykgPyBzeW1ib2wob3AoYXJnLCAzKSkgOiBudWxsO1xuICAgIGlmIChvcChhcmcsIDMpICYmIHN1cFN5bWJvbCAhPT0gXCJOb3RoaW5nXCIpXG4gICAgICBzdXAgPSBgXnske3NlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGFyZywgMykpfX1gO1xuICAgIHJldHVybiBqb2luTGF0ZXgoW1xuICAgICAgY29tbWFuZCxcbiAgICAgIHN1cCxcbiAgICAgIHN1YjIsXG4gICAgICBcIlxcXFwhXCIsXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShmbiksXG4gICAgICAuLi5pbmRleCAmJiBzeW1ib2woaW5kZXgpICE9PSBcIk5vdGhpbmdcIiA/IFtcIlxcXFwsXFxcXG9wZXJhdG9ybmFtZXtkfVwiLCBzZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleCldIDogW11cbiAgICBdKTtcbiAgfTtcbn1cbnZhciBERUZJTklUSU9OU19DQUxDVUxVUyA9IFtcbiAge1xuICAgIGtpbmQ6IFwiZXhwcmVzc2lvblwiLFxuICAgIG5hbWU6IFwiSW50ZWdyYXRlXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcaW50XCJdLFxuICAgIHBhcnNlOiBwYXJzZUludGVncmFsKFwiSW50ZWdyYXRlXCIpLFxuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplSW50ZWdyYWwoXCJcXFxcaW50XCIpXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImV4cHJlc3Npb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpaW50XCJdLFxuICAgIHBhcnNlOiBwYXJzZUludGVncmFsKFwiSW50ZWdyYXRlXCIsIDIpXG4gIH0sXG4gIHtcbiAgICBraW5kOiBcImV4cHJlc3Npb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxpaWludFwiXSxcbiAgICBwYXJzZTogcGFyc2VJbnRlZ3JhbChcIkludGVncmF0ZVwiLCAzKVxuICB9LFxuICB7XG4gICAga2luZDogXCJleHByZXNzaW9uXCIsXG4gICAgbmFtZTogXCJDaXJjdWxhckludGVncmF0ZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG9pbnRcIl0sXG4gICAgcGFyc2U6IHBhcnNlSW50ZWdyYWwoXCJDaXJjdWxhckludGVncmF0ZVwiKSxcbiAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZUludGVncmFsKFwiXFxcXG9pbnRcIilcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwiZXhwcmVzc2lvblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG9paW50XCJdLFxuICAgIHBhcnNlOiBwYXJzZUludGVncmFsKFwiQ2lyY3VsYXJJbnRlZ3JhdGVcIiwgMilcbiAgfSxcbiAge1xuICAgIGtpbmQ6IFwiZXhwcmVzc2lvblwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXG9paWludFwiXSxcbiAgICBwYXJzZTogcGFyc2VJbnRlZ3JhbChcIkNpcmN1bGFySW50ZWdyYXRlXCIsIDMpXG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1zeW1ib2xzLnRzXG52YXIgU1lNQk9MUyA9IFtcbiAgLy8gR3JlZWtcbiAgW1wiYWxwaGFcIiwgXCJcXFxcYWxwaGFcIiwgOTQ1XSxcbiAgW1wiYmV0YVwiLCBcIlxcXFxiZXRhXCIsIDk0Nl0sXG4gIFtcImdhbW1hXCIsIFwiXFxcXGdhbW1hXCIsIDk0N10sXG4gIFtcImRlbHRhXCIsIFwiXFxcXGRlbHRhXCIsIDk0OF0sXG4gIFtcImVwc2lsb25cIiwgXCJcXFxcZXBzaWxvblwiLCA5NDldLFxuICBbXCJlcHNpbG9uU3ltYm9sXCIsIFwiXFxcXHZhcmVwc2lsb25cIiwgMTAxM10sXG4gIC8vIEdSRUVLIExVTkFURSBFUFNJTE9OIFNZTUJPTFxuICBbXCJ6ZXRhXCIsIFwiXFxcXHpldGFcIiwgOTUwXSxcbiAgW1wiZXRhXCIsIFwiXFxcXGV0YVwiLCA5NTFdLFxuICBbXCJ0aGV0YVwiLCBcIlxcXFx0aGV0YVwiLCA5NTJdLFxuICBbXCJ0aGV0YVN5bWJvbFwiLCBcIlxcXFx2YXJ0aGV0YVwiLCA5NzddLFxuICAvLyBVbmljb2RlIEdSRUVLIFRIRVRBIFNZTUJPTFxuICBbXCJpb3RhXCIsIFwiXFxcXGlvdGFcIiwgOTUzXSxcbiAgW1wia2FwcGFcIiwgXCJcXFxca2FwcGFcIiwgOTU0XSxcbiAgW1wia2FwcGFTeW1ib2xcIiwgXCJcXFxcdmFya2FwcGFcIiwgMTAwOF0sXG4gIC8vIEdSRUVLIEtBUFBBIFNZTUJPTFxuICBbXCJsYW1iZGFcIiwgXCJcXFxcbGFtYmRhXCIsIDk1NV0sXG4gIFtcIm11XCIsIFwiXFxcXG11XCIsIDk1Nl0sXG4gIFtcIm51XCIsIFwiXFxcXG51XCIsIDk1N10sXG4gIFtcInhpXCIsIFwiXFxcXHhpXCIsIDk1OF0sXG4gIFtcIm9taWNyb25cIiwgXCJcXFxcb21pY3JvblwiLCA5NTldLFxuICBbXCJwaVwiLCBcIlxcXFxwaVwiLCA5NjBdLFxuICBbXCJwaVN5bWJvbFwiLCBcIlxcXFx2YXJwaVwiLCA5ODJdLFxuICAvLyBHUkVFSyBQSSBTWU1CT0xcbiAgW1wicmhvXCIsIFwiXFxcXHJob1wiLCA5NjFdLFxuICBbXCJyaG9TeW1ib2xcIiwgXCJcXFxcdmFycmhvXCIsIDEwMDldLFxuICAvLyBHUkVFSyBSSE8gU1lNQk9MXG4gIFtcInNpZ21hXCIsIFwiXFxcXHNpZ21hXCIsIDk2M10sXG4gIFtcImZpbmFsU2lnbWFcIiwgXCJcXFxcdmFyc2lnbWFcIiwgOTYyXSxcbiAgLy9HUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUFcbiAgW1widGF1XCIsIFwiXFxcXHRhdVwiLCA5NjRdLFxuICBbXCJwaGlcIiwgXCJcXFxccGhpXCIsIDk4MV0sXG4gIC8vIE5vdGUgR1JFRUsgUEhJIFNZTUJPTCwgYnV0IGNvbW1vbiB1c2FnZSBpbiBtYXRoXG4gIFtcInBoaUxldHRlclwiLCBcIlxcXFx2YXJwaGlcIiwgOTY2XSxcbiAgW1widXBzaWxvblwiLCBcIlxcXFx1cHNpbG9uXCIsIDk2NV0sXG4gIFtcImNoaVwiLCBcIlxcXFxjaGlcIiwgOTY3XSxcbiAgW1wicHNpXCIsIFwiXFxcXHBzaVwiLCA5NjhdLFxuICBbXCJvbWVnYVwiLCBcIlxcXFxvbWVnYVwiLCA5NjldLFxuICBbXCJBbHBoYVwiLCBcIlxcXFxBbHBoYVwiLCA5MTNdLFxuICBbXCJCZXRhXCIsIFwiXFxcXEJldGFcIiwgOTE0XSxcbiAgW1wiR2FtbWFcIiwgXCJcXFxcR2FtbWFcIiwgOTE1XSxcbiAgW1wiRGVsdGFcIiwgXCJcXFxcRGVsdGFcIiwgOTE2XSxcbiAgW1wiRXBzaWxvblwiLCBcIlxcXFxFcHNpbG9uXCIsIDkxN10sXG4gIFtcIlpldGFcIiwgXCJcXFxcWmV0YVwiLCA5MThdLFxuICBbXCJFdGFcIiwgXCJcXFxcRXRhXCIsIDkxOV0sXG4gIFtcIlRoZXRhXCIsIFwiXFxcXFRoZXRhXCIsIDkyMF0sXG4gIFtcIklvdGFcIiwgXCJcXFxcSW90YVwiLCA5MjFdLFxuICBbXCJLYXBwYVwiLCBcIlxcXFxLYXBwYVwiLCA5MjJdLFxuICBbXCJMYW1iZGFcIiwgXCJcXFxcTGFtYmRhXCIsIDkyM10sXG4gIFtcIk11XCIsIFwiXFxcXE11XCIsIDkyNF0sXG4gIFtcIk51XCIsIFwiXFxcXE51XCIsIDkyNV0sXG4gIFtcIlhpXCIsIFwiXFxcXFhpXCIsIDkyNl0sXG4gIFtcIk9taWNyb25cIiwgXCJcXFxcT21pY3JvblwiLCA5MjddLFxuICAvLyBbJ1BpJywgJ1xcXFxQaScsIDB4MDNhMF0sXG4gIFtcIlJob1wiLCBcIlxcXFxSaG9cIiwgOTI5XSxcbiAgW1wiU2lnbWFcIiwgXCJcXFxcU2lnbWFcIiwgOTMxXSxcbiAgW1wiVGF1XCIsIFwiXFxcXFRhdVwiLCA5MzJdLFxuICBbXCJQaGlcIiwgXCJcXFxcUGhpXCIsIDkzNF0sXG4gIFtcIlVwc2lsb25cIiwgXCJcXFxcVXBzaWxvblwiLCA5MzNdLFxuICBbXCJDaGlcIiwgXCJcXFxcQ2hpXCIsIDkzNV0sXG4gIFtcIlBzaVwiLCBcIlxcXFxQc2lcIiwgOTM2XSxcbiAgW1wiT21lZ2FcIiwgXCJcXFxcT21lZ2FcIiwgOTM3XSxcbiAgW1wiZGlnYW1tYVwiLCBcIlxcXFxkaWdhbW1hXCIsIDk4OV0sXG4gIC8vIEhlYnJld1xuICBbXCJhbGVwaFwiLCBcIlxcXFxhbGVwaFwiLCA4NTAxXSxcbiAgLy8gVW5pY29kZSBBTEVGIFNZTUJPTFxuICBbXCJiZXRcIiwgXCJcXFxcYmV0aFwiLCA4NTAyXSxcbiAgW1wiZ2ltZWxcIiwgXCJcXFxcZ2ltZWxcIiwgODUwM10sXG4gIFtcImRhbGV0XCIsIFwiXFxcXGRhbGV0aFwiLCA4NTA0XSxcbiAgLy8gTGV0dGVyLWxpa2VcbiAgW1wiZWxsXCIsIFwiXFxcXGVsbFwiLCA4NDk5XSxcbiAgLy8gVW5pY29kZSBTQ1JJUFQgU01BTEwgTFxuICBbXCJ0dXJuZWRDYXBpdGFsRlwiLCBcIlxcXFxGaW52XCIsIDg0OThdLFxuICAvLyBVbmljb2RlIFRVUk5FRCBDQVBJVEFMIEYnXG4gIFtcInR1cm5lZENhcGl0YWxHXCIsIFwiXFxcXEdhbWVcIiwgODUxM10sXG4gIC8vIFRVUk5FRCBTQU5TLVNFUklGIENBUElUQUwgR1xuICBbXCJ3ZWllcnN0cmFzc1wiLCBcIlxcXFx3cFwiLCA4NDcyXSxcbiAgLy8gVW5pY29kZSBTQ1JJUFQgQ0FQSVRBTCBQXG4gIFtcImV0aFwiLCBcIlxcXFxldGhcIiwgMjQwXSxcbiAgW1wiaW52ZXJ0ZWRPaG1cIiwgXCJcXFxcbWhvXCIsIDg0ODddLFxuICAvLyBVbmljb2RlIElOVkVSVEVEIE9ITSBTSUdOXG4gIFtcImhCYXJcIiwgXCJcXFxcaGJhclwiLCAyOTVdLFxuICAvLyBVbmljb2RlIExBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggU1RST0tFXG4gIFtcImhTbGFzaFwiLCBcIlxcXFxoc2xhc2hcIiwgODQ2M10sXG4gIC8vIFVuaWNvZGUgUExBTkNLIENPTlNUQU5UIE9WRVIgVFdPIFBJXG4gIC8vIFN5bWJvbHNcbiAgW1wiYmxhY2tDbHViU3VpdFwiLCBcIlxcXFxjbHVic3VpdFwiLCA5ODI3XSxcbiAgW1wid2hpdGVIZWFydFN1aXRcIiwgXCJcXFxcaGVhcnRzdWl0XCIsIDk4MjVdLFxuICBbXCJibGFja1NwYWRlU3VpdFwiLCBcIlxcXFxzcGFkZXN1aXRcIiwgOTgyNF0sXG4gIFtcIndoaXRlRGlhbW9uZFN1aXRcIiwgXCJcXFxcZGlhbW9uZHN1aXRcIiwgOTgyNl0sXG4gIFtcInNoYXJwXCIsIFwiXFxcXHNoYXJwXCIsIDk4MzldLFxuICBbXCJmbGF0XCIsIFwiXFxcXGZsYXRcIiwgOTgzN10sXG4gIFtcIm5hdHVyYWxcIiwgXCJcXFxcbmF0dXJhbFwiLCA5ODM4XVxuXTtcbnZhciBERUZJTklUSU9OU19TWU1CT0xTID0gW1xuICAuLi5TWU1CT0xTLm1hcCgoW3N5bWJvbDIsIGxhdGV4LCBfY29kZXBvaW50XSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcInN5bWJvbFwiLFxuICAgICAgbmFtZTogc3ltYm9sMixcbiAgICAgIGxhdGV4VHJpZ2dlcjogW2xhdGV4XSxcbiAgICAgIHBhcnNlOiBzeW1ib2wyXG4gICAgfTtcbiAgfSksXG4gIC4uLlNZTUJPTFMubWFwKChbc3ltYm9sMiwgX2xhdGV4LCBjb2RlcG9pbnRdKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgICBsYXRleFRyaWdnZXI6IFtTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpXSxcbiAgICAgIHBhcnNlOiBzeW1ib2wyXG4gICAgfTtcbiAgfSlcbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1jb21wbGV4LnRzXG52YXIgREVGSU5JVElPTlNfQ09NUExFWCA9IFtcbiAge1xuICAgIG5hbWU6IFwiUmVhbFwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIixcbiAgICBsYXRleFRyaWdnZXI6IFtcIlxcXFxSZVwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJJbWFnaW5hcnlcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcSW1cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiQXJndW1lbnRcIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgbGF0ZXhUcmlnZ2VyOiBbXCJcXFxcYXJnXCJdXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIkNvbmp1Z2F0ZVwiLFxuICAgIGxhdGV4VHJpZ2dlcjogW1wiXlwiLCBcIlxcXFxzdGFyXCJdLFxuICAgIGtpbmQ6IFwicG9zdGZpeFwiXG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvZGljdGlvbmFyeS9kZWZpbml0aW9ucy1zdGF0aXN0aWNzLnRzXG52YXIgREVGSU5JVElPTlNfU1RBVElTVElDUyA9IFtcbiAge1xuICAgIG5hbWU6IFwiTWVhblwiLFxuICAgIGtpbmQ6IFwiZnVuY3Rpb25cIixcbiAgICBpZGVudGlmaWVyVHJpZ2dlcjogXCJtZWFuXCJcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiTWVkaWFuXCIsXG4gICAga2luZDogXCJmdW5jdGlvblwiLFxuICAgIGlkZW50aWZpZXJUcmlnZ2VyOiBcIm1lZGlhblwiXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIlN0YW5kYXJEZXZpYXRpb25cIixcbiAgICBraW5kOiBcImZ1bmN0aW9uXCIsXG4gICAgaWRlbnRpZmllclRyaWdnZXI6IFwic3RkZGV2XCJcbiAgfSxcbiAge1xuICAgIGxhdGV4VHJpZ2dlcjogW1wiXFxcXGJhclwiXSxcbiAgICBraW5kOiBcImV4cHJlc3Npb25cIixcbiAgICBwYXJzZTogKHBhcnNlciwgX3VudGlsKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gcGFyc2VyLnBhcnNlR3JvdXAoKSA/PyBwYXJzZXIucGFyc2VUb2tlbigpO1xuICAgICAgaWYgKCFleHByIHx8ICFzeW1ib2woZXhwcikpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFtcIk1lYW5cIiwgZXhwcl07XG4gICAgfVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L2RpY3Rpb25hcnkvZGVmaW5pdGlvbnMudHNcbnZhciBERUZBVUxUX0RFTElNSVRFUiA9IHtcbiAgXCIoXCI6IFwiKFwiLFxuICBcIilcIjogXCIpXCIsXG4gIFwiW1wiOiBcIlxcXFxsYnJhY2tcIixcbiAgXCJdXCI6IFwiXFxcXHJicmFja1wiLFxuICBcIntcIjogXCJcXFxcbGJyYWNlXCIsXG4gIFwifVwiOiBcIlxcXFxyYnJhY2VcIixcbiAgXCI8XCI6IFwiXFxcXGxhbmdsZVwiLFxuICBcIj5cIjogXCJcXFxccmFuZ2xlXCIsXG4gIFwifFwiOiBcIlxcXFx2ZXJ0XCIsXG4gIFwifHxcIjogXCJcXFxcVmVydFwiLFxuICBcIlxcXFxsY2VpbFwiOiBcIlxcXFxsY2VpbFwiLFxuICBcIlxcXFxsZmxvb3JcIjogXCJcXFxcbGZsb29yXCIsXG4gIFwiXFxcXHJjZWlsXCI6IFwiXFxcXHJjZWlsXCIsXG4gIFwiXFxcXHJmbG9vclwiOiBcIlxcXFxyZmxvb3JcIlxufTtcbmZ1bmN0aW9uIGFkZEVudHJ5KHJlc3VsdCwgZW50cnksIG9uRXJyb3IpIHtcbiAgY29uc3QgaW5kZXhlZEVudHJ5ID0gbWFrZUluZGV4ZWRFbnRyeShlbnRyeSwgb25FcnJvcik7XG4gIGlmIChpbmRleGVkRW50cnkgPT09IG51bGwpXG4gICAgcmV0dXJuO1xuICBjb25zdCBraW5kID0gXCJraW5kXCIgaW4gZW50cnkgPyBlbnRyeS5raW5kIDogXCJleHByZXNzaW9uXCI7XG4gIGNvbnN0IGxhdGV4VHJpZ2dlciA9IGluZGV4ZWRFbnRyeS5sYXRleFRyaWdnZXI7XG4gIGlmICh0eXBlb2YgbGF0ZXhUcmlnZ2VyID09PSBcInN0cmluZ1wiKVxuICAgIHJlc3VsdC5sb29rYWhlYWQgPSBNYXRoLm1heChyZXN1bHQubG9va2FoZWFkLCBjb3VudFRva2VucyhsYXRleFRyaWdnZXIpKTtcbiAgY29uc3QgdG9rZW5zVHJpZ2dlciA9IHRva2VuaXplKGxhdGV4VHJpZ2dlciA/PyBcIlwiLCBbXSk7XG4gIGlmIChsYXRleFRyaWdnZXI/LlsxXSA9PT0gXCJcXFxccHJpbWVcIilcbiAgICA7XG4gIGlmICh0b2tlbnNUcmlnZ2VyLmxlbmd0aCA9PT0gMiAmJiAvW19eXS8udGVzdCh0b2tlbnNUcmlnZ2VyWzBdKSAmJiB0b2tlbnNUcmlnZ2VyWzFdICE9PSBcIjx7PlwiICYmIGtpbmQgIT09IFwiZnVuY3Rpb25cIiAmJiBraW5kICE9PSBcImVudmlyb25tZW50XCIgJiYga2luZCAhPT0gXCJtYXRjaGZpeFwiKSB7XG4gICAgbGV0IHBhcnNlID0gZW50cnkucGFyc2U7XG4gICAgaWYgKCFwYXJzZSAmJiBlbnRyeS5uYW1lKSB7XG4gICAgICBpZiAoa2luZCA9PT0gXCJwb3N0Zml4XCIgfHwga2luZCA9PT0gXCJwcmVmaXhcIilcbiAgICAgICAgcGFyc2UgPSAoX3BhcnNlciwgZXhwcikgPT4gW2VudHJ5Lm5hbWUsIGV4cHJdO1xuICAgICAgZWxzZVxuICAgICAgICBwYXJzZSA9IGVudHJ5Lm5hbWU7XG4gICAgfVxuICAgIGFkZEVudHJ5KFxuICAgICAgcmVzdWx0LFxuICAgICAge1xuICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAga2luZCxcbiAgICAgICAgbmFtZTogdm9pZCAwLFxuICAgICAgICBzZXJpYWxpemU6IHZvaWQgMCxcbiAgICAgICAgcGFyc2UsXG4gICAgICAgIGxhdGV4VHJpZ2dlcjogW3Rva2Vuc1RyaWdnZXJbMF0sIFwiPHs+XCIsIHRva2Vuc1RyaWdnZXJbMV0sIFwiPH0+XCJdXG4gICAgICB9LFxuICAgICAgb25FcnJvclxuICAgICk7XG4gIH1cbiAgcmVzdWx0LmRlZnMucHVzaChpbmRleGVkRW50cnkpO1xuICBpZiAoaW5kZXhlZEVudHJ5Lm5hbWUgIT09IHZvaWQgMCkge1xuICAgIGlmIChyZXN1bHQuaWRzLmhhcyhpbmRleGVkRW50cnkubmFtZSkpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIGluZGV4ZWRFbnRyeS5uYW1lLFxuICAgICAgICAgIFwiRHVwbGljYXRlIGRlZmluaXRpb24uIFRoZSBuYW1lIChNYXRoSlNPTiBpZGVudGlmaWVyKSBtdXN0IGJlIHVuaXF1ZSwgYnV0IHRyaWdnZXJzIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgZGVmaW5pdGlvbnMuXCJcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlc3VsdC5pZHMuc2V0KGluZGV4ZWRFbnRyeS5uYW1lLCBpbmRleGVkRW50cnkpO1xuICB9XG59XG5mdW5jdGlvbiBpbmRleExhdGV4RGljdGlvbmFyeShkaWMsIG9uRXJyb3IpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGxvb2thaGVhZDogMSxcbiAgICBpZHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgZGVmczogW11cbiAgfTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBkaWMpXG4gICAgYWRkRW50cnkocmVzdWx0LCBlbnRyeSwgb25FcnJvcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYWtlSW5kZXhlZEVudHJ5KGVudHJ5LCBvbkVycm9yKSB7XG4gIGlmICghaXNWYWxpZEVudHJ5KGVudHJ5LCBvbkVycm9yKSlcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGtpbmQ6IFwia2luZFwiIGluIGVudHJ5ID8gZW50cnkua2luZCA6IFwiZXhwcmVzc2lvblwiXG4gIH07XG4gIGxldCB0b2tlbnNUcmlnZ2VyID0gbnVsbDtcbiAgaWYgKFwibGF0ZXhUcmlnZ2VyXCIgaW4gZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5LmxhdGV4VHJpZ2dlciA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHRva2Vuc1RyaWdnZXIgPSB0b2tlbml6ZShlbnRyeS5sYXRleFRyaWdnZXIsIFtdKTtcbiAgICBlbHNlXG4gICAgICB0b2tlbnNUcmlnZ2VyID0gZW50cnkubGF0ZXhUcmlnZ2VyO1xuICB9XG4gIGxldCBpZFRyaWdnZXIgPSBudWxsO1xuICBpZiAoXCJpZGVudGlmaWVyVHJpZ2dlclwiIGluIGVudHJ5KSB7XG4gICAgaWRUcmlnZ2VyID0gZW50cnkuaWRlbnRpZmllclRyaWdnZXI7XG4gIH1cbiAgaWYgKHRva2Vuc1RyaWdnZXIgIT09IG51bGwpXG4gICAgcmVzdWx0LmxhdGV4VHJpZ2dlciA9IHRva2Vuc1RvU3RyaW5nKHRva2Vuc1RyaWdnZXIpO1xuICBpZiAoaWRUcmlnZ2VyICE9PSBudWxsKVxuICAgIHJlc3VsdC5pZGVudGlmaWVyVHJpZ2dlciA9IGlkVHJpZ2dlcjtcbiAgaWYgKGVudHJ5Lm5hbWUpIHtcbiAgICByZXN1bHQubmFtZSA9IGVudHJ5Lm5hbWU7XG4gICAgcmVzdWx0LnNlcmlhbGl6ZSA9IG1ha2VTZXJpYWxpemVIYW5kbGVyKGVudHJ5LCB0b2tlbnNUcmlnZ2VyLCBpZFRyaWdnZXIpO1xuICB9XG4gIGlmIChyZXN1bHQua2luZCA9PT0gXCJtYXRjaGZpeFwiICYmIGlzTWF0Y2hmaXhFbnRyeShlbnRyeSkpIHtcbiAgICByZXN1bHQub3BlbkRlbGltaXRlciA9IGVudHJ5Lm9wZW5UcmlnZ2VyO1xuICAgIHJlc3VsdC5jbG9zZURlbGltaXRlciA9IGVudHJ5LmNsb3NlVHJpZ2dlcjtcbiAgfVxuICBpZiAocmVzdWx0LmtpbmQgPT09IFwic3ltYm9sXCIgJiYgaXNTeW1ib2xFbnRyeShlbnRyeSkpIHtcbiAgICByZXN1bHQucHJlY2VkZW5jZSA9IGVudHJ5LnByZWNlZGVuY2UgPz8gMWU0O1xuICB9XG4gIGlmICgocmVzdWx0LmtpbmQgPT09IFwicHJlZml4XCIgfHwgcmVzdWx0LmtpbmQgPT09IFwicG9zdGZpeFwiKSAmJiAoaXNQcmVmaXhFbnRyeShlbnRyeSkgfHwgaXNQb3N0Zml4RW50cnkoZW50cnkpKSkge1xuICAgIGlmICh0b2tlbnNUcmlnZ2VyICYmICh0b2tlbnNUcmlnZ2VyWzBdID09PSBcIl5cIiB8fCB0b2tlbnNUcmlnZ2VyWzBdID09PSBcIl9cIikpIHtcbiAgICAgIHJlc3VsdC5wcmVjZWRlbmNlID0gNzIwO1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICBlbnRyeS5wcmVjZWRlbmNlID09PSB2b2lkIDAsXG4gICAgICAgIFwiJ3ByZWNlZGVuY2UnIGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQgd2l0aCBeIGFuZCBfIHRyaWdnZXJzXCJcbiAgICAgICk7XG4gICAgfSBlbHNlXG4gICAgICByZXN1bHQucHJlY2VkZW5jZSA9IGVudHJ5LnByZWNlZGVuY2UgPz8gMWU0O1xuICB9XG4gIGlmIChyZXN1bHQua2luZCA9PT0gXCJpbmZpeFwiICYmIGlzSW5maXhFbnRyeShlbnRyeSkpIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICAhdG9rZW5zVHJpZ2dlciB8fCB0b2tlbnNUcmlnZ2VyWzBdICE9PSBcIl5cIiAmJiB0b2tlbnNUcmlnZ2VyWzBdICE9PSBcIl9cIiB8fCAhZW50cnkuYXNzb2NpYXRpdml0eSB8fCBlbnRyeS5hc3NvY2lhdGl2aXR5ID09PSBcIm5vblwiXG4gICAgKTtcbiAgICByZXN1bHQuYXNzb2NpYXRpdml0eSA9IGVudHJ5LmFzc29jaWF0aXZpdHkgPz8gXCJub25cIjtcbiAgICByZXN1bHQucHJlY2VkZW5jZSA9IGVudHJ5LnByZWNlZGVuY2UgPz8gMWU0O1xuICB9XG4gIGNvbnN0IHBhcnNlID0gbWFrZVBhcnNlSGFuZGxlcihlbnRyeSwgdG9rZW5zVHJpZ2dlciwgaWRUcmlnZ2VyKTtcbiAgaWYgKHBhcnNlKVxuICAgIHJlc3VsdC5wYXJzZSA9IHBhcnNlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFrZVNlcmlhbGl6ZUhhbmRsZXIoZW50cnksIGxhdGV4VHJpZ2dlciwgaWRUcmlnZ2VyKSB7XG4gIGlmICh0eXBlb2YgZW50cnkuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIGVudHJ5LnNlcmlhbGl6ZTtcbiAgY29uc3Qga2luZCA9IGVudHJ5W1wia2luZFwiXSA/PyBcImV4cHJlc3Npb25cIjtcbiAgaWYgKGtpbmQgPT09IFwiZW52aXJvbm1lbnRcIikge1xuICAgIGNvbnN0IGVudk5hbWUgPSBlbnRyeVtcImlkZW50aWZpZXJUcmlnZ2VyXCJdID8/IGVudHJ5Lm5hbWUgPz8gXCJ1bmtub3duXCI7XG4gICAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBqb2luTGF0ZXgoW1xuICAgICAgYFxcXFxiZWdpbnske2Vudk5hbWV9fWAsXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSksXG4gICAgICBgXFxcXGVuZHske2Vudk5hbWV9fWBcbiAgICBdKTtcbiAgfVxuICBpZiAoaXNNYXRjaGZpeEVudHJ5KGVudHJ5KSkge1xuICAgIGNvbnN0IG9wZW5EZWxpbSA9IHR5cGVvZiBlbnRyeS5vcGVuVHJpZ2dlciA9PT0gXCJzdHJpbmdcIiA/IERFRkFVTFRfREVMSU1JVEVSW2VudHJ5Lm9wZW5UcmlnZ2VyXSA6IHRva2Vuc1RvU3RyaW5nKGVudHJ5W1wib3BlbkRlbGltaXRlclwiXSk7XG4gICAgY29uc3QgY2xvc2VEZWxpbSA9IHR5cGVvZiBlbnRyeS5jbG9zZVRyaWdnZXIgPT09IFwic3RyaW5nXCIgPyBERUZBVUxUX0RFTElNSVRFUltlbnRyeS5jbG9zZVRyaWdnZXJdIDogdG9rZW5zVG9TdHJpbmcoZW50cnlbXCJjbG9zZURlbGltaXRlclwiXSk7XG4gICAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBqb2luTGF0ZXgoW29wZW5EZWxpbSwgc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLCBjbG9zZURlbGltXSk7XG4gIH1cbiAgbGV0IGxhdGV4ID0gZW50cnkuc2VyaWFsaXplO1xuICBpZiAobGF0ZXggPT09IHZvaWQgMCAmJiBsYXRleFRyaWdnZXIpXG4gICAgbGF0ZXggPSB0b2tlbnNUb1N0cmluZyhsYXRleFRyaWdnZXIpO1xuICBpZiAobGF0ZXgpIHtcbiAgICBpZiAoa2luZCA9PT0gXCJwb3N0Zml4XCIpXG4gICAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChbc2VyaWFsaXplci5zZXJpYWxpemUob3AoZXhwciwgMSkpLCBsYXRleF0pO1xuICAgIGlmIChraW5kID09PSBcInByZWZpeFwiKVxuICAgICAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBqb2luTGF0ZXgoW2xhdGV4LCBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSldKTtcbiAgICBpZiAoa2luZCA9PT0gXCJpbmZpeFwiKSB7XG4gICAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChcbiAgICAgICAgKG9wcyhleHByKSA/PyBbXSkuZmxhdE1hcChcbiAgICAgICAgICAodmFsLCBpKSA9PiBpIDwgbm9wcyhleHByKSAtIDEgPyBbc2VyaWFsaXplci5zZXJpYWxpemUodmFsKSwgbGF0ZXhdIDogW3NlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbCldXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4gaGVhZChleHByKSA/IGpvaW5MYXRleChbbGF0ZXgsIHNlcmlhbGl6ZXIud3JhcEFyZ3VtZW50cyhleHByKV0pIDogbGF0ZXg7XG4gIH1cbiAgY29uc3QgaWQgPSBpZFRyaWdnZXIgPz8gZW50cnkubmFtZSA/PyBcInVua25vd25cIjtcbiAgaWYgKGtpbmQgPT09IFwicG9zdGZpeFwiKVxuICAgIHJldHVybiAoc2VyaWFsaXplciwgZXhwcikgPT4gam9pbkxhdGV4KFtcbiAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wKGV4cHIsIDEpKSxcbiAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplU3ltYm9sKGlkKVxuICAgIF0pO1xuICBpZiAoa2luZCA9PT0gXCJwcmVmaXhcIilcbiAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChbXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVN5bWJvbChpZCksXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSlcbiAgICBdKTtcbiAgaWYgKGtpbmQgPT09IFwiaW5maXhcIilcbiAgICByZXR1cm4gKHNlcmlhbGl6ZXIsIGV4cHIpID0+IGpvaW5MYXRleChbXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAxKSksXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVN5bWJvbChpZCksXG4gICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShvcChleHByLCAyKSlcbiAgICBdKTtcbiAgcmV0dXJuIChzZXJpYWxpemVyLCBleHByKSA9PiBoZWFkKGV4cHIpID8gam9pbkxhdGV4KFtcbiAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZVN5bWJvbChpZCksXG4gICAgc2VyaWFsaXplci53cmFwQXJndW1lbnRzKGV4cHIpXG4gIF0pIDogc2VyaWFsaXplci5zZXJpYWxpemVTeW1ib2woaWQpO1xufVxuZnVuY3Rpb24gbWFrZVBhcnNlSGFuZGxlcihlbnRyeSwgbGF0ZXhUcmlnZ2VyLCBpZFRyaWdnZXIpIHtcbiAgaWYgKFwicGFyc2VcIiBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkucGFyc2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gZW50cnkucGFyc2U7XG4gIGNvbnN0IGtpbmQgPSBcImtpbmRcIiBpbiBlbnRyeSA/IGVudHJ5LmtpbmQgOiBcImV4cHJlc3Npb25cIjtcbiAgaWYgKGtpbmQgPT09IFwiZW52aXJvbm1lbnRcIikge1xuICAgIGNvbnN0IGVudk5hbWUgPSBlbnRyeS5wYXJzZSA/PyBlbnRyeS5uYW1lID8/IGlkVHJpZ2dlcjtcbiAgICBpZiAoZW52TmFtZSlcbiAgICAgIHJldHVybiAocGFyc2VyLCBfdW50aWwpID0+IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBwYXJzZXIucGFyc2VUYWJ1bGFyKCk7XG4gICAgICAgIGlmIChhcnJheSA9PT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtlbnZOYW1lLCBbXCJMaXN0XCIsIGFycmF5Lm1hcCgocm93KSA9PiBbXCJMaXN0XCIsIC4uLnJvd10pXV07XG4gICAgICB9O1xuICB9XG4gIGlmIChraW5kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBmbk5hbWUgPSBlbnRyeS5wYXJzZSA/PyBlbnRyeS5uYW1lID8/IGlkVHJpZ2dlcjtcbiAgICBpZiAoZm5OYW1lKVxuICAgICAgcmV0dXJuIChwYXJzZXIsIHVudGlsKSA9PiB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYXJzZXIucGFyc2VBcmd1bWVudHMoXCJlbmNsb3N1cmVcIiwgdW50aWwpO1xuICAgICAgICByZXR1cm4gYXJncyA9PT0gbnVsbCA/IGZuTmFtZSA6IFtmbk5hbWUsIC4uLmFyZ3NdO1xuICAgICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gXCJzeW1ib2xcIikge1xuICAgIGNvbnN0IHN5bU5hbWUgPSBlbnRyeS5wYXJzZSA/PyBlbnRyeS5uYW1lID8/IGlkVHJpZ2dlcjtcbiAgICBpZiAoc3ltTmFtZSlcbiAgICAgIHJldHVybiAoX3BhcnNlciwgX3Rlcm1pbmF0b3IpID0+IHN5bU5hbWU7XG4gIH1cbiAgaWYgKGtpbmQgPT09IFwicHJlZml4XCIpIHtcbiAgICBjb25zdCBoID0gZW50cnkucGFyc2UgPz8gZW50cnkubmFtZSA/PyBpZFRyaWdnZXI7XG4gICAgaWYgKGgpIHtcbiAgICAgIGNvbnN0IHByZWMgPSBlbnRyeVtcInByZWNlZGVuY2VcIl0gPz8gMWU0O1xuICAgICAgcmV0dXJuIChwYXJzZXIsIHVudGlsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJocyA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oe1xuICAgICAgICAgIC4uLnVudGlsID8/IFtdLFxuICAgICAgICAgIG1pblByZWM6IHByZWNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByaHMgPT09IG51bGwgPyBudWxsIDogW2gsIHJoc107XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gXCJwb3N0Zml4XCIpIHtcbiAgICBjb25zdCBoID0gZW50cnkucGFyc2UgPz8gZW50cnkubmFtZTtcbiAgICBpZiAoaClcbiAgICAgIHJldHVybiAoX3BhcnNlciwgbGhzKSA9PiBsaHMgPT09IG51bGwgPyBudWxsIDogW2gsIGxoc107XG4gIH1cbiAgaWYgKGtpbmQgPT09IFwiaW5maXhcIikge1xuICAgIGlmICgvW19eXS8udGVzdChsYXRleFRyaWdnZXI/LlswXSA/PyBcIlwiKSkge1xuICAgICAgY29uc3QgaDIgPSBlbnRyeS5uYW1lID8/IGVudHJ5LnBhcnNlO1xuICAgICAgcmV0dXJuIChfcGFyc2VyLCBhcmcpID0+IFtcbiAgICAgICAgaDIsXG4gICAgICAgIG1pc3NpbmdJZkVtcHR5KG9wKGFyZywgMSkpLFxuICAgICAgICBtaXNzaW5nSWZFbXB0eShvcChhcmcsIDIpKVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgaCA9IGVudHJ5LnBhcnNlID8/IGVudHJ5Lm5hbWUgPz8gaWRUcmlnZ2VyO1xuICAgIGNvbnN0IHByZWMgPSBlbnRyeVtcInByZWNlZGVuY2VcIl0gPz8gMWU0O1xuICAgIGNvbnN0IGFzc29jaWF0aXZpdHkgPSBlbnRyeVtcImFzc29jaWF0aXZpdHlcIl0gPz8gXCJub25cIjtcbiAgICBpZiAoaClcbiAgICAgIHJldHVybiAocGFyc2VyLCBsaHMsIHVudGlsKSA9PiB7XG4gICAgICAgIGlmIChsaHMgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChwcmVjIDwgdW50aWwubWluUHJlYylcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmhzID0gbWlzc2luZ0lmRW1wdHkoXG4gICAgICAgICAgcGFyc2VyLnBhcnNlRXhwcmVzc2lvbih7IC4uLnVudGlsLCBtaW5QcmVjOiBwcmVjIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIiA/IGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihoLCBsaHMsIHJocywgYXNzb2NpYXRpdml0eSkgOiBbaCwgbGhzLCByaHNdO1xuICAgICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gXCJtYXRjaGZpeFwiKSB7XG4gICAgY29uc3QgaCA9IGVudHJ5LnBhcnNlID8/IGVudHJ5Lm5hbWU7XG4gICAgaWYgKGgpXG4gICAgICByZXR1cm4gKF9wYXJzZXIsIGJvZHkpID0+IHtcbiAgICAgICAgaWYgKGJvZHkgPT09IG51bGwgfHwgaXNFbXB0eVNlcXVlbmNlKGJvZHkpKVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW2gsIGJvZHldO1xuICAgICAgfTtcbiAgfVxuICBpZiAoa2luZCA9PT0gXCJleHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGVudHJ5LnBhcnNlID8/IGVudHJ5Lm5hbWUgPz8gaWRUcmlnZ2VyO1xuICAgIGlmIChwYXJzZVJlc3VsdClcbiAgICAgIHJldHVybiAoKSA9PiBwYXJzZVJlc3VsdDtcbiAgfVxuICBpZiAoXCJwYXJzZVwiIGluIGVudHJ5KSB7XG4gICAgY29uc3QgcGFyc2VSZXN1bHQgPSBlbnRyeS5wYXJzZTtcbiAgICByZXR1cm4gKCkgPT4gcGFyc2VSZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRFbnRyeShlbnRyeSwgb25FcnJvcikge1xuICBsZXQgc3ViamVjdCA9IGVudHJ5Lm5hbWUgPz8gZW50cnlbXCJsYXRleFRyaWdnZXJcIl0gPz8gZW50cnlbXCJpZGVudGlmaWVyVHJpZ2dlclwiXSA/PyBlbnRyeVtcIm9wZW5EZWxpbWl0ZXJcIl07XG4gIGlmICghc3ViamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBzdWJqZWN0ID0gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN1YmplY3QgPSBcIj8/P1wiO1xuICAgIH1cbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShzdWJqZWN0KSlcbiAgICBzdWJqZWN0ID0gdG9rZW5zVG9TdHJpbmcoc3ViamVjdCk7XG4gIGlmIChcInRyaWdnZXJcIiBpbiBlbnRyeSkge1xuICAgIG9uRXJyb3Ioe1xuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogW1xuICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICBgVGhlICd0cmlnZ2VyJyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLiBVc2UgJ2xhdGV4VHJpZ2dlcicgb3IgJ2lkZW50aWZpZXJUcmlnZ2VyJyBpbnN0ZWFkYFxuICAgICAgXVxuICAgIH0pO1xuICB9XG4gIGlmIChcImtpbmRcIiBpbiBlbnRyeSAmJiAhW1xuICAgIFwiZXhwcmVzc2lvblwiLFxuICAgIFwic3ltYm9sXCIsXG4gICAgXCJmdW5jdGlvblwiLFxuICAgIFwiaW5maXhcIixcbiAgICBcInBvc3RmaXhcIixcbiAgICBcInByZWZpeFwiLFxuICAgIFwibWF0Y2hmaXhcIixcbiAgICBcImVudmlyb25tZW50XCJcbiAgXS5pbmNsdWRlcyhlbnRyeS5raW5kKSkge1xuICAgIG9uRXJyb3Ioe1xuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogW1xuICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICBgVGhlICdraW5kJyBwcm9wZXJ0eSBtdXN0IGJlIG9uZSBvZiAnZXhwcmVzc2lvbicsICdzeW1ib2wnLCAnZnVuY3Rpb24nLCAnaW5maXgnLCAncG9zdGZpeCcsICdwcmVmaXgnLCAnbWF0Y2hmaXgnLCAnZW52aXJvbm1lbnQnYFxuICAgICAgXVxuICAgIH0pO1xuICB9XG4gIGlmIChlbnRyeS5zZXJpYWxpemUgIT09IHZvaWQgMCAmJiAhZW50cnkubmFtZSkge1xuICAgIG9uRXJyb3Ioe1xuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTogW1xuICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICBgQSAnbmFtZScgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCBpZiBhICdzZXJpYWxpemUnIGhhbmRsZXIgaXMgcHJvdmlkZWRgXG4gICAgICBdXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChcImlkZW50aWZpZXJUcmlnZ2VyXCIgaW4gZW50cnkpIHtcbiAgICBpZiAodHlwZW9mIGVudHJ5LmlkZW50aWZpZXJUcmlnZ2VyICE9PSBcInN0cmluZ1wiIHx8ICFpc1ZhbGlkSWRlbnRpZmllcihlbnRyeS5pZGVudGlmaWVyVHJpZ2dlcikpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgYFRoZSAnaWRlbnRpZmllclRyaWdnZXInIHByb3BlcnR5IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyYFxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKFwibmFtZVwiIGluIGVudHJ5KSB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeS5uYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoZW50cnkubmFtZSAhPT0gdm9pZCAwKVxuICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgICAgXCJpbnZhbGlkLWRpY3Rpb25hcnktZW50cnlcIixcbiAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICBgVGhlICduYW1lJyBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nYFxuICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaXNWYWxpZElkZW50aWZpZXIoZW50cnkubmFtZSkpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIGVudHJ5Lm5hbWUsXG4gICAgICAgICAgYFRoZSAnbmFtZScgcHJvcGVydHkgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJgXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoaXNNYXRjaGZpeEVudHJ5KGVudHJ5KSkge1xuICAgIGlmIChcImxhdGV4VHJpZ2dlclwiIGluIGVudHJ5IHx8IFwiaWRlbnRpZmllclRyaWdnZXJcIiBpbiBpc1ByZWZpeEVudHJ5KSB7XG4gICAgICBvbkVycm9yKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICBtZXNzYWdlOiBbXG4gICAgICAgICAgXCJpbnZhbGlkLWRpY3Rpb25hcnktZW50cnlcIixcbiAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgIGAnbWF0Y2hmaXgnIG9wZXJhdG9ycyB1c2UgYSAnb3BlbkRlbGltaXRlcicgYW5kICdjbG9zZURlbGltaXRlcicgaW5zdGVhZCBvZiBhICdsYXRleFRyaWdnZXInIG9yICdpZGVudGlmaWVyVHJpZ2dlcicuIGBcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZW50cnkub3BlblRyaWdnZXIgfHwgIWVudHJ5LmNsb3NlVHJpZ2dlcikge1xuICAgICAgb25FcnJvcih7XG4gICAgICAgIHNldmVyaXR5OiBcIndhcm5pbmdcIixcbiAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgIFwiaW52YWxpZC1kaWN0aW9uYXJ5LWVudHJ5XCIsXG4gICAgICAgICAgc3ViamVjdCxcbiAgICAgICAgICBcIkV4cGVjdGVkIGBvcGVuRGVsaW1pdGVyYCBhbmQgYSBgY2xvc2VEZWxpbWl0ZXJgIGZvciBtYXRjaGZpeCBvcGVyYXRvclwiXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVudHJ5Lm9wZW5UcmlnZ2VyICE9PSB0eXBlb2YgZW50cnkuY2xvc2VUcmlnZ2VyKSB7XG4gICAgICBvbkVycm9yKHtcbiAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICBtZXNzYWdlOiBbXG4gICAgICAgICAgXCJpbnZhbGlkLWRpY3Rpb25hcnktZW50cnlcIixcbiAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgIFwiRXhwZWN0ZWQgYG9wZW5EZWxpbWl0ZXJgIGFuZCBgY2xvc2VEZWxpbWl0ZXJgIHRvIGJvdGggYmUgc3RyaW5ncyBvciBhcnJheSBvZiBMYXRleFRva2VuXCJcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0luZml4RW50cnkoZW50cnkpIHx8IGlzUG9zdGZpeEVudHJ5KGVudHJ5KSB8fCBpc1ByZWZpeEVudHJ5KGVudHJ5KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5LmxhdGV4VHJpZ2dlcikgJiYgKGVudHJ5LmxhdGV4VHJpZ2dlclswXSA9PT0gXCJfXCIgfHwgZW50cnkubGF0ZXhUcmlnZ2VyWzBdID09PSBcIl5cIikgfHwgdHlwZW9mIGVudHJ5LmxhdGV4VHJpZ2dlciA9PT0gXCJzdHJpbmdcIiAmJiAoZW50cnkubGF0ZXhUcmlnZ2VyLnN0YXJ0c1dpdGgoXCJeXCIpIHx8IGVudHJ5LmxhdGV4VHJpZ2dlci5zdGFydHNXaXRoKFwiX1wiKSkpIHtcbiAgICAgIGlmIChlbnRyeS5wcmVjZWRlbmNlICE9PSB2b2lkIDAgfHwgZW50cnlbXCJhc3NvY2lhdGl2aXR5XCJdICE9PSB2b2lkIDApIHtcbiAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICAgIFwiaW52YWxpZC1kaWN0aW9uYXJ5LWVudHJ5XCIsXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgXCJwcmVjZWRlbmNlXCIgb3IgXCJhc3NvY2lhdGl2aXR5XCIgZm9yIHN1cGVyc2NyaXB0L3N1YnNjcmlwdCBvcGVyYXRvcmBcbiAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbnRyeS5wcmVjZWRlbmNlID09PSB2b2lkIDApIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgYEV4cGVjdGVkIGEgXCJwcmVjZWRlbmNlXCIgZm9yICR7ZW50cnkua2luZH0gb3BlcmF0b3JgXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZW50cnlbXCJhc3NvY2lhdGl2aXR5XCJdICE9PSB2b2lkIDApIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgJ1VuZXhwZWN0ZWQgXCJhc3NvY2lhdGl2aXR5XCIgb3BlcmF0b3InXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzTWF0Y2hmaXhFbnRyeShlbnRyeSkgJiYgIWlzRW52aXJvbm1lbnRFbnRyeShlbnRyeSkpIHtcbiAgICBpZiAoIWVudHJ5LmxhdGV4VHJpZ2dlciAmJiAhZW50cnkuaWRlbnRpZmllclRyaWdnZXIgJiYgIWVudHJ5Lm5hbWUpIHtcbiAgICAgIG9uRXJyb3Ioe1xuICAgICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICBcImludmFsaWQtZGljdGlvbmFyeS1lbnRyeVwiLFxuICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgYEV4cGVjdGVkIGEgJ25hbWUnLCBhICdsYXRleFRyaWdnZXInIG9yIGEgJ2lkZW50aWZpZXJUcmlnZ2VyJ2BcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChlbnRyeVtcInBhcnNlXCJdID09PSB2b2lkIDAgJiYgZW50cnkubmFtZSA9PT0gdm9pZCAwKSB7XG4gICAgb25FcnJvcih7XG4gICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICBtZXNzYWdlOiBbXG4gICAgICAgIFwiaW52YWxpZC1kaWN0aW9uYXJ5LWVudHJ5XCIsXG4gICAgICAgIHN1YmplY3QsXG4gICAgICAgIGBFeHBlY3RlZCBhICdwYXJzZScgb3IgJ25hbWUnYFxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbnZhciBERUZBVUxUX0xBVEVYX0RJQ1RJT05BUlkgPSB7XG4gIGFsZ2VicmE6IERFRklOSVRJT05TX0FMR0VCUkEsXG4gIGFyaXRobWV0aWM6IERFRklOSVRJT05TX0FSSVRITUVUSUMsXG4gIGNhbGN1bHVzOiBERUZJTklUSU9OU19DQUxDVUxVUyxcbiAgY29tcGxleDogREVGSU5JVElPTlNfQ09NUExFWCxcbiAgY29yZTogREVGSU5JVElPTlNfQ09SRSxcbiAgbG9naWM6IERFRklOSVRJT05TX0xPR0lDLFxuICByZWxvcDogREVGSU5JVElPTlNfSU5FUVVBTElUSUVTLFxuICBvdGhlcjogREVGSU5JVElPTlNfT1RIRVJTLFxuICBwaHlzaWNzOiBbXG4gICAge1xuICAgICAgbmFtZTogXCJtdTBcIixcbiAgICAgIGtpbmQ6IFwic3ltYm9sXCIsXG4gICAgICBsYXRleFRyaWdnZXI6IFwiXFxcXG11XzBcIlxuICAgIH1cbiAgXSxcbiAgc2V0czogREVGSU5JVElPTlNfU0VUUyxcbiAgc3RhdGlzdGljczogREVGSU5JVElPTlNfU1RBVElTVElDUyxcbiAgc3ltYm9sczogREVGSU5JVElPTlNfU1lNQk9MUyxcbiAgdHJpZ29ub21ldHJ5OiBERUZJTklUSU9OU19UUklHT05PTUVUUllcbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvcGFyc2UtaWRlbnRpZmllci50c1xudmFyIElERU5USUZJRVJfUFJFRklYID0ge1xuICAvLyBUaG9zZSBhcmUgXCJncm91cGluZ1wiIHByZWZpeCB0aGF0IGFsc28gc3BlY2lmeSBzcGFjaW5nXG4gIC8vIGFyb3VuZCB0aGUgc3ltYm9sLiBXZSBpZ25vcmUgdGhlIHNwYWNpbmcsIHRob3VnaC5cbiAgXCJcXFxcbWF0aG9yZFwiOiBcIlwiLFxuICBcIlxcXFxtYXRob3BcIjogXCJcIixcbiAgXCJcXFxcbWF0aGJpblwiOiBcIlwiLFxuICBcIlxcXFxtYXRocmVsXCI6IFwiXCIsXG4gIFwiXFxcXG1hdGhvcGVuXCI6IFwiXCIsXG4gIFwiXFxcXG1hdGhjbG9zZVwiOiBcIlwiLFxuICBcIlxcXFxtYXRocHVuY3RcIjogXCJcIixcbiAgXCJcXFxcbWF0aGlubmVyXCI6IFwiXCIsXG4gIC8vIFRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gc3BlY2lmeSBhbiBpZGVudGlmaWVyXG4gIC8vIGl0IGRlZmluZXMgYm90aCBzcGFjaW5nIGFuZCBmb250LiBCeSBkZWZhdWx0LCBpZGVudGlmaWVyc1xuICAvLyBhcmUgd3JhcHBlciB3aXRoIGBcXFxcb3BlcmF0b3JuYW1le31gLlxuICBcIlxcXFxvcGVyYXRvcm5hbWVcIjogXCJcIixcbiAgLy8gVGhlc2Ugc3R5bGluZyBjb21tYW5kcyBhcmUgdXNlZCB0byBjaGFuZ2UgdGhlIGZvbnQgb2YgYW4gaWRlbnRpZmllclxuICAvLyBUaGV5IG1heSBiZSBwcm9ibGVtYXRpYywgYXMgYWRqYWNlbnQgaWRlbnRpZmllcnMgbWF5IGJlIG1lcmdlZFxuICAvLyBpbnRvIGEgc2luZ2xlIGlkZW50aWZpZXIgd2hlbiB1c2VkIGluIGVkaXRvcnMsIHN1Y2ggYSBNYXRoTGl2ZS5cbiAgLy8gRm9yIGV4YW1wbGUgYFxcbWF0aHJte3NwZWVkfVxcbWF0aHJte3NvdW5kfWAgY2FuIGJlIGNvbmZ1c2VkIHdpdGggYFxcbWF0aHJte3NwZWVkc291bmR9YFxuICBcIlxcXFxtYXRocm1cIjogXCJfdXByaWdodFwiLFxuICBcIlxcXFxtYXRoaXRcIjogXCJfaXRhbGljXCIsXG4gIFwiXFxcXG1hdGhiZlwiOiBcIl9ib2xkXCIsXG4gIFwiXFxcXG1hdGhzY3JcIjogXCJfc2NyaXB0XCIsXG4gIFwiXFxcXG1hdGhjYWxcIjogXCJfY2FsbGlncmFwaGljXCIsXG4gIFwiXFxcXG1hdGhmcmFrXCI6IFwiX2ZyYWt0dXJcIixcbiAgXCJcXFxcbWF0aHNmXCI6IFwiX3NhbnNzZXJpZlwiLFxuICBcIlxcXFxtYXRodHRcIjogXCJfbW9ub3NwYWNlXCIsXG4gIFwiXFxcXG1hdGhiYlwiOiBcIl9kb3VibGVzdHJ1Y2tcIlxufTtcbnZhciBJREVOVElGSUVSX01PRElGSUVSID0ge1xuICBcIlxcXFxtYXRocmluZ1wiOiBcIl9yaW5nXCIsXG4gIFwiXFxcXGhhdFwiOiBcIl9oYXRcIixcbiAgXCJcXFxcdGlsZGVcIjogXCJfdGlsZGVcIixcbiAgXCJcXFxcdmVjXCI6IFwiX3ZlY1wiLFxuICBcIlxcXFxvdmVybGluZVwiOiBcIl9iYXJcIixcbiAgXCJcXFxcdW5kZXJsaW5lXCI6IFwiX3VuZGVyYmFyXCIsXG4gIFwiXFxcXGRvdFwiOiBcIl9kb3RcIixcbiAgXCJcXFxcZGRvdFwiOiBcIl9kZG90XCIsXG4gIFwiXFxcXGRkZG90XCI6IFwiX2RkZG90XCIsXG4gIFwiXFxcXGRkZGRvdFwiOiBcIl9kZGRkb3RcIixcbiAgXCJcXFxcYWN1dGVcIjogXCJfYWN1dGVcIixcbiAgXCJcXFxcZ3JhdmVcIjogXCJfZ3JhdmVcIixcbiAgXCJcXFxcYnJldmVcIjogXCJfYnJldmVcIixcbiAgXCJcXFxcY2hlY2tcIjogXCJfY2hlY2tcIlxufTtcbmZ1bmN0aW9uIHBhcnNlSWRlbnRpZmllclRva2VuKHBhcnNlciwgb3B0aW9ucykge1xuICBpZiAocGFyc2VyLmF0RW5kKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCB0b2tlbiA9IHBhcnNlci5wZWVrO1xuICBsZXQgc3BlY2lhbCA9IHtcbiAgICBcIlxcXFxfXCI6IFwiX1wiLFxuICAgIFwiXFxcXCNcIjogXCJoYXNoXCJcbiAgfVt0b2tlbl07XG4gIGlmICghc3BlY2lhbCAmJiAhb3B0aW9ucy50b3BsZXZlbCkge1xuICAgIHNwZWNpYWwgPSB7XG4gICAgICBcIitcIjogXCJwbHVzXCIsXG4gICAgICBcIi1cIjogXCJtaW51c1wiLFxuICAgICAgXCJcXFxccGx1c21uXCI6IFwicG1cIixcbiAgICAgIFwiXFxcXHBtXCI6IFwicG1cIixcbiAgICAgIFwiXFxcXGFzdFwiOiBcImFzdFwiLFxuICAgICAgXCJcXFxcZGFnXCI6IFwiZGFnXCIsXG4gICAgICBcIlxcXFxkZGFnXCI6IFwiZGRhZ1wiLFxuICAgICAgXCJcXFxcYm90XCI6IFwiYm90dG9tXCIsXG4gICAgICBcIlxcXFx0b3BcIjogXCJ0b3BcIixcbiAgICAgIFwiXFxcXGJ1bGxldFwiOiBcImJ1bGxldFwiLFxuICAgICAgXCJcXFxcY2lyXCI6IFwiY2lyY2xlXCIsXG4gICAgICBcIlxcXFxkaWFtb25kXCI6IFwiZGlhbW9uZFwiLFxuICAgICAgXCJcXFxcdGltZXNcIjogXCJ0aW1lc1wiLFxuICAgICAgXCJcXFxcc3F1YXJlXCI6IFwic3F1YXJlXCIsXG4gICAgICBcIlxcXFxzdGFyXCI6IFwic3RhclwiXG4gICAgfVt0b2tlbl07XG4gIH1cbiAgaWYgKHNwZWNpYWwpIHtcbiAgICBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgcmV0dXJuIHNwZWNpYWw7XG4gIH1cbiAgY29uc3QgaSA9IFNZTUJPTFMuZmluZEluZGV4KCh4KSA9PiB4WzFdID09PSB0b2tlbik7XG4gIGlmIChpID49IDApIHtcbiAgICBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgcmV0dXJuIFNZTUJPTFNbaV1bMF07XG4gIH1cbiAgcmV0dXJuIHBhcnNlci5tYXRjaENoYXIoKSA/PyBwYXJzZXIubmV4dFRva2VuKCk7XG59XG5mdW5jdGlvbiBwYXJzZUlkZW50aWZpZXJCb2R5KHBhcnNlcikge1xuICBsZXQgaWQgPSBtYXRjaFByZWZpeGVkSWRlbnRpZmllcihwYXJzZXIpO1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgY29uc3QgcHJlZml4ID0gSURFTlRJRklFUl9NT0RJRklFUltwYXJzZXIucGVla10gPz8gbnVsbDtcbiAgaWYgKHByZWZpeCkge1xuICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICBpZiAoIXBhcnNlci5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IHBhcnNlSWRlbnRpZmllckJvZHkocGFyc2VyKTtcbiAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCAhcGFyc2VyLm1hdGNoKFwiPH0+XCIpKSB7XG4gICAgICBwYXJzZXIuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZCA9IGAke2JvZHl9JHtwcmVmaXh9YDtcbiAgfVxuICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICBpZCA9IFwiXCI7XG4gICAgd2hpbGUgKCFwYXJzZXIuYXRFbmQpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gcGFyc2VyLnBlZWs7XG4gICAgICBpZiAodG9rZW4gPT09IFwiPH0+XCIgfHwgdG9rZW4gPT09IFwiX1wiIHx8IHRva2VuID09PSBcIl5cIilcbiAgICAgICAgYnJlYWs7XG4gICAgICBjb25zdCBuZXh0ID0gcGFyc2VJZGVudGlmaWVyVG9rZW4ocGFyc2VyLCB7IHRvcGxldmVsOiBmYWxzZSB9KTtcbiAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlkICs9IG5leHQ7XG4gICAgfVxuICAgIHdoaWxlICghcGFyc2VyLmF0RW5kICYmIC9cXGQvLnRlc3QocGFyc2VyLnBlZWspKVxuICAgICAgaWQgKz0gcGFyc2VyLm5leHRUb2tlbigpO1xuICB9XG4gIHdoaWxlICghcGFyc2VyLmF0RW5kKSB7XG4gICAgaWYgKHBhcnNlci5tYXRjaChcIlxcXFxkZWdyZWVcIikpXG4gICAgICBpZCArPSBcIl9kZWdcIjtcbiAgICBlbHNlIGlmIChwYXJzZXIubWF0Y2hBbGwoW1wiXlwiLCBcIlxcXFxwcmltZVwiXSkpXG4gICAgICBpZCArPSBcIl9wcmltZVwiO1xuICAgIGVsc2UgaWYgKHBhcnNlci5tYXRjaEFsbChbXCJeXCIsIFwiPHs+XCIsIFwiXFxcXHByaW1lXCIsIFwiPH0+XCJdKSlcbiAgICAgIGlkICs9IFwiX3ByaW1lXCI7XG4gICAgZWxzZSBpZiAocGFyc2VyLm1hdGNoQWxsKFtcIl5cIiwgXCI8ez5cIiwgXCJcXFxcZG91YmxlcHJpbWVcIiwgXCI8fT5cIl0pKVxuICAgICAgaWQgKz0gXCJfZHByaW1lXCI7XG4gICAgZWxzZSBpZiAocGFyc2VyLm1hdGNoQWxsKFtcIl5cIiwgXCI8ez5cIiwgXCJcXFxccHJpbWVcIiwgXCJcXFxccHJpbWVcIiwgXCI8fT5cIl0pKVxuICAgICAgaWQgKz0gXCJfZHByaW1lXCI7XG4gICAgZWxzZVxuICAgICAgYnJlYWs7XG4gIH1cbiAgY29uc3Qgc3VwcyA9IFtdO1xuICBjb25zdCBzdWJzMiA9IFtdO1xuICB3aGlsZSAoIXBhcnNlci5hdEVuZCkge1xuICAgIGlmIChwYXJzZXIubWF0Y2goXCJfXCIpKSB7XG4gICAgICBjb25zdCBoYXNCcmFjZSA9IHBhcnNlci5tYXRjaChcIjx7PlwiKTtcbiAgICAgIGNvbnN0IHN1YjIgPSBwYXJzZUlkZW50aWZpZXJCb2R5KHBhcnNlcik7XG4gICAgICBpZiAoaGFzQnJhY2UgJiYgIXBhcnNlci5tYXRjaChcIjx9PlwiKSB8fCBzdWIyID09PSBudWxsKSB7XG4gICAgICAgIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN1YnMyLnB1c2goc3ViMik7XG4gICAgfSBlbHNlIGlmIChwYXJzZXIubWF0Y2goXCJeXCIpKSB7XG4gICAgICBjb25zdCBoYXNCcmFjZSA9IHBhcnNlci5tYXRjaChcIjx7PlwiKTtcbiAgICAgIGNvbnN0IHN1cCA9IHBhcnNlSWRlbnRpZmllckJvZHkocGFyc2VyKTtcbiAgICAgIGlmIChoYXNCcmFjZSAmJiAhcGFyc2VyLm1hdGNoKFwiPH0+XCIpIHx8IHN1cCA9PT0gbnVsbCkge1xuICAgICAgICBwYXJzZXIuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBzdXBzLnB1c2goc3VwKTtcbiAgICB9IGVsc2VcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmIChzdXBzLmxlbmd0aCA+IDApXG4gICAgaWQgKz0gXCJfX1wiICsgc3Vwcy5qb2luKFwiXCIpO1xuICBpZiAoc3ViczIubGVuZ3RoID4gMClcbiAgICBpZCArPSBcIl9cIiArIHN1YnMyLmpvaW4oXCJcIik7XG4gIHJldHVybiBpZDtcbn1cbmZ1bmN0aW9uIG1hdGNoUHJlZml4ZWRJZGVudGlmaWVyKHBhcnNlcikge1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgY29uc3QgcHJlZml4ID0gSURFTlRJRklFUl9QUkVGSVhbcGFyc2VyLnBlZWtdID8/IG51bGw7XG4gIGlmIChwcmVmaXggPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgaWYgKHBhcnNlci5tYXRjaChcIjx7PlwiKSkge1xuICAgIGxldCBib2R5ID0gXCJcIjtcbiAgICBjb25zdCBkaWdpdCA9IHtcbiAgICAgIDA6IFwiemVyb1wiLFxuICAgICAgMTogXCJvbmVcIixcbiAgICAgIDI6IFwidHdvXCIsXG4gICAgICAzOiBcInRocmVlXCIsXG4gICAgICA0OiBcImZvdXJcIixcbiAgICAgIDU6IFwiZml2ZVwiLFxuICAgICAgNjogXCJzaXhcIixcbiAgICAgIDc6IFwic2V2ZW5cIixcbiAgICAgIDg6IFwiZWlnaHRcIixcbiAgICAgIDk6IFwibmluZVwiXG4gICAgfVtwYXJzZXIucGVla10gPz8gXCJcIjtcbiAgICBpZiAoZGlnaXQpIHtcbiAgICAgIGJvZHkgPSBkaWdpdDtcbiAgICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICB9XG4gICAgYm9keSArPSBwYXJzZUlkZW50aWZpZXJCb2R5KHBhcnNlcik7XG4gICAgaWYgKGJvZHkgPT09IG51bGwgfHwgIXBhcnNlci5tYXRjaChcIjx9PlwiKSkge1xuICAgICAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHByZWZpeCA9PT0gXCJfdXByaWdodFwiICYmIGJvZHkubGVuZ3RoID4gMSlcbiAgICAgIHJldHVybiBib2R5O1xuICAgIHJldHVybiBib2R5ICsgcHJlZml4O1xuICB9XG4gIHBhcnNlci5pbmRleCA9IHN0YXJ0O1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlSW52YWxpZElkZW50aWZpZXIocGFyc2VyKSB7XG4gIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLmluZGV4O1xuICBjb25zdCBpZCA9IG1hdGNoUHJlZml4ZWRJZGVudGlmaWVyKHBhcnNlcik7XG4gIGlmIChpZCA9PT0gbnVsbCB8fCBpc1ZhbGlkSWRlbnRpZmllcihpZCkpIHtcbiAgICBwYXJzZXIuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcGFyc2VyLmVycm9yKFxuICAgIFtcImludmFsaWQtaWRlbnRpZmllclwiLCB7IHN0cjogdmFsaWRhdGVJZGVudGlmaWVyKGlkKSB9XSxcbiAgICBzdGFydFxuICApO1xufVxuZnVuY3Rpb24gcGFyc2VJZGVudGlmaWVyKHBhcnNlcikge1xuICBpZiAoL15bYS16QS1aXSQvLnRlc3QocGFyc2VyLnBlZWspIHx8IC9eXFxwe1hJRFN9JC91LnRlc3QocGFyc2VyLnBlZWspKVxuICAgIHJldHVybiBwYXJzZXIubmV4dFRva2VuKCk7XG4gIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLmluZGV4O1xuICBsZXQgaWQgPSBtYXRjaFByZWZpeGVkSWRlbnRpZmllcihwYXJzZXIpO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBcIlwiO1xuICAgIHdoaWxlICghcGFyc2VyLmF0RW5kICYmIE9OTFlfRU1PSklTLnRlc3QoaWQgKyBwYXJzZXIucGVlaykpXG4gICAgICBpZCArPSBwYXJzZXIubmV4dFRva2VuKCk7XG4gICAgaWYgKCFpZClcbiAgICAgIGlkID0gbnVsbDtcbiAgfVxuICBpZCA/PyAoaWQgPSBwYXJzZUlkZW50aWZpZXJUb2tlbihwYXJzZXIsIHsgdG9wbGV2ZWw6IHRydWUgfSkpO1xuICBpZiAoaWQpIHtcbiAgICBpZCA9IGlkLm5vcm1hbGl6ZSgpO1xuICAgIGlmIChpc1ZhbGlkSWRlbnRpZmllcihpZCkpXG4gICAgICByZXR1cm4gaWQ7XG4gIH1cbiAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L3BhcnNlLnRzXG52YXIgREVMSU1JVEVSX1NIT1JUSEFORCA9IHtcbiAgXCIoXCI6IFtcIlxcXFxscGFyZW5cIiwgXCIoXCJdLFxuICBcIilcIjogW1wiXFxcXHJwYXJlblwiLCBcIilcIl0sXG4gIFwiW1wiOiBbXCJcXFxcbGJyYWNrXCJdLFxuICBcIl1cIjogW1wiXFxcXHJicmFja1wiXSxcbiAgXCI8XCI6IFtcIjxcIiwgXCJcXFxcbGFuZ2xlXCJdLFxuICBcIj5cIjogW1wiPlwiLCBcIlxcXFxyYW5nbGVcIl0sXG4gIFwie1wiOiBbXCJcXFxce1wiLCBcIlxcXFxsYnJhY2VcIl0sXG4gIFwifVwiOiBbXCJcXFxcfVwiLCBcIlxcXFxyYnJhY2VcIl0sXG4gIFwiOlwiOiBbXCI6XCIsIFwiXFxcXGNvbG9uXCJdLFxuICBcInxcIjogW1wifFwiLCBcIlxcXFx8XCIsIFwiXFxcXGx2ZXJ0XCIsIFwiXFxcXHJ2ZXJ0XCJdLFxuICAvL3NwZWNpYWw6ICdcXGx2ZXJ0YCB3aGVuIG9wZW4sIGBcXHJ2ZXJ0YCB3aGVuIGNsb3NlXG4gIFwifHxcIjogW1wifHxcIiwgXCJcXFxcVmVydFwiLCBcIlxcXFxsVmVydFwiLCBcIlxcXFxyVmVydFwiXSxcbiAgLy8gc3BlY2lhbDogYFxcbFZlcnRgIHdoZW4gb3BlbiwgYFxcclZlcnRgIHdoZW4gY2xvc2VcbiAgXCJcXFxcbGZsb29yXCI6IFtcIlxcXFxsZmxvb3JcIl0sXG4gIFwiXFxcXHJmbG9vclwiOiBbXCJcXFxccmZsb29yXCJdLFxuICBcIlxcXFxsY2VpbFwiOiBbXCJcXFxcbGNlaWxcIl0sXG4gIFwiXFxcXHJjZWlsXCI6IFtcIlxcXFxyY2VpbFwiXSxcbiAgXCJcXFxcdWxjb3JuZXJcIjogW1wiXFxcXHVsY29ybmVyXCJdLFxuICBcIlxcXFx1cmNvcm5lclwiOiBbXCJcXFxcdXJjb3JuZXJcIl0sXG4gIFwiXFxcXGxsY29ybmVyXCI6IFtcIlxcXFxsbGNvcm5lclwiXSxcbiAgXCJcXFxcbHJjb3JuZXJcIjogW1wiXFxcXGxyY29ybmVyXCJdLFxuICBcIlxcXFxsZ3JvdXBcIjogW1wiXFxcXGxncm91cFwiXSxcbiAgXCJcXFxccmdyb3VwXCI6IFtcIlxcXFxyZ3JvdXBcIl0sXG4gIFwiXFxcXGxtb3VzdGFjaGVcIjogW1wiXFxcXGxtb3VzdGFjaGVcIl0sXG4gIFwiXFxcXHJtb3VzdGFjaGVcIjogW1wiXFxcXHJtb3VzdGFjaGVcIl1cbn07XG52YXIgT1BFTl9ERUxJTUlURVJfUFJFRklYID0ge1xuICBcIlxcXFxsZWZ0XCI6IFwiXFxcXHJpZ2h0XCIsXG4gIFwiXFxcXGJpZ2xcIjogXCJcXFxcYmlnclwiLFxuICBcIlxcXFxCaWdsXCI6IFwiXFxcXEJpZ3JcIixcbiAgXCJcXFxcYmlnZ2xcIjogXCJcXFxcYmlnZ3JcIixcbiAgXCJcXFxcQmlnZ2xcIjogXCJcXFxcQmlnZ3JcIixcbiAgXCJcXFxcYmlnXCI6IFwiXFxcXGJpZ1wiLFxuICBcIlxcXFxCaWdcIjogXCJcXFxcQmlnXCIsXG4gIFwiXFxcXGJpZ2dcIjogXCJcXFxcYmlnZ1wiLFxuICBcIlxcXFxCaWdnXCI6IFwiXFxcXEJpZ2dcIlxufTtcbnZhciBDTE9TRV9ERUxJTUlURVIgPSB7XG4gIFwiKFwiOiBcIilcIixcbiAgXCJbXCI6IFwiXVwiLFxuICBcIlxcXFx7XCI6IFwiXFxcXH1cIixcbiAgXCJcXFxcbGJyYWNlXCI6IFwiXFxcXHJicmFjZVwiLFxuICBcIlxcXFxscGFyZW5cIjogXCJcXFxccnBhcmVuXCIsXG4gIFwiXFxcXGxhbmdsZVwiOiBcIlxcXFxyYW5nbGVcIixcbiAgXCJcXFxcbGZsb29yXCI6IFwiXFxcXHJmbG9vclwiLFxuICBcIlxcXFxsY2VpbFwiOiBcIlxcXFxyY2VpbFwiLFxuICBcIlxcXFx2ZXJ0XCI6IFwiXFxcXHZlcnRcIixcbiAgXCJcXFxcbHZlcnRcIjogXCJcXFxccnZlcnRcIixcbiAgXCJcXFxcVmVydFwiOiBcIlxcXFxWZXJ0XCIsXG4gIFwiXFxcXGxWZXJ0XCI6IFwiXFxcXHJWZXJ0XCIsXG4gIFwiXFxcXGxicmFja1wiOiBcIlxcXFxyYnJhY2tcIixcbiAgXCJcXFxcdWxjb3JuZXJcIjogXCJcXFxcdXJjb3JuZXJcIixcbiAgXCJcXFxcbGxjb3JuZXJcIjogXCJcXFxcbHJjb3JuZXJcIixcbiAgXCJcXFxcbGdyb3VwXCI6IFwiXFxcXHJncm91cFwiLFxuICBcIlxcXFxsbW91c3RhY2hlXCI6IFwiXFxcXHJtb3VzdGFjaGVcIlxufTtcbnZhciBERUZBVUxUX0xBVEVYX05VTUJFUl9PUFRJT05TID0ge1xuICBwcmVjaXNpb246IDYsXG4gIC8vIHdpdGggbWFjaGluZSBudW1iZXJzLCB1cCB0byAxNSBhc3N1bWluZyAyXjUzIGJpdHMgZmxvYXRpbmcgcG9pbnRzXG4gIHBvc2l0aXZlSW5maW5pdHk6IFwiXFxcXGluZnR5XCIsXG4gIG5lZ2F0aXZlSW5maW5pdHk6IFwiLVxcXFxpbmZ0eVwiLFxuICBub3RBTnVtYmVyOiBcIlxcXFxvcGVyYXRvcm5hbWV7TmFOfVwiLFxuICBkZWNpbWFsTWFya2VyOiBcIi5cIixcbiAgLy8gVXNlIGB7LH1gIGZvciBjb21tYSBhcyBhIGRlY2ltYWwgbWFya2VyXG4gIGdyb3VwU2VwYXJhdG9yOiBcIlxcXFwsXCIsXG4gIC8vIGZvciB0aG91c2FuZHMsIGV0Yy4uLlxuICBleHBvbmVudFByb2R1Y3Q6IFwiXFxcXGNkb3RcIixcbiAgYmVnaW5FeHBvbmVudE1hcmtlcjogXCIxMF57XCIsXG4gIC8vIGNvdWxkIGJlICdlJ1xuICBlbmRFeHBvbmVudE1hcmtlcjogXCJ9XCIsXG4gIG5vdGF0aW9uOiBcImF1dG9cIixcbiAgdHJ1bmNhdGlvbk1hcmtlcjogXCJcXFxcbGRvdHNcIixcbiAgYmVnaW5SZXBlYXRpbmdEaWdpdHM6IFwiXFxcXG92ZXJsaW5le1wiLFxuICBlbmRSZXBlYXRpbmdEaWdpdHM6IFwifVwiLFxuICBpbWFnaW5hcnlVbml0OiBcIlxcXFxpbWFnaW5hcnlJXCIsXG4gIGF2b2lkRXhwb25lbnRzSW5SYW5nZTogWy03LCAyMF1cbn07XG52YXIgREVGQVVMVF9QQVJTRV9MQVRFWF9PUFRJT05TID0ge1xuICBhcHBseUludmlzaWJsZU9wZXJhdG9yOiBcImF1dG9cIixcbiAgc2tpcFNwYWNlOiB0cnVlLFxuICBwYXJzZUFyZ3VtZW50c09mVW5rbm93bkxhdGV4Q29tbWFuZHM6IHRydWUsXG4gIHBhcnNlTnVtYmVyczogdHJ1ZSxcbiAgcGFyc2VVbmtub3duSWRlbnRpZmllcjogKGlkLCBwYXJzZXIpID0+IHBhcnNlci5jb21wdXRlRW5naW5lPy5sb29rdXBGdW5jdGlvbihpZCkgIT09IHZvaWQgMCA/IFwiZnVuY3Rpb25cIiA6IFwic3ltYm9sXCIsXG4gIHByZXNlcnZlTGF0ZXg6IGZhbHNlXG59O1xudmFyIF9QYXJzZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHRva2Vucywgb3B0aW9ucywgZGljdGlvbmFyeTIsIGNvbXB1dGVFbmdpbmUpIHtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAvLyBBIHBhcnNpbmcgYm91bmRhcnkgaXMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgdGhhdCBpbmRpY2F0ZSB0aGF0IGFcbiAgICAvLyByZWN1cnNpdmUgcGFyc2luZyBvcGVyYXRpb24gc2hvdWxkIHN0b3AuXG4gICAgLy8gSW4gYSB0cmFkaXRpb25hbCBwYXJzZXIsIGtlZXBpbmcgdHJhY2sgb2YgcGFyc2luZyBib3VuZGFyaWVzIHdvdWxkXG4gICAgLy8gbm90IGJlIG5lY2Vzc2FyeS4gSG93ZXZlciwgYmVjYXVzZSB3ZSBhdHRlbXB0IHRvIGRlbGl2ZXIgdGhlIGJlc3RcbiAgICAvLyBpbnRlcnByZXRhdGlvbiBvZiBhIHBhcnRpYWwgZXhwcmVzc2lvbiwgYm91bmRhcmllcyBhbGxvdyB1cyB0byBmYWlsXG4gICAgLy8gcGFyc2luZyBtb3JlIGxvY2FsbHkuXG4gICAgLy8gRm9yIGV4YW1wbGUsIGluIGBcXGJlZ2lue2Nhc2VzfSB8IFxcZW5ke2Nhc2VzfWAsIHdpdGhvdXQgYm91bmRhcnlcbiAgICAvLyBkZXRlY3Rpb24sIHRoZSBwYXJzaW5nIG9mIGB8YCB3b3VsZCBhdHRlbXB0IHRvIGdvYmxlIHVwIGBcXGVuZHtjYXNlc31gXG4gICAgLy8gd2hpY2ggd291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gdW5leHBlY3RlZCBjb21tYW5kLCBhbmQgdGhlIHdob2xlIGBcXGJlZ2luYFxuICAgIC8vIHdvdWxkIGJlIHJlamVjdGVkIGFzIGFuIHVuYmFsYW5jZWQgZW52aXJvbm1lbnQuIFdpdGggYFxcZW5ke2Nhc2VzfWAgYXMgYVxuICAgIC8vIGJvdW5kYXJ5LCB0aGUgcGFyc2luZyBvZiB0aGUgYHxgIGFyZ3VtZW50IHN0b3BzIGFzIHNvb24gYXMgaXQgZW5jb3VudGVyc1xuICAgIC8vIHRoZSBgXFxlbmR7Y2FzZXN9YCBhbmQgY2FuIHByb3Blcmx5IHJlcG9ydCBhbiB1bmV4cGVjdGVkIHRva2Ugb24gdGhlIGB8YFxuICAgIC8vIG9ubHkgd2hpbGUgY29ycmVjdGx5IGludGVycHJldGluZyB0aGUgYFxcYmVnaW57Y2FzZXN9Li4uXFxlbmR7Y2FzZXN9YFxuICAgIHRoaXMuX2JvdW5kYXJpZXMgPSBbXTtcbiAgICAvLyBUaG9zZSB0d28gcHJvcGVydGllcyBhcmUgdXNlZCB0byBkZXRlY3QgaW5maW5pdGUgbG9vcHMgd2hpbGUgcGFyc2luZ1xuICAgIHRoaXMuX2xhc3RQZWVrID0gXCJcIjtcbiAgICB0aGlzLl9wZWVrQ291bnRlciA9IDA7XG4gICAgdGhpcy5fdG9rZW5zID0gdG9rZW5zO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfTEFURVhfTlVNQkVSX09QVElPTlMsXG4gICAgICAuLi5ERUZBVUxUX1BBUlNFX0xBVEVYX09QVElPTlMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcbiAgICB0aGlzLl9kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTI7XG4gICAgdGhpcy5jb21wdXRlRW5naW5lID0gY29tcHV0ZUVuZ2luZTtcbiAgICB0aGlzLl9wb3NpdGl2ZUluZmluaXR5VG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLnBvc2l0aXZlSW5maW5pdHksIFtdKTtcbiAgICB0aGlzLl9uZWdhdGl2ZUluZmluaXR5VG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLm5lZ2F0aXZlSW5maW5pdHksIFtdKTtcbiAgICB0aGlzLl9ub3RBTnVtYmVyVG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLm5vdEFOdW1iZXIsIFtdKTtcbiAgICB0aGlzLl9kZWNpbWFsTWFya2VyVG9rZW5zID0gdG9rZW5pemUodGhpcy5vcHRpb25zLmRlY2ltYWxNYXJrZXIsIFtdKTtcbiAgICB0aGlzLl9ncm91cFNlcGFyYXRvclRva2VucyA9IHRva2VuaXplKHRoaXMub3B0aW9ucy5ncm91cFNlcGFyYXRvciwgW10pO1xuICAgIHRoaXMuX2V4cG9uZW50UHJvZHVjdFRva2VucyA9IHRva2VuaXplKHRoaXMub3B0aW9ucy5leHBvbmVudFByb2R1Y3QsIFtdKTtcbiAgICB0aGlzLl9iZWdpbkV4cG9uZW50TWFya2VyVG9rZW5zID0gdG9rZW5pemUoXG4gICAgICB0aGlzLm9wdGlvbnMuYmVnaW5FeHBvbmVudE1hcmtlcixcbiAgICAgIFtdXG4gICAgKTtcbiAgICB0aGlzLl9lbmRFeHBvbmVudE1hcmtlclRva2VucyA9IHRva2VuaXplKFxuICAgICAgdGhpcy5vcHRpb25zLmVuZEV4cG9uZW50TWFya2VyLFxuICAgICAgW11cbiAgICApO1xuICAgIHRoaXMuX3RydW5jYXRpb25NYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh0aGlzLm9wdGlvbnMudHJ1bmNhdGlvbk1hcmtlciwgW10pO1xuICAgIHRoaXMuX2JlZ2luUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUoXG4gICAgICB0aGlzLm9wdGlvbnMuYmVnaW5SZXBlYXRpbmdEaWdpdHMsXG4gICAgICBbXVxuICAgICk7XG4gICAgdGhpcy5fZW5kUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUoXG4gICAgICB0aGlzLm9wdGlvbnMuZW5kUmVwZWF0aW5nRGlnaXRzLFxuICAgICAgW11cbiAgICApO1xuICAgIHRoaXMuX2ltYWdpbmFyeU51bWJlclRva2VucyA9IHRva2VuaXplKHRoaXMub3B0aW9ucy5pbWFnaW5hcnlVbml0LCBbXSk7XG4gIH1cbiAgdXBkYXRlT3B0aW9ucyhvcHQpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvcHQpKVxuICAgICAgaWYgKGsgaW4gdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9uc1trXSA9IHY7XG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmIChrID09PSBcInBvc2l0aXZlSW5maW5pdHlcIilcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aXZlSW5maW5pdHlUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwibmVnYXRpdmVJbmZpbml0eVwiKVxuICAgICAgICAgICAgdGhpcy5fbmVnYXRpdmVJbmZpbml0eVRva2VucyA9IHRva2VuaXplKHYsIFtdKTtcbiAgICAgICAgICBpZiAoayA9PT0gXCJub3RBTnVtYmVyXCIpXG4gICAgICAgICAgICB0aGlzLl9ub3RBTnVtYmVyVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImRlY2ltYWxNYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX2RlY2ltYWxNYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwiZ3JvdXBTZXBhcmF0b3JcIilcbiAgICAgICAgICAgIHRoaXMuX2dyb3VwU2VwYXJhdG9yVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImV4cG9uZW50UHJvZHVjdFwiKVxuICAgICAgICAgICAgdGhpcy5fZXhwb25lbnRQcm9kdWN0VG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImJlZ2luRXhwb25lbnRNYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX2JlZ2luRXhwb25lbnRNYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwiZW5kRXhwb25lbnRNYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX2VuZEV4cG9uZW50TWFya2VyVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcInRydW5jYXRpb25NYXJrZXJcIilcbiAgICAgICAgICAgIHRoaXMuX3RydW5jYXRpb25NYXJrZXJUb2tlbnMgPSB0b2tlbml6ZSh2LCBbXSk7XG4gICAgICAgICAgaWYgKGsgPT09IFwiYmVnaW5SZXBlYXRpbmdEaWdpdHNcIilcbiAgICAgICAgICAgIHRoaXMuX2JlZ2luUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImVuZFJlcGVhdGluZ0RpZ2l0c1wiKVxuICAgICAgICAgICAgdGhpcy5fZW5kUmVwZWF0aW5nRGlnaXRzVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICAgIGlmIChrID09PSBcImltYWdpbmFyeU51bWJlclwiKVxuICAgICAgICAgICAgdGhpcy5faW1hZ2luYXJ5TnVtYmVyVG9rZW5zID0gdG9rZW5pemUodiwgW10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWQgb3B0aW9uIFwiJHtrfVwiYCk7XG4gIH1cbiAgZ2V0IGF0RW5kKCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID49IHRoaXMuX3Rva2Vucy5sZW5ndGg7XG4gIH1cbiAgZ2V0IHBlZWsoKSB7XG4gICAgY29uc3QgcGVlayA9IHRoaXMuX3Rva2Vuc1t0aGlzLmluZGV4XTtcbiAgICBpZiAocGVlayA9PT0gdGhpcy5fbGFzdFBlZWspXG4gICAgICB0aGlzLl9wZWVrQ291bnRlciArPSAxO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuX3BlZWtDb3VudGVyID0gMDtcbiAgICBpZiAodGhpcy5fcGVla0NvdW50ZXIgPj0gMTAyNCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgd2hpbGUgcGFyc2luZyBcIiR7dGhpcy5sYXRleCgwKX1cIiBhdCBcIiR7dGhpcy5fbGFzdFBlZWt9XCIgKGluZGV4ICR7dGhpcy5pbmRleH0pYFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgd2hpbGUgcGFyc2luZyBcIiR7dGhpcy5sYXRleCgwKX1cIiBhdCAke3RoaXMuX2xhc3RQZWVrfSAoaW5kZXggJHt0aGlzLmluZGV4fSlgXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0UGVlayA9IHBlZWs7XG4gICAgcmV0dXJuIHBlZWs7XG4gIH1cbiAgbmV4dFRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLl90b2tlbnNbdGhpcy5pbmRleCsrXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWZcbiAgICogLSBhdCBlbmQgb2YgdGhlIHRva2VuIHN0cmVhbVxuICAgKiAtIHRoZSBgdC5jb25kaXRpb25gIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgKiBOb3RlOiB0aGUgYG1pblByZWNgIGNvbmRpdGlvbiBpcyBub3QgY2hlY2tlZC4gSXQgc2hvdWxkIGJlIGNoZWNrZWQgc2VwYXJhdGVseS5cbiAgICovXG4gIGF0VGVybWluYXRvcih0KSB7XG4gICAgcmV0dXJuIHRoaXMuYXRCb3VuZGFyeSB8fCAoKHQ/LmNvbmRpdGlvbiAmJiB0LmNvbmRpdGlvbih0aGlzKSkgPz8gZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBUcnVlIGlmIHRoZSBjdXJyZW50IHRva2VuIG1hdGNoZXMgYW55IG9mIHRoZSBib3VuZGFyaWVzIHdlIGFyZVxuICAgKiB3YWl0aW5nIGZvci5cbiAgICovXG4gIGdldCBhdEJvdW5kYXJ5KCkge1xuICAgIGlmICh0aGlzLmF0RW5kKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGZvciAoY29uc3QgYm91bmRhcnkgb2YgdGhpcy5fYm91bmRhcmllcykge1xuICAgICAgaWYgKHRoaXMubWF0Y2hBbGwoYm91bmRhcnkudG9rZW5zKSkge1xuICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYWRkQm91bmRhcnkoYm91bmRhcnkpIHtcbiAgICB0aGlzLl9ib3VuZGFyaWVzLnB1c2goeyBpbmRleDogdGhpcy5pbmRleCwgdG9rZW5zOiBib3VuZGFyeSB9KTtcbiAgfVxuICByZW1vdmVCb3VuZGFyeSgpIHtcbiAgICB0aGlzLl9ib3VuZGFyaWVzLnBvcCgpO1xuICB9XG4gIG1hdGNoQm91bmRhcnkoKSB7XG4gICAgY29uc3QgY3VycmVudEJvdW5kYXJ5ID0gdGhpcy5fYm91bmRhcmllc1t0aGlzLl9ib3VuZGFyaWVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG1hdGNoMiA9IGN1cnJlbnRCb3VuZGFyeSAmJiB0aGlzLm1hdGNoQWxsKGN1cnJlbnRCb3VuZGFyeS50b2tlbnMpO1xuICAgIGlmIChtYXRjaDIpXG4gICAgICB0aGlzLl9ib3VuZGFyaWVzLnBvcCgpO1xuICAgIHJldHVybiBtYXRjaDI7XG4gIH1cbiAgYm91bmRhcnlFcnJvcihtc2cpIHtcbiAgICBjb25zdCBjdXJyZW50Qm91bmRhcnkgPSB0aGlzLl9ib3VuZGFyaWVzW3RoaXMuX2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5fYm91bmRhcmllcy5wb3AoKTtcbiAgICByZXR1cm4gdGhpcy5lcnJvcihtc2csIGN1cnJlbnRCb3VuZGFyeS5pbmRleCk7XG4gIH1cbiAgbGF0ZXgoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB0b2tlbnNUb1N0cmluZyh0aGlzLl90b2tlbnMuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICB9XG4gIGxhdGV4QWhlYWQobikge1xuICAgIHJldHVybiB0aGlzLmxhdGV4KHRoaXMuaW5kZXgsIHRoaXMuaW5kZXggKyBuKTtcbiAgfVxuICAvLyBsYXRleEJlZm9yZSgpOiBzdHJpbmcge1xuICAvLyAgIHJldHVybiB0aGlzLmxhdGV4KDAsIHRoaXMuaW5kZXgpO1xuICAvLyB9XG4gIC8vIGxhdGV4QWZ0ZXIoKTogc3RyaW5nIHtcbiAgLy8gICByZXR1cm4gdGhpcy5sYXRleCh0aGlzLmluZGV4KTtcbiAgLy8gfVxuICAvKipcbiAgICogUmV0dXJuIGF0IG1vc3QgYHRoaXMuX2RpY3Rpb25hcnkubG9va2FoZWFkYCBMYVRlWCB0b2tlbnMuXG4gICAqXG4gICAqIFRoZSBpbmRleCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgY29ycmVzcG9uZCB0byB0aGUgbnVtYmVyIG9mIHRva2Vucy5cbiAgICogTm90ZSB0aGF0IHNpbmNlIGEgdG9rZW4gY2FuIGJlIGxvbmdlciB0aGFuIG9uZSBjaGFyICgnXFxcXHBpJywgYnV0IGFsc29cbiAgICogc29tZSBhc3RyYWwgcGxhbmUgdW5pY29kZSBjaGFyYWN0ZXJzKSwgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nXG4gICAqIGRvZXMgbm90IG1hdGNoIHRoYXQgaW5kZXguIEhvd2V2ZXIsIGtub3dpbmcgdGhlIGluZGV4IGlzIGltcG9ydGFudFxuICAgKiB0byBrbm93IGJ5IGhvdyBtYW55IHRva2VucyB0byBhZHZhbmNlLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYFtlbXB0eSwgJ1xcXFxzcXJ0JywgJ1xcXFxzcXJ0eycsICdcXFxcc3FydHsyJywgJ1xcXFxzcXJ0ezJ9J11gXG4gICAqXG4gICAqL1xuICBsb29rQWhlYWQoKSB7XG4gICAgbGV0IG4gPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuX2RpY3Rpb25hcnkubG9va2FoZWFkLFxuICAgICAgdGhpcy5fdG9rZW5zLmxlbmd0aCAtIHRoaXMuaW5kZXhcbiAgICApO1xuICAgIGlmIChuIDw9IDApXG4gICAgICByZXR1cm4gW107XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKG4gPiAwKVxuICAgICAgcmVzdWx0LnB1c2goW24sIHRoaXMubGF0ZXhBaGVhZChuLS0pXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwZWVrRGVmaW5pdGlvbnMoa2luZCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IGRlZnMgPSBbLi4udGhpcy5nZXREZWZzKGtpbmQpXTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKVxuICAgICAgaWYgKGRlZi5sYXRleFRyaWdnZXIgPT09IFwiXCIpXG4gICAgICAgIHJlc3VsdC5wdXNoKFtkZWYsIDBdKTtcbiAgICBmb3IgKGNvbnN0IFtuLCB0b2tlbnNdIG9mIHRoaXMubG9va0FoZWFkKCkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVmIG9mIGRlZnMpXG4gICAgICAgIGlmIChkZWYubGF0ZXhUcmlnZ2VyID09PSB0b2tlbnMpXG4gICAgICAgICAgcmVzdWx0LnB1c2goW2RlZiwgbl0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICBpZiAoZGVmLmlkZW50aWZpZXJUcmlnZ2VyKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUNvbXBsZXhJZCh0aGlzLCBkZWYuaWRlbnRpZmllclRyaWdnZXIpO1xuICAgICAgICBpZiAobiA+IDApXG4gICAgICAgICAgcmVzdWx0LnB1c2goW2RlZiwgbl0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKiBTa2lwIHN0cmljdGx5IGA8c3BhY2U+YCB0b2tlbnMuXG4gICAqIFRvIGFsc28gc2tpcCBge31gIHNlZSBgc2tpcFNwYWNlKClgLlxuICAgKiBUbyBza2lwIHZpc3VhbCBzcGFjZSAoZS5nLiBgXFwsYCkgc2VlIGBza2lwVmlzdWFsU3BhY2UoKWAuXG4gICAqL1xuICBza2lwU3BhY2VUb2tlbnMoKSB7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2goXCI8c3BhY2U+XCIpKSB7XG4gICAgfVxuICB9XG4gIC8qKiBXaGlsZSBwYXJzaW5nIGluIG1hdGggbW9kZSwgc2tpcCBhcHBsaWNhYmxlIHNwYWNlcywgd2hpY2ggaW5jbHVkZXMgYHt9YC5cbiAgICogRG8gbm90IHVzZSB0byBza2lwIHNwYWNlcyB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nLiBTZWUgIGBza2lwU3BhY2VUb2tlbnMoKWBcbiAgICogaW5zdGVhZC5cbiAgICovXG4gIHNraXBTcGFjZSgpIHtcbiAgICBpZiAoIXRoaXMuYXRFbmQgJiYgdGhpcy5wZWVrID09PSBcIjx7PlwiKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgd2hpbGUgKHRoaXMubWF0Y2goXCI8c3BhY2U+XCIpKSB7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZXh0VG9rZW4oKSA9PT0gXCI8fT5cIikge1xuICAgICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcFNwYWNlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChcIjxzcGFjZT5cIikpXG4gICAgICByZXN1bHQgPSB0cnVlO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2tpcFZpc3VhbFNwYWNlKCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLnNraXBTcGFjZSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIGlmIChbXG4gICAgICBcIlxcXFwhXCIsXG4gICAgICBcIlxcXFwsXCIsXG4gICAgICBcIlxcXFw6XCIsXG4gICAgICBcIlxcXFw7XCIsXG4gICAgICBcIlxcXFxlbnNraXBcIixcbiAgICAgIFwiXFxcXGVuc3BhY2VcIixcbiAgICAgIFwiXFxcXHNwYWNlXCIsXG4gICAgICBcIlxcXFxxdWFkXCIsXG4gICAgICBcIlxcXFxxcXVhZFwiXG4gICAgXS5pbmNsdWRlcyh0aGlzLnBlZWspKSB7XG4gICAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgdGhpcy5za2lwVmlzdWFsU3BhY2UoKTtcbiAgICB9XG4gICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgfVxuICBtYXRjaCh0b2tlbikge1xuICAgIGlmICh0aGlzLl90b2tlbnNbdGhpcy5pbmRleF0gPT09IHRva2VuKSB7XG4gICAgICB0aGlzLmluZGV4Kys7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hdGNoQWxsKHRva2Vucykge1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChBcnJheS5pc0FycmF5KHRva2VucykpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBtYXRjaGVkID0gdHJ1ZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgZG8ge1xuICAgICAgbWF0Y2hlZCA9IHRoaXMuX3Rva2Vuc1t0aGlzLmluZGV4ICsgaV0gPT09IHRva2Vuc1tpKytdO1xuICAgIH0gd2hpbGUgKG1hdGNoZWQgJiYgaSA8IHRva2Vucy5sZW5ndGgpO1xuICAgIGlmIChtYXRjaGVkKVxuICAgICAgdGhpcy5pbmRleCArPSBpO1xuICAgIHJldHVybiBtYXRjaGVkO1xuICB9XG4gIG1hdGNoQW55KHRva2Vucykge1xuICAgIGlmICh0b2tlbnMuaW5jbHVkZXModGhpcy5fdG9rZW5zW3RoaXMuaW5kZXhdKSlcbiAgICAgIHJldHVybiB0aGlzLl90b2tlbnNbdGhpcy5pbmRleCsrXTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBtYXRjaENoYXIoKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGxldCBjYXJldENvdW50ID0gMDtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChcIl5cIikpXG4gICAgICBjYXJldENvdW50ICs9IDE7XG4gICAgaWYgKGNhcmV0Q291bnQgPCAyKVxuICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIGlmIChjYXJldENvdW50ID49IDIpIHtcbiAgICAgIGxldCBkaWdpdHMgPSBcIlwiO1xuICAgICAgbGV0IG4gPSAwO1xuICAgICAgd2hpbGUgKG4gIT0gY2FyZXRDb3VudCkge1xuICAgICAgICBjb25zdCBkaWdpdCA9IHRoaXMubWF0Y2hBbnkoW1xuICAgICAgICAgIFwiMFwiLFxuICAgICAgICAgIFwiMVwiLFxuICAgICAgICAgIFwiMlwiLFxuICAgICAgICAgIFwiM1wiLFxuICAgICAgICAgIFwiNFwiLFxuICAgICAgICAgIFwiNVwiLFxuICAgICAgICAgIFwiNlwiLFxuICAgICAgICAgIFwiN1wiLFxuICAgICAgICAgIFwiOFwiLFxuICAgICAgICAgIFwiOVwiLFxuICAgICAgICAgIFwiYVwiLFxuICAgICAgICAgIFwiYlwiLFxuICAgICAgICAgIFwiY1wiLFxuICAgICAgICAgIFwiZFwiLFxuICAgICAgICAgIFwiZVwiLFxuICAgICAgICAgIFwiZlwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoIWRpZ2l0KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkaWdpdHMgKz0gZGlnaXQ7XG4gICAgICAgIG4gKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChkaWdpdHMubGVuZ3RoID09PSBjYXJldENvdW50KVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoTnVtYmVyLnBhcnNlSW50KGRpZ2l0cywgMTYpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2goXCJcXFxcY2hhclwiKSkge1xuICAgICAgbGV0IGNvZGVwb2ludCA9IE1hdGguZmxvb3IodGhpcy5tYXRjaExhdGV4TnVtYmVyKCkgPz8gTnVtYmVyLk5hTik7XG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb2RlcG9pbnQpIHx8IGNvZGVwb2ludCA8IDAgfHwgY29kZXBvaW50ID4gMTExNDExMSkge1xuICAgICAgICBjb2RlcG9pbnQgPSAxMDA2NztcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChcIlxcXFx1bmljb2RlXCIpKSB7XG4gICAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgICAgaWYgKHRoaXMubWF0Y2goXCI8ez5cIikpIHtcbiAgICAgICAgY29uc3QgY29kZXBvaW50ID0gdGhpcy5tYXRjaExhdGV4TnVtYmVyKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoKFwiPH0+XCIpICYmIGNvZGVwb2ludCAhPT0gbnVsbCAmJiBjb2RlcG9pbnQgPj0gMCAmJiBjb2RlcG9pbnQgPD0gMTExNDExMSkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2RlcG9pbnQgPSB0aGlzLm1hdGNoTGF0ZXhOdW1iZXIoKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCAhPT0gbnVsbCAmJiBjb2RlcG9pbnQgPj0gMCAmJiBjb2RlcG9pbnQgPD0gMTExNDExMSlcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZXBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBJZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBvcGVuIGRlbGltaXRlciwgc2V0IGEgYm91bmRhcnkgd2l0aFxuICAgKiB0aGUgY2xvc2UgdG9rZW4gYW5kIHJldHVybiB0cnVlLlxuICAgKlxuICAgKiBOb3RlIHRoaXMgbWV0aG9kIGhhbmRsZXMgZ2VuZXJpYyBkZWxpbWl0ZXJzLCBpLmUuICcoJyB3aWxsIG1hdGggYm90aFxuICAgKiAnKCcsICdcXGxlZnQoJywgJ1xcYmlnbCgnLCBldGMuLi5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBkZWZpbml0aW9ucyBmb3IgbWF0Y2hmaXggbWF5IG5lZWQgdG8gaW5jbHVkZSBzeW5vbnltc1xuICAgKiBmb3IgZXhhbXBsZTpcbiAgICpcbiAgICoge1xuICAgKiAgICBvcGVuRGVsaW1pdGVyOiAnKCcsXG4gICAqICAgIGNsb3NlRGVsaW1pdGVyOiAnKSdcbiAgICogfVxuICAgKlxuICAgKiBhbmRcbiAgICpcbiAgICoge1xuICAgKiAgIG9wZW5EZWxpbWl0ZXI6ICdcXFxcbHBhcmVuJyxcbiAgICogICBjbG9zZURlbGltaXRlcjogJ1xcXFxycGFyZW4nXG4gICAqIH1cbiAgICpcbiAgICogRm9yOlxuICAgKiAtICdbJzogJ1xcXFxsYnJhY2snIGFuZCAnXFxcXFsnXG4gICAqIC0gJ10nOiAnXFxcXHJicmFjaycgYW5kICdcXFxcXSdcbiAgICogLSAneyc6ICdcXFxcbGJyYWNlJyBhbmQgJ1xcXFx9J1xuICAgKiAtICd9JzogJ1xcXFxyYnJhY2UnIGFuZCAnXFxcXH0nXG4gICAqIC0gJzwnOiAnXFxcXGxhbmdsZSdcbiAgICogLSAnPic6ICdcXFxccmFuZ2xlJ1xuICAgKiAtICd8JzogJ1xcXFx2ZXJ0J1xuICAgKiAtICd8fCc6ICdcXFxcVmVydCdcbiAgICogLSAnfCc6ICdcXFxcbHZlcnQnIGFuZCAnXFxcXHJ2ZXJ0J1xuICAgKiAtICd8fCc6ICdcXFxcbFZlcnQnIGFuZCAnXFxcXHJWZXJ0J1xuICAgKi9cbiAgbWF0Y2hEZWxpbWl0ZXIob3BlbiwgY2xvc2UpIHtcbiAgICBpZiAodGhpcy5wZWVrID09PSBcIltcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcGVuKSkge1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoY2xvc2UpKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoQWxsKG9wZW4pKSB7XG4gICAgICAgIHRoaXMuYWRkQm91bmRhcnkoY2xvc2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IGNsb3NlUHJlZml4ID0gT1BFTl9ERUxJTUlURVJfUFJFRklYW3RoaXMucGVla107XG4gICAgaWYgKGNsb3NlUHJlZml4KVxuICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBpZiAob3BlbiA9PT0gXCJ8fFwiICYmIHRoaXMubWF0Y2hBbGwoW1wifFwiLCBcInxcIl0pKSB7XG4gICAgICB0aGlzLmFkZEJvdW5kYXJ5KFtcInxcIiwgXCJ8XCJdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWF0Y2gob3BlbikpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5hZGRCb3VuZGFyeShjbG9zZVByZWZpeCA/IFtjbG9zZVByZWZpeCwgY2xvc2VdIDogW2Nsb3NlXSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcGFyc2VHcm91cCgpIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICBpZiAodGhpcy5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgdGhpcy5hZGRCb3VuZGFyeShbXCI8fT5cIl0pO1xuICAgICAgY29uc3QgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgaWYgKHRoaXMubWF0Y2hCb3VuZGFyeSgpKVxuICAgICAgICByZXR1cm4gZXhwciA/PyBbXCJTZXF1ZW5jZVwiXTtcbiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmluZGV4O1xuICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoQm91bmRhcnkoKSAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuZXJyb3IoXCJzeW50YXgtZXJyb3JcIiwgZnJvbSk7XG4gICAgICByZXR1cm4gZXhwciA/IFtcIlNlcXVlbmNlXCIsIGV4cHIsIGVycl0gOiBlcnI7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBTb21lIExhVGVYIGNvbW1hbmRzIChidXQgbm90IGFsbCkgY2FuIGFjY2VwdCBhbiBhcmd1bWVudCB3aXRob3V0IGJyYWNlcyxcbiAgLy8gZm9yIGV4YW1wbGUgYF5gICwgYFxcc3FydGAgb3IgYFxcZnJhY2AuXG4gIC8vIFRoaXMgYXJndW1lbnQgd2lsbCB1c3VhbGx5IGJlIGEgc2luZ2xlIHRva2VuLCBidXQgY2FuIGJlIGEgc2VxdWVuY2Ugb2ZcbiAgLy8gdG9rZW5zIChlLmcuIGBcXHNxcnRcXGZyYWMxMmAgb3IgYFxcc3FydFxcb3BlcmF0b3JuYW1le3NwZWVkfWApLlxuICBwYXJzZVRva2VuKCkge1xuICAgIGNvbnN0IGV4Y2x1ZGluZyA9IFtcbiAgICAgIC4uLichXCIjJCUmKCksLzs6P0BbXVxcXFxgfH4nLnNwbGl0KFwiXCIpLFxuICAgICAgXCJcXFxcbGVmdFwiLFxuICAgICAgXCJcXFxcYmlnbFwiXG4gICAgXTtcbiAgICBpZiAoZXhjbHVkaW5nLmluY2x1ZGVzKHRoaXMucGVlaykpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoL15bMC05XSQvLnRlc3QodGhpcy5wZWVrKSlcbiAgICAgIHJldHVybiBwYXJzZUludCh0aGlzLm5leHRUb2tlbigpKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlR2VuZXJpY0V4cHJlc3Npb24oKSA/PyB0aGlzLnBhcnNlU3ltYm9sKCk7XG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHBhcnNlT3B0aW9uYWxHcm91cCgpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICBpZiAodGhpcy5tYXRjaChcIltcIikpIHtcbiAgICAgIHRoaXMuYWRkQm91bmRhcnkoW1wiXVwiXSk7XG4gICAgICBjb25zdCBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaEJvdW5kYXJ5KCkpXG4gICAgICAgIHJldHVybiBleHByO1xuICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlFcnJvcihcImV4cGVjdGVkLWNsb3NpbmctZGVsaW1pdGVyXCIpO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIGFuIGV4cHJlc3Npb24gaW4gYSB0YWJ1bGFyIGZvcm1hdCwgd2hlcmUgcm93cyBhcmUgc2VwYXJhdGVkIGJ5IGBcXFxcYFxuICAgKiBhbmQgY29sdW1ucyBieSBgJmAuXG4gICAqXG4gICAqIFJldHVybiByb3dzIG9mIHNwYXJzZSBjb2x1bW5zOiBlbXB0eSByb3dzIGFyZSBpbmRpY2F0ZWQgd2l0aCBgTm90aGluZ2AsXG4gICAqIGFuZCBlbXB0eSBjZWxscyBhcmUgYWxzbyBpbmRpY2F0ZWQgd2l0aCBgTm90aGluZ2AuXG4gICAqL1xuICBwYXJzZVRhYnVsYXIoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHJvdyA9IFtdO1xuICAgIGxldCBleHByID0gbnVsbDtcbiAgICB3aGlsZSAoIXRoaXMuYXRCb3VuZGFyeSkge1xuICAgICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoKFwiJlwiKSkge1xuICAgICAgICByb3cucHVzaChleHByID8/IFwiTm90aGluZ1wiKTtcbiAgICAgICAgZXhwciA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2goXCJcXFxcXFxcXFwiKSB8fCB0aGlzLm1hdGNoKFwiXFxcXGNyXCIpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIHRoaXMucGFyc2VPcHRpb25hbEdyb3VwKCk7XG4gICAgICAgIGlmIChleHByICE9PSBudWxsKVxuICAgICAgICAgIHJvdy5wdXNoKGV4cHIpO1xuICAgICAgICByZXN1bHQucHVzaChyb3cpO1xuICAgICAgICByb3cgPSBbXTtcbiAgICAgICAgZXhwciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjZWxsID0gW107XG4gICAgICAgIGxldCBwZWVrID0gdGhpcy5wZWVrO1xuICAgICAgICB3aGlsZSAocGVlayAhPT0gXCImXCIgJiYgcGVlayAhPT0gXCJcXFxcXFxcXFwiICYmIHBlZWsgIT09IFwiXFxcXGNyXCIgJiYgIXRoaXMuYXRCb3VuZGFyeSkge1xuICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICBtaW5QcmVjOiAwLFxuICAgICAgICAgICAgY29uZGl0aW9uOiAocCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwZWVrMiA9IHAucGVlaztcbiAgICAgICAgICAgICAgcmV0dXJuIHBlZWsyID09PSBcIiZcIiB8fCBwZWVrMiA9PT0gXCJcXFxcXFxcXFwiIHx8IHBlZWsyID09PSBcIlxcXFxjclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleHByKVxuICAgICAgICAgICAgY2VsbC5wdXNoKGV4cHIpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2VsbC5wdXNoKFtcIkVycm9yXCIsIFtcIid1bmV4cGVjdGVkLXRva2VuJ1wiLCBwZWVrXV0pO1xuICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICAgICAgICBwZWVrID0gdGhpcy5wZWVrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsLmxlbmd0aCA+IDEpXG4gICAgICAgICAgZXhwciA9IFtcIlNlcXVlbmNlXCIsIC4uLmNlbGxdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgZXhwciA9IGNlbGxbMF0gPz8gXCJOb3RoaW5nXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChleHByICE9PSBudWxsKVxuICAgICAgcm93LnB1c2goZXhwcik7XG4gICAgaWYgKHJvdy5sZW5ndGggPiAwKVxuICAgICAgcmVzdWx0LnB1c2gocm93KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKiBQYXJzZSBhIGdyb3VwIGFzIGEgYSBzdHJpbmcsIGZvciBleGFtcGxlIGZvciBgXFxvcGVyYXRvcm5hbWVgIG9yIGBcXGJlZ2luYCAqL1xuICBwYXJzZVN0cmluZ0dyb3VwKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB3aGlsZSAodGhpcy5tYXRjaChcIjxzcGFjZT5cIikpIHtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0Y2goXCI8ez5cIikpIHtcbiAgICAgIHRoaXMuYWRkQm91bmRhcnkoW1wiPH0+XCJdKTtcbiAgICAgIGNvbnN0IGFyZyA9IHRoaXMucGFyc2VTdHJpbmdHcm91cENvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoQm91bmRhcnkoKSlcbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgIHRoaXMucmVtb3ZlQm91bmRhcnkoKTtcbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBQYXJzZSBhbiBlbnZpcm9ubWVudDogYFxcYmVnaW57ZW52fS4uLlxcZW5ke2VuZH1gXG4gICAqL1xuICBwYXJzZUVudmlyb25tZW50KHVudGlsKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGlmICghdGhpcy5tYXRjaChcIlxcXFxiZWdpblwiKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhcnNlU3RyaW5nR3JvdXAoKT8udHJpbSgpO1xuICAgIGlmICghbmFtZSlcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiZXhwZWN0ZWQtZW52aXJvbm1lbnQtbmFtZVwiLCBpbmRleCk7XG4gICAgdGhpcy5hZGRCb3VuZGFyeShbXCJcXFxcZW5kXCIsIFwiPHs+XCIsIC4uLm5hbWUuc3BsaXQoXCJcIiksIFwiPH0+XCJdKTtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiB0aGlzLmdldERlZnMoXCJlbnZpcm9ubWVudFwiKSlcbiAgICAgIGlmIChkZWYuaWRlbnRpZmllclRyaWdnZXIgPT09IG5hbWUpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IGRlZi5wYXJzZSh0aGlzLCB1bnRpbCk7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEJvdW5kYXJ5KCkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRhcnlFcnJvcihcInVuYmFsYW5jZWQtZW52aXJvbm1lbnRcIik7XG4gICAgICAgIGlmIChleHByICE9PSBudWxsKVxuICAgICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRlKGV4cHIsIGluZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB0aGlzLnBhcnNlVGFidWxhcigpO1xuICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgaWYgKCF0aGlzLm1hdGNoQm91bmRhcnkoKSlcbiAgICAgIHJldHVybiB0aGlzLmJvdW5kYXJ5RXJyb3IoXCJ1bmJhbGFuY2VkLWVudmlyb25tZW50XCIpO1xuICAgIHJldHVybiB0aGlzLmVycm9yKFtcInVua25vd24tZW52aXJvbm1lbnRcIiwgeyBzdHI6IG5hbWUgfV0sIGluZGV4KTtcbiAgfVxuICAvKiogSWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyBhIGArYCBvciBgLWAgc2lnbiwgcmV0dXJuIGl0IGFuZCBhZHZhbmNlIHRoZSBpbmRleC5cbiAgICogT3RoZXJ3aXNlIHJldHVybiBgJydgIGFuZCBkbyBub3QgYWR2YW5jZSAqL1xuICBwYXJzZU9wdGlvbmFsU2lnbigpIHtcbiAgICBsZXQgaXNOZWdhdGl2ZSA9ICEhdGhpcy5tYXRjaEFueShbXCItXCIsIFwiXFx1MjIxMlwiXSk7XG4gICAgd2hpbGUgKHRoaXMubWF0Y2hBbnkoW1wiK1wiLCBcIlxcdUZFNjJcIl0pIHx8IHRoaXMuc2tpcFNwYWNlKCkpXG4gICAgICBpZiAodGhpcy5tYXRjaEFueShbXCItXCIsIFwiXFx1MjIxMlwiXSkpXG4gICAgICAgIGlzTmVnYXRpdmUgPSAhaXNOZWdhdGl2ZTtcbiAgICByZXR1cm4gaXNOZWdhdGl2ZSA/IFwiLVwiIDogXCIrXCI7XG4gIH1cbiAgcGFyc2VEZWNpbWFsRGlnaXRzKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID8/IChvcHRpb25zID0ge30pO1xuICAgIG9wdGlvbnMud2l0aEdyb3VwaW5nID8/IChvcHRpb25zLndpdGhHcm91cGluZyA9IGZhbHNlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgd2hpbGUgKC9eWzAtOV0kLy50ZXN0KHRoaXMucGVlaykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5uZXh0VG9rZW4oKSk7XG4gICAgICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgICB9XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGlmIChvcHRpb25zLndpdGhHcm91cGluZyAmJiB0aGlzLm9wdGlvbnMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoQWxsKHRoaXMuX2dyb3VwU2VwYXJhdG9yVG9rZW5zKSkge1xuICAgICAgICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KHRoaXMucGVlaykpXG4gICAgICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IHNhdmVkSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICB9XG4gIHBhcnNlU2lnbmVkSW50ZWdlcihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA/PyAob3B0aW9ucyA9IHt9KTtcbiAgICBvcHRpb25zLndpdGhHcm91cGluZyA/PyAob3B0aW9ucy53aXRoR3JvdXBpbmcgPSBmYWxzZSk7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IHNpZ24yID0gdGhpcy5wYXJzZU9wdGlvbmFsU2lnbigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKG9wdGlvbnMpO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICByZXR1cm4gc2lnbjIgPT09IFwiLVwiID8gXCItXCIgKyByZXN1bHQgOiByZXN1bHQ7XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHBhcnNlRXhwb25lbnQoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGlmICh0aGlzLm1hdGNoQW55KFtcImVcIiwgXCJFXCJdKSkge1xuICAgICAgY29uc3QgZXhwb25lbnQgPSB0aGlzLnBhcnNlU2lnbmVkSW50ZWdlcih7IHdpdGhHcm91cGluZzogZmFsc2UgfSk7XG4gICAgICBpZiAoZXhwb25lbnQpXG4gICAgICAgIHJldHVybiBcImVcIiArIGV4cG9uZW50O1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJcXFxcdGltZXNcIikpIHtcbiAgICAgIHRoaXMuc2tpcFNwYWNlVG9rZW5zKCk7XG4gICAgICBpZiAodGhpcy5tYXRjaChcIjFcIikgJiYgdGhpcy5tYXRjaChcIjBcIikgJiYgdGhpcy5tYXRjaChcIl5cIikpIHtcbiAgICAgICAgaWYgKC9eWzAtOV0kLy50ZXN0KHRoaXMucGVlaykpXG4gICAgICAgICAgcmV0dXJuIFwiZVwiICsgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2goXCI8ez5cIikpIHtcbiAgICAgICAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgICAgICAgIGNvbnN0IGV4cG9uZW50ID0gdGhpcy5wYXJzZVNpZ25lZEludGVnZXIoKTtcbiAgICAgICAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgICAgICAgIGlmICh0aGlzLm1hdGNoKFwiPH0+XCIpICYmIGV4cG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIFwiZVwiICsgZXhwb25lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHRoaXMuc2tpcFNwYWNlVG9rZW5zKCk7XG4gICAgaWYgKHRoaXMubWF0Y2goXCJcXFxcJVwiKSlcbiAgICAgIHJldHVybiBgZS0yYDtcbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2hBbGwodGhpcy5fZXhwb25lbnRQcm9kdWN0VG9rZW5zKSkge1xuICAgICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICAgIGlmICh0aGlzLm1hdGNoQWxsKHRoaXMuX2JlZ2luRXhwb25lbnRNYXJrZXJUb2tlbnMpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlVG9rZW5zKCk7XG4gICAgICAgIGNvbnN0IGV4cG9uZW50ID0gdGhpcy5wYXJzZVNpZ25lZEludGVnZXIoKTtcbiAgICAgICAgdGhpcy5za2lwU3BhY2VUb2tlbnMoKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hBbGwodGhpcy5fZW5kRXhwb25lbnRNYXJrZXJUb2tlbnMpICYmIGV4cG9uZW50KVxuICAgICAgICAgIHJldHVybiBcImVcIiArIGV4cG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcGFyc2VSZXBlYXRpbmdEZWNpbWFsKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBsZXQgcmVwZWF0aW5nRGVjaW1hbHMyID0gXCJcIjtcbiAgICBpZiAodGhpcy5tYXRjaChcIihcIikpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2goXCIpXCIpKVxuICAgICAgICByZXR1cm4gXCIoXCIgKyByZXBlYXRpbmdEZWNpbWFsczIgKyBcIilcIjtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2hBbGwoW2BcXFxcbGVmdGAsIFwiKFwiXSkpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2hBbGwoW2BcXFxccmlnaHRgLCBcIilcIl0pKVxuICAgICAgICByZXR1cm4gXCIoXCIgKyByZXBlYXRpbmdEZWNpbWFsczIgKyBcIilcIjtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgaWYgKHRoaXMubWF0Y2hBbGwoW2BcXFxcb3ZlcmxpbmVgLCBcIjx7PlwiXSkpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2goXCI8fT5cIikpXG4gICAgICAgIHJldHVybiBcIihcIiArIHJlcGVhdGluZ0RlY2ltYWxzMiArIFwiKVwiO1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICBpZiAodGhpcy5tYXRjaEFsbCh0aGlzLl9iZWdpblJlcGVhdGluZ0RpZ2l0c1Rva2VucykpIHtcbiAgICAgIHJlcGVhdGluZ0RlY2ltYWxzMiA9IHRoaXMucGFyc2VEZWNpbWFsRGlnaXRzKCk7XG4gICAgICBpZiAocmVwZWF0aW5nRGVjaW1hbHMyICYmIHRoaXMubWF0Y2hBbGwodGhpcy5fZW5kUmVwZWF0aW5nRGlnaXRzVG9rZW5zKSlcbiAgICAgICAgcmV0dXJuIFwiKFwiICsgcmVwZWF0aW5nRGVjaW1hbHMyICsgXCIpXCI7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZSBhIG51bWJlciwgd2l0aCBhbiBvcHRpb25hbCBzaWduLCBleHBvbmVudCwgZGVjaW1hbCBtYXJrZXIsXG4gICAqIHJlcGVhdGluZyBkZWNpbWFscywgZXRjLi4uXG4gICAqL1xuICBwYXJzZU51bWJlcigpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wYXJzZU51bWJlcnMpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwVmlzdWFsU3BhY2UoKTtcbiAgICB0aGlzLm1hdGNoKFwiK1wiKTtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgZG90UHJlZml4ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubWF0Y2goXCIuXCIpIHx8IHRoaXMubWF0Y2hBbGwodGhpcy5fZGVjaW1hbE1hcmtlclRva2VucykpIHtcbiAgICAgIGNvbnN0IHBlZWsgPSB0aGlzLnBlZWs7XG4gICAgICBpZiAocGVlayAhPT0gXCJcXFxcb3ZlcmxpbmVcIiAmJiBwZWVrICE9PSB0aGlzLl9iZWdpblJlcGVhdGluZ0RpZ2l0c1Rva2Vuc1swXSAmJiAhL1swLTlcXChdLy50ZXN0KHBlZWspKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBkb3RQcmVmaXggPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnBhcnNlRGVjaW1hbERpZ2l0cyh7IHdpdGhHcm91cGluZzogdHJ1ZSB9KTtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBoYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICBpZiAoIWRvdFByZWZpeCAmJiAodGhpcy5tYXRjaChcIi5cIikgfHwgdGhpcy5tYXRjaEFsbCh0aGlzLl9kZWNpbWFsTWFya2VyVG9rZW5zKSkpXG4gICAgICByZXN1bHQgKz0gXCIuXCIgKyB0aGlzLnBhcnNlRGVjaW1hbERpZ2l0cyh7IHdpdGhHcm91cGluZzogdHJ1ZSB9KTtcbiAgICBlbHNlIGlmIChkb3RQcmVmaXgpXG4gICAgICByZXN1bHQgPSBcIjAuXCIgKyB0aGlzLnBhcnNlRGVjaW1hbERpZ2l0cyh7IHdpdGhHcm91cGluZzogdHJ1ZSB9KTtcbiAgICBlbHNlXG4gICAgICBoYXNEZWNpbWFsID0gZmFsc2U7XG4gICAgaWYgKGhhc0RlY2ltYWwpIHtcbiAgICAgIGNvbnN0IHJlcGVhdCA9IHRoaXMucGFyc2VSZXBlYXRpbmdEZWNpbWFsKCk7XG4gICAgICBpZiAocmVwZWF0KVxuICAgICAgICByZXN1bHQgKz0gcmVwZWF0O1xuICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaChcIlxcXFxsZG90c1wiKSB8fCB0aGlzLm1hdGNoQWxsKHRoaXMuX3RydW5jYXRpb25NYXJrZXJUb2tlbnMpKSB7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2tpcFZpc3VhbFNwYWNlKCk7XG4gICAgcmV0dXJuIHJlc3VsdCArIHRoaXMucGFyc2VFeHBvbmVudCgpO1xuICB9XG4gIC8qKlxuICAgKiBBIExhdGV4IG51bWJlciBjYW4gYmUgYSBkZWNpbWFsLCBoZXggb3Igb2N0YWwgbnVtYmVyLlxuICAgKiBJdCBpcyB1c2VkIGluIHNvbWUgTGF0ZXggY29tbWFuZHMsIHN1Y2ggYXMgYFxcY2hhcmBcbiAgICpcbiAgICogRnJvbSBUZVg6ODY5NSAoc2Nhbl9pbnQpOlxuICAgKiA+IEFuIGludGVnZXIgbnVtYmVyIGNhbiBiZSBwcmVjZWRlZCBieSBhbnkgbnVtYmVyIG9mIHNwYWNlcyBhbmQgYCsnIG9yXG4gICAqID4gYC0nIHNpZ25zLiBUaGVuIGNvbWVzIGVpdGhlciBhIGRlY2ltYWwgY29uc3RhbnQgKGkuZS4sIHJhZGl4IDEwKSwgYW5cbiAgICogPiBvY3RhbCBjb25zdGFudCAoaS5lLiwgcmFkaXggOCwgcHJlY2VkZWQgYnkgJyksIGEgaGV4YWRlY2ltYWwgY29uc3RhbnRcbiAgICogPiAocmFkaXggMTYsIHByZWNlZGVkIGJ5IFwiKSwgYW4gYWxwaGFiZXRpYyBjb25zdGFudCAocHJlY2VkZWQgYnkgYCksIG9yXG4gICAqID4gYW4gaW50ZXJuYWwgdmFyaWFibGUuXG4gICAqL1xuICBtYXRjaExhdGV4TnVtYmVyKGlzSW50ZWdlciA9IHRydWUpIHtcbiAgICBsZXQgbmVnYXRpdmUgPSBmYWxzZTtcbiAgICBsZXQgdG9rZW4gPSB0aGlzLnBlZWs7XG4gICAgd2hpbGUgKHRva2VuID09PSBcIjxzcGFjZT5cIiB8fCB0b2tlbiA9PT0gXCIrXCIgfHwgdG9rZW4gPT09IFwiLVwiKSB7XG4gICAgICBpZiAodG9rZW4gPT09IFwiLVwiKVxuICAgICAgICBuZWdhdGl2ZSA9ICFuZWdhdGl2ZTtcbiAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICB0b2tlbiA9IHRoaXMucGVlaztcbiAgICB9XG4gICAgbGV0IHJhZGl4ID0gMTA7XG4gICAgbGV0IGRpZ2l0cyA9IFtcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIl07XG4gICAgaWYgKHRoaXMubWF0Y2goXCInXCIpKSB7XG4gICAgICByYWRpeCA9IDg7XG4gICAgICBkaWdpdHMgPSBbXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICAgIGlzSW50ZWdlciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKCdcIicpIHx8IHRoaXMubWF0Y2goXCJ4XCIpKSB7XG4gICAgICByYWRpeCA9IDE2O1xuICAgICAgZGlnaXRzID0gW1xuICAgICAgICBcIjBcIixcbiAgICAgICAgXCIxXCIsXG4gICAgICAgIFwiMlwiLFxuICAgICAgICBcIjNcIixcbiAgICAgICAgXCI0XCIsXG4gICAgICAgIFwiNVwiLFxuICAgICAgICBcIjZcIixcbiAgICAgICAgXCI3XCIsXG4gICAgICAgIFwiOFwiLFxuICAgICAgICBcIjlcIixcbiAgICAgICAgXCJBXCIsXG4gICAgICAgIFwiQlwiLFxuICAgICAgICBcIkNcIixcbiAgICAgICAgXCJEXCIsXG4gICAgICAgIFwiRVwiLFxuICAgICAgICBcIkZcIlxuICAgICAgXTtcbiAgICAgIGlzSW50ZWdlciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hdGNoKFwiYFwiKSkge1xuICAgICAgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbi5zdGFydHNXaXRoKFwiXFxcXFwiKSAmJiB0b2tlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gKG5lZ2F0aXZlID8gLTEgOiAxKSAqICh0b2tlbi5jb2RlUG9pbnRBdCgxKSA/PyAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5lZ2F0aXZlID8gLTEgOiAxKSAqICh0b2tlbi5jb2RlUG9pbnRBdCgwKSA/PyAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgIHdoaWxlIChkaWdpdHMuaW5jbHVkZXModGhpcy5wZWVrKSkge1xuICAgICAgdmFsdWUgKz0gdGhpcy5uZXh0VG9rZW4oKTtcbiAgICB9XG4gICAgaWYgKCFpc0ludGVnZXIgJiYgdGhpcy5tYXRjaChcIi5cIikpIHtcbiAgICAgIHZhbHVlICs9IFwiLlwiO1xuICAgICAgd2hpbGUgKGRpZ2l0cy5pbmNsdWRlcyh0aGlzLnBlZWspKSB7XG4gICAgICAgIHZhbHVlICs9IHRoaXMubmV4dFRva2VuKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGlzSW50ZWdlciA/IE51bWJlci5wYXJzZUludCh2YWx1ZSwgcmFkaXgpIDogTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4ocmVzdWx0KSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZWdhdGl2ZSA/IC1yZXN1bHQgOiByZXN1bHQ7XG4gIH1cbiAgcGFyc2VQcmVmaXhPcGVyYXRvcih1bnRpbCkge1xuICAgIGlmICghdW50aWwpXG4gICAgICB1bnRpbCA9IHsgbWluUHJlYzogMCB9O1xuICAgIGlmICghdW50aWwubWluUHJlYylcbiAgICAgIHVudGlsID0geyAuLi51bnRpbCwgbWluUHJlYzogMCB9O1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIG5dIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwicHJlZml4XCIpKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQgKyBuO1xuICAgICAgY29uc3QgcmhzID0gZGVmLnBhcnNlKHRoaXMsIHVudGlsKTtcbiAgICAgIGlmIChyaHMpXG4gICAgICAgIHJldHVybiByaHM7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwYXJzZUluZml4T3BlcmF0b3IobGhzLCB1bnRpbCkge1xuICAgIHVudGlsID8/ICh1bnRpbCA9IHsgbWluUHJlYzogMCB9KTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodW50aWwubWluUHJlYyAhPT0gdm9pZCAwKTtcbiAgICBpZiAodW50aWwubWluUHJlYyA9PT0gdm9pZCAwKVxuICAgICAgdW50aWwgPSB7IC4uLnVudGlsLCBtaW5QcmVjOiAwIH07XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGZvciAoY29uc3QgW2RlZiwgbl0gb2YgdGhpcy5wZWVrRGVmaW5pdGlvbnMoXCJpbmZpeFwiKSkge1xuICAgICAgaWYgKGRlZi5wcmVjZWRlbmNlID49IHVudGlsLm1pblByZWMpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0ICsgbjtcbiAgICAgICAgY29uc3QgcmhzID0gZGVmLnBhcnNlKHRoaXMsIGxocywgdW50aWwpO1xuICAgICAgICBpZiAocmhzKVxuICAgICAgICAgIHJldHVybiByaHM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVGhpcyByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyAoYXMgaW4gYSBmdW5jdGlvbiBhcHBsaWNhdGlvbiksXG4gICAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guXG4gICAqXG4gICAqIC0gJ2VuY2xvc3VyZScgOiB3aWxsIGxvb2sgZm9yIGFuIGFyZ3VtZW50IGluc2lkZSBhbiBlbmNsb3N1cmVcbiAgICogICAob3Blbi9jbG9zZSBmZW5jZSlcbiAgICogLSAnaW1wbGljaXQnOiBlaXRoZXIgYW4gZXhwcmVzc2lvbiBpbnNpZGUgYSBwYWlyIG9mIGAoKWAsIG9yIGp1c3QgYSBwcm9kdWN0XG4gICAqICAoaS5lLiB3ZSBpbnRlcnByZXQgYFxcY29zIDJ4ICsgMWAgYXMgYFxcY29zKDJ4KSArIDFgKVxuICAgKlxuICAgKi9cbiAgcGFyc2VBcmd1bWVudHMoa2luZCA9IFwiZW5jbG9zdXJlXCIsIHVudGlsKSB7XG4gICAgaWYgKHRoaXMuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNhdmVkSW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5wYXJzZUVuY2xvc3VyZSgpO1xuICAgIGlmIChraW5kID09PSBcImVuY2xvc3VyZVwiKSB7XG4gICAgICBpZiAoZ3JvdXAgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGdldFNlcXVlbmNlKGdyb3VwKSA/PyBbXTtcbiAgICB9XG4gICAgaWYgKGtpbmQgPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgaWYgKGhlYWQoZ3JvdXApID09PSBcIkRlbGltaXRlclwiKVxuICAgICAgICByZXR1cm4gZ2V0U2VxdWVuY2UoZ3JvdXApID8/IFtdO1xuICAgICAgaWYgKGdyb3VwICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gW2dyb3VwXTtcbiAgICAgIGNvbnN0IHByaW1hcnkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbih7IC4uLnVudGlsLCBtaW5QcmVjOiAzOTAgfSk7XG4gICAgICByZXR1cm4gcHJpbWFyeSA9PT0gbnVsbCA/IG51bGwgOiBbcHJpbWFyeV07XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzYXZlZEluZGV4O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBJZiBtYXRjaGVzIHRoZSBub3JtYWxpemVkIG9wZW4gZGVsaW1pdGVyLCByZXR1cm4gdGhlXG4gICAqIGV4cGVjdGVkIGNsb3NpbmcgZGVsaW1pdGVyLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgYGRlbGltaXRlcmAgaXMgYChgLCBpdCB3b3VsZCBtYXRjaCBgXFxsZWZ0XFxscGFyZW5gIGFuZFxuICAgKiByZXR1cm4gYFsnXFxyaWdodCcsICdcXHJwYXJlbiddYCwgd2hpY2ggY2FuIGJlIG1hdGNoZWQgd2l0aCBgbWF0Y2hBbGwoKWBcbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gbWF0Y2ggc2V2ZXJhbCB0b2tlbnMsIHVzZSBgbWF0Y2hBbGwoKWBcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtYXRjaE9wZW5EZWxpbWl0ZXIob3BlbkRlbGltLCBjbG9zZURlbGltKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIGNvbnN0IGNsb3NlUHJlZml4ID0gT1BFTl9ERUxJTUlURVJfUFJFRklYW3RoaXMucGVla107XG4gICAgaWYgKGNsb3NlUHJlZml4KVxuICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICBjb25zdCBhbHRlcm5hdGl2ZXMgPSBERUxJTUlURVJfU0hPUlRIQU5EW29wZW5EZWxpbV0gPz8gW29wZW5EZWxpbV07XG4gICAgY29uc3QgcmVzdWx0ID0gY2xvc2VQcmVmaXggPyBbY2xvc2VQcmVmaXhdIDogW107XG4gICAgaWYgKGFsdGVybmF0aXZlcy5pbmNsdWRlcyhcInx8XCIpICYmIHRoaXMubWF0Y2hBbGwoW1wifFwiLCBcInxcIl0pKSB7XG4gICAgICByZXN1bHQucHVzaChcInxcIik7XG4gICAgICByZXN1bHQucHVzaChcInxcIik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoIWFsdGVybmF0aXZlcy5pbmNsdWRlcyh0aGlzLnBlZWspKSB7XG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKENMT1NFX0RFTElNSVRFUltvcGVuRGVsaW1dID09PSBjbG9zZURlbGltKSB7XG4gICAgICByZXN1bHQucHVzaChDTE9TRV9ERUxJTUlURVJbdGhpcy5wZWVrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGNsb3NlRGVsaW0pO1xuICAgIH1cbiAgICB0aGlzLm5leHRUb2tlbigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gbWF0Y2hNaWRkbGVEZWxpbWl0ZXIoZGVsaW1pdGVyOiAnfCcgfCAnOicgfCBMYXRleFRva2VuKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgZGVsaW1pdGVycyA9IE1JRERMRV9ERUxJTUlURVJbZGVsaW1pdGVyXSA/PyBbZGVsaW1pdGVyXTtcbiAgLy8gICBpZiAoTUlERExFX0RFTElNSVRFUl9QUkVGSVguaW5jbHVkZXModGhpcy5wZWVrKSkge1xuICAvLyAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAvLyAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgLy8gICAgIGlmIChkZWxpbWl0ZXJzLmluY2x1ZGVzKHRoaXMucGVlaykpIHtcbiAgLy8gICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgLy8gICAgICAgcmV0dXJuIHRydWU7XG4gIC8vICAgICB9XG4gIC8vICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJzLmluY2x1ZGUodGhpcy5wZWVrKSkge1xuICAvLyAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgLy8gICAgIHJldHVybiB0cnVlO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gZmFsc2U7XG4gIC8vIH1cbiAgLyoqIEZvciBlcnJvciBoYW5kbGluZywgd2hlbiB0aGVyZSBpcyBwb3RlbnRpYWxseSBhIG1pc21hdGNoZWQgZGVsaW1pdGVyLlxuICAgKiBSZXR1cm4gYSBMYVRlWCBmcmFnbWVudCBvZiB0aGUgZXhwZWN0ZWQgY2xvc2luZyBkZWxpbWl0ZXJcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtYXRjaEVuY2xvc3VyZU9wZW4oKSB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZ2V0RGVmcyhcIm1hdGNoZml4XCIpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYub3BlbkRlbGltaXRlcikpIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hBbGwoZGVmLm9wZW5EZWxpbWl0ZXIpKVxuICAgICAgICAgIHJldHVybiB0b2tlbnNUb1N0cmluZyhkZWYuY2xvc2VEZWxpbWl0ZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsb3NlRGVsaW1pdGVyID0gdGhpcy5tYXRjaE9wZW5EZWxpbWl0ZXIoXG4gICAgICAgIGRlZi5vcGVuRGVsaW1pdGVyLFxuICAgICAgICBkZWYuY2xvc2VEZWxpbWl0ZXJcbiAgICAgICk7XG4gICAgICBpZiAoY2xvc2VEZWxpbWl0ZXIgIT09IG51bGwpXG4gICAgICAgIHJldHVybiB0b2tlbnNUb1N0cmluZyhjbG9zZURlbGltaXRlcik7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVXNlZCBmb3IgZXJyb3IgaGFuZGxpbmdcbiAgICogQGludGVybmFsICovXG4gIG1hdGNoRW5jbG9zdXJlQ2xvc2UoKSB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZ2V0RGVmcyhcIm1hdGNoZml4XCIpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWYuY2xvc2VEZWxpbWl0ZXIpKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoQWxsKGRlZi5jbG9zZURlbGltaXRlcikpXG4gICAgICAgICAgcmV0dXJuIHRva2Vuc1RvU3RyaW5nKGRlZi5vcGVuRGVsaW1pdGVyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICBsZXQgcGVlayA9IHRoaXMucGVlaztcbiAgICAgIGNvbnN0IHByZWZpeCA9IE9iamVjdC5rZXlzKE9QRU5fREVMSU1JVEVSX1BSRUZJWCkuZmluZChcbiAgICAgICAgKHgpID0+IE9QRU5fREVMSU1JVEVSX1BSRUZJWFt4XSA9PT0gcGVla1xuICAgICAgKTtcbiAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICBsZXQgb3BlbkRlbGltaXRlciA9IFtdO1xuICAgICAgcGVlayA9IHRoaXMucGVlaztcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGVsaW0gPSBPYmplY3Qua2V5cyhDTE9TRV9ERUxJTUlURVIpLmZpbmQoXG4gICAgICAgICh4KSA9PiBDTE9TRV9ERUxJTUlURVJbeF0gPT09IHBlZWtcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdEZWxpbSlcbiAgICAgICAgb3BlbkRlbGltaXRlciA9IFttYXRjaGluZ0RlbGltXTtcbiAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgIG9wZW5EZWxpbWl0ZXIgPSBbcHJlZml4LCAuLi5vcGVuRGVsaW1pdGVyXTtcbiAgICAgIGlmIChvcGVuRGVsaW1pdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgICAgcmV0dXJuIHRva2Vuc1RvU3RyaW5nKG9wZW5EZWxpbWl0ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGVuY2xvc3VyZSBpcyBhbiBvcGVuaW5nIG1hdGNoZml4IG9wZXJhdG9yLCBhbiBvcHRpb25hbCBleHByZXNzaW9uLFxuICAgKiBvcHRpb25hbGx5IGZvbGxvd2VkIG11bHRpcGxlIHRpbWVzIGJ5IGEgc2VwYXJhdG9yIGFuZCBhbm90aGVyIGV4cHJlc3Npb24sXG4gICAqIGFuZCBmaW5hbGx5IGEgY2xvc2luZyBtYXRjaGluZyBvcGVyYXRvci5cbiAgICovXG4gIHBhcnNlRW5jbG9zdXJlKCkge1xuICAgIGNvbnN0IGRlZnMgPSB0aGlzLmdldERlZnMoXCJtYXRjaGZpeFwiKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgZm9yIChjb25zdCBkZWYgb2YgZGVmcykge1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgaWYgKCF0aGlzLm1hdGNoRGVsaW1pdGVyKGRlZi5vcGVuRGVsaW1pdGVyLCBkZWYuY2xvc2VEZWxpbWl0ZXIpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJvZHlTdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgbGV0IGJvZHkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICAgIGlmICghdGhpcy5tYXRjaEJvdW5kYXJ5KCkpIHtcbiAgICAgICAgY29uc3QgYm91bmRhcnkgPSB0aGlzLl9ib3VuZGFyaWVzW3RoaXMuX2JvdW5kYXJpZXMubGVuZ3RoIC0gMV0udG9rZW5zO1xuICAgICAgICB0aGlzLnJlbW92ZUJvdW5kYXJ5KCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBib2R5U3RhcnQ7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hBbGwoYm91bmRhcnkpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBkZWYucGFyc2UodGhpcywgYm9keSA/PyBbXCJTZXF1ZW5jZVwiXSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEEgZ2VuZXJpYyBleHByZXNzaW9uIGlzIHVzZWQgZm9yIGRpY3Rpb25hcnkgZW50cmllcyB0aGF0IHRha2UgZG9cbiAgICogc29tZSBjb21wbGV4IChub24tc3RhbmRhcmQpIHBhcnNpbmcuIFRoaXMgaW5jbHVkZXMgdHJpZyBmdW5jdGlvbnMgKHRvXG4gICAqIHBhcnNlIGltcGxpY2l0IGFyZ3VtZW50cyksIGFuZCBpbnRlZ3JhbHMgKHRvIHBhcnNlIHRoZSBpbnRlZ3JhbmQgYW5kXG4gICAqIGxpbWl0cyBhbmQgdGhlIFwiZHhcIiB0ZXJtaW5hdG9yKS5cbiAgICovXG4gIHBhcnNlR2VuZXJpY0V4cHJlc3Npb24odW50aWwpIHtcbiAgICBpZiAodGhpcy5hdFRlcm1pbmF0b3IodW50aWwpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGxldCBleHByID0gbnVsbDtcbiAgICBjb25zdCBmbkRlZnMgPSB0aGlzLnBlZWtEZWZpbml0aW9ucyhcImV4cHJlc3Npb25cIikgPz8gW107XG4gICAgZm9yIChjb25zdCBbZGVmLCB0b2tlbkNvdW50XSBvZiBmbkRlZnMpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydCArIHRva2VuQ291bnQ7XG4gICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4cHIgPSBkZWYucGFyc2UodGhpcywgdW50aWwpO1xuICAgICAgICBpZiAoZXhwciAhPT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWYubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIGlzIGFuIGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgcG9zdGZpeCBvcGVyYXRvcnNcbiAgICogKGBcXHByaW1lYC4uLikgYW5kIHNvbWUgYXJndW1lbnRzLlxuICAgKi9cbiAgcGFyc2VGdW5jdGlvbih1bnRpbCkge1xuICAgIGlmICh0aGlzLmF0VGVybWluYXRvcih1bnRpbCkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgbGV0IGZuID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIHRva2VuQ291bnRdIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwiZnVuY3Rpb25cIikpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBzdGFydCArIHRva2VuQ291bnQ7XG4gICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZuID0gZGVmLnBhcnNlKHRoaXMsIHVudGlsKTtcbiAgICAgICAgaWYgKGZuICE9PSBudWxsKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm4gPSBkZWYubmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuICAgICAgZm4gPSBwYXJzZUlkZW50aWZpZXIodGhpcyk7XG4gICAgICBpZiAoIXRoaXMuaXNGdW5jdGlvbkhlYWQoZm4pKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHBmID0gdGhpcy5wYXJzZVBvc3RmaXhPcGVyYXRvcihmbik7XG4gICAgICBpZiAocGYgPT09IG51bGwpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZm4gPSBwZjtcbiAgICB9IHdoaWxlICh0cnVlKTtcbiAgICBjb25zdCBzZXEgPSB0aGlzLmlzRnVuY3Rpb25IZWFkKGZuKSA/IHRoaXMucGFyc2VBcmd1bWVudHMoKSA6IG51bGw7XG4gICAgcmV0dXJuIHNlcSA/IFtmbiwgLi4uc2VxXSA6IGZuO1xuICB9XG4gIHBhcnNlU3ltYm9sKHVudGlsKSB7XG4gICAgaWYgKHRoaXMuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIHRva2VuQ291bnRdIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwic3ltYm9sXCIpKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQgKyB0b2tlbkNvdW50O1xuICAgICAgaWYgKHR5cGVvZiBkZWYucGFyc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZWYucGFyc2UodGhpcywgdW50aWwpO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIGRlZi5uYW1lO1xuICAgIH1cbiAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgY29uc3QgaWQgPSBwYXJzZUlkZW50aWZpZXIodGhpcyk7XG4gICAgaWYgKGlkID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZVVua25vd25JZGVudGlmaWVyPy4oaWQsIHRoaXMpID09PSBcInN5bWJvbFwiKVxuICAgICAgcmV0dXJuIGlkO1xuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUGFyc2UgYSBzZXF1ZW5jZSBzdXBlcmZpeC9zdWJmaXggb3BlcmF0b3IsIGUuZy4gYF57Kn1gXG4gICAqXG4gICAqIFN1cGVyZml4IGFuZCBzdWJmaXggbmVlZCBzcGVjaWFsIGhhbmRsaW5nOlxuICAgKlxuICAgKiAtIHRoZXkgYWN0IG1vc3RseSBsaWtlIGFuIGluZml4IG9wZXJhdG9yLCBidXQgdGhleSBhcmUgY29tbXV0YXRpdmUsIGkuZS5cbiAgICogYHhfYV5iYCBzaG91bGQgYmUgcGFyc2VkIGlkZW50aWNhbGx5IHRvIGB4XmJfYWAuXG4gICAqXG4gICAqIC0gZnVydGhlcm1vcmUsIGluIExhVGVYIGB4XmFeYmAgcGFyc2VzIHRoZSBzYW1lIGFzIGB4XmF7fV5iYC5cbiAgICpcbiAgICovXG4gIHBhcnNlU3Vwc3ViKGxocykge1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChsaHMgIT09IG51bGwpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIGNvbnN0IHN1cGVyc2NyaXB0cyA9IFtdO1xuICAgIGNvbnN0IHN1YnNjcmlwdHMgPSBbXTtcbiAgICBsZXQgc3ViSW5kZXggPSBpbmRleDtcbiAgICB3aGlsZSAodGhpcy5wZWVrID09PSBcIl9cIiB8fCB0aGlzLnBlZWsgPT09IFwiXlwiKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaChcIl9cIikpIHtcbiAgICAgICAgc3ViSW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICBpZiAodGhpcy5tYXRjaChcIl9cIikgfHwgdGhpcy5tYXRjaChcIl5cIikpXG4gICAgICAgICAgc3Vic2NyaXB0cy5wdXNoKHRoaXMuZXJyb3IoXCJzeW50YXgtZXJyb3JcIiwgc3ViSW5kZXgpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc3ViMiA9IHRoaXMucGFyc2VHcm91cCgpID8/IHRoaXMucGFyc2VUb2tlbigpID8/IHRoaXMucGFyc2VTdHJpbmdHcm91cCgpO1xuICAgICAgICAgIGlmIChzdWIyID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIGluZGV4KTtcbiAgICAgICAgICBzdWJzY3JpcHRzLnB1c2goc3ViMik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXRjaChcIl5cIikpIHtcbiAgICAgICAgc3ViSW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICBpZiAodGhpcy5tYXRjaChcIl9cIikgfHwgdGhpcy5tYXRjaChcIl5cIikpXG4gICAgICAgICAgc3VwZXJzY3JpcHRzLnB1c2godGhpcy5lcnJvcihcInN5bnRheC1lcnJvclwiLCBzdWJJbmRleCkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzdXAgPSB0aGlzLnBhcnNlR3JvdXAoKSA/PyB0aGlzLnBhcnNlVG9rZW4oKTtcbiAgICAgICAgICBpZiAoc3VwID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIGluZGV4KTtcbiAgICAgICAgICBzdXBlcnNjcmlwdHMucHVzaChzdXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdWJJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIH1cbiAgICBpZiAoc3VwZXJzY3JpcHRzLmxlbmd0aCA9PT0gMCAmJiBzdWJzY3JpcHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgcmV0dXJuIGxocztcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGxocztcbiAgICBpZiAoc3Vic2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZWZzID0gWy4uLnRoaXMuZ2V0RGVmcyhcImluZml4XCIpXS5maWx0ZXIoXG4gICAgICAgICh4KSA9PiB4LmxhdGV4VHJpZ2dlciA9PT0gXCJfXCJcbiAgICAgICk7XG4gICAgICBpZiAoZGVmcykge1xuICAgICAgICBjb25zdCBhcmcgPSBbXG4gICAgICAgICAgXCJTdWJzY3JpcHRcIixcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc3Vic2NyaXB0cy5sZW5ndGggPT09IDEgPyBzdWJzY3JpcHRzWzBdIDogW1wiTGlzdFwiLCAuLi5zdWJzY3JpcHRzXVxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWYucGFyc2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZi5wYXJzZSh0aGlzLCBhcmcsIHsgbWluUHJlYzogMCB9KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBhcmc7XG4gICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdXBlcnNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVmcyA9IFsuLi50aGlzLmdldERlZnMoXCJpbmZpeFwiKV0uZmlsdGVyKFxuICAgICAgICAoeCkgPT4geC5sYXRleFRyaWdnZXIgPT09IFwiXlwiXG4gICAgICApO1xuICAgICAgaWYgKGRlZnMpIHtcbiAgICAgICAgY29uc3QgYXJnID0gW1xuICAgICAgICAgIFwiU3VwZXJzY3JpcHRcIixcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc3VwZXJzY3JpcHRzLmxlbmd0aCA9PT0gMSA/IHN1cGVyc2NyaXB0c1swXSA6IFtcIkxpc3RcIiwgLi4uc3VwZXJzY3JpcHRzXVxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkZWYucGFyc2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZi5wYXJzZSh0aGlzLCBhcmcsIHsgbWluUHJlYzogMCB9KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQgPSBhcmc7XG4gICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwYXJzZVBvc3RmaXhPcGVyYXRvcihsaHMsIHVudGlsKSB7XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGxocyAhPT0gbnVsbCk7XG4gICAgaWYgKGxocyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKGNvbnN0IFtkZWYsIG5dIG9mIHRoaXMucGVla0RlZmluaXRpb25zKFwicG9zdGZpeFwiKSkge1xuICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0ICsgbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5wYXJzZSh0aGlzLCBsaHMsIHVudGlsKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKiogTWF0Y2ggYSBzdHJpbmcgdXNlZCBhcyBhIExhVGVYIGlkZW50aWZpZXIsIGZvciBleGFtcGxlIGFuIGVudmlyb25tZW50XG4gICAqIG5hbWUuXG4gICAqIE5vdCBzdWl0YWJsZSBmb3IgZ2VuZXJhbCBwdXJwb3NlIHRleHQsIGUuZy4gYXJndW1lbnQgb2YgYSBgXFx0ZXh0e31cbiAgICogY29tbWFuZC4gU2VlIGBtYXRjaENoYXIoKWAgaW5zdGVhZC5cbiAgICovXG4gIHBhcnNlU3RyaW5nR3JvdXBDb250ZW50KCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIHdoaWxlICghdGhpcy5hdEJvdW5kYXJ5IHx8IGxldmVsID4gMCkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuICAgICAgaWYgKHRva2VuID09PSBcIjwkPlwiIHx8IHRva2VuID09PSBcIjwkJD5cIikge1xuICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuID09PSBcIjx7PlwiKSB7XG4gICAgICAgIGxldmVsICs9IDE7XG4gICAgICAgIHJlc3VsdCArPSBcIlxcXFx7XCI7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjx9PlwiKSB7XG4gICAgICAgIGxldmVsIC09IDE7XG4gICAgICAgIHJlc3VsdCArPSBcIlxcXFx9XCI7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuID09PSBcIjxzcGFjZT5cIikge1xuICAgICAgICByZXN1bHQgKz0gXCIgXCI7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuWzBdID09PSBcIlxcXFxcIikge1xuICAgICAgICByZXN1bHQgKz0gdG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIEFwcGx5IGFuIGludmlzaWJsZSBvcGVyYXRvciBiZXR3ZWVuIHR3byBleHByZXNzaW9ucy5cbiAgICpcbiAgICogSWYgdGhlIGBsaHNgIGlzIGFuIGxpdGVyYWwgaW50ZWdlciBhbmQgdGhlIGByaHNgIGlzIGEgbGl0ZXJhbCByYXRpb25hbFxuICAgKiAtPiAnaW52aXNpYmxlIHBsdXMnXG4gICAqXG4gICAqIFRoYXQgaXMgJzIgMy80JyAtPiBbJ0FkZCcsIDIsIFsnUmF0aW9uYWwnLCAzLCA0XV1cbiAgICpcbiAgICogSWYgYGxoc2AgaXMgYSBudW1iZXIgYW5kIGByaHNgIGlzIGEgbnVtYmVyIGJ1dCBub3QgYSBsaXRlcmFsIC0+ICdpbnZpc2libGUgbXVsdGlwbHknLlxuICAgKiAtIDJ4XG4gICAqIC0gMih4KzEpXG4gICAqIC0geCh4KzEpXG4gICAqIC0gZih4KWcoeSlcbiAgICogLSAyIHNpbih4KVxuICAgKiAtIDIgZih4KVxuICAgKiAtIHggZih4KVxuICAgKiAtICh4LTEpKHgrMSlcbiAgICogLSAoeCsxKTIgLT4gbm9cbiAgICogLSB4MiAtPiBub1xuICAgKiA9PiBsaHMgaXMgYSBudW1iZXIsIHJocyBpcyBhIG51bWJlciwgYnV0IG5vdCBhIGxpdGVyYWxcbiAgICovXG4gIGFwcGx5SW52aXNpYmxlT3BlcmF0b3IodW50aWwsIGxocykge1xuICAgIGlmIChsaHMgPT09IG51bGwgfHwgdGhpcy5vcHRpb25zLmFwcGx5SW52aXNpYmxlT3BlcmF0b3IgPT09IG51bGwgfHwgaGVhZChsaHMpID09PSBcIkVycm9yXCIgfHwgc3ltYm9sKGxocykgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShsaHMpIHx8IHRoaXMuYXRUZXJtaW5hdG9yKHVudGlsKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnBlZWtEZWZpbml0aW9ucyhcIm9wZXJhdG9yXCIpLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uSGVhZChsaHMpKSB7XG4gICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJzZUFyZ3VtZW50cyhcImVuY2xvc3VyZVwiLCB7IC4uLnVudGlsLCBtaW5QcmVjOiAwIH0pO1xuICAgICAgaWYgKGFyZ3MgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIFtsaHMsIC4uLmFyZ3NdO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgY29uc3QgcmhzID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oeyAuLi51bnRpbCwgbWluUHJlYzogMzkwIH0pO1xuICAgIGlmIChyaHMgPT09IG51bGwgfHwgc3ltYm9sKHJocykgPT09IFwiTm90aGluZ1wiIHx8IGlzRW1wdHlTZXF1ZW5jZShyaHMpKSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGhlYWQocmhzKSA9PT0gXCJFcnJvclwiKVxuICAgICAgcmV0dXJuIGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihcIlNlcXVlbmNlXCIsIGxocywgcmhzKTtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5hcHBseUludmlzaWJsZU9wZXJhdG9yID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwcGx5SW52aXNpYmxlT3BlcmF0b3IodGhpcywgbGhzLCByaHMpO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25IZWFkKGxocykpIHtcbiAgICAgIGNvbnN0IHNlcSA9IGdldFNlcXVlbmNlKHJocyk7XG4gICAgICByZXR1cm4gc2VxID8gW2xocywgLi4uc2VxXSA6IGxocztcbiAgICB9XG4gICAgY29uc3QgbGhzTnVtYmVyID0gbWFjaGluZVZhbHVlKGxocyk7XG4gICAgaWYgKGxoc051bWJlciAhPT0gbnVsbCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxoc051bWJlcikpIHtcbiAgICAgIGNvbnN0IHJoc0hlYWQgPSBoZWFkKHJocyk7XG4gICAgICBpZiAocmhzSGVhZCA9PT0gXCJEaXZpZGVcIiB8fCByaHNIZWFkID09PSBcIlJhdGlvbmFsXCIpIHtcbiAgICAgICAgY29uc3QgW24sIGRdID0gW21hY2hpbmVWYWx1ZShvcChyaHMsIDEpKSwgbWFjaGluZVZhbHVlKG9wKHJocywgMikpXTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwgJiYgZCAhPT0gbnVsbCAmJiBuID4gMCAmJiBuIDw9IDFlMyAmJiBkID4gMSAmJiBkIDw9IDFlMyAmJiBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIE51bWJlci5pc0ludGVnZXIoZCkpXG4gICAgICAgICAgcmV0dXJuIFtcIkFkZFwiLCBsaHMsIHJoc107XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoZWFkKHJocykgPT09IFwiRGVsaW1pdGVyXCIpIHtcbiAgICAgIGlmIChoZWFkKG9wKHJocywgMSkpID09PSBcIlNlcXVlbmNlXCIpXG4gICAgICAgIHJldHVybiBbbGhzLCAuLi5vcHMob3AocmhzLCAxKSkgPz8gW11dO1xuICAgICAgaWYgKCFvcChyaHMsIDEpIHx8IHN5bWJvbChvcChyaHMsIDEpKSA9PT0gXCJOb3RoaW5nXCIpXG4gICAgICAgIHJldHVybiBhcHBseUFzc29jaWF0aXZlT3BlcmF0b3IoXG4gICAgICAgICAgXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgIGxocyxcbiAgICAgICAgICB0aGlzLmVycm9yKFwiZXhwZWN0ZWQtZXhwcmVzc2lvblwiLCBzdGFydClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhlYWQocmhzKSA9PT0gXCJTZXF1ZW5jZVwiIHx8IGhlYWQobGhzKSA9PT0gXCJTZXF1ZW5jZVwiIHx8IHN0cmluZ1ZhbHVlKGxocykgIT09IG51bGwgfHwgc3RyaW5nVmFsdWUocmhzKSAhPT0gbnVsbCB8fCBkaWN0aW9uYXJ5KGxocykgIT09IG51bGwgfHwgZGljdGlvbmFyeShyaHMpICE9PSBudWxsKVxuICAgICAgcmV0dXJuIGFwcGx5QXNzb2NpYXRpdmVPcGVyYXRvcihcIlNlcXVlbmNlXCIsIGxocywgcmhzKTtcbiAgICByZXR1cm4gYXBwbHlBc3NvY2lhdGl2ZU9wZXJhdG9yKFwiTXVsdGlwbHlcIiwgbGhzLCByaHMpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGlzIGFuIGVycm9yIGhhbmRsaW5nIG1ldGhvZC4gV2UndmUgZW5jb3VudGVyZWQgYSBMYVRlWCBjb21tYW5kXG4gICAqIGJ1dCB3ZXJlIG5vdCBhYmxlIHRvIG1hdGNoIGl0IHRvIGFueSBlbnRyeSBpbiB0aGUgTGFUZVggZGljdGlvbmFyeSxcbiAgICogb3IgcmFuIGludG8gaXQgaW4gYW4gdW5leHBlY3RlZCBjb250ZXh0IChwb3N0Zml4IG9wZXJhdG9yIGxhY2tpbmcgYW5cbiAgICogYXJndW1lbnQsIGZvciBleGFtcGxlKVxuICAgKi9cbiAgcGFyc2VVbmV4cGVjdGVkTGF0ZXhDb21tYW5kKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBsZXQgb3BEZWZzID0gdGhpcy5wZWVrRGVmaW5pdGlvbnMoXCJvcGVyYXRvclwiKTtcbiAgICBpZiAob3BEZWZzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9wRGVmcyA9IHRoaXMucGVla0RlZmluaXRpb25zKFwicG9zdGZpeFwiKTtcbiAgICAgIGlmIChvcERlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgdGhpcy5pbmRleCArPSBuO1xuICAgICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnBhcnNlKHRoaXMsIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KSk7XG4gICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5uYW1lKVxuICAgICAgICAgIHJldHVybiBbZGVmLm5hbWUsIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KV07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwidW5leHBlY3RlZC1vcGVyYXRvclwiLCBzdGFydCk7XG4gICAgICB9XG4gICAgICBvcERlZnMgPSB0aGlzLnBlZWtEZWZpbml0aW9ucyhcInByZWZpeFwiKTtcbiAgICAgIGlmIChvcERlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgdGhpcy5pbmRleCArPSBuO1xuICAgICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnBhcnNlKHRoaXMsIHsgbWluUHJlYzogMCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm5hbWUpXG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGRlZi5uYW1lLFxuICAgICAgICAgICAgLy8gQHRvZG86IHBhc3MgYSBwcmVjZWRlbmNlP1xuICAgICAgICAgICAgdGhpcy5wYXJzZUV4cHJlc3Npb24oKSA/PyB0aGlzLmVycm9yKFwibWlzc2luZ1wiLCBzdGFydClcbiAgICAgICAgICBdO1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihcInVuZXhwZWN0ZWQtb3BlcmF0b3JcIiwgc3RhcnQpO1xuICAgICAgfVxuICAgICAgb3BEZWZzID0gdGhpcy5wZWVrRGVmaW5pdGlvbnMoXCJpbmZpeFwiKTtcbiAgICAgIGlmIChvcERlZnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgdGhpcy5pbmRleCArPSBuO1xuICAgICAgICBpZiAodHlwZW9mIGRlZi5wYXJzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVmLnBhcnNlKHRoaXMsIHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KSwge1xuICAgICAgICAgICAgbWluUHJlYzogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubmFtZSlcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZGVmLm5hbWUsXG4gICAgICAgICAgICB0aGlzLmVycm9yKFwibWlzc2luZ1wiLCBzdGFydCksXG4gICAgICAgICAgICB0aGlzLnBhcnNlRXhwcmVzc2lvbigpID8/IHRoaXMuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KVxuICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwidW5leHBlY3RlZC1vcGVyYXRvclwiLCBzdGFydCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLnBlZWs7XG4gICAgaWYgKCFjb21tYW5kIHx8IGNvbW1hbmRbMF0gIT09IFwiXFxcXFwiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICB0aGlzLnNraXBTcGFjZVRva2VucygpO1xuICAgIGlmIChjb21tYW5kID09PSBcIlxcXFxlbmRcIikge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMucGFyc2VTdHJpbmdHcm91cCgpO1xuICAgICAgaWYgKG5hbWUgPT09IG51bGwpXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiZXhwZWN0ZWQtZW52aXJvbm1lbnQtbmFtZVwiLCBzdGFydCk7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvcihbXCJ1bmJhbGFuY2VkLWVudmlyb25tZW50XCIsIHsgc3RyOiBuYW1lIH1dLCBzdGFydCk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLm1hdGNoKFwiW1wiKSkge1xuICAgICAgbGV0IGxldmVsID0gMDtcbiAgICAgIHdoaWxlICghdGhpcy5hdEVuZCAmJiBsZXZlbCA9PT0gMCAmJiB0aGlzLnBlZWsgIT09IFwiXVwiKSB7XG4gICAgICAgIGlmICh0aGlzLnBlZWsgPT09IFwiW1wiKVxuICAgICAgICAgIGxldmVsICs9IDE7XG4gICAgICAgIGlmICh0aGlzLnBlZWsgPT09IFwiXVwiKVxuICAgICAgICAgIGxldmVsIC09IDE7XG4gICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hdGNoKFwiXVwiKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuaW5kZXggPSBzdGFydDtcbiAgICBjb25zdCBjbG9zZURlbGltaXRlciA9IHRoaXMubWF0Y2hFbmNsb3N1cmVPcGVuKCk7XG4gICAgaWYgKGNsb3NlRGVsaW1pdGVyKVxuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXG4gICAgICAgIFtcImV4cGVjdGVkLWNsb3NlLWRlbGltaXRlclwiLCB7IHN0cjogY2xvc2VEZWxpbWl0ZXIgfV0sXG4gICAgICAgIGluZGV4XG4gICAgICApO1xuICAgIGNvbnN0IG9wZW5EZWxpbWl0ZXIgPSB0aGlzLm1hdGNoRW5jbG9zdXJlQ2xvc2UoKTtcbiAgICBpZiAob3BlbkRlbGltaXRlcilcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFxuICAgICAgICBbXCJleHBlY3RlZC1vcGVuLWRlbGltaXRlclwiLCB7IHN0cjogb3BlbkRlbGltaXRlciB9XSxcbiAgICAgICAgc3RhcnRcbiAgICAgICk7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHdoaWxlICh0aGlzLm1hdGNoKFwiPHs+XCIpKSB7XG4gICAgICBsZXQgbGV2ZWwgPSAwO1xuICAgICAgd2hpbGUgKCF0aGlzLmF0RW5kICYmIGxldmVsID09PSAwICYmIHRoaXMucGVlayAhPT0gXCI8fT5cIikge1xuICAgICAgICBpZiAodGhpcy5wZWVrID09PSBcIjx7PlwiKVxuICAgICAgICAgIGxldmVsICs9IDE7XG4gICAgICAgIGlmICh0aGlzLnBlZWsgPT09IFwiPH0+XCIpXG4gICAgICAgICAgbGV2ZWwgLT0gMTtcbiAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0Y2goXCI8fT5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVycm9yKFtcInVuZXhwZWN0ZWQtY29tbWFuZFwiLCB7IHN0cjogY29tbWFuZCB9XSwgc3RhcnQpO1xuICB9XG4gIC8qKlxuICAgKiA8cHJpbWFyeT4gOj1cbiAgICogICg8bnVtYmVyPiB8IDxzeW1ib2w+IHwgPGVudmlyb25tZW50PiB8IDxtYXRjaGZpeC1leHByPilcbiAgICogICAgPHN1YnN1cD4qIDxwb3N0Zml4LW9wZXJhdG9yPipcbiAgICpcbiAgICogPHN5bWJvbD4gOjo9XG4gICAqICAoPHN5bWJvbC1pZD4gfCAoPGxhdGV4LWNvbW1hbmQ+PGxhdGV4LWFyZ3VtZW50cz4pKSA8YXJndW1lbnRzPlxuICAgKlxuICAgKiA8bWF0Y2hmaXgtZXhwcj4gOj1cbiAgICogIDxtYXRjaGZpeC1vcC1vcGVuPlxuICAgKiAgPGV4cHJlc3Npb24+XG4gICAqICAoPG1hdGNoZml4LW9wLXNlcGFyYXRvcj4gPGV4cHJlc3Npb24+KSpcbiAgICogIDxtYXRjaGZpeC1vcC1jbG9zZT5cbiAgICpcbiAgICovXG4gIHBhcnNlUHJpbWFyeSh1bnRpbCkge1xuICAgIGlmICh0aGlzLmF0Qm91bmRhcnkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5hdFRlcm1pbmF0b3IodW50aWwpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIGlmICh0aGlzLm1hdGNoKFwiPH0+XCIpKVxuICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJ1bmV4cGVjdGVkLWNsb3NpbmctZGVsaW1pdGVyXCIsIHN0YXJ0KTtcbiAgICBpZiAodGhpcy5tYXRjaChcIjx7PlwiKSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oe1xuICAgICAgICBtaW5QcmVjOiAwLFxuICAgICAgICBjb25kaXRpb246IChwKSA9PiBwLnBlZWsgPT09IFwiPH0+XCJcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoXCJleHBlY3RlZC1leHByZXNzaW9uXCIsIHN0YXJ0KTtcbiAgICAgIGlmICghdGhpcy5tYXRjaChcIjx9PlwiKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShcbiAgICAgICAgICBbXCJTZXF1ZW5jZVwiLCByZXN1bHQsIHRoaXMuZXJyb3IoXCJleHBlY3RlZC1jbG9zaW5nLWRlbGltaXRlclwiLCBzdGFydCldLFxuICAgICAgICAgIHN0YXJ0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bSA9IHRoaXMucGFyc2VOdW1iZXIoKTtcbiAgICAgIGlmIChudW0gIT09IG51bGwpXG4gICAgICAgIHJlc3VsdCA9IHsgbnVtIH07XG4gICAgfVxuICAgIHJlc3VsdCA/PyAocmVzdWx0ID0gdGhpcy5wYXJzZUVuY2xvc3VyZSgpKTtcbiAgICByZXN1bHQgPz8gKHJlc3VsdCA9IHRoaXMucGFyc2VFbnZpcm9ubWVudCh1bnRpbCkpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwgJiYgdGhpcy5tYXRjaEFsbCh0aGlzLl9wb3NpdGl2ZUluZmluaXR5VG9rZW5zKSlcbiAgICAgIHJlc3VsdCA9IHsgbnVtOiBcIitJbmZpbml0eVwiIH07XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiB0aGlzLm1hdGNoQWxsKHRoaXMuX25lZ2F0aXZlSW5maW5pdHlUb2tlbnMpKVxuICAgICAgcmVzdWx0ID0geyBudW06IFwiLUluZmluaXR5XCIgfTtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsICYmIHRoaXMubWF0Y2hBbGwodGhpcy5fbm90QU51bWJlclRva2VucykpXG4gICAgICByZXN1bHQgPSB7IG51bTogXCJOYU5cIiB9O1xuICAgIHJlc3VsdCA/PyAocmVzdWx0ID0gdGhpcy5wYXJzZUdlbmVyaWNFeHByZXNzaW9uKHVudGlsKSA/PyB0aGlzLnBhcnNlRnVuY3Rpb24odW50aWwpID8/IHRoaXMucGFyc2VTeW1ib2wodW50aWwpID8/IHBhcnNlSW52YWxpZElkZW50aWZpZXIodGhpcykpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZGVjb3JhdGUocmVzdWx0LCBzdGFydCk7XG4gICAgICBsZXQgcG9zdGZpeCA9IG51bGw7XG4gICAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgZG8ge1xuICAgICAgICBwb3N0Zml4ID0gdGhpcy5wYXJzZVBvc3RmaXhPcGVyYXRvcihyZXN1bHQsIHVudGlsKTtcbiAgICAgICAgcmVzdWx0ID0gcG9zdGZpeCA/PyByZXN1bHQ7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09PSBpbmRleCAmJiBwb3N0Zml4ICE9PSBudWxsKSB7XG4gICAgICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHRoaXMuaW5kZXggIT09IGluZGV4LCBcIk5vIHRva2VuIGNvbnN1bWVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIH0gd2hpbGUgKHBvc3RmaXggIT09IG51bGwpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZVN1cHN1YihyZXN1bHQpO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKHJlc3VsdCwgc3RhcnQpO1xuICB9XG4gIC8qKlxuICAgKiAgUGFyc2UgYW4gZXhwcmVzc2lvbjpcbiAgICpcbiAgICogPGV4cHJlc3Npb24+IDo6PVxuICAgKiAgfCA8cHJpbWFyeT5cbiAgICogIHwgPHByZWZpeC1vcD4gPHByaW1hcnk+XG4gICAqICB8IDxwcmltYXJ5PiA8aW5maXgtb3A+IDxleHByZXNzaW9uPlxuICAgKlxuICAgKiBTdG9wIHdoZW4gYW4gb3BlcmF0b3Igb2YgcHJlY2VkZW5jZSBsZXNzIHRoYW4gYHVudGlsLm1pblByZWNgXG4gICAqIGlzIGVuY291bnRlcmVkXG4gICAqL1xuICBwYXJzZUV4cHJlc3Npb24odW50aWwpIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5za2lwU3BhY2UoKTtcbiAgICBpZiAodGhpcy5hdEJvdW5kYXJ5KSB7XG4gICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdW50aWwgPz8gKHVudGlsID0geyBtaW5QcmVjOiAwIH0pO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh1bnRpbC5taW5QcmVjICE9PSB2b2lkIDApO1xuICAgIGlmICh1bnRpbC5taW5QcmVjID09PSB2b2lkIDApXG4gICAgICB1bnRpbCA9IHsgLi4udW50aWwsIG1pblByZWM6IDAgfTtcbiAgICBsZXQgbGhzID0gdGhpcy5wYXJzZVByZWZpeE9wZXJhdG9yKHsgLi4udW50aWwsIG1pblByZWM6IDAgfSk7XG4gICAgaWYgKGxocyA9PT0gbnVsbCkge1xuICAgICAgbGhzID0gdGhpcy5wYXJzZVByaW1hcnkodW50aWwpO1xuICAgICAgaWYgKGhlYWQobGhzKSA9PT0gXCJTZXF1ZW5jZVwiICYmIG5vcHMobGhzKSA9PT0gMClcbiAgICAgICAgbGhzID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxocykge1xuICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgIHdoaWxlICghZG9uZSAmJiAhdGhpcy5hdFRlcm1pbmF0b3IodW50aWwpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBhcnNlSW5maXhPcGVyYXRvcihsaHMsIHVudGlsKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYXBwbHlJbnZpc2libGVPcGVyYXRvcih1bnRpbCwgbGhzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbGhzID0gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxocyA/PyAobGhzID0gdGhpcy5wYXJzZVVuZXhwZWN0ZWRMYXRleENvbW1hbmQoKSk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUobGhzLCBzdGFydCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBMYVRlWCBvciBvdGhlciByZXF1ZXN0ZWQgbWV0YWRhdGEgdG8gdGhlIGV4cHJlc3Npb25cbiAgICovXG4gIGRlY29yYXRlKGV4cHIsIHN0YXJ0KSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5wcmVzZXJ2ZUxhdGV4KVxuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgY29uc3QgbGF0ZXggPSB0aGlzLmxhdGV4KHN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShleHByKSkge1xuICAgICAgZXhwciA9IHsgbGF0ZXgsIGZuOiBleHByIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIikge1xuICAgICAgZXhwciA9IHsgbGF0ZXgsIG51bTogTnVtYmVyKGV4cHIpLnRvU3RyaW5nKCkgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBleHByID0geyBsYXRleCwgc3ltOiBleHByIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBleHByICE9PSBudWxsKSB7XG4gICAgICBleHByLmxhdGV4ID0gbGF0ZXg7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG4gIGVycm9yKGNvZGUsIGZyb21Ub2tlbikge1xuICAgIGxldCBtc2c7XG4gICAgaWYgKHR5cGVvZiBjb2RlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoIWNvZGUuc3RhcnRzV2l0aChcIidcIikpO1xuICAgICAgbXNnID0geyBzdHI6IGNvZGUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KCFjb2RlWzBdLnN0YXJ0c1dpdGgoXCInXCIpKTtcbiAgICAgIG1zZyA9IFtcIkVycm9yQ29kZVwiLCB7IHN0cjogY29kZVswXSB9LCAuLi5jb2RlLnNsaWNlKDEpXTtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXggPSB0aGlzLmxhdGV4KGZyb21Ub2tlbiwgdGhpcy5pbmRleCk7XG4gICAgcmV0dXJuIGxhdGV4ID8gW1wiRXJyb3JcIiwgbXNnLCBbXCJMYXRleFwiLCB7IHN0cjogbGF0ZXggfV1dIDogW1wiRXJyb3JcIiwgbXNnXTtcbiAgfVxuICBpc0Z1bmN0aW9uSGVhZChleHByKSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcyA9IHN5bWJvbChleHByKTtcbiAgICBpZiAoIXMpXG4gICAgICByZXR1cm4gdGhpcy5jb21wdXRlRW5naW5lLmJveChleHByKS5kb21haW4uaXNGdW5jdGlvbjtcbiAgICBpZiAodGhpcy5jb21wdXRlRW5naW5lICYmIHRoaXMuY29tcHV0ZUVuZ2luZS5sb29rdXBGdW5jdGlvbihzKSAhPT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZVVua25vd25JZGVudGlmaWVyPy4ocywgdGhpcykgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiogUmV0dXJuIGFsbCBkZWZzIG9mIHRoZSBzcGVjaWZpZWQga2luZCAqL1xuICAqZ2V0RGVmcyhraW5kKSB7XG4gICAgaWYgKGtpbmQgPT09IFwib3BlcmF0b3JcIikge1xuICAgICAgZm9yIChjb25zdCBkZWYgb2YgdGhpcy5fZGljdGlvbmFyeS5kZWZzKVxuICAgICAgICBpZiAoL15wcmVmaXh8aW5maXh8cG9zdGZpeC8udGVzdChkZWYua2luZCkpXG4gICAgICAgICAgeWllbGQgZGVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGRlZiBvZiB0aGlzLl9kaWN0aW9uYXJ5LmRlZnMpXG4gICAgICAgIGlmIChkZWYua2luZCA9PT0ga2luZClcbiAgICAgICAgICB5aWVsZCBkZWY7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gcGFyc2VDb21wbGV4SWQocGFyc2VyLCBpZCkge1xuICBjb25zdCBzdGFydCA9IHBhcnNlci5pbmRleDtcbiAgY29uc3QgY2FuZGlkYXRlID0gcGFyc2VJZGVudGlmaWVyKHBhcnNlcik/LnRyaW0oKTtcbiAgaWYgKGNhbmRpZGF0ZSA9PT0gbnVsbClcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgcmVzdWx0ID0gY2FuZGlkYXRlICE9PSBpZCA/IDAgOiBwYXJzZXIuaW5kZXggLSBzdGFydDtcbiAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9sYXRleC1zeW50YXgvc2VyaWFsaXplLW51bWJlci50c1xuZnVuY3Rpb24gZm9ybWF0RnJhY3Rpb25hbFBhcnQobSwgb3B0aW9ucykge1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG0ubGVuZ3RoO1xuICBjb25zdCBvcmlnaW5hbE0gPSBtO1xuICBpZiAob3B0aW9ucy5iZWdpblJlcGVhdGluZ0RpZ2l0cyAmJiBvcHRpb25zLmVuZFJlcGVhdGluZ0RpZ2l0cykge1xuICAgIG0gPSBtLnNsaWNlKDAsIC0xKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG0ubGVuZ3RoIC0gMTY7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gbS5zdWJzdHJpbmcoMCwgaSk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE3OyBqKyspIHtcbiAgICAgICAgY29uc3QgY3ljbGUgPSBtLnN1YnN0cmluZyhpLCBpICsgaiArIDEpO1xuICAgICAgICBjb25zdCB0aW1lcyA9IE1hdGguZmxvb3IoKG0ubGVuZ3RoIC0gb2Zmc2V0Lmxlbmd0aCkgLyBjeWNsZS5sZW5ndGgpO1xuICAgICAgICBpZiAodGltZXMgPD0gMylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKChvZmZzZXQgKyBjeWNsZS5yZXBlYXQodGltZXMgKyAxKSkuc3RhcnRzV2l0aChtKSkge1xuICAgICAgICAgIGlmIChjeWNsZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBvZmZzZXQucmVwbGFjZSgvKFxcZHszfSkvZywgXCIkMVwiICsgb3B0aW9ucy5ncm91cFNlcGFyYXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZmZzZXQucmVwbGFjZSgvKFxcZHszfSkvZywgXCIkMVwiICsgb3B0aW9ucy5ncm91cFNlcGFyYXRvcikgKyBvcHRpb25zLmJlZ2luUmVwZWF0aW5nRGlnaXRzICsgY3ljbGUgKyBvcHRpb25zLmVuZFJlcGVhdGluZ0RpZ2l0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBleHRyYURpZ2l0cyA9IG9yaWdpbmFsTGVuZ3RoID4gb3B0aW9ucy5wcmVjaXNpb24gLSAxO1xuICBtID0gb3JpZ2luYWxNO1xuICBpZiAoZXh0cmFEaWdpdHMpXG4gICAgbSA9IG0uc3Vic3RyaW5nKDAsIG9wdGlvbnMucHJlY2lzaW9uIC0gMSk7XG4gIGlmIChvcHRpb25zLmdyb3VwU2VwYXJhdG9yKSB7XG4gICAgbSA9IG0ucmVwbGFjZSgvKFxcZHszfSkvZywgXCIkMVwiICsgb3B0aW9ucy5ncm91cFNlcGFyYXRvcik7XG4gICAgaWYgKG0uZW5kc1dpdGgob3B0aW9ucy5ncm91cFNlcGFyYXRvcikpIHtcbiAgICAgIG0gPSBtLnNsaWNlKDAsIC1vcHRpb25zLmdyb3VwU2VwYXJhdG9yLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIGlmIChleHRyYURpZ2l0cylcbiAgICByZXR1cm4gbSArIG9wdGlvbnMudHJ1bmNhdGlvbk1hcmtlcjtcbiAgcmV0dXJuIG07XG59XG5mdW5jdGlvbiBmb3JtYXRFeHBvbmVudChleHAyLCBvcHRpb25zKSB7XG4gIGlmICghZXhwMilcbiAgICByZXR1cm4gXCJcIjtcbiAgaWYgKG9wdGlvbnMuYmVnaW5FeHBvbmVudE1hcmtlcikge1xuICAgIHJldHVybiBvcHRpb25zLmJlZ2luRXhwb25lbnRNYXJrZXIgKyBleHAyICsgKG9wdGlvbnMuZW5kRXhwb25lbnRNYXJrZXIgPz8gXCJcIik7XG4gIH1cbiAgcmV0dXJuIFwiMTBee1wiICsgZXhwMiArIFwifVwiO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplTnVtYmVyKGV4cHIsIG9wdGlvbnMpIHtcbiAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIGxldCBudW07XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIikge1xuICAgIG51bSA9IGV4cHI7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09IFwib2JqZWN0XCIgJiYgXCJudW1cIiBpbiBleHByKSB7XG4gICAgbnVtID0gZXhwci5udW07XG4gIH0gZWxzZVxuICAgIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChudW0gPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpdmVJbmZpbml0eTtcbiAgICBlbHNlIGlmIChudW0gPT09IC1JbmZpbml0eSlcbiAgICAgIHJldHVybiBvcHRpb25zLm5lZ2F0aXZlSW5maW5pdHk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzTmFOKG51bSkpXG4gICAgICByZXR1cm4gb3B0aW9ucy5ub3RBTnVtYmVyO1xuICAgIGxldCByZXN1bHQyID0gdm9pZCAwO1xuICAgIGlmIChvcHRpb25zLm5vdGF0aW9uID09PSBcImVuZ2luZWVyaW5nXCIpXG4gICAgICByZXN1bHQyID0gc2VyaWFsaXplU2NpZW50aWZpY05vdGF0aW9uTnVtYmVyKFxuICAgICAgICBudW0udG9FeHBvbmVudGlhbCgpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAzXG4gICAgICApO1xuICAgIGVsc2UgaWYgKG9wdGlvbnMubm90YXRpb24gPT09IFwic2NpZW50aWZpY1wiKVxuICAgICAgcmVzdWx0MiA9IHNlcmlhbGl6ZVNjaWVudGlmaWNOb3RhdGlvbk51bWJlcihudW0udG9FeHBvbmVudGlhbCgpLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0MiA/PyBzZXJpYWxpemVBdXRvTm90YXRpb25OdW1iZXIobnVtLnRvU3RyaW5nKCksIG9wdGlvbnMpO1xuICB9XG4gIG51bSA9IG51bS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tcXHUwMDA5LVxcdTAwMGRcXHUwMDIwXFx1MDBhMF0vZywgXCJcIik7XG4gIGlmIChudW0gPT09IFwiaW5maW5pdHlcIiB8fCBudW0gPT09IFwiK2luZmluaXR5XCIpXG4gICAgcmV0dXJuIG9wdGlvbnMucG9zaXRpdmVJbmZpbml0eTtcbiAgZWxzZSBpZiAobnVtID09PSBcIi1pbmZpbml0eVwiKVxuICAgIHJldHVybiBvcHRpb25zLm5lZ2F0aXZlSW5maW5pdHk7XG4gIGVsc2UgaWYgKG51bSA9PT0gXCJuYW5cIilcbiAgICByZXR1cm4gb3B0aW9ucy5ub3RBTnVtYmVyO1xuICBpZiAoIS9eWy0rXFwuXT9bMC05XS8udGVzdChudW0pKVxuICAgIHJldHVybiBcIlwiO1xuICBudW0gPSBudW0ucmVwbGFjZSgvW25kXSQvLCBcIlwiKTtcbiAgaWYgKC9cXChbMC05XStcXCkvLnRlc3QobnVtKSkge1xuICAgIGNvbnN0IFtfLCBib2R5LCByZXBlYXQsIHRyYWlsXSA9IG51bS5tYXRjaCgvKC4rKVxcKChbMC05XSspXFwpKC4qKSQvKSA/PyBbXTtcbiAgICBudW0gPSBib2R5ICsgcmVwZWF0LnJlcGVhdChNYXRoLmNlaWwob3B0aW9ucy5wcmVjaXNpb24gLyByZXBlYXQubGVuZ3RoKSkgKyB0cmFpbDtcbiAgfVxuICBsZXQgc2lnbjIgPSBcIlwiO1xuICBpZiAobnVtWzBdID09PSBcIi1cIikge1xuICAgIHNpZ24yID0gXCItXCI7XG4gICAgbnVtID0gbnVtLnN1YnN0cmluZygxKTtcbiAgfSBlbHNlIGlmIChudW1bMF0gPT09IFwiK1wiKSB7XG4gICAgbnVtID0gbnVtLnN1YnN0cmluZygxKTtcbiAgfVxuICB3aGlsZSAobnVtWzBdID09PSBcIjBcIilcbiAgICBudW0gPSBudW0uc3Vic3RyaW5nKDEpO1xuICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICBudW0gPSBcIjBcIjtcbiAgZWxzZSBpZiAobnVtWzBdID09PSBcIi5cIilcbiAgICBudW0gPSBcIjBcIiArIG51bTtcbiAgbGV0IHJlc3VsdCA9IHZvaWQgMDtcbiAgaWYgKG9wdGlvbnMubm90YXRpb24gPT09IFwiZW5naW5lZXJpbmdcIilcbiAgICByZXN1bHQgPSBzZXJpYWxpemVTY2llbnRpZmljTm90YXRpb25OdW1iZXIobnVtLCBvcHRpb25zLCAzKTtcbiAgZWxzZSBpZiAob3B0aW9ucy5ub3RhdGlvbiA9PT0gXCJzY2llbnRpZmljXCIpXG4gICAgcmVzdWx0ID0gc2VyaWFsaXplU2NpZW50aWZpY05vdGF0aW9uTnVtYmVyKG51bSwgb3B0aW9ucyk7XG4gIHJldHVybiBzaWduMiArIChyZXN1bHQgPz8gc2VyaWFsaXplQXV0b05vdGF0aW9uTnVtYmVyKG51bSwgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplU2NpZW50aWZpY05vdGF0aW9uTnVtYmVyKHZhbFN0cmluZywgb3B0aW9ucywgZXhwTXVsdGlwbGUgPSAxKSB7XG4gIGxldCBtID0gdmFsU3RyaW5nLm1hdGNoKC9eKC4qKVtlfEVdKFstK10/WzAtOV0rKSQvKTtcbiAgaWYgKCFtKSB7XG4gICAgbGV0IHNpZ24yID0gXCJcIjtcbiAgICBpZiAodmFsU3RyaW5nWzBdID09PSBcIi1cIikge1xuICAgICAgc2lnbjIgPSBcIi1cIjtcbiAgICAgIHZhbFN0cmluZyA9IHZhbFN0cmluZy5zdWJzdHJpbmcoMSk7XG4gICAgfSBlbHNlIGlmICh2YWxTdHJpbmdbMF0gPT09IFwiK1wiKSB7XG4gICAgICB2YWxTdHJpbmcgPSB2YWxTdHJpbmcuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBpZiAodmFsU3RyaW5nLmluZGV4T2YoXCIuXCIpIDwgMCkge1xuICAgICAgaWYgKHZhbFN0cmluZy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsU3RyaW5nID0gc2lnbjIgKyB2YWxTdHJpbmcgKyBcImUrMFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsU3RyaW5nID0gc2lnbjIgKyB2YWxTdHJpbmdbMF0gKyBcIi5cIiArIHZhbFN0cmluZy5zbGljZSgxKSArIFwiZStcIiArICh2YWxTdHJpbmcubGVuZ3RoIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IFtfLCB3aG9sZSwgZnJhY3Rpb25dID0gdmFsU3RyaW5nLm1hdGNoKC9eKC4qKVxcLiguKikkLyk7XG4gICAgICBpZiAoIWZyYWN0aW9uKVxuICAgICAgICBmcmFjdGlvbiA9IFwiXCI7XG4gICAgICB3aGlsZSAod2hvbGUuc3RhcnRzV2l0aChcIjBcIikpXG4gICAgICAgIHdob2xlID0gd2hvbGUuc3Vic3RyaW5nKDEpO1xuICAgICAgaWYgKCF3aG9sZSkge1xuICAgICAgICB2YWxTdHJpbmcgPSBzaWduMiArIFwiMC5cIiArIGZyYWN0aW9uICsgXCJlKzBcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbFN0cmluZyA9IHNpZ24yICsgd2hvbGVbMF0gKyBcIi5cIiArIHdob2xlLnNsaWNlKDEpICsgZnJhY3Rpb24gKyBcImUrXCIgKyAod2hvbGUubGVuZ3RoIC0gMSkudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbSA9IHZhbFN0cmluZy5tYXRjaCgvXiguKilbZXxFXShbLStdP1swLTldKykkLyk7XG4gIH1cbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG0pO1xuICBpZiAoIW0pXG4gICAgcmV0dXJuIHNlcmlhbGl6ZUF1dG9Ob3RhdGlvbk51bWJlcih2YWxTdHJpbmcsIG9wdGlvbnMpO1xuICBsZXQgZXhwb25lbnQgPSBwYXJzZUludChtWzJdKTtcbiAgbGV0IG1hbnRpc3NhID0gbVsxXTtcbiAgaWYgKE1hdGguYWJzKGV4cG9uZW50KSAlIGV4cE11bHRpcGxlICE9PSAwKSB7XG4gICAgY29uc3QgYWRqdXN0ID0gZXhwb25lbnQgPiAwID8gZXhwb25lbnQgJSBleHBNdWx0aXBsZSA6IC0oKGV4cE11bHRpcGxlICsgZXhwb25lbnQpICUgZXhwTXVsdGlwbGUpO1xuICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj0gMCA/IGV4cG9uZW50IC0gYWRqdXN0IDogZXhwb25lbnQgKyBhZGp1c3Q7XG4gICAgbGV0IFtfLCB3aG9sZSwgZnJhY3Rpb25dID0gbWFudGlzc2EubWF0Y2goL14oLiopXFwuKC4qKSQvKSA/PyBbXG4gICAgICBcIlwiLFxuICAgICAgbWFudGlzc2EsXG4gICAgICBcIlwiXG4gICAgXTtcbiAgICBtYW50aXNzYSA9IHdob2xlICsgKGZyYWN0aW9uICsgXCIwMDAwMDAwMDAwMDAwMDAwMFwiKS5zbGljZSgwLCBNYXRoLmFicyhhZGp1c3QpKSArIFwiLlwiICsgZnJhY3Rpb24uc2xpY2UoTWF0aC5hYnMoYWRqdXN0KSk7XG4gIH1cbiAgY29uc3QgYXZvaWQgPSBvcHRpb25zLmF2b2lkRXhwb25lbnRzSW5SYW5nZTtcbiAgaWYgKGF2b2lkICYmIGV4cG9uZW50ID49IGF2b2lkWzBdICYmIGV4cG9uZW50IDw9IGF2b2lkWzFdKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCBmcmFjdGlvbmFsUGFydCA9IFwiXCI7XG4gIGxldCB3aG9sZVBhcnQgPSBtYW50aXNzYTtcbiAgbSA9IHdob2xlUGFydC5tYXRjaCgvXiguKilcXC4oLiopJC8pO1xuICBpZiAobSkge1xuICAgIHdob2xlUGFydCA9IG1bMV07XG4gICAgZnJhY3Rpb25hbFBhcnQgPSBtWzJdO1xuICB9XG4gIGNvbnN0IGV4cFN0cmluZyA9IGV4cG9uZW50ICE9PSAwID8gZm9ybWF0RXhwb25lbnQoTnVtYmVyKGV4cG9uZW50KS50b1N0cmluZygpLCBvcHRpb25zKSA6IFwiXCI7XG4gIGlmIChvcHRpb25zLmdyb3VwU2VwYXJhdG9yKSB7XG4gICAgd2hvbGVQYXJ0ID0gd2hvbGVQYXJ0LnJlcGxhY2UoXG4gICAgICAvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcbiAgICAgIG9wdGlvbnMuZ3JvdXBTZXBhcmF0b3JcbiAgICApO1xuICAgIGZyYWN0aW9uYWxQYXJ0ID0gZm9ybWF0RnJhY3Rpb25hbFBhcnQoZnJhY3Rpb25hbFBhcnQsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChmcmFjdGlvbmFsUGFydClcbiAgICBmcmFjdGlvbmFsUGFydCA9IG9wdGlvbnMuZGVjaW1hbE1hcmtlciArIGZyYWN0aW9uYWxQYXJ0O1xuICBpZiAoIWV4cFN0cmluZylcbiAgICByZXR1cm4gd2hvbGVQYXJ0ICsgZnJhY3Rpb25hbFBhcnQ7XG4gIGlmICh3aG9sZVBhcnQgPT09IFwiMVwiICYmICFmcmFjdGlvbmFsUGFydClcbiAgICByZXR1cm4gZXhwU3RyaW5nO1xuICByZXR1cm4gd2hvbGVQYXJ0ICsgZnJhY3Rpb25hbFBhcnQgKyBvcHRpb25zLmV4cG9uZW50UHJvZHVjdCArIGV4cFN0cmluZztcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUF1dG9Ob3RhdGlvbk51bWJlcih2YWxTdHJpbmcsIG9wdGlvbnMpIHtcbiAgbGV0IG0gPSB2YWxTdHJpbmcubWF0Y2goL14oLiopW2V8RV0oWy0rXT9bMC05XSspJC9pKTtcbiAgbGV0IGV4cG9uZW50ID0gdm9pZCAwO1xuICBpZiAobT8uWzFdICYmIG1bMl0pIHtcbiAgICBleHBvbmVudCA9IGZvcm1hdEV4cG9uZW50KG1bMl0sIG9wdGlvbnMpO1xuICB9XG4gIGxldCB3aG9sZVBhcnQgPSBtPy5bMV0gPz8gdmFsU3RyaW5nO1xuICBsZXQgZnJhY3Rpb25hbFBhcnQgPSBcIlwiO1xuICBtID0gKGV4cG9uZW50ID8gbVsxXSA6IHZhbFN0cmluZykubWF0Y2goL14oLiopXFwuKC4qKSQvKTtcbiAgaWYgKG0/LlsxXSAmJiBtWzJdKSB7XG4gICAgd2hvbGVQYXJ0ID0gbVsxXTtcbiAgICBmcmFjdGlvbmFsUGFydCA9IG1bMl07XG4gIH1cbiAgaWYgKG9wdGlvbnMuZ3JvdXBTZXBhcmF0b3IpIHtcbiAgICB3aG9sZVBhcnQgPSB3aG9sZVBhcnQucmVwbGFjZShcbiAgICAgIC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLFxuICAgICAgb3B0aW9ucy5ncm91cFNlcGFyYXRvclxuICAgICk7XG4gICAgZnJhY3Rpb25hbFBhcnQgPSBmb3JtYXRGcmFjdGlvbmFsUGFydChmcmFjdGlvbmFsUGFydCwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGZyYWN0aW9uYWxQYXJ0KVxuICAgIGZyYWN0aW9uYWxQYXJ0ID0gb3B0aW9ucy5kZWNpbWFsTWFya2VyICsgZnJhY3Rpb25hbFBhcnQ7XG4gIGlmICghZXhwb25lbnQpXG4gICAgcmV0dXJuIHdob2xlUGFydCArIGZyYWN0aW9uYWxQYXJ0O1xuICBpZiAod2hvbGVQYXJ0ID09PSBcIjFcIiAmJiAhZnJhY3Rpb25hbFBhcnQpXG4gICAgcmV0dXJuIGV4cG9uZW50O1xuICByZXR1cm4gd2hvbGVQYXJ0ICsgZnJhY3Rpb25hbFBhcnQgKyBvcHRpb25zLmV4cG9uZW50UHJvZHVjdCArIGV4cG9uZW50O1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGF0ZXgtc3ludGF4L3NlcmlhbGl6ZXIudHNcbnZhciBBQ0NFTlRfTU9ESUZJRVJTID0ge1xuICBkZWc6IChzKSA9PiBgJHtzfVxcXFxkZWdyZWVgLFxuICBwcmltZTogKHMpID0+IGAke3N9XntcXFxccHJpbWV9YCxcbiAgZHByaW1lOiAocykgPT4gYCR7c31ee1xcXFxkb3VibGVwcmltZX1gLFxuICByaW5nOiAocykgPT4gYFxcXFxtYXRocmluZ3ske3N9fWAsXG4gIGhhdDogKHMpID0+IGBcXFxcaGF0eyR7c319YCxcbiAgdGlsZGU6IChzKSA9PiBgXFxcXHRpbGRleyR7c319YCxcbiAgdmVjOiAocykgPT4gYFxcXFx2ZWN7JHtzfX1gLFxuICBiYXI6IChzKSA9PiBgXFxcXG92ZXJsaW5leyR7c319YCxcbiAgdW5kZXJiYXI6IChzKSA9PiBgXFxcXHVuZGVybGluZXske3N9fWAsXG4gIGRvdDogKHMpID0+IGBcXFxcZG90eyR7c319YCxcbiAgZGRvdDogKHMpID0+IGBcXFxcZGRvdHske3N9fWAsXG4gIHRkb3Q6IChzKSA9PiBgXFxcXGRkZG90eyR7c319YCxcbiAgcWRvdDogKHMpID0+IGBcXFxcZGRkZG90eyR7c319YCxcbiAgLy8gU3VwcGxlbWVudGFsXG4gIGFjdXRlOiAocykgPT4gYFxcXFxhY3V0ZXske3N9fWAsXG4gIGdyYXZlOiAocykgPT4gYFxcXFxncmF2ZXske3N9fWAsXG4gIGJyZXZlOiAocykgPT4gYFxcXFxicmV2ZXske3N9fWAsXG4gIGNoZWNrOiAocykgPT4gYFxcXFxjaGVja3ske3N9fWBcbn07XG52YXIgU1RZTEVfTU9ESUZJRVJTID0ge1xuICB1cHJpZ2h0OiAocykgPT4gYFxcXFxtYXRocm17JHtzfX1gLFxuICBpdGFsaWM6IChzKSA9PiBgXFxcXG1hdGhpdHske3N9fWAsXG4gIGJvbGQ6IChzKSA9PiBgXFxcXG1hdGhiZnske3N9fWAsXG4gIHNjcmlwdDogKHMpID0+IGBcXFxcbWF0aHNjcnske3N9fWAsXG4gIGZyYWt0dXI6IChzKSA9PiBgXFxcXG1hdGhmcmFreyR7c319YCxcbiAgLy8gTm90ZSBVbmljb2RlIHVzZXMgJ2ZyYWt0dXInIGZvciAnZ290aGljJ1xuICBkb3VibGVzdHJ1Y2s6IChzKSA9PiBgXFxcXG1hdGhiYnske3N9fWAsXG4gIC8vIFVuaWNvZGUgdXNlcyAnZG91YmxlLXN0cnVjaycgZm9yICdibGFja2JvYXJkJ1xuICAvLyBTdXBwbGVtZW50YWxcbiAgYmxhY2tib2FyZDogKHMpID0+IGBcXFxcbWF0aGJieyR7c319YCxcbiAgY2FsbGlncmFwaGljOiAocykgPT4gYFxcXFxtYXRoY2FseyR7c319YCxcbiAgZ290aGljOiAocykgPT4gYFxcXFxtYXRoZnJha3ske3N9fWAsXG4gIHNhbnNzZXJpZjogKHMpID0+IGBcXFxcbWF0aHNmeyR7c319YCxcbiAgbW9ub3NwYWNlOiAocykgPT4gYFxcXFxtYXRodHR7JHtzfX1gXG59O1xudmFyIFNlcmlhbGl6ZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGRpY3Rpb25hcnkyLCBvbkVycm9yKSB7XG4gICAgdGhpcy5sZXZlbCA9IC0xO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMuaW52aXNpYmxlTXVsdGlwbHkpIHtcbiAgICAgIGlmICghLyMxLy50ZXN0KG9wdGlvbnMuaW52aXNpYmxlTXVsdGlwbHkpIHx8ICEvIzIvLnRlc3Qob3B0aW9ucy5pbnZpc2libGVNdWx0aXBseSkpIHtcbiAgICAgICAgb25FcnJvcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogW1wiZXhwZWN0ZWQtYXJndW1lbnRcIiwgXCJpbnZpc2libGVNdWx0aXBseVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I7XG4gICAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTI7XG4gICAgdGhpcy5jYW5vbmljYWwgPSB2b2lkIDA7XG4gIH1cbiAgdXBkYXRlT3B0aW9ucyhvcHQpIHtcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModGhpcy5vcHRpb25zKSlcbiAgICAgIGlmIChrIGluIG9wdClcbiAgICAgICAgdGhpcy5vcHRpb25zW2tdID0gb3B0W2tdO1xuICB9XG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIGV4cHJlc3Npb24sIGFuZCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBhbiBvcGVyYXRvclxuICAgKiBvZiBwcmVjZWRlbmNlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmVjLCB3cmFwIGl0IGluIHNvbWUgcGFyZW4uXG4gICAqIEB0b2RvOiBkb24ndCB3cmFwIEFicywgRmxvb3IsIENlaWwsIERlbGltaXRlclxuICAgKi9cbiAgd3JhcChleHByLCBwcmVjKSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICBpZiAocHJlYyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdGhpcy53cmFwU3RyaW5nKFxuICAgICAgICB0aGlzLnNlcmlhbGl6ZShleHByKSxcbiAgICAgICAgdGhpcy5vcHRpb25zLmdyb3VwU3R5bGUoZXhwciwgdGhpcy5sZXZlbCArIDEpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cHIgPT09IFwibnVtYmVyXCIgfHwgaXNOdW1iZXJPYmplY3QoZXhwcikgfHwgdHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIgfHwgaXNTeW1ib2xPYmplY3QoZXhwcikpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZShleHByKTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGhlYWQoZXhwcik7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICYmIG5hbWUgIT09IFwiRGVsaW1pdGVyXCIgJiYgbmFtZSAhPT0gXCJTdWJzY3JpcHRcIikge1xuICAgICAgY29uc3QgZGVmID0gdGhpcy5kaWN0aW9uYXJ5Lmlkcy5nZXQobmFtZSk7XG4gICAgICBpZiAoZGVmICYmIChkZWYua2luZCA9PT0gXCJzeW1ib2xcIiB8fCBkZWYua2luZCA9PT0gXCJwcmVmaXhcIiB8fCBkZWYua2luZCA9PT0gXCJpbmZpeFwiIHx8IGRlZi5raW5kID09PSBcInBvc3RmaXhcIikgJiYgZGVmLnByZWNlZGVuY2UgPCBwcmVjKVxuICAgICAgICByZXR1cm4gdGhpcy53cmFwU3RyaW5nKFxuICAgICAgICAgIHRoaXMuc2VyaWFsaXplKGV4cHIpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgdGhpcy5sZXZlbClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKGV4cHIpO1xuICB9XG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIGEgXCJzaG9ydFwiIGV4cHJlc3Npb24sIHdyYXAgaXQuXG4gICAqIERvIG5vdCB3cmFwIGlkZW50aWZpZXJzLCBwb3NpdGl2ZSBudW1iZXJzIG9yIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHNlcmlhbGl6ZXIgZm9yIHBvd2VyIGFuZCBkaXZpc2lvbiAoaS5lLiBcIihhKzEpL2JcIilcbiAgICpcbiAgICovXG4gIHdyYXBTaG9ydChleHByKSB7XG4gICAgaWYgKGV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBleHByU3RyID0gdGhpcy5zZXJpYWxpemUoZXhwcik7XG4gICAgaWYgKHN5bWJvbChleHByKSAhPT0gbnVsbClcbiAgICAgIHJldHVybiBleHByU3RyO1xuICAgIGlmIChoZWFkKGV4cHIpID09PSBcIkRlbGltaXRlclwiICYmIG5vcHMoZXhwcikgPT09IDEpXG4gICAgICByZXR1cm4gZXhwclN0cjtcbiAgICBjb25zdCBpc051bSA9IGlzTnVtYmVyRXhwcmVzc2lvbihleHByKTtcbiAgICBpZiAoaXNOdW0gJiYgIS9eKC18XFwuKS8udGVzdChleHByU3RyKSlcbiAgICAgIHJldHVybiBleHByU3RyO1xuICAgIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICAgIGlmIChoICE9PSBcIkFkZFwiICYmIGggIT09IFwiTmVnYXRlXCIgJiYgaCAhPT0gXCJTdWJ0cmFjdFwiICYmIGggIT09IFwiUGx1c01pbnVzXCIgJiYgaCAhPT0gXCJNdWx0aXBseVwiKVxuICAgICAgcmV0dXJuIGV4cHJTdHI7XG4gICAgcmV0dXJuIHRoaXMud3JhcFN0cmluZyhcbiAgICAgIGV4cHJTdHIsXG4gICAgICB0aGlzLm9wdGlvbnMuZ3JvdXBTdHlsZShleHByLCB0aGlzLmxldmVsICsgMSlcbiAgICApO1xuICB9XG4gIHdyYXBTdHJpbmcocywgc3R5bGUsIGZlbmNlKSB7XG4gICAgaWYgKHN0eWxlID09PSBcIm5vbmVcIilcbiAgICAgIHJldHVybiBzO1xuICAgIGlmIChmZW5jZSA9PT0gdm9pZCAwKVxuICAgICAgZmVuY2UgPSBcIigpXCI7XG4gICAgY29uc3Qgb3BlbkZlbmNlID0gZmVuY2U/LlswXSA/PyBcIi5cIjtcbiAgICBjb25zdCBjbG9zZUZlbmNlID0gZmVuY2U/LlsxXSA/PyBcIi5cIjtcbiAgICBpZiAoKG9wZW5GZW5jZSA9PT0gXCIuXCIgfHwgY2xvc2VGZW5jZSA9PT0gXCIuXCIpICYmIHN0eWxlID09PSBcInBhcmVuXCIpXG4gICAgICBzdHlsZSA9IFwibGVmdHJpZ2h0XCI7XG4gICAgaWYgKHN0eWxlID09PSBcImxlZnRyaWdodFwiKVxuICAgICAgcmV0dXJuIGBcXFxcbGVmdCR7b3BlbkZlbmNlfSR7c31cXFxccmlnaHQke2Nsb3NlRmVuY2V9fWA7XG4gICAgaWYgKHN0eWxlID09PSBcImJpZ1wiKVxuICAgICAgcmV0dXJuIGAke29wZW5GZW5jZSA9PT0gXCIuXCIgPyBcIlwiIDogYFxcXFxCaWdsJHtvcGVuRmVuY2V9YH0ke3N9JHtjbG9zZUZlbmNlID09PSBcIi5cIiA/IFwiXCIgOiBgXFxcXEJpZ3Ike2Nsb3NlRmVuY2V9YH0pYDtcbiAgICByZXR1cm4gb3BlbkZlbmNlICsgcyArIGNsb3NlRmVuY2U7XG4gIH1cbiAgd3JhcEFyZ3VtZW50cyhleHByKSB7XG4gICAgcmV0dXJuIHRoaXMud3JhcFN0cmluZyhcbiAgICAgIChvcHMoZXhwcikgPz8gW10pLm1hcCgoeCkgPT4gdGhpcy5zZXJpYWxpemUoeCkpLmpvaW4oXCIsIFwiKSxcbiAgICAgIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgdGhpcy5sZXZlbClcbiAgICApO1xuICB9XG4gIHNlcmlhbGl6ZVN5bWJvbChleHByLCBkZWYpIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIgfHwgaXNTeW1ib2xPYmplY3QoZXhwcikpO1xuICAgIGlmIChkZWY/LmtpbmQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUlkZW50aWZpZXIoc3ltYm9sKGV4cHIpID8/IFwiXCIpID8/IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBkZWY/LnNlcmlhbGl6ZT8uKHRoaXMsIGV4cHIpID8/IHNlcmlhbGl6ZUlkZW50aWZpZXIoc3ltYm9sKGV4cHIpKSA/PyBcIlwiO1xuICB9XG4gIHNlcmlhbGl6ZUZ1bmN0aW9uKGV4cHIsIGRlZikge1xuICAgIGlmIChkZWY/LnNlcmlhbGl6ZSlcbiAgICAgIHJldHVybiBkZWYuc2VyaWFsaXplKHRoaXMsIGV4cHIpO1xuICAgIGNvbnN0IGggPSBoZWFkKGV4cHIpO1xuICAgIGlmICh0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBzZXJpYWxpemVJZGVudGlmaWVyKGgsIFwiYXV0b1wiKSArIHRoaXMud3JhcEFyZ3VtZW50cyhleHByKTtcbiAgICBjb25zdCBhcmdzID0gb3BzKGV4cHIpID8/IFtdO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGpvaW5MYXRleChbXG4gICAgICAgIHRoaXMuc2VyaWFsaXplKGFyZ3NbMF0pLFxuICAgICAgICBcIlxcXFxyaGRcIixcbiAgICAgICAgdGhpcy53cmFwU3RyaW5nKFxuICAgICAgICAgIHRoaXMuc2VyaWFsaXplKGgpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgdGhpcy5sZXZlbClcbiAgICAgICAgKVxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5vcHRpb25zLmFwcGx5RnVuY3Rpb25TdHlsZShleHByLCB0aGlzLmxldmVsKTtcbiAgICByZXR1cm4gam9pbkxhdGV4KFtcbiAgICAgIFwiXFxcXG9wZXJhdG9ybmFtZXthcHBseX1cIixcbiAgICAgIHRoaXMud3JhcFN0cmluZyhcbiAgICAgICAgdGhpcy5zZXJpYWxpemUoaCkgKyBcIiwgXCIgKyB0aGlzLnNlcmlhbGl6ZShbXCJMaXN0XCIsIC4uLmFyZ3NdKSxcbiAgICAgICAgc3R5bGVcbiAgICAgIClcbiAgICBdKTtcbiAgfVxuICBzZXJpYWxpemVEaWN0aW9uYXJ5KGRpY3QpIHtcbiAgICByZXR1cm4gYFxcXFxsZWZ0XFxcXGxicmFja1xcXFxiZWdpbnthcnJheX17bGxsfSR7T2JqZWN0LmtleXMoZGljdCkubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4gYFxcXFx0ZXh0YmZ7JHt4fX0gJiBcXFxccmlnaHRhcnJvdyAmICR7dGhpcy5zZXJpYWxpemUoZGljdFt4XSl9YDtcbiAgICB9KS5qb2luKFwiXFxcXFxcXFxcIil9XFxcXGVuZHthcnJheX1cXFxccmlnaHRcXFxccmJyYWNrYDtcbiAgfVxuICBzZXJpYWxpemUoZXhwciwgb3B0aW9ucykge1xuICAgIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIG9wdGlvbnMgPz8gKG9wdGlvbnMgPSB7fSk7XG4gICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9O1xuICAgIGlmICghKFwiY2Fub25pY2FsXCIgaW4gb3B0aW9ucykpXG4gICAgICBvcHRpb25zLmNhbm9uaWNhbCA9IHRydWU7XG4gICAgY29uc3Qgc2F2ZWRDYW5vbmljYWwgPSB0aGlzLmNhbm9uaWNhbDtcbiAgICBpZiAodGhpcy5jYW5vbmljYWwgPT09IHZvaWQgMClcbiAgICAgIHRoaXMuY2Fub25pY2FsID0gb3B0aW9ucy5jYW5vbmljYWw7XG4gICAgdGhpcy5sZXZlbCArPSAxO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSBzZXJpYWxpemVOdW1iZXIoZXhwciwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgaWYgKG51bWVyaWNWYWx1ZSlcbiAgICAgICAgICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xuICAgICAgICBjb25zdCBzID0gc3RyaW5nVmFsdWUoZXhwcik7XG4gICAgICAgIGlmIChzICE9PSBudWxsKVxuICAgICAgICAgIHJldHVybiBgXFxcXHRleHR7JHtzfX1gO1xuICAgICAgICBjb25zdCBkaWN0ID0gZGljdGlvbmFyeShleHByKTtcbiAgICAgICAgaWYgKGRpY3QgIT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRGljdGlvbmFyeShkaWN0KTtcbiAgICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IHN5bWJvbChleHByKTtcbiAgICAgICAgaWYgKHN5bWJvbE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVTeW1ib2woXG4gICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5Lmlkcy5nZXQoc3ltYm9sTmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZuTmFtZSA9IGhlYWROYW1lKGV4cHIpO1xuICAgICAgICBpZiAoZm5OYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRnVuY3Rpb24oZXhwciwgdGhpcy5kaWN0aW9uYXJ5Lmlkcy5nZXQoZm5OYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWQoZXhwcikgIT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRnVuY3Rpb24oZXhwcik7XG4gICAgICAgIHRoaXMub25FcnJvcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogW1xuICAgICAgICAgICAgICBcInN5bnRheC1lcnJvclwiLFxuICAgICAgICAgICAgICBleHByID8gSlNPTi5zdHJpbmdpZnkoZXhwcikgOiBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdKTtcbiAgICAgIH0pKCk7XG4gICAgICB0aGlzLmxldmVsIC09IDE7XG4gICAgICB0aGlzLmNhbm9uaWNhbCA9IHNhdmVkQ2Fub25pY2FsO1xuICAgICAgcmV0dXJuIHJlc3VsdCA/PyBcIlwiO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICB9XG4gICAgdGhpcy5sZXZlbCAtPSAxO1xuICAgIHRoaXMuY2Fub25pY2FsID0gc2F2ZWRDYW5vbmljYWw7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgYXBwbHlGdW5jdGlvblN0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBseUZ1bmN0aW9uU3R5bGUoZXhwciwgbGV2ZWwpO1xuICB9XG4gIGdyb3VwU3R5bGUoZXhwciwgbGV2ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdyb3VwU3R5bGUoZXhwciwgbGV2ZWwpO1xuICB9XG4gIHJvb3RTdHlsZShleHByLCBsZXZlbCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm9vdFN0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBmcmFjdGlvblN0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5mcmFjdGlvblN0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBsb2dpY1N0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2dpY1N0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBwb3dlclN0eWxlKGV4cHIsIGxldmVsKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3dlclN0eWxlKGV4cHIsIGxldmVsKTtcbiAgfVxuICBudW1lcmljU2V0U3R5bGUoZXhwciwgbGV2ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm51bWVyaWNTZXRTdHlsZShleHByLCBsZXZlbCk7XG4gIH1cbn07XG5mdW5jdGlvbiBzcGVjaWFsTmFtZShzKSB7XG4gIGNvbnN0IHByZWZpeCA9IHMubWF0Y2goL14oW15fXSspLyk/LlsxXSA/PyBcIlwiO1xuICBsZXQgaSA9IFNZTUJPTFMuZmluZEluZGV4KCh4KSA9PiBwcmVmaXggPT09IHhbMF0pO1xuICBpZiAoaSA+PSAwKVxuICAgIHJldHVybiBbU1lNQk9MU1tpXVsxXSwgcy5zdWJzdHJpbmcoU1lNQk9MU1tpXVswXS5sZW5ndGgpXTtcbiAgY29uc3QgRElHSVRTID0ge1xuICAgIHplcm86IFwiMFwiLFxuICAgIG9uZTogXCIxXCIsXG4gICAgdHdvOiBcIjJcIixcbiAgICB0aHJlZTogXCIzXCIsXG4gICAgZm91cjogXCI0XCIsXG4gICAgZml2ZTogXCI1XCIsXG4gICAgc2l4OiBcIjZcIixcbiAgICBzZXZlbjogXCI3XCIsXG4gICAgZWlnaHQ6IFwiOFwiLFxuICAgIG5pbmU6IFwiOVwiLFxuICAgIHRlbjogXCIxMFwiXG4gIH07XG4gIGkgPSBPYmplY3Qua2V5cyhESUdJVFMpLmZpbmRJbmRleCgoeCkgPT4gcy5zdGFydHNXaXRoKHgpKTtcbiAgaWYgKGkgPj0gMCkge1xuICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKERJR0lUUylbaV07XG4gICAgcmV0dXJuIFtESUdJVFNba2V5XSwgcy5zdWJzdHJpbmcoa2V5Lmxlbmd0aCldO1xuICB9XG4gIGNvbnN0IGNvZGUgPSBzLmNvZGVQb2ludEF0KDApO1xuICBpID0gU1lNQk9MUy5maW5kSW5kZXgoKHgpID0+IHhbMl0gPT09IGNvZGUpO1xuICBpZiAoaSA+PSAwKVxuICAgIHJldHVybiBbU1lNQk9MU1tpXVsxXSwgcy5zdWJzdHJpbmcoMSldO1xuICBjb25zdCBFWFRSQV9TWU1CT0xTID0ge1xuICAgIHBsdXM6IFwiK1wiLFxuICAgIG1pbnVzOiBcIi1cIixcbiAgICBwbTogXCJcXFxccG1cIixcbiAgICBhc3Q6IFwiXFxcXGFzdFwiLFxuICAgIGRhZzogXCJcXFxcZGFnXCIsXG4gICAgZGRhZzogXCJcXFxcZGRhZ1wiLFxuICAgIGhhc2g6IFwiXFxcXCNcIixcbiAgICBib3R0b206IFwiXFxcXGJvdFwiLFxuICAgIHRvcDogXCJcXFxcdG9wXCIsXG4gICAgYnVsbGV0OiBcIlxcXFxidWxsZXRcIixcbiAgICBjaXJjbGU6IFwiXFxcXGNpcmNcIixcbiAgICBkaWFtb25kOiBcIlxcXFxkaWFtb25kXCIsXG4gICAgdGltZXM6IFwiXFxcXHRpbWVzXCIsXG4gICAgc3F1YXJlOiBcIlxcXFxzcXVhcmVcIixcbiAgICBzdGFyOiBcIlxcXFxzdGFyXCJcbiAgfTtcbiAgaSA9IE9iamVjdC5rZXlzKEVYVFJBX1NZTUJPTFMpLmZpbmRJbmRleCgoeCkgPT4gcHJlZml4ID09PSB4KTtcbiAgaWYgKGkgPj0gMCkge1xuICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKEVYVFJBX1NZTUJPTFMpW2ldO1xuICAgIHJldHVybiBbRVhUUkFfU1lNQk9MU1trZXldLCBzLnN1YnN0cmluZyhrZXkubGVuZ3RoKV07XG4gIH1cbiAgcmV0dXJuIFtwcmVmaXgsIHMuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpXTtcbn1cbmZ1bmN0aW9uIHBhcnNlTW9kaWZpZXJzKHMpIHtcbiAgbGV0IFtib2R5LCByZXN0XSA9IHNwZWNpYWxOYW1lKHMpO1xuICBjb25zdCBhY2NlbnQgPSBbXTtcbiAgd2hpbGUgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG0gPSByZXN0Lm1hdGNoKC9eXyhbYS16QS1aXSspKC4qKS8pO1xuICAgIGlmICghbSlcbiAgICAgIGJyZWFrO1xuICAgIGlmICghQUNDRU5UX01PRElGSUVSU1ttWzFdXSlcbiAgICAgIGJyZWFrO1xuICAgIGFjY2VudC5wdXNoKG1bMV0pO1xuICAgIHJlc3QgPSBtWzJdO1xuICB9XG4gIGNvbnN0IHN0eWxlcyA9IFtdO1xuICB3aGlsZSAocmVzdC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbSA9IHJlc3QubWF0Y2goL15fKFthLXpBLVpdKykoLiopLyk7XG4gICAgaWYgKCFtKVxuICAgICAgYnJlYWs7XG4gICAgaWYgKCFTVFlMRV9NT0RJRklFUlNbbVsxXV0pXG4gICAgICBicmVhaztcbiAgICBzdHlsZXMucHVzaChtWzFdKTtcbiAgICByZXN0ID0gbVsyXTtcbiAgfVxuICByZXR1cm4gW2JvZHksIGFjY2VudCwgc3R5bGVzLCByZXN0XTtcbn1cbmZ1bmN0aW9uIHBhcnNlSWRlbnRpZmllckJvZHkyKHMsIHRvcExldmVsID0gdHJ1ZSwgc3R5bGUgPSBcImF1dG9cIikge1xuICBsZXQgW2JvZHksIGFjY2VudHMsIHN0eWxlcywgcmVzdF0gPSBwYXJzZU1vZGlmaWVycyhzKTtcbiAgZm9yIChjb25zdCBhY2NlbnQgb2YgYWNjZW50cykge1xuICAgIGlmIChBQ0NFTlRfTU9ESUZJRVJTW2FjY2VudF0pXG4gICAgICBib2R5ID0gQUNDRU5UX01PRElGSUVSU1thY2NlbnRdKGJvZHkpO1xuICB9XG4gIGlmICh0b3BMZXZlbCkge1xuICAgIGNvbnN0IHN1cHMgPSBbXTtcbiAgICBjb25zdCBzdWJzMiA9IFtdO1xuICAgIGNvbnN0IG0gPSBib2R5Lm1hdGNoKC9eKFteXFxkXS4qPykoXFxkKykkLyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHN1YnMyLnB1c2gobVsyXSk7XG4gICAgICBib2R5ID0gbVsxXTtcbiAgICB9XG4gICAgd2hpbGUgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aChcIl9fXCIpKSB7XG4gICAgICAgIGNvbnN0IFtzdXAsIHJlc3QyXSA9IHBhcnNlSWRlbnRpZmllckJvZHkyKFxuICAgICAgICAgIHJlc3Quc3Vic3RyaW5nKDIpLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwibm9uZVwiXG4gICAgICAgICk7XG4gICAgICAgIHN1cHMucHVzaChzdXApO1xuICAgICAgICByZXN0ID0gcmVzdDI7XG4gICAgICB9IGVsc2UgaWYgKHJlc3Quc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgY29uc3QgW3N1YjIsIHJlc3QyXSA9IHBhcnNlSWRlbnRpZmllckJvZHkyKFxuICAgICAgICAgIHJlc3Quc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwibm9uZVwiXG4gICAgICAgICk7XG4gICAgICAgIHN1YnMyLnB1c2goc3ViMik7XG4gICAgICAgIHJlc3QgPSByZXN0MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3Vwcy5sZW5ndGggPiAwKVxuICAgICAgYm9keSA9IGAke2JvZHl9Xnske3N1cHMuam9pbihcIixcIil9fWA7XG4gICAgaWYgKHN1YnMyLmxlbmd0aCA+IDApXG4gICAgICBib2R5ID0gYCR7Ym9keX1feyR7c3ViczIuam9pbihcIixcIil9fWA7XG4gIH1cbiAgZm9yIChjb25zdCBzdHlsZTIgb2Ygc3R5bGVzKSB7XG4gICAgaWYgKFNUWUxFX01PRElGSUVSU1tzdHlsZTJdKVxuICAgICAgYm9keSA9IFNUWUxFX01PRElGSUVSU1tzdHlsZTJdKGJvZHkpO1xuICB9XG4gIGlmIChzdHlsZXMubGVuZ3RoID09PSAwICYmIHN0eWxlICE9PSBcIm5vbmVcIikge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgXCJhdXRvXCI6XG4gICAgICAgIGlmIChjb3VudFRva2Vucyhib2R5KSA+IDEpXG4gICAgICAgICAgYm9keSA9IGBcXFxcbWF0aHJteyR7Ym9keX19YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwib3BlcmF0b3JcIjpcbiAgICAgICAgYm9keSA9IGBcXFxcb3BlcmF0b3JuYW1leyR7Ym9keX19YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgIGJvZHkgPSBgXFxcXG1hdGhpdHske2JvZHl9fWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInVwcmlnaHRcIjpcbiAgICAgICAgYm9keSA9IGBcXFxcbWF0aHJteyR7Ym9keX19YDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBbYm9keSwgcmVzdF07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVJZGVudGlmaWVyKHMsIHN0eWxlID0gXCJhdXRvXCIpIHtcbiAgaWYgKHMgPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChPTkxZX0VNT0pJUy50ZXN0KHMpKVxuICAgIHJldHVybiBzO1xuICBjb25zdCBtID0gcy5tYXRjaCgvXihfKykoLiopLyk7XG4gIGlmIChtKSB7XG4gICAgY29uc3QgW2JvZHkyLCByZXN0Ml0gPSBwYXJzZUlkZW50aWZpZXJCb2R5MihtWzJdLCB0cnVlLCBcIm5vbmVcIik7XG4gICAgcmV0dXJuIGBcXFxcb3BlcmF0b3JuYW1leyR7XCJcXFxcX1wiLnJlcGVhdChtWzFdLmxlbmd0aCkgKyBib2R5MiArIHJlc3QyfX1gO1xuICB9XG4gIGNvbnN0IFtib2R5LCByZXN0XSA9IHBhcnNlSWRlbnRpZmllckJvZHkyKHMsIHRydWUsIHN0eWxlKTtcbiAgaWYgKHJlc3QubGVuZ3RoID4gMClcbiAgICByZXR1cm4gYFxcXFxvcGVyYXRvcm5hbWV7JHtzfX1gO1xuICByZXR1cm4gYm9keTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xhdGV4LXN5bnRheC9sYXRleC1zeW50YXgudHNcbnZhciBERUZBVUxUX1NFUklBTElaRV9MQVRFWF9PUFRJT05TID0ge1xuICBpbnZpc2libGVNdWx0aXBseTogXCJcIixcbiAgLy8gJ1xcXFxjZG90JyxcbiAgaW52aXNpYmxlUGx1czogXCJcIixcbiAgLy8gJysnLFxuICAvLyBpbnZpc2libGVBcHBseTogJycsXG4gIG11bHRpcGx5OiBcIlxcXFx0aW1lc1wiLFxuICBtaXNzaW5nU3ltYm9sOiBcIlxcXFxibGFja3NxdWFyZVwiLFxuICAvLyBvcGVuR3JvdXA6ICcoJyxcbiAgLy8gY2xvc2VHcm91cDogJyknLFxuICAvLyBkaXZpZGU6ICdcXFxcZnJhY3sjMX17IzJ9JyxcbiAgLy8gc3VidHJhY3Q6ICcjMS0jMicsXG4gIC8vIGFkZDogJyMxKyMyJyxcbiAgLy8gbmVnYXRlOiAnLSMxJyxcbiAgLy8gc3F1YXJlUm9vdDogJ1xcXFxzcXJ0eyMxfScsXG4gIC8vIG50aFJvb3Q6ICdcXFxcc3FydFsjMl17IzF9JyxcbiAgYXBwbHlGdW5jdGlvblN0eWxlOiBnZXRBcHBseUZ1bmN0aW9uU3R5bGUsXG4gIGdyb3VwU3R5bGU6IGdldEdyb3VwU3R5bGUsXG4gIHJvb3RTdHlsZTogZ2V0Um9vdFN0eWxlLFxuICBmcmFjdGlvblN0eWxlOiBnZXRGcmFjdGlvblN0eWxlLFxuICBsb2dpY1N0eWxlOiBnZXRMb2dpY1N0eWxlLFxuICBwb3dlclN0eWxlOiBnZXRQb3dlclN0eWxlLFxuICBudW1lcmljU2V0U3R5bGU6IGdldE51bWVyaWNTZXRTdHlsZVxufTtcbnZhciBMYXRleFN5bnRheCA9IGNsYXNzIF9MYXRleFN5bnRheCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBvbkVycm9yID0gKHdhcm5pbmdzKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3MpXG4gICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3IgPz8gb25FcnJvcjtcbiAgICB0aGlzLmNvbXB1dGVFbmdpbmUgPSBvcHRpb25zLmNvbXB1dGVFbmdpbmU7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICAgIGRlbGV0ZSBvcHRzLmRpY3Rpb25hcnk7XG4gICAgZGVsZXRlIG9wdHMub25FcnJvcjtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0xBVEVYX05VTUJFUl9PUFRJT05TLFxuICAgICAgLi4uREVGQVVMVF9QQVJTRV9MQVRFWF9PUFRJT05TLFxuICAgICAgLi4uREVGQVVMVF9TRVJJQUxJWkVfTEFURVhfT1BUSU9OUyxcbiAgICAgIC4uLm9wdHNcbiAgICB9O1xuICAgIHRoaXMuX2RpY3Rpb25hcnlJbnB1dCA9IG9wdGlvbnMuZGljdGlvbmFyeSA/PyBfTGF0ZXhTeW50YXguZ2V0RGljdGlvbmFyeSgpO1xuICAgIHRoaXMuX2RpY3Rpb25hcnkgPSBpbmRleExhdGV4RGljdGlvbmFyeShcbiAgICAgIHRoaXMuX2RpY3Rpb25hcnlJbnB1dCxcbiAgICAgIChzaWcpID0+IHRoaXMub25FcnJvcihbc2lnXSlcbiAgICApO1xuICB9XG4gIGdldCBkaWN0aW9uYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9kaWN0aW9uYXJ5SW5wdXQ7XG4gIH1cbiAgc2V0IGRpY3Rpb25hcnkodmFsKSB7XG4gICAgdGhpcy5fZGljdGlvbmFyeUlucHV0ID0gdmFsO1xuICAgIHRoaXMuX2RpY3Rpb25hcnkgPSBpbmRleExhdGV4RGljdGlvbmFyeSh2YWwsIChzaWcpID0+IHRoaXMub25FcnJvcihbc2lnXSkpO1xuICB9XG4gIHVwZGF0ZU9wdGlvbnMob3B0KSB7XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucykpXG4gICAgICBpZiAoayBpbiBvcHQpXG4gICAgICAgIHRoaXMub3B0aW9uc1trXSA9IG9wdFtrXTtcbiAgICB0aGlzLnNlcmlhbGl6ZXIudXBkYXRlT3B0aW9ucyhvcHQpO1xuICB9XG4gIHN0YXRpYyBnZXREaWN0aW9uYXJ5KGNhdGVnb3J5ID0gXCJhbGxcIikge1xuICAgIGlmIChjYXRlZ29yeSA9PT0gXCJhbGxcIikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBPYmplY3Qua2V5cyhERUZBVUxUX0xBVEVYX0RJQ1RJT05BUlkpKVxuICAgICAgICBpZiAoREVGQVVMVF9MQVRFWF9ESUNUSU9OQVJZW2RvbWFpbl0pXG4gICAgICAgICAgcmVzdWx0LnB1c2goLi4uREVGQVVMVF9MQVRFWF9ESUNUSU9OQVJZW2RvbWFpbl0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKCFERUZBVUxUX0xBVEVYX0RJQ1RJT05BUllbY2F0ZWdvcnldKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKFsuLi5ERUZBVUxUX0xBVEVYX0RJQ1RJT05BUllbY2F0ZWdvcnldXSk7XG4gIH1cbiAgcGFyc2UobGF0ZXgpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgX1BhcnNlcihcbiAgICAgIHRva2VuaXplKGxhdGV4LCBbXSksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLl9kaWN0aW9uYXJ5LFxuICAgICAgdGhpcy5jb21wdXRlRW5naW5lXG4gICAgKTtcbiAgICBsZXQgZXhwciA9IHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoIXBhcnNlci5hdEVuZCkge1xuICAgICAgY29uc3Qgb3BEZWZzID0gcGFyc2VyLnBlZWtEZWZpbml0aW9ucyhcImluZml4XCIpO1xuICAgICAgaWYgKG9wRGVmcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLmluZGV4O1xuICAgICAgICBjb25zdCBbZGVmLCBuXSA9IG9wRGVmc1swXTtcbiAgICAgICAgcGFyc2VyLmluZGV4ICs9IG47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlZi5wYXJzZShcbiAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgZXhwciA/PyBwYXJzZXIuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KSxcbiAgICAgICAgICB7IG1pblByZWM6IDAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmIChkZWYubmFtZSkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBkZWYubmFtZSxcbiAgICAgICAgICAgIGV4cHIgPz8gcGFyc2VyLmVycm9yKFwibWlzc2luZ1wiLCBzdGFydCksXG4gICAgICAgICAgICBwYXJzZXIuZXJyb3IoXCJtaXNzaW5nXCIsIHN0YXJ0KVxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VyLmluZGV4ID0gc3RhcnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlci5pbmRleDtcbiAgICAgIGNvbnN0IGlkID0gcGFyc2VJZGVudGlmaWVyKHBhcnNlcik7XG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgY29uc3QgaWRFcnJvciA9IHBhcnNlci5lcnJvcihbXCJ1bmV4cGVjdGVkLWlkZW50aWZpZXJcIiwgaWRdLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBleHByID8gW1wiU2VxdWVuY2VcIiwgZXhwciwgaWRFcnJvcl0gOiBpZEVycm9yO1xuICAgICAgfVxuICAgICAgbGV0IG9wZW5EZWxpbWl0ZXIgPSBwYXJzZXIucGVlaztcbiAgICAgIGNvbnN0IGNsb3NlRGVsaW1pdGVyID0gcGFyc2VyLm1hdGNoRW5jbG9zdXJlT3BlbigpO1xuICAgICAgaWYgKGNsb3NlRGVsaW1pdGVyKSB7XG4gICAgICAgIHBhcnNlci5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgcGFyc2VyLm1hdGNoKGNsb3NlRGVsaW1pdGVyKTtcbiAgICAgICAgY29uc3QgZW5jbG9zdXJlRXJyb3IgPSBwYXJzZXIuZXJyb3IoXG4gICAgICAgICAgW1widW5leHBlY3RlZC1vcGVuLWRlbGltaXRlclwiLCB7IHN0cjogb3BlbkRlbGltaXRlciB9XSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZXhwciA/IFtcIlNlcXVlbmNlXCIsIGV4cHIsIGVuY2xvc3VyZUVycm9yXSA6IGVuY2xvc3VyZUVycm9yO1xuICAgICAgfVxuICAgICAgb3BlbkRlbGltaXRlciA9IHBhcnNlci5tYXRjaEVuY2xvc3VyZUNsb3NlKCk7XG4gICAgICBpZiAob3BlbkRlbGltaXRlcikge1xuICAgICAgICBjb25zdCBlbmNsb3N1cmVFcnJvciA9IHBhcnNlci5lcnJvcihcbiAgICAgICAgICBbXCJleHBlY3RlZC1vcGVuLWRlbGltaXRlclwiLCB7IHN0cjogb3BlbkRlbGltaXRlciB9XSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZXhwciA/IFtcIlNlcXVlbmNlXCIsIGV4cHIsIGVuY2xvc3VyZUVycm9yXSA6IGVuY2xvc3VyZUVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdCA9IHBhcnNlci5pbmRleDtcbiAgICAgIGNvbnN0IHRva2VuID0gcGFyc2VyLm5leHRUb2tlbigpO1xuICAgICAgd2hpbGUgKCFwYXJzZXIuYXRFbmQpXG4gICAgICAgIHBhcnNlci5uZXh0VG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pXG4gICAgICAgIHJldHVybiBwYXJzZXIuZXJyb3IoXCJzeW50YXgtZXJyb3JcIiwgcmVzdCk7XG4gICAgICBjb25zdCBlcnJvciA9IHBhcnNlci5lcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgIHRva2VuLmxlbmd0aCA+IDEgJiYgdG9rZW4uc3RhcnRzV2l0aChcIlxcXFxcIikgPyBcInVuZXhwZWN0ZWQtY29tbWFuZFwiIDogXCJ1bmV4cGVjdGVkLXRva2VuXCIsXG4gICAgICAgICAgeyBzdHI6IHRva2Vuc1RvU3RyaW5nKFt0b2tlbl0pIH1cbiAgICAgICAgXSxcbiAgICAgICAgcmVzdFxuICAgICAgKTtcbiAgICAgIGV4cHIgPSBleHByID8gW1wiU2VxdWVuY2VcIiwgZXhwciwgZXJyb3JdIDogZXJyb3I7XG4gICAgfVxuICAgIGV4cHIgPz8gKGV4cHIgPSBbXCJTZXF1ZW5jZVwiXSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVzZXJ2ZUxhdGV4KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByKSlcbiAgICAgICAgZXhwciA9IHsgbGF0ZXgsIGZuOiBleHByIH07XG4gICAgICBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgZXhwciA9IHsgbGF0ZXgsIG51bTogTnVtYmVyKGV4cHIpLnRvU3RyaW5nKCkgfTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKVxuICAgICAgICBleHByID0geyBsYXRleCwgc3ltOiBleHByIH07XG4gICAgICBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBleHByICE9PSBudWxsKVxuICAgICAgICBleHByLmxhdGV4ID0gbGF0ZXg7XG4gICAgfVxuICAgIHJldHVybiBleHByID8/IFtcIlNlcXVlbmNlXCJdO1xuICB9XG4gIHNlcmlhbGl6ZShleHByLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoZXhwciwgb3B0aW9ucyk7XG4gIH1cbiAgZ2V0IHNlcmlhbGl6ZXIoKSB7XG4gICAgaWYgKHRoaXMuX3NlcmlhbGl6ZXIpXG4gICAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplcjtcbiAgICB0aGlzLl9zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICB0aGlzLl9kaWN0aW9uYXJ5LFxuICAgICAgdGhpcy5vbkVycm9yXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplcjtcbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vdXRpbHMudHNcbnZhciBpbXBvcnRfY29tcGxleDIgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL251bWVyaWNzL251bWVyaWMudHNcbnZhciBpbXBvcnRfY29tcGxleCA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xudmFyIE1BQ0hJTkVfUFJFQ0lTSU9OX0JJVFMgPSA1MztcbnZhciBNQUNISU5FX1BSRUNJU0lPTiA9IE1hdGgubG9nMTAoXG4gIE1hdGgucG93KDIsIE1BQ0hJTkVfUFJFQ0lTSU9OX0JJVFMpXG4pO1xudmFyIE1BQ0hJTkVfVE9MRVJBTkNFX0JJVFMgPSA3O1xudmFyIE1BQ0hJTkVfVE9MRVJBTkNFID0gTWF0aC5wb3coXG4gIDIsXG4gIC0oTUFDSElORV9QUkVDSVNJT05fQklUUyAtIE1BQ0hJTkVfVE9MRVJBTkNFX0JJVFMpXG4pO1xudmFyIE5VTUVSSUNfVE9MRVJBTkNFID0gTWF0aC5wb3coMTAsIC0xMCk7XG52YXIgU01BTExfSU5URUdFUiA9IDFlNjtcbnZhciBNQVhfSVRFUkFUSU9OID0gMWU2O1xudmFyIE1BWF9TWU1CT0xJQ19URVJNUyA9IDIwMDtcbnZhciBTTUFMTF9QUklNRVMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXG4gIDIsXG4gIDMsXG4gIDUsXG4gIDcsXG4gIDExLFxuICAxMyxcbiAgMTcsXG4gIDE5LFxuICAyMyxcbiAgMjksXG4gIDMxLFxuICAzNyxcbiAgNDEsXG4gIDQzLFxuICA0NyxcbiAgNTMsXG4gIDU5LFxuICA2MSxcbiAgNjcsXG4gIDcxLFxuICA3MyxcbiAgNzksXG4gIDgzLFxuICA4OSxcbiAgOTcsXG4gIDEwMSxcbiAgMTAzLFxuICAxMDcsXG4gIDEwOSxcbiAgMTEzLFxuICAxMjcsXG4gIDEzMSxcbiAgMTM3LFxuICAxMzksXG4gIDE0OSxcbiAgMTUxLFxuICAxNTcsXG4gIDE2MyxcbiAgMTY3LFxuICAxNzMsXG4gIDE3OSxcbiAgMTgxLFxuICAxOTEsXG4gIDE5MyxcbiAgMTk3LFxuICAxOTksXG4gIDIxMSxcbiAgMjIzLFxuICAyMjcsXG4gIDIyOSxcbiAgMjMzLFxuICAyMzksXG4gIDI0MSxcbiAgMjUxLFxuICAyNTcsXG4gIDI2MyxcbiAgMjY5LFxuICAyNzEsXG4gIDI3NyxcbiAgMjgxLFxuICAyODMsXG4gIDI5MyxcbiAgMzA3LFxuICAzMTEsXG4gIDMxMyxcbiAgMzE3LFxuICAzMzEsXG4gIDMzNyxcbiAgMzQ3LFxuICAzNDksXG4gIDM1MyxcbiAgMzU5LFxuICAzNjcsXG4gIDM3MyxcbiAgMzc5LFxuICAzODMsXG4gIDM4OSxcbiAgMzk3LFxuICA0MDEsXG4gIDQwOSxcbiAgNDE5LFxuICA0MjEsXG4gIDQzMSxcbiAgNDMzLFxuICA0MzksXG4gIDQ0MyxcbiAgNDQ5LFxuICA0NTcsXG4gIDQ2MSxcbiAgNDYzLFxuICA0NjcsXG4gIDQ3OSxcbiAgNDg3LFxuICA0OTEsXG4gIDQ5OSxcbiAgNTAzLFxuICA1MDksXG4gIDUyMSxcbiAgNTIzLFxuICA1NDEsXG4gIDU0NyxcbiAgNTU3LFxuICA1NjMsXG4gIDU2OSxcbiAgNTcxLFxuICA1NzcsXG4gIDU4NyxcbiAgNTkzLFxuICA1OTksXG4gIDYwMSxcbiAgNjA3LFxuICA2MTMsXG4gIDYxNyxcbiAgNjE5LFxuICA2MzEsXG4gIDY0MSxcbiAgNjQzLFxuICA2NDcsXG4gIDY1MyxcbiAgNjU5LFxuICA2NjEsXG4gIDY3MyxcbiAgNjc3LFxuICA2ODMsXG4gIDY5MSxcbiAgNzAxLFxuICA3MDksXG4gIDcxOSxcbiAgNzI3LFxuICA3MzMsXG4gIDczOSxcbiAgNzQzLFxuICA3NTEsXG4gIDc1NyxcbiAgNzYxLFxuICA3NjksXG4gIDc3MyxcbiAgNzg3LFxuICA3OTcsXG4gIDgwOSxcbiAgODExLFxuICA4MjEsXG4gIDgyMyxcbiAgODI3LFxuICA4MjksXG4gIDgzOSxcbiAgODUzLFxuICA4NTcsXG4gIDg1OSxcbiAgODYzLFxuICA4NzcsXG4gIDg4MSxcbiAgODgzLFxuICA4ODcsXG4gIDkwNyxcbiAgOTExLFxuICA5MTksXG4gIDkyOSxcbiAgOTM3LFxuICA5NDEsXG4gIDk0NyxcbiAgOTUzLFxuICA5NjcsXG4gIDk3MSxcbiAgOTc3LFxuICA5ODMsXG4gIDk5MSxcbiAgOTk3LFxuICAxMDA5LFxuICAxMDEzLFxuICAxMDE5LFxuICAxMDIxLFxuICAxMDMxLFxuICAxMDMzLFxuICAxMDM5LFxuICAxMDQ5LFxuICAxMDUxLFxuICAxMDYxLFxuICAxMDYzLFxuICAxMDY5LFxuICAxMDg3LFxuICAxMDkxLFxuICAxMDkzLFxuICAxMDk3LFxuICAxMTAzLFxuICAxMTA5LFxuICAxMTE3LFxuICAxMTIzLFxuICAxMTI5LFxuICAxMTUxLFxuICAxMTUzLFxuICAxMTYzLFxuICAxMTcxLFxuICAxMTgxLFxuICAxMTg3LFxuICAxMTkzLFxuICAxMjAxLFxuICAxMjEzLFxuICAxMjE3LFxuICAxMjIzLFxuICAxMjI5LFxuICAxMjMxLFxuICAxMjM3LFxuICAxMjQ5LFxuICAxMjU5LFxuICAxMjc3LFxuICAxMjc5LFxuICAxMjgzLFxuICAxMjg5LFxuICAxMjkxLFxuICAxMjk3LFxuICAxMzAxLFxuICAxMzAzLFxuICAxMzA3LFxuICAxMzE5LFxuICAxMzIxLFxuICAxMzI3LFxuICAxMzYxLFxuICAxMzY3LFxuICAxMzczLFxuICAxMzgxLFxuICAxMzk5LFxuICAxNDA5LFxuICAxNDIzLFxuICAxNDI3LFxuICAxNDI5LFxuICAxNDMzLFxuICAxNDM5LFxuICAxNDQ3LFxuICAxNDUxLFxuICAxNDUzLFxuICAxNDU5LFxuICAxNDcxLFxuICAxNDgxLFxuICAxNDgzLFxuICAxNDg3LFxuICAxNDg5LFxuICAxNDkzLFxuICAxNDk5LFxuICAxNTExLFxuICAxNTIzLFxuICAxNTMxLFxuICAxNTQzLFxuICAxNTQ5LFxuICAxNTUzLFxuICAxNTU5LFxuICAxNTY3LFxuICAxNTcxLFxuICAxNTc5LFxuICAxNTgzLFxuICAxNTk3LFxuICAxNjAxLFxuICAxNjA3LFxuICAxNjA5LFxuICAxNjEzLFxuICAxNjE5LFxuICAxNjIxLFxuICAxNjI3LFxuICAxNjM3LFxuICAxNjU3LFxuICAxNjYzLFxuICAxNjY3LFxuICAxNjY5LFxuICAxNjkzLFxuICAxNjk3LFxuICAxNjk5LFxuICAxNzA5LFxuICAxNzIxLFxuICAxNzIzLFxuICAxNzMzLFxuICAxNzQxLFxuICAxNzQ3LFxuICAxNzUzLFxuICAxNzU5LFxuICAxNzc3LFxuICAxNzgzLFxuICAxNzg3LFxuICAxNzg5LFxuICAxODAxLFxuICAxODExLFxuICAxODIzLFxuICAxODMxLFxuICAxODQ3LFxuICAxODYxLFxuICAxODY3LFxuICAxODcxLFxuICAxODczLFxuICAxODc3LFxuICAxODc5LFxuICAxODg5LFxuICAxOTAxLFxuICAxOTA3LFxuICAxOTEzLFxuICAxOTMxLFxuICAxOTMzLFxuICAxOTQ5LFxuICAxOTUxLFxuICAxOTczLFxuICAxOTc5LFxuICAxOTg3LFxuICAxOTkzLFxuICAxOTk3LFxuICAxOTk5LFxuICAyMDAzLFxuICAyMDExLFxuICAyMDE3LFxuICAyMDI3LFxuICAyMDI5LFxuICAyMDM5LFxuICAyMDUzLFxuICAyMDYzLFxuICAyMDY5LFxuICAyMDgxLFxuICAyMDgzLFxuICAyMDg3LFxuICAyMDg5LFxuICAyMDk5LFxuICAyMTExLFxuICAyMTEzLFxuICAyMTI5LFxuICAyMTMxLFxuICAyMTM3LFxuICAyMTQxLFxuICAyMTQzLFxuICAyMTUzLFxuICAyMTYxLFxuICAyMTc5LFxuICAyMjAzLFxuICAyMjA3LFxuICAyMjEzLFxuICAyMjIxLFxuICAyMjM3LFxuICAyMjM5LFxuICAyMjQzLFxuICAyMjUxLFxuICAyMjY3LFxuICAyMjY5LFxuICAyMjczLFxuICAyMjgxLFxuICAyMjg3LFxuICAyMjkzLFxuICAyMjk3LFxuICAyMzA5LFxuICAyMzExLFxuICAyMzMzLFxuICAyMzM5LFxuICAyMzQxLFxuICAyMzQ3LFxuICAyMzUxLFxuICAyMzU3LFxuICAyMzcxLFxuICAyMzc3LFxuICAyMzgxLFxuICAyMzgzLFxuICAyMzg5LFxuICAyMzkzLFxuICAyMzk5LFxuICAyNDExLFxuICAyNDE3LFxuICAyNDIzLFxuICAyNDM3LFxuICAyNDQxLFxuICAyNDQ3LFxuICAyNDU5LFxuICAyNDY3LFxuICAyNDczLFxuICAyNDc3LFxuICAyNTAzLFxuICAyNTIxLFxuICAyNTMxLFxuICAyNTM5LFxuICAyNTQzLFxuICAyNTQ5LFxuICAyNTUxLFxuICAyNTU3LFxuICAyNTc5LFxuICAyNTkxLFxuICAyNTkzLFxuICAyNjA5LFxuICAyNjE3LFxuICAyNjIxLFxuICAyNjMzLFxuICAyNjQ3LFxuICAyNjU3LFxuICAyNjU5LFxuICAyNjYzLFxuICAyNjcxLFxuICAyNjc3LFxuICAyNjgzLFxuICAyNjg3LFxuICAyNjg5LFxuICAyNjkzLFxuICAyNjk5LFxuICAyNzA3LFxuICAyNzExLFxuICAyNzEzLFxuICAyNzE5LFxuICAyNzI5LFxuICAyNzMxLFxuICAyNzQxLFxuICAyNzQ5LFxuICAyNzUzLFxuICAyNzY3LFxuICAyNzc3LFxuICAyNzg5LFxuICAyNzkxLFxuICAyNzk3LFxuICAyODAxLFxuICAyODAzLFxuICAyODE5LFxuICAyODMzLFxuICAyODM3LFxuICAyODQzLFxuICAyODUxLFxuICAyODU3LFxuICAyODYxLFxuICAyODc5LFxuICAyODg3LFxuICAyODk3LFxuICAyOTAzLFxuICAyOTA5LFxuICAyOTE3LFxuICAyOTI3LFxuICAyOTM5LFxuICAyOTUzLFxuICAyOTU3LFxuICAyOTYzLFxuICAyOTY5LFxuICAyOTcxLFxuICAyOTk5LFxuICAzMDAxLFxuICAzMDExLFxuICAzMDE5LFxuICAzMDIzLFxuICAzMDM3LFxuICAzMDQxLFxuICAzMDQ5LFxuICAzMDYxLFxuICAzMDY3LFxuICAzMDc5LFxuICAzMDgzLFxuICAzMDg5LFxuICAzMTA5LFxuICAzMTE5LFxuICAzMTIxLFxuICAzMTM3LFxuICAzMTYzLFxuICAzMTY3LFxuICAzMTY5LFxuICAzMTgxLFxuICAzMTg3LFxuICAzMTkxLFxuICAzMjAzLFxuICAzMjA5LFxuICAzMjE3LFxuICAzMjIxLFxuICAzMjI5LFxuICAzMjUxLFxuICAzMjUzLFxuICAzMjU3LFxuICAzMjU5LFxuICAzMjcxLFxuICAzMjk5LFxuICAzMzAxLFxuICAzMzA3LFxuICAzMzEzLFxuICAzMzE5LFxuICAzMzIzLFxuICAzMzI5LFxuICAzMzMxLFxuICAzMzQzLFxuICAzMzQ3LFxuICAzMzU5LFxuICAzMzYxLFxuICAzMzcxLFxuICAzMzczLFxuICAzMzg5LFxuICAzMzkxLFxuICAzNDA3LFxuICAzNDEzLFxuICAzNDMzLFxuICAzNDQ5LFxuICAzNDU3LFxuICAzNDYxLFxuICAzNDYzLFxuICAzNDY3LFxuICAzNDY5LFxuICAzNDkxLFxuICAzNDk5LFxuICAzNTExLFxuICAzNTE3LFxuICAzNTI3LFxuICAzNTI5LFxuICAzNTMzLFxuICAzNTM5LFxuICAzNTQxLFxuICAzNTQ3LFxuICAzNTU3LFxuICAzNTU5LFxuICAzNTcxLFxuICAzNTgxLFxuICAzNTgzLFxuICAzNTkzLFxuICAzNjA3LFxuICAzNjEzLFxuICAzNjE3LFxuICAzNjIzLFxuICAzNjMxLFxuICAzNjM3LFxuICAzNjQzLFxuICAzNjU5LFxuICAzNjcxLFxuICAzNjczLFxuICAzNjc3LFxuICAzNjkxLFxuICAzNjk3LFxuICAzNzAxLFxuICAzNzA5LFxuICAzNzE5LFxuICAzNzI3LFxuICAzNzMzLFxuICAzNzM5LFxuICAzNzYxLFxuICAzNzY3LFxuICAzNzY5LFxuICAzNzc5LFxuICAzNzkzLFxuICAzNzk3LFxuICAzODAzLFxuICAzODIxLFxuICAzODIzLFxuICAzODMzLFxuICAzODQ3LFxuICAzODUxLFxuICAzODUzLFxuICAzODYzLFxuICAzODc3LFxuICAzODgxLFxuICAzODg5LFxuICAzOTA3LFxuICAzOTExLFxuICAzOTE3LFxuICAzOTE5LFxuICAzOTIzLFxuICAzOTI5LFxuICAzOTMxLFxuICAzOTQzLFxuICAzOTQ3LFxuICAzOTY3LFxuICAzOTg5LFxuICA0MDAxLFxuICA0MDAzLFxuICA0MDA3LFxuICA0MDEzLFxuICA0MDE5LFxuICA0MDIxLFxuICA0MDI3LFxuICA0MDQ5LFxuICA0MDUxLFxuICA0MDU3LFxuICA0MDczLFxuICA0MDc5LFxuICA0MDkxLFxuICA0MDkzLFxuICA0MDk5LFxuICA0MTExLFxuICA0MTI3LFxuICA0MTI5LFxuICA0MTMzLFxuICA0MTM5LFxuICA0MTUzLFxuICA0MTU3LFxuICA0MTU5LFxuICA0MTc3LFxuICA0MjAxLFxuICA0MjExLFxuICA0MjE3LFxuICA0MjE5LFxuICA0MjI5LFxuICA0MjMxLFxuICA0MjQxLFxuICA0MjQzLFxuICA0MjUzLFxuICA0MjU5LFxuICA0MjYxLFxuICA0MjcxLFxuICA0MjczLFxuICA0MjgzLFxuICA0Mjg5LFxuICA0Mjk3LFxuICA0MzI3LFxuICA0MzM3LFxuICA0MzM5LFxuICA0MzQ5LFxuICA0MzU3LFxuICA0MzYzLFxuICA0MzczLFxuICA0MzkxLFxuICA0Mzk3LFxuICA0NDA5LFxuICA0NDIxLFxuICA0NDIzLFxuICA0NDQxLFxuICA0NDQ3LFxuICA0NDUxLFxuICA0NDU3LFxuICA0NDYzLFxuICA0NDgxLFxuICA0NDgzLFxuICA0NDkzLFxuICA0NTA3LFxuICA0NTEzLFxuICA0NTE3LFxuICA0NTE5LFxuICA0NTIzLFxuICA0NTQ3LFxuICA0NTQ5LFxuICA0NTYxLFxuICA0NTY3LFxuICA0NTgzLFxuICA0NTkxLFxuICA0NTk3LFxuICA0NjAzLFxuICA0NjIxLFxuICA0NjM3LFxuICA0NjM5LFxuICA0NjQzLFxuICA0NjQ5LFxuICA0NjUxLFxuICA0NjU3LFxuICA0NjYzLFxuICA0NjczLFxuICA0Njc5LFxuICA0NjkxLFxuICA0NzAzLFxuICA0NzIxLFxuICA0NzIzLFxuICA0NzI5LFxuICA0NzMzLFxuICA0NzUxLFxuICA0NzU5LFxuICA0NzgzLFxuICA0Nzg3LFxuICA0Nzg5LFxuICA0NzkzLFxuICA0Nzk5LFxuICA0ODAxLFxuICA0ODEzLFxuICA0ODE3LFxuICA0ODMxLFxuICA0ODYxLFxuICA0ODcxLFxuICA0ODc3LFxuICA0ODg5LFxuICA0OTAzLFxuICA0OTA5LFxuICA0OTE5LFxuICA0OTMxLFxuICA0OTMzLFxuICA0OTM3LFxuICA0OTQzLFxuICA0OTUxLFxuICA0OTU3LFxuICA0OTY3LFxuICA0OTY5LFxuICA0OTczLFxuICA0OTg3LFxuICA0OTkzLFxuICA0OTk5LFxuICA1MDAzLFxuICA1MDA5LFxuICA1MDExLFxuICA1MDIxLFxuICA1MDIzLFxuICA1MDM5LFxuICA1MDUxLFxuICA1MDU5LFxuICA1MDc3LFxuICA1MDgxLFxuICA1MDg3LFxuICA1MDk5LFxuICA1MTAxLFxuICA1MTA3LFxuICA1MTEzLFxuICA1MTE5LFxuICA1MTQ3LFxuICA1MTUzLFxuICA1MTY3LFxuICA1MTcxLFxuICA1MTc5LFxuICA1MTg5LFxuICA1MTk3LFxuICA1MjA5LFxuICA1MjI3LFxuICA1MjMxLFxuICA1MjMzLFxuICA1MjM3LFxuICA1MjYxLFxuICA1MjczLFxuICA1Mjc5LFxuICA1MjgxLFxuICA1Mjk3LFxuICA1MzAzLFxuICA1MzA5LFxuICA1MzIzLFxuICA1MzMzLFxuICA1MzQ3LFxuICA1MzUxLFxuICA1MzgxLFxuICA1Mzg3LFxuICA1MzkzLFxuICA1Mzk5LFxuICA1NDA3LFxuICA1NDEzLFxuICA1NDE3LFxuICA1NDE5LFxuICA1NDMxLFxuICA1NDM3LFxuICA1NDQxLFxuICA1NDQzLFxuICA1NDQ5LFxuICA1NDcxLFxuICA1NDc3LFxuICA1NDc5LFxuICA1NDgzLFxuICA1NTAxLFxuICA1NTAzLFxuICA1NTA3LFxuICA1NTE5LFxuICA1NTIxLFxuICA1NTI3LFxuICA1NTMxLFxuICA1NTU3LFxuICA1NTYzLFxuICA1NTY5LFxuICA1NTczLFxuICA1NTgxLFxuICA1NTkxLFxuICA1NjIzLFxuICA1NjM5LFxuICA1NjQxLFxuICA1NjQ3LFxuICA1NjUxLFxuICA1NjUzLFxuICA1NjU3LFxuICA1NjU5LFxuICA1NjY5LFxuICA1NjgzLFxuICA1Njg5LFxuICA1NjkzLFxuICA1NzAxLFxuICA1NzExLFxuICA1NzE3LFxuICA1NzM3LFxuICA1NzQxLFxuICA1NzQzLFxuICA1NzQ5LFxuICA1Nzc5LFxuICA1NzgzLFxuICA1NzkxLFxuICA1ODAxLFxuICA1ODA3LFxuICA1ODEzLFxuICA1ODIxLFxuICA1ODI3LFxuICA1ODM5LFxuICA1ODQzLFxuICA1ODQ5LFxuICA1ODUxLFxuICA1ODU3LFxuICA1ODYxLFxuICA1ODY3LFxuICA1ODY5LFxuICA1ODc5LFxuICA1ODgxLFxuICA1ODk3LFxuICA1OTAzLFxuICA1OTIzLFxuICA1OTI3LFxuICA1OTM5LFxuICA1OTUzLFxuICA1OTgxLFxuICA1OTg3LFxuICA2MDA3LFxuICA2MDExLFxuICA2MDI5LFxuICA2MDM3LFxuICA2MDQzLFxuICA2MDQ3LFxuICA2MDUzLFxuICA2MDY3LFxuICA2MDczLFxuICA2MDc5LFxuICA2MDg5LFxuICA2MDkxLFxuICA2MTAxLFxuICA2MTEzLFxuICA2MTIxLFxuICA2MTMxLFxuICA2MTMzLFxuICA2MTQzLFxuICA2MTUxLFxuICA2MTYzLFxuICA2MTczLFxuICA2MTk3LFxuICA2MTk5LFxuICA2MjAzLFxuICA2MjExLFxuICA2MjE3LFxuICA2MjIxLFxuICA2MjI5LFxuICA2MjQ3LFxuICA2MjU3LFxuICA2MjYzLFxuICA2MjY5LFxuICA2MjcxLFxuICA2Mjc3LFxuICA2Mjg3LFxuICA2Mjk5LFxuICA2MzAxLFxuICA2MzExLFxuICA2MzE3LFxuICA2MzIzLFxuICA2MzI5LFxuICA2MzM3LFxuICA2MzQzLFxuICA2MzUzLFxuICA2MzU5LFxuICA2MzYxLFxuICA2MzY3LFxuICA2MzczLFxuICA2Mzc5LFxuICA2Mzg5LFxuICA2Mzk3LFxuICA2NDIxLFxuICA2NDI3LFxuICA2NDQ5LFxuICA2NDUxLFxuICA2NDY5LFxuICA2NDczLFxuICA2NDgxLFxuICA2NDkxLFxuICA2NTIxLFxuICA2NTI5LFxuICA2NTQ3LFxuICA2NTUxLFxuICA2NTUzLFxuICA2NTYzLFxuICA2NTY5LFxuICA2NTcxLFxuICA2NTc3LFxuICA2NTgxLFxuICA2NTk5LFxuICA2NjA3LFxuICA2NjE5LFxuICA2NjM3LFxuICA2NjUzLFxuICA2NjU5LFxuICA2NjYxLFxuICA2NjczLFxuICA2Njc5LFxuICA2Njg5LFxuICA2NjkxLFxuICA2NzAxLFxuICA2NzAzLFxuICA2NzA5LFxuICA2NzE5LFxuICA2NzMzLFxuICA2NzM3LFxuICA2NzYxLFxuICA2NzYzLFxuICA2Nzc5LFxuICA2NzgxLFxuICA2NzkxLFxuICA2NzkzLFxuICA2ODAzLFxuICA2ODIzLFxuICA2ODI3LFxuICA2ODI5LFxuICA2ODMzLFxuICA2ODQxLFxuICA2ODU3LFxuICA2ODYzLFxuICA2ODY5LFxuICA2ODcxLFxuICA2ODgzLFxuICA2ODk5LFxuICA2OTA3LFxuICA2OTExLFxuICA2OTE3LFxuICA2OTQ3LFxuICA2OTQ5LFxuICA2OTU5LFxuICA2OTYxLFxuICA2OTY3LFxuICA2OTcxLFxuICA2OTc3LFxuICA2OTgzLFxuICA2OTkxLFxuICA2OTk3LFxuICA3MDAxLFxuICA3MDEzLFxuICA3MDE5LFxuICA3MDI3LFxuICA3MDM5LFxuICA3MDQzLFxuICA3MDU3LFxuICA3MDY5LFxuICA3MDc5LFxuICA3MTAzLFxuICA3MTA5LFxuICA3MTIxLFxuICA3MTI3LFxuICA3MTI5LFxuICA3MTUxLFxuICA3MTU5LFxuICA3MTc3LFxuICA3MTg3LFxuICA3MTkzLFxuICA3MjA3LFxuICA3MjExLFxuICA3MjEzLFxuICA3MjE5LFxuICA3MjI5LFxuICA3MjM3LFxuICA3MjQzLFxuICA3MjQ3LFxuICA3MjUzLFxuICA3MjgzLFxuICA3Mjk3LFxuICA3MzA3LFxuICA3MzA5LFxuICA3MzIxLFxuICA3MzMxLFxuICA3MzMzLFxuICA3MzQ5LFxuICA3MzUxLFxuICA3MzY5LFxuICA3MzkzLFxuICA3NDExLFxuICA3NDE3LFxuICA3NDMzLFxuICA3NDUxLFxuICA3NDU3LFxuICA3NDU5LFxuICA3NDc3LFxuICA3NDgxLFxuICA3NDg3LFxuICA3NDg5LFxuICA3NDk5LFxuICA3NTA3LFxuICA3NTE3LFxuICA3NTIzLFxuICA3NTI5LFxuICA3NTM3LFxuICA3NTQxLFxuICA3NTQ3LFxuICA3NTQ5LFxuICA3NTU5LFxuICA3NTYxLFxuICA3NTczLFxuICA3NTc3LFxuICA3NTgzLFxuICA3NTg5LFxuICA3NTkxLFxuICA3NjAzLFxuICA3NjA3LFxuICA3NjIxLFxuICA3NjM5LFxuICA3NjQzLFxuICA3NjQ5LFxuICA3NjY5LFxuICA3NjczLFxuICA3NjgxLFxuICA3Njg3LFxuICA3NjkxLFxuICA3Njk5LFxuICA3NzAzLFxuICA3NzE3LFxuICA3NzIzLFxuICA3NzI3LFxuICA3NzQxLFxuICA3NzUzLFxuICA3NzU3LFxuICA3NzU5LFxuICA3Nzg5LFxuICA3NzkzLFxuICA3ODE3LFxuICA3ODIzLFxuICA3ODI5LFxuICA3ODQxLFxuICA3ODUzLFxuICA3ODY3LFxuICA3ODczLFxuICA3ODc3LFxuICA3ODc5LFxuICA3ODgzLFxuICA3OTAxLFxuICA3OTA3LFxuICA3OTE5XG5dKTtcbnZhciBMQVJHRVNUX1NNQUxMX1BSSU1FID0gNzkxOTtcbmZ1bmN0aW9uIHByaW1lRmFjdG9ycyhuKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG4pICYmIG4gPj0gMCAmJiBuIDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgblxuICApO1xuICBpZiAobiA8PSAzKVxuICAgIHJldHVybiB7IFtuXTogMSB9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgd2hpbGUgKG4gJSAyID09PSAwKSB7XG4gICAgY291bnQgKz0gMTtcbiAgICBuIC89IDI7XG4gIH1cbiAgaWYgKGNvdW50ID4gMClcbiAgICByZXN1bHRbMl0gPSBjb3VudDtcbiAgY291bnQgPSAwO1xuICB3aGlsZSAobiAlIDMgPT09IDApIHtcbiAgICBjb3VudCArPSAxO1xuICAgIG4gLz0gMztcbiAgfVxuICBpZiAoY291bnQgPiAwKVxuICAgIHJlc3VsdFszXSA9IGNvdW50O1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICB3aGlsZSAoIWRvbmUpIHtcbiAgICBpZiAobiA9PT0gMSlcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3Qgc3IgPSBNYXRoLnNxcnQobik7XG4gICAgZG9uZSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDY7IGkgPD0gc3IgKyA2OyBpICs9IDYpIHtcbiAgICAgIGlmIChuICUgKGkgLSAxKSA9PT0gMCkge1xuICAgICAgICByZXN1bHRbaSAtIDFdID0gKHJlc3VsdFtpIC0gMV0gPz8gMCkgKyAxO1xuICAgICAgICBuIC89IGkgLSAxO1xuICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG4gJSAoaSArIDEpID09PSAwKSB7XG4gICAgICAgIHJlc3VsdFtpICsgMV0gPSAocmVzdWx0W2kgKyAxXSA/PyAwKSArIDE7XG4gICAgICAgIG4gLz0gaSArIDE7XG4gICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChyZXN1bHRbbl0gIT09IHZvaWQgMClcbiAgICByZXN1bHRbbl0gKz0gMTtcbiAgZWxzZVxuICAgIHJlc3VsdFtuXSA9IDE7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBmYWN0b3JQb3dlcihuLCBleHBvbmVudCkge1xuICBpZiAobiA+PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcbiAgICByZXR1cm4gWzEsIG5dO1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID4gMCAmJiBuIDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICBjb25zdCBmYWN0b3JzID0gcHJpbWVGYWN0b3JzKG4pO1xuICBsZXQgZiA9IDE7XG4gIGxldCByID0gMTtcbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGZhY3RvcnMpKSB7XG4gICAgY29uc3QgdiA9IHBhcnNlSW50KGspO1xuICAgIGYgPSBmICogTWF0aC5wb3codiwgTWF0aC5mbG9vcihmYWN0b3JzW2tdIC8gZXhwb25lbnQpKTtcbiAgICByID0gciAqIE1hdGgucG93KHYsIGZhY3RvcnNba10gJSBleHBvbmVudCk7XG4gIH1cbiAgcmV0dXJuIFtmLCByXTtcbn1cbmZ1bmN0aW9uIGdjZChhLCBiKSB7XG4gIGlmIChhID09PSAwKVxuICAgIHJldHVybiBiO1xuICBpZiAoYiA9PT0gMClcbiAgICByZXR1cm4gYTtcbiAgaWYgKGEgPT09IGIpXG4gICAgcmV0dXJuIGE7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihiKSlcbiAgICByZXR1cm4gTmFOO1xuICB3aGlsZSAoYiAhPT0gMClcbiAgICBbYSwgYl0gPSBbYiwgYSAlIGJdO1xuICByZXR1cm4gYSA8IDAgPyAtYSA6IGE7XG59XG5mdW5jdGlvbiBsY20oYSwgYikge1xuICByZXR1cm4gYSAqIGIgLyBnY2QoYSwgYik7XG59XG5mdW5jdGlvbiBmYWN0b3JpYWwobikge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIobikgfHwgbiA8IDApXG4gICAgcmV0dXJuIE5hTjtcbiAgbGV0IHZhbCA9IDE7XG4gIGZvciAobGV0IGkgPSAyOyBpIDw9IG47IGkrKylcbiAgICB2YWwgPSB2YWwgKiBpO1xuICByZXR1cm4gdmFsO1xufVxudmFyIGdhbW1hRyA9IDc7XG52YXIgbGFuY3pvc183X2MgPSBbXG4gIDAuOTk5OTk5OTk5OTk5ODA5OSxcbiAgNjc2LjUyMDM2ODEyMTg4NTEsXG4gIC0xMjU5LjEzOTIxNjcyMjQwMjgsXG4gIDc3MS4zMjM0Mjg3Nzc2NTMxLFxuICAtMTc2LjYxNTAyOTE2MjE0MDYsXG4gIDEyLjUwNzM0MzI3ODY4NjkwNSxcbiAgLTAuMTM4NTcxMDk1MjY1NzIwMTIsXG4gIDk5ODQzNjk1NzgwMTk1NzJlLTIxLFxuICAxNTA1NjMyNzM1MTQ5MzExNmUtMjNcbl07XG52YXIgZ2FtbWFHTG4gPSA2MDcgLyAxMjg7XG52YXIgZ2FtbWFQTG4gPSBbXG4gIDAuOTk5OTk5OTk5OTk5OTk3LFxuICA1Ny4xNTYyMzU2NjU4NjI5MixcbiAgLTU5LjU5Nzk2MDM1NTQ3NTQ5LFxuICAxNC4xMzYwOTc5NzQ3NDE3NCxcbiAgLTAuNDkxOTEzODE2MDk3NjIwMixcbiAgMzM5OTQ2NDk5ODQ4MTE4OGUtMjAsXG4gIDQ2NTIzNjI4OTI3MDQ4NTdlLTIwLFxuICAtOTgzNzQ0NzUzMDQ4Nzk1NmUtMjAsXG4gIDE1ODA4ODcwMzIyNDkxMjVlLTE5LFxuICAtMjEwMjY0NDQxNzI0MTA0ODhlLTIwLFxuICAyMTc0Mzk2MTgxMTUyMTI2ZS0xOSxcbiAgLTE2NDMxODEwNjUzNjc2MzllLTE5LFxuICA4NDQxODIyMzk4Mzg1Mjc0ZS0yMCxcbiAgLTI2MTkwODM4NDAxNTgxNGUtMTksXG4gIDM2ODk5MTgyNjU5NTMxNjJlLTIxXG5dO1xuZnVuY3Rpb24gbG5nYW1tYSh6KSB7XG4gIGlmICh6IDwgMClcbiAgICByZXR1cm4gTmFOO1xuICBsZXQgeCA9IGdhbW1hUExuWzBdO1xuICBmb3IgKGxldCBpID0gZ2FtbWFQTG4ubGVuZ3RoIC0gMTsgaSA+IDA7IC0taSlcbiAgICB4ICs9IGdhbW1hUExuW2ldIC8gKHogKyBpKTtcbiAgY29uc3QgdCA9IHogKyBnYW1tYUdMbiArIDAuNTtcbiAgcmV0dXJuIDAuNSAqIE1hdGgubG9nKDIgKiBNYXRoLlBJKSArICh6ICsgMC41KSAqIE1hdGgubG9nKHQpIC0gdCArIE1hdGgubG9nKHgpIC0gTWF0aC5sb2coeik7XG59XG5mdW5jdGlvbiBnYW1tYSh6KSB7XG4gIGlmICh6IDwgMC41KVxuICAgIHJldHVybiBNYXRoLlBJIC8gKE1hdGguc2luKE1hdGguUEkgKiB6KSAqIGdhbW1hKDEgLSB6KSk7XG4gIGlmICh6ID4gMTAwKVxuICAgIHJldHVybiBNYXRoLmV4cChsbmdhbW1hKHopKTtcbiAgeiAtPSAxO1xuICBsZXQgeCA9IGxhbmN6b3NfN19jWzBdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGdhbW1hRyArIDI7IGkrKylcbiAgICB4ICs9IGxhbmN6b3NfN19jW2ldIC8gKHogKyBpKTtcbiAgY29uc3QgdCA9IHogKyBnYW1tYUcgKyAwLjU7XG4gIHJldHVybiBNYXRoLnNxcnQoMiAqIE1hdGguUEkpICogTWF0aC5wb3codCwgeiArIDAuNSkgKiBNYXRoLmV4cCgtdCkgKiB4O1xufVxuZnVuY3Rpb24gZnJvbURpZ2l0cyhzLCBiYXNlID0gMTApIHtcbiAgbGV0IHZhbHVlID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgayA9IHtcbiAgICAgIFwiIFwiOiAtMSxcbiAgICAgIFwiXFx4QTBcIjogLTEsXG4gICAgICAvLyBOQlNcbiAgICAgIFwiXFx1MjAwMFwiOiAtMSxcbiAgICAgIC8vIEVOIFFVQURcbiAgICAgIFwiXFx1MjAwMVwiOiAtMSxcbiAgICAgIC8vIEVNIFFVQURcbiAgICAgIFwiXFx1MjAwMlwiOiAtMSxcbiAgICAgIC8vIEVOIFNQQUNFXG4gICAgICBcIlxcdTIwMDNcIjogLTEsXG4gICAgICAvLyBFTSBTUEFDRVxuICAgICAgXCJcXHUyMDA0XCI6IC0xLFxuICAgICAgLy8gVEhSRUUtUEVSLUVNIFNQQUNFXG4gICAgICBcIlxcdTIwMDVcIjogLTEsXG4gICAgICAvLyBGT1VSLVBFUi1FTSBTUEFDRVxuICAgICAgXCJcXHUyMDA2XCI6IC0xLFxuICAgICAgLy8gU0lYLVBFUi1FTSBTUEFDRVxuICAgICAgXCJcXHUyMDA3XCI6IC0xLFxuICAgICAgLy8gRklHVVJFIFNQQUNFXG4gICAgICBcIlxcdTIwMDhcIjogLTEsXG4gICAgICAvLyBQVU5DVFVBVElPTiBTUEFDRVxuICAgICAgXCJcXHUyMDA5XCI6IC0xLFxuICAgICAgLy8gVEhJTiBTUEFDRVxuICAgICAgXCJcXHUyMDBBXCI6IC0xLFxuICAgICAgLy8gSEFJUiBTUEFDRVxuICAgICAgXCJcXHUyMDBCXCI6IC0xLFxuICAgICAgLy8gWldTXG4gICAgICBcIlxcdTIwMkZcIjogLTEsXG4gICAgICAvLyBOQVJST1cgTkJTXG4gICAgICBcIlxcdTIwNUZcIjogLTEsXG4gICAgICAvLyBNRURJVU0gTUFUSEVNQVRJQ0FMIFNQQUNFXG4gICAgICBcIl9cIjogLTEsXG4gICAgICBcIixcIjogLTEsXG4gICAgICBcIjBcIjogMCxcbiAgICAgIFwiMVwiOiAxLFxuICAgICAgXCIyXCI6IDIsXG4gICAgICBcIjNcIjogMyxcbiAgICAgIFwiNFwiOiA0LFxuICAgICAgXCI1XCI6IDUsXG4gICAgICBcIjZcIjogNixcbiAgICAgIFwiN1wiOiA3LFxuICAgICAgXCI4XCI6IDgsXG4gICAgICBcIjlcIjogOSxcbiAgICAgIFwiYVwiOiAxMCxcbiAgICAgIFwiYlwiOiAxMSxcbiAgICAgIFwiY1wiOiAxMixcbiAgICAgIFwiZFwiOiAxMyxcbiAgICAgIFwiZVwiOiAxNCxcbiAgICAgIFwiZlwiOiAxNSxcbiAgICAgIFwiZ1wiOiAxNixcbiAgICAgIFwiaFwiOiAxNyxcbiAgICAgIFwiaVwiOiAxOCxcbiAgICAgIFwialwiOiAxOSxcbiAgICAgIFwia1wiOiAyMCxcbiAgICAgIFwibFwiOiAyMSxcbiAgICAgIFwibVwiOiAyMixcbiAgICAgIFwiblwiOiAyMyxcbiAgICAgIFwib1wiOiAyNCxcbiAgICAgIFwicFwiOiAyNSxcbiAgICAgIFwicVwiOiAyNixcbiAgICAgIFwiclwiOiAyNyxcbiAgICAgIFwic1wiOiAyOCxcbiAgICAgIFwidFwiOiAyOSxcbiAgICAgIFwidVwiOiAzMCxcbiAgICAgIFwidlwiOiAzMSxcbiAgICAgIFwid1wiOiAzMixcbiAgICAgIFwieFwiOiAzMyxcbiAgICAgIFwieVwiOiAzNCxcbiAgICAgIFwielwiOiAzNVxuICAgIH1bc1tpXV07XG4gICAgaWYgKGsgIT09IC0xKSB7XG4gICAgICBpZiAoayA9PT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gW3ZhbHVlLCBzLnN1YnN0cmluZyhpKV07XG4gICAgICBpZiAoayA+PSBiYXNlKVxuICAgICAgICByZXR1cm4gW3ZhbHVlLCBzLnN1YnN0cmluZyhpKV07XG4gICAgICB2YWx1ZSA9IHZhbHVlICogYmFzZSArIGs7XG4gICAgfVxuICB9XG4gIHJldHVybiBbdmFsdWUsIFwiXCJdO1xufVxuZnVuY3Rpb24gYXNGbG9hdChleHByKSB7XG4gIGNvbnN0IG51bSA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gbnVtO1xuICBpZiAobnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIHJldHVybiBudW0udG9OdW1iZXIoKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobnVtKSkge1xuICAgIGNvbnN0IFtuLCBkXSA9IG51bTtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGQgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gbiAvIGQ7XG4gICAgcmV0dXJuIE51bWJlcihuKSAvIE51bWJlcihkKTtcbiAgfVxuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoIShudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleC5kZWZhdWx0KSB8fCBudW0uaW0gIT09IDApO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGFzQmlnbnVtKGV4cHIpIHtcbiAgY29uc3QgbnVtID0gZXhwci5udW1lcmljVmFsdWU7XG4gIGlmIChudW0gPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpXG4gICAgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIGV4cHIuZW5naW5lLmJpZ251bShudW0pO1xuICBpZiAoQXJyYXkuaXNBcnJheShudW0pKSB7XG4gICAgY29uc3QgW24sIGRdID0gbnVtO1xuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBleHByLmVuZ2luZS5iaWdudW0obiAvIGQpO1xuICAgIHJldHVybiBleHByLmVuZ2luZS5iaWdudW0obikuZGl2KGQudG9TdHJpbmcoKSk7XG4gIH1cbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KCEobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXguZGVmYXVsdCkgfHwgbnVtLmltICE9PSAwKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBhc1NtYWxsSW50ZWdlcihleHByKSB7XG4gIGNvbnN0IG51bSA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG51bSkgJiYgbnVtID49IC1TTUFMTF9JTlRFR0VSICYmIG51bSA8PSBTTUFMTF9JTlRFR0VSKVxuICAgICAgcmV0dXJuIG51bTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAobnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KSB7XG4gICAgaWYgKG51bS5pc0ludGVnZXIoKSkge1xuICAgICAgY29uc3QgbiA9IG51bS50b051bWJlcigpO1xuICAgICAgaWYgKG4gPj0gLVNNQUxMX0lOVEVHRVIgJiYgbiA8PSBTTUFMTF9JTlRFR0VSKVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGV4cHIuaXNDYW5vbmljYWwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHIgPSBudW07XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSB7XG4gICAgY29uc3QgW24sIGRdID0gcjtcbiAgICBsZXQgdjtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGQgPT09IFwibnVtYmVyXCIpXG4gICAgICB2ID0gbiAvIGQ7XG4gICAgZWxzZVxuICAgICAgdiA9IE51bWJlcihuKSAvIE51bWJlcihkKTtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2KSAmJiB2ID49IC1TTUFMTF9JTlRFR0VSICYmIHYgPD0gU01BTExfSU5URUdFUilcbiAgICAgIHJldHVybiB2O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY2hvcChuLCB0b2xlcmFuY2UpIHtcbiAgaWYgKHR5cGVvZiBuID09PSBcIm51bWJlclwiICYmIE1hdGguYWJzKG4pIDw9IHRvbGVyYW5jZSlcbiAgICByZXR1cm4gMDtcbiAgaWYgKG4gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbi5hYnMoKS5sdGUodG9sZXJhbmNlKSlcbiAgICByZXR1cm4gMDtcbiAgaWYgKG4gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleC5kZWZhdWx0ICYmIE1hdGguYWJzKG4ucmUpIDw9IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhuLmltKSA8PSB0b2xlcmFuY2UpXG4gICAgcmV0dXJuIDA7XG4gIHJldHVybiBuO1xufVxuZnVuY3Rpb24gZXJmKHgpIHtcbiAgY29uc3QgYTEgPSAwLjI1NDgyOTU5MjtcbiAgY29uc3QgYTIgPSAtMC4yODQ0OTY3MzY7XG4gIGNvbnN0IGEzID0gMS40MjE0MTM3NDE7XG4gIGNvbnN0IGE0ID0gLTEuNDUzMTUyMDI3O1xuICBjb25zdCBhNSA9IDEuMDYxNDA1NDI5O1xuICBjb25zdCBwID0gMC4zMjc1OTExO1xuICBjb25zdCBzaWduMiA9IHggPCAwID8gLTEgOiAxO1xuICB4ID0gTWF0aC5hYnMoeCk7XG4gIGNvbnN0IHQgPSAxIC8gKDEgKyBwICogeCk7XG4gIGNvbnN0IHkgPSAoKCgoYTUgKiB0ICsgYTQpICogdCArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdDtcbiAgcmV0dXJuIHNpZ24yICogKDEgLSB5ICogTWF0aC5leHAoLXggKiB4KSk7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9udW1lcmljcy9udW1lcmljLWJpZ2ludC50c1xuZnVuY3Rpb24gYmlnaW50KGEpIHtcbiAgaWYgKHR5cGVvZiBhID09PSBcImJpZ2ludFwiKVxuICAgIHJldHVybiBhO1xuICBpZiAoYSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdClcbiAgICByZXR1cm4gYmlnaW50KGEudG9TdHJpbmcoKSk7XG4gIGxldCBzID0gYS50b1N0cmluZygpO1xuICBjb25zdCBtID0gcy5tYXRjaCgvKFteXFwuXSspKD86XFwuKFswLTldKykpP2UoLispJC8pO1xuICBpZiAobSkge1xuICAgIHMgPSBtWzFdICsgKG1bMl0gPz8gXCJcIikgKyBcIjBcIi5yZXBlYXQocGFyc2VJbnQobVszXSkgLSAobVsyXSA/IG1bMl0ubGVuZ3RoIDogMCkpO1xuICB9XG4gIHJldHVybiBCaWdJbnQocyk7XG59XG5mdW5jdGlvbiBnY2QyKGEsIGIpIHtcbiAgd2hpbGUgKGIgIT09IEJpZ0ludCgwKSlcbiAgICBbYSwgYl0gPSBbYiwgYSAlIGJdO1xuICByZXR1cm4gYSA8IDAgPyAtYSA6IGE7XG59XG52YXIgUFJJTUVfV0hFRUxfSU5DID0gW1xuICBCaWdJbnQoNCksXG4gIEJpZ0ludCgyKSxcbiAgQmlnSW50KDQpLFxuICBCaWdJbnQoMiksXG4gIEJpZ0ludCg0KSxcbiAgQmlnSW50KDYpLFxuICBCaWdJbnQoMiksXG4gIEJpZ0ludCg2KVxuXTtcbmZ1bmN0aW9uIHByaW1lRmFjdG9yczIoZCkge1xuICBpZiAoZCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgY29uc3QgZmFjdG9ycyA9IHByaW1lRmFjdG9ycyhOdW1iZXIoZCkpO1xuICAgIGNvbnN0IHJlc3VsdDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZiBvZiBPYmplY3Qua2V5cyhmYWN0b3JzKSlcbiAgICAgIHJlc3VsdDIuc2V0KGJpZ2ludChmKSwgZmFjdG9yc1tmXSk7XG4gICAgcmV0dXJuIHJlc3VsdDI7XG4gIH1cbiAgbGV0IG4gPSBkO1xuICBjb25zdCByZXN1bHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgY291bnQyID0gMDtcbiAgbGV0IGNvdW50MyA9IDA7XG4gIGxldCBjb3VudDUgPSAwO1xuICBsZXQgayA9IEJpZ0ludCgxMCk7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQyICs9IDE7XG4gICAgY291bnQ1ICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGsgPSBCaWdJbnQoNSk7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQ1ICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGsgPSBCaWdJbnQoMyk7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQzICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGsgPSBCaWdJbnQoMik7XG4gIHdoaWxlIChuICUgayA9PT0gQmlnSW50KDApKSB7XG4gICAgY291bnQyICs9IDE7XG4gICAgbiA9IG4gLyBrO1xuICB9XG4gIGlmIChjb3VudDIgPiAwKVxuICAgIHJlc3VsdC5zZXQoXCIyXCIsIGNvdW50Mik7XG4gIGlmIChjb3VudDMgPiAwKVxuICAgIHJlc3VsdC5zZXQoXCIzXCIsIGNvdW50Myk7XG4gIGlmIChjb3VudDUgPiAwKVxuICAgIHJlc3VsdC5zZXQoXCI1XCIsIGNvdW50NSk7XG4gIGsgPSBCaWdJbnQoNyk7XG4gIGxldCBrSW5kZXggPSBcIlwiO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChrICogayA8IG4pIHtcbiAgICBpZiAobiAlIGsgPT09IEJpZ0ludCgwKSkge1xuICAgICAgaWYgKCFrSW5kZXgpXG4gICAgICAgIGtJbmRleCA9IGsudG9TdHJpbmcoKTtcbiAgICAgIHJlc3VsdC5zZXQoa0luZGV4LCAocmVzdWx0LmdldChrSW5kZXgpID8/IDApICsgMSk7XG4gICAgICBuID0gbiAvIGs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGsgPSBrICsgUFJJTUVfV0hFRUxfSU5DW2ldO1xuICAgICAga0luZGV4ID0gXCJcIjtcbiAgICAgIGkgPSBpIDwgNyA/IGkgKyAxIDogMDtcbiAgICB9XG4gIH1cbiAgaWYgKG4gIT09IEJpZ0ludCgxKSlcbiAgICByZXN1bHQuc2V0KG4udG9TdHJpbmcoKSwgKHJlc3VsdC5nZXQobi50b1N0cmluZygpKSA/PyAwKSArIDEpO1xuICBjb25zdCByID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgZm9yIChjb25zdCBbazIsIHZdIG9mIHJlc3VsdClcbiAgICByLnNldChiaWdpbnQoazIpLCB2KTtcbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBmYWN0b3JQb3dlcjIobiwgZXhwb25lbnQpIHtcbiAgY29uc3QgZmFjdG9ycyA9IHByaW1lRmFjdG9yczIobik7XG4gIGxldCBmID0gQmlnSW50KDEpO1xuICBsZXQgciA9IEJpZ0ludCgxKTtcbiAgY29uc3QgZXhwMiA9IGJpZ2ludChleHBvbmVudCk7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIGZhY3RvcnMpIHtcbiAgICBjb25zdCB2MiA9IGJpZ2ludCh2KTtcbiAgICBmID0gZiAqIGsgKiogKHYyIC8gZXhwMik7XG4gICAgciA9IHIgKiBrICoqICh2MiAlIGV4cDIpO1xuICB9XG4gIHJldHVybiBbZiwgcl07XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL3V0aWxzLnRzXG5mdW5jdGlvbiBpc0xhdGV4U3RyaW5nKHMpIHtcbiAgaWYgKHR5cGVvZiBzID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoXCIkXCIpICYmIHMuZW5kc1dpdGgoXCIkXCIpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBsYXRleFN0cmluZyhzKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiBzLnN0YXJ0c1dpdGgoXCIkXCIpICYmIHMuZW5kc1dpdGgoXCIkXCIpKVxuICAgIHJldHVybiBzLnNsaWNlKDEsIC0xKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRJbWFnaW5hcnlDb2VmKGV4cHIpIHtcbiAgaWYgKGV4cHIuc3ltYm9sID09PSBcIkltYWdpbmFyeVVuaXRcIilcbiAgICByZXR1cm4gMTtcbiAgY29uc3QgeiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAoeiAhPT0gbnVsbCAmJiB6IGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgyLmRlZmF1bHQgJiYgei5yZSA9PT0gMClcbiAgICByZXR1cm4gei5pbTtcbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJOZWdhdGVcIikge1xuICAgIGNvbnN0IHYgPSBnZXRJbWFnaW5hcnlDb2VmKGV4cHIub3AxKTtcbiAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAtdjtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIk11bHRpcGx5XCIgJiYgZXhwci5ub3BzID09PSAyKSB7XG4gICAgaWYgKGV4cHIub3AxLnN5bWJvbCA9PT0gXCJJbWFnaW5hcnlVbml0XCIpXG4gICAgICByZXR1cm4gYXNGbG9hdChleHByLm9wMik7XG4gICAgaWYgKGV4cHIub3AyLnN5bWJvbCA9PT0gXCJJbWFnaW5hcnlVbml0XCIpXG4gICAgICByZXR1cm4gYXNGbG9hdChleHByLm9wMSk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBnZXRGcmVlVmFycyhleHByLCBzZXQpIHtcbiAgaWYgKGV4cHIuc3ltYm9sKSB7XG4gICAgY29uc3QgZGVmID0gZXhwci5lbmdpbmUubG9va3VwU3ltYm9sKGV4cHIuc3ltYm9sKTtcbiAgICBpZiAoZGVmPy52YWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgc2V0LmFkZChleHByLnN5bWJvbCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZXhwci5vcHMgJiYgIWV4cHIua2V5cylcbiAgICByZXR1cm47XG4gIGlmIChleHByLm9wcylcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBleHByLm9wcylcbiAgICAgIGdldEZyZWVWYXJzKG9wMywgc2V0KTtcbiAgaWYgKGV4cHIua2V5cylcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBleHByLmtleXMpXG4gICAgICBnZXRGcmVlVmFycyhleHByLmdldEtleShrZXkpLCBzZXQpO1xuICByZXR1cm47XG59XG5mdW5jdGlvbiBnZXRTeW1ib2xzKGV4cHIsIHNldCkge1xuICBpZiAoZXhwci5zeW1ib2wpIHtcbiAgICBzZXQuYWRkKGV4cHIuc3ltYm9sKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFleHByLm9wcyAmJiAhZXhwci5rZXlzKVxuICAgIHJldHVybjtcbiAgaWYgKGV4cHIub3BzKVxuICAgIGZvciAoY29uc3Qgb3AzIG9mIGV4cHIub3BzKVxuICAgICAgZ2V0U3ltYm9scyhvcDMsIHNldCk7XG4gIGlmIChleHByLmtleXMpXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZXhwci5rZXlzKVxuICAgICAgZ2V0U3ltYm9scyhleHByLmdldEtleShrZXkpLCBzZXQpO1xuICByZXR1cm47XG59XG5mdW5jdGlvbiBnZXRTdWJleHByZXNzaW9ucyhleHByLCBoZWFkMikge1xuICBjb25zdCByZXN1bHQgPSAhaGVhZDIgfHwgZXhwci5oZWFkID09PSBoZWFkMiA/IFtleHByXSA6IFtdO1xuICBpZiAoZXhwci5vcHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBleHByLm9wcylcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmdldFN1YmV4cHJlc3Npb25zKG9wMywgaGVhZDIpKTtcbiAgfSBlbHNlIGlmIChleHByLmtleXMpIHtcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBleHByLmtleXMpXG4gICAgICByZXN1bHQucHVzaCguLi5nZXRTdWJleHByZXNzaW9ucyhleHByLmdldEtleShvcDMpLCBoZWFkMikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBiaWdudW1QcmVmZXJyZWQoY2UpIHtcbiAgcmV0dXJuIGNlLm51bWVyaWNNb2RlID09PSBcImJpZ251bVwiIHx8IGNlLm51bWVyaWNNb2RlID09PSBcImF1dG9cIjtcbn1cbmZ1bmN0aW9uIGNvbXBsZXhBbGxvd2VkKGNlKSB7XG4gIHJldHVybiBjZS5udW1lcmljTW9kZSA9PT0gXCJhdXRvXCIgfHwgY2UubnVtZXJpY01vZGUgPT09IFwiY29tcGxleFwiO1xufVxuZnVuY3Rpb24gaGFzaENvZGUocykge1xuICBsZXQgaGFzaDIgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspXG4gICAgaGFzaDIgPSBNYXRoLmltdWwoMzEsIGhhc2gyKSArIHMuY2hhckNvZGVBdChpKSB8IDA7XG4gIHJldHVybiBNYXRoLmFicyhoYXNoMik7XG59XG5mdW5jdGlvbiBiaWdpbnRWYWx1ZShjZSwgZXhwcikge1xuICBpZiAoZXhwciA9PT0gbnVsbCB8fCBleHByID09PSB2b2lkIDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihleHByKSA/IGJpZ2ludChleHByKSA6IG51bGw7XG4gIGlmIChpc051bWJlckV4cHJlc3Npb24oZXhwcikpIHtcbiAgICBjb25zdCBudW0gPSBpc051bWJlck9iamVjdChleHByKSA/IGV4cHIubnVtLnRvU3RyaW5nKCkgOiBleHByO1xuICAgIGxldCBzID0gbnVtLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW25kXSQvZywgXCJcIikucmVwbGFjZSgvW1xcdTAwMDktXFx1MDAwZFxcdTAwMjBcXHUwMGEwXS9nLCBcIlwiKTtcbiAgICBpZiAoL1xcKFswLTldK1xcKS8udGVzdChzKSkge1xuICAgICAgY29uc3QgW18sIGJvZHksIHJlcGVhdCwgdHJhaWxdID0gcy5tYXRjaCgvKC4rKVxcKChbMC05XSspXFwpKC4qKSQvKSA/PyBbXTtcbiAgICAgIHMgPSBib2R5ICsgcmVwZWF0LnJlcGVhdChNYXRoLmNlaWwoY2UucHJlY2lzaW9uIC8gcmVwZWF0Lmxlbmd0aCkpICsgKHRyYWlsID8/IFwiXCIpO1xuICAgIH1cbiAgICBpZiAocyA9PT0gXCJuYW5cIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChzID09PSBcImluZmluaXR5XCIgfHwgcyA9PT0gXCIraW5maW5pdHlcIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChzID09PSBcIi1pbmZpbml0eVwiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHMuaW5jbHVkZXMoXCIuXCIpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJpZ2ludChzKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGFzQmlnaW50KGV4cHIpIHtcbiAgY29uc3QgbnVtID0gZXhwci5udW1lcmljVmFsdWU7XG4gIGlmIChudW0gPT09IG51bGwpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICByZXR1cm4gYmlnaW50KG51bSk7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbnVtLmlzSW50ZWdlcigpKVxuICAgIHJldHVybiBiaWdpbnQobnVtKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ydWxlcy50c1xuZnVuY3Rpb24gbWF0Y2hSdWxlcyhleHByLCBydWxlcywgc3ViMikge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgciA9IGFwcGx5UnVsZShydWxlLCBleHByLCBzdWIyKTtcbiAgICBpZiAociAhPT0gbnVsbClcbiAgICAgIHJlc3VsdC5wdXNoKHIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBib3hSdWxlcyhjZSwgcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBbcmF3TGhzLCByYXdSaHMsIG9wdGlvbnNdIG9mIHJzKSB7XG4gICAgbGV0IGNvbmQ7XG4gICAgY29uc3QgbGF0ZXggPSBsYXRleFN0cmluZyhvcHRpb25zPy5jb25kaXRpb24pO1xuICAgIGlmIChsYXRleCkge1xuICAgICAgY29uc3QgY29uZFBhdHRlcm4gPSBjZS5wYXR0ZXJuKGxhdGV4KTtcbiAgICAgIGNvbmQgPSAoeCkgPT4gY29uZFBhdHRlcm4uc3Vicyh4KS52YWx1ZT8uc3ltYm9sID09PSBcIlRydWVcIjtcbiAgICB9IGVsc2VcbiAgICAgIGNvbmQgPSBvcHRpb25zPy5jb25kaXRpb247XG4gICAgcmVzdWx0LmFkZChbXG4gICAgICBjZS5wYXR0ZXJuKHJhd0xocyksXG4gICAgICBjZS5wYXR0ZXJuKHJhd1JocyksXG4gICAgICBvcHRpb25zPy5wcmlvcml0eSA/PyAwLFxuICAgICAgY29uZFxuICAgIF0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBhcHBseVJ1bGUoW2xocywgcmhzLCBfcHJpb3JpdHksIGNvbmRpdGlvbl0sIGV4cHIsIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBjb25zdCBzdWIyID0gbGhzLm1hdGNoKGV4cHIsIHsgc3Vic3RpdHV0aW9uLCAuLi5vcHRpb25zIH0pO1xuICBpZiAoc3ViMiA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09IFwiZnVuY3Rpb25cIiAmJiAhY29uZGl0aW9uKHN1YjIpKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gcmhzLnN1YnMoc3ViMiwgeyBjYW5vbmljYWw6IHRydWUgfSk7XG59XG5mdW5jdGlvbiByZXBsYWNlKGV4cHIsIHJ1bGVTZXQsIG9wdGlvbnMpIHtcbiAgY29uc3QgaXRlcmF0aW9uTGltaXQgPSBvcHRpb25zPy5pdGVyYXRpb25MaW1pdCA/PyAxO1xuICBsZXQgaXRlcmF0aW9uQ291bnQgPSAwO1xuICBjb25zdCBvbmNlID0gb3B0aW9ucz8ub25jZSA/PyBmYWxzZTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IGF0TGVhc3RPbmVSdWxlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgd2hpbGUgKCFkb25lICYmIGl0ZXJhdGlvbkNvdW50IDwgaXRlcmF0aW9uTGltaXQpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVTZXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlSdWxlKHJ1bGUsIGV4cHIsIHt9LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IGV4cHIpIHtcbiAgICAgICAgICBpZiAob25jZSlcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGF0TGVhc3RPbmVSdWxlID0gdHJ1ZTtcbiAgICAgICAgICBleHByID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpdGVyYXRpb25Db3VudCArPSAxO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gIH1cbiAgcmV0dXJuIGF0TGVhc3RPbmVSdWxlID8gZXhwciA6IG51bGw7XG59XG5mdW5jdGlvbiBnZXRXaWxkY2FyZE5hbWUocykge1xuICBjb25zdCBtID0gcy5tYXRjaCgvXihfXz9fP1thLXpBLVowLTldKykvKTtcbiAgaWYgKG0gPT09IG51bGwpXG4gICAgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBtWzFdO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9vcmRlci50c1xudmFyIGltcG9ydF9jb21wbGV4MyA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvcG9seW5vbWlhbHMudHNcbmZ1bmN0aW9uIHRvdGFsRGVncmVlKGV4cHIpIHtcbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJQb3dlclwiICYmIGV4cHIub3AyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGRlZyA9IGFzU21hbGxJbnRlZ2VyKGV4cHIub3AyKTtcbiAgICBpZiAoZGVnICE9PSBudWxsICYmIGRlZyA+IDApXG4gICAgICByZXR1cm4gZGVnO1xuICAgIHJldHVybiAxO1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGxldCBkZWcgPSAxO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIGV4cHIub3BzKSB7XG4gICAgICBjb25zdCB0ID0gdG90YWxEZWdyZWUoYXJnKTtcbiAgICAgIGlmICh0ID4gMSlcbiAgICAgICAgZGVnID0gZGVnICsgdDtcbiAgICB9XG4gICAgcmV0dXJuIGRlZztcbiAgfVxuICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIG1heERlZ3JlZShleHByKSB7XG4gIGlmIChleHByLmhlYWQgPT09IFwiUG93ZXJcIiAmJiBleHByLm9wMi5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBkZWcgPSBhc1NtYWxsSW50ZWdlcihleHByLm9wMik7XG4gICAgaWYgKGRlZyAhPT0gbnVsbCAmJiBkZWcgPiAwKVxuICAgICAgcmV0dXJuIGRlZztcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIk11bHRpcGx5XCIpIHtcbiAgICBsZXQgZGVnID0gMTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByLm9wcylcbiAgICAgIGRlZyA9IE1hdGgubWF4KGRlZywgdG90YWxEZWdyZWUoYXJnKSk7XG4gICAgcmV0dXJuIGRlZztcbiAgfVxuICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGxleChleHByKSB7XG4gIGlmIChleHByLnN5bWJvbClcbiAgICByZXR1cm4gZXhwci5zeW1ib2w7XG4gIGlmIChleHByLm9wcykge1xuICAgIGNvbnN0IGggPSB0eXBlb2YgZXhwci5oZWFkID09PSBcInN0cmluZ1wiID8gZXhwci5oZWFkIDogbGV4KGV4cHIuaGVhZCk7XG4gICAgcmV0dXJuIGggKyAnXCInICsgZXhwci5vcHMubWFwKCh4KSA9PiBsZXgoeCkpLmZpbHRlcigoeCkgPT4geC5sZW5ndGggPiAwKS5qb2luKCdcIicpO1xuICB9XG4gIHJldHVybiBcIlwiO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9vcmRlci50c1xudmFyIERFRkFVTFRfQ09NUExFWElUWSA9IDFlNTtcbmZ1bmN0aW9uIHNvcnRBZGQoY2UsIG9wczIpIHtcbiAgcmV0dXJuIG9wczIuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFMZXggPSBsZXgoYSk7XG4gICAgY29uc3QgYkxleCA9IGxleChiKTtcbiAgICBpZiAoIWFMZXggJiYgIWJMZXgpXG4gICAgICByZXR1cm4gb3JkZXIoYSwgYik7XG4gICAgaWYgKCFhTGV4KVxuICAgICAgcmV0dXJuIDE7XG4gICAgaWYgKCFiTGV4KVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGlmIChhTGV4IDwgYkxleClcbiAgICAgIHJldHVybiAtMTtcbiAgICBpZiAoYUxleCA+IGJMZXgpXG4gICAgICByZXR1cm4gMTtcbiAgICBjb25zdCBhVG90YWxEZWcgPSB0b3RhbERlZ3JlZShhKTtcbiAgICBjb25zdCBiVG90YWxEZWcgPSB0b3RhbERlZ3JlZShiKTtcbiAgICBpZiAoYVRvdGFsRGVnICE9PSBiVG90YWxEZWcpXG4gICAgICByZXR1cm4gYlRvdGFsRGVnIC0gYVRvdGFsRGVnO1xuICAgIGNvbnN0IGFNYXhEZWcgPSBtYXhEZWdyZWUoYSk7XG4gICAgY29uc3QgYk1heERlZyA9IG1heERlZ3JlZShiKTtcbiAgICBpZiAoYU1heERlZyAhPT0gYk1heERlZylcbiAgICAgIHJldHVybiBhTWF4RGVnIC0gYk1heERlZztcbiAgICByZXR1cm4gb3JkZXIoYSwgYik7XG4gIH0pO1xufVxuZnVuY3Rpb24gb3JkZXIoYSwgYikge1xuICBpZiAoYSA9PT0gYilcbiAgICByZXR1cm4gMDtcbiAgaWYgKGEubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIGEubnVtZXJpY1ZhbHVlID09PSBiLm51bWVyaWNWYWx1ZSlcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgYWYgPSBhc0Zsb2F0KGEpO1xuICBpZiAoYWYgIT09IG51bGwpIHtcbiAgICBjb25zdCBiZiA9IGFzRmxvYXQoYik7XG4gICAgaWYgKGJmICE9PSBudWxsKVxuICAgICAgcmV0dXJuIGFmIC0gYmY7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChhLm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4My5kZWZhdWx0KSB7XG4gICAgaWYgKGIubnVtZXJpY1ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgzLmRlZmF1bHQpIHtcbiAgICAgIGlmIChhLm51bWVyaWNWYWx1ZS5yZSA9PT0gYi5udW1lcmljVmFsdWUucmUpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGEubnVtZXJpY1ZhbHVlLmltKSA9PT0gTWF0aC5hYnMoYi5udW1lcmljVmFsdWUuaW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGEubnVtZXJpY1ZhbHVlLmltIC0gYi5udW1lcmljVmFsdWUuaW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGEubnVtZXJpY1ZhbHVlLmltKSAtIE1hdGguYWJzKGIubnVtZXJpY1ZhbHVlLmltKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhLm51bWVyaWNWYWx1ZS5yZSAtIGIubnVtZXJpY1ZhbHVlLnJlO1xuICAgIH1cbiAgICBpZiAoYi5udW1lcmljVmFsdWUgIT09IG51bGwpXG4gICAgICByZXR1cm4gMTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKGEubnVtZXJpY1ZhbHVlKSB7XG4gICAgaWYgKGIubnVtZXJpY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChhLmhlYWQgPT09IFwiU3FydFwiICYmIGEub3AxLm51bWVyaWNWYWx1ZSkge1xuICAgIGlmIChiLmhlYWQgPT09IFwiU3FydFwiICYmIGIub3AxLm51bWVyaWNWYWx1ZSlcbiAgICAgIHJldHVybiBvcmRlcihhLm9wMSwgYi5vcDEpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoYS5zeW1ib2wpIHtcbiAgICBpZiAoYi5zeW1ib2wpIHtcbiAgICAgIGlmIChhLnN5bWJvbCA9PT0gYi5zeW1ib2wpXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgcmV0dXJuIGEuc3ltYm9sID4gYi5zeW1ib2wgPyAxIDogLTE7XG4gICAgfVxuICAgIGlmIChiLm51bWVyaWNWYWx1ZSAhPT0gbnVsbClcbiAgICAgIHJldHVybiAxO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoYS5vcHMpIHtcbiAgICBpZiAoYi5vcHMpIHtcbiAgICAgIGNvbnN0IGFDb21wbGV4aXR5ID0gYS5mdW5jdGlvbkRlZmluaXRpb24/LmNvbXBsZXhpdHkgPz8gREVGQVVMVF9DT01QTEVYSVRZO1xuICAgICAgY29uc3QgYkNvbXBsZXhpdHkgPSBiLmZ1bmN0aW9uRGVmaW5pdGlvbj8uY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFk7XG4gICAgICBpZiAoYUNvbXBsZXhpdHkgPT09IGJDb21wbGV4aXR5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYS5oZWFkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiLmhlYWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoYS5oZWFkID09PSBiLmhlYWQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRMZWFmQ291bnQoYSkgLSBnZXRMZWFmQ291bnQoYik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhLmhlYWQgPCBiLmhlYWQpXG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldExlYWZDb3VudChhKSAtIGdldExlYWZDb3VudChiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhQ29tcGxleGl0eSAtIGJDb21wbGV4aXR5O1xuICAgIH1cbiAgICBpZiAoYi5udW1lcmljVmFsdWUgIT09IG51bGwgfHwgYi5zeW1ib2wpXG4gICAgICByZXR1cm4gMTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKGEuc3RyaW5nKSB7XG4gICAgaWYgKGIuc3RyaW5nKSB7XG4gICAgICBpZiAoYS5zdHJpbmcubGVuZ3RoICE9PSBiLnN0cmluZy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBiLnN0cmluZy5sZW5ndGggLSBhLnN0cmluZy5sZW5ndGg7XG4gICAgICBpZiAoYi5zdHJpbmcgPCBhLnN0cmluZylcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKGEuc3RyaW5nID4gYi5zdHJpbmcpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChiLmtleXMpXG4gICAgICByZXR1cm4gLTE7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYgKGEua2V5cyAmJiBiLmtleXMpIHtcbiAgICBpZiAoYS5rZXlzQ291bnQgIT09IGIua2V5c0NvdW50KVxuICAgICAgcmV0dXJuIGIua2V5c0NvdW50IC0gYS5rZXlzQ291bnQ7XG4gICAgbGV0IGJDb21wbGV4aXR5ID0gMDtcbiAgICBsZXQgYUNvbXBsZXhpdHkgPSAwO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGIua2V5cylcbiAgICAgIGJDb21wbGV4aXR5ICs9IGIuZ2V0S2V5KGtleSkuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYS5rZXlzKVxuICAgICAgYUNvbXBsZXhpdHkgKz0gYS5nZXRLZXkoa2V5KS5jb21wbGV4aXR5ID8/IERFRkFVTFRfQ09NUExFWElUWTtcbiAgICByZXR1cm4gYUNvbXBsZXhpdHkgLSBiQ29tcGxleGl0eTtcbiAgfVxuICByZXR1cm4gKGEuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFkpIC0gKGIuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFkpO1xufVxuZnVuY3Rpb24gZ2V0TGVhZkNvdW50KGV4cHIpIHtcbiAgaWYgKGV4cHIua2V5cyAhPT0gbnVsbClcbiAgICByZXR1cm4gMSArIGV4cHIua2V5c0NvdW50O1xuICBpZiAoIWV4cHIub3BzKVxuICAgIHJldHVybiAxO1xuICByZXR1cm4gKHR5cGVvZiBleHByLmhlYWQgPT09IFwic3RyaW5nXCIgPyAxIDogZ2V0TGVhZkNvdW50KGV4cHIuaGVhZCkpICsgWy4uLmV4cHIub3BzXS5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgZ2V0TGVhZkNvdW50KHgpLCAwKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL3N5bWJvbGljL2ZsYXR0ZW4udHNcbmZ1bmN0aW9uIGZsYXR0ZW5PcHMob3BzMiwgaGVhZDIpIHtcbiAgaWYgKCFoZWFkMilcbiAgICByZXR1cm4gb3BzMjtcbiAgaWYgKG9wczIuZXZlcnkoKHgpID0+ICF4Lm9wcyB8fCB4LmhlYWQgIT09IGhlYWQyKSlcbiAgICByZXR1cm4gb3BzMjtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICBpZiAoIWFyZy5vcHMgfHwgYXJnLmhlYWQgIT09IGhlYWQyKVxuICAgICAgcmVzdWx0LnB1c2goYXJnKTtcbiAgICBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmZsYXR0ZW5PcHMoYXJnLm9wcywgaGVhZDIpKTtcbiAgICB9XG4gIH1cbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHJlc3VsdC5sZW5ndGggIT09IG9wczIubGVuZ3RoKTtcbiAgaWYgKHJlc3VsdC5sZW5ndGggPT09IG9wczIubGVuZ3RoKVxuICAgIHJldHVybiBvcHMyO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZmxhdHRlblNlcXVlbmNlKHhzKSB7XG4gIGlmICh4cy5ldmVyeSgoeCkgPT4geC5oZWFkICE9PSBcIlNlcXVlbmNlXCIpKVxuICAgIHJldHVybiB4cztcbiAgY29uc3QgeXMgPSBbXTtcbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKHguaXNWYWxpZCAmJiB4LmhlYWQgPT09IFwiU2VxdWVuY2VcIikge1xuICAgICAgaWYgKHgub3BzKVxuICAgICAgICB5cy5wdXNoKC4uLngub3BzKTtcbiAgICB9IGVsc2VcbiAgICAgIHlzLnB1c2goeCk7XG4gIH1cbiAgcmV0dXJuIHlzO1xufVxuZnVuY3Rpb24gY2Fub25pY2FsKHhzKSB7XG4gIHJldHVybiB4cy5ldmVyeSgoeCkgPT4geC5pc0Nhbm9uaWNhbCkgPyB4cyA6IHhzLm1hcCgoeCkgPT4geC5jYW5vbmljYWwpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbnVtZXJpY3MvcmF0aW9uYWxzLnRzXG52YXIgaW1wb3J0X2NvbXBsZXg0ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5mdW5jdGlvbiBpc1JhdGlvbmFsKHgpIHtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh4KTtcbn1cbmZ1bmN0aW9uIGlzTWFjaGluZVJhdGlvbmFsKHgpIHtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh4KSAmJiB0eXBlb2YgeFswXSA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGlzQmlnUmF0aW9uYWwoeCkge1xuICByZXR1cm4geCAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHgpICYmIHR5cGVvZiB4WzBdID09PSBcImJpZ2ludFwiO1xufVxuZnVuY3Rpb24gaXNSYXRpb25hbFplcm8oeCkge1xuICByZXR1cm4geFswXSA9PSAwO1xufVxuZnVuY3Rpb24gaXNSYXRpb25hbE9uZSh4KSB7XG4gIHJldHVybiB4WzBdID09PSB4WzFdO1xufVxuZnVuY3Rpb24gaXNSYXRpb25hbE5lZ2F0aXZlT25lKHgpIHtcbiAgcmV0dXJuIHhbMF0gPT09IC14WzFdO1xufVxuZnVuY3Rpb24gbWFjaGluZU51bWVyYXRvcih4KSB7XG4gIHJldHVybiBOdW1iZXIoeFswXSk7XG59XG5mdW5jdGlvbiBtYWNoaW5lRGVub21pbmF0b3IoeCkge1xuICByZXR1cm4gTnVtYmVyKHhbMV0pO1xufVxuZnVuY3Rpb24gaXNOZWcoeCkge1xuICByZXR1cm4geFswXSA8IDA7XG59XG5mdW5jdGlvbiBuZWcoeCkge1xuICByZXR1cm4gWy14WzBdLCB4WzFdXTtcbn1cbmZ1bmN0aW9uIGludmVyc2UoeCkge1xuICByZXR1cm4geFswXSA8IDAgPyBbLXhbMV0sIC14WzBdXSA6IFt4WzFdLCB4WzBdXTtcbn1cbmZ1bmN0aW9uIGFzUmF0aW9uYWwoZXhwcikge1xuICBjb25zdCBudW0gPSBleHByLm51bWVyaWNWYWx1ZTtcbiAgaWYgKG51bSA9PT0gbnVsbClcbiAgICByZXR1cm4gdm9pZCAwO1xuICBpZiAoQXJyYXkuaXNBcnJheShudW0pKVxuICAgIHJldHVybiBudW07XG4gIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICByZXR1cm4gW251bSwgMV07XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbnVtLmlzSW50ZWdlcigpKVxuICAgIHJldHVybiBbYmlnaW50KG51bSksIEJpZ0ludCgxKV07XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBhc01hY2hpbmVSYXRpb25hbChyKSB7XG4gIHJldHVybiBbTnVtYmVyKHJbMF0pLCBOdW1iZXIoclsxXSldO1xufVxuZnVuY3Rpb24gYWRkMihsaHMsIHJocykge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShyaHMpIHx8IHJocy5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgIShyaHMgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdClcbiAgKTtcbiAgaWYgKHR5cGVvZiBsaHNbMF0gPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShsaHNbMF0pKVxuICAgIHJldHVybiBsaHM7XG4gIGNvbnN0IHJoc051bSA9IEFycmF5LmlzQXJyYXkocmhzKSA/IHJocyA6IHJocy5udW1lcmljVmFsdWU7XG4gIGlmIChyaHNOdW0gPT09IG51bGwpXG4gICAgcmV0dXJuIGxocztcbiAgaWYgKEFycmF5LmlzQXJyYXkocmhzTnVtKSkge1xuICAgIGlmIChpc0JpZ1JhdGlvbmFsKHJoc051bSkpIHtcbiAgICAgIGxocyA9IFtiaWdpbnQobGhzWzBdKSwgYmlnaW50KGxoc1sxXSldO1xuICAgICAgcmV0dXJuIFtyaHNOdW1bMV0gKiBsaHNbMF0gKyByaHNOdW1bMF0gKiBsaHNbMV0sIHJoc051bVsxXSAqIGxoc1sxXV07XG4gICAgfVxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJoc051bVswXSkpXG4gICAgICByZXR1cm4gcmhzTnVtO1xuICAgIGlmIChpc0JpZ1JhdGlvbmFsKGxocykpIHtcbiAgICAgIGNvbnN0IGJpZ1JocyA9IFtiaWdpbnQocmhzTnVtWzBdKSwgYmlnaW50KHJoc051bVsxXSldO1xuICAgICAgcmV0dXJuIFtiaWdSaHNbMV0gKiBsaHNbMF0gKyBiaWdSaHNbMF0gKiBsaHNbMV0sIGJpZ1Joc1sxXSAqIGxoc1sxXV07XG4gICAgfVxuICAgIHJldHVybiBbcmhzTnVtWzFdICogbGhzWzBdICsgcmhzTnVtWzBdICogbGhzWzFdLCByaHNOdW1bMV0gKiBsaHNbMV1dO1xuICB9XG4gIGlmIChyaHNOdW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpIHtcbiAgICBpZiAocmhzTnVtLmlzTmFOKCkpXG4gICAgICByZXR1cm4gW051bWJlci5OYU4sIDFdO1xuICAgIGlmICghcmhzTnVtLmlzRmluaXRlKCkpXG4gICAgICByZXR1cm4gW3Joc051bS5pc05lZ2F0aXZlKCkgPyAtSW5maW5pdHkgOiBJbmZpbml0eSwgMV07XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHJoc051bS5pc0ludGVnZXIoKSk7XG4gICAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGxocykpXG4gICAgICBsaHMgPSBbYmlnaW50KGxoc1swXSksIGJpZ2ludChsaHNbMV0pXTtcbiAgICByZXR1cm4gW2xoc1swXSArIGxoc1sxXSAqIGJpZ2ludChyaHNOdW0udG9TdHJpbmcoKSksIGxoc1sxXV07XG4gIH1cbiAgaWYgKHJoc051bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4NC5kZWZhdWx0KVxuICAgIHJldHVybiBbTnVtYmVyLk5hTiwgMV07XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCghTnVtYmVyLmlzRmluaXRlKHJoc051bSkgfHwgTnVtYmVyLmlzSW50ZWdlcihyaHNOdW0pKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocmhzTnVtKSlcbiAgICByZXR1cm4gW3Joc051bSwgMV07XG4gIGlmIChpc01hY2hpbmVSYXRpb25hbChsaHMpKVxuICAgIHJldHVybiBbbGhzWzBdICsgbGhzWzFdICogcmhzTnVtLCBsaHNbMV1dO1xuICByZXR1cm4gW2xoc1swXSArIGxoc1sxXSAqIGJpZ2ludChyaHNOdW0pLCBsaHNbMV1dO1xufVxuZnVuY3Rpb24gbXVsMihsaHMsIHJocykge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShyaHMpIHx8IHJocy5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgIShyaHMgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdClcbiAgKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmhzKSkge1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChsaHMpICYmIGlzTWFjaGluZVJhdGlvbmFsKHJocykpXG4gICAgICByZXR1cm4gW2xoc1swXSAqIHJoc1swXSwgbGhzWzFdICogcmhzWzFdXTtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobGhzKSlcbiAgICAgIGxocyA9IFtiaWdpbnQobGhzWzBdKSwgYmlnaW50KGxoc1sxXSldO1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChyaHMpKVxuICAgICAgcmhzID0gW2JpZ2ludChyaHNbMF0pLCBiaWdpbnQocmhzWzFdKV07XG4gICAgcmV0dXJuIFtsaHNbMF0gKiByaHNbMF0sIGxoc1sxXSAqIHJoc1sxXV07XG4gIH1cbiAgY29uc3QgcmhzTnVtID0gcmhzLm51bWVyaWNWYWx1ZTtcbiAgaWYgKHJoc051bSAhPT0gbnVsbCAmJiB0eXBlb2YgcmhzTnVtID09PSBcIm51bWJlclwiKSB7XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KE51bWJlci5pc0ludGVnZXIocmhzTnVtKSk7XG4gICAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGxocykpXG4gICAgICByZXR1cm4gW2xoc1swXSAqIHJoc051bSwgbGhzWzFdXTtcbiAgICByZXR1cm4gW2xoc1swXSAqIGJpZ2ludChyaHNOdW0pLCBsaHNbMV1dO1xuICB9XG4gIGlmIChyaHNOdW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQocmhzTnVtLmlzSW50ZWdlcigpKTtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobGhzKSlcbiAgICAgIHJldHVybiBbYmlnaW50KHJoc051bS50b1N0cmluZygpKSAqIGJpZ2ludChsaHNbMF0pLCBiaWdpbnQobGhzWzFdKV07XG4gICAgcmV0dXJuIFtiaWdpbnQocmhzTnVtLnRvU3RyaW5nKCkpICogbGhzWzBdLCBsaHNbMV1dO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHJoc051bSkpIHtcbiAgICBpZiAoaXNCaWdSYXRpb25hbChyaHNOdW0pKVxuICAgICAgcmV0dXJuIFtyaHNOdW1bMF0gKiBiaWdpbnQobGhzWzBdKSwgcmhzTnVtWzFdICogYmlnaW50KGxoc1sxXSldO1xuICAgIGVsc2UgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGxocykpXG4gICAgICByZXR1cm4gW2xoc1swXSAqIHJoc051bVswXSwgbGhzWzFdICogcmhzTnVtWzFdXTtcbiAgICByZXR1cm4gW2xoc1swXSAqIGJpZ2ludChyaHNOdW1bMF0pLCBsaHNbMV0gKiBiaWdpbnQocmhzTnVtWzFdKV07XG4gIH1cbiAgcmV0dXJuIGxocztcbn1cbmZ1bmN0aW9uIHBvdzIociwgZXhwMikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihleHAyKSk7XG4gIGlmIChleHAyID09PSAwKVxuICAgIHJldHVybiBbMSwgMV07XG4gIGlmIChleHAyIDwgMCkge1xuICAgIHIgPSBpbnZlcnNlKHIpO1xuICAgIGV4cDIgPSAtZXhwMjtcbiAgfVxuICBpZiAoZXhwMiA9PT0gMSlcbiAgICByZXR1cm4gcjtcbiAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKHIpKVxuICAgIHJldHVybiBbTWF0aC5wb3coclswXSwgZXhwMiksIE1hdGgucG93KHJbMV0sIGV4cDIpXTtcbiAgY29uc3QgYmlnZXhwID0gYmlnaW50KGV4cDIpO1xuICByZXR1cm4gW3JbMF0gKiogYmlnZXhwLCByWzFdICoqIGJpZ2V4cF07XG59XG5mdW5jdGlvbiByZWR1Y2VkUmF0aW9uYWwocikge1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwocikpIHtcbiAgICBpZiAoclswXSA9PT0gMSB8fCByWzFdID09PSAxKVxuICAgICAgcmV0dXJuIHI7XG4gICAgaWYgKHJbMV0gPCAwKVxuICAgICAgciA9IFstclswXSwgLXJbMV1dO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHJbMV0pKVxuICAgICAgcmV0dXJuIFswLCAxXTtcbiAgICBjb25zdCBnMiA9IGdjZChyWzBdLCByWzFdKTtcbiAgICByZXR1cm4gZzIgPD0gMSA/IHIgOiBbclswXSAvIGcyLCByWzFdIC8gZzJdO1xuICB9XG4gIGlmIChyWzBdID09PSBCaWdJbnQoMSkgfHwgclsxXSA9PT0gQmlnSW50KDEpKVxuICAgIHJldHVybiByO1xuICBpZiAoclsxXSA8IDApXG4gICAgciA9IFstclswXSwgLXJbMV1dO1xuICBjb25zdCBnID0gZ2NkMihyWzBdLCByWzFdKTtcbiAgaWYgKGcgPD0gMSlcbiAgICByZXR1cm4gcjtcbiAgcmV0dXJuIFtyWzBdIC8gZywgclsxXSAvIGddO1xufVxuZnVuY3Rpb24gcmF0aW9uYWxpemUoeCkge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSlcbiAgICByZXR1cm4geDtcbiAgY29uc3QgZnJhY3Rpb25hbCA9IHggJSAxO1xuICBpZiAoZnJhY3Rpb25hbCA9PT0gMClcbiAgICByZXR1cm4geDtcbiAgY29uc3QgZXBzID0gMWUtMTU7XG4gIGxldCBhID0gTWF0aC5mbG9vcih4KTtcbiAgbGV0IGgxID0gMTtcbiAgbGV0IGsxID0gMDtcbiAgbGV0IGggPSBhO1xuICBsZXQgayA9IDE7XG4gIHdoaWxlICh4IC0gYSA+IGVwcyAqIGsgKiBrKSB7XG4gICAgeCA9IDEgLyAoeCAtIGEpO1xuICAgIGEgPSBNYXRoLmZsb29yKHgpO1xuICAgIGNvbnN0IGgyID0gaDE7XG4gICAgaDEgPSBoO1xuICAgIGNvbnN0IGsyID0gazE7XG4gICAgazEgPSBrO1xuICAgIGggPSBoMiArIGEgKiBoMTtcbiAgICBrID0gazIgKyBhICogazE7XG4gIH1cbiAgcmV0dXJuIFtoLCBrXTtcbn1cbmZ1bmN0aW9uIGFzQ29lZmZpY2llbnQoZXhwcikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoZXhwci5pc0Nhbm9uaWNhbCk7XG4gIGNvbnN0IGNlID0gZXhwci5lbmdpbmU7XG4gIGlmIChleHByLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGNvbnN0IHJlc3QgPSBbXTtcbiAgICBsZXQgY29lZiA9IFsxLCAxXTtcbiAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByLm9wcykge1xuICAgICAgY29uc3QgbjIgPSBhcmcubnVtZXJpY1ZhbHVlO1xuICAgICAgaWYgKG4yICE9PSBudWxsICYmICh0eXBlb2YgbjIgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzSW50ZWdlcihuMikgfHwgbjIgaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgJiYgbjIuaXNJbnRlZ2VyKCkgfHwgaXNSYXRpb25hbChuMikpKVxuICAgICAgICBjb2VmID0gbXVsMihjb2VmLCBhcmcpO1xuICAgICAgZWxzZVxuICAgICAgICByZXN0LnB1c2goYXJnKTtcbiAgICB9XG4gICAgY29lZiA9IHJlZHVjZWRSYXRpb25hbChjb2VmKTtcbiAgICBpZiAoaXNSYXRpb25hbE9uZShjb2VmKSlcbiAgICAgIHJldHVybiBbWzEsIDFdLCBleHByXTtcbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gW2NvZWYsIGNlLl9PTkVdO1xuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiBbY29lZiwgcmVzdFswXV07XG4gICAgcmV0dXJuIFtjb2VmLCBjZS5tdWwocmVzdCldO1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiRGl2aWRlXCIpIHtcbiAgICBsZXQgW2NvZWYxLCBudW1lcl0gPSBhc0NvZWZmaWNpZW50KGV4cHIub3AxKTtcbiAgICBjb25zdCBbY29lZjIsIGRlbm9tXSA9IGFzQ29lZmZpY2llbnQoZXhwci5vcDIpO1xuICAgIGNvbnN0IGNvZWYgPSByZWR1Y2VkUmF0aW9uYWwobXVsMihjb2VmMSwgaW52ZXJzZShjb2VmMikpKTtcbiAgICBpZiAoZGVub20uaXNPbmUpXG4gICAgICByZXR1cm4gW2NvZWYsIG51bWVyXTtcbiAgICByZXR1cm4gW2NvZWYsIGNlLmRpdihudW1lciwgZGVub20pXTtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIlBvd2VyXCIpIHtcbiAgICBpZiAoZXhwci5vcDIubnVtZXJpY1ZhbHVlID09PSBudWxsKVxuICAgICAgcmV0dXJuIFtbMSwgMV0sIGV4cHJdO1xuICAgIGxldCBbY29lZiwgYmFzZV0gPSBhc0NvZWZmaWNpZW50KGV4cHIub3AxKTtcbiAgICBpZiAoaXNSYXRpb25hbE9uZShjb2VmKSlcbiAgICAgIHJldHVybiBbWzEsIDFdLCBleHByXTtcbiAgICBjb25zdCBleHBvbmVudCA9IGV4cHIub3AyO1xuICAgIGNvbnN0IGUgPSBhc1NtYWxsSW50ZWdlcihleHBvbmVudCk7XG4gICAgaWYgKGUgPT09IC0xKVxuICAgICAgcmV0dXJuIFtpbnZlcnNlKGNvZWYpLCBjZS5pbnYoYmFzZSldO1xuICAgIGlmIChlICE9PSBudWxsKVxuICAgICAgcmV0dXJuIFtwb3cyKGNvZWYsIGUpLCBjZS5wb3coYmFzZSwgZXhwb25lbnQpXTtcbiAgICBpZiAoZXhwb25lbnQubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkoZXhwb25lbnQubnVtZXJpY1ZhbHVlKSkge1xuICAgICAgY29uc3QgW2VuLCBlZF0gPSBhc01hY2hpbmVSYXRpb25hbChleHBvbmVudC5udW1lcmljVmFsdWUpO1xuICAgICAgY29uc3QgW251bWVyLCBkZW5vbV0gPSBhc01hY2hpbmVSYXRpb25hbChjb2VmKTtcbiAgICAgIGlmIChudW1lciA+IDAgJiYgTWF0aC5hYnMoZW4pID09PSAxKSB7XG4gICAgICAgIGNvbnN0IFtuQ29lZiwgblJlc3RdID0gZmFjdG9yUG93ZXIobnVtZXIsIGVkKTtcbiAgICAgICAgY29uc3QgW2RDb2VmLCBkUmVzdF0gPSBmYWN0b3JQb3dlcihkZW5vbSwgZWQpO1xuICAgICAgICBpZiAobkNvZWYgPT09IDEgJiYgZENvZWYgPT09IDEpXG4gICAgICAgICAgcmV0dXJuIFtbMSwgMV0sIGV4cHJdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGVuID09PSAxID8gW25Db2VmLCBkQ29lZl0gOiBbZENvZWYsIG5Db2VmXSxcbiAgICAgICAgICBjZS5wb3coY2UubXVsKFtjZS5udW1iZXIoW25SZXN0LCBkUmVzdF0pLCBiYXNlXSksIGV4cG9uZW50KVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1sxLCAxXSwgZXhwcl07XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJBZGRcIikge1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICBjb25zdCBbY29lZiwgcmVzdF0gPSBhc0NvZWZmaWNpZW50KGV4cHIub3AxKTtcbiAgICByZXR1cm4gW25lZyhjb2VmKSwgcmVzdF07XG4gIH1cbiAgY29uc3QgbiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobiAhPT0gbnVsbCkge1xuICAgIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KSB7XG4gICAgICBpZiAobi5pc0ludGVnZXIoKSlcbiAgICAgICAgcmV0dXJuIFtbYmlnaW50KG4udG9TdHJpbmcoKSksIEJpZ0ludCgxKV0sIGNlLl9PTkVdO1xuICAgICAgaWYgKG4uaXNOZWdhdGl2ZSgpKVxuICAgICAgICByZXR1cm4gW1stMSwgMV0sIGNlLm51bWJlcihuLm5lZygpKV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobikpXG4gICAgICAgIHJldHVybiBbW24sIDFdLCBjZS5fT05FXTtcbiAgICAgIGlmIChuIDwgMClcbiAgICAgICAgcmV0dXJuIFtbLTEsIDFdLCBjZS5udW1iZXIoLW4pXTtcbiAgICB9XG4gICAgaWYgKGlzUmF0aW9uYWwobikpXG4gICAgICByZXR1cm4gW24sIGNlLl9PTkVdO1xuICAgIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg0LmRlZmF1bHQgJiYgbi5yZSA8IDApXG4gICAgICByZXR1cm4gW1stMSwgMV0sIGNlLm51bWJlcihjZS5jb21wbGV4KC1uLnJlLCAtbi5pbSkpXTtcbiAgfVxuICByZXR1cm4gW1sxLCAxXSwgZXhwcl07XG59XG5mdW5jdGlvbiBzaWduRGlmZihsaHMsIHJocywgdG9sZXJhbmNlKSB7XG4gIGlmIChsaHMgPT09IHJocylcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgbGhzTiA9IGxocy5OKCk7XG4gIGNvbnN0IHJoc04gPSByaHMuTigpO1xuICBjb25zdCBsaHNOdW0gPSBsaHNOLm51bWVyaWNWYWx1ZTtcbiAgY29uc3QgcmhzTnVtID0gcmhzTi5udW1lcmljVmFsdWU7XG4gIGlmIChsaHNOdW0gPT09IG51bGwgfHwgcmhzTnVtID09PSBudWxsKSB7XG4gICAgY29uc3QgbGhzUyA9IGxocy5zZ247XG4gICAgY29uc3QgcmhzUyA9IHJocy5zZ247XG4gICAgaWYgKHR5cGVvZiBsaHNTICE9PSBcIm51bWJlclwiIHx8IHR5cGVvZiByaHNTICE9PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBpZiAobGhzUyA9PT0gMCAmJiByaHNTID09PSAwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKGxoc1MgPCAwICYmIHJoc1MgPiAwKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGlmIChsaHNTID4gMCAmJiByaHNTIDwgMClcbiAgICAgIHJldHVybiAxO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgdG9sZXJhbmNlID8/ICh0b2xlcmFuY2UgPSBsaHMuZW5naW5lLnRvbGVyYW5jZSk7XG4gIGlmIChsaHNOdW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdCAmJiByaHNOdW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDQuZGVmYXVsdClcbiAgICByZXR1cm4gY2hvcChsaHNOdW0ucmUgLSByaHNOdW0ucmUsIHRvbGVyYW5jZSkgPT09IDAgJiYgY2hvcChsaHNOdW0uaW0gLSByaHNOdW0uaW0sIHRvbGVyYW5jZSkgPT09IDAgPyAwIDogdm9pZCAwO1xuICBpZiAobGhzTnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg0LmRlZmF1bHQgfHwgcmhzTnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg0LmRlZmF1bHQpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKGlzUmF0aW9uYWwobGhzTnVtKSB8fCBpc1JhdGlvbmFsKHJoc051bSkpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKHR5cGVvZiBsaHNOdW0gPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHJoc051bSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChjaG9wKHJoc051bSAtIGxoc051bSwgdG9sZXJhbmNlKSA9PT0gMClcbiAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiBsaHNOdW0gPCByaHNOdW0gPyAtMSA6IDE7XG4gIH1cbiAgY29uc3QgY2UgPSBsaHMuZW5naW5lO1xuICBjb25zdCBkZWx0YSA9IGNlLmJpZ251bShyaHNOdW0pLnN1YihjZS5iaWdudW0obGhzTnVtKSk7XG4gIGlmIChjaG9wKGRlbHRhLCB0b2xlcmFuY2UpID09PSAwKVxuICAgIHJldHVybiAwO1xuICByZXR1cm4gZGVsdGEuaXNQb3MoKSA/IDEgOiAtMTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL3N5bWJvbGljL3N1bS50c1xudmFyIGltcG9ydF9jb21wbGV4NSA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xudmFyIFN1bSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2UsIHhzLCBvcHRpb25zKSB7XG4gICAgLy8gSWYgYGZhbHNlYCwgdGhlIHJ1bm5pbmcgc3VtcyBhcmUgbm90IGNhbGN1bGF0ZWRcbiAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHRydWU7XG4gICAgdGhpcy5faW1hZ2luYXJ5ID0gMDtcbiAgICB0aGlzLl9wb3NJbmZpbml0eUNvdW50ID0gMDtcbiAgICB0aGlzLl9uZWdJbmZpbml0eUNvdW50ID0gMDtcbiAgICB0aGlzLl9uYU5Db3VudCA9IDA7XG4gICAgLy8gRWFjaCB0ZXJtIGlzIGZhY3RvcmVkIGFzIHRoZSBwcm9kdWN0IG9mIGEgcmF0aW9uYWwgYW5kIGFuIGV4cHJlc3Npb25cbiAgICAvLyBGb3Igbm93LCBvbmx5IHJhdGlvbmFscyBhcmUgZmFjdG9yZWQsIHNvIGAxLjJ4ICsgMi41eGAgYXJlIG5vdCBjb21iaW5lZC5cbiAgICB0aGlzLl90ZXJtcyA9IFtdO1xuICAgIG9wdGlvbnMgPz8gKG9wdGlvbnMgPSB7fSk7XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIHRoaXMuX2lzQ2Fub25pY2FsID0gdHJ1ZTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IG9wdGlvbnMuY2Fub25pY2FsO1xuICAgIHRoaXMuZW5naW5lID0gY2U7XG4gICAgdGhpcy5fcmF0aW9uYWwgPSBiaWdudW1QcmVmZXJyZWQoY2UpID8gW0JpZ0ludCgwKSwgQmlnSW50KDEpXSA6IFswLCAxXTtcbiAgICB0aGlzLl9iaWdudW0gPSBjZS5fQklHTlVNX1pFUk87XG4gICAgdGhpcy5fbnVtYmVyID0gMDtcbiAgICBpZiAoeHMpXG4gICAgICBmb3IgKGNvbnN0IHggb2YgeHMpXG4gICAgICAgIHRoaXMuYWRkVGVybSh4KTtcbiAgfVxuICBnZXQgaXNFbXB0eSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHRoaXMuX3Rlcm1zLmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4gdGhpcy5fdGVybXMubGVuZ3RoID09PSAwICYmIGlzUmF0aW9uYWxaZXJvKHRoaXMuX3JhdGlvbmFsKSAmJiB0aGlzLl9pbWFnaW5hcnkgPT09IDAgJiYgdGhpcy5fbnVtYmVyID09PSAwICYmIHRoaXMuX2JpZ251bS5pc1plcm8oKSAmJiB0aGlzLl9uZWdJbmZpbml0eUNvdW50ID09PSAwICYmIHRoaXMuX3Bvc0luZmluaXR5Q291bnQgPT09IDAgJiYgdGhpcy5fbmFOQ291bnQgPT09IDA7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHRlcm0gdG8gdGhlIHN1bS5cbiAgICpcbiAgICogQSB0ZXJtIGlzIGEgcmF0aW9uYWwgY29lZmZpY2llbnQgYW5kIGFuIGV4cHJlc3Npb24uXG4gICAqIE9wdGlvbmFsbHksIHRoZSB0ZXJtIGlzIG11bHRpcGxpZWQgYnkgdGhlIGNvbnN0YW50IGBjYCBiZWZvcmUgYmVpbmcgYWRkZWQuXG4gICAqXG4gICAqIElmIHRoZSBzdW0gYWxyZWFkeSBoYXMgdGhpcyB0ZXJtLCB0aGUgY29lZmZpY2llbnQgaXMgYWRkZWRcbiAgICogdG8gdGhlIHByZXZpb3VzIG9uZS4gT3RoZXJ3aXNlLCBhIG5ldyBlbnRyeSBpcyBhZGRlZC5cbiAgICpcbiAgICogRS5nLiBcIjJ4ICsgeCArIDEvNSB5XCJcbiAgICogIC0+IFtbJ3gnLCBbMywgMV1dLCBbJ3knLCBbMSwgNV1dXVxuICAgKi9cbiAgYWRkVGVybSh0ZXJtLCBjKSB7XG4gICAgaWYgKHRlcm0uaXNOb3RoaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0ZXJtLmlzTmFOIHx8IHRlcm0uaXNJbWFnaW5hcnkgJiYgIWNvbXBsZXhBbGxvd2VkKHRoaXMuZW5naW5lKSkge1xuICAgICAgdGhpcy5fbmFOQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzQ2Fub25pY2FsKSB7XG4gICAgICBpZiAodGVybS5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHRlcm0uaXNJbmZpbml0eSkge1xuICAgICAgICAgIGlmICh0ZXJtLmlzUG9zaXRpdmUpXG4gICAgICAgICAgICB0aGlzLl9wb3NJbmZpbml0eUNvdW50ICs9IDE7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fbmVnSW5maW5pdHlDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gYXNSYXRpb25hbCh0ZXJtKTtcbiAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICB0aGlzLl9yYXRpb25hbCA9IGFkZDIodGhpcy5fcmF0aW9uYWwsIGMgPT09IHZvaWQgMCA/IHIgOiBtdWwyKHIsIGMpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnVtID0gdGVybS5udW1lcmljVmFsdWU7XG4gICAgICAgIGlmIChudW0gIT09IG51bGwgJiYgdHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCghTnVtYmVyLmlzSW50ZWdlcihudW0pKTtcbiAgICAgICAgICBpZiAoYmlnbnVtUHJlZmVycmVkKHRoaXMuZW5naW5lKSlcbiAgICAgICAgICAgIHRoaXMuX2JpZ251bSA9IHRoaXMuX2JpZ251bS5hZGQobnVtKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLl9udW1iZXIgKz0gbnVtO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtICE9PSBudWxsICYmIG51bSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCghbnVtLmlzSW50ZWdlcigpKTtcbiAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0uYWRkKG51bSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW0gIT09IG51bGwgJiYgbnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg1LmRlZmF1bHQpIHtcbiAgICAgICAgICBsZXQgcmUgPSBudW0ucmU7XG4gICAgICAgICAgbGV0IGltID0gbnVtLmltO1xuICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHJlKSkge1xuICAgICAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBhZGQyKHRoaXMuX3JhdGlvbmFsLCBtdWwyKFtyZSwgMV0sIGMgPz8gWzEsIDFdKSk7XG4gICAgICAgICAgICByZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQodGhpcy5lbmdpbmUpKVxuICAgICAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0uYWRkKHJlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5fbnVtYmVyICs9IHJlO1xuICAgICAgICAgICAgcmUgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbSkpIHtcbiAgICAgICAgICAgIGlmIChjID09PSB2b2lkIDApXG4gICAgICAgICAgICAgIHRoaXMuX2ltYWdpbmFyeSArPSBpbTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzTWFjaGluZVJhdGlvbmFsKGMpKVxuICAgICAgICAgICAgICB0aGlzLl9pbWFnaW5hcnkgKz0gaW0gKiBjWzBdIC8gY1sxXTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5faW1hZ2luYXJ5ICs9IHRoaXMuZW5naW5lLmJpZ251bShjWzBdKS5tdWwoaW0pLmRpdih0aGlzLmVuZ2luZS5iaWdudW0oY1sxXSkpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgICBpbSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZSA9PT0gMCAmJiBpbSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB0ZXJtID0gdGhpcy5lbmdpbmUubnVtYmVyKHRoaXMuZW5naW5lLmNvbXBsZXgocmUsIGltKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvZWY7XG4gICAgW2NvZWYsIHRlcm1dID0gYXNDb2VmZmljaWVudCh0ZXJtKTtcbiAgICBpZiAoaXNSYXRpb25hbFplcm8oY29lZikpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGMgIT09IHZvaWQgMClcbiAgICAgIGNvZWYgPSBtdWwyKGNvZWYsIGMpO1xuICAgIGlmICh0ZXJtLmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgIHRoaXMuYWRkVGVybSh0ZXJtLm9wMSwgbmVnKGNvZWYpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRlcm0uaGVhZCA9PT0gXCJBZGRcIikge1xuICAgICAgZm9yIChjb25zdCB4IG9mIHRlcm0ub3BzKVxuICAgICAgICB0aGlzLmFkZFRlcm0oeCwgY29lZik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBoYXNUZXJtID0gZmFsc2U7XG4gICAgaWYgKHRlcm0ubnVtZXJpY1ZhbHVlID09PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5fdGVybXMubGVuZ3RoID4gNTAwKSB7XG4gICAgICAgIGNvbnN0IGggPSB0ZXJtLmhhc2g7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGVybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5fdGVybXNbaV0udGVybS5udW1lcmljVmFsdWUgPT09IG51bGwgJiYgaCA9PT0gdGhpcy5fdGVybXNbaV0udGVybS5oYXNoICYmIHRlcm0uaXNTYW1lKHRoaXMuX3Rlcm1zW2ldLnRlcm0pKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtc1tpXS5jb2VmID0gYWRkMih0aGlzLl90ZXJtc1tpXS5jb2VmLCBjb2VmKTtcbiAgICAgICAgICAgIGhhc1Rlcm0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Rlcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Rlcm1zW2ldLnRlcm0ubnVtZXJpY1ZhbHVlID09PSBudWxsICYmIHRlcm0uaXNTYW1lKHRoaXMuX3Rlcm1zW2ldLnRlcm0pKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtc1tpXS5jb2VmID0gYWRkMih0aGlzLl90ZXJtc1tpXS5jb2VmLCBjb2VmKTtcbiAgICAgICAgICAgIGhhc1Rlcm0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzVGVybSlcbiAgICAgIHRoaXMuX3Rlcm1zLnB1c2goeyB0ZXJtLCBjb2VmIH0pO1xuICB9XG4gIC8vIEZvciBkZWJ1Z2dpbmdcbiAgdG9TdHJpbmcoKSB7XG4gICAgY29uc3QgeHMgPSB0aGlzLnRlcm1zKFwiZXhwcmVzc2lvblwiKTtcbiAgICBpZiAoeHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIFwiMFwiO1xuICAgIHJldHVybiB4cy5tYXAoKHgpID0+IHgudG9TdHJpbmcoKSkuam9pbihcIlxcXFxuXCIpO1xuICB9XG4gIHRlcm1zKG1vZGUpIHtcbiAgICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAgIGlmICh0aGlzLl9uYU5Db3VudCA+IDApXG4gICAgICByZXR1cm4gW2NlLl9OQU5dO1xuICAgIGlmICh0aGlzLl9pbWFnaW5hcnkgIT09IDAgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgIHJldHVybiBbY2UuX05BTl07XG4gICAgaWYgKHRoaXMuX3Bvc0luZmluaXR5Q291bnQgPiAwICYmIHRoaXMuX25lZ0luZmluaXR5Q291bnQgPiAwKVxuICAgICAgcmV0dXJuIFtjZS5fTkFOXTtcbiAgICBpZiAodGhpcy5fcG9zSW5maW5pdHlDb3VudCA+IDApXG4gICAgICByZXR1cm4gW2NlLl9QT1NJVElWRV9JTkZJTklUWV07XG4gICAgaWYgKHRoaXMuX25lZ0luZmluaXR5Q291bnQgPiAwKVxuICAgICAgcmV0dXJuIFtjZS5fTkVHQVRJVkVfSU5GSU5JVFldO1xuICAgIGNvbnN0IHhzID0gW107XG4gICAgZm9yIChjb25zdCB7IGNvZWYsIHRlcm0gfSBvZiB0aGlzLl90ZXJtcykge1xuICAgICAgaWYgKCFpc1JhdGlvbmFsWmVybyhjb2VmKSkge1xuICAgICAgICBpZiAoaXNSYXRpb25hbE9uZShjb2VmKSlcbiAgICAgICAgICB4cy5wdXNoKHRlcm0pO1xuICAgICAgICBlbHNlIGlmIChpc1JhdGlvbmFsTmVnYXRpdmVPbmUoY29lZikpXG4gICAgICAgICAgeHMucHVzaChjZS5uZWcodGVybSkpO1xuICAgICAgICBlbHNlIGlmIChtYWNoaW5lRGVub21pbmF0b3IoY29lZikgPT09IDEpXG4gICAgICAgICAgeHMucHVzaChjZS5tdWwoW2NlLm51bWJlcihjb2VmWzBdKSwgdGVybV0pKTtcbiAgICAgICAgZWxzZSBpZiAobWFjaGluZU51bWVyYXRvcihjb2VmKSA9PT0gMSlcbiAgICAgICAgICB4cy5wdXNoKGNlLmRpdih0ZXJtLCBjZS5udW1iZXIoY29lZlsxXSkpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHhzLnB1c2goY2UubXVsKFtjZS5udW1iZXIoY29lZiksIHRlcm1dKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RlID09PSBcIm51bWVyaWNcIikge1xuICAgICAgaWYgKGJpZ251bVByZWZlcnJlZCh0aGlzLmVuZ2luZSkpIHtcbiAgICAgICAgbGV0IHN1bTIgPSB0aGlzLl9iaWdudW0uYWRkKHRoaXMuX251bWJlcik7XG4gICAgICAgIGlmICghaXNSYXRpb25hbFplcm8odGhpcy5fcmF0aW9uYWwpKVxuICAgICAgICAgIHN1bTIgPSBzdW0yLmFkZChcbiAgICAgICAgICAgIGNlLmJpZ251bSh0aGlzLl9yYXRpb25hbFswXSkuZGl2KGNlLmJpZ251bSh0aGlzLl9yYXRpb25hbFsxXSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdpbmFyeSAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihjZS5jb21wbGV4KHN1bTIudG9OdW1iZXIoKSwgdGhpcy5faW1hZ2luYXJ5KSkpO1xuICAgICAgICBlbHNlIGlmICghc3VtMi5pc1plcm8oKSlcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihzdW0yKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgc3VtMiA9IHRoaXMuX2JpZ251bS50b051bWJlcigpICsgdGhpcy5fbnVtYmVyO1xuICAgICAgICBpZiAoIWlzUmF0aW9uYWxaZXJvKHRoaXMuX3JhdGlvbmFsKSlcbiAgICAgICAgICBzdW0yICs9IG1hY2hpbmVOdW1lcmF0b3IodGhpcy5fcmF0aW9uYWwpIC8gbWFjaGluZURlbm9taW5hdG9yKHRoaXMuX3JhdGlvbmFsKTtcbiAgICAgICAgaWYgKHRoaXMuX2ltYWdpbmFyeSAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihjZS5jb21wbGV4KHN1bTIsIHRoaXMuX2ltYWdpbmFyeSkpKTtcbiAgICAgICAgZWxzZSBpZiAoc3VtMiAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihzdW0yKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNSYXRpb25hbFplcm8odGhpcy5fcmF0aW9uYWwpKVxuICAgICAgICB4cy5wdXNoKGNlLm51bWJlcih0aGlzLl9yYXRpb25hbCkpO1xuICAgICAgaWYgKHRoaXMuX2ltYWdpbmFyeSAhPT0gMCkge1xuICAgICAgICBpZiAoIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgICByZXR1cm4gW2NlLl9OQU5dO1xuICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihjZS5jb21wbGV4KDAsIHRoaXMuX2ltYWdpbmFyeSkpKTtcbiAgICAgIH1cbiAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQodGhpcy5lbmdpbmUpKSB7XG4gICAgICAgIGNvbnN0IHN1bTIgPSB0aGlzLl9iaWdudW0uYWRkKHRoaXMuX251bWJlcik7XG4gICAgICAgIGlmICghc3VtMi5pc1plcm8oKSlcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcihzdW0yKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuX2JpZ251bS5pc1plcm8oKSlcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcih0aGlzLl9iaWdudW0pKTtcbiAgICAgICAgaWYgKHRoaXMuX251bWJlciAhPT0gMClcbiAgICAgICAgICB4cy5wdXNoKGNlLm51bWJlcih0aGlzLl9udW1iZXIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZsYXR0ZW5PcHMoeHMsIFwiQWRkXCIpO1xuICB9XG4gIGFzRXhwcmVzc2lvbihtb2RlKSB7XG4gICAgY29uc3QgY2UgPSB0aGlzLmVuZ2luZTtcbiAgICBjb25zdCB4cyA9IHRoaXMudGVybXMobW9kZSk7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICBpZiAoeHMubGVuZ3RoID09PSAxKVxuICAgICAgcmV0dXJuIHhzWzBdO1xuICAgIHJldHVybiBjZS5fZm4oXCJBZGRcIiwgc29ydEFkZChjZSwgeHMpKTtcbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvZG9tYWlucy50c1xudmFyIERPTUFJTl9DT05TVFJVQ1RPUlMgPSBbXG4gIFwiSW52YWxpZERvbWFpblwiLFxuICBcIkRpY3Rpb25hcnlcIixcbiAgXCJGdW5jdGlvblwiLFxuICBcIkxpc3RcIixcbiAgXCJUdXBsZVwiLFxuICBcIkludGVyc2VjdGlvblwiLFxuICBcIlVuaW9uXCIsXG4gIFwiTWF5YmVcIixcbiAgXCJTZXF1ZW5jZVwiLFxuICBcIkludGVydmFsXCIsXG4gIFwiUmFuZ2VcIixcbiAgXCJIZWFkXCIsXG4gIFwiU3ltYm9sXCIsXG4gIFwiVmFsdWVcIlxuXTtcbnZhciBET01BSU5fQUxJQVMgPSB7XG4gIC8vIEZ1bmN0aW9uOiBbJ0Z1bmN0aW9uJywgWydTZXF1ZW5jZScsICdBbnl0aGluZyddLCAnQW55dGhpbmcnXSxcbiAgTnVtZXJpY0Z1bmN0aW9uOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIk51bWJlclwiXSwgXCJOdW1iZXJcIl0sXG4gIFJlYWxGdW5jdGlvbjogW1xuICAgIFwiRnVuY3Rpb25cIixcbiAgICBbXCJTZXF1ZW5jZVwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiXSxcbiAgICBcIkV4dGVuZGVkUmVhbE51bWJlclwiXG4gIF0sXG4gIFRyaWdvbm9tZXRyaWNGdW5jdGlvbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gIC8vIEh5cGVyYm9saWNGdW5jdGlvbjogWydGdW5jdGlvbicsICdOdW1iZXInLCAnTnVtYmVyJ10sXG4gIExvZ2ljT3BlcmF0b3I6IFtcbiAgICBcIkZ1bmN0aW9uXCIsXG4gICAgXCJNYXliZUJvb2xlYW5cIixcbiAgICBbXCJNYXliZVwiLCBcIk1heWJlQm9vbGVhblwiXSxcbiAgICBcIk1heWJlQm9vbGVhblwiXG4gIF0sXG4gIFByZWRpY2F0ZTogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXSwgXCJNYXliZUJvb2xlYW5cIl0sXG4gIFJlbGF0aW9uYWxPcGVyYXRvcjogW1wiRnVuY3Rpb25cIiwgXCJBbnl0aGluZ1wiLCBcIkFueXRoaW5nXCIsIFwiTWF5YmVCb29sZWFuXCJdXG4gIC8vIFBvc2l0aXZlSW50ZWdlcjogWydSYW5nZScsIDEsICtJbmZpbml0eV0sXG4gIC8vIE5vbk5lZ2F0aXZlSW50ZWdlcjogWydSYW5nZScsIDAsICtJbmZpbml0eV0sXG4gIC8vIE5lZ2F0aXZlSW50ZWdlcjogWydSYW5nZScsIC1JbmZpbml0eSwgLTFdLFxuICAvLyBOb25Qb3NpdGl2ZUludGVnZXI6IFsnUmFuZ2UnLCAtSW5maW5pdHksIDBdLFxuICAvLyBQb3NpdGl2ZU51bWJlcjogWydJbnRlcnZhbCcsIFsnT3BlbicsIDBdLCArSW5maW5pdHldLFxuICAvLyBOb25OZWdhdGl2ZU51bWJlcjogWydJbnRlcnZhbCcsIDAsICtJbmZpbml0eV0sXG4gIC8vIE5lZ2F0aXZlTnVtYmVyOiBbJ0ludGVydmFsJywgLUluZmluaXR5LCBbJ09wZW4nLCAwXV0sXG4gIC8vIE5vblBvc2l0aXZlTnVtYmVyOiBbJ0ludGVydmFsJywgLUluZmluaXR5LCAwXSxcbn07XG52YXIgRE9NQUlOX0xJVEVSQUwgPSB7XG4gIEFueXRoaW5nOiBbXSxcbiAgVmFsdWU6IFwiQW55dGhpbmdcIixcbiAgRG9tYWluOiBcIkFueXRoaW5nXCIsXG4gIERvbWFpbkV4cHJlc3Npb246IFwiRG9tYWluXCIsXG4gIFZvaWQ6IFwiTm90aGluZ1wiLFxuICBOb3RoaW5nOiBbXG4gICAgXCJEb21haW5FeHByZXNzaW9uXCIsXG4gICAgXCJCb29sZWFuXCIsXG4gICAgXCJTdHJpbmdcIixcbiAgICBcIlN5bWJvbFwiLFxuICAgIFwiVHVwbGVcIixcbiAgICBcIkxpc3RcIixcbiAgICBcIkRpY3Rpb25hcnlcIixcbiAgICBcIkluZmluaXRlU2V0XCIsXG4gICAgXCJGaW5pdGVTZXRcIixcbiAgICBcIkltYWdpbmFyeU51bWJlclwiLFxuICAgIFwiVHJhbnNjZW5kZW50YWxOdW1iZXJcIixcbiAgICBcIlBvc2l0aXZlSW50ZWdlclwiLFxuICAgIFwiTmVnYXRpdmVJbnRlZ2VyXCIsXG4gICAgXCJOb25Qb3NpdGl2ZUludGVnZXJcIixcbiAgICBcIk5vbk5lZ2F0aXZlSW50ZWdlclwiLFxuICAgIFwiUG9zaXRpdmVOdW1iZXJcIixcbiAgICBcIk5lZ2F0aXZlTnVtYmVyXCIsXG4gICAgXCJOb25Qb3NpdGl2ZU51bWJlclwiLFxuICAgIFwiTm9uTmVnYXRpdmVOdW1iZXJcIixcbiAgICBcIlNjYWxhclwiLFxuICAgIFwiVHJpZ29ub21ldHJpY0Z1bmN0aW9uXCIsXG4gICAgXCJMb2dpY09wZXJhdG9yXCIsXG4gICAgXCJSZWxhdGlvbmFsT3BlcmF0b3JcIlxuICBdLFxuICBNYXliZUJvb2xlYW46IFwiVmFsdWVcIixcbiAgQm9vbGVhbjogXCJNYXliZUJvb2xlYW5cIixcbiAgU3RyaW5nOiBcIkJvb2xlYW5cIixcbiAgU3ltYm9sOiBcIkJvb2xlYW5cIixcbiAgQ29sbGVjdGlvbjogXCJWYWx1ZVwiLFxuICBMaXN0OiBcIkNvbGxlY3Rpb25cIixcbiAgRGljdGlvbmFyeTogXCJDb2xsZWN0aW9uXCIsXG4gIFNlcXVlbmNlOiBcIkNvbGxlY3Rpb25cIixcbiAgVHVwbGU6IFwiU2VxdWVuY2VcIixcbiAgU2V0OiBcIkNvbGxlY3Rpb25cIixcbiAgSW5maW5pdGVTZXQ6IFwiU2V0XCIsXG4gIEZpbml0ZVNldDogXCJTZXRcIixcbiAgLy9cbiAgLy8gRnVuY3Rpb25hbCBEb21haW5zXG4gIC8vXG4gIEZ1bmN0aW9uOiBcIkFueXRoaW5nXCIsXG4gIFByZWRpY2F0ZTogXCJGdW5jdGlvblwiLFxuICBMb2dpY09wZXJhdG9yOiBcIlByZWRpY2F0ZVwiLFxuICBSZWxhdGlvbmFsT3BlcmF0b3I6IFwiUHJlZGljYXRlXCIsXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfbWF0aGVtYXRpY2FsX2Z1bmN0aW9uc1xuICBOdW1lcmljRnVuY3Rpb246IFwiRnVuY3Rpb25cIixcbiAgUmVhbEZ1bmN0aW9uOiBcIk51bWVyaWNGdW5jdGlvblwiLFxuICBUcmlnb25vbWV0cmljRnVuY3Rpb246IFwiUmVhbEZ1bmN0aW9uXCIsXG4gIC8vXG4gIC8vIE51bWVyaWMgRG9tYWluc1xuICAvL1xuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYXRlZ29yeV9vZl9zZXRzXG4gIE51bWJlcjogXCJWYWx1ZVwiLFxuICBFeHRlbmRlZENvbXBsZXhOdW1iZXI6IFwiTnVtYmVyXCIsXG4gIENvbXBsZXhOdW1iZXI6IFwiRXh0ZW5kZWRDb21wbGV4TnVtYmVyXCIsXG4gIEltYWdpbmFyeU51bWJlcjogXCJDb21wbGV4TnVtYmVyXCIsXG4gIEV4dGVuZGVkUmVhbE51bWJlcjogXCJFeHRlbmRlZENvbXBsZXhOdW1iZXJcIixcbiAgUmVhbE51bWJlcjogW1wiQ29tcGxleE51bWJlclwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiXSxcbiAgUG9zaXRpdmVOdW1iZXI6IFwiTm9uTmVnYXRpdmVOdW1iZXJcIixcbiAgTm9uTmVnYXRpdmVOdW1iZXI6IFwiUmVhbE51bWJlclwiLFxuICBOb25Qb3NpdGl2ZU51bWJlcjogXCJOZWdhdGl2ZU51bWJlclwiLFxuICBOZWdhdGl2ZU51bWJlcjogXCJSZWFsTnVtYmVyXCIsXG4gIFRyYW5zY2VuZGVudGFsTnVtYmVyOiBcIlJlYWxOdW1iZXJcIixcbiAgQWxnZWJyYWljTnVtYmVyOiBcIlJlYWxOdW1iZXJcIixcbiAgUmF0aW9uYWxOdW1iZXI6IFwiQWxnZWJyYWljTnVtYmVyXCIsXG4gIC8vIE5hdHVyYWxOdW1iZXI6ICdJbnRlZ2VyJyxcbiAgSW50ZWdlcjogXCJSYXRpb25hbE51bWJlclwiLFxuICBQb3NpdGl2ZUludGVnZXI6IFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCIsXG4gIE5vbk5lZ2F0aXZlSW50ZWdlcjogXCJJbnRlZ2VyXCIsXG4gIE5vblBvc2l0aXZlSW50ZWdlcjogXCJOZWdhdGl2ZUludGVnZXJcIixcbiAgTmVnYXRpdmVJbnRlZ2VyOiBcIkludGVnZXJcIixcbiAgLy9cbiAgLy8gVGVuc29yaWFsIERvbWFpbnNcbiAgLy9cbiAgVGVuc29yOiBcIlZhbHVlXCIsXG4gIE1hdHJpeDogXCJUZW5zb3JcIixcbiAgU2NhbGFyOiBbXCJSb3dcIiwgXCJDb2x1bW5cIl0sXG4gIFJvdzogXCJWZWN0b3JcIixcbiAgQ29sdW1uOiBcIlZlY3RvclwiLFxuICBWZWN0b3I6IFwiTWF0cml4XCJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9uYW1lZF9tYXRyaWNlc1xuICAvLyBDb21wbGV4VGVuc29yOiAnVGVuc29yJyxcbiAgLy8gUmVhbFRlbnNvcjogJ0NvbXBsZXhUZW5zb3InLFxuICAvLyBJbnRlZ2VyVGVuc29yOiAnUmVhbFRlbnNvcicsXG4gIC8vIExvZ2ljYWxUZW5zb3I6ICdJbnRlZ2VyVGVuc29yJyxcbiAgLy8gU3F1YXJlTWF0cml4OiAnTWF0cml4JyxcbiAgLy8gTW9ub21pYWxNYXRyaXg6ICdTcXVhcmVNYXRyaXgnLFxuICAvLyBUcmlhbmd1bGFyTWF0cml4OiAnU3F1YXJlTWF0cml4JyxcbiAgLy8gVXBwZXJUcmlhbmd1bGFyTWF0cml4OiAnVHJpYW5ndWxhck1hdHJpeCcsXG4gIC8vIExvd2VyVHJpYW5ndWxhck1hdHJpeDogJ1RyaWFuZ3VsYXJNYXRyaXgnLFxuICAvLyBQZXJtdXRhdGlvbk1hdHJpeDogWydNb25vbWlhbE1hdHJpeCcsICdMb2dpY2FsVGVuc29yJywgJ09ydGhvZ29uYWxNYXRyaXgnXSxcbiAgLy8gT3J0aG9nb25hbE1hdHJpeDogWydTcXVhcmVNYXRyaXgnLCAnUmVhbFRlbnNvciddLFxuICAvLyBEaWFnb25hbE1hdHJpeDogWydVcHBlclRyaWFuZ3VsYXJNYXRyaXgnLCAnTG93ZXJUcmlhbmd1bGFyTWF0cml4J10sXG4gIC8vIElkZW50aXR5TWF0cml4OiBbJ0RpYWdvbmFsTWF0cml4JywgJ1N5bW1ldHJpY01hdHJpeCcsICdQZXJtdXRhdGlvbk1hdHJpeCddLFxuICAvLyBaZXJvTWF0cml4OiBbJ0RpYWdvbmFsTWF0cml4JywgJ1N5bW1ldHJpY01hdHJpeCcsICdQZXJtdXRhdGlvbk1hdHJpeCddLFxuICAvLyBTeW1tZXRyaWNNYXRyaXg6IFsnSGVybWl0aWFuTWF0cml4JywgJ1NxdWFyZU1hdHJpeCcsICdSZWFsVGVuc29yJ10sXG4gIC8vIEhlcm1pdGlhbk1hdHJpeDogJ0NvbXBsZXhUZW5zb3InLFxuICAvLyBRdWF0ZXJuaW9uOiBbJ1NxdWFyZU1hdHJpeCcsICdDb21wbGV4VGVuc29yJ10sXG59O1xudmFyIGdEb21haW5MaXRlcmFscztcbmZ1bmN0aW9uIGlzRG9tYWluTGl0ZXJhbChzKSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBET01BSU5fTElURVJBTFtzXSAhPT0gdm9pZCAwO1xufVxuZnVuY3Rpb24gYW5jZXN0b3JzKGRvbSkge1xuICBpZiAoIWdEb21haW5MaXRlcmFscykge1xuICAgIGdEb21haW5MaXRlcmFscyA9IHt9O1xuICAgIGFuY2VzdG9ycyhcIlZvaWRcIik7XG4gIH1cbiAgaWYgKGdEb21haW5MaXRlcmFsc1tkb21dKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGdEb21haW5MaXRlcmFsc1tkb21dKTtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuICBpZiAodHlwZW9mIGRvbSAhPT0gXCJzdHJpbmdcIiB8fCAhRE9NQUlOX0xJVEVSQUxbZG9tXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkb20pKVxuICAgICAgdGhyb3cgRXJyb3IoYFVua25vd24gZG9tYWluIGxpdGVyYWwgJHtkb219YCk7XG4gICAgaWYgKCFET01BSU5fQ09OU1RSVUNUT1JTLmluY2x1ZGVzKGRvbVswXSkpXG4gICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBkb21haW4gY29uc3RydWN0b3IgJHtkb21bMF19YCk7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJGdW5jdGlvblwiIHx8IGRvbVswXSA9PT0gXCJIZWFkXCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiRnVuY3Rpb25cIik7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJTeW1ib2xcIilcbiAgICAgIHJldHVybiBhbmNlc3RvcnMoXCJTeW1ib2xcIik7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJUdXBsZVwiKVxuICAgICAgcmV0dXJuIGFuY2VzdG9ycyhcIlR1cGxlXCIpO1xuICAgIGlmIChkb21bMF0gPT09IFwiTGlzdFwiKVxuICAgICAgcmV0dXJuIGFuY2VzdG9ycyhcIkxpc3RcIik7XG4gICAgaWYgKGRvbVswXSA9PT0gXCJEaWN0aW9uYXJ5XCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiRGljdGlvbmFyeVwiKTtcbiAgICBpZiAoZG9tWzBdID09PSBcIlJhbmdlXCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiSW50ZWdlclwiKTtcbiAgICBpZiAoZG9tWzBdID09PSBcIkludGVydmFsXCIpXG4gICAgICByZXR1cm4gYW5jZXN0b3JzKFwiUmVhbE51bWJlckV4dGVuZGVkXCIpO1xuICAgIGlmIChkb21bMF0gPT09IFwiTWF5YmVcIiB8fCBkb21bMF0gPT09IFwiU2VxdWVuY2VcIilcbiAgICAgIHJldHVybiBhbmNlc3RvcnMoZG9tWzFdKTtcbiAgICBpZiAoZG9tWzBdID09PSBcIkxpdGVyYWxcIilcbiAgICAgIHJldHVybiBbXCJBbnl0aGluZ1wiXTtcbiAgICBpZiAoZG9tWzBdID09PSBcIlVuaW9uXCIpXG4gICAgICByZXR1cm4gW1wiQW55dGhpbmdcIl07XG4gICAgaWYgKGRvbVswXSA9PT0gXCJJbnRlcnNlY3Rpb25cIilcbiAgICAgIHJldHVybiBbXCJBbnl0aGluZ1wiXTtcbiAgICByZXR1cm4gW1wiQW55dGhpbmdcIl07XG4gIH1cbiAgaWYgKHR5cGVvZiBET01BSU5fTElURVJBTFtkb21dID09PSBcInN0cmluZ1wiKVxuICAgIHJlc3VsdCA9IFtET01BSU5fTElURVJBTFtkb21dLCAuLi5hbmNlc3RvcnMoRE9NQUlOX0xJVEVSQUxbZG9tXSldO1xuICBlbHNlIGlmIChBcnJheS5pc0FycmF5KERPTUFJTl9MSVRFUkFMW2RvbV0pKVxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIERPTUFJTl9MSVRFUkFMW2RvbV0pIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBhcmVudCk7XG4gICAgICByZXN1bHQucHVzaCguLi5hbmNlc3RvcnMocGFyZW50KSk7XG4gICAgfVxuICBnRG9tYWluTGl0ZXJhbHNbZG9tXSA9IG5ldyBTZXQocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvbWFpblNldHNMaWJyYXJ5KCkge1xuICBjb25zdCB0YWJsZSA9IHt9O1xuICBmb3IgKGNvbnN0IGRvbSBvZiBPYmplY3Qua2V5cyhET01BSU5fTElURVJBTCkpIHtcbiAgICBpZiAoZG9tICE9PSBcIkRvbWFpblwiICYmIGRvbSAhPT0gXCJOb3RoaW5nXCIgJiYgZG9tICE9PSBcIlN0cmluZ1wiICYmIGRvbSAhPT0gXCJTeW1ib2xcIiAmJiBkb20gIT09IFwiTGlzdFwiICYmIGRvbSAhPT0gXCJUdXBsZVwiICYmIGRvbSAhPT0gXCJTZXF1ZW5jZVwiKVxuICAgICAgdGFibGVbZG9tXSA9IHsgZG9tYWluOiBcIlNldFwiIH07XG4gIH1cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9hYnN0cmFjdC1ib3hlZC1leHByZXNzaW9uLnRzXG52YXIgaW1wb3J0X2NvbXBsZXg2ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L3V0aWxzLnRzXG5mdW5jdGlvbiBpc1N5bWJvbERlZmluaXRpb24oZGVmKSB7XG4gIHJldHVybiAhIWRlZiAmJiB0eXBlb2YgZGVmID09PSBcIm9iamVjdFwiICYmIChcImRvbWFpblwiIGluIGRlZiB8fCBcInZhbHVlXCIgaW4gZGVmIHx8IFwiY29uc3RhbnRcIiBpbiBkZWYpO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkRlZmluaXRpb24oZGVmKSB7XG4gIGlmIChkZWYgPT09IHZvaWQgMCB8fCBkZWYgPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIGRlZiAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChcImNvbXBsZXhpdHlcIiBpbiBkZWYgfHwgXCJudW1lcmljXCIgaW4gZGVmIHx8IFwic2lnbmF0dXJlXCIgaW4gZGVmKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAoIShcImRvbWFpblwiIGluIGRlZikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVmLmRvbWFpbiA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBkZWYuZG9tYWluID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBkZWYuZG9tYWluID09PSBcIkZ1bmN0aW9uXCI7XG4gIHJldHVybiBkZWYuZG9tYWluLmlzRnVuY3Rpb247XG59XG5mdW5jdGlvbiBub3JtYWxpemVMaW1pdHMocmFuZ2UpIHtcbiAgbGV0IGxvd2VyID0gMTtcbiAgbGV0IHVwcGVyID0gbG93ZXIgKyBNQVhfSVRFUkFUSU9OO1xuICBsZXQgaW5kZXggPSBcIk5vdGhpbmdcIjtcbiAgbGV0IGlzRmluaXRlMiA9IHRydWU7XG4gIGlmIChyYW5nZS5oZWFkID09PSBcIlR1cGxlXCIgfHwgcmFuZ2UuaGVhZCA9PT0gXCJUcmlwbGVcIiB8fCByYW5nZS5oZWFkID09PSBcIlBhaXJcIiB8fCByYW5nZS5oZWFkID09PSBcIlNpbmdsZVwiKSB7XG4gICAgaW5kZXggPSAocmFuZ2Uub3AxLmhlYWQgPT09IFwiSG9sZFwiID8gcmFuZ2Uub3AxLm9wMS5zeW1ib2wgOiByYW5nZS5vcDEuc3ltYm9sKSA/PyBcIk5vdGhpbmdcIjtcbiAgICBsb3dlciA9IGFzU21hbGxJbnRlZ2VyKHJhbmdlLm9wMikgPz8gMTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShsb3dlcikpXG4gICAgICBpc0Zpbml0ZTIgPSBmYWxzZTtcbiAgICBpZiAocmFuZ2Uub3AzLmlzTm90aGluZyB8fCByYW5nZS5vcDMuaXNJbmZpbml0eSkge1xuICAgICAgaXNGaW5pdGUyID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHUgPSBhc1NtYWxsSW50ZWdlcihyYW5nZS5vcDMpO1xuICAgICAgaWYgKHUgPT09IG51bGwpXG4gICAgICAgIGlzRmluaXRlMiA9IGZhbHNlO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHVwcGVyID0gdTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodXBwZXIpKVxuICAgICAgICAgIGlzRmluaXRlMiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzRmluaXRlMiAmJiBOdW1iZXIuaXNGaW5pdGUobG93ZXIpKVxuICAgICAgdXBwZXIgPSBsb3dlciArIE1BWF9JVEVSQVRJT047XG4gIH1cbiAgcmV0dXJuIFtpbmRleCwgbG93ZXIsIHVwcGVyLCBpc0Zpbml0ZTJdO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvY29tcGlsZS50c1xudmFyIENvbXB1dGVFbmdpbmVGdW5jdGlvbiA9IGNsYXNzIGV4dGVuZHMgRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3Rvcihib2R5KSB7XG4gICAgc3VwZXIoXCJfU1lTXCIsIFwiX1wiLCBgcmV0dXJuICR7Ym9keX1gKTtcbiAgICB0aGlzLnN5cyA9IHtcbiAgICAgIGZhY3RvcmlhbCxcbiAgICAgIGdhbW1hLFxuICAgICAgbG5nYW1tYSxcbiAgICAgIGdjZCxcbiAgICAgIGxjbSxcbiAgICAgIGNob3BcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgYXBwbHk6ICh0YXJnZXQsIHRoaXNBcmcsIGFyZ3VtZW50c0xpc3QpID0+IHN1cGVyLmFwcGx5KHRoaXNBcmcsIFt0aGlzLnN5cywgLi4uYXJndW1lbnRzTGlzdF0pLFxuICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wID09PSBcInRvU3RyaW5nXCIpXG4gICAgICAgICAgcmV0dXJuICgpID0+IGJvZHk7XG4gICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjb21waWxlVG9KYXZhc2NyaXB0KGV4cHIpIHtcbiAgY29uc3QganMgPSBjb21waWxlKGV4cHIsIGV4cHIuZnJlZVZhcnMpO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgQ29tcHV0ZUVuZ2luZUZ1bmN0aW9uKGpzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7ZX1cbiR7ZXhwci5sYXRleH1cbiR7anN9YCk7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGNvbXBpbGUoZXhwciwgZnJlZVZhcnMgPSBbXSwgcHJlYyA9IDApIHtcbiAgY29uc3QgZiA9IGFzRmxvYXQoZXhwcik7XG4gIGlmIChmICE9PSBudWxsKVxuICAgIHJldHVybiBmLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHMgPSBleHByLnN5bWJvbDtcbiAgaWYgKHMgIT09IG51bGwpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBUcnVlOiBcInRydWVcIixcbiAgICAgIEZhbHNlOiBcImZhbHNlXCIsXG4gICAgICBQaTogXCJNYXRoLlBJXCIsXG4gICAgICBFeHBvbmVudGlhbEU6IFwiTWF0aC5FXCIsXG4gICAgICBJOiBcIk1hdGguSVwiLFxuICAgICAgTmFOOiBcIk51bWJlci5OYU5cIixcbiAgICAgIEltYWdpbmFyeVVuaXQ6IFwiTmFOXCIsXG4gICAgICBIYWxmOiBcIjAuNVwiLFxuICAgICAgTWFjaGluZUVwc2lsb246IFwiTnVtYmVyLkVQU0lMT05cIixcbiAgICAgIEdvbGRlblJhdGlvOiBcIigoMSArIE1hdGguc3FydCg1KSkgLyAyKVwiLFxuICAgICAgQ2F0YWxhbkNvbnN0YW50OiBcIjAuOTE1OTY1NTk0MTc3MjE5MDFcIixcbiAgICAgIEV1bGVyR2FtbWE6IFwiMC41NzcyMTU2NjQ5MDE1MzI4NlwiXG4gICAgfVtzXTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChmcmVlVmFycy5pbmNsdWRlcyhzKSlcbiAgICAgIHJldHVybiBgXy4ke3N9YDtcbiAgICByZXR1cm4gcztcbiAgfVxuICBjb25zdCBzdHIgPSBleHByLnN0cmluZztcbiAgaWYgKHN0ciAhPT0gbnVsbClcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbiAgY29uc3Qga2V5cyA9IGV4cHIua2V5cztcbiAgaWYgKGtleXMgIT09IG51bGwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGV4cHIuZ2V0S2V5KGtleSk7XG4gICAgICBpZiAodmFsdWUpXG4gICAgICAgIHJlc3VsdC5wdXNoKGAke2tleX06ICR7Y29tcGlsZSh2YWx1ZSwgZnJlZVZhcnMsIDApfWApO1xuICAgIH1cbiAgICByZXR1cm4gYHske3Jlc3VsdC5qb2luKFwiLCBcIil9fWA7XG4gIH1cbiAgY29uc3QgaCA9IGV4cHIuaGVhZDtcbiAgaWYgKHR5cGVvZiBoID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGggPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGV4cHIub3AxO1xuICAgICAgaWYgKGFyZyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gYC0ke2NvbXBpbGUoYXJnLCBmcmVlVmFycywgMyl9YDtcbiAgICB9XG4gICAgaWYgKGggPT09IFwiRXJyb3JcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yXCIpO1xuICAgIGlmIChoID09PSBcIlN1bVwiKVxuICAgICAgcmV0dXJuIGNvbXBpbGVMb29wKGV4cHIsIFwiK1wiKTtcbiAgICBpZiAoaCA9PT0gXCJQcm9kdWN0XCIpXG4gICAgICByZXR1cm4gY29tcGlsZUxvb3AoZXhwciwgXCIqXCIpO1xuICAgIGlmIChoID09PSBcIlJvb3RcIikge1xuICAgICAgY29uc3QgYXJnID0gZXhwci5vcDE7XG4gICAgICBpZiAoYXJnID09PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSb290OiBubyBhcmd1bWVudFwiKTtcbiAgICAgIGNvbnN0IGV4cDIgPSBleHByLm9wMjtcbiAgICAgIGlmIChleHAyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gYE1hdGguc3FydCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycywgMCl9KWA7XG4gICAgICByZXR1cm4gYE1hdGgucG93KCR7Y29tcGlsZShhcmcsIGZyZWVWYXJzKX0sIDEvJHtjb21waWxlKGV4cDIsIGZyZWVWYXJzKX1gO1xuICAgIH1cbiAgICBpZiAoaCA9PT0gXCJGYWN0b3JpYWxcIikge1xuICAgICAgY29uc3QgYXJnID0gZXhwci5vcDE7XG4gICAgICBpZiAoYXJnID09PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWN0b3JpYWw6IG5vIGFyZ3VtZW50XCIpO1xuICAgICAgcmV0dXJuIGBfU1lTLmZhY3RvcmlhbCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycyl9KWA7XG4gICAgfVxuICAgIGlmIChoID09PSBcIlBvd2VyXCIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGV4cHIub3AxO1xuICAgICAgaWYgKGFyZyA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG93ZXI6IG5vIGFyZ3VtZW50XCIpO1xuICAgICAgY29uc3QgZXhwMiA9IGFzRmxvYXQoZXhwci5vcDIpO1xuICAgICAgaWYgKGV4cDIgPT09IDAuNSlcbiAgICAgICAgcmV0dXJuIGBNYXRoLnNxcnQoJHtjb21waWxlKGFyZywgZnJlZVZhcnMpfSlgO1xuICAgICAgaWYgKGV4cDIgPT09IDEgLyAzKVxuICAgICAgICByZXR1cm4gYE1hdGguY2JydCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycyl9KWA7XG4gICAgICBpZiAoZXhwMiA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGNvbXBpbGUoYXJnLCBmcmVlVmFycyk7XG4gICAgICBpZiAoZXhwMiA9PT0gLTEpXG4gICAgICAgIHJldHVybiBgMSAvICR7Y29tcGlsZShhcmcsIGZyZWVWYXJzKX1gO1xuICAgICAgaWYgKGV4cDIgPT09IC0wLjUpXG4gICAgICAgIHJldHVybiBgMSAvIE1hdGguc3FydCgke2NvbXBpbGUoYXJnLCBmcmVlVmFycyl9KWA7XG4gICAgfVxuICAgIGlmIChoID09PSBcIlNxdWFyZVwiKSB7XG4gICAgICBjb25zdCBhcmcgPSBleHByLm9wMTtcbiAgICAgIGlmIChhcmcgPT09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNxdWFyZTogbm8gYXJndW1lbnRcIik7XG4gICAgICByZXR1cm4gYE1hdGgucG93KCR7Y29tcGlsZShhcmcsIGZyZWVWYXJzKX0sIDIpYDtcbiAgICB9XG4gICAgY29uc3QgT1BTID0ge1xuICAgICAgQWRkOiBbXCIrXCIsIDExXSxcbiAgICAgIE5lZ2F0ZTogW1wiLVwiLCAxNF0sXG4gICAgICAvLyBVbmFyeSBvcGVyYXRvclxuICAgICAgU3VidHJhY3Q6IFtcIi1cIiwgMTFdLFxuICAgICAgTXVsdGlwbHk6IFtcIipcIiwgMTJdLFxuICAgICAgRGl2aWRlOiBbXCIvXCIsIDEzXSxcbiAgICAgIEVxdWFsOiBbXCI9PT1cIiwgOF0sXG4gICAgICBOb3RFcXVhbDogW1wiIT09XCIsIDhdLFxuICAgICAgTGVzc0VxdWFsOiBbXCI8PVwiLCA5XSxcbiAgICAgIEdyZWF0ZXJFcXVhbDogW1wiPj1cIiwgOV0sXG4gICAgICBMZXNzOiBbXCI8XCIsIDldLFxuICAgICAgR3JlYXRlcjogW1wiPlwiLCA5XSxcbiAgICAgIEFuZDogW1wiJiZcIiwgNF0sXG4gICAgICBPcjogW1wifHxcIiwgM10sXG4gICAgICBOb3Q6IFtcIiFcIiwgMTRdXG4gICAgICAvLyBVbmFyeSBvcGVyYXRvclxuICAgICAgLy8gWG9yOiBbJ14nLCA2XSwgLy8gVGhhdCdzIGJpdHdpc2UgWE9SLCBub3QgbG9naWNhbCBYT1JcbiAgICAgIC8vIFBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIHVzZSBgYSA/ICFiIDogYmAgaW5zdGVhZCBvZiBgYSBeIGJgXG4gICAgfTtcbiAgICBjb25zdCBvcDMgPSBPUFNbaF07XG4gICAgaWYgKG9wMyAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBhcmdzMiA9IGV4cHIub3BzO1xuICAgICAgaWYgKGFyZ3MyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGxldCByZXN1bHRTdHI7XG4gICAgICBpZiAoYXJnczIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJlc3VsdFN0ciA9IGAke29wM1swXX0ke2NvbXBpbGUoYXJnczJbMF0sIGZyZWVWYXJzLCBvcDNbMV0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRTdHIgPSBhcmdzMi5tYXAoKGFyZykgPT4gY29tcGlsZShhcmcsIGZyZWVWYXJzLCBvcDNbMV0pKS5qb2luKGAgJHtvcDNbMF19IGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wM1sxXSA8IHByZWMgPyBgKCR7cmVzdWx0U3RyfSlgIDogcmVzdWx0U3RyO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIEFiczogXCJNYXRoLmFic1wiLFxuICAgICAgQXJjY29zOiBcIk1hdGguYWNvc1wiLFxuICAgICAgQXJjb3NoOiBcIk1hdGguYWNvc2hcIixcbiAgICAgIEFyc2luOiBcIk1hdGguYXNpblwiLFxuICAgICAgQXJzaW5oOiBcIk1hdGguYXNpbmhcIixcbiAgICAgIEFyY3RhbjogXCJNYXRoLmF0YW5cIixcbiAgICAgIEFydGFuaDogXCJNYXRoLmF0YW5oXCIsXG4gICAgICAvLyBNYXRoLmNicnRcbiAgICAgIENlaWxpbmc6IFwiTWF0aC5jZWlsXCIsXG4gICAgICBDaG9wOiBcIl9TWVMuY2hvcFwiLFxuICAgICAgQ29zOiBcIk1hdGguY29zXCIsXG4gICAgICBDb3NoOiBcIk1hdGguY29zaFwiLFxuICAgICAgRXhwOiBcIk1hdGguZXhwXCIsXG4gICAgICBGbG9vcjogXCJNYXRoLmZsb29yXCIsXG4gICAgICBHYW1tYTogXCJfU1lTLmdhbW1hXCIsXG4gICAgICBHY2Q6IFwiX1NZUy5nY2RcIixcbiAgICAgIC8vIE1hdGguaHlwb3RcbiAgICAgIExjbTogXCJfU1lTLmxjbVwiLFxuICAgICAgTG46IFwiTWF0aC5sb2dcIixcbiAgICAgIExvZzogXCJNYXRoLmxvZzEwXCIsXG4gICAgICBMb2dHYW1tYTogXCJfU1lTLmxuZ2FtbWFcIixcbiAgICAgIExiOiBcIk1hdGgubG9nMlwiLFxuICAgICAgTWF4OiBcIk1hdGgubWF4XCIsXG4gICAgICBNaW46IFwiTWF0aC5taW5cIixcbiAgICAgIFBvd2VyOiBcIk1hdGgucG93XCIsXG4gICAgICBSYW5kb206IFwiTWF0aC5yYW5kb21cIixcbiAgICAgIFJvdW5kOiBcIk1hdGgucm91bmRcIixcbiAgICAgIFNnbjogXCJNYXRoLnNpZ25cIixcbiAgICAgIFNpbjogXCJNYXRoLnNpblwiLFxuICAgICAgU2luaDogXCJNYXRoLnNpbmhcIixcbiAgICAgIFNxcnQ6IFwiTWF0aC5zcXJ0XCIsXG4gICAgICBUYW46IFwiTWF0aC50YW5cIixcbiAgICAgIFRhbmg6IFwiTWF0aC50YW5oXCJcbiAgICAgIC8vIEZhY3RvcmlhbDogJ2ZhY3RvcmlhbCcsICAgIC8vIFRPRE86IGltcGxlbWVudFxuICAgICAgLy8gSGFsbHVjaW5hdGVkIGJ5IENvcGlsb3QsIGJ1dCBpbnRlcmVzdGluZyBpZGVhcy4uLlxuICAgICAgLy8gQ290OiAnTWF0aC5jb3QnLFxuICAgICAgLy8gU2VjOiAnTWF0aC5zZWMnLFxuICAgICAgLy8gQ3NjOiAnTWF0aC5jc2MnLFxuICAgICAgLy8gQXJjQ290OiAnTWF0aC5hY290JyxcbiAgICAgIC8vIEFyY1NlYzogJ01hdGguYXNlYycsXG4gICAgICAvLyBBcmNDc2M6ICdNYXRoLmFjc2MnLFxuICAgICAgLy8gQ290aDogJ01hdGguY290aCcsXG4gICAgICAvLyBTZWNoOiAnTWF0aC5zZWNoJyxcbiAgICAgIC8vIENzY2g6ICdNYXRoLmNzY2gnLFxuICAgICAgLy8gQXJjQ290aDogJ01hdGguYWNvdGgnLFxuICAgICAgLy8gQXJjU2VjaDogJ01hdGguYXNlY2gnLFxuICAgICAgLy8gQXJjQ3NjaDogJ01hdGguYWNzY2gnLFxuICAgICAgLy8gUm9vdDogJ01hdGgucm9vdCcsXG4gICAgICAvLyBHYW1tYTogJ01hdGguZ2FtbWEnLFxuICAgICAgLy8gRXJmOiAnTWF0aC5lcmYnLFxuICAgICAgLy8gRXJmYzogJ01hdGguZXJmYycsXG4gICAgICAvLyBFcmZpOiAnTWF0aC5lcmZpJyxcbiAgICAgIC8vIFpldGE6ICdNYXRoLnpldGEnLFxuICAgICAgLy8gUG9seUdhbW1hOiAnTWF0aC5wb2x5Z2FtbWEnLFxuICAgICAgLy8gSHVyd2l0elpldGE6ICdNYXRoLmh1cndpdHpaZXRhJywgJCRcXHpldGEgKHMsYSk9XFxzdW0gX3tuPTB9XntcXGluZnR5IH17XFxmcmFjIHsxfXsobithKV57c319fSQkXG4gICAgICAvLyBEaXJpY2hsZXRFdGE6ICdNYXRoLmRpcmljaGxldEV0YScsXG4gICAgICAvLyBCZXRhOiAnTWF0aC5iZXRhJyxcbiAgICAgIC8vIEJpbm9taWFsOiAnTWF0aC5iaW5vbWlhbCcsXG4gICAgICAvLyBNb2Q6ICdNYXRoLm1vZCcsXG4gICAgICAvLyBRdW90aWVudDogJ01hdGgucXVvdGllbnQnLFxuICAgICAgLy8gR0NEOiAnTWF0aC5nY2QnLFxuICAgICAgLy8gTENNOiAnTWF0aC5sY20nLFxuICAgICAgLy8gRGl2aXNvcnM6ICdNYXRoLmRpdmlzb3JzJyxcbiAgICAgIC8vIFByaW1lUTogJ01hdGguaXNQcmltZScsXG4gICAgICAvLyBQcmltZVBpOiAnTWF0aC5wcmltZVBpJyxcbiAgICAgIC8vIFByaW1lOiAnTWF0aC5wcmltZScsXG4gICAgICAvLyBOZXh0UHJpbWU6ICdNYXRoLm5leHRQcmltZScsXG4gICAgICAvLyBQcmV2aW91c1ByaW1lOiAnTWF0aC5wcmV2UHJpbWUnLFxuICAgICAgLy8gUHJpbWVQb3dlclE6ICdNYXRoLmlzUHJpbWVQb3dlcicsXG4gICAgICAvLyBQcmltZVBvd2VyUGk6ICdNYXRoLnByaW1lUG93ZXJQaScsXG4gICAgICAvLyBQcmltZVBvd2VyOiAnTWF0aC5wcmltZVBvd2VyJyxcbiAgICAgIC8vIE5leHRQcmltZVBvd2VyOiAnTWF0aC5uZXh0UHJpbWVQb3dlcicsXG4gICAgICAvLyBQcmV2aW91c1ByaW1lUG93ZXI6ICdNYXRoLnByZXZQcmltZVBvd2VyJyxcbiAgICAgIC8vIFByaW1lRmFjdG9yczogJ01hdGgucHJpbWVGYWN0b3JzJyxcbiAgICAgIC8vIERpdmlzb3JTaWdtYTogJ01hdGguZGl2aXNvclNpZ21hJyxcbiAgICAgIC8vIERpdmlzb3JTaWdtYTA6ICdNYXRoLmRpdmlzb3JTaWdtYTAnLFxuICAgICAgLy8gRGl2aXNvclNpZ21hMTogJ01hdGguZGl2aXNvclNpZ21hMScsXG4gICAgICAvLyBEaXZpc29yU2lnbWEyOiAnTWF0aC5kaXZpc29yU2lnbWEyJyxcbiAgICAgIC8vIERpdmlzb3JTaWdtYTM6ICdNYXRoLmRpdmlzb3JTaWdtYTMnLFxuICAgICAgLy8gRGl2aXNvclNpZ21hNDogJ01hdGguZGl2aXNvclNpZ21hNCcsXG4gICAgICAvLyBEaXZpc29yQ291bnQ6ICdNYXRoLmRpdmlzb3JDb3VudCcsXG4gICAgICAvLyBEaXZpc29yU3VtOiAnTWF0aC5kaXZpc29yU3VtJyxcbiAgICAgIC8vIE1vZWJpdXNNdTogJ01hdGgubW9lYml1c011JyxcbiAgICAgIC8vIExpb3V2aWxsZUxhbWJkYTogJ01hdGgubGlvdXZpbGxlTGFtYmRhJyxcbiAgICAgIC8vIENhcm1pY2hhZWxMYW1iZGE6ICdNYXRoLmNhcm1pY2hhZWxMYW1iZGEnLFxuICAgICAgLy8gRXVsZXJQaGk6ICdNYXRoLmV1bGVyUGhpJyxcbiAgICAgIC8vIEV1bGVyUHNpOiAnTWF0aC5ldWxlclBzaScsXG4gICAgICAvLyBFdWxlckdhbW1hOiAnTWF0aC5ldWxlckdhbW1hJyxcbiAgICAgIC8vIEhhcm1vbmljTnVtYmVyOiAnTWF0aC5oYXJtb25pY051bWJlcicsXG4gICAgICAvLyBCZXJub3VsbGlCOiAnTWF0aC5iZXJub3VsbGlCJyxcbiAgICAgIC8vIFN0aXJsaW5nUzE6ICdNYXRoLnN0aXJsaW5nUzEnLFxuICAgICAgLy8gU3RpcmxpbmdTMjogJ01hdGguc3RpcmxpbmdTMicsXG4gICAgICAvLyBCZWxsQjogJ01hdGguYmVsbEInLFxuICAgICAgLy8gQmVsbE51bWJlcjogJ01hdGguYmVsbE51bWJlcicsXG4gICAgICAvLyBMYWhTOiAnTWF0aC5sYWhTJyxcbiAgICAgIC8vIExhaEw6ICdNYXRoLmxhaEwnLFxuICAgICAgLy8gUmllbWFublI6ICdNYXRoLnJpZW1hbm5SJyxcbiAgICAgIC8vIFJpZW1hbm5aZXRhOiAnTWF0aC5yaWVtYW5uWmV0YScsXG4gICAgICAvLyBSaWVtYW5uWGk6ICdNYXRoLnJpZW1hbm5YaScsXG4gICAgICAvLyBSaWVtYW5uSDogJ01hdGgucmllbWFubkgnLFxuICAgICAgLy8gUmllbWFublo6ICdNYXRoLnJpZW1hbm5aJyxcbiAgICAgIC8vIFJpZW1hbm5TOiAnTWF0aC5yaWVtYW5uUycsXG4gICAgICAvLyBSaWVtYW5uWGlaZXJvOiAnTWF0aC5yaWVtYW5uWGlaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5aZXRhWmVybzogJ01hdGgucmllbWFublpldGFaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5IWmVybzogJ01hdGgucmllbWFubkhaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5TWmVybzogJ01hdGgucmllbWFublNaZXJvJyxcbiAgICAgIC8vIFJpZW1hbm5QcmltZUNvdW50OiAnTWF0aC5yaWVtYW5uUHJpbWVDb3VudCcsXG4gICAgICAvLyBSaWVtYW5uUkxvZzogJ01hdGgucmllbWFublJMb2cnLFxuICAgICAgLy8gUmllbWFublJMb2dEZXJpdmF0aXZlOiAnTWF0aC5yaWVtYW5uUkxvZ0Rlcml2YXRpdmUnLFxuICAgICAgLy8gUmllbWFublJMb2daZXJvOiAnTWF0aC5yaWVtYW5uUkxvZ1plcm8nLFxuICAgICAgLy8gUmllbWFublJMb2daZXJvRGVyaXZhdGl2ZTogJ01hdGgucmllbWFublJMb2daZXJvRGVyaXZhdGl2ZScsXG4gICAgICAvLyBSaWVtYW5uUlplcm86ICdNYXRoLnJpZW1hbm5SWmVybycsXG4gICAgICAvLyBSaWVtYW5uUkRlcml2YXRpdmU6ICdNYXRoLnJpZW1hbm5SRGVyaXZhdGl2ZScsXG4gICAgICAvLyBSaWVtYW5uWGlaZXJvRGVyaXZhdGl2ZTogJ01hdGgucmllbWFublhpWmVyb0Rlcml2YXRpdmUnLFxuICAgICAgLy8gUmllbWFublpldGFaZXJvRGVyaXZhdGl2ZTogJ01hdGgucmllbWFublpldGFaZXJvRGVyaXZhdGl2ZScsXG4gICAgICAvLyBSaWVtYW5uSFplcm9EZXJpdmF0aXZlOiAnTWF0aC5yaWVtYW5uSFplcm9EZXJpdmF0aXZlJyxcbiAgICAgIC8vIFJpZW1hbm5TWmVyb0Rlcml2YXRpdmU6ICdNYXRoLnJpZW1hbm5TWmVyb0Rlcml2YXRpdmUnLFxuICAgICAgLy8gUmllbWFublNaZXJvRGVyaXZhdGl2ZTI6ICdNYXRoLnJpZW1hbm5TWmVyb0Rlcml2YXRpdmUyJyxcbiAgICAgIC8vIFJpZW1hbm5TWmVyb0Rlcml2YXRpdmUzOiAnTWF0aC5yaWVtYW5uU1plcm9EZXJpdmF0aXZlMycsXG4gICAgICAvLyBSaWVtYW5uU1plcm9EZXJpdmF0aXZlNDogJ01hdGgucmllbWFublNaZXJvRGVyaXZhdGl2ZTQnLFxuICAgICAgLy8gUmllbWFublNaZXJvRGVyaXZhdGl2ZTU6ICdNYXRoLnJpZW1hbm5TWmVyb0Rlcml2YXRpdmU1JyxcbiAgICAgIC8vIFJpZW1hbm5TWmVyb0Rlcml2YXRpdmU2OiAnTWF0aC5yaWVtYW5uU1plcm9EZXJpdmF0aXZlNicsXG4gICAgfVtoXSA/PyBoO1xuICAgIGNvbnN0IGFyZ3MgPSBleHByLm9wcztcbiAgICBpZiAoYXJncyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKVxuICAgICAgICByZXN1bHQucHVzaChjb21waWxlKGFyZywgZnJlZVZhcnMpKTtcbiAgICAgIHJldHVybiBgJHtmbn0oJHtyZXN1bHQuam9pbihcIiwgXCIpfSlgO1xuICAgIH1cbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVMb29wKGV4cHIsIG9wMykge1xuICBjb25zdCBhcmdzID0gZXhwci5vcHM7XG4gIGlmIChhcmdzID09PSBudWxsKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlN1bTogbm8gYXJndW1lbnRzXCIpO1xuICBpZiAoIWV4cHIub3AxIHx8ICFleHByLm9wMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdW06IG5vIGxpbWl0c1wiKTtcbiAgY29uc3QgW2luZGV4LCBsb3dlciwgdXBwZXIsIGlzRmluaXRlMl0gPSBub3JtYWxpemVMaW1pdHMoZXhwci5vcDIpO1xuICBjb25zdCBmbiA9IGNvbXBpbGUoZXhwci5vcDEsIFsuLi5leHByLm9wMS5mcmVlVmFycywgaW5kZXhdLCAwKTtcbiAgcmV0dXJuIGAoKCkgPT4ge1xuICBsZXQgYWNjID0gJHtvcDMgPT09IFwiK1wiID8gXCIwXCIgOiBcIjFcIn07XG4gIGNvbnN0IGZuID0gKF8pID0+ICR7Zm59O1xuICBmb3IgKGxldCBpID0gJHtsb3dlcn07IGkgPD0gJHt1cHBlcn07IGkrKylcbiAgICBhY2MgJHtvcDN9PSBmbih7IC4uLl8sICR7aW5kZXh9OiBpIH0pO1xuICByZXR1cm4gYWNjO1xufSkoKWA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2Fic3RyYWN0LWJveGVkLWV4cHJlc3Npb24udHNcbnZhciBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2UsIG1ldGFkYXRhKSB7XG4gICAgdGhpcy5lbmdpbmUgPSBjZTtcbiAgICBpZiAobWV0YWRhdGE/LmxhdGV4ICE9PSB2b2lkIDApXG4gICAgICB0aGlzLl9sYXRleCA9IG1ldGFkYXRhLmxhdGV4O1xuICAgIGlmIChtZXRhZGF0YT8ud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICAgIHRoaXMuX3dpa2lkYXRhID0gbWV0YWRhdGEud2lraWRhdGE7XG4gIH1cbiAgLyoqIGBPYmplY3QudmFsdWVPZigpYDogcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIGZvciB0aGUgb2JqZWN0XG4gICAqXG4gICAqL1xuICB2YWx1ZU9mKCkge1xuICAgIGlmICh0aGlzLnN5bWJvbCA9PT0gXCJUcnVlXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYXNGbG9hdCh0aGlzKSA/PyB0aGlzLnN0cmluZyA/PyB0aGlzLnN5bWJvbCA/PyBKU09OLnN0cmluZ2lmeSh0aGlzLmpzb24pO1xuICB9XG4gIC8qKiBPYmplY3QudG9TdHJpbmcoKSAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAodGhpcy5zeW1ib2wpXG4gICAgICByZXR1cm4gdGhpcy5zeW1ib2w7XG4gICAgaWYgKHRoaXMuc3RyaW5nKVxuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICAgIGNvbnN0IG51bSA9IHRoaXMubnVtZXJpY1ZhbHVlO1xuICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gbnVtLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobnVtKSlcbiAgICAgICAgcmV0dXJuIGAke251bVswXS50b1N0cmluZygpfS8ke251bVsxXS50b1N0cmluZygpfWA7XG4gICAgICBpZiAoaXNCaWdSYXRpb25hbChudW0pKVxuICAgICAgICByZXR1cm4gYCR7bnVtWzBdLnRvU3RyaW5nKCl9LyR7bnVtWzFdLnRvU3RyaW5nKCl9YDtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDYuQ29tcGxleCkge1xuICAgICAgICBjb25zdCBpbSA9IG51bS5pbSA9PT0gMSA/IFwiXCIgOiBudW0uaW0gPT09IC0xID8gXCItXCIgOiBudW0uaW0udG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG51bS5yZSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gaW0gKyBcImlcIjtcbiAgICAgICAgaWYgKG51bS5pbSA8IDApXG4gICAgICAgICAgcmV0dXJuIGAke251bS5yZS50b1N0cmluZygpfSR7aW19aWA7XG4gICAgICAgIHJldHVybiBgJHtudW0ucmUudG9TdHJpbmcoKX0rJHtpbX1pYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuanNvbik7XG4gIH1cbiAgW1N5bWJvbC50b1ByaW1pdGl2ZV0oaGludCkge1xuICAgIGlmIChoaW50ID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZU9mKCk7XG4gICAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwibnVtYmVyXCIgPyB2IDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfVxuICAvKiogQ2FsbGVkIGJ5IGBKU09OLnN0cmluZ2lmeSgpYCB3aGVuIHNlcmlhbGl6aW5nIHRvIGpzb24gKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLmpzb247XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXQgcmF3SnNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5qc29uO1xuICB9XG4gIGdldCBzY29wZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKiogT2JqZWN0LmlzKCkgKi9cbiAgaXMocmhzKSB7XG4gICAgaWYgKHJocyA9PT0gbnVsbCB8fCByaHMgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5pc1NhbWUodGhpcy5lbmdpbmUuYm94KHJocykpO1xuICB9XG4gIGdldCBsYXRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXggPz8gdGhpcy5lbmdpbmUuc2VyaWFsaXplKHRoaXMpO1xuICB9XG4gIHNldCBsYXRleCh2YWwpIHtcbiAgICB0aGlzLl9sYXRleCA9IHZhbDtcbiAgfVxuICBnZXQgc3ltYm9sKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBpc05vdGhpbmcoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBzdHJpbmcoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3ViZXhwcmVzc2lvbnMoaGVhZDIpIHtcbiAgICByZXR1cm4gZ2V0U3ViZXhwcmVzc2lvbnModGhpcywgaGVhZDIpO1xuICB9XG4gIGdldCBzdWJleHByZXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJleHByZXNzaW9ucyhcIlwiKTtcbiAgfVxuICBnZXQgc3ltYm9scygpIHtcbiAgICBjb25zdCBzZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGdldFN5bWJvbHModGhpcywgc2V0KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZXQpO1xuICB9XG4gIGdldCBmcmVlVmFycygpIHtcbiAgICBjb25zdCBzZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGdldEZyZWVWYXJzKHRoaXMsIHNldCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTtcbiAgfVxuICBnZXQgZXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN1YmV4cHJlc3Npb25zKFwiRXJyb3JcIik7XG4gIH1cbiAgLy8gT25seSByZXR1cm4gbm9uLW51bGwgZm9yIGZ1bmN0aW9uc1xuICBnZXQgb3BzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBub3BzKCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBvcDEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnN5bWJvbChcIk5vdGhpbmdcIik7XG4gIH1cbiAgZ2V0IG9wMigpIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuc3ltYm9sKFwiTm90aGluZ1wiKTtcbiAgfVxuICBnZXQgb3AzKCkge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGdldCBpc1B1cmUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc0V4YWN0KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKiBGb3IgYSBzeW1ib2wsIHRydWUgaWYgdGhlIHN5bWJvbCBpcyBhIGZyZWUgdmFyaWFibGUgKG5vIHZhbHVlKSAqL1xuICBnZXQgaXNGcmVlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiogRm9yIGEgc3ltYm9sLCB0cnVlIGlmIHRoZSBzeW1ib2wgaXMgYSBjb25zdGFudCAodW5jaGFuZ2VhYmxlIHZhbHVlKSAqL1xuICBnZXQgaXNDb25zdGFudCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGNhbm9uaWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhcHBseShfZm4sIF9oZWFkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc3Vicyhfc3ViLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhbm9uaWNhbClcbiAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBzb2x2ZShfdmFycykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJlcGxhY2UoX3J1bGVzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaGFzKF92KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc05hTigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc1plcm8oKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNOb3RaZXJvKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzT25lKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzTmVnYXRpdmVPbmUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNJbmZpbml0eSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIE5vdCArLSBJbmZpbml0eSwgbm90IE5hTlxuICBnZXQgaXNGaW5pdGUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNFdmVuKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzT2RkKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzUHJpbWUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNDb21wb3NpdGUoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgbnVtZXJpY1ZhbHVlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBzZ24oKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXNMZXNzKF9yaHMpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzTGVzc0VxdWFsKF9yaHMpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzR3JlYXRlcihfcmhzKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpc0dyZWF0ZXJFcXVhbChfcmhzKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvLyB4ID4gMFxuICBnZXQgaXNQb3NpdGl2ZSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPj0gMFxuICBnZXQgaXNOb25OZWdhdGl2ZSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPCAwXG4gIGdldCBpc05lZ2F0aXZlKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgLy8geCA8PSAwXG4gIGdldCBpc05vblBvc2l0aXZlKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaXNDb21wYXRpYmxlKF9kb20sIF9raW5kKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgd2lraWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpa2lkYXRhO1xuICB9XG4gIHNldCB3aWtpZGF0YSh2YWwpIHtcbiAgICB0aGlzLl93aWtpZGF0YSA9IHZhbDtcbiAgfVxuICBnZXQgY29tcGxleGl0eSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBiYXNlZERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgc3ltYm9sRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBmdW5jdGlvbkRlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBiaW5kKF9zY29wZSkge1xuICAgIHJldHVybjtcbiAgfVxuICB1bmJpbmQoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBrZXlzQ291bnQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZ2V0S2V5KF9rZXkpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGhhc0tleShfa2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIHNldCB2YWx1ZShfdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgXFxcXCgke3RoaXMubGF0ZXh9XFxcXClgKTtcbiAgfVxuICBnZXQgZG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5kb21haW4oXCJWb2lkXCIpO1xuICB9XG4gIHNldCBkb21haW4oX2RvbWFpbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY2hhbmdlIHRoZSBkb21haW4gb2YgXFxcXCgke3RoaXMubGF0ZXh9XFxcXClgKTtcbiAgfVxuICBnZXQgZXhwbGljaXREb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluO1xuICB9XG4gIGdldCBpc051bWJlcigpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc0ludGVnZXIoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNSYXRpb25hbCgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc0FsZ2VicmFpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzUmVhbCgpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIFJlYWwgb3IgKy1JbmZpbml0eVxuICBnZXQgaXNFeHRlbmRlZFJlYWwoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNDb21wbGV4KCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzSW1hZ2luYXJ5KCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzRXh0ZW5kZWRDb21wbGV4KCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgc2ltcGxpZnkoX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBldmFsdWF0ZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2ltcGxpZnkob3B0aW9ucyk7XG4gIH1cbiAgTihfb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKCk7XG4gIH1cbiAgY29tcGlsZSh0byA9IFwiamF2YXNjcmlwdFwiLCBvcHRpb25zKSB7XG4gICAgaWYgKHRvICE9PSBcImphdmFzY3JpcHRcIilcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgb3B0aW9ucyA/PyAob3B0aW9ucyA9IHsgb3B0aW1pemU6IFtcInNpbXBsaWZ5XCIsIFwiZXZhbHVhdGVcIl0gfSk7XG4gICAgbGV0IGV4cHIgPSB0aGlzO1xuICAgIGlmIChvcHRpb25zLm9wdGltaXplLmluY2x1ZGVzKFwic2ltcGxpZnlcIikpXG4gICAgICBleHByID0gZXhwci5zaW1wbGlmeSgpO1xuICAgIGlmIChvcHRpb25zLm9wdGltaXplLmluY2x1ZGVzKFwiZXZhbHVhdGVcIikpXG4gICAgICBleHByID0gZXhwci5ldmFsdWF0ZSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY29tcGlsZVRvSmF2YXNjcmlwdChleHByKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL3NlcmlhbGl6ZS50c1xudmFyIGltcG9ydF9jb21wbGV4OCA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbnVtZXJpY3MvbnVtZXJpYy1iaWdudW0udHNcbmZ1bmN0aW9uIGZhY3RvcmlhbDIoY2UsIG4pIHtcbiAgaWYgKCFuLmlzSW50ZWdlcigpIHx8IG4uaXNOZWdhdGl2ZSgpKVxuICAgIHJldHVybiBjZS5fQklHTlVNX05BTjtcbiAgaWYgKG4ubGVzc1RoYW4oMTApKVxuICAgIHJldHVybiBjZS5iaWdudW0oXG4gICAgICBbMSwgMSwgMiwgNiwgMjQsIDEyMCwgNzIwLCA1MDQwLCA0MDMyMCwgMzYyODgwLCAzNjI4ODAwXVtuLnRvTnVtYmVyKCldXG4gICAgKTtcbiAgaWYgKG4uZ3QoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgbGV0IHZhbDIgPSBjZS5fQklHTlVNX09ORTtcbiAgICBsZXQgaSA9IGNlLl9CSUdOVU1fVFdPO1xuICAgIHdoaWxlIChpLmxlc3NUaGFuKG4pKSB7XG4gICAgICB2YWwyID0gdmFsMi5tdWwoaSk7XG4gICAgICBpID0gaS5hZGQoMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWwyO1xuICB9XG4gIGlmIChuLm1vZHVsbygyKS5lcSgxKSkge1xuICAgIHJldHVybiBuLnRpbWVzKGZhY3RvcmlhbDIoY2UsIG4ubWludXMoMSkpKTtcbiAgfVxuICBsZXQgbG9vcCA9IG4udG9OdW1iZXIoKTtcbiAgbGV0IHN1bTIgPSBuO1xuICBsZXQgdmFsID0gbjtcbiAgd2hpbGUgKGxvb3AgPiAyKSB7XG4gICAgbG9vcCAtPSAyO1xuICAgIHN1bTIgPSBzdW0yLmFkZChsb29wKTtcbiAgICB2YWwgPSB2YWwubXVsKHN1bTIpO1xuICB9XG4gIHJldHVybiB2YWw7XG59XG52YXIgZ2FtbWFHMiA9IDc7XG5mdW5jdGlvbiBsbmdhbW1hMihjZSwgeikge1xuICBpZiAoei5pc05lZ2F0aXZlKCkpXG4gICAgcmV0dXJuIGNlLl9CSUdOVU1fTkFOO1xuICBjb25zdCBHQU1NQV9QX0xOID0gY2UuY2FjaGUoXCJnYW1tYS1wLWxuXCIsICgpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCIwLjk5OTk5OTk5OTk5OTk5NzA5MTgyXCIsXG4gICAgICBcIjU3LjE1NjIzNTY2NTg2MjkyMzUxN1wiLFxuICAgICAgXCItNTkuNTk3OTYwMzU1NDc1NDkxMjQ4XCIsXG4gICAgICBcIjE0LjEzNjA5Nzk3NDc0MTc0NzE3NFwiLFxuICAgICAgXCItMC40OTE5MTM4MTYwOTc2MjAxOTk3OFwiLFxuICAgICAgXCIwLjMzOTk0NjQ5OTg0ODExODg4Njk5ZS00XCIsXG4gICAgICBcIjAuNDY1MjM2Mjg5MjcwNDg1NzU2NjVlLTRcIixcbiAgICAgIFwiLTAuOTgzNzQ0NzUzMDQ4Nzk1NjQ2NzdlLTRcIixcbiAgICAgIFwiMC4xNTgwODg3MDMyMjQ5MTI0ODg4NGUtM1wiLFxuICAgICAgXCItMC4yMTAyNjQ0NDE3MjQxMDQ4ODMxOWUtM1wiLFxuICAgICAgXCIwLjIxNzQzOTYxODExNTIxMjY0MzJlLTNcIixcbiAgICAgIFwiLTAuMTY0MzE4MTA2NTM2NzYzODkwMjJlLTNcIixcbiAgICAgIFwiMC44NDQxODIyMzk4Mzg1Mjc0MzI5M2UtNFwiLFxuICAgICAgXCItMC4yNjE5MDgzODQwMTU4MTQwODY3ZS00XCIsXG4gICAgICBcIjAuMzY4OTkxODI2NTk1MzE2MjI3MDRlLTVcIlxuICAgIF0ubWFwKCh4MikgPT4gY2UuYmlnbnVtKHgyKSk7XG4gIH0pO1xuICBsZXQgeCA9IEdBTU1BX1BfTE5bMF07XG4gIGZvciAobGV0IGkgPSBHQU1NQV9QX0xOLmxlbmd0aCAtIDE7IGkgPiAwOyAtLWkpIHtcbiAgICB4ID0geC5hZGQoR0FNTUFfUF9MTltpXS5kaXYoei5hZGQoaSkpKTtcbiAgfVxuICBjb25zdCBHQU1NQV9HX0xOID0gY2UuY2FjaGUoXCJnYW1tYS1nLWxuXCIsICgpID0+IGNlLmJpZ251bSg2MDcpLmRpdigxMjgpKTtcbiAgY29uc3QgdCA9IHouYWRkKEdBTU1BX0dfTE4pLmFkZChjZS5fQklHTlVNX0hBTEYpO1xuICByZXR1cm4gY2UuX0JJR05VTV9ORUdBVElWRV9PTkUuYWNvcygpLm11bChjZS5fQklHTlVNX1RXTykubG9nKCkubXVsKGNlLl9CSUdOVU1fSEFMRikuYWRkKFxuICAgIHQubG9nKCkubXVsKHouYWRkKGNlLl9CSUdOVU1fSEFMRikpLm1pbnVzKHQpLmFkZCh4LmxvZygpKS5taW51cyh6LmxvZygpKVxuICApO1xufVxuZnVuY3Rpb24gZ2FtbWEyKGNlLCB6KSB7XG4gIGlmICh6Lmxlc3NUaGFuKGNlLl9CSUdOVU1fSEFMRikpIHtcbiAgICBjb25zdCBwaSA9IGNlLl9CSUdOVU1fTkVHQVRJVkVfT05FLmFjb3MoKTtcbiAgICByZXR1cm4gcGkuZGl2KFxuICAgICAgcGkubXVsKHopLnNpbigpLm11bChnYW1tYTIoY2UsIGNlLl9CSUdOVU1fT05FLnN1Yih6KSkpXG4gICAgKTtcbiAgfVxuICBpZiAoei5ncmVhdGVyVGhhbigxMDApKVxuICAgIHJldHVybiBsbmdhbW1hMihjZSwgeikuZXhwKCk7XG4gIHogPSB6LnN1YigxKTtcbiAgY29uc3QgTEFOQ1pPU183X0MgPSBjZS5jYWNoZShcImxhbmN6b3MtNy1jXCIsICgpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCIwLjk5OTk5OTk5OTk5OTgwOTkzMjI3Njg0NzAwNDczNDc4XCIsXG4gICAgICBcIjY3Ni41MjAzNjgxMjE4ODUwOTg1NjcwMDkxOTA0NDQwMTlcIixcbiAgICAgIFwiLTEyNTkuMTM5MjE2NzIyNDAyODcwNDcxNTYwNzg3NTUyODNcIixcbiAgICAgIFwiNzcxLjMyMzQyODc3NzY1MzA3ODg0ODY1MjgyNTg4OTRcIixcbiAgICAgIFwiLTE3Ni42MTUwMjkxNjIxNDA1OTkwNjU4NDU1MTM1NFwiLFxuICAgICAgXCIxMi41MDczNDMyNzg2ODY5MDQ4MTQ0NTg5MzY4NTNcIixcbiAgICAgIFwiLTAuMTM4NTcxMDk1MjY1NzIwMTE2ODk1NTQ3MDdcIixcbiAgICAgIFwiOS45ODQzNjk1NzgwMTk1NzA4NTk1NjNlLTZcIixcbiAgICAgIFwiMS41MDU2MzI3MzUxNDkzMTE1NTgzNGUtN1wiXG4gICAgXS5tYXAoKHgyKSA9PiBjZS5iaWdudW0oeDIpKTtcbiAgfSk7XG4gIGxldCB4ID0gTEFOQ1pPU183X0NbMF07XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZ2FtbWFHMiArIDI7IGkrKylcbiAgICB4ID0geC5hZGQoTEFOQ1pPU183X0NbaV0uZGl2KHouYWRkKGkpKSk7XG4gIGNvbnN0IHQgPSB6LmFkZChnYW1tYUcyKS5hZGQoY2UuX0JJR05VTV9IQUxGKTtcbiAgcmV0dXJuIGNlLl9CSUdOVU1fTkVHQVRJVkVfT05FLmFjb3MoKS50aW1lcyhjZS5fQklHTlVNX1RXTykuc3FydCgpLm11bCh4Lm11bCh0Lm5lZygpLmV4cCgpKS5tdWwodC5wb3coei5hZGQoY2UuX0JJR05VTV9IQUxGKSkpKTtcbn1cbmZ1bmN0aW9uIGlzSW5NYWNoaW5lUmFuZ2UoZCkge1xuICBpZiAoIWQuaXNGaW5pdGUoKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGQuZC5sZW5ndGggPiAzIHx8IGQuZC5sZW5ndGggPT09IDMgJiYgZC5kWzBdID49IDkwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGQucHJlY2lzaW9uKCkgPD0gMTYpO1xuICByZXR1cm4gZC5lIDwgMzA4ICYmIGQuZSA+IC0zMDY7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9zeW1ib2xpYy9wcm9kdWN0LnRzXG52YXIgaW1wb3J0X2NvbXBsZXg3ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG52YXIgUHJvZHVjdCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2UsIHhzLCBvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBPdGhlciB0ZXJtcyBvZiB0aGUgcHJvZHVjdCwgYHRlcm1gIGlzIHRoZSBrZXlcbiAgICB0aGlzLl90ZXJtcyA9IFtdO1xuICAgIHRoaXMuX2hhc0luZmluaXR5ID0gZmFsc2U7XG4gICAgdGhpcy5faGFzWmVybyA9IGZhbHNlO1xuICAgIC8vIElmIGBmYWxzZWAsIHRoZSBydW5uaW5nIHByb2R1Y3RzIGFyZSBub3QgY2FsY3VsYXRlZFxuICAgIHRoaXMuX2lzQ2Fub25pY2FsID0gdHJ1ZTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIG9wdGlvbnMuY2Fub25pY2FsID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IG9wdGlvbnMuY2Fub25pY2FsO1xuICAgIHRoaXMuZW5naW5lID0gY2U7XG4gICAgdGhpcy5fc2lnbiA9IDE7XG4gICAgdGhpcy5fcmF0aW9uYWwgPSBiaWdudW1QcmVmZXJyZWQoY2UpID8gW0JpZ0ludCgxKSwgQmlnSW50KDEpXSA6IFsxLCAxXTtcbiAgICB0aGlzLl9jb21wbGV4ID0gaW1wb3J0X2NvbXBsZXg3LmRlZmF1bHQuT05FO1xuICAgIHRoaXMuX2JpZ251bSA9IGNlLl9CSUdOVU1fT05FO1xuICAgIHRoaXMuX251bWJlciA9IDE7XG4gICAgaWYgKHhzKVxuICAgICAgZm9yIChjb25zdCB4IG9mIHhzKVxuICAgICAgICB0aGlzLmFkZFRlcm0oeCk7XG4gIH1cbiAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0Nhbm9uaWNhbClcbiAgICAgIHJldHVybiB0aGlzLl90ZXJtcy5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIHRoaXMuX3Rlcm1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9oYXNJbmZpbml0eSA9PT0gZmFsc2UgJiYgdGhpcy5faGFzWmVybyA9PT0gZmFsc2UgJiYgdGhpcy5fc2lnbiA9PT0gMSAmJiBpc1JhdGlvbmFsT25lKHRoaXMuX3JhdGlvbmFsKSAmJiAvLyBpc1JhdGlvbmFsT25lKHRoaXMuX3NxdWFyZVJvb3RSYXRpb25hbCkgJiZcbiAgICB0aGlzLl9jb21wbGV4LnJlID09PSAxICYmIHRoaXMuX2NvbXBsZXguaW0gPT09IDAgJiYgdGhpcy5fYmlnbnVtLmVxKHRoaXMuZW5naW5lLl9CSUdOVU1fT05FKSAmJiB0aGlzLl9udW1iZXIgPT09IDE7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHRlcm0gdG8gdGhlIHByb2R1Y3QuXG4gICAqXG4gICAqIElmIGB0aGlzLl9pc0Nhbm9uaWNhbGAgYSBydW5uaW5nIHByb2R1Y3Qgb2YgZXhhY3QgdGVybXMgaXMga2VwdC5cbiAgICogT3RoZXJ3aXNlLCB0ZXJtcyBhbmQgdGhlaXIgZXhwb25lbnQgYXJlIHRhbGxpZWQuXG4gICAqL1xuICBhZGRUZXJtKHRlcm0pIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodGVybS5pc0Nhbm9uaWNhbCk7XG4gICAgaWYgKHRlcm0uaGVhZCA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgdGVybS5vcHMpXG4gICAgICAgIHRoaXMuYWRkVGVybSh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzQ2Fub25pY2FsKSB7XG4gICAgICBpZiAodGVybS5pc05vdGhpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICh0ZXJtLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodGVybS5pc09uZSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0ZXJtLmlzWmVybykge1xuICAgICAgICAgIHRoaXMuX2hhc1plcm8gPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVybS5pc05lZ2F0aXZlT25lKSB7XG4gICAgICAgICAgdGhpcy5fc2lnbiAqPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlcm0uaXNJbmZpbml0eSkge1xuICAgICAgICAgIHRoaXMuX2hhc0luZmluaXR5ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGVybS5pc05lZ2F0aXZlKVxuICAgICAgICAgICAgdGhpcy5fc2lnbiAqPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bSA9IHRlcm0ubnVtZXJpY1ZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGlmIChudW0gPCAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduICo9IC0xO1xuICAgICAgICAgICAgbnVtID0gLW51bTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICAgICAgICAgIHRoaXMuX3JhdGlvbmFsID0gbXVsMih0aGlzLl9yYXRpb25hbCwgW251bSwgMV0pO1xuICAgICAgICAgIGVsc2UgaWYgKGJpZ251bVByZWZlcnJlZCh0aGlzLmVuZ2luZSkpXG4gICAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0ubXVsKG51bSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fbnVtYmVyICo9IG51bTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgICAgICAgIGlmIChudW0uaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduICo9IC0xO1xuICAgICAgICAgICAgbnVtID0gbnVtLm5lZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtLmlzSW50ZWdlcigpKVxuICAgICAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBtdWwyKHRoaXMuX3JhdGlvbmFsLCBbYmlnaW50KG51bSksIEJpZ0ludCgxKV0pO1xuICAgICAgICAgIGVsc2UgaWYgKGJpZ251bVByZWZlcnJlZCh0aGlzLmVuZ2luZSkpXG4gICAgICAgICAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0ubXVsKG51bSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fbnVtYmVyICo9IG51bS50b051bWJlcigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg3LmRlZmF1bHQpIHtcbiAgICAgICAgICB0aGlzLl9jb21wbGV4ID0gdGhpcy5fY29tcGxleC5tdWwobnVtKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmF0aW9uYWwobnVtKSkge1xuICAgICAgICAgIHRoaXMuX3JhdGlvbmFsID0gbXVsMih0aGlzLl9yYXRpb25hbCwgbnVtKTtcbiAgICAgICAgICBpZiAoaXNOZWcodGhpcy5fcmF0aW9uYWwpKSB7XG4gICAgICAgICAgICB0aGlzLl9zaWduICo9IC0xO1xuICAgICAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBuZWcodGhpcy5fcmF0aW9uYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3QgPSB0ZXJtO1xuICAgIGlmICh0aGlzLl9pc0Nhbm9uaWNhbCkge1xuICAgICAgbGV0IGNvZWY7XG4gICAgICBbY29lZiwgcmVzdF0gPSBhc0NvZWZmaWNpZW50KHRlcm0pO1xuICAgICAgdGhpcy5fcmF0aW9uYWwgPSBtdWwyKHRoaXMuX3JhdGlvbmFsLCBjb2VmKTtcbiAgICAgIGlmIChpc05lZyh0aGlzLl9yYXRpb25hbCkpIHtcbiAgICAgICAgdGhpcy5fc2lnbiAqPSAtMTtcbiAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBuZWcodGhpcy5fcmF0aW9uYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdC5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgcmVzdC5pc09uZSlcbiAgICAgIHJldHVybjtcbiAgICBsZXQgZXhwb25lbnQgPSBbMSwgMV07XG4gICAgaWYgKHJlc3QuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgICBjb25zdCByID0gYXNSYXRpb25hbChyZXN0Lm9wMik7XG4gICAgICBpZiAocikge1xuICAgICAgICBleHBvbmVudCA9IHI7XG4gICAgICAgIHJlc3QgPSByZXN0Lm9wMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc3QuaGVhZCA9PT0gXCJEaXZpZGVcIikge1xuICAgICAgdGhpcy5hZGRUZXJtKHJlc3Qub3AxKTtcbiAgICAgIGV4cG9uZW50ID0gWy0xLCAxXTtcbiAgICAgIHJlc3QgPSByZXN0Lm9wMjtcbiAgICB9XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMuX3Rlcm1zKSB7XG4gICAgICBpZiAoeC50ZXJtLmlzU2FtZShyZXN0KSkge1xuICAgICAgICB4LmV4cG9uZW50ID0gYWRkMih4LmV4cG9uZW50LCBleHBvbmVudCk7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZm91bmQpXG4gICAgICB0aGlzLl90ZXJtcy5wdXNoKHsgdGVybTogcmVzdCwgZXhwb25lbnQgfSk7XG4gIH1cbiAgdW5pdFRlcm1zKG1vZGUpIHtcbiAgICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAgIGlmIChtb2RlID09PSBcIm51bWVyaWNcIikge1xuICAgICAgaWYgKCFjb21wbGV4QWxsb3dlZChjZSkgJiYgdGhpcy5fY29tcGxleC5pbSAhPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoYmlnbnVtUHJlZmVycmVkKGNlKSkge1xuICAgICAgICBsZXQgYjIgPSBjZS5fQklHTlVNX09ORTtcbiAgICAgICAgaWYgKCFpc1JhdGlvbmFsT25lKHRoaXMuX3JhdGlvbmFsKSkge1xuICAgICAgICAgIGlmIChpc0JpZ1JhdGlvbmFsKHRoaXMuX3JhdGlvbmFsKSlcbiAgICAgICAgICAgIGIyID0gY2UuYmlnbnVtKHRoaXMuX3JhdGlvbmFsWzBdLnRvU3RyaW5nKCkpLmRpdihjZS5iaWdudW0odGhpcy5fcmF0aW9uYWxbMV0udG9TdHJpbmcoKSkpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGIyID0gY2UuYmlnbnVtKHRoaXMuX3JhdGlvbmFsWzBdKS5kaXYodGhpcy5fcmF0aW9uYWxbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGIyID0gYjIubXVsKHRoaXMuX2JpZ251bSkubXVsKHRoaXMuX3NpZ24gKiB0aGlzLl9udW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5fY29tcGxleC5pbSAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IHogPSB0aGlzLl9jb21wbGV4Lm11bChiMi50b051bWJlcigpKTtcbiAgICAgICAgICBpZiAoei5lcXVhbHMoMSkpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgcmV0dXJuIFt7IGV4cG9uZW50OiBbMSwgMV0sIHRlcm1zOiBbY2UubnVtYmVyKHopXSB9XTtcbiAgICAgICAgfVxuICAgICAgICBiMiA9IGIyLm11bCh0aGlzLl9jb21wbGV4LnJlKTtcbiAgICAgICAgaWYgKGIyLmVxdWFscygxKSlcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBbeyBleHBvbmVudDogWzEsIDFdLCB0ZXJtczogW2NlLm51bWJlcihiMildIH1dO1xuICAgICAgfVxuICAgICAgbGV0IG4yID0gMTtcbiAgICAgIGlmICghaXNSYXRpb25hbE9uZSh0aGlzLl9yYXRpb25hbCkpIHtcbiAgICAgICAgaWYgKGlzQmlnUmF0aW9uYWwodGhpcy5fcmF0aW9uYWwpKVxuICAgICAgICAgIG4yID0gTnVtYmVyKHRoaXMuX3JhdGlvbmFsWzBdKSAvIE51bWJlcih0aGlzLl9yYXRpb25hbFsxXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBuMiA9IHRoaXMuX3JhdGlvbmFsWzBdIC8gdGhpcy5fcmF0aW9uYWxbMV07XG4gICAgICB9XG4gICAgICBuMiAqPSB0aGlzLl9zaWduICogdGhpcy5fbnVtYmVyICogdGhpcy5fYmlnbnVtLnRvTnVtYmVyKCk7XG4gICAgICBpZiAodGhpcy5fY29tcGxleC5pbSAhPT0gMCkge1xuICAgICAgICBjb25zdCB6ID0gdGhpcy5fY29tcGxleC5tdWwobjIpO1xuICAgICAgICBpZiAoei5lcXVhbHMoMSkpXG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gW3sgZXhwb25lbnQ6IFsxLCAxXSwgdGVybXM6IFtjZS5udW1iZXIoeildIH1dO1xuICAgICAgfVxuICAgICAgbjIgKj0gdGhpcy5fY29tcGxleC5yZTtcbiAgICAgIGlmIChuMiA9PT0gMSlcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIFt7IGV4cG9uZW50OiBbMSwgMV0sIHRlcm1zOiBbY2UubnVtYmVyKG4yKV0gfV07XG4gICAgfVxuICAgIGNvbnN0IHhzID0gW107XG4gICAgY29uc3QgdW5pdFRlcm1zID0gW107XG4gICAgaWYgKHRoaXMuX2hhc0luZmluaXR5KVxuICAgICAgdW5pdFRlcm1zLnB1c2goY2UuX1BPU0lUSVZFX0lORklOSVRZKTtcbiAgICB0aGlzLl9yYXRpb25hbCA9IHJlZHVjZWRSYXRpb25hbCh0aGlzLl9yYXRpb25hbCk7XG4gICAgaWYgKHRoaXMuX2NvbXBsZXgucmUgIT09IDEgfHwgdGhpcy5fY29tcGxleC5pbSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMuX2NvbXBsZXguaW0gPT09IDApXG4gICAgICAgIHRoaXMuX251bWJlciAqPSBNYXRoLmFicyh0aGlzLl9jb21wbGV4LnJlKTtcbiAgICAgIGlmICh0aGlzLl9jb21wbGV4LnJlIDwgMClcbiAgICAgICAgdGhpcy5fcmF0aW9uYWwgPSBuZWcodGhpcy5fcmF0aW9uYWwpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHVuaXRUZXJtcy5wdXNoKGNlLm51bWJlcih0aGlzLl9jb21wbGV4KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBuID0gdGhpcy5fc2lnbiAqIHRoaXMuX251bWJlcjtcbiAgICBsZXQgYiA9IHRoaXMuX2JpZ251bTtcbiAgICBpZiAoIWlzUmF0aW9uYWxPbmUodGhpcy5fcmF0aW9uYWwpKSB7XG4gICAgICBpZiAobW9kZSA9PT0gXCJyYXRpb25hbFwiKSB7XG4gICAgICAgIGlmIChtYWNoaW5lTnVtZXJhdG9yKHRoaXMuX3JhdGlvbmFsKSAhPT0gMSkge1xuICAgICAgICAgIGlmIChpc0JpZ1JhdGlvbmFsKHRoaXMuX3JhdGlvbmFsKSlcbiAgICAgICAgICAgIGIgPSBiLm11bChjZS5iaWdudW0odGhpcy5fcmF0aW9uYWxbMF0pKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBuICo9IHRoaXMuX3JhdGlvbmFsWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYWNoaW5lRGVub21pbmF0b3IodGhpcy5fcmF0aW9uYWwpICE9PSAxKVxuICAgICAgICAgIHhzLnB1c2goe1xuICAgICAgICAgICAgZXhwb25lbnQ6IFstMSwgMV0sXG4gICAgICAgICAgICB0ZXJtczogW2NlLm51bWJlcih0aGlzLl9yYXRpb25hbFsxXSldXG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gLTEpIHtcbiAgICAgICAgICB1bml0VGVybXMucHVzaChjZS5udW1iZXIobmVnKHRoaXMuX3JhdGlvbmFsKSkpO1xuICAgICAgICAgIG4gPSAxO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB1bml0VGVybXMucHVzaChjZS5udW1iZXIodGhpcy5fcmF0aW9uYWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFiLmVxdWFscyhjZS5fQklHTlVNX09ORSkpXG4gICAgICB1bml0VGVybXMucHVzaChjZS5udW1iZXIoYi5tdWwobikpKTtcbiAgICBlbHNlIGlmIChuICE9PSAxKVxuICAgICAgdW5pdFRlcm1zLnB1c2goY2UubnVtYmVyKG4pKTtcbiAgICBpZiAodW5pdFRlcm1zLmxlbmd0aCA+IDApXG4gICAgICB4cy5wdXNoKHsgZXhwb25lbnQ6IFsxLCAxXSwgdGVybXM6IHVuaXRUZXJtcyB9KTtcbiAgICByZXR1cm4geHM7XG4gIH1cbiAgLyoqIFRoZSB0ZXJtcyBvZiB0aGUgcHJvZHVjdCwgZ3JvdXBlZCBieSBkZWdyZWVzLlxuICAgKlxuICAgKiBJZiBgbW9kZWAgaXMgYHJhdGlvbmFsYCwgcmF0aW9uYWxzIGFyZSBzcGxpdCBpbnRvIHNlcGFyYXRlIG51bWVyYXRvciBhbmRcbiAgICogZGVub21pbmF0b3IsIHNvIHRoYXQgYSByYXRpb25hbCBleHByZXNzaW9uIGNhbiBiZSBjcmVhdGVkIGxhdGVyXG4gICAqIElmIGBtb2RlYCBpcyBgZXhwcmVzc2lvbmAsIGEgcmVndWxhciBleHByZXNzaW9uIGlzIHJldHVybmVkLCB3aXRob3V0XG4gICAqIHNwbGl0dGluZyByYXRpb25hbHNcbiAgICogSWYgYG1vZGVgIGlzIGBudW1lcmljYCwgdGhlIGxpdGVyYWxzIGFyZSBjb21iaW5lZCBpbnRvIG9uZSBleHByZXNzaW9uXG4gICAqXG4gICAqL1xuICBncm91cGVkQnlEZWdyZWVzKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID8/IChvcHRpb25zID0ge30pO1xuICAgIGlmICghKFwibW9kZVwiIGluIG9wdGlvbnMpKVxuICAgICAgb3B0aW9ucy5tb2RlID0gXCJleHByZXNzaW9uXCI7XG4gICAgY29uc3QgY2UgPSB0aGlzLmVuZ2luZTtcbiAgICBpZiAob3B0aW9ucy5tb2RlID09PSBcIm51bWVyaWNcIikge1xuICAgICAgaWYgKHRoaXMuX2NvbXBsZXguaW0gIT09IDAgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodGhpcy5faGFzSW5maW5pdHkpXG4gICAgICAgIHJldHVybiBbeyBleHBvbmVudDogWzEsIDFdLCB0ZXJtczogW2NlLl9QT1NJVElWRV9JTkZJTklUWV0gfV07XG4gICAgfVxuICAgIGNvbnN0IHhzID0gdGhpcy51bml0VGVybXMob3B0aW9ucy5tb2RlID8/IFwiZXhwcmVzc2lvblwiKTtcbiAgICBpZiAoeHMgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fdGVybXMpIHtcbiAgICAgIGNvbnN0IGV4cG9uZW50ID0gcmVkdWNlZFJhdGlvbmFsKHQuZXhwb25lbnQpO1xuICAgICAgaWYgKGV4cG9uZW50WzBdID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgICAgIGlmIChleHBvbmVudFswXSA9PT0geC5leHBvbmVudFswXSAmJiBleHBvbmVudFsxXSA9PT0geC5leHBvbmVudFsxXSkge1xuICAgICAgICAgIHgudGVybXMucHVzaCh0LnRlcm0pO1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgeHMucHVzaCh7IGV4cG9uZW50LCB0ZXJtczogW3QudGVybV0gfSk7XG4gICAgfVxuICAgIHJldHVybiB4cztcbiAgfVxuICBhc0V4cHJlc3Npb24obW9kZSA9IFwiZXZhbHVhdGVcIikge1xuICAgIGNvbnN0IGNlID0gdGhpcy5lbmdpbmU7XG4gICAgaWYgKHRoaXMuX2hhc0luZmluaXR5KSB7XG4gICAgICBpZiAodGhpcy5faGFzWmVybylcbiAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICBpZiAodGhpcy5fdGVybXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChtYWNoaW5lTnVtZXJhdG9yKHRoaXMuX3JhdGlvbmFsKSA+IDApXG4gICAgICAgICAgcmV0dXJuIGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgcmV0dXJuIGNlLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2hhc1plcm8pXG4gICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgY29uc3QgZ3JvdXBlZFRlcm1zID0gdGhpcy5ncm91cGVkQnlEZWdyZWVzKHtcbiAgICAgIG1vZGU6IG1vZGUgPT09IFwiTlwiID8gXCJudW1lcmljXCIgOiBcImV4cHJlc3Npb25cIlxuICAgIH0pO1xuICAgIGlmIChncm91cGVkVGVybXMgPT09IG51bGwpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBjb25zdCB0ZXJtcyA9IHRlcm1zQXNFeHByZXNzaW9ucyhjZSwgZ3JvdXBlZFRlcm1zKTtcbiAgICBpZiAodGVybXMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGNlLl9PTkU7XG4gICAgaWYgKHRlcm1zLmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiB0ZXJtc1swXTtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuX2ZuKFwiTXVsdGlwbHlcIiwgdGVybXMpO1xuICB9XG4gIC8qKiBUaGUgcHJvZHVjdCwgZXhwcmVzc2VkIGFzIGEgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciAqL1xuICBhc051bWVyYXRvckRlbm9taW5hdG9yKCkge1xuICAgIGNvbnN0IHhzID0gdGhpcy5ncm91cGVkQnlEZWdyZWVzKHsgbW9kZTogXCJyYXRpb25hbFwiIH0pO1xuICAgIGlmICh4cyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBbdGhpcy5lbmdpbmUuX05BTiwgdGhpcy5lbmdpbmUuX05BTl07XG4gICAgY29uc3QgeHNOdW1lcmF0b3IgPSBbXTtcbiAgICBjb25zdCB4c0Rlbm9taW5hdG9yID0gW107XG4gICAgZm9yIChjb25zdCB4IG9mIHhzKVxuICAgICAgaWYgKHguZXhwb25lbnRbMF0gPj0gMClcbiAgICAgICAgeHNOdW1lcmF0b3IucHVzaCh4KTtcbiAgICAgIGVsc2VcbiAgICAgICAgeHNEZW5vbWluYXRvci5wdXNoKHtcbiAgICAgICAgICBleHBvbmVudDogbmVnKHguZXhwb25lbnQpLFxuICAgICAgICAgIHRlcm1zOiB4LnRlcm1zXG4gICAgICAgIH0pO1xuICAgIGNvbnN0IGNlID0gdGhpcy5lbmdpbmU7XG4gICAgY29uc3QgbnVtZXJhdG9yVGVybXMgPSB0ZXJtc0FzRXhwcmVzc2lvbnMoY2UsIHhzTnVtZXJhdG9yKTtcbiAgICBsZXQgbnVtZXJhdG9yID0gY2UuX09ORTtcbiAgICBpZiAobnVtZXJhdG9yVGVybXMubGVuZ3RoID09PSAxKVxuICAgICAgbnVtZXJhdG9yID0gbnVtZXJhdG9yVGVybXNbMF07XG4gICAgZWxzZSBpZiAobnVtZXJhdG9yVGVybXMubGVuZ3RoID4gMClcbiAgICAgIG51bWVyYXRvciA9IGNlLl9mbihcIk11bHRpcGx5XCIsIG51bWVyYXRvclRlcm1zKTtcbiAgICBjb25zdCBkZW5vbWluYXRvclRlcm1zID0gdGVybXNBc0V4cHJlc3Npb25zKGNlLCB4c0Rlbm9taW5hdG9yKTtcbiAgICBsZXQgZGVub21pbmF0b3IgPSBjZS5fT05FO1xuICAgIGlmIChkZW5vbWluYXRvclRlcm1zLmxlbmd0aCA9PT0gMSlcbiAgICAgIGRlbm9taW5hdG9yID0gZGVub21pbmF0b3JUZXJtc1swXTtcbiAgICBlbHNlIGlmIChkZW5vbWluYXRvclRlcm1zLmxlbmd0aCA+IDApXG4gICAgICBkZW5vbWluYXRvciA9IGNlLl9mbihcIk11bHRpcGx5XCIsIGRlbm9taW5hdG9yVGVybXMpO1xuICAgIHJldHVybiBbbnVtZXJhdG9yLCBkZW5vbWluYXRvcl07XG4gIH1cbiAgYXNSYXRpb25hbEV4cHJlc3Npb24oKSB7XG4gICAgY29uc3QgW251bWVyYXRvciwgZGVub21pbmF0b3JdID0gdGhpcy5hc051bWVyYXRvckRlbm9taW5hdG9yKCk7XG4gICAgaWYgKGRlbm9taW5hdG9yLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRlbm9taW5hdG9yLmlzT25lKVxuICAgICAgICByZXR1cm4gbnVtZXJhdG9yO1xuICAgICAgaWYgKGRlbm9taW5hdG9yLmlzTmVnYXRpdmVPbmUpXG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5uZWcobnVtZXJhdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLl9mbihcIkRpdmlkZVwiLCBbbnVtZXJhdG9yLCBkZW5vbWluYXRvcl0pO1xuICB9XG59O1xuZnVuY3Rpb24gZGVncmVlS2V5KGV4cG9uZW50KSB7XG4gIGlmIChpc1JhdGlvbmFsT25lKGV4cG9uZW50KSlcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgW24sIGRdID0gW21hY2hpbmVOdW1lcmF0b3IoZXhwb25lbnQpLCBtYWNoaW5lRGVub21pbmF0b3IoZXhwb25lbnQpXTtcbiAgaWYgKG4gPiAwICYmIE51bWJlci5pc0ludGVnZXIobiAvIGQpKVxuICAgIHJldHVybiAxO1xuICBpZiAobiA+IDApXG4gICAgcmV0dXJuIDI7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG4gLyBkKSlcbiAgICByZXR1cm4gMztcbiAgcmV0dXJuIDQ7XG59XG5mdW5jdGlvbiBkZWdyZWVPcmRlcihhLCBiKSB7XG4gIGNvbnN0IGtleUEgPSBkZWdyZWVLZXkoYS5leHBvbmVudCk7XG4gIGNvbnN0IGtleUIgPSBkZWdyZWVLZXkoYi5leHBvbmVudCk7XG4gIGlmIChrZXlBICE9PSBrZXlCKVxuICAgIHJldHVybiBrZXlBIC0ga2V5QjtcbiAgY29uc3QgW2FfbiwgYV9kXSA9IFtcbiAgICBtYWNoaW5lTnVtZXJhdG9yKGEuZXhwb25lbnQpLFxuICAgIG1hY2hpbmVEZW5vbWluYXRvcihhLmV4cG9uZW50KVxuICBdO1xuICBjb25zdCBbYl9uLCBiX2RdID0gW1xuICAgIG1hY2hpbmVOdW1lcmF0b3IoYi5leHBvbmVudCksXG4gICAgbWFjaGluZURlbm9taW5hdG9yKGIuZXhwb25lbnQpXG4gIF07XG4gIHJldHVybiBhX24gLyBhX2QgLSBiX24gLyBiX2Q7XG59XG5mdW5jdGlvbiB0ZXJtc0FzRXhwcmVzc2lvbnMoY2UsIHRlcm1zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHRlcm1zLnNvcnQoZGVncmVlT3JkZXIpLm1hcCgoeCkgPT4ge1xuICAgIGNvbnN0IHQgPSBmbGF0dGVuT3BzKHgudGVybXMsIFwiTXVsdGlwbHlcIik7XG4gICAgY29uc3QgYmFzZSA9IHQubGVuZ3RoIDw9IDEgPyB0WzBdIDogY2UuX2ZuKFwiTXVsdGlwbHlcIiwgdC5zb3J0KG9yZGVyKSk7XG4gICAgaWYgKGlzUmF0aW9uYWxPbmUoeC5leHBvbmVudCkpXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICByZXR1cm4gY2UucG93KGJhc2UsIHguZXhwb25lbnQpO1xuICB9KTtcbiAgcmV0dXJuIGZsYXR0ZW5PcHMocmVzdWx0LCBcIk11bHRpcGx5XCIpID8/IHJlc3VsdDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vc2VyaWFsaXplLnRzXG5mdW5jdGlvbiBzdWJ0cmFjdChjZSwgYSwgYiwgbWV0YWRhdGEpIHtcbiAgaWYgKGEubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgaWYgKGlzUmF0aW9uYWwoYS5udW1lcmljVmFsdWUpKSB7XG4gICAgICBpZiAobWFjaGluZU51bWVyYXRvcihhLm51bWVyaWNWYWx1ZSkgPCAwKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgY2UsXG4gICAgICAgICAgXCJTdWJ0cmFjdFwiLFxuICAgICAgICAgIFtiLCBjZS5udW1iZXIobmVnKGEubnVtZXJpY1ZhbHVlKSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdDAgPSBhc1NtYWxsSW50ZWdlcihhKTtcbiAgICBpZiAodDAgIT09IG51bGwgJiYgdDAgPCAwKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgY2UsXG4gICAgICAgIFwiU3VidHJhY3RcIixcbiAgICAgICAgW2IsIGNlLm51bWJlcigtdDApXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gIH1cbiAgaWYgKGEuaGVhZCA9PT0gXCJOZWdhdGVcIilcbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlN1YnRyYWN0XCIsIFtiLCBhLm9wMV0sIG1ldGFkYXRhKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVKc29uQ2Fub25pY2FsRnVuY3Rpb24oY2UsIGhlYWQyLCBhcmdzLCBtZXRhZGF0YSkge1xuICBjb25zdCBleGNsdXNpb25zID0gY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLmV4Y2x1ZGU7XG4gIGlmIChoZWFkMiA9PT0gXCJBZGRcIiAmJiBhcmdzLmxlbmd0aCA9PT0gMiAmJiAhZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlN1YnRyYWN0XCIpKSB7XG4gICAgY29uc3Qgc3ViMiA9IHN1YnRyYWN0KGNlLCBhcmdzWzBdLCBhcmdzWzFdLCBtZXRhZGF0YSkgPz8gc3VidHJhY3QoY2UsIGFyZ3NbMV0sIGFyZ3NbMF0sIG1ldGFkYXRhKTtcbiAgICBpZiAoc3ViMilcbiAgICAgIHJldHVybiBzdWIyO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJEaXZpZGVcIiAmJiBhcmdzLmxlbmd0aCA9PT0gMiAmJiBleGNsdXNpb25zLmluY2x1ZGVzKFwiRGl2aWRlXCIpKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgIGNlLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgW2FyZ3NbMF0sIGNlLl9mbihcIlBvd2VyXCIsIFthcmdzWzFdLCBjZS5fTkVHQVRJVkVfT05FXSldLFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJNdWx0aXBseVwiICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiTmVnYXRlXCIpKSB7XG4gICAgaWYgKGFzRmxvYXQoYXJnc1swXSkgPT09IC0xKSB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiTmVnYXRlXCIsIFthcmdzWzFdXSk7XG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJOZWdhdGVcIixcbiAgICAgICAgW2NlLl9mbihcIk11bHRpcGx5XCIsIGFyZ3Muc2xpY2UoMSkpXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJNdWx0aXBseVwiICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiRGl2aWRlXCIpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFByb2R1Y3QoY2UsIGFyZ3MsIHtcbiAgICAgIGNhbm9uaWNhbDogZmFsc2VcbiAgICB9KS5hc1JhdGlvbmFsRXhwcmVzc2lvbigpO1xuICAgIGlmIChyZXN1bHQuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIHJlc3VsdC5oZWFkLCByZXN1bHQub3BzLCBtZXRhZGF0YSk7XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIlBvd2VyXCIpIHtcbiAgICBpZiAoIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJFeHBcIikgJiYgYXJnc1swXT8uc3ltYm9sID09PSBcIkV4cG9uZW50aWFsRVwiKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihjZSwgXCJFeHBcIiwgW2FyZ3NbMV1dLCBtZXRhZGF0YSk7XG4gICAgaWYgKGFyZ3NbMV0/Lm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZXhwMiA9IGFzU21hbGxJbnRlZ2VyKGFyZ3NbMV0pO1xuICAgICAgaWYgKGV4cDIgPT09IDIgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJTcXVhcmVcIikpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiU3F1YXJlXCIsIFthcmdzWzBdXSwgbWV0YWRhdGEpO1xuICAgICAgaWYgKGV4cDIgIT09IG51bGwgJiYgZXhwMiA8IDAgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJEaXZpZGVcIikpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgICBjZSxcbiAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgIFtjZS5fT05FLCBleHAyID09PSAtMSA/IGFyZ3NbMF0gOiBjZS5wb3coYXJnc1swXSwgLWV4cDIpXSxcbiAgICAgICAgICBtZXRhZGF0YVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgciA9IGFyZ3NbMV0ubnVtZXJpY1ZhbHVlO1xuICAgICAgaWYgKCFleGNsdXNpb25zLmluY2x1ZGVzKFwiU3FydFwiKSAmJiByID09PSAwLjUpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiU3FydFwiLCBbYXJnc1swXV0sIG1ldGFkYXRhKTtcbiAgICAgIGlmICghZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlNxcnRcIikgJiYgciA9PT0gLTAuNSlcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgICBjZSxcbiAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgIFtjZS5fT05FLCBjZS5fZm4oXCJTcXJ0XCIsIFthcmdzWzBdXSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICBpZiAoaXNSYXRpb25hbChyKSkge1xuICAgICAgICBjb25zdCBuID0gbWFjaGluZU51bWVyYXRvcihyKTtcbiAgICAgICAgY29uc3QgZCA9IG1hY2hpbmVEZW5vbWluYXRvcihyKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBpZiAoIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJTcXJ0XCIpICYmIGQgPT09IDIpXG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlNxcnRcIiwgW2FyZ3NbMF1dLCBtZXRhZGF0YSk7XG4gICAgICAgICAgaWYgKCFleGNsdXNpb25zLmluY2x1ZGVzKFwiUm9vdFwiKSlcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGNlLFxuICAgICAgICAgICAgICBcIlJvb3RcIixcbiAgICAgICAgICAgICAgW2FyZ3NbMF0sIGNlLm51bWJlcihyWzFdKV0sXG4gICAgICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuID09PSAtMSkge1xuICAgICAgICAgIGlmICghZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlNxcnRcIikgJiYgZCA9PT0gMilcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGNlLFxuICAgICAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgICAgICBbY2UuX09ORSwgY2UuX2ZuKFwiU3FydFwiLCBbYXJnc1swXV0pXSxcbiAgICAgICAgICAgICAgbWV0YWRhdGFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFleGNsdXNpb25zLmluY2x1ZGVzKFwiUm9vdFwiKSlcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgICAgIGNlLFxuICAgICAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgICAgICBbY2UuX09ORSwgY2UuX2ZuKFwiUm9vdFwiLCBbYXJnc1swXSwgY2UubnVtYmVyKHJbMV0pXSldLFxuICAgICAgICAgICAgICBtZXRhZGF0YVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBoZWFkMiwgYXJncywgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBoZWFkMiwgYXJncywgbWV0YWRhdGEpIHtcbiAgY29uc3QgZXhjbHVzaW9ucyA9IGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5leGNsdWRlO1xuICBpZiAoKGhlYWQyID09PSBcIlJhdGlvbmFsXCIgfHwgaGVhZDIgPT09IFwiRGl2aWRlXCIpICYmIGFyZ3MubGVuZ3RoID09PSAyICYmIGFzU21hbGxJbnRlZ2VyKGFyZ3NbMF0pID09PSAxICYmIGFzU21hbGxJbnRlZ2VyKGFyZ3NbMV0pID09PSAyICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiSGFsZlwiKSkge1xuICAgIHJldHVybiBzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBcIkhhbGZcIiwge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICB3aWtpZGF0YTogXCJRMzkzNzMxNzJcIlxuICAgIH0pO1xuICB9XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG51bTAgPSBhcmdzWzBdLm51bWVyaWNWYWx1ZTtcbiAgICBpZiAoaGVhZDIgPT09IFwiTmVnYXRlXCIgJiYgbnVtMCAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBudW0wID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbk51bWJlcihjZSwgLW51bTApO1xuICAgICAgaWYgKG51bTAgaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uTnVtYmVyKGNlLCBudW0wLm5lZygpKTtcbiAgICAgIGlmIChudW0wIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg4LkNvbXBsZXgpXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uTnVtYmVyKGNlLCBudW0wLm5lZygpKTtcbiAgICAgIGlmIChpc1JhdGlvbmFsKG51bTApKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbk51bWJlcihjZSwgbmVnKG51bTApKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIiAmJiBleGNsdXNpb25zLmluY2x1ZGVzKGhlYWQyKSkge1xuICAgIGlmIChoZWFkMiA9PT0gXCJSYXRpb25hbFwiICYmIGFyZ3MubGVuZ3RoID09PSAyKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihjZSwgXCJEaXZpZGVcIiwgYXJncywgbWV0YWRhdGEpO1xuICAgIGlmIChoZWFkMiA9PT0gXCJDb21wbGV4XCIgJiYgYXJncy5sZW5ndGggPT09IDIpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJBZGRcIixcbiAgICAgICAgW2FyZ3NbMF0sIGNlLl9mbihcIk11bHRpcGx5XCIsIFthcmdzWzFdLCBjZS5zeW1ib2woXCJJbWFnaW5hcnlVbml0XCIpXSldLFxuICAgICAgICBtZXRhZGF0YVxuICAgICAgKTtcbiAgICBpZiAoaGVhZDIgPT09IFwiU3FydFwiICYmIGFyZ3MubGVuZ3RoID09PSAxKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihcbiAgICAgICAgY2UsXG4gICAgICAgIFwiUG93ZXJcIixcbiAgICAgICAgW2FyZ3NbMF0sIGV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJIYWxmXCIpID8gY2UubnVtYmVyKFsxLCAyXSkgOiBjZS5fSEFMRl0sXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICApO1xuICAgIGlmIChoZWFkMiA9PT0gXCJSb290XCIgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1sxXS5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG4gPSBhc1NtYWxsSW50ZWdlcihhcmdzWzFdKTtcbiAgICAgIGlmIChuID09PSAyKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlNxcnRcIiwgW2FyZ3NbMF1dKTtcbiAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuIDwgMClcbiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICAgICAgY2UsXG4gICAgICAgICAgICBcIkRpdmlkZVwiLFxuICAgICAgICAgICAgW2NlLl9PTkUsIGNlLl9mbihcIlBvd2VyXCIsIFthcmdzWzBdLCBjZS5udW1iZXIoWzEsIC1uXSldKV0sXG4gICAgICAgICAgICBtZXRhZGF0YVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgICAgY2UsXG4gICAgICAgICAgXCJQb3dlclwiLFxuICAgICAgICAgIFthcmdzWzBdLCBjZS5udW1iZXIoWzEsIC1uXSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJTcXVhcmVcIiAmJiBhcmdzLmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgIGNlLFxuICAgICAgICBcIlBvd2VyXCIsXG4gICAgICAgIFthcmdzWzBdLCBjZS5udW1iZXIoMildLFxuICAgICAgICBtZXRhZGF0YVxuICAgICAgKTtcbiAgICBpZiAoaGVhZDIgPT09IFwiRXhwXCIgJiYgYXJncy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJQb3dlclwiLFxuICAgICAgICBbY2Uuc3ltYm9sKFwiRXhwb25lbnRpYWxFXCIpLCBhcmdzWzBdXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gICAgaWYgKGhlYWQyID09PSBcIlN1YnRyYWN0XCIgJiYgYXJncy5sZW5ndGggPT09IDIpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICBjZSxcbiAgICAgICAgXCJBZGRcIixcbiAgICAgICAgW2FyZ3NbMF0sIGNlLl9mbihcIk5lZ2F0ZVwiLCBbYXJnc1sxXV0pXSxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgICk7XG4gICAgaWYgKGhlYWQyID09PSBcIlN1YnRyYWN0XCIgJiYgYXJncy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIk5lZ2F0ZVwiLCBhcmdzLCBtZXRhZGF0YSk7XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIkFkZFwiICYmIGFyZ3MubGVuZ3RoID09PSAyICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiU3VidHJhY3RcIikpIHtcbiAgICBpZiAoYXJnc1sxXS5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHQxID0gYXNTbWFsbEludGVnZXIoYXJnc1sxXSk7XG4gICAgICBpZiAodDEgIT09IG51bGwgJiYgdDEgPCAwKVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgICAgIGNlLFxuICAgICAgICAgIFwiU3VidHJhY3RcIixcbiAgICAgICAgICBbYXJnc1swXSwgY2UubnVtYmVyKC10MSldLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmdzWzFdLmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oXG4gICAgICAgIGNlLFxuICAgICAgICBcIlN1YnRyYWN0XCIsXG4gICAgICAgIFthcmdzWzBdLCBhcmdzWzFdLm9wMV0sXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiVHVwbGVcIikge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiAhZXhjbHVzaW9ucy5pbmNsdWRlcyhcIlNpbmdsZVwiKSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uRnVuY3Rpb24oY2UsIFwiU2luZ2xlXCIsIGFyZ3MsIG1ldGFkYXRhKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJQYWlyXCIpKVxuICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbihjZSwgXCJQYWlyXCIsIGFyZ3MsIG1ldGFkYXRhKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDMgJiYgIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJUcmlwbGVcIikpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKGNlLCBcIlRyaXBsZVwiLCBhcmdzLCBtZXRhZGF0YSk7XG4gIH1cbiAgY29uc3QganNvbkhlYWQgPSB0eXBlb2YgaGVhZDIgPT09IFwic3RyaW5nXCIgPyBfZXNjYXBlSnNvblN0cmluZyhoZWFkMikgOiBoZWFkMi5qc29uO1xuICBjb25zdCBmbiA9IFtqc29uSGVhZCwgLi4uYXJncy5tYXAoKHgpID0+IHguanNvbildO1xuICBjb25zdCBtZCA9IHsgLi4ubWV0YWRhdGEgPz8ge30gfTtcbiAgaWYgKGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5tZXRhZGF0YS5pbmNsdWRlcyhcImxhdGV4XCIpKSB7XG4gICAgbWQubGF0ZXggPSBfZXNjYXBlSnNvblN0cmluZyhtZC5sYXRleCA/PyBjZS5zZXJpYWxpemUoeyBmbiB9KSk7XG4gIH0gZWxzZVxuICAgIG1kLmxhdGV4ID0gXCJcIjtcbiAgaWYgKCFjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEuaW5jbHVkZXMoXCJ3aWtpZGF0YVwiKSlcbiAgICBtZC53aWtpZGF0YSA9IFwiXCI7XG4gIGlmICghbWQubGF0ZXggJiYgIW1kLndpa2lkYXRhICYmIGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzLmluY2x1ZGVzKFwiZnVuY3Rpb25cIikpXG4gICAgcmV0dXJuIGZuO1xuICBpZiAobWQubGF0ZXggJiYgbWQud2lraWRhdGEpXG4gICAgcmV0dXJuIHsgZm4sIGxhdGV4OiBtZC5sYXRleCwgd2lraWRhdGE6IG1kLndpa2lkYXRhIH07XG4gIGlmIChtZC5sYXRleClcbiAgICByZXR1cm4geyBmbiwgbGF0ZXg6IG1kLmxhdGV4IH07XG4gIGlmIChtZC53aWtpZGF0YSlcbiAgICByZXR1cm4geyBmbiwgd2lraWRhdGE6IG1kLndpa2lkYXRhIH07XG4gIHJldHVybiB7IGZuIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3RyaW5nKGNlLCBzKSB7XG4gIHMgPSBfZXNjYXBlSnNvblN0cmluZyhzKTtcbiAgaWYgKGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzLmluY2x1ZGVzKFwic3RyaW5nXCIpKVxuICAgIHJldHVybiBgJyR7c30nYDtcbiAgcmV0dXJuIHsgc3RyOiBzIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBzeW0sIG1ldGFkYXRhKSB7XG4gIGlmIChzeW0gPT09IFwiSGFsZlwiICYmIGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5leGNsdWRlLmluY2x1ZGVzKFwiSGFsZlwiKSkge1xuICAgIHJldHVybiBzZXJpYWxpemVKc29uTnVtYmVyKGNlLCBbMSwgMl0sIG1ldGFkYXRhKTtcbiAgfVxuICBtZXRhZGF0YSA9IHsgLi4ubWV0YWRhdGEgfTtcbiAgaWYgKGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5tZXRhZGF0YS5pbmNsdWRlcyhcImxhdGV4XCIpKSB7XG4gICAgbWV0YWRhdGEubGF0ZXggPSBtZXRhZGF0YS5sYXRleCA/PyBjZS5zZXJpYWxpemUoeyBzeW0gfSk7XG4gICAgaWYgKG1ldGFkYXRhLmxhdGV4ICE9PSB2b2lkIDApXG4gICAgICBtZXRhZGF0YS5sYXRleCA9IF9lc2NhcGVKc29uU3RyaW5nKG1ldGFkYXRhLmxhdGV4KTtcbiAgfSBlbHNlXG4gICAgbWV0YWRhdGEubGF0ZXggPSB2b2lkIDA7XG4gIGlmIChjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEuaW5jbHVkZXMoXCJ3aWtpZGF0YVwiKSkge1xuICAgIGlmIChtZXRhZGF0YS53aWtpZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCB3aWtpZGF0YSA9IGNlLmxvb2t1cFN5bWJvbChzeW0pPy53aWtpZGF0YTtcbiAgICAgIGlmICh3aWtpZGF0YSAhPT0gdm9pZCAwKVxuICAgICAgICBtZXRhZGF0YS53aWtpZGF0YSA9IF9lc2NhcGVKc29uU3RyaW5nKHdpa2lkYXRhKTtcbiAgICB9XG4gIH0gZWxzZVxuICAgIG1ldGFkYXRhLndpa2lkYXRhID0gdm9pZCAwO1xuICBzeW0gPSBfZXNjYXBlSnNvblN0cmluZyhzeW0pO1xuICBpZiAobWV0YWRhdGEubGF0ZXggPT09IHZvaWQgMCAmJiBtZXRhZGF0YS53aWtpZGF0YSA9PT0gdm9pZCAwICYmIGNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzLmluY2x1ZGVzKFwic3ltYm9sXCIpKVxuICAgIHJldHVybiBzeW07XG4gIGlmIChtZXRhZGF0YS5sYXRleCAhPT0gdm9pZCAwICYmIG1ldGFkYXRhLndpa2lkYXRhICE9PSB2b2lkIDApXG4gICAgcmV0dXJuIHsgc3ltLCBsYXRleDogbWV0YWRhdGEubGF0ZXgsIHdpa2lkYXRhOiBtZXRhZGF0YS53aWtpZGF0YSB9O1xuICBpZiAobWV0YWRhdGEubGF0ZXggIT09IHZvaWQgMClcbiAgICByZXR1cm4geyBzeW0sIGxhdGV4OiBtZXRhZGF0YS5sYXRleCB9O1xuICBpZiAobWV0YWRhdGEud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICByZXR1cm4geyBzeW0sIHdpa2lkYXRhOiBtZXRhZGF0YS53aWtpZGF0YSB9O1xuICByZXR1cm4geyBzeW0gfTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUpzb25OdW1iZXIoY2UsIHZhbHVlLCBtZXRhZGF0YSkge1xuICBtZXRhZGF0YSA9IHsgLi4ubWV0YWRhdGEgfTtcbiAgaWYgKCFjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEuaW5jbHVkZXMoXCJsYXRleFwiKSlcbiAgICBtZXRhZGF0YS5sYXRleCA9IHZvaWQgMDtcbiAgY29uc3Qgc2hvcnRoYW5kQWxsb3dlZCA9IG1ldGFkYXRhLmxhdGV4ID09PSB2b2lkIDAgJiYgbWV0YWRhdGEud2lraWRhdGEgPT09IHZvaWQgMCAmJiAhY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikgJiYgY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLnNob3J0aGFuZHMuaW5jbHVkZXMoXCJudW1iZXJcIik7XG4gIGNvbnN0IGV4Y2x1c2lvbnMgPSBjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMuZXhjbHVkZTtcbiAgbGV0IG51bSA9IFwiXCI7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgIGlmICh2YWx1ZS5pc05hTigpKVxuICAgICAgbnVtID0gXCJOYU5cIjtcbiAgICBlbHNlIGlmICghdmFsdWUuaXNGaW5pdGUoKSlcbiAgICAgIG51bSA9IHZhbHVlLmlzUG9zaXRpdmUoKSA/IFwiK0luZmluaXR5XCIgOiBcIi1JbmZpbml0eVwiO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKHNob3J0aGFuZEFsbG93ZWQgJiYgaXNJbk1hY2hpbmVSYW5nZSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS50b051bWJlcigpO1xuICAgICAgaWYgKHZhbHVlLmlzSW50ZWdlcigpICYmIHZhbHVlLmUgPCB2YWx1ZS5wcmVjaXNpb24oKSArIDQpXG4gICAgICAgIG51bSA9IHZhbHVlLnRvRml4ZWQoMCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJlY2lzaW9uID0gY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLnByZWNpc2lvbjtcbiAgICAgICAgY29uc3QgcyA9IHByZWNpc2lvbiA9PT0gXCJtYXhcIiA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZS50b1ByZWNpc2lvbihcbiAgICAgICAgICBwcmVjaXNpb24gPT09IFwiYXV0b1wiID8gY2UucHJlY2lzaW9uIDogcHJlY2lzaW9uXG4gICAgICAgICk7XG4gICAgICAgIG51bSA9IHJlcGVhdGluZ0RlY2ltYWxzKGNlLCBzKTtcbiAgICAgICAgaWYgKHNob3J0aGFuZEFsbG93ZWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB2YWx1ZS50b051bWJlcigpO1xuICAgICAgICAgIGlmICh2YWwudG9TdHJpbmcoKSA9PT0gbnVtKVxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikpXG4gICAgICBtZXRhZGF0YS5sYXRleCA9IG1ldGFkYXRhLmxhdGV4ID8/IGNlLnNlcmlhbGl6ZSh7IG51bSB9KTtcbiAgICByZXR1cm4gbWV0YWRhdGEubGF0ZXggIT09IHZvaWQgMCA/IHsgbnVtLCBsYXRleDogbWV0YWRhdGEubGF0ZXggfSA6IHNob3J0aGFuZEFsbG93ZWQgPyBudW0gOiB7IG51bSB9O1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4OC5Db21wbGV4KSB7XG4gICAgaWYgKHZhbHVlLmlzSW5maW5pdGUoKSlcbiAgICAgIHJldHVybiBzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBcIkNvbXBsZXhJbmZpbml0eVwiLCBtZXRhZGF0YSk7XG4gICAgaWYgKHZhbHVlLmlzTmFOKCkpIHtcbiAgICAgIG51bSA9IFwiTmFOXCI7XG4gICAgICBpZiAoY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikpXG4gICAgICAgIG1ldGFkYXRhLmxhdGV4ID0gbWV0YWRhdGEubGF0ZXggPz8gY2Uuc2VyaWFsaXplKHsgbnVtIH0pO1xuICAgICAgcmV0dXJuIG1ldGFkYXRhLmxhdGV4ICE9PSB2b2lkIDAgPyB7IG51bSwgbGF0ZXg6IG1ldGFkYXRhLmxhdGV4IH0gOiB7IG51bSB9O1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgY2UsXG4gICAgICBcIkNvbXBsZXhcIixcbiAgICAgIFtjZS5udW1iZXIodmFsdWUucmUpLCBjZS5udW1iZXIodmFsdWUuaW0pXSxcbiAgICAgIHtcbiAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICAgIHdpa2lkYXRhOiBcIlExMTU2N1wiXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBpZiAoaXNSYXRpb25hbCh2YWx1ZSkpIHtcbiAgICBjb25zdCBhbGxvd1JhdGlvbmFsID0gIWV4Y2x1c2lvbnMuaW5jbHVkZXMoXCJSYXRpb25hbFwiKTtcbiAgICBpZiAoc2hvcnRoYW5kQWxsb3dlZCAmJiBjZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMuc2hvcnRoYW5kcy5pbmNsdWRlcyhcImZ1bmN0aW9uXCIpICYmIGlzTWFjaGluZVJhdGlvbmFsKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlWzBdID09PSAxICYmIHZhbHVlWzFdID09PSAyICYmICFleGNsdXNpb25zLmluY2x1ZGVzKFwiSGFsZlwiKSlcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25TeW1ib2woY2UsIFwiSGFsZlwiLCBtZXRhZGF0YSk7XG4gICAgICByZXR1cm4gW2FsbG93UmF0aW9uYWwgPyBcIlJhdGlvbmFsXCIgOiBcIkRpdmlkZVwiLCB2YWx1ZVswXSwgdmFsdWVbMV1dO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbkZ1bmN0aW9uKFxuICAgICAgY2UsXG4gICAgICBhbGxvd1JhdGlvbmFsID8gXCJSYXRpb25hbFwiIDogXCJEaXZpZGVcIixcbiAgICAgIFtjZS5udW1iZXIodmFsdWVbMF0pLCBjZS5udW1iZXIodmFsdWVbMV0pXSxcbiAgICAgIHsgLi4ubWV0YWRhdGEgfVxuICAgICk7XG4gIH1cbiAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpXG4gICAgbnVtID0gXCJOYU5cIjtcbiAgZWxzZSBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpXG4gICAgbnVtID0gdmFsdWUgPiAwID8gXCIrSW5maW5pdHlcIiA6IFwiLUluZmluaXR5XCI7XG4gIGVsc2Uge1xuICAgIGlmIChzaG9ydGhhbmRBbGxvd2VkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIG51bSA9IHJlcGVhdGluZ0RlY2ltYWxzKGNlLCB2YWx1ZS50b1N0cmluZygpKTtcbiAgfVxuICBpZiAoY2UuanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhLmluY2x1ZGVzKFwibGF0ZXhcIikpXG4gICAgbWV0YWRhdGEubGF0ZXggPSBtZXRhZGF0YS5sYXRleCA/PyBjZS5zZXJpYWxpemUoeyBudW0gfSk7XG4gIHJldHVybiBtZXRhZGF0YS5sYXRleCAhPT0gdm9pZCAwID8geyBudW0sIGxhdGV4OiBtZXRhZGF0YS5sYXRleCB9IDogeyBudW0gfTtcbn1cbmZ1bmN0aW9uIF9lc2NhcGVKc29uU3RyaW5nKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiByZXBlYXRpbmdEZWNpbWFscyhjZSwgcykge1xuICBpZiAoIWNlLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5yZXBlYXRpbmdEZWNpbWFscylcbiAgICByZXR1cm4gcztcbiAgbGV0IFtfLCB3aG9sZXBhcnQsIGZyYWN0aW9uYWxQYXJ0LCBleHBvbmVudF0gPSBzLm1hdGNoKC9eKC4qKVxcLihbMC05XSspKFtlfEVdWy0rXT9bMC05XSspPyQvKSA/PyBbXTtcbiAgaWYgKCFmcmFjdGlvbmFsUGFydClcbiAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBsYXN0RGlnaXQgPSBmcmFjdGlvbmFsUGFydFtmcmFjdGlvbmFsUGFydC5sZW5ndGggLSAxXTtcbiAgZnJhY3Rpb25hbFBhcnQgPSBmcmFjdGlvbmFsUGFydC5zbGljZSgwLCAtMSk7XG4gIGNvbnN0IE1BWF9SRVBFQVRJTkdfUEFUVEVSTl9MRU5HVEggPSAxNjtcbiAgbGV0IHByZWZpeCA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhY3Rpb25hbFBhcnQubGVuZ3RoIC0gTUFYX1JFUEVBVElOR19QQVRURVJOX0xFTkdUSDsgaSsrKSB7XG4gICAgcHJlZml4ID0gZnJhY3Rpb25hbFBhcnQuc3Vic3RyaW5nKDAsIGkpO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDw9IE1BWF9SRVBFQVRJTkdfUEFUVEVSTl9MRU5HVEg7IGorKykge1xuICAgICAgY29uc3QgcmVwZXRlbmQgPSBmcmFjdGlvbmFsUGFydC5zdWJzdHJpbmcoaSwgaSArIGogKyAxKTtcbiAgICAgIGNvbnN0IHRpbWVzID0gTWF0aC5mbG9vcihcbiAgICAgICAgKGZyYWN0aW9uYWxQYXJ0Lmxlbmd0aCAtIHByZWZpeC5sZW5ndGgpIC8gcmVwZXRlbmQubGVuZ3RoXG4gICAgICApO1xuICAgICAgaWYgKHRpbWVzIDwgMylcbiAgICAgICAgYnJlYWs7XG4gICAgICBpZiAoKHByZWZpeCArIHJlcGV0ZW5kLnJlcGVhdCh0aW1lcyArIDEpKS5zdGFydHNXaXRoKGZyYWN0aW9uYWxQYXJ0KSkge1xuICAgICAgICBpZiAocmVwZXRlbmQgPT09IFwiMFwiKSB7XG4gICAgICAgICAgaWYgKGxhc3REaWdpdCA9PT0gXCIwXCIpXG4gICAgICAgICAgICByZXR1cm4gd2hvbGVwYXJ0ICsgXCIuXCIgKyBwcmVmaXggKyAoZXhwb25lbnQgPz8gXCJcIik7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdob2xlcGFydCArIFwiLlwiICsgcHJlZml4ICsgXCIoXCIgKyByZXBldGVuZCArIFwiKVwiICsgKGV4cG9uZW50ID8/IFwiXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmcmFjdGlvbmFsUGFydCArPSBsYXN0RGlnaXQ7XG4gIHdoaWxlIChmcmFjdGlvbmFsUGFydC5lbmRzV2l0aChcIjBcIikpXG4gICAgZnJhY3Rpb25hbFBhcnQgPSBmcmFjdGlvbmFsUGFydC5zbGljZSgwLCAtMSk7XG4gIGlmIChleHBvbmVudClcbiAgICByZXR1cm4gYCR7d2hvbGVwYXJ0fS4ke2ZyYWN0aW9uYWxQYXJ0fSR7ZXhwb25lbnQudG9Mb3dlckNhc2UoKX1gO1xuICByZXR1cm4gYCR7d2hvbGVwYXJ0fS4ke2ZyYWN0aW9uYWxQYXJ0fWA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2JveGVkLWRvbWFpbi50c1xudmFyIF9Cb3hlZERvbWFpbiA9IGNsYXNzIF9fQm94ZWREb21haW4gZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBkb20sIG1ldGFkYXRhKSB7XG4gICAgc3VwZXIoY2UsIG1ldGFkYXRhKTtcbiAgICB0aGlzLl92YWx1ZSA9IG1ha2VDYW5vbmljYWwoY2UsIGRvbSk7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKiBCb3hlZCBkb21haW5zIGFyZSBhbHdheXMgY2Fub25pY2FsLiAqL1xuICBnZXQgY2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmN0b3IgIT09IFwiSW52YWxpZERvbWFpblwiO1xuICB9XG4gIGdldCBqc29uKCkge1xuICAgIHJldHVybiBbXCJEb21haW5cIiwgc2VyaWFsaXplKHRoaXMuZW5naW5lLCB0aGlzLl92YWx1ZSldO1xuICB9XG4gIGdldCBsaXRlcmFsKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0IGN0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZVswXTtcbiAgfVxuICBnZXQgZG9tYWluQXJncygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnNsaWNlKDEpO1xuICB9XG4gIGdldCBkb21haW5BcmcxKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVbMV07XG4gIH1cbiAgZ2V0IGNvZG9tYWluKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuZG9tYWluKHRoaXMuX3ZhbHVlW3RoaXMuX3ZhbHVlLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBnZXQgaGFzaCgpIHtcbiAgICBpZiAodGhpcy5faGFzaCA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5faGFzaCA9IGhhc2hDb2RlKGhhc2godGhpcy5fdmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgfVxuICBpc0VxdWFsKHJocykge1xuICAgIHJldHVybiBpc0VxdWFsKHRoaXMuX3ZhbHVlLCByaHMpO1xuICB9XG4gIGlzU2FtZShyaHMpIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLl92YWx1ZSwgcmhzKTtcbiAgfVxuICBpcyhyaHMpIHtcbiAgICByZXR1cm4gaXNFcXVhbCh0aGlzLl92YWx1ZSwgcmhzKTtcbiAgfVxuICBpc0NvbXBhdGlibGUoZG9tLCBjb21wYXRpYmlsaXR5ID0gXCJjb3ZhcmlhbnRcIikge1xuICAgIGNvbnN0IGxocyA9IHRoaXMuX3ZhbHVlO1xuICAgIGNvbnN0IHJocyA9IGRvbSBpbnN0YW5jZW9mIF9fQm94ZWREb21haW4gPyBkb20uX3ZhbHVlIDogZG9tO1xuICAgIGNvbnN0IHJoc0N0b3IgPSBBcnJheS5pc0FycmF5KHJocykgPyByaHNbMF0gOiBudWxsO1xuICAgIGlmIChyaHNDdG9yKSB7XG4gICAgICBjb25zdCByaHNQYXJhbSA9IHJoc1sxXTtcbiAgICAgIGlmIChyaHNDdG9yID09PSBcIkNvdmFyaWFudFwiKVxuICAgICAgICByZXR1cm4gaXNTdWJkb21haW5PZjEobGhzLCByaHNQYXJhbSk7XG4gICAgICBpZiAocmhzQ3RvciA9PT0gXCJDb250cmF2YXJpYW50XCIpXG4gICAgICAgIHJldHVybiBpc1N1YmRvbWFpbk9mMShyaHNQYXJhbSwgbGhzKTtcbiAgICAgIGlmIChyaHNDdG9yID09PSBcIkludmFyaWFudFwiKVxuICAgICAgICByZXR1cm4gIWlzU3ViZG9tYWluT2YxKHJoc1BhcmFtLCBsaHMpICYmICFpc1N1YmRvbWFpbk9mMShsaHMsIHJoc1BhcmFtKTtcbiAgICAgIGlmIChyaHNDdG9yID09PSBcIkJpdmFyaWFudFwiKVxuICAgICAgICByZXR1cm4gaXNTdWJkb21haW5PZjEobGhzLCByaHNQYXJhbSkgJiYgaXNTdWJkb21haW5PZjEocmhzUGFyYW0sIGxocyk7XG4gICAgfVxuICAgIGlmIChjb21wYXRpYmlsaXR5ID09PSBcImNvdmFyaWFudFwiKVxuICAgICAgcmV0dXJuIGlzU3ViZG9tYWluT2YxKGxocywgcmhzKTtcbiAgICBpZiAoY29tcGF0aWJpbGl0eSA9PT0gXCJjb250cmF2YXJpYW50XCIpXG4gICAgICByZXR1cm4gaXNTdWJkb21haW5PZjEocmhzLCBsaHMpO1xuICAgIGlmIChjb21wYXRpYmlsaXR5ID09PSBcImJpdmFyaWFudFwiKVxuICAgICAgcmV0dXJuIGlzU3ViZG9tYWluT2YxKHJocywgbGhzKSAmJiBpc1N1YmRvbWFpbk9mMShsaHMsIHJocyk7XG4gICAgcmV0dXJuICFpc1N1YmRvbWFpbk9mMShyaHMsIGxocykgJiYgIWlzU3ViZG9tYWluT2YxKGxocywgcmhzKTtcbiAgfVxuICBtYXRjaChyaHMsIF9vcHRpb25zKSB7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX19Cb3hlZERvbWFpbikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5pc1NhbWUocmhzKSlcbiAgICAgIHJldHVybiB7fTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgaGVhZCgpIHtcbiAgICByZXR1cm4gXCJEb21haW5cIjtcbiAgfVxuICBnZXQgZG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5kb21haW4oXCJEb21haW5cIik7XG4gIH1cbiAgZ2V0IGlzTm90aGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPT09IFwiTm90aGluZ1wiO1xuICB9XG4gIGdldCBpc0Z1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmN0b3IgPT09IFwiRnVuY3Rpb25cIiB8fCB0aGlzLl92YWx1ZSA9PT0gXCJGdW5jdGlvblwiO1xuICB9XG4gIC8vIGdldCBpc1ByZWRpY2F0ZSgpOiBib29sZWFuIHtcbiAgLy8gICBpZiAodGhpcy5kb21haW5MaXRlcmFsID09PSAnUHJlZGljYXRlJykgcmV0dXJuIHRydWU7XG4gIC8vICAgaWYgKHRoaXMuZG9tYWluQ29uc3RydWN0b3IgIT09ICdGdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgLy8gICBjb25zdCByZXN1bHREb21haW4gPSB0aGlzLl92YWx1ZVt0aGlzLl92YWx1ZS5sZW5ndGhdO1xuICAvLyAgIGlmICghKHJlc3VsdERvbWFpbiBpbnN0YW5jZW9mIF9Eb21haW4pKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgcmV0dXJuIHJlc3VsdERvbWFpbi5pc0Jvb2xlYW47XG4gIC8vIH1cbiAgLy8gZ2V0IGlzTnVtZXJpY0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAvLyAgIGlmICh0aGlzLmRvbWFpbkxpdGVyYWwgPT09ICdOdW1lcmljRnVuY3Rpb24nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gICBpZiAodGhpcy5kb21haW5Db25zdHJ1Y3RvciAhPT0gJ0Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAvLyAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuZG9tYWluUGFyYW1zISlcbiAgLy8gICAgIGlmICghaXNOdW1lcmljU3ViZG9tYWluKGFyZywgJ051bWJlcicpKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgcmV0dXJuIHRydWU7XG4gIC8vIH1cbiAgLy8gZ2V0IGlzQm9vbGVhbigpOiBib29sZWFuIHtcbiAgLy8gICBjb25zdCBkb20gPSB0aGlzLmRvbWFpbkxpdGVyYWw7XG4gIC8vICAgcmV0dXJuIGRvbSA9PT0gJ0Jvb2xlYW4nIHx8IGRvbSA9PT0gJ01heWJlQm9vbGVhbic7XG4gIC8vIH1cbiAgLy8gZ2V0IGlzUmVhbEZ1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAvLyAgIGlmICh0aGlzLmRvbWFpbkxpdGVyYWwgPT09ICdSZWFsRnVuY3Rpb24nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gICBpZiAodGhpcy5kb21haW5Db25zdHJ1Y3RvciAhPT0gJ0Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAvLyAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuZG9tYWluUGFyYW1zISlcbiAgLy8gICAgIGlmICghaXNOdW1lcmljU3ViZG9tYWluKGFyZywgJ0V4dGVuZGVkUmVhbE51bWJlcicpKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgcmV0dXJuIHRydWU7XG4gIC8vIH1cbiAgZ2V0IGlzTnVtZXJpYygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbXBhdGlibGUodGhpcy5lbmdpbmUuZG9tYWluKFwiTnVtYmVyXCIpKTtcbiAgfVxuICAvLyBnZXQgaXNMb2dpY09wZXJhdG9yKCk6IGJvb2xlYW4ge1xuICAvLyAgIGlmICh0aGlzLmRvbWFpbkxpdGVyYWwgPT09ICdMb2dpY09wZXJhdG9yJykgcmV0dXJuIHRydWU7XG4gIC8vICAgaWYgKCF0aGlzLmNvZG9tYWluPy5pc0Jvb2xlYW4pIHJldHVybiBmYWxzZTtcbiAgLy8gICBjb25zdCBwYXJhbXMgPSB0aGlzLmRvbWFpblBhcmFtcyE7XG4gIC8vICAgaWYgKHBhcmFtcy5sZW5ndGggPCAxIHx8IHBhcmFtcy5sZW5ndGggPiAyKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgaWYgKCFwYXJhbXNbMF0uaXNCb29sZWFuKSByZXR1cm4gZmFsc2U7XG4gIC8vICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlO1xuICAvLyAgIGlmICghcGFyYW1zWzFdLmlzQm9vbGVhbikgcmV0dXJuIGZhbHNlO1xuICAvLyAgIHJldHVybiB0cnVlO1xuICAvLyB9XG4gIGdldCBpc1JlbGF0aW9uYWxPcGVyYXRvcigpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgPT09IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5jdG9yICE9PSBcIkZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZG9tYWluQXJncy5sZW5ndGggIT09IDIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmNvZG9tYWluLmlzQ29tcGF0aWJsZShcIk1heWJlQm9vbGVhblwiKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbmZ1bmN0aW9uIGJveERvbWFpbihjZSwgZG9tLCBtZXRhZGF0YSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShkb20pICYmIGRvbVswXSA9PT0gXCJEb21haW5cIilcbiAgICBkb20gPSBkb21bMV07XG4gIGlmIChkb20gaW5zdGFuY2VvZiBfQm94ZWREb21haW4pXG4gICAgcmV0dXJuIGRvbTtcbiAgaWYgKGRvbSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgIGRvbSA9IGRvbS5qc29uO1xuICBpZiAodHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGV4cHIgPSBET01BSU5fQUxJQVNbZG9tXTtcbiAgICBpZiAoZXhwcilcbiAgICAgIHJldHVybiBib3hEb21haW4oY2UsIGV4cHIpO1xuICAgIGlmICghaXNEb21haW5MaXRlcmFsKGRvbSkpXG4gICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIGEgZG9tYWluIGxpdGVyYWwsIGdvdCBcIiArIGRvbSk7XG4gICAgcmV0dXJuIG5ldyBfQm94ZWREb21haW4oY2UsIGRvbSwgbWV0YWRhdGEpO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShkb20pIHx8IGRvbS5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCBhIHZhbGlkIGRvbWFpblwiKTtcbiAgY29uc3QgY29uc3RydWN0b3IgPSBkb21bMF07XG4gIGlmICghRE9NQUlOX0NPTlNUUlVDVE9SUy5pbmNsdWRlcyhjb25zdHJ1Y3RvcikpXG4gICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCBkb21haW4gY29uc3RydWN0b3IsIGdvdCBcIiArIGNvbnN0cnVjdG9yKTtcbiAgcmV0dXJuIG5ldyBfQm94ZWREb21haW4oY2UsIGRvbSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gbWFrZUNhbm9uaWNhbChjZSwgZG9tKSB7XG4gIGlmIChkb20gPT09IHZvaWQgMCB8fCB0eXBlb2YgZG9tID09PSBcIm51bWJlclwiKVxuICAgIHRocm93IEVycm9yKFwiRXhwZWN0ZWQgYSBkb21haW4gZXhwcmVzc2lvblwiKTtcbiAgaWYgKGRvbSBpbnN0YW5jZW9mIF9Cb3hlZERvbWFpbilcbiAgICByZXR1cm4gZG9tLl92YWx1ZTtcbiAgaWYgKHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoIWlzRG9tYWluTGl0ZXJhbChkb20pKVxuICAgICAgdGhyb3cgRXJyb3IoXCJVbmtub3duIGRvbWFpbiBsaXRlcmFsXCIpO1xuICAgIHJldHVybiBkb207XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KGRvbSkgJiYgdHlwZW9mIGRvbSA9PT0gXCJvYmplY3RcIilcbiAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIGEgZG9tYWluIGV4cHJlc3Npb25cIik7XG4gIGlmICghZG9tKVxuICAgIDtcbiAgY29uc3QgY3RvciA9IGRvbVswXTtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGN0b3IpO1xuICBpZiAoY3RvciA9PT0gXCJSYW5nZVwiKSB7XG4gICAgaWYgKGRvbS5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gXCJJbnRlZ2VyXCI7XG4gICAgbGV0IGZpcnN0ID0gMTtcbiAgICBsZXQgbGFzdCA9IEluZmluaXR5O1xuICAgIGlmIChkb20ubGVuZ3RoID09PSAyKSB7XG4gICAgICBsYXN0ID0gZG9tWzFdO1xuICAgIH0gZWxzZSBpZiAoZG9tLmxlbmd0aCA9PT0gMykge1xuICAgICAgZmlyc3QgPSBkb21bMV07XG4gICAgICBsYXN0ID0gZG9tWzJdO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdE51bSA9IGFzUmFuZ2VCb3VuZChjZSwgZmlyc3QpO1xuICAgIGNvbnN0IGxhc3ROdW0gPSBhc1JhbmdlQm91bmQoY2UsIGxhc3QpO1xuICAgIGlmIChmaXJzdE51bSA9PT0gbnVsbCB8fCBsYXN0TnVtID09PSBudWxsKVxuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcmFuZ2UgWyR7Zmlyc3ROdW19LCAke2xhc3ROdW19XSBgKTtcbiAgICBpZiAobGFzdE51bSA8IGZpcnN0TnVtKVxuICAgICAgW2ZpcnN0LCBsYXN0XSA9IFtsYXN0LCBmaXJzdF07XG4gICAgaWYgKGZpcnN0TnVtID09PSAtSW5maW5pdHkgJiYgbGFzdE51bSA9PT0gSW5maW5pdHkpXG4gICAgICByZXR1cm4gXCJJbnRlZ2VyXCI7XG4gICAgaWYgKGZpcnN0TnVtID09PSAxICYmIGxhc3ROdW0gPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIFwiUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgaWYgKGZpcnN0TnVtID09PSAwICYmIGxhc3ROdW0gPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIFwiTm9uTmVnYXRpdmVJbnRlZ2VyXCI7XG4gICAgaWYgKGZpcnN0TnVtID09PSAtSW5maW5pdHkgJiYgbGFzdE51bSA9PT0gLTEpXG4gICAgICByZXR1cm4gXCJOZWdhdGl2ZUludGVnZXJcIjtcbiAgICBpZiAoZmlyc3ROdW0gPT09IC1JbmZpbml0eSAmJiBsYXN0TnVtID09PSAwKVxuICAgICAgcmV0dXJuIFwiTm9uUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgcmV0dXJuIFtcIlJhbmdlXCIsIGNlLm51bWJlcihmaXJzdE51bSksIGNlLm51bWJlcihsYXN0TnVtKV07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiSW50ZXJ2YWxcIikge1xuICAgIGlmIChkb20ubGVuZ3RoICE9PSAzKVxuICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIHJhbmdlIFwiICsgZG9tKTtcbiAgICBsZXQgW2lzTGVmdE9wZW4sIGZpcnN0XSA9IG1heWJlT3BlbihjZSwgZG9tWzFdKTtcbiAgICBsZXQgW2lzUmlnaHRPcGVuLCBsYXN0XSA9IG1heWJlT3BlbihjZSwgZG9tWzJdKTtcbiAgICBpZiAoZmlyc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gbnVsbClcbiAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCByYW5nZSBcIiArIGRvbSk7XG4gICAgaWYgKGxhc3QgPCBmaXJzdCkge1xuICAgICAgW2ZpcnN0LCBsYXN0XSA9IFtsYXN0LCBmaXJzdF07XG4gICAgICBbaXNMZWZ0T3BlbiwgaXNSaWdodE9wZW5dID0gW2lzUmlnaHRPcGVuLCBpc0xlZnRPcGVuXTtcbiAgICB9XG4gICAgaWYgKGZpcnN0ID09PSAwICYmIGxhc3QgPT09IEluZmluaXR5KVxuICAgICAgcmV0dXJuIGlzTGVmdE9wZW4gPyBcIlBvc2l0aXZlTnVtYmVyXCIgOiBcIk5vbk5lZ2F0aXZlTnVtYmVyXCI7XG4gICAgaWYgKGZpcnN0ID09PSAtSW5maW5pdHkgJiYgbGFzdCA9PT0gMClcbiAgICAgIHJldHVybiBpc1JpZ2h0T3BlbiA/IFwiTmVnYXRpdmVOdW1iZXJcIiA6IFwiTm9uUG9zaXRpdmVOdW1iZXJcIjtcbiAgICByZXR1cm4gW1xuICAgICAgXCJJbnRlcnZhbFwiLFxuICAgICAgaXNMZWZ0T3BlbiA/IFtcIk9wZW5cIiwgY2UubnVtYmVyKGZpcnN0KV0gOiBjZS5udW1iZXIoZmlyc3QpLFxuICAgICAgaXNSaWdodE9wZW4gPyBbXCJPcGVuXCIsIGNlLm51bWJlcihsYXN0KV0gOiBjZS5udW1iZXIobGFzdClcbiAgICBdO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgLi4uZG9tLnNsaWNlKDEpLm1hcCgoeCkgPT4gbWFrZUNhbm9uaWNhbChjZSwgeCkpXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJEaWN0aW9uYXJ5XCIpIHtcbiAgICByZXR1cm4gW1wiRGljdGlvbmFyeVwiLCBtYWtlQ2Fub25pY2FsKGNlLCBkb21bMV0pXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJMaXN0XCIpIHtcbiAgICByZXR1cm4gW1wiTGlzdFwiLCBtYWtlQ2Fub25pY2FsKGNlLCBkb21bMV0pXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJUdXBsZVwiKSB7XG4gICAgcmV0dXJuIFtcIlR1cGxlXCIsIC4uLmRvbS5zbGljZSgxKS5tYXAoKHgpID0+IG1ha2VDYW5vbmljYWwoY2UsIHgpKV07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiVW5pb25cIikge1xuICAgIHJldHVybiBbXCJVbmlvblwiLCAuLi5kb20uc2xpY2UoMSkubWFwKCh4KSA9PiBtYWtlQ2Fub25pY2FsKGNlLCB4KSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkludGVyc2VjdGlvblwiKSB7XG4gICAgcmV0dXJuIFtcIkludGVyc2VjdGlvblwiLCAuLi5kb20uc2xpY2UoMSkubWFwKCh4KSA9PiBtYWtlQ2Fub25pY2FsKGNlLCB4KSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkNvdmFyaWFudFwiIHx8IGN0b3IgPT09IFwiQ29udHJhdmFyaWFudFwiIHx8IGN0b3IgPT09IFwiSW52YXJpYW50XCIpIHtcbiAgICByZXR1cm4gW2N0b3IsIG1ha2VDYW5vbmljYWwoY2UsIGRvbVsxXSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIk1heWJlXCIpIHtcbiAgICByZXR1cm4gW1wiTWF5YmVcIiwgbWFrZUNhbm9uaWNhbChjZSwgZG9tWzFdKV07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiU2VxdWVuY2VcIikge1xuICAgIHJldHVybiBbXCJTZXF1ZW5jZVwiLCBtYWtlQ2Fub25pY2FsKGNlLCBkb21bMV0pXTtcbiAgfVxuICBpZiAoY3RvciA9PT0gXCJIZWFkXCIpIHtcbiAgICByZXR1cm4gW1wiSGVhZFwiLCBkb21bMV1dO1xuICB9XG4gIGlmIChjdG9yID09PSBcIlN5bWJvbFwiKSB7XG4gICAgcmV0dXJuIFtcIlN5bWJvbFwiLCBkb21bMV1dO1xuICB9XG4gIGlmIChjdG9yID09PSBcIlZhbHVlXCIpIHtcbiAgICByZXR1cm4gW1wiVmFsdWVcIiwgY2UuYm94KGRvbVsxXSldO1xuICB9XG4gIGlmIChjdG9yID09PSBcIkludmFsaWREb21haW5cIikge1xuICAgIHJldHVybiBbXCJJbnZhbGlkRG9tYWluXCIsIGRvbVsxXV07XG4gIH1cbiAgdGhyb3cgRXJyb3IoXCJVbmV4cGVjdGVkIGRvbWFpbiBjb25zdHJ1Y3RvciBcIiArIGN0b3IpO1xufVxuZnVuY3Rpb24gYXNSYW5nZUJvdW5kKGNlLCBleHByKSB7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gZXhwcjtcbiAgY29uc3QgeCA9IGNlLmJveChleHByKS5ldmFsdWF0ZSgpO1xuICByZXR1cm4geC5pc0luZmluaXR5ID8geC5pc1Bvc2l0aXZlID8gSW5maW5pdHkgOiAtSW5maW5pdHkgOiBhc1NtYWxsSW50ZWdlcih4KTtcbn1cbmZ1bmN0aW9uIG1heWJlT3BlbihjZSwgZXhwcikge1xuICBpZiAoQXJyYXkuaXNBcnJheShleHByKSAmJiBleHByWzBdID09PSBcIk9wZW5cIilcbiAgICByZXR1cm4gW3RydWUsIGFzUmFuZ2VCb3VuZChjZSwgZXhwclsxXSldO1xuICByZXR1cm4gW2ZhbHNlLCBhc1JhbmdlQm91bmQoY2UsIGV4cHIpXTtcbn1cbmZ1bmN0aW9uIGlzRG9tYWluKGV4cHIpIHtcbiAgaWYgKGV4cHIgaW5zdGFuY2VvZiBfQm94ZWREb21haW4pXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChleHByIGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pXG4gICAgZXhwciA9IGV4cHIuanNvbjtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBpc0RvbWFpbkxpdGVyYWwoZXhwcik7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgaWYgKGV4cHIubGVuZ3RoIDw9IDEpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY3RvciA9IGV4cHJbMF07XG4gICAgaWYgKHR5cGVvZiBjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFET01BSU5fQ09OU1RSVUNUT1JTLmluY2x1ZGVzKGN0b3IpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjdG9yID09PSBcIkludmFsaWREb21haW5cIilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY3RvciA9PT0gXCJMaXN0XCIpXG4gICAgICByZXR1cm4gZXhwci5sZW5ndGggPT09IDIgJiYgaXNWYWxpZERvbWFpbihleHByWzFdKTtcbiAgICBpZiAoY3RvciA9PT0gXCJUdXBsZVwiIHx8IGN0b3IgPT09IFwiRnVuY3Rpb25cIiB8fCBjdG9yID09PSBcIk1heWJlXCIgfHwgY3RvciA9PT0gXCJTZXF1ZW5jZVwiIHx8IGN0b3IgPT09IFwiSW50ZXJzZWN0aW9uXCIgfHwgY3RvciA9PT0gXCJVbmlvblwiKVxuICAgICAgcmV0dXJuIGV4cHIuc2xpY2UoMSwgLTEpLmV2ZXJ5KCh4KSA9PiBpc1ZhbGlkRG9tYWluKHgpKTtcbiAgICByZXR1cm4gZXhwci5ldmVyeSgoeCkgPT4geCAhPT0gbnVsbCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNWYWxpZERvbWFpbihleHByKSB7XG4gIGlmIChleHByIGluc3RhbmNlb2YgX0JveGVkRG9tYWluKVxuICAgIHJldHVybiBleHByLmlzVmFsaWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpICYmIGV4cHJbMF0gPT09IFwiSW52YWxpZERvbWFpblwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzRG9tYWluKGV4cHIpO1xufVxuZnVuY3Rpb24gaXNTdWJkb21haW5PZjEobGhzLCByaHMpIHtcbiAgY29uc3QgW3Jlc3VsdCwgcmVzdF0gPSBpc1N1YmRvbWFpbk9mKFtsaHNdLCByaHMpO1xuICBpZiAocmVzdWx0ICYmIHJlc3QubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1N1YmRvbWFpbk9mKHhsaHMsIHJocykge1xuICBsZXQgbGhzID0geGxocy5zaGlmdCgpO1xuICBjb25zdCByaHNMaXRlcmFsID0gdHlwZW9mIHJocyA9PT0gXCJzdHJpbmdcIiA/IHJocyA6IG51bGw7XG4gIGlmIChyaHNMaXRlcmFsID09PSBcIkFueXRoaW5nXCIpXG4gICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgY29uc3QgbGhzTGl0ZXJhbCA9IHR5cGVvZiBsaHMgPT09IFwic3RyaW5nXCIgPyBsaHMgOiBudWxsO1xuICBpZiAobGhzTGl0ZXJhbCAmJiByaHNMaXRlcmFsKSB7XG4gICAgaWYgKGxoc0xpdGVyYWwgPT09IHJoc0xpdGVyYWwpXG4gICAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICAgIHJldHVybiBbYW5jZXN0b3JzKGxoc0xpdGVyYWwpLmluY2x1ZGVzKHJoc0xpdGVyYWwpLCB4bGhzXTtcbiAgfVxuICBpZiAocmhzTGl0ZXJhbCkge1xuICAgIGlmICghbGhzKVxuICAgICAgO1xuICAgIGNvbnN0IGxoc0NvbnN0cnVjdG9yID0gbGhzWzBdO1xuICAgIGlmIChsaHNDb25zdHJ1Y3RvciA9PT0gXCJGdW5jdGlvblwiKVxuICAgICAgcmV0dXJuIFtyaHNMaXRlcmFsID09PSBcIkZ1bmN0aW9uXCIsIHhsaHNdO1xuICAgIGlmIChsaHNDb25zdHJ1Y3RvciA9PT0gXCJEaWN0aW9uYXJ5XCIpXG4gICAgICByZXR1cm4gW3Joc0xpdGVyYWwgPT09IFwiRGljdGlvbmFyeVwiLCB4bGhzXTtcbiAgICBpZiAobGhzQ29uc3RydWN0b3IgPT09IFwiTGlzdFwiKVxuICAgICAgcmV0dXJuIFtyaHNMaXRlcmFsID09PSBcIkxpc3RcIiwgeGxoc107XG4gICAgaWYgKGxoc0NvbnN0cnVjdG9yID09PSBcIlR1cGxlXCIpXG4gICAgICByZXR1cm4gW3Joc0xpdGVyYWwgPT09IFwiVHVwbGVcIiwgeGxoc107XG4gICAgaWYgKGxoc0NvbnN0cnVjdG9yID09PSBcIkludGVyc2VjdGlvblwiKSB7XG4gICAgfVxuICAgIGlmIChsaHNDb25zdHJ1Y3RvciA9PT0gXCJJbnRlcnZhbFwiKVxuICAgICAgcmV0dXJuIFtpc1N1YmRvbWFpbk9mMShcIkV4dGVuZGVkUmVhbE51bWJlclwiLCByaHNMaXRlcmFsKSwgeGxoc107XG4gICAgaWYgKGxoc0NvbnN0cnVjdG9yID09PSBcIlJhbmdlXCIpXG4gICAgICByZXR1cm4gW2lzU3ViZG9tYWluT2YxKFwiSW50ZWdlclwiLCByaHNMaXRlcmFsKSwgeGxoc107XG4gICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgfVxuICBjb25zdCByaHNDb25zdHJ1Y3RvciA9IHJoc1swXTtcbiAgaWYgKHJoc0NvbnN0cnVjdG9yID09PSBcIkZ1bmN0aW9uXCIpIHtcbiAgICBpZiAobGhzTGl0ZXJhbCA9PT0gXCJGdW5jdGlvblwiKVxuICAgICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgICBpZiAobGhzTGl0ZXJhbClcbiAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgIGlmIChsaHNbMF0gIT09IFwiRnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgIGlmIChsaHMubGVuZ3RoID09PSAxICYmIHJocy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICAgIGlmICghaXNTdWJkb21haW5PZjEoXG4gICAgICBsaHNbbGhzLmxlbmd0aCAtIDFdLFxuICAgICAgcmhzW3Jocy5sZW5ndGggLSAxXVxuICAgICkpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBjb25zdCBsaHNQYXJhbXMgPSBsaHMuc2xpY2UoMSwgLTEpO1xuICAgIGxldCByaHNQYXJhbXMgPSByaHMuc2xpY2UoMSwgLTEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxoc1BhcmFtcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGlmIChyaHNQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGxoc0N0b3IgPSBBcnJheS5pc0FycmF5KGxoc1BhcmFtc1tpXSkgPyBsaHNQYXJhbXNbaV1bMF0gOiBudWxsO1xuICAgICAgICBpZiAobGhzQ3RvciAhPT0gXCJNYXliZVwiKVxuICAgICAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgICAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoMiA9IGZhbHNlO1xuICAgICAgICBbbWF0Y2gyLCByaHNQYXJhbXNdID0gaXNTdWJkb21haW5PZihyaHNQYXJhbXMsIGxoc1BhcmFtc1tpXSk7XG4gICAgICAgIGlmICghbWF0Y2gyKVxuICAgICAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3Joc1BhcmFtcy5sZW5ndGggPT09IDAsIHhsaHNdO1xuICB9XG4gIGlmIChyaHNDb25zdHJ1Y3RvciA9PT0gXCJJbnRlcnNlY3Rpb25cIikge1xuICAgIHJldHVybiBbXG4gICAgICByaHMuc2xpY2UoMSwgLTEpLmV2ZXJ5KFxuICAgICAgICAoeCkgPT4gaXNTdWJkb21haW5PZjEobGhzLCB4KVxuICAgICAgKSxcbiAgICAgIHhsaHNcbiAgICBdO1xuICB9XG4gIGlmIChyaHNDb25zdHJ1Y3RvciA9PT0gXCJVbmlvblwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHJocy5zbGljZSgxLCAtMSkuc29tZSgoeCkgPT4gaXNTdWJkb21haW5PZjEobGhzLCB4KSksXG4gICAgICB4bGhzXG4gICAgXTtcbiAgfVxuICBpZiAocmhzQ29uc3RydWN0b3IgPT09IFwiTWF5YmVcIikge1xuICAgIGlmIChsaHNMaXRlcmFsID09PSBcIk5vdGhpbmdcIilcbiAgICAgIHJldHVybiBbdHJ1ZSwgeGxoc107XG4gICAgcmV0dXJuIGlzU3ViZG9tYWluT2YoXG4gICAgICBbbGhzLCAuLi54bGhzXSxcbiAgICAgIHJoc1sxXVxuICAgICk7XG4gIH1cbiAgaWYgKHJoc0NvbnN0cnVjdG9yID09PSBcIlNlcXVlbmNlXCIpIHtcbiAgICBjb25zdCBzZXEgPSByaHNbMV07XG4gICAgaWYgKCFpc1N1YmRvbWFpbk9mMShsaHMsIHNlcSkpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBsaHMgPSB4bGhzLnNoaWZ0KCk7XG4gICAgbGV0IG1hdGNoMiA9IHRydWU7XG4gICAgd2hpbGUgKHhsaHMubGVuZ3RoID4gMCAmJiBtYXRjaDIpIHtcbiAgICAgIFttYXRjaDIsIHhsaHNdID0gaXNTdWJkb21haW5PZih4bGhzLCBzZXEpO1xuICAgICAgbGhzID0geGxocy5zaGlmdCgpO1xuICAgIH1cbiAgICByZXR1cm4gW3RydWUsIHhsaHNdO1xuICB9XG4gIGlmIChyaHNDb25zdHJ1Y3RvciA9PT0gXCJUdXBsZVwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxocykgfHwgbGhzWzBdICE9PSBcIlR1cGxlXCIpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBpZiAobGhzLmxlbmd0aCA+IHJocy5sZW5ndGgpXG4gICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSByaHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBpZiAoIWxoc1tpXSB8fCAhaXNTdWJkb21haW5PZjEoXG4gICAgICAgIGxoc1tpXSxcbiAgICAgICAgcmhzW2ldXG4gICAgICApKVxuICAgICAgICByZXR1cm4gW2ZhbHNlLCB4bGhzXTtcbiAgICB9XG4gICAgcmV0dXJuIFt0cnVlLCB4bGhzXTtcbiAgfVxuICBpZiAocmhzQ29uc3RydWN0b3IgPT09IFwiUmFuZ2VcIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsaHMpIHx8IGxoc1swXSAhPT0gXCJSYW5nZVwiKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgeGxoc107XG4gICAgY29uc3QgbGhzTWluID0gYXNGbG9hdChsaHNbMV0pO1xuICAgIGNvbnN0IGxoc01heCA9IGFzRmxvYXQobGhzWzJdKTtcbiAgICBjb25zdCByaHNNaW4gPSBhc0Zsb2F0KHJoc1sxXSk7XG4gICAgY29uc3QgcmhzTWF4ID0gYXNGbG9hdChyaHNbMl0pO1xuICAgIHJldHVybiBbXG4gICAgICBsaHNNaW4gIT09IG51bGwgJiYgbGhzTWF4ICE9PSBudWxsICYmIHJoc01pbiAhPT0gbnVsbCAmJiByaHNNYXggIT09IG51bGwgJiYgbGhzTWluID49IHJoc01pbiAmJiBsaHNNYXggPD0gcmhzTWF4LFxuICAgICAgeGxoc1xuICAgIF07XG4gIH1cbiAgaWYgKHJoc0NvbnN0cnVjdG9yID09PSBcIkludGVydmFsXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGhzKSB8fCBsaHNbMF0gIT09IFwiSW50ZXJ2YWxcIilcbiAgICAgIHJldHVybiBbZmFsc2UsIHhsaHNdO1xuICAgIGNvbnN0IGxoc01pbiA9IGFzRmxvYXQobGhzWzFdKTtcbiAgICBjb25zdCBsaHNNYXggPSBhc0Zsb2F0KGxoc1syXSk7XG4gICAgY29uc3QgcmhzTWluID0gYXNGbG9hdChyaHNbMV0pO1xuICAgIGNvbnN0IHJoc01heCA9IGFzRmxvYXQocmhzWzJdKTtcbiAgICByZXR1cm4gW1xuICAgICAgbGhzTWluICE9PSBudWxsICYmIGxoc01heCAhPT0gbnVsbCAmJiByaHNNaW4gIT09IG51bGwgJiYgcmhzTWF4ICE9PSBudWxsICYmIGxoc01pbiA+PSByaHNNaW4gJiYgbGhzTWF4IDw9IHJoc01heCxcbiAgICAgIHhsaHNcbiAgICBdO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIGRvbWFpbiBjb25zdHJ1Y3RvciBcIiArIHJoc0NvbnN0cnVjdG9yKTtcbiAgcmV0dXJuIFtmYWxzZSwgeGxoc107XG59XG5mdW5jdGlvbiBzaGFyZWRBbmNlc3RvckRvbWFpbihhLCBiKSB7XG4gIGNvbnN0IGFMaXRlcmFsID0gZG9tYWluTGl0ZXJhbEFuY2VzdG9yKGEpO1xuICBjb25zdCBiTGl0ZXJhbCA9IGRvbWFpbkxpdGVyYWxBbmNlc3RvcihiKTtcbiAgY29uc3QgYUFuY2VzdG9ycyA9IFthTGl0ZXJhbCwgLi4uYW5jZXN0b3JzKGFMaXRlcmFsKV07XG4gIGNvbnN0IGJBbmNlc3RvcnMgPSBbYkxpdGVyYWwsIC4uLmFuY2VzdG9ycyhiTGl0ZXJhbCldO1xuICB3aGlsZSAoIWJBbmNlc3RvcnMuaW5jbHVkZXMoYUFuY2VzdG9yc1swXSkpXG4gICAgYUFuY2VzdG9ycy5zaGlmdCgpO1xuICByZXR1cm4gYS5lbmdpbmUuZG9tYWluKGFBbmNlc3RvcnNbMF0pO1xufVxuZnVuY3Rpb24gZG9tYWluTGl0ZXJhbEFuY2VzdG9yKGRvbSkge1xuICBsZXQgcmVzdWx0ID0gZG9tLmxpdGVyYWw7XG4gIGlmIChyZXN1bHQpXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgcmVzdWx0ID0gZG9tLmN0b3I7XG4gIGlmIChyZXN1bHQgPT09IFwiTWF5YmVcIilcbiAgICByZXR1cm4gXCJBbnl0aGluZ1wiO1xuICBpZiAocmVzdWx0ID09PSBcIkludGVydmFsXCIpXG4gICAgcmV0dXJuIFwiUmVhbE51bWJlclwiO1xuICBpZiAocmVzdWx0ID09PSBcIlJhbmdlXCIpXG4gICAgcmV0dXJuIFwiSW50ZWdlclwiO1xuICBpZiAocmVzdWx0ID09PSBcIkhlYWRcIilcbiAgICByZXR1cm4gXCJGdW5jdGlvblwiO1xuICBpZiAocmVzdWx0ID09PSBcIlVuaW9uXCIpXG4gICAgcmV0dXJuIFwiQW55dGhpbmdcIjtcbiAgaWYgKHJlc3VsdCA9PT0gXCJJbnRlcnNlY3Rpb25cIilcbiAgICByZXR1cm4gXCJBbnl0aGluZ1wiO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2VyaWFsaXplKGNlLCBkb20pIHtcbiAgaWYgKGRvbSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgIHJldHVybiBkb20uanNvbjtcbiAgaWYgKHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGRvbTtcbiAgaWYgKGRvbVswXSA9PT0gXCJJbnZhbGlkRG9tYWluXCIpIHtcbiAgICByZXR1cm4gW1wiSW52YWxpZERvbWFpblwiLCBzZXJpYWxpemUoY2UsIGRvbVsxXSldO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IFtzZXJpYWxpemVKc29uU3ltYm9sKGNlLCBkb21bMF0pXTtcbiAgaWYgKGRvbS5sZW5ndGggPiAxKVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRvbS5sZW5ndGggLSAxOyBpKyspXG4gICAgICByZXN1bHQucHVzaChzZXJpYWxpemUoY2UsIGRvbVtpXSkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaGFzaChkb20pIHtcbiAgaWYgKHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIFwiZG9tYWluOlwiICsgZG9tO1xuICBsZXQgcyA9IFwiZG9tYWluOlwiICsgdGhpcy5jdG9yO1xuICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmRvbWFpbkFyZ3MpXG4gICAgcyArPSBcIjpcIiArIGhhc2goYXJnKTtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBpc0VxdWFsKGxocywgcmhzKSB7XG4gIGlmICh0eXBlb2YgcmhzID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSA9PT0gcmhzO1xuICBpZiAocmhzIGluc3RhbmNlb2YgX0JveGVkRG9tYWluKVxuICAgIHJldHVybiBpc0VxdWFsKGxocywgcmhzLl92YWx1ZSk7XG4gIGlmICh0eXBlb2YgbGhzID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBsaHMgPT09IHJocztcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkobGhzKSk7XG4gIGlmICghQXJyYXkuaXNBcnJheShyaHMpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGxoc1swXSAhPT0gcmhzWzBdKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHJocy5sZW5ndGggIT09IGxocy5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBsaHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgaWYgKGxoc1tpXSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKSB7XG4gICAgICBpZiAoIShyaHNbaV0gaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghcmhzW2ldLmlzRXF1YWwocmhzW2ldKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxoc1tpXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHR5cGVvZiByaHNbaV0gIT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChsaHNbaV0gIT09IHJoc1tpXSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwobGhzW2ldLCByaHNbaV0pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi92YWxpZGF0ZS50c1xuZnVuY3Rpb24gdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBvcHMyLCBjb3VudCkge1xuICBpZiAob3BzMi5sZW5ndGggPT09IGNvdW50KVxuICAgIHJldHVybiBvcHMyO1xuICBjb25zdCB4cyA9IFsuLi5vcHMyLnNsaWNlKDAsIGNvdW50KV07XG4gIGxldCBpID0gTWF0aC5taW4oY291bnQsIG9wczIubGVuZ3RoKTtcbiAgd2hpbGUgKGkgPCBjb3VudCkge1xuICAgIHhzLnB1c2goY2UuZXJyb3IoXCJtaXNzaW5nXCIpKTtcbiAgICBpICs9IDE7XG4gIH1cbiAgd2hpbGUgKGkgPCBvcHMyLmxlbmd0aCkge1xuICAgIHhzLnB1c2goY2UuZXJyb3IoXCJ1bmV4cGVjdGVkLWFyZ3VtZW50XCIsIG9wczJbaV0pKTtcbiAgICBpICs9IDE7XG4gIH1cbiAgcmV0dXJuIHhzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVOdW1lcmljQXJncyhjZSwgb3BzMiwgY291bnQpIHtcbiAgaWYgKCFjZS5zdHJpY3QpXG4gICAgcmV0dXJuIG9wczI7XG4gIGxldCB4cztcbiAgaWYgKGNvdW50ID09PSB2b2lkIDApXG4gICAgeHMgPSBvcHMyO1xuICBlbHNlIHtcbiAgICB4cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE1hdGgubWF4KGNvdW50IC0gMSwgb3BzMi5sZW5ndGggLSAxKTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IGNvdW50IC0gMSlcbiAgICAgICAgeHMucHVzaChjZS5lcnJvcihcInVuZXhwZWN0ZWQtYXJndW1lbnRcIiwgb3BzMltpXSkpO1xuICAgICAgZWxzZVxuICAgICAgICB4cy5wdXNoKG9wczJbaV0gIT09IHZvaWQgMCA/IGNlLmJveChvcHMyW2ldKSA6IGNlLmVycm9yKFwibWlzc2luZ1wiKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB4cy5tYXAoXG4gICAgKG9wMykgPT4gb3AzICYmICFvcDMuaXNWYWxpZCB8fCBvcDMuaXNOdW1iZXIgPyBvcDMgOiBjZS5lcnJvcihbXCJpbmNvbXBhdGlibGUtZG9tYWluXCIsIFwiTnVtYmVyXCIsIG9wMy5kb21haW5dLCBvcDMpXG4gICk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVNpZ25hdHVyZShzaWcsIG9wczIsIGNvZG9tYWluKSB7XG4gIGNvbnN0IGNlID0gc2lnLmVuZ2luZTtcbiAgaWYgKCFjZS5zdHJpY3QpXG4gICAgcmV0dXJuIG9wczI7XG4gIGNvbnN0IG9wc0RvbWFpbiA9IG9wczIubWFwKCh4KSA9PiB4LmRvbWFpbik7XG4gIGNvbnN0IHRhcmdldFNpZyA9IGNlLmRvbWFpbihbXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIC4uLm9wc0RvbWFpbixcbiAgICBjb2RvbWFpbiA/PyBcIkFueXRoaW5nXCJcbiAgXSk7XG4gIGlmIChzaWcuaXNDb21wYXRpYmxlKHRhcmdldFNpZykpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGV4cGVjdGVkQXJncyA9IHNpZy5kb21haW5BcmdzLnNsaWNlKDAsIC0xKTtcbiAgY29uc3QgY291bnQgPSBNYXRoLm1heChleHBlY3RlZEFyZ3MubGVuZ3RoLCBvcHNEb21haW4ubGVuZ3RoKTtcbiAgbGV0IG5ld09wcyA9IFtdO1xuICBsZXQgcmVzdCA9IFsuLi5vcHMyXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY291bnQgLSAxOyBpKyspXG4gICAgW25ld09wcywgcmVzdF0gPSB2YWxpZGF0ZU5leHRBcmd1bWVudChcbiAgICAgIGNlLFxuICAgICAgZXhwZWN0ZWRBcmdzW2ldLFxuICAgICAgbmV3T3BzLFxuICAgICAgcmVzdFxuICAgICk7XG4gIHdoaWxlIChuZXdPcHMubGVuZ3RoID4gMCAmJiBuZXdPcHNbbmV3T3BzLmxlbmd0aCAtIDFdLnN5bWJvbCA9PT0gXCJOb3RoaW5nXCIpXG4gICAgbmV3T3BzLnBvcCgpO1xuICByZXR1cm4gbmV3T3BzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVBcmd1bWVudChjZSwgYXJnLCBkb20pIHtcbiAgaWYgKGRvbSA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBjZS5lcnJvcihcInVuZXhwZWN0ZWQtYXJndW1lbnRcIiwgYXJnKTtcbiAgaWYgKGFyZyA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBjZS5lcnJvcihcIm1pc3NpbmdcIik7XG4gIGlmICghYXJnLmlzVmFsaWQpXG4gICAgcmV0dXJuIGFyZztcbiAgaWYgKGFyZz8uZG9tYWluLmlzQ29tcGF0aWJsZShkb20pKVxuICAgIHJldHVybiBhcmc7XG4gIHJldHVybiBjZS5lcnJvcihbXCJpbmNvbXBhdGlibGUtZG9tYWluXCIsIGRvbSwgYXJnLmRvbWFpbl0sIGFyZyk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU5leHRBcmd1bWVudChjZSwgZG9tLCBtYXRjaGVkLCBvcHMyKSB7XG4gIGxldCBuZXh0ID0gb3BzMi5zaGlmdCgpO1xuICBpZiAoZG9tID09PSB2b2lkIDApXG4gICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoXCJ1bmV4cGVjdGVkLWFyZ3VtZW50XCIsIG5leHQpXSwgb3BzMl07XG4gIGlmICghQXJyYXkuaXNBcnJheShkb20pKSB7XG4gICAgaWYgKCFuZXh0KVxuICAgICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoXCJtaXNzaW5nXCIpXSwgb3BzMl07XG4gICAgaWYgKCFuZXh0LmRvbWFpbi5pc0NvbXBhdGlibGUoZG9tKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgWy4uLm1hdGNoZWQsIGNlLmVycm9yKFtcImluY29tcGF0aWJsZS1kb21haW5cIiwgZG9tLCBuZXh0LmRvbWFpbl0sIG5leHQpXSxcbiAgICAgICAgb3BzMlxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgbmV4dF0sIG9wczJdO1xuICB9XG4gIGNvbnN0IGN0b3IgPSBkb21bMF07XG4gIGlmIChuZXh0ID09PSB2b2lkIDApIHtcbiAgICBsZXQgdmFsaWQgPSBmYWxzZTtcbiAgICBpZiAoY3RvciA9PT0gXCJVbmlvblwiKSB7XG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8PSBkb20ubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgIGlmIChkb21ba10gPT09IFwiTm90aGluZ1wiKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjdG9yID09PSBcIk1heWJlXCIpXG4gICAgICB2YWxpZCA9IHRydWU7XG4gICAgaWYgKHZhbGlkKVxuICAgICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgY2Uuc3ltYm9sKFwiTm90aGluZ1wiKV0sIG9wczJdO1xuICAgIHJldHVybiBbWy4uLm1hdGNoZWQsIGNlLmVycm9yKFwibWlzc2luZ1wiKV0sIG9wczJdO1xuICB9XG4gIGlmIChjdG9yID09PSBcIlVuaW9uXCIpIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBrID0gMTsgayA8PSBkb20ubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICBpZiAobmV4dC5kb21haW4uaXNDb21wYXRpYmxlKGRvbVtrXSkpIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZvdW5kKVxuICAgICAgcmV0dXJuIFtbLi4ubWF0Y2hlZCwgbmV4dF0sIG9wczJdO1xuICAgIHJldHVybiBbXG4gICAgICBbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBkb20sIG5leHQuZG9tYWluXSwgbmV4dCldLFxuICAgICAgb3BzMlxuICAgIF07XG4gIH1cbiAgaWYgKGN0b3IgPT09IFwiU2VxdWVuY2VcIikge1xuICAgIGNvbnN0IHNlcSA9IGRvbVsxXTtcbiAgICBpZiAoIW5leHQgfHwgIW5leHQuZG9tYWluLmlzQ29tcGF0aWJsZShzZXEpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbLi4ubWF0Y2hlZCwgY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBzZXEsIG5leHQuZG9tYWluXSwgbmV4dCldLFxuICAgICAgICBvcHMyXG4gICAgICBdO1xuICAgIH1cbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5tYXRjaGVkLCBuZXh0XTtcbiAgICB3aGlsZSAoIWRvbmUpIHtcbiAgICAgIG5leHQgPSBvcHMyLnNoaWZ0KCk7XG4gICAgICBpZiAoIW5leHQpXG4gICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgIGVsc2UgaWYgKCFuZXh0LmRvbWFpbi5pc0NvbXBhdGlibGUoc2VxKSkge1xuICAgICAgICBvcHMyLnVuc2hpZnQobmV4dCk7XG4gICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXN1bHQucHVzaChuZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIG9wczJdO1xuICB9XG4gIGlmIChjdG9yID09PSBcIk1heWJlXCIpIHtcbiAgICBpZiAobmV4dCA9PT0gdm9pZCAwIHx8IG5leHQuc3ltYm9sID09PSBcIk5vdGhpbmdcIilcbiAgICAgIHJldHVybiBbWy4uLm1hdGNoZWQsIGNlLnN5bWJvbChcIk5vdGhpbmdcIildLCBvcHMyXTtcbiAgICByZXR1cm4gdmFsaWRhdGVOZXh0QXJndW1lbnQoY2UsIGRvbVsxXSwgbWF0Y2hlZCwgW25leHQsIC4uLm9wczJdKTtcbiAgfVxuICBjb25zb2xlLmVycm9yKFwiVW5oYW5kbGVkIGN0b3JcIiwgY3Rvcik7XG4gIHJldHVybiBbWy4uLm1hdGNoZWQsIG5leHRdLCBvcHMyXTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQXJndW1lbnRzKGNlLCBhcmdzLCBkb21zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gZG9tcy5sZW5ndGggJiYgYXJncy5ldmVyeSgoeCwgaSkgPT4geC5kb21haW4uaXNDb21wYXRpYmxlKGRvbXNbaV0pKSlcbiAgICByZXR1cm4gYXJncztcbiAgY29uc3QgeHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gZG9tcy5sZW5ndGggLSAxOyBpKyspXG4gICAgeHMucHVzaCh2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzW2ldLCBkb21zW2ldKSk7XG4gIGZvciAobGV0IGkgPSBkb21zLmxlbmd0aDsgaSA8PSBhcmdzLmxlbmd0aCAtIDE7IGkrKylcbiAgICB4cy5wdXNoKGNlLmVycm9yKFwidW5leHBlY3RlZC1hcmd1bWVudFwiLCBhcmdzW2ldKSk7XG4gIHJldHVybiB4cztcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvYXJpdGhtZXRpYy1hZGQudHNcbmZ1bmN0aW9uIGNhbm9uaWNhbEFkZChjZSwgb3BzMikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQob3BzMi5ldmVyeSgoeCkgPT4geC5pc0Nhbm9uaWNhbCkpO1xuICBvcHMyID0gb3BzMi5maWx0ZXIoKHgpID0+IHgubnVtZXJpY1ZhbHVlID09PSBudWxsIHx8ICF4LmlzWmVybyk7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gY2UubnVtYmVyKDApO1xuICBpZiAob3BzMi5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuIG9wczJbMF07XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMikge1xuICAgIGxldCBpbSA9IDA7XG4gICAgbGV0IHJlID0gMDtcbiAgICByZSA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgaWYgKHJlICE9PSBudWxsICYmIHJlICE9PSAwKVxuICAgICAgaW0gPSBnZXRJbWFnaW5hcnlDb2VmKG9wczJbMV0pO1xuICAgIGVsc2Uge1xuICAgICAgaW0gPSBnZXRJbWFnaW5hcnlDb2VmKG9wczJbMF0pO1xuICAgICAgaWYgKGltICE9PSAwICYmIG9wczJbMV0ubnVtZXJpY1ZhbHVlICE9PSBudWxsKVxuICAgICAgICByZSA9IGFzRmxvYXQob3BzMlsxXSk7XG4gICAgfVxuICAgIGlmIChyZSAhPT0gbnVsbCAmJiBpbSAhPT0gbnVsbCAmJiBpbSAhPT0gMClcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChyZSwgaW0pKTtcbiAgfVxuICBpZiAob3BzMi5sZW5ndGggPiAxKVxuICAgIG9wczIgPSBzb3J0QWRkKGNlLCBvcHMyKTtcbiAgcmV0dXJuIGNlLl9mbihcIkFkZFwiLCBvcHMyKTtcbn1cbmZ1bmN0aW9uIGRvbWFpbkFkZChfY2UsIGFyZ3MpIHtcbiAgbGV0IGRvbSA9IG51bGw7XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoIWFyZy5pc051bWVyaWMpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoIWRvbSlcbiAgICAgIGRvbSA9IGFyZztcbiAgICBlbHNlXG4gICAgICBkb20gPSBzaGFyZWRBbmNlc3RvckRvbWFpbihkb20sIGFyZyk7XG4gIH1cbiAgcmV0dXJuIGRvbTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5QWRkKGNlLCBhcmdzKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChhcmdzLmxlbmd0aCA+IDEsIGBzaW1wbGlmeUFkZDogbm90IGVub3VnaCBhcmdzYCk7XG4gIGNvbnN0IHN1bTIgPSBuZXcgU3VtKGNlKTtcbiAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcbiAgICBhcmcgPSBhcmcuc2ltcGxpZnkoKTtcbiAgICBpZiAoYXJnLmlzSW1hZ2luYXJ5ICYmIGFyZy5pc0luZmluaXR5KVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkNvbXBsZXhJbmZpbml0eVwiKTtcbiAgICBpZiAoYXJnLmlzTmFOIHx8IGFyZy5zeW1ib2wgPT09IFwiVW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBpZiAoIWFyZy5pc1plcm8pXG4gICAgICBzdW0yLmFkZFRlcm0oYXJnKTtcbiAgfVxuICByZXR1cm4gc3VtMi5hc0V4cHJlc3Npb24oXCJleHByZXNzaW9uXCIpO1xufVxuZnVuY3Rpb24gZXZhbEFkZE51bShvcHMyKSB7XG4gIGxldCBzdW0yID0gMDtcbiAgZm9yIChjb25zdCBvcDMgb2Ygb3BzMikge1xuICAgIGNvbnN0IHYgPSBvcDMubnVtZXJpY1ZhbHVlO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIilcbiAgICAgIHN1bTIgKz0gdjtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gc3VtMjtcbn1cbmZ1bmN0aW9uIGV2YWxBZGQoY2UsIG9wczIsIG1vZGUgPSBcImV2YWx1YXRlXCIpIHtcbiAgaWYgKG1vZGUgPT09IFwiTlwiICYmIGNlLm51bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIikge1xuICAgIG9wczIgPSBvcHMyLm1hcCgoeCkgPT4geC5OKCkpO1xuICAgIGNvbnN0IHN1bTIgPSBldmFsQWRkTnVtKG9wczIpO1xuICAgIGlmIChzdW0yICE9PSBudWxsKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihzdW0yKTtcbiAgfVxuICBmb3IgKGNvbnN0IGFyZyBvZiBvcHMyKSB7XG4gICAgaWYgKGFyZy5pc0ltYWdpbmFyeSAmJiBhcmcuaXNJbmZpbml0eSlcbiAgICAgIHJldHVybiBjZS5zeW1ib2woXCJDb21wbGV4SW5maW5pdHlcIik7XG4gICAgaWYgKGFyZy5pc05hTiB8fCBhcmcuc3ltYm9sID09PSBcIlVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgaWYgKCFhcmcuaXNFeGFjdClcbiAgICAgIG1vZGUgPSBcIk5cIjtcbiAgfVxuICBpZiAobW9kZSA9PT0gXCJOXCIpXG4gICAgb3BzMiA9IG9wczIubWFwKCh4KSA9PiB4Lk4oKSk7XG4gIGVsc2VcbiAgICBvcHMyID0gb3BzMi5tYXAoKHgpID0+IHguZXZhbHVhdGUoKSk7XG4gIHJldHVybiBuZXcgU3VtKGNlLCBvcHMyKS5hc0V4cHJlc3Npb24obW9kZSA9PT0gXCJOXCIgPyBcIm51bWVyaWNcIiA6IFwiZXhwcmVzc2lvblwiKTtcbn1cbmZ1bmN0aW9uIGNhbm9uaWNhbFN1bW1hdGlvbihjZSwgYm9keSwgcmFuZ2UpIHtcbiAgYm9keSA/PyAoYm9keSA9IGNlLmVycm9yKFwibWlzc2luZ1wiKSk7XG4gIGxldCBpbmRleCA9IG51bGw7XG4gIGxldCBsb3dlciA9IG51bGw7XG4gIGxldCB1cHBlciA9IG51bGw7XG4gIGlmIChyYW5nZSAmJiByYW5nZS5oZWFkICE9PSBcIlR1cGxlXCIgJiYgcmFuZ2UuaGVhZCAhPT0gXCJUcmlwbGVcIiAmJiByYW5nZS5oZWFkICE9PSBcIlBhaXJcIiAmJiByYW5nZS5oZWFkICE9PSBcIlNpbmdsZVwiKSB7XG4gICAgaW5kZXggPSByYW5nZTtcbiAgfSBlbHNlIGlmIChyYW5nZSkge1xuICAgIGluZGV4ID0gcmFuZ2Uub3BzPy5bMF0gPz8gbnVsbDtcbiAgICBsb3dlciA9IHJhbmdlLm9wcz8uWzFdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgICB1cHBlciA9IHJhbmdlLm9wcz8uWzJdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgfVxuICBpZiAoaW5kZXg/LmhlYWQgPT09IFwiSG9sZFwiKVxuICAgIGluZGV4ID0gaW5kZXgub3AxO1xuICBpZiAoaW5kZXg/LmhlYWQgPT09IFwiUmVsZWFzZUhvbGRcIilcbiAgICBpbmRleCA9IGluZGV4Lm9wMT8uZXZhbHVhdGUoKTtcbiAgaW5kZXggPz8gKGluZGV4ID0gY2Uuc3ltYm9sKFwiTm90aGluZ1wiKSk7XG4gIGlmICghaW5kZXguc3ltYm9sKVxuICAgIGluZGV4ID0gY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIlN5bWJvbFwiLCBpbmRleC5kb21haW5dKTtcbiAgaWYgKGluZGV4LnN5bWJvbClcbiAgICBjZS5wdXNoU2NvcGUoeyBbaW5kZXguc3ltYm9sXTogeyBkb21haW46IFwiSW50ZWdlclwiIH0gfSk7XG4gIGNvbnN0IGZuID0gYm9keS5jYW5vbmljYWw7XG4gIGlmIChpbmRleC5zeW1ib2wpIHtcbiAgICBjZS5wb3BTY29wZSgpO1xuICAgIGluZGV4ID0gaW5kZXggPSBjZS5ob2xkKGluZGV4KTtcbiAgfVxuICBpZiAobG93ZXIgJiYgbG93ZXIuaXNGaW5pdGUpXG4gICAgbG93ZXIgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBsb3dlciwgXCJJbnRlZ2VyXCIpO1xuICBpZiAodXBwZXIgJiYgdXBwZXIuaXNGaW5pdGUpXG4gICAgdXBwZXIgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCB1cHBlciwgXCJJbnRlZ2VyXCIpO1xuICBpZiAobG93ZXIgJiYgdXBwZXIpXG4gICAgcmFuZ2UgPSBjZS50dXBsZShbaW5kZXgsIGxvd2VyLCB1cHBlcl0pO1xuICBlbHNlIGlmICh1cHBlcilcbiAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgY2UubnVtYmVyKDEpLCB1cHBlcl0pO1xuICBlbHNlIGlmIChsb3dlcilcbiAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgbG93ZXJdKTtcbiAgZWxzZVxuICAgIHJhbmdlID0gaW5kZXg7XG4gIHJldHVybiBjZS5fZm4oXCJTdW1cIiwgW2ZuLCByYW5nZV0pO1xufVxuZnVuY3Rpb24gZXZhbFN1bW1hdGlvbihjZSwgZXhwciwgcmFuZ2UsIG1vZGUpIHtcbiAgY29uc3QgW2luZGV4LCBsb3dlciwgdXBwZXIsIGlzRmluaXRlMl0gPSBub3JtYWxpemVMaW1pdHMocmFuZ2UpO1xuICBjb25zdCBmbiA9IGV4cHI7XG4gIGlmIChtb2RlICE9PSBcIk5cIiAmJiAobG93ZXIgPj0gdXBwZXIgfHwgdXBwZXIgLSBsb3dlciA+PSBNQVhfU1lNQk9MSUNfVEVSTVMpKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGxldCByZXN1bHQgPSBudWxsO1xuICBjb25zdCBzYXZlZENvbnRleHQgPSBjZS5jb250ZXh0O1xuICBjZS5jb250ZXh0ID0gZm4uc2NvcGUgPz8gY2UuY29udGV4dDtcbiAgaWYgKG1vZGUgPT09IFwic2ltcGxpZnlcIikge1xuICAgIGNvbnN0IHRlcm1zID0gW107XG4gICAgaWYgKCFmbi5zY29wZSlcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKVxuICAgICAgICB0ZXJtcy5wdXNoKGZuLnNpbXBsaWZ5KCkpO1xuICAgIGVsc2VcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKSB7XG4gICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgIHRlcm1zLnB1c2goZm4uc2ltcGxpZnkoKSk7XG4gICAgICB9XG4gICAgcmVzdWx0ID0gY2UuYWRkKHRlcm1zKS5zaW1wbGlmeSgpO1xuICB9XG4gIGlmIChtb2RlID09PSBcImV2YWx1YXRlXCIpIHtcbiAgICBjb25zdCB0ZXJtcyA9IFtdO1xuICAgIGlmICghZm4uc2NvcGUpXG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKylcbiAgICAgICAgdGVybXMucHVzaChmbi5ldmFsdWF0ZSgpKTtcbiAgICBlbHNlXG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICB0ZXJtcy5wdXNoKGZuLmV2YWx1YXRlKCkpO1xuICAgICAgfVxuICAgIHJlc3VsdCA9IGNlLmFkZCh0ZXJtcykuZXZhbHVhdGUoKTtcbiAgfVxuICBpZiAobW9kZSA9PT0gXCJOXCIpIHtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsICYmICFmbi5zY29wZSkge1xuICAgICAgY29uc3QgbiA9IGZuLk4oKTtcbiAgICAgIGlmICghaXNGaW5pdGUyKSB7XG4gICAgICAgIGlmIChuLmlzWmVybylcbiAgICAgICAgICByZXN1bHQgPSBjZS5fWkVSTztcbiAgICAgICAgZWxzZSBpZiAobi5pc1Bvc2l0aXZlKVxuICAgICAgICAgIHJlc3VsdCA9IGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlc3VsdCA9IGNlLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgJiYgZm4uaXNQdXJlKVxuICAgICAgICByZXN1bHQgPSBjZS5tdWwoW2NlLm51bWJlcih1cHBlciAtIGxvd2VyICsgMSksIG5dKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiBpc0Zpbml0ZTIpIHtcbiAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQoY2UpKSB7XG4gICAgICAgIGxldCBzdW0yID0gY2UuYmlnbnVtKDApO1xuICAgICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgICAgY29uc3QgdGVybSA9IGFzQmlnbnVtKGZuLk4oKSk7XG4gICAgICAgICAgaWYgKHRlcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRlcm0uaXNGaW5pdGUoKSkge1xuICAgICAgICAgICAgc3VtMiA9IHRlcm07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VtMiA9IHN1bTIuYWRkKHRlcm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICAgICAgcmVzdWx0ID0gY2UubnVtYmVyKHN1bTIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY01vZGUgPSBjZS5udW1lcmljTW9kZTtcbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBcIm1hY2hpbmVcIjtcbiAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgICAgY29uc3QgdGVybSA9IGFzRmxvYXQoZm4uTigpKTtcbiAgICAgICAgICBpZiAodGVybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRlcm0pKSB7XG4gICAgICAgICAgICBzdW0yID0gdGVybTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdW0yICs9IHRlcm07XG4gICAgICAgIH1cbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBudW1lcmljTW9kZTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICByZXN1bHQgPSBjZS5udW1iZXIoc3VtMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGNlLnNldCh7IFtpbmRleF06IDFlMyB9KTtcbiAgICAgIGNvbnN0IG5NYXggPSBmbi5OKCk7XG4gICAgICBjZS5zZXQoeyBbaW5kZXhdOiA5OTkgfSk7XG4gICAgICBjb25zdCBuTWF4TWludXNPbmUgPSBmbi5OKCk7XG4gICAgICBjb25zdCByYXRpbyA9IGFzRmxvYXQoY2UuZGl2KG5NYXgsIG5NYXhNaW51c09uZSkuTigpKTtcbiAgICAgIGlmIChyYXRpbyAhPT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUocmF0aW8pICYmIE1hdGguYWJzKHJhdGlvKSA+IDEpIHtcbiAgICAgICAgcmVzdWx0ID0gY2UuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICBjb25zdCBudW1lcmljTW9kZSA9IGNlLm51bWVyaWNNb2RlO1xuICAgICAgICBjZS5udW1lcmljTW9kZSA9IFwibWFjaGluZVwiO1xuICAgICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgICAgY29uc3QgdGVybSA9IGFzRmxvYXQoZm4uTigpKTtcbiAgICAgICAgICBpZiAodGVybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChNYXRoLmFicyh0ZXJtKSA8IE51bWJlci5FUFNJTE9OIHx8ICFOdW1iZXIuaXNGaW5pdGUodGVybSkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBzdW0yICs9IHRlcm07XG4gICAgICAgIH1cbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBudW1lcmljTW9kZTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICByZXN1bHQgPSBjZS5udW1iZXIoc3VtMik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNlLmNvbnRleHQgPSBzYXZlZENvbnRleHQ7XG4gIHJldHVybiByZXN1bHQgPz8gdm9pZCAwO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvbmVnYXRlLnRzXG52YXIgaW1wb3J0X2NvbXBsZXg5ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5mdW5jdGlvbiBuZWdhdGVMaXRlcmFsKGV4cHIsIG1ldGFkYXRhKSB7XG4gIGxldCBuID0gZXhwci5udW1lcmljVmFsdWU7XG4gIGlmIChuID09PSBudWxsKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIpXG4gICAgbiA9IC1uO1xuICBlbHNlIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIG4gPSBuLm5lZygpO1xuICBlbHNlIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXg5LkNvbXBsZXgpXG4gICAgbiA9IG4ubmVnKCk7XG4gIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobikpXG4gICAgbiA9IG5lZyhuKTtcbiAgcmV0dXJuIGV4cHIuZW5naW5lLm51bWJlcihuLCB7IG1ldGFkYXRhIH0pO1xufVxuZnVuY3Rpb24gY2Fub25pY2FsTmVnYXRlKGV4cHIsIG1ldGFkYXRhKSB7XG4gIGlmIChleHByLmhlYWQgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGV4cHIub3AxO1xuICBpZiAoZXhwci5udW1lcmljVmFsdWUgIT09IG51bGwpXG4gICAgcmV0dXJuIG5lZ2F0ZUxpdGVyYWwoZXhwciwgbWV0YWRhdGEpO1xuICBpZiAoZXhwci5oZWFkID09PSBcIkFkZFwiKSB7XG4gICAgbGV0IG9wczIgPSBleHByLm9wcy5tYXAoKHgpID0+IGNhbm9uaWNhbE5lZ2F0ZSh4KSk7XG4gICAgb3BzMiA9IGZsYXR0ZW5PcHMob3BzMiwgXCJBZGRcIik7XG4gICAgcmV0dXJuIGV4cHIuZW5naW5lLmFkZChvcHMyLCBtZXRhZGF0YSk7XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgcmV0dXJuIG5lZ2F0ZVByb2R1Y3QoZXhwci5lbmdpbmUsIGV4cHIub3BzKTtcbiAgfVxuICBpZiAoZXhwci5oZWFkID09PSBcIkRpdmlkZVwiKVxuICAgIHJldHVybiBleHByLmVuZ2luZS5fZm4oXCJEaXZpZGVcIiwgW2Nhbm9uaWNhbE5lZ2F0ZShleHByLm9wMSksIGV4cHIub3AyXSk7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChleHByLmhlYWQgIT09IFwiU3VidHJhY3RcIik7XG4gIHJldHVybiBleHByLmVuZ2luZS5fZm4oXCJOZWdhdGVcIiwgW2V4cHJdLCBtZXRhZGF0YSk7XG59XG5mdW5jdGlvbiBuZWdhdGVQcm9kdWN0KGNlLCBhcmdzKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmICghZG9uZSAmJiBhcmcuaGVhZCA9PT0gXCJOZWdhdGVcIikge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICByZXN1bHQucHVzaChhcmcub3AxKTtcbiAgICB9IGVsc2VcbiAgICAgIHJlc3VsdC5wdXNoKGFyZyk7XG4gIH1cbiAgaWYgKGRvbmUpXG4gICAgcmV0dXJuIGNlLm11bChyZXN1bHQpO1xuICByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmIChkb25lIHx8IGFyZy5udW1lcmljVmFsdWUgPT09IG51bGwgfHwgIWFyZy5pc0ludGVnZXIpXG4gICAgICByZXN1bHQucHVzaChhcmcpO1xuICAgIGVsc2Uge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICByZXN1bHQucHVzaChjYW5vbmljYWxOZWdhdGUoYXJnKSk7XG4gICAgfVxuICB9XG4gIGlmIChkb25lKVxuICAgIHJldHVybiBjZS5tdWwocmVzdWx0KTtcbiAgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoZG9uZSB8fCBhcmcubnVtZXJpY1ZhbHVlID09PSBudWxsIHx8ICFhcmcuaXNOdW1iZXIpXG4gICAgICByZXN1bHQucHVzaChhcmcpO1xuICAgIGVsc2Uge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICByZXN1bHQucHVzaChjYW5vbmljYWxOZWdhdGUoYXJnKSk7XG4gICAgfVxuICB9XG4gIGlmIChkb25lKVxuICAgIHJldHVybiBjZS5tdWwocmVzdWx0KTtcbiAgcmV0dXJuIGNlLl9mbihcIk5lZ2F0ZVwiLCBbY2UuX2ZuKFwiTXVsdGlwbHlcIiwgYXJncyldKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NOZWdhdGUoX2NlLCB4LCBfbW9kZSA9IFwic2ltcGxpZnlcIikge1xuICByZXR1cm4gY2Fub25pY2FsTmVnYXRlKHgpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvZXhwYW5kLnRzXG5mdW5jdGlvbiBkaXN0cmlidXRlMihsaHMsIHJocykge1xuICBpZiAobGhzLmhlYWQgPT09IFwiTmVnYXRlXCIgJiYgcmhzLmhlYWQgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGRpc3RyaWJ1dGUyKGxocy5vcDEsIHJocy5vcDEpO1xuICBpZiAobGhzLmhlYWQgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGNhbm9uaWNhbE5lZ2F0ZShkaXN0cmlidXRlMihsaHMub3AxLCByaHMpKTtcbiAgaWYgKHJocy5oZWFkID09PSBcIk5lZ2F0ZVwiKVxuICAgIHJldHVybiBjYW5vbmljYWxOZWdhdGUoZGlzdHJpYnV0ZTIobGhzLCByaHMub3AxKSk7XG4gIGNvbnN0IGNlID0gbGhzLmVuZ2luZTtcbiAgaWYgKGxocy5oZWFkID09PSBcIkRpdmlkZVwiICYmIHJocy5oZWFkID09PSBcIkRpdmlkZVwiKSB7XG4gICAgY29uc3QgZGVub20gPSBjZS5tdWwoW2xocy5vcDIsIHJocy5vcDJdKTtcbiAgICByZXR1cm4gY2UuZGl2KGRpc3RyaWJ1dGUyKGxocy5vcDEsIHJocy5vcDEpLCBkZW5vbSk7XG4gIH1cbiAgaWYgKGxocy5oZWFkID09PSBcIkRpdmlkZVwiKVxuICAgIHJldHVybiBjZS5kaXYoZGlzdHJpYnV0ZTIobGhzLm9wMSwgcmhzKSwgbGhzLm9wMik7XG4gIGlmIChyaHMuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICByZXR1cm4gY2UuZGl2KGRpc3RyaWJ1dGUyKGxocywgcmhzLm9wMSksIHJocy5vcDIpO1xuICBpZiAobGhzLmhlYWQgPT09IFwiQWRkXCIpXG4gICAgcmV0dXJuIGNlLmFkZChsaHMub3BzLm1hcCgoeCkgPT4gZGlzdHJpYnV0ZTIoeCwgcmhzKSkpO1xuICBpZiAocmhzLmhlYWQgPT09IFwiQWRkXCIpXG4gICAgcmV0dXJuIGNlLmFkZChyaHMub3BzLm1hcCgoeCkgPT4gZGlzdHJpYnV0ZTIobGhzLCB4KSkpO1xuICByZXR1cm4gY2UubXVsKFtsaHMsIHJoc10pO1xufVxuZnVuY3Rpb24gZGlzdHJpYnV0ZShleHByKSB7XG4gIGlmIChleHByLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gZXhwclswXTtcbiAgaWYgKGV4cHIubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiBkaXN0cmlidXRlMihleHByWzBdLCBleHByWzFdKTtcbiAgcmV0dXJuIGRpc3RyaWJ1dGUyKGV4cHJbMF0sIGRpc3RyaWJ1dGUoZXhwci5zbGljZSgxKSkpO1xufVxudmFyIGJpbm9taWFscyA9IFtcbiAgWzFdLFxuICBbMSwgMV0sXG4gIFsxLCAyLCAxXSxcbiAgWzEsIDMsIDMsIDFdLFxuICBbMSwgNCwgNiwgNCwgMV0sXG4gIFsxLCA1LCAxMCwgMTAsIDUsIDFdLFxuICBbMSwgNiwgMTUsIDIwLCAxNSwgNiwgMV0sXG4gIFsxLCA3LCAyMSwgMzUsIDM1LCAyMSwgNywgMV0sXG4gIFsxLCA4LCAyOCwgNTYsIDcwLCA1NiwgMjgsIDgsIDFdXG5dO1xuZnVuY3Rpb24gY2hvb3NlKG4sIGspIHtcbiAgd2hpbGUgKG4gPj0gYmlub21pYWxzLmxlbmd0aCkge1xuICAgIGNvbnN0IHMgPSBiaW5vbWlhbHMubGVuZ3RoO1xuICAgIGNvbnN0IG5leHRSb3cgPSBbMV07XG4gICAgY29uc3QgcHJldiA9IGJpbm9taWFsc1tzIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzOyBpKyspXG4gICAgICBuZXh0Um93W2ldID0gcHJldltpIC0gMV0gKyBwcmV2W2ldO1xuICAgIG5leHRSb3dbc10gPSAxO1xuICAgIGJpbm9taWFscy5wdXNoKG5leHRSb3cpO1xuICB9XG4gIHJldHVybiBiaW5vbWlhbHNbbl1ba107XG59XG5mdW5jdGlvbiBtdWx0aW5vbWlhbENvZWZmaWNpZW50KGspIHtcbiAgbGV0IG4gPSBrLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgKyB2LCAwKTtcbiAgbGV0IHByb2QgPSAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBwcm9kICo9IGNob29zZShuLCBrW2ldKTtcbiAgICBuIC09IGtbaV07XG4gIH1cbiAgcmV0dXJuIHByb2Q7XG59XG5mdW5jdGlvbiogcG93ZXJzKG4sIGV4cDIpIHtcbiAgaWYgKG4gPT09IDEpIHtcbiAgICB5aWVsZCBbZXhwMl07XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGV4cDI7IGkgKz0gMSlcbiAgICBmb3IgKGNvbnN0IHAgb2YgcG93ZXJzKG4gLSAxLCBleHAyIC0gaSkpXG4gICAgICB5aWVsZCBbaSwgLi4ucF07XG59XG5mdW5jdGlvbiBleHBhbmRNdWx0aW5vbWlhbChleHByKSB7XG4gIGlmIChleHByLmhlYWQgIT09IFwiUG93ZXJcIilcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgZXhwMiA9IGFzU21hbGxJbnRlZ2VyKGV4cHIub3AyKTtcbiAgaWYgKGV4cDIgPT09IG51bGwgfHwgZXhwMiA8IDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmIChleHAyID09PSAwKVxuICAgIHJldHVybiBleHByLmVuZ2luZS5fT05FO1xuICBpZiAoZXhwMiA9PT0gMSlcbiAgICByZXR1cm4gZXhwci5vcDE7XG4gIGNvbnN0IGNlID0gZXhwci5lbmdpbmU7XG4gIGlmIChleHByLm9wMS5oZWFkID09PSBcIk5lZ2F0ZVwiKSB7XG4gICAgY29uc3Qgc2lnbjIgPSBleHAyICUgMiA9PT0gMCA/IDEgOiAtMTtcbiAgICBjb25zdCByZXN1bHQyID0gZXhwYW5kTXVsdGlub21pYWwoY2UucG93KGV4cHIub3AxLm9wMSwgZXhwci5vcDIpKTtcbiAgICBpZiAocmVzdWx0MiA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChzaWduMiA+IDApXG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICByZXR1cm4gY2UubmVnKHJlc3VsdDIpO1xuICB9XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChleHByLm9wMS5oZWFkICE9PSBcIlN1YnRyYWN0XCIpO1xuICBpZiAoZXhwci5vcDEuaGVhZCAhPT0gXCJBZGRcIilcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgdGVybXMgPSBleHByLm9wMS5vcHM7XG4gIGNvbnN0IGl0ID0gcG93ZXJzKHRlcm1zLmxlbmd0aCwgZXhwMik7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbCBvZiBpdCkge1xuICAgIGNvbnN0IHByb2R1Y3QgPSBbY2UubnVtYmVyKG11bHRpbm9taWFsQ29lZmZpY2llbnQodmFsKSldO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodmFsW2ldICE9PSAwKSB7XG4gICAgICAgIGlmICh2YWxbaV0gPT09IDEpXG4gICAgICAgICAgcHJvZHVjdC5wdXNoKHRlcm1zW2ldKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHByb2R1Y3QucHVzaChjZS5wb3codGVybXNbaV0sIHZhbFtpXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucHVzaChjZS5tdWwocHJvZHVjdCkpO1xuICB9XG4gIHJldHVybiBjZS5hZGQocmVzdWx0KTtcbn1cbmZ1bmN0aW9uIGV4cGFuZE51bWVyYXRvcihleHByKSB7XG4gIGlmIChleHByLmhlYWQgIT09IFwiRGl2aWRlXCIpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGV4cGFuZGVkTnVtZXJhdG9yID0gZXhwYW5kMihleHByLm9wMSk7XG4gIGlmIChleHBhbmRlZE51bWVyYXRvciA9PT0gbnVsbClcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgY2UgPSBleHByLmVuZ2luZTtcbiAgaWYgKGV4cGFuZGVkTnVtZXJhdG9yLmhlYWQgPT09IFwiQWRkXCIpIHtcbiAgICByZXR1cm4gY2UuYWRkKGV4cGFuZGVkTnVtZXJhdG9yLm9wcy5tYXAoKHgpID0+IGNlLmRpdih4LCBleHByLm9wMikpKTtcbiAgfVxuICByZXR1cm4gZXhwci5lbmdpbmUuZGl2KGV4cGFuZGVkTnVtZXJhdG9yLCBleHByLm9wMik7XG59XG5mdW5jdGlvbiBleHBhbmQyKGV4cHIpIHtcbiAgaWYgKCFleHByKVxuICAgIHJldHVybiBudWxsO1xuICBsZXQgcmVzdWx0ID0gZXhwYW5kTnVtZXJhdG9yKGV4cHIpO1xuICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgIHJldHVybiByZXN1bHQ7XG4gIGlmIChleHByLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIHJlc3VsdCA9IGRpc3RyaWJ1dGUoZXhwci5vcHMpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChleHByLmhlYWQgPT09IFwiQWRkXCIpIHtcbiAgICBjb25zdCBvcHMyID0gZXhwci5vcHMubWFwKCh4KSA9PiBleHBhbmQyKHgpID8/IHgpO1xuICAgIHJldHVybiBzaW1wbGlmeUFkZChleHByLmVuZ2luZSwgb3BzMik7XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJOZWdhdGVcIikge1xuICAgIHJlc3VsdCA9IGV4cGFuZDIoZXhwci5vcDEpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpXG4gICAgICByZXR1cm4gZXhwci5lbmdpbmUubmVnKHJlc3VsdCk7XG4gIH1cbiAgaWYgKGV4cHIuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgcmVzdWx0ID0gZXhwYW5kTXVsdGlub21pYWwoZXhwcik7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbClcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9zb2x2ZS50c1xudmFyIFVOSVZBUklBVEVfUk9PVFMgPSBbXG4gIC8vIGF4ID0gMFxuICBbW1wiTXVsdGlwbHlcIiwgXCJfeFwiLCBcIl9hXCJdLCAwXSxcbiAgLy8geCArIGEgPSAwXG4gIFtcbiAgICBbXCJBZGRcIiwgXCJfYVwiLCBcIl94XCJdLFxuICAgIFtcIk5lZ2F0ZVwiLCBcIl9hXCJdXG4gIF0sXG4gIFtbXCJBZGRcIiwgW1wiTmVnYXRlXCIsIFwiX3hcIl0sIFwiX2FcIl0sIFwiX2FcIl0sXG4gIC8vIGF4ICsgYiA9IDBcbiAgW1xuICAgIFtcIkFkZFwiLCBbXCJNdWx0aXBseVwiLCBcIl94XCIsIFwiX2FcIl0sIFwiX2JcIl0sXG4gICAgW1wiRGl2aWRlXCIsIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLCBcIl9hXCJdXG4gIF0sXG4gIC8vIFF1YWRyYXRpYyBmb3JtdWxhIChyZWFsKVxuICAvLyBheF4yICsgYnggKyBjID0gMFxuICBbXG4gICAgW1xuICAgICAgXCJBZGRcIixcbiAgICAgIFtcIk11bHRpcGx5XCIsIFtcIlBvd2VyXCIsIFwiX3hcIiwgMl0sIFwiX2FcIl0sXG4gICAgICBbXCJNdWx0aXBseVwiLCBcIl94XCIsIFwiX2JcIl0sXG4gICAgICBcIl9jXCJcbiAgICBdLFxuICAgIFtcbiAgICAgIFwiRGl2aWRlXCIsXG4gICAgICBbXG4gICAgICAgIFwiQWRkXCIsXG4gICAgICAgIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLFxuICAgICAgICBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIFtcIlNxdWFyZVwiLCBcIl9iXCJdLCBbXCJNdWx0aXBseVwiLCA0LCBcIl9hXCIsIFwiX2NcIl1dXVxuICAgICAgXSxcbiAgICAgIFtcIk11bHRpcGx5XCIsIDIsIFwiX2FcIl1cbiAgICBdXG4gICAgLy8gKF9jZSwgdmFycyk6IGJvb2xlYW4gPT4gdmFycy54LmlzUmVhbCA9PT0gdHJ1ZSxcbiAgXSxcbiAgW1xuICAgIFtcbiAgICAgIFwiQWRkXCIsXG4gICAgICBbXCJNdWx0aXBseVwiLCBbXCJQb3dlclwiLCBcIl94XCIsIDJdLCBcIl9hXCJdLFxuICAgICAgW1wiTXVsdGlwbHlcIiwgXCJfeFwiLCBcIl9iXCJdLFxuICAgICAgXCJfY1wiXG4gICAgXSxcbiAgICBbXG4gICAgICBcIkRpdmlkZVwiLFxuICAgICAgW1xuICAgICAgICBcIlN1YnRyYWN0XCIsXG4gICAgICAgIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLFxuICAgICAgICBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIFtcIlNxdWFyZVwiLCBcIl9iXCJdLCBbXCJNdWx0aXBseVwiLCA0LCBcIl9hXCIsIFwiX2NcIl1dXVxuICAgICAgXSxcbiAgICAgIFtcIk11bHRpcGx5XCIsIDIsIFwiX2FcIl1cbiAgICBdXG4gICAgLy8gKF9jZSwgdmFycyk6IGJvb2xlYW4gPT4gdmFycy54LmlzUmVhbCA9PT0gdHJ1ZSxcbiAgXSxcbiAgLy8gYXheMiArIGJ4ID0gMFxuICBbXG4gICAgW1wiQWRkXCIsIFtcIk11bHRpcGx5XCIsIFtcIlBvd2VyXCIsIFwiX3hcIiwgMl0sIFwiX2FcIl0sIFtcIk11bHRpcGx5XCIsIFwiX3hcIiwgXCJfYlwiXV0sXG4gICAgMFxuICAgIC8vIChfY2UsIHZhcnMpOiBib29sZWFuID0+IHZhcnMueC5pc1JlYWwgPT09IHRydWUsXG4gIF0sXG4gIFtcbiAgICBbXCJBZGRcIiwgW1wiTXVsdGlwbHlcIiwgW1wiUG93ZXJcIiwgXCJfeFwiLCAyXSwgXCJfYVwiXSwgW1wiTXVsdGlwbHlcIiwgXCJfeFwiLCBcIl9iXCJdXSxcbiAgICBbXCJEaXZpZGVcIiwgW1wiTmVnYXRlXCIsIFwiX2JcIl0sIFwiX2FcIl1cbiAgICAvLyAoX2NlLCB2YXJzKTogYm9vbGVhbiA9PiB2YXJzLnguaXNSZWFsID09PSB0cnVlLFxuICBdLFxuICAvLyBheF4yICsgYiA9IDBcbiAgW1xuICAgIFtcIkFkZFwiLCBbXCJNdWx0aXBseVwiLCBbXCJQb3dlclwiLCBcIl94XCIsIDJdLCBcIl9hXCJdLCBcIl9iXCJdLFxuICAgIFtcIlNxcnRcIiwgW1wiRGl2aWRlXCIsIFtcIk5lZ2F0ZVwiLCBcIl9iXCJdLCBcIl9hXCJdXVxuICAgIC8vIChfY2UsIHZhcnMpOiBib29sZWFuID0+IHZhcnMueC5pc1JlYWwgPT09IHRydWUsXG4gIF0sXG4gIFtcbiAgICBbXCJBZGRcIiwgW1wiTXVsdGlwbHlcIiwgW1wiUG93ZXJcIiwgXCJfeFwiLCAyXSwgXCJfYVwiXSwgXCJfYlwiXSxcbiAgICBbXCJOZWdhdGVcIiwgW1wiU3FydFwiLCBbXCJEaXZpZGVcIiwgW1wiTmVnYXRlXCIsIFwiX2JcIl0sIFwiX2FcIl1dXVxuICAgIC8vIChfY2UsIHZhcnMpOiBib29sZWFuID0+IHZhcnMueC5pc1JlYWwgPT09IHRydWUsXG4gIF1cbiAgLy8gUXVhZHJhdGljIGZvcm11bGEgKGNvbXBsZXgpXG4gIC8vIFtcbiAgLy8gICAnJGF4XjIgKyBieCArIGMkJyxcbiAgLy8gICBbXG4gIC8vICAgICAnJC1cXFxcZnJhY3tifXsyYX0gLSBcXFxcaW1hZ2luYXJ5SSBcXFxcZnJhY3tcXFxcc3FydHs0YWMgLSBiXjJ9fXsyYX0kJyxcbiAgLy8gICAgICckLVxcXFxmcmFje2J9ezJhfSArIFxcXFxpbWFnaW5hcnlJIFxcXFxmcmFje1xcXFxzcXJ0ezRhYyAtIGJeMn19ezJhfSQnLFxuICAvLyAgIF0sXG4gIC8vICAgKF9jZSwgdmFycyk6IGJvb2xlYW4gPT4gdmFycy54LmlzSW1hZ2luYXJ5ID09PSB0cnVlLFxuICAvLyBdLFxuXTtcbmZ1bmN0aW9uIGZpbmRVbml2YXJpYXRlUm9vdHMoZXhwciwgeCkge1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICBpZiAoZXhwci5oZWFkID09PSBcIkVxdWFsXCIpIHtcbiAgICBleHByID0gY2UuYWRkKFtleHByLm9wMS5jYW5vbmljYWwsIGNlLm5lZyhleHByLm9wMi5jYW5vbmljYWwpXSkuc2ltcGxpZnkoKTtcbiAgfVxuICBjb25zdCBydWxlcyA9IGNlLmNhY2hlKFxuICAgIFwidW5pdmFyaWF0ZS1yb290cy1ydWxlc1wiLFxuICAgICgpID0+IGJveFJ1bGVzKGNlLCBVTklWQVJJQVRFX1JPT1RTKVxuICApO1xuICBsZXQgcmVzdWx0ID0gbWF0Y2hSdWxlcyhcbiAgICBleHByLnN1YnMoeyBbeF06IFwiX3hcIiB9LCB7IGNhbm9uaWNhbDogZmFsc2UgfSksXG4gICAgcnVsZXMsXG4gICAgeyBfeDogY2Uuc3ltYm9sKFwiX3hcIikgfVxuICApO1xuICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnN0IGV4cGFuZGVkRXhwciA9IGV4cGFuZDIoZXhwci5jYW5vbmljYWwpO1xuICAgIGlmIChleHBhbmRlZEV4cHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gW107XG4gICAgcmVzdWx0ID0gbWF0Y2hSdWxlcyhcbiAgICAgIGV4cGFuZGVkRXhwci5zdWJzKHsgW3hdOiBcIl94XCIgfSwgeyBjYW5vbmljYWw6IGZhbHNlIH0pLFxuICAgICAgcnVsZXMsXG4gICAgICB7XG4gICAgICAgIF94OiBjZS5zeW1ib2woXCJfeFwiKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5tYXAoKHgyKSA9PiB4Mi5jYW5vbmljYWwuZXZhbHVhdGUoKSk7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9hc3N1bWUudHNcbmZ1bmN0aW9uIGFzc3VtZShwcm9wb3NpdGlvbikge1xuICBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJFbGVtZW50XCIpXG4gICAgcmV0dXJuIGFzc3VtZUVsZW1lbnQocHJvcG9zaXRpb24pO1xuICBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJFcXVhbFwiKVxuICAgIHJldHVybiBhc3N1bWVFcXVhbGl0eShwcm9wb3NpdGlvbik7XG4gIGlmIChpc0luZXF1YWxpdHkocHJvcG9zaXRpb24pKVxuICAgIHJldHVybiBhc3N1bWVJbmVxdWFsaXR5KHByb3Bvc2l0aW9uKTtcbiAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG59XG5mdW5jdGlvbiBhc3N1bWVFcXVhbGl0eShwcm9wb3NpdGlvbikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJFcXVhbFwiKTtcbiAgY29uc3QgZnJlZVZhcnMgPSBwcm9wb3NpdGlvbi5mcmVlVmFycztcbiAgaWYgKGZyZWVWYXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnN0IHZhbCA9IHByb3Bvc2l0aW9uLmV2YWx1YXRlKCk7XG4gICAgaWYgKHZhbC5zeW1ib2wgPT09IFwiVHJ1ZVwiKVxuICAgICAgcmV0dXJuIFwidGF1dG9sb2d5XCI7XG4gICAgaWYgKHZhbC5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICAgIHJldHVybiBcImNvbnRyYWRpY3Rpb25cIjtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5sb2cocHJvcG9zaXRpb24uY2Fub25pY2FsLmV2YWx1YXRlKCkpO1xuICAgIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xuICB9XG4gIGNvbnN0IGNlID0gcHJvcG9zaXRpb24uZW5naW5lO1xuICBjb25zdCBsaHMgPSBwcm9wb3NpdGlvbi5vcDEuc3ltYm9sO1xuICBpZiAobGhzICYmICFoYXNWYWx1ZShjZSwgbGhzKSAmJiAhcHJvcG9zaXRpb24ub3AyLmhhcyhsaHMpKSB7XG4gICAgY29uc3QgdmFsID0gcHJvcG9zaXRpb24ub3AyLmV2YWx1YXRlKCk7XG4gICAgaWYgKCF2YWwuaXNWYWxpZClcbiAgICAgIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xuICAgIGNvbnN0IGRlZiA9IGNlLmxvb2t1cFN5bWJvbChsaHMpO1xuICAgIGlmICghZGVmKSB7XG4gICAgICBjZS5kZWZpbmVTeW1ib2wobGhzLCB7IHZhbHVlOiB2YWwgfSk7XG4gICAgICByZXR1cm4gXCJva1wiO1xuICAgIH1cbiAgICBpZiAoZGVmLmRvbWFpbiAmJiAhdmFsLmRvbWFpbi5pc0NvbXBhdGlibGUoZGVmLmRvbWFpbikpXG4gICAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gICAgZGVmLnZhbHVlID0gdmFsO1xuICAgIHJldHVybiBcIm9rXCI7XG4gIH1cbiAgaWYgKGZyZWVWYXJzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGxoczIgPSBmcmVlVmFyc1swXTtcbiAgICBjb25zdCBzb2xzID0gZmluZFVuaXZhcmlhdGVSb290cyhwcm9wb3NpdGlvbiwgbGhzMik7XG4gICAgaWYgKHNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjZS5hc3N1bXB0aW9ucy5zZXQoXG4gICAgICAgIGNlLmZuKFwiRXF1YWxcIiwgW1xuICAgICAgICAgIGNlLmFkZChbcHJvcG9zaXRpb24ub3AxLmNhbm9uaWNhbCwgY2UubmVnKHByb3Bvc2l0aW9uLm9wMi5jYW5vbmljYWwpXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgICAwXG4gICAgICAgIF0pLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBzb2xzLmxlbmd0aCA9PT0gMSA/IHNvbHNbMF0gOiBjZS5mbihcIkxpc3RcIiwgc29scyk7XG4gICAgY29uc3QgZGVmID0gY2UubG9va3VwU3ltYm9sKGxoczIpO1xuICAgIGlmICghZGVmKSB7XG4gICAgICBjZS5kZWZpbmVTeW1ib2wobGhzMiwgeyB2YWx1ZTogdmFsIH0pO1xuICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICB9XG4gICAgaWYgKGRlZi5kb21haW4gJiYgIXNvbHMuZXZlcnkoKHNvbCkgPT4gdmFsLmRvbWFpbi5pc0NvbXBhdGlibGUoc29sLmRvbWFpbikpKVxuICAgICAgcmV0dXJuIFwiY29udHJhZGljdGlvblwiO1xuICAgIGRlZi52YWx1ZSA9IHZhbDtcbiAgICByZXR1cm4gXCJva1wiO1xuICB9XG4gIGNlLmFzc3VtcHRpb25zLnNldChwcm9wb3NpdGlvbiwgdHJ1ZSk7XG4gIHJldHVybiBcIm9rXCI7XG59XG5mdW5jdGlvbiBhc3N1bWVJbmVxdWFsaXR5KHByb3Bvc2l0aW9uKSB7XG4gIGNvbnN0IGNlID0gcHJvcG9zaXRpb24uZW5naW5lO1xuICBpZiAocHJvcG9zaXRpb24ub3AxLnN5bWJvbCAmJiAhaGFzRGVmKGNlLCBwcm9wb3NpdGlvbi5vcDEuc3ltYm9sKSkge1xuICAgIGlmIChwcm9wb3NpdGlvbi5vcDIuZXZhbHVhdGUoKS5pc1plcm8pIHtcbiAgICAgIGlmIChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkxlc3NcIikge1xuICAgICAgICBjZS5kZWZpbmVTeW1ib2wocHJvcG9zaXRpb24ub3AxLnN5bWJvbCwge1xuICAgICAgICAgIGRvbWFpbjogY2UuZG9tYWluKFwiTmVnYXRpdmVOdW1iZXJcIilcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3Bvc2l0aW9uLmhlYWQgPT09IFwiTGVzc0VxdWFsXCIpIHtcbiAgICAgICAgY2UuZGVmaW5lU3ltYm9sKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wsIHtcbiAgICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIk5vblBvc2l0aXZlTnVtYmVyXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkdyZWF0ZXJcIikge1xuICAgICAgICBjZS5kZWZpbmVTeW1ib2wocHJvcG9zaXRpb24ub3AxLnN5bWJvbCwge1xuICAgICAgICAgIGRvbWFpbjogY2UuZG9tYWluKFwiUG9zaXRpdmVOdW1iZXJcIilcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHByb3Bvc2l0aW9uLmhlYWQgPT09IFwiR3JlYXRlckVxdWFsXCIpIHtcbiAgICAgICAgY2UuZGVmaW5lU3ltYm9sKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wsIHtcbiAgICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIk5vbk5lZ2F0aXZlTnVtYmVyXCIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjZS5kZWZpbmVTeW1ib2wocHJvcG9zaXRpb24ub3AxLnN5bWJvbCwge1xuICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIkV4dGVuZGVkUmVhbE51bWJlclwiKVxuICAgICAgfSk7XG4gICAgICBjZS5hc3N1bXB0aW9ucy5zZXQocHJvcG9zaXRpb24sIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gXCJva1wiO1xuICB9XG4gIGxldCBvcDMgPSBcIlwiO1xuICBsZXQgbGhzO1xuICBsZXQgcmhzO1xuICBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJMZXNzXCIpIHtcbiAgICBsaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgcmhzID0gcHJvcG9zaXRpb24ub3AyO1xuICAgIG9wMyA9IFwiPFwiO1xuICB9IGVsc2UgaWYgKHByb3Bvc2l0aW9uLmhlYWQgPT09IFwiTGVzc0VxdWFsXCIpIHtcbiAgICBsaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgcmhzID0gcHJvcG9zaXRpb24ub3AyO1xuICAgIG9wMyA9IFwiPD1cIjtcbiAgfSBlbHNlIGlmIChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkdyZWF0ZXJcIikge1xuICAgIGxocyA9IHByb3Bvc2l0aW9uLm9wMjtcbiAgICByaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgb3AzID0gXCI8XCI7XG4gIH0gZWxzZSBpZiAocHJvcG9zaXRpb24uaGVhZCA9PT0gXCJHcmVhdGVyRXF1YWxcIikge1xuICAgIGxocyA9IHByb3Bvc2l0aW9uLm9wMjtcbiAgICByaHMgPSBwcm9wb3NpdGlvbi5vcDE7XG4gICAgb3AzID0gXCI8PVwiO1xuICB9XG4gIGlmICghb3AzKVxuICAgIHJldHVybiBcImludGVybmFsLWVycm9yXCI7XG4gIGNvbnN0IHAgPSBjZS5hZGQoW2xocy5jYW5vbmljYWwsIGNlLm5lZyhyaHMuY2Fub25pY2FsKV0pLnNpbXBsaWZ5KCk7XG4gIGNvbnN0IHJlc3VsdCA9IGNlLmJveChbb3AzID09PSBcIjxcIiA/IFwiTGVzc1wiIDogXCJMZXNzRXF1YWxcIiwgcCwgMF0pLmV2YWx1YXRlKCk7XG4gIGlmIChyZXN1bHQuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICByZXR1cm4gXCJ0YXV0b2xvZ3lcIjtcbiAgaWYgKHJlc3VsdC5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gIGNvbnN0IGZyZWVWYXJzID0gcmVzdWx0LmZyZWVWYXJzO1xuICBpZiAoZnJlZVZhcnMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xuICBpZiAoZnJlZVZhcnMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKCFjZS5sb29rdXBTeW1ib2woZnJlZVZhcnNbMF0pKVxuICAgICAgY2UuZGVmaW5lU3ltYm9sKGZyZWVWYXJzWzBdLCB7IGRvbWFpbjogXCJFeHRlbmRlZFJlYWxOdW1iZXJcIiB9KTtcbiAgfVxuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQocmVzdWx0LmhlYWQgPT09IFwiTGVzc1wiIHx8IHJlc3VsdC5oZWFkID09PSBcIkxlc3NFcXVhbFwiKTtcbiAgY2UuYXNzdW1wdGlvbnMuc2V0KHJlc3VsdCwgdHJ1ZSk7XG4gIHJldHVybiBcIm9rXCI7XG59XG5mdW5jdGlvbiBhc3N1bWVFbGVtZW50KHByb3Bvc2l0aW9uKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChwcm9wb3NpdGlvbi5oZWFkID09PSBcIkVsZW1lbnRcIik7XG4gIGNvbnN0IGNlID0gcHJvcG9zaXRpb24uZW5naW5lO1xuICBjb25zdCB1bmRlZnMgPSB1bmRlZmluZWRJZGVudGlmaWVycyhwcm9wb3NpdGlvbi5vcDEpO1xuICBpZiAodW5kZWZzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGRvbSA9IGNlLmRvbWFpbihwcm9wb3NpdGlvbi5vcDIuZXZhbHVhdGUoKS5qc29uKTtcbiAgICBpZiAoIWRvbS5pc1ZhbGlkKVxuICAgICAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG4gICAgaWYgKGRvbS5pc0NvbXBhdGlibGUoXCJGdW5jdGlvblwiKSlcbiAgICAgIGNlLmRlZmluZUZ1bmN0aW9uKHVuZGVmc1swXSwgeyBzaWduYXR1cmU6IHsgZG9tYWluOiBcIkZ1bmN0aW9uXCIgfSB9KTtcbiAgICBlbHNlXG4gICAgICBjZS5kZWZpbmVTeW1ib2wodW5kZWZzWzBdLCB7IGRvbWFpbjogZG9tIH0pO1xuICAgIHJldHVybiBcIm9rXCI7XG4gIH1cbiAgaWYgKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wgJiYgaGFzRGVmKGNlLCBwcm9wb3NpdGlvbi5vcDEuc3ltYm9sKSkge1xuICAgIGNvbnN0IGRvbSA9IGNlLmRvbWFpbihwcm9wb3NpdGlvbi5vcDIuZXZhbHVhdGUoKS5qc29uKTtcbiAgICBpZiAoIWRvbS5pc1ZhbGlkKVxuICAgICAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG4gICAgY29uc3QgZGVmID0gY2UubG9va3VwU3ltYm9sKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wpO1xuICAgIGlmIChkZWYpIHtcbiAgICAgIGlmIChkZWYuZG9tYWluICYmICFkb20uaXNDb21wYXRpYmxlKGRlZi5kb21haW4pKVxuICAgICAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gICAgICBkZWYuZG9tYWluID0gZG9tO1xuICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICB9XG4gICAgY29uc3QgZmRlZiA9IGNlLmxvb2t1cEZ1bmN0aW9uKHByb3Bvc2l0aW9uLm9wMS5zeW1ib2wpO1xuICAgIGlmIChmZGVmPy5zaWduYXR1cmU/LmRvbWFpbikge1xuICAgICAgaWYgKCFkb20uaXNDb21wYXRpYmxlKGZkZWYuc2lnbmF0dXJlLmRvbWFpbikpXG4gICAgICAgIHJldHVybiBcImNvbnRyYWRpY3Rpb25cIjtcbiAgICAgIGlmIChkb20uaXNDb21wYXRpYmxlKGZkZWYuc2lnbmF0dXJlLmRvbWFpbiwgXCJiaXZhcmlhbnRcIikpXG4gICAgICAgIHJldHVybiBcInRhdXRvbG9neVwiO1xuICAgICAgcmV0dXJuIFwibm90LWEtcHJlZGljYXRlXCI7XG4gICAgfVxuICAgIHJldHVybiBcIm9rXCI7XG4gIH1cbiAgaWYgKHVuZGVmcy5sZW5ndGggPiAwKSB7XG4gICAgY2UuYXNzdW1wdGlvbnMuc2V0KHByb3Bvc2l0aW9uLCB0cnVlKTtcbiAgICByZXR1cm4gXCJva1wiO1xuICB9XG4gIGNvbnN0IHZhbCA9IHByb3Bvc2l0aW9uLmV2YWx1YXRlKCk7XG4gIGlmICh2YWwuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICByZXR1cm4gXCJ0YXV0b2xvZ3lcIjtcbiAgaWYgKHZhbC5zeW1ib2wgPT09IFwiRmFsc2VcIilcbiAgICByZXR1cm4gXCJjb250cmFkaWN0aW9uXCI7XG4gIHJldHVybiBcIm5vdC1hLXByZWRpY2F0ZVwiO1xufVxuZnVuY3Rpb24gaGFzRGVmKGNlLCBzKSB7XG4gIHJldHVybiAoY2UubG9va3VwU3ltYm9sKHMpID8/IGNlLmxvb2t1cEZ1bmN0aW9uKHMpKSAhPT0gdm9pZCAwO1xufVxuZnVuY3Rpb24gdW5kZWZpbmVkSWRlbnRpZmllcnMoZXhwcikge1xuICByZXR1cm4gZXhwci5zeW1ib2xzLmZpbHRlcigoeCkgPT4gIWhhc0RlZihleHByLmVuZ2luZSwgeCkpO1xufVxuZnVuY3Rpb24gaGFzVmFsdWUoY2UsIHMpIHtcbiAgaWYgKGNlLmxvb2t1cEZ1bmN0aW9uKHMpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNlLmxvb2t1cFN5bWJvbChzKT8udmFsdWUgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzSW5lcXVhbGl0eShleHByKSB7XG4gIGNvbnN0IGggPSBleHByLmhlYWQ7XG4gIGlmICh0eXBlb2YgaCAhPT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBbXCJMZXNzXCIsIFwiR3JlYXRlclwiLCBcIkxlc3NFcXVhbFwiLCBcIkdyZWF0ZXJFcXVhbFwiXS5pbmNsdWRlcyhoKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vYm94LnRzXG52YXIgaW1wb3J0X2NvbXBsZXgxMyA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1kaWN0aW9uYXJ5LnRzXG52YXIgQm94ZWREaWN0aW9uYXJ5ID0gY2xhc3MgX0JveGVkRGljdGlvbmFyeSBleHRlbmRzIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY2UsIGRpY3QsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID8/IChvcHRpb25zID0ge30pO1xuICAgIHN1cGVyKGNlLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgICB0aGlzLl92YWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3QgY2Fub25pY2FsMiA9IG9wdGlvbnMuY2Fub25pY2FsID8/IHRydWU7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZGljdCkpXG4gICAgICB0aGlzLl92YWx1ZS5zZXQoa2V5LCBjZS5ib3goZGljdFtrZXldLCB7IGNhbm9uaWNhbDogY2Fub25pY2FsMiB9KSk7XG4gICAgY2UuX3JlZ2lzdGVyKHRoaXMpO1xuICB9XG4gIHVuYmluZCgpIHtcbiAgICBmb3IgKGNvbnN0IFtfaywgdl0gb2YgdGhpcy5fdmFsdWUpXG4gICAgICB2LnVuYmluZCgpO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGhhc2goKSB7XG4gICAgbGV0IGggPSBoYXNoQ29kZShcIkRpY3Rpb25hcnlcIik7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgdGhpcy5fdmFsdWUpXG4gICAgICBoIF49IGhhc2hDb2RlKGspIF4gdi5oYXNoO1xuICAgIHJldHVybiBoO1xuICB9XG4gIGdldCBjb21wbGV4aXR5KCkge1xuICAgIHJldHVybiA5NztcbiAgfVxuICBnZXQgaGVhZCgpIHtcbiAgICByZXR1cm4gXCJEaWN0aW9uYXJ5XCI7XG4gIH1cbiAgZ2V0IGlzUHVyZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0S2V5KGtleSkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5nZXQoa2V5KTtcbiAgfVxuICBoYXNLZXkoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmhhcyhrZXkpO1xuICB9XG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5rZXlzKCk7XG4gIH1cbiAgZ2V0IGtleXNDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUuc2l6ZTtcbiAgfVxuICBoYXMoeCkge1xuICAgIGZvciAoY29uc3QgW19rLCB2XSBvZiB0aGlzLl92YWx1ZSlcbiAgICAgIGlmICh2Lmhhcyh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBkb21haW4oKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW1wiRGljdGlvbmFyeVwiXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzLl92YWx1ZSlcbiAgICAgIHJlc3VsdC5wdXNoKFtcIlR1cGxlXCIsIGssIHYuZG9tYWluXSk7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLmRvbWFpbihyZXN1bHQpO1xuICB9XG4gIGdldCBqc29uKCkge1xuICAgIGlmICh0aGlzLmVuZ2luZS5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMuc2hvcnRoYW5kcy5pbmNsdWRlcyhcImRpY3Rpb25hcnlcIikpIHtcbiAgICAgIGNvbnN0IGRpY3QgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuX3ZhbHVlLmtleXMoKSlcbiAgICAgICAgZGljdFtrZXldID0gdGhpcy5fdmFsdWUuZ2V0KGtleSkuanNvbjtcbiAgICAgIHJldHVybiB7IGRpY3QgfTtcbiAgICB9XG4gICAgY29uc3Qga3ZzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5fdmFsdWUua2V5cygpKVxuICAgICAga3ZzLnB1c2goXG4gICAgICAgIHRoaXMuZW5naW5lLl9mbihcIktleVZhbHVlUGFpclwiLCBbXG4gICAgICAgICAgdGhpcy5lbmdpbmUuc3RyaW5nKGtleSksXG4gICAgICAgICAgdGhpcy5fdmFsdWUuZ2V0KGtleSlcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbih0aGlzLmVuZ2luZSwgXCJEaWN0aW9uYXJ5XCIsIGt2cywge1xuICAgICAgbGF0ZXg6IHRoaXMuX2xhdGV4XG4gICAgfSk7XG4gIH1cbiAgLyoqIFN0cnVjdHVyYWwgZXF1YWxpdHkgKi9cbiAgaXNTYW1lKHJocykge1xuICAgIGlmICh0aGlzID09PSByaHMpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIShyaHMgaW5zdGFuY2VvZiBfQm94ZWREaWN0aW9uYXJ5KSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5fdmFsdWUuc2l6ZSAhPT0gcmhzLl92YWx1ZS5zaXplKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHRoaXMuX3ZhbHVlKSB7XG4gICAgICBjb25zdCByaHNWID0gcmhzLmdldEtleShrKTtcbiAgICAgIGlmICghcmhzViB8fCAhdi5pc1NhbWUocmhzVikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbWF0Y2gocmhzLCBfb3B0aW9ucykge1xuICAgIGlmICghKHJocyBpbnN0YW5jZW9mIF9Cb3hlZERpY3Rpb25hcnkpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuX3ZhbHVlLnNpemUgIT09IHJocy5fdmFsdWUuc2l6ZSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzLl92YWx1ZSkge1xuICAgICAgY29uc3QgcmhzViA9IHJocy5nZXRLZXkoayk7XG4gICAgICBpZiAoIXJoc1YpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbSA9IHYubWF0Y2gocmhzVik7XG4gICAgICBpZiAobSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICByZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4ubSB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKiBNYXRoZW1hdGljYWwgZXF1YWxpdHkgKi9cbiAgaXNFcXVhbChyaHMpIHtcbiAgICBpZiAodGhpcyA9PT0gcmhzKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX0JveGVkRGljdGlvbmFyeSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFyaHMua2V5cyB8fCB0aGlzLl92YWx1ZS5zaXplICE9PSByaHMuX3ZhbHVlLnNpemUpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgdGhpcy5fdmFsdWUpIHtcbiAgICAgIGNvbnN0IHJoc1YgPSByaHMuZ2V0S2V5KGspO1xuICAgICAgaWYgKCFyaHNWIHx8ICF2LmlzRXF1YWwocmhzVikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXBwbHkoZm4sIGhlYWQyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzKVxuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmVuZ2luZS5ib3goZm4odGhpcy5nZXRLZXkoa2V5KSkpO1xuICAgIGlmIChoZWFkMilcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbihoZWFkMiwgW3sgZGljdDogcmVzdWx0IH1dKTtcbiAgICByZXR1cm4gbmV3IF9Cb3hlZERpY3Rpb25hcnkodGhpcy5lbmdpbmUsIHJlc3VsdCk7XG4gIH1cbiAgZXZhbHVhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFwcGx5KCh4KSA9PiB4LmV2YWx1YXRlKG9wdGlvbnMpID8/IHgpO1xuICB9XG4gIGdldCBpc0Nhbm9uaWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNDYW5vbmljYWw7XG4gIH1cbiAgc2V0IGlzQ2Fub25pY2FsKHZhbCkge1xuICAgIHRoaXMuX2lzQ2Fub25pY2FsID0gdmFsO1xuICB9XG4gIGdldCBjYW5vbmljYWwoKSB7XG4gICAgaWYgKHRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5KCh4KSA9PiB4LmNhbm9uaWNhbCk7XG4gICAgcmVzdWx0LmlzQ2Fub25pY2FsID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHNpbXBsaWZ5KG9wdGlvbnMpIHtcbiAgICBpZiAoIShvcHRpb25zPy5yZWN1cnNpdmUgPz8gdHJ1ZSkpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gdGhpcy5hcHBseSgoeCkgPT4geC5zaW1wbGlmeShvcHRpb25zKSA/PyB4KTtcbiAgfVxuICBOKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseSgoeCkgPT4geC5OKG9wdGlvbnMpKTtcbiAgfVxuICByZXBsYWNlKHJ1bGVzLCBvcHRpb25zKSB7XG4gICAgbGV0IGNoYW5nZUNvdW50ID0gMDtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleXMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0S2V5KGtleSk7XG4gICAgICBjb25zdCBuZXdWYWwgPSB2YWwucmVwbGFjZShydWxlcywgb3B0aW9ucyk7XG4gICAgICBpZiAobmV3VmFsICE9PSBudWxsKVxuICAgICAgICBjaGFuZ2VDb3VudCArPSAxO1xuICAgICAgcmVzdWx0W2tleV0gPSBuZXdWYWwgPz8gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlQ291bnQgPT09IDAgPyBudWxsIDogbmV3IF9Cb3hlZERpY3Rpb25hcnkodGhpcy5lbmdpbmUsIHJlc3VsdCk7XG4gIH1cbiAgc3VicyhzdWIyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzKVxuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmdldEtleShrZXkpLnN1YnMoc3ViMiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBfQm94ZWREaWN0aW9uYXJ5KHRoaXMuZW5naW5lLCByZXN1bHQsIG9wdGlvbnMpO1xuICB9XG59O1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1mdW5jdGlvbi50c1xudmFyIGltcG9ydF9jb21wbGV4MTAgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL3NpbXBsaWZ5LXJ1bGVzLnRzXG52YXIgU0lNUExJRllfUlVMRVMgPSBbXTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vYm94ZWQtZnVuY3Rpb24udHNcbmZ1bmN0aW9uIGNoZWFwZXN0KG9sZEV4cHIsIG5ld0V4cHIpIHtcbiAgaWYgKG5ld0V4cHIgPT09IG51bGwgfHwgbmV3RXhwciA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBvbGRFeHByO1xuICBpZiAob2xkRXhwciA9PT0gbmV3RXhwcilcbiAgICByZXR1cm4gb2xkRXhwcjtcbiAgY29uc3QgY2UgPSBvbGRFeHByLmVuZ2luZTtcbiAgY29uc3QgYm94ZWROZXdFeHByID0gY2UuYm94KG5ld0V4cHIpO1xuICBpZiAoY2UuY29zdEZ1bmN0aW9uKGJveGVkTmV3RXhwcikgPD0gMS4yICogY2UuY29zdEZ1bmN0aW9uKG9sZEV4cHIpKSB7XG4gICAgcmV0dXJuIGJveGVkTmV3RXhwcjtcbiAgfVxuICByZXR1cm4gb2xkRXhwcjtcbn1cbnZhciBCb3hlZEZ1bmN0aW9uID0gY2xhc3MgX0JveGVkRnVuY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBoZWFkMiwgb3BzMiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPz8gKG9wdGlvbnMgPSB7fSk7XG4gICAgb3B0aW9ucy5jYW5vbmljYWwgPz8gKG9wdGlvbnMuY2Fub25pY2FsID0gZmFsc2UpO1xuICAgIHN1cGVyKGNlLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgICB0aGlzLl9zY29wZSA9IGNlLmNvbnRleHQ7XG4gICAgdGhpcy5faGVhZCA9IGhlYWQyO1xuICAgIHRoaXMuX29wcyA9IG9wczI7XG4gICAgdGhpcy5fZGVmID0gb3B0aW9ucy5kZWYgPz8gbnVsbDtcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwpIHtcbiAgICAgIGlmICghdGhpcy5fZGVmKVxuICAgICAgICB0aGlzLl9kZWYgPSBjZS5sb29rdXBGdW5jdGlvbihoZWFkMiwgY2UuY29udGV4dCk7XG4gICAgICB0aGlzLl9jYW5vbmljYWwgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9jb2RvbWFpbiA9IG51bGw7XG4gICAgaWYgKCFvcHRpb25zLmNhbm9uaWNhbCkge1xuICAgICAgdGhpcy5fY29kb21haW4gPSBjZS5kb21haW4oXCJBbnl0aGluZ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkICE9PSBcInN0cmluZ1wiKVxuICAgICAgICB0aGlzLl9jb2RvbWFpbiA9IHRoaXMuX2hlYWQuZG9tYWluLmNvZG9tYWluO1xuICAgICAgZWxzZSBpZiAodGhpcy5fZGVmKSB7XG4gICAgICAgIGNvbnN0IHNpZyA9IHRoaXMuX2RlZi5zaWduYXR1cmU7XG4gICAgICAgIGlmICh0eXBlb2Ygc2lnLmNvZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aGlzLl9jb2RvbWFpbiA9IHNpZy5jb2RvbWFpbihjZSwgdGhpcy5fb3BzKSA/PyBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NvZG9tYWluID0gc2lnLmNvZG9tYWluID8/IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fY29kb21haW4pXG4gICAgICAgIHRoaXMuX2NvZG9tYWluID0gY2UuZGVmYXVsdERvbWFpbiA/PyBjZS5kb21haW4oXCJWb2lkXCIpO1xuICAgIH1cbiAgICBjZS5fcmVnaXN0ZXIodGhpcyk7XG4gIH1cbiAgLy9cbiAgLy8gTk9OLUNBTk9OSUNBTCBPUiBDQU5PTklDQUwgT1BFUkFUSU9OU1xuICAvL1xuICAvLyBUaG9zZSBvcGVyYXRpb25zL3Byb3BlcnRpZXMgY2FuIGJlIGFwcGxpZWQgdG8gYSBjYW5vbmljYWwgb3JcbiAgLy8gbm9uLWNhbm9uaWNhbCBleHByZXNzaW9uXG4gIC8vXG4gIGdldCBoYXNoKCkge1xuICAgIGlmICh0aGlzLl9oYXNoICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICBsZXQgaCA9IDA7XG4gICAgZm9yIChjb25zdCBvcDMgb2YgdGhpcy5fb3BzKVxuICAgICAgaCA9IGggPDwgMSBeIG9wMy5oYXNoIHwgMDtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYWQgPT09IFwic3RyaW5nXCIpXG4gICAgICBoID0gaCBeIGhhc2hDb2RlKHRoaXMuX2hlYWQpIHwgMDtcbiAgICBlbHNlXG4gICAgICBoID0gaCBeIHRoaXMuX2hlYWQuaGFzaCB8IDA7XG4gICAgdGhpcy5faGFzaCA9IGg7XG4gICAgcmV0dXJuIGg7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0aGlzLl9jYW5vbmljYWwgPT09IHRoaXM7XG4gIH1cbiAgc2V0IGlzQ2Fub25pY2FsKHZhbCkge1xuICAgIHRoaXMuX2Nhbm9uaWNhbCA9IHZhbCA/IHRoaXMgOiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzUHVyZSgpIHtcbiAgICBpZiAodGhpcy5faXNQdXJlICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gdGhpcy5faXNQdXJlO1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCkge1xuICAgICAgdGhpcy5faXNQdXJlID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSB2b2lkIDA7XG4gICAgaWYgKHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uPy5wdXJlICE9PSB2b2lkIDApXG4gICAgICByZXN1bHQgPSB0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbi5wdXJlO1xuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKVxuICAgICAgcmVzdWx0ID0gdGhpcy5fb3BzLmV2ZXJ5KCh4KSA9PiB4LmlzUHVyZSk7XG4gICAgdGhpcy5faXNQdXJlID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0IGpzb24oKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCAmJiB0aGlzLl9jYW5vbmljYWwgPT09IHRoaXMpXG4gICAgICByZXR1cm4gc2VyaWFsaXplSnNvbkNhbm9uaWNhbEZ1bmN0aW9uKFxuICAgICAgICB0aGlzLmVuZ2luZSxcbiAgICAgICAgdGhpcy5faGVhZCxcbiAgICAgICAgdGhpcy5fb3BzLFxuICAgICAgICB7IGxhdGV4OiB0aGlzLl9sYXRleCwgd2lraWRhdGE6IHRoaXMuX3dpa2lkYXRhIH1cbiAgICAgICk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbih0aGlzLmVuZ2luZSwgdGhpcy5faGVhZCwgdGhpcy5fb3BzLCB7XG4gICAgICBsYXRleDogdGhpcy5fbGF0ZXgsXG4gICAgICB3aWtpZGF0YTogdGhpcy5fd2lraWRhdGFcbiAgICB9KTtcbiAgfVxuICBnZXQgcmF3SnNvbigpIHtcbiAgICBjb25zdCBoZWFkMiA9IHR5cGVvZiB0aGlzLl9oZWFkID09PSBcInN0cmluZ1wiID8gdGhpcy5faGVhZCA6IHRoaXMuX2hlYWQuanNvbjtcbiAgICByZXR1cm4gW2hlYWQyLCAuLi50aGlzLm9wcy5tYXAoKHgpID0+IHgucmF3SnNvbildO1xuICB9XG4gIGdldCBzY29wZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NvcGU7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWQ7XG4gIH1cbiAgZ2V0IG9wcygpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BzO1xuICB9XG4gIGdldCBub3BzKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHMubGVuZ3RoO1xuICB9XG4gIGdldCBvcDEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wc1swXSA/PyB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBvcDIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wc1sxXSA/PyB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBvcDMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wc1syXSA/PyB0aGlzLmVuZ2luZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICB9XG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIGlmICh0aGlzLl9oZWFkID09PSBcIkVycm9yXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkICE9PSBcInN0cmluZ1wiICYmICF0aGlzLl9oZWFkLmlzVmFsaWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuX29wcy5ldmVyeSgoeCkgPT4geC5pc1ZhbGlkKTtcbiAgfVxuICBnZXQgY2Fub25pY2FsKCkge1xuICAgIGlmICh0aGlzLl9jYW5vbmljYWwpXG4gICAgICByZXR1cm4gdGhpcy5fY2Fub25pY2FsO1xuICAgIHRoaXMuX2Nhbm9uaWNhbCA9IHRoaXMuaXNWYWxpZCA/IG1ha2VDYW5vbmljYWxGdW5jdGlvbih0aGlzLmVuZ2luZSwgdGhpcy5faGVhZCwgdGhpcy5fb3BzKSA6IHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuX2Nhbm9uaWNhbDtcbiAgfVxuICAqbWFwKGZuKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgdGhpcy5fb3BzLmxlbmd0aClcbiAgICAgIHlpZWxkIGZuKHRoaXMuX29wc1tpKytdKTtcbiAgfVxuICBzdWJzKHN1YjIsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIG9wdGlvbnMuY2Fub25pY2FsID0gdHJ1ZTtcbiAgICBjb25zdCBvcHMyID0gdGhpcy5fb3BzLm1hcCgoeCkgPT4geC5zdWJzKHN1YjIsIG9wdGlvbnMpKTtcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgb3BzMi5ldmVyeSgoeCkgPT4geC5pc1ZhbGlkKSlcbiAgICAgIHJldHVybiBtYWtlQ2Fub25pY2FsRnVuY3Rpb24odGhpcy5lbmdpbmUsIHRoaXMuX2hlYWQsIG9wczIpO1xuICAgIHJldHVybiBuZXcgX0JveGVkRnVuY3Rpb24odGhpcy5lbmdpbmUsIHRoaXMuX2hlYWQsIG9wczIsIHtcbiAgICAgIGNhbm9uaWNhbDogZmFsc2VcbiAgICB9KTtcbiAgfVxuICByZXBsYWNlKHJ1bGVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHJlcGxhY2UodGhpcywgcnVsZXMsIG9wdGlvbnMpO1xuICB9XG4gIGhhcyh4KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWQgPT09IHgpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHguaW5jbHVkZXModGhpcy5faGVhZCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLl9vcHMpXG4gICAgICBpZiAoYXJnLmhhcyh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKiBgaXNTYW1lYCBpcyBzdHJ1Y3R1cmFsL3N5bWJvbGljIGVxdWFsaXR5ICovXG4gIGlzU2FtZShyaHMpIHtcbiAgICBpZiAodGhpcyA9PT0gcmhzKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX0JveGVkRnVuY3Rpb24pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLm5vcHMgIT09IHJocy5ub3BzKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5oZWFkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5oZWFkICE9PSByaHMuaGVhZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHJocy5oZWFkID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBlbHNlIGlmICghcmhzLmhlYWQgfHwgIXRoaXMuaGVhZC5pc1NhbWUocmhzLmhlYWQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxoc1RhaWwgPSB0aGlzLl9vcHM7XG4gICAgY29uc3QgcmhzVGFpbCA9IHJocy5fb3BzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGhzVGFpbC5sZW5ndGg7IGkrKylcbiAgICAgIGlmICghbGhzVGFpbFtpXS5pc1NhbWUocmhzVGFpbFtpXSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBtYXRjaChyaHMsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShyaHMgaW5zdGFuY2VvZiBfQm94ZWRGdW5jdGlvbikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgaWYgKHR5cGVvZiB0aGlzLmhlYWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmICh0aGlzLmhlYWQgIT09IHJocy5oZWFkKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiByaHMuaGVhZCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFyaHMuaGVhZClcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgbSA9IHRoaXMuaGVhZC5tYXRjaChyaHMuaGVhZCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChtID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4ubSB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsaHNUYWlsID0gdGhpcy5fb3BzO1xuICAgIGNvbnN0IHJoc1RhaWwgPSByaHMuX29wcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxoc1RhaWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG0gPSBsaHNUYWlsW2ldLm1hdGNoKHJoc1RhaWxbaV0sIG9wdGlvbnMpO1xuICAgICAgaWYgKG0gPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmVzdWx0ID0geyAuLi5yZXN1bHQsIC4uLm0gfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvL1xuICAvLyBDQU5PTklDQUwgT1BFUkFUSU9OU1xuICAvL1xuICAvLyBUaGVzZSBvcGVyYXRpb25zIGFwcGx5IG9ubHkgdG8gY2Fub25pY2FsIGV4cHJlc3Npb25zXG4gIC8vXG4gIHVuYmluZCgpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICB0aGlzLl9udW1lcmljVmFsdWUgPSB2b2lkIDA7XG4gIH1cbiAgZ2V0IHdpa2lkYXRhKCkge1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgcmV0dXJuIHRoaXMuX3dpa2lkYXRhID8/IHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uPy53aWtpZGF0YSA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgY29uc3QgZGVmID0gdGhpcy5mdW5jdGlvbkRlZmluaXRpb247XG4gICAgaWYgKCFkZWYpXG4gICAgICByZXR1cm4gW107XG4gICAgaWYgKCFkZWYuZGVzY3JpcHRpb24pXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICh0eXBlb2YgZGVmLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIFtkZWYuZGVzY3JpcHRpb25dO1xuICAgIHJldHVybiBkZWYuZGVzY3JpcHRpb247XG4gIH1cbiAgZ2V0IHVybCgpIHtcbiAgICBpZiAoIXRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbkRlZmluaXRpb24/LnVybCA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGNvbXBsZXhpdHkoKSB7XG4gICAgaWYgKCF0aGlzLmlzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbkRlZmluaXRpb24/LmNvbXBsZXhpdHkgPz8gREVGQVVMVF9DT01QTEVYSVRZO1xuICB9XG4gIGdldCBmdW5jdGlvbkRlZmluaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmlzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBpZiAodGhpcy5fZGVmICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuX2RlZjtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGJpbmQoX3Njb3BlKSB7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCB8fCAhdGhpcy5pc1B1cmUpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICghdGhpcy5fdmFsdWUpXG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZXZhbHVhdGUoKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgLyoqIGBpc0VxdWFsYCBpcyBtYXRoZW1hdGljYWwgZXF1YWxpdHkgKi9cbiAgaXNFcXVhbChyaHMpIHtcbiAgICBjb25zdCBzID0gc2lnbkRpZmYodGhpcywgcmhzKTtcbiAgICBpZiAocyA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChzICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGlmZiA9IHRoaXMuZW5naW5lLmJveChbXCJTdWJ0cmFjdFwiLCB0aGlzLCByaHNdKS5zaW1wbGlmeSgpO1xuICAgIGlmIChkaWZmLmlzWmVybylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmlzU2FtZShyaHMpO1xuICB9XG4gIGlzTGVzcyhyaHMpIHtcbiAgICBjb25zdCBzID0gc2lnbkRpZmYodGhpcywgcmhzKTtcbiAgICBpZiAocyA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8IDA7XG4gIH1cbiAgaXNMZXNzRXF1YWwocmhzKSB7XG4gICAgY29uc3QgcyA9IHNpZ25EaWZmKHRoaXMsIHJocyk7XG4gICAgaWYgKHMgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgcmV0dXJuIHMgPD0gMDtcbiAgfVxuICBpc0dyZWF0ZXIocmhzKSB7XG4gICAgY29uc3QgcyA9IHNpZ25EaWZmKHRoaXMsIHJocyk7XG4gICAgaWYgKHMgPT09IHZvaWQgMClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgcmV0dXJuIHMgPiAwO1xuICB9XG4gIGlzR3JlYXRlckVxdWFsKHJocykge1xuICAgIGNvbnN0IHMgPSBzaWduRGlmZih0aGlzLCByaHMpO1xuICAgIGlmIChzID09PSB2b2lkIDApXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIHJldHVybiBzID49IDA7XG4gIH1cbiAgZ2V0IGlzWmVybygpIHtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IG51bGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBzID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHMgPT09IDA7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNOb3RaZXJvKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHMgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gcyAhPT0gMDtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc09uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VxdWFsKHRoaXMuZW5naW5lLl9PTkUpO1xuICB9XG4gIGdldCBpc05lZ2F0aXZlT25lKCkge1xuICAgIHJldHVybiB0aGlzLmlzRXF1YWwodGhpcy5lbmdpbmUuX05FR0FUSVZFX09ORSk7XG4gIH1cbiAgLy8geCA+IDBcbiAgZ2V0IGlzUG9zaXRpdmUoKSB7XG4gICAgY29uc3QgcyA9IHRoaXMuc2duO1xuICAgIGlmIChzID09PSBudWxsKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBzID4gMDtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPD0gMFxuICBnZXQgaXNOb25Qb3NpdGl2ZSgpIHtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IG51bGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBzID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHMgPD0gMDtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIC8vIHggPCAwXG4gIGdldCBpc05lZ2F0aXZlKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHMgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gcyA8IDA7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvLyB4ID49IDBcbiAgZ2V0IGlzTm9uTmVnYXRpdmUoKSB7XG4gICAgY29uc3QgcyA9IHRoaXMuc2duO1xuICAgIGlmIChzID09PSBudWxsKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBzID49IDA7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluLmlzQ29tcGF0aWJsZShcIk51bWJlclwiKTtcbiAgfVxuICBnZXQgaXNJbnRlZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJJbnRlZ2VyXCIpO1xuICB9XG4gIGdldCBpc1JhdGlvbmFsKCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJSYXRpb25hbE51bWJlclwiKTtcbiAgfVxuICBnZXQgaXNBbGdlYnJhaWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluLmlzQ29tcGF0aWJsZShcIkFsZ2VicmFpY051bWJlclwiKTtcbiAgfVxuICBnZXQgaXNSZWFsKCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJSZWFsTnVtYmVyXCIpO1xuICB9XG4gIGdldCBpc0V4dGVuZGVkUmVhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21haW4uaXNDb21wYXRpYmxlKFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCIpO1xuICB9XG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tYWluLmlzQ29tcGF0aWJsZShcIkNvbXBsZXhOdW1iZXJcIik7XG4gIH1cbiAgZ2V0IGlzSW1hZ2luYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmRvbWFpbi5pc0NvbXBhdGlibGUoXCJJbWFnaW5hcnlOdW1iZXJcIik7XG4gIH1cbiAgZ2V0IHNnbigpIHtcbiAgICBpZiAoIXRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGNvbnN0IGhlYWQyID0gdGhpcy5oZWFkO1xuICAgIGlmIChoZWFkMiA9PT0gXCJOZWdhdGVcIikge1xuICAgICAgY29uc3QgcyA9IHRoaXMuX29wc1swXT8uc2duO1xuICAgICAgaWYgKHMgPT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBzID09PSAwID8gMCA6IHMgPiAwID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiTXVsdGlwbHlcIikge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLl9vcHMucmVkdWNlKChhY2MsIHgpID0+IGFjYyAqICh4LnNnbiA/PyBOYU4pLCAxKTtcbiAgICAgIGlmIChpc05hTih0b3RhbCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgaWYgKHRvdGFsID4gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBpZiAodG90YWwgPCAwKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkFkZFwiKSB7XG4gICAgICBsZXQgcG9zQ291bnQgPSAwO1xuICAgICAgbGV0IG5lZ0NvdW50ID0gMDtcbiAgICAgIGxldCB6ZXJvQ291bnQgPSAwO1xuICAgICAgY29uc3QgY291bnQgPSB0aGlzLl9vcHMubGVuZ3RoO1xuICAgICAgZm9yIChjb25zdCBvcDMgb2YgdGhpcy5fb3BzKSB7XG4gICAgICAgIGNvbnN0IHMgPSBvcDMuc2duO1xuICAgICAgICBpZiAocyA9PT0gbnVsbCB8fCBzID09PSB2b2lkIDApXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChzID09PSAwKVxuICAgICAgICAgIHplcm9Db3VudCArPSAxO1xuICAgICAgICBpZiAocyA+IDApXG4gICAgICAgICAgcG9zQ291bnQgKz0gMTtcbiAgICAgICAgaWYgKHMgPCAwKVxuICAgICAgICAgIG5lZ0NvdW50ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoemVyb0NvdW50ID09PSBjb3VudClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAocG9zQ291bnQgPT09IGNvdW50KVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmIChuZWdDb3VudCA9PT0gY291bnQpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiRGl2aWRlXCIpIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLl9vcHNbMF0/LnNnbjtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLl9vcHNbMV0/LnNnbjtcbiAgICAgIGlmIChuID09PSBudWxsIHx8IGQgPT09IG51bGwgfHwgbiA9PT0gdm9pZCAwIHx8IGQgPT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAobiA+IDAgJiYgZCA+IDAgfHwgbiA8IDAgJiYgZCA8IDApXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiU3F1YXJlXCIpIHtcbiAgICAgIGlmICh0aGlzLl9vcHNbMF0/LmlzSW1hZ2luYXJ5KVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAodGhpcy5fb3BzWzBdPy5pc1plcm8pXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJBYnNcIikge1xuICAgICAgaWYgKHRoaXMuX29wc1swXT8uaXNaZXJvKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiU3FydFwiKSB7XG4gICAgICBpZiAodGhpcy5fb3BzWzBdPy5pc1plcm8pXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgaWYgKHRoaXMuX29wc1swXT8uaXNJbWFnaW5hcnkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJQb3dlclwiKSB7XG4gICAgfVxuICAgIGlmIChoZWFkMiA9PT0gXCJSb290XCIpIHtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkxuXCIpIHtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkZsb29yXCIpIHtcbiAgICB9XG4gICAgaWYgKGhlYWQyID09PSBcIkNlaWxcIikge1xuICAgIH1cbiAgICBpZiAoaGVhZDIgPT09IFwiUm91bmRcIikge1xuICAgIH1cbiAgICBjb25zdCB2ID0gYXNGbG9hdCh0aGlzLk4oKSk7XG4gICAgaWYgKHYgPT09IG51bGwpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICh2ID09PSAwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHYgPCAwKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIHJldHVybiAxO1xuICB9XG4gIC8vXG4gIC8vIEFVVE8tQ0FOT05JQ0FMIE9QRVJBVElPTlNcbiAgLy9cbiAgLy8gVGhlIG9wZXJhdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZG9uZSBvbiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlXG4gIC8vIGV4cHJlc3Npb25cbiAgLy9cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29kb21haW47XG4gIH1cbiAgLy8gc2ltcGxpZnkob3B0aW9ucz86IFNpbXBsaWZ5T3B0aW9ucyk6IEJveGVkRXhwcmVzc2lvbiB7XG4gIC8vICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zaW1wbGlmeUFsbChvcHRpb25zKTtcbiAgLy8gICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIHJlc3VsdFswXTtcbiAgLy8gICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAvLyAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiB7XG4gIC8vICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIC8vICAgICByZXR1cm4gY2UuY29zdEZ1bmN0aW9uKGEpIC0gY2UuY29zdEZ1bmN0aW9uKGIpO1xuICAvLyAgIH0pO1xuICAvLyAgIHJldHVybiByZXN1bHRbMF07XG4gIC8vIH1cbiAgc2ltcGxpZnkob3B0aW9ucykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCF0aGlzLmlzQ2Fub25pY2FsKSB7XG4gICAgICBjb25zdCBjYW5vbmljYWwyID0gdGhpcy5jYW5vbmljYWw7XG4gICAgICBpZiAoIWNhbm9uaWNhbDIuaXNDYW5vbmljYWwgfHwgIWNhbm9uaWNhbDIuaXNWYWxpZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICByZXR1cm4gY2Fub25pY2FsMi5zaW1wbGlmeShvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgcmVjdXJzaXZlID0gb3B0aW9ucz8ucmVjdXJzaXZlID8/IHRydWU7XG4gICAgbGV0IGV4cHI7XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgZXhwciA9IGV4cGFuZDIodGhpcyk7XG4gICAgICBpZiAoZXhwciAhPT0gbnVsbCkge1xuICAgICAgICBleHByID0gZXhwci5zaW1wbGlmeSh7IC4uLm9wdGlvbnMsIHJlY3Vyc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiBjaGVhcGVzdCh0aGlzLCBleHByKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGVmID0gdGhpcy5mdW5jdGlvbkRlZmluaXRpb247XG4gICAgY29uc3QgdGFpbCA9IHJlY3Vyc2l2ZSA/IGhvbGRNYXAoXG4gICAgICB0aGlzLl9vcHMsXG4gICAgICBkZWY/LmhvbGQgPz8gXCJub25lXCIsXG4gICAgICBkZWY/LmFzc29jaWF0aXZlID8gZGVmLm5hbWUgOiBcIlwiLFxuICAgICAgKHgpID0+IHguc2ltcGxpZnkob3B0aW9ucylcbiAgICApIDogdGhpcy5fb3BzO1xuICAgIGlmICh0eXBlb2YgdGhpcy5faGVhZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgZXhwcjIgPSBhcHBseSh0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICAgIGlmICh0eXBlb2YgZXhwcjIuaGVhZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIGV4cHIyO1xuICAgICAgcmV0dXJuIGV4cHIyLnNpbXBsaWZ5KG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZGVmKSB7XG4gICAgICBpZiAoZGVmLmluZXJ0KVxuICAgICAgICBleHByID0gdGFpbFswXT8uY2Fub25pY2FsID8/IHRoaXM7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2lnID0gZGVmLnNpZ25hdHVyZTtcbiAgICAgICAgaWYgKHNpZz8uc2ltcGxpZnkpXG4gICAgICAgICAgZXhwciA9IHNpZy5zaW1wbGlmeSh0aGlzLmVuZ2luZSwgdGFpbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZXhwcilcbiAgICAgIGV4cHIgPSB0aGlzLmVuZ2luZS5mbih0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICBlbHNlXG4gICAgICBleHByID0gY2hlYXBlc3QodGhpcy5lbmdpbmUuZm4odGhpcy5faGVhZCwgdGFpbCksIGV4cHIpO1xuICAgIGV4cHIgPSBjaGVhcGVzdCh0aGlzLCBleHByKTtcbiAgICBjb25zdCBydWxlcyA9IG9wdGlvbnM/LnJ1bGVzID8/IHRoaXMuZW5naW5lLmNhY2hlKFxuICAgICAgXCJzdGFuZGFyZC1zaW1wbGlmaWNhdGlvbi1ydWxlc1wiLFxuICAgICAgKCkgPT4gYm94UnVsZXModGhpcy5lbmdpbmUsIFNJTVBMSUZZX1JVTEVTKSxcbiAgICAgIChydWxlczIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbbGhzLCByaHMsIF9wcmlvcml0eSwgX2NvbmRpdGlvbl0gb2YgcnVsZXMyKSB7XG4gICAgICAgICAgbGhzLnVuYmluZCgpO1xuICAgICAgICAgIHJocy51bmJpbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVsZXMyO1xuICAgICAgfVxuICAgICk7XG4gICAgbGV0IGl0ZXJhdGlvbkNvdW50ID0gMDtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG5ld0V4cHIgPSBleHByLnJlcGxhY2UocnVsZXMpO1xuICAgICAgaWYgKG5ld0V4cHIgIT09IG51bGwpIHtcbiAgICAgICAgZXhwciA9IGNoZWFwZXN0KGV4cHIsIG5ld0V4cHIpO1xuICAgICAgICBpZiAoZXhwciA9PT0gbmV3RXhwcilcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGl0ZXJhdGlvbkNvdW50ICs9IDE7XG4gICAgfSB3aGlsZSAoIWRvbmUgJiYgaXRlcmF0aW9uQ291bnQgPCB0aGlzLmVuZ2luZS5pdGVyYXRpb25MaW1pdCk7XG4gICAgcmV0dXJuIGNoZWFwZXN0KHRoaXMsIGV4cHIpO1xuICB9XG4gIGV2YWx1YXRlKG9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZClcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCkge1xuICAgICAgY29uc3QgY2Fub25pY2FsMiA9IHRoaXMuY2Fub25pY2FsO1xuICAgICAgaWYgKCFjYW5vbmljYWwyLmlzQ2Fub25pY2FsIHx8ICFjYW5vbmljYWwyLmlzVmFsaWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbDIuZXZhbHVhdGUob3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IGRlZiA9IHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uO1xuICAgIGNvbnN0IHRhaWwgPSBob2xkTWFwKFxuICAgICAgdGhpcy5fb3BzLFxuICAgICAgZGVmPy5ob2xkID8/IFwibm9uZVwiLFxuICAgICAgZGVmPy5hc3NvY2lhdGl2ZSA/IGRlZi5uYW1lIDogXCJcIixcbiAgICAgICh4KSA9PiB4LmV2YWx1YXRlKG9wdGlvbnMpXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlYWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGV4cHIgPSBhcHBseSh0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICAgIGlmICh0eXBlb2YgZXhwci5oZWFkICE9PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIHJldHVybiBleHByLmV2YWx1YXRlKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIWRlZilcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbih0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICBpZiAoZGVmLmluZXJ0KVxuICAgICAgcmV0dXJuIHRhaWxbMF0gPz8gdGhpcztcbiAgICBjb25zdCBzaWcgPSBkZWYuc2lnbmF0dXJlO1xuICAgIGlmICghc2lnIHx8ICFzaWcuZXZhbHVhdGUpXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZm4odGhpcy5faGVhZCwgdGFpbCk7XG4gICAgaWYgKHR5cGVvZiBzaWcuZXZhbHVhdGUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBhcHBseShzaWcuZXZhbHVhdGUsIHRhaWwpO1xuICAgIHJldHVybiBzaWcuZXZhbHVhdGUodGhpcy5lbmdpbmUsIHRhaWwpID8/IHRoaXMuZW5naW5lLmZuKHRoaXMuX2hlYWQsIHRhaWwpO1xuICB9XG4gIE4ob3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9udW1lcmljVmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5fbnVtZXJpY1ZhbHVlO1xuICAgIGlmICh0aGlzLmVuZ2luZS5zdHJpY3QgJiYgIXRoaXMuaXNWYWxpZClcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIGlmICghdGhpcy5pc0Nhbm9uaWNhbCkge1xuICAgICAgY29uc3QgY2Fub25pY2FsMiA9IHRoaXMuY2Fub25pY2FsO1xuICAgICAgaWYgKCFjYW5vbmljYWwyLmlzQ2Fub25pY2FsIHx8ICFjYW5vbmljYWwyLmlzVmFsaWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbDIuTihvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgZGVmID0gdGhpcy5mdW5jdGlvbkRlZmluaXRpb247XG4gICAgY29uc3QgdGFpbCA9IGhvbGRNYXAoXG4gICAgICB0aGlzLl9vcHMsXG4gICAgICBkZWY/LmhvbGQgPz8gXCJub25lXCIsXG4gICAgICBkZWY/LmFzc29jaWF0aXZlID8gZGVmLm5hbWUgOiBcIlwiLFxuICAgICAgKHgpID0+IHguTihvcHRpb25zKVxuICAgICk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9oZWFkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBleHByID0gYXBwbHkodGhpcy5faGVhZCwgdGFpbCk7XG4gICAgICBpZiAodHlwZW9mIGV4cHIuaGVhZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICByZXR1cm4gZXhwci5OKG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIWRlZilcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbih0aGlzLl9oZWFkLCB0YWlsKTtcbiAgICBpZiAoZGVmLmluZXJ0KVxuICAgICAgcmV0dXJuIHRhaWxbMF0gPz8gdGhpcztcbiAgICBjb25zdCBzaWcgPSBkZWYuc2lnbmF0dXJlO1xuICAgIGxldCByZXN1bHQgPSBzaWc/Lk4/Lih0aGlzLmVuZ2luZSwgdGFpbCkgPz8gdGhpcy5lbmdpbmUuZm4odGhpcy5faGVhZCwgdGFpbCkuZXZhbHVhdGUoKTtcbiAgICBjb25zdCBudW0gPSByZXN1bHQubnVtZXJpY1ZhbHVlO1xuICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgIGlmICghY29tcGxleEFsbG93ZWQodGhpcy5lbmdpbmUpICYmIG51bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTAuZGVmYXVsdClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbmdpbmUuX05BTjtcbiAgICAgIGVsc2UgaWYgKCFiaWdudW1QcmVmZXJyZWQodGhpcy5lbmdpbmUpICYmIG51bSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbmdpbmUubnVtYmVyKG51bS50b051bWJlcigpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNQdXJlKVxuICAgICAgdGhpcy5fbnVtZXJpY1ZhbHVlID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc29sdmUodmFycykge1xuICAgIGlmICh2YXJzLmxlbmd0aCAhPT0gMSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJvb3RzID0gZmluZFVuaXZhcmlhdGVSb290cyh0aGlzLnNpbXBsaWZ5KCksIHZhcnNbMF0pO1xuICAgIHJldHVybiByb290cztcbiAgfVxufTtcbmZ1bmN0aW9uIG1ha2VOdW1lcmljRnVuY3Rpb24oY2UsIGhlYWQyLCBzZW1pT3BzLCBtZXRhZGF0YSkge1xuICBsZXQgb3BzMiA9IFtdO1xuICBpZiAoaGVhZDIgPT09IFwiQWRkXCIgfHwgaGVhZDIgPT09IFwiTXVsdGlwbHlcIilcbiAgICBvcHMyID0gdmFsaWRhdGVOdW1lcmljQXJncyhcbiAgICAgIGNlLFxuICAgICAgZmxhdHRlbk9wcyhmbGF0dGVuU2VxdWVuY2UoY2UuY2Fub25pY2FsKHNlbWlPcHMpKSwgaGVhZDIpXG4gICAgKTtcbiAgZWxzZSBpZiAoaGVhZDIgPT09IFwiTmVnYXRlXCIgfHwgaGVhZDIgPT09IFwiU3F1YXJlXCIgfHwgaGVhZDIgPT09IFwiU3FydFwiKVxuICAgIG9wczIgPSB2YWxpZGF0ZU51bWVyaWNBcmdzKGNlLCBmbGF0dGVuU2VxdWVuY2UoY2UuY2Fub25pY2FsKHNlbWlPcHMpKSwgMSk7XG4gIGVsc2UgaWYgKGhlYWQyID09PSBcIkRpdmlkZVwiIHx8IGhlYWQyID09PSBcIlBvd2VyXCIpXG4gICAgb3BzMiA9IHZhbGlkYXRlTnVtZXJpY0FyZ3MoY2UsIGZsYXR0ZW5TZXF1ZW5jZShjZS5jYW5vbmljYWwoc2VtaU9wcykpLCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoIW9wczIuZXZlcnkoKHgpID0+IHguaXNWYWxpZCkpXG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKGNlLCBoZWFkMiwgb3BzMiwgeyBtZXRhZGF0YSwgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgaWYgKGhlYWQyID09PSBcIkFkZFwiKVxuICAgIHJldHVybiBjZS5hZGQob3BzMiwgbWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiTmVnYXRlXCIpXG4gICAgcmV0dXJuIGNlLm5lZyhvcHMyWzBdID8/IGNlLmVycm9yKFwibWlzc2luZ1wiKSwgbWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiTXVsdGlwbHlcIilcbiAgICByZXR1cm4gY2UubXVsKG9wczIsIG1ldGFkYXRhKTtcbiAgaWYgKGhlYWQyID09PSBcIkRpdmlkZVwiKVxuICAgIHJldHVybiBjZS5kaXYob3BzMlswXSwgb3BzMlsxXSwgbWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiUG93ZXJcIilcbiAgICByZXR1cm4gY2UucG93KG9wczJbMF0sIG9wczJbMV0sIG1ldGFkYXRhKTtcbiAgaWYgKGhlYWQyID09PSBcIlNxdWFyZVwiKVxuICAgIHJldHVybiBjZS5wb3cob3BzMlswXSwgY2UubnVtYmVyKDIpLCBtZXRhZGF0YSk7XG4gIGlmIChoZWFkMiA9PT0gXCJTcXJ0XCIpIHtcbiAgICBjb25zdCBvcDMgPSBvcHMyWzBdLmNhbm9uaWNhbDtcbiAgICBpZiAoaXNSYXRpb25hbChvcDMubnVtZXJpY1ZhbHVlKSlcbiAgICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgXCJTcXJ0XCIsIFtvcDNdLCB7IG1ldGFkYXRhLCBjYW5vbmljYWw6IHRydWUgfSk7XG4gICAgcmV0dXJuIGNlLnBvdyhvcDMsIGNlLl9IQUxGLCBtZXRhZGF0YSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBtYWtlQ2Fub25pY2FsRnVuY3Rpb24oY2UsIGhlYWQyLCBvcHMyLCBtZXRhZGF0YSkge1xuICBpZiAodHlwZW9mIGhlYWQyICE9PSBcInN0cmluZ1wiKVxuICAgIGhlYWQyID0gaGVhZDIuZXZhbHVhdGUoKS5zeW1ib2wgPz8gaGVhZDI7XG4gIGlmICh0eXBlb2YgaGVhZDIgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBtYWtlTnVtZXJpY0Z1bmN0aW9uKGNlLCBoZWFkMiwgb3BzMiwgbWV0YWRhdGEpO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlmICghaGVhZDIuaXNWYWxpZClcbiAgICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihcbiAgICAgICAgY2UsXG4gICAgICAgIGhlYWQyLFxuICAgICAgICBvcHMyLm1hcCgoeCkgPT4gY2UuYm94KHgsIHsgY2Fub25pY2FsOiBmYWxzZSB9KSksXG4gICAgICAgIHsgbWV0YWRhdGEsIGNhbm9uaWNhbDogZmFsc2UgfVxuICAgICAgKTtcbiAgfVxuICBjb25zdCBkZWYgPSBjZS5sb29rdXBGdW5jdGlvbihoZWFkMiwgY2UuY29udGV4dCk7XG4gIGlmICh0eXBlb2YgaGVhZDIgIT09IFwic3RyaW5nXCIgfHwgIWRlZikge1xuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihcbiAgICAgIGNlLFxuICAgICAgaGVhZDIsXG4gICAgICBmbGF0dGVuU2VxdWVuY2Uob3BzMi5tYXAoKHgpID0+IGNlLmJveCh4KSkpLFxuICAgICAgeyBtZXRhZGF0YSwgY2Fub25pY2FsOiB0cnVlIH1cbiAgICApO1xuICB9XG4gIGxldCB4cyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wczIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXBwbGljYWJsZShkZWYuaG9sZCwgb3BzMi5sZW5ndGggLSAxLCBpKSkge1xuICAgICAgeHMucHVzaChjZS5ib3gob3BzMltpXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB5ID0gY2UuYm94KG9wczJbaV0sIHsgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgICAgIGlmICh5LmhlYWQgPT09IFwiUmVsZWFzZUhvbGRcIilcbiAgICAgICAgeHMucHVzaCh5Lm9wMS5jYW5vbmljYWwpO1xuICAgICAgZWxzZVxuICAgICAgICB4cy5wdXNoKHkpO1xuICAgIH1cbiAgfVxuICBpZiAoIXhzLmV2ZXJ5KCh4KSA9PiB4LmlzVmFsaWQpKVxuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgaGVhZDIsIHhzLCB7IG1ldGFkYXRhLCBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICBjb25zdCBzaWcgPSBkZWYuc2lnbmF0dXJlO1xuICBpZiAoc2lnLmNhbm9uaWNhbCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzaWcuY2Fub25pY2FsKGNlLCB4cyk7XG4gICAgICBpZiAocmVzdWx0KVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgaGVhZDIsIHhzLCB7IG1ldGFkYXRhLCBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICB9XG4gIHhzID0gZmxhdHRlblNlcXVlbmNlKHhzKTtcbiAgaWYgKGRlZi5hc3NvY2lhdGl2ZSlcbiAgICB4cyA9IGZsYXR0ZW5PcHMoeHMsIGhlYWQyKTtcbiAgaWYgKCF4cy5ldmVyeSgoeCkgPT4geC5pc1ZhbGlkKSlcbiAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oY2UsIGhlYWQyLCB4cywgeyBtZXRhZGF0YSwgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgeHMgPSB2YWxpZGF0ZVNpZ25hdHVyZShzaWcuZG9tYWluLCB4cykgPz8geHM7XG4gIGlmICgheHMuZXZlcnkoKHgpID0+IHguaXNWYWxpZCkpXG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKGNlLCBoZWFkMiwgeHMsIHsgbWV0YWRhdGEsIGNhbm9uaWNhbDogZmFsc2UgfSk7XG4gIGlmICh4cy5sZW5ndGggPT09IDEgJiYgeHNbMF0uaGVhZCA9PT0gaGVhZDIpIHtcbiAgICBpZiAoZGVmLmludm9sdXRpb24pXG4gICAgICByZXR1cm4geHNbMF0ub3AxO1xuICAgIGlmIChkZWYuaWRlbXBvdGVudClcbiAgICAgIHhzID0geHNbMF0ub3BzO1xuICB9XG4gIGlmICh4cy5sZW5ndGggPiAxICYmIGRlZi5jb21tdXRhdGl2ZSA9PT0gdHJ1ZSlcbiAgICB4cyA9IHhzLnNvcnQob3JkZXIpO1xuICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oY2UsIGhlYWQyLCB4cywgeyBtZXRhZGF0YSwgZGVmLCBjYW5vbmljYWw6IHRydWUgfSk7XG59XG5mdW5jdGlvbiBhcHBseShmbiwgYXJncykge1xuICBjb25zdCBjZSA9IGZuLmVuZ2luZTtcbiAgaWYgKGZuLmhlYWQgIT09IFwiTGFtYmRhXCIpXG4gICAgcmV0dXJuIGNlLl9mbihmbi5ldmFsdWF0ZSgpLCBhcmdzKTtcbiAgY29uc3Qgc3ViczIgPSB7XG4gICAgXCJfX1wiOiBjZS50dXBsZShhcmdzKSxcbiAgICBcIl8jXCI6IGNlLm51bWJlcihhcmdzLmxlbmd0aClcbiAgfTtcbiAgbGV0IG4gPSAxO1xuICBmb3IgKGNvbnN0IG9wMyBvZiBhcmdzKVxuICAgIHN1YnMyW2BfJHtuKyt9YF0gPSBvcDM7XG4gIHN1YnMyW1wiX1wiXSA9IHN1YnMyW1wiXzFcIl07XG4gIGNvbnN0IHNhdmVkQ29udGV4dCA9IGNlLmNvbnRleHQ7XG4gIGNlLmNvbnRleHQgPSBmbi5zY29wZSA/PyBudWxsO1xuICBjb25zdCByZXN1bHQgPSBmbi5zdWJzKHN1YnMyKTtcbiAgY2UuY29udGV4dCA9IHNhdmVkQ29udGV4dDtcbiAgcmV0dXJuIHJlc3VsdC5vcDEuZXZhbHVhdGUoKTtcbn1cbmZ1bmN0aW9uIGhvbGRNYXAoeHMsIHNraXAsIGFzc29jaWF0aXZlSGVhZCwgZikge1xuICBpZiAoeHMubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBbXTtcbiAgeHMgPSBmbGF0dGVuT3BzKHhzLCBhc3NvY2lhdGl2ZUhlYWQpO1xuICBpZiAoc2tpcCA9PT0gXCJhbGxcIilcbiAgICByZXR1cm4geHM7XG4gIGlmIChza2lwID09PSBcIm5vbmVcIikge1xuICAgIGNvbnN0IHJlc3VsdDIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICAgIGNvbnN0IGggPSB4LmhlYWQ7XG4gICAgICBpZiAoaCA9PT0gXCJIb2xkXCIpXG4gICAgICAgIHJlc3VsdDIucHVzaCh4KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBvcDMgPSBoID09PSBcIlJlbGVhc2VIb2xkXCIgPyB4Lm9wMSA6IHg7XG4gICAgICAgIGlmIChvcDMpIHtcbiAgICAgICAgICBjb25zdCB5ID0gZihvcDMpO1xuICAgICAgICAgIGlmICh5ICE9PSBudWxsKVxuICAgICAgICAgICAgcmVzdWx0Mi5wdXNoKHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbGF0dGVuT3BzKHJlc3VsdDIsIGFzc29jaWF0aXZlSGVhZCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoeHNbaV0uaGVhZCA9PT0gXCJIb2xkXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHhzW2ldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHkgPSB2b2lkIDA7XG4gICAgICBpZiAoeHNbaV0uaGVhZCA9PT0gXCJSZWxlYXNlSG9sZFwiKVxuICAgICAgICB5ID0geHNbaV0ub3AxO1xuICAgICAgZWxzZSBpZiAoYXBwbGljYWJsZShza2lwLCB4cy5sZW5ndGggLSAxLCBpKSlcbiAgICAgICAgeSA9IHhzW2ldO1xuICAgICAgZWxzZVxuICAgICAgICByZXN1bHQucHVzaCh4c1tpXSk7XG4gICAgICBpZiAoeSkge1xuICAgICAgICBjb25zdCB4ID0gZih5KTtcbiAgICAgICAgaWYgKHggIT09IG51bGwpXG4gICAgICAgICAgcmVzdWx0LnB1c2goeCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmbGF0dGVuT3BzKHJlc3VsdCwgYXNzb2NpYXRpdmVIZWFkKTtcbn1cbmZ1bmN0aW9uIGFwcGxpY2FibGUoc2tpcCwgY291bnQsIGluZGV4KSB7XG4gIGlmIChza2lwID09PSBcImFsbFwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHNraXAgPT09IFwibm9uZVwiKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAoc2tpcCA9PT0gXCJmaXJzdFwiKVxuICAgIHJldHVybiBpbmRleCAhPT0gMDtcbiAgaWYgKHNraXAgPT09IFwicmVzdFwiKVxuICAgIHJldHVybiBpbmRleCA9PT0gMDtcbiAgaWYgKHNraXAgPT09IFwibGFzdFwiKVxuICAgIHJldHVybiBpbmRleCAhPT0gY291bnQ7XG4gIGlmIChza2lwID09PSBcIm1vc3RcIilcbiAgICByZXR1cm4gaW5kZXggPT09IGNvdW50O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2JveGVkLW51bWJlci50c1xudmFyIGltcG9ydF9jb21wbGV4MTIgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2RvbWFpbi11dGlscy50c1xudmFyIGltcG9ydF9jb21wbGV4MTEgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbmZ1bmN0aW9uIGluZmVyTnVtZXJpY0RvbWFpbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICFpc05hTih2YWx1ZSkpIHtcbiAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSlcbiAgICAgIHJldHVybiBcIkV4dGVuZGVkUmVhbE51bWJlclwiO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlID4gMClcbiAgICAgICAgcmV0dXJuIFwiUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgICBpZiAodmFsdWUgPCAwKVxuICAgICAgICByZXR1cm4gXCJOZWdhdGl2ZUludGVnZXJcIjtcbiAgICAgIHJldHVybiBcIkludGVnZXJcIjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID4gMClcbiAgICAgIHJldHVybiBcIlBvc2l0aXZlTnVtYmVyXCI7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHJldHVybiBcIk5lZ2F0aXZlTnVtYmVyXCI7XG4gICAgcmV0dXJuIFwiUmVhbE51bWJlclwiO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpIHtcbiAgICBpZiAodmFsdWUuaXNOYU4oKSlcbiAgICAgIHJldHVybiBcIk51bWJlclwiO1xuICAgIGlmICghdmFsdWUuaXNGaW5pdGUoKSlcbiAgICAgIHJldHVybiBcIkV4dGVuZGVkUmVhbE51bWJlclwiO1xuICAgIGlmICh2YWx1ZS5pc0ludGVnZXIoKSkge1xuICAgICAgaWYgKHZhbHVlLmlzUG9zaXRpdmUoKSlcbiAgICAgICAgcmV0dXJuIFwiUG9zaXRpdmVJbnRlZ2VyXCI7XG4gICAgICBpZiAodmFsdWUuaXNOZWdhdGl2ZSgpKVxuICAgICAgICByZXR1cm4gXCJOZWdhdGl2ZUludGVnZXJcIjtcbiAgICAgIHJldHVybiBcIkludGVnZXJcIjtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmlzUG9zaXRpdmUoKSlcbiAgICAgIHJldHVybiBcIlBvc2l0aXZlTnVtYmVyXCI7XG4gICAgaWYgKHZhbHVlLmlzTmVnYXRpdmUoKSlcbiAgICAgIHJldHVybiBcIk5lZ2F0aXZlTnVtYmVyXCI7XG4gICAgcmV0dXJuIFwiUmVhbE51bWJlclwiO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTEuQ29tcGxleCkge1xuICAgIGNvbnN0IGMgPSB2YWx1ZTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoYy5pbSAhPT0gMCk7XG4gICAgaWYgKGMucmUgPT09IDApXG4gICAgICByZXR1cm4gXCJJbWFnaW5hcnlOdW1iZXJcIjtcbiAgICByZXR1cm4gXCJDb21wbGV4TnVtYmVyXCI7XG4gIH1cbiAgaWYgKGlzUmF0aW9uYWwodmFsdWUpKSB7XG4gICAgY29uc3QgW251bWVyLCBkZW5vbV0gPSB2YWx1ZTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICB0eXBlb2YgbnVtZXIgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc05hTihudW1lcikgJiYgIU51bWJlci5pc05hTihkZW5vbSlcbiAgICApO1xuICAgIHJldHVybiBcIlJhdGlvbmFsTnVtYmVyXCI7XG4gIH1cbiAgcmV0dXJuIFwiTnVtYmVyXCI7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9udW1lcmljcy9wcmltZXMudHNcbnZhciBMQVJHRV9QUklNRSA9IDExMjU4OTk5MDY4NDI1OTc7XG5mdW5jdGlvbiBpc1ByaW1lKG4pIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8ICFOdW1iZXIuaXNGaW5pdGUobikgfHwgTnVtYmVyLmlzTmFOKG4pIHx8IG4gPD0gMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobiA8PSBMQVJHRVNUX1NNQUxMX1BSSU1FKVxuICAgIHJldHVybiBTTUFMTF9QUklNRVMuaGFzKG4pO1xuICBmb3IgKGNvbnN0IHNtYWxsUHJpbWUgb2YgU01BTExfUFJJTUVTKSB7XG4gICAgaWYgKG4gJSBzbWFsbFByaW1lID09PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChuID49IExBUkdFX1BSSU1FKSB7XG4gICAgcmV0dXJuIHByb2JhYmx5UHJpbWUobiwgMzApID8gdm9pZCAwIDogZmFsc2U7XG4gIH1cbiAgcmV0dXJuIG4gPT09IGxlYXN0RmFjdG9yKG4pO1xufVxuZnVuY3Rpb24gbGVhc3RGYWN0b3Iobikge1xuICBpZiAobiA9PT0gMSlcbiAgICByZXR1cm4gMTtcbiAgaWYgKG4gJSAyID09PSAwKVxuICAgIHJldHVybiAyO1xuICBpZiAobiAlIDMgPT09IDApXG4gICAgcmV0dXJuIDM7XG4gIGlmIChuICUgNSA9PT0gMClcbiAgICByZXR1cm4gNTtcbiAgY29uc3QgbSA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG4pKTtcbiAgbGV0IGkgPSA3O1xuICB3aGlsZSAoaSA8PSBtKSB7XG4gICAgaWYgKG4gJSBpID09PSAwKVxuICAgICAgcmV0dXJuIGk7XG4gICAgaWYgKG4gJSAoaSArIDQpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyA0O1xuICAgIGlmIChuICUgKGkgKyA2KSA9PT0gMClcbiAgICAgIHJldHVybiBpICsgNjtcbiAgICBpZiAobiAlIChpICsgMTApID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAxMDtcbiAgICBpZiAobiAlIChpICsgMTIpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAxMjtcbiAgICBpZiAobiAlIChpICsgMTYpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAxNjtcbiAgICBpZiAobiAlIChpICsgMjIpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAyMjtcbiAgICBpZiAobiAlIChpICsgMjQpID09PSAwKVxuICAgICAgcmV0dXJuIGkgKyAyNDtcbiAgICBpICs9IDMwO1xuICB9XG4gIHJldHVybiBuO1xufVxuZnVuY3Rpb24gcHJvYmFibHlQcmltZShuLCBrKSB7XG4gIGxldCBzID0gMCwgZCA9IG4gLSAxO1xuICB3aGlsZSAoZCAlIDIgPT09IDApIHtcbiAgICBkIC89IDI7XG4gICAgKytzO1xuICB9XG4gIFdpdG5lc3NMb29wOlxuICAgIGRvIHtcbiAgICAgIGxldCB4ID0gTWF0aC5wb3coMiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChuIC0gMykpLCBkKSAlIG47XG4gICAgICBpZiAoeCA9PT0gMSB8fCB4ID09PSBuIC0gMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICBmb3IgKGxldCBpID0gcyAtIDE7IGktLTsgKSB7XG4gICAgICAgIHggPSB4ICogeCAlIG47XG4gICAgICAgIGlmICh4ID09PSAxKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHggPT09IG4gLSAxKVxuICAgICAgICAgIGNvbnRpbnVlIFdpdG5lc3NMb29wO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gd2hpbGUgKC0tayk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1udW1iZXIudHNcbnZhciBCb3hlZE51bWJlciA9IGNsYXNzIF9Cb3hlZE51bWJlciBleHRlbmRzIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEJ5IHRoZSB0aW1lIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIHRoZSBgdmFsdWVgIHNob3VsZCBoYXZlIGJlZW5cbiAgICogc2NyZWVuZWQgZm9yIGNhc2VzIHdoZXJlIGl0J3MgYSB3ZWxsLWtub3duIHZhbHVlICgwLCBOYU4sICtJbmZpbml0eSxcbiAgICogZXRjLi4uKSBvciBub24tbm9ybWFsIChjb21wbGV4IG51bWJlciB3aXRoIGltID0gMCwgcmF0aW9uYWwgd2l0aFxuICAgKiBkZW5vbSA9IDEsIGV0Yy4uLikuXG4gICAqXG4gICAqIFRoaXMgaXMgZG9uZSBpbiBgY2UubnVtYmVyKClgLiBJbiBnZW5lcmFsLCB1c2UgYGNlLm51bWJlcigpYCByYXRoZXJcbiAgICogdGhhbiBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAqXG4gICAqIFdlIG1heSBzdG9yZSBhcyBhIG1hY2hpbmUgbnVtYmVyIGlmIGEgRGVjaW1hbCBpcyBwYXNzZWQgdGhhdCBpcyBpbiBtYWNoaW5lXG4gICAqIHJhbmdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihjZSwgb3B0aW9ucz8ubWV0YWRhdGEpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1JhdGlvbmFsKHZhbHVlKSkge1xuICAgICAgY29uc3QgW24sIGRdID0gdmFsdWU7XG4gICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICAgIHR5cGVvZiBuICE9PSBcIm51bWJlclwiIHx8IE51bWJlci5pc0ludGVnZXIobikgJiYgTnVtYmVyLmlzSW50ZWdlcihkKSAmJiBkICE9PSBuICYmIGQgIT09IDFcbiAgICAgICk7XG4gICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICAgICEodHlwZW9mIG4gPT09IFwiYmlnaW50XCIgJiYgdHlwZW9mIGQgPT0gXCJiaWdpbnRcIikgfHwgZCAhPT0gbiAmJiBkICE9PSBCaWdJbnQoMSlcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucz8uY2Fub25pY2FsID8/IHRydWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBjYW5vbmljYWxOdW1iZXIoY2UsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5faXNDYW5vbmljYWwgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5faXNDYW5vbmljYWwgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KSB8fCAhTnVtYmVyLmlzTmFOKHZhbHVlLnJlKSAmJiAhTnVtYmVyLmlzTmFOKHZhbHVlLmltKSAmJiBjZS5jaG9wKHZhbHVlLmltKSAhPT0gMFxuICAgICAgKTtcbiAgICAgIHRoaXMuX3ZhbHVlID0gY2Fub25pY2FsTnVtYmVyKGNlLCB2YWx1ZSk7XG4gICAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGdldCBoYXNoKCkge1xuICAgIGlmICh0aGlzLl9oYXNoICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICBsZXQgaCA9IDA7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIGggPSBoYXNoQ29kZSh0aGlzLl92YWx1ZS50b1N0cmluZygpKTtcbiAgICBlbHNlIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTIuQ29tcGxleClcbiAgICAgIGggPSBoYXNoQ29kZShcbiAgICAgICAgdGhpcy5fdmFsdWUucmUudG9TdHJpbmcoKSArIFwiICtpIFwiICsgdGhpcy5fdmFsdWUuaW0udG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICBlbHNlIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICBoID0gaGFzaENvZGUodGhpcy5fdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgZWxzZVxuICAgICAgaCA9IGhhc2hDb2RlKFxuICAgICAgICB0aGlzLl92YWx1ZVswXS50b1N0cmluZygpICsgXCIgLyBcIiArIHRoaXMuX3ZhbHVlWzFdLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgdGhpcy5faGFzaCA9IGg7XG4gICAgcmV0dXJuIGg7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIFwiTnVtYmVyXCI7XG4gIH1cbiAgZ2V0IGlzUHVyZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXQgaXNFeGFjdCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNJbnRlZ2VyKCk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KVxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodGhpcy5fdmFsdWUucmUpICYmIE51bWJlci5pc0ludGVnZXIodGhpcy5fdmFsdWUuaW0pO1xuICAgIHJldHVybiBpc1JhdGlvbmFsKHRoaXMuX3ZhbHVlKTtcbiAgfVxuICBnZXQgaXNDYW5vbmljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ2Fub25pY2FsO1xuICB9XG4gIHNldCBpc0Nhbm9uaWNhbCh2YWwpIHtcbiAgICB0aGlzLl9pc0Nhbm9uaWNhbCA9IHZhbDtcbiAgfVxuICBnZXQgY29tcGxleGl0eSgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0IG51bWVyaWNWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICBpZiAodGhpcy5fZG9tYWluID09PSB2b2lkIDApXG4gICAgICB0aGlzLl9kb21haW4gPSB0aGlzLmVuZ2luZS5kb21haW4oaW5mZXJOdW1lcmljRG9tYWluKHRoaXMuX3ZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpbjtcbiAgfVxuICBnZXQganNvbigpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplSnNvbk51bWJlcih0aGlzLmVuZ2luZSwgdGhpcy5fdmFsdWUsIHtcbiAgICAgIGxhdGV4OiB0aGlzLl9sYXRleFxuICAgIH0pO1xuICB9XG4gIGdldCBzZ24oKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAwKVxuICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlIDwgMClcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlID4gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlLmlzWmVybygpKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGlmICh0aGlzLl92YWx1ZS5pc05lZ2F0aXZlKCkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICh0aGlzLl92YWx1ZS5pc1Bvc2l0aXZlKCkpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgY29uc3QgW251bWVyLCBkZW5vbV0gPSB0aGlzLl92YWx1ZTtcbiAgICAgIGlmIChudW1lciA9PT0gMCAmJiBkZW5vbSAhPT0gMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAobnVtZXIgPCAwKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAobnVtZXIgPiAwKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpc1NhbWUocmhzKSB7XG4gICAgaWYgKHRoaXMgPT09IHJocylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKHJocyBpbnN0YW5jZW9mIF9Cb3hlZE51bWJlcikpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHR5cGVvZiByaHMuX3ZhbHVlICE9PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPT09IHJocy5fdmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpIHtcbiAgICAgIGlmICghKHJocy5fdmFsdWUgaW5zdGFuY2VvZiBEZWNpbWFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmVxKHJocy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyaHMuX3ZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgW3Joc04sIHJoc0RdID0gcmhzLl92YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZVswXSA9PT0gcmhzTiAmJiB0aGlzLl92YWx1ZVsxXSA9PT0gcmhzRDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KSB7XG4gICAgICBpZiAoIShyaHMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLmVxdWFscyhyaHMuX3ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRXF1YWwocmhzKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTYW1lKHJocyk7XG4gIH1cbiAgbWF0Y2gocmhzLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFcXVhbFdpdGhUb2xlcmFuY2UocmhzLCBvcHRpb25zPy5udW1lcmljVG9sZXJhbmNlID8/IDApKVxuICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKiBDb21wYXJlIHRoaXMgd2l0aCBhbm90aGVyIEJveGVkTnVtYmVyLlxuICAgKiBgcmhzYCBtdXN0IGJlIGEgQm94ZWROdW1iZXIuIFVzZSBgaXNFcXVhbFdpdGhUb2xlcmFuY2UocmhzLk4oKSlgXG4gICAqIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIGlzRXF1YWxXaXRoVG9sZXJhbmNlKHJocywgdG9sZXJhbmNlKSB7XG4gICAgcmV0dXJuIHJocyBpbnN0YW5jZW9mIF9Cb3hlZE51bWJlciAmJiBzaWduRGlmZih0aGlzLCByaHMsIHRvbGVyYW5jZSkgPT09IDA7XG4gIH1cbiAgaXNMZXNzKHJocykge1xuICAgIGNvbnN0IHMgPSBzaWduRGlmZih0aGlzLCByaHMpO1xuICAgIGlmIChzID09PSB2b2lkIDApXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIHJldHVybiBzIDwgMDtcbiAgfVxuICBpc0xlc3NFcXVhbChyaHMpIHtcbiAgICBjb25zdCBzID0gc2lnbkRpZmYodGhpcywgcmhzKTtcbiAgICBpZiAocyA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8PSAwO1xuICB9XG4gIGlzR3JlYXRlcihyaHMpIHtcbiAgICByZXR1cm4gcmhzLmlzTGVzc0VxdWFsKHRoaXMpO1xuICB9XG4gIGlzR3JlYXRlckVxdWFsKHJocykge1xuICAgIHJldHVybiByaHMuaXNMZXNzKHRoaXMpO1xuICB9XG4gIC8qKiB4ID4gMCwgc2FtZSBhcyBgaXNHcmVhdGVyKDApYCAqL1xuICBnZXQgaXNQb3NpdGl2ZSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID4gMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA+IDA7XG4gIH1cbiAgLyoqIHggPj0gMCwgc2FtZSBhcyBgaXNHcmVhdGVyRXF1YWwoMClgICovXG4gIGdldCBpc05vbk5lZ2F0aXZlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPj0gMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA+PSAwO1xuICB9XG4gIC8qKiB4IDwgMCwgc2FtZSBhcyBgaXNMZXNzKDApYCAqL1xuICBnZXQgaXNOZWdhdGl2ZSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIDwgMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8IDA7XG4gIH1cbiAgLyoqIHggPD0gMCwgc2FtZSBhcyBgaXNMZXNzRXF1YWwoMClgICovXG4gIGdldCBpc05vblBvc2l0aXZlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPD0gMDtcbiAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICByZXR1cm4gcyA8PSAwO1xuICB9XG4gIGdldCBpc1plcm8oKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5pc1plcm8oKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNaZXJvKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc05vdFplcm8oKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gIXRoaXMuX3ZhbHVlLmlzWmVybygpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTIuQ29tcGxleClcbiAgICAgIHJldHVybiAhdGhpcy5fdmFsdWUuaXNaZXJvKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZ2V0IGlzT25lKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gMSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5lcXVhbHModGhpcy5lbmdpbmUuX0JJR05VTV9PTkUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTIuQ29tcGxleClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5pbSA9PT0gMCAmJiB0aGlzLl92YWx1ZS5yZSA9PT0gMTtcbiAgICByZXR1cm4gaXNSYXRpb25hbE9uZSh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgZ2V0IGlzTmVnYXRpdmVPbmUoKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlID09PSAtMSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5lcXVhbHModGhpcy5lbmdpbmUuX0JJR05VTV9ORUdBVElWRV9PTkUpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSlcbiAgICAgIHJldHVybiBpc1JhdGlvbmFsTmVnYXRpdmVPbmUodGhpcy5fdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5lcXVhbHMoLTEpO1xuICB9XG4gIGdldCBpc09kZCgpIHtcbiAgICBpZiAodGhpcy5pc09uZSB8fCB0aGlzLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1plcm8pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzSW50ZWdlcilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlICUgMiAhPT0gMDtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBEZWNpbWFsKVxuICAgICAgcmV0dXJuICF0aGlzLl92YWx1ZS5tb2QoMikuaXNaZXJvKCk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNFdmVuKCkge1xuICAgIGlmICh0aGlzLmlzT25lIHx8IHRoaXMuaXNOZWdhdGl2ZU9uZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1plcm8pXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuaXNJbnRlZ2VyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgJSAyID09PSAwO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUubW9kKDIpLmlzWmVybygpO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzUHJpbWUoKSB7XG4gICAgaWYgKCF0aGlzLmlzSW50ZWdlciB8fCAhdGhpcy5pc0Zpbml0ZSB8fCB0aGlzLmlzTm9uUG9zaXRpdmUgfHwgdGhpcy5pc09uZSB8fCB0aGlzLmlzWmVybylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIGlzUHJpbWUodGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gaXNQcmltZSh0aGlzLl92YWx1ZS50b051bWJlcigpKTtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldCBpc0NvbXBvc2l0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbnRlZ2VyIHx8ICF0aGlzLmlzRmluaXRlIHx8IHRoaXMuaXNOb25Qb3NpdGl2ZSB8fCB0aGlzLmlzT25lIHx8IHRoaXMuaXNaZXJvKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gIWlzUHJpbWUodGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gIWlzUHJpbWUodGhpcy5fdmFsdWUudG9OdW1iZXIoKSk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNJbmZpbml0eSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3ZhbHVlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuICFOdW1iZXIuaXNGaW5pdGUodGhpcy5fdmFsdWUpICYmICFOdW1iZXIuaXNOYU4odGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gIXRoaXMuX3ZhbHVlLmlzRmluaXRlKCkgJiYgIXRoaXMuX3ZhbHVlLmlzTmFOKCk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxMi5Db21wbGV4KVxuICAgICAgcmV0dXJuICF0aGlzLl92YWx1ZS5pc0Zpbml0ZSgpICYmICF0aGlzLl92YWx1ZS5pc05hTigpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgaXNOYU4oKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl92YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGhpcy5fdmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNOYU4oKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpXG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUuaXNOYU4oKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzRmluaXRlKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0luZmluaXR5ICYmICF0aGlzLmlzTmFOO1xuICB9XG4gIGdldCBpc051bWJlcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXQgaXNJbnRlZ2VyKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fdmFsdWUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0aGlzLl92YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5pc0ludGVnZXIoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzUmF0aW9uYWwoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyO1xuICB9XG4gIGdldCBpc0FsZ2VicmFpYygpIHtcbiAgICBpZiAodGhpcy5pc1JhdGlvbmFsKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBnZXQgaXNSZWFsKCkge1xuICAgIGlmICghdGhpcy5pc0Zpbml0ZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuY2hvcCh0aGlzLl92YWx1ZS5pbSkgPT09IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gUmVhbCBvciArLUluZmluaXR5XG4gIGdldCBpc0V4dGVuZGVkUmVhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZmluaXR5IHx8IHRoaXMuaXNSZWFsO1xuICB9XG4gIGdldCBpc0NvbXBsZXgoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzTmFOO1xuICB9XG4gIGdldCBpc0ltYWdpbmFyeSgpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEyLkNvbXBsZXgpIHtcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0aGlzLl92YWx1ZS5pbSAhPT0gMCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCBpc0V4dGVuZGVkQ29tcGxleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZmluaXR5IHx8ICF0aGlzLmlzTmFOO1xuICB9XG4gIGdldCBjYW5vbmljYWwoKSB7XG4gICAgaWYgKHRoaXMuX2lzQ2Fub25pY2FsKVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLm51bWJlcihjYW5vbmljYWxOdW1iZXIodGhpcy5lbmdpbmUsIHRoaXMuX3ZhbHVlKSk7XG4gIH1cbiAgc2ltcGxpZnkoX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5jYW5vbmljYWw7XG4gIH1cbiAgTihfb3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICBjb25zdCBjZSA9IHRoaXMuZW5naW5lO1xuICAgIGNvbnN0IFtudW1lciwgZGVub21dID0gdGhpcy5fdmFsdWU7XG4gICAgaWYgKHR5cGVvZiBudW1lciA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgZGVub20gPT09IFwibnVtYmVyXCIgJiYgIWJpZ251bVByZWZlcnJlZChjZSkpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG51bWVyIC8gZGVub20pO1xuICAgIHJldHVybiBjZS5udW1iZXIoY2UuYmlnbnVtKG51bWVyKS5kaXYoY2UuYmlnbnVtKGRlbm9tKSkpO1xuICB9XG59O1xuZnVuY3Rpb24gY2Fub25pY2FsTnVtYmVyKGNlLCB2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEZWNpbWFsICYmIGlzSW5NYWNoaW5lUmFuZ2UodmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZS50b051bWJlcigpO1xuICBpZiAoIWlzUmF0aW9uYWwodmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgdmFsdWUgPSByZWR1Y2VkUmF0aW9uYWwodmFsdWUpO1xuICBpZiAoaXNCaWdSYXRpb25hbCh2YWx1ZSkpIHtcbiAgICBsZXQgW24yLCBkMl0gPSB2YWx1ZTtcbiAgICBpZiAobjIgPiBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiAmJiBuMiA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIGQyID4gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgJiYgZDIgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUilcbiAgICAgIHZhbHVlID0gW051bWJlcihuMiksIE51bWJlcihkMildO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGQyIDwgMClcbiAgICAgICAgW24yLCBkMl0gPSBbLW4yLCAtZDJdO1xuICAgICAgaWYgKGQyID09PSBCaWdJbnQoMSkpXG4gICAgICAgIHJldHVybiBjZS5iaWdudW0objIpO1xuICAgICAgaWYgKGQyID09PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgaWYgKG4yID09PSBkMilcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICByZXR1cm4gbjIgPCAwID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW24yLCBkMl07XG4gICAgfVxuICB9XG4gIGxldCBbbiwgZF0gPSB2YWx1ZTtcbiAgaWYgKE51bWJlci5pc05hTihuKSB8fCBOdW1iZXIuaXNOYU4oZCkpXG4gICAgcmV0dXJuIE5hTjtcbiAgaWYgKGQgPCAwKVxuICAgIFtuLCBkXSA9IFstbiwgLWRdO1xuICBpZiAoZCA9PT0gMSlcbiAgICByZXR1cm4gbjtcbiAgaWYgKGQgPT09IDApIHtcbiAgICBpZiAobiA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKG4pKVxuICAgICAgcmV0dXJuIE5hTjtcbiAgICBpZiAobiA8IDApXG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIHJldHVybiBJbmZpbml0eTtcbiAgfVxuICBpZiAobiA9PT0gMClcbiAgICByZXR1cm4gbjtcbiAgcmV0dXJuIFtuLCBkXTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2JveGVkLWV4cHJlc3Npb24vYm94ZWQtc3RyaW5nLnRzXG52YXIgQm94ZWRTdHJpbmcgPSBjbGFzcyBfQm94ZWRTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBleHByLCBtZXRhZGF0YSkge1xuICAgIHN1cGVyKGNlLCBtZXRhZGF0YSk7XG4gICAgdGhpcy5fc3RyaW5nID0gZXhwci5ub3JtYWxpemUoKTtcbiAgICBjZS5fcmVnaXN0ZXIodGhpcyk7XG4gIH1cbiAgZ2V0IGhhc2goKSB7XG4gICAgcmV0dXJuIGhhc2hDb2RlKFwiU3RyaW5nXCIgKyB0aGlzLl9zdHJpbmcpO1xuICB9XG4gIGdldCBqc29uKCkge1xuICAgIHJldHVybiBzZXJpYWxpemVKc29uU3RyaW5nKHRoaXMuZW5naW5lLCB0aGlzLl9zdHJpbmcpO1xuICB9XG4gIGdldCBoZWFkKCkge1xuICAgIHJldHVybiBcIlN0cmluZ1wiO1xuICB9XG4gIGdldCBpc1B1cmUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCBpc0Nhbm9uaWNhbChfdmEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuZG9tYWluKFwiU3RyaW5nXCIpO1xuICB9XG4gIGdldCBjb21wbGV4aXR5KCkge1xuICAgIHJldHVybiAxOTtcbiAgfVxuICBnZXQgc3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJpbmc7XG4gIH1cbiAgaXNFcXVhbChyaHMpIHtcbiAgICByZXR1cm4gcmhzLnN0cmluZyA9PT0gdGhpcy5fc3RyaW5nO1xuICB9XG4gIGlzU2FtZShyaHMpIHtcbiAgICByZXR1cm4gcmhzLnN0cmluZyA9PT0gdGhpcy5fc3RyaW5nO1xuICB9XG4gIG1hdGNoKHJocywgX29wdGlvbnMpIHtcbiAgICBpZiAoIShyaHMgaW5zdGFuY2VvZiBfQm94ZWRTdHJpbmcpKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuX3N0cmluZyA9PT0gcmhzLl9zdHJpbmcpXG4gICAgICByZXR1cm4ge307XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2JveC50c1xuZnVuY3Rpb24gYm94TnVtYmVyKGNlLCBudW0sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIgfHwgbnVtIGluc3RhbmNlb2YgRGVjaW1hbClcbiAgICByZXR1cm4gbmV3IEJveGVkTnVtYmVyKGNlLCBudW0sIG9wdGlvbnMpO1xuICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gIGlmICghKFwiY2Fub25pY2FsXCIgaW4gb3B0aW9ucykpXG4gICAgb3B0aW9ucy5jYW5vbmljYWwgPSB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheShudW0pICYmIG51bS5sZW5ndGggPT09IDIgJiYgbnVtWzBdIGluc3RhbmNlb2YgRGVjaW1hbCAmJiBudW1bMV0gaW5zdGFuY2VvZiBEZWNpbWFsKSB7XG4gICAgaWYgKCFudW1bMF0uaXNJbnRlZ2VyKCkgfHwgIW51bVsxXS5pc0ludGVnZXIoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFycmF5IGFyZ3VtZW50IHRvIGBib3hOdW1iZXIoKWAgc2hvdWxkIGJlIHR3byBpbnRlZ2Vyc1wiKTtcbiAgICBudW0gPSBbYmlnaW50KG51bVswXS50b1N0cmluZygpKSwgYmlnaW50KG51bVsxXS50b1N0cmluZygpKV07XG4gIH1cbiAgaWYgKGlzUmF0aW9uYWwobnVtKSkge1xuICAgIGlmIChudW0ubGVuZ3RoICE9PSAyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFycmF5IGFyZ3VtZW50IHRvIGBib3hOdW1iZXIoKWAgc2hvdWxkIGJlIHR3byBpbnRlZ2VycyBvciB0d28gYmlnbnVtc1wiXG4gICAgICApO1xuICAgIGNvbnN0IFtuLCBkXSA9IG51bTtcbiAgICBpZiAodHlwZW9mIG4gPT09IFwiYmlnaW50XCIgJiYgdHlwZW9mIGQgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgIGlmIChuID09PSBkKVxuICAgICAgICByZXR1cm4gZCA9PT0gQmlnSW50KDApID8gY2UuX05BTiA6IGNlLl9PTkU7XG4gICAgICBpZiAobiA9PT0gQmlnSW50KDApKVxuICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICBpZiAoZCA9PT0gQmlnSW50KDEpKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKG4sIG9wdGlvbnMpO1xuICAgICAgaWYgKGQgPT09IEJpZ0ludCgtMSkpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoLW4sIG9wdGlvbnMpO1xuICAgICAgaWYgKG4gPT09IEJpZ0ludCgxKSAmJiBkID09PSBCaWdJbnQoMikpXG4gICAgICAgIHJldHVybiBjZS5fSEFMRjtcbiAgICAgIHJldHVybiBuZXcgQm94ZWROdW1iZXIoY2UsIFtuLCBkXSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbiAhPT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgZCAhPT0gXCJudW1iZXJcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBcnJheSBhcmd1bWVudCB0byBgYm94TnVtYmVyKClgIHNob3VsZCBiZSB0d28gaW50ZWdlcnMgb3IgdHdvIGJpZ251bXNcIlxuICAgICAgKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobikgfHwgIU51bWJlci5pc0ludGVnZXIoZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcnJheSBhcmd1bWVudCB0byBgYm94TnVtYmVyKClgIHNob3VsZCBiZSB0d28gaW50ZWdlcnNcIik7XG4gICAgaWYgKGQgPT09IG4pXG4gICAgICByZXR1cm4gZCA9PT0gMCA/IGNlLl9OQU4gOiBjZS5fT05FO1xuICAgIGlmIChuID09PSAwKVxuICAgICAgcmV0dXJuIGNlLl9aRVJPO1xuICAgIGlmIChkID09PSAxKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihuLCBvcHRpb25zKTtcbiAgICBpZiAoZCA9PT0gLTEpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKC1uLCBvcHRpb25zKTtcbiAgICBpZiAobiA9PT0gMSAmJiBkID09PSAyKVxuICAgICAgcmV0dXJuIGNlLl9IQUxGO1xuICAgIHJldHVybiBuZXcgQm94ZWROdW1iZXIoY2UsIFtuLCBkXSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKG51bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTMuQ29tcGxleCkge1xuICAgIGlmIChudW0uaXNOYU4oKSlcbiAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgIGlmIChudW0uaXNaZXJvKCkpXG4gICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgaWYgKG51bS5pc0luZmluaXRlKCkpXG4gICAgICByZXR1cm4gY2UuX0NPTVBMRVhfSU5GSU5JVFk7XG4gICAgaWYgKGNlLmNob3AobnVtLmltKSA9PT0gMClcbiAgICAgIHJldHVybiBjZS5udW1iZXIobnVtLnJlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbmV3IEJveGVkTnVtYmVyKGNlLCBudW0sIG9wdGlvbnMpO1xuICB9XG4gIGxldCBzdHJOdW0gPSBcIlwiO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJzdHJpbmdcIilcbiAgICBzdHJOdW0gPSBudW07XG4gIGVsc2UgaWYgKHR5cGVvZiBudW0gPT09IFwib2JqZWN0XCIgJiYgXCJudW1cIiBpbiBudW0pIHtcbiAgICBpZiAodHlwZW9mIG51bS5udW0gPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG51bS5udW0sIG9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgbnVtLm51bSAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hdGhKU09OIGBudW1gIHByb3BlcnR5IHNob3VsZCBiZSBhIHN0cmluZyBvZiBkaWdpdHNcIik7XG4gICAgc3RyTnVtID0gbnVtLm51bTtcbiAgfVxuICBpZiAoc3RyTnVtKSB7XG4gICAgc3RyTnVtID0gc3RyTnVtLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKC9bMC05XVtuZF0kLy50ZXN0KHN0ck51bSkpXG4gICAgICBzdHJOdW0gPSBzdHJOdW0uc2xpY2UoMCwgLTEpO1xuICAgIHN0ck51bSA9IHN0ck51bS5yZXBsYWNlKC9bXFx1MDAwOS1cXHUwMDBkXFx1MDAyMFxcdTAwYTBdL2csIFwiXCIpO1xuICAgIGlmIChzdHJOdW0gPT09IFwibmFuXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBpZiAoc3RyTnVtID09PSBcImluZmluaXR5XCIgfHwgc3RyTnVtID09PSBcIitpbmZpbml0eVwiKVxuICAgICAgcmV0dXJuIGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICBpZiAoc3RyTnVtID09PSBcIi1pbmZpbml0eVwiKVxuICAgICAgcmV0dXJuIGNlLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICBpZiAoc3RyTnVtID09PSBcIjBcIilcbiAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICBpZiAoc3RyTnVtID09PSBcIjFcIilcbiAgICAgIHJldHVybiBjZS5fT05FO1xuICAgIGlmIChzdHJOdW0gPT09IFwiLTFcIilcbiAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfT05FO1xuICAgIGlmICgvXFwoWzAtOV0rXFwpLy50ZXN0KHN0ck51bSkpIHtcbiAgICAgIGNvbnN0IFtfLCBib2R5LCByZXBlYXQsIHRyYWlsXSA9IHN0ck51bS5tYXRjaCgvKC4rKVxcKChbMC05XSspXFwpKC4rKT8kLykgPz8gW107XG4gICAgICBzdHJOdW0gPSBib2R5ICsgcmVwZWF0LnJlcGVhdChNYXRoLmNlaWwoY2UucHJlY2lzaW9uIC8gcmVwZWF0Lmxlbmd0aCkpICsgKHRyYWlsID8/IFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYm94TnVtYmVyKGNlLCBjZS5iaWdudW0oc3RyTnVtKSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBib3hIb2xkKGNlLCBleHByLCBvcHRpb25zKSB7XG4gIGlmIChleHByID09PSBudWxsKVxuICAgIHJldHVybiBjZS5lcnJvcihcIm1pc3NpbmdcIik7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIiAmJiBleHByIGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pXG4gICAgcmV0dXJuIGV4cHI7XG4gIGV4cHIgPSBtaXNzaW5nSWZFbXB0eShleHByKTtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBib3goY2UsIGV4cHIsIG9wdGlvbnMpO1xuICBpZiAoQXJyYXkuaXNBcnJheShleHByKSkge1xuICAgIGNvbnN0IGJveGVkID0gZXhwci5tYXAoKHgpID0+IGJveEhvbGQoY2UsIHgsIG9wdGlvbnMpKTtcbiAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oY2UsIGJveGVkWzBdLCBib3hlZC5zbGljZSgxKSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKFwiZGljdFwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gbmV3IEJveGVkRGljdGlvbmFyeShjZSwgZXhwci5kaWN0KTtcbiAgICBpZiAoXCJmblwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gYm94SG9sZChjZSwgZXhwci5mbiwgb3B0aW9ucyk7XG4gICAgaWYgKFwic3RyXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoY2UsIGV4cHIuc3RyKTtcbiAgICBpZiAoXCJzeW1cIiBpbiBleHByKVxuICAgICAgcmV0dXJuIGJveChjZSwgZXhwci5zeW0sIG9wdGlvbnMpO1xuICAgIGlmIChcIm51bVwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gYm94KGNlLCBleHByLm51bSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGJveChjZSwgZXhwciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBib3hGdW5jdGlvbihjZSwgaGVhZDIsIG9wczIsIG9wdGlvbnMpIHtcbiAgaWYgKGhlYWQyID09PSBcIkhvbGRcIikge1xuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbihjZSwgXCJIb2xkXCIsIFtib3hIb2xkKGNlLCBvcHMyWzBdLCBvcHRpb25zKV0sIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjYW5vbmljYWw6IHRydWVcbiAgICB9KTtcbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiRXJyb3JcIiB8fCBoZWFkMiA9PT0gXCJFcnJvckNvZGVcIikge1xuICAgIHJldHVybiBjZS5fZm4oXG4gICAgICBoZWFkMixcbiAgICAgIG9wczIubWFwKCh4KSA9PiBjZS5ib3goeCwgeyBjYW5vbmljYWw6IGZhbHNlIH0pKSxcbiAgICAgIG9wdGlvbnMubWV0YWRhdGFcbiAgICApO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJEb21haW5cIilcbiAgICByZXR1cm4gY2UuZG9tYWluKG9wczJbMF0sIG9wdGlvbnMubWV0YWRhdGEpO1xuICBpZiAoaGVhZDIgPT09IFwiTnVtYmVyXCIgJiYgb3BzMi5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuIGJveChjZSwgb3BzMlswXSwgb3B0aW9ucyk7XG4gIGlmIChoZWFkMiA9PT0gXCJTdHJpbmdcIikge1xuICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoY2UsIFwiXCIsIG9wdGlvbnMubWV0YWRhdGEpO1xuICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoXG4gICAgICBjZSxcbiAgICAgIG9wczIubWFwKCh4KSA9PiBhc1N0cmluZyh4KSA/PyBcIlwiKS5qb2luKFwiXCIpLFxuICAgICAgb3B0aW9ucy5tZXRhZGF0YVxuICAgICk7XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIlN5bWJvbFwiICYmIG9wczIubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBjZS5zeW1ib2wob3BzMi5tYXAoKHgpID0+IGFzU3RyaW5nKHgpID8/IFwiXCIpLmpvaW4oXCJcIiksIG9wdGlvbnMpO1xuICB9XG4gIGlmICgoaGVhZDIgPT09IFwiRGl2aWRlXCIgfHwgaGVhZDIgPT09IFwiUmF0aW9uYWxcIikgJiYgb3BzMi5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAob3BzMlswXSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uICYmIG9wczJbMV0gaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikge1xuICAgICAgaWYgKGNlLm51bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIikge1xuICAgICAgICBjb25zdCBbZm4sIGZkXSA9IFthc0Zsb2F0KG9wczJbMF0pLCBhc0Zsb2F0KG9wczJbMV0pXTtcbiAgICAgICAgaWYgKGZuICE9PSBudWxsICYmIE51bWJlci5pc0ludGVnZXIoZm4pICYmIGZkICE9PSBudWxsICYmIE51bWJlci5pc0ludGVnZXIoZmQpKVxuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoW2ZuLCBmZF0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgW24sIGRdID0gW2FzQmlnaW50KG9wczJbMF0pLCBhc0JpZ2ludChvcHMyWzFdKV07XG4gICAgICBpZiAobiAhPT0gbnVsbCAmJiBkICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKFtuLCBkXSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtuLCBkXSA9IFtcbiAgICAgICAgYmlnaW50VmFsdWUoY2UsIG9wczJbMF0pLFxuICAgICAgICBiaWdpbnRWYWx1ZShjZSwgb3BzMlsxXSlcbiAgICAgIF07XG4gICAgICBpZiAobiAhPT0gbnVsbCAmJiBkICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKFtuLCBkXSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGhlYWQyID0gXCJEaXZpZGVcIjtcbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiQ29tcGxleFwiKSB7XG4gICAgaWYgKG9wczIubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBvcDEyID0gYm94KGNlLCBvcHMyWzBdLCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IGltID0gYXNGbG9hdChvcDEyKTtcbiAgICAgIGlmIChpbSAhPT0gbnVsbCAmJiBpbSAhPT0gMClcbiAgICAgICAgcmV0dXJuIGNlLm51bWJlcihjZS5jb21wbGV4KDAsIGltKSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gY2UubXVsKFtvcDEyLCBjZS5fSV0pO1xuICAgIH1cbiAgICBpZiAob3BzMi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IG9wMTIgPSBib3goY2UsIG9wczJbMF0sIG9wdGlvbnMpO1xuICAgICAgY29uc3Qgb3AyMiA9IGJveChjZSwgb3BzMlsxXSwgb3B0aW9ucyk7XG4gICAgICBjb25zdCByZSA9IGFzRmxvYXQob3AxMik7XG4gICAgICBjb25zdCBpbSA9IGFzRmxvYXQob3AyMik7XG4gICAgICBpZiAoaW0gIT09IG51bGwgJiYgcmUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGltID09PSAwICYmIHJlID09PSAwKVxuICAgICAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICAgICAgaWYgKGltICE9PSBudWxsICYmIGltICE9PSAwKVxuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChyZSwgaW0pLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG9wMTI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2UuYWRkKFtvcDEyLCBjZS5tdWwoW29wMjIsIGNlLl9JXSldLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgICB9XG4gIH1cbiAgaWYgKGhlYWQyID09PSBcIk5lZ2F0ZVwiICYmIG9wczIubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3Qgb3AxMiA9IG9wczJbMF07XG4gICAgaWYgKHR5cGVvZiBvcDEyID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcigtb3AxMiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wMTIgaW5zdGFuY2VvZiBEZWNpbWFsKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihvcDEyLm5lZygpLCBvcHRpb25zKTtcbiAgICBjb25zdCBudW0gPSBjZS5ib3gob3AxMiwgb3B0aW9ucykubnVtZXJpY1ZhbHVlO1xuICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgbnVtID09PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKC1udW0sIG9wdGlvbnMpO1xuICAgICAgaWYgKG51bSBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIobnVtLm5lZygpLCBvcHRpb25zKTtcbiAgICAgIGlmIChudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEzLkNvbXBsZXgpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIobnVtLm5lZygpKTtcbiAgICAgIGlmIChpc1JhdGlvbmFsKG51bSkpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIobmVnKG51bSkpO1xuICAgIH1cbiAgfVxuICBpZiAoaGVhZDIgPT09IFwiRGljdGlvbmFyeVwiKSB7XG4gICAgY29uc3QgZGljdCA9IHt9O1xuICAgIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICAgIGNvbnN0IGFyZyA9IGNlLmJveChvcDMpO1xuICAgICAgY29uc3QgaGVhZDMgPSBhcmcuaGVhZDtcbiAgICAgIGlmIChoZWFkMyA9PT0gXCJLZXlWYWx1ZVBhaXJcIiB8fCBoZWFkMyA9PT0gXCJQYWlyXCIgfHwgaGVhZDMgPT09IFwiVHVwbGVcIiAmJiBhcmcubm9wcyA9PT0gMikge1xuICAgICAgICBjb25zdCBrZXkgPSBhcmcub3AxO1xuICAgICAgICBpZiAoa2V5LmlzVmFsaWQgJiYgIWtleS5pc05vdGhpbmcpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZy5vcDI7XG4gICAgICAgICAgbGV0IGsgPSBrZXkuc3ltYm9sID8/IGtleS5zdHJpbmc7XG4gICAgICAgICAgaWYgKCFrICYmIChrZXkubnVtZXJpY1ZhbHVlICE9PSBudWxsIHx8IGtleS5zdHJpbmcpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdHlwZW9mIGtleS5udW1lcmljVmFsdWUgPT09IFwibnVtYmVyXCIgPyBrZXkubnVtZXJpY1ZhbHVlIDogYXNTbWFsbEludGVnZXIoa2V5KTtcbiAgICAgICAgICAgIGlmIChuICYmIE51bWJlci5pc0Zpbml0ZShuKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKG4pKVxuICAgICAgICAgICAgICBrID0gbi50b1N0cmluZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaylcbiAgICAgICAgICAgIGRpY3Rba10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEJveGVkRGljdGlvbmFyeShjZSwgZGljdCwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY2Fub25pY2FsKVxuICAgIHJldHVybiBtYWtlQ2Fub25pY2FsRnVuY3Rpb24oY2UsIGhlYWQyLCBvcHMyLCBvcHRpb25zLm1ldGFkYXRhKTtcbiAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKFxuICAgIGNlLFxuICAgIGhlYWQyLFxuICAgIG9wczIubWFwKCh4KSA9PiBib3goY2UsIHgsIHsgY2Fub25pY2FsOiBmYWxzZSB9KSksXG4gICAgb3B0aW9uc1xuICApO1xufVxuZnVuY3Rpb24gYm94KGNlLCBleHByLCBvcHRpb25zKSB7XG4gIGlmIChleHByID09PSBudWxsIHx8IGV4cHIgPT09IHZvaWQgMClcbiAgICByZXR1cm4gY2UuX2ZuKFwiU2VxdWVuY2VcIiwgW10pO1xuICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gIGlmICghKFwiY2Fub25pY2FsXCIgaW4gb3B0aW9ucykpXG4gICAgb3B0aW9ucy5jYW5vbmljYWwgPSB0cnVlO1xuICBpZiAoZXhwciBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgIHJldHVybiBvcHRpb25zLmNhbm9uaWNhbCA/IGV4cHIuY2Fub25pY2FsIDogZXhwcjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcikpIHtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwoZXhwcikpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGV4cHJbMF0pICYmIE51bWJlci5pc0ludGVnZXIoZXhwclsxXSkpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoZXhwcik7XG4gICAgICByZXR1cm4gYm94RnVuY3Rpb24oY2UsIFwiRGl2aWRlXCIsIGV4cHIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoaXNCaWdSYXRpb25hbChleHByKSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoZXhwcik7XG4gICAgaWYgKHR5cGVvZiBleHByWzBdID09PSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIGJveEZ1bmN0aW9uKGNlLCBleHByWzBdLCBleHByLnNsaWNlKDEpLCBvcHRpb25zKTtcbiAgICBjb25zdCBvcHMyID0gZXhwci5zbGljZSgxKS5tYXAoKHgpID0+IGJveChjZSwgeCwgb3B0aW9ucykpO1xuICAgIGNvbnN0IGhlYWQyID0gYm94KGNlLCBleHByWzBdLCBvcHRpb25zKTtcbiAgICBpZiAoaGVhZDIuc3ltYm9sKVxuICAgICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKGNlLCBoZWFkMi5zeW1ib2wsIG9wczIpO1xuICAgIHJldHVybiBhcHBseShoZWFkMiwgb3BzMik7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm51bWJlclwiIHx8IGV4cHIgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDEzLkNvbXBsZXggfHwgZXhwciBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgcmV0dXJuIGNlLm51bWJlcihleHByKTtcbiAgaWYgKHR5cGVvZiBleHByID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGV4cHIuc3RhcnRzV2l0aChcIidcIikgJiYgZXhwci5lbmRzV2l0aChcIidcIikpXG4gICAgICByZXR1cm4gbmV3IEJveGVkU3RyaW5nKGNlLCBleHByLnNsaWNlKDEsIC0xKSk7XG4gICAgaWYgKC9eWystXT9bMC05XS8udGVzdChleHByKSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoZXhwcik7XG4gICAgaWYgKCFpc1ZhbGlkSWRlbnRpZmllcihleHByKSlcbiAgICAgIHJldHVybiBjZS5lcnJvcihcImludmFsaWQtaWRlbnRpZmllclwiLCB7IHN0cjogZXhwciB9KTtcbiAgICByZXR1cm4gY2Uuc3ltYm9sKGV4cHIsIG9wdGlvbnMpO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgbGF0ZXg6IGV4cHIubGF0ZXgsXG4gICAgICB3aWtpZGF0YTogZXhwci53aWtpZGF0YVxuICAgIH07XG4gICAgaWYgKFwiZGljdFwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gbmV3IEJveGVkRGljdGlvbmFyeShjZSwgZXhwci5kaWN0LCB7IGNhbm9uaWNhbDogdHJ1ZSwgbWV0YWRhdGEgfSk7XG4gICAgaWYgKFwiZm5cIiBpbiBleHByKSB7XG4gICAgICBpZiAodHlwZW9mIGV4cHIuZm5bMF0gPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBib3hGdW5jdGlvbihjZSwgZXhwci5mblswXSwgZXhwci5mbi5zbGljZSgxKSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oXG4gICAgICAgIGNlLFxuICAgICAgICBib3goY2UsIGV4cHIuZm5bMF0sIG9wdGlvbnMpLFxuICAgICAgICBleHByLmZuLnNsaWNlKDEpLm1hcCgoeCkgPT4gYm94KGNlLCB4LCBvcHRpb25zKSksXG4gICAgICAgIHsgbWV0YWRhdGEgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwic3RyXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTdHJpbmcoY2UsIGV4cHIuc3RyLCBtZXRhZGF0YSk7XG4gICAgaWYgKFwic3ltXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBjZS5zeW1ib2woZXhwci5zeW0sIG9wdGlvbnMpO1xuICAgIGlmIChcIm51bVwiIGluIGV4cHIpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKGV4cHIsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBjZS5zeW1ib2woXCJVbmRlZmluZWRcIik7XG59XG5mdW5jdGlvbiBhc1N0cmluZyhleHByKSB7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZXhwcjtcbiAgaWYgKGV4cHIgaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikge1xuICAgIHJldHVybiBleHByLnN0cmluZyA/PyBleHByLnN5bWJvbCA/PyBleHByLnRvU3RyaW5nKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHByID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKFwic3RyXCIgaW4gZXhwcilcbiAgICAgIHJldHVybiBleHByLnN0cjtcbiAgICBpZiAoXCJmblwiIGluIGV4cHIgJiYgZXhwci5mblswXSA9PT0gXCJTdHJpbmdcIiAmJiB0eXBlb2YgZXhwci5mblsxXSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBleHByLmZuWzFdO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgaWYgKGV4cHJbMF0gPT09IFwiU3RyaW5nXCIgJiYgdHlwZW9mIGV4cHJbMV0gPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gZXhwclsxXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL251bWVyaWNzL251bWVyaWMtY29tcGxleC50c1xuZnVuY3Rpb24gZ2FtbWEzKGMpIHtcbiAgcmV0dXJuIGM7XG59XG5mdW5jdGlvbiBsbmdhbW1hMyhjKSB7XG4gIHJldHVybiBjO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9hcml0aG1ldGljLXBvd2VyLnRzXG52YXIgaW1wb3J0X2NvbXBsZXgxNSA9IF9fdG9FU00ocmVxdWlyZV9jb21wbGV4KCkpO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvc3ltYm9saWMvdXRpbHMudHNcbnZhciBpbXBvcnRfY29tcGxleDE0ID0gX190b0VTTShyZXF1aXJlX2NvbXBsZXgoKSk7XG5mdW5jdGlvbiBtYWtlUG9zaXRpdmUoZXhwcikge1xuICBpZiAoZXhwci5oZWFkID09PSBcIk5lZ2F0ZVwiKVxuICAgIHJldHVybiBbLTEsIGV4cHIub3AxXTtcbiAgY29uc3QgbiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBpZiAobiA9PT0gbnVsbClcbiAgICByZXR1cm4gWzEsIGV4cHJdO1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICBpZiAodHlwZW9mIG4gPT09IFwibnVtYmVyXCIgJiYgbiA8IDApXG4gICAgcmV0dXJuIFstMSwgY2UubnVtYmVyKC1uKV07XG4gIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0ICYmIG4uaXNOZWdhdGl2ZSgpKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihuLm5lZygpKV07XG4gIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNC5kZWZhdWx0ICYmIG4ucmUgPCAwKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihjZS5jb21wbGV4KC1uLnJlLCAtbi5pbSkpXTtcbiAgaWYgKGlzTWFjaGluZVJhdGlvbmFsKG4pICYmIG5bMF0gPCAwKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihbLW5bMF0sIG5bMV1dKV07XG4gIGlmIChpc0JpZ1JhdGlvbmFsKG4pICYmIG5bMF0gPCAwKVxuICAgIHJldHVybiBbLTEsIGNlLm51bWJlcihbLW5bMF0sIG5bMV1dKV07XG4gIHJldHVybiBbMSwgZXhwcl07XG59XG5mdW5jdGlvbiBhcHBseTIoZXhwciwgZm4sIGJpZ0ZuLCBjb21wbGV4Rm4pIHtcbiAgY29uc3QgbiA9IGV4cHIubnVtZXJpY1ZhbHVlO1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQobiAhPT0gbnVsbCk7XG4gIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChiaWdudW1QcmVmZXJyZWQoY2UpICYmIGJpZ0ZuKVxuICAgICAgcmV0dXJuIGNlLmNob3AoYmlnRm4oY2UuYmlnbnVtKG4pKSk7XG4gICAgcmV0dXJuIGNlLmNob3AoZm4obikpO1xuICB9XG4gIGlmIChuIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIHJldHVybiBjZS5jaG9wKGJpZ0ZuPy4obikgPz8gZm4obi50b051bWJlcigpKSk7XG4gIGlmIChpc01hY2hpbmVSYXRpb25hbChuKSkge1xuICAgIGlmICghYmlnbnVtUHJlZmVycmVkKGNlKSB8fCAhYmlnRm4pXG4gICAgICByZXR1cm4gY2UuY2hvcChmbihuWzBdIC8gblsxXSkpO1xuICAgIHJldHVybiBjZS5jaG9wKGJpZ0ZuKGNlLmJpZ251bShuWzBdKS5kaXYoblsxXSkpKTtcbiAgfVxuICBpZiAoaXNCaWdSYXRpb25hbChuKSkge1xuICAgIGlmIChiaWdGbilcbiAgICAgIHJldHVybiBjZS5jaG9wKGJpZ0ZuKGNlLmJpZ251bShuWzBdKS5kaXYoY2UuYmlnbnVtKG5bMV0pKSkpO1xuICAgIHJldHVybiBjZS5jaG9wKGZuKE51bWJlcihuWzBdKSAvIE51bWJlcihuWzFdKSkpO1xuICB9XG4gIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNC5kZWZhdWx0KSB7XG4gICAgaWYgKCFjb21wbGV4Rm4gfHwgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgIHJldHVybiBOYU47XG4gICAgcmV0dXJuIGNlLmNob3AoY29tcGxleEZuKG4pKTtcbiAgfVxuICByZXR1cm4gTmFOO1xufVxuZnVuY3Rpb24gYXBwbHlOKGV4cHIsIGZuLCBiaWdGbiwgY29tcGxleEZuKSB7XG4gIGlmICgoZXhwcj8ubnVtZXJpY1ZhbHVlID8/IG51bGwpID09PSBudWxsKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIHJldHVybiBleHByLmVuZ2luZS5udW1iZXIoYXBwbHkyKGV4cHIsIGZuLCBiaWdGbiwgY29tcGxleEZuKSk7XG59XG5mdW5jdGlvbiBhcHBseTIyKGV4cHIxLCBleHByMiwgZm4sIGJpZ0ZuLCBjb21wbGV4Rm4pIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGV4cHIxLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBleHByMi5udW1lcmljVmFsdWUgIT09IG51bGwpO1xuICBjb25zdCBjZSA9IGV4cHIxLmVuZ2luZTtcbiAgbGV0IG0xID0gZXhwcjEubnVtZXJpY1ZhbHVlO1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobTEpKVxuICAgIG0xID0gbTFbMF0gLyBtMVsxXTtcbiAgbGV0IG0yID0gZXhwcjIubnVtZXJpY1ZhbHVlO1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobTIpKVxuICAgIG0yID0gbTJbMF0gLyBtMlsxXTtcbiAgaWYgKCFiaWdudW1QcmVmZXJyZWQoY2UpICYmIHR5cGVvZiBtMSA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgbTIgPT09IFwibnVtYmVyXCIpXG4gICAgcmV0dXJuIGZuKG0xLCBtMik7XG4gIGxldCBiMSA9IHZvaWQgMDtcbiAgaWYgKG0xIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIGIxID0gbTE7XG4gIGVsc2UgaWYgKGlzQmlnUmF0aW9uYWwobTEpKVxuICAgIGIxID0gY2UuYmlnbnVtKG0xWzBdKS5kaXYoY2UuYmlnbnVtKG0xWzFdKSk7XG4gIGVsc2UgaWYgKG0xICE9PSBudWxsICYmIHR5cGVvZiBtMSA9PT0gXCJudW1iZXJcIilcbiAgICBiMSA9IGNlLmJpZ251bShtMSk7XG4gIGxldCBiMiA9IHZvaWQgMDtcbiAgaWYgKG0yIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgIGIyID0gbTI7XG4gIGVsc2UgaWYgKGlzQmlnUmF0aW9uYWwobTIpKVxuICAgIGIxID0gY2UuYmlnbnVtKG0yWzBdKS5kaXYoY2UuYmlnbnVtKG0yWzFdKSk7XG4gIGVsc2UgaWYgKG0yICE9PSBudWxsICYmIHR5cGVvZiBtMiA9PT0gXCJudW1iZXJcIilcbiAgICBiMiA9IGNlLmJpZ251bShtMik7XG4gIGlmIChiMSAmJiBiMilcbiAgICByZXR1cm4gYmlnRm4/LihiMSwgYjIpID8/IGZuKGIxLnRvTnVtYmVyKCksIGIyLnRvTnVtYmVyKCkpO1xuICBpZiAobTEgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE0LmRlZmF1bHQgfHwgbTIgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE0LmRlZmF1bHQpIHtcbiAgICBpZiAoIWNvbXBsZXhGbiB8fCAhY29tcGxleEFsbG93ZWQoY2UpKVxuICAgICAgcmV0dXJuIE5hTjtcbiAgICByZXR1cm4gY29tcGxleEZuKFxuICAgICAgY2UuY29tcGxleChtMSA/PyBiMT8udG9OdW1iZXIoKSA/PyBOYU4pLFxuICAgICAgY2UuY29tcGxleChtMiA/PyBiMj8udG9OdW1iZXIoKSA/PyBOYU4pXG4gICAgKTtcbiAgfVxuICByZXR1cm4gTmFOO1xufVxuZnVuY3Rpb24gYXBwbHkyTihleHByMSwgZXhwcjIsIGZuLCBiaWdGbiwgY29tcGxleEZuKSB7XG4gIGlmIChleHByMS5udW1lcmljVmFsdWUgPT09IG51bGwgfHwgZXhwcjIubnVtZXJpY1ZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIHJldHVybiBleHByMS5lbmdpbmUubnVtYmVyKGFwcGx5MjIoZXhwcjEsIGV4cHIyLCBmbiwgYmlnRm4sIGNvbXBsZXhGbikpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9hcml0aG1ldGljLXBvd2VyLnRzXG5mdW5jdGlvbiBjYW5vbmljYWxQb3dlcihjZSwgYmFzZSwgZXhwb25lbnQsIG1ldGFkYXRhKSB7XG4gIGlmIChleHBvbmVudC5zeW1ib2wgPT09IFwiQ29tcGxleEluZmluaXR5XCIpXG4gICAgcmV0dXJuIGNlLl9OQU47XG4gIGlmIChleHBvbmVudC5pc1plcm8pXG4gICAgcmV0dXJuIGNlLl9PTkU7XG4gIGlmIChleHBvbmVudC5pc09uZSlcbiAgICByZXR1cm4gYmFzZTtcbiAgaWYgKGV4cG9uZW50LmlzTmVnYXRpdmVPbmUpXG4gICAgcmV0dXJuIGNlLmludihiYXNlKTtcbiAgaWYgKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGlmIChiYXNlLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbnVtQmFzZSA9IGFzRmxvYXQoYmFzZSk7XG4gICAgICBpZiAobnVtQmFzZSA9PT0gMSlcbiAgICAgICAgcmV0dXJuIGNlLl9PTkU7XG4gICAgICBpZiAobnVtQmFzZSA9PT0gMCkge1xuICAgICAgICBpZiAoZXhwb25lbnQuaXNQb3NpdGl2ZSlcbiAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgIGlmIChleHBvbmVudC5pc05lZ2F0aXZlKVxuICAgICAgICAgIHJldHVybiBjZS5fQ09NUExFWF9JTkZJTklUWTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBvbmVudC5pc05lZ2F0aXZlT25lKVxuICAgICAgICByZXR1cm4gY2UuaW52KGJhc2UpO1xuICAgICAgY29uc3QgZSA9IGFzRmxvYXQoZXhwb25lbnQpO1xuICAgICAgaWYgKGUgPT09IDAuNSB8fCBlID09PSAtMC41KSB7XG4gICAgICAgIGNvbnN0IGIgPSBhc1NtYWxsSW50ZWdlcihiYXNlKTtcbiAgICAgICAgaWYgKGIgIT09IG51bGwgJiYgYiA+IDApIHtcbiAgICAgICAgICBjb25zdCBbY29lZiwgcmFkaWNhbmRdID0gZmFjdG9yUG93ZXIoYiwgMik7XG4gICAgICAgICAgaWYgKHJhZGljYW5kID09PSAxICYmIGNvZWYgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgICBpZiAoY29lZiAhPT0gMSkge1xuICAgICAgICAgICAgaWYgKHJhZGljYW5kID09PSAxKVxuICAgICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKGUgPj0gMCA/IGNvZWYgOiBbMSwgY29lZl0pO1xuICAgICAgICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgICAgICAgIGNlLm51bWJlcihjb2VmKSxcbiAgICAgICAgICAgICAgY2UuX2ZuKFwiU3FydFwiLCBbY2UubnVtYmVyKHJhZGljYW5kKV0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGUgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlNxcnRcIiwgW2Jhc2VdLCBtZXRhZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIGNlLmludihjZS5fZm4oXCJTcXJ0XCIsIFtiYXNlXSksIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSA+IDApXG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlBvd2VyXCIsIFtiYXNlLCBjZS5fSEFMRl0sIG1ldGFkYXRhKTtcbiAgICAgICAgcmV0dXJuIGNlLl9mbihcIlBvd2VyXCIsIFtiYXNlLCBjZS5udW1iZXIoWy0xLCAyXSldLCBtZXRhZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZS5pc0luZmluaXR5KSB7XG4gICAgICAgIGlmIChleHBvbmVudC5udW1lcmljVmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE1LmRlZmF1bHQpIHtcbiAgICAgICAgICBjb25zdCByZSA9IGV4cG9uZW50Lm51bWVyaWNWYWx1ZS5yZTtcbiAgICAgICAgICBpZiAocmUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICBpZiAocmUgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9aRVJPO1xuICAgICAgICAgIGlmIChyZSA+IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX0NPTVBMRVhfSU5GSU5JVFk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2UuaXNOZWdhdGl2ZSkge1xuICAgICAgICAgIGlmIChleHBvbmVudC5pc0luZmluaXR5KVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgIH0gZWxzZSBpZiAoYmFzZS5pc1Bvc2l0aXZlKSB7XG4gICAgICAgICAgaWYgKGV4cG9uZW50LmlzTmVnYXRpdmVPbmUpXG4gICAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgICAgaWYgKGV4cG9uZW50LmlzSW5maW5pdHkpXG4gICAgICAgICAgICByZXR1cm4gZXhwb25lbnQuaXNOZWdhdGl2ZSA/IGNlLl9aRVJPIDogY2UuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXhwb25lbnQuaXNJbmZpbml0eSAmJiAoYmFzZS5pc09uZSB8fCBiYXNlLmlzTmVnYXRpdmVPbmUpKVxuICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICB9XG4gIH1cbiAgaWYgKGJhc2UuaGVhZCA9PT0gXCJQb3dlclwiICYmIGJhc2Uub3AxLmlzUmVhbCkge1xuICAgIGNvbnN0IGEgPSBhc1NtYWxsSW50ZWdlcihleHBvbmVudCk7XG4gICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGIgPSBhc1NtYWxsSW50ZWdlcihiYXNlLm9wMik7XG4gICAgICBpZiAoYiAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBjZS5udW1iZXIoYSAqIGIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhc2Uub3AxLmlzTm9uTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGFyID0gYXNSYXRpb25hbChleHBvbmVudCk7XG4gICAgICBpZiAoYXIpIHtcbiAgICAgICAgY29uc3QgYnIgPSBhc1JhdGlvbmFsKGJhc2Uub3AyKTtcbiAgICAgICAgaWYgKGJyKVxuICAgICAgICAgIHJldHVybiBjZS5wb3coYmFzZS5vcDEsIGNlLm51bWJlcihtdWwyKGFyLCBicikpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGJhc2UuaGVhZCA9PT0gXCJNdWx0aXBseVwiKSB7XG4gICAgY29uc3QgZSA9IGFzU21hbGxJbnRlZ2VyKGV4cG9uZW50KTtcbiAgICBpZiAoZSAhPT0gbnVsbClcbiAgICAgIHJldHVybiBjZS5fZm4oXG4gICAgICAgIFwiTXVsdGlwbHlcIixcbiAgICAgICAgYmFzZS5vcHMubWFwKCh4KSA9PiBjZS5wb3coeCwgZXhwb25lbnQpKVxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gY2UuX2ZuKFwiUG93ZXJcIiwgW2Jhc2UsIGV4cG9uZW50XSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gc3F1YXJlKGNlLCBiYXNlKSB7XG4gIGNvbnN0IG51bSA9IGJhc2UubnVtZXJpY1ZhbHVlO1xuICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIilcbiAgICByZXR1cm4gY2UubnVtYmVyKG51bSAqIG51bSk7XG4gIGlmIChudW0gaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQpXG4gICAgcmV0dXJuIGNlLm51bWJlcihudW0ucG93KDIpKTtcbiAgaWYgKG51bSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTUuZGVmYXVsdClcbiAgICByZXR1cm4gY2UubnVtYmVyKG51bS5wb3coMikpO1xuICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobnVtKSlcbiAgICByZXR1cm4gY2UubnVtYmVyKFtudW1bMV0gKiBudW1bMV0sIG51bVswXSAqIG51bVswXV0pO1xuICBpZiAoaXNCaWdSYXRpb25hbChudW0pKVxuICAgIHJldHVybiBjZS5udW1iZXIoW251bVsxXSAqIG51bVsxXSwgbnVtWzBdICogbnVtWzBdXSk7XG4gIGlmIChiYXNlLmhlYWQgPT09IFwiTXVsdGlwbHlcIilcbiAgICByZXR1cm4gY2UuX2ZuKFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgYmFzZS5vcHMubWFwKCh4KSA9PiBzcXVhcmUoY2UsIHgpKVxuICAgICk7XG4gIGlmIChiYXNlLmhlYWQgPT09IFwiUG93ZXJcIikge1xuICAgIGNvbnN0IGV4cDIgPSBhc1NtYWxsSW50ZWdlcihiYXNlLm9wMik7XG4gICAgaWYgKGV4cDIgIT09IG51bGwpXG4gICAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBjZS5udW1iZXIoZXhwMiAqIDIpKTtcbiAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBjZS5tdWwoW2NlLm51bWJlcigyKSwgYmFzZS5vcDJdKSk7XG4gIH1cbiAgcmV0dXJuIGNlLnBvdyhiYXNlLCBjZS5udW1iZXIoMikpO1xufVxuZnVuY3Rpb24gbnVtRXZhbFBvd2VyKGNlLCBiYXNlLCBleHBvbmVudCkge1xuICBpZiAoYmFzZS5udW1lcmljVmFsdWUgPT09IG51bGwgfHwgZXhwb25lbnQubnVtZXJpY1ZhbHVlID09PSBudWxsKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGlmIChiYXNlLm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MTUuZGVmYXVsdCkge1xuICAgIGlmIChleHBvbmVudC5udW1lcmljVmFsdWUgaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE1LmRlZmF1bHQpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKGJhc2UubnVtZXJpY1ZhbHVlLnBvdyhleHBvbmVudC5udW1lcmljVmFsdWUpKTtcbiAgICByZXR1cm4gY2UubnVtYmVyKGJhc2UubnVtZXJpY1ZhbHVlLnBvdyhhc0Zsb2F0KGV4cG9uZW50KSA/PyBOYU4pKTtcbiAgfVxuICBpZiAoZXhwb25lbnQubnVtZXJpY1ZhbHVlIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNS5kZWZhdWx0KSB7XG4gICAgY29uc3QgYiA9IGFzRmxvYXQoYmFzZSkgPz8gbnVsbDtcbiAgICBpZiAoYiAhPT0gbnVsbClcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChiKS5wb3coZXhwb25lbnQubnVtZXJpY1ZhbHVlKSk7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBjb25zdCBpbnZFeHAgPSByb290RXhwKGV4cG9uZW50KTtcbiAgaWYgKGJpZ251bVByZWZlcnJlZChjZSkgfHwgYmFzZS5udW1lcmljVmFsdWUgaW5zdGFuY2VvZiBkZWNpbWFsX2RlZmF1bHQgfHwgZXhwb25lbnQubnVtZXJpY1ZhbHVlIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KSB7XG4gICAgY29uc3QgYmlnQmFzZSA9IGFzQmlnbnVtKGJhc2UpO1xuICAgIGNvbnN0IGJpZ0V4cCA9IGFzQmlnbnVtKGV4cG9uZW50KTtcbiAgICBpZiAoIWJpZ0Jhc2UgfHwgIWJpZ0V4cClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKGludkV4cCA9PT0gMikge1xuICAgICAgaWYgKGJpZ0Jhc2UuaXNOZWcoKSlcbiAgICAgICAgcmV0dXJuIGNvbXBsZXhBbGxvd2VkKGNlKSA/IGNlLm51bWJlcihjZS5jb21wbGV4KDAsIGJpZ0Jhc2UubmVnKCkuc3FydCgpLnRvTnVtYmVyKCkpKSA6IGNlLl9OQU47XG4gICAgICByZXR1cm4gY2UubnVtYmVyKGJpZ0Jhc2Uuc3FydCgpKTtcbiAgICB9XG4gICAgaWYgKCFiaWdFeHAuaXNJbnRlZ2VyKCkgJiYgYmlnQmFzZS5pc05lZygpKSB7XG4gICAgICBpZiAoIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICBjb25zdCB6QmFzZSA9IGNlLmNvbXBsZXgoYmlnQmFzZS50b051bWJlcigpKTtcbiAgICAgIGNvbnN0IHpFeHAgPSBjZS5jb21wbGV4KGJpZ0V4cC50b051bWJlcigpKTtcbiAgICAgIHJldHVybiBjZS5udW1iZXIoekJhc2UucG93KHpFeHApKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlLm51bWJlcihiaWdCYXNlLnBvdyhiaWdFeHApKTtcbiAgfVxuICBjb25zdCBmbG9hdEV4cCA9IGFzRmxvYXQoZXhwb25lbnQpID8/IE5hTjtcbiAgY29uc3QgZmxvYXRCYXNlID0gYXNGbG9hdChiYXNlKSA/PyBOYU47XG4gIGlmIChpbnZFeHAgPT09IDIpIHtcbiAgICBpZiAoZmxvYXRCYXNlIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXhBbGxvd2VkKGNlKSA/IGNlLm11bChbY2UuX0ksIGNlLm51bWJlcihNYXRoLnNxcnQoLWZsb2F0QmFzZSkpXSkgOiBjZS5fTkFOO1xuICAgIH1cbiAgICByZXR1cm4gY2UubnVtYmVyKE1hdGguc3FydChmbG9hdEJhc2UpKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmxvYXRFeHApICYmIGZsb2F0QmFzZSA8IDApIHtcbiAgICBpZiAoIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgIGNvbnN0IHpCYXNlID0gY2UuY29tcGxleChmbG9hdEJhc2UpO1xuICAgIGNvbnN0IHpFeHAgPSBjZS5jb21wbGV4KGZsb2F0RXhwKTtcbiAgICByZXR1cm4gY2UubnVtYmVyKHpCYXNlLnBvdyh6RXhwKSk7XG4gIH1cbiAgcmV0dXJuIGNlLm51bWJlcihNYXRoLnBvdyhmbG9hdEJhc2UsIGZsb2F0RXhwKSk7XG59XG5mdW5jdGlvbiBwcm9jZXNzUG93ZXIoY2UsIGJhc2UsIGV4cG9uZW50LCBtb2RlKSB7XG4gIGlmIChiYXNlLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgIGxldCBjID0gYmlnbnVtUHJlZmVycmVkKGNlKSA/IFtCaWdJbnQoMSksIEJpZ0ludCgxKV0gOiBbMSwgMV07XG4gICAgY29uc3QgeHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wMyBvZiBiYXNlLm9wcykge1xuICAgICAgY29uc3QgciA9IGFzUmF0aW9uYWwob3AzKTtcbiAgICAgIGlmIChyKVxuICAgICAgICBjID0gbXVsMihjLCByKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeHMucHVzaChvcDMpO1xuICAgIH1cbiAgICBpZiAoIWlzUmF0aW9uYWxPbmUoYykpXG4gICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgcHJvY2Vzc1NxcnQoY2UsIGNlLm51bWJlcihjKSwgbW9kZSkgPz8gY2UuX09ORSxcbiAgICAgICAgY2UucG93KFxuICAgICAgICAgIHByb2Nlc3NQb3dlcihjZSwgY2UubXVsKHhzKSwgZXhwb25lbnQsIG1vZGUpID8/IGNlLm11bCh4cyksXG4gICAgICAgICAgZXhwb25lbnRcbiAgICAgICAgKVxuICAgICAgXSk7XG4gIH1cbiAgaWYgKGJhc2UuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgaWYgKGFzU21hbGxJbnRlZ2VyKGJhc2Uub3AyKSA9PT0gLTEgJiYgYXNTbWFsbEludGVnZXIoZXhwb25lbnQpID09PSAtMSlcbiAgICAgIHJldHVybiBiYXNlLm9wMTtcbiAgICBjb25zdCBlMSA9IGFzUmF0aW9uYWwoYmFzZS5vcDIpO1xuICAgIGNvbnN0IGUyID0gYXNSYXRpb25hbChleHBvbmVudCk7XG4gICAgaWYgKGUxICYmIGUyKSB7XG4gICAgICBjb25zdCBlID0gbXVsMihlMSwgZTIpO1xuICAgICAgaWYgKGlzUmF0aW9uYWxaZXJvKGUpKVxuICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgIGlmIChpc1JhdGlvbmFsT25lKGUpKVxuICAgICAgICByZXR1cm4gYmFzZS5vcDE7XG4gICAgICByZXR1cm4gY2UucG93KGJhc2Uub3AxLCBlKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFwiTlwiKSB7XG4gICAgICBjb25zdCBlZjEgPSBhc0Zsb2F0KGJhc2Uub3AyKTtcbiAgICAgIGNvbnN0IGVmMiA9IGFzRmxvYXQoZXhwb25lbnQpO1xuICAgICAgaWYgKGVmMSAhPT0gbnVsbCAmJiBlZjIgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWYgPSBlZjEgKiBlZjI7XG4gICAgICAgIGlmIChlZiA9PT0gMClcbiAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgaWYgKGVmID09PSAxKVxuICAgICAgICAgIHJldHVybiBiYXNlLm9wMTtcbiAgICAgICAgcmV0dXJuIGNlLnBvdyhiYXNlLm9wMSwgZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobW9kZSAhPT0gXCJOXCIgJiYgYmFzZS5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgYmFzZS5pc0ludGVnZXIpIHtcbiAgICBjb25zdCBzbWFsbEV4cHIgPSBhc1NtYWxsSW50ZWdlcihleHBvbmVudCk7XG4gICAgaWYgKHNtYWxsRXhwcilcbiAgICAgIHJldHVybiBudW1FdmFsUG93ZXIoY2UsIGJhc2UsIGV4cG9uZW50KTtcbiAgICBjb25zdCByID0gYXNSYXRpb25hbChleHBvbmVudCk7XG4gICAgaWYgKHIpIHtcbiAgICAgIGNvbnN0IFtuLCBkXSA9IFttYWNoaW5lTnVtZXJhdG9yKHIpLCBtYWNoaW5lRGVub21pbmF0b3IocildO1xuICAgICAgaWYgKChuID09PSAxIHx8IG4gPT09IC0xKSAmJiAoZCA9PT0gMiB8fCBkID09PSAzKSkge1xuICAgICAgICBpZiAoYmlnbnVtUHJlZmVycmVkKGNlKSB8fCBiYXNlLm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgICAgICAgIGNvbnN0IGJpZ0Jhc2UgPSBhc0JpZ2ludChiYXNlKTtcbiAgICAgICAgICBpZiAoZCAlIDIgPT09IDAgJiYgYmlnQmFzZSA8IDAgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIGNvbnN0IHNpZ24yID0gYmlnQmFzZSA8IDAgPyBkICUgMiA9PT0gMCA/IGNlLl9JIDogY2UuX05FR0FUSVZFX09ORSA6IGNlLl9PTkU7XG4gICAgICAgICAgY29uc3QgW2ZhY3Rvciwgcm9vdF0gPSBmYWN0b3JQb3dlcjIoXG4gICAgICAgICAgICBiaWdCYXNlID4gMCA/IGJpZ0Jhc2UgOiAtYmlnQmFzZSxcbiAgICAgICAgICAgIGRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyb290ID09PSBCaWdJbnQoMSkgJiYgZmFjdG9yID09PSBCaWdJbnQoMSkpXG4gICAgICAgICAgICByZXR1cm4gc2lnbjI7XG4gICAgICAgICAgaWYgKGZhY3RvciAhPT0gQmlnSW50KDEpKSB7XG4gICAgICAgICAgICBpZiAocm9vdCA9PT0gQmlnSW50KDEpKVxuICAgICAgICAgICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgICAgICAgICBzaWduMixcbiAgICAgICAgICAgICAgICBjZS5udW1iZXIobiA+PSAwID8gZmFjdG9yIDogW0JpZ0ludCgxKSwgZmFjdG9yXSlcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgICAgICAgc2lnbjIsXG4gICAgICAgICAgICAgIGNlLm51bWJlcihmYWN0b3IpLFxuICAgICAgICAgICAgICBjZS5wb3coY2UubnVtYmVyKHJvb3QpLCBleHBvbmVudClcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYmFzZS5udW1lcmljVmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBpZiAoYmFzZS5udW1lcmljVmFsdWUgPCAwICYmIGQgJSAyID09PSAwICYmICFjb21wbGV4QWxsb3dlZChjZSkpXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICBjb25zdCBbZmFjdG9yLCByb290XSA9IGZhY3RvclBvd2VyKE1hdGguYWJzKGJhc2UubnVtZXJpY1ZhbHVlKSwgZCk7XG4gICAgICAgICAgY29uc3Qgc2lnbjIgPSBiYXNlLm51bWVyaWNWYWx1ZSA8IDAgPyBkICUgMiA9PT0gMCA/IGNlLl9JIDogY2UuX05FR0FUSVZFX09ORSA6IGNlLl9PTkU7XG4gICAgICAgICAgaWYgKHJvb3QgPT09IDEgJiYgZmFjdG9yID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIHNpZ24yO1xuICAgICAgICAgIGlmIChmYWN0b3IgIT09IDEpIHtcbiAgICAgICAgICAgIGlmIChyb290ID09PSAxKVxuICAgICAgICAgICAgICByZXR1cm4gY2UubXVsKFtzaWduMiwgY2UubnVtYmVyKG4gPj0gMCA/IGZhY3RvciA6IFsxLCBmYWN0b3JdKV0pO1xuICAgICAgICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgICAgICAgIHNpZ24yLFxuICAgICAgICAgICAgICBjZS5udW1iZXIoZmFjdG9yKSxcbiAgICAgICAgICAgICAgY2UucG93KGNlLm51bWJlcihyb290KSwgZXhwb25lbnQpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChiYXNlLmlzTmVnYXRpdmUpIHtcbiAgICAgICAgaWYgKCFjb21wbGV4QWxsb3dlZClcbiAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgcmV0dXJuIGNlLm11bChbY2UuX0ksIGNlLmZuKFwiU3FydFwiLCBbY2UubmVnKGJhc2UpXSldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGlmIChtb2RlICE9PSBcInNpbXBsaWZ5XCIgJiYgYmFzZS5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgZXhwb25lbnQubnVtZXJpY1ZhbHVlICE9PSBudWxsKVxuICAgIHJldHVybiBudW1FdmFsUG93ZXIoY2UsIGJhc2UsIGV4cG9uZW50KTtcbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NTcXJ0KGNlLCBiYXNlLCBtb2RlKSB7XG4gIGlmIChiYXNlLmlzT25lKVxuICAgIHJldHVybiBjZS5fT05FO1xuICBpZiAoYmFzZS5pc1plcm8pXG4gICAgcmV0dXJuIGNlLl9aRVJPO1xuICBpZiAoYmFzZS5pc05lZ2F0aXZlT25lKVxuICAgIHJldHVybiBjb21wbGV4QWxsb3dlZChjZSkgPyBjZS5fSSA6IGNlLl9OQU47XG4gIGlmIChiYXNlLmlzTmVnYXRpdmUgJiYgIWNvbXBsZXhBbGxvd2VkKGNlKSlcbiAgICByZXR1cm4gY2UuX05BTjtcbiAgY29uc3QgciA9IGFzUmF0aW9uYWwoYmFzZSk7XG4gIGlmIChtb2RlID09PSBcIk5cIiB8fCBtb2RlID09PSBcImV2YWx1YXRlXCIgJiYgIXIpXG4gICAgcmV0dXJuIGFwcGx5TihcbiAgICAgIGJhc2UsXG4gICAgICAoeCkgPT4geCA8IDAgPyBjZS5jb21wbGV4KHgpLnNxcnQoKSA6IE1hdGguc3FydCh4KSxcbiAgICAgICh4KSA9PiB4LmlzTmVnKCkgPyBjZS5jb21wbGV4KHgudG9OdW1iZXIoKSkuc3FydCgpIDogeC5zcXJ0KCksXG4gICAgICAoeCkgPT4geC5zcXJ0KClcbiAgICApO1xuICBjb25zdCBuID0gYXNTbWFsbEludGVnZXIoYmFzZSk7XG4gIGlmIChuICE9PSBudWxsKSB7XG4gICAgY29uc3QgW2ZhY3Rvciwgcm9vdF0gPSBmYWN0b3JQb3dlcihNYXRoLmFicyhuKSwgMik7XG4gICAgaWYgKG4gPCAwKSB7XG4gICAgICBpZiAocm9vdCA9PT0gMSlcbiAgICAgICAgY2UubXVsKFtjZS5udW1iZXIoY2UuY29tcGxleCgwLCBmYWN0b3IpKV0pO1xuICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgIGNlLm51bWJlcihjZS5jb21wbGV4KDAsIGZhY3RvcikpLFxuICAgICAgICBjZS5zcXJ0KGNlLm51bWJlcihyb290KSlcbiAgICAgIF0pO1xuICAgIH1cbiAgICBpZiAocm9vdCA9PT0gMSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoZmFjdG9yKTtcbiAgICByZXR1cm4gY2UubXVsKFtjZS5udW1iZXIoZmFjdG9yKSwgY2Uuc3FydChjZS5udW1iZXIocm9vdCkpXSk7XG4gIH1cbiAgaWYgKHIpIHtcbiAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwocikgJiYgIWJpZ251bVByZWZlcnJlZChjZSkpIHtcbiAgICAgIGNvbnN0IFtuMiwgZF0gPSByO1xuICAgICAgaWYgKE1hdGguYWJzKG4yKSA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIGQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICBjb25zdCBbbkZhY3RvciwgblJvb3RdID0gZmFjdG9yUG93ZXIoTWF0aC5hYnMobjIpLCAyKTtcbiAgICAgICAgY29uc3QgW2RGYWN0b3IsIGRSb290XSA9IGZhY3RvclBvd2VyKGQsIDIpO1xuICAgICAgICBpZiAobjIgPCAwKVxuICAgICAgICAgIHJldHVybiBjZS5tdWwoW1xuICAgICAgICAgICAgY2UubnVtYmVyKFtuRmFjdG9yLCBkRmFjdG9yXSksXG4gICAgICAgICAgICBjZS5zcXJ0KGNlLm51bWJlcihbblJvb3QsIGRSb290XSkpLFxuICAgICAgICAgICAgY2UuX0lcbiAgICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIGNlLm11bChbXG4gICAgICAgICAgY2UubnVtYmVyKFtuRmFjdG9yLCBkRmFjdG9yXSksXG4gICAgICAgICAgY2Uuc3FydChjZS5udW1iZXIoW25Sb290LCBkUm9vdF0pKVxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQmlnUmF0aW9uYWwocikgfHwgYmlnbnVtUHJlZmVycmVkKGNlKSkge1xuICAgICAgY29uc3QgbjIgPSBiaWdpbnQoclswXSk7XG4gICAgICBjb25zdCBbbkZhY3RvciwgblJvb3RdID0gZmFjdG9yUG93ZXIyKG4yID4gMCA/IG4yIDogLW4yLCAyKTtcbiAgICAgIGNvbnN0IFtkRmFjdG9yLCBkUm9vdF0gPSBmYWN0b3JQb3dlcjIoYmlnaW50KHJbMV0pLCAyKTtcbiAgICAgIGlmIChuMiA8IDApXG4gICAgICAgIHJldHVybiBjZS5tdWwoW1xuICAgICAgICAgIGNlLm51bWJlcihbbkZhY3RvciwgZEZhY3Rvcl0pLFxuICAgICAgICAgIGNlLnNxcnQoY2UubnVtYmVyKFtuUm9vdCwgZFJvb3RdKSksXG4gICAgICAgICAgY2UuX0lcbiAgICAgICAgXSk7XG4gICAgICByZXR1cm4gY2UubXVsKFtcbiAgICAgICAgY2UubnVtYmVyKFtuRmFjdG9yLCBkRmFjdG9yXSksXG4gICAgICAgIGNlLnNxcnQoY2UubnVtYmVyKFtuUm9vdCwgZFJvb3RdKSlcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gcm9vdEV4cChleHBvbmVudCkge1xuICBpZiAodHlwZW9mIGV4cG9uZW50Lm51bWVyaWNWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGludiA9IDEgLyBleHBvbmVudC5udW1lcmljVmFsdWU7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW52KSlcbiAgICAgIHJldHVybiBpbnY7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdCkge1xuICAgIGNvbnN0IGludiA9IGV4cG9uZW50LmVuZ2luZS5fQklHTlVNX09ORS5kaXYoZXhwb25lbnQubnVtZXJpY1ZhbHVlKTtcbiAgICBpZiAoaW52LmlzSW50KCkpXG4gICAgICByZXR1cm4gaW52LnRvTnVtYmVyKCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFpc1JhdGlvbmFsKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSkpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IFtuLCBkXSA9IFtcbiAgICBtYWNoaW5lTnVtZXJhdG9yKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSksXG4gICAgbWFjaGluZURlbm9taW5hdG9yKGV4cG9uZW50Lm51bWVyaWNWYWx1ZSlcbiAgXTtcbiAgaWYgKG4gIT09IDEgJiYgbiAhPT0gLTEpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuICogZDtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvYXJpdGhtZXRpYy1tdWx0aXBseS50c1xuZnVuY3Rpb24gY2Fub25pY2FsTXVsdGlwbHkoY2UsIG9wczIpIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wczIuZXZlcnkoKHgpID0+IHguaXNDYW5vbmljYWwpKTtcbiAgaWYgKG9wczIubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBjZS5udW1iZXIoMSk7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gb3BzMlswXTtcbiAgaWYgKG9wczIubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiBtdWx0aXBseTIob3BzMlswXSwgb3BzMlsxXSk7XG4gIGNvbnN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdChjZSk7XG4gIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICBpZiAob3AzLmlzTmFOIHx8IG9wMy5zeW1ib2wgPT09IFwiVW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBwcm9kdWN0LmFkZFRlcm0ob3AzKTtcbiAgfVxuICByZXR1cm4gcHJvZHVjdC5hc0V4cHJlc3Npb24oKTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5TXVsdGlwbHkoY2UsIG9wczIpIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wczIuZXZlcnkoKHgpID0+IHguaGVhZCAhPT0gXCJNdWx0aXBseVwiKSk7XG4gIGNvbnN0IHByb2R1Y3QgPSBuZXcgUHJvZHVjdChjZSk7XG4gIGZvciAobGV0IG9wMyBvZiBvcHMyKSB7XG4gICAgb3AzID0gb3AzLnNpbXBsaWZ5KCk7XG4gICAgaWYgKG9wMy5pc05hTiB8fCBvcDMuc3ltYm9sID09PSBcIlVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgcHJvZHVjdC5hZGRUZXJtKG9wMyk7XG4gIH1cbiAgcmV0dXJuIHByb2R1Y3QuYXNFeHByZXNzaW9uKCk7XG59XG5mdW5jdGlvbiBldmFsTXVsdGlwbHkoY2UsIG9wczIsIG1vZGUgPSBcImV2YWx1YXRlXCIpIHtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wczIubGVuZ3RoID4gMSwgXCJldmFsTXVsdGlwbHkoKTogbm8gYXJndW1lbnRzXCIpO1xuICBpZiAobW9kZSA9PT0gXCJOXCIpIHtcbiAgICBvcHMyID0gb3BzMi5tYXAoKHgpID0+IHguTigpKTtcbiAgICBpZiAoKGNlLm51bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIiB8fCBjZS5udW1lcmljTW9kZSA9PT0gXCJhdXRvXCIpICYmIG9wczIuZXZlcnkoKHgpID0+IHR5cGVvZiB4Lm51bWVyaWNWYWx1ZSA9PT0gXCJudW1iZXJcIikpIHtcbiAgICAgIGxldCBwcm9kID0gMTtcbiAgICAgIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpXG4gICAgICAgIHByb2QgKj0gb3AzLm51bWVyaWNWYWx1ZTtcbiAgICAgIHJldHVybiBjZS5udW1iZXIocHJvZCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICBpZiAob3AzLmlzTmFOIHx8IG9wMy5zeW1ib2wgPT09IFwiVW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gY2UuX05BTjtcbiAgICBpZiAoIW9wMy5pc0V4YWN0KVxuICAgICAgbW9kZSA9IFwiTlwiO1xuICB9XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChvcHMyLmV2ZXJ5KCh4KSA9PiB4LmhlYWQgIT09IFwiTXVsdGlwbHlcIikpO1xuICBpZiAobW9kZSA9PT0gXCJOXCIpXG4gICAgb3BzMiA9IG9wczIubWFwKCh4KSA9PiB4Lk4oKSk7XG4gIGVsc2VcbiAgICBvcHMyID0gb3BzMi5tYXAoKHgpID0+IHguZXZhbHVhdGUoKSk7XG4gIHJldHVybiBuZXcgUHJvZHVjdChjZSwgb3BzMikuYXNFeHByZXNzaW9uKG1vZGUpO1xufVxuZnVuY3Rpb24gbXVsdGlwbHkyKG9wMTIsIG9wMjIsIG1ldGFkYXRhKSB7XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChvcDEyLmlzQ2Fub25pY2FsKTtcbiAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KG9wMjIuaXNDYW5vbmljYWwpO1xuICBjb25zdCBjZSA9IG9wMTIuZW5naW5lO1xuICBpZiAob3AxMi5zeW1ib2wgPT09IFwiSW1hZ2luYXJ5VW5pdFwiKSB7XG4gICAgY29uc3QgZiA9IGFzRmxvYXQob3AyMik7XG4gICAgaWYgKGYgIT09IG51bGwpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKGNlLmNvbXBsZXgoMCwgZikpO1xuICB9XG4gIGlmIChvcDIyLnN5bWJvbCA9PT0gXCJJbWFnaW5hcnlVbml0XCIpIHtcbiAgICBjb25zdCBmID0gYXNGbG9hdChvcDEyKTtcbiAgICBpZiAoZiAhPT0gbnVsbClcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleCgwLCBmKSk7XG4gIH1cbiAgaWYgKG9wMTIubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIG9wMjIubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgZjEgPSBhc0Zsb2F0KG9wMTIpO1xuICAgIGNvbnN0IGYyID0gYXNGbG9hdChvcDIyKTtcbiAgICBpZiAoZjEgIT09IG51bGwgJiYgY2UuaXNDb21wbGV4KG9wMjIpKVxuICAgICAgcmV0dXJuIGNlLm51bWJlcihjZS5jb21wbGV4KGYxICogb3AyMi5yZSwgZjEgKiBvcDIyLmltKSk7XG4gICAgaWYgKGYyICE9PSBudWxsICYmIGNlLmlzQ29tcGxleChvcDEyKSlcbiAgICAgIHJldHVybiBjZS5udW1iZXIoY2UuY29tcGxleChmMiAqIG9wMTIucmUsIGYyICogb3AxMi5pbSkpO1xuICB9XG4gIGlmIChvcDEyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBvcDIyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBvcDEyLmlzSW50ZWdlciAmJiBvcDIyLmlzSW50ZWdlcikge1xuICAgIHJldHVybiBhcHBseTJOKFxuICAgICAgb3AxMixcbiAgICAgIG9wMjIsXG4gICAgICAoYSwgYikgPT4gYSAqIGIsXG4gICAgICAoYSwgYikgPT4gYS5tdWwoYilcbiAgICApID8/IGNlLl9OQU47XG4gIH1cbiAgaWYgKG9wMTIuaXNOYU4gfHwgb3AyMi5pc05hTiB8fCBvcDEyLnN5bWJvbCA9PT0gXCJVbmRlZmluZWRcIiB8fCBvcDIyLnN5bWJvbCA9PT0gXCJVbmRlZmluZWRcIilcbiAgICByZXR1cm4gY2UuX05BTjtcbiAgaWYgKG9wMTIuaXNOb3RoaW5nKVxuICAgIHJldHVybiBvcDIyO1xuICBpZiAob3AyMi5pc05vdGhpbmcpXG4gICAgcmV0dXJuIG9wMTI7XG4gIGlmIChvcDEyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGlmIChvcDEyLmlzT25lKVxuICAgICAgcmV0dXJuIG9wMjI7XG4gICAgaWYgKG9wMTIuaXNOZWdhdGl2ZU9uZSlcbiAgICAgIHJldHVybiBjYW5vbmljYWxOZWdhdGUob3AyMik7XG4gIH1cbiAgaWYgKG9wMjIubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgaWYgKG9wMjIuaXNPbmUpXG4gICAgICByZXR1cm4gb3AxMjtcbiAgICBpZiAob3AyMi5pc05lZ2F0aXZlT25lKVxuICAgICAgcmV0dXJuIGNhbm9uaWNhbE5lZ2F0ZShvcDEyKTtcbiAgfVxuICBsZXQgc2lnbjIgPSAxO1xuICBsZXQgW3QsIGNdID0gb3AxMi5udW1lcmljVmFsdWUgIT09IG51bGwgPyBbb3AxMiwgb3AyMl0gOiBbb3AyMiwgb3AxMl07XG4gIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0LmhlYWQgIT09IFwiU3VidHJhY3RcIik7XG4gIGlmICh0LmhlYWQgPT09IFwiTmVnYXRlXCIpIHtcbiAgICB0ID0gdC5vcDE7XG4gICAgc2lnbjIgPSAtc2lnbjI7XG4gIH1cbiAgaWYgKGMubnVtZXJpY1ZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgciA9IGFzUmF0aW9uYWwoYyk7XG4gICAgaWYgKHIpIHtcbiAgICAgIGlmIChpc1JhdGlvbmFsT25lKHIpKVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIGlmIChpc1JhdGlvbmFsWmVybyhyKSlcbiAgICAgICAgcmV0dXJuIGNlLl9aRVJPO1xuICAgICAgaWYgKHQuaGVhZCA9PT0gXCJBZGRcIikge1xuICAgICAgICBpZiAoc2lnbjIgPCAwKVxuICAgICAgICAgIGMgPSBjYW5vbmljYWxOZWdhdGUoYyk7XG4gICAgICAgIHJldHVybiBjZS5hZGQoXG4gICAgICAgICAgdC5vcHMubWFwKCh4KSA9PiBtdWx0aXBseTIoYywgeCkpLFxuICAgICAgICAgIG1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB0ciA9IGFzUmF0aW9uYWwodCk7XG4gICAgICBpZiAodHIpIHtcbiAgICAgICAgY29uc3QgcCA9IG11bDIociwgdHIpO1xuICAgICAgICByZXR1cm4gY2UubnVtYmVyKHNpZ24yIDwgMCA/IG5lZyhwKSA6IHAsIHsgbWV0YWRhdGEgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbjIgPCAwKVxuICAgICAgICByZXR1cm4gY2UuX2ZuKFwiTXVsdGlwbHlcIiwgW2Nhbm9uaWNhbE5lZ2F0ZShjKSwgdF0sIG1ldGFkYXRhKTtcbiAgICAgIHJldHVybiBjZS5fZm4oXCJNdWx0aXBseVwiLCBbYywgdF0sIG1ldGFkYXRhKTtcbiAgICB9XG4gIH1cbiAgaWYgKGMuaGFzaCA9PT0gdC5oYXNoICYmIGMuaXNTYW1lKHQpKVxuICAgIHJldHVybiBzcXVhcmUoY2UsIGMpO1xuICBjb25zdCBwcm9kdWN0ID0gbmV3IFByb2R1Y3QoY2UsIFtjLCB0XSk7XG4gIGlmIChzaWduMiA+IDApXG4gICAgcmV0dXJuIHByb2R1Y3QuYXNFeHByZXNzaW9uKCk7XG4gIHJldHVybiBjYW5vbmljYWxOZWdhdGUocHJvZHVjdC5hc0V4cHJlc3Npb24oKSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gY2Fub25pY2FsUHJvZHVjdChjZSwgYm9keSwgcmFuZ2UpIHtcbiAgYm9keSA/PyAoYm9keSA9IGNlLmVycm9yKFwibWlzc2luZ1wiKSk7XG4gIGxldCBpbmRleCA9IG51bGw7XG4gIGxldCBsb3dlciA9IG51bGw7XG4gIGxldCB1cHBlciA9IG51bGw7XG4gIGlmIChyYW5nZSAmJiByYW5nZS5oZWFkICE9PSBcIlR1cGxlXCIgJiYgcmFuZ2UuaGVhZCAhPT0gXCJUcmlwbGVcIiAmJiByYW5nZS5oZWFkICE9PSBcIlBhaXJcIiAmJiByYW5nZS5oZWFkICE9PSBcIlNpbmdsZVwiKSB7XG4gICAgaW5kZXggPSByYW5nZTtcbiAgfSBlbHNlIGlmIChyYW5nZSkge1xuICAgIGluZGV4ID0gcmFuZ2Uub3BzPy5bMF0gPz8gbnVsbDtcbiAgICBsb3dlciA9IHJhbmdlLm9wcz8uWzFdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgICB1cHBlciA9IHJhbmdlLm9wcz8uWzJdPy5jYW5vbmljYWwgPz8gbnVsbDtcbiAgfVxuICBpZiAoaW5kZXggJiYgaW5kZXguaGVhZCA9PT0gXCJIb2xkXCIpXG4gICAgaW5kZXggPSBpbmRleC5vcDE7XG4gIGlmIChpbmRleCAmJiBpbmRleC5oZWFkID09PSBcIlJlbGVhc2VIb2xkXCIpXG4gICAgaW5kZXggPSBpbmRleC5vcDEuZXZhbHVhdGUoKTtcbiAgaW5kZXggPz8gKGluZGV4ID0gY2Uuc3ltYm9sKFwiTm90aGluZ1wiKSk7XG4gIGlmICghaW5kZXguc3ltYm9sKVxuICAgIGluZGV4ID0gY2UuZXJyb3IoW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIlN5bWJvbFwiLCBpbmRleC5kb21haW5dKTtcbiAgZWxzZVxuICAgIGluZGV4ID0gY2UuaG9sZChpbmRleCk7XG4gIGlmIChsb3dlciAmJiBsb3dlci5pc0Zpbml0ZSlcbiAgICBsb3dlciA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIGxvd2VyLCBcIkludGVnZXJcIik7XG4gIGlmICh1cHBlciAmJiB1cHBlci5pc0Zpbml0ZSlcbiAgICB1cHBlciA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIHVwcGVyLCBcIkludGVnZXJcIik7XG4gIGlmIChsb3dlciAmJiB1cHBlcilcbiAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgbG93ZXIsIHVwcGVyXSk7XG4gIGVsc2UgaWYgKHVwcGVyKVxuICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBjZS5udW1iZXIoMSksIHVwcGVyXSk7XG4gIGVsc2UgaWYgKGxvd2VyKVxuICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBsb3dlcl0pO1xuICBlbHNlXG4gICAgcmFuZ2UgPSBpbmRleDtcbiAgcmV0dXJuIGNlLl9mbihcIlByb2R1Y3RcIiwgW2JvZHkuY2Fub25pY2FsLCByYW5nZV0pO1xufVxuZnVuY3Rpb24gZXZhbE11bHRpcGxpY2F0aW9uKGNlLCBleHByLCByYW5nZSwgbW9kZSkge1xuICBjb25zdCBbaW5kZXgsIGxvd2VyLCB1cHBlciwgaXNGaW5pdGUyXSA9IG5vcm1hbGl6ZUxpbWl0cyhyYW5nZSk7XG4gIGNvbnN0IGZuID0gZXhwcjtcbiAgaWYgKG1vZGUgIT09IFwiTlwiICYmIChsb3dlciA+PSB1cHBlciB8fCB1cHBlciAtIGxvd2VyID49IE1BWF9TWU1CT0xJQ19URVJNUykpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHJlc3VsdCA9IG51bGw7XG4gIGNvbnN0IHNhdmVkQ29udGV4dCA9IGNlLmNvbnRleHQ7XG4gIGNlLmNvbnRleHQgPSBmbi5zY29wZSA/PyBjZS5jb250ZXh0O1xuICBpZiAobW9kZSA9PT0gXCJzaW1wbGlmeVwiKSB7XG4gICAgY29uc3QgdGVybXMgPSBbXTtcbiAgICBpZiAoIWZuLnNjb3BlKVxuICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspXG4gICAgICAgIHRlcm1zLnB1c2goZm4uc2ltcGxpZnkoKSk7XG4gICAgZWxzZVxuICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspIHtcbiAgICAgICAgY2Uuc2V0KHsgW2luZGV4XTogaSB9KTtcbiAgICAgICAgdGVybXMucHVzaChmbi5zaW1wbGlmeSgpKTtcbiAgICAgIH1cbiAgICByZXN1bHQgPSBjZS5tdWwodGVybXMpLnNpbXBsaWZ5KCk7XG4gIH1cbiAgaWYgKG1vZGUgPT09IFwiZXZhbHVhdGVcIikge1xuICAgIGNvbnN0IHRlcm1zID0gW107XG4gICAgaWYgKCFmbi5zY29wZSlcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKVxuICAgICAgICB0ZXJtcy5wdXNoKGZuLmV2YWx1YXRlKCkpO1xuICAgIGVsc2VcbiAgICAgIGZvciAobGV0IGkgPSBsb3dlcjsgaSA8PSB1cHBlcjsgaSsrKSB7XG4gICAgICAgIGNlLnNldCh7IFtpbmRleF06IGkgfSk7XG4gICAgICAgIHRlcm1zLnB1c2goZm4uZXZhbHVhdGUoKSk7XG4gICAgICB9XG4gICAgcmVzdWx0ID0gY2UubXVsKHRlcm1zKS5ldmFsdWF0ZSgpO1xuICB9XG4gIGlmIChtb2RlID09PSBcIk5cIikge1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwgJiYgIWZuLnNjb3BlKSB7XG4gICAgICBjb25zdCBuID0gZm4uTigpO1xuICAgICAgaWYgKCFpc0Zpbml0ZTIpIHtcbiAgICAgICAgaWYgKG4uaXNaZXJvKVxuICAgICAgICAgIHJlc3VsdCA9IGNlLl9aRVJPO1xuICAgICAgICBlbHNlIGlmIChuLmlzUG9zaXRpdmUpXG4gICAgICAgICAgcmVzdWx0ID0gY2UuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmVzdWx0ID0gY2UuX05FR0FUSVZFX0lORklOSVRZO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiBmbi5pc1B1cmUpXG4gICAgICAgIHJlc3VsdCA9IGNlLnBvdyhuLCBjZS5udW1iZXIodXBwZXIgLSBsb3dlciArIDEpKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCAmJiBpc0Zpbml0ZTIpIHtcbiAgICAgIGlmIChiaWdudW1QcmVmZXJyZWQoY2UpKSB7XG4gICAgICAgIGxldCBwcm9kdWN0MiA9IGNlLmJpZ251bSgxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspIHtcbiAgICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICAgIGNvbnN0IHRlcm0gPSBhc0JpZ251bShmbi5OKCkpO1xuICAgICAgICAgIGlmICh0ZXJtID09PSBudWxsIHx8ICF0ZXJtLmlzRmluaXRlKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRlcm0gIT09IG51bGwgPyBjZS5udW1iZXIodGVybSkgOiB2b2lkIDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvZHVjdDIgPSBwcm9kdWN0Mi5tdWwodGVybSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICByZXN1bHQgPSBjZS5udW1iZXIocHJvZHVjdDIpO1xuICAgICAgfVxuICAgICAgbGV0IHByb2R1Y3QgPSAxO1xuICAgICAgY29uc3QgbnVtZXJpY01vZGUgPSBjZS5udW1lcmljTW9kZTtcbiAgICAgIGNlLm51bWVyaWNNb2RlID0gXCJtYWNoaW5lXCI7XG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkrKykge1xuICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICBjb25zdCB0ZXJtID0gYXNGbG9hdChmbi5OKCkpO1xuICAgICAgICBpZiAodGVybSA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHRlcm0pKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGVybSAhPT0gbnVsbCA/IGNlLm51bWJlcih0ZXJtKSA6IHZvaWQgMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwcm9kdWN0ICo9IHRlcm07XG4gICAgICB9XG4gICAgICBjZS5udW1lcmljTW9kZSA9IG51bWVyaWNNb2RlO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgcmVzdWx0ID0gY2UubnVtYmVyKHByb2R1Y3QpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBjZS5zZXQoeyBbaW5kZXhdOiAxZTMgfSk7XG4gICAgICBjb25zdCBuTWF4ID0gZm4uTigpO1xuICAgICAgY2Uuc2V0KHsgW2luZGV4XTogOTk5IH0pO1xuICAgICAgY29uc3Qgbk1heE1pbnVzT25lID0gZm4uTigpO1xuICAgICAgY29uc3QgcmF0aW8gPSBhc0Zsb2F0KGNlLmRpdihuTWF4LCBuTWF4TWludXNPbmUpLk4oKSk7XG4gICAgICBpZiAocmF0aW8gIT09IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHJhdGlvKSAmJiBNYXRoLmFicyhyYXRpbykgPiAxKSB7XG4gICAgICAgIHJlc3VsdCA9IGNlLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwcm9kdWN0ID0gMTtcbiAgICAgICAgY29uc3QgbnVtZXJpY01vZGUgPSBjZS5udW1lcmljTW9kZTtcbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBcIm1hY2hpbmVcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpKyspIHtcbiAgICAgICAgICBjZS5zZXQoeyBbaW5kZXhdOiBpIH0pO1xuICAgICAgICAgIGNvbnN0IHRlcm0gPSBhc0Zsb2F0KGZuLk4oKSk7XG4gICAgICAgICAgaWYgKHRlcm0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoTWF0aC5hYnMoMSAtIHRlcm0pIDwgTnVtYmVyLkVQU0lMT04gfHwgIU51bWJlci5pc0Zpbml0ZSh0ZXJtKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIHByb2R1Y3QgKj0gdGVybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKVxuICAgICAgICAgIHJlc3VsdCA9IGNlLm51bWJlcihwcm9kdWN0KTtcbiAgICAgICAgY2UubnVtZXJpY01vZGUgPSBudW1lcmljTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2UuY29udGV4dCA9IHNhdmVkQ29udGV4dDtcbiAgcmV0dXJuIHJlc3VsdCA/PyB2b2lkIDA7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L2FyaXRobWV0aWMtZGl2aWRlLnRzXG5mdW5jdGlvbiBjYW5vbmljYWxEaXZpZGUoY2UsIG9wMTIsIG9wMjIpIHtcbiAgaWYgKCFvcDEyLmlzVmFsaWQgfHwgIW9wMjIuaXNWYWxpZClcbiAgICByZXR1cm4gY2UuX2ZuKFwiRGl2aWRlXCIsIFtvcDEyLCBvcDIyXSk7XG4gIGlmIChvcDEyLmhlYWQgPT09IFwiTmVnYXRlXCIgJiYgb3AyMi5oZWFkID09PSBcIk5lZ2F0ZVwiKSB7XG4gICAgb3AxMiA9IG9wMTIub3AxO1xuICAgIG9wMjIgPSBvcDIyLm9wMTtcbiAgfVxuICBpZiAob3AxMi5udW1lcmljVmFsdWUgIT09IG51bGwgJiYgb3AyMi5udW1lcmljVmFsdWUgIT09IG51bGwpIHtcbiAgICBpZiAob3AyMi5pc09uZSlcbiAgICAgIHJldHVybiBvcDEyO1xuICAgIGlmIChvcDIyLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gY2UubmVnKG9wMTIpO1xuICAgIGlmIChvcDEyLmlzT25lKVxuICAgICAgcmV0dXJuIGNlLmludihvcDIyKTtcbiAgICBpZiAob3AxMi5pc05lZ2F0aXZlT25lKVxuICAgICAgcmV0dXJuIGNlLm5lZyhjZS5pbnYob3AyMikpO1xuICAgIGNvbnN0IHIxID0gYXNSYXRpb25hbChvcDEyKTtcbiAgICBjb25zdCByMiA9IGFzUmF0aW9uYWwob3AyMik7XG4gICAgaWYgKHIxICYmIHIyICYmICFpc1JhdGlvbmFsWmVybyhyMikpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG11bDIocjEsIGludmVyc2UocjIpKSk7XG4gIH1cbiAgaWYgKG9wMTIuaGVhZCA9PT0gXCJEaXZpZGVcIiAmJiBvcDIyLmhlYWQgPT09IFwiRGl2aWRlXCIpIHtcbiAgICByZXR1cm4gY2Fub25pY2FsRGl2aWRlKFxuICAgICAgY2UsXG4gICAgICBjZS5tdWwoW29wMTIub3AxLCBvcDIyLm9wMl0pLFxuICAgICAgY2UubXVsKFtvcDEyLm9wMiwgb3AyMi5vcDFdKVxuICAgICk7XG4gIH1cbiAgaWYgKG9wMTIuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICByZXR1cm4gY2Fub25pY2FsRGl2aWRlKGNlLCBjZS5tdWwoW29wMTIub3AxLCBvcDIyXSksIG9wMTIub3AyKTtcbiAgaWYgKG9wMjIuaGVhZCA9PT0gXCJEaXZpZGVcIilcbiAgICByZXR1cm4gY2Fub25pY2FsRGl2aWRlKGNlLCBjZS5tdWwoW29wMTIsIG9wMjIub3AyXSksIG9wMjIub3AxKTtcbiAgY29uc3QgbnVtMSA9IG9wMTIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtMSAhPT0gbnVsbCkge1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChudW0xKSkge1xuICAgICAgY29uc3QgW2EsIGJdID0gbnVtMTtcbiAgICAgIHJldHVybiBjYW5vbmljYWxEaXZpZGUoY2UsIGNlLm51bWJlcihhKSwgY2UubXVsKFtjZS5udW1iZXIoYiksIG9wMjJdKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ1JhdGlvbmFsKG51bTEpKSB7XG4gICAgICBjb25zdCBbYSwgYl0gPSBudW0xO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbERpdmlkZShjZSwgY2UubnVtYmVyKGEpLCBjZS5tdWwoW2NlLm51bWJlcihiKSwgb3AyMl0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbnVtMiA9IG9wMjIubnVtZXJpY1ZhbHVlO1xuICBpZiAobnVtMiAhPT0gbnVsbCkge1xuICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChudW0yKSkge1xuICAgICAgY29uc3QgW2EsIGJdID0gbnVtMjtcbiAgICAgIHJldHVybiBjYW5vbmljYWxEaXZpZGUoY2UsIGNlLm11bChbb3AxMiwgY2UubnVtYmVyKGIpXSksIGNlLm51bWJlcihhKSk7XG4gICAgfVxuICAgIGlmIChpc0JpZ1JhdGlvbmFsKG51bTIpKSB7XG4gICAgICBjb25zdCBbYSwgYl0gPSBudW0yO1xuICAgICAgcmV0dXJuIGNhbm9uaWNhbERpdmlkZShjZSwgY2UubXVsKFtvcDEyLCBjZS5udW1iZXIoYildKSwgY2UubnVtYmVyKGEpKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW2MxLCB0MV0gPSBhc0NvZWZmaWNpZW50KG9wMTIpO1xuICBjb25zdCBbYzIsIHQyXSA9IGFzQ29lZmZpY2llbnQob3AyMik7XG4gIGlmICghaXNSYXRpb25hbE9uZShjMSkgfHwgIWlzUmF0aW9uYWxPbmUoYzIpKSB7XG4gICAgY29uc3QgW2NuLCBjZF0gPSBtdWwyKGMxLCBpbnZlcnNlKGMyKSk7XG4gICAgY29uc3QgZW4gPSBjZS5tdWwoW2NlLm51bWJlcihjbiksIHQxXSk7XG4gICAgaWYgKGVuLmlzWmVybylcbiAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICBjb25zdCBlZCA9IGNlLm11bChbY2UubnVtYmVyKGNkKSwgdDJdKTtcbiAgICBpZiAoZWQuaXNPbmUpXG4gICAgICByZXR1cm4gZW47XG4gICAgcmV0dXJuIGNlLl9mbihcIkRpdmlkZVwiLCBbZW4sIGVkXSk7XG4gIH1cbiAgbGV0IFtuU2lnbiwgbl0gPSBtYWtlUG9zaXRpdmUob3AxMik7XG4gIGxldCBbZFNpZ24sIGRdID0gbWFrZVBvc2l0aXZlKG9wMjIpO1xuICBuID0gbi5jYW5vbmljYWw7XG4gIGQgPSBkLmNhbm9uaWNhbDtcbiAgaWYgKGQubnVtZXJpY1ZhbHVlICE9PSBudWxsICYmIGQuaXNPbmUpXG4gICAgcmV0dXJuIG5TaWduICogZFNpZ24gPCAwID8gY2Fub25pY2FsTmVnYXRlKG4pIDogbjtcbiAgaWYgKG5TaWduICogZFNpZ24gPiAwKVxuICAgIHJldHVybiBjZS5fZm4oXCJEaXZpZGVcIiwgW24sIGRdKTtcbiAgaWYgKG4ubnVtZXJpY1ZhbHVlKVxuICAgIHJldHVybiBjZS5fZm4oXCJEaXZpZGVcIiwgW2Nhbm9uaWNhbE5lZ2F0ZShuKSwgZF0pO1xuICByZXR1cm4gY2Fub25pY2FsTmVnYXRlKGNlLl9mbihcIkRpdmlkZVwiLCBbbiwgZF0pKTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5RGl2aWRlKGNlLCBvcDEyLCBvcDIyKSB7XG4gIGlmIChvcDEyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCAmJiBvcDIyLm51bWVyaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHIxID0gYXNSYXRpb25hbChvcDEyKTtcbiAgICBjb25zdCByMiA9IGFzUmF0aW9uYWwob3AyMik7XG4gICAgaWYgKHIxICYmIHIyICYmICFpc1JhdGlvbmFsWmVybyhyMikpXG4gICAgICByZXR1cm4gY2UubnVtYmVyKG11bDIocjEsIGludmVyc2UocjIpKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9kdWN0KGNlLCBbb3AxMiwgY2UuaW52KG9wMjIpXSkuYXNSYXRpb25hbEV4cHJlc3Npb24oKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvYXJpdGhtZXRpYy50c1xudmFyIGltcG9ydF9jb21wbGV4MTYgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbnZhciBBUklUSE1FVElDX0xJQlJBUlkgPSBbXG4gIHtcbiAgICAvL1xuICAgIC8vIEZ1bmN0aW9uc1xuICAgIC8vXG4gICAgQWJzOiB7XG4gICAgICB3aWtpZGF0YTogXCJRMzMxNzk4MlwiLFxuICAgICAgLy8gbWFnbml0dWRlICdRMTIwODEyIChmb3IgcmVhbHMpXG4gICAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk5vbk5lZ2F0aXZlTnVtYmVyXCJdLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzQWJzKGNlLCBvcHMyWzBdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzQWJzKGNlLCBvcHMyWzBdLCBcImV2YWx1YXRlXCIpLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IHByb2Nlc3NBYnMoY2UsIG9wczJbMF0sIFwiTlwiKVxuICAgICAgfVxuICAgIH0sXG4gICAgQWRkOiB7XG4gICAgICB3aWtpZGF0YTogXCJRMzIwNDNcIixcbiAgICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEzMDAsXG4gICAgICBob2xkOiBcImFsbFwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogXCJOdW1lcmljRnVuY3Rpb25cIixcbiAgICAgICAgY29kb21haW46IChjZSwgYXJncykgPT4gZG9tYWluQWRkKFxuICAgICAgICAgIGNlLFxuICAgICAgICAgIGFyZ3MubWFwKCh4KSA9PiB4LmRvbWFpbilcbiAgICAgICAgKSxcbiAgICAgICAgLy8gY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNhbm9uaWNhbEFkZChjZSwgYXJncyksIC8vIG5ldmVyIGNhbGxlZDogc2hvcnRwYXRoXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHNpbXBsaWZ5QWRkKGNlLCBvcHMyKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbEFkZChjZSwgb3BzMiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbEFkZChjZSwgb3BzMiwgXCJOXCIpXG4gICAgICB9XG4gICAgfSxcbiAgICBDZWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSb3VuZHMgYSBudW1iZXIgdXAgdG8gdGhlIG5leHQgbGFyZ2VzdCBpbnRlZ2VyXCIsXG4gICAgICBjb21wbGV4aXR5OiAxMjUwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJJbnRlZ2VyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKF9jZSwgb3BzMikgPT4gYXBwbHlOKFxuICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgTWF0aC5jZWlsLFxuICAgICAgICAgICh4KSA9PiB4LmNlaWwoKSxcbiAgICAgICAgICAoeikgPT4gei5jZWlsKDApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIENob3A6IHtcbiAgICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGlkZW1wb3RlbnQ6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiBjZS5jaG9wKHgpLFxuICAgICAgICAgICh4KSA9PiBjZS5jaG9wKHgpLFxuICAgICAgICAgICh4KSA9PiBjZS5jaG9wKHgpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIENvbXBsZXg6IHtcbiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY29udmVydGVkIGR1cmluZyBib3hpbmcsIHNvIHVubGlrZWx5IHRvIGVuY291bnRlclxuICAgICAgd2lraWRhdGE6IFwiUTExNTY3XCIsXG4gICAgICBjb21wbGV4aXR5OiA1MDBcbiAgICB9LFxuICAgIERpdmlkZToge1xuICAgICAgd2lraWRhdGE6IFwiUTEyMjY5MzlcIixcbiAgICAgIGNvbXBsZXhpdHk6IDI1MDAsXG4gICAgICAvLyAtIGlmIG51bWVyIHByb2R1Y3Qgb2YgbnVtYmVycywgb3IgZGVub20gcHJvZHVjdCBvZiBudW1iZXJzLFxuICAgICAgLy8gaS5lLiBcdTIyMUEyeC8yIC0+IDAuNzA3eCwgMi9cdTIyMUEyeCAtPiAxLjQxNDJ4XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBhcmdzID0gdmFsaWRhdGVBcmd1bWVudHMoY2UsIGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpLCBbXG4gICAgICAgICAgICBcIk51bWJlclwiLFxuICAgICAgICAgICAgXCJOdW1iZXJcIlxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJEaXZpZGVcIiwgYXJncyk7XG4gICAgICAgICAgcmV0dXJuIGNlLmRpdihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgYXJncykgPT4gc2ltcGxpZnlEaXZpZGUoY2UsIGFyZ3NbMF0sIGFyZ3NbMV0pLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBhcHBseTJOKFxuICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgb3BzMlsxXSxcbiAgICAgICAgICAobiwgZCkgPT4gbiAvIGQsXG4gICAgICAgICAgKG4sIGQpID0+IG4uZGl2KGQpLFxuICAgICAgICAgIChuLCBkKSA9PiBuLmRpdihkKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBFeHA6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlExNjg2OThcIixcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAzNTAwLFxuICAgICAgLy8gRXhwKHgpIC0+IGVeeFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IHZhbGlkYXRlQXJndW1lbnRzKGNlLCBjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKGFyZ3MpKSwgW1xuICAgICAgICAgICAgXCJOdW1iZXJcIlxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJQb3dlclwiLCBhcmdzKTtcbiAgICAgICAgICByZXR1cm4gY2UucG93KGNlLnN5bWJvbChcIkV4cG9uZW50aWFsRVwiKSwgYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEZhY3RvcmlhbDoge1xuICAgICAgZGVzY3JpcHRpb246IFwiRmFjdG9yaWFsIEZ1bmN0aW9uXCIsXG4gICAgICB3aWtpZGF0YTogXCJRMTIwOTc2XCIsXG4gICAgICBjb21wbGV4aXR5OiA5ZTMsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBhc1NtYWxsSW50ZWdlcihvcHMyWzBdKTtcbiAgICAgICAgICBpZiAobiAhPT0gbnVsbCAmJiBuID49IDApIHtcbiAgICAgICAgICAgIGlmICghYmlnbnVtUHJlZmVycmVkKGNlKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihmYWN0b3JpYWwobikpO1xuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihmYWN0b3JpYWwyKGNlLCBjZS5iaWdudW0obikpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbnVtID0gb3BzMlswXS5udW1lcmljVmFsdWU7XG4gICAgICAgICAgaWYgKG51bSAhPT0gbnVsbCAmJiBudW0gaW5zdGFuY2VvZiBpbXBvcnRfY29tcGxleDE2LmRlZmF1bHQpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKGdhbW1hMyhudW0uYWRkKDEpKSk7XG4gICAgICAgICAgY29uc3QgZiA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKGYgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKGdhbW1hKDEgKyBmKSk7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgRmxvb3I6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlE1Njg2MDc4M1wiLFxuICAgICAgY29tcGxleGl0eTogMTI1MCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBhcHBseU4oXG4gICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICBNYXRoLmZsb29yLFxuICAgICAgICAgICh4KSA9PiB4LmZsb29yKCksXG4gICAgICAgICAgKHopID0+IHouZmxvb3IoMClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgR2FtbWE6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlExOTA1NzNcIixcbiAgICAgIGNvbXBsZXhpdHk6IDhlMyxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiBnYW1tYSh4KSxcbiAgICAgICAgICAoeCkgPT4gZ2FtbWEyKGNlLCB4KSxcbiAgICAgICAgICAoeCkgPT4gZ2FtbWEzKHgpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIExvZ0dhbW1hOiB7XG4gICAgICBjb21wbGV4aXR5OiA4ZTMsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBhcHBseU4oXG4gICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICAoeCkgPT4gbG5nYW1tYSh4KSxcbiAgICAgICAgICAoeCkgPT4gbG5nYW1tYTIoY2UsIHgpLFxuICAgICAgICAgICh4KSA9PiBsbmdhbW1hMyh4KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBMbjoge1xuICAgICAgZGVzY3JpcHRpb246IFwiTmF0dXJhbCBMb2dhcml0aG1cIixcbiAgICAgIHdpa2lkYXRhOiBcIlEyMDQwMzdcIixcbiAgICAgIGNvbXBsZXhpdHk6IDRlMyxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiB4ID49IDAgPyBNYXRoLmxvZyh4KSA6IGNlLmNvbXBsZXgoeCkubG9nKCksXG4gICAgICAgICAgKHgpID0+ICF4LmlzTmVnKCkgPyB4LmxuKCkgOiBjZS5jb21wbGV4KHgudG9OdW1iZXIoKSkubG9nKCksXG4gICAgICAgICAgKHopID0+IHoubG9nKClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgTG9nOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJMb2coeiwgYiA9IDEwKSA9IExvZ2FyaXRobSBvZiBiYXNlIGJcIixcbiAgICAgIHdpa2lkYXRhOiBcIlExMTE5N1wiLFxuICAgICAgY29tcGxleGl0eTogNDEwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFtcIk1heWJlXCIsIFwiTnVtYmVyXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBvcHMyID0gY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShvcHMyKSk7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxvZ1wiLCBbdmFsaWRhdGVBcmd1bWVudChjZSwgb3BzMlswXSwgXCJOdW1iZXJcIildKTtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIG9wczJbMF0sIFwiTnVtYmVyXCIpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIG9wczJbMV0sIFwiTnVtYmVyXCIpO1xuICAgICAgICAgICAgaWYgKGJhc2UubnVtZXJpY1ZhbHVlID09PSAxMClcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxvZ1wiLCBbYXJnXSk7XG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiTG9nXCIsIFthcmcsIGJhc2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxvZ1wiLCB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIG9wczIsIDIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczJbMV0gPT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgICAgICh4KSA9PiB4ID49IDAgPyBNYXRoLmxvZzEwKHgpIDogY2UuY29tcGxleCh4KS5sb2coKS5kaXYoTWF0aC5MTjEwKSxcbiAgICAgICAgICAgICAgKHgpID0+ICF4LmlzTmVnKCkgPyBkZWNpbWFsX2RlZmF1bHQubG9nMTAoeCkgOiBjZS5jb21wbGV4KHgudG9OdW1iZXIoKSkubG9nKCkuZGl2KE1hdGguTE4xMCksXG4gICAgICAgICAgICAgICh6KSA9PiB6LmxvZygpLmRpdihNYXRoLkxOMTApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBhcHBseTJOKFxuICAgICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICAgIG9wczJbMV0sXG4gICAgICAgICAgICAoYSwgYikgPT4gTWF0aC5sb2coYSkgLyBNYXRoLmxvZyhiKSxcbiAgICAgICAgICAgIChhLCBiKSA9PiBhLmxvZyhiKSxcbiAgICAgICAgICAgIChhLCBiKSA9PiBhLmxvZygpLmRpdih0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IE1hdGgubG9nKGIpIDogYi5sb2coKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBMYjoge1xuICAgICAgZGVzY3JpcHRpb246IFwiQmFzZS0yIExvZ2FyaXRobVwiLFxuICAgICAgd2lraWRhdGE6IFwiUTU4MTE2OFwiLFxuICAgICAgY29tcGxleGl0eTogNDEwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICh4KSA9PiB4ID49IDAgPyBNYXRoLmxvZzIoeCkgOiBjZS5jb21wbGV4KHgpLmxvZygpLmRpdihNYXRoLkxOMiksXG4gICAgICAgICAgKHgpID0+IHguaXNOZWcoKSA/IGRlY2ltYWxfZGVmYXVsdC5sb2cxMCh4KSA6IGNlLmNvbXBsZXgoeC50b051bWJlcigpKS5sb2coKS5kaXYoTWF0aC5MTjIpLFxuICAgICAgICAgICh6KSA9PiB6LmxvZygpLmRpdihNYXRoLkxOMilcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgTGc6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkJhc2UtMTAgTG9nYXJpdGhtXCIsXG4gICAgICB3aWtpZGF0YTogXCJROTY2NTgyXCIsXG4gICAgICBjb21wbGV4aXR5OiA0MTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gYXBwbHlOKFxuICAgICAgICAgIG9wczJbMF0sXG4gICAgICAgICAgKHgpID0+IHggPj0gMCA/IE1hdGgubG9nMTAoeCkgOiBjZS5jb21wbGV4KHgpLmxvZygpLmRpdihNYXRoLkxOMTApLFxuICAgICAgICAgICh4KSA9PiAheC5pc05lZygpID8gZGVjaW1hbF9kZWZhdWx0LmxvZzEwKHgpIDogY2UuY29tcGxleCh4LnRvTnVtYmVyKCkpLmxvZygpLmRpdihNYXRoLkxOMTApLFxuICAgICAgICAgICh6KSA9PiB6LmxvZygpLmRpdihNYXRoLkxOMTApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIE1heDoge1xuICAgICAgZGVzY3JpcHRpb246IFwiTWF4aW11bSBvZiB0d28gb3IgbW9yZSBudW1iZXJzXCIsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIk1heFwiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBjb25zdCByZXN0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2Ygb3BzMikge1xuICAgICAgICAgICAgaWYgKCFvcDMuaXNOdW1iZXIgfHwgb3AzLm51bWVyaWNWYWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXN0LnB1c2gob3AzKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFyZXN1bHQgfHwgb3AzLmlzR3JlYXRlcihyZXN1bHQpKVxuICAgICAgICAgICAgICByZXN1bHQgPSBvcDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuYm94KHJlc3VsdCA/IFtcIk1heFwiLCByZXN1bHQsIC4uLnJlc3RdIDogW1wiTWF4XCIsIC4uLnJlc3RdKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ID8/IGNlLl9OQU47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE1pbjoge1xuICAgICAgZGVzY3JpcHRpb246IFwiTWluaW11bSBvZiB0d28gb3IgbW9yZSBudW1iZXJzXCIsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIk1pblwiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBjb25zdCByZXN0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2Ygb3BzMikge1xuICAgICAgICAgICAgaWYgKCFvcDMuaXNOdW1iZXIgfHwgb3AzLm51bWVyaWNWYWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXN0LnB1c2gob3AzKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFyZXN1bHQgfHwgb3AzLmlzTGVzcyhyZXN1bHQpKVxuICAgICAgICAgICAgICByZXN1bHQgPSBvcDM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuYm94KHJlc3VsdCA/IFtcIk1pblwiLCByZXN1bHQsIC4uLnJlc3RdIDogW1wiTWluXCIsIC4uLnJlc3RdKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ID8/IGNlLl9OQU47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE11bHRpcGx5OiB7XG4gICAgICB3aWtpZGF0YTogXCJRNDAyNzZcIixcbiAgICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgICBpZGVtcG90ZW50OiB0cnVlLFxuICAgICAgY29tcGxleGl0eTogMjEwMCxcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBcIk51bWVyaWNGdW5jdGlvblwiLFxuICAgICAgICAvLyBOZXZlciBjYWxsZWQ6IGZhc3RwYXRoXG4gICAgICAgIC8vIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgIC8vICAgcmV0dXJuIGNhbm9uaWNhbE11bHRpcGx5KGNlLCBhcmdzKTtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gc2ltcGxpZnlNdWx0aXBseShjZSwgb3BzMiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxNdWx0aXBseShjZSwgb3BzMiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbE11bHRpcGx5KGNlLCBvcHMyLCBcIk5cIilcbiAgICAgIH1cbiAgICB9LFxuICAgIE5lZ2F0ZToge1xuICAgICAgZGVzY3JpcHRpb246IFwiQWRkaXRpdmUgSW52ZXJzZVwiLFxuICAgICAgd2lraWRhdGE6IFwiUTcxNTM1OFwiLFxuICAgICAgY29tcGxleGl0eTogMmUzLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzWzBdLmRvbWFpbjtcbiAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKVxuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgICBjb25zdCBuZWdEb21haW4gPSB7XG4gICAgICAgICAgICBQb3NpdGl2ZU51bWJlcjogXCJOZWdhdGl2ZU51bWJlclwiLFxuICAgICAgICAgICAgTm9uTmVnYXRpdmVOdW1iZXI6IFwiTm9uUG9zaXRpdmVOdW1iZXJcIixcbiAgICAgICAgICAgIE5vblBvc2l0aXZlTnVtYmVyOiBcIk5vbk5lZ2F0aXZlTnVtYmVyXCIsXG4gICAgICAgICAgICBOZWdhdGl2ZU51bWJlcjogXCJQb3NpdGl2ZU51bWJlclwiLFxuICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyOiBcIk5lZ2F0aXZlSW50ZWdlclwiLFxuICAgICAgICAgICAgTm9uTmVnYXRpdmVJbnRlZ2VyOiBcIk5vblBvc2l0aXZlSW50ZWdlclwiLFxuICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyOiBcIk5vbk5lZ2F0aXZlSW50ZWdlclwiLFxuICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyOiBcIlBvc2l0aXZlSW50ZWdlclwiXG4gICAgICAgICAgfVthcmcubGl0ZXJhbF07XG4gICAgICAgICAgaWYgKG5lZ0RvbWFpbilcbiAgICAgICAgICAgIHJldHVybiBjZS5kb21haW4obmVnRG9tYWluKTtcbiAgICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgICB9LFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50cyhjZSwgY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShhcmdzKSksIFtcbiAgICAgICAgICAgIFwiTnVtYmVyXCJcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiTmVnYXRlXCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjYW5vbmljYWxOZWdhdGUoYXJnc1swXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IHByb2Nlc3NOZWdhdGUoY2UsIG9wczJbMF0sIFwic2ltcGxpZnlcIiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHByb2Nlc3NOZWdhdGUoY2UsIG9wczJbMF0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gcHJvY2Vzc05lZ2F0ZShjZSwgb3BzMlswXSwgXCJOXCIpLFxuICAgICAgICBzZ246IChfY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBzID0gYXJnc1swXS5zZ247XG4gICAgICAgICAgaWYgKHMgPT09IHZvaWQgMCB8fCBzID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAocyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIGlmIChzID4gMClcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAocyA8IDApXG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBQb3dlcjoge1xuICAgICAgd2lraWRhdGE6IFwiUTMzNDU2XCIsXG4gICAgICBjb21tdXRhdGl2ZTogZmFsc2UsXG4gICAgICBjb21wbGV4aXR5OiAzNTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IHZhbGlkYXRlQXJndW1lbnRzKGNlLCBjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKGFyZ3MpKSwgW1xuICAgICAgICAgICAgXCJOdW1iZXJcIixcbiAgICAgICAgICAgIFwiTnVtYmVyXCJcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiUG93ZXJcIiwgYXJncyk7XG4gICAgICAgICAgcmV0dXJuIGNlLnBvdyhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gcHJvY2Vzc1Bvd2VyKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzUG93ZXIoY2UsIG9wczJbMF0sIG9wczJbMV0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChjZS5udW1lcmljTW9kZSA9PT0gXCJtYWNoaW5lXCIgJiYgdHlwZW9mIG9wczJbMF0ubnVtZXJpY1ZhbHVlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBvcHMyWzFdLm51bWVyaWNWYWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoXG4gICAgICAgICAgICAgIE1hdGgucG93KG9wczJbMF0ubnVtZXJpY1ZhbHVlLCBvcHMyWzFdLm51bWVyaWNWYWx1ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NQb3dlcihjZSwgb3BzMlswXSwgb3BzMlsxXSwgXCJOXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlZmluZWQgYXMgUmVhbE51bWJlciBmb3IgYWxsIHBvd2VyIGluIFJlYWxOdW1iZXIgd2hlbiBiYXNlID4gMDtcbiAgICAgICAgLy8gd2hlbiB4IDwgMCwgb25seSBkZWZpbmVkIGlmIG4gaXMgYW4gaW50ZWdlclxuICAgICAgICAvLyBpZiB4IGlzIGEgbm9uLXplcm8gY29tcGxleCwgZGVmaW5lZCBhcyBDb21wbGV4TnVtYmVyXG4gICAgICAgIC8vIFNxdWFyZSByb290IG9mIGEgcHJpbWUgaXMgaXJyYXRpb25hbCAoQWxnZWJyYWljTnVtYmVyKVxuICAgICAgICAvLyBodHRwczovL3Byb29md2lraS5vcmcvd2lraS9TcXVhcmVfUm9vdF9vZl9QcmltZV9pc19JcnJhdGlvbmFsXG4gICAgICAgIC8vIGV2YWxEb21haW46IChjZSwgYmFzZTogQm94ZWRFeHByZXNzaW9uLCBwb3dlcjogQm94ZWRFeHByZXNzaW9uKSA7XG4gICAgICB9XG4gICAgfSxcbiAgICBQcm9kdWN0OiB7XG4gICAgICB3aWtpZGF0YTogXCJROTAxNzE4XCIsXG4gICAgICBjb21wbGV4aXR5OiAxZTMsXG4gICAgICBob2xkOiBcImZpcnN0XCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICAvLyBbXG4gICAgICAgICAgLy8gICAnTWF5YmUnLFxuICAgICAgICAgIFwiVHVwbGVcIixcbiAgICAgICAgICAvLyBbJ1R1cGxlJywgJ1N5bWJvbCcsIFsnTWF5YmUnLCAnSW50ZWdlciddLCBbJ01heWJlJywgJ0ludGVnZXInXV0sXG4gICAgICAgICAgLy8gXSxcbiAgICAgICAgICBcIk51bWJlclwiXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IGRvbWFpbkFkZChjZSwgYXJncyksXG4gICAgICAgIC8vIFRoZSAnYm9keScgYW5kICdyYW5nZScgbmVlZCB0byBiZSBpbnRlcnByZXRlZCBieSBjYW5vbmljYWxNdWx0aXBsaWNhdGlvbigpLiBEb24ndCBjYW5vbmljYWxpemUgdGhlbSB5ZXQuXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjYW5vbmljYWxQcm9kdWN0KGNlLCBvcHMyWzBdLCBvcHMyWzFdKSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gZXZhbE11bHRpcGxpY2F0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsTXVsdGlwbGljYXRpb24oY2UsIG9wczJbMF0sIG9wczJbMV0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbE11bHRpcGxpY2F0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcIk5cIilcbiAgICAgIH1cbiAgICB9LFxuICAgIFJhdGlvbmFsOiB7XG4gICAgICBjb21wbGV4aXR5OiAyNDAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgW1wiTWF5YmVcIiwgXCJOdW1iZXJcIl0sIFwiUmF0aW9uYWxOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJSYXRpb25hbFwiLCBbY2UuZXJyb3IoXCJtaXNzaW5nXCIpXSk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlJhdGlvbmFsXCIsIFtcbiAgICAgICAgICAgICAgdmFsaWRhdGVBcmd1bWVudChjZSwgYXJnc1swXSwgXCJFeHRlbmRlZFJlYWxOdW1iZXJcIilcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIGFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50cyhjZSwgYXJncywgW1wiSW50ZWdlclwiLCBcIkludGVnZXJcIl0pO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJSYXRpb25hbFwiLCBhcmdzKTtcbiAgICAgICAgICByZXR1cm4gY2UuZGl2KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICB9LFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4gc2ltcGxpZnlEaXZpZGUoY2UsIG9wczJbMF0sIG9wczJbMV0pO1xuICAgICAgICB9LFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBbbiwgZF0gPSBbYXNTbWFsbEludGVnZXIob3BzMlswXSksIGFzU21hbGxJbnRlZ2VyKG9wczJbMV0pXTtcbiAgICAgICAgICAgIGlmIChuICE9PSBudWxsICYmIGQgIT09IG51bGwpXG4gICAgICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoW24sIGRdKTtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGYgPSBhc0Zsb2F0KG9wczJbMF0uTigpKTtcbiAgICAgICAgICBpZiAoZiA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihyYXRpb25hbGl6ZShmKSk7XG4gICAgICAgIH0sXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICAgIHJldHVybiBhcHBseTJOKFxuICAgICAgICAgICAgb3BzMlswXSxcbiAgICAgICAgICAgIG9wczJbMV0sXG4gICAgICAgICAgICAoYSwgYikgPT4gYSAvIGIsXG4gICAgICAgICAgICAoYSwgYikgPT4gYS5kaXYoYiksXG4gICAgICAgICAgICAoYSwgYikgPT4gYS5kaXYoYilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBSb290OiB7XG4gICAgICBjb21wbGV4aXR5OiAzMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiUm9vdFwiLCB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGFyZ3MsIDIpKTtcbiAgICAgICAgICBjb25zdCBbYmFzZSwgZXhwMl0gPSBbXG4gICAgICAgICAgICB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzWzBdLCBcIk51bWJlclwiKSxcbiAgICAgICAgICAgIHZhbGlkYXRlQXJndW1lbnQoY2UsIGFyZ3NbMV0sIFwiTnVtYmVyXCIpXG4gICAgICAgICAgXTtcbiAgICAgICAgICBpZiAoIWV4cDIuaXNWYWxpZCB8fCAhYmFzZS5pc1ZhbGlkKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlJvb3RcIiwgW2Jhc2UsIGV4cDJdKTtcbiAgICAgICAgICByZXR1cm4gY2UucG93KGJhc2UsIGNlLmludihleHAyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFJvdW5kOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjUwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGFwcGx5TihcbiAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgIE1hdGgucm91bmQsXG4gICAgICAgICAgKHgpID0+IHgucm91bmQoKSxcbiAgICAgICAgICAoeCkgPT4geC5yb3VuZCgwKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBTaWduOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgW1wiUmFuZ2VcIiwgLTEsIDFdXSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IHMgPSBvcHMyWzBdLnNnbjtcbiAgICAgICAgICBpZiAocyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fWkVSTztcbiAgICAgICAgICBpZiAocyA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fT05FO1xuICAgICAgICAgIGlmIChzID09PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkVHQVRJVkVfT05FO1xuICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBzID0gb3BzMlswXS5zZ247XG4gICAgICAgICAgaWYgKHMgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgICAgaWYgKHMgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgICBpZiAocyA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX09ORTtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9LFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBzID0gb3BzMlswXS5zZ247XG4gICAgICAgICAgaWYgKHMgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgICAgaWYgKHMgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX09ORTtcbiAgICAgICAgICBpZiAocyA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX05FR0FUSVZFX09ORTtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTaWduR2FtbWE6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBzaWduIG9mIHRoZSBnYW1tYSBmdW5jdGlvbjogLTEgb3IgKzFcIixcbiAgICAgIGNvbXBsZXhpdHk6IDc5MDBcbiAgICAgIC8vIEB0b2RvXG4gICAgfSxcbiAgICBTcXJ0OiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTcXVhcmUgUm9vdFwiLFxuICAgICAgd2lraWRhdGE6IFwiUTEzNDIzN1wiLFxuICAgICAgY29tcGxleGl0eTogM2UzLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgYXJncyA9IGNhbm9uaWNhbChmbGF0dGVuU2VxdWVuY2UoYXJncykpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJTcXJ0XCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjZS5wb3coYXJnc1swXSwgY2UuX0hBTEYpO1xuICAgICAgICB9LFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBwcm9jZXNzU3FydChjZSwgb3BzMlswXSwgXCJzaW1wbGlmeVwiKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gcHJvY2Vzc1NxcnQoY2UsIG9wczJbMF0sIFwiZXZhbHVhdGVcIiksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gcHJvY2Vzc1NxcnQoY2UsIG9wczJbMF0sIFwiTlwiKVxuICAgICAgICAvLyBldmFsRG9tYWluOiBTcXVhcmUgcm9vdCBvZiBhIHByaW1lIGlzIGlycmF0aW9uYWxcbiAgICAgICAgLy8gaHR0cHM6Ly9wcm9vZndpa2kub3JnL3dpa2kvU3F1YXJlX1Jvb3Rfb2ZfUHJpbWVfaXNfSXJyYXRpb25hbFxuICAgICAgfVxuICAgIH0sXG4gICAgU3F1YXJlOiB7XG4gICAgICB3aWtpZGF0YTogXCJRMzA3NTE3NVwiLFxuICAgICAgY29tcGxleGl0eTogMzEwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGFyZ3MgPSBjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKGFyZ3MpKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU3F1YXJlXCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjZS5wb3coYXJnc1swXSwgY2UubnVtYmVyKDIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgU3VidHJhY3Q6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlE0MDc1NFwiLFxuICAgICAgY29tcGxleGl0eTogMTM1MCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFtcIk1heWJlXCIsIFwiTnVtYmVyXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBhcmdzID0gY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShhcmdzKSk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbE5lZ2F0ZShhcmdzWzBdKTtcbiAgICAgICAgICBhcmdzID0gdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBhcmdzLCAyKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU3VidHJhY3RcIiwgYXJncyk7XG4gICAgICAgICAgaWYgKCFhcmdzLmV2ZXJ5KCh4KSA9PiB4LmlzVmFsaWQpKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIlN1YnRyYWN0XCIsIGFyZ3MpO1xuICAgICAgICAgIHJldHVybiBjZS5hZGQoW2FyZ3NbMF0sIGNhbm9uaWNhbE5lZ2F0ZShhcmdzWzFdKV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTdW06IHtcbiAgICAgIHdpa2lkYXRhOiBcIlEyMTgwMDVcIixcbiAgICAgIGNvbXBsZXhpdHk6IDFlMyxcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICAvLyBbXG4gICAgICAgICAgLy8gICAnTWF5YmUnLFxuICAgICAgICAgIFwiVHVwbGVcIixcbiAgICAgICAgICAvLyBbJ1R1cGxlJywgJ1N5bWJvbCcsIFsnTWF5YmUnLCAnSW50ZWdlciddLCBbJ01heWJlJywgJ0ludGVnZXInXV0sXG4gICAgICAgICAgLy8gXSxcbiAgICAgICAgICBcIk51bWJlclwiXG4gICAgICAgIF0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjYW5vbmljYWxTdW1tYXRpb24oY2UsIG9wczJbMF0sIG9wczJbMV0pLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBldmFsU3VtbWF0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcInNpbXBsaWZ5XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsU3VtbWF0aW9uKGNlLCBvcHMyWzBdLCBvcHMyWzFdLCBcImV2YWx1YXRlXCIpLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxTdW1tYXRpb24oY2UsIG9wczJbMF0sIG9wczJbMV0sIFwiTlwiKVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAge1xuICAgIC8vXG4gICAgLy8gQ29uc3RhbnRzXG4gICAgLy8gTm90ZTogY29uc3RhbnRzIGFyZSBwdXQgaW4gYSBzZXBhcmF0ZSwgc3Vic2VxdWVudCwgZGljdGlvbmFyeSBiZWNhdXNlXG4gICAgLy8gc29tZSBvZiB0aGUgdmFsdWVzIChDYXRhbGFuQ29uc3RhbnQpIHJlZmVyZW5jZSBzb21lIGZ1bmN0aW9uIG5hbWVzIChBZGQuLi4pXG4gICAgLy8gdGhhdCBhcmUgZGVmaW5lZCBhYm92ZS4gVGhpcyBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzLlxuICAgIC8vXG4gICAgZToge1xuICAgICAgZG9tYWluOiBcIlRyYW5zY2VuZGVudGFsTnVtYmVyXCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIGhvbGRVbnRpbDogXCJuZXZlclwiLFxuICAgICAgdmFsdWU6IFwiRXhwb25lbnRpYWxFXCJcbiAgICB9LFxuICAgIGk6IHtcbiAgICAgIGRvbWFpbjogXCJJbWFnaW5hcnlOdW1iZXJcIixcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcIm5ldmVyXCIsXG4gICAgICBmbGFnczogeyBpbWFnaW5hcnk6IHRydWUgfSxcbiAgICAgIHZhbHVlOiBcIkltYWdpbmFyeVVuaXRcIlxuICAgIH0sXG4gICAgTWFjaGluZUVwc2lsb246IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCB0aGUgbmV4dCBsYXJnZXIgZmxvYXRpbmcgcG9pbnQgbnVtYmVyXG4gICAgICAgKlxuICAgICAgICogICAgMl57XHUyMjEyNTJ9XG4gICAgICAgKlxuICAgICAgICogU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hY2hpbmVfZXBzaWxvblxuICAgICAgICovXG4gICAgICBkb21haW46IFwiUmVhbE51bWJlclwiLFxuICAgICAgaG9sZFVudGlsOiBcIk5cIixcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgZmxhZ3M6IHsgcmVhbDogdHJ1ZSB9LFxuICAgICAgdmFsdWU6IHsgbnVtOiBOdW1iZXIuRVBTSUxPTi50b1N0cmluZygpIH1cbiAgICB9LFxuICAgIEhhbGY6IHtcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcImV2YWx1YXRlXCIsXG4gICAgICB2YWx1ZTogW1wiUmF0aW9uYWxcIiwgMSwgMl1cbiAgICB9LFxuICAgIEltYWdpbmFyeVVuaXQ6IHtcbiAgICAgIGRvbWFpbjogXCJJbWFnaW5hcnlOdW1iZXJcIixcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcImV2YWx1YXRlXCIsXG4gICAgICB3aWtpZGF0YTogXCJRMTkzNzk2XCIsXG4gICAgICBmbGFnczogeyBpbWFnaW5hcnk6IHRydWUgfSxcbiAgICAgIHZhbHVlOiBbXCJDb21wbGV4XCIsIDAsIDFdXG4gICAgfSxcbiAgICBFeHBvbmVudGlhbEU6IHtcbiAgICAgIGRvbWFpbjogXCJUcmFuc2NlbmRlbnRhbE51bWJlclwiLFxuICAgICAgZmxhZ3M6IHsgYWxnZWJyYWljOiBmYWxzZSwgcmVhbDogdHJ1ZSB9LFxuICAgICAgd2lraWRhdGE6IFwiUTgyNDM1XCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIGhvbGRVbnRpbDogXCJOXCIsXG4gICAgICB2YWx1ZTogKGVuZ2luZSkgPT4gYmlnbnVtUHJlZmVycmVkKGVuZ2luZSkgPyBlbmdpbmUuX0JJR05VTV9PTkUuZXhwKCkgOiBNYXRoLmV4cCgxKVxuICAgIH0sXG4gICAgR29sZGVuUmF0aW86IHtcbiAgICAgIGRvbWFpbjogXCJBbGdlYnJhaWNOdW1iZXJcIixcbiAgICAgIHdpa2lkYXRhOiBcIlE0MTY5MFwiLFxuICAgICAgY29uc3RhbnQ6IHRydWUsXG4gICAgICBmbGFnczogeyBhbGdlYnJhaWM6IHRydWUgfSxcbiAgICAgIGhvbGRVbnRpbDogXCJzaW1wbGlmeVwiLFxuICAgICAgdmFsdWU6IFtcIkRpdmlkZVwiLCBbXCJBZGRcIiwgMSwgW1wiU3FydFwiLCA1XV0sIDJdXG4gICAgfSxcbiAgICBDYXRhbGFuQ29uc3RhbnQ6IHtcbiAgICAgIGRvbWFpbjogXCJSZWFsTnVtYmVyXCIsXG4gICAgICBmbGFnczogeyBhbGdlYnJhaWM6IHZvaWQgMCB9LFxuICAgICAgLy8gTm90IHByb3ZlbiBpcnJhdGlvbmFsIG9yIHRyYW5zY2VuZGVudGFsXG4gICAgICB3aWtpZGF0YTogXCJRODU1MjgyXCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIGhvbGRVbnRpbDogXCJOXCIsXG4gICAgICB2YWx1ZToge1xuICAgICAgICAvLyBGcm9tIGh0dHA6Ly93d3cuZnVsbGJvb2tzLmNvbS9NaXNjZWxsYW5lb3VzLU1hdGhlbWF0aWNhbC1Db25zdGFudHMxLmh0bWxcbiAgICAgICAgbnVtOiBgMC45MTU5NjU1OTQxNzcyMTkwMTUwNTQ2MDM1MTQ5MzIzODQxMTA3NzQxNDkzNzQyODE2N1xuICAgICAgICAgICAgICAgICAgMjEzNDI2NjQ5ODExOTYyMTc2MzAxOTc3NjI1NDc2OTQ3OTM1NjUxMjkyNjExNTEwNjJcbiAgICAgICAgICAgICAgICAgIDQ4NTc0NDIyNjE5MTk2MTk5NTc5MDM1ODk4ODAzMzI1ODU5MDU5NDMxNTk0NzM3NDgxXG4gICAgICAgICAgICAgICAgICAxNTg0MDY5OTUzMzIwMjg3NzMzMTk0NjA1MTkwMzg3Mjc0NzgxNjQwODc4NjU5MDkwMlxuICAgICAgICAgICAgICAgICAgNDcwNjQ4NDE1MjE2MzAwMDIyODcyNzY0MDk0MjM4ODI1OTk1Nzc0MTUwODgxNjM5NzRcbiAgICAgICAgICAgICAgICAgIDcwMjUyNDgyMDExNTYwNzA3NjQ0ODgzODA3ODczMzcwNDg5OTAwODY0Nzc1MTEzMjI1XG4gICAgICAgICAgICAgICAgICA5OTcxMzQzNDA3NDg1NDA3NTUzMjMwNzY4NTY1MzM1NzY4MDk1ODM1MjYwMjE5MzgyM1xuICAgICAgICAgICAgICAgICAgMjM5NTA4MDA3MjA2ODAzNTU3NjEwNDgyMzU3MzM5NDIzMTkxNDk4Mjk4MzYxODk5NzdcbiAgICAgICAgICAgICAgICAgIDA2OTAzNjQwNDE4MDg2MjE3OTQxMTAxOTE3NTMyNzQzMTQ5OTc4MjMzOTc2MTA1NTEyXG4gICAgICAgICAgICAgICAgICAyNDc3OTUzMDMyNDg3NTM3MTg3ODY2NTgyODA4MjM2MDU3MDIyNTU5NDE5NDgxODA5N1xuICAgICAgICAgICAgICAgICAgNTM1MDk3MTEzMTU3MTI2MTU4MDQyNDI3MjM2MzY0Mzk4NTAwMTczODI4NzU5Nzc5NzZcbiAgICAgICAgICAgICAgICAgIDUzMDY4MzcwMDkyOTgwODczODg3NDk1NjEwODkzNjU5NzcxOTQwOTY4NzI2ODQ0NDQxXG4gICAgICAgICAgICAgICAgICA2NjgwNDYyMTYyNDMzOTg2NDgzODkxNjI4MDQ0ODI4MTUwNjI3MzAyMjc0MjA3Mzg4NFxuICAgICAgICAgICAgICAgICAgMzExNzIyMTgyNzIxOTA0NzIyNTU4NzA1MzE5MDg2ODU3MzU0MjM0OTg1Mzk0OTgzMDlcbiAgICAgICAgICAgICAgICAgIDkxOTExNTk2NzM4ODQ2NDUwODYxNTE1MjQ5OTYyNDIzNzA0Mzc0NTE3NzczNzIzNTE3XG4gICAgICAgICAgICAgICAgICA3NTQ0MDcwODUzODQ2NDQwMTMyMTc0ODM5Mjk5OTk0NzU3MjQ0NjE5OTc1NDk2MTk3NVxuICAgICAgICAgICAgICAgICAgODcwNjQwMDc0NzQ4NzA3MDE0OTA5Mzc2Nzg4NzMwNDU4Njk5Nzk4NjA2NDQ4NzQ5NzRcbiAgICAgICAgICAgICAgICAgIDY0Mzg3MjA2MjM4NTEzNzEyMzkyNzM2MzA0OTk4NTAzNTM5MjIzOTI4Nzg3OTc5MDYzXG4gICAgICAgICAgICAgICAgICAzNjQ0MDMyMzU0Nzg0NTM1ODUxOTI3Nzc3Nzg3MjcwOTA2MDgzMDMxOTk0MzAxMzMyM1xuICAgICAgICAgICAgICAgICAgMTY3MTI0NzYxNTg3MDk3OTI0NTU0NzkxMTkwOTIxMjYyMDE4NTQ4MDM5NjM5MzQyNDNcbiAgICAgICAgICAgICAgICAgIGBcbiAgICAgIH1cbiAgICB9LFxuICAgIEV1bGVyR2FtbWE6IHtcbiAgICAgIC8vIEZyb20gaHR0cDovL3d3dy5mdWxsYm9va3MuY29tL01pc2NlbGxhbmVvdXMtTWF0aGVtYXRpY2FsLUNvbnN0YW50czIuaHRtbFxuICAgICAgZG9tYWluOiBcIlJlYWxOdW1iZXJcIixcbiAgICAgIGZsYWdzOiB7IGFsZ2VicmFpYzogdm9pZCAwIH0sXG4gICAgICAvLyBOb3QgcHJvdmVuIGlycmF0aW9uYWwgb3IgdHJhbnNjZW5kZW50YWxcbiAgICAgIHdpa2lkYXRhOiBcIlEyNzMwMjNcIixcbiAgICAgIGhvbGRVbnRpbDogXCJOXCIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIG51bTogYDAuNTc3MjE1NjY0OTAxNTMyODYwNjA2NTEyMDkwMDgyNDAyNDMxMDQyMTU5MzM1OTM5OTIzNTk4ODA1NzY3MjM0ODg0ODY3NzI2Nzc3NjZcbiAgICAgICAgICA0NjcwOTM2OTQ3MDYzMjkxNzQ2NzQ5NTE0NjMxNDQ3MjQ5ODA3MDgyNDgwOTYwNTA0MDE0NDg2NTQyODM2MjI0MTczOTk3NjQ0OTIzNTNcbiAgICAgICAgICA2MjUzNTAwMzMzNzQyOTM3MzM3NzM3NjczOTQyNzkyNTk1MjU4MjQ3MDk0OTE2MDA4NzM1MjAzOTQ4MTY1NjcwODUzMjMzMTUxNzc2NjFcbiAgICAgICAgICAxNTI4NjIxMTk5NTAxNTA3OTg0NzkzNzQ1MDg1NzA1NzQwMDI5OTIxMzU0Nzg2MTQ2Njk0MDI5NjA0MzI1NDIxNTE5MDU4Nzc1NTM1MjZcbiAgICAgICAgICA3MzMxMzk5MjU0MDEyOTY3NDIwNTEzNzU0MTM5NTQ5MTExNjg1MTAyODA3OTg0MjM0ODc3NTg3MjA1MDM4NDMxMDkzOTk3MzYxMzcyNTVcbiAgICAgICAgICAzMDYwODg5MzMxMjY3NjAwMTcyNDc5NTM3ODM2NzU5MjcxMzUxNTc3MjI2MTAyNzM0OTI5MTM5NDA3OTg0MzAxMDM0MTc3NzE3NzgwODhcbiAgICAgICAgICAxNTQ5NTcwNjYxMDc1MDEwMTYxOTE2NjMzNDAxNTIyNzg5MzU4Njc5NjU0OTcyNTIwMzYyMTI4NzkyMjY1NTU5NTM2Njk2MjgxNzYzODhcbiAgICAgICAgICA3OTI3MjY4MDEzMjQzMTAxMDQ3NjUwNTk2MzcwMzk0NzM5NDk1NzYzODkwNjU3Mjk2NzkyOTYwMTAwOTAxNTEyNTE5NTk1MDkyMjI0MzVcbiAgICAgICAgICAwMTQwOTM0OTg3MTIyODI0Nzk0OTc0NzE5NTY0Njk3NjMxODUwNjY3NjEyOTA2MzgxMTA1MTgyNDE5NzQ0NDg2NzgzNjM4MDg2MTc0OTRcbiAgICAgICAgICA1NTE2OTg5Mjc5MjMwMTg3NzM5MTA3Mjk0NTc4MTU1NDMxNjAwNTAwMjE4Mjg0NDA5NjA1Mzc3MjQzNDIwMzI4NTQ3ODM2NzAxNTE3NzNcbiAgICAgICAgICA5NDM5ODcwMDMwMjM3MDMzOTUxODMyODY5MDAwMTU1ODE5Mzk4ODA0MjcwNzQxMTU0MjIyNzgxOTcxNjUyMzAxMTA3MzU2NTgzMzk2NzNgXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgUHJlSW5jcmVtZW50OiB7XG4gICAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSB9XG4gICAgfSxcbiAgICBQcmVEZWNyZW1lbnQ6IHtcbiAgICAgIHNpZ25hdHVyZTogeyBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdIH1cbiAgICB9XG4gIH1cbl07XG5mdW5jdGlvbiBwcm9jZXNzQWJzKGNlLCBhcmcsIG1vZGUpIHtcbiAgaWYgKG1vZGUgIT09IFwic2ltcGxpZnlcIikge1xuICAgIGNvbnN0IG51bSA9IGFyZy5udW1lcmljVmFsdWU7XG4gICAgaWYgKG51bSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIpXG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoTWF0aC5hYnMobnVtKSk7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKG51bS5hYnMoKSk7XG4gICAgICBpZiAobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNi5kZWZhdWx0KVxuICAgICAgICByZXR1cm4gY2UubnVtYmVyKG51bS5hYnMoKSk7XG4gICAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwobnVtKSlcbiAgICAgICAgcmV0dXJuIGNlLm51bWJlcihcbiAgICAgICAgICBtb2RlID09PSBcIk5cIiA/IE1hdGguYWJzKG51bVswXSAvIG51bVsxXSkgOiBbTWF0aC5hYnMobnVtWzBdKSwgbnVtWzFdXVxuICAgICAgICApO1xuICAgICAgaWYgKGlzQmlnUmF0aW9uYWwobnVtKSkge1xuICAgICAgICBjb25zdCBbbiwgZF0gPSBudW07XG4gICAgICAgIHJldHVybiBjZS5udW1iZXIoXG4gICAgICAgICAgbW9kZSA9PT0gXCJOXCIgPyBjZS5iaWdudW0obikuZGl2KGNlLmJpZ251bShkKSkuYWJzKCkgOiBbbiA+IDAgPyBuIDogLW4sIGRdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChhcmcuaXNOb25OZWdhdGl2ZSlcbiAgICByZXR1cm4gYXJnO1xuICBpZiAoYXJnLmlzTmVnYXRpdmUpXG4gICAgcmV0dXJuIGNlLm5lZyhhcmcpO1xuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9jYWxjdWx1cy50c1xudmFyIENBTENVTFVTX0xJQlJBUlkgPSBbXG4gIHtcbiAgICAvL1xuICAgIC8vIEZ1bmN0aW9uc1xuICAgIC8vXG4gICAgSW50ZWdyYXRlOiB7XG4gICAgICB3aWtpZGF0YTogXCJRODAwOTFcIixcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICBbXCJVbmlvblwiLCBcIk5vdGhpbmdcIiwgXCJUdXBsZVwiLCBcIlN5bWJvbFwiXSxcbiAgICAgICAgICAvLyBbJ1R1cGxlJywgJ1N5bWJvbCcsIFsnTWF5YmUnLCAnSW50ZWdlciddLCBbJ01heWJlJywgJ0ludGVnZXInXV0sXG4gICAgICAgICAgXCJOdW1iZXJcIlxuICAgICAgICBdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBvcHMyWzBdID8/IGNlLmVycm9yKFwibWlzc2luZ1wiKTtcbiAgICAgICAgICBsZXQgcmFuZ2UgPSBvcHMyWzFdO1xuICAgICAgICAgIGxldCBpbmRleCA9IG51bGw7XG4gICAgICAgICAgbGV0IGxvd2VyID0gbnVsbDtcbiAgICAgICAgICBsZXQgdXBwZXIgPSBudWxsO1xuICAgICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS5oZWFkICE9PSBcIlR1cGxlXCIgJiYgcmFuZ2UuaGVhZCAhPT0gXCJUcmlwbGVcIiAmJiByYW5nZS5oZWFkICE9PSBcIlBhaXJcIiAmJiByYW5nZS5oZWFkICE9PSBcIlNpbmdsZVwiKSB7XG4gICAgICAgICAgICBpbmRleCA9IHJhbmdlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGluZGV4ID0gcmFuZ2Uub3BzPy5bMF0gPz8gbnVsbDtcbiAgICAgICAgICAgIGxvd2VyID0gcmFuZ2Uub3BzPy5bMV0/LmNhbm9uaWNhbCA/PyBudWxsO1xuICAgICAgICAgICAgdXBwZXIgPSByYW5nZS5vcHM/LlsyXT8uY2Fub25pY2FsID8/IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCAmJiBpbmRleC5oZWFkID09PSBcIkhvbGRcIilcbiAgICAgICAgICAgIGluZGV4ID0gaW5kZXgub3AxO1xuICAgICAgICAgIGlmIChpbmRleCAmJiBpbmRleC5oZWFkID09PSBcIlJlbGVhc2VIb2xkXCIpXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4Lm9wMS5ldmFsdWF0ZSgpO1xuICAgICAgICAgIGluZGV4ID8/IChpbmRleCA9IGNlLnN5bWJvbChcIk5vdGhpbmdcIikpO1xuICAgICAgICAgIGlmICghaW5kZXguc3ltYm9sKVxuICAgICAgICAgICAgaW5kZXggPSBjZS5lcnJvcihbXCJpbmNvbXBhdGlibGUtZG9tYWluXCIsIFwiU3ltYm9sXCIsIGluZGV4LmRvbWFpbl0pO1xuICAgICAgICAgIGlmIChsb3dlcilcbiAgICAgICAgICAgIGxvd2VyID0gdmFsaWRhdGVBcmd1bWVudChjZSwgbG93ZXIsIFwiTnVtYmVyXCIpO1xuICAgICAgICAgIGlmICh1cHBlcilcbiAgICAgICAgICAgIHVwcGVyID0gdmFsaWRhdGVBcmd1bWVudChjZSwgdXBwZXIsIFwiTnVtYmVyXCIpO1xuICAgICAgICAgIGlmIChsb3dlciAmJiB1cHBlcilcbiAgICAgICAgICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBsb3dlciwgdXBwZXJdKTtcbiAgICAgICAgICBlbHNlIGlmICh1cHBlcilcbiAgICAgICAgICAgIHJhbmdlID0gY2UudHVwbGUoW2luZGV4LCBjZS5fTkVHQVRJVkVfSU5GSU5JVFksIHVwcGVyXSk7XG4gICAgICAgICAgZWxzZSBpZiAobG93ZXIpXG4gICAgICAgICAgICByYW5nZSA9IGNlLnR1cGxlKFtpbmRleCwgbG93ZXJdKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICByYW5nZSA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJJbnRlZ3JhdGVcIiwgW2JvZHkuY2Fub25pY2FsLCByYW5nZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9jb2xsZWN0aW9ucy50c1xudmFyIENPTExFQ1RJT05TX0xJQlJBUlkgPSB7XG4gIFNlcXVlbmNlOiB7XG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiRnVuY3Rpb25cIlxuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvY29tcGxleC50c1xudmFyIENPTVBMRVhfTElCUkFSWSA9IFtcbiAge1xuICAgIFJlYWw6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDMgPSBvcHMyWzBdLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgICBpZiAob3AzID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAoY2UuaXNDb21wbGV4KG9wMykpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKG9wMy5yZSk7XG4gICAgICAgICAgcmV0dXJuIG9wczJbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEltYWdpbmFyeToge1xuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wMyA9IG9wczJbMF0ubnVtZXJpY1ZhbHVlO1xuICAgICAgICAgIGlmIChvcDMgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIGlmIChjZS5pc0NvbXBsZXgob3AzKSlcbiAgICAgICAgICAgIHJldHVybiBjZS5udW1iZXIob3AzLmltKTtcbiAgICAgICAgICByZXR1cm4gY2UuX1pFUk87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEFyZ3VtZW50OiB7XG4gICAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgICAgY29tcGxleGl0eTogMTIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3AzID0gb3BzMlswXS5udW1lcmljVmFsdWU7XG4gICAgICAgICAgaWYgKG9wMyA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKGNlLmlzQ29tcGxleChvcDMpKVxuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihvcDMuYXJnKCkpO1xuICAgICAgICAgIGNvbnN0IGYgPSBhc0Zsb2F0KG9wczJbMF0pO1xuICAgICAgICAgIGlmIChmID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAoZiA+PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigwKTtcbiAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKE1hdGguUEkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBBYnNBcmc6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJUdXBsZVwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wMyA9IG9wczJbMF0ubnVtZXJpY1ZhbHVlO1xuICAgICAgICAgIGlmIChvcDMgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIGlmIChjZS5pc0NvbXBsZXgob3AzKSlcbiAgICAgICAgICAgIHJldHVybiBjZS50dXBsZShbY2UubnVtYmVyKG9wMy5hYnMoKSksIGNlLm51bWJlcihvcDMuYXJnKCkpXSk7XG4gICAgICAgICAgY29uc3QgZiA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKGYgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBjZS50dXBsZShbXG4gICAgICAgICAgICBjZS5udW1iZXIoTWF0aC5hYnMoZikpLFxuICAgICAgICAgICAgY2UubnVtYmVyKGYgPj0gMCA/IDAgOiBNYXRoLlBJKVxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBDb25qdWdhdGU6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDMgPSBvcHMyWzBdLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgICBpZiAob3AzID09PSBudWxsIHx8ICFjZS5pc0NvbXBsZXgob3AzKSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihvcDMuY29uanVnYXRlKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBDb21wbGV4Um9vdHM6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJMaXN0XCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgY29uc3QgbiA9IGFzRmxvYXQob3BzMlsxXSk7XG4gICAgICAgICAgaWYgKHggPT09IG51bGwgfHwgbiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBuIDw9IDApXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIGNvbnN0IHJvb3RzID0gW107XG4gICAgICAgICAgY29uc3QgW3JlLCBpbV0gPSBjZS5pc0NvbXBsZXgoeCkgPyBbeC5yZSwgeC5pbV0gOiBbeCwgMF07XG4gICAgICAgICAgY29uc3QgYXJnID0gTWF0aC5hdGFuMihpbSwgcmUpO1xuICAgICAgICAgIGNvbnN0IG1vZDIgPSBNYXRoLnNxcnQocmUgKiByZSArIGltICogaW0pO1xuICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCB0aGV0YSA9IChhcmcgKyAyICogTWF0aC5QSSAqIGspIC8gbjtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnBvdyhtb2QyLCAxIC8gbik7XG4gICAgICAgICAgICByb290cy5wdXNoKFtyICogTWF0aC5jb3ModGhldGEpLCByICogTWF0aC5zaW4odGhldGEpXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjZS5ib3goW1xuICAgICAgICAgICAgXCJMaXN0XCIsXG4gICAgICAgICAgICAuLi5yb290cy5tYXAoXG4gICAgICAgICAgICAgIChyKSA9PiBjZS5udW1iZXIoclsxXSAhPT0gMCA/IGNlLmNvbXBsZXgoclswXSwgclsxXSkgOiByWzBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZvciBBYnMgKG1hZ25pdHVkZSkgc2VlIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L3Byb2Nlc3NBYnNcbiAgfVxuXTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvcmFuZG9tLWV4cHJlc3Npb24udHNcbmZ1bmN0aW9uIG9uZU9mKHhzKSB7XG4gIHJldHVybiB4c1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB4cy5sZW5ndGgpXTtcbn1cbmZ1bmN0aW9uIHJhbmRvbUV4cHJlc3Npb25XaXRoSGVhZChoZWFkMiwgbGV2ZWwpIHtcbiAgaWYgKGhlYWQyID09PSBcIkFkZFwiIHx8IGhlYWQyID09PSBcIk11bHRpcGx5XCIpIHtcbiAgICBjb25zdCBvcHMyID0gW107XG4gICAgbGV0IGNvdW50ID0gMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEyKTtcbiAgICB3aGlsZSAoY291bnQgPiAwKSB7XG4gICAgICBvcHMyLnB1c2gocmFuZG9tRXhwcmVzc2lvbihsZXZlbCArIDEpKTtcbiAgICAgIGNvdW50IC09IDE7XG4gICAgfVxuICAgIHJldHVybiBbaGVhZDIsIC4uLm9wczJdO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJEaXZpZGVcIiB8fCBoZWFkMiA9PT0gXCJQb3dlclwiKSB7XG4gICAgcmV0dXJuIFtoZWFkMiwgcmFuZG9tRXhwcmVzc2lvbihsZXZlbCArIDEpLCByYW5kb21FeHByZXNzaW9uKGxldmVsICsgMSldO1xuICB9XG4gIGlmIChoZWFkMiA9PT0gXCJSb290XCIpIHtcbiAgICByZXR1cm4gW2hlYWQyLCByYW5kb21FeHByZXNzaW9uKGxldmVsICsgMSksIHJhbmRvbUV4cHJlc3Npb24oMTApXTtcbiAgfVxuICBpZiAoaGVhZDIgPT09IFwidHJpZ1wiKVxuICAgIHJldHVybiByYW5kb21UcmlnKCk7XG4gIHJldHVybiBbaGVhZDIsIHJhbmRvbUV4cHJlc3Npb24obGV2ZWwgKyAxKV07XG59XG5mdW5jdGlvbiByYW5kb21UcmlnKCkge1xuICByZXR1cm4gW1xuICAgIG9uZU9mKFtcbiAgICAgIFwiQ29zXCIsXG4gICAgICBcIlNpblwiLFxuICAgICAgXCJUYW5cIixcbiAgICAgIFwiU2luaFwiLFxuICAgICAgXCJBcmNjb3NcIixcbiAgICAgIFwiQXJzaW5oXCIsXG4gICAgICBbXCJJbnZlcnNlRnVuY3Rpb25cIiwgXCJDb3NcIl1cbiAgICBdKSxcbiAgICBvbmVPZihbXG4gICAgICBcIlBpXCIsXG4gICAgICBcIi0xXCIsXG4gICAgICBcIjBcIixcbiAgICAgIFwiMVwiLFxuICAgICAgW1wiRGl2aWRlXCIsIFwiUGlcIiwgLTVdLFxuICAgICAgW1wiTXVsdGlwbHlcIiwgLTIsIFtcIkRpdmlkZVwiLCBcIlBpXCIsIDExXV0sXG4gICAgICBbXCJNdWx0aXBseVwiLCBcIkhhbGZcIiwgXCJQaVwiXSxcbiAgICAgIFtcIk11bHRpcGx5XCIsIDUsIFwiUGlcIl0sXG4gICAgICBbXCJNdWx0aXBseVwiLCAxMiwgXCJQaVwiXSxcbiAgICAgIFtcIkRpdmlkZVwiLCBcIlBpXCIsIDVdLFxuICAgICAgW1wiRGl2aWRlXCIsIFwiUGlcIiwgOV0sXG4gICAgICBbXCJNdWx0aXBseVwiLCA1LCBbXCJEaXZpZGVcIiwgXCJQaVwiLCA5XV0sXG4gICAgICBbXCJNdWx0aXBseVwiLCAyLCBbXCJEaXZpZGVcIiwgXCJQaVwiLCAxMV1dLFxuICAgICAgW1wiTXVsdGlwbHlcIiwgMiwgW1wiRGl2aWRlXCIsIFwiUGlcIiwgM11dXG4gICAgXSlcbiAgXTtcbn1cbmZ1bmN0aW9uIHJhbmRvbUV4cHJlc3Npb24obGV2ZWwpIHtcbiAgbGV2ZWwgPz8gKGxldmVsID0gMSk7XG4gIGlmIChsZXZlbCA9PT0gMSkge1xuICAgIGNvbnN0IGggPSBvbmVPZihbXG4gICAgICBbXG4gICAgICAgIFwiU3FydFwiLFxuICAgICAgICBbXG4gICAgICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgICAgIDYsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgXCJTdW1cIixcbiAgICAgICAgICAgIFtcIkRpdmlkZVwiLCAxLCBbXCJQb3dlclwiLCBcIm5cIiwgMl1dLFxuICAgICAgICAgICAgW1wiVHJpcGxlXCIsIFtcIkhvbGRcIiwgXCJuXCJdLCAxLCB7IG51bTogXCIrSW5maW5pdHlcIiB9XVxuICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgICAgXSxcbiAgICAgIFwiQWRkXCIsXG4gICAgICBcIkFkZFwiLFxuICAgICAgXCJBZGRcIixcbiAgICAgIFwiQWRkXCIsXG4gICAgICBcIkFkZFwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJEaXZpZGVcIixcbiAgICAgIFwiRGl2aWRlXCIsXG4gICAgICBcIkRpdmlkZVwiLFxuICAgICAgXCJSb290XCIsXG4gICAgICBcIlNxcnRcIixcbiAgICAgIFwiU3VidHJhY3RcIixcbiAgICAgIFwiTmVnYXRlXCIsXG4gICAgICBcInRyaWdcIlxuICAgIF0pO1xuICAgIGlmICh0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiByYW5kb21FeHByZXNzaW9uV2l0aEhlYWQoaCwgMSk7XG4gICAgcmV0dXJuIGg7XG4gIH1cbiAgaWYgKGxldmVsID09PSAyKSB7XG4gICAgY29uc3QgciA9IE1hdGgucmFuZG9tKCk7XG4gICAgaWYgKHIgPiAwLjc1KVxuICAgICAgcmV0dXJuIHJhbmRvbUV4cHJlc3Npb24oMSk7XG4gICAgaWYgKHIgPiAwLjUpXG4gICAgICByZXR1cm4gcmFuZG9tRXhwcmVzc2lvbigzKTtcbiAgICBjb25zdCBoID0gb25lT2YoW1xuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgXCJBZGRcIixcbiAgICAgIFwiUG93ZXJcIixcbiAgICAgIFwidHJpZ1wiLFxuICAgICAgXCJMblwiLFxuICAgICAgXCJFeHBcIlxuICAgIF0pO1xuICAgIHJldHVybiByYW5kb21FeHByZXNzaW9uV2l0aEhlYWQoaCwgMik7XG4gIH1cbiAgcmV0dXJuIG9uZU9mKFtcbiAgICAtMTIzNDVlLTksXG4gICAgLTIsXG4gICAgLTIsXG4gICAgLTIsXG4gICAgLTMsXG4gICAgLTUsXG4gICAgLTYsXG4gICAgLTEyLFxuICAgIC0xNjU0ZS02MCxcbiAgICAwLFxuICAgIDAsXG4gICAgMTIzNDVlLTgsXG4gICAgMTY1NGUtNjAsXG4gICAgMSxcbiAgICAyLFxuICAgIDIsXG4gICAgMixcbiAgICAyLFxuICAgIDMsXG4gICAgMyxcbiAgICA1LFxuICAgIDUsXG4gICAgNixcbiAgICA2LFxuICAgIDEyMzQuNTY3OCxcbiAgICA1Njc4LjEyMzQsXG4gICAgMTAsXG4gICAgMTUsXG4gICAgMTgsXG4gICAgMzAsXG4gICAgNjAsXG4gICAgMTIzNGU1NCxcbiAgICBcIjEyMzQ1Njc4OS4xMjM0NTY3ODkxMjM0NWUyMDBcIixcbiAgICBcIjk4NzY1NDMyMS4xMjM0NTY3ODkxMjM0NVwiLFxuICAgIFtcIlJhdGlvbmFsXCIsIC02LCAxMF0sXG4gICAgW1wiUmF0aW9uYWxcIiwgLTEyLCAxNV0sXG4gICAgW1wiUmF0aW9uYWxcIiwgLTE1LCAxMl0sXG4gICAgW1wiUmF0aW9uYWxcIiwgMywgNV0sXG4gICAgW1wiUmF0aW9uYWxcIiwgMTIsIDE1XSxcbiAgICBbXCJSYXRpb25hbFwiLCAxNSwgMTJdLFxuICAgIFwiRXhwb25lbnRpYWxFXCIsXG4gICAgLy8gJ0ltYWdpbmFyeVVuaXQnLFxuICAgIFtcIlNxcnRcIiwgM10sXG4gICAgW1wiU3FydFwiLCA1XSxcbiAgICBbXCJTcXJ0XCIsIDE1XSxcbiAgICBbXCJTcXJ0XCIsIDI1XSxcbiAgICBbXCJDb21wbGV4XCIsIC0xLjEsIDEuMV0sXG4gICAgW1wiQ29tcGxleFwiLCA0LCA1XSxcbiAgICBcInhcIixcbiAgICBcInhcIixcbiAgICBcInhcIixcbiAgICBcInhcIixcbiAgICBbXCJBZGRcIiwgXCJ4XCIsIDFdLFxuICAgIFtcIkRpdmlkZVwiLCBcInhcIiwgM10sXG4gICAgW1wiU3F1YXJlXCIsIFwieFwiXSxcbiAgICBbXCJQb3dlclwiLCBcInhcIiwgM10sXG4gICAgW1wiUG93ZXJcIiwgXCJ4XCIsIDRdLFxuICAgIFtcIlN1YnRyYWN0XCIsIFwieFwiLCAxXSxcbiAgICBbXCJBZGRcIiwgXCJ4XCIsIDFdLFxuICAgIC8vICdhJyxcbiAgICAvLyAnYicsXG4gICAgXCJQaVwiXG4gIF0pO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9jb3JlLnRzXG52YXIgQ09SRV9MSUJSQVJZID0gW1xuICB7XG4gICAgTm90aGluZzogeyBkb21haW46IFwiTm90aGluZ1wiIH1cbiAgfSxcbiAgLy9cbiAgLy8gRGF0YSBTdHJ1Y3R1cmVzXG4gIC8vXG4gIHtcbiAgICBMaXN0OiB7XG4gICAgICBjb21wbGV4aXR5OiA4MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiTWF5YmVcIiwgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXV0sIFwiTGlzdFwiXVxuICAgICAgfVxuICAgIH0sXG4gICAgS2V5VmFsdWVQYWlyOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJBIGtleS92YWx1ZSBwYWlyXCIsXG4gICAgICBjb21wbGV4aXR5OiA4MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIlN0cmluZ1wiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICBbXCJUdXBsZVwiLCBcIlN0cmluZ1wiLCBcIkFueXRoaW5nXCJdXG4gICAgICAgIF0sXG4gICAgICAgIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IGNlLmRvbWFpbihbXCJUdXBsZVwiLCBcIlN0cmluZ1wiLCBhcmdzWzFdLmRvbWFpbl0pLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHZhbGlkYXRlQXJndW1lbnQoY2UsIGFyZ3NbMF0/LmNhbm9uaWNhbCwgXCJTdHJpbmdcIik7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzWzFdPy5jYW5vbmljYWwsIFwiVmFsdWVcIik7XG4gICAgICAgICAgcmV0dXJuIGNlLnR1cGxlKFtrZXksIHZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFNpbmdsZToge1xuICAgICAgZGVzY3JpcHRpb246IFwiQSB0dXBsZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnRcIixcbiAgICAgIGNvbXBsZXhpdHk6IDgyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkFueXRoaW5nXCIsIFtcIlR1cGxlXCIsIFwiQW55dGhpbmdcIl1dLFxuICAgICAgICBjb2RvbWFpbjogKGNlLCBhcmdzKSA9PiBjZS5kb21haW4oW1wiVHVwbGVcIiwgYXJnc1swXS5kb21haW5dKSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IGNlLnR1cGxlKHZhbGlkYXRlQXJndW1lbnRDb3VudChjZSwgY2Fub25pY2FsKG9wczIpLCAxKSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFBhaXI6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdHVwbGUgb2YgdHdvIGVsZW1lbnRzXCIsXG4gICAgICBjb21wbGV4aXR5OiA4MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIkFueXRoaW5nXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIlR1cGxlXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiXVxuICAgICAgICBdLFxuICAgICAgICBjb2RvbWFpbjogKGNlLCBhcmdzKSA9PiBjZS5kb21haW4oW1wiVHVwbGVcIiwgYXJnc1swXS5kb21haW4sIGFyZ3NbMV0uZG9tYWluXSksXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjZS50dXBsZSh2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGNhbm9uaWNhbChvcHMyKSwgMikpXG4gICAgICB9XG4gICAgfSxcbiAgICBUcmlwbGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdHVwbGUgb2YgdGhyZWUgZWxlbWVudHNcIixcbiAgICAgIGNvbXBsZXhpdHk6IDgyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXG4gICAgICAgICAgXCJGdW5jdGlvblwiLFxuICAgICAgICAgIFwiQW55dGhpbmdcIixcbiAgICAgICAgICBcIkFueXRoaW5nXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIlR1cGxlXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiLCBcIkFueXRoaW5nXCJdXG4gICAgICAgIF0sXG4gICAgICAgIGNvZG9tYWluOiAoY2UsIGFyZ3MpID0+IGNlLmRvbWFpbihbXCJUdXBsZVwiLCBhcmdzWzBdLmRvbWFpbiwgYXJnc1sxXS5kb21haW4sIGFyZ3NbMl0uZG9tYWluXSksXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjZS50dXBsZSh2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGNhbm9uaWNhbChvcHMyKSwgMykpXG4gICAgICB9XG4gICAgfSxcbiAgICBUdXBsZToge1xuICAgICAgZGVzY3JpcHRpb246IFwiQSBmaXhlZCBudW1iZXIgb2YgaGV0ZXJvZ2VuZW91cyBlbGVtZW50c1wiLFxuICAgICAgY29tcGxleGl0eTogODIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcbiAgICAgICAgICBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXSxcbiAgICAgICAgICBbXCJUdXBsZVwiLCBbXCJTZXF1ZW5jZVwiLCBcIkFueXRoaW5nXCJdXVxuICAgICAgICBdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4gY2UudHVwbGUoY2Fub25pY2FsKG9wczIpKSxcbiAgICAgICAgY29kb21haW46IChjZSwgYXJncykgPT4gY2UuZG9tYWluKFtcIlR1cGxlXCIsIC4uLmFyZ3MubWFwKCh4KSA9PiB4LmRvbWFpbildKVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy9cbiAgLy8gSW5lcnQgZnVuY3Rpb25zXG4gIC8vXG4gIHtcbiAgICBCYXNlRm9ybToge1xuICAgICAgZGVzY3JpcHRpb246IFwiYEJhc2VGb3JtKGV4cHIsIGJhc2U9MTApYFwiLFxuICAgICAgY29tcGxleGl0eTogOWUzLFxuICAgICAgaW5lcnQ6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlZhbHVlXCIsIFtcIk1heWJlXCIsIFwiSW50ZWdlclwiXSwgXCJWYWx1ZVwiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIGFyZ3MpID0+IGFyZ3NbMF0uZG9tYWluXG4gICAgICB9XG4gICAgfSxcbiAgICBEZWxpbWl0ZXI6IHtcbiAgICAgIC8vIFVzZSB0byByZXByZXNlbnQgZ3JvdXBzIG9mIGV4cHJlc3Npb25zLiBOYW1lZCBhZnRlciBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWxpbWl0ZXJcbiAgICAgIGNvbXBsZXhpdHk6IDllMyxcbiAgICAgIGhvbGQ6IFwiZmlyc3RcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcbiAgICAgICAgICBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFwiU3RyaW5nXCJdLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFwiU3RyaW5nXCJdLFxuICAgICAgICAgIFwiQW55dGhpbmdcIlxuICAgICAgICBdLFxuICAgICAgICBjb2RvbWFpbjogKF9jZSwgYXJncykgPT4gYXJnc1swXS5kb21haW4sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBhcmdzWzBdPy5jYW5vbmljYWwgPz8gY2UuYm94KFtcIlNlcXVlbmNlXCJdKVxuICAgICAgfVxuICAgIH0sXG4gICAgRXJyb3I6IHtcbiAgICAgIC8qKlxuICAgICAgICogLSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGBbXCJFcnJvckNvZGVcIl1gXG4gICAgICAgKiBleHByZXNzaW9uIGluZGljYXRpbmcgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuXG4gICAgICAgKiAtIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQsIGluZGljYXRlcyB0aGUgY29udGV4dC9sb2NhdGlvblxuICAgICAgICogb2YgdGhlIGVycm9yLiBJZiB0aGUgZXJyb3Igb2NjdXIgd2hpbGUgcGFyc2luZyBhIExhVGVYIHN0cmluZyxcbiAgICAgICAqIGZvciBleGFtcGxlLCB0aGUgYXJndW1lbnQgd2lsbCBiZSBhIGBMYXRleGAgZXhwcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgY29tcGxleGl0eTogNTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJBbnl0aGluZ1wiLCBbXCJNYXliZVwiLCBcIkFueXRoaW5nXCJdLCBcIlZvaWRcIl0sXG4gICAgICAgIC8vIFRvIG1ha2UgYSBjYW5vbmljYWwgZXhwcmVzc2lvbiwgZG9uJ3QgY2Fub25pY2FsaXplIHRoZSBhcmdzXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJFcnJvclwiLCBhcmdzKVxuICAgICAgfVxuICAgIH0sXG4gICAgRXJyb3JDb2RlOiB7XG4gICAgICBjb21wbGV4aXR5OiA1MDAsXG4gICAgICBob2xkOiBcImFsbFwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIlN0cmluZ1wiLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFtcIlNlcXVlbmNlXCIsIFwiQW55dGhpbmdcIl1dLFxuICAgICAgICAgIFwiQW55dGhpbmdcIlxuICAgICAgICBdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvZGUgPSB2YWxpZGF0ZUFyZ3VtZW50KGNlLCBhcmdzWzBdLCBcIlN0cmluZ1wiKS5zdHJpbmc7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IFwiaW5jb21wYXRpYmxlLWRvbWFpblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiRXJyb3JDb2RlXCIsIFtcbiAgICAgICAgICAgICAgY2Uuc3RyaW5nKGNvZGUpLFxuICAgICAgICAgICAgICBjZS5kb21haW4oYXJnc1sxXSA/PyBcIkFueXRoaW5nXCIpLFxuICAgICAgICAgICAgICBjZS5kb21haW4oYXJnc1syXSA/PyBcIkFueXRoaW5nXCIpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkVycm9yQ29kZVwiLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgSG9sZDoge1xuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgICAgY29kb21haW46IChjZSwgYXJncykgPT4gYXJnc1swXS5zeW1ib2wgPyBjZS5kb21haW4oXCJTeW1ib2xcIikgOiBjZS5kb21haW4oXCJBbnl0aGluZ1wiKSxcbiAgICAgICAgLy8gVG8gbWFrZSBhIGNhbm9uaWNhbCBleHByZXNzaW9uLCBkb24ndCBjYW5vbmljYWxpemUgdGhlIGFyZ3NcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGFyZ3MubGVuZ3RoICE9PSAxID8gY2UuX2ZuKFwiSG9sZFwiLCB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGFyZ3MsIDEpKSA6IGNlLl9mbihcIkhvbGRcIiwgW3ZhbGlkYXRlQXJndW1lbnQoY2UsIGFyZ3NbMF0sIFwiQW55dGhpbmdcIildKVxuICAgICAgfVxuICAgIH0sXG4gICAgSG9yaXpvbnRhbFNwYWNpbmc6IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpXG4gICAgICAgICAgICByZXR1cm4gYXJnc1swXS5jYW5vbmljYWw7XG4gICAgICAgICAgcmV0dXJuIGNlLmJveChbXCJTZXF1ZW5jZVwiXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFN0eWxlOiB7XG4gICAgICBjb21wbGV4aXR5OiA5ZTMsXG4gICAgICBpbmVydDogdHJ1ZSxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcbiAgICAgICAgICBcIkZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJBbnl0aGluZ1wiLFxuICAgICAgICAgIFtcIk1heWJlXCIsIFwiRGljdGlvbmFyeVwiXSxcbiAgICAgICAgICAvLyBAdG9kb1xuICAgICAgICAgIFwiQW55dGhpbmdcIlxuICAgICAgICBdXG4gICAgICB9XG4gICAgICAvLyBAdG9kbzogc2ltcGxpZnk6IG1lcmdlIFN0eWxlKFN0eWxlKHgsIHMxKSwgczIpLCAgU3R5bGUoeCkgLT4geFxuICAgIH1cbiAgfSxcbiAge1xuICAgIEFwcGx5OiB7XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBcIkZ1bmN0aW9uXCIsXG4gICAgICAgIGV2YWx1YXRlOiAoX2NlLCBvcHMyKSA9PiBhcHBseShvcHMyWzBdLCBvcHMyLnNsaWNlKDEpKVxuICAgICAgfVxuICAgIH0sXG4gICAgQWJvdXQ6IHsgc2lnbmF0dXJlOiB7IGRvbWFpbjogXCJGdW5jdGlvblwiIH0gfSxcbiAgICBCbG9jazoge1xuICAgICAgLyoqIENyZWF0ZSBhIGxvY2FsIHNjb3BlLiBGaXJzdCBhcmd1bWVudCBpcyBhIGRpY3Rpb25hcnkgb2YgbG9jYWwgdmFyaWFibGVzLlxuICAgICAgICogVGhleSBhcmUgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgc2NvcGUuIFRoZSBzZWNvbmQgYXJndW1lbnRcbiAgICAgICAqIGlzIGFuIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgc2NvcGUuXG4gICAgICAgKiBbXCJCbG9ja1wiLCBbXCJMaXN0XCIsIFtcIkVxdWFsXCIsIFwieFwiLCAxXV0sIFsuLi5dXVxuICAgICAgICovXG4gICAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIkZ1bmN0aW9uXCIgfVxuICAgIH0sXG4gICAgRGVyaXZhdGl2ZToge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJGdW5jdGlvblwiLCBbXCJNYXliZVwiLCBcIk51bWJlclwiXSwgXCJGdW5jdGlvblwiXVxuICAgICAgfVxuICAgIH0sXG4gICAgRG9tYWluOiB7XG4gICAgICAvKiogUmV0dXJuIHRoZSBkb21haW4gb2YgYW4gZXhwcmVzc2lvbiAqL1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJBbnl0aGluZ1wiLCBcIkRvbWFpblwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IGNlLmRvbWFpbih2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGNhbm9uaWNhbChvcHMyKSwgMSlbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBFdmFsdWF0ZToge1xuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIGFyZ3MpID0+IGFyZ3NbMF0uZG9tYWluLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4gY2UuX2ZuKFwiRXZhbHVhdGVcIiwgdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBjYW5vbmljYWwob3BzMiksIDEpKSxcbiAgICAgICAgZXZhbHVhdGU6IChfY2UsIG9wczIpID0+IG9wczJbMF0uZXZhbHVhdGUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgSGVhZDoge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogXCJGdW5jdGlvblwiLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3AxMiA9IG9wczJbMF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcDEyPy5oZWFkID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChvcDEyLmhlYWQpO1xuICAgICAgICAgIHJldHVybiBvcDEyPy5oZWFkID8/IGNlLnN5bWJvbChcIk5vdGhpbmdcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEh0bWw6IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiVmFsdWVcIiwgXCJTdHJpbmdcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKFwiXCIpO1xuICAgICAgICAgIHJldHVybiBjZS5zdHJpbmcoXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIExhbWJkYToge1xuICAgICAgd2lraWRhdGE6IFwiUTU2NzYxMlwiLFxuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiQW55dGhpbmdcIiwgXCJGdW5jdGlvblwiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIG9wczIpID0+IG9wczJbMF0uZG9tYWluLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4gY2UuX2ZuKFwiTGFtYmRhXCIsIHZhbGlkYXRlQXJndW1lbnRDb3VudChjZSwgb3BzMiwgMSkpXG4gICAgICB9XG4gICAgfSxcbiAgICBTaWduYXR1cmVzOiB7XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlN5bWJvbFwiLCBbXCJNYXliZVwiLCBbXCJMaXN0XCIsIFwiRG9tYWluXCJdXV0sXG4gICAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgb3BzMiA9IHZhbGlkYXRlQXJndW1lbnRDb3VudChjZSwgb3BzMiwgMSk7XG4gICAgICAgICAgaWYgKCFvcHMyWzBdLnN5bWJvbClcbiAgICAgICAgICAgIHJldHVybiBjZS5fZm4oXCJTaWduYXR1cmVzXCIsIFtcbiAgICAgICAgICAgICAgY2UuZXJyb3IoXG4gICAgICAgICAgICAgICAgW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIlN5bWJvbFwiLCBvcHMyWzBdLmRvbWFpbl0sXG4gICAgICAgICAgICAgICAgb3BzMlswXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU2lnbmF0dXJlc1wiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBvcHMyWzBdLnN5bWJvbDtcbiAgICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiTm90aGluZ1wiKTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjZS5sb29rdXBGdW5jdGlvbihuYW1lKTtcbiAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIkxpc3RcIiwgW3Jlc3VsdC5zaWduYXR1cmUuZG9tYWluXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFN1YnNjcmlwdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYFN1YnNjcmlwdGAgZnVuY3Rpb24gY2FuIHRha2Ugc2V2ZXJhbCBmb3JtczpcbiAgICAgICAqXG4gICAgICAgKiBJZiBgb3AxYCBpcyBhIHN0cmluZywgdGhlIHN0cmluZyBpcyBpbnRlcnByZXRlZCBhcyBhIG51bWJlciBpblxuICAgICAgICogYmFzZSBgb3AyYCAoMiB0byAzNikuXG4gICAgICAgKlxuICAgICAgICogSWYgYG9wMWAgaXMgYW4gaW5kZXhhYmxlIGNvbGxlY3Rpb24sIGB4YDpcbiAgICAgICAqIC0gYHhfKmAgLT4gYEF0KHgsICopYFxuICAgICAgICpcbiAgICAgICAqIE90aGVyd2lzZTpcbiAgICAgICAqIC0gYHhfMGAgLT4gU3ltYm9sIFwieF8wXCJcbiAgICAgICAqIC0gYHhfbmAgLT4gU3ltYm9sIFwieF9uXCJcbiAgICAgICAqIC0gYHhfe1xcdGV4dHttYXh9fWAgLT4gU3ltYm9sIGB4X21heGBcbiAgICAgICAqIC0gYHhfeyhuKzEpfWAgLT4gYEF0KHgsIG4rMSlgXG4gICAgICAgKiAtIGB4X3tuKzF9YCAtPiAgYFN1YnNjcmlwdCh4LCBuKzEpYFxuICAgICAgICovXG4gICAgICAvLyBUaGUgbGFzdCAoc3Vic2NyaXB0KSBhcmd1bWVudCBjYW4gaW5jbHVkZSBhIGRlbGltaXRlciB0aGF0XG4gICAgICAvLyBuZWVkcyB0byBiZSBpbnRlcnByZXRlZC4gV2l0aG91dCB0aGUgaG9sZCwgaXQgd291bGQgZ2V0XG4gICAgICAvLyByZW1vdmVkIGR1cmluZyBjYW5vbmljYWxpemF0aW9uLlxuICAgICAgaG9sZDogXCJsYXN0XCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkFueXRoaW5nXCIsIFwiQW55dGhpbmdcIiwgXCJBbnl0aGluZ1wiXSxcbiAgICAgICAgY29kb21haW46IChfY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBpZiAoYXJnc1swXS5pc0Z1bmN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGFyZ3NbMF0uZG9tYWluO1xuICAgICAgICAgIHJldHVybiBhcmdzWzBdLmRvbWFpbjtcbiAgICAgICAgfSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDEyID0gYXJnc1swXTtcbiAgICAgICAgICBjb25zdCBvcDIyID0gYXJnc1sxXTtcbiAgICAgICAgICBpZiAob3AxMi5zdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBhc1NtYWxsSW50ZWdlcihvcDIyKTtcbiAgICAgICAgICAgIGlmIChiYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmIChiYXNlID4gMSAmJiBiYXNlIDw9IDM2KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3ZhbHVlLCByZXN0XSA9IGZyb21EaWdpdHMob3AxMi5zdHJpbmcsIGJhc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN0KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY2UuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFtcInVuZXhwZWN0ZWQtZGlnaXRcIiwgeyBzdHI6IHJlc3RbMF0gfV0sXG4gICAgICAgICAgICAgICAgICAgIFtcIkxhdGV4XCIsIGNlLnN0cmluZyhvcDEyLnN0cmluZyldXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3AxMi5zeW1ib2wpIHtcbiAgICAgICAgICAgIGlmIChvcDEyLnN5bWJvbERlZmluaXRpb24/LmF0KVxuICAgICAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiQXRcIiwgW29wMTIsIG9wMjIuY2Fub25pY2FsXSk7XG4gICAgICAgICAgICBjb25zdCBzdWIyID0gb3AyMi5zdHJpbmcgPz8gb3AyMi5zeW1ib2wgPz8gYXNTbWFsbEludGVnZXIob3AyMik/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoc3ViMilcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChvcDEyLnN5bWJvbCArIFwiX1wiICsgc3ViMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcDIyLmhlYWQgPT09IFwiU2VxdWVuY2VcIilcbiAgICAgICAgICAgIGNlLl9mbihcIlN1YnNjcmlwdFwiLCBbb3AxMiwgY2UuX2ZuKFwiTGlzdFwiLCBvcDIyLm9wcyldKTtcbiAgICAgICAgICByZXR1cm4gY2UuX2ZuKFwiU3Vic2NyaXB0XCIsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTeW1ib2w6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDUwMCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnN0cnVjdCBhIG5ldyBzeW1ib2wgd2l0aCBhIG5hbWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGFyZ3VtZW50c1wiLFxuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIkFueXRoaW5nXCJdLCBcIkFueXRoaW5nXCJdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICAgICAgICAgIGNvbnN0IGFyZyA9IG9wczIubWFwKFxuICAgICAgICAgICAgKHgpID0+IHguc3ltYm9sID8/IHguc3RyaW5nID8/IGFzU21hbGxJbnRlZ2VyKHgpPy50b1N0cmluZygpID8/IFwiXCJcbiAgICAgICAgICApLmpvaW4oXCJcIik7XG4gICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChhcmcpO1xuICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJOb3RoaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGEgYFtcIlN5bWJvbFwiXWAgZXhwcmVzc2lvbiBpcyBuZXZlciBldmFsdWF0ZWQsIGl0IGdldHNcbiAgICAgICAgLy8gdHJhbnNmb3JtZWQgaW50byBzb21ldGhpbmcgZWxzZSAoYSBzeW1ib2wpIGR1cmluZyBjYW5vbmljYWxpemF0aW9uXG4gICAgICB9XG4gICAgfSxcbiAgICBUYWlsOiB7XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlZhbHVlXCIsIFtcIkxpc3RcIiwgXCJWYWx1ZVwiXV0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IG9wczJbMF0gPyBjZS5fZm4oXCJMaXN0XCIsIG9wczJbMF0ub3BzID8/IFtdKSA6IGNlLl9mbihcIkxpc3RcIiwgW10pXG4gICAgICB9XG4gICAgfSxcbiAgICBUaW1pbmc6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImBUaW1pbmcoZXhwcilgIGV2YWx1YXRlcyBgZXhwcmAgYW5kIHJldHVybiBhIGBQYWlyYCBvZiB0aGUgbnVtYmVyIG9mIHNlY29uZCBlbGFwc2VkIGZvciB0aGUgZXZhbHVhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZXZhbHVhdGlvblwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1xuICAgICAgICAgIFwiRnVuY3Rpb25cIixcbiAgICAgICAgICBcIlZhbHVlXCIsXG4gICAgICAgICAgW1wiTWF5YmVcIiwgXCJJbnRlZ2VyXCJdLFxuICAgICAgICAgIFtcIlR1cGxlXCIsIFwiVmFsdWVcIiwgXCJOdW1iZXJcIl1cbiAgICAgICAgXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyWzFdLnN5bWJvbCA9PT0gXCJOb3RoaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDIgPSBvcHMyWzBdLmV2YWx1YXRlKCk7XG4gICAgICAgICAgICBjb25zdCB0aW1pbmcgPSAxZTMgKiAoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcbiAgICAgICAgICAgIHJldHVybiBjZS5wYWlyKGNlLm51bWJlcih0aW1pbmcpLCByZXN1bHQyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IG4gPSBNYXRoLm1heCgzLCBNYXRoLnJvdW5kKGFzU21hbGxJbnRlZ2VyKG9wczJbMV0pID8/IDMpKTtcbiAgICAgICAgICBsZXQgdGltaW5ncyA9IFtdO1xuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgd2hpbGUgKG4gPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICByZXN1bHQgPSBvcHMyWzBdLmV2YWx1YXRlKCk7XG4gICAgICAgICAgICB0aW1pbmdzLnB1c2goMWUzICogKGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCkpO1xuICAgICAgICAgICAgbiAtPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtYXgyID0gTWF0aC5tYXgoLi4udGltaW5ncyk7XG4gICAgICAgICAgY29uc3QgbWluMiA9IE1hdGgubWluKC4uLnRpbWluZ3MpO1xuICAgICAgICAgIHRpbWluZ3MgPSB0aW1pbmdzLmZpbHRlcigoeCkgPT4geCA+IG1pbjIgJiYgeCA8IG1heDIpO1xuICAgICAgICAgIGNvbnN0IHN1bTIgPSB0aW1pbmdzLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgKyB2LCAwKTtcbiAgICAgICAgICBpZiAoc3VtMiA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5wYWlyKGNlLm51bWJlcihtYXgyKSwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gY2UucGFpcihjZS5udW1iZXIoc3VtMiAvIHRpbWluZ3MubGVuZ3RoKSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB7bmFtZTogJ1BhdHRlcm4nLH0sXG4gIH0sXG4gIC8vXG4gIC8vIFN0cmluZy1yZWxhdGVkXG4gIC8vXG4gIHtcbiAgICBGcm9tRGlnaXRzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogYFxcYEZyb21EaWdpdHMocywgYmFzZT0xMClcXGAgICAgICAgcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cmluZyBcXGBzXFxgIGluIGJhc2UgXFxgYmFzZVxcYC5gLFxuICAgICAgLy8gQHRvZG8gY291bGQgYWNjZXB0IGAweGNhZmVgLCBgMGIwMTAxMGAgb3IgYChkZWFkYmVlZilfMTZgIGFzIHN0cmluZyBmb3JtYXRzXG4gICAgICAvLyBAdG9kbyBjb3VsZCBhY2NlcHQgXCJyb21hblwiLi4uIGFzIGJhc2VcbiAgICAgIC8vIEB0b2RvIGNvdWxkIGFjY2VwdCBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgYXMgdGhlIChwYWRkZWQpIGxlbmd0aCBvZiB0aGUgb3V0cHV0XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlN0cmluZ1wiLCBbXCJNYXliZVwiLCBbXCJSYW5nZVwiLCAxLCAzNl1dLCBcIkludGVnZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCBvcDEyID0gb3BzMlswXTtcbiAgICAgICAgICBpZiAoIW9wMTIuc3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGNlLmVycm9yKFtcImluY29tcGF0aWJsZS1kb21haW5cIiwgXCJTdHJpbmdcIiwgb3AxMi5kb21haW5dLCBvcDEyKTtcbiAgICAgICAgICBjb25zdCBvcDIyID0gb3BzMlsxXTtcbiAgICAgICAgICBpZiAob3AyMi5pc05vdGhpbmcpXG4gICAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKE51bWJlci5wYXJzZUludChvcDEyLnN0cmluZywgMTApKTtcbiAgICAgICAgICBpZiAob3AyMi5udW1lcmljVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBjZS5lcnJvcihbXCJ1bmV4cGVjdGVkLWJhc2VcIiwgb3AyMi5sYXRleF0sIG9wMjIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXNlID0gYXNGbG9hdChvcDIyKTtcbiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYmFzZSkgfHwgYmFzZSA8IDIgfHwgYmFzZSA+IDM2KVxuICAgICAgICAgICAgcmV0dXJuIGNlLmVycm9yKFtcInVuZXhwZWN0ZWQtYmFzZVwiLCBiYXNlXSwgb3AyMik7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCByZXN0XSA9IGZyb21EaWdpdHMob3AxMi5zdHJpbmcsIGJhc2UpO1xuICAgICAgICAgIGlmIChyZXN0KVxuICAgICAgICAgICAgcmV0dXJuIGNlLmVycm9yKFtcInVuZXhwZWN0ZWQtZGlnaXRcIiwgeyBzdHI6IHJlc3RbMF0gfV0sIHtcbiAgICAgICAgICAgICAgc3RyOiByZXN0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgSW50ZWdlclN0cmluZzoge1xuICAgICAgZGVzY3JpcHRpb246IGBcXGBJbnRlZ2VyU3RyaW5nKG4sIGJhc2U9MTApXFxgICAgICAgIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50ZWdlciBcXGBuXFxgIGluIGJhc2UgXFxgYmFzZVxcYC5gLFxuICAgICAgLy8gQHRvZG8gY291bGQgYWNjZXB0IGAweGNhZmVgLCBgMGIwMTAxMGAgb3IgYChkZWFkYmVlZilfMTZgIGFzIHN0cmluZyBmb3JtYXRzXG4gICAgICAvLyBAdG9kbyBjb3VsZCBhY2NlcHQgXCJyb21hblwiLi4uIGFzIGJhc2VcbiAgICAgIC8vIEB0b2RvIGNvdWxkIGFjY2VwdCBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgYXMgdGhlIChwYWRkZWQpIGxlbmd0aCBvZiB0aGUgb3V0cHV0XG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkludGVnZXJcIiwgW1wiTWF5YmVcIiwgXCJJbnRlZ2VyXCJdLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wMTIgPSBvcHMyWzBdO1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGFzRmxvYXQob3AxMikgPz8gTmFOO1xuICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsKSB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UuZXJyb3IoXG4gICAgICAgICAgICAgIFtcImluY29tcGF0aWJsZS1kb21haW5cIiwgXCJJbnRlZ2VyXCIsIG9wMTIuZG9tYWluXSxcbiAgICAgICAgICAgICAgb3AxMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb3AyMiA9IG9wczJbMV07XG4gICAgICAgICAgaWYgKG9wMjIuaXNOb3RoaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBvcDFOdW0gPSBvcDEyLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3AxTnVtID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKE1hdGguYWJzKG9wMU51bSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAob3AxTnVtIGluc3RhbmNlb2YgZGVjaW1hbF9kZWZhdWx0KVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKG9wMU51bS5hYnMoKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIHJldHVybiBjZS5zdHJpbmcoXG4gICAgICAgICAgICAgIE1hdGguYWJzKE1hdGgucm91bmQoYXNGbG9hdChvcDEyKSA/PyBOYU4pKS50b1N0cmluZygpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYXNTbWFsbEludGVnZXIob3AyMikgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBjZS5lcnJvcihcbiAgICAgICAgICAgICAgW1wiaW5jb21wYXRpYmxlLWRvbWFpblwiLCBcIkludGVnZXJcIiwgb3AyMi5kb21haW5dLFxuICAgICAgICAgICAgICBvcDIyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXNlID0gYXNTbWFsbEludGVnZXIob3AyMik7XG4gICAgICAgICAgaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNilcbiAgICAgICAgICAgIHJldHVybiBjZS5lcnJvcihbXCJvdXQtb2YtcmFuZ2VcIiwgMiwgMzYsIGJhc2VdLCBvcDIyKTtcbiAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKE1hdGguYWJzKHZhbCkudG9TdHJpbmcoYmFzZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTdHJpbmc6IHtcbiAgICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJNYXliZVwiLCBcIkFueXRoaW5nXCJdLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5zdHJpbmcoXCJcIik7XG4gICAgICAgICAgcmV0dXJuIGNlLnN0cmluZyhvcHMyLm1hcCgoeCkgPT4geC5zdHJpbmcgPz8geC50b1N0cmluZygpKS5qb2luKFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy9cbiAgLy8gTGFUZVgtcmVsYXRlZFxuICAvL1xuICB7XG4gICAgLy8gSm9pbiBvciBtb3JlIExhdGV4VG9rZW5zIGludG8gYSBMYVRlWCBzdHJpbmdcbiAgICBKb2luTGF0ZXhUb2tlbnM6IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFtcIlNlcXVlbmNlXCIsIFwiQW55dGhpbmdcIl1dLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIHJldHVybiBjZS5mbihcIkxhdGV4XCIsIFtcbiAgICAgICAgICAgIGNlLnN0cmluZyh0b2tlbnNUb1N0cmluZyhvcHMyLm1hcCgoeCkgPT4geC5zdHJpbmcgPz8geC5sYXRleCkpKVxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBWYWx1ZSBwcmVzZXJ2aW5nIHR5cGUgY29udmVyc2lvbi90YWcgaW5kaWNhdGluZyB0aGUgc3RyaW5nXG4gICAgLy8gaXMgYSBMYVRlWCBzdHJpbmdcbiAgICBMYXRleDoge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiTWF5YmVcIiwgW1wiU2VxdWVuY2VcIiwgXCJBbnl0aGluZ1wiXV0sIFwiU3RyaW5nXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLnN0cmluZyhcIlwiKTtcbiAgICAgICAgICByZXR1cm4gY2Uuc3RyaW5nKGpvaW5MYXRleChvcHMyLm1hcCgoeCkgPT4geC5zdHJpbmcgPz8geC50b1N0cmluZygpKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBTZXJpYWxpemUgb25lIG9yIG1vcmUgZXhwcmVzc2lvbnMgdG8gTGFUZVhcbiAgICBTZXJpYWxpemVMYXRleDoge1xuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFtcIlNlcXVlbmNlXCIsIFwiQW55dGhpbmdcIl1dLCBcIlN0cmluZ1wiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gY2UuZm4oXCJMYXRleFwiLCBbY2Uuc3RyaW5nKGpvaW5MYXRleChvcHMyLm1hcCgoeCkgPT4geC5sYXRleCkpKV0pXG4gICAgICB9XG4gICAgfSxcbiAgICBTcGxpdEFzTGF0ZXhUb2tlbnM6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNwbGl0IGEgTGFUZVggc3RyaW5nIGludG8gYSBsaXN0IG9mIExhVGVYIHRva2Vuc1wiLFxuICAgICAgaG9sZDogXCJhbGxcIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFwiQW55dGhpbmdcIl0sIFtcIkxpc3RcIiwgXCJTdHJpbmdcIl1dLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkxpc3RcIiwgW10pO1xuICAgICAgICAgIGxldCBsYXRleCA9IFwiXCI7XG4gICAgICAgICAgaWYgKG9wczJbMF0uaGVhZCA9PT0gXCJMYXRleFwiKVxuICAgICAgICAgICAgbGF0ZXggPSBvcHMyWzBdLm9wMS5zdHJpbmcgPz8gXCJcIjtcbiAgICAgICAgICBlbHNlIGlmIChvcHMyWzBdLmhlYWQgPT09IFwiTGF0ZXhTdHJpbmdcIilcbiAgICAgICAgICAgIGxhdGV4ID0gam9pbkxhdGV4KG9wczJbMF0ub3BzLm1hcCgob3AzKSA9PiBvcDMubGF0ZXgpKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsYXRleCA9IG9wczJbMF0ubGF0ZXg7XG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcbiAgICAgICAgICAgIFwiTGlzdFwiLFxuICAgICAgICAgICAgdG9rZW5pemUobGF0ZXgsIFtdKS5tYXAoKHgpID0+IGNlLnN0cmluZyh4KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBQYXJzZUxhdGV4OiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJQYXJzZSBhIExhVGVYIHN0cmluZyBhbmQgZXZhbHVhdGUgdG8gYSBjb3JyZXNwb25kaW5nIGV4cHJlc3Npb25cIixcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIk1heWJlXCIsIFwiU3RyaW5nXCJdLCBcIkFueXRoaW5nXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgaWYgKG9wczIubGVuZ3RoID09PSAwIHx8ICFvcHMyWzBdLnN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjZS5ib3goW1wiU2VxdWVuY2VcIl0pO1xuICAgICAgICAgIHJldHVybiBjZS5wYXJzZShvcHMyWzBdLnN0cmluZykgPz8gY2UuYm94KFtcIlNlcXVlbmNlXCJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAge1xuICAgIFJhbmRvbUV4cHJlc3Npb246IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgX29wcykgPT4gY2UuYm94KHJhbmRvbUV4cHJlc3Npb24oKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbl07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L2xvZ2ljLnRzXG52YXIgTE9HSUNfTElCUkFSWSA9IHtcbiAgVHJ1ZTogeyB3aWtpZGF0YTogXCJRMTY3NTE3OTNcIiwgZG9tYWluOiBcIkJvb2xlYW5cIiwgY29uc3RhbnQ6IHRydWUgfSxcbiAgRmFsc2U6IHtcbiAgICB3aWtpZGF0YTogXCJRNTQzMjYxOVwiLFxuICAgIGRvbWFpbjogXCJCb29sZWFuXCIsXG4gICAgY29uc3RhbnQ6IHRydWVcbiAgfSxcbiAgTWF5YmU6IHtcbiAgICB3aWtpZGF0YTogXCJRNzgxNTQ2XCIsXG4gICAgZG9tYWluOiBcIk1heWJlQm9vbGVhblwiLFxuICAgIGNvbnN0YW50OiB0cnVlXG4gIH0sXG4gIC8vIEB0b2RvOiBzcGVjaWZ5IGEgYGNhbm9uaWNhbGAgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBib29sZWFuXG4gIC8vIGV4cHJlc3Npb25zIGludG8gQ05GIChDb25qdW5jdGl2ZSBOb3JtYWwgRm9ybSlcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uanVuY3RpdmVfbm9ybWFsX2Zvcm1cbiAgLy8gdXNpbmcgcnVsZXMgKHdpdGggYSBydWxlIHNldCB0aGF0J3Mga2luZGEgdGhlIGludmVyc2Ugb2YgdGhlXG4gIC8vIGxvZ2ljIHJ1bGVzIGZvciBzaW1wbGlmeSlcbiAgQW5kOiB7XG4gICAgd2lraWRhdGE6IFwiUTE5MTA4MVwiLFxuICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgYXNzb2NpYXRpdmU6IHRydWUsXG4gICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICBjb21wbGV4aXR5OiAxZTQsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiTG9naWNPcGVyYXRvclwiLFxuICAgICAgc2ltcGxpZnk6IHByb2Nlc3NBbmQsXG4gICAgICBldmFsdWF0ZTogcHJvY2Vzc0FuZFxuICAgIH1cbiAgfSxcbiAgT3I6IHtcbiAgICB3aWtpZGF0YTogXCJRMTY1MTcwNFwiLFxuICAgIHRocmVhZGFibGU6IHRydWUsXG4gICAgYXNzb2NpYXRpdmU6IHRydWUsXG4gICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICBjb21wbGV4aXR5OiAxZTQsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiTG9naWNPcGVyYXRvclwiLFxuICAgICAgc2ltcGxpZnk6IHByb2Nlc3NPcixcbiAgICAgIGV2YWx1YXRlOiBwcm9jZXNzT3JcbiAgICB9XG4gIH0sXG4gIE5vdDoge1xuICAgIHdpa2lkYXRhOiBcIlExOTA1NThcIixcbiAgICBpbnZvbHV0aW9uOiB0cnVlLFxuICAgIGNvbXBsZXhpdHk6IDEwMTAwLFxuICAgIC8vIEB0b2RvOiB0aGlzIG1heSBub3QgYmUgbmVlZGVkLCBzaW5jZSB3ZSBhbHNvIGhhdmUgcnVsZXMuXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiTG9naWNPcGVyYXRvclwiLFxuICAgICAgc2ltcGxpZnk6IHByb2Nlc3NOb3QsXG4gICAgICBldmFsdWF0ZTogcHJvY2Vzc05vdFxuICAgIH1cbiAgfSxcbiAgRXF1aXZhbGVudDoge1xuICAgIHdpa2lkYXRhOiBcIlEyMjA0MzNcIixcbiAgICBjb21wbGV4aXR5OiAxMDIwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJMb2dpY09wZXJhdG9yXCIsXG4gICAgICBzaW1wbGlmeTogcHJvY2Vzc0VxdWl2YWxlbnQsXG4gICAgICBldmFsdWF0ZTogcHJvY2Vzc0VxdWl2YWxlbnRcbiAgICB9XG4gIH0sXG4gIEltcGxpZXM6IHtcbiAgICB3aWtpZGF0YTogXCJRNzg4MTIyOVwiLFxuICAgIGNvbXBsZXhpdHk6IDEwMjAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIkxvZ2ljT3BlcmF0b3JcIixcbiAgICAgIHNpbXBsaWZ5OiBwcm9jZXNzSW1wbGllcyxcbiAgICAgIGV2YWx1YXRlOiBwcm9jZXNzSW1wbGllc1xuICAgIH1cbiAgfSxcbiAgRXhpc3RzOiB7IHNpZ25hdHVyZTogeyBkb21haW46IFwiTWF5YmVCb29sZWFuXCIgfSB9LFxuICBJZjoge1xuICAgIGhvbGQ6IFwicmVzdFwiLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIkZ1bmN0aW9uXCIsXG4gICAgICBjb2RvbWFpbjogKGNlLCBvcHMyKSA9PiBjZS5kb21haW4oW1wiVW5pb25cIiwgb3BzMlswXSwgb3BzMlsxXV0pLFxuICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICBjb25zdCBjb25kID0gb3BzMlswXTtcbiAgICAgICAgaWYgKGNvbmQgJiYgY29uZC5zeW1ib2wgPT09IFwiVHJ1ZVwiKVxuICAgICAgICAgIHJldHVybiBvcHMyWzFdID8gb3BzMlsxXS5zaW1wbGlmeSgpIDogY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG9wczJbMl0gPyBvcHMyWzJdLnNpbXBsaWZ5KCkgOiBjZS5ib3goXCJOb3RoaW5nXCIpO1xuICAgICAgfSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgY29uc3QgY29uZCA9IG9wczJbMF07XG4gICAgICAgIGlmIChjb25kICYmIGNvbmQuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICAgICAgICByZXR1cm4gb3BzMlsxXSA/IG9wczJbMV0uZXZhbHVhdGUoKSA6IGNlLmJveChcIk5vdGhpbmdcIik7XG4gICAgICAgIHJldHVybiBvcHMyWzJdID8gb3BzMlsyXS5ldmFsdWF0ZSgpIDogY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgIH0sXG4gICAgICAvLyBAdG9kbzogcHJvYmFibHkgZG9uJ3QgbmVlZCBhIE4oKSBoYW5kbGVyLiBEb2Vzbid0IG1ha2UgYSBkaWZmZXJlbmNlXG4gICAgICAvLyBmb3IgdGhlIGV2YWx1YXRpb24gb2YgYm9vbGVhbnMuIEFsc28sIGRvbid0IG5lZWQgdG8gY2FsbCBOKCkgb24gdGhlXG4gICAgICAvLyBhcmd1bWVudHMsIHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgZG9uZSB0aGF0LiBTYW1lIGZvciBldmFsdWF0ZSgpXG4gICAgICAvLyBhbmQgc2ltcGxpZnkoKSBhYm92ZVxuICAgICAgTjogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmQgPSBvcHMyWzBdO1xuICAgICAgICBpZiAoY29uZCAmJiBjb25kLnN5bWJvbCA9PT0gXCJUcnVlXCIpXG4gICAgICAgICAgcmV0dXJuIG9wczJbMV0gPyBvcHMyWzFdLk4oKSA6IGNlLmJveChcIk5vdGhpbmdcIik7XG4gICAgICAgIHJldHVybiBvcHMyWzJdID8gb3BzMlsyXS5OKCkgOiBjZS5ib3goXCJOb3RoaW5nXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTG9vcDoge1xuICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IG9wczJbMF0/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFwiTm90aGluZ1wiKSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IG9wczJbMF0gPz8gY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgICAgaWYgKGJvZHkuaXNOb3RoaW5nKVxuICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICByZXN1bHQgPSBib2R5LmV2YWx1YXRlKCk7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICB9IHdoaWxlIChyZXN1bHQuaGVhZCAhPT0gXCJSZXR1cm5cIiAmJiBpIDwgY2UuaXRlcmF0aW9uTGltaXQpO1xuICAgICAgICBpZiAocmVzdWx0LmhlYWQgPT09IFwiUmV0dXJuXCIpXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5vcDE7XG4gICAgICAgIHJldHVybiBjZS5lcnJvcihcIml0ZXJhdGlvbi1saW1pdC1leGNlZWRlZFwiKTtcbiAgICAgIH0sXG4gICAgICBOOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgY29uc3QgY29uZCA9IG9wczJbMF07XG4gICAgICAgIGlmIChjb25kICYmIGNvbmQuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICAgICAgICByZXR1cm4gb3BzMlsxXSA/IG9wczJbMV0uTigpIDogY2UuYm94KFwiTm90aGluZ1wiKTtcbiAgICAgICAgcmV0dXJuIG9wczJbMl0gPyBvcHMyWzJdLk4oKSA6IGNlLmJveChcIk5vdGhpbmdcIik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBXaGljaDoge1xuICAgIGhvbGQ6IFwiYWxsXCIsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiRnVuY3Rpb25cIixcbiAgICAgIGNvZG9tYWluOiAoY2UsIG9wczIpID0+IGRvbWFpbldoaWNoKGNlLCBvcHMyKSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHdoaWNoRXZhbHVhdGUoY2UsIG9wczIsIFwiZXZhbHVhdGVcIiksXG4gICAgICBOOiAoY2UsIG9wczIpID0+IHdoaWNoRXZhbHVhdGUoY2UsIG9wczIsIFwiTlwiKVxuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIHByb2Nlc3NBbmQoY2UsIGFyZ3MpIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICBjb25zdCBvcHMyID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoYXJnLnN5bWJvbCA9PT0gXCJGYWxzZVwiKVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICAgIGlmIChhcmcuc3ltYm9sICE9PSBcIlRydWVcIikge1xuICAgICAgbGV0IGR1cGxpY2F0ZSA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCB4IG9mIG9wczIpIHtcbiAgICAgICAgaWYgKHguaXNTYW1lKGFyZykpIHtcbiAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZy5oZWFkID09PSBcIk5vdFwiICYmIGFyZy5vcDEuaXNTYW1lKHgpIHx8IHguaGVhZCA9PT0gXCJOb3RcIiAmJiB4Lm9wMS5pc1NhbWUoYXJnKSkge1xuICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkdXBsaWNhdGUpXG4gICAgICAgIG9wczIucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gb3BzMlswXTtcbiAgcmV0dXJuIGNlLl9mbihcIkFuZFwiLCBvcHMyKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NPcihjZSwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGNvbnN0IG9wczIgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmIChhcmcuc3ltYm9sID09PSBcIlRydWVcIilcbiAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgIGlmIChhcmcuc3ltYm9sICE9PSBcIkZhbHNlXCIpIHtcbiAgICAgIGxldCBkdXBsaWNhdGUgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgeCBvZiBvcHMyKSB7XG4gICAgICAgIGlmICh4LmlzU2FtZShhcmcpKSB7XG4gICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhcmcuaGVhZCA9PT0gXCJOb3RcIiAmJiBhcmcub3AxLmlzU2FtZSh4KSB8fCB4LmhlYWQgPT09IFwiTm90XCIgJiYgeC5vcDEuaXNTYW1lKGFyZykpIHtcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFkdXBsaWNhdGUpXG4gICAgICAgIG9wczIucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuICBpZiAob3BzMi5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gb3BzMlswXTtcbiAgcmV0dXJuIGNlLl9mbihcIk9yXCIsIG9wczIpO1xufVxuZnVuY3Rpb24gcHJvY2Vzc05vdChjZSwgYXJncykge1xuICBjb25zdCBvcDEyID0gYXJnc1swXS5zeW1ib2w7XG4gIGlmIChvcDEyID09PSBcIlRydWVcIilcbiAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gIGlmIChvcDEyID09PSBcIkZhbHNlXCIpXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gIGlmIChvcDEyID09PSBcIk1heWJlXCIpXG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIk1heWJlXCIpO1xuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gcHJvY2Vzc0VxdWl2YWxlbnQoY2UsIGFyZ3MpIHtcbiAgY29uc3QgbGhzID0gYXJnc1swXS5zeW1ib2w7XG4gIGNvbnN0IHJocyA9IGFyZ3NbMV0uc3ltYm9sO1xuICBpZiAobGhzID09PSBcIlRydWVcIiAmJiByaHMgPT09IFwiVHJ1ZVwiIHx8IGxocyA9PT0gXCJGYWxzZVwiICYmIHJocyA9PT0gXCJGYWxzZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICBpZiAobGhzID09PSBcIlRydWVcIiAmJiByaHMgPT09IFwiRmFsc2VcIiB8fCBsaHMgPT09IFwiRmFsc2VcIiAmJiByaHMgPT09IFwiVHJ1ZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgaWYgKGxocyA9PT0gXCJNYXliZVwiIHx8IHJocyA9PT0gXCJNYXliZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJNYXliZVwiKTtcbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NJbXBsaWVzKGNlLCBhcmdzKSB7XG4gIGNvbnN0IGxocyA9IGFyZ3NbMF0uc3ltYm9sO1xuICBjb25zdCByaHMgPSBhcmdzWzFdLnN5bWJvbDtcbiAgaWYgKGxocyA9PT0gXCJUcnVlXCIgJiYgcmhzID09PSBcIlRydWVcIiB8fCBsaHMgPT09IFwiRmFsc2VcIiAmJiByaHMgPT09IFwiRmFsc2VcIiB8fCBsaHMgPT09IFwiRmFsc2VcIiAmJiByaHMgPT09IFwiVHJ1ZVwiKVxuICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICBpZiAobGhzID09PSBcIlRydWVcIiAmJiByaHMgPT09IFwiRmFsc2VcIilcbiAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gIGlmIChsaHMgPT09IFwiTWF5YmVcIiB8fCByaHMgPT09IFwiTWF5YmVcIilcbiAgICByZXR1cm4gY2Uuc3ltYm9sKFwiTWF5YmVcIik7XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBkb21haW5XaGljaChjZSwgYXJncykge1xuICBsZXQgZG9tID0gbnVsbDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICBpZiAoIWRvbSlcbiAgICAgIGRvbSA9IGFyZ3NbaV0uZG9tYWluO1xuICAgIGVsc2VcbiAgICAgIGRvbSA9IHNoYXJlZEFuY2VzdG9yRG9tYWluKGRvbSwgYXJnc1tpXS5kb21haW4pO1xuICB9XG4gIHJldHVybiBkb20gPz8gY2UuZG9tYWluKFwiTm90aGluZ1wiKTtcbn1cbmZ1bmN0aW9uIHdoaWNoRXZhbHVhdGUoY2UsIGFyZ3MsIG1vZGUpIHtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoIC0gMSkge1xuICAgIGlmIChhcmdzW2ldLmV2YWx1YXRlKCkuc3ltYm9sID09PSBcIlRydWVcIikge1xuICAgICAgaWYgKCFhcmdzW2kgKyAxXSlcbiAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlVuZGVmaW5lZFwiKTtcbiAgICAgIHJldHVybiBtb2RlID09PSBcIk5cIiA/IGFyZ3NbaSArIDFdLk4oKSA6IGFyZ3NbaSArIDFdLmV2YWx1YXRlKCk7XG4gICAgfVxuICAgIGkgKz0gMjtcbiAgfVxuICByZXR1cm4gY2Uuc3ltYm9sKFwiVW5kZWZpbmVkXCIpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9wb2x5bm9taWFscy50c1xudmFyIFBPTFlOT01JQUxTX0xJQlJBUlkgPSBbXG4gIHtcbiAgICBFeHBhbmQ6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkV4cGFuZCBvdXQgcHJvZHVjdHMgYW5kIHBvc2l0aXZlIGludGVnZXIgcG93ZXJzXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlZhbHVlXCIsIFwiVmFsdWVcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoX2NlLCBvcHMyKSA9PiBleHBhbmQyKG9wczJbMF0pID8/IG9wczJbMF1cbiAgICAgIH1cbiAgICB9LFxuICAgIERpc3RyaWJ1dGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc3RyaWJ1dGUgbXVsdGlwbGljYXRpb24gb3ZlciBhZGRpdGlvblwiLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJWYWx1ZVwiLCBcIlZhbHVlXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaCA9IG9wczJbMF0uaGVhZDtcbiAgICAgICAgICBpZiAoaCA9PT0gXCJNdWx0aXBseVwiKVxuICAgICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGUob3BzMlswXS5vcHMpID8/IG9wczJbMF07XG4gICAgICAgICAgaWYgKGggPT09IFwiTmVnYXRlXCIpXG4gICAgICAgICAgICByZXR1cm4gZGlzdHJpYnV0ZShbY2UuX05FR0FUSVZFX09ORSwgLi4ub3BzMlswXS5vcHNdKSA/PyBvcHMyWzBdO1xuICAgICAgICAgIGlmIChoID09PSBcIkRpdmlkZVwiICYmIG9wczJbMF0ub3BzWzBdLmhlYWQgPT09IFwiTXVsdGlwbHlcIikge1xuICAgICAgICAgICAgY29uc3QgbnVtZXJhdG9yID0gZGlzdHJpYnV0ZShvcHMyWzBdLm9wcyk7XG4gICAgICAgICAgICBjb25zdCBkZW5vbWluYXRvciA9IG9wczJbMF0ub3BzWzFdO1xuICAgICAgICAgICAgaWYgKG51bWVyYXRvcikge1xuICAgICAgICAgICAgICBpZiAobnVtZXJhdG9yLmhlYWQgPT09IFwiQWRkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlLmFkZChcbiAgICAgICAgICAgICAgICAgIG51bWVyYXRvci5vcHMubWFwKCh4KSA9PiBjZS5kaXYoeCwgZGVub21pbmF0b3IpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBjZS5kaXYobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvcHMyWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5dO1xuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9yZWxhdGlvbmFsLW9wZXJhdG9yLnRzXG52YXIgUkVMT1BfTElCUkFSWSA9IHtcbiAgRXF1YWw6IHtcbiAgICBjb21tdXRhdGl2ZTogdHJ1ZSxcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgcmV0dXJuIGNlLl9mbihcbiAgICAgICAgICBcIkVxdWFsXCIsXG4gICAgICAgICAgZmxhdHRlbk9wcyhjYW5vbmljYWwoZmxhdHRlblNlcXVlbmNlKG9wczIpKSwgXCJFcXVhbFwiKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgaWYgKG9wczIubGVuZ3RoIDwgMilcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgICAgbGV0IGxocyA9IHZvaWQgMDtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygb3BzMikge1xuICAgICAgICAgIGlmICghbGhzKVxuICAgICAgICAgICAgbGhzID0gYXJnO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGVzdCA9IGxocy5pc0VxdWFsKGFyZyk7XG4gICAgICAgICAgICBpZiAodGVzdCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIE5vdEVxdWFsOiB7XG4gICAgd2lraWRhdGE6IFwiUTI4MTEzMzUxXCIsXG4gICAgY29tbXV0YXRpdmU6IHRydWUsXG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgaWYgKG9wczIubGVuZ3RoIDwgMilcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWxocylcbiAgICAgICAgICAgIGxocyA9IGFyZztcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBsaHMuaXNFcXVhbChhcmcpO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IHRydWUpXG4gICAgICAgICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBMZXNzOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBvcHMyKSA9PiBjZS5fZm4oXCJMZXNzXCIsIGZsYXR0ZW5PcHMoY2Fub25pY2FsKGZsYXR0ZW5TZXF1ZW5jZShvcHMyKSksIFwiTGVzc1wiKSksXG4gICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGlmIChvcHMyLmxlbmd0aCA8IDIpXG4gICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWFyZy5pc051bWJlcilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY2UuZm4oXCJTdWJ0cmFjdFwiLCBbYXJnLCBsaHNdKS5OKCkuc2duO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRlc3QgPD0gMClcbiAgICAgICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICAgICAgICAgICAgbGhzID0gYXJnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIE5vdExlc3M6IHtcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiTGVzc1wiLCBhcmdzKV0pXG4gICAgfVxuICB9LFxuICBHcmVhdGVyOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJMZXNzXCIsIGFyZ3MucmV2ZXJzZSgpKSxcbiAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgaWYgKG9wczIubGVuZ3RoIDwgMilcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgICAgbGV0IGxocyA9IHZvaWQgMDtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygb3BzMikge1xuICAgICAgICAgIGlmICghYXJnLmlzTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICBpZiAoIWxocylcbiAgICAgICAgICAgIGxocyA9IGFyZztcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBjZS5mbihcIlN1YnRyYWN0XCIsIFthcmcsIGxoc10pLk4oKS5zZ247XG4gICAgICAgICAgICBpZiAodGVzdCA9PT0gbnVsbCB8fCB0ZXN0ID09PSB2b2lkIDApXG4gICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodGVzdCA+PSAwKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTm90R3JlYXRlcjoge1xuICAgIGNvbXBsZXhpdHk6IDExZTMsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIsXG4gICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4gY2UuX2ZuKFwiTm90XCIsIFtjZS5fZm4oXCJHcmVhdGVyXCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIExlc3NFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExZTMsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIsXG4gICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGlmIChvcHMyLmxlbmd0aCA8IDIpXG4gICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWFyZy5pc051bWJlcilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY2UuZm4oXCJTdWJ0cmFjdFwiLCBbYXJnLCBsaHNdKS5OKCkuc2duO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRlc3QgPCAwKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTm90TGVzc05vdEVxdWFsOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJOb3RcIiwgW2NlLl9mbihcIkxlc3NFcXVhbFwiLCBhcmdzKV0pXG4gICAgfVxuICB9LFxuICBHcmVhdGVyRXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIkxlc3NFcXVhbFwiLCBhcmdzLnJldmVyc2UoKSksXG4gICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgIGlmIChvcHMyLmxlbmd0aCA8IDIpXG4gICAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgICAgIGxldCBsaHMgPSB2b2lkIDA7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIG9wczIpIHtcbiAgICAgICAgICBpZiAoIWFyZy5pc051bWJlcilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY2UuZm4oXCJTdWJ0cmFjdFwiLCBbYXJnLCBsaHNdKS5OKCkuc2duO1xuICAgICAgICAgICAgaWYgKHRlc3QgPT09IG51bGwgfHwgdGVzdCA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRlc3QgPiAwKVxuICAgICAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiRmFsc2VcIik7XG4gICAgICAgICAgICBsaHMgPSBhcmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZS5zeW1ib2woXCJUcnVlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTm90R3JlYXRlck5vdEVxdWFsOiB7XG4gICAgY29tcGxleGl0eTogMTFlMyxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJOb3RcIiwgW2NlLl9mbihcIkdyZWF0ZXJFcXVhbFwiLCBhcmdzKV0pXG4gICAgfVxuICB9LFxuICBUaWxkZUZ1bGxFcXVhbDoge1xuICAgIGRlc2NyaXB0aW9uOiBcIkluZGljYXRlIGlzb21vcnBoaXNtLCBjb25ncnVlbmNlIGFuZCBob21vdG9waWMgZXF1aXZhbGVuY2VcIixcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RUaWxkZUZ1bGxFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiVGlsZGVGdWxsRXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgVGlsZGVFcXVhbDoge1xuICAgIGRlc2NyaXB0aW9uOiBcIkFwcHJveGltYXRlbHkgb3IgYXN5bXB0b3RpY2FsbHkgZXF1YWxcIixcbiAgICBjb21wbGV4aXR5OiAxMWUzLFxuICAgIHNpZ25hdHVyZTogeyBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIgfVxuICAgIC8vIEB0b2RvIGV2YWx1YXRlOiAoY2UsIC4uLmFyZ3M6IEJveGVkRXhwcmVzc2lvbltdKSA9PiBTZW1pQm94ZWRFeHByZXNzaW9uIHt9XG4gIH0sXG4gIE5vdFRpbGRlRXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5fZm4oXCJOb3RcIiwgW2NlLl9mbihcIlRpbGRlRXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgQXBwcm94OiB7XG4gICAgY29tcGxleGl0eTogMTExMDAsXG4gICAgc2lnbmF0dXJlOiB7IGRvbWFpbjogXCJSZWxhdGlvbmFsT3BlcmF0b3JcIiB9XG4gICAgLy8gQHRvZG8gZXZhbHVhdGU6IChjZSwgLi4uYXJnczogQm94ZWRFeHByZXNzaW9uW10pID0+IFNlbWlCb3hlZEV4cHJlc3Npb24ge31cbiAgfSxcbiAgTm90QXBwcm94OiB7XG4gICAgY29tcGxleGl0eTogMTExMDAsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFwiUmVsYXRpb25hbE9wZXJhdG9yXCIsXG4gICAgICBjYW5vbmljYWw6IChjZSwgYXJncykgPT4gY2UuX2ZuKFwiTm90XCIsIFtjZS5fZm4oXCJBcHByb3hcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgQXBwcm94RXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RBcHByb3hFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiQXBwcm94RXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgQXBwcm94Tm90RXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RBcHByb3hOb3RFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiQXBwcm94Tm90RXF1YWxcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgUHJlY2VkZXM6IHtcbiAgICBjb21wbGV4aXR5OiAxMTEwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RQcmVjZWRlczoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiUHJlY2VkZXNcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgU3VjY2VlZHM6IHtcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiIH1cbiAgICAvLyBAdG9kbyBldmFsdWF0ZTogKGNlLCAuLi5hcmdzOiBCb3hlZEV4cHJlc3Npb25bXSkgPT4gU2VtaUJveGVkRXhwcmVzc2lvbiB7fVxuICB9LFxuICBOb3RTdWNjZWVkczoge1xuICAgIGNvbXBsZXhpdHk6IDExMTAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlJlbGF0aW9uYWxPcGVyYXRvclwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLl9mbihcIk5vdFwiLCBbY2UuX2ZuKFwiU3VjY2VlZHNcIiwgYXJncyldKVxuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvc2V0cy50c1xudmFyIFNFVFNfTElCUkFSWSA9IHtcbiAgLy9cbiAgLy8gQ29uc3RhbnRzXG4gIC8vXG4gIEVtcHR5U2V0OiB7XG4gICAgZG9tYWluOiBcIlNldFwiLFxuICAgIGNvbnN0YW50OiB0cnVlLFxuICAgIHdpa2lkYXRhOiBcIlEyMjYxODNcIlxuICAgIC8vIGNvbnRhaW5zOiAoKSA9PiBmYWxzZSwgLy8gQHRvZG8gbm90IHF1aXRlIHRydWUuLi5cbiAgICAvLyBpbmNsdWRlczogKCkgPT4gdHJ1ZSwgLy8gVGhlIGVtcHR5IHNldCBpcyBhIHN1YnNldCBvZiBldmVyeSBzZXRcbiAgfSxcbiAgLy9cbiAgLy8gUHJlZGljYXRlc1xuICAvL1xuICBFbGVtZW50OiB7XG4gICAgY29tcGxleGl0eTogMTEyMDAsXG4gICAgaG9sZDogXCJhbGxcIixcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiB7XG4gICAgICAgIGFyZ3MgPSB2YWxpZGF0ZUFyZ3VtZW50Q291bnQoY2UsIGZsYXR0ZW5TZXF1ZW5jZShjYW5vbmljYWwoYXJncykpLCAyKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyICYmIGlzVmFsaWREb21haW4oYXJnc1sxXSkpXG4gICAgICAgICAgcmV0dXJuIGNlLl9mbihcIkVsZW1lbnRcIiwgW2FyZ3NbMF0sIGNlLmRvbWFpbihhcmdzWzFdKV0pO1xuICAgICAgICByZXR1cm4gY2UuX2ZuKFwiRWxlbWVudFwiLCBhcmdzKTtcbiAgICAgIH0sXG4gICAgICBldmFsdWF0ZTogKGNlLCBhcmdzKSA9PiBldmFsdWF0ZUVsZW1lbnQoY2UsIGFyZ3MpXG4gICAgfVxuICB9LFxuICBOb3RFbGVtZW50OiB7XG4gICAgY29tcGxleGl0eTogMTEyMDAsXG4gICAgaG9sZDogXCJhbGxcIixcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5mbihcIk5vdFwiLCBbY2UuZm4oXCJFbGVtZW50XCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIFN1YnNldDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZTogeyBkb21haW46IFwiUHJlZGljYXRlXCIgfVxuICB9LFxuICBOb3RTdWJzZXQ6IHtcbiAgICBjb21wbGV4aXR5OiAxMTIwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5mbihcIk5vdFwiLCBbY2UuZm4oXCJTdWJzZXRcIiwgYXJncyldKVxuICAgIH1cbiAgfSxcbiAgU3VwZXJzZXQ6IHtcbiAgICBjb21wbGV4aXR5OiAxMTIwMCxcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBcIlByZWRpY2F0ZVwiIH1cbiAgfSxcbiAgU3VwZXJzZXRFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZTogeyBkb21haW46IFwiUHJlZGljYXRlXCIgfVxuICB9LFxuICBOb3RTdXBlcnNldDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlByZWRpY2F0ZVwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLmZuKFwiTm90XCIsIFtjZS5mbihcIlN1cGVyc2V0XCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIE5vdFN1cGVyc2V0RXF1YWw6IHtcbiAgICBjb21wbGV4aXR5OiAxMTIwMCxcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogXCJQcmVkaWNhdGVcIixcbiAgICAgIGNhbm9uaWNhbDogKGNlLCBhcmdzKSA9PiBjZS5mbihcIk5vdFwiLCBbY2UuZm4oXCJTdXBlcnNldEVxdWFsXCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIFN1YnNldEVxdWFsOiB7XG4gICAgY29tcGxleGl0eTogMTEyMDAsXG4gICAgc2lnbmF0dXJlOiB7IGRvbWFpbjogXCJQcmVkaWNhdGVcIiB9XG4gICAgLy8gZXZhbHVhdGU6IHN1YnNldEVxdWFsLFxuICB9LFxuICBOb3RTdWJzZXROb3RFcXVhbDoge1xuICAgIGNvbXBsZXhpdHk6IDExMjAwLFxuICAgIHNpZ25hdHVyZToge1xuICAgICAgZG9tYWluOiBcIlByZWRpY2F0ZVwiLFxuICAgICAgY2Fub25pY2FsOiAoY2UsIGFyZ3MpID0+IGNlLmZuKFwiTm90XCIsIFtjZS5mbihcIlN1YnNldEVxdWFsXCIsIGFyZ3MpXSlcbiAgICB9XG4gIH0sXG4gIC8vXG4gIC8vIEZ1bmN0aW9uc1xuICAvL1xuICBDYXJ0ZXNpYW5Qcm9kdWN0OiB7XG4gICAgLy8gQWthIHRoZSBwcm9kdWN0IHNldCwgdGhlIHNldCBkaXJlY3QgcHJvZHVjdCBvciBjcm9zcyBwcm9kdWN0XG4gICAgLy8gTm90YXRpb246IFxcdGltZXNcbiAgICB3aWtpZGF0YTogXCJRMTczNzQwXCIsXG4gICAgc2lnbmF0dXJlOiB7IGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJTZXRcIiwgW1wiU2VxdWVuY2VcIiwgXCJTZXRcIl0sIFwiU2V0XCJdIH1cbiAgICAvLyBldmFsdWF0ZTogY2FydGVzaWFuUHJvZHVjdCxcbiAgfSxcbiAgQ29tcGxlbWVudDoge1xuICAgIC8vIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IHRoYXQgYXJlIG5vdCBpbiBhbnkgb2ZcbiAgICAvLyB0aGUgc3Vic2VxdWVudCBsaXN0c1xuICAgIHdpa2lkYXRhOiBcIlEyNDI3NjdcIixcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlNldFwiLCBcIlNldFwiXSB9XG4gIH0sXG4gIEludGVyc2VjdGlvbjoge1xuICAgIC8vIG5vdGF0aW9uOiBcXGNhcFxuICAgIHdpa2lkYXRhOiBcIlExODU4MzdcIixcbiAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgIGNvbW11dGF0aXZlOiB0cnVlLFxuICAgIGludm9sdXRpb246IHRydWUsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiU2V0XCIsIFtcIlNlcXVlbmNlXCIsIFwiU2V0XCJdLCBcIlNldFwiXSxcbiAgICAgIGV2YWx1YXRlOiBpbnRlcnNlY3Rpb25cbiAgICB9XG4gIH0sXG4gIFVuaW9uOiB7XG4gICAgLy8gV29ya3Mgb24gc2V0LCBidXQgY2FuIGFsc28gd29yayBvbiBsaXN0c1xuICAgIHdpa2lkYXRhOiBcIlExODUzNTlcIixcbiAgICB0aHJlYWRhYmxlOiB0cnVlLFxuICAgIGFzc29jaWF0aXZlOiB0cnVlLFxuICAgIGNvbW11dGF0aXZlOiB0cnVlLFxuICAgIGludm9sdXRpb246IHRydWUsXG4gICAgc2lnbmF0dXJlOiB7XG4gICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiU2V0XCIsIFtcIlNlcXVlbmNlXCIsIFwiU2V0XCJdLCBcIlNldFwiXSxcbiAgICAgIGV2YWx1YXRlOiB1bmlvblxuICAgIH1cbiAgfSxcbiAgLy8ge1xuICAvLyAgIG5hbWU6ICdTZXQnLFxuICAvLyAgIGRvbWFpbjogWydGdW5jdGlvbicsIFsnU2VxdWVuY2UnLCAnQW55dGhpbmcnXSwgJ1NldCddLFxuICAvLyAgIC8vIEB0b2RvISBzZXQgaGFzIG11bHRpcGxlIGZvcm1zXG4gIC8vICAgLy8gU2V0KFNlcXVlbmNlKVxuICAvLyAgIC8vIFNldChTZXF1ZW5jZSwgQ29uZGl0aW9uKVxuICAvLyAgIC8vIFNldChTZXQsIENvbmRpdGlvbilcbiAgLy8gfSwgLy8gZGlzam9pbnQgdW5pb24gUTg0MjYyMCBcdTIyOTRcbiAgU2V0TWludXM6IHtcbiAgICB3aWtpZGF0YTogXCJRMTgxOTI0NDJcIixcbiAgICBzaWduYXR1cmU6IHtcbiAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJTZXRcIiwgXCJWYWx1ZVwiLCBcIlNldFwiXSxcbiAgICAgIGV2YWx1YXRlOiBzZXRNaW51c1xuICAgIH1cbiAgfSxcbiAgU3ltbWV0cmljRGlmZmVyZW5jZToge1xuICAgIC8vIHN5bW1ldHJpYyBkaWZmZXJlbmNlID0gZGlzanVuY3RpdmUgdW5pb24gIChjaXJjbGVkIG1pbnVzKVxuICAgIC8qID0gVW5pb24oQ29tcGxlbWVudChhLCBiKSwgQ29tcGxlbWVudChiLCBhKSAqL1xuICAgIC8qIENvcnJlc3BvbmRzIHRvIFhPUiBpbiBib29sZWFuIGxvZ2ljICovXG4gICAgd2lraWRhdGE6IFwiUTExNDcyNDJcIixcbiAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIlNldFwiLCBbXCJTZXF1ZW5jZVwiLCBcIlNldFwiXSwgXCJTZXRcIl0gfVxuICB9XG59O1xuZnVuY3Rpb24gdW5pb24oY2UsIF9vcHMpIHtcbiAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGNlLCBfb3BzKSB7XG4gIHJldHVybiBjZS5zeW1ib2woXCJFbXB0eVNldFwiKTtcbn1cbmZ1bmN0aW9uIHNldE1pbnVzKGNlLCBfb3BzKSB7XG4gIHJldHVybiBjZS5zeW1ib2woXCJFbXB0eVNldFwiKTtcbn1cbmZ1bmN0aW9uIGV2YWx1YXRlRWxlbWVudChjZSwgb3BzMikge1xuICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQob3BzMi5sZW5ndGggPT09IDIpO1xuICBjb25zdCBbbGhzLCByaHNdID0gb3BzMjtcbiAgaWYgKHJocy5zdHJpbmcpIHtcbiAgICBpZiAobGhzLnN0cmluZyAmJiByaHMuc3RyaW5nLmluY2x1ZGVzKGxocy5zdHJpbmcpKVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIGlmIChyaHMua2V5cykge1xuICAgIGlmIChsaHMuc3RyaW5nKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiByaHMua2V5cylcbiAgICAgICAgaWYgKGtleSA9PT0gbGhzLnN0cmluZylcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIGlmIChyaHMuaGVhZCA9PT0gXCJMaXN0XCIpIHtcbiAgICBpZiAobGhzLmhlYWQgPT09IFwiTGlzdFwiKSB7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMSArIChyaHMubm9wcyAtIGxocy5ub3BzKTsgKytpKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaHMubm9wczsgKytqKSB7XG4gICAgICAgICAgaWYgKCFyaHMub3BzW2kgKyBqXS5pc0VxdWFsKGxocy5vcHNbal0pKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICByZXR1cm4gY2Uuc3ltYm9sKFwiVHJ1ZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjZS5zeW1ib2woXCJGYWxzZVwiKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gbGhzLmhlYWQgPT09IFwiSG9sZFwiID8gbGhzLm9wMSA6IGxocztcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgcmhzLm9wcylcbiAgICAgIGlmICh2YWwuaXNFcXVhbChlbGVtKSlcbiAgICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIGlmIChpc1ZhbGlkRG9tYWluKHJocykpIHtcbiAgICBpZiAobGhzLmRvbWFpbi5pc0NvbXBhdGlibGUoY2UuZG9tYWluKHJocykpKVxuICAgICAgcmV0dXJuIGNlLnN5bWJvbChcIlRydWVcIik7XG4gICAgcmV0dXJuIGNlLnN5bWJvbChcIkZhbHNlXCIpO1xuICB9XG4gIHJldHVybiBjZS5fZm4oXCJFbGVtZW50XCIsIFtsaHMsIHJoc10pO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvbGlicmFyeS9zdGF0aXN0aWNzLnRzXG52YXIgU1RBVElTVElDU19MSUJSQVJZID0gW1xuICB7XG4gICAgTWVhbjoge1xuICAgICAgY29tcGxleGl0eTogMTIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIlNlcXVlbmNlXCIsIFwiVmFsdWVcIl0sIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgc3VtMiArPSB2O1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihzdW0yIC8gY291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBNZWRpYW46IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIHZhbHVlcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcih2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggJSAyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigodmFsdWVzW21pZCAtIDFdICsgdmFsdWVzW21pZF0pIC8gMik7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcih2YWx1ZXNbbWlkXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFZhcmlhbmNlOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBsZXQgc3VtMiA9IDA7XG4gICAgICAgICAgbGV0IHN1bTIyID0gMDtcbiAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHN1bTIgKz0gdjtcbiAgICAgICAgICAgIHN1bTIyICs9IHYgKiB2O1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigoc3VtMjIgLSBzdW0yICogc3VtMiAvIGNvdW50KSAvIChjb3VudCAtIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgU3RhbmRhcmREZXZpYXRpb246IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGxldCBzdW0yID0gMDtcbiAgICAgICAgICBsZXQgc3VtMjIgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgc3VtMiArPSB2O1xuICAgICAgICAgICAgc3VtMjIgKz0gdiAqIHY7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY291bnQgPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICByZXR1cm4gY2UubnVtYmVyKFxuICAgICAgICAgICAgTWF0aC5zcXJ0KChzdW0yMiAtIHN1bTIgKiBzdW0yIC8gY291bnQpIC8gKGNvdW50IC0gMSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgS3VydG9zaXM6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGxldCBzdW0yID0gMDtcbiAgICAgICAgICBsZXQgc3VtMjIgPSAwO1xuICAgICAgICAgIGxldCBzdW00ID0gMDtcbiAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHN1bTIgKz0gdjtcbiAgICAgICAgICAgIHN1bTIyICs9IHYgKiB2O1xuICAgICAgICAgICAgc3VtNCArPSB2ICogdiAqIHYgKiB2O1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgY29uc3QgczIgPSAoc3VtMjIgLSBzdW0yICogc3VtMiAvIGNvdW50KSAvIChjb3VudCAtIDEpO1xuICAgICAgICAgIGNvbnN0IHM0ID0gKHN1bTQgLSBzdW0yMiAqIHN1bTIyIC8gY291bnQpIC8gKGNvdW50IC0gMSk7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcigoczQgLyAoczIgKiBzMikgLSAzKSAqIChjb3VudCAqIChjb3VudCArIDEpKSAvIDYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBTa2V3bmVzczoge1xuICAgICAgY29tcGxleGl0eTogMTIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFtcIlNlcXVlbmNlXCIsIFwiVmFsdWVcIl0sIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgbGV0IHN1bTIgPSAwO1xuICAgICAgICAgIGxldCBzdW0yMiA9IDA7XG4gICAgICAgICAgbGV0IHN1bTMgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgc3VtMiArPSB2O1xuICAgICAgICAgICAgc3VtMjIgKz0gdiAqIHY7XG4gICAgICAgICAgICBzdW0zICs9IHYgKiB2ICogdjtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3VudCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIGNvbnN0IHMyID0gKHN1bTIyIC0gc3VtMiAqIHN1bTIgLyBjb3VudCkgLyAoY291bnQgLSAxKTtcbiAgICAgICAgICBjb25zdCBzMyA9IChzdW0zIC0gc3VtMjIgKiBzdW0yIC8gY291bnQpIC8gKGNvdW50IC0gMSk7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihzMyAvIE1hdGgucG93KHMyLCAzIC8gMikgKiBNYXRoLnNxcnQoY291bnQgKiAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE1vZGU6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qgb3AzIG9mIGVhY2gob3BzMikpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBhc0Zsb2F0KG9wMyk7XG4gICAgICAgICAgICBpZiAodiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBjZS5fTkFOO1xuICAgICAgICAgIHZhbHVlcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgY29uc3QgY291bnRzID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xuICAgICAgICAgICAgY291bnRzW3ZdID0gKGNvdW50c1t2XSA/PyAwKSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBtYXgyID0gMDtcbiAgICAgICAgICBsZXQgbW9kZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY291bnRzW3ZdO1xuICAgICAgICAgICAgaWYgKGMgPiBtYXgyKSB7XG4gICAgICAgICAgICAgIG1heDIgPSBjO1xuICAgICAgICAgICAgICBtb2RlID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihtb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgUXVhcnRpbGVzOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJMaXN0XCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBvcDMgb2YgZWFjaChvcHMyKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IGFzRmxvYXQob3AzKTtcbiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKVxuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2godik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNlLl9OQU47XG4gICAgICAgICAgdmFsdWVzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKHZhbHVlcy5sZW5ndGggLyAyKTtcbiAgICAgICAgICBjb25zdCBsb3dlciA9IHZhbHVlcy5zbGljZSgwLCBtaWQpO1xuICAgICAgICAgIGNvbnN0IHVwcGVyID0gdmFsdWVzLnNsaWNlKG1pZCArIDEpO1xuICAgICAgICAgIHJldHVybiBjZS5ib3goW1xuICAgICAgICAgICAgXCJMaXN0XCIsXG4gICAgICAgICAgICBjZS5udW1iZXIodmFsdWVzW21pZF0pLFxuICAgICAgICAgICAgY2UubnVtYmVyKGxvd2VyW01hdGguZmxvb3IobG93ZXIubGVuZ3RoIC8gMildKSxcbiAgICAgICAgICAgIGNlLm51bWJlcih1cHBlcltNYXRoLmZsb29yKHVwcGVyLmxlbmd0aCAvIDIpXSlcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgSW50ZXJxdWFydGlsZVJhbmdlOiB7XG4gICAgICBjb21wbGV4aXR5OiAxMjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgW1wiU2VxdWVuY2VcIiwgXCJWYWx1ZVwiXSwgXCJOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9wMyBvZiBlYWNoKG9wczIpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gYXNGbG9hdChvcDMpO1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwpXG4gICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gY2UuX05BTjtcbiAgICAgICAgICB2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICAgIGNvbnN0IGxvd2VyID0gdmFsdWVzLnNsaWNlKDAsIG1pZCk7XG4gICAgICAgICAgY29uc3QgdXBwZXIgPSB2YWx1ZXMuc2xpY2UobWlkICsgMSk7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihcbiAgICAgICAgICAgIHVwcGVyW01hdGguZmxvb3IodXBwZXIubGVuZ3RoIC8gMildIC0gbG93ZXJbTWF0aC5mbG9vcihsb3dlci5sZW5ndGggLyAyKV1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBDb3VudDoge1xuICAgICAgdGhyZWFkYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBsZXhpdHk6IDEyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBbXCJTZXF1ZW5jZVwiLCBcIlZhbHVlXCJdLCBcIk51bWJlclwiXSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBfb3Agb2YgZWFjaChvcHMyKSlcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIGNlLm51bWJlcihjb3VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIEVyZjoge1xuICAgICAgY29tcGxleGl0eTogNzUwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoZXJmKHgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgRXJmYzoge1xuICAgICAgY29tcGxleGl0eTogNzUwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgeCA9IGFzRmxvYXQob3BzMlswXSk7XG4gICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiBjZS5udW1iZXIoMSAtIGVyZih4KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbl07XG5mdW5jdGlvbiogZWFjaChvcHMyKSB7XG4gIGlmIChvcHMyLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm47XG4gIGNvbnN0IGNlID0gb3BzMlswXS5lbmdpbmU7XG4gIGZvciAoY29uc3Qgb3AzIG9mIG9wczIpIHtcbiAgICBjb25zdCBoID0gb3AzLmhlYWQ7XG4gICAgaWYgKGggPT09IFwiUmFuZ2VcIikge1xuICAgICAgbGV0IGxvd2VyID0gYXNGbG9hdChvcDNbMV0pO1xuICAgICAgaWYgKGxvd2VyID09PSBudWxsKVxuICAgICAgICByZXR1cm47XG4gICAgICBsZXQgdXBwZXIgPSBhc0Zsb2F0KG9wM1syXSk7XG4gICAgICBpZiAodXBwZXIgPT09IG51bGwpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgY29uc3Qgc3RlcDIgPSBhc0Zsb2F0KG9wM1szXSA/PyAtMSkgPz8gLTE7XG4gICAgICAgIGlmIChzdGVwMiA+PSAwKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxvd2VyOyBpIDw9IHVwcGVyOyBpICs9IHN0ZXAyKVxuICAgICAgICAgIHlpZWxkIGNlLm51bWJlcihpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcCA9IGFzRmxvYXQob3AzWzNdID8/IDEpID8/IDE7XG4gICAgICBpZiAoc3RlcCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgICBmb3IgKGxldCBpID0gbG93ZXI7IGkgPD0gdXBwZXI7IGkgKz0gc3RlcClcbiAgICAgICAgeWllbGQgY2UubnVtYmVyKGkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaCA9PT0gXCJMaW5zcGFjZVwiKSB7XG4gICAgICBsZXQgc3RhcnQgPSBhc0Zsb2F0KG9wM1sxXSk7XG4gICAgICBpZiAoc3RhcnQgPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBzdG9wID0gYXNGbG9hdChvcDNbMl0pO1xuICAgICAgaWYgKHN0b3AgPT09IG51bGwpIHtcbiAgICAgICAgc3RvcCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9XG4gICAgICBjb25zdCBudW0gPSBhc0Zsb2F0KG9wM1szXSkgPz8gNTA7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKG51bSA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAobnVtIC0gMSk7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSArPSBzdGVwKVxuICAgICAgICB5aWVsZCBjZS5udW1iZXIoaSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaCA9PT0gXCJzdHJpbmdcIiAmJiAvXihMaXN0fFNlcXVlbmNlfFR1cGxlfFNpbmdsZXxQYWlyfFRyaXBsZSkkLy50ZXN0KGgpKSB7XG4gICAgICB5aWVsZCogZWFjaChvcDMub3BzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgeWllbGQgb3AzO1xuICB9XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9saWJyYXJ5L3RyaWdvbm9tZXRyeS50c1xudmFyIGRvbWFpbk51bWJlclRvUmVhbE51bWJlciA9IChfaGVhZCkgPT4ge1xuICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJFeHRlbmRlZFJlYWxOdW1iZXJcIl07XG59O1xudmFyIHRyaWdGdW5jdGlvbiA9IChfaGVhZCkgPT4ge1xuICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl07XG59O1xudmFyIGh5cGVyYm9saWNGdW5jdGlvbiA9IChfaGVhZCkgPT4ge1xuICByZXR1cm4gW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl07XG59O1xudmFyIFRSSUdPTk9NRVRSWV9MSUJSQVJZID0gW1xuICB7XG4gICAgLy9cbiAgICAvLyBDb25zdGFudHNcbiAgICAvL1xuICAgIFBpOiB7XG4gICAgICBkb21haW46IFwiVHJhbnNjZW5kZW50YWxOdW1iZXJcIixcbiAgICAgIGZsYWdzOiB7IGFsZ2VicmFpYzogZmFsc2UgfSxcbiAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgaG9sZFVudGlsOiBcIk5cIixcbiAgICAgIHdpa2lkYXRhOiBcIlExNjdcIixcbiAgICAgIHZhbHVlOiAoZW5naW5lKSA9PiBiaWdudW1QcmVmZXJyZWQoZW5naW5lKSA/IGVuZ2luZS5fQklHTlVNX1BJIDogTWF0aC5QSVxuICAgIH1cbiAgfSxcbiAge1xuICAgIC8vIHNxcnQoeCp4ICsgeSp5KVxuICAgIERlZ3JlZXM6IHtcbiAgICAgIC8qID0gUGkgLyAxODAgKi9cbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFwiTnVtYmVyXCJdLFxuICAgICAgICBjYW5vbmljYWw6IChjZSwgb3BzMikgPT4ge1xuICAgICAgICAgIG9wczIgPSB2YWxpZGF0ZUFyZ3VtZW50cyhjZSwgZmxhdHRlblNlcXVlbmNlKGNhbm9uaWNhbChvcHMyKSksIFtcbiAgICAgICAgICAgIFwiTnVtYmVyXCJcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBpZiAob3BzMi5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY2UuZm4oXCJEZWdyZWVzXCIsIG9wczIsIHsgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgICAgICAgICBjb25zdCBhcmcgPSBvcHMyWzBdO1xuICAgICAgICAgIGlmIChhcmcubnVtZXJpY1ZhbHVlID09PSBudWxsIHx8ICFhcmcuaXNWYWxpZClcbiAgICAgICAgICAgIHJldHVybiBjZS5mbihcIkRlZ3JlZXNcIiwgb3BzMiwgeyBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICAgICAgICAgIHJldHVybiBjZS5kaXYoY2UubXVsKFthcmcsIGNlLnN5bWJvbChcIlBpXCIpXSksIGNlLm51bWJlcigxODApKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gY2UubXVsKFtvcHMyWzBdLCBjZS5kaXYoY2Uuc3ltYm9sKFwiUGlcIiksIGNlLm51bWJlcigxODApKV0pXG4gICAgICB9XG4gICAgfSxcbiAgICBIeXBvdDoge1xuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOb25OZWdhdGl2ZU51bWJlclwiXSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gY2UuYm94KFtcIlNxcnRcIiwgW1wiQWRkXCIsIFtcIlNxdWFyZVwiLCBvcHMyWzBdXSwgW1wiU3F1YXJlXCIsIG9wczJbMV1dXV0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiBbXG4gICAgICAgICAgXCJMYW1iZGFcIixcbiAgICAgICAgICBbXCJTcXJ0XCIsIFtcIkFkZFwiLCBbXCJTcXVhcmVcIiwgXCJfMVwiXSwgW1wiU3F1YXJlXCIsIFwiXzJcIl1dXVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSxcbiAgICBTaW46IHtcbiAgICAgIGNvbXBsZXhpdHk6IDVlMyxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiTnVtYmVyXCIsIFtcIkludGVydmFsXCIsIC0xLCAxXV0sXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiU2luXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IChjb21wbGV4QWxsb3dlZChjZSkgPyBjZS5ib3goW1xuICAgICAgICAgIFwiRGl2aWRlXCIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgXCJTdWJ0cmFjdFwiLFxuICAgICAgICAgICAgW1wiRXhwXCIsIFtcIk11bHRpcGx5XCIsIFwiSW1hZ2luYXJ5VW5pdFwiLCBvcHMyWzBdXV0sXG4gICAgICAgICAgICBbXCJFeHBcIiwgW1wiTXVsdGlwbHlcIiwgXCJJbWFnaW5hcnlVbml0XCIsIFtcIk5lZ2F0ZVwiLCBvcHMyWzBdXV1dXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXCJDb21wbGV4XCIsIDAsIDJdXG4gICAgICAgIF0pLnNpbXBsaWZ5KCkgOiB2b2lkIDApLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIlNpblwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiU2luXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgLy9cbiAgICAvLyBCYXNpYyB0cmlnb25vbWV0cmljIGZ1bmN0aW9uXG4gICAgLy8gKG1heSBiZSB1c2VkIGluIHRoZSBkZWZpbml0aW9uIG9mIG90aGVyIGZ1bmN0aW9ucyBiZWxvdylcbiAgICAvL1xuICAgIEFyY3Rhbjoge1xuICAgICAgd2lraWRhdGE6IFwiUTIyNTcyNDJcIixcbiAgICAgIGNvbXBsZXhpdHk6IDUyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcmN0YW5cIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjdGFuXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY3RhblwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjdGFuXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcmN0YW4yOiB7XG4gICAgICB3aWtpZGF0YTogXCJRNzc2NTk4XCIsXG4gICAgICBjb21wbGV4aXR5OiA1MjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogW1wiRnVuY3Rpb25cIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIiwgXCJOdW1iZXJcIl0sXG4gICAgICAgIE46IChfY2UsIG9wczIpID0+IGFwcGx5Mk4ob3BzMlswXSwgb3BzMlsxXSwgTWF0aC5hdGFuMiwgKGEsIGIpID0+IERlY2ltYWwuYXRhbjIoYSwgYikpXG4gICAgICB9XG4gICAgfSxcbiAgICBDb3M6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDUwNTAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBbXCJJbnRlcnZhbFwiLCAtMSwgMV1dLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkNvc1wiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiU2luXCIsIFtcIkFkZFwiLCBvcHMyWzBdLCBbXCJNdWx0aXBseVwiLCBcIkhhbGZcIiwgXCJQaVwiXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNvc1wiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQ29zXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBUYW46IHtcbiAgICAgIC8vIFJhbmdlOiAnUmVhbE51bWJlcicsXG4gICAgICBjb21wbGV4aXR5OiA1MTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogdHJpZ0Z1bmN0aW9uKFwiVGFuXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlRhblwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIFtcIlNpblwiLCBvcHMyWzBdXSwgW1wiQ29zXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJUYW5cIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIlRhblwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBjb252ZXJ0cyAoeCwgeSkgLT4gKHJhZGl1cywgYW5nbGUpICovXG4gICAgLy8gVG9Qb2xhckNvb3JkaW5hdGVzOiB7XG4gICAgLy8gICBkb21haW46ICdGdW5jdGlvbicsXG4gICAgLy8gICBvdXRwdXREb21haW46IFsnVHVwbGVPZicsICdSZWFsTnVtYmVyJywgJ1JlYWxOdW1iZXInXSxcbiAgICAvLyB9XG4gIH0sXG4gIC8vXG4gIC8vIEZ1bmN0aW9ucyBkZWZpbmVkIHVzaW5nIGFyaXRobWV0aWMgZnVuY3Rpb25zIG9yIGJhc2ljXG4gIC8vIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIGFib3ZlXG4gIC8vXG4gIHtcbiAgICBBcmNvc2g6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJBcmNvc2hcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjb3NoXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXG4gICAgICAgICAgXCJMblwiLFxuICAgICAgICAgIFtcIkFkZFwiLCBvcHMyWzBdLCBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIFtcIlNxdWFyZVwiLCBvcHMyWzBdXSwgMV1dXVxuICAgICAgICBdKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY29zaFwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjb3NoXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcmNzaW46IHtcbiAgICAgIGNvbXBsZXhpdHk6IDU1MDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJBcmNzaW5cIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjc2luXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXG4gICAgICAgICAgXCJNdWx0aXBseVwiLFxuICAgICAgICAgIDIsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgXCJBcmN0YW4yXCIsXG4gICAgICAgICAgICBvcHMyWzBdLFxuICAgICAgICAgICAgW1wiQWRkXCIsIDEsIFtcIlNxcnRcIiwgW1wiU3VidHJhY3RcIiwgMSwgW1wiU3F1YXJlXCIsIG9wczJbMF1dXV1dXG4gICAgICAgICAgXVxuICAgICAgICBdKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY3NpblwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjc2luXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICAvL05vdGU6IEFyc2luaCwgbm90IEFyQ3NpbmhcbiAgICBBcnNpbmg6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYxMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJBcnNpbmhcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJzaW5oXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXG4gICAgICAgICAgXCJMblwiLFxuICAgICAgICAgIFtcIkFkZFwiLCBvcHMyWzBdLCBbXCJTcXJ0XCIsIFtcIkFkZFwiLCBbXCJTcXVhcmVcIiwgb3BzMlswXV0sIDFdXV1cbiAgICAgICAgXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcnNpbmhcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyc2luaFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQXJ0YW5oOiB7XG4gICAgICBjb21wbGV4aXR5OiA2MzAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogaHlwZXJib2xpY0Z1bmN0aW9uKFwiQXJ0YW5oXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkFydGFuaFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1xuICAgICAgICAgIFwiTXVsdGlwbHlcIixcbiAgICAgICAgICBcIkhhbGZcIixcbiAgICAgICAgICBbXCJMblwiLCBbXCJEaXZpZGVcIiwgW1wiQWRkXCIsIDEsIG9wczJbMF1dLCBbXCJTdWJ0cmFjdFwiLCAxLCBvcHMyWzBdXV1dXG4gICAgICAgIF0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQXJ0YW5oXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJBcnRhbmhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIENvc2g6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYwNTAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJDb3NoXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkNvc2hcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcbiAgICAgICAgICBcIk11bHRpcGx5XCIsXG4gICAgICAgICAgXCJIYWxmXCIsXG4gICAgICAgICAgW1wiQWRkXCIsIFtcIkV4cFwiLCBvcHMyWzBdXSwgW1wiRXhwXCIsIFtcIk5lZ2F0ZVwiLCBvcHMyWzBdXV1dXG4gICAgICAgIF0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQ29zaFwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQ29zaFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQ290OiB7XG4gICAgICBjb21wbGV4aXR5OiA1NjAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogdHJpZ0Z1bmN0aW9uKFwiQ290XCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIkNvdFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIFtcIkNvc1wiLCBvcHMyWzBdXSwgW1wiU2luXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJDb3RcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkNvdFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQ3NjOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDb3NlY2FudFwiLFxuICAgICAgY29tcGxleGl0eTogNTYwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IHRyaWdGdW5jdGlvbihcIkNzY1wiKSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gY29uc3RydWN0aWJsZVZhbHVlcyhjZSwgXCJDc2NcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcIkRpdmlkZVwiLCAxLCBbXCJTaW5cIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNzY1wiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQ3NjXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICAvKiogPSBzaW4oei8yKV4yID0gKDEgLSBjb3MgeikgLyAyKi9cbiAgICBIYXZlcnNpbmU6IHtcbiAgICAgIHdpa2lkYXRhOiBcIlEyNTI4MzgwXCIsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiLCBbXCJJbnRlcnZhbFwiLCAwLCAxXV0sXG4gICAgICAgIGV2YWx1YXRlOiBbXCJMYW1iZGFcIiwgW1wiRGl2aWRlXCIsIFtcIlN1YnRyYWN0XCIsIDEsIFtcIkNvc1wiLCBcIl8xXCJdXSwgMl1dXG4gICAgICB9XG4gICAgfSxcbiAgICAvKiogPSAyICogQXJjc2luKFNxcnQoeikpICovXG4gICAgSW52ZXJzZUhhdmVyc2luZToge1xuICAgICAgLy8gIFJhbmdlIFsnSW50ZXJ2YWwnLCBbWydOZWdhdGUnLCAnUGknXSwgJ1BpJ10sXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIkV4dGVuZGVkUmVhbE51bWJlclwiLCBcIlJlYWxOdW1iZXJcIl0sXG4gICAgICAgIGV2YWx1YXRlOiBbXCJMYW1iZGFcIiwgW1wiTXVsdGlwbHlcIiwgMiwgW1wiQXJjc2luXCIsIFtcIlNxcnRcIiwgXCJfMVwiXV1dXVxuICAgICAgfVxuICAgIH0sXG4gICAgU2VjOiB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTZWNhbnQsIGludmVyc2Ugb2YgY29zaW5lXCIsXG4gICAgICBjb21wbGV4aXR5OiA1NTAwLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogdHJpZ0Z1bmN0aW9uKFwiU2VjXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlNlY1wiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIDEsIFtcIkNvc1wiLCBvcHMyWzBdXV0pLnNpbXBsaWZ5KCksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiU2VjXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJTZWNcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFNpbmg6IHtcbiAgICAgIC8vIFJhbmdlOiBbJ0ludGVydmFsJywgLUluZmluaXR5LCBJbmZpbml0eV0sXG4gICAgICBjb21wbGV4aXR5OiA2ZTMsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBoeXBlcmJvbGljRnVuY3Rpb24oXCJTaW5oXCIpLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlNpbmhcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcbiAgICAgICAgICBcIk11bHRpcGx5XCIsXG4gICAgICAgICAgXCJIYWxmXCIsXG4gICAgICAgICAgW1wiU3VidHJhY3RcIiwgW1wiRXhwXCIsIG9wczJbMF1dLCBbXCJFeHBcIiwgW1wiTmVnYXRlXCIsIG9wczJbMF1dXV1cbiAgICAgICAgXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJTaW5oXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJTaW5oXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB7XG4gICAgQ3NjaDoge1xuICAgICAgY29tcGxleGl0eTogNjIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGRvbWFpbk51bWJlclRvUmVhbE51bWJlcihcIkNzY2hcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQ3NjaFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIDEsIFtcIlNpbmhcIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNzY2hcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkNzY2hcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFNlY2g6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDYyMDAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBbXCJGdW5jdGlvblwiLCBcIk51bWJlclwiLCBbXCJJbnRlcnZhbFwiLCAtMSwgMV1dLFxuICAgICAgICBzaW1wbGlmeTogKGNlLCBvcHMyKSA9PiBjb25zdHJ1Y3RpYmxlVmFsdWVzKGNlLCBcIlNlY2hcIiwgb3BzMlswXSk/LnNpbXBsaWZ5KCkgPz8gY2UuYm94KFtcIkRpdmlkZVwiLCAxLCBbXCJDb3NoXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJTZWNoXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJTZWNoXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBUYW5oOiB7XG4gICAgICAvLyBSYW5nZTogWydJbnRlcnZhbCcsIC1JbmZpbml0eSwgSW5maW5pdHldLFxuICAgICAgY29tcGxleGl0eTogNjIwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGh5cGVyYm9saWNGdW5jdGlvbihcIlRhbmhcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiVGFuaFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIFtcIlNpbmhcIiwgb3BzMlswXV0sIFtcIkNvc2hcIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIlRhbmhcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIlRhbmhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHtcbiAgICBBcmNjb3M6IHtcbiAgICAgIGNvbXBsZXhpdHk6IDU1NTAsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcmNjb3NcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQXJjY29zXCIsIG9wczJbMF0pPy5zaW1wbGlmeSgpID8/IGNlLmJveChbXCJTdWJ0cmFjdFwiLCBbXCJEaXZpZGVcIiwgXCJQaVwiLCAyXSwgW1wiQXJjc2luXCIsIG9wczJbMF1dXSkuc2ltcGxpZnkoKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcmNjb3NcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyY2Nvc1wiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQXJjY290OiB7XG4gICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluTnVtYmVyVG9SZWFsTnVtYmVyKFwiQXJjY290XCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY2NvdFwiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjY290XCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcmNvdGg6IHtcbiAgICAgIG51bWVyaWM6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcmNvdGhcIiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQXJjb3RoXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJBcmNvdGhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIEFyY3NjaDoge1xuICAgICAgbnVtZXJpYzogdHJ1ZSxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGRvbWFpbk51bWJlclRvUmVhbE51bWJlcihcIkFyY3NjaFwiKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcmNzY2hcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyY3NjaFwiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQXJjc2VjOiB7XG4gICAgICBudW1lcmljOiB0cnVlLFxuICAgICAgc2lnbmF0dXJlOiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluTnVtYmVyVG9SZWFsTnVtYmVyKFwiQXJjc2VjXCIpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkFyY3NlY1wiLCBvcHMyWzBdKSxcbiAgICAgICAgTjogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJOXCIsIFwiQXJjc2VjXCIsIG9wczJbMF0pXG4gICAgICB9XG4gICAgfSxcbiAgICBBcnNlY2g6IHtcbiAgICAgIG51bWVyaWM6IHRydWUsXG4gICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgZG9tYWluOiBkb21haW5OdW1iZXJUb1JlYWxOdW1iZXIoXCJBcnNlY2hcIiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcImV2YWx1YXRlXCIsIFwiQXJzZWNoXCIsIG9wczJbMF0pLFxuICAgICAgICBOOiAoY2UsIG9wczIpID0+IGV2YWxUcmlnKGNlLCBcIk5cIiwgXCJBcnNlY2hcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIEFyY2NzYzoge1xuICAgICAgbnVtZXJpYzogdHJ1ZSxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGRvbWFpbk51bWJlclRvUmVhbE51bWJlcihcIkFyY2NzY1wiKSxcbiAgICAgICAgZXZhbHVhdGU6IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiZXZhbHVhdGVcIiwgXCJBcmNjc2NcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkFyY2NzY1wiLCBvcHMyWzBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgQ290aDoge1xuICAgICAgY29tcGxleGl0eTogNjMwMCxcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IGh5cGVyYm9saWNGdW5jdGlvbihcIkNvdGhcIiksXG4gICAgICAgIHNpbXBsaWZ5OiAoY2UsIG9wczIpID0+IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIFwiQ290aFwiLCBvcHMyWzBdKT8uc2ltcGxpZnkoKSA/PyBjZS5ib3goW1wiRGl2aWRlXCIsIDEsIFtcIlRhbmhcIiwgb3BzMlswXV1dKS5zaW1wbGlmeSgpLFxuICAgICAgICBldmFsdWF0ZTogKGNlLCBvcHMyKSA9PiBldmFsVHJpZyhjZSwgXCJldmFsdWF0ZVwiLCBcIkNvdGhcIiwgb3BzMlswXSksXG4gICAgICAgIE46IChjZSwgb3BzMikgPT4gZXZhbFRyaWcoY2UsIFwiTlwiLCBcIkNvdGhcIiwgb3BzMlswXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qIGNvbnZlcnRzIChyYWRpdXMsIGFuZ2xlKSAtPiAoeCwgeSkgKi9cbiAgICAvLyBGcm9tUG9sYXJDb29yZGluYXRlczoge1xuICAgIC8vICAgZG9tYWluOiAnRnVuY3Rpb24nLFxuICAgIC8vICAgb3V0cHV0RG9tYWluOiBbJ1R1cGxlT2YnLCAnUmVhbE51bWJlcicsICdSZWFsTnVtYmVyJ10sXG4gICAgLy8gfSxcbiAgICBJbnZlcnNlRnVuY3Rpb246IHtcbiAgICAgIHNpZ25hdHVyZToge1xuICAgICAgICBkb21haW46IFtcIkZ1bmN0aW9uXCIsIFwiRnVuY3Rpb25cIiwgXCJGdW5jdGlvblwiXSxcbiAgICAgICAgY2Fub25pY2FsOiAoY2UsIG9wczIpID0+IHtcbiAgICAgICAgICBvcHMyID0gdmFsaWRhdGVBcmd1bWVudENvdW50KGNlLCBmbGF0dGVuU2VxdWVuY2UoY2Fub25pY2FsKG9wczIpKSwgMSk7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NJbnZlcnNlRnVuY3Rpb24oY2UsIG9wczIpID8/IGNlLl9mbihcIkludmVyc2VGdW5jdGlvblwiLCBvcHMyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2ltcGxpZnk6IChjZSwgb3BzMikgPT4gcHJvY2Vzc0ludmVyc2VGdW5jdGlvbihjZSwgb3BzMiksXG4gICAgICAgIGV2YWx1YXRlOiAoY2UsIG9wczIpID0+IHByb2Nlc3NJbnZlcnNlRnVuY3Rpb24oY2UsIG9wczIpXG4gICAgICB9XG4gICAgfVxuICB9XG5dO1xudmFyIFMyID0gW1wiU3FydFwiLCAyXTtcbnZhciBTMyA9IFtcIlNxcnRcIiwgM107XG52YXIgUzUgPSBbXCJTcXJ0XCIsIDVdO1xudmFyIFM2ID0gW1wiU3FydFwiLCA2XTtcbnZhciBDT05TVFJVQ1RJQkxFX1ZBTFVFUyA9IFtcbiAgW1xuICAgIFswLCAxXSxcbiAgICB7XG4gICAgICBTaW46IDAsXG4gICAgICBDb3M6IDEsXG4gICAgICBUYW46IDAsXG4gICAgICBDb3Q6IE5hTixcbiAgICAgIFNlYzogMSxcbiAgICAgIENzYzogTmFOXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDEyXSxcbiAgICB7XG4gICAgICBTaW46IFtcIkRpdmlkZVwiLCBbXCJTdWJ0cmFjdFwiLCBTNiwgUzJdLCA0XSxcbiAgICAgIENvczogW1wiRGl2aWRlXCIsIFtcIkFkZFwiLCBTNiwgUzJdLCA0XSxcbiAgICAgIFRhbjogW1wiU3VidHJhY3RcIiwgMiwgUzNdLFxuICAgICAgQ290OiBbXCJBZGRcIiwgMiwgUzNdLFxuICAgICAgU2VjOiBbXCJTdWJ0cmFjdFwiLCBTNiwgUzJdLFxuICAgICAgQ3NjOiBbXCJBZGRcIiwgUzYsIFMyXVxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFsxLCAxMF0sXG4gICAge1xuICAgICAgU2luOiBbXCJEaXZpZGVcIiwgW1wiU3VidHJhY3RcIiwgUzUsIDFdLCA0XSxcbiAgICAgIENvczogW1wiRGl2aWRlXCIsIFtcIlNxcnRcIiwgW1wiQWRkXCIsIDEwLCBbXCJNdWx0aXBseVwiLCAyLCBTNV1dXSwgNF0sXG4gICAgICBUYW46IFtcIkRpdmlkZVwiLCBbXCJTcXJ0XCIsIFtcIlN1YnRyYWN0XCIsIDI1LCBbXCJNdWx0aXBseVwiLCAxMCwgUzVdXV0sIDRdLFxuICAgICAgQ290OiBbXCJTcXJ0XCIsIFtcIkFkZFwiLCA1LCBbXCJNdWx0aXBseVwiLCAyLCBTNV1dXSxcbiAgICAgIFNlYzogW1wiRGl2aWRlXCIsIFtcIlNxcnRcIiwgW1wiU3VidHJhY3RcIiwgNTAsIFtcIk11bHRpcGx5XCIsIDEwLCBTNV1dXSwgNV0sXG4gICAgICBDc2M6IFtcIkFkZFwiLCAxLCBTNV1cbiAgICB9XG4gIF0sXG4gIFtcbiAgICBbMSwgOF0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3tcXFxcc3FydHsyLVxcXFxzcXJ0Mn19ezJ9JFwiLFxuICAgICAgQ29zOiBcIiRcXFxcZnJhY3tcXFxcc3FydCB7Mit7XFxcXHNxcnQgezJ9fX19ezJ9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcc3FydHsyfSAtIDEkXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxzcXJ0ezJ9ICsgMSRcIixcbiAgICAgIFNlYzogXCIkXFxcXHNxcnR7IDQgLSAyXFxcXHNxcnR7Mn19JFwiLFxuICAgICAgQ3NjOiBcIiRcXFxcc3FydHsgNCArIDJcXFxcc3FydHsyfX0kXCJcbiAgICB9XG4gIF0sXG4gIFtcbiAgICBbMSwgNl0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3sxfXsyfSRcIixcbiAgICAgIENvczogXCIkXFxcXGZyYWN7XFxcXHNxcnR7M319ezJ9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcZnJhY3tcXFxcc3FydHszfX17M30kXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxmcmFjezJcXFxcc3FydHszfX17M30kXCIsXG4gICAgICBTZWM6IFwiJFxcXFxzcXJ0ezN9JFwiLFxuICAgICAgQ3NjOiAyXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDVdLFxuICAgIHtcbiAgICAgIFNpbjogXCIkXFxcXGZyYWN7XFxcXHNxcnR7MTAtIDJcXFxcc3FydHs1fX19IHs0fSRcIixcbiAgICAgIENvczogXCIkXFxcXGZyYWN7MSsgXFxcXHNxcnR7NX19IHs0fSRcIixcbiAgICAgIFRhbjogXCIkXFxcXHNxcnR7NS0yXFxcXHNxcnQ1fSRcIixcbiAgICAgIENvdDogXCIkXFxcXGZyYWN7XFxcXHNxcnR7MjUrMTBcXFxcc3FydDV9fSB7NX0kXCIsXG4gICAgICBTZWM6IFwiJFxcXFxzcXJ0ezV9IC0gMSRcIixcbiAgICAgIENzYzogXCIkXFxcXGZyYWN7XFxcXHNxcnR7NTArMTBcXFxcc3FydHs1fX19IHs1fSRcIlxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFsxLCA0XSxcbiAgICB7XG4gICAgICBTaW46IFtcIkRpdmlkZVwiLCBTMiwgMl0sXG4gICAgICBDb3M6IFtcIkRpdmlkZVwiLCBTMiwgMl0sXG4gICAgICBUYW46IDEsXG4gICAgICBDb3Q6IDEsXG4gICAgICBTZWM6IFMyLFxuICAgICAgQ3NjOiBTMlxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFszLCAxMF0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3sxKyBcXFxcc3FydHs1fX0gezR9JFwiLFxuICAgICAgQ29zOiBcIiRcXFxcZnJhY3tcXFxcc3FydHsxMC0gMlxcXFxzcXJ0ezV9fX0gezR9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcZnJhY3tcXFxcc3FydHsyNSsxMFxcXFxzcXJ0NX19IHs1fSRcIixcbiAgICAgIENvdDogXCIkXFxcXHNxcnR7NS0yXFxcXHNxcnQ1fSRcIixcbiAgICAgIFNlYzogXCIkJFwiLFxuICAgICAgQ3NjOiBcIiRcXFxcZnJhY3tcXFxcc3FydHs1MCsxMFxcXFxzcXJ0ezV9fX0gezV9JFwiXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDNdLFxuICAgIHtcbiAgICAgIFNpbjogW1wiRGl2aWRlXCIsIFMzLCAyXSxcbiAgICAgIC8vICckXFxcXGZyYWN7XFxcXHNxcnR7M319ezJ9JCdcbiAgICAgIENvczogXCJIYWxmXCIsXG4gICAgICAvLyAnJFxcXFxmcmFjezF9ezJ9JCdcbiAgICAgIFRhbjogUzMsXG4gICAgICAvLyAnJFxcXFxzcXJ0ezN9JCdcbiAgICAgIENvdDogW1wiRGl2aWRlXCIsIFMzLCAzXSxcbiAgICAgIC8vICckXFxcXGZyYWN7XFxcXHNxcnR7M319ezN9JCdcbiAgICAgIFNlYzogMixcbiAgICAgIENzYzogW1wiRGl2aWRlXCIsIFtcIk11bHRpcGx5XCIsIDIsIFMzXSwgM11cbiAgICAgIC8vICckXFxcXGZyYWN7MlxcXFxzcXJ0ezN9fXszfSQnXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzMsIDhdLFxuICAgIHtcbiAgICAgIFNpbjogXCIkXFxcXGZyYWN7IFxcXFxzcXJ0ezIgKyBcXFxcc3FydHsyfX0gfSB7Mn0kXCIsXG4gICAgICBDb3M6IFwiJFxcXFxmcmFjeyBcXFxcc3FydHsyIC0gXFxcXHNxcnR7Mn19IH0gezJ9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcc3FydHsyfSArIDEkXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxzcXJ0ezJ9IC0gMSRcIixcbiAgICAgIFNlYzogXCIkXFxcXHNxcnR7IDQgKyAyIFxcXFxzcXJ0ezJ9IH0kXCIsXG4gICAgICBDc2M6IFwiJFxcXFxzcXJ0eyA0IC0gMiBcXFxcc3FydHsyfSB9JFwiXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzIsIDVdLFxuICAgIHtcbiAgICAgIFNpbjogXCIkXFxcXGZyYWN7XFxcXHNxcnR7MTArIDJcXFxcc3FydHs1fX19IHs0fSRcIixcbiAgICAgIENvczogXCIkXFxcXGZyYWN7XFxcXHNxcnR7NX0tMX0gezR9JFwiLFxuICAgICAgVGFuOiBcIiRcXFxcc3FydHs1KzJcXFxcc3FydHs1fX0kXCIsXG4gICAgICBDb3Q6IFwiJFxcXFxmcmFje1xcXFxzcXJ0ezI1LTEwXFxcXHNxcnR7NX19fSB7NX0kXCIsXG4gICAgICBTZWM6IFwiJDEgKyBcXFxcc3FydHs1fSRcIixcbiAgICAgIENzYzogXCIkXFxcXGZyYWN7XFxcXHNxcnR7NTAtMTBcXFxcc3FydHs1fX19IHs1fSRcIlxuICAgIH1cbiAgXSxcbiAgW1xuICAgIFs1LCAxMl0sXG4gICAge1xuICAgICAgU2luOiBcIiRcXFxcZnJhY3tcXFxcc3FydHs2fSArIFxcXFxzcXJ0ezJ9fSB7NH0kXCIsXG4gICAgICBDb3M6IFwiJFxcXFxmcmFjeyBcXFxcc3FydHs2fSAtIFxcXFxzcXJ0ezJ9fSB7NH0kXCIsXG4gICAgICBUYW46IFwiJDIrXFxcXHNxcnR7M30kXCIsXG4gICAgICBDb3Q6IFwiJDItXFxcXHNxcnR7M30kXCIsXG4gICAgICBTZWM6IFwiJFxcXFxzcXJ0ezZ9K1xcXFxzcXJ0ezJ9JFwiLFxuICAgICAgQ3NjOiBcIiRcXFxcc3FydHs2fSAtIFxcXFxzcXJ0ezJ9JFwiXG4gICAgfVxuICBdLFxuICBbXG4gICAgWzEsIDJdLFxuICAgIHtcbiAgICAgIFNpbjogMSxcbiAgICAgIENvczogMCxcbiAgICAgIFRhbjogTmFOLFxuICAgICAgQ290OiAwLFxuICAgICAgU2VjOiBOYU4sXG4gICAgICBDc2M6IDFcbiAgICB9XG4gIF1cbl07XG52YXIgVFJJR19JREVOVElUSUVTID0ge1xuICBTaW46IFtcbiAgICBbMSwgXCJTaW5cIl0sXG4gICAgWzEsIFwiQ29zXCJdLFxuICAgIFstMSwgXCJTaW5cIl0sXG4gICAgWy0xLCBcIkNvc1wiXVxuICBdLFxuICBDb3M6IFtcbiAgICBbMSwgXCJDb3NcIl0sXG4gICAgWy0xLCBcIlNpblwiXSxcbiAgICBbLTEsIFwiQ29zXCJdLFxuICAgIFsxLCBcIlNpblwiXVxuICBdLFxuICBTZWM6IFtcbiAgICBbMSwgXCJTZWNcIl0sXG4gICAgWy0xLCBcIkNzY1wiXSxcbiAgICBbLTEsIFwiU2VjXCJdLFxuICAgIFsxLCBcIkNzY1wiXVxuICBdLFxuICBDc2M6IFtcbiAgICBbMSwgXCJDc2NcIl0sXG4gICAgWzEsIFwiU2VjXCJdLFxuICAgIFstMSwgXCJDc2NcIl0sXG4gICAgWy0xLCBcIlNlY1wiXVxuICBdLFxuICBUYW46IFtcbiAgICBbMSwgXCJUYW5cIl0sXG4gICAgWy0xLCBcIkNvdFwiXSxcbiAgICBbMSwgXCJUYW5cIl0sXG4gICAgWy0xLCBcIkNvdFwiXVxuICBdLFxuICBDb3Q6IFtcbiAgICBbMSwgXCJDb3RcIl0sXG4gICAgWy0xLCBcIlRhblwiXSxcbiAgICBbMSwgXCJDb3RcIl0sXG4gICAgWy0xLCBcIlRhblwiXVxuICBdXG59O1xuZnVuY3Rpb24gY29uc3RydWN0aWJsZVZhbHVlcyhjZSwgaGVhZDIsIHgpIHtcbiAgaWYgKCF4KVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGNvbnN0IHNwZWNpYWxWYWx1ZXMgPSBjZS5jYWNoZShcbiAgICBcImNvbnN0cnVjdGlibGUtdHJpZ29ub21ldHJpYy12YWx1ZXNcIixcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW3ZhbCwgcmVzdWx0c10gb2YgQ09OU1RSVUNUSUJMRV9WQUxVRVMpIHtcbiAgICAgICAgY29uc3QgYm94ZWRSZXN1bHRzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaGVhZDMgb2YgT2JqZWN0LmtleXMocmVzdWx0cykpXG4gICAgICAgICAgYm94ZWRSZXN1bHRzW2hlYWQzXSA9IGNlLnBhcnNlKGxhdGV4U3RyaW5nKHJlc3VsdHNbaGVhZDNdKSkgPz8gY2UuYm94KHJlc3VsdHNbaGVhZDNdKTtcbiAgICAgICAgdmFsdWVzLnB1c2goW3ZhbCwgYm94ZWRSZXN1bHRzXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH0sXG4gICAgKGNhY2hlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IFtfaywgdl0gb2YgY2FjaGUpIHtcbiAgICAgICAgZm9yIChjb25zdCB2MiBvZiBPYmplY3QudmFsdWVzKHYpKVxuICAgICAgICAgIHYyLnVuYmluZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgKTtcbiAgeCA9IHguTigpO1xuICBpZiAoeC5udW1lcmljVmFsdWUgPT09IG51bGwpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHRoZXRhID0gYXNGbG9hdCh4KSA/PyBudWxsO1xuICBpZiAodGhldGEgPT09IG51bGwpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgdGhldGEgPSB0aGV0YSAlICgyICogTWF0aC5QSSk7XG4gIGNvbnN0IGlkZW50aXR5U2lnbiA9IGhlYWQyICE9PSBcIkNvc1wiICYmIGhlYWQyICE9PSBcIlNlY1wiID8gTWF0aC5zaWduKHRoZXRhKSA6IDE7XG4gIHRoZXRhID0gTWF0aC5hYnModGhldGEpO1xuICBjb25zdCBxdWFkcmFudDIgPSBNYXRoLmZsb29yKHRoZXRhICogMiAvIE1hdGguUEkpO1xuICB0aGV0YSA9IHRoZXRhICUgKE1hdGguUEkgLyAyKTtcbiAgbGV0IHNpZ24yO1xuICBbc2lnbjIsIGhlYWQyXSA9IFRSSUdfSURFTlRJVElFU1toZWFkMl0/LltxdWFkcmFudDJdID8/IFsxLCBoZWFkMl07XG4gIHNpZ24yID0gc2lnbjIgKiBpZGVudGl0eVNpZ247XG4gIGZvciAoY29uc3QgW1tuLCBkXSwgcmVzdWx0XSBvZiBzcGVjaWFsVmFsdWVzKSB7XG4gICAgaWYgKHJlc3VsdFtoZWFkMl0gJiYgY2UuY2hvcCh0aGV0YSAtIE1hdGguUEkgKiBuIC8gZCkgPT09IDApIHtcbiAgICAgIHJldHVybiBzaWduMiA8IDAgPyBjYW5vbmljYWxOZWdhdGUocmVzdWx0W2hlYWQyXSkgOiByZXN1bHRbaGVhZDJdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gcHJvY2Vzc0ludmVyc2VGdW5jdGlvbihjZSwgeHMpIHtcbiAgaWYgKHhzLmxlbmd0aCAhPT0gMSlcbiAgICByZXR1cm4gdm9pZCAwO1xuICBjb25zdCBleHByID0geHNbMF07XG4gIGNvbnN0IGhlYWQyID0gZXhwci5zeW1ib2w7XG4gIGlmICh0eXBlb2YgaGVhZDIgIT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKGhlYWQyID09PSBcIkludmVyc2VGdW5jdGlvblwiKVxuICAgIHJldHVybiBleHByLm9wMTtcbiAgY29uc3QgbmV3SGVhZCA9IHtcbiAgICBTaW46IFwiQXJjc2luXCIsXG4gICAgQ29zOiBcIkFyY2Nvc1wiLFxuICAgIFRhbjogXCJBcmN0YW5cIixcbiAgICBTZWM6IFwiQXJjc2VjXCIsXG4gICAgQ3NjOiBcIiBBcmNjc2NcIixcbiAgICBTaW5oOiBcIkFyc2luaFwiLFxuICAgIENvc2g6IFwiQXJjb3NoXCIsXG4gICAgVGFuaDogXCJBcnRhbmhcIixcbiAgICBTZWNoOiBcIkFyY3NlY2hcIixcbiAgICBDc2NoOiBcIkFyY3NjaFwiLFxuICAgIEFyY29zaDogXCJDb3NoXCIsXG4gICAgQXJjY29zOiBcIkNvc1wiLFxuICAgIEFyY2NzYzogXCJDc2NcIixcbiAgICBBcmNzY2g6IFwiQ3NjaFwiLFxuICAgIC8vICc/Pyc6ICdDb3QnLFxuICAgIC8vICc/Pyc6ICdDb3RoJyxcbiAgICBBcmNzZWM6IFwiU2VjXCIsXG4gICAgQXJjc2luOiBcIlNpblwiLFxuICAgIEFyc2luaDogXCJTaW5oXCIsXG4gICAgQXJjdGFuOiBcIlRhblwiLFxuICAgIEFydGFuaDogXCJUYW5oXCJcbiAgfVtoZWFkMl07XG4gIHJldHVybiBuZXdIZWFkID8gY2Uuc3ltYm9sKG5ld0hlYWQpIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZXZhbFRyaWcoY2UsIG1vZGUsIGhlYWQyLCBvcDMpIHtcbiAgaWYgKCFvcDMpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKG1vZGUgPT09IFwiZXZhbHVhdGVcIikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN0cnVjdGlibGVWYWx1ZXMoY2UsIGhlYWQyLCBvcDMpPy5ldmFsdWF0ZSgpO1xuICAgIGlmIChyZXN1bHQpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChvcDMuaXNFeGFjdClcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgc3dpdGNoIChoZWFkMikge1xuICAgIGNhc2UgXCJBcmNjb3NcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5hY29zLFxuICAgICAgICAoeCkgPT4geC5hY29zKCksXG4gICAgICAgICh4KSA9PiB4LmFjb3MoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJjY290XCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiBNYXRoLmF0YW4yKDEsIHgpLFxuICAgICAgICAoeCkgPT4gRGVjaW1hbC5hdGFuMihjZS5fQklHTlVNX09ORSwgeCksXG4gICAgICAgICh4KSA9PiB4LmludmVyc2UoKS5hdGFuKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY2NzY1wiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gTWF0aC5hc2luKDEgLyB4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLmRpdih4KS5hc2luKCksXG4gICAgICAgICh4KSA9PiB4LmludmVyc2UoKS5hc2luKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY29zaFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICBNYXRoLmFjb3NoLFxuICAgICAgICAoeCkgPT4geC5hY29zaCgpLFxuICAgICAgICAoeCkgPT4geC5hY29zaCgpXG4gICAgICApO1xuICAgIGNhc2UgXCJBcmNvdGhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgKHgpID0+IHgsXG4gICAgICAgICh4KSA9PiB4LmFjb3NoKCksXG4gICAgICAgICh4KSA9PiB4LmFjb3NoKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY3NjaFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gTWF0aC5sb2coMSAvIHggKyBNYXRoLnNxcnQoMSAvICh4ICogeCkgKyAxKSksXG4gICAgICAgICh4KSA9PiBjZS5fQklHTlVNX09ORS5kaXYoeC5tdWwoeCkpLmFkZChjZS5fQklHTlVNX09ORSkuc3FydCgpLmFkZChjZS5fQklHTlVNX09ORS5kaXYoeCkpLmxvZygpLFxuICAgICAgICAoeCkgPT4geC5tdWwoeCkuaW52ZXJzZSgpLmFkZCgxKS5zcXJ0KCkuYWRkKHguaW52ZXJzZSgpKS5sb2coKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJjc2VjXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiBNYXRoLmFjb3MoMSAvIHgpLFxuICAgICAgICAoeCkgPT4gY2UuX0JJR05VTV9PTkUuZGl2KHgpLmFjb3MoKSxcbiAgICAgICAgKHgpID0+IHguaW52ZXJzZSgpLmFjb3MoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJjc2luXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguYXNpbixcbiAgICAgICAgKHgpID0+IHguYXNpbigpLFxuICAgICAgICAoeCkgPT4geC5hc2luKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyc2VjaFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gTWF0aC5sb2coKDEgKyBNYXRoLnNxcnQoMSAtIHggKiB4KSkgLyB4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLnN1Yih4Lm11bCh4KS5hZGQoY2UuX0JJR05VTV9PTkUpLmRpdih4KSkubG9nKCksXG4gICAgICAgICh4KSA9PiBjZS5jb21wbGV4KDEpLnN1Yih4Lm11bCh4KSkuYWRkKDEpLmRpdih4KS5sb2coKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQXJzaW5oXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguYXNpbmgsXG4gICAgICAgICh4KSA9PiB4LmFzaW5oKCksXG4gICAgICAgICh4KSA9PiB4LmFzaW5oKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkFyY3RhblwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICBNYXRoLmF0YW4sXG4gICAgICAgICh4KSA9PiB4LmF0YW4oKSxcbiAgICAgICAgKHgpID0+IHguYXRhbigpXG4gICAgICApO1xuICAgIGNhc2UgXCJBcnRhbmhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5hdGFuaCxcbiAgICAgICAgKHgpID0+IHguYXRhbmgoKSxcbiAgICAgICAgKHgpID0+IHguYXRhbmgoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQ29zXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguY29zLFxuICAgICAgICAoeCkgPT4geC50b1NpZ25pZmljYW50RGlnaXRzKGNlLnByZWNpc2lvbiArIDQpLmNvcygpLnRvU2lnbmlmaWNhbnREaWdpdHMoY2UucHJlY2lzaW9uKSxcbiAgICAgICAgKHgpID0+IHguY29zKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkNvc2hcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5jb3NoLFxuICAgICAgICAoeCkgPT4geC5jb3NoKCksXG4gICAgICAgICh4KSA9PiB4LmNvc2goKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQ290XCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiAxIC8gTWF0aC50YW4oeCksXG4gICAgICAgICh4KSA9PiBjZS5fQklHTlVNX09ORS5kaXYoeC50YW4oKSksXG4gICAgICAgICh4KSA9PiB4LnRhbigpLmludmVyc2UoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiQ290aFwiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gMSAvIE1hdGgudGFuaCh4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLmRpdih4LnRhbmgoKSksXG4gICAgICAgICh4KSA9PiB4LnRhbmgoKS5pbnZlcnNlKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkNzY1wiOlxuICAgICAgcmV0dXJuIGFwcGx5TihcbiAgICAgICAgb3AzLFxuICAgICAgICAoeCkgPT4gMSAvIE1hdGguc2luKHgpLFxuICAgICAgICAoeCkgPT4gY2UuX0JJR05VTV9PTkUuZGl2KHguc2luKCkpLFxuICAgICAgICAoeCkgPT4geC5zaW4oKS5pbnZlcnNlKClcbiAgICAgICk7XG4gICAgY2FzZSBcIkNzY2hcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgKHgpID0+IDEgLyBNYXRoLnNpbmgoeCksXG4gICAgICAgICh4KSA9PiBjZS5fQklHTlVNX09ORS5kaXYoeC5zaW5oKCkpLFxuICAgICAgICAoeCkgPT4geC5zaW5oKCkuaW52ZXJzZSgpXG4gICAgICApO1xuICAgIGNhc2UgXCJTZWNcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgKHgpID0+IDEgLyBNYXRoLmNvcyh4KSxcbiAgICAgICAgKHgpID0+IGNlLl9CSUdOVU1fT05FLmRpdih4LmNvcygpKSxcbiAgICAgICAgKHgpID0+IHguY29zKCkuaW52ZXJzZSgpXG4gICAgICApO1xuICAgIGNhc2UgXCJTZWNoXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgICh4KSA9PiAxIC8gTWF0aC5jb3NoKHgpLFxuICAgICAgICAoeCkgPT4gY2UuX0JJR05VTV9PTkUuZGl2KHguY29zaCgpKSxcbiAgICAgICAgKHgpID0+IHguY29zaCgpLmludmVyc2UoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiU2luXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGguc2luLFxuICAgICAgICAoeCkgPT4geC50b1NpZ25pZmljYW50RGlnaXRzKGNlLnByZWNpc2lvbiArIDQpLnNpbigpLnRvU2lnbmlmaWNhbnREaWdpdHMoY2UucHJlY2lzaW9uKSxcbiAgICAgICAgKHgpID0+IHguc2luKClcbiAgICAgICk7XG4gICAgY2FzZSBcIlNpbmhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC5zaW5oLFxuICAgICAgICAoeCkgPT4geC5zaW5oKCksXG4gICAgICAgICh4KSA9PiB4LnNpbmgoKVxuICAgICAgKTtcbiAgICBjYXNlIFwiVGFuXCI6XG4gICAgICByZXR1cm4gYXBwbHlOKFxuICAgICAgICBvcDMsXG4gICAgICAgIE1hdGgudGFuLFxuICAgICAgICAoeCkgPT4geC50b1NpZ25pZmljYW50RGlnaXRzKGNlLnByZWNpc2lvbiArIDQpLnRhbigpLnRvU2lnbmlmaWNhbnREaWdpdHMoY2UucHJlY2lzaW9uKSxcbiAgICAgICAgKHgpID0+IHgudGFuKClcbiAgICAgICk7XG4gICAgY2FzZSBcIlRhbmhcIjpcbiAgICAgIHJldHVybiBhcHBseU4oXG4gICAgICAgIG9wMyxcbiAgICAgICAgTWF0aC50YW5oLFxuICAgICAgICAoeCkgPT4geC50YW5oKCksXG4gICAgICAgICh4KSA9PiB4LnRhbmgoKVxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1zeW1ib2wtZGVmaW5pdGlvbi50c1xudmFyIGltcG9ydF9jb21wbGV4MTcgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbnZhciBCb3hlZFN5bWJvbERlZmluaXRpb25JbXBsID0gY2xhc3Mge1xuICAvLyBAdG9kb1xuICBjb25zdHJ1Y3RvcihjZSwgbmFtZSwgZGVmKSB7XG4gICAgaWYgKCFjZS5jb250ZXh0KVxuICAgICAgdGhyb3cgRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZVwiKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMud2lraWRhdGEgPSBkZWYud2lraWRhdGE7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlZi5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnVybCA9IGRlZi51cmw7XG4gICAgdGhpcy5fZW5naW5lID0gY2U7XG4gICAgdGhpcy5zY29wZSA9IGNlLmNvbnRleHQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl9mbGFncyA9IGRlZi5mbGFncyA/IG5vcm1hbGl6ZUZsYWdzKGRlZi5mbGFncykgOiB2b2lkIDA7XG4gICAgdGhpcy5fZG9tYWluID0gZGVmLmRvbWFpbiA/IGNlLmRvbWFpbihkZWYuZG9tYWluKSA6IHZvaWQgMDtcbiAgICB0aGlzLmNvbnN0YW50ID0gZGVmLmNvbnN0YW50ID8/IGZhbHNlO1xuICAgIHRoaXMuaG9sZFVudGlsID0gZGVmLmhvbGRVbnRpbCA/PyBcImV2YWx1YXRlXCI7XG4gICAgaWYgKHRoaXMuY29uc3RhbnQpIHtcbiAgICAgIHRoaXMuX2RlZlZhbHVlID0gZGVmLnZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVmLnZhbHVlKSB7XG4gICAgICAgIGlmIChpc0xhdGV4U3RyaW5nKGRlZi52YWx1ZSkpXG4gICAgICAgICAgdGhpcy5fdmFsdWUgPSBjZS5wYXJzZShkZWYudmFsdWUpID8/IGNlLnN5bWJvbChcIlVuZGVmaW5lZFwiKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZi52YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIHRoaXMuX3ZhbHVlID0gY2UuYm94KGRlZi52YWx1ZShjZSkgPz8gXCJVbmRlZmluZWRcIik7XG4gICAgICAgIGVsc2UgaWYgKGRlZi52YWx1ZSBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uKVxuICAgICAgICAgIHRoaXMuX3ZhbHVlID0gZGVmLnZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5fdmFsdWUgPSBjZS5ib3goZGVmLnZhbHVlKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAgIGlmICghdGhpcy5fdmFsdWUgJiYgdGhpcy5fZG9tYWluICYmICFkZWYuZmxhZ3MpXG4gICAgICAgIHRoaXMuX2ZsYWdzID0gZG9tYWluVG9GbGFncyh0aGlzLl9kb21haW4pO1xuICAgIH1cbiAgfVxuICByZXNldCgpIHtcbiAgICBpZiAodGhpcy5jb25zdGFudClcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgfVxuICAvLyB1bmJpbmQoKSB7XG4gIC8vICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAvLyAgIHRoaXMuX2RvbWFpbiA9IG51bGw7XG4gIC8vIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgY2UgPSB0aGlzLl9lbmdpbmU7XG4gICAgICBpZiAoaXNMYXRleFN0cmluZyh0aGlzLl9kZWZWYWx1ZSkpXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gY2UucGFyc2UodGhpcy5fZGVmVmFsdWUpID8/IGNlLnN5bWJvbChcIlVuZGVmaW5lZFwiKTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9kZWZWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aGlzLl92YWx1ZSA9IGNlLmJveCh0aGlzLl9kZWZWYWx1ZShjZSkgPz8gXCJVbmRlZmluZWRcIik7XG4gICAgICBlbHNlIGlmICh0aGlzLl9kZWZWYWx1ZSlcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBjZS5ib3godGhpcy5fZGVmVmFsdWUpO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAgIGlmICh0aGlzLl92YWx1ZT8ubnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX3ZhbHVlLm51bWVyaWNWYWx1ZTtcbiAgICAgICAgaWYgKCFiaWdudW1QcmVmZXJyZWQoY2UpICYmIHZhbCBpbnN0YW5jZW9mIGRlY2ltYWxfZGVmYXVsdClcbiAgICAgICAgICB0aGlzLl92YWx1ZSA9IGNlLm51bWJlcih2YWwudG9OdW1iZXIoKSk7XG4gICAgICAgIGVsc2UgaWYgKCFjb21wbGV4QWxsb3dlZChjZSkgJiYgdmFsIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxNy5kZWZhdWx0KVxuICAgICAgICAgIHRoaXMuX3ZhbHVlID0gY2UuX05BTjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IHZvaWQgMDtcbiAgfVxuICBzZXQgdmFsdWUodmFsKSB7XG4gICAgaWYgKHRoaXMuY29uc3RhbnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50IFwiJHt0aGlzLm5hbWV9XCIgY2Fubm90IGJlIGNoYW5nZWRgXG4gICAgICApO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0aGlzLl9kZWZWYWx1ZSA9PT0gdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9lbmdpbmUubnVtYmVyKHZhbCk7XG4gICAgfSBlbHNlIGlmICh2YWwpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbCA9IHRoaXMuX2VuZ2luZS5ib3godmFsKTtcbiAgICAgIGlmICghdGhpcy5fZG9tYWluIHx8IG5ld1ZhbC5kb21haW4uaXNDb21wYXRpYmxlKHRoaXMuX2RvbWFpbikpXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdm9pZCAwKVxuICAgICAgdGhpcy5fZmxhZ3MgPSB2b2lkIDA7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fZmxhZ3MgPSBkb21haW5Ub0ZsYWdzKHRoaXMuZG9tYWluKTtcbiAgfVxuICBnZXQgZG9tYWluKCkge1xuICAgIHJldHVybiB0aGlzLl9kb21haW4gPz8gdGhpcy5fdmFsdWU/LmRvbWFpbiA/PyB2b2lkIDA7XG4gIH1cbiAgc2V0IGRvbWFpbihkb21haW4pIHtcbiAgICBpZiAodGhpcy5jb25zdGFudClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBkb21haW4gb2YgdGhlIGNvbnN0YW50IFwiJHt0aGlzLm5hbWV9XCIgY2Fubm90IGJlIGNoYW5nZWRgXG4gICAgICApO1xuICAgIGlmICghZG9tYWluKSB7XG4gICAgICB0aGlzLl9kZWZWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICAgICAgdGhpcy5fZmxhZ3MgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9kb21haW4gPSB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbWFpbiA9IHRoaXMuX2VuZ2luZS5kb21haW4oZG9tYWluKTtcbiAgICBpZiAodGhpcy5fZG9tYWluPy5pc051bWVyaWMpIHtcbiAgICAgIGlmICghZG9tYWluLmlzTnVtZXJpYylcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJDYW4ndCBjaGFuZ2UgZnJvbSBhIG51bWVyaWMgZG9tYWluIHRvIGEgbm9uLW51bWVyaWMgb25lXCIpO1xuICAgICAgdGhpcy5fZG9tYWluID0gZG9tYWluO1xuICAgICAgaWYgKCF0aGlzLl92YWx1ZSlcbiAgICAgICAgdGhpcy5fZmxhZ3MgPSB7IC4uLnRoaXMuX2ZsYWdzID8/IHt9LCAuLi5kb21haW5Ub0ZsYWdzKGRvbWFpbikgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbWFpbilcbiAgICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgY2hhbmdlIGEgbm9uLW51bWVyaWMgZG9tYWluXCIpO1xuICAgIHRoaXMuX2ZsYWdzID0gdm9pZCAwO1xuICAgIHRoaXMuX2RvbWFpbiA9IGRvbWFpbjtcbiAgICBpZiAoIXRoaXMuX3ZhbHVlICYmIGRvbWFpbi5pc051bWVyaWMpXG4gICAgICB0aGlzLl9mbGFncyA9IHsgLi4udGhpcy5fZmxhZ3MgPz8ge30sIC4uLmRvbWFpblRvRmxhZ3MoZG9tYWluKSB9O1xuICB9XG4gIC8vXG4gIC8vIEZsYWdzXG4gIC8vXG4gIGdldCBudW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTnVtYmVyID8/IHRoaXMuX2ZsYWdzPy5udW1iZXI7XG4gIH1cbiAgc2V0IG51bWJlcih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbnVtYmVyOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGludGVnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzSW50ZWdlciA/PyB0aGlzLl9mbGFncz8uaW50ZWdlcjtcbiAgfVxuICBzZXQgaW50ZWdlcih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgaW50ZWdlcjogdmFsIH0pO1xuICB9XG4gIGdldCByYXRpb25hbCgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNSYXRpb25hbCA/PyB0aGlzLl9mbGFncz8ucmF0aW9uYWw7XG4gIH1cbiAgc2V0IHJhdGlvbmFsKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyByYXRpb25hbDogdmFsIH0pO1xuICB9XG4gIGdldCBhbGdlYnJhaWMoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzQWxnZWJyYWljID8/IHRoaXMuX2ZsYWdzPy5hbGdlYnJhaWM7XG4gIH1cbiAgc2V0IGFsZ2VicmFpYyh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgYWxnZWJyYWljOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IHJlYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzUmVhbCA/PyB0aGlzLl9mbGFncz8ucmVhbDtcbiAgfVxuICBzZXQgcmVhbCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgcmVhbDogdmFsIH0pO1xuICB9XG4gIGdldCBleHRlbmRlZFJlYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzRXh0ZW5kZWRSZWFsID8/IHRoaXMuX2ZsYWdzPy5leHRlbmRlZFJlYWw7XG4gIH1cbiAgc2V0IGV4dGVuZGVkUmVhbCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgZXh0ZW5kZWRSZWFsOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGNvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzQ29tcGxleCA/PyB0aGlzLl9mbGFncz8uY29tcGxleDtcbiAgfVxuICBzZXQgY29tcGxleCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgY29tcGxleDogdmFsIH0pO1xuICB9XG4gIGdldCBleHRlbmRlZENvbXBsZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzRXh0ZW5kZWRDb21wbGV4ID8/IHRoaXMuX2ZsYWdzPy5leHRlbmRlZENvbXBsZXg7XG4gIH1cbiAgc2V0IGV4dGVuZGVkQ29tcGxleCh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgZXh0ZW5kZWRDb21wbGV4OiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGltYWdpbmFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNJbWFnaW5hcnkgPz8gdGhpcy5fZmxhZ3M/LmltYWdpbmFyeTtcbiAgfVxuICBzZXQgaW1hZ2luYXJ5KHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyBpbWFnaW5hcnk6IHZhbCB9KTtcbiAgfVxuICBnZXQgcG9zaXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzUG9zaXRpdmUgPz8gdGhpcy5fZmxhZ3M/LnBvc2l0aXZlO1xuICB9XG4gIHNldCBwb3NpdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgcG9zaXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgbm9uUG9zaXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTm9uUG9zaXRpdmUgPz8gdGhpcy5fZmxhZ3M/Lm5vblBvc2l0aXZlO1xuICB9XG4gIHNldCBub25Qb3NpdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbm9uUG9zaXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgbmVnYXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTmVnYXRpdmUgPz8gdGhpcy5fZmxhZ3M/Lm5lZ2F0aXZlO1xuICB9XG4gIHNldCBuZWdhdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbmVnYXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgbm9uTmVnYXRpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTm9uTmVnYXRpdmUgPz8gdGhpcy5fZmxhZ3M/Lm5vbk5lZ2F0aXZlO1xuICB9XG4gIHNldCBub25OZWdhdGl2ZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbm9uTmVnYXRpdmU6IHZhbCB9KTtcbiAgfVxuICBnZXQgemVybygpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNaZXJvID8/IHRoaXMuX2ZsYWdzPy56ZXJvO1xuICB9XG4gIHNldCB6ZXJvKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyB6ZXJvOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IG5vdFplcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzTm90WmVybyA/PyB0aGlzLl9mbGFncz8ubm90WmVybztcbiAgfVxuICBzZXQgbm90WmVybyh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgbm90WmVybzogdmFsIH0pO1xuICB9XG4gIGdldCBvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU/LmlzT25lID8/IHRoaXMuX2ZsYWdzPy5vbmU7XG4gIH1cbiAgc2V0IG9uZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgb25lOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IG5lZ2F0aXZlT25lKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc05lZ2F0aXZlT25lID8/IHRoaXMuX2ZsYWdzPy5uZWdhdGl2ZU9uZTtcbiAgfVxuICBzZXQgbmVnYXRpdmVPbmUodmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IG5lZ2F0aXZlT25lOiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGluZmluaXR5KCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc0luZmluaXR5ID8/IHRoaXMuX2ZsYWdzPy5pbmZpbml0eTtcbiAgfVxuICBzZXQgaW5maW5pdHkodmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IGluZmluaXR5OiB2YWwgfSk7XG4gIH1cbiAgZ2V0IGZpbml0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZT8uaXNGaW5pdGUgPz8gdGhpcy5fZmxhZ3M/LmZpbml0ZTtcbiAgfVxuICBzZXQgZmluaXRlKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyBmaW5pdGU6IHZhbCB9KTtcbiAgfVxuICBnZXQgTmFOKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc05hTiA/PyB0aGlzLl9mbGFncz8uTmFOO1xuICB9XG4gIHNldCBOYU4odmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IE5hTjogdmFsIH0pO1xuICB9XG4gIGdldCBldmVuKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc0V2ZW4gPz8gdGhpcy5fZmxhZ3M/LmV2ZW47XG4gIH1cbiAgc2V0IGV2ZW4odmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IGV2ZW46IHZhbCB9KTtcbiAgfVxuICBnZXQgb2RkKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlPy5pc09kZCA/PyB0aGlzLl9mbGFncz8ub2RkO1xuICB9XG4gIHNldCBvZGQodmFsKSB7XG4gICAgdGhpcy51cGRhdGVGbGFncyh7IG9kZDogdmFsIH0pO1xuICB9XG4gIGdldCBwcmltZSgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl92YWx1ZTtcbiAgICBpZiAodmFsKSB7XG4gICAgICBpZiAoIXZhbC5pc0ludGVnZXIgfHwgdmFsLmlzTm9uUG9zaXRpdmUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBpc1ByaW1lKGFzRmxvYXQodmFsKSA/PyBOYU4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmxhZ3M/LnByaW1lO1xuICB9XG4gIHNldCBwcmltZSh2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZUZsYWdzKHsgcHJpbWU6IHZhbCB9KTtcbiAgfVxuICBnZXQgY29tcG9zaXRlKCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuX3ZhbHVlO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGlmICghdmFsLmlzSW50ZWdlciB8fCB2YWwuaXNOb25Qb3NpdGl2ZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuICFpc1ByaW1lKGFzRmxvYXQodmFsKSA/PyBOYU4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmxhZ3M/LmNvbXBvc2l0ZTtcbiAgfVxuICBzZXQgY29tcG9zaXRlKHZhbCkge1xuICAgIHRoaXMudXBkYXRlRmxhZ3MoeyBjb21wb3NpdGU6IHZhbCB9KTtcbiAgfVxuICB1cGRhdGVGbGFncyhmbGFncykge1xuICAgIGlmICh0aGlzLmNvbnN0YW50KVxuICAgICAgdGhyb3cgRXJyb3IoXCJUaGUgZmxhZ3Mgb2YgY29uc3RhbnQgY2Fubm90IGJlIGNoYW5nZWRcIik7XG4gICAgaWYgKHRoaXMuZG9tYWluPy5pc051bWVyaWMgPT09IGZhbHNlKVxuICAgICAgdGhyb3cgRXJyb3IoXCJGbGFncyBvbmx5IGFwcGx5IHRvIG51bWVyaWMgZG9tYWluc1wiKTtcbiAgICBsZXQgZmxhZ0NvdW50ID0gMDtcbiAgICBsZXQgY29uc2lzdGVudCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmbGFnIGluIE9iamVjdC5rZXlzKGZsYWdzKSkge1xuICAgICAgZmxhZ0NvdW50ICs9IDE7XG4gICAgICBpZiAodGhpcy5fdmFsdWUgJiYgZmxhZ3NbZmxhZ10gIT09IHZvaWQgMCkge1xuICAgICAgICBzd2l0Y2ggKGZsYWcpIHtcbiAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNOdW1iZXIgPT09IGZsYWdzLm51bWJlcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNJbnRlZ2VyID09PSBmbGFncy5pbnRlZ2VyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInJhdGlvbmFsXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNSYXRpb25hbCA9PT0gZmxhZ3MucmF0aW9uYWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiYWxnZWJyYWljXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNBbGdlYnJhaWMgPT09IGZsYWdzLmFsZ2VicmFpYztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJyZWFsXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNSZWFsID09PSBmbGFncy5yZWFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImV4dGVuZGVkUmVhbFwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzRXh0ZW5kZWRSZWFsID09PSBmbGFncy5leHRlbmRlZFJlYWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiY29tcGxleFwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzQ29tcGxleCA9PT0gZmxhZ3MuY29tcGxleDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJleHRlbmRlZENvbXBsZXhcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc0V4dGVuZGVkQ29tcGxleCA9PT0gZmxhZ3MuZXh0ZW5kZWRDb21wbGV4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImltYWdpbmFyeVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzSW1hZ2luYXJ5ID09PSBmbGFncy5pbWFnaW5hcnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwicG9zaXRpdmVcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc1Bvc2l0aXZlID09PSBmbGFncy5wb3NpdGl2ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJub25Qb3NpdGl2ZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzTm9uUG9zaXRpdmUgPT09IGZsYWdzLm5vblBvc2l0aXZlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5lZ2F0aXZlXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNOZWdhdGl2ZSA9PT0gZmxhZ3MubmVnYXRpdmU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwibm9uTmVnYXRpdmVcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc05vbk5lZ2F0aXZlID09PSBmbGFncy5ub25OZWdhdGl2ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJ6ZXJvXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNaZXJvID09PSBmbGFncy56ZXJvO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vdFplcm9cIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc05vdFplcm8gPT09IGZsYWdzLm5vdFplcm87XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib25lXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNPbmUgPT09IGZsYWdzLm9uZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJuZWdhdGl2ZU9uZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzTmVnYXRpdmVPbmUgPT09IGZsYWdzLm5lZ2F0aXZlT25lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImluZmluaXR5XCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNJbmZpbml0eSA9PT0gZmxhZ3MuaW5maW5pdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTmFOXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNOYU4gPT09IGZsYWdzLk5hTjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmaW5pdGVcIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc0Zpbml0ZSA9PT0gZmxhZ3MuZmluaXRlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImV2ZW5cIjpcbiAgICAgICAgICAgIGNvbnNpc3RlbnQgPSB0aGlzLl92YWx1ZS5pc0V2ZW4gPT09IGZsYWdzLmV2ZW47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwib2RkXCI6XG4gICAgICAgICAgICBjb25zaXN0ZW50ID0gdGhpcy5fdmFsdWUuaXNPZGQgPT09IGZsYWdzLm9kZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJwcmltZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzUHJpbWUgPT09IGZsYWdzLnByaW1lO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImNvbXBvc2l0ZVwiOlxuICAgICAgICAgICAgY29uc2lzdGVudCA9IHRoaXMuX3ZhbHVlLmlzQ29tcG9zaXRlID09PSBmbGFncy5jb21wb3NpdGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmxhZ0NvdW50ID4gMCkge1xuICAgICAgaWYgKCFjb25zaXN0ZW50KSB7XG4gICAgICAgIHRoaXMuX2RlZlZhbHVlID0gdm9pZCAwO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2RvbWFpbiA9IHRoaXMuX2VuZ2luZS5kb21haW4oXCJOdW1iZXJcIik7XG4gICAgICBpZiAoIXRoaXMuX2ZsYWdzKVxuICAgICAgICB0aGlzLl9mbGFncyA9IG5vcm1hbGl6ZUZsYWdzKGZsYWdzKTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fZmxhZ3MgPSB7IC4uLnRoaXMuX2ZsYWdzLCAuLi5ub3JtYWxpemVGbGFncyhmbGFncykgfTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBkZWZpbmVkS2V5cyh4cykge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHhzKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT09IHZvaWQgMClcbiAgKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZsYWdzKGZsYWdzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uZmxhZ3MgfTtcbiAgaWYgKGZsYWdzLnplcm8gfHwgZmxhZ3Mub25lIHx8IGZsYWdzLm5lZ2F0aXZlT25lKSB7XG4gICAgcmVzdWx0Lnplcm8gPSBmbGFncy56ZXJvICYmICFmbGFncy5vbmUgJiYgIWZsYWdzLm5lZ2F0aXZlT25lO1xuICAgIHJlc3VsdC5ub3RaZXJvID0gIWZsYWdzLnplcm8gfHwgZmxhZ3Mub25lIHx8IGZsYWdzLm5lZ2F0aXZlT25lO1xuICAgIHJlc3VsdC5vbmUgPSBmbGFncy5vbmUgJiYgIWZsYWdzLnplcm8gJiYgIWZsYWdzLm5lZ2F0aXZlT25lO1xuICAgIHJlc3VsdC5uZWdhdGl2ZU9uZSA9IGZsYWdzLm5lZ2F0aXZlT25lICYmICFmbGFncy56ZXJvICYmICFmbGFncy5vbmU7XG4gICAgcmVzdWx0LmluZmluaXR5ID0gZmFsc2U7XG4gICAgcmVzdWx0Lk5hTiA9IGZhbHNlO1xuICAgIHJlc3VsdC5maW5pdGUgPSB0cnVlO1xuICAgIHJlc3VsdC5pbnRlZ2VyID0gdHJ1ZTtcbiAgICByZXN1bHQuZmluaXRlID0gdHJ1ZTtcbiAgICByZXN1bHQuaW5maW5pdHkgPSBmYWxzZTtcbiAgICByZXN1bHQuTmFOID0gZmFsc2U7XG4gICAgcmVzdWx0LmV2ZW4gPSBmbGFncy5vbmU7XG4gICAgcmVzdWx0Lm9kZCA9ICFmbGFncy5vbmU7XG4gICAgcmVzdWx0LnByaW1lID0gZmFsc2U7XG4gICAgcmVzdWx0LmNvbXBvc2l0ZSA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQuemVybykge1xuICAgIHJlc3VsdC5wb3NpdGl2ZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5uZWdhdGl2ZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5ub25Qb3NpdGl2ZSA9IHRydWU7XG4gICAgcmVzdWx0Lm5vbk5lZ2F0aXZlID0gdHJ1ZTtcbiAgfVxuICBpZiAocmVzdWx0Lm5vdFplcm8gPT09IHRydWUpIHtcbiAgICBpZiAoIXJlc3VsdC5pbWFnaW5hcnkpXG4gICAgICByZXN1bHQucmVhbCA9IHRydWU7XG4gICAgcmVzdWx0Lnplcm8gPSBmYWxzZTtcbiAgfVxuICBpZiAocmVzdWx0Lm9uZSkge1xuICAgIHJlc3VsdC5wb3NpdGl2ZSA9IHRydWU7XG4gIH1cbiAgaWYgKHJlc3VsdC5uZWdhdGl2ZU9uZSkge1xuICAgIHJlc3VsdC5ub25Qb3NpdGl2ZSA9IHRydWU7XG4gIH1cbiAgaWYgKHJlc3VsdC5wb3NpdGl2ZSB8fCByZXN1bHQubm9uTmVnYXRpdmUpIHtcbiAgICByZXN1bHQubmVnYXRpdmVPbmUgPSBmYWxzZTtcbiAgfVxuICBpZiAocmVzdWx0LnBvc2l0aXZlKSB7XG4gICAgcmVzdWx0Lm5vblBvc2l0aXZlID0gZmFsc2U7XG4gICAgcmVzdWx0Lm5lZ2F0aXZlID0gZmFsc2U7XG4gICAgcmVzdWx0Lm5vbk5lZ2F0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubm9uUG9zaXRpdmUpIHtcbiAgICByZXN1bHQucG9zaXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubmVnYXRpdmUgPSByZXN1bHQubm90WmVybztcbiAgICByZXN1bHQubm9uTmVnYXRpdmUgPSAhcmVzdWx0Lnplcm87XG4gIH0gZWxzZSBpZiAocmVzdWx0Lm5lZ2F0aXZlKSB7XG4gICAgcmVzdWx0LnBvc2l0aXZlID0gZmFsc2U7XG4gICAgcmVzdWx0Lm5vblBvc2l0aXZlID0gcmVzdWx0Lm5vdFplcm87XG4gICAgcmVzdWx0Lm5vbk5lZ2F0aXZlID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAocmVzdWx0Lm5vbk5lZ2F0aXZlKSB7XG4gICAgcmVzdWx0LnBvc2l0aXZlID0gcmVzdWx0Lm5vdFplcm87XG4gICAgcmVzdWx0Lm5vblBvc2l0aXZlID0gIXJlc3VsdC56ZXJvO1xuICAgIHJlc3VsdC5uZWdhdGl2ZSA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQucG9zaXRpdmUgfHwgcmVzdWx0Lm5lZ2F0aXZlIHx8IHJlc3VsdC5ub25Qb3NpdGl2ZSB8fCByZXN1bHQubm9uTmVnYXRpdmUpIHtcbiAgICByZXN1bHQubnVtYmVyID0gdHJ1ZTtcbiAgICBpZiAocmVzdWx0LmZpbml0ZSlcbiAgICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgICBlbHNlIGlmICghcmVzdWx0LmZpbml0ZSlcbiAgICAgIHJlc3VsdC5jb21wbGV4ID0gdHJ1ZTtcbiAgICByZXN1bHQuaW1hZ2luYXJ5ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHJlc3VsdC5maW5pdGUpIHtcbiAgICByZXN1bHQubnVtYmVyID0gdHJ1ZTtcbiAgICByZXN1bHQuY29tcGxleCA9IHRydWU7XG4gICAgcmVzdWx0LmluZmluaXR5ID0gZmFsc2U7XG4gICAgcmVzdWx0Lk5hTiA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQuaW5maW5pdHkpIHtcbiAgICByZXN1bHQuZmluaXRlID0gZmFsc2U7XG4gICAgcmVzdWx0Lk5hTiA9IGZhbHNlO1xuICB9XG4gIGlmIChyZXN1bHQuaW5maW5pdHkgPT09IGZhbHNlKSB7XG4gICAgcmVzdWx0LmV4dGVuZGVkQ29tcGxleCA9IGZhbHNlO1xuICAgIHJlc3VsdC5leHRlbmRlZFJlYWwgPSBmYWxzZTtcbiAgfVxuICBpZiAoZmxhZ3MuZXZlbilcbiAgICByZXN1bHQub2RkID0gZmFsc2U7XG4gIGlmIChmbGFncy5vZGQpXG4gICAgcmVzdWx0LmV2ZW4gPSBmYWxzZTtcbiAgaWYgKHJlc3VsdC5pbnRlZ2VyKVxuICAgIHJlc3VsdC5yYXRpb25hbCA9IHRydWU7XG4gIGlmIChyZXN1bHQucmF0aW9uYWwpXG4gICAgcmVzdWx0LmFsZ2VicmFpYyA9IHRydWU7XG4gIGlmIChyZXN1bHQuYWxnZWJyYWljKVxuICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgaWYgKHJlc3VsdC5yZWFsKVxuICAgIHJlc3VsdC5jb21wbGV4ID0gdHJ1ZTtcbiAgaWYgKHJlc3VsdC5pbWFnaW5hcnkpXG4gICAgcmVzdWx0LmNvbXBsZXggPSB0cnVlO1xuICBpZiAocmVzdWx0LmNvbXBsZXgpXG4gICAgcmVzdWx0Lm51bWJlciA9IHRydWU7XG4gIGlmIChyZXN1bHQucmVhbCAmJiByZXN1bHQuaW5maW5pdHkgIT09IGZhbHNlKVxuICAgIHJlc3VsdC5leHRlbmRlZFJlYWwgPSB0cnVlO1xuICBpZiAocmVzdWx0LmNvbXBsZXggJiYgcmVzdWx0LmluZmluaXR5ICE9PSBmYWxzZSlcbiAgICByZXN1bHQuZXh0ZW5kZWRDb21wbGV4ID0gdHJ1ZTtcbiAgaWYgKHJlc3VsdC5ldmVuIHx8IHJlc3VsdC5pbmZpbml0eSB8fCByZXN1bHQuTmFOIHx8IHJlc3VsdC5uZWdhdGl2ZSB8fCByZXN1bHQuaW1hZ2luYXJ5IHx8IHJlc3VsdC5pbnRlZ2VyID09PSBmYWxzZSlcbiAgICByZXN1bHQucHJpbWUgPSBmYWxzZTtcbiAgaWYgKHJlc3VsdC5udW1iZXIgJiYgcmVzdWx0LnByaW1lKVxuICAgIHJlc3VsdC5jb21wb3NpdGUgPSBmYWxzZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvbWFpblRvRmxhZ3MoZG9tKSB7XG4gIGlmICghZG9tKVxuICAgIHJldHVybiB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGlmIChkb20uaXNOdW1lcmljKSB7XG4gICAgY29uc3QgZG9tYWluID0gZG9tLmxpdGVyYWw7XG4gICAgcmVzdWx0Lm51bWJlciA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJJbnRlZ2VyXCIpXG4gICAgICByZXN1bHQuaW50ZWdlciA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJSYXRpb25hbE51bWJlclwiKVxuICAgICAgcmVzdWx0LnJhdGlvbmFsID0gdHJ1ZTtcbiAgICBpZiAoZG9tYWluID09PSBcIkFsZ2VicmFpY051bWJlclwiKVxuICAgICAgcmVzdWx0LmFsZ2VicmFpYyA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJUcmFuc2NlbmRlbnRhbE51bWJlclwiKSB7XG4gICAgICByZXN1bHQuYWxnZWJyYWljID0gZmFsc2U7XG4gICAgICByZXN1bHQucmVhbCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkb21haW4gPT09IFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCIpXG4gICAgICByZXN1bHQuZXh0ZW5kZWRSZWFsID0gdHJ1ZTtcbiAgICBpZiAoZG9tYWluID09PSBcIlJlYWxOdW1iZXJcIilcbiAgICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgICBpZiAoZG9tYWluID09PSBcIkltYWdpbmFyeU51bWJlclwiKVxuICAgICAgcmVzdWx0LmltYWdpbmFyeSA9IHRydWU7XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJFeHRlbmRlZENvbXBsZXhOdW1iZXJcIilcbiAgICAgIHJlc3VsdC5leHRlbmRlZENvbXBsZXggPSB0cnVlO1xuICAgIGlmIChkb21haW4gPT09IFwiQ29tcGxleE51bWJlclwiKVxuICAgICAgcmVzdWx0LmNvbXBsZXggPSB0cnVlO1xuICAgIGlmIChkb21haW4gPT09IFwiUG9zaXRpdmVOdW1iZXJcIikge1xuICAgICAgcmVzdWx0Lm5vdFplcm8gPSB0cnVlO1xuICAgICAgcmVzdWx0LnJlYWwgPSB0cnVlO1xuICAgICAgcmVzdWx0LnBvc2l0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJOZWdhdGl2ZU51bWJlclwiKSB7XG4gICAgICByZXN1bHQubm90WmVybyA9IHRydWU7XG4gICAgICByZXN1bHQucmVhbCA9IHRydWU7XG4gICAgICByZXN1bHQubmVnYXRpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZG9tYWluID09PSBcIk5vbk5lZ2F0aXZlTnVtYmVyXCIpIHtcbiAgICAgIHJlc3VsdC5yZWFsID0gdHJ1ZTtcbiAgICAgIHJlc3VsdC5wb3NpdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkb21haW4gPT09IFwiTm9uUG9zaXRpdmVOdW1iZXJcIikge1xuICAgICAgcmVzdWx0LnJlYWwgPSB0cnVlO1xuICAgICAgcmVzdWx0Lm5lZ2F0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJQb3NpdGl2ZUludGVnZXJcIikge1xuICAgICAgcmVzdWx0Lm5vdFplcm8gPSB0cnVlO1xuICAgICAgcmVzdWx0LmludGVnZXIgPSB0cnVlO1xuICAgICAgcmVzdWx0LnBvc2l0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbiA9PT0gXCJOZWdhdGl2ZU51bWJlclwiKSB7XG4gICAgICByZXN1bHQubm90WmVybyA9IHRydWU7XG4gICAgICByZXN1bHQuaW50ZWdlciA9IHRydWU7XG4gICAgICByZXN1bHQubmVnYXRpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZG9tYWluID09PSBcIk5vbk5lZ2F0aXZlTnVtYmVyXCIpIHtcbiAgICAgIHJlc3VsdC5pbnRlZ2VyID0gdHJ1ZTtcbiAgICAgIHJlc3VsdC5wb3NpdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChkb21haW4gPT09IFwiTm9uUG9zaXRpdmVOdW1iZXJcIikge1xuICAgICAgcmVzdWx0LmludGVnZXIgPSB0cnVlO1xuICAgICAgcmVzdWx0Lm5lZ2F0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0Lm51bWJlciA9IGZhbHNlO1xuICAgIHJlc3VsdC5pbnRlZ2VyID0gZmFsc2U7XG4gICAgcmVzdWx0LnJhdGlvbmFsID0gZmFsc2U7XG4gICAgcmVzdWx0LmFsZ2VicmFpYyA9IGZhbHNlO1xuICAgIHJlc3VsdC5yZWFsID0gZmFsc2U7XG4gICAgcmVzdWx0LmV4dGVuZGVkUmVhbCA9IGZhbHNlO1xuICAgIHJlc3VsdC5jb21wbGV4ID0gZmFsc2U7XG4gICAgcmVzdWx0LmV4dGVuZGVkQ29tcGxleCA9IGZhbHNlO1xuICAgIHJlc3VsdC5pbWFnaW5hcnkgPSBmYWxzZTtcbiAgICByZXN1bHQucG9zaXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubm9uUG9zaXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubmVnYXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQubm9uTmVnYXRpdmUgPSBmYWxzZTtcbiAgICByZXN1bHQuemVybyA9IGZhbHNlO1xuICAgIHJlc3VsdC5ub3RaZXJvID0gZmFsc2U7XG4gICAgcmVzdWx0Lm9uZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5uZWdhdGl2ZU9uZSA9IGZhbHNlO1xuICAgIHJlc3VsdC5pbmZpbml0eSA9IGZhbHNlO1xuICAgIHJlc3VsdC5OYU4gPSBmYWxzZTtcbiAgICByZXN1bHQub2RkID0gZmFsc2U7XG4gICAgcmVzdWx0LmV2ZW4gPSBmYWxzZTtcbiAgICByZXN1bHQucHJpbWUgPSBmYWxzZTtcbiAgICByZXN1bHQuY29tcG9zaXRlID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGRlZmluZWRLZXlzKG5vcm1hbGl6ZUZsYWdzKHJlc3VsdCkpO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1mdW5jdGlvbi1kZWZpbml0aW9uLnRzXG52YXIgQm94ZWRGdW5jdGlvbkRlZmluaXRpb25JbXBsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihjZSwgbmFtZSwgZGVmKSB7XG4gICAgaWYgKCFjZS5jb250ZXh0KVxuICAgICAgdGhyb3cgRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZVwiKTtcbiAgICB0aGlzLmVuZ2luZSA9IGNlO1xuICAgIHRoaXMuc2NvcGUgPSBjZS5jb250ZXh0O1xuICAgIGNvbnN0IGlkZW1wb3RlbnQgPSBkZWYuaWRlbXBvdGVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBpbnZvbHV0aW9uID0gZGVmLmludm9sdXRpb24gPz8gZmFsc2U7XG4gICAgaWYgKGlkZW1wb3RlbnQgJiYgaW52b2x1dGlvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IHRoZSAnaWRlbXBvdGVudCcgYW5kICdpbnZvbHV0aW9uJyBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlYFxuICAgICAgKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZWYuZGVzY3JpcHRpb247XG4gICAgdGhpcy53aWtpZGF0YSA9IGRlZi53aWtpZGF0YTtcbiAgICB0aGlzLnRocmVhZGFibGUgPSBkZWYudGhyZWFkYWJsZSA/PyBmYWxzZTtcbiAgICB0aGlzLmFzc29jaWF0aXZlID0gZGVmLmFzc29jaWF0aXZlID8/IGZhbHNlO1xuICAgIHRoaXMuY29tbXV0YXRpdmUgPSBkZWYuY29tbXV0YXRpdmUgPz8gZmFsc2U7XG4gICAgdGhpcy5pZGVtcG90ZW50ID0gaWRlbXBvdGVudDtcbiAgICB0aGlzLmludm9sdXRpb24gPSBpbnZvbHV0aW9uO1xuICAgIHRoaXMuaW5lcnQgPSBkZWYuaW5lcnQgPz8gZmFsc2U7XG4gICAgdGhpcy5udW1lcmljID0gZGVmLm51bWVyaWMgPz8gZmFsc2U7XG4gICAgdGhpcy5wdXJlID0gZGVmLnB1cmUgPz8gdHJ1ZTtcbiAgICB0aGlzLmNvbXBsZXhpdHkgPSBkZWYuY29tcGxleGl0eSA/PyBERUZBVUxUX0NPTVBMRVhJVFk7XG4gICAgdGhpcy5ob2xkID0gZGVmLmhvbGQgPz8gXCJub25lXCI7XG4gICAgaWYgKHRoaXMuaW5lcnQpIHtcbiAgICAgIGlmIChkZWYuaG9sZClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGFuIGluZXJ0IGZ1bmN0aW9uIHNob3VsZCBub3QgaGF2ZSBhIGhvbGRgXG4gICAgICAgICk7XG4gICAgICB0aGlzLmhvbGQgPSBcInJlc3RcIjtcbiAgICAgIGlmIChkZWYuc2lnbmF0dXJlKSB7XG4gICAgICAgIGNvbnN0IHNpZyA9IGRlZi5zaWduYXR1cmU7XG4gICAgICAgIGlmIChcInNpbXBsaWZ5XCIgaW4gc2lnIHx8IFwiZXZhbHVhdGVcIiBpbiBzaWcgfHwgXCJOXCIgaW4gc2lnIHx8IFwiZXZhbERpbWVuc2lvblwiIGluIHNpZyB8fCBcInNnblwiIGluIHNpZyB8fCBcImNvbXBpbGVcIiBpbiBzaWcpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgRnVuY3Rpb24gRGVmaW5pdGlvbiBcIiR7bmFtZX1cIjogYW4gaW5lcnQgZnVuY3Rpb24gc2hvdWxkIG9ubHkgaGF2ZSAnY2Fub25pY2FsJyBvciAnY29kb21haW4nIGhhbmRsZXJzYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50aHJlYWRhYmxlKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gRGVmaW5pdGlvbiBcIiR7bmFtZX1cIjogYW4gaW5lcnQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB0aHJlYWRhYmxlYFxuICAgICAgICApO1xuICAgICAgaWYgKHRoaXMuYXNzb2NpYXRpdmUpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBEZWZpbml0aW9uIFwiJHtuYW1lfVwiOiBhbiBpbmVydCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGFzc29jaWF0aXZlYFxuICAgICAgICApO1xuICAgICAgaWYgKHRoaXMuY29tbXV0YXRpdmUpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBEZWZpbml0aW9uIFwiJHtuYW1lfVwiOiBhbiBpbmVydCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNvbW11dGF0aXZlYFxuICAgICAgICApO1xuICAgICAgaWYgKHRoaXMuaWRlbXBvdGVudClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGFuIGluZXJ0IGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgaWRlbXBvdGVudGBcbiAgICAgICAgKTtcbiAgICAgIGlmICh0aGlzLmludm9sdXRpb24pXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBEZWZpbml0aW9uIFwiJHtuYW1lfVwiOiBhbiBpbmVydCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGludm9sdXRpb25gXG4gICAgICAgICk7XG4gICAgICBpZiAoIXRoaXMucHVyZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGFuIGluZXJ0IGZ1bmN0aW9uIHNob3VsZCBiZSBwdXJlYFxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVmLnNpZ25hdHVyZSkge1xuICAgICAgY29uc3Qgc2lnID0gZGVmLnNpZ25hdHVyZTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHNpZy5kb21haW4gPyBjZS5kb21haW4oc2lnLmRvbWFpbikgOiBkZWYubnVtZXJpYyA/IGNlLmRvbWFpbihcIk51bWVyaWNGdW5jdGlvblwiKSA6IGNlLmRvbWFpbihcIkZ1bmN0aW9uXCIpO1xuICAgICAgaWYgKCFkb21haW4uaXNWYWxpZClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIERlZmluaXRpb24gXCIke25hbWV9XCI6IGludmFsaWQgZG9tYWluICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBzaWcuZG9tYWluXG4gICAgICAgICAgKX1gXG4gICAgICAgICk7XG4gICAgICBjb25zdCBjb2RvbWFpbiA9IHNpZy5jb2RvbWFpbiA/PyBkb21haW4uY29kb21haW4gPz8gKGRlZi5udW1lcmljID8gY2UuZG9tYWluKFwiTnVtYmVyXCIpIDogY2UuZG9tYWluKFwiQW55dGhpbmdcIikpO1xuICAgICAgdGhpcy5zaWduYXR1cmUgPSB7XG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgY29kb21haW4sXG4gICAgICAgIGNhbm9uaWNhbDogc2lnLmNhbm9uaWNhbCxcbiAgICAgICAgc2ltcGxpZnk6IHNpZy5zaW1wbGlmeSxcbiAgICAgICAgZXZhbHVhdGU6ICFzaWcuZXZhbHVhdGUgPyB2b2lkIDAgOiB0eXBlb2Ygc2lnLmV2YWx1YXRlID09PSBcImZ1bmN0aW9uXCIgPyBzaWcuZXZhbHVhdGUgOiBjZS5ib3goc2lnLmV2YWx1YXRlLCB7IGNhbm9uaWNhbDogZmFsc2UgfSksXG4gICAgICAgIE46IHNpZy5OLFxuICAgICAgICBldmFsRGltZW5zaW9uOiBzaWcuZXZhbERpbWVuc2lvbixcbiAgICAgICAgc2duOiBzaWcuc2duLFxuICAgICAgICBjb21waWxlOiBzaWcuY29tcGlsZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRlZi5udW1lcmljKSB7XG4gICAgICB0aGlzLnNpZ25hdHVyZSA9IHtcbiAgICAgICAgZG9tYWluOiBjZS5kb21haW4oXCJOdW1lcmljRnVuY3Rpb25cIiksXG4gICAgICAgIGNvZG9tYWluOiBjZS5kb21haW4oXCJOdW1iZXJcIilcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2lnbmF0dXJlID0ge1xuICAgICAgICBkb21haW46IGNlLmRvbWFpbihcIkZ1bmN0aW9uXCIpLFxuICAgICAgICBjb2RvbWFpbjogY2UuZG9tYWluKFwiQW55dGhpbmdcIilcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJlc2V0KCkge1xuICAgIHJldHVybjtcbiAgfVxufTtcbmZ1bmN0aW9uIG1ha2VGdW5jdGlvbkRlZmluaXRpb24oZW5naW5lLCBuYW1lLCBkZWYpIHtcbiAgaWYgKGRlZiBpbnN0YW5jZW9mIEJveGVkRnVuY3Rpb25EZWZpbml0aW9uSW1wbClcbiAgICByZXR1cm4gZGVmO1xuICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb25EZWZpbml0aW9uSW1wbChcbiAgICBlbmdpbmUsXG4gICAgbmFtZSxcbiAgICBkZWZcbiAgKTtcbn1cblxuLy8gc3JjL2NvbXB1dGUtZW5naW5lL2xpYnJhcnkvbGlicmFyeS50c1xuZnVuY3Rpb24gZ2V0U3RhbmRhcmRMaWJyYXJ5KGNhdGVnb3JpZXMpIHtcbiAgaWYgKGNhdGVnb3JpZXMgPT09IFwiYWxsXCIpIHtcbiAgICByZXR1cm4gZ2V0U3RhbmRhcmRMaWJyYXJ5KFtcbiAgICAgIFwiZG9tYWluc1wiLFxuICAgICAgXCJjb3JlXCIsXG4gICAgICBcImNvbnRyb2wtc3RydWN0dXJlc1wiLFxuICAgICAgLy8gSWYsIEJsb2NrLCBMb29wXG4gICAgICBcImxvZ2ljXCIsXG4gICAgICBcImNvbGxlY3Rpb25zXCIsXG4gICAgICAvLyBEaWN0aW9uYXJ5LCBMaXN0LCBTZXRzXG4gICAgICBcInJlbG9wXCIsXG4gICAgICBcIm51bWVyaWNcIixcbiAgICAgIFwiYXJpdGhtZXRpY1wiLFxuICAgICAgXCJhbGdlYnJhXCIsXG4gICAgICBcImNhbGN1bHVzXCIsXG4gICAgICBcImNvbWJpbmF0b3JpY3NcIixcbiAgICAgIFwibGluZWFyLWFsZ2VicmFcIixcbiAgICAgIFwib3RoZXJcIixcbiAgICAgIFwicGh5c2ljc1wiLFxuICAgICAgXCJwb2x5bm9taWFsc1wiLFxuICAgICAgXCJzdGF0aXN0aWNzXCIsXG4gICAgICBcInRyaWdvbm9tZXRyeVwiLFxuICAgICAgXCJkaW1lbnNpb25zXCIsXG4gICAgICBcInVuaXRzXCJcbiAgICBdKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2F0ZWdvcmllcyA9PT0gXCJzdHJpbmdcIilcbiAgICBjYXRlZ29yaWVzID0gW2NhdGVnb3JpZXNdO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XG4gICAgY29uc3QgZGljdCA9IExJQlJBUklFU1tjYXRlZ29yeV07XG4gICAgaWYgKCFkaWN0KVxuICAgICAgdGhyb3cgRXJyb3IoYFVua25vd24gbGlicmFyeSBjYXRlZ29yeSAke2NhdGVnb3J5fWApO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRpY3QpKVxuICAgICAgcmVzdWx0LnB1c2goLi4uZGljdCk7XG4gICAgZWxzZVxuICAgICAgcmVzdWx0LnB1c2goZGljdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbnZhciBMSUJSQVJJRVMgPSB7XG4gIFwiYWxnZWJyYVwiOiBbXSxcbiAgLy8gJ2FsZ2VicmEnOiBbXG4gIC8vICAgLy8gcG9seW5vbWlhbChbMCwgMiwgMCwgNF06bGlzdCwgeDpzeW1ib2wpIC0+IDJ4ICsgNHheM1xuICAvLyAgIC8vIHBvbHlub21pYWwoMnggKyA0eF4zLCB4KSAtPiB7MCwgMiwgMCwgNH1cbiAgLy8gICAvLyByYXRpb25hbCgyeCArIDR4XjMsIHszLCAxfSwgeCkgLT4gKDJ4ICsgNHheMykvKDMreClcbiAgLy8gICAvLyBodHRwczovL3JlZmVyZW5jZS53b2xmcmFtLmNvbS9sYW5ndWFnZS90dXRvcmlhbC9BbGdlYnJhaWNDYWxjdWxhdGlvbnMuaHRtbFxuICAvLyAgIC8vIHNpbXBsaWZ5LXRyaWcgKG1hY3N5bWEpXG4gIC8vICAgLy8gIC0gdHJpZ1JlZHVjZSwgdHJpZ0V4cGFuZCwgdHJpZ0ZhY3RvciwgdHJpZ1RvRXhwIChtYXRoZW1hdGljYSlcbiAgLy8gICAvLyBNYXRoZW1hdGljYTpcbiAgLy8gICAvLyAtIGRpc3RyaWJ1dGUgLT4gKGErYikoYytkKSAtPiBhYysgYWQrIGJjKyBiZCAoZG9lc24ndCBoYXZlIHRvIGJlIG11bHRpcGx5LFxuICAvLyAgIC8vIGYoYStiLCBjK2QpIC0+IGYoYSwgYykgKyBmKGEsIGQpICsgZihiLCBjKSArIGYoYiwgZClcbiAgLy8gICAvLyAtLSBkaXN0cmlidXRlKGV4cHIsIG92ZXI9YWRkLCB3aXRoPW11bHRpcGx5KVxuICAvLyAgIC8vIGh0dHBzOi8vcmVmZXJlbmNlLndvbGZyYW0uY29tL2xhbmd1YWdlL3JlZi9EaXN0cmlidXRlLmh0bWxcbiAgLy8gICAvLyAtIGV4cGFuZCwgZXhwYW5kLWFsbFxuICAvLyAgIC8vIC0gZmFjdG9yXG4gIC8vICAgLy8gLSBzaW1wbGlmeVxuICAvLyBdLFxuICBcImFyaXRobWV0aWNcIjogWy4uLkFSSVRITUVUSUNfTElCUkFSWSwgLi4uQ09NUExFWF9MSUJSQVJZXSxcbiAgXCJjYWxjdWx1c1wiOiBDQUxDVUxVU19MSUJSQVJZLFxuICBcImNvbWJpbmF0b3JpY3NcIjogW10sXG4gIC8vIEB0b2RvIGZpYm9uYWNjaSwgYmlub21pYWwsIGV0Yy4uLlxuICBcImNvbnRyb2wtc3RydWN0dXJlc1wiOiBbXSxcbiAgLy8gICAvLyBEXG4gIC8vICAgLy8gRGVyaXZhdGl2ZSAobWF0aGVtYXRpY2EpXG4gIC8vICAgLy8gZGlmZiAobWFjc3ltYSlcbiAgLy8gICAvLyBudGgtZGlmZlxuICAvLyAgIC8vIGludFxuICAvLyAgIC8vIC0gaW50ZWdyYXRlKGV4cHJlc3Npb24sIHN5bWJvbCkgIC0tIGluZGVmaW5pdGUgaW50ZWdyYWxcbiAgLy8gICAvLyAtIGludGVncmF0ZShleHByZXNzaW9uLCByYW5nZSkgPHJhbmdlPiA9IHtzeW1ib2wsIG1pbiwgbWF4fSAtLSBkZWZpbml0ZSBpbnRlZ3JhbFxuICAvLyAgIC8vIC0gaW50ZWdyYXRlKGV4cHJlc3Npb24sIHJhbmdlMSwgcmFuZ2UyKSAtLSBtdWx0aXBsZSBpbnRlZ3JhbFxuICAvLyAgIC8vIGRlZi1pbnRcbiAgLy8gXSxcbiAgXCJkaW1lbnNpb25zXCI6IFtdLFxuICAvLyBAdG9kbyAvLyB2b2x1bWUsIHNwZWVkLCBhcmVhXG4gIFwiZG9tYWluc1wiOiBbXSxcbiAgXCJjb3JlXCI6IENPUkVfTElCUkFSWSxcbiAgXCJjb2xsZWN0aW9uc1wiOiBbU0VUU19MSUJSQVJZLCBDT0xMRUNUSU9OU19MSUJSQVJZLCBkb21haW5TZXRzTGlicmFyeSgpXSxcbiAgLy8gJ2RvbWFpbnMnOiBnZXREb21haW5zRGljdGlvbmFyeSgpLFxuICBcImxpbmVhci1hbGdlYnJhXCI6IFtdLFxuICAvL0B0b2RvICAgLy8gJ2xpbmVhci1hbGdlYnJhJzogW1xuICAvLyAgIC8vIG1hdHJpeFxuICAvLyAgIC8vIHRyYW5zcG9zZVxuICAvLyAgIC8vIGNyb3NzLXByb2R1Y3RcbiAgLy8gICAvLyBvdXRlci1wcm9kdWN0XG4gIC8vICAgLy8gZGV0ZXJtaW5hbnRcbiAgLy8gICAvLyB2ZWN0b3JcbiAgLy8gICAvLyBtYXRyaXhcbiAgLy8gICAvLyByYW5rXG4gIC8vICAgLy8gc2NhbGFyLW1hdHJpeFxuICAvLyAgIC8vIGNvbnN0YW50LW1hdHJpeFxuICAvLyAgIC8vIGlkZW50aXR5LW1hdHJpeFxuICAvLyBdLFxuICBcImxvZ2ljXCI6IExPR0lDX0xJQlJBUlksXG4gIFwibnVtZXJpY1wiOiBbXSxcbiAgLy8gQHRvZG8gICAvLyAnbnVtZXJpYyc6IFtcbiAgLy8gICAvLyBHYW1tYSBmdW5jdGlvblxuICAvLyAgIC8vIFpldGEgZnVuY3Rpb25cbiAgLy8gICAvLyBlcmYgZnVuY3Rpb25cbiAgLy8gICAvLyBudW1lcmF0b3IoZnJhY3Rpb24pXG4gIC8vICAgLy8gZGVub21pbmF0b3IoZnJhY3Rpb24pXG4gIC8vICAgLy8gZXhhY3RGbG9hdFRvUmF0aW9uYWxcbiAgLy8gICAvLyBOIC0+IGV2YWwgYXMgYSBudW1iZXJcbiAgLy8gICAvLyByYW5kb21cbiAgLy8gICAvLyBoYXNoXG4gIC8vIF0sXG4gIFwib3RoZXJcIjogW10sXG4gIFwicmVsb3BcIjogUkVMT1BfTElCUkFSWSxcbiAgXCJwb2x5bm9taWFsc1wiOiBQT0xZTk9NSUFMU19MSUJSQVJZLFxuICBcInBoeXNpY3NcIjoge1xuICAgIE11MDoge1xuICAgICAgZGVzY3JpcHRpb246IFwiVmFjY3VtIHBlcm1lYWJpbGl0eVwiLFxuICAgICAgY29uc3RhbnQ6IHRydWUsXG4gICAgICB3aWtpZGF0YTogXCJRMTUxNTI2MVwiLFxuICAgICAgZG9tYWluOiBcIlJlYWxOdW1iZXJcIixcbiAgICAgIHZhbHVlOiAxMjU2NjM3MDYyMTJlLTE3XG4gICAgICAvLyB1bml0OiBbJ0RpdmlkZScsICdOJywgWydTcXVhcmUnLCAnQSddXSxcbiAgICB9XG4gIH0sXG4gIFwic3RhdGlzdGljc1wiOiBTVEFUSVNUSUNTX0xJQlJBUlksXG4gIFwidHJpZ29ub21ldHJ5XCI6IFRSSUdPTk9NRVRSWV9MSUJSQVJZLFxuICBcInVuaXRzXCI6IFtdXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVEZWZpbml0aW9uTmFtZShuYW1lKSB7XG4gIG5hbWUgPSBuYW1lLm5vcm1hbGl6ZSgpO1xuICBpZiAoaXNWYWxpZElkZW50aWZpZXIobmFtZSkpXG4gICAgcmV0dXJuIG5hbWU7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgSW52YWxpZCBkZWZpbml0aW9uIG5hbWUgXCIke25hbWV9XCI6ICR7dmFsaWRhdGVJZGVudGlmaWVyKG5hbWUpfWBcbiAgKTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRDb250ZXh0U3ltYm9sVGFibGUoZW5naW5lLCB0YWJsZSkge1xuICB2YXIgX2E7XG4gIGlmICghZW5naW5lLmNvbnRleHQpXG4gICAgdGhyb3cgRXJyb3IoXCJObyBjb250ZXh0IGF2YWlsYWJsZVwiKTtcbiAgKF9hID0gZW5naW5lLmNvbnRleHQpLmlkVGFibGUgPz8gKF9hLmlkVGFibGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgY29uc3QgaWRUYWJsZSA9IGVuZ2luZS5jb250ZXh0LmlkVGFibGU7XG4gIGZvciAobGV0IG5hbWUgb2YgT2JqZWN0LmtleXModGFibGUpKSB7XG4gICAgY29uc3QgZW50cnkgPSB0YWJsZVtuYW1lXTtcbiAgICBuYW1lID0gdmFsaWRhdGVEZWZpbml0aW9uTmFtZShuYW1lKTtcbiAgICBpZiAoaXNGdW5jdGlvbkRlZmluaXRpb24oZW50cnkpKSB7XG4gICAgICBjb25zdCBkZWYgPSBtYWtlRnVuY3Rpb25EZWZpbml0aW9uKGVuZ2luZSwgbmFtZSwgZW50cnkpO1xuICAgICAgaWYgKGlkVGFibGUuaGFzKG5hbWUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSBmdW5jdGlvbiBkZWZpbml0aW9uICR7bmFtZX06XG4ke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgaWRUYWJsZS5nZXQobmFtZSlcbiAgICAgICAgICApfVxuJHtKU09OLnN0cmluZ2lmeShlbnRyeSl9YFxuICAgICAgICApO1xuICAgICAgaWRUYWJsZS5zZXQobmFtZSwgZGVmKTtcbiAgICB9IGVsc2UgaWYgKGlzU3ltYm9sRGVmaW5pdGlvbihlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGRlZiA9IG5ldyBCb3hlZFN5bWJvbERlZmluaXRpb25JbXBsKGVuZ2luZSwgbmFtZSwgZW50cnkpO1xuICAgICAgaWYgKGVuZ2luZS5zdHJpY3QgJiYgZW50cnkud2lraWRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBbXywgZF0gb2YgaWRUYWJsZSkge1xuICAgICAgICAgIGlmIChkLndpa2lkYXRhID09PSBlbnRyeS53aWtpZGF0YSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBlbnRyaWVzIHdpdGggd2lraWRhdGEgXCIke2VudHJ5Lndpa2lkYXRhfVwiOiBcIiR7bmFtZX1cIiBhbmQgXCIke2QubmFtZX1cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpZFRhYmxlLmhhcyhuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc3ltYm9sIGRlZmluaXRpb24gXCIke25hbWV9XCJgKTtcbiAgICAgIGlkVGFibGUuc2V0KG5hbWUsIGRlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlZiA9IG5ldyBCb3hlZFN5bWJvbERlZmluaXRpb25JbXBsKGVuZ2luZSwgbmFtZSwge1xuICAgICAgICB2YWx1ZTogZW5naW5lLmJveChlbnRyeSlcbiAgICAgIH0pO1xuICAgICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KGRlZik7XG4gICAgICBpZFRhYmxlLnNldChuYW1lLCBkZWYpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvY29zdC1mdW5jdGlvbi50c1xudmFyIGltcG9ydF9jb21wbGV4MTkgPSBfX3RvRVNNKHJlcXVpcmVfY29tcGxleCgpKTtcbmZ1bmN0aW9uIG51bWVyaWNDb3N0RnVuY3Rpb24obikge1xuICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuICE9PSAwKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5sb2cyKE1hdGguYWJzKG4pKSAvIE1hdGgubG9nMigxMCkpICsgKG4gPiAwID8gMSA6IDIpO1xuICB9XG4gIHJldHVybiAyO1xufVxuZnVuY3Rpb24gY29zdEZ1bmN0aW9uKGV4cHIpIHtcbiAgaWYgKGV4cHIuc3ltYm9sKVxuICAgIHJldHVybiAxO1xuICBjb25zdCBudW0gPSBleHByLm51bWVyaWNWYWx1ZTtcbiAgaWYgKG51bSAhPT0gbnVsbCkge1xuICAgIGlmIChleHByLmlzWmVybylcbiAgICAgIHJldHVybiAxO1xuICAgIGlmIChleHByLmlzSW50ZWdlcilcbiAgICAgIHJldHVybiBudW1lcmljQ29zdEZ1bmN0aW9uKGFzRmxvYXQoZXhwcikpO1xuICAgIGlmIChpc1JhdGlvbmFsKG51bSkpIHtcbiAgICAgIGlmIChpc01hY2hpbmVSYXRpb25hbChudW0pKVxuICAgICAgICByZXR1cm4gbnVtZXJpY0Nvc3RGdW5jdGlvbihudW1bMF0pICsgbnVtZXJpY0Nvc3RGdW5jdGlvbihudW1bMV0pICsgMTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG51bWVyaWNDb3N0RnVuY3Rpb24oTnVtYmVyKG51bVswXSkpICsgbnVtZXJpY0Nvc3RGdW5jdGlvbihOdW1iZXIobnVtWzFdKSkgKyAxO1xuICAgIH1cbiAgICBpZiAobnVtIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgxOS5kZWZhdWx0KVxuICAgICAgcmV0dXJuIG51bWVyaWNDb3N0RnVuY3Rpb24obnVtLnJlKSArIG51bWVyaWNDb3N0RnVuY3Rpb24obnVtLmltKSArIDE7XG4gICAgaWYgKGV4cHIuaXNOdW1iZXIpXG4gICAgICByZXR1cm4gMjtcbiAgfVxuICBjb25zdCBoZWFkMiA9IGV4cHIuaGVhZDtcbiAgbGV0IGhlYWRDb3N0ID0gMjtcbiAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChbXCJBZGRcIiwgXCJEaXZpZGVcIl0uaW5jbHVkZXMoaGVhZDIpKVxuICAgICAgaGVhZENvc3QgPSAzO1xuICAgIGVsc2UgaWYgKFtcIlN1YnRyYWN0XCIsIFwiTmVnYXRlXCJdLmluY2x1ZGVzKGhlYWQyKSlcbiAgICAgIGhlYWRDb3N0ID0gNDtcbiAgICBlbHNlIGlmIChbXCJTcXVhcmVcIiwgXCJTcXJ0XCIsIFwiTXVsdGlwbHlcIiwgXCJSb290XCJdLmluY2x1ZGVzKGhlYWQyKSlcbiAgICAgIGhlYWRDb3N0ID0gNTtcbiAgICBlbHNlIGlmIChbXCJQb3dlclwiXS5pbmNsdWRlcyhoZWFkMikpXG4gICAgICBoZWFkQ29zdCA9IDY7XG4gICAgZWxzZSBpZiAoW1wiTG5cIiwgXCJFeHBcIiwgXCJMb2dcIl0uaW5jbHVkZXMoaGVhZDIpKVxuICAgICAgaGVhZENvc3QgPSA3O1xuICAgIGVsc2UgaWYgKFtcbiAgICAgIFwiQXJjc2luXCIsXG4gICAgICBcIkFyY2Nvc1wiLFxuICAgICAgXCJBcmN0YW5cIixcbiAgICAgIFwiQXJjc2VjXCIsXG4gICAgICBcIiBBcmNjc2NcIixcbiAgICAgIFwiQXJzaW5oXCIsXG4gICAgICBcIkFyY29zaFwiLFxuICAgICAgXCJBcnRhbmhcIixcbiAgICAgIFwiQXJjc2VjaFwiLFxuICAgICAgXCJBcmNzY2hcIixcbiAgICAgIFwiQ29zaFwiLFxuICAgICAgXCJDb3NcIixcbiAgICAgIFwiQ3NjXCIsXG4gICAgICBcIkNzY2hcIixcbiAgICAgIC8vICc/Pyc6ICdDb3QnLFxuICAgICAgLy8gJz8/JzogJ0NvdGgnLFxuICAgICAgXCJTZWNcIixcbiAgICAgIFwiU2luXCIsXG4gICAgICBcIlNpbmhcIixcbiAgICAgIFwiVGFuXCIsXG4gICAgICBcIlRhbmhcIlxuICAgIF0uaW5jbHVkZXMoaGVhZDIpKVxuICAgICAgaGVhZENvc3QgPSA5O1xuICAgIGVsc2VcbiAgICAgIGhlYWRDb3N0ID0gMTA7XG4gIH0gZWxzZVxuICAgIGhlYWRDb3N0ID0gY29zdEZ1bmN0aW9uKGhlYWQyKTtcbiAgcmV0dXJuIGhlYWRDb3N0ICsgKGV4cHIub3BzPy5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgY29zdEZ1bmN0aW9uKHgpLCAwKSA/PyAwKTtcbn1cbnZhciBERUZBVUxUX0NPU1RfRlVOQ1RJT04gPSBjb3N0RnVuY3Rpb247XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9ib3hlZC1leHByZXNzaW9uL2V4cHJlc3Npb24tbWFwLnRzXG52YXIgRXhwcmVzc2lvbk1hcCA9IGNsYXNzIF9FeHByZXNzaW9uTWFwIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIF9FeHByZXNzaW9uTWFwKSB7XG4gICAgICB0aGlzLl9pdGVtcyA9IG5ldyBNYXAoc291cmNlLl9pdGVtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2l0ZW1zID0gbmV3IE1hcChcbiAgICAgICAgc291cmNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBoYXMoZXhwcikge1xuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLl9pdGVtcy5rZXlzKCkpXG4gICAgICBpZiAoeC5pc1NhbWUoZXhwcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQoZXhwcikge1xuICAgIGZvciAoY29uc3QgW3gsIHZdIG9mIHRoaXMuX2l0ZW1zKVxuICAgICAgaWYgKHguaXNTYW1lKGV4cHIpKVxuICAgICAgICByZXR1cm4gdjtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2l0ZW1zLmNsZWFyKCk7XG4gIH1cbiAgc2V0KGV4cHIsIHZhbHVlKSB7XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMuX2l0ZW1zLmtleXMoKSkge1xuICAgICAgaWYgKHguaXNTYW1lKGV4cHIpKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zLnNldCh4LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXRlbXMuc2V0KGV4cHIsIHZhbHVlKTtcbiAgfVxuICBkZWxldGUoZXhwcikge1xuICAgIHRoaXMuX2l0ZW1zLmRlbGV0ZShleHByKTtcbiAgfVxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbXMuZW50cmllcygpO1xuICB9XG4gIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmVudHJpZXMoKTtcbiAgfVxufTtcblxuLy8gc3JjL2NvbW1vbi91dGlscy50c1xuZnVuY3Rpb24gcGVybXV0YXRpb25zKHhzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBwZXJtdXRlID0gKGFyciwgbSA9IFtdKSA9PiB7XG4gICAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyID0gYXJyLnNsaWNlKCk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBjdXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgcGVybXV0ZShjdXJyLnNsaWNlKCksIG0uY29uY2F0KG5leHQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHBlcm11dGUoeHMpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1wYXR0ZXJucy50c1xudmFyIEJveGVkUGF0dGVybiA9IGNsYXNzIF9Cb3hlZFBhdHRlcm4gZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBwYXR0ZXJuLCBtZXRhZGF0YSkge1xuICAgIHN1cGVyKGNlLCBtZXRhZGF0YSk7XG4gICAgdGhpcy5fcGF0dGVybiA9IGlzTGF0ZXhTdHJpbmcocGF0dGVybikgPyBjZS5wYXJzZShwYXR0ZXJuLCB7IGNhbm9uaWNhbDogZmFsc2UgfSkgOiBjZS5ib3gocGF0dGVybiwgeyBjYW5vbmljYWw6IGZhbHNlIH0pO1xuICB9XG4gIGdldCBoYXNoKCkge1xuICAgIHJldHVybiBoYXNoQ29kZShcIlBhdHRlcm5cIikgXiB0aGlzLl9wYXR0ZXJuLmhhc2g7XG4gIH1cbiAgdW5iaW5kKCkge1xuICAgIHRoaXMuX3BhdHRlcm4udW5iaW5kKCk7XG4gIH1cbiAgZ2V0IGpzb24oKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUpzb25GdW5jdGlvbih0aGlzLmVuZ2luZSwgXCJQYXR0ZXJuXCIsIFt0aGlzLl9wYXR0ZXJuXSk7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIFwiUGF0dGVyblwiO1xuICB9XG4gIGdldCBkb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLmRvbWFpbihcIlBhdHRlcm5cIik7XG4gIH1cbiAgZ2V0IGlzQ2Fub25pY2FsKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCBpc0Nhbm9uaWNhbChfdmFsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzU2FtZShyaHMpIHtcbiAgICBpZiAodGhpcyA9PT0gcmhzKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHJocyBpbnN0YW5jZW9mIF9Cb3hlZFBhdHRlcm4gJiYgdGhpcy5fcGF0dGVybi5pc1NhbWUocmhzLl9wYXR0ZXJuKTtcbiAgfVxuICBpc0VxdWFsKHJocykge1xuICAgIHJldHVybiByaHMgaW5zdGFuY2VvZiBfQm94ZWRQYXR0ZXJuICYmIHRoaXMuX3BhdHRlcm4uaXNFcXVhbChyaHMuX3BhdHRlcm4pO1xuICB9XG4gIG1hdGNoKGV4cHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbWF0Y2goZXhwciwgdGhpcy5fcGF0dGVybiwge1xuICAgICAgcmVjdXJzaXZlOiBvcHRpb25zPy5yZWN1cnNpdmUgPz8gZmFsc2UsXG4gICAgICBudW1lcmljVG9sZXJhbmNlOiBvcHRpb25zPy5udW1lcmljVG9sZXJhbmNlID8/IDAsXG4gICAgICBzdWJzdGl0dXRpb246IG9wdGlvbnM/LnN1YnN0aXR1dGlvbiA/PyB7fVxuICAgIH0pO1xuICB9XG4gIHRlc3QoZXhwciwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKGV4cHIsIG9wdGlvbnMpICE9PSBudWxsO1xuICB9XG4gIGNvdW50KGV4cHJzLCBvcHRpb25zKSB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBleHByIG9mIGV4cHJzKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaChleHByLCBvcHRpb25zKSAhPT0gbnVsbClcbiAgICAgICAgcmVzdWx0ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3VicyhzdWIyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdHRlcm4uc3VicyhzdWIyLCBvcHRpb25zKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGhhc1dpbGRjYXJkcyhleHByKSB7XG4gIGlmICh0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZXhwci5zdGFydHNXaXRoKFwiX1wiKTtcbiAgaWYgKGV4cHIuc3ltYm9sPy5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGV4cHIub3BzKVxuICAgIHJldHVybiBoYXNXaWxkY2FyZHMoZXhwci5oZWFkKSB8fCBleHByLm9wcy5zb21lKGhhc1dpbGRjYXJkcyk7XG4gIGlmIChleHByLmtleXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBleHByLmtleXMpXG4gICAgICBpZiAoaGFzV2lsZGNhcmRzKGV4cHIuZ2V0S2V5KGtleSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjYXB0dXJlV2lsZGNhcmQod2lsZGNhcmQsIGV4cHIsIHN1YnN0aXR1dGlvbikge1xuICBjb25zdCBuYW1lID0gZ2V0V2lsZGNhcmROYW1lKHdpbGRjYXJkKTtcbiAgaWYgKG5hbWUgPT09IFwiXCIpXG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgaWYgKHN1YnN0aXR1dGlvbltuYW1lXSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKCFleHByLmlzU2FtZShzdWJzdGl0dXRpb25bbmFtZV0pKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfVxuICBpZiAoaGFzV2lsZGNhcmRzKGV4cHIpKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4geyAuLi5zdWJzdGl0dXRpb24sIFtuYW1lXTogZXhwciB9O1xufVxuZnVuY3Rpb24gbWF0Y2hPbmNlKGV4cHIsIHBhdHRlcm4sIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBjb25zdCBjZSA9IGV4cHIuZW5naW5lO1xuICBpZiAocGF0dGVybi5oZWFkID09PSBcIlBhdHRlcm5cIilcbiAgICByZXR1cm4gcGF0dGVybi5tYXRjaChleHByLCB7IHN1YnN0aXR1dGlvbiwgLi4ub3B0aW9ucyB9KTtcbiAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBCb3hlZE51bWJlcikge1xuICAgIGlmICghKGV4cHIgaW5zdGFuY2VvZiBCb3hlZE51bWJlcikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAob3B0aW9ucy5udW1lcmljVG9sZXJhbmNlID09PSAwKVxuICAgICAgcmV0dXJuIHBhdHRlcm4uaXNTYW1lKGV4cHIpID8gc3Vic3RpdHV0aW9uIDogbnVsbDtcbiAgICByZXR1cm4gcGF0dGVybi5pc0VxdWFsV2l0aFRvbGVyYW5jZShleHByLCBvcHRpb25zLm51bWVyaWNUb2xlcmFuY2UpID8gc3Vic3RpdHV0aW9uIDogbnVsbDtcbiAgfVxuICBjb25zdCBzdHIgPSBwYXR0ZXJuLnN0cmluZztcbiAgaWYgKHN0ciAhPT0gbnVsbClcbiAgICByZXR1cm4gZXhwci5zdHJpbmcgPT09IHN0ciA/IHN1YnN0aXR1dGlvbiA6IG51bGw7XG4gIGNvbnN0IHN5bWJvbDIgPSBwYXR0ZXJuLnN5bWJvbDtcbiAgaWYgKHN5bWJvbDIgIT09IG51bGwpIHtcbiAgICBpZiAoc3ltYm9sMi5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICAgIHJldHVybiBjYXB0dXJlV2lsZGNhcmQoc3ltYm9sMiwgZXhwciwgc3Vic3RpdHV0aW9uKTtcbiAgICByZXR1cm4gc3ltYm9sMiA9PT0gZXhwci5zeW1ib2wgPyBzdWJzdGl0dXRpb24gOiBudWxsO1xuICB9XG4gIGlmIChwYXR0ZXJuLm5vcHMgIT09IGV4cHIubm9wcylcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3Qga2V5cyA9IHBhdHRlcm4ua2V5cztcbiAgaWYgKGtleXMgIT09IG51bGwpIHtcbiAgICBjb25zdCBleHByS2V5cyA9IGV4cHIua2V5cztcbiAgICBpZiAoZXhwcktleXMgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCByID0gbWF0Y2hPbmNlKGV4cHJLZXlzW2tleV0sIGtleXNba2V5XSwgc3Vic3RpdHV0aW9uLCBvcHRpb25zKTtcbiAgICAgIGlmIChyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHN1YnN0aXR1dGlvbiA9IHI7XG4gICAgfVxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cbiAgaWYgKHBhdHRlcm4ub3BzKSB7XG4gICAgY29uc3QgaGVhZDIgPSBwYXR0ZXJuLmhlYWQ7XG4gICAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIiAmJiBoZWFkMi5zdGFydHNXaXRoKFwiX1wiKSlcbiAgICAgIHJldHVybiBjYXB0dXJlV2lsZGNhcmQoaGVhZDIsIGNlLmJveChleHByLmhlYWQpLCBzdWJzdGl0dXRpb24pO1xuICAgIGxldCBkZWYgPSB2b2lkIDA7XG4gICAgaWYgKHR5cGVvZiBoZWFkMiA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgZXhwci5oZWFkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoaGVhZDIgIT09IGV4cHIuaGVhZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBkZWYgPSBjZS5sb29rdXBGdW5jdGlvbihoZWFkMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHIgPSBtYXRjaE9uY2UoXG4gICAgICAgIGNlLmJveChleHByLmhlYWQsIHsgY2Fub25pY2FsOiBmYWxzZSB9KSxcbiAgICAgICAgY2UuYm94KGhlYWQyLCB7IGNhbm9uaWNhbDogZmFsc2UgfSksXG4gICAgICAgIHN1YnN0aXR1dGlvbixcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICAgIGlmIChyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHN1YnN0aXR1dGlvbiA9IHI7XG4gICAgfVxuICAgIHJldHVybiBkZWY/LmNvbW11dGF0aXZlID8gbWF0Y2hDb21tdXRhdGl2ZUFyZ3VtZW50cyhleHByLCBwYXR0ZXJuLCBzdWJzdGl0dXRpb24sIG9wdGlvbnMpIDogbWF0Y2hOb25Db21tdXRhdGl2ZUFyZ3VtZW50cyhleHByLCBwYXR0ZXJuLCBzdWJzdGl0dXRpb24sIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gbWF0Y2hQZXJtdXRhdGlvbihjZSwgb3BzMiwgcGF0dGVybnMsIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBsZXQgcmVzdWx0ID0geyAuLi5zdWJzdGl0dXRpb24gfTtcbiAgb3BzMiA9IFsuLi5vcHMyXTtcbiAgbGV0IGhhc1Jlc3QgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBhcmcgb2YgcGF0dGVybnMpIHtcbiAgICBpZiAoYXJnLnN5bWJvbCA9PT0gXCJfX1wiKVxuICAgICAgaGFzUmVzdCA9IHRydWU7XG4gICAgZWxzZSB7XG4gICAgICBsZXQgciA9IG51bGw7XG4gICAgICBpZiAoYXJnLnN5bWJvbD8uc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gb3BzMi5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICByID0gY2FwdHVyZVdpbGRjYXJkKGFyZy5zeW1ib2wsIG9wczJbaV0sIHJlc3VsdCk7XG4gICAgICAgICAgaWYgKHIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG9wczIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBvcHMyLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIHIgPSBtYXRjaE9uY2Uob3BzMltpXSwgYXJnLCByZXN1bHQsIG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvcHMyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmVzdWx0ID0gcjtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNSZXN0ICYmIG9wczIubGVuZ3RoID4gMClcbiAgICByZXR1cm4gbnVsbDtcbiAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiBoYXNSZXN0KVxuICAgIHJlc3VsdFtcIl9fXCJdID0gY2UuX2ZuKFwiU2VxdWVuY2VcIiwgb3BzMik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXRjaENvbW11dGF0aXZlQXJndW1lbnRzKGV4cHIsIHBhdHRlcm4sIHN1YnN0aXR1dGlvbiwgb3B0aW9ucykge1xuICBjb25zdCBwYXR0ZXJucyA9IHBlcm11dGF0aW9ucyhwYXR0ZXJuLm9wcyk7XG4gIGZvciAoY29uc3QgcGF0IG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbWF0Y2hQZXJtdXRhdGlvbihcbiAgICAgIGV4cHIuZW5naW5lLFxuICAgICAgZXhwci5vcHMsXG4gICAgICBwYXQsXG4gICAgICBzdWJzdGl0dXRpb24sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG1hdGNoTm9uQ29tbXV0YXRpdmVBcmd1bWVudHMoZXhwciwgcGF0dGVybiwgc3Vic3RpdHV0aW9uLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNlID0gZXhwci5lbmdpbmU7XG4gIGNvbnN0IG9wczIgPSBbLi4uZXhwci5vcHNdO1xuICBsZXQgcmVzdWx0ID0geyAuLi5zdWJzdGl0dXRpb24gfTtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBwYXR0ZXJucyA9IHBhdHRlcm4ub3BzO1xuICB3aGlsZSAoaSA8IHBhdHRlcm4ubm9wcykge1xuICAgIGNvbnN0IHBhdCA9IHBhdHRlcm5zW2ldO1xuICAgIGNvbnN0IGFyZ05hbWUgPSBwYXQuc3ltYm9sO1xuICAgIGlmIChhcmdOYW1lICE9PSBudWxsKSB7XG4gICAgICBpZiAoYXJnTmFtZS5zdGFydHNXaXRoKFwiX19cIikpIHtcbiAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICBpZiAocGF0dGVybnNbaSArIDFdID09PSB2b2lkIDApIHtcbiAgICAgICAgICBqID0gb3BzMi5sZW5ndGggKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgaiA8IG9wczIubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3VuZCA9IG1hdGNoT25jZShvcHMyW2pdLCBwYXR0ZXJuc1tpICsgMV0sIHJlc3VsdCwgb3B0aW9ucykgIT09IG51bGw7XG4gICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZ05hbWUuc3RhcnRzV2l0aChcIl9fX1wiKSAmJiBqIDw9IDEpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJlc3VsdCA9IGNhcHR1cmVXaWxkY2FyZChcbiAgICAgICAgICBhcmdOYW1lLFxuICAgICAgICAgIGNlLmZuKFwiU2VxdWVuY2VcIiwgb3BzMi5zcGxpY2UoMCwgaiAtIDEpKSxcbiAgICAgICAgICByZXN1bHRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoYXJnTmFtZS5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICByZXN1bHQgPSBjYXB0dXJlV2lsZGNhcmQoYXJnTmFtZSwgb3BzMi5zaGlmdCgpLCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ViMiA9IG1hdGNoT25jZShvcHMyLnNoaWZ0KCksIHBhdCwgcmVzdWx0LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHN1YjIgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJlc3VsdCA9IHN1YjI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN1YjIgPSBtYXRjaE9uY2Uob3BzMi5zaGlmdCgpLCBwYXQsIHJlc3VsdCwgb3B0aW9ucyk7XG4gICAgICBpZiAoc3ViMiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICByZXN1bHQgPSBzdWIyO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaSArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXRjaChzdWJqZWN0LCBwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN1YnN0aXR1dGlvbiA9IG1hdGNoT25jZShzdWJqZWN0LCBwYXR0ZXJuLCBvcHRpb25zLnN1YnN0aXR1dGlvbiA/PyB7fSwge1xuICAgIG51bWVyaWNUb2xlcmFuY2U6IG9wdGlvbnM/Lm51bWVyaWNUb2xlcmFuY2UgPz8gTlVNRVJJQ19UT0xFUkFOQ0VcbiAgfSk7XG4gIGlmIChzdWJzdGl0dXRpb24pIHtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5sb2coXCJtYXRjaFwiLCBzdWJqZWN0LnRvU3RyaW5nKCksIHBhdHRlcm4udG9TdHJpbmcoKSwgc3Vic3RpdHV0aW9uKTtcbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9XG4gIGlmICghb3B0aW9ucy5yZWN1cnNpdmUpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBzcmMvY29tcHV0ZS1lbmdpbmUvYm94ZWQtZXhwcmVzc2lvbi9ib3hlZC1zeW1ib2wudHNcbmZ1bmN0aW9uIGlzU3ltYm9sRGVmaW5pdGlvbjIoZGVmKSB7XG4gIGlmIChkZWYgPT09IG51bGwgfHwgZGVmID09PSB2b2lkIDApXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoXCJjb25zdGFudFwiIGluIGRlZilcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkRlZmluaXRpb24yKGRlZikge1xuICBpZiAoZGVmID09PSBudWxsIHx8IGRlZiA9PT0gdm9pZCAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKFwic2lnbmF0dXJlXCIgaW4gZGVmKVxuICAgIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG52YXIgQm94ZWRTeW1ib2wgPSBjbGFzcyBfQm94ZWRTeW1ib2wgZXh0ZW5kcyBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNlLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoY2UsIG9wdGlvbnM/Lm1ldGFkYXRhKTtcbiAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQoXG4gICAgICBuYW1lID09PSBuYW1lLm5vcm1hbGl6ZSgpLFxuICAgICAgYFN5bWJvbCBcIiR7bmFtZX1cIiBtdXN0IGJlIGluIFVuaWNvZGUgTkZDIGNhbm9uaWNhbCBvcmRlcmBcbiAgICApO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydChcbiAgICAgIGlzVmFsaWRJZGVudGlmaWVyKHRoaXMuX25hbWUpLFxuICAgICAgYEludmFsaWQgc3ltYm9sIFwiJHtuYW1lfVwiOiAke3ZhbGlkYXRlSWRlbnRpZmllcih0aGlzLl9uYW1lKX1gXG4gICAgKTtcbiAgICB0aGlzLl9zY29wZSA9IG9wdGlvbnM/LmNhbm9uaWNhbCA/IGNlLmNvbnRleHQgOiBudWxsO1xuICAgIHRoaXMuX2RlZiA9IG9wdGlvbnM/LmRlZiA/PyBudWxsO1xuICB9XG4gIGdldCBoYXNoKCkge1xuICAgIGlmICh0aGlzLl9oYXNoID09PSB2b2lkIDApXG4gICAgICB0aGlzLl9oYXNoID0gaGFzaENvZGUodGhpcy5fbmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuX2hhc2g7XG4gIH1cbiAgdW5iaW5kKCkge1xuICAgIHRoaXMuX2RlZj8ucmVzZXQoKTtcbiAgICB0aGlzLl9kZWYgPSBudWxsO1xuICB9XG4gIGdldCBpc1B1cmUoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN5bWJvbERlZmluaXRpb24/LmNvbnN0YW50ICYmIHRoaXMuc3ltYm9sRGVmaW5pdGlvbi52YWx1ZT8uaXNQdXJlKSA/PyB0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbj8ucHVyZSA/PyBmYWxzZTtcbiAgfVxuICBnZXQganNvbigpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplSnNvblN5bWJvbCh0aGlzLmVuZ2luZSwgdGhpcy5fbmFtZSwge1xuICAgICAgbGF0ZXg6IHRoaXMuX2xhdGV4LFxuICAgICAgd2lraWRhdGE6IHRoaXMuX3dpa2lkYXRhXG4gICAgfSk7XG4gIH1cbiAgZ2V0IHNjb3BlKCkge1xuICAgIHJldHVybiB0aGlzLl9zY29wZTtcbiAgfVxuICAvKiogQSBmcmVlIHZhcmlhYmxlIGVpdGhlciBoYXMgbm8gZGVmaW5pdGlvbiwgb3IgaXQgaGFzIGEgZGVmaW5pdGlvbiwgYnV0IG5vIHZhbHVlICovXG4gIGdldCBpc0ZyZWUoKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5fZGVmID8/IHRoaXMuZW5naW5lLmxvb2t1cFN5bWJvbCh0aGlzLl9uYW1lLCB0aGlzLl93aWtpZGF0YSk7XG4gICAgcmV0dXJuICFpc1N5bWJvbERlZmluaXRpb24yKGRlZikgfHwgZGVmLnZhbHVlID09PSB2b2lkIDA7XG4gIH1cbiAgZ2V0IGlzQ29uc3RhbnQoKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5fZGVmID8/IHRoaXMuZW5naW5lLmxvb2t1cFN5bWJvbCh0aGlzLl9uYW1lLCB0aGlzLl93aWtpZGF0YSk7XG4gICAgcmV0dXJuICFpc1N5bWJvbERlZmluaXRpb24yKGRlZikgfHwgZGVmLmNvbnN0YW50O1xuICB9XG4gIGdldCBpc0Nhbm9uaWNhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NvcGUgIT09IG51bGw7XG4gIH1cbiAgc2V0IGlzQ2Fub25pY2FsKHZhbCkge1xuICAgIHRoaXMuX3Njb3BlID0gdmFsID8gdGhpcy5lbmdpbmUuY29udGV4dCA6IG51bGw7XG4gICAgdGhpcy5fZGVmID0gbnVsbDtcbiAgfVxuICBnZXQgY2Fub25pY2FsKCkge1xuICAgIGlmICh0aGlzLl9zY29wZSlcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5ib3godGhpcy5fbmFtZSk7XG4gIH1cbiAgZ2V0IHdpa2lkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl93aWtpZGF0YSA/PyB0aGlzLmJhc2VEZWZpbml0aW9uPy53aWtpZGF0YSA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIGlmICghdGhpcy5iYXNlRGVmaW5pdGlvbilcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKCF0aGlzLmJhc2VEZWZpbml0aW9uLmRlc2NyaXB0aW9uKVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBpZiAodHlwZW9mIHRoaXMuYmFzZURlZmluaXRpb24uZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gW3RoaXMuYmFzZURlZmluaXRpb24uZGVzY3JpcHRpb25dO1xuICAgIHJldHVybiB0aGlzLmJhc2VEZWZpbml0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZURlZmluaXRpb24/LnVybCA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IGNvbXBsZXhpdHkoKSB7XG4gICAgcmV0dXJuIDc7XG4gIH1cbiAgZ2V0IGhlYWQoKSB7XG4gICAgcmV0dXJuIFwiU3ltYm9sXCI7XG4gIH1cbiAgZ2V0IHN5bWJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuICBnZXQgaXNOb3RoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lID09PSBcIk5vdGhpbmdcIjtcbiAgfVxuICAvLyAgQSBiYXNlIGRlZmluaXRpb24gaXMgdGhlIGJhc2UgY2xhc3Mgb2YgYm90aCBzeW1ib2wgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25cbiAgZ2V0IGJhc2VEZWZpbml0aW9uKCkge1xuICAgIGlmICh0aGlzLl9kZWYgPT09IG51bGwpXG4gICAgICB0aGlzLmJpbmQodGhpcy5fc2NvcGUpO1xuICAgIHJldHVybiB0aGlzLl9kZWYgPz8gdm9pZCAwO1xuICB9XG4gIGdldCBzeW1ib2xEZWZpbml0aW9uKCkge1xuICAgIGlmICh0aGlzLl9kZWYgPT09IG51bGwpXG4gICAgICB0aGlzLmJpbmQodGhpcy5fc2NvcGUpO1xuICAgIHJldHVybiBpc1N5bWJvbERlZmluaXRpb24yKHRoaXMuX2RlZikgPyB0aGlzLl9kZWYgOiB2b2lkIDA7XG4gIH1cbiAgZ2V0IGZ1bmN0aW9uRGVmaW5pdGlvbigpIHtcbiAgICBpZiAodGhpcy5fZGVmID09PSBudWxsKVxuICAgICAgdGhpcy5iaW5kKHRoaXMuX3Njb3BlKTtcbiAgICByZXR1cm4gaXNGdW5jdGlvbkRlZmluaXRpb24yKHRoaXMuX2RlZikgPyB0aGlzLl9kZWYgOiB2b2lkIDA7XG4gIH1cbiAgYmluZChzY29wZSkge1xuICAgIGlmIChzY29wZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGVmID0gdm9pZCAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGVmO1xuICAgIGRlZiA9IHRoaXMuZW5naW5lLmxvb2t1cFN5bWJvbCh0aGlzLl9uYW1lLCB0aGlzLl93aWtpZGF0YSwgc2NvcGUpO1xuICAgIGlmIChkZWY/Lndpa2lkYXRhICYmIHRoaXMuX3dpa2lkYXRhICYmIGRlZi53aWtpZGF0YSAhPT0gdGhpcy5fd2lraWRhdGEpXG4gICAgICBkZWYgPSB2b2lkIDA7XG4gICAgaWYgKGRlZikge1xuICAgICAgdGhpcy5fbmFtZSA9IGRlZi5uYW1lO1xuICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWYgPSB0aGlzLmVuZ2luZS5sb29rdXBGdW5jdGlvbih0aGlzLl9uYW1lLCBzY29wZSk7XG4gICAgaWYgKGRlZikge1xuICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmdpbmUuZGVmYXVsdERvbWFpbiAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lU3ltYm9sKHRoaXMuX25hbWUsIHtcbiAgICAgICAgd2lraWRhdGE6IHRoaXMuX3dpa2lkYXRhLFxuICAgICAgICBkb21haW46IHRoaXMuZW5naW5lLmRlZmF1bHREb21haW5cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbmFtZSA9IHRoaXMuX2RlZi5uYW1lO1xuICAgIH1cbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8udmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuX25hbWVbMF0gPT09IFwiX1wiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHZhbHVlIG9mIHRoZSB3aWxkY2FyZCBcIiR7dGhpcy5fbmFtZX1cIiBjYW5ub3QgYmUgY2hhbmdlZGBcbiAgICAgICk7XG4gICAgdGhpcy5lbmdpbmUuZm9yZ2V0KHRoaXMuX25hbWUpO1xuICAgIGxldCB2O1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBib3hlZFZhbHVlID0gdGhpcy5lbmdpbmUuYm94KHZhbHVlKTtcbiAgICAgIHYgPSBib3hlZFZhbHVlLnZhbHVlID8/IGJveGVkVmFsdWUuZXZhbHVhdGUoKTtcbiAgICB9XG4gICAgaWYgKHY/LmRvbWFpbi5pc0NvbXBhdGlibGUoXCJGdW5jdGlvblwiKSkge1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lRnVuY3Rpb24odGhpcy5fbmFtZSwge1xuICAgICAgICBzaWduYXR1cmU6IHtcbiAgICAgICAgICBkb21haW46IHYuZG9tYWluLFxuICAgICAgICAgIGV2YWx1YXRlOiB2XG4gICAgICAgICAgLy8gRXZhbHVhdGUgYXMgYSBsYW1iZGFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9kZWYgJiYgaXNTeW1ib2xEZWZpbml0aW9uMih0aGlzLl9kZWYpKSB7XG4gICAgICB0aGlzLl9kZWYudmFsdWUgPSB2O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZG9tID0gdj8uZG9tYWluO1xuICAgICAgaWYgKGRvbT8uaXNOdW1lcmljKVxuICAgICAgICBkb20gPSB0aGlzLmVuZ2luZS5kb21haW4oXCJOdW1iZXJcIik7XG4gICAgICB0aGlzLl9kZWYgPSB0aGlzLmVuZ2luZS5kZWZpbmVTeW1ib2wodGhpcy5fbmFtZSwge1xuICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgZG9tYWluOiBkb20gPz8gdm9pZCAwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICBpZiAodGhpcy5mdW5jdGlvbkRlZmluaXRpb24pXG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZG9tYWluKFwiRnVuY3Rpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8uZG9tYWluID8/IHRoaXMuZW5naW5lLmRlZmF1bHREb21haW4gPz8gdGhpcy5lbmdpbmUuZG9tYWluKFwiVmFsdWVcIik7XG4gIH1cbiAgc2V0IGRvbWFpbihpbkRvbWFpbikge1xuICAgIGlmICh0aGlzLl9uYW1lWzBdID09PSBcIl9cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBkb21haW4gb2YgdGhlIHdpbGRjYXJkIFwiJHt0aGlzLl9uYW1lfVwiIGNhbm5vdCBiZSBjaGFuZ2VkYFxuICAgICAgKTtcbiAgICBjb25zdCBkID0gdGhpcy5lbmdpbmUuZG9tYWluKGluRG9tYWluKTtcbiAgICBpZiAoZC5pc0NvbXBhdGlibGUoXCJGdW5jdGlvblwiKSkge1xuICAgICAgdGhpcy5lbmdpbmUuZm9yZ2V0KHRoaXMuX25hbWUpO1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lRnVuY3Rpb24odGhpcy5fbmFtZSwge1xuICAgICAgICBzaWduYXR1cmU6IHsgZG9tYWluOiBkIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNTeW1ib2xEZWZpbml0aW9uMih0aGlzLl9kZWYpKSB7XG4gICAgICB0aGlzLl9kZWYuZG9tYWluID0gZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbmdpbmUuZm9yZ2V0KHRoaXMuX25hbWUpO1xuICAgICAgdGhpcy5fZGVmID0gdGhpcy5lbmdpbmUuZGVmaW5lU3ltYm9sKHRoaXMuX25hbWUsIHsgZG9tYWluOiBkIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgZXhwbGljaXREb21haW4oKSB7XG4gICAgaWYgKHRoaXMuZnVuY3Rpb25EZWZpbml0aW9uKVxuICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLmRvbWFpbihcIkZ1bmN0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmRvbWFpbiA/PyB2b2lkIDA7XG4gIH1cbiAgZ2V0IHNnbigpIHtcbiAgICBjb25zdCB2ID0gdGhpcy52YWx1ZTtcbiAgICBpZiAodiAmJiB2ICE9PSB0aGlzKSB7XG4gICAgICBjb25zdCBzID0gdi5zZ247XG4gICAgICBpZiAocyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgY29uc3QgZGVmID0gdGhpcy5zeW1ib2xEZWZpbml0aW9uO1xuICAgIGlmIChkZWYpIHtcbiAgICAgIGlmIChkZWYuemVybyA9PT0gdHJ1ZSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBpZiAoZGVmLnBvc2l0aXZlID09PSB0cnVlKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmIChkZWYubmVnYXRpdmUgPT09IHRydWUpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaGFzKHgpIHtcbiAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdGhpcy5fbmFtZSA9PT0geDtcbiAgICByZXR1cm4geC5pbmNsdWRlcyh0aGlzLl9uYW1lKTtcbiAgfVxuICBpc1NhbWUocmhzKSB7XG4gICAgaWYgKHRoaXMgPT09IHJocylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKHJocyBpbnN0YW5jZW9mIF9Cb3hlZFN5bWJvbCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuX25hbWUgPT09IHJocy5fbmFtZTtcbiAgfVxuICBtYXRjaChyaHMsIF9vcHRpb25zKSB7XG4gICAgaWYgKCEocmhzIGluc3RhbmNlb2YgX0JveGVkU3ltYm9sKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLl9uYW1lID09PSByaHMuX25hbWUpXG4gICAgICByZXR1cm4ge307XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXNFcXVhbChyaHMpIHtcbiAgICBpZiAoIXRoaXMuaXNDYW5vbmljYWwpXG4gICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWwuaXNFcXVhbChyaHMpO1xuICAgIHJocyA9IHJocy5jYW5vbmljYWw7XG4gICAgaWYgKHRoaXMgPT09IHJocylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChyaHMuc3ltYm9sICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHJocy5zeW1ib2wgPT09IHRoaXMuX25hbWU7XG4gICAgY29uc3QgbGhzVmFsID0gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy52YWx1ZT8uTigpO1xuICAgIGlmIChsaHNWYWwpXG4gICAgICByZXR1cm4gbGhzVmFsLmlzRXF1YWwocmhzLk4oKSk7XG4gICAgaWYgKHJocy5pc1plcm8pIHtcbiAgICAgIGlmICh0aGlzLmlzWmVybylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodGhpcy5pc05vdFplcm8pXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNaZXJvICYmIHJocy5pc05vdFplcm8pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuZW5naW5lLmFzayhbXCJFcXVhbFwiLCB0aGlzLCByaHNdKS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZW5naW5lLmFzayhbXCJOb3RFcXVhbFwiLCB0aGlzLCByaHNdKS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0xlc3MocmhzKSB7XG4gICAgaWYgKHJocy5zeW1ib2wgIT09IG51bGwgJiYgcmhzLnN5bWJvbCA9PT0gdGhpcy5fbmFtZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNMZXNzKHJocy5OKCkpO1xuICAgIGlmIChyaHMuaXNaZXJvKSB7XG4gICAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHMgIT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIHMgPCAwO1xuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzTGVzc0VxdWFsKHJocykge1xuICAgIGlmIChyaHMuc3ltYm9sICE9PSBudWxsICYmIHJocy5zeW1ib2wgPT09IHRoaXMuX25hbWUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNMZXNzRXF1YWwocmhzLk4oKSk7XG4gICAgaWYgKHJocy5pc1plcm8pIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gcyA8PSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0xlc3MocmhzKSB8fCB0aGlzLmlzRXF1YWwocmhzKTtcbiAgfVxuICBpc0dyZWF0ZXIocmhzKSB7XG4gICAgaWYgKHJocy5zeW1ib2wgIT09IG51bGwgJiYgcmhzLnN5bWJvbCA9PT0gdGhpcy5fbmFtZSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNHcmVhdGVyKHJocy5OKCkpO1xuICAgIGlmIChyaHMuaXNaZXJvKSB7XG4gICAgICBjb25zdCBzID0gdGhpcy5zZ247XG4gICAgICBpZiAocyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHMgIT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIHMgPiAwO1xuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlzR3JlYXRlckVxdWFsKHJocykge1xuICAgIGlmIChyaHMuc3ltYm9sICE9PSBudWxsICYmIHJocy5zeW1ib2wgPT09IHRoaXMuX25hbWUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBsaHNWYWwgPSB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKCk7XG4gICAgaWYgKGxoc1ZhbClcbiAgICAgIHJldHVybiBsaHNWYWwuaXNHcmVhdGVyRXF1YWwocmhzLk4oKSk7XG4gICAgaWYgKHJocy5pc1plcm8pIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnNnbjtcbiAgICAgIGlmIChzID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocyAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gcyA+PSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0dyZWF0ZXIocmhzKSB8fCB0aGlzLmlzRXF1YWwocmhzKTtcbiAgfVxuICBnZXQgaXNGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbjtcbiAgfVxuICBnZXQgaXNaZXJvKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lnplcm87XG4gIH1cbiAgZ2V0IGlzTm90WmVybygpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5ub3RaZXJvO1xuICB9XG4gIGdldCBpc09uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5vbmU7XG4gIH1cbiAgZ2V0IGlzTmVnYXRpdmVPbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8ubmVnYXRpdmVPbmU7XG4gIH1cbiAgZ2V0IGlzT2RkKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm9kZDtcbiAgfVxuICBnZXQgaXNFdmVuKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmV2ZW47XG4gIH1cbiAgZ2V0IGlzUHJpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8ucHJpbWU7XG4gIH1cbiAgZ2V0IGlzQ29tcG9zaXRlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmNvbXBvc2l0ZTtcbiAgfVxuICBnZXQgaXNJbmZpbml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5pbmZpbml0eTtcbiAgfVxuICBnZXQgaXNOYU4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sRGVmaW5pdGlvbj8uTmFOO1xuICB9XG4gIC8vIHggPiAwXG4gIGdldCBpc1Bvc2l0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnBvc2l0aXZlO1xuICB9XG4gIGdldCBpc05vblBvc2l0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm5vblBvc2l0aXZlO1xuICB9XG4gIGdldCBpc05lZ2F0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm5lZ2F0aXZlO1xuICB9XG4gIGdldCBpc05vbk5lZ2F0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/Lm5vbk5lZ2F0aXZlO1xuICB9XG4gIGdldCBpc051bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5udW1iZXI7XG4gIH1cbiAgZ2V0IGlzSW50ZWdlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5pbnRlZ2VyO1xuICB9XG4gIGdldCBpc1JhdGlvbmFsKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnJhdGlvbmFsO1xuICB9XG4gIGdldCBpc0FsZ2VicmFpYygpIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xEZWZpbml0aW9uPy5yYXRpb25hbDtcbiAgfVxuICBnZXQgaXNSZWFsKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnJlYWw7XG4gIH1cbiAgZ2V0IGlzRXh0ZW5kZWRSZWFsKCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmV4dGVuZGVkUmVhbDtcbiAgfVxuICBnZXQgaXNDb21wbGV4KCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmNvbXBsZXg7XG4gIH1cbiAgZ2V0IGlzSW1hZ2luYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LmltYWdpbmFyeTtcbiAgfVxuICBzaW1wbGlmeShvcHRpb25zKSB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5zeW1ib2xEZWZpbml0aW9uO1xuICAgIGlmIChkZWY/LmhvbGRVbnRpbCA9PT0gXCJzaW1wbGlmeVwiICYmIGRlZi52YWx1ZSlcbiAgICAgIHJldHVybiBkZWYudmFsdWUuc2ltcGxpZnkob3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnM/LnJ1bGVzID8gdGhpcy5yZXBsYWNlKG9wdGlvbnMucnVsZXMpID8/IHRoaXMgOiB0aGlzO1xuICB9XG4gIGV2YWx1YXRlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLnN5bWJvbERlZmluaXRpb247XG4gICAgaWYgKGRlZiAmJiAoZGVmLmhvbGRVbnRpbCA9PT0gXCJzaW1wbGlmeVwiIHx8IGRlZi5ob2xkVW50aWwgPT09IFwiZXZhbHVhdGVcIikpXG4gICAgICByZXR1cm4gZGVmLnZhbHVlPy5ldmFsdWF0ZShvcHRpb25zKSA/PyB0aGlzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIE4ob3B0aW9ucykge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuc3ltYm9sRGVmaW5pdGlvbjtcbiAgICBpZiAoZGVmICYmIGRlZi5ob2xkVW50aWwgPT09IFwibmV2ZXJcIilcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIHJldHVybiB0aGlzLnN5bWJvbERlZmluaXRpb24/LnZhbHVlPy5OKG9wdGlvbnMpID8/IHRoaXM7XG4gIH1cbiAgcmVwbGFjZShydWxlcywgb3B0aW9ucykge1xuICAgIHJldHVybiByZXBsYWNlKHRoaXMsIHJ1bGVzLCBvcHRpb25zKTtcbiAgfVxuICBzdWJzKHN1YjIsIG9wdGlvbnMpIHtcbiAgICBpZiAoc3ViMlt0aGlzLl9uYW1lXSA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIG9wdGlvbnM/LmNhbm9uaWNhbCA/IHRoaXMuY2Fub25pY2FsIDogdGhpcztcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUuYm94KHN1YjJbdGhpcy5fbmFtZV0sIG9wdGlvbnMpO1xuICB9XG59O1xuZnVuY3Rpb24gbWFrZUNhbm9uaWNhbFN5bWJvbChjZSwgbmFtZSkge1xuICBjb25zdCBkZWYgPSBjZS5sb29rdXBTeW1ib2wobmFtZSwgdm9pZCAwLCBjZS5jb250ZXh0KTtcbiAgaWYgKGRlZj8uaG9sZFVudGlsID09PSBcIm5ldmVyXCIgJiYgZGVmLnZhbHVlKVxuICAgIHJldHVybiBkZWYudmFsdWU7XG4gIHJldHVybiBuZXcgQm94ZWRTeW1ib2woY2UsIG5hbWUsIHsgY2Fub25pY2FsOiB0cnVlLCBkZWYgfSk7XG59XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS9jb21wdXRlLWVuZ2luZS50c1xudmFyIENvbXB1dGVFbmdpbmUgPSBjbGFzcyBfQ29tcHV0ZUVuZ2luZSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgYENvbXB1dGVFbmdpbmVgIGluc3RhbmNlLlxuICAgKlxuICAgKiBJZGVudGlmaWVyIHRhYmxlcyBkZWZpbmUgZnVuY3Rpb25zIGFuZCBzeW1ib2xzIChpbiBgb3B0aW9ucy5pZHNgKS5cbiAgICogSWYgbm8gdGFibGUgaXMgcHJvdmlkZWQgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaXMgdXNlZCAoYENvbXB1dGVFbmdpbmUuZ2V0U3RhbmRhcmRMaWJyYXJ5KClgKVxuICAgKlxuICAgKiBUaGUgTGFUZVggc3ludGF4IGRpY3Rpb25hcnkgaXMgZGVmaW5lZCBpbiBgb3B0aW9ucy5sYXRleERpY3Rpb25hcnlgLlxuICAgKlxuICAgKiBUaGUgb3JkZXIgb2YgdGhlIGRpY3Rpb25hcmllcyBtYXR0ZXI6IHRoZSBkZWZpbml0aW9ucyBmcm9tIHRoZSBsYXRlciBvbmVzXG4gICAqIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucyBmcm9tIGVhcmxpZXIgb25lcy4gVGhlIGZpcnN0IGRpY3Rpb25hcnkgc2hvdWxkXG4gICAqIGJlIHRoZSBgJ2NvcmUnYCBkaWN0aW9uYXJ5IHdoaWNoIGluY2x1ZGUgc29tZSBiYXNpYyBkZWZpbml0aW9ucyBzdWNoXG4gICAqIGFzIGRvbWFpbnMgKGBCb29sZWFuYCwgYE51bWJlcmAsIGV0Yy4uLikgdGhhdCBhcmUgdXNlZCBieSBsYXRlciBkaWN0aW9uYXJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLm51bWVyaWNNb2RlIFRoZSBkZWZhdWx0IG1vZGUgaXMgYFwiYXV0b1wiYC4gVXNlIGBcIm1hY2hpbmVcImBcbiAgICogdG8gcGVyZm9ybSBudW1lcmljIGNhbGN1bGF0aW9ucyB1c2luZyA2NC1iaXQgZmxvYXRzLiBVc2UgYFwiYmlnbnVtXCJgIHRvXG4gICAqIHBlcmZvcm0gY2FsY3VsYXRpb25zIHVzaW5nIGFyYml0cmFyeSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy5cbiAgICogVXNlIGBcImF1dG9cImAgb3IgYFwiY29tcGxleFwiYCB0byBhbGxvdyBjYWxjdWxhdGlvbnMgb24gY29tcGxleCBudW1iZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5udW1lcmljUHJlY2lzaW9uIFNwZWNpZmljIGhvdyBtYW55IGRpZ2l0cyBvZiBwcmVjaXNpb25cbiAgICogZm9yIHRoZSBudW1lcmljIGNhbGN1bGF0aW9ucy4gRGVmYXVsdCBpcyAxMDAuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnRvbGVyYW5jZSBJZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvXG4gICAqIG51bWJlcnMgaXMgbGVzcyB0aGFuIGB0b2xlcmFuY2VgLCB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsLiBVc2VkIGJ5XG4gICAqIGBjaG9wKClgIGFzIHdlbGwuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLmRlZmF1bHREb21haW4gSWYgYW4gdW5rbm93biBzeW1ib2wgaXMgZW5jb3VudGVyZWQsIGFzc3VtZVxuICAgKiB0aGlzIGlzIGl0cyBkb21haW4uICoqRGVmYXVsdCoqIGBFeHRlbmRlZFJlYWxOdW1iZXJgXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX2NvbW1vblN5bWJvbHMgPSB7XG4gICAgICBUcnVlOiBudWxsLFxuICAgICAgRmFsc2U6IG51bGwsXG4gICAgICBNYXliZTogbnVsbCxcbiAgICAgIEFsbDogbnVsbCxcbiAgICAgIE5vdGhpbmc6IG51bGwsXG4gICAgICBOb25lOiBudWxsLFxuICAgICAgVW5kZWZpbmVkOiBudWxsLFxuICAgICAgRnVuY3Rpb246IG51bGwsXG4gICAgICBQaTogbnVsbCxcbiAgICAgIEltYWdpbmFyeVVuaXQ6IG51bGxcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9jb21tb25OdW1iZXJzID0ge1xuICAgICAgXCItNVwiOiBudWxsLFxuICAgICAgXCItNFwiOiBudWxsLFxuICAgICAgXCItM1wiOiBudWxsLFxuICAgICAgXCItMlwiOiBudWxsLFxuICAgICAgMjogbnVsbCxcbiAgICAgIDM6IG51bGwsXG4gICAgICA0OiBudWxsLFxuICAgICAgNTogbnVsbCxcbiAgICAgIDY6IG51bGwsXG4gICAgICA3OiBudWxsLFxuICAgICAgODogbnVsbCxcbiAgICAgIDk6IG51bGwsXG4gICAgICAxMDogbnVsbCxcbiAgICAgIDExOiBudWxsLFxuICAgICAgMTI6IG51bGwsXG4gICAgICAzNjogbnVsbFxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX2NvbW1vbkRvbWFpbnMgPSB7XG4gICAgICBBbnl0aGluZzogbnVsbCxcbiAgICAgIE5vdGhpbmc6IG51bGwsXG4gICAgICBCb29sZWFuOiBudWxsLFxuICAgICAgTWF5YmVCb29sZWFuOiBudWxsLFxuICAgICAgU3RyaW5nOiBudWxsLFxuICAgICAgRG9tYWluOiBudWxsLFxuICAgICAgU3ltYm9sOiBudWxsLFxuICAgICAgSW50ZWdlcjogbnVsbCxcbiAgICAgIFJhdGlvbmFsTnVtYmVyOiBudWxsLFxuICAgICAgQWxnZWJyYWljTnVtYmVyOiBudWxsLFxuICAgICAgUmVhbE51bWJlcjogbnVsbCxcbiAgICAgIEV4dGVuZGVkUmVhbE51bWJlcjogbnVsbCxcbiAgICAgIEltYWdpbmFyeU51bWJlcjogbnVsbCxcbiAgICAgIENvbXBsZXhOdW1iZXI6IG51bGwsXG4gICAgICBFeHRlbmRlZENvbXBsZXhOdW1iZXI6IG51bGwsXG4gICAgICBOdW1iZXI6IG51bGwsXG4gICAgICBQb3NpdGl2ZUludGVnZXI6IG51bGwsXG4gICAgICBUcmFuc2NlbmRlbnRhbE51bWJlcjogbnVsbCxcbiAgICAgIFBvc2l0aXZlTnVtYmVyOiBudWxsLFxuICAgICAgRnVuY3Rpb246IG51bGwsXG4gICAgICAvLyAoQW55dGhpbmdebikgLT4gQW55dGhpbmdcbiAgICAgIE51bWVyaWNGdW5jdGlvbjogbnVsbCxcbiAgICAgIC8vIChOdW1iZXJebikgLT4gTnVtYmVyXG4gICAgICBSZWFsRnVuY3Rpb246IG51bGwsXG4gICAgICAvLyAoRXh0ZW5kZWRSZWFsTnVtYmVyXm4pIC0+IEV4dGVuZFJlYWxOdW1iZXJcbiAgICAgIFRyaWdvbm9tZXRyaWNGdW5jdGlvbjogbnVsbCxcbiAgICAgIC8vIChDb21wbGV4TnVtYmVyKSAtPiBDb21wbGV4TnVtYmVyXG4gICAgICBMb2dpY09wZXJhdG9yOiBudWxsLFxuICAgICAgLy8gKEJvb2xlYW4sIEJvb2xlYW4pIC0+IEJvb2xlYW5cbiAgICAgIFByZWRpY2F0ZTogbnVsbCxcbiAgICAgIC8vIChBbnl0aGluZ15uKSAtPiBNYXliZUJvb2xlYW5cbiAgICAgIFJlbGF0aW9uYWxPcGVyYXRvcjogbnVsbFxuICAgICAgLy8gKEFueXRoaW5nLCBBbnl0aGluZykgLT4gTWF5YmVCb29sZWFuXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucyAhPT0gdm9pZCAwICYmIHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiKVxuICAgICAgdGhyb3cgRXJyb3IoXCJVbmV4cGVjdGVkIGFyZ3VtZW50XCIpO1xuICAgIHRoaXMuc3RyaWN0ID0gdHJ1ZTtcbiAgICB0aGlzLl9sYXRleERpY3Rpb25hcnkgPSBvcHRpb25zPy5sYXRleERpY3Rpb25hcnk7XG4gICAgdGhpcy5fanNvblNlcmlhbGl6YXRpb25PcHRpb25zID0ge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBzaG9ydGhhbmRzOiBbXCJmdW5jdGlvblwiLCBcInN5bWJvbFwiLCBcInN0cmluZ1wiLCBcImRpY3Rpb25hcnlcIiwgXCJudW1iZXJcIl0sXG4gICAgICBtZXRhZGF0YTogW10sXG4gICAgICBwcmVjaXNpb246IFwibWF4XCIsXG4gICAgICByZXBlYXRpbmdEZWNpbWFsczogdHJ1ZVxuICAgIH07XG4gICAgdGhpcy5fdXNlUmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fcmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0ge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBzaG9ydGhhbmRzOiBbXCJmdW5jdGlvblwiLCBcInN5bWJvbFwiLCBcInN0cmluZ1wiLCBcImRpY3Rpb25hcnlcIiwgXCJudW1iZXJcIl0sXG4gICAgICBtZXRhZGF0YTogW10sXG4gICAgICBwcmVjaXNpb246IFwibWF4XCIsXG4gICAgICByZXBlYXRpbmdEZWNpbWFsczogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuX3N0YXRzID0ge1xuICAgICAgaGlnaHdhdGVyTWFyazogMCxcbiAgICAgIHN5bWJvbHM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gICAgICBleHByZXNzaW9uczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxuICAgIH07XG4gICAgdGhpcy5fZGVmYXVsdERvbWFpbiA9IG51bGw7XG4gICAgdGhpcy5fbnVtZXJpY01vZGUgPSBvcHRpb25zPy5udW1lcmljTW9kZSA/PyBcImF1dG9cIjtcbiAgICB0aGlzLl9wcmVjaXNpb24gPSBNYXRoLm1heChcbiAgICAgIG9wdGlvbnM/Lm51bWVyaWNQcmVjaXNpb24gPz8gMTAwLFxuICAgICAgTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTilcbiAgICApO1xuICAgIHRoaXMuX2JpZ251bSA9IERlY2ltYWwuY2xvbmUoeyBwcmVjaXNpb246IHRoaXMuX3ByZWNpc2lvbiB9KTtcbiAgICB0aGlzLnRvbGVyYW5jZSA9IG9wdGlvbnM/LnRvbGVyYW5jZSA/PyBOVU1FUklDX1RPTEVSQU5DRTtcbiAgICB0aGlzLl9aRVJPID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIDApO1xuICAgIHRoaXMuX09ORSA9IG5ldyBCb3hlZE51bWJlcih0aGlzLCAxKTtcbiAgICB0aGlzLl9IQUxGID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIFsxLCAyXSk7XG4gICAgdGhpcy5fTkVHQVRJVkVfT05FID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIC0xKTtcbiAgICB0aGlzLl9JID0gbmV3IEJveGVkTnVtYmVyKHRoaXMsIGltcG9ydF9jb21wbGV4MjAuQ29tcGxleC5JKTtcbiAgICB0aGlzLl9OQU4gPSBuZXcgQm94ZWROdW1iZXIodGhpcywgTnVtYmVyLk5hTik7XG4gICAgdGhpcy5fUE9TSVRJVkVfSU5GSU5JVFkgPSBuZXcgQm94ZWROdW1iZXIodGhpcywgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB0aGlzLl9ORUdBVElWRV9JTkZJTklUWSA9IG5ldyBCb3hlZE51bWJlcih0aGlzLCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgIHRoaXMuX0NPTVBMRVhfSU5GSU5JVFkgPSBuZXcgQm94ZWROdW1iZXIodGhpcywgaW1wb3J0X2NvbXBsZXgyMC5Db21wbGV4LklORklOSVRZKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgYXNzdW1wdGlvbnM6IG5ldyBFeHByZXNzaW9uTWFwKCksXG4gICAgICB0aW1lTGltaXQ6IDIsXG4gICAgICAvLyBleGVjdXRpb24gdGltZSBsaW1pdDogMi4wIHNlY29uZHNcbiAgICAgIG1lbW9yeUxpbWl0OiAxLFxuICAgICAgLy8gbWVtb3J5IGxpbWl0OiAxLjAgbWVnYWJ5dGVcbiAgICAgIHJlY3Vyc2lvbkxpbWl0OiAxMDI0LFxuICAgICAgaXRlcmF0aW9uTGltaXQ6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgIH07XG4gICAgY29uc3QgdGFibGVzID0gb3B0aW9ucz8uaWRzID8/IF9Db21wdXRlRW5naW5lLmdldFN0YW5kYXJkTGlicmFyeSgpO1xuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKVxuICAgICAgc2V0Q3VycmVudENvbnRleHRTeW1ib2xUYWJsZSh0aGlzLCB0YWJsZSk7XG4gICAgZm9yIChjb25zdCBkIG9mIE9iamVjdC5rZXlzKHRoaXMuX2NvbW1vbkRvbWFpbnMpKSB7XG4gICAgICBpZiAodGhpcy5fY29tbW9uRG9tYWluc1tkXSAmJiAhdGhpcy5fY29tbW9uRG9tYWluc1tkXS5zeW1ib2xEZWZpbml0aW9uKVxuICAgICAgICB0aGlzLl9jb21tb25Eb21haW5zW2RdLmJpbmQodGhpcy5jb250ZXh0KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fY29tbW9uRG9tYWluc1tkXSA9IGJveERvbWFpbih0aGlzLCBkKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzeW0gb2YgT2JqZWN0LmtleXModGhpcy5fY29tbW9uU3ltYm9scykpIHtcbiAgICAgIHRoaXMuX2NvbW1vblN5bWJvbHNbc3ltXSA9IG5ldyBCb3hlZFN5bWJvbCh0aGlzLCBzeW0sIHtcbiAgICAgICAgY2Fub25pY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2NvbW1vblN5bWJvbHNbc3ltXS5iaW5kKHRoaXMuY29udGV4dCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5kZWZhdWx0RG9tYWluKSB7XG4gICAgICBjb25zdCBkZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4ob3B0aW9ucy5kZWZhdWx0RG9tYWluKTtcbiAgICAgIGlmIChkZWZhdWx0RG9tYWluLmlzVmFsaWQpXG4gICAgICAgIHRoaXMuX2RlZmF1bHREb21haW4gPSBkZWZhdWx0RG9tYWluO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl9kZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4oXCJFeHRlbmRlZFJlYWxOdW1iZXJcIik7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLl9kZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4oXCJFeHRlbmRlZFJlYWxOdW1iZXJcIik7XG4gICAgdGhpcy5wdXNoU2NvcGUoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGlkZW50aWZpZXIgdGFibGVzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNhdGVnb3JpZXMsIG9yIGBcImFsbFwiYFxuICAgKiBmb3IgYWxsIGNhdGVnb3JpZXMgKGBcImFyaXRobWV0aWNcImAsIGBcImFsZ2VicmFcImAsIGV0Yy4uLikuXG4gICAqXG4gICAqIEFuIGlkZW50aWZpZXIgdGFibGUgZGVmaW5lcyBob3cgdGhlIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIG5hbWVzIGluIGFcbiAgICogTWF0aEpTT04gZXhwcmVzc2lvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQsIGkuZS4gaG93IHRvIGV2YWx1YXRlIGFuZFxuICAgKiBtYW5pcHVsYXRlIHRoZW0uXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZ2V0U3RhbmRhcmRMaWJyYXJ5KGNhdGVnb3JpZXMgPSBcImFsbFwiKSB7XG4gICAgcmV0dXJuIGdldFN0YW5kYXJkTGlicmFyeShjYXRlZ29yaWVzKTtcbiAgfVxuICBnZXQgbGF0ZXhEaWN0aW9uYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGV4U3ludGF4LmRpY3Rpb25hcnk7XG4gIH1cbiAgc2V0IGxhdGV4RGljdGlvbmFyeShkaWMpIHtcbiAgICB0aGlzLmxhdGV4U3ludGF4LmRpY3Rpb25hcnkgPSBkaWM7XG4gIH1cbiAgLyoqIEFmdGVyIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBlbmdpbmUgaGFzIGNoYW5nZWQsIGNsZWFyIHRoZSBjYWNoZXNcbiAgICogc28gdGhhdCBuZXcgdmFsdWVzIGNhbiBiZSByZWNhbGN1bGF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGZvciBleGFtcGxlIHdoZW4gdGhlIG51bWVyaWMgcHJlY2lzaW9uIGNoYW5nZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgLyogQF9fUFVSRV9fICovIGNvbnNvbGUuYXNzZXJ0KHRoaXMuX2JpZ251bSk7XG4gICAgdGhpcy5fQklHTlVNX05FR0FUSVZFX09ORSA9IHRoaXMuYmlnbnVtKC0xKTtcbiAgICB0aGlzLl9CSUdOVU1fTkFOID0gdGhpcy5iaWdudW0oTmFOKTtcbiAgICB0aGlzLl9CSUdOVU1fWkVSTyA9IHRoaXMuYmlnbnVtKDApO1xuICAgIHRoaXMuX0JJR05VTV9PTkUgPSB0aGlzLmJpZ251bSgxKTtcbiAgICB0aGlzLl9CSUdOVU1fVFdPID0gdGhpcy5iaWdudW0oMik7XG4gICAgdGhpcy5fQklHTlVNX0hBTEYgPSB0aGlzLl9CSUdOVU1fT05FLmRpdih0aGlzLl9CSUdOVU1fVFdPKTtcbiAgICB0aGlzLl9CSUdOVU1fUEkgPSB0aGlzLl9CSUdOVU1fTkVHQVRJVkVfT05FLmFjb3MoKTtcbiAgICBjb25zdCBzeW1ib2xzID0gdGhpcy5fc3RhdHMuc3ltYm9scy52YWx1ZXMoKTtcbiAgICBjb25zdCBleHByZXNzaW9ucyA9IHRoaXMuX3N0YXRzLmV4cHJlc3Npb25zLnZhbHVlcygpO1xuICAgIHRoaXMuX3N0YXRzLnN5bWJvbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIHRoaXMuX3N0YXRzLmV4cHJlc3Npb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc3ltYm9scylcbiAgICAgIHMudW5iaW5kKCk7XG4gICAgZm9yIChjb25zdCBzIG9mIGV4cHJlc3Npb25zKVxuICAgICAgcy51bmJpbmQoKTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9jb21tb25Eb21haW5zKSlcbiAgICAgIGQ/LnVuYmluZCgpO1xuICAgIGZvciAoY29uc3QgZCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2NvbW1vblN5bWJvbHMpKVxuICAgICAgZD8udW5iaW5kKCk7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5jb250ZXh0O1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgaWYgKHNjb3BlLmlkVGFibGUpXG4gICAgICAgIGZvciAoY29uc3QgW19rLCB2XSBvZiBzY29wZS5pZFRhYmxlKVxuICAgICAgICAgIHYucmVzZXQoKTtcbiAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGUgPz8gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMuX2NhY2hlKSlcbiAgICAgIGlmICh0aGlzLl9jYWNoZVtrXS52YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlW2tdLnB1cmdlKVxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVtrXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuX2NhY2hlW2tdLnZhbHVlID0gdGhpcy5fY2FjaGVba10ucHVyZ2UodGhpcy5fY2FjaGVba10udmFsdWUpO1xuICAgICAgfVxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3JlZ2lzdGVyKF9leHByKSB7XG4gICAgdGhpcy5fc3RhdHMuaGlnaHdhdGVyTWFyayArPSAxO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3VucmVnaXN0ZXIoX2V4cHIpIHtcbiAgfVxuICBnZXQgc3RhdHMoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLl9zdGF0cy5leHByZXNzaW9ucztcbiAgICB0aGlzLl9zdGF0cy5leHByZXNzaW9ucyA9IG51bGw7XG4gICAgdGhpcy5fc3RhdHMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5fc3RhdHNcbiAgICAgIC8vIF9kdXBlU3ltYm9sczogdG9wRHVwZXMsXG4gICAgICAvLyBfcG9wdWxhckV4cHJlc3Npb25zOiB0b3AxMCxcbiAgICB9O1xuICB9XG4gIC8qKiBUaGUgcHJlY2lzaW9uLCBvciBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzLCBvZiBudW1lcmljXG4gICAqIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBudW1lcmljIG1vZGUgaXMgYFwiYXV0b1wiYCBvciBgXCJiaWdudW1cImAuXG4gICAqXG4gICAqIFRvIG1ha2UgY2FsY3VsYXRpb25zIHVzaW5nIG1vcmUgZGlnaXRzLCBhdCB0aGUgY29zdCBvZiBleHBhbmRlZCBtZW1vcnlcbiAgICogdXNhZ2UgYW5kIHNsb3dlciBjb21wdXRhdGlvbnMsIHNldCB0aGUgYHByZWNpc2lvbmAgaGlnaGVyLlxuICAgKlxuICAgKiBJZiB0aGUgbnVtZXJpYyBtb2RlIGlzIG5vdCBgXCJhdXRvXCJgIG9yIGBcImJpZ251bVwiYCwgaXQgaXMgc2V0IHRvIGBcImF1dG9cImAuXG4gICAqXG4gICAqIFRyaWdvbm9tZXRyaWMgb3BlcmF0aW9ucyBhcmUgYWNjdXJhdGUgZm9yIHByZWNpc2lvbiB1cCB0byAxLDAwMC5cbiAgICpcbiAgICovXG4gIGdldCBwcmVjaXNpb24oKSB7XG4gICAgaWYgKHRoaXMuX251bWVyaWNNb2RlID09PSBcIm1hY2hpbmVcIiB8fCB0aGlzLl9udW1lcmljTW9kZSA9PT0gXCJjb21wbGV4XCIpXG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTik7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWNpc2lvbjtcbiAgfVxuICBzZXQgcHJlY2lzaW9uKHApIHtcbiAgICBpZiAocCA9PT0gXCJtYWNoaW5lXCIpXG4gICAgICBwID0gTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTik7XG4gICAgY29uc3QgY3VycmVudFByZWNpc2lvbiA9IHRoaXMuX3ByZWNpc2lvbjtcbiAgICBpZiAocCA9PT0gY3VycmVudFByZWNpc2lvbilcbiAgICAgIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHAgIT09IFwibnVtYmVyXCIgfHwgcCA8PSAwKVxuICAgICAgdGhyb3cgRXJyb3IoJ0V4cGVjdGVkIFwibWFjaGluZVwiIG9yIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gICAgdGhpcy5fbGF0ZXhTeW50YXg/LnVwZGF0ZU9wdGlvbnMoe1xuICAgICAgcHJlY2lzaW9uOiBwLFxuICAgICAgYXZvaWRFeHBvbmVudHNJblJhbmdlOiBbLTYsIHBdXG4gICAgfSk7XG4gICAgdGhpcy5fcHJlY2lzaW9uID0gTWF0aC5tYXgocCwgTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTikpO1xuICAgIGlmICh0aGlzLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5wcmVjaXNpb24gPiB0aGlzLl9wcmVjaXNpb24pXG4gICAgICB0aGlzLmpzb25TZXJpYWxpemF0aW9uT3B0aW9ucyA9IHsgcHJlY2lzaW9uOiB0aGlzLl9wcmVjaXNpb24gfTtcbiAgICBpZiAodGhpcy5fbnVtZXJpY01vZGUgIT09IFwiYXV0b1wiICYmIHRoaXMuX251bWVyaWNNb2RlICE9PSBcImJpZ251bVwiICYmIHRoaXMuX3ByZWNpc2lvbiA+IE1hdGguZmxvb3IoTUFDSElORV9QUkVDSVNJT04pKVxuICAgICAgdGhpcy5fbnVtZXJpY01vZGUgPSBcImF1dG9cIjtcbiAgICB0aGlzLl9iaWdudW0gPSB0aGlzLl9iaWdudW0uY29uZmlnKHsgcHJlY2lzaW9uOiB0aGlzLl9wcmVjaXNpb24gfSk7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG4gIGdldCBudW1lcmljTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtZXJpY01vZGU7XG4gIH1cbiAgc2V0IG51bWVyaWNNb2RlKGYpIHtcbiAgICBpZiAoZiA9PT0gdGhpcy5fbnVtZXJpY01vZGUpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBmICE9PSBcInN0cmluZ1wiKVxuICAgICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCBhIHN0cmluZ1wiKTtcbiAgICB0aGlzLl9udW1lcmljTW9kZSA9IGY7XG4gICAgaWYgKGYgPT09IFwiY29tcGxleFwiIHx8IGYgPT09IFwibWFjaGluZVwiKVxuICAgICAgdGhpcy5fcHJlY2lzaW9uID0gTWF0aC5mbG9vcihNQUNISU5FX1BSRUNJU0lPTik7XG4gICAgaWYgKHRoaXMuX2xhdGV4U3ludGF4ICYmIHRoaXMubGF0ZXhTeW50YXgub3B0aW9ucy5wcmVjaXNpb24gPiB0aGlzLl9wcmVjaXNpb24pXG4gICAgICB0aGlzLmxhdGV4U3ludGF4LnVwZGF0ZU9wdGlvbnMoeyBwcmVjaXNpb246IHRoaXMuX3ByZWNpc2lvbiB9KTtcbiAgICBpZiAodGhpcy5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMucHJlY2lzaW9uID4gdGhpcy5fcHJlY2lzaW9uKVxuICAgICAgdGhpcy5qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMgPSB7IHByZWNpc2lvbjogdGhpcy5fcHJlY2lzaW9uIH07XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG4gIC8qKiBAZXhwZXJpbWVudGFsICovXG4gIGdldCB0aW1lTGltaXQoKSB7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5jb250ZXh0O1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgaWYgKHNjb3BlLnRpbWVMaW1pdCAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gc2NvcGUudGltZUxpbWl0O1xuICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnRTY29wZSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gMjtcbiAgfVxuICAvKiogQGV4cGVyaW1lbnRhbCAqL1xuICBnZXQgaXRlcmF0aW9uTGltaXQoKSB7XG4gICAgbGV0IHNjb3BlID0gdGhpcy5jb250ZXh0O1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgaWYgKHNjb3BlLml0ZXJhdGlvbkxpbWl0ICE9PSB2b2lkIDApXG4gICAgICAgIHJldHVybiBzY29wZS5pdGVyYXRpb25MaW1pdDtcbiAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGUgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIDEwMjQ7XG4gIH1cbiAgLyoqIEBleHBlcmltZW50YWwgKi9cbiAgZ2V0IHJlY3Vyc2lvbkxpbWl0KCkge1xuICAgIGxldCBzY29wZSA9IHRoaXMuY29udGV4dDtcbiAgICB3aGlsZSAoc2NvcGUpIHtcbiAgICAgIGlmIChzY29wZS5yZWN1cnNpb25MaW1pdCAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gc2NvcGUucmVjdXJzaW9uTGltaXQ7XG4gICAgICBzY29wZSA9IHNjb3BlLnBhcmVudFNjb3BlID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiAxMDI0O1xuICB9XG4gIC8qKlxuICAgKiBJZiBhbiB1bmtub3duIHN5bWJvbCBpcyBlbmNvdW50ZXJlZCwgYXNzdW1lIGl0IHNob3VsZFxuICAgKiBiZSBhIHZhcmlhYmxlIGluIHRoaXMgZG9tYWluLlxuICAgKlxuICAgKiBJZiBzZXQgdG8gYG51bGxgLCB1bmtub3duIHN5bWJvbHMgd2lsbCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgKlxuICAgKiAqKkRlZmF1bHQ6KiogYFwiRXh0ZW5kZWRSZWFsTnVtYmVyXCJgXG4gICAqL1xuICBnZXQgZGVmYXVsdERvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdERvbWFpbjtcbiAgfVxuICBzZXQgZGVmYXVsdERvbWFpbihkb21haW4pIHtcbiAgICBpZiAoZG9tYWluID09PSBudWxsKVxuICAgICAgdGhpcy5fZGVmYXVsdERvbWFpbiA9IG51bGw7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0RG9tYWluID0gdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICghZGVmYXVsdERvbWFpbi5pc1ZhbGlkKVxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkb21haW4gJHtkb21haW59YCk7XG4gICAgICB0aGlzLl9kZWZhdWx0RG9tYWluID0gZGVmYXVsdERvbWFpbjtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFZhbHVlcyBzbWFsbGVyIHRoYW4gdGhlIHRvbGVyYW5jZSBhcmUgY29uc2lkZXJlZCB0byBiZSB6ZXJvIGZvciB0aGVcbiAgICogcHVycG9zZSBvZiBjb21wYXJpc29uLCBpLmUuIGlmIGB8YiAtIGF8IDw9IHRvbGVyYW5jZWAsIGBiYCBpcyBjb25zaWRlcmVkXG4gICAqIGVxdWFsIHRvIGBhYC5cbiAgICovXG4gIGdldCB0b2xlcmFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvbGVyYW5jZTtcbiAgfVxuICBzZXQgdG9sZXJhbmNlKHZhbCkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWwpKVxuICAgICAgdGhpcy5fdG9sZXJhbmNlID0gTWF0aC5tYXgodmFsLCAwKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl90b2xlcmFuY2UgPSBOVU1FUklDX1RPTEVSQU5DRTtcbiAgICB0aGlzLl9iaWdudW1Ub2xlcmFuY2UgPSB0aGlzLmJpZ251bSh0aGlzLl90b2xlcmFuY2UpO1xuICB9XG4gIGNob3Aobikge1xuICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiBNYXRoLmFicyhuKSA8PSB0aGlzLl90b2xlcmFuY2UpXG4gICAgICByZXR1cm4gMDtcbiAgICBpZiAobiBpbnN0YW5jZW9mIERlY2ltYWwgJiYgbi5hYnMoKS5sdGUodGhpcy5fYmlnbnVtVG9sZXJhbmNlKSlcbiAgICAgIHJldHVybiAwO1xuICAgIGlmIChuIGluc3RhbmNlb2YgaW1wb3J0X2NvbXBsZXgyMC5Db21wbGV4ICYmIE1hdGguYWJzKG4ucmUpIDw9IHRoaXMuX3RvbGVyYW5jZSAmJiBNYXRoLmFicyhuLmltKSA8PSB0aGlzLl90b2xlcmFuY2UpXG4gICAgICByZXR1cm4gMDtcbiAgICByZXR1cm4gbjtcbiAgfVxuICBiaWdudW0oYSkge1xuICAgIGlmICh0eXBlb2YgYSA9PT0gXCJiaWdpbnRcIilcbiAgICAgIHJldHVybiBuZXcgdGhpcy5fYmlnbnVtKGEudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLl9iaWdudW0oYSk7XG4gIH1cbiAgY29tcGxleChhLCBiKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBEZWNpbWFsKVxuICAgICAgYSA9IGEudG9OdW1iZXIoKTtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIERlY2ltYWwpXG4gICAgICBiID0gYi50b051bWJlcigpO1xuICAgIHJldHVybiBuZXcgaW1wb3J0X2NvbXBsZXgyMC5Db21wbGV4KGEsIGIpO1xuICB9XG4gIGlzQmlnbnVtKGEpIHtcbiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIERlY2ltYWw7XG4gIH1cbiAgaXNDb21wbGV4KGEpIHtcbiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MjAuQ29tcGxleDtcbiAgfVxuICBnZXQgbGF0ZXhTeW50YXgoKSB7XG4gICAgaWYgKCF0aGlzLl9sYXRleFN5bnRheClcbiAgICAgIHRoaXMuX2xhdGV4U3ludGF4ID0gbmV3IExhdGV4U3ludGF4KHtcbiAgICAgICAgY29tcHV0ZUVuZ2luZTogdGhpcyxcbiAgICAgICAgZGljdGlvbmFyeTogdGhpcy5fbGF0ZXhEaWN0aW9uYXJ5LFxuICAgICAgICBwcmVjaXNpb246IHRoaXMucHJlY2lzaW9uLFxuICAgICAgICBhdm9pZEV4cG9uZW50c0luUmFuZ2U6IFstNiwgdGhpcy5wcmVjaXNpb25dLFxuICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KGVyclswXS5tZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9sYXRleFN5bnRheDtcbiAgfVxuICBzdGF0aWMgZ2V0TGF0ZXhEaWN0aW9uYXJ5KGRvbWFpbiA9IFwiYWxsXCIpIHtcbiAgICByZXR1cm4gTGF0ZXhTeW50YXguZ2V0RGljdGlvbmFyeShkb21haW4pO1xuICB9XG4gIHNldCBjb3N0RnVuY3Rpb24oZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aGlzLl9jb3N0ID0gREVGQVVMVF9DT1NUX0ZVTkNUSU9OO1xuICAgIHRoaXMuX2Nvc3QgPSBmbjtcbiAgfVxuICBnZXQgY29zdEZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jb3N0ID8/IERFRkFVTFRfQ09TVF9GVU5DVElPTjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGEgbWF0Y2hpbmcgc3ltYm9sIGRlZmluaXRpb24sIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnRcbiAgICogc2NvcGUgYW5kIGdvaW5nIHVwIHRoZSBzY29wZSBjaGFpbi4gUHJpb3JpdGl6ZSBmaW5kaW5nIGEgbWF0Y2ggYnlcbiAgICogd2lraWRhdGEsIGlmIHByb3ZpZGVkLlxuICAgKi9cbiAgbG9va3VwU3ltYm9sKHN5bWJvbDIsIHdpa2lkYXRhLCBzY29wZSkge1xuICAgIGlmICghdGhpcy5zdHJpY3QpIHtcbiAgICAgIHNjb3BlID8/IChzY29wZSA9IHRoaXMuY29udGV4dCA/PyB2b2lkIDApO1xuICAgICAgd2hpbGUgKHNjb3BlKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IHNjb3BlLmlkVGFibGU/LmdldChzeW1ib2wyKTtcbiAgICAgICAgaWYgKGlzU3ltYm9sRGVmaW5pdGlvbihkZWYpKVxuICAgICAgICAgIHJldHVybiBkZWY7XG4gICAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN5bWJvbDIgIT09IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIGEgc3RyaW5nXCIpO1xuICAgIGlmIChzeW1ib2wyLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5jb250ZXh0KVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBjb25zdCByb290U2NvcGUgPSBzY29wZSA/PyB0aGlzLmNvbnRleHQ7XG4gICAgaWYgKHdpa2lkYXRhKSB7XG4gICAgICBzY29wZSA9IHJvb3RTY29wZTtcbiAgICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgICBpZiAoc2NvcGUuaWRUYWJsZSlcbiAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBkXSBvZiBzY29wZS5pZFRhYmxlKSB7XG4gICAgICAgICAgICBpZiAoaXNTeW1ib2xEZWZpbml0aW9uKGQpICYmIGQud2lraWRhdGEgPT09IHdpa2lkYXRhKVxuICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICB9XG4gICAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50U2NvcGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNjb3BlID0gcm9vdFNjb3BlO1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgY29uc3QgZGVmID0gc2NvcGUuaWRUYWJsZT8uZ2V0KHN5bWJvbDIpO1xuICAgICAgaWYgKGlzU3ltYm9sRGVmaW5pdGlvbihkZWYpKVxuICAgICAgICByZXR1cm4gZGVmO1xuICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnRTY29wZTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uIG1hdGNoaW5nIHRoaXMgaGVhZC5cbiAgICpcbiAgICogU3RhcnQgbG9va2luZyBpbiB0aGUgY3VycmVudCBjb250ZXh0LCB0aGFuIHVwIHRoZSBzY29wZSBjaGFpbi5cbiAgICpcbiAgICogVGhpcyBpcyBhIHZlcnkgcm91Z2ggbG9va3VwLCBzaW5jZSBpdCBkb2Vzbid0IGFjY291bnQgZm9yIHRoZSBkb21haW5cbiAgICogb2YgdGhlIGFyZ3VtZW50IG9yIHRoZSBjb2RvbWFpbi4gSG93ZXZlciwgaXQgaXMgdXNlZnVsIGR1cmluZyBwYXJzaW5nXG4gICAqIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzeW1ib2xzIHRoYXQgbWlnaHQgcmVwcmVzZW50IGEgZnVuY3Rpb24gYXBwbGljYXRpb24sIGUuZy4gYGZgIHZzIGB4YC5cbiAgICovXG4gIGxvb2t1cEZ1bmN0aW9uKGhlYWQyLCBzY29wZSkge1xuICAgIGlmICh0eXBlb2YgaGVhZDIgIT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIGlmICghdGhpcy5jb250ZXh0KVxuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICBzY29wZSA/PyAoc2NvcGUgPSB0aGlzLmNvbnRleHQpO1xuICAgIHdoaWxlIChzY29wZSkge1xuICAgICAgY29uc3QgZGVmID0gc2NvcGUuaWRUYWJsZT8uZ2V0KGhlYWQyKTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uRGVmaW5pdGlvbihkZWYpKVxuICAgICAgICByZXR1cm4gZGVmO1xuICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnRTY29wZTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICAvKipcbiAgICogQWRkIChvciByZXBsYWNlKSBhIGRlZmluaXRpb24gZm9yIGEgc3ltYm9sIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICAgKi9cbiAgZGVmaW5lU3ltYm9sKG5hbWUsIGRlZikge1xuICAgIGlmICghdGhpcy5jb250ZXh0KVxuICAgICAgdGhyb3cgRXJyb3IoXCJTeW1ib2wgY2Fubm90IGJlIGRlZmluZWQ6IG5vIHNjb3BlIGF2YWlsYWJsZVwiKTtcbiAgICBpZiAobmFtZS5sZW5ndGggPT09IDAgfHwgIWlzVmFsaWRJZGVudGlmaWVyKG5hbWUpKVxuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgaWRlbnRpZmllciBcIiR7bmFtZX1cIjogJHt2YWxpZGF0ZUlkZW50aWZpZXIobmFtZSl9fWApO1xuICAgIGlmICghdGhpcy5jb250ZXh0LmlkVGFibGUpXG4gICAgICB0aGlzLmNvbnRleHQuaWRUYWJsZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3QgYm94ZWREZWYgPSBuZXcgQm94ZWRTeW1ib2xEZWZpbml0aW9uSW1wbCh0aGlzLCBuYW1lLCBkZWYpO1xuICAgIGlmIChib3hlZERlZi5uYW1lKVxuICAgICAgdGhpcy5jb250ZXh0LmlkVGFibGUuc2V0KGJveGVkRGVmLm5hbWUsIGJveGVkRGVmKTtcbiAgICByZXR1cm4gYm94ZWREZWY7XG4gIH1cbiAgZGVmaW5lRnVuY3Rpb24obmFtZSwgZGVmKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpXG4gICAgICB0aHJvdyBFcnJvcihcIkZ1bmN0aW9uIGNhbm5vdCBiZSBkZWZpbmVkOiBubyBzY29wZSBhdmFpbGFibGVcIik7XG4gICAgaWYgKG5hbWUubGVuZ3RoID09PSAwIHx8ICFpc1ZhbGlkSWRlbnRpZmllcihuYW1lKSlcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGlkZW50aWZpZXIgXCIke25hbWV9XCI6ICR7dmFsaWRhdGVJZGVudGlmaWVyKG5hbWUpfX1gKTtcbiAgICBpZiAoIXRoaXMuY29udGV4dC5pZFRhYmxlKVxuICAgICAgdGhpcy5jb250ZXh0LmlkVGFibGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGJveGVkRGVmID0gbWFrZUZ1bmN0aW9uRGVmaW5pdGlvbih0aGlzLCBuYW1lLCBkZWYpO1xuICAgIGlmIChib3hlZERlZi5uYW1lKVxuICAgICAgdGhpcy5jb250ZXh0LmlkVGFibGUuc2V0KG5hbWUsIGJveGVkRGVmKTtcbiAgICByZXR1cm4gYm94ZWREZWY7XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIENyZWF0ZSBhIG5ldyBzY29wZSBhbmQgYWRkIGl0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIHN0YWNrXG4gICAqXG4gICAqIFRoZSBgb3B0aW9ucy5zY29wZWAgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjdXN0b20gcHJlY2lzaW9uLFxuICAgKiBldGMuLi4gZm9yIHRoaXMgc2NvcGVcbiAgICpcbiAgICovXG4gIHB1c2hTY29wZShpZHMsIHNjb3BlKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dCA9PT0gbnVsbClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gcGFyZW50IHNjb3BlIGF2YWlsYWJsZVwiKTtcbiAgICB0aGlzLmNvbnRleHQgPSB7XG4gICAgICB0aW1lTGltaXQ6IHRoaXMuY29udGV4dC50aW1lTGltaXQsXG4gICAgICBtZW1vcnlMaW1pdDogdGhpcy5jb250ZXh0Lm1lbW9yeUxpbWl0LFxuICAgICAgcmVjdXJzaW9uTGltaXQ6IHRoaXMuY29udGV4dC5yZWN1cnNpb25MaW1pdCxcbiAgICAgIGl0ZXJhdGlvbkxpbWl0OiB0aGlzLmNvbnRleHQuaXRlcmF0aW9uTGltaXQsXG4gICAgICAuLi5zY29wZSA/PyB7fSxcbiAgICAgIHBhcmVudFNjb3BlOiB0aGlzLmNvbnRleHQsXG4gICAgICAvLyBXZSBhbHdheXMgY29weSB0aGUgY3VycmVudCBhc3N1bXB0aW9ucyBpbiB0aGUgbmV3IHNjb3BlLlxuICAgICAgLy8gVGhpcyBtYWtlIGlzIG11Y2ggZWFzaWVyIHRvIGRlYWwgd2l0aCAnaW5oZXJpdGVkJyBhc3N1bXB0aW9uc1xuICAgICAgLy8gKGFuZCBwb3RlbnRpYWxseSBtb2RpZnlpbmcgdGhlbSBsYXRlcikgd2l0aG91dCBoYXZpbmcgdG8gd2FsayBiYWNrXG4gICAgICAvLyBpbnRvIHBhcmVudCBjb250ZXh0cy4gSW4gb3RoZXIgd29yZHMsIGNhbGxpbmcgYGNlLmZvcmdldCgpYCB3aWxsXG4gICAgICAvLyBmb3JnZXQgZXZlcnl0aGluZyAqKmluIHRoZSBjdXJyZW50IHNjb3BlKiouIFdoZW4gZXhpdGluZyB0aGUgc2NvcGUsXG4gICAgICAvLyB0aGUgcHJldmlvdXMgYXNzdW1wdGlvbnMgYXJlIHJlc3RvcmVkLlxuICAgICAgYXNzdW1wdGlvbnM6IG5ldyBFeHByZXNzaW9uTWFwKHRoaXMuY29udGV4dC5hc3N1bXB0aW9ucylcbiAgICB9O1xuICAgIGlmIChpZHMpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkcykpXG4gICAgICAgIGZvciAoY29uc3QgdGFibGUgb2YgaWRzKVxuICAgICAgICAgIHNldEN1cnJlbnRDb250ZXh0U3ltYm9sVGFibGUodGhpcywgdGFibGUpO1xuICAgICAgZWxzZVxuICAgICAgICBzZXRDdXJyZW50Q29udGV4dFN5bWJvbFRhYmxlKHRoaXMsIGlkcyk7XG4gICAgfVxuICB9XG4gIC8qKiBSZW1vdmUgdGhlIHRvcG1vc3Qgc2NvcGUgZnJvbSB0aGUgc2NvcGUgc3RhY2suXG4gICAqL1xuICBwb3BTY29wZSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gc2NvcGUgYXZhaWxhYmxlXCIpO1xuICAgIGNvbnN0IHBhcmVudFNjb3BlID0gdGhpcy5jb250ZXh0Py5wYXJlbnRTY29wZTtcbiAgICB0aGlzLmNvbnRleHQgPSBwYXJlbnRTY29wZSA/PyBudWxsO1xuICAgIC8qIEBfX1BVUkVfXyAqLyBjb25zb2xlLmFzc2VydCh0aGlzLmNvbnRleHQgIT09IG51bGwpO1xuICB9XG4gIHNldChpZGVudGlmaWVycykge1xuICAgIGlmICghdGhpcy5zdHJpY3QpIHtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhpZGVudGlmaWVycykpIHtcbiAgICAgICAgaWYgKGsgIT09IFwiTm90aGluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgZGVmID0gdGhpcy5sb29rdXBTeW1ib2woayk7XG4gICAgICAgICAgY29uc3QgaWRrID0gaWRlbnRpZmllcnNba107XG4gICAgICAgICAgaWYgKGRlZilcbiAgICAgICAgICAgIGRlZi52YWx1ZSA9IGlkayA/PyB2b2lkIDA7XG4gICAgICAgICAgZWxzZSBpZiAoaWRrICE9PSB2b2lkIDAgJiYgaWRrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmJveChpZGspO1xuICAgICAgICAgICAgaWYgKHZhbC5kb21haW4uaXNOdW1lcmljKVxuICAgICAgICAgICAgICB0aGlzLmRlZmluZVN5bWJvbChrLCB7IHZhbHVlOiB2YWwsIGRvbWFpbjogXCJOdW1iZXJcIiB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5kZWZpbmVTeW1ib2woaywgeyB2YWx1ZTogdmFsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoaWRlbnRpZmllcnMpKSB7XG4gICAgICBpZiAoayAhPT0gXCJOb3RoaW5nXCIpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5sb29rdXBTeW1ib2woayk7XG4gICAgICAgIGNvbnN0IGlkayA9IGlkZW50aWZpZXJzW2tdO1xuICAgICAgICBpZiAoaWRrID09PSB2b2lkIDAgfHwgaWRrID09PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGRlZilcbiAgICAgICAgICAgIGRlZi52YWx1ZSA9IHZvaWQgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmJveChpZGspO1xuICAgICAgICAgIGlmIChkZWYpIHtcbiAgICAgICAgICAgIGlmIChkZWYuZG9tYWluICYmICF2YWwuZG9tYWluLmlzQ29tcGF0aWJsZShkZWYuZG9tYWluKSlcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIHZhbHVlIHdpdGggZG9tYWluICR7ZGVmLmRvbWFpbi50b1N0cmluZygpfSBmb3IgXCIke2t9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWYudmFsdWUgPSB2YWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh2YWwuZG9tYWluLmlzTnVtZXJpYylcbiAgICAgICAgICAgICAgdGhpcy5kZWZpbmVTeW1ib2woaywgeyB2YWx1ZTogdmFsLCBkb21haW46IFwiTnVtYmVyXCIgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIHRoaXMuZGVmaW5lU3ltYm9sKGssIHsgdmFsdWU6IHZhbCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0KGlkZW50aWZpZXJzKSB7XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGlkZW50aWZpZXJzKSkge1xuICAgICAgaWYgKGsgIT09IFwiTm90aGluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IGlkZW50aWZpZXJzW2tdO1xuICAgICAgICBpZiAoaXNTeW1ib2xEZWZpbml0aW9uKGRlZikpXG4gICAgICAgICAgdGhpcy5kZWZpbmVTeW1ib2woaywgZGVmKTtcbiAgICAgICAgZWxzZSBpZiAoaXNGdW5jdGlvbkRlZmluaXRpb24oZGVmKSlcbiAgICAgICAgICB0aGlzLmRlZmluZUZ1bmN0aW9uKGssIGRlZik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLnNldCh7IFtrXTogaWRlbnRpZmllcnNba10gfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBhc3N1bXB0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gc2NvcGUgYXZhaWxhYmxlXCIpO1xuICAgIGlmICh0aGlzLmNvbnRleHQuYXNzdW1wdGlvbnMpXG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmFzc3VtcHRpb25zO1xuICAgIHRoaXMuY29udGV4dC5hc3N1bXB0aW9ucyA9IG5ldyBFeHByZXNzaW9uTWFwKCk7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5hc3N1bXB0aW9ucztcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGZhbHNlIGlmIHRoZSBleGVjdXRpb24gc2hvdWxkIHN0b3AuXG4gICAqXG4gICAqIFRoaXMgY2FuIG9jY3VyIGlmOlxuICAgKiAtIGFuIGVycm9yIGhhcyBiZWVuIHNpZ25hbGVkXG4gICAqIC0gdGhlIHRpbWUgbGltaXQgb3IgbWVtb3J5IGxpbWl0IGhhcyBiZWVuIGV4Y2VlZGVkXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc2hvdWxkQ29udGludWVFeGVjdXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVhZGxpbmUgPT09IHZvaWQgMCB8fCB0aGlzLmRlYWRsaW5lID49IERhdGUubm93KCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjaGVja0NvbnRpbnVlRXhlY3V0aW9uKCkge1xuICAgIGlmICghdGhpcy5zaG91bGRDb250aW51ZUV4ZWN1dGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aW1lb3V0XCIpO1xuICAgIH1cbiAgfVxuICAvLyBhc3NlcnQoXG4gIC8vICAgY29uZGl0aW9uOiBib29sZWFuLFxuICAvLyAgIGV4cHI6IEJveGVkRXhwcmVzc2lvbixcbiAgLy8gICBtc2c6IHN0cmluZyxcbiAgLy8gICBjb2RlPzogU2lnbmFsTWVzc2FnZVxuICAvLyApIHtcbiAgLy8gICBpZiAoIWNvbmRpdGlvbikgdGhpcy5zaWduYWwoZXhwciwgbXNnLCBjb2RlKTtcbiAgLy8gfVxuICAvKiogQGludGVybmFsICovXG4gIGNhY2hlKGNhY2hlTmFtZSwgYnVpbGQsIHB1cmdlKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlW2NhY2hlTmFtZV0gPT09IHZvaWQgMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fY2FjaGVbY2FjaGVOYW1lXSA9IHsgYnVpbGQsIHB1cmdlLCB2YWx1ZTogYnVpbGQoKSB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBGYXRhbCBlcnJvciBidWlsZGluZyBjYWNoZSBcIiR7Y2FjaGVOYW1lfVwiOlxuXHQgJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVbY2FjaGVOYW1lXT8udmFsdWU7XG4gIH1cbiAgYm94KGV4cHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYm94KHRoaXMsIGV4cHIsIG9wdGlvbnMpO1xuICB9XG4gIGNhbm9uaWNhbCh4cykge1xuICAgIGlmICgheHMuZXZlcnkoKHgpID0+IHggaW5zdGFuY2VvZiBBYnN0cmFjdEJveGVkRXhwcmVzc2lvbikpXG4gICAgICByZXR1cm4geHMubWFwKCh4KSA9PiB0aGlzLmJveCh4KSk7XG4gICAgY29uc3QgYnhzID0geHM7XG4gICAgcmV0dXJuIGJ4cy5ldmVyeSgoeCkgPT4geC5pc0Nhbm9uaWNhbCkgPyBieHMgOiBieHMubWFwKCh4KSA9PiB4LmNhbm9uaWNhbCk7XG4gIH1cbiAgZm4oaGVhZDIsIG9wczIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gYm94RnVuY3Rpb24odGhpcywgaGVhZDIsIG9wczIsIG9wdGlvbnMgPz8geyBjYW5vbmljYWw6IHRydWUgfSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZm4oaGVhZDIsIG9wczIsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKHRoaXMsIGhlYWQyLCBvcHMyLCB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGNhbm9uaWNhbDogdHJ1ZSxcbiAgICAgIGRlZjogdGhpcy5sb29rdXBGdW5jdGlvbihoZWFkMiwgdGhpcy5jb250ZXh0KVxuICAgIH0pO1xuICB9XG4gIGVycm9yKG1lc3NhZ2UsIHdoZXJlKSB7XG4gICAgaWYgKHdoZXJlIGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pIHtcbiAgICAgIHdoZXJlID0gdGhpcy5yYXdKc29uKHdoZXJlKTtcbiAgICB9IGVsc2UgaWYgKHdoZXJlICYmIEFycmF5LmlzQXJyYXkod2hlcmUpICYmIHdoZXJlWzBdID09PSBcIkxhdGV4XCIpIHtcbiAgICAgIGlmICh3aGVyZVsxXSA9PT0gdm9pZCAwIHx8ICF3aGVyZVsxXSlcbiAgICAgICAgd2hlcmUgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVvZiB3aGVyZVsxXSA9PT0gXCJvYmplY3RcIiAmJiBcInN0clwiIGluIHdoZXJlWzFdICYmICF3aGVyZVsxXS5zdHIpXG4gICAgICAgIHdoZXJlID0gXCJcIjtcbiAgICB9XG4gICAgbGV0IG1zZyA9IHZvaWQgMDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlKSAmJiBtZXNzYWdlWzBdID09PSBcImluY29tcGF0aWJsZS1kb21haW5cIikge1xuICAgICAgbXNnID0gbmV3IEJveGVkRnVuY3Rpb24odGhpcywgXCJFcnJvckNvZGVcIiwgW1xuICAgICAgICB0aGlzLnN0cmluZyhcImluY29tcGF0aWJsZS1kb21haW5cIiksXG4gICAgICAgIGJveERvbWFpbih0aGlzLCBtZXNzYWdlWzFdKSxcbiAgICAgICAgYm94RG9tYWluKHRoaXMsIG1lc3NhZ2VbMl0pXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiKVxuICAgICAgbXNnID0gdGhpcy5zdHJpbmcobWVzc2FnZSk7XG4gICAgaWYgKCFtc2cgJiYgdHlwZW9mIG1lc3NhZ2UgIT09IFwic3RyaW5nXCIpXG4gICAgICBtc2cgPSBuZXcgQm94ZWRGdW5jdGlvbih0aGlzLCBcIkVycm9yQ29kZVwiLCBbXG4gICAgICAgIHRoaXMuc3RyaW5nKG1lc3NhZ2VbMF0pLFxuICAgICAgICAuLi5tZXNzYWdlLnNsaWNlKDEpLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAvKiBAX19QVVJFX18gKi8gY29uc29sZS5hc3NlcnQodHlwZW9mIHggIT09IFwic3RyaW5nXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmJveCh4LCB7IGNhbm9uaWNhbDogZmFsc2UgfSk7XG4gICAgICAgIH0pXG4gICAgICBdKTtcbiAgICBpZiAoIXdoZXJlKVxuICAgICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKHRoaXMsIFwiRXJyb3JcIiwgW21zZ10sIHsgY2Fub25pY2FsOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gbmV3IEJveGVkRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJFcnJvclwiLFxuICAgICAgW21zZywgdGhpcy5ib3god2hlcmUsIHsgY2Fub25pY2FsOiBmYWxzZSB9KV0sXG4gICAgICB7IGNhbm9uaWNhbDogZmFsc2UgfVxuICAgICk7XG4gIH1cbiAgaG9sZChleHByKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZuKFwiSG9sZFwiLCBbdGhpcy5ib3goZXhwciwgeyBjYW5vbmljYWw6IGZhbHNlIH0pXSk7XG4gIH1cbiAgYWRkKG9wczIsIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2Fub25pY2FsQWRkKHRoaXMsIGZsYXR0ZW5PcHMoZmxhdHRlblNlcXVlbmNlKG9wczIpLCBcIkFkZFwiKSk7XG4gICAgaWYgKG1ldGFkYXRhPy5sYXRleCAhPT0gdm9pZCAwKVxuICAgICAgcmVzdWx0LmxhdGV4ID0gbWV0YWRhdGEubGF0ZXg7XG4gICAgaWYgKG1ldGFkYXRhPy53aWtpZGF0YSAhPT0gdm9pZCAwKVxuICAgICAgcmVzdWx0Lndpa2lkYXRhID0gbWV0YWRhdGEud2lraWRhdGE7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBuZWcoZXhwciwgbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gY2Fub25pY2FsTmVnYXRlKGV4cHIsIG1ldGFkYXRhKTtcbiAgfVxuICBtdWwob3BzMiwgbWV0YWRhdGEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjYW5vbmljYWxNdWx0aXBseShcbiAgICAgIHRoaXMsXG4gICAgICBmbGF0dGVuT3BzKGZsYXR0ZW5TZXF1ZW5jZShvcHMyKSwgXCIgTXVsdGlwbHlcIilcbiAgICApO1xuICAgIGlmIChtZXRhZGF0YT8ubGF0ZXggIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC5sYXRleCA9IG1ldGFkYXRhLmxhdGV4O1xuICAgIGlmIChtZXRhZGF0YT8ud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC53aWtpZGF0YSA9IG1ldGFkYXRhLndpa2lkYXRhO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGl2KG51bSwgZGVub20sIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gY2Fub25pY2FsRGl2aWRlKHRoaXMsIG51bSwgZGVub20pO1xuICAgIGlmIChtZXRhZGF0YT8ubGF0ZXggIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC5sYXRleCA9IG1ldGFkYXRhLmxhdGV4O1xuICAgIGlmIChtZXRhZGF0YT8ud2lraWRhdGEgIT09IHZvaWQgMClcbiAgICAgIHJlc3VsdC53aWtpZGF0YSA9IG1ldGFkYXRhLndpa2lkYXRhO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3FydChiYXNlLCBtZXRhZGF0YSkge1xuICAgIHJldHVybiBjYW5vbmljYWxQb3dlcih0aGlzLCBiYXNlLCB0aGlzLl9IQUxGLCBtZXRhZGF0YSk7XG4gIH1cbiAgcG93KGJhc2UsIGV4cG9uZW50LCBtZXRhZGF0YSkge1xuICAgIGlmIChiYXNlLnN5bWJvbCA9PT0gXCJFeHBvbmVudGlhbEVcIiAmJiBleHBvbmVudCBpbnN0YW5jZW9mIGltcG9ydF9jb21wbGV4MjAuQ29tcGxleCAmJiBleHBvbmVudC5yZSA9PT0gMCkge1xuICAgICAgY29uc3QgaW0gPSBleHBvbmVudC5pbTtcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcih0aGlzLmNvbXBsZXgoTWF0aC5jb3MoaW0pLCBNYXRoLnNpbihpbSkpKTtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50IGluc3RhbmNlb2YgQWJzdHJhY3RCb3hlZEV4cHJlc3Npb24pIHtcbiAgICAgIGNvbnN0IG51bSA9IGV4cG9uZW50Lm51bWVyaWNWYWx1ZTtcbiAgICAgIGlmIChudW0gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgZXhwb25lbnQgPSBudW07XG4gICAgICAgIGlmIChpc1JhdGlvbmFsKG51bSkpXG4gICAgICAgICAgZXhwb25lbnQgPSBudW07XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBlID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIGV4cG9uZW50ID09PSBcIm51bWJlclwiKVxuICAgICAgZSA9IGV4cG9uZW50O1xuICAgIGVsc2UgaWYgKGlzUmF0aW9uYWwoZXhwb25lbnQpKSB7XG4gICAgICBpZiAoaXNNYWNoaW5lUmF0aW9uYWwoZXhwb25lbnQpICYmIGV4cG9uZW50WzFdID09PSAxKVxuICAgICAgICBlID0gZXhwb25lbnRbMF07XG4gICAgICBlbHNlIGlmIChpc0JpZ1JhdGlvbmFsKGV4cG9uZW50KSAmJiBleHBvbmVudFsxXSA9PT0gQmlnSW50KDEpKVxuICAgICAgICBlID0gTnVtYmVyKGV4cG9uZW50WzBdKTtcbiAgICB9XG4gICAgaWYgKGUgPT09IDEpXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICBjb25zdCByID0gYmFzZS5udW1lcmljVmFsdWU7XG4gICAgaWYgKGUgPT09IC0xICYmIHIgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgciA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHIpKVxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoWzEsIHJdKTtcbiAgICAgIGVsc2UgaWYgKHIgaW5zdGFuY2VvZiBEZWNpbWFsICYmIHIuaXNJbnRlZ2VyKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlcihbQmlnSW50KDEpLCBiaWdpbnQocildKTtcbiAgICAgIGVsc2UgaWYgKGlzUmF0aW9uYWwocikpXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlcihbclsxXSwgclswXV0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cG9uZW50ID09PSBcIm51bWJlclwiIHx8IGlzUmF0aW9uYWwoZXhwb25lbnQpKVxuICAgICAgZXhwb25lbnQgPSB0aGlzLm51bWJlcihleHBvbmVudCk7XG4gICAgcmV0dXJuIGNhbm9uaWNhbFBvd2VyKHRoaXMsIGJhc2UsIGV4cG9uZW50LCBtZXRhZGF0YSk7XG4gIH1cbiAgaW52KGV4cHIsIG1ldGFkYXRhKSB7XG4gICAgaWYgKGV4cHIuaXNPbmUpXG4gICAgICByZXR1cm4gdGhpcy5fT05FO1xuICAgIGlmIChleHByLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gdGhpcy5fTkVHQVRJVkVfT05FO1xuICAgIGlmIChleHByLmlzSW5maW5pdHkpXG4gICAgICByZXR1cm4gdGhpcy5fWkVSTztcbiAgICBjb25zdCBuID0gZXhwci5udW1lcmljVmFsdWU7XG4gICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgIGlmIChpc1JhdGlvbmFsKG4pKVxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoaW52ZXJzZShuKSwgeyBtZXRhZGF0YSB9KTtcbiAgICAgIGlmICh0eXBlb2YgbiA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKG4pKVxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoWzEsIG5dLCB7IG1ldGFkYXRhIH0pO1xuICAgICAgaWYgKG4gaW5zdGFuY2VvZiBEZWNpbWFsICYmIG4uaXNJbnRlZ2VyKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlcihbQmlnSW50KDEpLCBiaWdpbnQobildLCB7IG1ldGFkYXRhIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZuKFwiRGl2aWRlXCIsIFt0aGlzLl9PTkUsIGV4cHJdLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIGlmIChleHByLmhlYWQgPT09IFwiU3FydFwiKVxuICAgICAgcmV0dXJuIHRoaXMuX2ZuKFwiU3FydFwiLCBbdGhpcy5pbnYoZXhwci5vcDEpXSwgbWV0YWRhdGEpO1xuICAgIGlmIChleHByLmhlYWQgPT09IFwiRGl2aWRlXCIpXG4gICAgICByZXR1cm4gdGhpcy5fZm4oXCJEaXZpZGVcIiwgW2V4cHJbMV0sIGV4cHJbMF1dLCBtZXRhZGF0YSk7XG4gICAgbGV0IGUgPSB0aGlzLl9ORUdBVElWRV9PTkU7XG4gICAgaWYgKGV4cHIuaGVhZCA9PT0gXCJQb3dlclwiKSB7XG4gICAgICBpZiAoZXhwci5vcDIuaXNOZWdhdGl2ZU9uZSlcbiAgICAgICAgcmV0dXJuIGV4cHIub3AxO1xuICAgICAgZSA9IGNhbm9uaWNhbE5lZ2F0ZShleHByLm9wMik7XG4gICAgICBleHByID0gZXhwci5vcDE7XG4gICAgfVxuICAgIGlmIChlLmlzTmVnYXRpdmVPbmUpXG4gICAgICByZXR1cm4gdGhpcy5fZm4oXCJEaXZpZGVcIiwgW3RoaXMuX09ORSwgZXhwcl0sIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5fZm4oXCJQb3dlclwiLCBbZXhwciwgZV0sIG1ldGFkYXRhKTtcbiAgfVxuICBwYWlyKGZpcnN0LCBzZWNvbmQsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBCb3hlZEZ1bmN0aW9uKHRoaXMsIFwiVHVwbGVcIiwgW2ZpcnN0LCBzZWNvbmRdLCB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGNhbm9uaWNhbDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHR1cGxlKGVsZW1lbnRzLCBtZXRhZGF0YSkge1xuICAgIHJldHVybiBuZXcgQm94ZWRGdW5jdGlvbih0aGlzLCBcIlR1cGxlXCIsIGNhbm9uaWNhbChlbGVtZW50cyksIHtcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgY2Fub25pY2FsOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgc3RyaW5nKHMsIG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBCb3hlZFN0cmluZyh0aGlzLCBzLCBtZXRhZGF0YSk7XG4gIH1cbiAgc3ltYm9sKG5hbWUsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IHsgLi4ub3B0aW9ucyB9IDoge307XG4gICAgaWYgKCEoXCJjYW5vbmljYWxcIiBpbiBvcHRpb25zKSlcbiAgICAgIG9wdGlvbnMuY2Fub25pY2FsID0gdHJ1ZTtcbiAgICBuYW1lID0gbmFtZS5ub3JtYWxpemUoKTtcbiAgICBpZiAobmFtZSA9PT0gXCJOYU5cIilcbiAgICAgIHJldHVybiB0aGlzLl9OQU47XG4gICAgaWYgKG5hbWUgPT09IFwiSW5maW5pdHlcIilcbiAgICAgIHJldHVybiB0aGlzLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICBpZiAobmFtZSA9PT0gXCIrSW5maW5pdHlcIilcbiAgICAgIHJldHVybiB0aGlzLl9QT1NJVElWRV9JTkZJTklUWTtcbiAgICBpZiAobmFtZSA9PT0gXCItSW5maW5pdHlcIilcbiAgICAgIHJldHVybiB0aGlzLl9ORUdBVElWRV9JTkZJTklUWTtcbiAgICBpZiAobmFtZSA9PT0gXCJIYWxmXCIpXG4gICAgICByZXR1cm4gdGhpcy5fSEFMRjtcbiAgICBpZiAodGhpcy5zdHJpY3QgJiYgIWlzVmFsaWRJZGVudGlmaWVyKG5hbWUpKSB7XG4gICAgICBjb25zdCB3aGVyZSA9IG9wdGlvbnM/Lm1ldGFkYXRhPy5sYXRleDtcbiAgICAgIGNvbnN0IG5hbWVTdHIgPSBgJyR7bmFtZX0nYDtcbiAgICAgIHJldHVybiB0aGlzLmVycm9yKFxuICAgICAgICBbXCJpbnZhbGlkLWlkZW50aWZpZXJcIiwgeyBzdHI6IHZhbGlkYXRlSWRlbnRpZmllcihuYW1lKSB9XSxcbiAgICAgICAgd2hlcmUgPyBbXCJMYXRleFwiLCBgJyR7d2hlcmV9J2BdIDogbmFtZVN0clxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/Lm1ldGFkYXRhPy5sYXRleCAhPT0gdm9pZCAwICYmICFvcHRpb25zLmNhbm9uaWNhbClcbiAgICAgIHJldHVybiBuZXcgQm94ZWRTeW1ib2wodGhpcywgbmFtZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY29tbW9uU3ltYm9sc1tuYW1lXTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoIW9wdGlvbnM/Lm1ldGFkYXRhPy53aWtpZGF0YSB8fCAhcmVzdWx0Lndpa2lkYXRhIHx8IHJlc3VsdC53aWtpZGF0YSA9PT0gb3B0aW9ucy5tZXRhZGF0YS53aWtpZGF0YSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbClcbiAgICAgICAgcmV0dXJuIG1ha2VDYW5vbmljYWxTeW1ib2wodGhpcywgbmFtZSk7XG4gICAgICByZXR1cm4gbmV3IEJveGVkU3ltYm9sKHRoaXMsIG5hbWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwpXG4gICAgICByZXR1cm4gbWFrZUNhbm9uaWNhbFN5bWJvbCh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gbmV3IEJveGVkU3ltYm9sKHRoaXMsIG5hbWUsIG9wdGlvbnMpO1xuICB9XG4gIGRvbWFpbihkb21haW4sIG1ldGFkYXRhKSB7XG4gICAgaWYgKGRvbWFpbiBpbnN0YW5jZW9mIF9Cb3hlZERvbWFpbilcbiAgICAgIHJldHVybiBkb21haW47XG4gICAgaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFic3RyYWN0Qm94ZWRFeHByZXNzaW9uICYmIGRvbWFpbi5zeW1ib2wpXG4gICAgICBkb21haW4gPSBkb21haW4uc3ltYm9sO1xuICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBleHByID0gdGhpcy5fY29tbW9uRG9tYWluc1tkb21haW5dO1xuICAgICAgaWYgKGV4cHIpXG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICByZXR1cm4gYm94RG9tYWluKHRoaXMsIGRvbWFpbiwgbWV0YWRhdGEpO1xuICB9XG4gIC8qXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gYXZvaWQgY3JlYXRpbmcgYSBib3hlZCBudW1iZXIgaWYgYG51bWAgY29ycmVzcG9uZHNcbiAgICogdG8gYSBjb21tb24gdmFsdWUgZm9yIHdoaWNoIHdlIGhhdmUgYSBzaGFyZWQgaW5zdGFuY2UgKC0xLCAwLCBOYU4sIGV0Yy4uLilcbiAgICovXG4gIG51bWJlcih2YWx1ZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zID8geyAuLi5vcHRpb25zIH0gOiB7fTtcbiAgICBpZiAoIShcImNhbm9uaWNhbFwiIGluIG9wdGlvbnMpKVxuICAgICAgb3B0aW9ucy5jYW5vbmljYWwgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zLm1ldGFkYXRhID09PSB2b2lkIDApIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBCaWdJbnQoMSkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX09ORTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBCaWdJbnQoMCkpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX1pFUk87XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gQmlnSW50KC0xKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5fTkVHQVRJVkVfT05FO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBuID0gdmFsdWU7XG4gICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9PTkU7XG4gICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9aRVJPO1xuICAgICAgICBpZiAobiA9PT0gLTEpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX05FR0FUSVZFX09ORTtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobikgJiYgdGhpcy5fY29tbW9uTnVtYmVyc1tuXSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbW1vbk51bWJlcnNbbl0gPT09IG51bGwpXG4gICAgICAgICAgICB0aGlzLl9jb21tb25OdW1iZXJzW25dID0gYm94TnVtYmVyKHRoaXMsIHZhbHVlKSA/PyB0aGlzLl9OQU47XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbW1vbk51bWJlcnNbbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihuKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5fTkFOO1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSlcbiAgICAgICAgICByZXR1cm4gbiA8IDAgPyB0aGlzLl9ORUdBVElWRV9JTkZJTklUWSA6IHRoaXMuX1BPU0lUSVZFX0lORklOSVRZO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKVxuICAgICAgdmFsdWUgPSB0aGlzLmJpZ251bSh2YWx1ZSk7XG4gICAgcmV0dXJuIGJveE51bWJlcih0aGlzLCB2YWx1ZSwgb3B0aW9ucykgPz8gdGhpcy5fTkFOO1xuICB9XG4gIHJ1bGVzKHJ1bGVzKSB7XG4gICAgcmV0dXJuIGJveFJ1bGVzKHRoaXMsIHJ1bGVzKTtcbiAgfVxuICBwYXR0ZXJuKGV4cHIpIHtcbiAgICByZXR1cm4gbmV3IEJveGVkUGF0dGVybih0aGlzLCBleHByKTtcbiAgfVxuICBwYXJzZShsYXRleCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgbGF0ZXggIT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxhdGV4U3ludGF4LnBhcnNlKGxhdGV4U3RyaW5nKGxhdGV4KSA/PyBsYXRleCk7XG4gICAgcmV0dXJuIHRoaXMuYm94KHJlc3VsdCwgb3B0aW9ucyk7XG4gIH1cbiAgc2VyaWFsaXplKHgsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgXCJqc29uXCIgaW4geCkge1xuICAgICAgY29uc3QgY2UgPSBcImVuZ2luZVwiIGluIHggPyB4LmVuZ2luZSA6IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5sYXRleFN5bnRheC5zZXJpYWxpemUoXG4gICAgICAgIHRoaXMucmF3SnNvbihjZS5ib3goeCwgeyBjYW5vbmljYWw6IGZhbHNlIH0pKSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGF0ZXhTeW50YXguc2VyaWFsaXplKHgsIG9wdGlvbnMpO1xuICB9XG4gIGdldCBsYXRleE9wdGlvbnMoKSB7XG4gICAgY29uc3QgbGF0ZXhTeW50YXggPSB0aGlzLmxhdGV4U3ludGF4O1xuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICB7XG4gICAgICAgIC4uLnRoaXMubGF0ZXhTeW50YXgub3B0aW9ucyxcbiAgICAgICAgLi4udGhpcy5sYXRleFN5bnRheC5zZXJpYWxpemVyLm9wdGlvbnNcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNldChvcHRpb25zLCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICAgIGlmICghKHByb3AgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgbGF0ZXhTeW50YXgudXBkYXRlT3B0aW9ucyh7IFtwcm9wXTogdmFsdWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHNldCBsYXRleE9wdGlvbnMob3B0cykge1xuICAgIHRoaXMubGF0ZXhTeW50YXgudXBkYXRlT3B0aW9ucyhvcHRzKTtcbiAgfVxuICBnZXQganNvblNlcmlhbGl6YXRpb25PcHRpb25zKCkge1xuICAgIGlmICh0aGlzLl91c2VSYXdKc29uU2VyaWFsaXphdGlvbk9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodGhpcy5fcmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zLCB7XG4gICAgICAgIGdldChvcHRpb25zLCBwcm9wKSB7XG4gICAgICAgICAgaWYgKCEocHJvcCBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbnNbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMuX2pzb25TZXJpYWxpemF0aW9uT3B0aW9ucywge1xuICAgICAgZ2V0KG9wdGlvbnMsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiBvcHRpb25zKSlcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICByZXR1cm4gb3B0aW9uc1twcm9wXTtcbiAgICAgIH0sXG4gICAgICBzZXQob3B0aW9ucywgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiBvcHRpb25zKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHNlbGYuanNvblNlcmlhbGl6YXRpb25PcHRpb25zID0geyBbcHJvcF06IHZhbHVlIH07XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNldCBqc29uU2VyaWFsaXphdGlvbk9wdGlvbnModmFsKSB7XG4gICAgaWYgKHZhbC5leGNsdWRlKVxuICAgICAgdGhpcy5fanNvblNlcmlhbGl6YXRpb25PcHRpb25zLmV4Y2x1ZGUgPSBbLi4udmFsLmV4Y2x1ZGVdO1xuICAgIGlmICh2YWwuc2hvcnRoYW5kcykge1xuICAgICAgaWYgKHZhbC5zaG9ydGhhbmRzID09PSBcImFsbFwiIHx8IHZhbC5zaG9ydGhhbmRzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgIHRoaXMuX2pzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzID0gW1xuICAgICAgICAgIFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBcInN5bWJvbFwiLFxuICAgICAgICAgIFwic3RyaW5nXCIsXG4gICAgICAgICAgXCJkaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgXCJudW1iZXJcIlxuICAgICAgICBdO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX2pzb25TZXJpYWxpemF0aW9uT3B0aW9ucy5zaG9ydGhhbmRzID0gWy4uLnZhbC5zaG9ydGhhbmRzXTtcbiAgICB9XG4gICAgaWYgKHZhbC5tZXRhZGF0YSkge1xuICAgICAgaWYgKHZhbC5tZXRhZGF0YSA9PT0gXCJhbGxcIiB8fCB2YWwubWV0YWRhdGEuaW5jbHVkZXMoXCJhbGxcIikpIHtcbiAgICAgICAgdGhpcy5fanNvblNlcmlhbGl6YXRpb25PcHRpb25zLm1ldGFkYXRhID0gW1wibGF0ZXhcIiwgXCJ3aWtpZGF0YVwiXTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLl9qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMubWV0YWRhdGEgPSBbLi4udmFsLm1ldGFkYXRhXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwucHJlY2lzaW9uID09PSBcIm51bWJlclwiICYmIHZhbC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICB0aGlzLl9qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMucHJlY2lzaW9uID0gdmFsLnByZWNpc2lvbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwucmVwZWF0aW5nRGVjaW1hbHMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB0aGlzLl9qc29uU2VyaWFsaXphdGlvbk9wdGlvbnMucmVwZWF0aW5nRGVjaW1hbHMgPSB2YWwucmVwZWF0aW5nRGVjaW1hbHM7XG4gICAgfVxuICB9XG4gIHJhd0pzb24oZXhwcikge1xuICAgIGNvbnN0IHNhdmUgPSB0aGlzLl91c2VSYXdKc29uU2VyaWFsaXphdGlvbk9wdGlvbnM7XG4gICAgdGhpcy5fdXNlUmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSBleHByLmpzb247XG4gICAgdGhpcy5fdXNlUmF3SnNvblNlcmlhbGl6YXRpb25PcHRpb25zID0gc2F2ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgYXNzdW1wdGlvbnMgdGhhdCBtYXRjaCBhIHBhdHRlcm4uXG4gICAqXG4gICAqIGBgYGpzXG4gICAqICBjZS5hc3N1bWUoeCwgJ1Bvc2l0aXZlSW50ZWdlcicpO1xuICAgKiAgY2UuYXNrKFsnR3JlYXRlcicsICd4JywgJ192YWwnXSlcbiAgICogIC8vICAtPiBbeyd2YWwnOiAwfV1cbiAgICogYGBgXG4gICAqL1xuICBhc2socGF0dGVybikge1xuICAgIGNvbnN0IHBhdCA9IHRoaXMucGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFthc3N1bXB0aW9uLCB2YWxdIG9mIHRoaXMuYXNzdW1wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG0gPSBwYXQubWF0Y2goYXNzdW1wdGlvbiwge1xuICAgICAgICBudW1lcmljVG9sZXJhbmNlOiB0aGlzLl90b2xlcmFuY2VcbiAgICAgIH0pO1xuICAgICAgaWYgKG0gIT09IG51bGwgJiYgdmFsID09PSB0cnVlKVxuICAgICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBCYXNlZCBvbiBjb250ZXh0dWFsIHVzYWdlLCBpbmZlciBkb21haW4gb2YgYSBzeW1ib2xcbiAgaW5mZXIoc3ltYm9sMiwgX2RvbWFpbikge1xuICAgIGlmICh0eXBlb2Ygc3ltYm9sMiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKCFzeW1ib2wyLnN5bWJvbClcbiAgICAgICAgcmV0dXJuIFwiaW50ZXJuYWwtZXJyb3JcIjtcbiAgICAgIHN5bWJvbDIgPSBzeW1ib2wyLnN5bWJvbDtcbiAgICB9XG4gICAgcmV0dXJuIFwib2tcIjtcbiAgfVxuICBhc3N1bWUoYXJnMSwgYXJnMikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsYXRleCA9IGxhdGV4U3RyaW5nKGFyZzEpO1xuICAgICAgY29uc3QgcHJlZGljYXRlID0gbGF0ZXggPyB0aGlzLnBhcnNlKGxhdGV4LCB7IGNhbm9uaWNhbDogZmFsc2UgfSkgOiB0aGlzLmJveChhcmcxLCB7IGNhbm9uaWNhbDogZmFsc2UgfSk7XG4gICAgICBpZiAoIWFyZzIpXG4gICAgICAgIHJldHVybiBhc3N1bWUocHJlZGljYXRlKTtcbiAgICAgIGlmIChpc0RvbWFpbihhcmcyKSlcbiAgICAgICAgcmV0dXJuIGFzc3VtZSh0aGlzLmJveChbXCJFbGVtZW50XCIsIHByZWRpY2F0ZSwgdGhpcy5kb21haW4oYXJnMildKSk7XG4gICAgICByZXR1cm4gYXNzdW1lKHRoaXMuYm94KFtcIkVxdWFsXCIsIHByZWRpY2F0ZSwgYXJnMl0pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgcmV0dXJuIFwiaW50ZXJuYWwtZXJyb3JcIjtcbiAgICB9XG4gIH1cbiAgZm9yZ2V0KHN5bWJvbDIpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dClcbiAgICAgIHRocm93IEVycm9yKFwiTm8gc2NvcGUgYXZhaWxhYmxlXCIpO1xuICAgIGlmIChzeW1ib2wyID09PSB2b2lkIDApIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaWRUYWJsZSlcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHRoaXMuY29udGV4dC5pZFRhYmxlLmtleXMoKSlcbiAgICAgICAgICB0aGlzLmZvcmdldChrKTtcbiAgICAgIHRoaXMuYXNzdW1wdGlvbnMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3ltYm9sMikpIHtcbiAgICAgIGZvciAoY29uc3QgeCBvZiBzeW1ib2wyKVxuICAgICAgICB0aGlzLmZvcmdldCh4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzeW1ib2wyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0LmlkVGFibGUpIHtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5jb250ZXh0LmlkVGFibGUuZ2V0KHN5bWJvbDIpO1xuICAgICAgICBpZiAoaXNTeW1ib2xEZWZpbml0aW9uKGRlZikpIHtcbiAgICAgICAgICBkZWYudmFsdWUgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGRlZi5kb21haW4/LmlzTnVtZXJpYykge1xuICAgICAgICAgICAgZGVmLmRvbWFpbiA9IHRoaXMuZGVmYXVsdERvbWFpbiA/PyB0aGlzLmRvbWFpbihcIk51bWJlclwiKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGRlZi5kb21haW4gPSB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2Fzc3VtcHRpb24sIF92YWxdIG9mIHRoaXMuYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgaWYgKGFzc3VtcHRpb24uc3ltYm9scy5pbmNsdWRlcyhzeW1ib2wyKSlcbiAgICAgICAgICB0aGlzLmFzc3VtcHRpb25zLmRlbGV0ZShhc3N1bXB0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wdXRlLWVuZ2luZS50c1xudmFyIHZlcnNpb24gPSBcIjAuMTUuMFwiO1xuZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiaW8uY29ydGV4anMuY29tcHV0ZS1lbmdpbmVcIildID0ge1xuICBDb21wdXRlRW5naW5lOiBDb21wdXRlRW5naW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvcixcbiAgdmVyc2lvbjogXCIwLjE1LjBcIlxufTtcbmV4cG9ydCB7XG4gIENvbXB1dGVFbmdpbmUsXG4gIGlzRW52aXJvbm1lbnRFbnRyeSxcbiAgaXNFeHByZXNzaW9uRW50cnksXG4gIGlzRnVuY3Rpb25FbnRyeSxcbiAgaXNJbmZpeEVudHJ5LFxuICBpc01hdGNoZml4RW50cnksXG4gIGlzUG9zdGZpeEVudHJ5LFxuICBpc1ByZWZpeEVudHJ5LFxuICBpc1N5bWJvbEVudHJ5LFxuICB2ZXJzaW9uXG59O1xuLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjpcblxuY29tcGxleC5qcy9jb21wbGV4LmpzOlxuICAoKipcbiAgICogQGxpY2Vuc2UgQ29tcGxleC5qcyB2Mi4xLjEgMTIvMDUvMjAyMFxuICAgKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFJvYmVydCBFaXNlbGUgKHJvYmVydEB4YXJnLm9yZylcbiAgICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuXG4gICAqKilcblxuZGVjaW1hbC5qcy9kZWNpbWFsLm1qczpcbiAgKCohXG4gICAqICBkZWNpbWFsLmpzIHYxMC40LjNcbiAgICogIEFuIGFyYml0cmFyeS1wcmVjaXNpb24gRGVjaW1hbCB0eXBlIGZvciBKYXZhU2NyaXB0LlxuICAgKiAgaHR0cHM6Ly9naXRodWIuY29tL01pa2VNY2wvZGVjaW1hbC5qc1xuICAgKiAgQ29weXJpZ2h0IChjKSAyMDIyIE1pY2hhZWwgTWNsYXVnaGxpbiA8TThjaDg4bEBnbWFpbC5jb20+XG4gICAqICBNSVQgTGljZW5jZVxuICAgKilcbiovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBQXVCOzs7QUNDdkIsc0JBQTJCO0FBQzNCLG1CQUFnQztBQUNoQyxJQUFBQSxlQVFPOzs7QUNYUCxrQkFBdUM7QUFFaEMsSUFBTSxlQUFOLGNBQTJCLHVCQUFXO0FBQUEsRUFDM0MsWUFBbUIsTUFBeUIsT0FBc0IsTUFBYztBQUM5RSxVQUFNO0FBRFc7QUFBeUI7QUFBc0I7QUFBQSxFQUVsRTtBQUFBLEVBRUEsTUFBTSxNQUErQjtBQUNuQyxVQUFNQyxPQUFNLFNBQVMsY0FBYyxNQUFNO0FBQ3pDLElBQUFBLEtBQUksWUFBWTtBQUVoQixJQUFBQSxLQUFJLFlBQVksS0FBSztBQUNyQixJQUFBQSxLQUFJLFVBQVUsTUFBTTtBQUVsQixZQUFNLGNBQWMsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUNwQyxTQUFTO0FBQUEsVUFDUCxNQUFNLEtBQUs7QUFBQSxVQUNYLElBQUksS0FBSztBQUFBLFVBQ1QsUUFBUSxLQUFLO0FBQUEsUUFDZjtBQUFBLE1BQ0YsQ0FBQztBQUNELFdBQUssU0FBUyxXQUFXO0FBQUEsSUFDM0I7QUFFQSxXQUFPQTtBQUFBLEVBQ1Q7QUFDRjs7O0FDekJBLElBQUksV0FBVyxPQUFPO0FBQ3RCLElBQUlDLGFBQVksT0FBTztBQUN2QixJQUFJQyxvQkFBbUIsT0FBTztBQUM5QixJQUFJQyxxQkFBb0IsT0FBTztBQUMv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QUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxVQUFVO0FBQUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxVQUFVO0FBQUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLGNBQWMsQ0FBQyxTQUFTO0FBQUEsSUFDeEIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxVQUFVO0FBQUEsSUFDekIsT0FBTyxVQUFVLFFBQVE7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFBQSxJQUNkLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsVUFBVTtBQUFBLElBQ3pCLE9BQU8sVUFBVSxRQUFRO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsSUFDRSxN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RDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsTUFBTTtBQUFBLElBQ3JCLE1BQU07QUFBQSxJQUNOLFlBQVk7QUFBQSxFQUNkO0FBQUEsRUFDQTtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sY0FBYyxDQUFDLFNBQVM7QUFBQSxJQUN4QixNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxXQUFXO0FBQUEsSUFDMUIsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixjQUFjLENBQUMsV0FBVztBQUFBLElBQzFCLE1BQU07QUFBQSxJQUNOLGVBQWU7QUFBQSxJQUNmLFlBQVk7QUFBQSxFQUNkO0FBQUEsRUFDQTtBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sY0FBYyxDQUFDLGFBQWE7QUFBQSxJQUM1QixNQUFNO0FBQUEsSUFDTixlQUFlO0FBQUEsSUFDZixZQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLGNBQWMsQ0FBQyxhQUFhO0FBQUEsSUFDNUIsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUE7QUFBQSxJQUVOLGNBQWMsQ0FBQyxZQUFZO0FBQUEsSUFDM0IsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUE7QUFBQSxJQUVOLGNBQWMsQ0FBQyxjQUFjO0FBQUEsSUFDN0IsTUFBTTtBQUFBLElBQ04sZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUE7QUFBQSxJQUVOLGNBQWMsQ0FBQyxZQUFZO0FBQUEs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Q0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVB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QUEsTUFDUixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUE7QUFBQSxNQUVSLFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLEtBQUs7QUFBQTtBQUFBLE1BRUwsS0FBSztBQUFBLE1BQ0wsSUFBSTtBQUFBLE1BQ0osS0FBSztBQUFBLE1BQ0wsVUFBVTtBQUFBLE1BQ1YsSUFBSTtBQUFBLE1BQ0osS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsT0FBTztBQUFBLE1BQ1AsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQTBGUixFQUFFLENBQUMsTUEzSFEs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QTtBQUFBLFFBQzFKLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFBUTtBQUFBLFFBQ3pDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFBUTtBQUFBLFFBQ3pDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFBUTtBQUFBLFFBQ3pDLFVBQVUsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLFlBQVksVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ2xFLEdBQUcsQ0FBQyxJQUFJLFNBQVMsU0FBUyxJQUFJLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsUUFBUSx5QkFBeUIsUUFB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Q0FBQyxHQUFHLENBQUM7QUFBQSxJQUNMO0FBQUEsTUFDRSxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsSUFDUDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ0w7QUFBQSxNQUNFLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUFBLEVBQ0E7QUFBQSxJQUNFLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDTDtBQUFBLE1BQ0UsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDO0FBQUEsTUFDckIsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDO0FBQUEsTUFDckIsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1A7QUFBQSxFQUNGO0FBQUEsRUFDQTtBQUFBLElBQ0UsQ0FBQyxHQUFHLEVBQUU7QUFBQSxJQUNOO0FBQUEsTUFDRSxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsSUFDUDtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRSxDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ0w7QUFBQSxNQUNFLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQztBQUFBO0FBQUEsTUFFckIsS0FBSztBQUFBO0FBQUEsTUFFTCxLQUFLO0FBQUE7QUFBQSxNQUVMLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQztBQUFBO0FBQUEsTUFFckIsS0FBSztBQUFBLE1BQ0wsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFBQTtBQUFBLElBRXhDO0FBQUEs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TUFBTSxHQUFHLENBQUMseUJBQXlCLE1BQU0sRUFBRSxLQUFLO0FBQ3RGLGdCQUFJLFNBQVMsa0JBQWtCLE1BQU0sZ0JBQWdCLEVBQUUsU0FBUyxFQUFFO0FBRWxFLGdCQUFJLGVBQWUsSUFBSTtBQUN2QixnQkFBSSxPQUFPLFlBQVksRUFBRSxTQUFTLE9BQU87QUFBRyw2QkFBZTtBQUUzRCxvQkFBUTtBQUFBLGNBQ047QUFBQSxjQUNBO0FBQUEsY0FDQSx3QkFBVyxRQUFRO0FBQUEsZ0JBQ2pCLFFBQVEsSUFBSSxhQUFhLE1BQU0sYUFBYSxZQUFZO0FBQUEsY0FDMUQsQ0FBQztBQUFBLFlBQ0g7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUFPLFFBQVEsT0FBTztBQUFBLEVBQ3hCO0FBQ0Y7QUFFQSxJQUFNLGFBQThDO0FBQUEsRUFDbEQsYUFBYSxDQUFDLFVBQStCLE1BQU07QUFDckQ7QUFFTyxJQUFNLHNCQUFzQix3QkFBVztBQUFBLEVBQzVDO0FBQUEsRUFDQTtBQUNGOzs7QUR4RkEsSUFBcUIsZ0JBQXJCLGNBQTJDLHVCQUFPO0FBQUEsRUFDakQsTUFBTSxTQUFTO0FBQ1osU0FBSyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQztBQUFBLEVBQ3JEO0FBQUEsRUFFQSxXQUFXO0FBQUEsRUFBQztBQUNiOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdmlldyIsICJkaXYiLCAiX19kZWZQcm9wIiwgIl9fZ2V0T3duUHJvcERlc2MiLCAiX19nZXRPd25Qcm9wTmFtZXMiLCAiX19oYXNPd25Qcm9wIiwgIl9fY29weVByb3BzIiwgIm1vZHVsZSIsICJfYSJdCn0K